The Uniform Grid has the same resolution in all the blocks throughout the domain, and each processor has exactly one block. The uniform grid can operate in either of two modes: fixed block size (FIXEDBLOCKSIZE) mode, and non-fixed block size (NONFIXEDBLOCKSIZE) mode. The default fixed block size grid is statically defined at compile time and can therefore take advantage of compile-time optimizations. The non-fixed block size version uses dynamic memory allocation of grid variables.
./setup Sod -auto -3d -nxb=12 -nyb=12 -nzb=4 +ug
mpirun -np 16 flash3
At Grid initialization time, the domain is created and the communication machinery is also generated. This initialization includes MPI communicators and datatypes for directional guardcell exchanges. If we view processors as arranged in a three-dimensional processor grid, then a row of processors along each dimension becomes a part of the same communicator. We also define MPI datatypes for each of these communicators, which describe the layout of the block on the processor to MPI. The communicators and datatypes, once generated, persist for the entire run of the application. Thus the MPI_SEND/RECV function with specific communicator and its corresponding datatype is able to carry out all data exchange for guardcell fill in the selected direction in a single step.
Since all blocks exist at the same resolution in the Uniform Grid, there is no need for interpolation while filling the guardcells. Simple exchange of correct data between processors, and the application of boundary conditions where needed is sufficient. The guard cells along the face of a block are filled with the layers of the interior cells of the block on the neighboring processor if that face is shared with another block, or calculated based upon the boundary conditions if the face is on the physical domain boundary. Also, because there are no jumps in refinement in the Uniform Grid, the flux conservation step across processor boundaries is unnecessary. For correct functioning of the Uniform Grid in FLASH, this conservation step should be explicitly turned off with a runtime parameter flux_correct which controls whether or not to run the flux conservation step in the PPM Hydrodynamics implementation. AMR sets it by default to true, while UG sets it to false. Users should exercise care if they wish to override the defaults via their “flash.par” file.
./setup Sod -3d -auto -nofbs
./setup Sod -3d -auto +nofbs
In this mode, the blocksize in UG is determined at execution
from runtime parameters iGridSize,
jGridSize and
kGridSize. These parameters specify the global
number of grid points in the computational domain along each
dimension. The blocksize then is
.
Unlike FIXEDBLOCKSIZE mode, where memory is allocated
at compile time, in the NONFIXEDBLOCKSIZE
mode all memory
allocation is dynamic. The global data structures are allocated when
the simulation initializes and deallocated when the simulation
finalizes, whereas the local scratch space is allocated and
deallocated every time a unit is invoked in the simulation. Clearly
there is a trade-off between flexibility and performance as the
NONFIXEDBLOCKSIZE mode typically runs about 10-15% slower. We
support both to give choice to the users. The amount of memory
consumed by the Grid data structure of the Uniform Grid is
irrespective of the mode. Note that this is not the total amount of
memory used by the code, since fluxes, temporary variables, coordinate
information and scratch space also consume a large amount of memory.
The example shown below gives two possible ways to define parameters
in flash.par for a 3d problem of global domain size
, being run on 8 processors.
iprocs = 2 jprocs = 2 kprocs = 2 iGridSize = 64 jGridSize = 64 kGridSize = 64
iprocs = 4 jprocs = 2 kprocs = 1