Exemplo n.º 1
0
def check(pluto_dir, get_arch):

    work_dir = os.getcwd()
    print ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
    print ("\n>> Inspecting system configuration << \n")

    # log_file     = pluto_dir+'/system.conf'
    log_file = work_dir + "/sysconf.out"
    config_dir = pluto_dir + "/Config/"
    python_dir = pluto_dir + "/Tools/Python"
    bintools_dir = pluto_dir + "/Tools/bin_tools"
    param_file = pluto_dir + "/Src/pluto.h"

    os.chdir(python_dir)
    log = []

    #  ---------------------
    #    get user name
    #  ---------------------

    try:
        user = os.getlogin()
    except OSError:
        user = "******"

    #  ---------------------
    #    get system spec.
    #  ---------------------

    PLATFORM = os.uname()

    #  ---------------------
    #   find current
    #   version of PLUTO
    #  ---------------------

    scrh = file.word_find(param_file, "PLUTO_VERSION")
    ipos = scrh[0]
    scrh = file.read_lines(param_file, ipos, ipos + 1)
    vers = string.split(scrh[0])
    vers = vers[2]

    # ------------------------------
    #  print a short system summary
    # ------------------------------

    print "User.......................", user
    print "System name................", PLATFORM[0]
    print "Node name..................", PLATFORM[1]
    print "Release....................", PLATFORM[2]
    print "Arch.......................", PLATFORM[4]
    print "Byteorder..................", sys.byteorder
    print "Version....................", PLATFORM[3]
    print "Working_dir................", work_dir
    print "PLUTO main dir.............", pluto_dir
    print "PLUTO version..............", vers

    # --------------------------------------
    #  Check for gcc or another c compiler
    # --------------------------------------

    compiler_list = ["gcc", "cc", "gcc2"]
    COMPILER_NAME = ""

    for x in compiler_list:
        if CHECK_FOR(x) == "YES":
            print "C Compiler................. " + x
            COMPILER_NAME = x
            break

    if COMPILER_NAME == "":
        print "! Can not find a C compiler       !"

    # -----------------
    #  check for mpi
    # -----------------

    mpi_compiler_list = ["mpicc", "mpiCC", "mpcc_r", "hcc", "mpcc"]
    MPI_COMPILER_NAME = ""

    for x in mpi_compiler_list:
        if CHECK_FOR(x) == "YES":
            print "MPI Compiler .............. " + x
            MPI_COMPILER_NAME = x
            break

    if MPI_COMPILER_NAME == "":
        print "MPI Compiler............... NOT FOUND"

    if get_arch:
        print "\n"
        print "Proposed makefile names: \n"
        print "> " + PLATFORM[0] + "." + PLATFORM[4] + "." + COMPILER_NAME + ".defs"
        print "> " + PLATFORM[0] + "." + PLATFORM[4] + "." + MPI_COMPILER_NAME + ".defs"
        return

    # ---------------------------------------------------
    #  Build log list, that will be compared to the
    #  sysconf.out file.
    # ---------------------------------------------------

    log.append("USER           = "******"\n")
    log.append("WORKING_DIR    = " + work_dir + "\n")
    log.append("SYSTEM_NAME    = " + PLATFORM[0] + "\n")
    log.append("NODE_NAME      = " + PLATFORM[1] + "\n")
    log.append("RELEASE        = " + PLATFORM[2] + "\n")
    log.append("ARCH           = " + PLATFORM[4] + "\n")
    log.append("BYTE_ORDER     = " + sys.byteorder + "\n")
    log.append("VERSION        = " + PLATFORM[3] + "\n")
    log.append("PLUTO_DIR      = " + pluto_dir + "\n")
    log.append("PLUTO_VERSION  = " + vers + "\n")
    log.append("C_COMPILER     = " + COMPILER_NAME + "\n")
    log.append("MPI_C_COMPILER = " + MPI_COMPILER_NAME + "\n")

    #  ----------------------------
    #    check for online updates
    #  ----------------------------

    print "\n> Checking for updates (canceled)...\n"
    # try:
    #   urllib.urlretrieve("http://plutocode.ph.unito.it/updates.txt","updates.txt")
    #   scrh = file.word_find ("updates.txt","release")
    #   ipos = scrh[0]
    #   scrh = file.read_lines ("updates.txt", ipos, ipos + 1)
    #   rels = string.split(scrh[0])
    #   if (rels[1] != vers):
    #     print "   ******************************************************* "
    #     print "    A new version of PLUTO ("+rels[1]+") is available at"
    #     print "    http://plutocode.oato.inaf.it"
    #     print "   *******************************************************\n"
    #     scrh = raw_input("> Press enter to continue.")
    #     os.chdir(work_dir)
    # except:
    #   print "! Connection not available\n"

    # ------------------------------------------------
    #  Compare the list 'log' with the file log_file;
    #
    #   - if they match, no update is necessary,
    #               ==> return to main menu
    #
    #   - if they do not match or if log_file does not
    #     exists, create a new one
    #
    # ------------------------------------------------

    if os.path.exists(log_file):
        scrh = file.read_lines(log_file, 0, 128)
        if scrh[0:] == log[0:]:
            print "\n>> ok"
            os.chdir(work_dir)
            return
        else:
            print "\n> System configuration file is not up to date. Updating..."
    else:
        print "\n> System configuration file not found, creating one..."

    file.create_file(log_file, log)

    # ------------
    #  Make Tools
    # ------------

    # print (" > Making binary tools in "+bintools_dir+"...")
    # os.chdir(bintools_dir)
    # os.system('make -s clean')
    # os.system('make -s dbl2flt')
    # os.system('make -s bin2ascii')
    # if (HAVE_LIBPNG == 'YES'):
    #   os.system('make -s bin2png')

    # ---------------------------
    #   Add important info here
    # ---------------------------

    # scrh = raw_input(" > Press enter to continue.")
    os.chdir(work_dir)
    return
Exemplo n.º 2
0
def makefile(work_dir, pluto_path, pluto_dir, additional_files,
             additional_flags, makefile_template, AUTO_UPDATE):

    mkfl_name = work_dir + '/makefile'
    mkfl_exist = os.path.exists(mkfl_name)

    # is Chombo required ?

    WITH_CHOMBO = 0
    for x in sys.argv:
        if (x == "--with-chombo" or x == "--with-chombo:"):
            WITH_CHOMBO = 1

# try to get "ARCH" from makefile

    if (mkfl_exist):
        scrh = file.string_list(mkfl_name, 'ARCH')

# Create a new makefile under the following conditions:

    if (AUTO_UPDATE == 0) or (not mkfl_exist) or (len(scrh) == 0):

        # define architecture

        entries = os.listdir(pluto_dir + '/Config')

        entries.sort()
        menu.SetTitle("Change makefile")
        arch = menu.Browse(entries)  # call menu to select config. file
        arch_string = 'ARCH         = ' + arch + '\n'
    else:  # try to update makefile automatically
        arch_string = scrh[0]
        arch = (string.split(arch_string))[2]

# Starting print here

    row = 1
    menu.Print("> Generating makefile... [" + arch + "]", row=row, sleep=1)

    # if CHOMBO is required, change dir to Lib/Chombo/lib, make vars to generate
    # a list of all the variables needed by CHOMBO makefile and copy the list to
    # make.vars in local working directory.
    # This file will be used later by PLUTO makefile.

    if (WITH_CHOMBO):

        # get the number of DIMENSIONS from definitions.h

        scrh = file.string_list(work_dir + "/definitions.h", "DIMENSIONS")
        scrh = string.split(scrh[0])

        # build chombo configuration string

        chombo_config_string = 'DIM=' + scrh[2]
        for x in sys.argv:
            if (x == '--with-chombo:'):
                i = sys.argv.index(x) + 1
                for y in sys.argv[i:]:
                    chombo_config_string += ' ' + y

        row = row + 1
        menu.Print("  - Chombo config string: " + chombo_config_string,
                   row=row)
        row = row + 1
        menu.Print("  - creating make.vars...", row=row, sleep=0)
        os.chdir(pluto_dir + "/Lib/Chombo-3.1/lib")
        os.system("make " + chombo_config_string + " vars > make.vars\n")
        os.system("cp make.vars " + work_dir + "\n")
        os.chdir(work_dir)

# copy template

    shutil.copy(pluto_dir + makefile_template[0], mkfl_name)

    # write main PLUTO dir

    scrh = file.word_find(mkfl_name, 'PLUTO_DIR')
    ipos = scrh[0]
    file.replace_line(mkfl_name, 'PLUTO_DIR    = ' + pluto_dir + '\n', ipos)

    #  write architecture

    scrh = file.word_find(mkfl_name, 'ARCH')
    ipos = scrh[0]
    file.replace_line(mkfl_name, arch_string, ipos)

    #  Write additional objects to makefile

    scrh = file.word_find(mkfl_name, 'Additional_object_files_here')
    ipos = scrh[0] + 3

    for x in additional_files:
        file.insert(mkfl_name, 'OBJ += ' + x + '\n', ipos)
        ipos = ipos + 1

# add included makefile; useful for header dependences

    for x in pluto_path:
        file.insert(mkfl_name, 'include $(SRC)/' + x + 'makefile' + '\n', ipos)
        ipos = ipos + 1

#  Write additional flags for C compiler

    for x in additional_flags:
        file.insert(mkfl_name, 'CFLAGS += ' + x + '\n', ipos)
        ipos = ipos + 1

# Check for libpng

# if (WITH_CHOMBO == 0):
#   if (os.path.exists("sysconf.out")):
#     scrh = file.string_find ("sysconf.out", "LIBPNG")
#     line = file.read_lines("sysconf.out", scrh[0], scrh[0]+1)
#     line_list = string.split(line[0])
#     if (line_list[2] == 'YES'):
#       file.insert(this_makefile, 'LDFLAGS += -lpng\n', ipos)
#       ipos = ipos + 1
#       file.insert(this_makefile, 'CFLAGS += -DHAVE_LIBPNG\n', ipos)

    return
Exemplo n.º 3
0
def problem(work_dir, pluto_path, pluto_dir, additional_files,
            additional_flags, makefile_template, AUTO_UPDATE):

    #  before proceeding we scan pre-existing definitions.h
    #  for obsolete statements in order to and make  proper replacements.

    replace_obsoletes(work_dir)

    #  sys.exit(1)

    HD = 1
    RHD = 2
    MHD = 3
    SRMHD = 4
    RMHD = 5

    WITH_CHOMBO = 0  # enable/disable Chombo AMR
    FULL = 0
    WITH_FD = 0  # enable/disable finite difference schemes
    WITH_SB = 0  # enable/disable shearing box module
    WITH_FARGO = 0  # enable/disable FARGO module for orbital advection

    # *****************************************
    #      check command line arguments
    # *****************************************

    for x in sys.argv:
        if (x == "--with-chombo" or x == "--with-chombo:"):
            WITH_CHOMBO = 1
        if (x == "--full"):
            FULL = 1
        if (x == "--with-fd"):
            WITH_FD = 1
        if (x == "--with-sb"):
            WITH_SB = 1
        if (x == "--with-fargo"):
            WITH_FARGO = 1

