PLUTO
define_problem.without_userdef_constants.py
Go to the documentation of this file.
1 import os
2 import sys
3 import menu
4 import pluto_files_IO as pfIO
5 
6 class DefineProblem(object):
7  def __init__(self, work_dir, pluto_dir, auto_update):
8  """Defines the problem for the PLUTO code.
9 
10  This class essentially creates the definitions.h file
11  based on the inputs given by the user from the PlutoSetup menu.
12  In case the header file is already present, this class will
13  read those default values to re-create the file.
14 
15  **Inputs**:
16  1. work_dir = Path to PLUTO code working directory
17  2. pluto_dir = Path to PLUTO source directory
18  3. auto-update = Boolean that indicates auto-update of definitions.h file.
19 
20  **Output**:
21  It generates a definitions.h file.
22 
23  """
24  #Some class attributes that will be used in various class methods.
25  self.work_dir = work_dir
26  self.pluto_dir = pluto_dir
27  self.krome_dir = pluto_dir + 'Lib/krome/'
28  self.auto_update = auto_update
29  self.def_fname = self.work_dir + '/definitions.h'
30  self.additional_files = []
31  self.header_files = []
32  self.additional_flags = []
33  self.pluto_path = []
34  self.def_file_list = []
35 
36  # defining the PLUTO entries and its default values in lists.
37  self.entries = ['PHYSICS', 'DIMENSIONS', 'COMPONENTS', 'GEOMETRY',
38  'BODY_FORCE', 'COOLING', 'INTERPOLATION', 'TIME_STEPPING',
39  'DIMENSIONAL_SPLITTING', 'NTRACER', 'USER_DEF_PARAMETERS'
40  ]
41  self.default = ['HD', '1', '1', 'CARTESIAN','NO',
42  'NO','LINEAR','RK2',
43  'YES', '0', '0',
44  ]
45 
46  # Creating a dictionary of flags that are invoked by giving arguments.
47  flag_keys = ['WITH-CHOMBO', 'FULL', 'WITH-FD', 'WITH-SB', 'WITH-FARGO']
48  #self.flag_dict = {key: False for key in flag_keys} DOESNT WORK WITH PYTHON 2.6
49  self.flag_dict = {'WITH-CHOMBO':False, 'FULL':False, 'WITH-FD':False, 'WITH-SB':False, 'WITH-FARGO':False}
50 
51  for arg in sys.argv:
52  if arg[2:].upper() in flag_keys:
53  self.flag_dict[arg[2:].upper()] = True
54  elif arg[2:] == 'with-chombo:':
55  self.flag_dict['WITH-CHOMBO'] = True
56  else:
57  pass
58 
59  # Generates Full Option List.
60  self.GenerateOptionsList()
61 
62  #Updates Options, default based on FLAGS.
63  if True in self.flag_dict.values():
64  self.AfterFlagLists()
65 
66  #Read the exsisting definition.h file or Browse the menu for Setting up problem.
67  self.ReadOrBrowse(Ents=self.entries, Defs=self.default, Opts=self.options, MenuTitle="Setup problem")
68 
69 
70  #Process the PHYSICS Modules.
71  if self.default[self.entries.index('PHYSICS')] == 'HD':
72  self.ProcessHDModule()
73  self.ReadOrBrowse(Ents = self.entries_HD, Defs = self.default_HD, Opts = self.options_HD, MenuTitle = "HD Menu")
74  self.eos = self.default_HD[self.entries_HD.index('EOS')]
75 
76  if self.default[self.entries.index('PHYSICS')] == 'RHD':
77  self.ProcessRHDModule()
78  self.ReadOrBrowse(Ents = self.entries_RHD, Defs = self.default_RHD, Opts = self.options_RHD, MenuTitle = "RHD Menu")
79  self.eos = self.default_RHD[self.entries_RHD.index('EOS')]
80 
81  if self.default[self.entries.index('PHYSICS')] == 'MHD':
82  self.ProcessMHDModule()
83  self.ReadOrBrowse(Ents = self.entries_MHD, Defs = self.default_MHD, Opts = self.options_MHD, MenuTitle = "MHD Menu")
84  self.eos = self.default_MHD[self.entries_MHD.index('EOS')]
85 
86  if self.default[self.entries.index('PHYSICS')] == 'RMHD':
87  self.ProcessRMHDModule()
88  self.ReadOrBrowse(Ents = self.entries_RMHD, Defs = self.default_RMHD, Opts = self.options_RMHD, MenuTitle = "RMHD Menu")
89  self.eos = self.default_RMHD[self.entries_RMHD.index('EOS')]
90 
91  if self.default[self.entries.index('COOLING')] == 'KROME':
92  self.ProcessKROMEModule()
93  self.ReadOrBrowse(Ents = self.entries_KROME, Defs = self.default_KROME, Opts = self.options_KROME, MenuTitle = "KROME Menu")
94  self.WriteKromeOpts()
95  #self.eos = self.default_KROME[self.entries_RMHD.index('EOS')]
96 
97 
98  #UserDef Para and Constants
99  self.udef_params = []
100  self.udef_const = []
101  self.udef_const_vals = []
102  self.nparam = int(self.default[self.entries.index('USER_DEF_PARAMETERS')])
103  #self.nconst = int(self.default[self.entries.index('USER_DEF_CONSTANTS')])
104  if self.nparam > 0:
105  self.ProcessUserDefPara()
106 
107  #if self.nconst > 0:
108  self.ProcessUserDefConst()
109 
110  # Write a List def_file_list which will be written as the header file.
111  self.WriteDefFileList()
112  pf = pfIO.PlutoFiles(self.work_dir+'/definitions.h')
113  pf.List2File(self.def_file_list)
114 
116  """Creates a default option list.
117 
118  This method of class DefineProblem will create a
119  default valued options list for each entry in the
120  entries list. These are essentially the options
121  that will be browsed in the Pluto Setup Menu.
122  """
123  phylist = ['ADVECTION','HD','RHD','MHD','RMHD']
124  dimlist = ['1','2','3']
125  comlist = ['1','2','3']
126  geolist = ['CARTESIAN','CYLINDRICAL','POLAR','SPHERICAL']
127  bfolist = ['NO','VECTOR', 'POTENTIAL', '(VECTOR+POTENTIAL)']
128  coolist = ['NO','POWER_LAW','TABULATED','SNEq','MINEq','H2_COOL', 'KROME']
129  #parlist = ['NO','YES']
130  intlist = ['FLAT','LINEAR','LimO3','WENO3','PARABOLIC']
131  tmslist = ['EULER','RK2','RK3','HANCOCK','CHARACTERISTIC_TRACING']
132  dislist = ['YES','NO']
133  ntrlist = ['%d'%n for n in range(5)]
134  udplist = ['%d'%n for n in range(32)]
135  udclist = ['%d'%n for n in range(32)]
136 
137  self.options = [phylist, dimlist, comlist, geolist, bfolist,
138  coolist, intlist, tmslist,
139  dislist, ntrlist, udplist,
140  udclist]
141 
142  def AfterFlagLists(self):
143  """Modify options and default list based on command-line flags.
144 
145  This method is called after generation of default option list.
146  It modifies the members of the options list and if required
147  also the default list based on the conditions required by
148  the flags set using system arguments.
149  """
150  if self.flag_dict['FULL']:
151  self.options[self.entries.index('INTERPOLATION')] = ['FLAT','LINEAR','LimO3', 'WENO3','PARABOLIC', 'MP5']
152 
153  if self.flag_dict['WITH-CHOMBO']:
154  self.options[self.entries.index('GEOMETRY')] = ['CARTESIAN','CYLINDRICAL','POLAR','SPHERICAL']
155  self.options[self.entries.index('INTERPOLATION')] = ['FLAT','LINEAR','WENO3','PARABOLIC']
156  self.options[self.entries.index('TIME_STEPPING')] = ['EULER','HANCOCK','CHARACTERISTIC_TRACING','RK2']
157  self.default[self.entries.index('TIME_STEPPING')] = 'HANCOCK'
158  self.options[self.entries.index('DIMENSIONAL_SPLITTING')] = ['NO']
159  self.default[self.entries.index('DIMENSIONAL_SPLITTING')] = 'NO'
160 
161  if self.flag_dict['WITH-FARGO']:
162  self.options[self.entries.index('PHYSICS')] = ['HD', 'MHD']
163  self.options[self.entries.index('DIMENSIONS')] = ['2','3']
164  self.default[self.entries.index('DIMENSIONS')] = '2'
165  self.options[self.entries.index('DIMENSIONAL_SPLITTING')] = ['NO']
166  self.default[self.entries.index('DIMENSIONAL_SPLITTING')] = 'NO'
167 
168 
169  if self.flag_dict['WITH-FD']:
170  self.options[self.entries.index('PHYSICS')] = ['HD', 'MHD']
171  self.options[self.entries.index('GEOMETRY')] = ['CARTESIAN']
172  self.options[self.entries.index('INTERPOLATION')] = ['WENO3_FD', 'WENOZ_FD', 'MP5_FD','LIMO3_FD']
173  self.default[self.entries.index('INTERPOLATION')] = 'WENOZ_FD'
174  self.options[self.entries.index('TIME_STEPPING')] = ['RK3']
175  self.default[self.entries.index('TIME_STEPPING')] = 'RK3'
176 
177 
178  if self.flag_dict['WITH-SB']:
179  self.options[self.entries.index('PHYSICS')] = ['HD', 'MHD']
180  self.default[self.entries.index('PHYSICS')] = 'MHD'
181  self.options[self.entries.index('DIMENSIONS')] = ['2', '3']
182  self.default[self.entries.index('DIMENSIONS')] = '2'
183  self.options[self.entries.index('COMPONENTS')] = ['2', '3']
184  self.default[self.entries.index('COMPONENTS')] = '2'
185  self.options[self.entries.index('BODY_FORCE')] = ['VECTOR', 'POTENTIAL', '(VECTOR+POTENTIAL)']
186  self.default[self.entries.index('BODY_FORCE')] = 'VECTOR'
187 
188 
189  def ReadOrBrowse(self, Ents=None, Opts=None, Defs=None, MenuTitle=None):
190  """Reads or Browses the entries, options and defaults to create header file.
191 
192  This method either reads the already exsisting definitions.h file or browses
193  throught the three lists which are provided as inputs.
194 
195  **Inputs**:
196  1. Ents = List of entries. [None]
197  2. Opts = List of options corresponding to each member in Ents [None]
198  3. Defs = List of default value from Opts corresponding to each member in Ents [None]
199  4. MenuTitle = Title for the Menu to be Browsed [None]
200  """
201  if (os.path.exists(self.work_dir+'/definitions.h')):
202  pf = pfIO.PlutoFiles(self.work_dir+'/definitions.h')
203  pf.UpdateListFromFile(Ents, Defs)
204  for i in range(len(Ents)):
205  if Defs[i] not in Opts[i]:
206  Defs[i] = Opts[i][0]
207  else:
208  pass
209 
210  # Provides Browsing options using the menu file in case of no automatic update flag.
211  if self.auto_update == 0:
212  selection = ''
213  menu.SetTitle(MenuTitle)
214  selection = menu.Browse(Ents, default=Defs, options=Opts)
215 
216  def ProcessHDModule(self):
217  """
218  Provides entries, options and defaults specific to Hydro Module.
219  Also updates them accordingly if required by flags.
220  """
221  self.entries_HD = ['EOS', 'ENTROPY_SWITCH', 'THERMAL_CONDUCTION', 'VISCOSITY', 'ROTATING_FRAME']
222  self.default_HD = ['IDEAL', 'NO', 'NO', 'NO', 'NO']
223  self.options_HD = [['IDEAL','PVTE_LAW','ISOTHERMAL'], ['NO','YES'], ['NO','EXPLICIT','SUPER_TIME_STEPPING'],
224  ['NO','EXPLICIT','SUPER_TIME_STEPPING'], ['NO','YES']]
225 
226  if self.flag_dict['WITH-CHOMBO']:
227  self.options_HD[2] = ['NO','EXPLICIT']
228  self.options_HD[3] = ['NO','EXPLICIT']
229 
230  def ProcessRHDModule(self):
231  """
232  Provides entries, options and defaults specific to Relativistic
233  Hydro Module. Also updates them accordingly if required by flags.
234  """
235  self.entries_RHD = ['EOS', 'ENTROPY_SWITCH', 'USE_FOUR_VELOCITY']
236  self.default_RHD = ['IDEAL', 'NO', 'NO']
237  self.options_RHD = [['IDEAL','TAUB'], ['NO','YES'], ['NO','YES']]
238 
239  def ProcessMHDModule(self):
240  """
241  Provides entries, options and defaults specific to Magneto-
242  Hydro Module.Also updates them accordingly if required by flags.
243  """
244  self.entries_MHD = ['EOS', 'ENTROPY_SWITCH', 'MHD_FORMULATION', 'BACKGROUND_FIELD',
245  'RESISTIVE_MHD', 'THERMAL_CONDUCTION', 'VISCOSITY', 'ROTATING_FRAME']
246  self.default_MHD = ['IDEAL','NO','EIGHT_WAVES','NO','NO','NO','NO','NO']
247  self.options_MHD = [['IDEAL','PVTE_LAW','ISOTHERMAL'], ['NO','YES'],
248  ['NONE','EIGHT_WAVES','DIV_CLEANING','CONSTRAINED_TRANSPORT'],
249  ['NO','YES'],['NO','EXPLICIT', 'SUPER_TIME_STEPPING'],
250  ['NO','EXPLICIT', 'SUPER_TIME_STEPPING'],['NO','EXPLICIT', 'SUPER_TIME_STEPPING'],['NO','YES']]
251 
252  if self.flag_dict['WITH-CHOMBO']:
253  self.options_MHD[2] = ['NONE','EIGHT_WAVES','DIV_CLEANING']
254  self.options_MHD[4] = ['NO','EXPLICIT']
255  self.options_MHD[5] = ['NO','EXPLICIT']
256  self.options_MHD[6] = ['NO','EXPLICIT']
257 
258  if self.flag_dict['WITH-FD']:
259  self.options_MHD[2] = ['NONE','EIGHT_WAVES','DIV_CLEANING']
260 
261  if self.flag_dict['WITH-SB'] or self.flag_dict['WITH-FARGO']:
262  self.options_MHD[2] = ['CONSTRAINED_TRANSPORT']
263  self.default_MHD[2] = 'CONSTRAINED_TRANSPORT'
264 
265  def ProcessRMHDModule(self):
266  """
267  Provides entries, options and defaults specific to Relativisitc
268  Magneto-Hydro Module.Also updates them accordingly if required by flags.
269  """
270  self.entries_RMHD = ['EOS', 'ENTROPY_SWITCH','MHD_FORMULATION' ]
271  self.default_RMHD = ['IDEAL', 'NO', 'NONE']
272  self.options_RMHD = [['IDEAL', 'TAUB'], ['NO','YES'],
273  ['NONE','EIGHT_WAVES','DIV_CLEANING','CONSTRAINED_TRANSPORT']]
274 
275  if self.flag_dict['WITH-CHOMBO']:
276  self.options_RMHD[2] = ['NONE','EIGHT_WAVES','DIV_CLEANING']
277 
279  """
280  Provides entries, options, and defaults for the KROME cooling module.
281  """
282  netwrkfiles = os.listdir(self.krome_dir+'/networks/')
283  self.entries_KROME = ['NETWORK_FILE', 'USE_N','COOLING_TYPE', 'HEATING_TYPE', 'GAMMA_TYPE']
284  self.default_KROME = [netwrkfiles[0], 'NO', 'NONE', 'NONE', 'DEFAULT']
285  self.options_KROME = [netwrkfiles, ['NO', 'YES'], [ 'NONE', 'H2', 'ATOMIC', 'Z'], ['NONE', 'COMPRESS', 'PHOTO', 'XRAY'], ['DEFAULT','FULL', 'ROT', 'VIB', 'EXACT', 'REDUCED']]
286 
287 
289  """
290  Sets the Userdefined parameters
291  """
292  self.udef_params = ['USER_PAR_%.2d'%i for i in range(self.nparam)]
293  if (os.path.exists(self.work_dir+'/definitions.h')):
294  pf = pfIO.PlutoFiles(self.work_dir+'/definitions.h')
295  scrh = pf.LocateString('parameters')
296  k0 = scrh[0][0] + 2
297  par_lines = pf.ReadLines(k0, k0 + self.nparam)
298  for n in range(self.nparam):
299  try:
300  x = par_lines[n].split()
301  x[0] == '#define'
302  except IndexError:
303  pass
304  else:
305  if (x[0] == "#define"):
306  self.udef_params[n] = x[1]
307  else:
308  break;
309 
310  if self.auto_update == 0:
311  menu.SetTitle ("User-defined Parameters")
312  par_entries = ['%d'%i for i in range(self.nparam)]
313  menu.Insert(par_entries,self.udef_params)
314 
316  """
317  Sets the Userdefined Constants.
318  """
319  if (os.path.exists(self.work_dir+'/definitions.h')):
320  pf = pfIO.PlutoFiles(self.work_dir+'/definitions.h')
321  scrh_beg = pf.LocateString('User_Constants_Beg')
322  k_beg = scrh_beg[0][0]+1
323  scrh_end = pf.LocateString('User_Constants_End')
324  k_end = scrh_end[0][0]-1
325  const_lines = pf.ReadLines(k_beg, k_end)
326  print const_lines
327  for n in range(len(const_lines)):
328  x = const_lines[n].split()
329  try:
330  x[0] == '#define'
331  except IndexError:
332  pass
333  else:
334  if (x[0] == '#define'):
335  self.udef_const.append(x[1])
336  self.udef_const_vals.append(x[2])
337  else:
338  continue
339 
340 
341 
342 
344  """
345  Sets the non-user friendly constants.
346  """
347  tmplist1 = ['INITIAL_SMOOTHING', 'WARNING_MESSAGES', 'PRINT_TO_FILE', 'INTERNAL_BOUNDARY', 'SHOCK_FLATTENING']
348  tmplist2 = len(tmplist1)*['NO']
349 
350  if self.flag_dict['WITH-CHOMBO']:
351  tmplist1 += ['CHOMBO_EN_SWITCH','CHOMBO_REF_VAR','CHOMBO_LOGR']
352  tmplist2 += [ 'NO', 'ENG', 'NO']
353 
354  if not self.flag_dict['WITH-FD']:
355  tmplist1 = tmplist1 + ['ARTIFICIAL_VISCOSITY', 'CHAR_LIMITING', 'LIMITER']
356  tmplist2 = tmplist2 + ['NO', 'NO', 'DEFAULT']
357 
358  if 'MHD_FORMULATION' in self.mod_entries:
359  divb_mode = self.mod_default[self.mod_entries.index('MHD_FORMULATION')]
360  if divb_mode == 'CONSTRAINED_TRANSPORT':
361  tmplist1 = tmplist1 + ['CT_EMF_AVERAGE', 'CT_EN_CORRECTION', 'ASSIGN_VECTOR_POTENTIAL']
362  tmplist2 = tmplist2 + ['UCT_HLL', 'NO', 'YES']
363  else:
364  tmplist1 = tmplist1 + ['ASSIGN_VECTOR_POTENTIAL']
365  tmplist2 = tmplist2 + ['NO']
366 
367  if not self.flag_dict['WITH-CHOMBO']:
368  tmplist1 = tmplist1 + ['UPDATE_VECTOR_POTENTIAL']
369  tmplist2 = tmplist2 + ['NO']
370 
371  if 'HANCOCK' in self.default:
372  if (self.phymodule == 'RMHD'):
373  tmplist1 = tmplist1 + ['PRIMITIVE_HANCOCK']
374  tmplist2 = tmplist2 + ['NO']
375  else:
376  tmplist1 = tmplist1 + ['PRIMITIVE_HANCOCK']
377  tmplist2 = tmplist2 + ['YES']
378 
379  if 'SUPER_TIME_STEPPING' in self.mod_default:
380  tmplist1 = tmplist1 + ['STS_nu']
381  tmplist2 = tmplist2 + ['0.01']
382 
383  longword = max(len(w) for w in tmplist1)
384 
385  if (os.path.exists(self.work_dir+'/definitions.h')):
386  pf = pfIO.PlutoFiles(self.work_dir+'/definitions.h')
387  pf.UpdateListFromFile(tmplist1, tmplist2)
388 
389  self.non_usfr = ['#define '+tmplist1[i].ljust(longword+3)+tmplist2[i]+'\n' for i in range(len(tmplist1))]
390 
392  """
393  Adds additional object files based on
394  modular defintions and requirements.
395  """
396  interp_mode = self.default[self.entries.index('INTERPOLATION')]
397 
398  if interp_mode == 'LINEAR':
399  self.additional_files.append('plm_states.o')
400  elif interp_mode == 'PARABOLIC':
401  self.additional_files.append('ppm_states.o')
402  self.additional_files.append('ppm_coeffs.o')
403  self.header_files.append('ppm_coeffs.h')
404  elif interp_mode in ['FLAT', 'LimO3', 'WENO3']:
405  self.additional_files.append('states_'+interp_mode.lower()+'.o')
406  else:
407  pass
408 
409  if self.flag_dict['WITH-FD']:
410  self.additional_files += ['states_fd.o', 'fd_reconstruct.o', 'fd_flux.o']
411 
412  if self.default[self.entries.index('COOLING')] not in ['NO', 'POWER_LAW', 'KROME']:
413  self.additional_files += ['cooling_source.o','cooling_ode_solver.o']
414 
415  if self.phymodule == 'MHD' or self.phymodule == 'RMHD':
416  self.additional_files.append('vec_pot_diff.o')
417  if not self.flag_dict['WITH-CHOMBO']:
418  self.additional_files.append('vec_pot_update.o')
419 
420  if self.flag_dict['WITH-CHOMBO']:
421  if self.default[self.entries.index('DIMENSIONS')] == '1':
422  self.additional_files.append('PatchCTU.1D.o')
423  elif self.default[self.entries.index('TIME_STEPPING')] in ['EULER', 'RK2']:
424  self.additional_files.append('PatchEuler.3D.o')
425  else:
426  self.additional_files.append('PatchCTU.3D.o')
427  else:
428  cmset = set(['CHARACTERISTIC_TRACING', 'HANCOCK']) & set(self.default)
429  if len(cmset) != 0 and self.default[self.entries.index('DIMENSIONAL_SPLITTING')] == 'NO':
430  self.additional_files.append('ctu_update.o')
431  else:
432  self.additional_files.append('rk_update.o')
433 
434  if 'HANCOCK' in self.default:
435  self.additional_files.append('hancock.o')
436 
437  if 'CHARACTERISTIC_TRACING' in self.default:
438  self.additional_files.append('char_tracing.o')
439 
440  if 'SUPER_TIME_STEPPING' in self.mod_default:
441  self.additional_files += ['sts.o', 'parabolic_rhs.o']
442 
443  if 'EXPLICIT' in self.mod_default:
444  self.additional_files.append('parabolic_flux.o')
445 
446 
448  """
449  Adds additional C flags and path to 'makefile' based on
450  modular defintions and requirements.
451  """
452  self.pluto_path.append(self.phymodule+'/')
453 
454  dis_eff = ['Thermal_Conduction', 'Viscosity']
455  for de in dis_eff:
456  if de.upper() in self.mod_entries and self.mod_default[self.mod_entries.index(de.upper())] != 'NO':
457  self.pluto_path.append(de+'/')
458 
459  if self.phymodule == 'MHD' or self.phymodule == 'RMHD':
460  divb_mode = self.mod_default[self.mod_entries.index('MHD_FORMULATION')]
461  if divb_mode == 'CONSTRAINED_TRANSPORT':
462  self.pluto_path.append('MHD/CT/')
463  elif divb_mode == 'DIV_CLEANING':
464  self.pluto_path.append('MHD/GLM/')
465  else:
466  pass
467 
468  if self.phymodule == 'MHD' and self.mod_default[self.mod_entries.index('RESISTIVE_MHD')] != 'NO':
469  self.pluto_path.append('MHD/Resistive/')
470 
471  if self.flag_dict['WITH-SB']:
472  self.pluto_path.append('MHD/ShearingBox/')
473  self.additional_flags.append(' -DSHEARINGBOX')
474 
475  if self.flag_dict['WITH-FARGO']:
476  self.pluto_path.append('Fargo/')
477  self.additional_flags.append(' -DFARGO')
478 
479  if self.flag_dict['WITH-FD']:
480  self.additional_flags.append(' -DFINITE_DIFFERENCE')
481 
482  cool_mode = self.default[self.entries.index('COOLING')]
483  if cool_mode != 'NO':
484  if cool_mode == 'TABULATED':
485  self.pluto_path.append('Cooling/Tab/')
486  elif cool_mode == 'POWER_LAW':
487  self.pluto_path.append('Cooling/Power_Law/')
488  else:
489  self.pluto_path.append('Cooling/'+ cool_mode +'/')
490 
491  if 'EOS' in self.mod_entries:
492  if 'PVTE_LAW' in self.mod_default:
493  tmp1 = 'PVTE'
494  else:
495  tmp1 = self.eos[0]+self.eos[1:].lower()
496  self.pluto_path.append('EOS/'+tmp1+'/')
497 
498  def UpdatePlutoIni(self):
499  """
500  Updates pluto.ini file with values of UserDefined Parameters
501  """
502  pf = pfIO.PlutoFiles(self.work_dir+'/pluto.ini')
503  scrh = pf.LocateString('[Parameters]')
504  try:
505  scrh[0]
506  except IndexError:
507  print "Parameters keyword not found in pluto.ini"
508  sys.exit()
509  else:
510  pass
511 
512  ipos = scrh[0][0] + 2
513  tmplist1 = pf.ReadLines(ipos,100)
514  paradict = {}
515  cmms = []
516  for x in tmplist1:
517  if (len(x.split()) == 0): continue # skip blank lines
518  paradict.update({x.split()[0]:x.split()[1]})
519  try:
520  cmmval = x.split()[2]
521  except IndexError:
522  cmms.append('')
523  continue
524  else:
525  if cmmval == '#' or cmmval.startswith('#'):
526  cmms.append(' '.join(x.split()[2:]))
527  else:
528  cmms.append('')
529 
530  for x in self.udef_params:
531  if x in paradict.keys():
532  pf.InsertLine(x.ljust(21) + paradict[x] +' '+cmms[self.udef_params.index(x)]+'\n', ipos)
533  else:
534  try:
535  cmms[self.udef_params.index(x)]
536  except IndexError:
537  pf.InsertLine(x.ljust(21) + '0.0' + '\n', ipos)
538  else:
539  pf.InsertLine(x.ljust(21) + '0.0'+' '+cmms[self.udef_params.index(x)]+ '\n', ipos)
540  ipos = ipos + 1
541  pf.DeleteLines(ipos,ipos+100)
542 
543  def WriteKromeOpts(self):
544  self.kromeoptstr = 'python '+self.krome_dir+'krome -n='+self.krome_dir+'networks/'+ self.default_KROME[self.entries_KROME.index('NETWORK_FILE')]
545  if self.default_KROME[self.entries_KROME.index('USE_N')]:
546  self.kromeoptstr += ' -useN'
547 
548  if self.default_KROME[self.entries_KROME.index('COOLING_TYPE')] != 'NONE':
549  self.kromeoptstr += ' -cooling='+ self.default_KROME[self.entries_KROME.index('COOLING_TYPE')]
550 
551  if self.default_KROME[self.entries_KROME.index('HEATING_TYPE')] != 'NONE':
552  self.kromeoptstr += ' -heating='+ self.default_KROME[self.entries_KROME.index('HEATING_TYPE')]
553 
554  if self.default_KROME[self.entries_KROME.index('GAMMA_TYPE')] != 'DEFAULT':
555  self.kromeoptstr += ' -gamma='+ self.default_KROME[self.entries_KROME.index('GAMMA_TYPE')]
556 
557  def WriteDefFileList(self):
558  """
559  Writes all modular entries, options, defaults into a list.
560  """
561  for x in self.entries:
562  self.def_file_list.append('#define '+x.ljust(21)+' '+self.default[self.entries.index(x)]+'\n')
563 
564  self.def_file_list.append('\n/* -- physics dependent declarations -- */\n\n')
565  self.phymodule = self.default[self.entries.index('PHYSICS')]
566  tmp1 = ['entries_%s'%self.phymodule, 'default_%s'%self.phymodule]
567  self.mod_entries = self.__getattribute__(tmp1[0])
568  self.mod_default = self.__getattribute__(tmp1[1])
569 
570  for x in self.mod_entries:
571  self.def_file_list.append('#define '+x.ljust(21)+' '+ self.mod_default[self.mod_entries.index(x)]+'\n')
572 
573  self.AppendAdditionalFiles()
575 
576  # always insert user-defined paramters and constants sections
577 
578  self.def_file_list.append('\n/* -- user-defined parameters (labels) -- */\n\n')
579  for x in self.udef_params:
580  self.def_file_list.append('#define '+x.ljust(21)+' '+'%d'%self.udef_params.index(x)+'\n')
581 
582  self.UpdatePlutoIni()
583 
584 
585  self.def_file_list.append('\n/* -- User_Constants_Beg -- DO NOT REMOVE THIS LINE*/\n\n')
586  for i in range(len(self.udef_const)):
587  self.def_file_list.append('#define '+self.udef_const[i].ljust(21)+' '+self.udef_const_vals[i]+'\n')
588  self.def_file_list.append('\n/* -- User_Constants_End -- DO NOT REMOVE THIS LINE*/\n\n')
589 
590 
591  self.def_file_list.append('\n/* -- supplementary constants (user editable) -- */ \n\n')
592  self.NonUserFriendlyConst()
593  for x in self.non_usfr:
594  self.def_file_list.append(x)
595 
596 
597 
598 
599 
600 
601 
602 
603 
604 
605 
def __init__(self, work_dir, pluto_dir, auto_update)
def SetTitle
Definition: menu.py:50
def Browse
Browse a menu with entries (1st column) and default (2nd column, optional) Note: with Python > 2...
Definition: menu.py:181
def Insert(entries, default)
Similar to Browse, but allow the user to directly input the default values by a reading a string...
Definition: menu.py:227
double max
Definition: analysis.c:5