OctreeMesh3D Derived Type

type, public :: OctreeMesh3D


Inherited by

type~~octreemesh3d~~InheritedByGraph type~octreemesh3d OctreeMesh3D type~amrcontroller3d AMRController3D type~amrcontroller3d->type~octreemesh3d forest

Contents

Source Code


Components

TypeVisibilityAttributesNameInitial
integer, public :: capacity =0
integer, public, allocatable:: child(:,:)
integer, public, allocatable:: leaf(:)
integer, public, allocatable:: level(:)
integer, public :: nGeo =0
integer, public :: nLeaves =0
integer, public :: nNodes =0
integer, public :: nRoots =0
integer, public, allocatable:: octant(:)
integer, public, allocatable:: parent(:)
integer, public :: quadrature =0
integer, public, allocatable:: rootBC(:,:)
real(kind=prec), public, allocatable:: rootCoords(:,:,:,:,:)
integer, public, allocatable:: rootElem(:)
integer, public, allocatable:: rootFlip(:,:)
integer, public, allocatable:: rootMaterial(:)
integer, public, allocatable:: rootNbr(:,:)
integer, public, allocatable:: rootNbrSide(:,:)

Type-Bound Procedures

procedure, public :: AdaptFromFlags => AdaptFromFlags_OctreeMesh3D

  • public subroutine AdaptFromFlags_OctreeMesh3D(this, flag)

    Mutate the forest from a per-leaf flag array (indexed over the current leaves in this%leaf order, e.g. the flag array produced by the refinement indicator):

    Read more…

    Arguments

    TypeIntentOptionalAttributesName
    class(OctreeMesh3D), intent(inout) :: this
    integer, intent(in) :: flag(1:this%nLeaves)

procedure, public :: Balance2to1 => Balance2to1_OctreeMesh3D

  • public subroutine Balance2to1_OctreeMesh3D(this)

    Enforce the 2:1 face balance condition: no leaf face may separate elements differing by more than one refinement level. Iterates to a fixed point - in each sweep, any leaf whose equal-or-larger neighbour is a leaf two or more levels coarser triggers refinement of that coarser neighbour; refinement can ripple, so sweeps repeat until nothing changes. The leaf set is rebuilt on return.

    Arguments

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

procedure, private :: EnsureCapacity => EnsureCapacity_OctreeMesh3D

  • public subroutine EnsureCapacity_OctreeMesh3D(this, need)

    Grow the node arrays (amortized doubling) so at least need nodes fit.

    Arguments

    TypeIntentOptionalAttributesName
    class(OctreeMesh3D), intent(inout) :: this
    integer, intent(in) :: need

procedure, public :: FaceNeighbor => FaceNeighbor_OctreeMesh3D

  • public recursive subroutine FaceNeighbor_OctreeMesh3D(this, node, s, nbr, ns, nf)

    Find the equal-or-larger face neighbour of node across its local face s using the classic octree ascend/descend search. Returns: nbr - neighbour node id (0 = physical domain boundary). It is either a LEAF at any level <= level(node), or an INTERNAL node at exactly level(node) (meaning the shared face is subdivided on the neighbour side, i.e. finer neighbours exist). ns - the neighbour's local face that faces node. nf - the flip between the two shared faces (0..7, sideInfo(4) convention), inherited from the base-mesh face where the search crosses a root boundary. With this, a 2:1 hanging face is exactly "nbr is a leaf with level(nbr) = level(node)-1", and finer neighbours are exactly "nbr is internal".

    Arguments

    TypeIntentOptionalAttributesName
    class(OctreeMesh3D), intent(in) :: this
    integer, intent(in) :: node
    integer, intent(in) :: s
    integer, intent(out) :: nbr
    integer, intent(out) :: ns
    integer, intent(out) :: nf

procedure, public :: Free => Free_OctreeMesh3D