# -- default makefile template --

    if (WITH_CHOMBO):
        makefile_template.append('/Src/Templates/makefile.chombo')
    else:
        makefile_template.append('/Src/Templates/makefile')

# Create user-editable menu

    entries = []
    options = []
    default = []
    scrh = []

    entries.append('PHYSICS')
    if (WITH_FD or WITH_FARGO):
        options.append(['HD', 'MHD'])
        default.append('HD')
    elif (WITH_SB):
        options.append(['MHD'])
        default.append('MHD')
    else:
        options.append(['HD', 'RHD', 'MHD', 'RMHD'])
        default.append('HD')

    entries.append('DIMENSIONS')
    if (WITH_SB or WITH_FARGO):
        options.append(['2', '3'])
        default.append('2')
    else:
        options.append(['1', '2', '3'])
        default.append('1')

    entries.append('COMPONENTS')
    if (WITH_SB):
        options.append(['2', '3'])
        default.append('2')
    else:
        options.append(['1', '2', '3'])
        default.append('1')

    entries.append('GEOMETRY')
    if (WITH_CHOMBO):
        #    options.append(['CARTESIAN','CYLINDRICAL','AXISYM'])
        options.append(['CARTESIAN', 'CYLINDRICAL'])
        default.append('CARTESIAN')
    elif (WITH_FD or WITH_SB):
        options.append(['CARTESIAN'])
        default.append('CARTESIAN')
    else:
        #    options.append(['CARTESIAN','CYLINDRICAL','AXISYM','POLAR','SPHERICAL'])
        options.append(['CARTESIAN', 'CYLINDRICAL', 'POLAR', 'SPHERICAL'])
        default.append('CARTESIAN')

#  entries.append('UNIFORM_GRID')
#  if (WITH_CHOMBO):
#    options.append('YES')
#    default.append('YES')
#  else:
#    options.append(['YES','NO'])
#    default.append('YES')

    entries.append('BODY_FORCE')
    if (WITH_SB):
        options.append(['VECTOR', 'POTENTIAL', '(VECTOR+POTENTIAL)'])
        default.append('VECTOR')
    else:
        options.append(['NO', 'VECTOR', 'POTENTIAL', '(VECTOR+POTENTIAL)'])
        default.append('NO')

    entries.append('COOLING')
    options.append(['NO', 'POWER_LAW', 'TABULATED', 'SNEq',
                    'MINEq'])  # ,'H2_COOL'])
    default.append('NO')

    #  entries.append('INCLUDE_PARTICLES')
    #  options.append(['NO','YES'])
    #  default.append('NO')

    # set interpolation options

    entries.append('INTERPOLATION')
    if (WITH_CHOMBO):
        options.append(['FLAT', 'LINEAR', 'WENO3', 'PARABOLIC'])
        default.append('LINEAR')
    elif (FULL):
        options.append(
            ['FLAT', 'LINEAR', 'LimO3', 'WENO3', 'PARABOLIC', 'MP5'])
        default.append('LINEAR')
    elif (WITH_FD):
        options.append(['WENO3_FD', 'WENOZ_FD', 'MP5_FD', 'LIMO3_FD'])
        default.append('WENOZ_FD')
    else:
        options.append(['FLAT', 'LINEAR', 'LimO3', 'WENO3',
                        'PARABOLIC'])  # Default
        default.append('LINEAR')

    entries.append('TIME_STEPPING')
    if (WITH_CHOMBO):
        #    options.append(['HANCOCK','CHARACTERISTIC_TRACING','RK_MIDPOINT','EULER','RK2'])
        options.append(['EULER', 'HANCOCK', 'CHARACTERISTIC_TRACING', 'RK2'])
        default.append('HANCOCK')
    elif (WITH_FD):
        options.append(['RK3'])
        default.append('RK3')
    else:
        #    options.append(['EULER','RK_MIDPOINT','RK2','RK3','HANCOCK','CHARACTERISTIC_TRACING'])
        options.append(
            ['EULER', 'RK2', 'RK3', 'HANCOCK', 'CHARACTERISTIC_TRACING'])
        default.append('RK2')

    entries.append('DIMENSIONAL_SPLITTING')
    if (WITH_CHOMBO or WITH_FARGO):
        options.append(['NO'])
        default.append('NO')
    else:
        options.append(['YES', 'NO'])
        default.append('YES')

    entries.append('NTRACER')
    for n in range(5):
        scrh.append(repr(n))
    options.append(scrh)
    default.append('0')

    scrh = []
    entries.append('USER_DEF_PARAMETERS')
    for n in range(32):
        scrh.append(repr(n + 1))
    options.append(scrh)
    default.append('1')

    # **************************************************
    #   If  definitions.h already exists try to read
    #   default values from it.
    # **************************************************

    if (os.path.exists(work_dir + '/definitions.h')):
        for x in entries:
            try:
                scrh = file.string_list(work_dir + '/definitions.h', x)
                tmp = string.split(scrh[0])
                i = entries.index(tmp[1])
                y = options[i]
                i2 = y.index(tmp[2])
                default[entries.index(x)] = tmp[2]

            except ValueError:
                continue

            except IndexError:
                continue

#  ****  ok, call menu  ****

    if AUTO_UPDATE == 0:
        selection = ''
        menu.SetTitle("Setup problem")
        selection = menu.Browse(entries, default, options)
#    selection = menu.select(entries,options,default,'Setup problem')

# **************************************************
#       define Physics module sub-menus
# **************************************************

    i = entries.index('DIMENSIONS')
    dimensions = int(default[i])
    i = entries.index('PHYSICS')
    physics_module = default[i]
    i = entries.index('GEOMETRY')
    geometry = default[i]
    i = entries.index('INTERPOLATION')
    interpolation = default[i]
    i = entries.index('TIME_STEPPING')
    time_stepping = default[i]
    i = entries.index('DIMENSIONAL_SPLITTING')
    dim_splitting = default[i]

    # HD

    if physics_module == 'HD':
        entries_HD = []
        options_HD = []
        default_HD = []

        entries_HD.append('EOS')
        options_HD.append(['IDEAL', 'ISOTHERMAL'])
        default_HD.append('IDEAL')

        entries_HD.append('ENTROPY_SWITCH')
        options_HD.append(['NO', 'YES'])
        default_HD.append('NO')

        entries_HD.append('THERMAL_CONDUCTION')
        if (WITH_CHOMBO == 1):
            options_HD.append(['NO', 'EXPLICIT'])
        else:
            #      options_HD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING','RK_CHEBYSHEV'])
            options_HD.append(['NO', 'EXPLICIT', 'SUPER_TIME_STEPPING'])

        default_HD.append('NO')

        entries_HD.append('VISCOSITY')
        if (WITH_CHOMBO == 1):
            options_HD.append(['NO', 'EXPLICIT'])
        else:
            #      options_HD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING','RK_CHEBYSHEV'])
            options_HD.append(['NO', 'EXPLICIT', 'SUPER_TIME_STEPPING'])

        default_HD.append('NO')

        entries_HD.append('ROTATING_FRAME')
        options_HD.append(['NO', 'YES'])
        default_HD.append('NO')

        #    if (physics_module == "HD" and dim_splitting == "YES"):
        #      if (geometry == "POLAR" or geometry == "SPHERICAL"):
        #        entries_HD.append('FARGO_SCHEME')
        #        options_HD.append(['NO','YES'])
        #        default_HD.append('NO')

        #  Read HD pre-existing HD submenu defaults, if they exists

        if (os.path.exists(work_dir + '/definitions.h')):
            for x in entries_HD:
                try:
                    scrh = file.string_list(work_dir + '/definitions.h', x)
                    tmp = string.split(scrh[0])
                    default_HD[entries_HD.index(x)] = tmp[2]
                except IndexError:
                    continue

        if AUTO_UPDATE == 0:
            selection = ''
            menu.SetTitle("HD Menu")
            selection = menu.Browse(entries_HD, default_HD, options_HD)
#      selection = menu.select(entries_HD,options_HD,default_HD,'HD MENU')

# RHD

    if physics_module == 'RHD':
        entries_RHD = []
        options_RHD = []
        default_RHD = []

        entries_RHD.append('EOS')
        options_RHD.append(['IDEAL', 'TAUB'])
        default_RHD.append('IDEAL')

        entries_RHD.append('USE_FOUR_VELOCITY')
        options_RHD.append(['NO', 'YES'])
        default_RHD.append('NO')

        entries_RHD.append('ENTROPY_SWITCH')
        options_RHD.append(['NO', 'YES'])
        default_RHD.append('NO')

        #  Read RHD pre-existing RHD submenu defaults, if they exists

        if (os.path.exists(work_dir + '/definitions.h')):
            for x in entries_RHD:
                try:
                    scrh = file.string_list(work_dir + '/definitions.h', x)
                    tmp = string.split(scrh[0])
                    default_RHD[entries_RHD.index(x)] = tmp[2]
                except IndexError:
                    continue

        if AUTO_UPDATE == 0:
            selection = ''
            menu.SetTitle("RHD Menu")
            selection = menu.Browse(entries_RHD, default_RHD, options_RHD)
#      selection = menu.select(entries_RHD,options_RHD,default_RHD,'RHD MENU')

