SELF_MultiSetModel3D_t Module

A parent model that runs one DG model per element set and couples the sets at their shared faces.

The global mesh is split into nSets element sets (SELF_ElementSetMesh_3D). Set k gets its own sub-mesh, geometry and DG model, which may be any extension of DGModel3D: for example a fluid model on one set and a solid model on another. The parent extends Model, so the stock time integrators drive it: every stage calls the parent's CalculateTendency and UpdateGRKn, and the parent forwards them to each set.

Setup takes three steps, because user model types cannot be constructed generically:

  1. call ms%Init(globalMesh,interp,setOfElemLocal,nSets) builds the sub-meshes and geometries.
  2. On every rank and for every set k, including sets with no elements on that rank: allocate( :: ms%sets(k)%model) call ms%sets(k)%model%Init(ms%sets(k)%mesh,ms%sets(k)%geometry) then set the initial condition. Model Init is collective over the set's communicator (MapBoundaryConditions reduces over it), so no rank may skip a set.
  3. call ms%SetupInterfaces() checks the set models, builds the interface map and registers the interface boundary condition on each set model.

Interface faces. In each sub-mesh, a face shared with another set carries sideInfo(5) = SELF_BC_SET_INTERFACE. SetupInterfaces registers a no-op hyperbolic boundary condition for that id on every set model and maps boundary conditions again, so the faces count as mapped and nothing but the parent writes their exterior state.

Each stage, CalculateTendency 0. calls the parent's PreTendencyHook, 1. interpolates the solution of every set with interface faces on this rank to its element faces (BoundaryInterp), 2. exchanges the interface traces (SetInterface3D%Exchange), so iface%ghost holds the partner set's trace on every local interface face, 3. calls FillInterfaceBoundary(k) for each set k, which writes solution%extBoundary on set k's interface faces, 4. calls each set model's CalculateTendency. The default FillInterfaceBoundary copies the ghost trace unchanged and requires both sets to have the same nvar. Override it to couple sets whose variables differ.

Invariants: - Sets are processed in the same fixed order (k = 1..nSets) on every rank. - A set with no elements on a rank skips CalculateTendency and the solution updates on that rank. Set models must therefore not call collectives, or post messages on their mesh communicator, inside CalculateTendency or anything it calls (PreTendencyHook, boundary condition handlers). Every other forwarded procedure runs on every set, empty or not. - sets(:) must never be reassigned, reallocated or moved: each model stores pointers to its own mesh and geometry. - Solution gradients are not supported (gradient_enabled must be false on every set): the gradient exchange inside each set's CalculateTendency has no hook for interface faces. - Each sub-mesh owns a duplicate of the global mesh communicator, which Free releases.

Output. WriteModel writes one HDF5 file: /interp/... the shared interpolant /elementsets/setOfElem set id of every global element /set_/controlgrid/solution/ (Np,Np,Np,nGlobalElem_k) per variable /set_/controlgrid/geometry/_dim node coordinates, d = 1..3 with written as I4.4 and elements in set-global order. ReadModel reads the solutions back into a model built on the same partition.


