SELF_AMRController_Extruded Module

Adaptive-mesh-refinement controller for models on EXTRUDED meshes: a 2-D quadtree on the surface, with every column extruded through the same nz layers. One call to Adapt performs one adaptation epoch between time steps, carrying a 3-D model on the extruded mesh and, optionally, a 2-D model on the surface mesh it was extruded from:

  1. estimate - the 3-D modal-decay indicator flags every element of the 3-D model, and each column takes the strongest request: refine if any of its layers asks, coarsen only if all of them agree, keep otherwise;
  2. cap, halo - as in AMRController2D: refine flags at maxLevel are demoted, and refine flags spread to face-neighbouring columns for nHalo passes;
  3. mutate - AdaptFromFlags + Balance2to1 update the surface forest; an unchanged leaf set ends the epoch with both models untouched;
  4. rebuild - EmitMesh produces the new surface mesh (with 2:1 mortar edges), the caller's levels procedure fills the level heights z_k at its geometry nodes, and ExtrudedMesh builds the new 3-D mesh (whose lateral faces between columns of different levels become anisotropic mortars);
  5. transfer - the 2-D transfer plan of the forest drives both models: the 2-D model through its own ApplyTransferPlan, and the 3-D model through ApplyExtrudedTransferPlan, which applies the plan to every layer of a column (the surface operator tensored with the identity in zeta).

The levels procedure is called with each new surface mesh because the levels depend on the position of the surface nodes: with terrain-following levels, refinement samples the bathymetry at the new nodes (ExtrudedSigmaLevels and ExtrudedHybridLevels are the usual bodies). It must return levels that are continuous across lateral faces, as ExtrudedMesh requires.

MPI: as in AMRController2D, the forest is rank-replicated, the column flags are allgathered once per epoch, and EmitMesh re-decomposes the new surface leaves into contiguous ranges. Columns never straddle ranks, so the 3-D decomposition is the surface one expanded by nz and the 2-D migration windows (PlanWindows) become 3-D windows by the same factor. The 3-D model migrates point-to-point with MigrateOldWindow_DGModel3D_t; the 2-D model with its own MigrateOldWindow.

Backends: the 3-D model always stages and migrates through the portable host routines of DGModel3D_t (called by name), because the extruded apply reads host data; on a GPU build that means one device-to-host and one host-to-device copy of the 3-D field per adaptation epoch. The 2-D model uses its backend's own transfer. Nothing is added to the time-stepping loop.

Ownership: the caller's base surface mesh, extruded mesh and geometries are never freed here; the base surface mesh must outlive the controller (it supplies the boundary-condition metadata and the communicator for every emitted mesh). Meshes and geometries emitted by an epoch are owned by the controller and freed when they are replaced or by Free.