# MHD

    if (physics_module == 'MHD'):
        entries_MHD = []
        options_MHD = []
        default_MHD = []

        entries_MHD.append('EOS')
        options_MHD.append(['IDEAL', 'BAROTROPIC', 'ISOTHERMAL'])
        default_MHD.append('IDEAL')

        entries_MHD.append('ENTROPY_SWITCH')
        options_MHD.append(['NO', 'YES'])
        default_MHD.append('NO')

        entries_MHD.append('MHD_FORMULATION')
        if (WITH_CHOMBO or WITH_FD):
            options_MHD.append(['NONE', 'EIGHT_WAVES', 'DIV_CLEANING'])
            default_MHD.append('EIGHT_WAVES')
        elif (WITH_SB or WITH_FARGO):
            options_MHD.append(['CONSTRAINED_TRANSPORT'])
            default_MHD.append('CONSTRAINED_TRANSPORT')
        else:
            options_MHD.append([
                'NONE', 'EIGHT_WAVES', 'DIV_CLEANING', 'CONSTRAINED_TRANSPORT'
            ])
            default_MHD.append('EIGHT_WAVES')

        entries_MHD.append('BACKGROUND_FIELD')
        options_MHD.append(['NO', 'YES'])
        default_MHD.append('NO')

        entries_MHD.append('RESISTIVE_MHD')
        if (WITH_CHOMBO == 1):
            options_MHD.append(['NO', 'EXPLICIT'])
        else:
            #      options_MHD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING','RK_CHEBYSHEV'])
            options_MHD.append(['NO', 'EXPLICIT', 'SUPER_TIME_STEPPING'])

        default_MHD.append('NO')

        entries_MHD.append('HALL_MHD')
        options_MHD.append(['NO', 'RIEMANN', 'SOURCE'])
        default_MHD.append('NO')

        entries_MHD.append('AMBIPOLAR_DIFFUSION')
        options_MHD.append(['NO', 'EXPLICIT'])
        default_MHD.append('NO')

        entries_MHD.append('THERMAL_CONDUCTION')
        if (WITH_CHOMBO == 1):
            options_MHD.append(['NO', 'EXPLICIT'])
        else:
            #      options_MHD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING','RK_CHEBYSHEV'])
            options_MHD.append(['NO', 'EXPLICIT', 'SUPER_TIME_STEPPING'])

        default_MHD.append('NO')

        entries_MHD.append('VISCOSITY')
        if (WITH_CHOMBO == 1):
            options_MHD.append(['NO', 'EXPLICIT'])
        else:
            #      options_MHD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING','RK_CHEBYSHEV'])
            options_MHD.append(['NO', 'EXPLICIT', 'SUPER_TIME_STEPPING'])

        default_MHD.append('NO')

        entries_MHD.append('ROTATING_FRAME')
        options_MHD.append(['NO', 'YES'])
        default_MHD.append('NO')

        #  Read MHD pre-existing MHD submenu defaults, if they exists

        if (os.path.exists(work_dir + '/definitions.h')):
            for x in entries_MHD:
                ix = entries_MHD.index(x)
                try:
                    scrh = file.string_list(work_dir + '/definitions.h', x)
                    tmp = string.split(scrh[0])
                    try:  # if the choice is not in the permitted list of options,
                        # ValueError is raised and the default choice is kept.
                        i = options_MHD[ix].index(tmp[2])
                        default_MHD[ix] = tmp[2]
                    except ValueError:
                        continue
                except IndexError:
                    continue

        if AUTO_UPDATE == 0:
            selection = ''
            if (physics_module == 'MHD'):
                menu.SetTitle("MHD Menu")
                selection = menu.Browse(entries_MHD, default_MHD, options_MHD)
#        selection = menu.select(entries_MHD,options_MHD,default_MHD,'MHD MENU')

# RMHD

    if physics_module == 'RMHD':
        entries_RMHD = []
        options_RMHD = []
        default_RMHD = []

        entries_RMHD.append('EOS')
        options_RMHD.append(['IDEAL', 'TAUB'])
        default_RMHD.append('IDEAL')

        entries_RMHD.append('ENTROPY_SWITCH')
        options_RMHD.append(['NO', 'YES'])
        default_RMHD.append('NO')

        entries_RMHD.append('MHD_FORMULATION')
        if (WITH_CHOMBO == 1):
            options_RMHD.append(['NONE', 'EIGHT_WAVES', 'DIV_CLEANING'])
        else:
            options_RMHD.append([
                'NONE', 'EIGHT_WAVES', 'DIV_CLEANING', 'CONSTRAINED_TRANSPORT'
            ])

        default_RMHD.append('NONE')

        #  Read RMHD pre-existing RMHD submenu defaults, if they exists

        if (os.path.exists(work_dir + '/definitions.h')):
            for x in entries_RMHD:
                ix = entries_RMHD.index(x)
                try:
                    scrh = file.string_list(work_dir + '/definitions.h', x)
                    tmp = string.split(scrh[0])
                    try:  # if the choice is not in the permitted list of options,
                        # ValueError is raised and the default choice is kept.
                        i = options_RMHD[ix].index(tmp[2])
                        default_RMHD[ix] = tmp[2]
                    except ValueError:
                        continue
                except IndexError:
                    continue

        if AUTO_UPDATE == 0:
            selection = ''
            if (physics_module == 'RMHD'):
                menu.SetTitle("RMHD Menu")
                selection = menu.Browse(entries_RMHD, default_RMHD,
                                        options_RMHD)
#        selection = menu.select(entries_RMHD,options_RMHD,default_RMHD,'RMHD MENU')

# ********************************************************************
#    USER_DEF PARAMETERS:
#
#      Read them from definitions.h if the file exists;
#      assign  'SCRH' otherwise.
# ********************************************************************

    i = entries.index('USER_DEF_PARAMETERS')
    npar = int(default[i])
    u_def_par = []
    if (os.path.exists(work_dir + '/definitions.h')):
        scrh = file.word_find(work_dir + '/definitions.h', 'parameters')
        k0 = scrh[0] + 2
        scrh = file.read_lines(work_dir + '/definitions.h', k0, k0 + npar)
        for n in range(npar):
            try:
                x = string.split(scrh[n])
                if (x[0] == "#define"):
                    u_def_par.append(x[1])
                else:
                    u_def_par.append('SCRH')
            except IndexError:
                u_def_par.append('SCRH')
#        scrh[n + 1] = '#define SCRH  x'

    else:
        for n in range(npar):
            u_def_par.append('SCRH')

    if AUTO_UPDATE == 0:
        #    u_def_par = ['SCRH']
        menu.SetTitle("User-defined parameters")
        menu.Insert(int(default[i]), u_def_par)
#    menu.put(int(default[i]),u_def_par,'USER DEF SECTION')

# -----------------------------------------------------
#   Create the list 'tmp' that will be used to write
#   the new definitions.h header file
# -----------------------------------------------------

    tmp = []
    for x in entries:
        i = entries.index(x)
        y = default[i]
        tmp.append('#define  ' + x.ljust(21) + '   ' + y + '\n')

    tmp.append('\n/* -- physics dependent declarations -- */\n\n')

    if (physics_module == 'MHD'):
        for x in entries_MHD:
            i = entries_MHD.index(x)
            tmp.append('#define  ' + x.ljust(21) + '   ' + default_MHD[i] +
                       '\n')

    if physics_module == 'HD':
        for x in entries_HD:
            i = entries_HD.index(x)
            tmp.append('#define    ' + x.ljust(21) + '   ' + default_HD[i] +
                       '\n')

    if physics_module == 'RHD':
        for x in entries_RHD:
            i = entries_RHD.index(x)
            tmp.append('#define    ' + x.ljust(21) + '   ' + default_RHD[i] +
                       '\n')

    if physics_module == 'RMHD':
        for x in entries_RMHD:
            i = entries_RMHD.index(x)
            tmp.append('#define    ' + x.ljust(21) + '   ' + default_RMHD[i] +
                       '\n')

# *****************************************
#     add Chombo-AMR specific flags
# *****************************************

    if (WITH_CHOMBO and os.path.exists(work_dir + '/definitions.h')):
        scrh = file.string_list(work_dir + '/definitions.h', 'AMR_EN_SWITCH')
        tmp.append('\n/* -- Chombo-AMR flags -- */\n\n')
        if (len(scrh) != 0):
            strsplit = string.split(scrh[0])
            value = strsplit[2]
            tmp.append('#define  AMR_EN_SWITCH   ' + value + '\n')
        else:
            tmp.append('#define  AMR_EN_SWITCH   NO\n')

