The main documentation of the Initialize_Distributed_Vector Procedure contains additional explanation of this code listing.
subroutine Initialize_Distributed_Vector (DV, Structure, Dimensionality, & Name, status, dim1, dim2, dim3) ! Use associations. use Caesar_Flags_Module, only: initialized_flag ! Input variables. type(Base_Structure_type), target :: Structure ! Base structure. type(character,*), intent(in), optional :: Name ! Variable name. type(integer), intent(in) :: Dimensionality ! Dimensionality for this DV. type(integer), intent(in), optional :: dim1, dim2, dim3 ! Dimensions. ! Output variables. ! Distributed_Vector to be initialized. type(Distributed_Vector_type), intent(out) :: DV type(Status_type), intent(out), optional :: status ! Exit status. ! Internal variables. type(Status_type), dimension(3) :: allocate_status ! Allocation Status. type(Status_type) :: consolidated_status ! Consolidated Status. type(integer) :: NSlice ! Number of values that are on one ! slice, given by a constant location ! on the distributed axis. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(Structure),5) ! Structure is valid. VERIFY(Dimensionality .InInterval. (/1,4/),5) ! Dimensionality is in range. VERIFY(PRESENT(dim1) .or. Dimensionality == 1,5) ! Proper dimensions exist. VERIFY(PRESENT(dim2) .or. Dimensionality <= 2,5) ! Proper dimensions exist. VERIFY(PRESENT(dim3) .or. Dimensionality <= 3,5) ! Proper dimensions exist. ! Set up structure pointer. DV%Structure => Structure ! Allocations and initializations. call Initialize (allocate_status) call Initialize (consolidated_status) call Initialize (DV%NValues_Vector, NPEs, allocate_status(1)) ! Set to maximum dimensionality of 4 to enable VERIFYs without if-checks. ! Also, this gets around problems with using the dimensionality when it ! is set to a negative number for a ragged right array. call Initialize (DV%Dimensions, 4, allocate_status(2)) DV%Dimensions(Dimensionality) = Length_PE(Structure) select case (Dimensionality) case (1) call Initialize (DV%Values1, Length_PE(Structure), allocate_status(3)) case (2) call Initialize (DV%Values2, dim1, Length_PE(Structure), & allocate_status(3)) DV%Dimensions(1) = dim1 case (3) call Initialize (DV%Values3, dim1, dim2, Length_PE(Structure), & allocate_status(3)) DV%Dimensions(1) = dim1 DV%Dimensions(2) = dim2 case (4) call Initialize (DV%Values4, dim1, dim2, dim3, Length_PE(Structure), & allocate_status(3)) DV%Dimensions(1) = dim1 DV%Dimensions(2) = dim2 DV%Dimensions(3) = dim3 !case (-1) ! call Initialize (DV%ValuesRR, Length_PE(Structure), & ! allocate_status) ! DV%NValues_Total = F(Length_Total(Structure)) end select NSlice = PRODUCT(DV%Dimensions(1:Dimensionality-1)) ! Set NValues numbers. (This won't work for Ragged Right arrays -- ! where the number of values is a function of the length axis.) DV%NValues_Total = NSlice * Length_Total(Structure) DV%NValues_PE = NSlice * Length_PE(Structure) DV%NValues_Vector = NSlice * Length_Vector(Structure) consolidated_status = allocate_status if (PRESENT(status)) then WARN_IF(Error(consolidated_status), 5) status = consolidated_status else VERIFY(Normal(consolidated_status), 5) end if call Finalize (consolidated_status) call Finalize (allocate_status) ! Set up internals. if (PRESENT(Name)) DV%Name = Name DV%Dimensionality = Dimensionality DV%Version = 0 ! Set initialization flag. DV%Initialized = initialized_flag ! Verify guarantees. VERIFY(Valid_State(DV),5) ! DV is now valid. return end subroutine Initialize_Distributed_Vector