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