# *******************************************************
#     add pointer names to user defined parameters
# *******************************************************

    tmp.append('\n/* -- pointers to user-def parameters -- */\n\n')

    for x in u_def_par:
        i = u_def_par.index(x)
        tmp.append('#define  ' + x.ljust(16) + '   ' + repr(i) + '\n')

    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    #   In this section, also, udpate the pluto.ini
    #   initialization file by appending the correct
    #   sequence of user defined parameters
    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#  menu.RestoreScreen()
    plutoini = work_dir + "/pluto.ini"
    scrh = file.string_find(plutoini, 'Parameters')
    ipos = scrh[0] + 2  # start reading/writing pluto.ini at this point
    # to build a list of the userdef parameters
    scrh = file.read_lines(plutoini, ipos, 999)  # read until end of file

    pname = []
    pvalue = []

    for x in scrh:
        y = string.split(x)  # pname and pvalue contain the list of parameter
        if (len(y) == 0): continue  # skip blank lines
        pname.append(y[0])  # names and their respective values as present
        pvalue.append(y[1])  # in pluto.ini

    for x in u_def_par:  # loop on the actual list of parameters;
        par_exist = 0  # is the parameter already present in pluto.ini ?
        for y in pname:
            if (x == y):  # if yes, use the original value instead of '0'
                par_exist = 1
                i = pname.index(y)
                file.insert(plutoini, pname[i] + "    " + pvalue[i] + "\n",
                            ipos)
                break

        if (par_exist == 0):  # if not, set default value to 0
            file.insert(plutoini, x + '    0\n', ipos)

        ipos = ipos + 1

    # delete all other lines in pluto.ini

    file.delete_lines(plutoini, ipos, ipos + 256)

    # ***************************************************************
    #    check dependencies for conditional inclusion
    #    of additional object files; this is useful
    #    for makefile creation
    # ***************************************************************

    # additional files will be compiled
    # depending on the user's choice of
    # time integration scheme

    # the next line removes all elements from additional_files
    # and pluto_path so the list can be built from scratch

    #  for x in additional_files: additional_files.remove(x)
    #  for x in pluto_path      : pluto_path.remove(x)

    additional_files[:] = []
    additional_flags[:] = []
    pluto_path[:] = []

    divb = ' '

    # **********************************************
    #   physics module & parabolic term treatment
    # **********************************************

    sts_flag = 0  # if changed to 1, include the super-time-stepping driver
    rkc_flag = 0  # if changed to 1, include the runge-kutta-Chebyshev driver
    exp_flag = 0  # if changed to 1, include explicit parabolic time-stepping
    cur_flag = 0  # if changed to 1, include current calculation

    if (physics_module == 'HD'):
        pluto_path.append('HD/')
        entries_MOD = entries_HD
        default_MOD = default_HD

        n = entries_MOD.index('THERMAL_CONDUCTION')
        if (default_MOD[n] != 'NO'):
            pluto_path.append('Thermal_Conduction/')
            if (default_MOD[n] == 'SUPER_TIME_STEPPING'): sts_flag = 1
            elif (default_MOD[n] == 'RK_CHEBYSHEV'): rkc_flag = 1
            elif (default_MOD[n] == 'EXPLICIT'): exp_flag = 1

        n = entries_MOD.index('VISCOSITY')
        if (default_MOD[n] != 'NO'):
            pluto_path.append('Viscosity/')
            if (default_MOD[n] == 'SUPER_TIME_STEPPING'): sts_flag = 1
            elif (default_MOD[n] == 'RK_CHEBYSHEV'): rkc_flag = 1
            elif (default_MOD[n] == 'EXPLICIT'): exp_flag = 1

    elif (physics_module == 'RHD'):
        pluto_path.append('RHD/')
        entries_MOD = entries_RHD
        default_MOD = default_RHD

    elif (physics_module == 'MHD'):
        pluto_path.append('MHD/')
        entries_MOD = entries_MHD
        default_MOD = default_MHD
        n = entries_MOD.index('MHD_FORMULATION')
        divb = default_MOD[n]
        if (divb == 'CONSTRAINED_TRANSPORT'):
            pluto_path.append('MHD/CT/')
        elif (divb == 'DIV_CLEANING'):
            pluto_path.append('MHD/GLM/')

        n = entries_MOD.index('RESISTIVE_MHD')
        if (default_MOD[n] != 'NO'):
            pluto_path.append('MHD/Resistive/')
            cur_flag = 1
            if (default_MOD[n] == 'SUPER_TIME_STEPPING'): sts_flag = 1
            elif (default_MOD[n] == 'RK_CHEBYSHEV'): rkc_flag = 1
            elif (default_MOD[n] == 'EXPLICIT'): exp_flag = 1

        n = entries_MOD.index('HALL_MHD')
        if (default_MOD[n] != 'NO'):
            pluto_path.append('MHD/Hall/')
            if (default_MOD[n] == 'RIEMANN'): cur_flag = 1

        n = entries_MOD.index('AMBIPOLAR_DIFFUSION')
        if (default_MOD[n] != 'NO'):
            pluto_path.append('MHD/Ambipolar/')
            cur_flag = 1

        n = entries_MOD.index('THERMAL_CONDUCTION')
        if (default_MOD[n] != 'NO'):
            pluto_path.append('Thermal_Conduction/')
            if (default_MOD[n] == 'SUPER_TIME_STEPPING'): sts_flag = 1
            elif (default_MOD[n] == 'RK_CHEBYSHEV'): rkc_flag = 1
            elif (default_MOD[n] == 'EXPLICIT'): exp_flag = 1

        n = entries_MOD.index('VISCOSITY')
        if (default_MOD[n] != 'NO'):
            pluto_path.append('Viscosity/')
            if (default_MOD[n] == 'SUPER_TIME_STEPPING'): sts_flag = 1
            elif (default_MOD[n] == 'RK_CHEBYSHEV'): rkc_flag = 1
            elif (default_MOD[n] == 'EXPLICIT'): exp_flag = 1

        if (cur_flag == 1):
            pluto_path.append('MHD/Current/')
            additional_flags.append(' -DNEED_CURRENT')
        # ***************************
        #  need shearingbox module ?
        # ***************************

        if (WITH_SB == 1):
            pluto_path.append('MHD/ShearingBox/')
            additional_flags.append(' -DSHEARINGBOX')

    elif (physics_module == 'RMHD'):
        pluto_path.append('RMHD/')
        entries_MOD = entries_RMHD
        default_MOD = default_RMHD
        n = entries_MOD.index('MHD_FORMULATION')
        divb = default_MOD[n]
        if (divb == 'CONSTRAINED_TRANSPORT'):
            pluto_path.append('MHD/CT/')
        elif (divb == 'DIV_CLEANING'):
            pluto_path.append('MHD/GLM/')

    # *****************************
    #       Interpolation
    # *****************************

    if (interpolation == 'FLAT'):
        additional_files.append('states_flat.o')
    elif (interpolation == 'LINEAR'):
        additional_files.append('states_plm.o')
    elif (interpolation == 'PARABOLIC'):
        additional_files.append('states_ppm.o')
    elif (interpolation == 'LimO3'):
        additional_files.append('states_limo3.o')
    elif (interpolation == 'WENO3'):
        additional_files.append('states_weno3.o')

    elif (WITH_FD):  # Finite Difference

        additional_files.append('states_fd.o')
        additional_files.append('fd_reconstruct.o')
        additional_files.append('fd_flux.o')
        additional_flags.append(' -DFINITE_DIFFERENCE')

    # *****************************
    #       Time Stepping
    # *****************************

    if (WITH_CHOMBO):  # ** AMR file inclusion **

        if (dimensions == 1): additional_files.append('PatchCTU.1D.o')
        else:
            if (time_stepping == 'RK_MIDPOINT'):
                additional_files.append('PatchRK.3D.o')
            elif (time_stepping == 'EULER'):
                additional_files.append('PatchEuler.3D.o')
            elif (time_stepping == 'RK2'):
                additional_files.append('PatchEuler.3D.o')
            else:
                additional_files.append('PatchCTU.3D.o')

    else:
        if (time_stepping == 'CHARACTERISTIC_TRACING'):
            if (dim_splitting == 'YES'): additional_files.append('sweep.o')
            else: additional_files.append('unsplit_ctu.o')
        elif (time_stepping == 'HANCOCK'):
            if (dim_splitting == 'YES'): additional_files.append('sweep.o')
            else: additional_files.append('unsplit_ctu.o')
        elif (time_stepping == 'RK_MIDPOINT'):
            additional_files.append('rk_midpoint.o')
        else:
            if (dim_splitting == 'YES'): additional_files.append('sweep.o')
            else: additional_files.append('unsplit.o')

    if (time_stepping == 'CHARACTERISTIC_TRACING'):
        additional_files.append('char_tracing.o')
    elif (time_stepping == 'HANCOCK'):
        additional_files.append('hancock.o')

#  if (interpolation != 'LINEAR'):
#    if (time_stepping == 'CHARACTERISTIC_TRACING'):
#      additional_files.append('states_ppm_char.o')
#    else:
#      additional_files.append('rk_states.o')

# *****************************
#      FARGO Scheme
# *****************************

    if (WITH_FARGO):
        pluto_path.append('Fargo/')
        additional_flags.append(' -DFARGO')

    # *****************************
    #      Geometry
    # *****************************

#  additional_files.append('rhs.o')
#   additional_files.append('rhs.o')

#  if (geometry == "CARTESIAN"):
#    additional_files.append('rhs_cart.o')
#  if (geometry == "AXISYM"):
#    additional_files.append('cylsource.o')

# *****************************
#         Cooling
# *****************************

    n = entries.index('COOLING')

    if (default[n] == 'POWER_LAW'):
        pluto_path.append('Cooling/Power_Law/')
    elif (default[n] == 'TABULATED'):
        pluto_path.append('Cooling/Tab/')
        additional_files.append('cooling_source.o')
        additional_files.append('cooling_ode_solver.o')
    elif (default[n] == 'SNEq'):
        pluto_path.append('Cooling/SNEq/')
        additional_files.append('cooling_source.o')
        additional_files.append('cooling_ode_solver.o')
    elif (default[n] == 'MINEq'):
        pluto_path.append('Cooling/MINEq/')
        additional_files.append('cooling_source.o')
        additional_files.append('cooling_ode_solver.o')
    elif (default[n] == 'H2_COOL'):
        pluto_path.append('Cooling/H2_COOL/')
        additional_files.append('cooling_source.o')
        additional_files.append('cooling_ode_solver.o')

    # **********************************
    #   parabolic flux: file inclusion
    # **********************************

    if (sts_flag == 1):
        additional_files.append('sts.o')
        additional_files.append('parabolic_rhs.o')

    if (rkc_flag == 1):
        additional_files.append('rkc.o')
        additional_files.append('parabolic_rhs.o')

    if (exp_flag == 1):
        additional_files.append('parabolic_flux.o')

    # **********************************************
    #          Vector potential
    # **********************************************

    if (physics_module == 'MHD' or physics_module == 'RMHD'):
        additional_files.append('vec_pot_diff.o')
        if (WITH_CHOMBO == 0): additional_files.append('vec_pot_update.o')

    # *****************************
    #          Particles
    # *****************************

#  n = entries.index('INCLUDE_PARTICLES')
#  if (default[n] == 'YES'):
#    pluto_path.append('Particles/')

# ****************************************************************
#       DEFINE ALL NON-USER FRIENDLY CONSTANTS
# ****************************************************************

    tmp.append('\n/* -- supplementary constants (user editable) -- */ \n\n')

    no_us_fr = []

    no_us_fr.append('#define  INITIAL_SMOOTHING     NO\n')
    no_us_fr.append('#define  WARNING_MESSAGES      NO\n')
    no_us_fr.append('#define  PRINT_TO_FILE         NO\n')
    no_us_fr.append('#define  INTERNAL_BOUNDARY     NO\n')
    no_us_fr.append('#define  SHOCK_FLATTENING      NO\n')
    if (not WITH_FD):
        no_us_fr.append('#define  ARTIFICIAL_VISCOSITY  NO\n')
        no_us_fr.append('#define  CHAR_LIMITING         NO\n')
        no_us_fr.append('#define  LIMITER               DEFAULT\n')

# add geometry-dependent switches

    if (geometry == "AXISYM"):
        no_us_fr.append('#define  ADD_CYLSOURCE            1\n')

#  if (geometry == "POLAR" and physics_module == "HD"):
#    no_us_fr.append('#define  FARGO_SCHEME          NO\n')

# add flux ct switches for MHD or RMHD

    if (divb == "CONSTRAINED_TRANSPORT"):
        no_us_fr.append('#define  CT_EMF_AVERAGE           UCT_HLL\n')
        no_us_fr.append('#define  CT_EN_CORRECTION         NO\n')
        no_us_fr.append('#define  ASSIGN_VECTOR_POTENTIAL  YES\n')
    elif (physics_module == "MHD" or physics_module == "RMHD"):
        no_us_fr.append('#define  ASSIGN_VECTOR_POTENTIAL  NO\n')

    if (physics_module == "MHD" or physics_module == "RMHD"):
        if (not WITH_CHOMBO):
            no_us_fr.append('#define  UPDATE_VECTOR_POTENTIAL  NO\n')

    if (time_stepping == 'HANCOCK'):
        if (physics_module == 'RMHD'):
            no_us_fr.append('#define  PRIMITIVE_HANCOCK     NO\n')
        else:
            no_us_fr.append('#define  PRIMITIVE_HANCOCK     YES\n')

# add definition of STS_NU

    if (sts_flag == 1):
        no_us_fr.append('#define  STS_nu                0.01\n')

# ***************************************************************
#    Read pre-existing non-user-editable defaults;
#    Use the default value if they exist
# ***************************************************************

    if (os.path.exists(work_dir + '/definitions.h')):
        for x in no_us_fr:
            try:
                xl = string.split(x)
                scrh = file.string_list(work_dir + '/definitions.h', xl[1])
                no_us_fr[no_us_fr.index(x)] = scrh[0]
            except IndexError:
                continue