Uses

  • module~~self_multisetmodel3d_t~~UsesGraph module~self_multisetmodel3d_t SELF_MultiSetModel3D_t module~self_dgmodel3d SELF_DGModel3D module~self_multisetmodel3d_t->module~self_dgmodel3d module~self_boundaryconditions SELF_BoundaryConditions module~self_multisetmodel3d_t->module~self_boundaryconditions module~self_lagrange~3 SELF_Lagrange module~self_multisetmodel3d_t->module~self_lagrange~3 module~self_setinterface_3d SELF_SetInterface_3D module~self_multisetmodel3d_t->module~self_setinterface_3d module~self_model SELF_Model module~self_multisetmodel3d_t->module~self_model module~self_mesh_3d SELF_Mesh_3D module~self_multisetmodel3d_t->module~self_mesh_3d mpi mpi module~self_multisetmodel3d_t->mpi HDF5 HDF5 module~self_multisetmodel3d_t->HDF5 module~self_elementsetmesh_3d SELF_ElementSetMesh_3D module~self_multisetmodel3d_t->module~self_elementsetmesh_3d module~self_multisetio_3d SELF_MultiSetIO_3D module~self_multisetmodel3d_t->module~self_multisetio_3d module~self_hdf5 SELF_HDF5 module~self_multisetmodel3d_t->module~self_hdf5 module~self_geometry_3d SELF_Geometry_3D module~self_multisetmodel3d_t->module~self_geometry_3d module~self_constants SELF_Constants module~self_multisetmodel3d_t->module~self_constants module~self_dgmodel3d->module~self_boundaryconditions module~self_dgmodel3d->module~self_mesh_3d module~self_dgmodel3d->module~self_geometry_3d module~self_gpuinterfaces SELF_GPUInterfaces module~self_dgmodel3d->module~self_gpuinterfaces module~self_transferplan_3d SELF_TransferPlan_3D module~self_dgmodel3d->module~self_transferplan_3d iso_fortran_env iso_fortran_env module~self_dgmodel3d->iso_fortran_env module~self_dgmodel3d_t SELF_DGModel3D_t module~self_dgmodel3d->module~self_dgmodel3d_t module~self_gpu SELF_GPU module~self_dgmodel3d->module~self_gpu module~self_supportroutines SELF_SupportRoutines module~self_boundaryconditions->module~self_supportroutines module~self_metadata SELF_Metadata module~self_boundaryconditions->module~self_metadata iso_c_binding iso_c_binding module~self_boundaryconditions->iso_c_binding module~self_lagrange~3->module~self_constants module~self_lagrange~3->iso_fortran_env module~self_lagrange~3->module~self_gpu module~self_lagrange~3->iso_c_binding module~self_lagrange_t SELF_Lagrange_t module~self_lagrange~3->module~self_lagrange_t module~self_setinterface_3d->module~self_mesh_3d module~self_setinterface_3d->module~self_constants module~self_setinterface_3d->module~self_gpu module~self_setinterface_3d->iso_c_binding module~self_setinterface_3d_t SELF_SetInterface_3D_t module~self_setinterface_3d->module~self_setinterface_3d_t module~self_model->HDF5 module~self_model->module~self_hdf5 FEQParse FEQParse module~self_model->FEQParse module~self_model->module~self_supportroutines module~self_model->module~self_metadata module~self_mesh_3d->module~self_gpu module~self_mesh_3d->iso_c_binding module~self_mesh_3d_t SELF_Mesh_3D_t module~self_mesh_3d->module~self_mesh_3d_t module~self_elementsetmesh_3d->module~self_mesh_3d module~self_elementsetmesh_3d->mpi module~self_elementsetmesh_3d->module~self_constants module~self_multisetio_3d->HDF5 module~self_multisetio_3d->module~self_constants module~self_hdf5->mpi module~self_hdf5->HDF5 module~self_hdf5->module~self_constants module~self_hdf5->iso_fortran_env module~self_geometry_3d->module~self_lagrange~3 module~self_geometry_3d->module~self_mesh_3d module~self_geometry_3d->module~self_constants module~self_scalar_3d SELF_Scalar_3D module~self_geometry_3d->module~self_scalar_3d module~self_tensor_3d~2 SELF_Tensor_3D module~self_geometry_3d->module~self_tensor_3d~2 module~self_vector_3d SELF_Vector_3D module~self_geometry_3d->module~self_vector_3d module~self_data SELF_Data module~self_geometry_3d->module~self_data module~self_geometry_3d->module~self_supportroutines module~self_constants->iso_fortran_env module~self_constants->iso_c_binding module~self_scalar_3d->module~self_constants module~self_scalar_3d->module~self_gpuinterfaces module~self_scalar_3d->module~self_gpu module~self_scalar_3d->iso_c_binding module~self_scalar_3d_t SELF_Scalar_3D_t module~self_scalar_3d->module~self_scalar_3d_t module~self_tensor_3d~2->module~self_constants module~self_tensor_3d~2->iso_fortran_env module~self_tensor_3d~2->module~self_gpu module~self_tensor_3d~2->iso_c_binding module~self_tensor_3d_t SELF_Tensor_3D_t module~self_tensor_3d~2->module~self_tensor_3d_t module~self_vector_3d->module~self_constants module~self_vector_3d->module~self_gpuinterfaces module~self_vector_3d->module~self_gpu module~self_vector_3d->iso_c_binding module~self_vector_3d_t SELF_Vector_3D_t module~self_vector_3d->module~self_vector_3d_t module~self_data->module~self_lagrange~3 module~self_data->HDF5 module~self_data->module~self_hdf5 module~self_data->module~self_constants module~self_data->FEQParse module~self_data->module~self_metadata module~self_data->iso_c_binding module~self_gpuinterfaces->module~self_gpu module~self_gpuinterfaces->iso_c_binding module~self_transferplan_3d->module~self_lagrange~3 module~self_transferplan_3d->module~self_constants module~self_solutiontransfer_3d SELF_SolutionTransfer_3D module~self_transferplan_3d->module~self_solutiontransfer_3d module~self_octreemesh_3d SELF_OctreeMesh_3D module~self_transferplan_3d->module~self_octreemesh_3d module~self_dgmodel3d_t->module~self_boundaryconditions module~self_dgmodel3d_t->module~self_model module~self_dgmodel3d_t->module~self_mesh_3d module~self_dgmodel3d_t->HDF5 module~self_dgmodel3d_t->module~self_hdf5 module~self_dgmodel3d_t->module~self_geometry_3d module~self_dgmodel3d_t->FEQParse module~self_dgmodel3d_t->module~self_transferplan_3d module~self_dgmodel3d_t->iso_fortran_env module~self_dgmodel3d_t->module~self_supportroutines module~self_dgmodel3d_t->module~self_metadata module~self_mappedvector_3d SELF_MappedVector_3D module~self_dgmodel3d_t->module~self_mappedvector_3d module~self_mappedscalar_3d~2 SELF_MappedScalar_3D module~self_dgmodel3d_t->module~self_mappedscalar_3d~2 module~self_transferplan_2d SELF_TransferPlan_2D module~self_dgmodel3d_t->module~self_transferplan_2d module~self_solutionmigration SELF_SolutionMigration module~self_dgmodel3d_t->module~self_solutionmigration module~self_gpu->iso_c_binding module~self_gpu_enums~2 SELF_GPU_enums module~self_gpu->module~self_gpu_enums~2 module~self_supportroutines->module~self_constants module~self_supportroutines->iso_fortran_env module~self_metadata->HDF5 module~self_metadata->module~self_hdf5 module~self_lagrange_t->HDF5 module~self_lagrange_t->module~self_hdf5 module~self_lagrange_t->module~self_constants module~self_lagrange_t->iso_fortran_env module~self_lagrange_t->module~self_supportroutines module~self_lagrange_t->iso_c_binding module~self_quadrature SELF_Quadrature module~self_lagrange_t->module~self_quadrature module~self_setinterface_3d_t->module~self_mesh_3d module~self_setinterface_3d_t->mpi module~self_setinterface_3d_t->module~self_constants module~self_setinterface_3d_t->iso_c_binding module~self_mesh_3d_t->module~self_lagrange~3 module~self_mesh_3d_t->HDF5 module~self_mesh_3d_t->module~self_hdf5 module~self_mesh_3d_t->module~self_constants module~self_mesh_3d_t->module~self_supportroutines module~self_mesh_3d_t->iso_c_binding module~self_mesh SELF_Mesh module~self_mesh_3d_t->module~self_mesh module~self_mesh_2d_t SELF_Mesh_2D_t module~self_mesh_3d_t->module~self_mesh_2d_t module~self_mesh_3d_t->module~self_quadrature module~self_domaindecomposition SELF_DomainDecomposition module~self_mesh_3d_t->module~self_domaindecomposition module~self_mesh->module~self_constants module~self_mesh->iso_c_binding module~self_mesh->module~self_domaindecomposition module~self_mesh_2d_t->module~self_lagrange~3 module~self_mesh_2d_t->HDF5 module~self_mesh_2d_t->module~self_hdf5 module~self_mesh_2d_t->module~self_constants module~self_mesh_2d_t->module~self_supportroutines module~self_mesh_2d_t->iso_c_binding module~self_mesh_2d_t->module~self_mesh module~self_mesh_2d_t->module~self_quadrature module~self_mesh_2d_t->module~self_domaindecomposition module~self_scalar_3d_t->module~self_lagrange~3 module~self_scalar_3d_t->HDF5 module~self_scalar_3d_t->module~self_hdf5 module~self_scalar_3d_t->module~self_constants module~self_scalar_3d_t->FEQParse module~self_scalar_3d_t->module~self_data module~self_scalar_3d_t->module~self_metadata module~self_scalar_3d_t->iso_c_binding module~self_datapool SELF_DataPool module~self_scalar_3d_t->module~self_datapool module~self_tensor_3d_t->module~self_lagrange~3 module~self_tensor_3d_t->HDF5 module~self_tensor_3d_t->module~self_hdf5 module~self_tensor_3d_t->module~self_constants module~self_tensor_3d_t->FEQParse module~self_tensor_3d_t->module~self_data module~self_tensor_3d_t->module~self_metadata module~self_tensor_3d_t->iso_c_binding module~self_tensor_3d_t->module~self_datapool module~self_vector_3d_t->module~self_lagrange~3 module~self_vector_3d_t->HDF5 module~self_vector_3d_t->module~self_hdf5 module~self_vector_3d_t->module~self_constants module~self_vector_3d_t->FEQParse module~self_vector_3d_t->module~self_data module~self_vector_3d_t->module~self_metadata module~self_vector_3d_t->iso_c_binding module~self_vector_3d_t->module~self_datapool module~self_solutiontransfer_3d->module~self_lagrange~3 module~self_solutiontransfer_3d->module~self_constants module~self_octreemesh_3d->module~self_lagrange~3 module~self_octreemesh_3d->module~self_mesh_3d module~self_octreemesh_3d->module~self_constants module~self_refinementprimitives_3d SELF_RefinementPrimitives_3D module~self_octreemesh_3d->module~self_refinementprimitives_3d module~self_mappedvector_3d->module~self_gpuinterfaces module~self_mappedvector_3d->module~self_gpu module~self_mappedvector_3d->iso_c_binding module~self_mappedvector_3d_t SELF_MappedVector_3D_t module~self_mappedvector_3d->module~self_mappedvector_3d_t module~self_mappedscalar_3d~2->module~self_gpuinterfaces module~self_mappedscalar_3d~2->module~self_gpu module~self_mappedscalar_3d~2->iso_c_binding module~self_mappedscalar_3d_t SELF_MappedScalar_3D_t module~self_mappedscalar_3d~2->module~self_mappedscalar_3d_t module~self_transferplan_2d->module~self_lagrange~3 module~self_transferplan_2d->module~self_constants module~self_quadtreemesh_2d SELF_QuadTreeMesh_2D module~self_transferplan_2d->module~self_quadtreemesh_2d module~self_solutiontransfer_2d SELF_SolutionTransfer_2D module~self_transferplan_2d->module~self_solutiontransfer_2d module~self_solutionmigration->mpi module~self_solutionmigration->module~self_constants module~self_solutionmigration->iso_fortran_env module~self_solutionmigration->module~self_domaindecomposition module~self_gpu_enums~2->iso_c_binding module~self_quadrature->module~self_constants module~self_quadrature->iso_fortran_env module~self_domaindecomposition->mpi module~self_domaindecomposition->iso_fortran_env module~self_domaindecomposition->iso_c_binding module~self_domaindecomposition_t SELF_DomainDecomposition_t module~self_domaindecomposition->module~self_domaindecomposition_t module~self_datapool->module~self_constants module~self_quadtreemesh_2d->module~self_lagrange~3 module~self_quadtreemesh_2d->module~self_constants module~self_refinementprimitives_2d SELF_RefinementPrimitives_2D module~self_quadtreemesh_2d->module~self_refinementprimitives_2d module~self_mesh_2d SELF_Mesh_2D module~self_quadtreemesh_2d->module~self_mesh_2d module~self_mappedvector_3d_t->module~self_lagrange~3 module~self_mappedvector_3d_t->module~self_mesh_3d module~self_mappedvector_3d_t->module~self_geometry_3d module~self_mappedvector_3d_t->module~self_constants module~self_mappedvector_3d_t->FEQParse module~self_mappedvector_3d_t->iso_c_binding module~self_mappedvector_3d_t->module~self_domaindecomposition module~self_refinementprimitives_3d->module~self_lagrange~3 module~self_refinementprimitives_3d->module~self_constants module~self_mappedscalar_3d_t->module~self_lagrange~3 module~self_mappedscalar_3d_t->module~self_mesh_3d module~self_mappedscalar_3d_t->module~self_geometry_3d module~self_mappedscalar_3d_t->module~self_constants module~self_mappedscalar_3d_t->module~self_scalar_3d module~self_mappedscalar_3d_t->module~self_tensor_3d~2 module~self_mappedscalar_3d_t->FEQParse module~self_mappedscalar_3d_t->iso_c_binding module~self_mappedscalar_3d_t->module~self_domaindecomposition module~self_solutiontransfer_2d->module~self_lagrange~3 module~self_solutiontransfer_2d->module~self_constants module~self_domaindecomposition_t->module~self_lagrange~3 module~self_domaindecomposition_t->mpi module~self_domaindecomposition_t->module~self_constants module~self_domaindecomposition_t->module~self_supportroutines module~self_domaindecomposition_t->iso_c_binding module~self_refinementprimitives_2d->module~self_lagrange~3 module~self_refinementprimitives_2d->module~self_constants module~self_mesh_2d->module~self_gpu module~self_mesh_2d->iso_c_binding module~self_mesh_2d->module~self_mesh_2d_t

