SELF_RefinementPrimitives_3D Module

Element-local primitives for h-refinement of 3-D hexahedral spectral element meshes. These routines are deliberately free of the Mesh3D 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_3D) assembles a Mesh3D_t from them. Direct 3-D analogue of SELF_RefinementPrimitives_2D.

Child ordering and octant convention

A parent hexahedron is split into eight children indexed 1..8, each covering one octant of the parent reference cube [-1,1]^3 and attached to the parent corner of the same index (SELF's CGNS corner order: counter-clockwise looking in -xi3, bottom then top):

child c covers xi1 in [ax-1,ax], xi2 in [ay-1,ay], xi3 in [az-1,az], with (ax,ay,az) = (0,0,0),(1,0,0),(1,1,0),(0,1,0),(0,0,1),(1,0,1),(1,1,1),(0,1,1) for c = 1..8 (0 = lower half, 1 = upper half per direction).

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

Face quadrant convention

A parent face is split into four sub-faces ("quadrants") indexed in the face's trace coordinates (SELF's BoundaryInterp convention: faces 1,6 -> (xi1,xi2); faces 2,4 -> (xi1,xi3); faces 3,5 -> (xi2,xi3)) as q = kx + 2*(ky-1), where kx, ky in {1,2} are the half-interval indices along the face's first and second coordinate.


Uses

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

Used by

  • module~~self_refinementprimitives_3d~~UsedByGraph module~self_refinementprimitives_3d SELF_RefinementPrimitives_3D module~self_octreemesh_3d SELF_OctreeMesh_3D module~self_octreemesh_3d->module~self_refinementprimitives_3d module~self_meshrefinement_3d SELF_MeshRefinement_3D module~self_meshrefinement_3d->module~self_refinementprimitives_3d module~self_adaptivemesh_3d SELF_AdaptiveMesh_3D module~self_adaptivemesh_3d->module~self_refinementprimitives_3d module~self_adaptivemesh_3d->module~self_octreemesh_3d module~self_transferplan_3d SELF_TransferPlan_3D module~self_transferplan_3d->module~self_octreemesh_3d module~self_amrcontroller_3d SELF_AMRController_3D module~self_amrcontroller_3d->module~self_octreemesh_3d module~self_amrcontroller_3d->module~self_adaptivemesh_3d module~self_amrcontroller_3d->module~self_transferplan_3d module~self_dgmodel3d_t SELF_DGModel3D_t module~self_amrcontroller_3d->module~self_dgmodel3d_t module~self_dgmodel3d_t->module~self_transferplan_3d module~self_dgmodel3d SELF_DGModel3D module~self_dgmodel3d->module~self_transferplan_3d module~self_dgmodel3d->module~self_dgmodel3d_t module~self_dgmodel3d~2 SELF_DGModel3D module~self_dgmodel3d~2->module~self_dgmodel3d_t module~self_ecdgmodel3d_t SELF_ECDGModel3D_t module~self_ecdgmodel3d_t->module~self_dgmodel3d~2 module~self_advection_diffusion_3d_t self_advection_diffusion_3d_t module~self_advection_diffusion_3d_t->module~self_dgmodel3d~2 module~self_lineareuler3d_t self_LinearEuler3D_t module~self_lineareuler3d_t->module~self_dgmodel3d~2 module~self_nulldgmodel3d_t self_NullDGModel3D_t module~self_nulldgmodel3d_t->module~self_dgmodel3d~2 module~self_ecdgmodel3d~2 SELF_ECDGModel3D module~self_ecdgmodel3d~2->module~self_ecdgmodel3d_t module~self_ecdgmodel3d SELF_ECDGModel3D module~self_ecdgmodel3d->module~self_ecdgmodel3d_t module~self_advection_diffusion_3d~2 self_advection_diffusion_3d module~self_advection_diffusion_3d~2->module~self_advection_diffusion_3d_t module~self_ecadvection3d SELF_ECAdvection3D module~self_ecadvection3d->module~self_ecdgmodel3d_t module~self_ecadvection3d_t SELF_ECAdvection3D_t module~self_ecadvection3d->module~self_ecadvection3d_t module~self_esatmo3d SELF_ESAtmo3D module~self_esatmo3d->module~self_ecdgmodel3d_t module~self_esatmo3d_t SELF_ESAtmo3D_t module~self_esatmo3d->module~self_esatmo3d_t module~self_advection_diffusion_3d self_advection_diffusion_3d module~self_advection_diffusion_3d->module~self_advection_diffusion_3d_t module~self_lineareuler3d~2 self_LinearEuler3D module~self_lineareuler3d~2->module~self_lineareuler3d_t module~self_lineareuler3d self_LinearEuler3D module~self_lineareuler3d->module~self_lineareuler3d_t module~self_nulldgmodel3d~2 self_NullDGModel3D module~self_nulldgmodel3d~2->module~self_nulldgmodel3d_t module~self_nulldgmodel3d self_NullDGModel3D module~self_nulldgmodel3d->module~self_nulldgmodel3d_t module~self_esatmo3d_t->module~self_ecdgmodel3d~2 module~self_ecadvection3d_t->module~self_ecdgmodel3d~2 module~self_esatmo3d~2 SELF_ESAtmo3D module~self_esatmo3d~2->module~self_esatmo3d_t module~self_ecadvection3d~2 SELF_ECAdvection3D module~self_ecadvection3d~2->module~self_ecadvection3d_t

Contents


Variables

TypeVisibilityAttributesNameInitial
integer, public, parameter:: childOfFace(1:4,1:6) =reshape([1, 2, 4, 3, 1, 2, 5, 6, 2, 3, 6, 7, 4, 3, 8, 7, 1, 4, 5, 8, 5, 6, 8, 7], [4, 6])
integer, public, parameter:: faceQuadPerm(1:4,0:7) =reshape([1, 2, 3, 4, 2, 1, 4, 3, 4, 3, 2, 1, 3, 4, 1, 2, 1, 3, 2, 4, 2, 4, 1, 3, 4, 2, 3, 1, 3, 1, 4, 2], [4, 8])
integer, public, parameter:: octAxc(1:8) =[0, 1, 1, 0, 0, 1, 1, 0]
integer, public, parameter:: octAyc(1:8) =[0, 0, 1, 1, 0, 0, 1, 1]
integer, public, parameter:: octAzc(1:8) =[0, 0, 0, 0, 1, 1, 1, 1]

Subroutines

public subroutine RefineConnectivity(nElem, baseSideInfo, refSideInfo, nUniqueSidesRef)

Build the connectivity of a uniformly (2:1 in each direction) refined 3-D mesh from its base connectivity. Every base element p is split into eight children (global id 8*(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:6,1:nElem)
integer, intent(out) :: refSideInfo(1:5,1:6,1:8*nElem)
integer, intent(out) :: nUniqueSidesRef

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

Isoparametric subdivision of one element's geometry node coordinates into its eight 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 cube. 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:3,1:nGeo+1,1:nGeo+1,1:nGeo+1)
real(kind=prec), intent(out) :: childCoords(1:3,1:nGeo+1,1:nGeo+1,1:nGeo+1,1:8)