SELF_RefinementPrimitives_2D Module

Element-local primitives for h-refinement of 2-D quadrilateral spectral element meshes (AMR Stage 2). These routines are deliberately free of the Mesh2D container, MPI, and GPU dependencies so that the numerically and topologically delicate pieces - isoparametric child geometry and refined-mesh connectivity - are pure, deterministic, and unit-testable in isolation. The mesh-level driver (SELF_MeshRefinement_2D) assembles a Mesh2D_t from them.

Child ordering and quadrant convention

A parent quadrilateral is split into four children indexed 1..4, each covering one quadrant of the parent reference square [-1,1]^2 and attached to the parent corner of the same index (SELF's CGNS corner order):

eta
 ^   4 (NW)  |  3 (NE)         corner 1 = SW = (-1,-1)   corner 3 = NE = (+1,+1)
 |  ---------+---------        corner 2 = SE = (+1,-1)   corner 4 = NW = (-1,+1)
 |   1 (SW)  |  2 (SE)
 +-------------------> xi      child c covers xi in [ax-1, ax], eta in [ay-1, ay]

with (ax,ay) = (0,0),(1,0),(1,1),(0,1) for c = 1,2,3,4 (0 = lower/left half, 1 = upper/right).

Local side numbering follows SELF: 1=South, 2=East, 3=North, 4=West. A child's local side k that lies on the parent boundary lies on parent side k (subdivision is orientation preserving), which is what makes the connectivity below inherit the parent's neighbor/flip data directly.


Uses

  • module~~self_refinementprimitives_2d~~UsesGraph module~self_refinementprimitives_2d SELF_RefinementPrimitives_2D module~self_constants SELF_Constants module~self_refinementprimitives_2d->module~self_constants module~self_lagrange SELF_Lagrange module~self_refinementprimitives_2d->module~self_lagrange iso_c_binding iso_c_binding module~self_constants->iso_c_binding iso_fortran_env iso_fortran_env module~self_constants->iso_fortran_env module~self_lagrange->module~self_constants module~self_lagrange->iso_c_binding module~self_lagrange->iso_fortran_env module~self_lagrange_t SELF_Lagrange_t module~self_lagrange->module~self_lagrange_t module~self_lagrange_t->module~self_constants module~self_lagrange_t->iso_c_binding module~self_lagrange_t->iso_fortran_env module~self_hdf5 SELF_HDF5 module~self_lagrange_t->module~self_hdf5 HDF5 HDF5 module~self_lagrange_t->HDF5 module~self_quadrature SELF_Quadrature module~self_lagrange_t->module~self_quadrature module~self_supportroutines SELF_SupportRoutines module~self_lagrange_t->module~self_supportroutines module~self_hdf5->module~self_constants module~self_hdf5->iso_fortran_env module~self_hdf5->HDF5 mpi mpi module~self_hdf5->mpi module~self_quadrature->module~self_constants module~self_quadrature->iso_fortran_env module~self_supportroutines->module~self_constants module~self_supportroutines->iso_fortran_env

Used by

  • module~~self_refinementprimitives_2d~~UsedByGraph module~self_refinementprimitives_2d SELF_RefinementPrimitives_2D module~self_quadtreemesh_2d SELF_QuadTreeMesh_2D module~self_quadtreemesh_2d->module~self_refinementprimitives_2d module~self_adaptivemesh_2d SELF_AdaptiveMesh_2D module~self_adaptivemesh_2d->module~self_refinementprimitives_2d module~self_adaptivemesh_2d->module~self_quadtreemesh_2d module~self_meshrefinement_2d SELF_MeshRefinement_2D module~self_meshrefinement_2d->module~self_refinementprimitives_2d module~self_transferplan_2d SELF_TransferPlan_2D module~self_transferplan_2d->module~self_quadtreemesh_2d module~self_amrcontroller_2d SELF_AMRController_2D module~self_amrcontroller_2d->module~self_quadtreemesh_2d module~self_amrcontroller_2d->module~self_adaptivemesh_2d module~self_amrcontroller_2d->module~self_transferplan_2d module~self_dgmodel2d_t SELF_DGModel2D_t module~self_amrcontroller_2d->module~self_dgmodel2d_t module~self_dgmodel2d_t->module~self_transferplan_2d module~self_dgmodel2d~2 SELF_DGModel2D module~self_dgmodel2d~2->module~self_transferplan_2d module~self_dgmodel2d~2->module~self_dgmodel2d_t module~self_dgmodel2d SELF_DGModel2D module~self_dgmodel2d->module~self_dgmodel2d_t module~self_ecdgmodel2d_t SELF_ECDGModel2D_t module~self_ecdgmodel2d_t->module~self_dgmodel2d module~self_lineareuler2d_pml_t self_LinearEuler2D_PML_t module~self_lineareuler2d_pml_t->module~self_dgmodel2d module~self_lineareuler2d_t self_LinearEuler2D_t module~self_lineareuler2d_pml_t->module~self_lineareuler2d_t module~self_nulldgmodel2d_t self_NullDGModel2D_t module~self_nulldgmodel2d_t->module~self_dgmodel2d module~self_linearshallowwater2d_t self_LinearShallowWater2D_t module~self_linearshallowwater2d_t->module~self_dgmodel2d module~self_lineareuler2d_t->module~self_dgmodel2d module~self_advection_diffusion_2d_t self_advection_diffusion_2d_t module~self_advection_diffusion_2d_t->module~self_dgmodel2d module~self_advection_diffusion_2d~2 self_advection_diffusion_2d module~self_advection_diffusion_2d~2->module~self_advection_diffusion_2d_t module~self_lineareuler2d self_LinearEuler2D module~self_lineareuler2d->module~self_lineareuler2d_t module~self_ecdgmodel2d SELF_ECDGModel2D module~self_ecdgmodel2d->module~self_ecdgmodel2d_t module~self_ecdgmodel2d~2 SELF_ECDGModel2D module~self_ecdgmodel2d~2->module~self_ecdgmodel2d_t module~self_lineareuler2d_pml self_LinearEuler2D_PML module~self_lineareuler2d_pml->module~self_lineareuler2d_pml_t module~self_ecadvection2d~2 SELF_ECAdvection2D module~self_ecadvection2d~2->module~self_ecdgmodel2d_t module~self_ecadvection2d_t SELF_ECAdvection2D_t module~self_ecadvection2d~2->module~self_ecadvection2d_t module~self_esatmo2d SELF_ESAtmo2D module~self_esatmo2d->module~self_ecdgmodel2d_t module~self_esatmo2d_t SELF_ESAtmo2D_t module~self_esatmo2d->module~self_esatmo2d_t module~self_lineareuler2d_pml~2 self_LinearEuler2D_PML module~self_lineareuler2d_pml~2->module~self_lineareuler2d_pml_t module~self_nulldgmodel2d self_NullDGModel2D module~self_nulldgmodel2d->module~self_nulldgmodel2d_t module~self_nulldgmodel2d~2 self_NullDGModel2D module~self_nulldgmodel2d~2->module~self_nulldgmodel2d_t module~self_linearshallowwater2d self_LinearShallowWater2D module~self_linearshallowwater2d->module~self_linearshallowwater2d_t module~self_linearshallowwater2d~2 self_LinearShallowWater2D module~self_linearshallowwater2d~2->module~self_linearshallowwater2d_t module~self_lineareuler2d~2 self_LinearEuler2D module~self_lineareuler2d~2->module~self_lineareuler2d_t module~self_advection_diffusion_2d self_advection_diffusion_2d module~self_advection_diffusion_2d->module~self_advection_diffusion_2d_t module~self_ecadvection2d_t->module~self_ecdgmodel2d module~self_esatmo2d_t->module~self_ecdgmodel2d module~self_ecadvection2d SELF_ECAdvection2D module~self_ecadvection2d->module~self_ecadvection2d_t module~self_esatmo2d~2 SELF_ESAtmo2D module~self_esatmo2d~2->module~self_esatmo2d_t

Contents


Variables

TypeVisibilityAttributesNameInitial
integer, public, parameter:: childOfSide(1:2,1:4) =reshape([1, 2, 2, 3, 4, 3, 1, 4], [2, 4])

Subroutines

public subroutine RefineConnectivity(nElem, baseSideInfo, baseCorner, nodeOffset, nUniqueSidesBase, refSideInfo, refCorner, nUniqueSidesRef)

Build the connectivity of a uniformly (2:1 in each direction) refined 2-D mesh from its base connectivity. Every base element p is split into four children (global id 4*(p-1)+c). The scheme is fully deterministic integer bookkeeping - no coordinate hashing, no flip recomputation, no MPI:

Read more…

Arguments

TypeIntentOptionalAttributesName
integer, intent(in) :: nElem
integer, intent(in) :: baseSideInfo(1:5,1:4,1:nElem)
integer, intent(in) :: baseCorner(1:4,1:nElem)
integer, intent(in) :: nodeOffset
integer, intent(in) :: nUniqueSidesBase
integer, intent(out) :: refSideInfo(1:5,1:4,1:4*nElem)
integer, intent(out) :: refCorner(1:4,1:4*nElem)
integer, intent(out) :: nUniqueSidesRef

public subroutine SubdivideNodeCoords(geomInterp, nGeo, parentCoords, childCoords)

Isoparametric subdivision of one element's geometry node coordinates into its four children. The parent geometry is the degree-nGeo Lagrange interpolant through parentCoords (sampled at geomInterp's control points, i.e. the mesh geometry nodes); each child node coordinate is that interpolant evaluated at the corresponding point of the parent reference square. Exact for any polynomial geometry of degree <= nGeo and for any control-node type, so straight-sided and curved (isoparametric) elements are both handled without approximation.

Read more…

Arguments

TypeIntentOptionalAttributesName
type(Lagrange), intent(in) :: geomInterp
integer, intent(in) :: nGeo
real(kind=prec), intent(in) :: parentCoords(1:2,1:nGeo+1,1:nGeo+1)
real(kind=prec), intent(out) :: childCoords(1:2,1:nGeo+1,1:nGeo+1,1:4)