Used by

  • module~~self_multisetmodel3d_t~~UsedByGraph module~self_multisetmodel3d_t SELF_MultiSetModel3D_t module~self_multisetmodel3d SELF_MultiSetModel3D module~self_multisetmodel3d->module~self_multisetmodel3d_t module~self_multisetmodel3d~2 SELF_MultiSetModel3D module~self_multisetmodel3d~2->module~self_multisetmodel3d_t

Contents


Derived Types

type, public :: ElementSet3D

One element set: its sub-mesh, geometry and model. The mesh and geometry live on the heap so the pointers the model stores to them stay valid.

Components

TypeVisibilityAttributesNameInitial
integer, public :: comm =MPI_COMM_NULL
type(SEMHex), public, pointer:: geometry=> null()

Duplicate of the global mesh communicator, used by this set's decomposition. Owned by the parent and freed after the sub-mesh.

type(Mesh3D), public, pointer:: mesh=> null()
class(DGModel3D), public, allocatable:: model

type, public, extends(Model) :: MultiSetModel3D_t

Components

TypeVisibilityAttributesNameInitial
real(kind=prec), public :: dt
real(kind=prec), public :: entropy
type(Mesh3D), public, pointer:: globalMesh=> null()

Set id of every global element, s(e), e = 1..nGlobalElem (replicated).

