The Flash-X configuration
The configuration toolchain effectively implements the Flash-X software architecture. The encapsulation and inheritance of the code is implemented and enforced by this tool. It relies upon Flash-X’s domain specific configuration language (DSCL) that encodes meta-information about the components in the accompanying Config files. A Config file is unique to a unix directory and has all the meta-information about files in that directory. It can also include information about how to traverse subdirectories of the corresponding component. The Config files are parsed by the setup tool.
Config files come in two syntactic flavors: static text and python. In static mode, configuration keywords are listed as lines in a plain text file. This mode is the most readable and intuitive of the two, but it lacks flexibility. The python mode has been introduced to circumvent this inflexibility by allowing the configuration file author to specify the configuration directives as a function of the setup variables with a python procedure. This allows the content of each directive and the number of directives in total to be amenable to general programming.
The rule the setup script uses for deciding which flavor of
configuration file it’s dealing with is simple. Python configuration
files have as their first line ##python:genLines. If the first line
does not match this string, then static mode is assumed and each line of
the file is interpreted verbatim as a directive.
If python mode is triggered, then the entire file is considered as valid
python source code (as if it were a .py). From this python code, a
function of the form def genLines(setupvars) is located and executed
to generate the configuration directives as an array (or any iterable
collection) of strings. The sole argument to genLines is a dictionary
that maps setup variable names to their corresponding string values.
As an example, here is a configuration file in python mode that registers runtime parameters named indexed_parameter_x where x ranges from 1 to NP and NP is a setup line variable.
##python:genLines
# We define genLines as a generator with the very friendly “yield” syntax. # Alternatively, we could have genLines return an array of strings or even # one huge multiline string. def genLines(setupvars): # emit some directives that dont depend on any setup variables yield “”” REQUIRES Driver REQUIRES physics/Hydro REQUIRES physics/Eos “”” # read a setup variable value from the dictionary np = int(setupvars(“NP”)) # must be converted from a string # loop from 0 to np-1 for x in xrange(np): yield “PARAMETER indexed_parameter_%d REAL 0.” % (x+1)
When setting up a problem with NP=5 on the setup command line, the following directives will be processed:
REQUIRES Driver REQUIRES physics/Hydro REQUIRES physics/Eos PARAMETER indexed_parameter_1 REAL 0. PARAMETER indexed_parameter_2 REAL 0. PARAMETER indexed_parameter_3 REAL 0. PARAMETER indexed_parameter_4 REAL 0. PARAMETER indexed_parameter_5 REAL 0.
Config file Keywords and syntax
The syntax of the configuration directives is described here. Arbitrarily many spaces and/or tabs may be used, but all keywords must be in uppercase. Lines not matching an ad missible pattern will raise an error when running setup. The syntax of DSCL includes two types of keywords. The directive keywords define actions to be taken by the setup tool, while the non directive keywords encode information about the directives. The non directive keywords are associated with specific directives keyworks.
# commentA comment. Can appear as a separate line or at the end of a line.DEFAULTsub-componentAny component can designate one component (which is effectively a subdirectory) to be the “default”, with this keyword. If no specific sub-component is selected by the application, the designated default implementation gets included.EXCLUSIVEcomponent…Specifies a list of components that cannot be included together.CONFLICTSunit1[/sub-unit[/component…]] …Specifies that the current component is not compatible with- the list of components that follow.
setupissues an error if the user attempts a conflicting configuration.
- the list of components that follow.
REQUIRESunit[/sub-unit[/component…]] [ORunit[/sub-unit…]]…Specifies a component that is required. The component can bespecified with partially specified or full specified path. If partial path is specified then full path is generated by following the “DEFAULT” options of the subcomponents.
REQUESTSunit[/sub-unit[/component…]]Is similar to REQUIRES except that it is a soft
dependency. It can be overridden through either a commandline specification or through dependencies specified in higher priority locations in the source tree.
VARIANTSvariantname variantname …|Indicates that multiple alternative
implemetations of a component are to be included in the setup where each implementation gets its interface and routine/function name appended with the corresponding variant name. For example, one may want to use both CPU and GPU to compute. A component that has valid implementations for both can specify variants as shown below.
VARIANTS CPU GPU
Then if the setup options specify inclusion of both implementations, the names of the relevant files and function/subroutine interfaces are modified to have unique names. If, on the other hand, only one of the implementations is to be included, the default is Null and all the names remain unmodified.
SUGGESTcomponent component …UnlikeREQUIRES, this keyword suggests that the current component be used along with one of the specified component. The setup script will print details of the suggestions which have been ignored. This is useful in catching inadvertently omitted code components before the run starts, thus avoiding a waste of computing resources.UNOFFICIALThis keyword suggests that the current component is not fully supported. The setup script will abort if a component with this keyword in included. It can be overridden as follows:
–with-unofficial= component
PARAMETERname type [``CONSTANT``] default [range-spec]Specifies a runtime parameter. Parameter names are unique up to 20 characters and may not contain spaces. Admissible types includeREAL,INTEGER,STRING, andBOOLEAN. Default values forREALandINTEGERparameters must be valid numbers, or the compilation will fail. DefaultSTRINGvalues must be enclosed in double quotes ("). DefaultBOOLEANvalues must be.true.or.false.to avoid compilation errors. Once defined, runtime parameters are available to the entire code. Optionally, any parameter may be specified with theCONSTANTattribute (e.g.,PARAMETER foo REAL CONSTANT 2.2). If a user attempts to set a constant parameter via the runtime parameter file, an error will occur.The range specification is optional and can be used to specify valid ranges for the parameters. The range specification is allowed only for
REAL, INTEGER, STRINGvariables and must be enclosed in ’[]’.For a
STRINGvariable, the range specification is a comma-separated list of strings (enclosed in quotes). For aINTEGER, REALvariable, the range specification is a comma-separated list of (closed) intervals specified bymin ... max, where min and max are the end points of the interval. If min or max is omitted, it is assumed to be \(-\infty\) and \(+\infty\) respectively. Finallyvalis a shortcut forval ... val. For examplePARAMETER pres REAL 1.0 [ 0.1 … 9.9, 25.0 … ] PARAMETER coords STRING “polar” [“polar”,”cylindrical”,”2d”,”3d”]
indicates that
presis a REAL variable which is allowed to take values between 0.1 and 9.9 or above 25.0. Similarlycoordsis a string variable which can take one of the four specified values.Dparameter-name commentAny line in aConfigfile is considered a parameter comment line if it begins with the tokenD. The first token after the comment line is taken to be the parameter name. The remaining tokens are taken to be a description of the parameter’s purpose. A token is delineated by one or more white spaces. For example,D SOME_PARAMETER The purpose of this parameter is whatever
If the parameter comment requires additional lines, the
&is used to indicate continuation lines. For example,D SOME_PARAMETER The purpose of this parameter is whatever D & This is a second line of description
You can also use this to describe other variables, fluxes, species, etc. For example, to describe a species called “xyz”, create a comment for the parameter “xyz_species”. In general the name should be followed by an underscore and then by the lower case name of the keyword used to define the name.
Parameter comment lines are special because they are used by to build a formatted list of commented runtime parameters for a particular problem. This information is generated in the file
setup_paramsin theobjectdirectory.VARIABLEname [``TYPE:`` vartype] [eosmap-spec]Registers variable with the framework with name name and a variable type defined by vartype. Thesetupscript collects variables from all the included units, and creates a comprehensive list with no duplications. It then assigns defined constants to each variable and calculates the amount of storage required in the data structures for storing these variables. The defined constants and the calculated sizes are written to the fileSimulation.h.The possible types for vartype are as follows:
PER_VOLUMEThis solution variable is represented in conserved form, i.e., it represents the density of a conserved extensive quantity. The prime example is a variable directly representing mass density. Energy densities, momentum densities, and partial mass densities would be other examples (but these quantities are usually represented inPER_MASSform instead).PER_MASSThis solution variable is represented in mass-specific form, i.e., it represents quantities whose nature is \(\hbox{extensive quantity}\,\mathop{\mathrm{per}}\,\hbox{mass unit}\). Examples are specific energies, velocities of material (since they are equal to momentum per mass unit), and abundances or mass fractions (partial density divided by density).GENERICThis is the default vartype and need not be specified. This type should be used for any variables that do not clearly belong to one of the previous two categories.
In the current version of the code, the
TYPEattribute is only used to determine which variables should be converted to conservative form for certainGridoperations that may require interpolation (i.e., prolongation, guardcell filling, and restriction) when one of the runtime parametersGrid/convertToConsvdForMeshCallsorGrid/convertToConsvdInMeshInterpis settrue. Only variables of typePER_MASSare converted: values are multiplied cell-by-cell with the value of the"dens"variable, and potential interpolation results are converted back by cell-by-cell division by"dens"values after interpolation.Note that therefore
variable types are irrelevant for uniform grids,
variable types are irrelevant if neither
Grid/convertToConsvdForMeshCallsnorGrid/convertToConsvdInMeshInterpistrue, andvariable types (and conversion to and from conserved form) only take effect if a
VARIABLE dens …
exists.
An eosmap-spec has the syntax ``EOSMAP:`` eos-role \(|\) ( [``EOSMAPIN:`` eos-role] [``EOSMAPOUT:`` eos-role ]), where eos-role stands for a role as defined in
Eos_map.h. These roles are used within implementations of thephysics/Eos/Eos_wrappedinterface, via the subroutinesphysics/Eos/Eos_getDataandphysics/Eos/Eos_putData, to map variables fromGriddata structures to theeosDataarray thatphysics/Eos/Eosunderstands, and back. For example,VARIABLE eint TYPE: PER_MASS EOSMAPIN: EINT
means that within
Eos_wrapped, theEINT_VARcomponent ofunkwill be treated as the grid variable in the “internal energy” role for the purpose of constructing input tophysics/Eos/Eos, andVARIABLE gamc EOSMAPOUT: GAMC
means that within
Eos_wrapped, theGAMC_VARcomponent ofunkwill be treated as the grid variable in theEOSMAP_GAMCrole for the purpose of returning results from callingphysics/Eos/Eosto the grid. The specificationVARIABLE pres EOSMAP: PRES
has the same effect as
VARIABLE pres EOSMAPIN: PRES EOSMAPOUT: PRES
Note that not all roles defined in
Eos_map.hare necessarily meaningful or actually used in a givenEosimplementation. An eosmap-spec for aVARIABLEis only used in anphysics/Eos/Eos_wrappedinvocation when the optionalgridDataStructargument is absent or has a value ofCENTER.FACEVARname [eosmap-spec]This keyword has the same meaning for face-centered variables, thatVARIABLEdoes for cell-centered variables. It allocates space in the grid data structure that contains face-centered physical variables for “name”.For eosmap-spec, see above under
VARIABLE. An eosmap-spec forFACEVARis only used whenphysics/Eos/Eos_wrappedis called with an optionalgridDataStructargument ofFACEX,FACEY, orFACEZ.FLUXnameRegisters flux variable name with the framework. When using an adaptive mesh, flux conservation is needed at fine-coarse boundaries. Each state variable that needs flux conservation is made known to the framework through this keyword.MASS_SCALARname [RENORM: group-name] [eosmap-spec]If a quantity is defined with keyword MASS_SCALAR, space is created for it in the grid “unk” data structure. It is treated like any other variable byPARAMESH, but the hydrodynamic unit treats it differently. It is advected, but other physical characteristics don’t apply to it. If the optional “RENORM” is given, this mass-scalar will be added to the renormalization group of the accompanying group name. The hydrodynamic solver will renormalize all mass-scalars in a given group, ensuring that all variables in that group will sum to 1 within an individual cell. SeeFor eosmap-spec, see above under
VARIABLE. An eosmap-spec for aMASS_SCALARmay be used in anphysics/Eos/Eos_wrappedinvocation when the optionalgridDataStructargument is absent or has a value ofCENTER.It is inadvisable to name variables, species, and mass scalars with the same prefix, as post-processing routines have difficulty deciphering the type of data from the output files. For example, don’t create a variable “temp” to hold temperature and a mass scalar “temp” indicating a temporary variable. Although the
Simulation.hfile can distinguish between these two types of variables, many plotting routines cannot.PARTICLETYPEparticle-typeINITMETHODinitialization-methodMAPMETHODmap-methodADVMETHODtime-advance-methodThis keyword associates a particle type with mapping and initialization sub-units ofParticlesunit to operate on this particle type during the simulation. Here, map-method describes the method used to map the particle properties to and from the mesh (see ), initialization-method describes the method used to distribute the particles at initialization, and time-advance-method describes the method used to advance the associated particle type in time. This keyword has been introduced to facilitate inclusion of multiple particle types in the same simulation. It imposes certain requirements on the use of theParticlesMappingandParticlesInitializationsubunits. Particles (of any type, whether calledpassiveor anything else) do not have default methods for initialization, mapping, or time integration, so aPARTICLETYPEdirective in aConfigfile (or an equivalent-particlemethods=setup option, see ) is the only way to specify the appropriate implementations of theParticlessubunits to be used. The declaration should be accompanied by appropriate “REQUESTS” or “REQUIRES” directives to specify the paths of the appropriate subunit implementation directories to be included. For clarity, our technique has been to include this information in the simulation directoryConfigfiles only. All the currently available mapping and initialization methods have a corresponding identifier in the form of preprocessor definition inParticles.h. The user may select any particle-type name, but the map-method, initialization-method and time-advance-method must correspond to existing identifiers defined inParticles.h. This is necessary to navigate the data structure that stores the particle type and its associated mapping and initialization methods. Users desirous of adding new methods for mapping or initialization should also update theParticles.hfile with additional identifiers and their preprocessor definitions. Note, it is possible to use the same methods for different particle types, but each particle type name must only appear once. Finally, the SimulationsConfigfile is also expected to request appropriate components of mapping and initialization subunits using the keywordREQUESTS, since the corresponding Config files do not specify a default component to include. For example, to includepassiveparticle types withQuadraticmapping,Latticeinitialization,andEulerfor advancing in time the following code segment should appear in theConfigfile of theSimulationsdirectory.PARTICLETYPE passive INITMETHOD lattice MAPMETHOD quadratic ADVMETHOD Euler REQUIRES Particles/ParticlesMain REQUESTS Particles/ParticlesMain/passive/Euler REQUESTS Particles/ParticlesMapping/Quadratic REQUESTS Particles/ParticlesInitialization/Lattice
PARTICLEPROPname typeThis keyword indicates that the particles data structure will allocate space for a sub-variable “NAME_PART_PROP.” For example if the Config file containsPARTICLEPROP dens
then the code can directly access this property as
particles(DENS_PART_PROP,1:localNumParticles) = densInitial
type may be REAL or INT, however INT is presently unused. See for more information and examples.
PARTICLEMAPTO partname FROM vartype varnameThis keyword maps the value of the particle property partname to the variable varname. vartype can take the values VARIABLE, MASS_SCALAR, SPECIES, FACEX, FACEY, FACEZ, or one of SCRATCH types (SCRATCHVAR/ SCRATCHCENTERVAR, SCRATCHFACEXVAR. SCRATCHFACEYVAR, SCRATCHFACEZVAR) These maps are used to generateSimulation_mapParticlesVar, which takes the particle property partname and returns varname and vartype. For example, to have a particle property tracing density:PARTICLEPROP dens REAL PARTICLEMAP TO dens FROM VARIABLE dens
SPECIESname [TO number of ions]An application that uses multiple species uses this keyword to define them. See for more information. The user may also specify an optional number of ions for each element, name. For example,SPECIESo TO 8 creates 9 spaces inunkfor Oxygen, that is, a single space for Oxygen and 8 spaces for each of its ions. This is relevant to simulations using theionizeunit. (Omitting the optionalTOspecifier is equivalent to specifyingTO0).DATAFILESwildcardDeclares that all files matching the given wildcard in the unit directory should be copied over to the object directory. For example,DATAFILES *.dat
will copy all the “.dat” files to the object directory.
KERNEL[subdir]Declares that all subdirectories must be recursively included. This usually marks the end of the high level architecture of a unit. Directories below it may be third party software or a highly optimized solver, and are therefore not required to conform to Flash-X architecture.Without a subdir, the current directory (i.e., the one containing the
Configfile with theKERNELkeyword) is marked as a kernel directory, so code from all its subdirectories (with the exception of subdirectories whose name begins with a dot) is included. When a subdir is given, then that subdirectory must exist, and it is treated as a kernel directory in the same way.Note that currently the
setupscript can process only oneKERNELdirective perConfigfile.LIBRARYnameSpecifies a library requirement. Different Flash-X units require different libraries, and they must informsetupso it can link the libraries into the executable. Some valid library names areHDF5, MPI. Support for external libraries can be added by modifying the site-specificMakefile.hfiles to include appropriate Makefile macros. It is possible to use internal libraries, as well as switch libraries at setup time. To use these features, seeLINKIFfilename componentnameSpecifies that the file filename should be used only when the compenentcomponentnameis included. This keyword allows a unit to have multiple implementations of any part of its functionality, even down to the kernel level, without the necessity of creating children for every alternative. This is especially useful in Simulation setups where users may want to use different implementations of specific functions based upon the units included. For instance, a user may wish to supply his/her own implementation ofGrid_markRefineDerefine.F90, instead of using the default one provided by Flash-X. However, this function is aware of the internal workings ofGrid, and has different implementations for different grid packages. The user could therefore specify different versions of his/her own file that are intended for use with the different grids. For example, addingLINKIF Grid_markRefineDerefine.F90.ug Grid/GridMain/UG LINKIF Grid_markRefineDerefine.F90.pmesh Grid/GridMain/paramesh
to the
Configfile ensures that if the application is built withUG, the fileGrid_markRefineDerefine.F90.ugwill be linked in asGrid_markRefineDerefine.F90, whereas if it is built with|paramesh|2or|paramesh|4.0or|paramesh|4dev, then the fileGrid_markRefineDerefine.F90.pmeshwill be linked in asGrid_markRefineDerefine.F90. Alternatively, the user may want to provide only one implementation specific to, say,PARAMESH. In this case, addingLINKIF Grid_markRefineDerefine.F90 Grid/GridMain/paramesh
to the Config file ensures that the user-supplied file is included when using
PARAMESH(either version), while the default Flash-X file is included when usingUG.PPDEFINEsym1 sym2 …Instructs setup to add the PreProcessor symbolsSYM1andSYM2to the generatedSimulation.h. HereSYM1is sym1 converted to uppercase. These pre-process symbols can be used in the code to distinguish between which units have been used in an application. For example, a Fortran subroutine could include#ifdef |flashx|_GRID_UG ug specific code #endif
#ifdef |flashx|_GRID_PARAMESH3OR4 pm3+ specific code #endif
By convention, many preprocessor symbols defined in Config files included in the Flash-X code distribution start with the prefix “Flash-X_”.
USESETUPVARS var1, var2, …This tellssetupthat the specified “Setup Variables” are being used in thisConfigfile. The variables initialize to an empty string if no values are specified for them. Note that commas are required if listing several variables.CHILDORDERchild1 child2 …Whensetuplinks several implementations of the same function, it ensures that implementations of children override that of the parent. Its method is to lexicographically sort all the names and allow implementations occurring later to override those occurring earlier. This means that if two siblings implement the same code, the names of the siblings determine which implementation wins. Although it is very rare for two siblings to implement the same function, it does occur. This keyword permits theConfigfile to override the lexicographic order by one preferred by the user. Lexicographic ordering will prevail as usual when deciding among implementations that are not explicitly listed.GUARDCELLSnumAllows an application to choose the stencil size for updating grid points. The stencil determines the number of guardcells needed. The PPM algorithm requires \(4\) guardcells, hence that is the default value. If an application specifies a smaller value, it will probably not be able to use the defaultmonotonicAMR Grid interpolation; see the-gridinterpolationsetupflag for additional information.SETUPERROR error messageThis causessetupto abort with the specified error message. This is usually used only inside a conditional IF/ENDIF block (see below).IF, ELSEIF, ELSE, ENDIFA conditional block is of the following form:IF cond … ELSEIF cond … ELSE … ENDIF
where the
ELSEIFandELSEblocks are optional. There is no limit on the number ofELSEIFblocks. “…” is any sequence of validConfigfile syntax. The conditional blocks may be nested. “cond” is any boolean valued Python expression using the setup variables specified in theUSESETUPVARS.
The Setup Tool
The setup tool parses and interprets the Config files to assemble an application instance in the specified object directory. It has three primary actions to perform.
Compile a list of source files to be included in the application. This compilation process ends with all the needed files assembled in the object directory. Some may be linked directly from their location in the source tree, while others may have been generated through some additional actions taken by the setup tool described in Figure …
Compile and initialize a list of runtime parameters needed by the simulation
Generate Makefile.Unit for each unit that will be included in the main Makefile used for compiling the source code. Note that the Flash-X build system assumes GNU Make.
The setup tool traverses the Flash-X source tree starting from the directory hosting the specific application definition. This starting directory is essentially the selected implementation of the “Simulation” unit. It accumulates units, subunits and other compoments from where source code is to be collected through recursive traversal of all encountered dependencies. While traversing the source tree the setup tool uses the following inheritance rules to arbitrate on versions of the source code functions, versions of key definitions and initial values of runtime parameters.
All files with valid source extensions (such as .F90, .c, .h) are added to the list and are linked into the object directory
If a file with identical name in already included in the list the existing link in the object directory is removed and replaced with a link to the newly encountered file
The source files in the Simulation unit are the last ones to be added to the list, and therefore can override any file from the source tree in the object directory
If a file has a .ini extension it indicates to the setup tool that it contains definitions for the keys. All the keys defined in the file are added to the list of available keys.
If a key already existed in the list, its defintion is replaced by the most recently encountered definition.
Similar to source files, a definition in the Simulation unit overrides any existing definition of a key.
An -mc appended to the name of a file indicates to the setup tool that the file is augmented with keys and needs to be translated
An augmented file foo.F90-mc may have a Novariant directive, in which case the keys are replaced by the corresponding definitions and the emitted code is placed in a file foo.F90 in the object directory. Note that foo.F90 never comes into existence anywhere in the source tree, so foo.F90 in the object directory is a physical file, not a link.
If the aumented file does not have Novariant directive then the setup tool generates its variants.
It looks for paths specified for the variants in the list of REQUIRES.
For every variant it temporarily addes the keys defined in the path to list of available keys, which are removed from the list as soon as the translated code is emitted.
The emitted code is placed in the object directory with the name foo_thisvariant.F90.
It is assumed that the function or subroutine names are defined to be variant dependent in these files. For details on how to do this correctly see …..
In Makefile.Unit instances of foo.o are replaced with foo_variants.o for all available variants.
If any file has the Reorder directive it undergoes a code transformation where the order of indices in the arrays is changed as specified. The emitted code is placed in a file with the same name as the original file and the link to the source tree is removed.
Runtime parameters defined in the Config file are added to the list of runtime parameters and initialized with the specified value.
If a runtime parameter already exists in the list its value is replaced with the most recently encountered value
The Simulation unit is the last one to be processed, therefore initial values specified in its Config file override other values.
The
setupscript determines site-dependent configuration information
by looking for a directory sites/<hostname> where <hostname> is
the hostname of the machine on which Flash-X is running. [1] Failing
this, it looks in sites/Prototypes/ for a directory with the same
name as the output of the uname command. The site and operating
system type can be overridden with the -site and -ostype
command-line options to the setup command. Only one of these options
can be used at one time. The directory for each site and operating
system type contains a makefile fragment Makefile.h that sets
command names, compiler flags, library paths, and any replacement or
additional source files needed to compile Flash-X for that specific
machine and machine type.
Setup Arguments
The setup script accepts a large number of command line arguments which affect the simulation in various ways. These arguments are divided into three categories:
Setup Options (example:
-auto) begin with a dash and are built into the setup script itself. Many of the most commonly used arguments are setup options.Setup Variables (example:
species=air,h2o) are defined by individual units. When writing aConfigfile for any unit, you can define a setup variable. explains how setup variables can be created and used.Setup Shortcuts (example:
+ug) begin with a plus symbol and are essentially macros which automatically include a set of setup variables and/or setup options. New setup shortcuts can be easily defined, see for more information.
-verbose= instructs the level of verbosity in progress messages printed by the setup tool. Different levels (in order of increasing verbosity) are ERROR, IMPINFO, WARN, INFO, DEBUG}. The default is WARN.
-auto indicates to the setup tool that it should select DEFAULT in every traversed path unless an alternative is explicitly specified either at commandline or in one of the already traversed Config files. In the process a text file containing a list of all traversed paths is created and is placed in the object directory.
*-[123]d specifies the dimensionality of the simulation. The default is 2d.
-maxblocks= is relevant only when using PARAMESH. It lets the AMR know how many blocks to allocate for the state variables. Note that if the number of blocks generated on a process exceeds maxblocks the execution will abort.
*-nxb=/ -nyb= / -nzb= * specify the number of data points (also called cells) along each dimension of the every block in the setup
-debug /-opt /-test are options used to select the level of optimization to used by the compilers. The defauls is -opt. The Makefile.h in the site directory defines the flags associated with each of these options, and the users can customize them as they want.
-objdir=<dir> allows the user to specify the path where they wish the executable to be built. The default is object at the same level as the source directory.
-with-unit=<path> is used to specify to the setup tool that the source code at the specified path is to be included. The specification of the path on commandline can override any dependency in the traversal that had a REQUESTS associated with it. And it can add dependencies that were not included with -auto option.
-without-unit=<path> is used to tell the setup tool not to include the code in the specified path. This option can also override REQUIRES encountered during the traversal.
-geometry=<geometry> is used to specify one of the supported geometries <cartesian, cylindrical, spherical, polar>, the default is cartesian.
-defines=<def>/ causes the specified pre-processor symbols to be defined when the code is being compiled. This is useful for code segments surrounded by preprocessor directives that are to be included only if a particular implementation of a unit is selected.
-nofbs non-fixed-block size mode where nxb, nyb and nzb are not fixed at compile time.
-gridinterpolation=<scheme> is used to select a scheme for Grid interpolation.
-makefile=<extension>} is used when a site can work with more than one compiler suite. In such situations the site can have several Makefile.h’s named as Makefile.h.<extension> and the one specified with this option will be selected
-index-reorder instructs setup order the indices in state variables as specified. This feature is needed because the base data structure in PARAMESH expects the variable index to be first while AMReX needs it to be last. This feature permits the same code base to work in both modes.
-parfile=<filename> causes setup to copy the specified runtime-parameters file in the simulation directory to the object directory and name it flash.par. By default every setup distributed has a flash.par which is copied into the object directory if this option is not used.
*-append-parfiles=[location1]<filename1>,[location2]<filename2> … takes a comma-separated list of names of parameter files and combines them into one flash.par file in the object directory. File names without an absolute path are taken to be relative to the simulation directory, in a way similat to that for the -parfile option.
-portable this option causes setup copy instead of linking source files.
-site=<site> specifies the suddirectory of the “sites” directory from where to fetch Makefile.h
-with-library=<libname>[,args] instructs setup to link in the specified library when building the final executable. The libraty in questoin can be internal or external. If external the user must make sure that the appropriate path to the library is provided in their site’s Makefile.h. An internal library will be built by the setup if it hasn’t already been done so by an earlier invocation.
-without-library=<libname> is used to override the need for a library specified by one the Config files traversed by the setup tool.
-mconly forces the setup tool to only run the macro processor. Processed files are saved to the object directory.
Using Shortcuts
Apart from the various setup options the setup script also allows
you to use shortcuts for frequently used combinations of options. For
example, instead of typing in
./setup -a Sod -with-unit=Grid/GridMain/UG
you can just type
./setup -a Sod +ug
The +ug or any setup option starting with a ‘+’ is considered as a
shortcut. By default, setup looks at bin/setup_shortcuts.txt for a
list of declared shortcuts. You can also specify a “:” delimited list of
files in the environment variable SETUP_SHORTCUTS and setup will
read all the files specified (and ignore those which don’t exist) for
shortcut declarations. See for an example file.
# comment line
# each line is of the form # shortcut:arg1:arg2:…: # These shortcuts can refer to each other.
default:–with-library=mpi:-unit=IO/IOMain:-gridinterpolation=monotonic
# io choices noio:–without-unit=IO/IOMain: io:–with-unit=IO/IOMain:
# Choice of Grid ug:-unit=Grid/GridMain/UG: pm2:-unit=Grid/GridMain/paramesh/|paramesh|2: pm40:-unit=Grid/GridMain/paramesh/paramesh4/|paramesh|4.0: pm4dev:-unit=Grid/GridMain/paramesh/paramesh4/|paramesh|4dev:
# frequently used geometries cube64:-nxb=64:-nyb=64:-nzb=64:
The shortcuts are replaced by their expansions in place, so options which come after the shortcut override (or conflict with) options implied by the shortcut. A shortcut can also refer to other shortcuts as long as there are no cyclic references.
The “default” shortcut is special. setup always prepends
+default to its command line thus making ./setup -a Sod
equivalent to ./setup +default -a Sod. Thus changing the default IO
to “hdf5/parallel”, is as simple as changing the definition of the
“default” shortcut.
Some of the more commonly used shortcuts are described below:
Shortcut |
Description |
|---|---|
+cartesian |
use cartesian geometry |
+cylindrical |
use cylindrical geometry |
+noio |
omit IO |
+nolog |
omit logging |
+pm4dev |
use the PARAMESH4DEV grid |
+polar |
use polar geometry |
+spherical |
use spherical geometry |
+ug |
use the uniform grid in a fixed block size mode |
+nofbs |
use the uniform grid in a non-fixed block size mode |
Setup Variables and Preprocessing Config Files
setup allows you to assign values to “Setup Variables”. These
variables can be string-valued, integer-valued, or boolean. A setup
call like
./setup -a Sod Foo=Bar Baz=True
sets the variable “Foo” to string “Bar” and “Baz” to boolean True [2].
setup can conditionally include and exclude parts of the Config
file it reads based on the values of these variables. For example, the
IO/IOMain/hdf5/Config file contains
DEFAULT serial
USESETUPVARS parallelIO
IF parallelIO DEFAULT parallel ENDIF
The code sets IO to its default value of “serial” and then resets it to
“parallel” if the setup variable “parallelIO” is True. The
USESETUPVARS keyword in the Config file instructs setup that the
specified variables must be defined; undefined variables will be set to
the empty string.
Through judicious use of setup variables, the user can ensure that
specific implementations are included or the simulation is properly
configured. For example, the setup line ./setup -a Sod +ug expands
to ./setup -a Sod -unit=Grid/GridMain/ Grid=UG. The relevant part of
the Grid/GridMain/Config file is given below:
# Requires use of the Grid SetupVariable USESETUPVARS Grid
DEFAULT paramesh
IF Grid==’UG’ DEFAULT UG ENDIF IF Grid==’PM2’ DEFAULT paramesh/|paramesh|2 ENDIF
The Grid/GridMain/Config file defaults to choosing PARAMESH. But
when the setup variable Grid is set to “UG” through the shortcut
+ug, the default implementation is set to “UG”. The same technique
is used to ensure that the right IO unit is automatically included.
See bin/Readme.SetupVars for an exhaustive list of Setup Variables
which are used in the various Config files. For example the setup
variable nDim can be test to ensure that a simulation is configured
with the appropriate dimensionality (see for example
Simulation/SimulationMain/unitTest/Eos/Config).
Creating a Site-specific Makefile
If setup does not find your hostname in the sites/ directory it
picks a default Makefile based on the operating system. This
Makefile is not always correct but can be used as a template to
create a Makefile for your machine. To create a Makefile specific to
your system follow these instructions.
Create the directory
sites/<hostname>, where<hostname>is the hostname of your machine.Start by copying
os/<your os>/Makefile.htosites/<hostname>Use
bin/suggestMakefile.shto help identify the locations of various libraries on your system. The script scans your system and displays the locations of some libraries. You must note the location ofMPIlibrary as well. If your compiler is actually an mpi-wrapper (e.g.mpif90), you must still defineLIB_MPIin your site specificMakefile.has the empty string.Edit
sites/<hostname>/Makefile.hto provide the locations of various libraries on your system.Edit
sites/<hostname>/Makefile.hto specify the FORTRAN and C compilers to be used.
The Makefile.h must include a compiler flag to promote Fortran
Reals to Double Precision. Flash-X performs all MPI
communication of Fortran Reals using MPI_DOUBLE_PRECISION
type, and assumes that Fortran Reals are interoperable with C
doubles in the I/O unit.
Files Created During the setup Process
The setup tool generates many files in the directory. They fall into three major categories:
Files not required to build the Flash-X executable, but which contain useful information,
Generated or C code, and
Makefiles required to compile the Flash-X executable.
Informational files
These files are generated before compilation by setup. Each of these
files begins with the prefix setup_ for easy identification.
|
contains the options with which |
|
contains the list of libraries and their arguments used to generate the executable |
|
contains the list of all units which were included in the current setup |
|
contains a list of all pre-process symbols passed to the compiler invocation directly |
|
contains the exact compiler and linker flags |
|
contains the list of runtime parameters
defined in the |
|
contains the list of variables, fluxes with their descriptions. |
Code generated by the setup call
These routines are generated by the setup call and provide simulation-specific code.
|
contains code for the subroutine
|
|
contains code which returns
build statistics including the
actual |
|
contains code to retrieve the number and list of flashUnits used to compile code |
contains code to retrieve the version of Flash-X used for the build |
|
|
contains simulation specific
preprocessor macros, which
change based upon setup unlike
|
contains code to map an index
described in |
|
|
contains code to map a string
described in the |
contains a mapping between particle properties and grid variables. Only generated when particles are included in a simulation. |
|
|
contains code to make a data structure with information about the mapping and initialization method for each type of particle. Only generated when particles are included in a simulation. |
Makefiles generated by setup
Apart from the master Makefile, setup generates a makefile for
each unit, which is “included” in the master Makefile. This is true
even if the unit is not included in the application. These unit
makefiles are named Makefile.Unit and are a concatenation of all the
Makefiles found in unit hierarchy processed by setup.
For example, if an application uses
Grid/GridMain/paramesh/paramesh4/|paramesh|4.0, the file
Makefile.Grid will be a concatenation of the Makefiles found in
Grid,Grid/GridMain,Grid/GridMain/paramesh,Grid/GridMain/paramesh/paramesh4, andGrid/GridMain/paramesh/paramesh4/|paramesh|4.0
As another example, if an application does not use
PhysicalConstants, then Makefile.PhysicalConstants is just the
contents of PhysicalConstants/Makefile at the API level.
Since the order of concatenation is arbitrary, the behavior of the Makefiles should not depend on the order in which they have been concatenated. The makefiles inside the units contain lines of the form:
Unit += file1.o file2.o …
where Unit is the name of the unit, which was Grid in the
example above. Dependency on data modules files need not be specified
since the setup process determines this requirement automatically.
Setup a hybrid MPI+|openmp| Flash-X application
The Flash-X multithreading requires a MPI-2 installation built with
thread support (building with an MPI-1 installation or an MPI-2
installation without thread support is possible but strongly
discouraged). The Flash-X application requests the thread support level
MPI_THREAD_SERIALIZED to ensure that the MPI library is thread-safe
and that any OpenMP thread can call MPI functions safely. You should
also make sure that your compiler provides a version of OpenMP which is
compliant with at least the OpenMP 2.5 (200505) standard (older versions
may also work but I have not checked).
In order to make use of the multithreaded code you must setup your
application with one of the setup variables threadBlockList,
threadWithinBlock or threadRayTrace equal to True, e.g.
./setup Sedov -auto threadBlockList=True ./setup Sedov -auto threadBlockList=True +mpi1 (compatible with MPI-1 - unsafe!)
When you do this the setup script will insert USEOPENMP = 1 instead
of USEOPENMP = 0 in the generated Makefile. If it is equal to
\(1\) the Makefile will prepend an OpenMP variable to the
FFLAGS, CFLAGS, LFLAGS variables.
In general you should not define FLAGS, CFLAGS and LFLAGS
in your Makefile.h. It is much better to define FFLAGS_OPT,
FFLAGS_TEST, FFLAGS_DEBUG, CFLAGS_OPT, CFLAGS_TEST,
CFLAGS_DEBUG, LFLAGS_OPT, LFLAGS_TEST and
LFLAGS_DEBUG in your Makefile.h. The setup script will then
initialize the FFLAGS, CFLAGS and LFLAGS variables in the
Makefile appropriately for an optimized, test or debug build.
The OpenMP variables should be defined in your Makefile.h and
contain a compiler flag to recognize OpenMP directives. In most cases it
is sufficient to define a single variable named OPENMP, but you may
encounter special situations when you need to define OPENMP_FORTRAN,
OPENMP_C and OPENMP_LINK. If you want to build Flash-X with the
GNU Fortran compiler gfortran and the GNU C compiler gcc then
your Makefile.h should contain
OPENMP = -fopenmp
If you want to do something more complicated like build Flash-X with the
Lahey Fortran compiler lf90 and the GNU C compiler gcc then your
Makefile.h should contain
OPENMP_FORTRAN = –openmp -Kpureomp OPENMP_C = -fopenmp OPENMP_LINK = –openmp -Kpureomp
When you run the hybrid Flash-X application it will print the level of thread support provided by the MPI library and the number of OpenMP threads in each parallel region
: Called MPI_Init_thread - requested level 2, given level 2 [Driver_initParallel]: Number of OpenMP threads in each parallel region 4
Note that the Flash-X application will still run if the MPI library does not provide the requested level of thread support, but will print a warning message alerting you to an unsafe level of MPI thread support. There is no guarantee that the program will work! I strongly recommend that you stop using this Flash-X application - you should build a MPI-2 library with thread support and then rebuild Flash-X.
We record extra version and runtime information in the Flash-X log file for a threaded application.
You should not setup a Flash-X application with both threadBlockList
and threadWithinBlock equal to True - nested OpenMP parallelism
is not supported. For further information about Flash-X multithreaded
applications please refer to Chapter
[Chp:Multithreaded|flashx|].