procedure, public :: Init => Init_OctreeMesh3D

  • public subroutine Init_OctreeMesh3D(this, mesh)

    Initialize the forest with one root per base-mesh element (all leaves at level 0). The base geometry (node coordinates) is copied so leaf geometry can be regenerated after any amount of refinement without holding a reference to the mesh. Requires a single-rank mesh (a decomposed mesh only stores its local elements); a rank-replicated forest over a decomposed base is built by gathering the global tables and calling InitGlobal.

    Arguments

    TypeIntentOptionalAttributesName
    class(OctreeMesh3D), intent(out) :: this
    type(Mesh3D), intent(in) :: mesh

procedure, public :: InitGlobal => InitGlobal_OctreeMesh3D

  • public subroutine InitGlobal_OctreeMesh3D(this, nRoots, nGeo, quadrature, rootCoords, rootNbr, rootNbrSide, rootFlip, rootBC, rootMaterial)

    Initialize the forest directly from GLOBAL base-mesh tables (one root per global base element, all leaves at level 0). This is the initialization path for a rank-replicated forest over a decomposed base mesh: every rank passes the same gathered tables and holds an identical forest. rootNbr carries global element ids (0 = physical boundary), rootNbrSide/rootFlip decode the base sideInfo(4) pairing, rootBC the base boundary-condition id per face, and rootMaterial the base material id per element.

    Arguments

    TypeIntentOptionalAttributesName
    class(OctreeMesh3D), intent(out) :: this
    integer, intent(in) :: nRoots
    integer, intent(in) :: nGeo
    integer, intent(in) :: quadrature
    real(kind=prec), intent(in) :: rootCoords(1:3,1:nGeo+1,1:nGeo+1,1:nGeo+1,1:nRoots)
    integer, intent(in) :: rootNbr(1:6,1:nRoots)
    integer, intent(in) :: rootNbrSide(1:6,1:nRoots)
    integer, intent(in) :: rootFlip(1:6,1:nRoots)
    integer, intent(in) :: rootBC(1:6,1:nRoots)
    integer, intent(in) :: rootMaterial(1:nRoots)

procedure, public :: LeafCoords => LeafCoords_OctreeMesh3D

  • public subroutine LeafCoords_OctreeMesh3D(this, leafIndex, geomInterp, coords)

    Physical geometry-node coordinates of leaf leafIndex, produced by repeated exact isoparametric subdivision of its root element along the octree path. geomInterp must be a degree-nGeo Lagrange interpolant on the mesh's geometry (quadrature) nodes - the same interpolant SELF_MeshRefinement_3D builds. Level 0 leaves return the root geometry directly. Pure function of (root coords, level, octant path), so regenerated leaf geometry is bit-identical across epochs.

    Arguments

    TypeIntentOptionalAttributesName
    class(OctreeMesh3D), intent(in) :: this
    integer, intent(in) :: leafIndex
    type(Lagrange), intent(in) :: geomInterp
    real(kind=prec), intent(out) :: coords(1:3,1:this%nGeo+1,1:this%nGeo+1,1:this%nGeo+1)

procedure, public :: MaxLevel => MaxLevel_OctreeMesh3D

  • public function MaxLevel_OctreeMesh3D(this) result(mx)

    Highest refinement level among the active leaves.

    Arguments

    TypeIntentOptionalAttributesName
    class(OctreeMesh3D), intent(in) :: this

    Return Value integer

procedure, public :: MaxLevelJump => MaxLevelJump_OctreeMesh3D

  • public function MaxLevelJump_OctreeMesh3D(this) result(mx)

    Largest refinement-level difference across any leaf face (0 on a conforming or uniformly refined forest, 1 on a 2:1-balanced adaptive forest). Because FaceNeighbor returns the equal-or-larger neighbour, every level difference is observed from the finer leaf as a coarser leaf neighbour; internal (finer) neighbours contribute nothing from this side.

    Arguments

    TypeIntentOptionalAttributesName
    class(OctreeMesh3D), intent(in) :: this

    Return Value integer