Uses

  • module~~self_amrcontroller_extruded~~UsesGraph module~self_amrcontroller_extruded SELF_AMRController_Extruded module~self_dgmodel3d_t SELF_DGModel3D_t module~self_amrcontroller_extruded->module~self_dgmodel3d_t iso_fortran_env iso_fortran_env module~self_amrcontroller_extruded->iso_fortran_env module~self_lagrange~3 SELF_Lagrange module~self_amrcontroller_extruded->module~self_lagrange~3 module~self_adaptivemesh_2d SELF_AdaptiveMesh_2D module~self_amrcontroller_extruded->module~self_adaptivemesh_2d module~self_mesh_2d SELF_Mesh_2D module~self_amrcontroller_extruded->module~self_mesh_2d module~self_mesh_3d SELF_Mesh_3D module~self_amrcontroller_extruded->module~self_mesh_3d module~self_amrcontroller_2d SELF_AMRController_2D module~self_amrcontroller_extruded->module~self_amrcontroller_2d module~self_transferplan_2d SELF_TransferPlan_2D module~self_amrcontroller_extruded->module~self_transferplan_2d module~self_quadtreemesh_2d SELF_QuadTreeMesh_2D module~self_amrcontroller_extruded->module~self_quadtreemesh_2d mpi mpi module~self_amrcontroller_extruded->mpi module~self_geometry_2d SELF_Geometry_2D module~self_amrcontroller_extruded->module~self_geometry_2d module~self_geometry_3d SELF_Geometry_3D module~self_amrcontroller_extruded->module~self_geometry_3d module~self_constants SELF_Constants module~self_amrcontroller_extruded->module~self_constants module~self_refinementindicator_3d~2 SELF_RefinementIndicator_3D module~self_amrcontroller_extruded->module~self_refinementindicator_3d~2 module~self_dgmodel2d_t SELF_DGModel2D_t module~self_amrcontroller_extruded->module~self_dgmodel2d_t module~self_dgmodel3d_t->iso_fortran_env module~self_dgmodel3d_t->module~self_mesh_3d module~self_dgmodel3d_t->module~self_transferplan_2d module~self_dgmodel3d_t->module~self_geometry_3d module~self_mappedscalar_3d~2 SELF_MappedScalar_3D module~self_dgmodel3d_t->module~self_mappedscalar_3d~2 module~self_model SELF_Model module~self_dgmodel3d_t->module~self_model module~self_hdf5 SELF_HDF5 module~self_dgmodel3d_t->module~self_hdf5 module~self_boundaryconditions SELF_BoundaryConditions module~self_dgmodel3d_t->module~self_boundaryconditions module~self_transferplan_3d SELF_TransferPlan_3D module~self_dgmodel3d_t->module~self_transferplan_3d module~self_metadata SELF_Metadata module~self_dgmodel3d_t->module~self_metadata module~self_mappedvector_3d SELF_MappedVector_3D module~self_dgmodel3d_t->module~self_mappedvector_3d module~self_supportroutines SELF_SupportRoutines module~self_dgmodel3d_t->module~self_supportroutines FEQParse FEQParse module~self_dgmodel3d_t->FEQParse HDF5 HDF5 module~self_dgmodel3d_t->HDF5 module~self_solutionmigration SELF_SolutionMigration module~self_dgmodel3d_t->module~self_solutionmigration module~self_lagrange~3->iso_fortran_env module~self_lagrange~3->module~self_constants module~self_lagrange_t SELF_Lagrange_t module~self_lagrange~3->module~self_lagrange_t module~self_gpu SELF_GPU module~self_lagrange~3->module~self_gpu iso_c_binding iso_c_binding module~self_lagrange~3->iso_c_binding module~self_adaptivemesh_2d->module~self_lagrange~3 module~self_adaptivemesh_2d->module~self_mesh_2d module~self_adaptivemesh_2d->module~self_quadtreemesh_2d module~self_adaptivemesh_2d->module~self_constants module~self_refinementprimitives_2d SELF_RefinementPrimitives_2D module~self_adaptivemesh_2d->module~self_refinementprimitives_2d module~self_mesh_2d->module~self_gpu module~self_mesh_2d_t SELF_Mesh_2D_t module~self_mesh_2d->module~self_mesh_2d_t module~self_mesh_2d->iso_c_binding module~self_mesh_3d_t SELF_Mesh_3D_t module~self_mesh_3d->module~self_mesh_3d_t module~self_mesh_3d->module~self_gpu module~self_mesh_3d->iso_c_binding module~self_amrcontroller_2d->iso_fortran_env module~self_amrcontroller_2d->module~self_lagrange~3 module~self_amrcontroller_2d->module~self_adaptivemesh_2d module~self_amrcontroller_2d->module~self_mesh_2d module~self_amrcontroller_2d->module~self_transferplan_2d module~self_amrcontroller_2d->module~self_quadtreemesh_2d module~self_amrcontroller_2d->mpi module~self_amrcontroller_2d->module~self_geometry_2d module~self_amrcontroller_2d->module~self_constants module~self_amrcontroller_2d->module~self_dgmodel2d_t module~self_refinementindicator_2d SELF_RefinementIndicator_2D module~self_amrcontroller_2d->module~self_refinementindicator_2d module~self_amrcontroller_2d->module~self_solutionmigration module~self_domaindecomposition SELF_DomainDecomposition module~self_amrcontroller_2d->module~self_domaindecomposition module~self_transferplan_2d->module~self_lagrange~3 module~self_transferplan_2d->module~self_quadtreemesh_2d module~self_transferplan_2d->module~self_constants module~self_solutiontransfer_2d SELF_SolutionTransfer_2D module~self_transferplan_2d->module~self_solutiontransfer_2d module~self_quadtreemesh_2d->module~self_lagrange~3 module~self_quadtreemesh_2d->module~self_mesh_2d module~self_quadtreemesh_2d->module~self_constants module~self_quadtreemesh_2d->module~self_refinementprimitives_2d module~self_geometry_2d->module~self_lagrange~3 module~self_geometry_2d->module~self_mesh_2d module~self_geometry_2d->module~self_constants module~self_geometry_2d->module~self_supportroutines module~self_data SELF_Data module~self_geometry_2d->module~self_data module~self_scalar_2d SELF_Scalar_2D module~self_geometry_2d->module~self_scalar_2d module~self_vector_2d~2 SELF_Vector_2D module~self_geometry_2d->module~self_vector_2d~2 module~self_tensor_2d~2 SELF_Tensor_2D module~self_geometry_2d->module~self_tensor_2d~2 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_vector_3d SELF_Vector_3D module~self_geometry_3d->module~self_vector_3d module~self_tensor_3d~2 SELF_Tensor_3D module~self_geometry_3d->module~self_tensor_3d~2 module~self_scalar_3d SELF_Scalar_3D module~self_geometry_3d->module~self_scalar_3d module~self_geometry_3d->module~self_supportroutines module~self_geometry_3d->module~self_data module~self_constants->iso_fortran_env module~self_constants->iso_c_binding module~self_refinementindicator_3d~2->module~self_constants module~self_refinementindicator_3d_t SELF_RefinementIndicator_3D_t module~self_refinementindicator_3d~2->module~self_refinementindicator_3d_t module~self_refinementindicator_3d~2->module~self_scalar_3d module~self_refinementindicator_3d~2->module~self_gpu module~self_refinementindicator_3d~2->iso_c_binding module~self_gpuinterfaces SELF_GPUInterfaces module~self_refinementindicator_3d~2->module~self_gpuinterfaces module~self_dgmodel2d_t->iso_fortran_env module~self_dgmodel2d_t->module~self_mesh_2d module~self_dgmodel2d_t->module~self_transferplan_2d module~self_dgmodel2d_t->module~self_geometry_2d module~self_dgmodel2d_t->module~self_model module~self_dgmodel2d_t->module~self_hdf5 module~self_dgmodel2d_t->module~self_boundaryconditions module~self_dgmodel2d_t->module~self_metadata module~self_mappedvector_2d SELF_MappedVector_2D module~self_dgmodel2d_t->module~self_mappedvector_2d module~self_mappedscalar_2d~2 SELF_MappedScalar_2D module~self_dgmodel2d_t->module~self_mappedscalar_2d~2 module~self_dgmodel2d_t->module~self_supportroutines module~self_dgmodel2d_t->FEQParse module~self_dgmodel2d_t->HDF5 module~self_dgmodel2d_t->module~self_solutionmigration module~self_vector_3d->module~self_constants module~self_vector_3d->module~self_gpu module~self_vector_3d->iso_c_binding module~self_vector_3d->module~self_gpuinterfaces module~self_vector_3d_t SELF_Vector_3D_t module~self_vector_3d->module~self_vector_3d_t module~self_tensor_3d~2->iso_fortran_env module~self_tensor_3d~2->module~self_constants 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_lagrange_t->iso_fortran_env module~self_lagrange_t->module~self_constants module~self_lagrange_t->module~self_hdf5 module~self_lagrange_t->module~self_supportroutines module~self_lagrange_t->HDF5 module~self_lagrange_t->iso_c_binding module~self_quadrature SELF_Quadrature module~self_lagrange_t->module~self_quadrature module~self_refinementindicator_2d->module~self_constants module~self_refinementindicator_2d->module~self_gpu module~self_refinementindicator_2d->iso_c_binding module~self_refinementindicator_2d->module~self_scalar_2d module~self_refinementindicator_2d->module~self_gpuinterfaces module~self_refinementindicator_2d_t SELF_RefinementIndicator_2D_t module~self_refinementindicator_2d->module~self_refinementindicator_2d_t module~self_mesh_3d_t->module~self_lagrange~3 module~self_mesh_3d_t->module~self_constants module~self_mesh_3d_t->module~self_hdf5 module~self_mesh_3d_t->module~self_mesh_2d_t module~self_mesh_3d_t->module~self_supportroutines module~self_mesh_3d_t->HDF5 module~self_mesh_3d_t->iso_c_binding module~self_mesh_3d_t->module~self_domaindecomposition module~self_mesh SELF_Mesh module~self_mesh_3d_t->module~self_mesh module~self_mesh_3d_t->module~self_quadrature module~self_refinementprimitives_2d->module~self_lagrange~3 module~self_refinementprimitives_2d->module~self_constants module~self_mappedscalar_3d~2->module~self_gpu module~self_mappedscalar_3d~2->iso_c_binding module~self_mappedscalar_3d~2->module~self_gpuinterfaces module~self_mappedscalar_3d_t SELF_MappedScalar_3D_t module~self_mappedscalar_3d~2->module~self_mappedscalar_3d_t module~self_model->module~self_hdf5 module~self_model->module~self_metadata module~self_model->module~self_supportroutines module~self_model->FEQParse module~self_model->HDF5 module~self_hdf5->iso_fortran_env module~self_hdf5->mpi module~self_hdf5->module~self_constants module~self_hdf5->HDF5 module~self_boundaryconditions->module~self_metadata module~self_boundaryconditions->module~self_supportroutines module~self_boundaryconditions->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_metadata->module~self_hdf5 module~self_metadata->HDF5 module~self_mappedvector_2d->module~self_gpu module~self_mappedvector_2d->iso_c_binding module~self_mappedvector_2d->module~self_vector_2d~2 module~self_mappedvector_2d->module~self_gpuinterfaces module~self_mappedvector_2d_t SELF_MappedVector_2D_t module~self_mappedvector_2d->module~self_mappedvector_2d_t module~self_refinementindicator_3d_t->module~self_lagrange~3 module~self_refinementindicator_3d_t->mpi module~self_refinementindicator_3d_t->module~self_constants module~self_refinementindicator_3d_t->module~self_scalar_3d module~self_refinementindicator_3d_t->iso_c_binding module~self_mappedscalar_2d~2->module~self_gpu module~self_mappedscalar_2d~2->iso_c_binding module~self_mappedscalar_2d~2->module~self_scalar_2d module~self_mappedscalar_2d~2->module~self_gpuinterfaces module~self_mappedscalar_2d_t SELF_MappedScalar_2D_t module~self_mappedscalar_2d~2->module~self_mappedscalar_2d_t module~self_scalar_3d->module~self_constants module~self_scalar_3d->module~self_gpu module~self_scalar_3d->iso_c_binding module~self_scalar_3d->module~self_gpuinterfaces module~self_scalar_3d_t SELF_Scalar_3D_t module~self_scalar_3d->module~self_scalar_3d_t module~self_gpu->iso_c_binding module~self_gpu_enums~2 SELF_GPU_enums module~self_gpu->module~self_gpu_enums~2 module~self_mesh_2d_t->module~self_lagrange~3 module~self_mesh_2d_t->module~self_constants module~self_mesh_2d_t->module~self_hdf5 module~self_mesh_2d_t->module~self_supportroutines module~self_mesh_2d_t->HDF5 module~self_mesh_2d_t->iso_c_binding module~self_mesh_2d_t->module~self_domaindecomposition module~self_mesh_2d_t->module~self_mesh module~self_mesh_2d_t->module~self_quadrature module~self_mappedvector_3d->module~self_gpu module~self_mappedvector_3d->iso_c_binding module~self_mappedvector_3d->module~self_gpuinterfaces module~self_mappedvector_3d_t SELF_MappedVector_3D_t module~self_mappedvector_3d->module~self_mappedvector_3d_t module~self_supportroutines->iso_fortran_env module~self_supportroutines->module~self_constants module~self_solutionmigration->iso_fortran_env module~self_solutionmigration->mpi module~self_solutionmigration->module~self_constants module~self_solutionmigration->module~self_domaindecomposition module~self_domaindecomposition->iso_fortran_env module~self_domaindecomposition->mpi module~self_domaindecomposition->iso_c_binding module~self_domaindecomposition_t SELF_DomainDecomposition_t module~self_domaindecomposition->module~self_domaindecomposition_t module~self_data->module~self_lagrange~3 module~self_data->module~self_constants module~self_data->module~self_hdf5 module~self_data->module~self_metadata module~self_data->FEQParse module~self_data->HDF5 module~self_data->iso_c_binding module~self_scalar_2d->module~self_constants module~self_scalar_2d->module~self_gpu module~self_scalar_2d->iso_c_binding module~self_scalar_2d->module~self_gpuinterfaces module~self_scalar_2d_t SELF_Scalar_2D_t module~self_scalar_2d->module~self_scalar_2d_t module~self_vector_2d~2->module~self_constants module~self_vector_2d~2->module~self_gpu module~self_vector_2d~2->iso_c_binding module~self_vector_2d~2->module~self_gpuinterfaces module~self_vector_2d_t SELF_Vector_2D_t module~self_vector_2d~2->module~self_vector_2d_t module~self_gpuinterfaces->module~self_gpu module~self_gpuinterfaces->iso_c_binding module~self_solutiontransfer_2d->module~self_lagrange~3 module~self_solutiontransfer_2d->module~self_constants module~self_tensor_2d~2->iso_fortran_env module~self_tensor_2d~2->module~self_constants module~self_tensor_2d~2->module~self_gpu module~self_tensor_2d~2->iso_c_binding module~self_tensor_2d_t SELF_Tensor_2D_t module~self_tensor_2d~2->module~self_tensor_2d_t module~self_scalar_2d_t->module~self_lagrange~3 module~self_scalar_2d_t->module~self_constants module~self_scalar_2d_t->module~self_hdf5 module~self_scalar_2d_t->module~self_metadata module~self_scalar_2d_t->FEQParse module~self_scalar_2d_t->HDF5 module~self_scalar_2d_t->iso_c_binding module~self_scalar_2d_t->module~self_data module~self_datapool SELF_DataPool module~self_scalar_2d_t->module~self_datapool module~self_gpu_enums~2->iso_c_binding 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_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_vector_2d_t->module~self_lagrange~3 module~self_vector_2d_t->module~self_constants module~self_vector_2d_t->module~self_hdf5 module~self_vector_2d_t->module~self_metadata module~self_vector_2d_t->FEQParse module~self_vector_2d_t->HDF5 module~self_vector_2d_t->iso_c_binding module~self_vector_2d_t->module~self_data module~self_vector_2d_t->module~self_datapool module~self_vector_3d_t->module~self_lagrange~3 module~self_vector_3d_t->module~self_constants module~self_vector_3d_t->module~self_hdf5 module~self_vector_3d_t->module~self_metadata module~self_vector_3d_t->FEQParse module~self_vector_3d_t->HDF5 module~self_vector_3d_t->iso_c_binding module~self_vector_3d_t->module~self_data module~self_vector_3d_t->module~self_datapool module~self_tensor_3d_t->module~self_lagrange~3 module~self_tensor_3d_t->module~self_constants module~self_tensor_3d_t->module~self_hdf5 module~self_tensor_3d_t->module~self_metadata module~self_tensor_3d_t->FEQParse module~self_tensor_3d_t->HDF5 module~self_tensor_3d_t->iso_c_binding module~self_tensor_3d_t->module~self_data module~self_tensor_3d_t->module~self_datapool module~self_mesh->module~self_constants module~self_mesh->iso_c_binding module~self_mesh->module~self_domaindecomposition module~self_quadrature->iso_fortran_env module~self_quadrature->module~self_constants module~self_refinementindicator_2d_t->module~self_lagrange~3 module~self_refinementindicator_2d_t->mpi module~self_refinementindicator_2d_t->module~self_constants module~self_refinementindicator_2d_t->iso_c_binding module~self_refinementindicator_2d_t->module~self_scalar_2d 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_tensor_3d~2 module~self_mappedscalar_3d_t->module~self_scalar_3d 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_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_2d_t->module~self_lagrange~3 module~self_mappedvector_2d_t->module~self_mesh_2d module~self_mappedvector_2d_t->module~self_geometry_2d module~self_mappedvector_2d_t->module~self_constants module~self_mappedvector_2d_t->FEQParse module~self_mappedvector_2d_t->iso_c_binding module~self_mappedvector_2d_t->module~self_domaindecomposition module~self_mappedvector_2d_t->module~self_vector_2d~2 module~self_mappedvector_2d_t->module~self_tensor_2d~2 module~self_mappedscalar_2d_t->module~self_lagrange~3 module~self_mappedscalar_2d_t->module~self_mesh_2d module~self_mappedscalar_2d_t->module~self_geometry_2d module~self_mappedscalar_2d_t->module~self_constants module~self_mappedscalar_2d_t->FEQParse module~self_mappedscalar_2d_t->iso_c_binding module~self_mappedscalar_2d_t->module~self_domaindecomposition module~self_mappedscalar_2d_t->module~self_scalar_2d module~self_mappedscalar_2d_t->module~self_tensor_2d~2 module~self_scalar_3d_t->module~self_lagrange~3 module~self_scalar_3d_t->module~self_constants module~self_scalar_3d_t->module~self_hdf5 module~self_scalar_3d_t->module~self_metadata module~self_scalar_3d_t->FEQParse module~self_scalar_3d_t->HDF5 module~self_scalar_3d_t->iso_c_binding module~self_scalar_3d_t->module~self_data module~self_scalar_3d_t->module~self_datapool module~self_tensor_2d_t->module~self_lagrange~3 module~self_tensor_2d_t->module~self_constants module~self_tensor_2d_t->module~self_hdf5 module~self_tensor_2d_t->module~self_metadata module~self_tensor_2d_t->FEQParse module~self_tensor_2d_t->HDF5 module~self_tensor_2d_t->iso_c_binding module~self_tensor_2d_t->module~self_data module~self_tensor_2d_t->module~self_datapool module~self_datapool->module~self_constants module~self_refinementprimitives_3d->module~self_lagrange~3 module~self_refinementprimitives_3d->module~self_constants

