The main documentation of the Combine_DV_from_CA Procedure contains additional explanation of this code listing.
define([COMBINE_ROUTINE],[ pushdef([OP], [$1]) pushdef([Combine_with_OP_DV_from_CA], expand(Combine_with_$1_DV_from_CA)) subroutine Combine_with_OP_DV_from_CA (DV, CA) ! Input variable. type(Collected_Array_type), intent(in) :: CA ! Variable to be combined. ! Input/Output variable. type(Distributed_Vector_type), intent(inout) :: DV ! Resultant DV. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(CA),5) ! CA is valid. VERIFY(Valid_State(DV),5) ! DV is valid. VERIFY(CA%Dimensionality == DV%Dimensionality,5) ! Same dimensionality. VERIFY(CA%Dimensions(1:CA%Dimensionality) == dnl DV%Dimensions(1:DV%Dimensionality),5) ! Same dimensions. VERIFY(ASSOCIATED(CA%One_Structure,DV%Structure),5) ! Same one-structure. ! Combine the values. There are different versions based on the ! dimensionality of the Index and on the dimensionality of the "Array" ! itself. select case (CA%Many_of_One_Index%Dimensionality) ! Vector Index - no combination necessary. case (1) ! Switch on the dimensionality of the data itself. select case (CA%Dimensionality) case (1) DV%Values1 = CA%Values1 case (2) DV%Values2 = CA%Values2 case (3) DV%Values3 = CA%Values3 case (4) DV%Values4 = CA%Values4 end select ! Array Index. Shape of CA%Values must be: ! ! CA%Values ( [dim1, [dim2, [dim3, ]]] One_Axis, Many_Axis ) case (2) ! Switch on the dimensionality of the data itself. select case (CA%Dimensionality) case (1) DV%Values1(:) = OPERATION(CA%Values2, 2) ifelse(OP, [Average], [ DV%Values1 = DV%Values1 / changetype(real,SIZE(CA%Values2, 2)) ]) case (2) DV%Values2(:,:) = OPERATION(CA%Values3, 3) ifelse(OP, [Average], [ DV%Values2 = DV%Values2 / changetype(real,SIZE(CA%Values3, 3)) ]) case (3) DV%Values3(:,:,:) = OPERATION(CA%Values4, 4) ifelse(OP, [Average], [ DV%Values3 = DV%Values3 / changetype(real,SIZE(CA%Values4, 4)) ]) case (4) DV%Values4(:,:,:,:) = OPERATION(CA%Values5, 5) ifelse(OP, [Average], [ DV%Values4 = DV%Values4 / changetype(real,SIZE(CA%Values5, 5)) ]) end select end select ! Set version number. DV = Version(CA) ! Verify guarantees. VERIFY(Valid_State(CA),5) ! CA is still valid. VERIFY(Valid_State(DV),5) ! DV is valid. return end subroutine Combine_with_OP_DV_from_CA popdef([OP]) popdef([OPERATION]) popdef([Combine_with_OP_DV_from_CA]) ]) ! Add "Conserve" later if needed. fortext([Op],[Average SUM MAX MIN],[ ifelse( Op, [MAX], [ pushdef([OPERATION], [MAXVAL[]($1, $2)]) ], Op, [MIN], [ pushdef([OPERATION], [MINVAL[]($1, $2)]) ], [ pushdef([OPERATION], [SUM[]($1, $2)]) ] ) COMBINE_ROUTINE(Op) ])