# add elements of no_us_fr to tmp

    for x in no_us_fr:
        tmp.append(x)

# -- create definitions.h --

    file.create_file(work_dir + '/definitions.h', tmp)

    return
Exemplo n.º 4
0
def check(pluto_dir, get_arch):

    work_dir = os.getcwd()
    print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
    print("\n>> Inspecting system configuration << \n")

    # log_file     = pluto_dir+'/system.conf'
    log_file = work_dir + '/sysconf.out'
    config_dir = pluto_dir + '/Config/'
    python_dir = pluto_dir + '/Tools/Python'
    bintools_dir = pluto_dir + '/Tools/bin_tools'
    param_file = pluto_dir + '/Src/pluto.h'

    os.chdir(python_dir)
    log = []

    #  ---------------------
    #    get user name
    #  ---------------------

    try:
        user = os.getlogin()
    except OSError:
        user = '******'

    #  ---------------------
    #    get system spec.
    #  ---------------------

    PLATFORM = os.uname()

    #  ---------------------
    #   find current
    #   version of PLUTO
    #  ---------------------

    scrh = file.word_find(param_file, "PLUTO_VERSION")
    ipos = scrh[0]
    scrh = file.read_lines(param_file, ipos, ipos + 1)
    vers = string.split(scrh[0])
    vers = vers[2]

    # ------------------------------
    #  print a short system summary
    # ------------------------------

    print "User.......................", user
    print "System name................", PLATFORM[0]
    print "Node name..................", PLATFORM[1]
    print "Release....................", PLATFORM[2]
    print "Arch.......................", PLATFORM[4]
    print "Byteorder..................", sys.byteorder
    print "Version....................", PLATFORM[3]
    print "Working_dir................", work_dir
    print "PLUTO main dir.............", pluto_dir
    print "PLUTO version..............", vers

    # --------------------------------------
    #  Check for gcc or another c compiler
    # --------------------------------------

    compiler_list = ['gcc', 'cc', 'gcc2']
    COMPILER_NAME = ''

    for x in compiler_list:
        if (CHECK_FOR(x) == 'YES'):
            print "C Compiler................. " + x
            COMPILER_NAME = x
            break

    if (COMPILER_NAME == ''):
        print "! Can not find a C compiler       !"

# -----------------
#  check for mpi
# -----------------

    mpi_compiler_list = ['mpicc', 'mpiCC', 'mpcc_r', 'hcc', 'mpcc']
    MPI_COMPILER_NAME = ''

    for x in mpi_compiler_list:
        if (CHECK_FOR(x) == 'YES'):
            print "MPI Compiler .............. " + x
            MPI_COMPILER_NAME = x
            break

    if (MPI_COMPILER_NAME == ''):
        print "MPI Compiler............... NOT FOUND"

    if (get_arch):
        print "\n"
        print "Proposed makefile names: \n"
        print "> " + PLATFORM[0] + "." + PLATFORM[
            4] + "." + COMPILER_NAME + ".defs"
        print "> " + PLATFORM[0] + "." + PLATFORM[
            4] + "." + MPI_COMPILER_NAME + ".defs"
        return

# ---------------------------------------------------
#  Build log list, that will be compared to the
#  sysconf.out file.
# ---------------------------------------------------

    log.append("USER           = "******"WORKING_DIR    = " + work_dir + "\n")
    log.append("SYSTEM_NAME    = " + PLATFORM[0] + "\n")
    log.append("NODE_NAME      = " + PLATFORM[1] + "\n")
    log.append("RELEASE        = " + PLATFORM[2] + "\n")
    log.append("ARCH           = " + PLATFORM[4] + "\n")
    log.append("BYTE_ORDER     = " + sys.byteorder + "\n")
    log.append("VERSION        = " + PLATFORM[3] + "\n")
    log.append("PLUTO_DIR      = " + pluto_dir + '\n')
    log.append("PLUTO_VERSION  = " + vers + '\n')
    log.append("C_COMPILER     = " + COMPILER_NAME + '\n')
    log.append("MPI_C_COMPILER = " + MPI_COMPILER_NAME + '\n')

    #  ----------------------------
    #    check for online updates
    #  ----------------------------

    print "\n> Checking for updates (canceled)...\n"
    # try:
    #   urllib.urlretrieve("http://plutocode.ph.unito.it/updates.txt","updates.txt")
    #   scrh = file.word_find ("updates.txt","release")
    #   ipos = scrh[0]
    #   scrh = file.read_lines ("updates.txt", ipos, ipos + 1)
    #   rels = string.split(scrh[0])
    #   if (rels[1] != vers):
    #     print "   ******************************************************* "
    #     print "    A new version of PLUTO ("+rels[1]+") is available at"
    #     print "    http://plutocode.oato.inaf.it"
    #     print "   *******************************************************\n"
    #     scrh = raw_input("> Press enter to continue.")
    #     os.chdir(work_dir)
    # except:
    #   print "! Connection not available\n"

    # ------------------------------------------------
    #  Compare the list 'log' with the file log_file;
    #
    #   - if they match, no update is necessary,
    #               ==> return to main menu
    #
    #   - if they do not match or if log_file does not
    #     exists, create a new one
    #
    # ------------------------------------------------

    if (os.path.exists(log_file)):
        scrh = file.read_lines(log_file, 0, 128)
        if (scrh[0:] == log[0:]):
            print "\n>> ok"
            os.chdir(work_dir)
            return
        else:
            print "\n> System configuration file is not up to date. Updating..."
    else:
        print "\n> System configuration file not found, creating one..."

    file.create_file(log_file, log)

    # ------------
    #  Make Tools
    # ------------

    # print (" > Making binary tools in "+bintools_dir+"...")
    # os.chdir(bintools_dir)
    # os.system('make -s clean')
    # os.system('make -s dbl2flt')
    # os.system('make -s bin2ascii')
    # if (HAVE_LIBPNG == 'YES'):
    #   os.system('make -s bin2png')

    # ---------------------------
    #   Add important info here
    # ---------------------------

    # scrh = raw_input(" > Press enter to continue.")
    os.chdir(work_dir)
    return
Exemplo n.º 5
0
def makefile(work_dir, pluto_path, pluto_dir, additional_files, 
             additional_flags, makefile_template, AUTO_UPDATE):

 mkfl_name  = work_dir+'/makefile'
 mkfl_exist = os.path.exists(mkfl_name)

# is Chombo required ?

 WITH_CHOMBO = 0
 for x in sys.argv: 
   if (x == "--with-chombo" or x == "--with-chombo:"):      
     WITH_CHOMBO = 1
   
# try to get "ARCH" from makefile

 if (mkfl_exist): 
   scrh = file.string_list(mkfl_name,'ARCH')
     
# Create a new makefile under the following conditions:

 if (AUTO_UPDATE == 0) or (not mkfl_exist) or (len(scrh) == 0):

 # define architecture

   entries = os.listdir(pluto_dir + '/Config')

   entries.sort()
   menu.SetTitle("Change makefile")
   arch        = menu.Browse(entries)  # call menu to select config. file
   arch_string = 'ARCH         = '+ arch + '\n'
 else:                           # try to update makefile automatically
   arch_string = scrh[0]
   arch        = (string.split(arch_string))[2]

# Starting print here

 row = 1
 menu.Print ("> Generating makefile... ["+arch+"]", row=row,sleep=1)
 
# if CHOMBO is required, change dir to Lib/Chombo/lib, make vars to generate 
# a list of all the variables needed by CHOMBO makefile and copy the list to 
# make.vars in local working directory.
# This file will be used later by PLUTO makefile.

 if (WITH_CHOMBO):      

 # get the number of DIMENSIONS from definitions.h
   
   scrh = file.string_list (work_dir+"/definitions.h", "DIMENSIONS")
   scrh = string.split(scrh[0])

 # build chombo configuration string

   chombo_config_string = 'DIM='+scrh[2]
   for x in sys.argv: 
     if (x == '--with-chombo:'):
       i = sys.argv.index(x) + 1
       for y in sys.argv[i:]: chombo_config_string += ' '+y
     
   row = row + 1
   menu.Print("  - Chombo config string: "+chombo_config_string,row=row) 
   row = row+1
   menu.Print("  - creating make.vars...",row=row,sleep=0) 
   os.chdir(pluto_dir+"/Lib/Chombo-3.1/lib")
   os.system("make "+chombo_config_string+" vars > make.vars\n")
   os.system("cp make.vars "+work_dir+"\n")
   os.chdir(work_dir)

# copy template
 
 shutil.copy(pluto_dir + makefile_template[0], mkfl_name)

# write main PLUTO dir

 scrh = file.word_find(mkfl_name,'PLUTO_DIR')
 ipos = scrh[0]
 file.replace_line (mkfl_name, 'PLUTO_DIR    = '+pluto_dir+'\n', ipos)

#  write architecture 

 scrh = file.word_find(mkfl_name,'ARCH')
 ipos = scrh[0]
 file.replace_line (mkfl_name, arch_string, ipos)

#  Write additional objects to makefile

 scrh = file.word_find(mkfl_name,'Additional_object_files_here')
 ipos = scrh[0] + 3

 for x in additional_files:
   file.insert(mkfl_name, 'OBJ += '+x + '\n', ipos)
   ipos = ipos + 1

# add included makefile; useful for header dependences

 for x in pluto_path:
   file.insert(mkfl_name, 'include $(SRC)/' + x + 'makefile' + '\n',ipos)
   ipos = ipos + 1

#  Write additional flags for C compiler

 for x in additional_flags:
   file.insert(mkfl_name, 'CFLAGS += '+x+'\n', ipos)
   ipos = ipos + 1

# Check for libpng

# if (WITH_CHOMBO == 0):
#   if (os.path.exists("sysconf.out")):
#     scrh = file.string_find ("sysconf.out", "LIBPNG")
#     line = file.read_lines("sysconf.out", scrh[0], scrh[0]+1)
#     line_list = string.split(line[0])
#     if (line_list[2] == 'YES'):
#       file.insert(this_makefile, 'LDFLAGS += -lpng\n', ipos)
#       ipos = ipos + 1
#       file.insert(this_makefile, 'CFLAGS += -DHAVE_LIBPNG\n', ipos)
  
 return
Exemplo n.º 6
0
def problem(work_dir, pluto_path, pluto_dir, additional_files, 
            additional_flags, makefile_template, AUTO_UPDATE):

#  before proceeding we scan pre-existing definitions.h 
#  for obsolete statements in order to and make  proper replacements.

  replace_obsoletes(work_dir)
 