Contents


Abstract Interfaces

abstract interface

  • public subroutine SELF_ExtrudedLevels(surf, zLevels)

    Fill zLevels(1:nGeo+1,1:nGeo+1,0:nz,1:surf%nElem), the level heights z_0 < ... < z_nz = 0 at the geometry nodes of every rank-local surface element, for ExtrudedMesh.

    Arguments

    TypeIntentOptionalAttributesName
    type(Mesh2D), intent(in) :: surf
    real(kind=prec), intent(out) :: zLevels(1:,1:,0:,1:)

Derived Types

type, public :: ExtrudedAMRController

Components

TypeVisibilityAttributesNameInitial
type(SEMHex), public, pointer:: activeGeom=> null()

its geometry

type(SEMQuad), public, pointer:: activeGeom2=> null()

surface geometry (only with a 2-D model)

type(Mesh3D), public, pointer:: activeMesh=> null()

extruded mesh the 3-D model runs on

type(Mesh2D), public, pointer:: activeSurf=> null()

surface mesh of the current columns

type(Mesh2D), public, pointer:: baseSurf=> null()

caller-owned; metadata source for EmitMesh

integer, public :: bottomBC =0

boundary condition id of the column bottoms

real(kind=prec), public :: coarsenThreshold =0.0_prec
real(kind=prec), public, allocatable:: energyWeights(:)

