D.2.9 Global Reduction Functions

The main documentation of the Global Reduction Functions contains additional explanation of this code listing.

  define([REDUCTION_ROUTINE],[
    pushdef([REDUCTION], [$1])
    pushdef([TYPE], [$2])
    pushdef([DIM], [$3])
    pushdef([Global_REDUCTION_TYPE_DIM], expand(Global_REDUCTION_TYPE_DIM))
    pushdef([PGSLib_Global_REDUCTION], expand(PGSLib_Global_REDUCTION))

    function Global_REDUCTION_TYPE_DIM (Input) result(Output)

      ! Input variable.
  
      type(TYPE,DIM,np), intent(in) :: Input  ! Variable to be reduced.

      ! Output variable.
  
      type(TYPE) :: Output  ! Reduction result.
  
      !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      ! Verify requirements - none.
  
      ! Do the global reduction.

      ifdef([USE_PGSLIB],[
    
        ! PGSLib parallel reduction.
    
        Output = PGSLib_Global_REDUCTION (Input)
  
      ],[
    
        ! Serial reduction.
  
        Output = REDUCTION (Input)
    
      ])

      ! Verify guarantees - none.
  
      return
    end function Global_REDUCTION_TYPE_DIM
  
    popdef([TYPE])
    popdef([REDUCTION])
    popdef([DIM])
    popdef([Global_REDUCTION_TYPE_DIM])
    popdef([PGSLib_Global_REDUCTION])
  ])

  forloop([Dim],[0],[2],[
    fortext([Type],[real integer],[
      fortext([Op],[Sum MaxVal MinVal],[
        REDUCTION_ROUTINE(Op, Type, Dim)
      ])
    ])
    fortext([Op],[ALL ANY],[
      REDUCTION_ROUTINE(Op, logical, Dim)
    ])
  ])

  define([DOT_PRODUCT_ROUTINE],[
    pushdef([TYPE], [$1])
    pushdef([Global_Dot_Product_TYPE], expand(Global_Dot_Product_TYPE))

    function Global_Dot_Product_TYPE (Input1, Input2) result(Output)

      ! Input variable.
  
      type(TYPE,1,np), intent(in) :: Input1 ! Variable to be reduced.
      type(TYPE,1,np), intent(in) :: Input2 ! Variable to be reduced.

      ! Output variable.
  
      type(TYPE) :: Output  ! Dot_Product result.
  
      !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      ! Verify requirements - none.
  
      ! Do the global dot_product.

      ifdef([USE_PGSLIB],[
    
        ! PGSLib parallel dot_product.
    
        Output = PGSLib_Global_Dot_Product (Input1, Input2)
  
      ],[
    
        ! Serial dot_product.
  
        Output = Dot_Product (Input1, Input2)
    
      ])

      ! Verify guarantees - none.
  
      return
    end function Global_Dot_Product_TYPE
  
    popdef([TYPE])
    popdef([Global_Dot_Product_TYPE])
  ])

  fortext([Type],[real integer logical],[
    DOT_PRODUCT_ROUTINE(Type)
  ])



Michael L. Hall