#  sys.exit(1)

  HD     = 1
  RHD    = 2
  MHD    = 3
  SRMHD  = 4
  RMHD   = 5
  
  WITH_CHOMBO = 0  # enable/disable Chombo AMR
  FULL        = 0
  WITH_FD     = 0  # enable/disable finite difference schemes 
  WITH_SB     = 0  # enable/disable shearing box module
  WITH_FARGO  = 0  # enable/disable FARGO module for orbital advection

# *****************************************
#      check command line arguments   
# *****************************************

  for x in sys.argv:
    if (x == "--with-chombo" or x == "--with-chombo:"):
      WITH_CHOMBO = 1
    if (x == "--full"):
      FULL = 1
    if (x == "--with-fd"):
      WITH_FD = 1
    if (x == "--with-sb"):
      WITH_SB = 1
    if (x == "--with-fargo"):
      WITH_FARGO = 1
        
# -- default makefile template -- 

  if (WITH_CHOMBO):
    makefile_template.append('/Src/Templates/makefile.chombo')
  else:
    makefile_template.append('/Src/Templates/makefile')
  
# Create user-editable menu

  entries = []
  options = []
  default = []
  scrh    = []

  entries.append('PHYSICS')
  if (WITH_FD or WITH_FARGO):
    options.append(['HD','MHD'])
    default.append('HD')
  elif (WITH_SB):
    options.append(['MHD'])
    default.append('MHD')
  else:
    options.append(['HD','RHD','MHD','RMHD'])
    default.append('HD')

  entries.append('DIMENSIONS')
  if(WITH_SB or WITH_FARGO):
    options.append(['2','3'])
    default.append('2')
  else:
    options.append(['1','2','3'])
    default.append('1')


  entries.append('COMPONENTS')
  if (WITH_SB):
    options.append(['2','3'])
    default.append('2')
  else:
    options.append(['1','2','3'])
    default.append('1')

  entries.append('GEOMETRY')
  if (WITH_CHOMBO):
#    options.append(['CARTESIAN','CYLINDRICAL','AXISYM'])
    options.append(['CARTESIAN','CYLINDRICAL'])
    default.append('CARTESIAN')
  elif (WITH_FD or WITH_SB):
    options.append(['CARTESIAN'])
    default.append('CARTESIAN')
  else:
#    options.append(['CARTESIAN','CYLINDRICAL','AXISYM','POLAR','SPHERICAL'])
    options.append(['CARTESIAN','CYLINDRICAL','POLAR','SPHERICAL'])
    default.append('CARTESIAN')

#  entries.append('UNIFORM_GRID')
#  if (WITH_CHOMBO):
#    options.append('YES')
#    default.append('YES')
#  else:
#    options.append(['YES','NO'])
#    default.append('YES')

    
  entries.append('BODY_FORCE')
  if (WITH_SB): 
    options.append(['VECTOR', 'POTENTIAL', '(VECTOR+POTENTIAL)'])
    default.append('VECTOR')
  else:
    options.append(['NO','VECTOR', 'POTENTIAL', '(VECTOR+POTENTIAL)'])
    default.append('NO')

  entries.append('COOLING')
  options.append(['NO','POWER_LAW','TABULATED','SNEq','MINEq']) # ,'H2_COOL'])
  default.append('NO')

#  entries.append('INCLUDE_PARTICLES')
#  options.append(['NO','YES'])
#  default.append('NO')

# set interpolation options

  entries.append('INTERPOLATION')
  if (WITH_CHOMBO):
    options.append(['FLAT','LINEAR','WENO3','PARABOLIC'])
    default.append('LINEAR')
  elif (FULL):
    options.append(['FLAT','LINEAR','LimO3',
                    'WENO3','PARABOLIC', 'MP5'])
    default.append('LINEAR')
  elif (WITH_FD):
    options.append(['WENO3_FD', 'WENOZ_FD', 
                    'MP5_FD','LIMO3_FD'])
    default.append('WENOZ_FD')
  else: 
    options.append(['FLAT','LINEAR','LimO3','WENO3','PARABOLIC'])  # Default
    default.append('LINEAR')


  entries.append('TIME_STEPPING')
  if (WITH_CHOMBO):
#    options.append(['HANCOCK','CHARACTERISTIC_TRACING','RK_MIDPOINT','EULER','RK2'])
    options.append(['EULER','HANCOCK','CHARACTERISTIC_TRACING','RK2'])
    default.append('HANCOCK')
  elif (WITH_FD):
    options.append(['RK3'])
    default.append('RK3')
  else:    
#    options.append(['EULER','RK_MIDPOINT','RK2','RK3','HANCOCK','CHARACTERISTIC_TRACING'])
    options.append(['EULER','RK2','RK3','HANCOCK','CHARACTERISTIC_TRACING'])
    default.append('RK2')

  entries.append('DIMENSIONAL_SPLITTING')
  if (WITH_CHOMBO or WITH_FARGO):
    options.append(['NO'])
    default.append('NO')
  else:  
    options.append(['YES','NO'])
    default.append('YES')

  entries.append('NTRACER')
  for n in range(5): scrh.append(repr(n))
  options.append(scrh)
  default.append('0')

  scrh =[]
  entries.append('USER_DEF_PARAMETERS')
  for n in range(32): scrh.append(repr(n+1))
  options.append(scrh)
  default.append('1')

# **************************************************
#   If  definitions.h already exists try to read 
#   default values from it. 
# **************************************************

  if (os.path.exists(work_dir+'/definitions.h')):
    for x in entries:
      try:
        scrh = file.string_list(work_dir+'/definitions.h',x)
        tmp  = string.split(scrh[0])
        i  = entries.index(tmp[1])
        y  = options[i]
        i2 = y.index(tmp[2]) 
        default[entries.index(x)] = tmp[2]
  
      except ValueError:
        continue

      except IndexError:
        continue

#  ****  ok, call menu  ****

  if AUTO_UPDATE == 0:
    selection = '' 
    menu.SetTitle("Setup problem")
    selection = menu.Browse(entries,default,options)
#    selection = menu.select(entries,options,default,'Setup problem')

# **************************************************
#       define Physics module sub-menus
# **************************************************

  i              = entries.index('DIMENSIONS')
  dimensions     = int(default[i])
  i              = entries.index('PHYSICS')
  physics_module = default[i]
  i              = entries.index('GEOMETRY')
  geometry       = default[i]
  i              = entries.index('INTERPOLATION')
  interpolation  = default[i]
  i              = entries.index('TIME_STEPPING')
  time_stepping  = default[i]
  i              = entries.index('DIMENSIONAL_SPLITTING')
  dim_splitting  = default[i]

# HD

  if physics_module == 'HD':
    entries_HD = []
    options_HD = []
    default_HD = []

    entries_HD.append('EOS')
    options_HD.append(['IDEAL','ISOTHERMAL'])
    default_HD.append('IDEAL')

    entries_HD.append('ENTROPY_SWITCH')
    options_HD.append(['NO','YES'])
    default_HD.append('NO')

    entries_HD.append('THERMAL_CONDUCTION')
    if (WITH_CHOMBO == 1):
      options_HD.append(['NO','EXPLICIT'])
    else:
#      options_HD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING','RK_CHEBYSHEV'])
      options_HD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING'])
      
    default_HD.append('NO')

    entries_HD.append('VISCOSITY')
    if (WITH_CHOMBO == 1):
      options_HD.append(['NO','EXPLICIT'])
    else:
#      options_HD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING','RK_CHEBYSHEV'])
      options_HD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING'])
      
    default_HD.append('NO')

    entries_HD.append('ROTATING_FRAME')
    options_HD.append(['NO','YES'])
    default_HD.append('NO')


#    if (physics_module == "HD" and dim_splitting == "YES"):
#      if (geometry == "POLAR" or geometry == "SPHERICAL"):
#        entries_HD.append('FARGO_SCHEME')
#        options_HD.append(['NO','YES'])
#        default_HD.append('NO')

#  Read HD pre-existing HD submenu defaults, if they exists

    if (os.path.exists(work_dir+'/definitions.h')):
      for x in entries_HD:
        try:
          scrh = file.string_list(work_dir+'/definitions.h',x)
          tmp  = string.split(scrh[0])
          default_HD[entries_HD.index(x)] = tmp[2]
        except IndexError:
          continue


    if AUTO_UPDATE == 0:
      selection = ''
      menu.SetTitle("HD Menu")
      selection = menu.Browse(entries_HD, default_HD, options_HD)
#      selection = menu.select(entries_HD,options_HD,default_HD,'HD MENU')

# RHD

  if physics_module == 'RHD':
    entries_RHD = []
    options_RHD = []
    default_RHD = []

    entries_RHD.append('EOS')
    options_RHD.append(['IDEAL','TAUB'])
    default_RHD.append('IDEAL')

    entries_RHD.append('USE_FOUR_VELOCITY')
    options_RHD.append(['NO','YES'])
    default_RHD.append('NO')

    entries_RHD.append('ENTROPY_SWITCH')
    options_RHD.append(['NO','YES'])
    default_RHD.append('NO')

#  Read RHD pre-existing RHD submenu defaults, if they exists

    if (os.path.exists(work_dir+'/definitions.h')):
      for x in entries_RHD:
        try:
          scrh = file.string_list(work_dir+'/definitions.h',x)
          tmp  = string.split(scrh[0])
          default_RHD[entries_RHD.index(x)] = tmp[2]
        except IndexError:
          continue


    if AUTO_UPDATE == 0:
      selection = ''
      menu.SetTitle("RHD Menu")
      selection = menu.Browse(entries_RHD, default_RHD, options_RHD)
#      selection = menu.select(entries_RHD,options_RHD,default_RHD,'RHD MENU')

# MHD

  if (physics_module == 'MHD'):
    entries_MHD = []
    options_MHD = []
    default_MHD = []

    entries_MHD.append('EOS')
    options_MHD.append(['IDEAL','BAROTROPIC','ISOTHERMAL'])
    default_MHD.append('IDEAL')

    entries_MHD.append('ENTROPY_SWITCH')
    options_MHD.append(['NO','YES'])
    default_MHD.append('NO')

    entries_MHD.append('MHD_FORMULATION')
    if (WITH_CHOMBO or WITH_FD):
      options_MHD.append(['NONE','EIGHT_WAVES','DIV_CLEANING'])
      default_MHD.append('EIGHT_WAVES')
    elif (WITH_SB or WITH_FARGO):
      options_MHD.append(['CONSTRAINED_TRANSPORT'])
      default_MHD.append('CONSTRAINED_TRANSPORT')
    else:
      options_MHD.append(['NONE','EIGHT_WAVES','DIV_CLEANING', 'CONSTRAINED_TRANSPORT'])
      default_MHD.append('EIGHT_WAVES')


    entries_MHD.append('BACKGROUND_FIELD')
    options_MHD.append(['NO','YES'])
    default_MHD.append('NO')

    entries_MHD.append('RESISTIVE_MHD')
    if (WITH_CHOMBO == 1):
      options_MHD.append(['NO','EXPLICIT'])
    else:
#      options_MHD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING','RK_CHEBYSHEV'])
      options_MHD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING'])

    default_MHD.append('NO')
    
    entries_MHD.append('HALL_MHD')
    options_MHD.append(['NO','RIEMANN','SOURCE'])
    default_MHD.append('NO')
    
    entries_MHD.append('AMBIPOLAR_DIFFUSION')
    options_MHD.append(['NO','EXPLICIT'])
    default_MHD.append('NO')

    entries_MHD.append('THERMAL_CONDUCTION')
    if (WITH_CHOMBO == 1):
      options_MHD.append(['NO','EXPLICIT'])
    else:
#      options_MHD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING','RK_CHEBYSHEV'])
      options_MHD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING'])

    default_MHD.append('NO')

    entries_MHD.append('VISCOSITY')
    if (WITH_CHOMBO == 1):
      options_MHD.append(['NO','EXPLICIT']) 
    else:   
#      options_MHD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING','RK_CHEBYSHEV'])
      options_MHD.append(['NO','EXPLICIT','SUPER_TIME_STEPPING'])
    
    default_MHD.append('NO')

    entries_MHD.append('ROTATING_FRAME')
    options_MHD.append(['NO','YES'])
    default_MHD.append('NO')

#  Read MHD pre-existing MHD submenu defaults, if they exists
 
    if (os.path.exists(work_dir+'/definitions.h')):
      for x in entries_MHD:
        ix = entries_MHD.index(x)
        try:
          scrh = file.string_list(work_dir+'/definitions.h',x)
          tmp  = string.split(scrh[0])
          try:   # if the choice is not in the permitted list of options,
                 # ValueError is raised and the default choice is kept.
            i = options_MHD[ix].index(tmp[2])
            default_MHD[ix] = tmp[2]
          except ValueError:
            continue
        except IndexError:
          continue

    if AUTO_UPDATE == 0:
      selection = ''
      if (physics_module == 'MHD'):
        menu.SetTitle("MHD Menu")
        selection = menu.Browse(entries_MHD, default_MHD, options_MHD)
#        selection = menu.select(entries_MHD,options_MHD,default_MHD,'MHD MENU')


# RMHD

  if physics_module == 'RMHD':
    entries_RMHD = []
    options_RMHD = []
    default_RMHD = []

    entries_RMHD.append('EOS')
    options_RMHD.append(['IDEAL','TAUB'])
    default_RMHD.append('IDEAL')

    entries_RMHD.append('ENTROPY_SWITCH')
    options_RMHD.append(['NO','YES'])
    default_RMHD.append('NO')

    entries_RMHD.append('MHD_FORMULATION')
    if (WITH_CHOMBO == 1):
      options_RMHD.append(['NONE','EIGHT_WAVES','DIV_CLEANING'])
    else:
      options_RMHD.append(['NONE','EIGHT_WAVES','DIV_CLEANING','CONSTRAINED_TRANSPORT'])
 
    default_RMHD.append('NONE')

#  Read RMHD pre-existing RMHD submenu defaults, if they exists

    if (os.path.exists(work_dir+'/definitions.h')):
      for x in entries_RMHD:
        ix = entries_RMHD.index(x)
        try:
          scrh = file.string_list(work_dir+'/definitions.h',x)
          tmp  = string.split(scrh[0])
          try:   # if the choice is not in the permitted list of options,
                 # ValueError is raised and the default choice is kept.
            i = options_RMHD[ix].index(tmp[2])
            default_RMHD[ix] = tmp[2]
          except ValueError:
            continue
        except IndexError:
          continue

    if AUTO_UPDATE == 0:
      selection = ''
      if (physics_module == 'RMHD'):
        menu.SetTitle("RMHD Menu")
        selection = menu.Browse(entries_RMHD, default_RMHD, options_RMHD)
#        selection = menu.select(entries_RMHD,options_RMHD,default_RMHD,'RMHD MENU')

# ********************************************************************
#    USER_DEF PARAMETERS:
#
#      Read them from definitions.h if the file exists; 
#      assign  'SCRH' otherwise.
# ********************************************************************

  i    = entries.index('USER_DEF_PARAMETERS')
  npar = int(default[i])
  u_def_par = []
  if (os.path.exists(work_dir+'/definitions.h')):
    scrh = file.word_find(work_dir+'/definitions.h','parameters')
    k0   = scrh[0] + 2
    scrh = file.read_lines(work_dir+'/definitions.h', k0, k0 + npar)
    for n in range(npar):
      try:
        x = string.split(scrh[n])
        if (x[0] == "#define"):
          u_def_par.append(x[1])
        else:          
          u_def_par.append('SCRH')
      except IndexError:
        u_def_par.append('SCRH')
#        scrh[n + 1] = '#define SCRH  x'


  else:
    for n in range(npar):
      u_def_par.append('SCRH')


  if AUTO_UPDATE == 0:
#    u_def_par = ['SCRH']
    menu.SetTitle ("User-defined parameters")
    menu.Insert(int(default[i]),u_def_par)
#    menu.put(int(default[i]),u_def_par,'USER DEF SECTION')

# -----------------------------------------------------
#   Create the list 'tmp' that will be used to write
#   the new definitions.h header file
# -----------------------------------------------------

  tmp = []
  for x in entries:
    i = entries.index(x)
    y = default[i]
    tmp.append('#define  '+x.ljust(21)+'   '+y+'\n')

  tmp.append('\n/* -- physics dependent declarations -- */\n\n');

  if (physics_module == 'MHD'):
    for x in entries_MHD:
      i = entries_MHD.index(x)
      tmp.append('#define  '+x.ljust(21)+'   '+default_MHD[i]+'\n')

  if physics_module == 'HD':
    for x in entries_HD:
      i = entries_HD.index(x)
      tmp.append('#define    '+x.ljust(21)+'   '+default_HD[i]+'\n')

  if physics_module == 'RHD':
    for x in entries_RHD:
      i = entries_RHD.index(x)
      tmp.append('#define    '+x.ljust(21)+'   '+default_RHD[i]+'\n')

  if physics_module == 'RMHD':
    for x in entries_RMHD:
      i = entries_RMHD.index(x)
      tmp.append('#define    '+x.ljust(21)+'   '+default_RMHD[i]+'\n')

# *****************************************
#     add Chombo-AMR specific flags 
# *****************************************

  if (WITH_CHOMBO and os.path.exists(work_dir+'/definitions.h')):
    scrh = file.string_list(work_dir+'/definitions.h','AMR_EN_SWITCH')
    tmp.append('\n/* -- Chombo-AMR flags -- */\n\n');
    if (len(scrh) != 0): 
      strsplit = string.split(scrh[0])
      value    = strsplit[2]
      tmp.append('#define  AMR_EN_SWITCH   '+value+'\n')
    else:
      tmp.append('#define  AMR_EN_SWITCH   NO\n')

# *******************************************************
#     add pointer names to user defined parameters
# *******************************************************

  tmp.append('\n/* -- pointers to user-def parameters -- */\n\n');

  for x in u_def_par:
    i = u_def_par.index(x)
    tmp.append('#define  '+x.ljust(16)+'   '+repr(i)+'\n')

  # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  #   In this section, also, udpate the pluto.ini 
  #   initialization file by appending the correct 
  #   sequence of user defined parameters
  # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#  menu.RestoreScreen()
  plutoini = work_dir+"/pluto.ini"
  scrh = file.string_find (plutoini, 'Parameters')
  ipos = scrh[0] + 2  # start reading/writing pluto.ini at this point  
                      # to build a list of the userdef parameters
  scrh = file.read_lines(plutoini,ipos,999) # read until end of file
    
  pname  = []
  pvalue = []

  for x in scrh:
    y = string.split(x)  # pname and pvalue contain the list of parameter
    if (len(y) == 0): continue  # skip blank lines 
    pname.append (y[0])  # names and their respective values as present
    pvalue.append(y[1])  # in pluto.ini

  for x in u_def_par:    # loop on the actual list of parameters;
    par_exist = 0        # is the parameter already present in pluto.ini ?
    for y in pname:
      if (x == y):       # if yes, use the original value instead of '0'
        par_exist = 1
        i = pname.index(y)
        file.insert (plutoini, pname[i] + "    " + pvalue[i] + "\n", ipos)
        break

    if (par_exist == 0):  # if not, set default value to 0
      file.insert (plutoini, x+'    0\n',ipos)

    ipos = ipos + 1

  # delete all other lines in pluto.ini

  file.delete_lines(plutoini, ipos, ipos + 256) 

# ***************************************************************
#    check dependencies for conditional inclusion
#    of additional object files; this is useful 
#    for makefile creation
# ***************************************************************

# additional files will be compiled 
# depending on the user's choice of
# time integration scheme
 
# the next line removes all elements from additional_files
# and pluto_path so the list can be built from scratch

