runSolver.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import ivp
  2. import os
  3. import cModel
  4. import sys
  5. import json
  6. import numpy
  7. import time
  8. def get(setup,par):
  9. defaultValues={\
  10. 'method':'LSODA',\
  11. 'atol':1e-4,\
  12. 'rtol':1e-4,\
  13. 'tmax':1,\
  14. 'mode':'IVPSimultaneous',\
  15. 'nt':201,
  16. 'tUnit':'day'}
  17. try:
  18. return setup[par]
  19. except KeyError:
  20. pass
  21. return defaultValues[par]
  22. def main(parFiles,jobDir):
  23. sys=cModel.model()
  24. setupFile=parFiles[1]
  25. parameterFile=parFiles[2]
  26. sys.parse(setupFile,parameterFile)
  27. with open(parFiles[0],'r') as f:
  28. setup=json.load(f)
  29. tmax=get(setup,'tmax')
  30. atol=get(setup,'atol')
  31. rtol=get(setup,'rtol')
  32. mode=get(setup,'mode')
  33. method=get(setup,'method')
  34. nt=get(setup,'nt')
  35. tUnit=get(setup,'tUnit')
  36. if tUnit=='min':
  37. pass
  38. if tUnit=='hour':
  39. tmax*=60
  40. if tUnit=='day':
  41. tmax*=24*60
  42. if tUnit=='month':
  43. tmax*=24*60*30
  44. if tUnit=='year':
  45. tmax*=24*60*30*365
  46. start_time=time.time()
  47. if mode=='SequentialOdeint':
  48. t,sol,se=ivp.solveSequentialOdeint(sys,tmax,nt)
  49. if mode=='SimultaneousOdeint':
  50. t,sol,se=ivp.solveSimultaneousOdeint(sys,tmax,nt)
  51. if mode=='IVP':
  52. t,sol,se=ivp.solveSequential(sys,tmax,atol=atol,rtol=rtol,method=method)
  53. if mode=='IVPSimultaneous':
  54. t,sol,se=ivp.solveSimultaneous(sys,tmax,atol=atol,rtol=rtol,method=method)
  55. end_time=time.time()
  56. print('Time: {:.3f} s'.format(end_time-start_time))
  57. #store
  58. numpy.savetxt(os.path.join(jobDir,'t.txt'),t)
  59. numpy.savetxt(os.path.join(jobDir,'sol.txt'),sol)
  60. numpy.savetxt(os.path.join(jobDir,'se.txt'),se)