Migration windows for every rank, in surface elements (columns) and in 3-D elements

type(QuadTreeMesh2D), public :: forest
logical, public :: hasModel2D =.false.

whether Init was given a 2-D model

type(RefinementIndicator3D), public :: indicator
type(Lagrange), public, pointer:: interp=> null()

the models' solution interpolant

integer, public :: ivar =SELF_AMR_ALLVARS

driving 3-D variable for the indicator

procedure(SELF_ExtrudedLevels), public, pointer, nopass:: levels=> null()
integer, public :: maxLevel =1

refinement-level cap

integer, public :: nHalo =1

refine-flag halo-expansion passes (in columns)

integer(kind=int64), public :: nMigrateBytesRecv =0
integer(kind=int64), public :: nMigrateBytesSent =0
integer(kind=int64), public :: nMigrateElemRemote =0
integer, public :: nz =0

layers per column

logical, public :: ownsActive =.false.

whether the active meshes/geometries were emitted by us

real(kind=prec), public :: refineThreshold =0.0_prec
real(kind=prec), public :: relativeEnergyFloor =SELF_AMR_DEFAULT_RELFLOOR
real(kind=prec), public :: significantEnergyFloor =SELF_AMR_DEFAULT_RELFLOOR
integer, public :: topBC =0

boundary condition id of the column tops