logical, public :: gradient_enabled =.false.
type(SetInterface3D), public :: iface

Each set's solution%boundary, the trace the interface exchange sends.

logical, public :: interfacesReady =.false.
integer, public :: ioIterate =0
integer, public :: nInterfaceFaces =0

Interface map and ghost traces; built by SetupInterfaces.

integer, public :: nSets =0
integer, public :: nstepped =0
integer, public :: nvar
logical, public :: prescribed_bcs_enabled =.true.
integer, public, allocatable:: setGlobalId(:)

Number of set-k elements on lower ranks, k = 1..nSets.

integer, public, allocatable:: setOfElem(:)

Set-global id g_k(e) of every global element within its own set (replicated).

integer, public, allocatable:: setOffsetThisRank(:)

Number of interface faces summed over all sets and all ranks.

type(ElementSet3D), public, allocatable:: sets(:)

The global mesh the sets were extracted from. Not owned.

real(kind=prec), public :: t
logical, public :: tecplot_enabled =.true.
procedure(SELF_timeIntegrator), public, pointer:: timeIntegrator=> Euler_timeIntegrator
type(SetTraceRef), public, allocatable:: traces(:)

Type-Bound Procedures

procedure, public :: AdditionalFree => AdditionalFree_Model
procedure, public :: AdditionalInit => AdditionalInit_Model
procedure, public :: AdditionalOutput => AdditionalOutput_Model
procedure, public :: CalculateEntropy => CalculateEntropy_MultiSetModel3D_t
procedure, public :: CalculateTendency => CalculateTendency_MultiSetModel3D_t
procedure, public :: Euler_timeIntegrator
procedure, public :: FillInterfaceBoundary => FillInterfaceBoundary_MultiSetModel3D_t
procedure, public :: ForwardStep => ForwardStep_Model
procedure, public :: Free => Free_MultiSetModel3D_t
procedure, public :: GetSimulationTime
procedure, public :: IncrementIOCounter => IncrementIOCounter_MultiSetModel3D_t
procedure, public :: Init => Init_MultiSetModel3D_t
procedure, public :: LowStorageRK2_timeIntegrator
procedure, public :: LowStorageRK3_timeIntegrator
procedure, public :: LowStorageRK4_timeIntegrator
procedure, public :: PostStepHook => PostStepHook_MultiSetModel3D_t
procedure, public :: PreStepHook => PreStepHook_MultiSetModel3D_t
procedure, public :: PreTendencyHook => PreTendencyHook_Model
procedure, public :: PrintType => PrintType_Model
procedure, public :: ReadModel => Read_MultiSetModel3D_t
procedure, public :: ReportEntropy => ReportEntropy_Model
procedure, public :: ReportMetrics => ReportMetrics_MultiSetModel3D_t
procedure, public :: ReportUnmappedBoundaries => ReportUnmappedBoundaries_MultiSetModel3D_t
procedure, public :: ReportUserMetrics => ReportUserMetrics_Model
procedure, public :: SetNumberOfVariables => SetNumberOfVariables_Model
procedure, public :: SetSimulationTime
generic, public :: SetTimeIntegrator => SetTimeIntegrator_withChar
procedure, public :: SetupInterfaces => SetupInterfaces_MultiSetModel3D_t
procedure, private :: SyncSetClocks
procedure, public :: UpdateGRK2 => UpdateGRK2_MultiSetModel3D_t
procedure, public :: UpdateGRK3 => UpdateGRK3_MultiSetModel3D_t
procedure, public :: UpdateGRK4 => UpdateGRK4_MultiSetModel3D_t
procedure, public :: UpdateSolution => UpdateSolution_MultiSetModel3D_t
procedure, public :: WriteModel => Write_MultiSetModel3D_t
procedure, public :: WriteTecplot => WriteTecplot_MultiSetModel3D_t
procedure, public :: entropy_func => entropy_func_Model
procedure, public :: flux1D => flux1d_Model
procedure, public :: flux2D => flux2d_Model
procedure, public :: flux3D => flux3d_Model
procedure, public :: riemannflux1d => riemannflux1d_Model
procedure, public :: riemannflux2d => riemannflux2d_Model
procedure, public :: riemannflux3d => riemannflux3d_Model
procedure, public :: source1d => source1d_Model
procedure, public :: source2d => source2d_Model
procedure, public :: source3d => source3d_Model