#  for x in additional_files: additional_files.remove(x)
#  for x in pluto_path      : pluto_path.remove(x)

  additional_files[:] = []
  additional_flags[:] = []
  pluto_path[:] = []

  divb = ' '

  # **********************************************
  #   physics module & parabolic term treatment
  # **********************************************

  sts_flag = 0 # if changed to 1, include the super-time-stepping driver
  rkc_flag = 0 # if changed to 1, include the runge-kutta-Chebyshev driver
  exp_flag = 0 # if changed to 1, include explicit parabolic time-stepping
  cur_flag = 0 # if changed to 1, include current calculation

  if (physics_module == 'HD'):
    pluto_path.append('HD/')
    entries_MOD = entries_HD
    default_MOD = default_HD

    n = entries_MOD.index('THERMAL_CONDUCTION')
    if (default_MOD[n] != 'NO'):
      pluto_path.append('Thermal_Conduction/')
      if   (default_MOD[n] == 'SUPER_TIME_STEPPING'): sts_flag = 1
      elif (default_MOD[n] == 'RK_CHEBYSHEV'):        rkc_flag = 1
      elif (default_MOD[n] == 'EXPLICIT'):            exp_flag = 1

    n = entries_MOD.index('VISCOSITY')
    if (default_MOD[n] != 'NO'):
      pluto_path.append('Viscosity/')
      if   (default_MOD[n] == 'SUPER_TIME_STEPPING'): sts_flag = 1
      elif (default_MOD[n] == 'RK_CHEBYSHEV'):        rkc_flag = 1
      elif (default_MOD[n] == 'EXPLICIT'):            exp_flag = 1
      
  elif (physics_module == 'RHD'):
    pluto_path.append('RHD/')
    entries_MOD = entries_RHD
    default_MOD = default_RHD

  elif (physics_module == 'MHD'):
    pluto_path.append('MHD/')
    entries_MOD = entries_MHD
    default_MOD = default_MHD
    n    = entries_MOD.index('MHD_FORMULATION')
    divb = default_MOD[n]
    if (divb == 'CONSTRAINED_TRANSPORT'):
      pluto_path.append('MHD/CT/')
    elif (divb == 'DIV_CLEANING'):
      pluto_path.append('MHD/GLM/')

    n = entries_MOD.index('RESISTIVE_MHD')
    if (default_MOD[n] != 'NO'):
      pluto_path.append('MHD/Resistive/')
      cur_flag = 1
      if   (default_MOD[n] == 'SUPER_TIME_STEPPING'): sts_flag = 1
      elif (default_MOD[n] == 'RK_CHEBYSHEV'):        rkc_flag = 1
      elif (default_MOD[n] == 'EXPLICIT'):            exp_flag = 1
      
    n = entries_MOD.index('HALL_MHD')
    if (default_MOD[n] != 'NO'):
      pluto_path.append('MHD/Hall/')
      if   (default_MOD[n] == 'RIEMANN'):			  cur_flag = 1
      
    n = entries_MOD.index('AMBIPOLAR_DIFFUSION')
    if (default_MOD[n] != 'NO'):
      pluto_path.append('MHD/Ambipolar/')
      cur_flag = 1

    n = entries_MOD.index('THERMAL_CONDUCTION')
    if (default_MOD[n] != 'NO'):
      pluto_path.append('Thermal_Conduction/')
      if   (default_MOD[n] == 'SUPER_TIME_STEPPING'): sts_flag = 1
      elif (default_MOD[n] == 'RK_CHEBYSHEV'):        rkc_flag = 1
      elif (default_MOD[n] == 'EXPLICIT'):            exp_flag = 1
      
    n = entries_MOD.index('VISCOSITY')
    if (default_MOD[n] != 'NO'):
      pluto_path.append('Viscosity/')
      if   (default_MOD[n] == 'SUPER_TIME_STEPPING'): sts_flag = 1
      elif (default_MOD[n] == 'RK_CHEBYSHEV'):        rkc_flag = 1
      elif (default_MOD[n] == 'EXPLICIT'):            exp_flag = 1
  
    if ( cur_flag == 1):
      pluto_path.append('MHD/Current/')
      additional_flags.append(' -DNEED_CURRENT')
    # ***************************
    #  need shearingbox module ?
    # ***************************

    if (WITH_SB == 1):
      pluto_path.append('MHD/ShearingBox/')
      additional_flags.append(' -DSHEARINGBOX')
       
  
  elif (physics_module == 'RMHD'):
    pluto_path.append('RMHD/')
    entries_MOD = entries_RMHD
    default_MOD = default_RMHD
    n    = entries_MOD.index('MHD_FORMULATION')
    divb = default_MOD[n]
    if (divb == 'CONSTRAINED_TRANSPORT'):
      pluto_path.append('MHD/CT/')
    elif (divb == 'DIV_CLEANING'):
      pluto_path.append('MHD/GLM/')

  # *****************************
  #       Interpolation   
  # *****************************

  if (interpolation == 'FLAT'):
    additional_files.append('states_flat.o')
  elif   (interpolation == 'LINEAR'):
    additional_files.append('states_plm.o')
  elif (interpolation == 'PARABOLIC'):
    additional_files.append('states_ppm.o')
  elif (interpolation == 'LimO3'):
    additional_files.append('states_limo3.o')
  elif (interpolation == 'WENO3'):
    additional_files.append('states_weno3.o')

  elif (WITH_FD):    # Finite Difference

    additional_files.append('states_fd.o')
    additional_files.append('fd_reconstruct.o')
    additional_files.append('fd_flux.o')
    additional_flags.append(' -DFINITE_DIFFERENCE')
    

  # *****************************
  #       Time Stepping
  # *****************************

  if (WITH_CHOMBO):     # ** AMR file inclusion ** 

    if (dimensions == 1): additional_files.append('PatchCTU.1D.o')
    else:                 
      if (time_stepping == 'RK_MIDPOINT'): 
        additional_files.append('PatchRK.3D.o')
      elif (time_stepping == 'EULER'):
        additional_files.append('PatchEuler.3D.o')
      elif (time_stepping == 'RK2'):
        additional_files.append('PatchEuler.3D.o')
      else:
        additional_files.append('PatchCTU.3D.o')

  else:
    if (time_stepping == 'CHARACTERISTIC_TRACING'):
       if (dim_splitting == 'YES'): additional_files.append('sweep.o')
       else:                        additional_files.append('unsplit_ctu.o')
    elif (time_stepping == 'HANCOCK'):
       if (dim_splitting == 'YES'): additional_files.append('sweep.o')
       else:                        additional_files.append('unsplit_ctu.o')
    elif (time_stepping == 'RK_MIDPOINT'):
       additional_files.append('rk_midpoint.o')
    else:
       if (dim_splitting == 'YES'): additional_files.append('sweep.o')
       else:                        additional_files.append('unsplit.o')


  if (time_stepping == 'CHARACTERISTIC_TRACING'):
    additional_files.append('char_tracing.o')
  elif (time_stepping == 'HANCOCK'):
    additional_files.append('hancock.o')


#  if (interpolation != 'LINEAR'):
#    if (time_stepping == 'CHARACTERISTIC_TRACING'):
#      additional_files.append('states_ppm_char.o')
#    else:
#      additional_files.append('rk_states.o')


  # *****************************
  #      FARGO Scheme 
  # *****************************
 
  if (WITH_FARGO):  
    pluto_path.append('Fargo/')
    additional_flags.append(' -DFARGO')

  # *****************************
  #      Geometry 
  # *****************************

 #  additional_files.append('rhs.o')
 #   additional_files.append('rhs.o')

#  if (geometry == "CARTESIAN"):
#    additional_files.append('rhs_cart.o')
#  if (geometry == "AXISYM"):
#    additional_files.append('cylsource.o')

  # *****************************
  #         Cooling 
  # *****************************

  n = entries.index('COOLING')
    
  if (default[n] == 'POWER_LAW'):
    pluto_path.append('Cooling/Power_Law/')
  elif (default[n] == 'TABULATED'):
    pluto_path.append('Cooling/Tab/')
    additional_files.append('cooling_source.o')
    additional_files.append('cooling_ode_solver.o')
  elif (default[n] == 'SNEq'):
    pluto_path.append('Cooling/SNEq/')
    additional_files.append('cooling_source.o')
    additional_files.append('cooling_ode_solver.o')
  elif (default[n] == 'MINEq'):
    pluto_path.append('Cooling/MINEq/')
    additional_files.append('cooling_source.o')
    additional_files.append('cooling_ode_solver.o')
  elif (default[n] == 'H2_COOL'):
    pluto_path.append('Cooling/H2_COOL/')
    additional_files.append('cooling_source.o')
    additional_files.append('cooling_ode_solver.o')
    

  # **********************************
  #   parabolic flux: file inclusion
  # **********************************

  if (sts_flag == 1): 
    additional_files.append('sts.o')
    additional_files.append('parabolic_rhs.o')

  if (rkc_flag == 1): 
    additional_files.append('rkc.o')
    additional_files.append('parabolic_rhs.o')

  if (exp_flag == 1): 
    additional_files.append('parabolic_flux.o')

  # **********************************************
  #          Vector potential
  # **********************************************

  if (physics_module == 'MHD' or physics_module == 'RMHD'):
    additional_files.append('vec_pot_diff.o')
    if (WITH_CHOMBO == 0): additional_files.append('vec_pot_update.o')
  
  # *****************************
  #          Particles
  # *****************************

#  n = entries.index('INCLUDE_PARTICLES')
#  if (default[n] == 'YES'):
#    pluto_path.append('Particles/')

# ****************************************************************
#       DEFINE ALL NON-USER FRIENDLY CONSTANTS
# ****************************************************************

  tmp.append('\n/* -- supplementary constants (user editable) -- */ \n\n')

  no_us_fr = []

  no_us_fr.append('#define  INITIAL_SMOOTHING     NO\n')
  no_us_fr.append('#define  WARNING_MESSAGES      NO\n')
  no_us_fr.append('#define  PRINT_TO_FILE         NO\n')
  no_us_fr.append('#define  INTERNAL_BOUNDARY     NO\n')
  no_us_fr.append('#define  SHOCK_FLATTENING      NO\n')
  if (not WITH_FD): 
    no_us_fr.append('#define  ARTIFICIAL_VISCOSITY  NO\n')
    no_us_fr.append('#define  CHAR_LIMITING         NO\n')
    no_us_fr.append('#define  LIMITER               DEFAULT\n')

# add geometry-dependent switches

  if (geometry == "AXISYM"):
    no_us_fr.append('#define  ADD_CYLSOURCE            1\n')

#  if (geometry == "POLAR" and physics_module == "HD"):
#    no_us_fr.append('#define  FARGO_SCHEME          NO\n')

# add flux ct switches for MHD or RMHD
  
  if (divb == "CONSTRAINED_TRANSPORT"):
    no_us_fr.append('#define  CT_EMF_AVERAGE           UCT_HLL\n')
    no_us_fr.append('#define  CT_EN_CORRECTION         NO\n')
    no_us_fr.append('#define  ASSIGN_VECTOR_POTENTIAL  YES\n')  
  elif (physics_module == "MHD" or physics_module == "RMHD"):
    no_us_fr.append('#define  ASSIGN_VECTOR_POTENTIAL  NO\n')  
    
     
  if (physics_module == "MHD" or physics_module == "RMHD"):
    if (not WITH_CHOMBO): 
      no_us_fr.append('#define  UPDATE_VECTOR_POTENTIAL  NO\n')  

  if (time_stepping == 'HANCOCK'):
    if (physics_module == 'RMHD'):
      no_us_fr.append('#define  PRIMITIVE_HANCOCK     NO\n')
    else:
      no_us_fr.append('#define  PRIMITIVE_HANCOCK     YES\n')

# add definition of STS_NU

  if (sts_flag == 1):
    no_us_fr.append('#define  STS_nu                0.01\n')
    
# ***************************************************************
#    Read pre-existing non-user-editable defaults;
#    Use the default value if they exist
# ***************************************************************

  if (os.path.exists(work_dir+'/definitions.h')):
    for x in no_us_fr:
      try:
        xl   = string.split(x)
        scrh = file.string_list(work_dir+'/definitions.h',xl[1])
        no_us_fr[no_us_fr.index(x)] = scrh[0]
      except IndexError:
        continue


# add elements of no_us_fr to tmp 

  for x in no_us_fr:
    tmp.append(x)

# -- create definitions.h --
    
  file.create_file(work_dir+'/definitions.h',tmp)

  return