LaMEM
In order to generate geodynamic simulations from setups created with GeophysicalModelGenerator.jl
, we provide a few routines that directly create marker input files for the 3D geodynamic modelling software LaMEM, which is an open-source cartesian code to perform crustal and lithospheric-scale simulations. If you want to learn how to run LaMEM simulations, the easiest way to get started is by looking at LaMEM.jl which is integrated with GMG
The routines provided here have the following functionality:
- Read LaMEM *.dat files (to get the size of the domain)
- Read LaMEM processor partitioning file
- Save LaMEM marker files in serial or in parallel
- Read a LaMEM timestep
GeophysicalModelGenerator.read_LaMEM_inputfile
— FunctionGrid::LaMEM_grid = read_LaMEM_inputfile(file, args::Union{String,Nothing}=nothing)
Parses a LaMEM input file and stores grid information in the Grid
structure. Optionally, you can pass LaMEM command-line arguments as well.
Example 1
julia> Grid = read_LaMEM_inputfile("SaltModels.dat")
LaMEM Grid:
nel : (32, 32, 32)
marker/cell : (3, 3, 3)
markers : (96, 96, 96)
x ϵ [-3.0 : 3.0]
y ϵ [-2.0 : 2.0]
z ϵ [-2.0 : 0.0]
Example 2 (with command-line arguments)
julia> Grid = read_LaMEM_inputfile("SaltModels.dat", args="-nel_x 64 -coord_x -4,4")
LaMEM Grid:
nel : (64, 32, 32)
marker/cell : (3, 3, 3)
markers : (192, 96, 96)
x ϵ [-4.0 : 4.0]
y ϵ [-2.0 : 2.0]
z ϵ [-2.0 : 0.0]
GeophysicalModelGenerator.get_processor_partitioning
— FunctionnProcX,nProcY,nProcZ, xc,yc,zc, nNodeX,nNodeY,nNodeZ = get_processor_partitioning(filename; is64bit=false)
Reads a LaMEM processor partitioning file, used to create marker files, and returns the parallel layout. By default this is done for a 32bit PETSc installation, which will fail if you actually use a 64bit version.
GeophysicalModelGenerator.save_LaMEM_topography
— Functionsave_LaMEM_topography(Topo::CartData, filename::String)
This writes a topography file Topo
for use in LaMEM, which should have size (nx,ny,1)
and contain the field :Topography
GeophysicalModelGenerator.save_LaMEM_markers_parallel
— Functionsave_LaMEM_markers_parallel(Grid::CartData; PartitioningFile=empty, directory="./markers", verbose=true, is64bit=false)
Saves a LaMEM marker file from the CartData
structure Grid
. It must have a field called Phases
, holding phase information (as integers) and optionally a field Temp
with temperature info. It is possible to provide a LaMEM partitioning file PartitioningFile
. If not, output is assumed to be for one processor. By default it is assumed that the partitioning file was generated on a 32bit PETSc installation. If Int64
was used instead, set the flag.
The size of Grid
should be consistent with what is provided in the LaMEM input file. In practice, the size of the mesh can be retrieved from a LaMEM input file using read_LaMEM_inputfile
.
Example
julia> Grid = read_LaMEM_inputfile("LaMEM_input_file.dat")
julia> Phases = zeros(Int32,size(Grid.X));
julia> Temp = ones(Float64,size(Grid.X));
julia> Model3D = CartData(Grid, (Phases=Phases,Temp=Temp))
julia> save_LaMEM_markers_parallel(Model3D)
Writing LaMEM marker file -> ./markers/mdb.00000000.dat
If you want to create a LaMEM input file for multiple processors:
julia> save_LaMEM_markers_parallel(Model3D, PartitioningFile="ProcessorPartitioning_4cpu_1.2.2.bin")
Writing LaMEM marker file -> ./markers/mdb.00000000.dat
Writing LaMEM marker file -> ./markers/mdb.00000001.dat
Writing LaMEM marker file -> ./markers/mdb.00000002.dat
Writing LaMEM marker file -> ./markers/mdb.00000003.dat
GeophysicalModelGenerator.read_data_PVTR
— FunctionData::ParaviewData = read_data_PVTR(fname, dir)
Reads a parallel, rectilinear, *.vts
file with the name fname
and located in dir
and create a 3D Data
struct from it.
Example
julia> Data = read_data_PVTR("Haaksbergen.pvtr", "./Timestep_00000005_3.35780500e-01/")
ParaviewData
size : (33, 33, 33)
x ϵ [ -3.0 : 3.0]
y ϵ [ -2.0 : 2.0]
z ϵ [ -2.0 : 0.0]
fields: (:phase, :density, :visc_total, :visc_creep, :velocity, :pressure, :temperature, :dev_stress, :strain_rate, :j2_dev_stress, :j2_strain_rate, :plast_strain, :plast_dissip, :tot_displ, :yield, :moment_res, :cont_res)
GeophysicalModelGenerator.LaMEM_grid
— TypeStructure that holds information about the LaMEM grid (usually read from an input file).
GeophysicalModelGenerator.create_partitioning_file
— Functioncreate_partitioning_file(LaMEM_input::String, NumProc::Int64; LaMEM_dir::String=pwd(), LaMEM_options::String="", MPI_dir="", verbose=true)
This executes LaMEM for the input file LaMEM_input
& creates a parallel partitioning file for NumProc
processors. The directory where the LaMEM binary is can be specified; if not it is assumed to be in the current directory. Likewise for the mpiexec
directory (if not specified it is assumed to be available on the command line).