Subroutines

public subroutine CalculateEntropy_MultiSetModel3D_t(this)

entropy = sum over sets k of the entropy of set k. Each set's CalculateEntropy is collective over its communicator, so it runs on every set, empty or not.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this

public subroutine CalculateTendency_MultiSetModel3D_t(this)

Exchange interface traces, fill the interface exterior states, then compute the tendency of every set with elements on this rank, in set order. See the module documentation for the stage order.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this

public subroutine FillInterfaceBoundary_MultiSetModel3D_t(this, iset)

Write solution%extBoundary on the interface faces of set iset from the ghost traces of the last exchange:

Read more…

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this
integer, intent(in) :: iset

public subroutine Free_MultiSetModel3D_t(this)

Free the interface map, then every set's model, geometry and sub-mesh, then the sub-mesh communicators. The global mesh is not owned and is left alone. Collective.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this

public subroutine IncrementIOCounter_MultiSetModel3D_t(this)

Advance the output counter of the parent and of every set.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this

public subroutine Init_MultiSetModel3D_t(this, globalMesh, interp, setOfElemLocal, nSets)

Split globalMesh into nSets element sets and build each set's sub-mesh and geometry. The set models are not created here; see the module documentation.

Read more…

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(out) :: this
type(Mesh3D), intent(in), target:: globalMesh
type(Lagrange), intent(in), pointer:: interp
integer, intent(in) :: setOfElemLocal(1:globalMesh%nElem)
integer, intent(in) :: nSets

