D.1.1 Initialize_Trace Procedure

The main documentation of the Initialize_Trace Procedure contains additional explanation of this code listing.

  define([INITIALIZE_ROUTINE],[
    pushdef([DIM], [$1])
    pushdef([Initialize_Trace_DIM], expand(Initialize_Trace_DIM))

    subroutine Initialize_Trace_DIM (Trace, Index, Length_PE, status)
  
      ! Input variables.
  
      type(integer,DIM,np), intent(in) :: Index ! Indirect reference indices.
      type(integer) :: Length_PE ! Length of destination vector on this PE.
  
      ! Output variables.
  
      ! Trace to be initialized.
      type(Trace_type), intent(out) :: Trace 
      type(Status_type), intent(out), optional :: status  ! Exit status.
  
      ! Internal variables.
  
      type(Status_type), dimension(2) :: allocate_status ! Allocation Status.
      type(Status_type) :: consolidated_status         ! Consolidated Status.
  
      !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  
      ! Verify requirements.
  
      VERIFY(Valid_State(Index),5) ! Index is valid.
  
      ! Set allocation status.
  
      call Initialize (allocate_status)
      call Initialize (consolidated_status)

      ! Initialize internal structures.

      ifelse(DIM, [1], [
        call Initialize (Trace%Index1, SIZE(Index,1), allocate_status(1))
        call Initialize (Trace%Mask1,  SIZE(Index,1), allocate_status(2))
      ],[
        call Initialize (Trace%Index2, SIZE(Index,1), SIZE(Index,2), &
                         allocate_status(1))
        call Initialize (Trace%Mask2,  SIZE(Index,1), SIZE(Index,2), &
                         allocate_status(2))
      ])
      Trace%Index[]DIM = Index
      Trace%Dimensionality = DIM
      Trace%Mask[]DIM = Index /= 0

      ! PGSLib Trace set-up.

      ifdef([USE_PGSLIB],[
        NULLIFY(Trace%Trace)
        Trace%Trace => PGSLib_Setup_Trace (Trace%Index[]DIM, Length_PE, &
                                           Mask=Trace%Mask[]DIM)
      ])

      ! Process status variables.
  
      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 initialization flag.
  
      call Initialize (Trace%Initialized, 0)
  
      ! Verify guarantees.
  
      VERIFY(Valid_State(Trace),5)  ! Trace is now valid.
  
      return
    end subroutine Initialize_Trace_DIM

    popdef([DIM])
    popdef([Initialize_Trace_DIM])
  ])

  forloop([Dim],[1],[2],[
    INITIALIZE_ROUTINE(Dim)
  ])



Michael L. Hall