procedure, public :: RebuildLeaves => RebuildLeaves_OctreeMesh3D

  • public subroutine RebuildLeaves_OctreeMesh3D(this)

    Recompute the active leaf set by depth-first traversal from the roots. Traversal (rather than a scan of all nodes) is what makes orphaned nodes left behind by coarsening invisible. The root-major DFS order with children visited 1..8 is the Morton (Z-order) curve within each root, which is what makes the contiguous block decomposition of the emitted element list a locality-preserving SFC partition.

    Arguments

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

procedure, public :: RefineNode => RefineNode_OctreeMesh3D

  • public subroutine RefineNode_OctreeMesh3D(this, node)

    Subdivide one leaf node into eight children. Does nothing (with a warning) if the node is already refined. The caller is responsible for rebuilding the leaf list afterwards (or calling AdaptFromFlags, which does so).

    Arguments

    TypeIntentOptionalAttributesName
    class(OctreeMesh3D), intent(inout) :: this
    integer, intent(in) :: node

Source Code

  type :: OctreeMesh3D
    ! ---- Base-mesh (root) reference data ----
    integer :: nGeo = 0
    integer :: quadrature = 0
    integer :: nRoots = 0
    real(prec),allocatable :: rootCoords(:,:,:,:,:) ! (3,nGeo+1,nGeo+1,nGeo+1,nRoots)
    ! Base-mesh face connectivity at the roots (conforming base assumed). rootNbr(s,r) is
    ! the base neighbour element of root r across local face s (0 = physical boundary),
    ! which is also that neighbour's root node id; rootNbrSide / rootFlip decode base
    ! sideInfo(4,s,r).
    integer,allocatable :: rootNbr(:,:) ! (6,nRoots)
    integer,allocatable :: rootNbrSide(:,:) ! (6,nRoots)
    integer,allocatable :: rootFlip(:,:) ! (6,nRoots)
    integer,allocatable :: rootBC(:,:) ! (6,nRoots) base boundary-condition id per face
    integer,allocatable :: rootMaterial(:) ! (nRoots) base material id per root element

    ! ---- Forest node storage (roots occupy node ids 1:nRoots) ----
    integer :: nNodes = 0
    integer :: capacity = 0
    integer,allocatable :: level(:) ! refinement level (0 at roots)
    integer,allocatable :: parent(:) ! parent node id (0 at roots)
    integer,allocatable :: octant(:) ! child index within parent (1..8; 0 at roots)
    integer,allocatable :: rootElem(:) ! base element this node descends from
    integer,allocatable :: child(:,:) ! (8,capacity) child node ids (0 => leaf)

    ! ---- Active leaf set (rebuilt after every mutation) ----
    integer :: nLeaves = 0
    integer,allocatable :: leaf(:) ! (nLeaves) leaf node ids, root-major DFS order

  contains
    procedure,public :: Init => Init_OctreeMesh3D
    procedure,public :: InitGlobal => InitGlobal_OctreeMesh3D
    procedure,public :: Free => Free_OctreeMesh3D
    procedure,public :: RefineNode => RefineNode_OctreeMesh3D
    procedure,public :: AdaptFromFlags => AdaptFromFlags_OctreeMesh3D
    procedure,public :: RebuildLeaves => RebuildLeaves_OctreeMesh3D
    procedure,public :: LeafCoords => LeafCoords_OctreeMesh3D
    procedure,public :: MaxLevel => MaxLevel_OctreeMesh3D
    procedure,public :: FaceNeighbor => FaceNeighbor_OctreeMesh3D
    procedure,public :: Balance2to1 => Balance2to1_OctreeMesh3D
    procedure,public :: MaxLevelJump => MaxLevelJump_OctreeMesh3D
    procedure,private :: EnsureCapacity => EnsureCapacity_OctreeMesh3D
  endtype OctreeMesh3D