public subroutine PostStepHook_MultiSetModel3D_t(this)

Run every set's PostStepHook, empty sets included, after syncing the set clocks.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this

public subroutine PreStepHook_MultiSetModel3D_t(this)

Run every set's PreStepHook, empty sets included, after syncing the set clocks.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this

public subroutine Read_MultiSetModel3D_t(this, filename)

Read every set's solution from a file written by WriteModel, then copy it to the device. The file must hold the same element-set partition (setOfElem) and the same number of nodes per element; a variable with no dataset keeps its current value. The host copy is refreshed from the device first, so on GPU builds that value is the device's.

Read more…

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this
character, intent(in) :: filename

public subroutine ReportMetrics_MultiSetModel3D_t(this)

Report each set's metrics. Rank-local; sets with no elements on this rank are skipped, since their min and max are undefined.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this

Report unmapped boundary faces for every set. The counts are already global.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this

public subroutine ReserveSetMessages(mesh, nvar)

Reserve mesh%decomp's request scratch for the largest scalar exchange a set with nvar variables posts: 2*nvar messages per rank-remote conforming side, mortar sub-side or anisotropic mortar half. Rank-local; no communication.

Arguments

TypeIntentOptionalAttributesName
type(Mesh3D), intent(inout) :: mesh
integer, intent(in) :: nvar

