310 likes | 453 Views
Hands-On Flash. Setting up Your Own Simulations. Outline. Setting up an out of the box simulation Customizing Flash for a new simulation (i.e., how to set up your problem) Simple visualization and analysis with idl using fidlr3.0. Setting up an out of the box problem.
E N D
Hands-On Flash Setting up Your Own Simulations
Outline • Setting up an out of the box simulation • Customizing Flash for a new simulation (i.e., how to set up your problem) • Simple visualization and analysis with idl using fidlr3.0
Flash Source to Executable • Flash comes as source code consisting of source code components known as units • Going from Flash source code to executable consists of • The setup step: specifying which source units to include in the application and linking together the source files • The compilation step: running make to compile the flash executable
The Setup Script The primary job of the setup script is to: • Traverse the FLASH source tree and link necessary files for a given application to the object directory • Find the target Makefile.h for a given machine. • Generate the Makefile to make the FLASH executable. • Generate files needed to add runtime parameters to a given simulation. • Generate files needed to parse the runtime parameter file.
Example Makefile.h Located in FLASH3/sites/<machine name> MPI_PATH = /usr/local/mpich-intelHDF5_PATH = /usr/local/hdf5-iccNCMPI_PATH = /usr/local/pnetcdf-icc FCOMP = ${MPI_PATH}/bin/mpif90CCOMP = ${MPI_PATH}/bin/mpiccCPPCOMP = ${MPI_PATH}/bin/mpiCCLINK = ${MPI_PATH}/bin/mpif90 FFLAGS_OPT = -c -r8 -i4 -O3 -real_size 64# -unroll -align -prefetch -pad -ip FFLAGS_DEBUG = -c -g -r8 -i4 -check bounds -check format -check output_conversion -warn all -real_size 64FFLAGS_TEST = -c -r8 -i4 -O2 -real_size 64CFLAGS_OPT = -c -O3 -D_LARGEFILE64_SOURCECFLAGS_DEBUG = -c -g -debug extended -D_LARGEFILE64_SOURCECFLAGS_TEST = -c -O2 -D_LARGEFILE64_SOURCECFLAGS_HDF5 = -I $(HDF5_PATH)/includeCFLAGS_NCMPI = -I $(NCMPI_PATH)/includeCFLAGS_MPI = -I$(MPI_PATH)/includeLFLAGS_OPT = -r8 -i4 -Vaxlib -lsvml -Ur -oLFLAGS_DEBUG = -r8 -i4 -Vaxlib -g -oLFLAGS_TEST = -r8 -i4 -Vaxlib -oLIB_HDF5 = -L $(HDF5_PATH)/lib -lhdf5 -lzLIB_MPI = -L$(MPI_PATH)/lib -lfmpich -lmpichLIB_NCMPI = -L$(NCMPI_PATH)/lib -lpnetcdf
First Setup Example • From the main flash directory, FLASH3/, type ./setup Sedov -2d -auto command problem name dimension Setup script determines which units to include based on the problem name (rather than manually) To run setup you shouldn’t need to modify the setup script (FLASH3/bin/setup.py)
Setup Options -auto setup script will automatically generate the Units file based on the problem you specify Sample Units File INCLUDE Driver/DriverMain/TimeDep INCLUDE Grid/GridMain/paramesh/Paramesh3/PM3_package/headers INCLUDE Grid/GridMain/paramesh/Paramesh3/PM3_package/mpi_source INCLUDE Grid/GridMain/paramesh/Paramesh3/PM3_package/source INCLUDE Grid/localAPI INCLUDE IO/IOMain/hdf5/serial/PM INCLUDE PhysicalConstants/PhysicalConstantsMain INCLUDE RuntimeParameters/RuntimeParametersMain INCLUDE Simulation/SimulationMain/Sedov INCLUDE flashUtilities/general INCLUDE physics/Eos/EosMain/Gamma INCLUDE physics/Hydro/HydroMain/split/PPM/PPMKernel INCLUDE physics/Hydro/HydroMain/utilities Try manually changing IO/IOMain/hdf5/serial/PM to IO/IOMain/hdf5/parallel/PM - Then run setup without the -auto flag If you don’t use the -auto flag, you must have a valid Units file in the top FLASH directory (FLASH3/Units)
Setup Options • Another way to use a specific unit in setup is with the -unit option -unit=<unit> : force a specific unit to be used in setup ./setup Sedov -2d -auto -unit=IO/IOMain/hdf5/parallel/PM
Setup Shortcuts • The Flash3 setup script includes a “shortcuts” feature • Allows many setup options to be included with one keyword • Defined in Flash3/bin/setup_shortcuts.txt • To use a shortcut, add +shortcut to your setup line • Example: The shortcut ug is defined as: ug:--with-unit=Grid/GridMain/:Grid=UG: ./setup Sod -auto +ug this is equivalent to typing in unit options with -unit=Grid/GridMain/UG -unit=IO/IOMain/hdf5/serial/UG (because the appropriate IO is included by default) • Look in Flash3/bin/setup_shortcuts.txt for more examples and to define your own
setup Generated Files setup_call contains the options with which setup was called and the command line resulting after shortcut expansion setup_libraries contains the list of libraries and their arguments (if any) which was linked in to generate the executable setup_units contains the list of all units which were included in the current setup setup_defines contains a list of all pre-process symbols passed to the compiler invocation directly setup_flags contains the exact compiler and linker flags setup_params contains the list of runtime parameters defined in the Config files processed by setup setup_vars contains the list of variables, fluxes, species, particle properties, and mass scalars used in the current setup, together with their descriptions
Customizing Flash for a new simulation (i.e., how to set up your problem)
Adding a New Simulation • New Simulations are added by creating a directory in FLASH3/source/Simulation/SimulationMain • The Simulation directory gives people working on a particular problem a place to put problem specific code that replaces the default functionality in the main body of the code • It’s also a place to tell the setup script which units this problem will need from the rest of the code • In the Simulation directory, one needs to have: • A Config file to at least describe the units and runtime parameters needed by this problem • One or more flash.par files which each give a set of runtime parameter values for running the problem in different ways • Code specifying initial conditions and code for the simulation as a unit (e.g., initialization of the unit)
Required Code for a New Simulation • There are certain pieces of code that all simulations must implement: • Simulation_initBlock.F90: Sets initial conditions in a single block. • Simulation_init.F90: Reads the runtime parameters, and performs other necessary unit initializations. • Simulation_data.F90: A Fortran module which stores data and parameters specific to the Simulation. • Optionally, a sumulation could implement: • Simulation_initSpecies.F90: To give the properties of the species involved in a multispecies simulation
Customized Code for a new Simulation • In a FLASH simulation directory, you can place code that overrides the functionality you would pick up from other code units • In the custom code you can modify: • Boundary conditions (Grid_applyBCEdge.F90) • Refinement criterion (Grid_markRefineDerefine.F90) • Diagnostic integrated quanties for output (in the flash.dat file), e.g., total mass (a default) or vorticity (IO_writeIntegralQuantities.F90) • Diagnostics to compute new grid scope variables (Grid_computeUserVars.F90) • In general, this is a place to hack the code in ways specific to your problem, and you can hack basically anything
Example Non-trivial Setup: TwoGamma • TwoGamma is for a simple test of advecting two fluids having different gammas to investigate whether an instability develops at the interface between the two fluids. • This Simulation implements: • Simulation_initSpecies.F90, because it has multiple fluids • and Grid_applyBCEdge.F90, because it needs custom boundary conditions on the lower x edge of the domain
TwoGamma Config File # configuration file for the TwoGamma target problem REQUIRES Driver REQUIRES physics/Hydro REQUIRES physics/Eos/EosMain/Multigamma REQUIRES Multispecies REQUESTS IO # Parameters D sim_p0 constant pressure PARAMETER sim_p0 REAL 2.5e-0 D sim_rho1 density of the first fluid PARAMETER sim_rho1 REAL 1.0e-0 D sim_rho2 density of the second fluid PARAMETER sim_rho2 REAL 1.0e-0 D sim_cvelx initial velocity PARAMETER sim_cvelx REAL 0.1e-0 SPECIES FLD1 SPECIES FLD2
TwoGamma flash.par # AMR parameters lrefine_max = 4 lrefine_min = 4 # simulation parameters basenm = "twogamma_" restart = .false. plotFileIntervalTime = 0.1 checkpointFileIntervalTime = 0.5 nend = 15000 tmax = 10.0 checkpointFileNumber = 0 plotFileNumber = 0 dtini = 1.e-10 dtmin = 1.e-10 cfl = .5 cvisc = .1
TwoGamma flash.par (Cont.) smlrho = 1.e-10 smallt = 1.e-10 xmin = 0.0e0 xmax = 1.0 ymin = 0.0e0 ymax = 1.0e0 geometry = "cartesian" # variables for plotting plot_var_1 = "dens" plot_var_2 = "temp" plot_var_3 = "ener" plot_var_4 = "pres" plot_var_5 = "velx" plot_var_6 = "fld1" plot_var_7 = "fld2" xl_boundary_type = "user" xr_boundary_type = "outflow" yl_boundary_type = "periodic" yr_boundary_type = "periodic"
TwoGamma Simulation_initSpecies.F90 subroutine Simulation_initSpecies() implicit none #include "Multispecies.h" #include "Flash.h" #include "Multispecies.h" #include "Multispecies_interface.h" call Multispecies_setProperty(FLD1_SPEC, A, 1.) call Multispecies_setProperty(FLD1_SPEC, Z, 1.) call Multispecies_setProperty(FLD1_SPEC, GAMMA, 1.66666666667e0) call Multispecies_setProperty(FLD2_SPEC, A, 4.0) call Multispecies_setProperty(FLD2_SPEC, Z, 2.0) call Multispecies_setProperty(FLD2_SPEC, GAMMA, 2.0) end subroutine Simulation_initSpecies
TwoGamma Grid_applyBCEdge.F90 if(face==LOW) then select case (bcType) case(OUTFLOW) do i = 1,guard dataRow(i)= dataRow(guard+1) end do case(USER_DEFINED) select case(var) case(GAMC_VAR) dataRow(1:guard)=sim_gammac1 case(DENS_VAR) dataRow(1:guard)=sim_rho1 case(PRES_VAR) dataRow(1:guard)=sim_p0 case(VELX_VAR) dataRow(1:guard)=sim_cvelx case(VELY_VAR) dataRow(1:guard)=0.0 case(VELZ_VAR) dataRow(1:guard)=0.0 case(ENER_VAR) dataRow(1:guard)=max(0.5*(sim_cvelx**2)+sim_int1,sim_small)
Fidlr (Flash idl Routines) 3.0 • 1 and 2d visualization • 2d slices of 3d data • Has idl routines to read the HDF5 and NetCDF Flash checkpoint and plotfiles. • xflash3: Gui frontend • Can call load routines from idl command line and manipulate checkpoint data interactively • Lives in tools/fidlr3.0 in your source
setenv XFLASH3_DIR flash-root-path/tools/fidlr3 setenv IDL_DIR idl-root-path setenv IDL_PATH ${XFLASH3_DIR}:${IDL_DIR}:${IDL_DIR}/lib Setting up and Running idl for fidlr • Setting up environment correctly very important • To get color, run idl with start_linux: • % idl start_linux • IDL> xflash3
fidlr Interactive Examples Read in density from file, put it on a uniform grid, and make a contour plot: IDL> dens = loaddata(‘sedov_2d_6lev_chk_0001’, ‘dens’, XCOORDS = x, YCOORDS=y) IDL> contour, dens, x, y Read in a dataset, with full AMR details: IDL> read_amr, ‘sedov_2d_6lev_hdf5_chk_0001’, $ TREE=tree, PARAMETERS=params, DATA=data, STORED_VARS=vars