integer, public, allocatable:: winFirst(:)
integer, public, allocatable:: winFirst3(:)

Cumulative migration accounting, both models together

integer, public, allocatable:: winLast(:)
integer, public, allocatable:: winLast3(:)

Cumulative migration accounting, both models together

Type-Bound Procedures

procedure, public :: Adapt => Adapt_ExtrudedAMRController
procedure, private :: ApplyIndicatorSettings => ApplyIndicatorSettings_ExtrudedAMRController
procedure, public :: Free => Free_ExtrudedAMRController
procedure, public :: Init => Init_ExtrudedAMRController
procedure, public :: RecommendedTimeStep => RecommendedTimeStep_ExtrudedAMRController

Functions

public function RecommendedTimeStep_ExtrudedAMRController(this, dtBase) result(dt)

Level-based explicit time step bound: dtBase / 2**maxLevel, with dtBase stable on the base (level-0) mesh. Refinement halves the horizontal element size per level; the vertical spacing is unchanged, so this is conservative when the vertical CFL binds.

Arguments

TypeIntentOptionalAttributesName
class(ExtrudedAMRController), intent(in) :: this
real(kind=prec), intent(in) :: dtBase

Return Value real(kind=prec)


Subroutines

public subroutine Adapt_ExtrudedAMRController(this, model3d, adapted, model2d)

