The main documentation of the Initialize_Shell_Partition Procedure contains additional explanation of this code listing.
subroutine Initialize_Shell_Partition (NDimensions, Cell_Structure, & Node_Structure, & Nodes_of_Cells_Index, Output) ! Input variables. type(integer) :: NDimensions ! Number of dimensions. type(logical) :: Output ! Output toggle. ! Output variables. type(Base_Structure_type) :: Cell_Structure ! Structure for the Cells. type(Base_Structure_type) :: Node_Structure ! Structure for the Nodes. type(Data_Index_type) :: Nodes_of_Cells_Index ! Data Index object. ! Internal variables. type(integer,3) :: c ! Shell Partition numbers. type(integer) :: cell ! Loop counter. type(integer) :: cell_PE ! Cell # on this PE. type(integer) :: i, j, k ! Structured mesh indices. type(integer,1) :: i_of_c, j_of_c, k_of_c ! Inverse Shell Partition ! numbers. type(integer,1) :: Length_Vector ! Lengths for each PE. type(character,name_length) :: Locus ! Locus name. type(integer) :: NCells_PE ! Number of cells on this PE. type(integer) :: NNodes_per_Side ! Number of nodes of one edge. type(integer) :: NNodes_per_Cell ! Local # of nodes per cell. type(integer) :: NNodes_Total ! Number of nodes in the whole ! mesh. type(integer,2) :: Nodes_of_Cells_Array ! Index array. type(Status_type) :: status ! Status variable. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Initialize temporaries. call Initialize (status) call Initialize (Locus) call Initialize (Length_Vector, NPEs) NNodes_per_Side = NPEs + 1 call Initialize (c, NNodes_per_Side, NNodes_per_Side, NNodes_per_Side) ! NDimensions-dependent Initializations. NNodes_Total = NNodes_per_Side**NDimensions call Initialize (i_of_c, NNodes_Total) call Initialize (j_of_c, NNodes_Total) call Initialize (k_of_c, NNodes_Total) ! Set up cell structure (Shell Partitioning). Locus = 'Cells' Length_Vector = (/ (i**NDimensions - (i-1)**NDimensions, i = 1, NPEs) /) call Initialize (Cell_Structure, Length_Vector, Locus, status) ! Set up node structure (Shell Partitioning plus extra layer of nodes). Locus = 'Nodes' Length_Vector(NPEs) = Length_Vector(NPEs) + & (NPEs+1)**NDimensions - NPEs**NDimensions call Initialize (Node_Structure, Length_Vector, Locus, status) ! Generate Shell Partitioning numbers. call Generate_Shell_Partition (c, i_of_c, j_of_c, k_of_c, NDimensions, & NNodes_per_Side, Output) ! Set up Nodes_of_Cells array. NCells_PE = Length_PE(Cell_Structure) NNodes_per_Cell = 2**NDimensions call Initialize (Nodes_of_Cells_Array, NCells_PE, NNodes_per_Cell) do cell = First_PE(Cell_Structure), Last_PE(Cell_Structure) i = i_of_c(cell) j = j_of_c(cell) k = k_of_c(cell) cell_PE = cell - First_PE(Cell_Structure) + 1 Nodes_of_Cells_Array(cell_PE,1) = c(i,j,k) Nodes_of_Cells_Array(cell_PE,2) = c(i+1,j,k) if (NDimensions >= 2) then Nodes_of_Cells_Array(cell_PE,3) = c(i,j+1,k) Nodes_of_Cells_Array(cell_PE,4) = c(i+1,j+1,k) if (NDimensions == 3) then Nodes_of_Cells_Array(cell_PE,5) = c(i,j,k+1) Nodes_of_Cells_Array(cell_PE,6) = c(i+1,j,k+1) Nodes_of_Cells_Array(cell_PE,7) = c(i,j+1,k+1) Nodes_of_Cells_Array(cell_PE,8) = c(i+1,j+1,k+1) end if end if end do ! Set up Nodes_of_Cells data index. call Initialize (Nodes_of_Cells_Index, Node_Structure, Cell_Structure, & Many_of_One_Array=Nodes_of_Cells_Array, status=status) ! Finalize temporaries. call Finalize (Length_Vector) call Finalize (c) call Finalize (Locus) call Finalize (status) ! Finalize NDimensions-dependent data structures. call Finalize (i_of_c) call Finalize (j_of_c) call Finalize (k_of_c) call Finalize (Nodes_of_Cells_Array) end subroutine Initialize_Shell_Partition