public subroutine SetupInterfaces_MultiSetModel3D_t(this)

Finish setup once every set model has been allocated and initialized.

Read more…

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this

public subroutine SyncSetClocks(this)

Copy the parent's simulation time and time step to every set model.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this

public subroutine UpdateGRK2_MultiSetModel3D_t(this, m)

Stage m of the low-storage RK2 update, for every set with elements on this rank.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this
integer, intent(in) :: m

public subroutine UpdateGRK3_MultiSetModel3D_t(this, m)

Stage m of the low-storage RK3 update, for every set with elements on this rank.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this
integer, intent(in) :: m

public subroutine UpdateGRK4_MultiSetModel3D_t(this, m)

Stage m of the low-storage RK4 update, for every set with elements on this rank.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this
integer, intent(in) :: m

public subroutine UpdateSolution_MultiSetModel3D_t(this, dt)

Forward-Euler update of every set with elements on this rank. dt defaults to the parent's time step.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this
real(kind=prec), intent(in), optional :: dt

public subroutine WriteTecplot_MultiSetModel3D_t(this, filename)

Write one rank-local Tecplot file per set with elements on this rank.

Read more…

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this
character, intent(in), optional :: filename

public subroutine Write_MultiSetModel3D_t(this, filename)

Write every set's solution and geometry to one HDF5 file; see the module documentation for the layout. Without filename the file is solution..h5, as for a single model.

Read more…

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this
character, intent(in), optional :: filename

public subroutine hbc3d_SetInterface_MultiSetModel3D(bc, mymodel)

Boundary condition for SELF_BC_SET_INTERFACE faces. It writes nothing: the parent fills solution%extBoundary on these faces before each set's CalculateTendency. Registering it keeps the faces out of the unmapped-boundary count.

Arguments

TypeIntentOptionalAttributesName
class(BoundaryCondition), intent(in) :: bc
class(Model), intent(inout) :: mymodel