Perform one adaptation epoch (see the module documentation). On return adapted reports whether the mesh changed; when it did, both models are rebound to the new meshes with their solutions transferred, and the caller should re-evaluate the time step (RecommendedTimeStep) and any model state derived from the mesh. model2d must be given exactly when Init was given one.

Arguments

TypeIntentOptionalAttributesName
class(ExtrudedAMRController), intent(inout), target:: this
class(DGModel3D_t), intent(inout) :: model3d
logical, intent(out) :: adapted
class(DGModel2D_t), intent(inout), optional :: model2d

Push the controller-owned amplitude-gate settings onto the indicator, after every indicator Init (which resets them).

Arguments

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

public subroutine Free_ExtrudedAMRController(this)

Release the forest, the indicator and every mesh/geometry the controller emitted. The models' mesh and geometry pointers dangle afterwards if they were running on emitted ones, so free or stop using the models first.

Arguments

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

public subroutine Init_ExtrudedAMRController(this, model3d, surf, levels, bottomBC, topBC, refineThreshold, coarsenThreshold, ivar, maxLevel, nHalo, model2d, relativeEnergyFloor, energyWeights, significantEnergyFloor)

Attach the controller to an initialized 3-D model on an extruded mesh, and optionally to a 2-D model on the surface mesh.

Read more…

Arguments

TypeIntentOptionalAttributesName
class(ExtrudedAMRController), intent(out) :: this
class(DGModel3D_t), intent(in) :: model3d
type(Mesh2D), intent(in), target:: surf
procedure(SELF_ExtrudedLevels) :: levels
integer, intent(in) :: bottomBC
integer, intent(in) :: topBC
real(kind=prec), intent(in) :: refineThreshold
real(kind=prec), intent(in) :: coarsenThreshold
integer, intent(in) :: ivar
integer, intent(in) :: maxLevel
integer, intent(in) :: nHalo
class(DGModel2D_t), intent(in), optional :: model2d
real(kind=prec), intent(in), optional :: relativeEnergyFloor
real(kind=prec), intent(in), optional :: energyWeights(:)
real(kind=prec), intent(in), optional :: significantEnergyFloor

public subroutine ReleaseActive(this)

Free the active meshes and geometries if this controller emitted them.

Arguments

TypeIntentOptionalAttributesName
type(ExtrudedAMRController), intent(inout) :: this