x_comp_check_field Subroutine

private subroutine x_comp_check_field(xstate, xfield, rc)

Arguments

Type IntentOptional Attributes Name
type(xdata_state), intent(in), pointer :: xstate
type(xdata_field), intent(inout), pointer :: xfield
integer, intent(out) :: rc

Calls

proc~~x_comp_check_field~~CallsGraph proc~x_comp_check_field x_comp_check_field interface~esmf_vmreduce ESMF_VMReduce proc~x_comp_check_field->interface~esmf_vmreduce proc~esmf_logfounderror ESMF_LogFoundError proc~x_comp_check_field->proc~esmf_logfounderror proc~esmf_logseterror ESMF_LogSetError proc~x_comp_check_field->proc~esmf_logseterror proc~esmf_vmreducei4 ESMF_VMReduceI4 interface~esmf_vmreduce->proc~esmf_vmreducei4 proc~esmf_vmreducei8 ESMF_VMReduceI8 interface~esmf_vmreduce->proc~esmf_vmreducei8 proc~esmf_vmreducer4 ESMF_VMReduceR4 interface~esmf_vmreduce->proc~esmf_vmreducer4 proc~esmf_vmreducer8 ESMF_VMReduceR8 interface~esmf_vmreduce->proc~esmf_vmreducer8 esmf_breakpoint esmf_breakpoint proc~esmf_logfounderror->esmf_breakpoint proc~esmf_logrc2msg ESMF_LogRc2Msg proc~esmf_logfounderror->proc~esmf_logrc2msg proc~esmf_logwrite ESMF_LogWrite proc~esmf_logfounderror->proc~esmf_logwrite proc~esmf_logseterror->esmf_breakpoint proc~esmf_logseterror->proc~esmf_logrc2msg proc~esmf_logseterror->proc~esmf_logwrite c_esmc_loggeterrormsg c_esmc_loggeterrormsg proc~esmf_logrc2msg->c_esmc_loggeterrormsg c_esmc_vmwtime c_esmc_vmwtime proc~esmf_logwrite->c_esmc_vmwtime proc~esmf_logclose ESMF_LogClose proc~esmf_logwrite->proc~esmf_logclose proc~esmf_logflush ESMF_LogFlush proc~esmf_logwrite->proc~esmf_logflush proc~esmf_logopenfile ESMF_LogOpenFile proc~esmf_logwrite->proc~esmf_logopenfile proc~esmf_utiliounitflush ESMF_UtilIOUnitFlush proc~esmf_logwrite->proc~esmf_utiliounitflush proc~esmf_utilstring2array ESMF_UtilString2Array proc~esmf_logwrite->proc~esmf_utilstring2array proc~esmf_vmreducei4->proc~esmf_logfounderror proc~esmf_vmreducei4->proc~esmf_logseterror interface~c_esmc_vmreduce c_ESMC_VMReduce proc~esmf_vmreducei4->interface~c_esmc_vmreduce proc~esmf_imerr ESMF_IMErr proc~esmf_vmreducei4->proc~esmf_imerr proc~esmf_vmgetinit ESMF_VMGetInit proc~esmf_vmreducei4->proc~esmf_vmgetinit proc~esmf_vmreducei8->proc~esmf_logfounderror proc~esmf_vmreducei8->proc~esmf_logseterror proc~esmf_vmreducei8->interface~c_esmc_vmreduce proc~esmf_vmreducei8->proc~esmf_imerr proc~esmf_vmreducei8->proc~esmf_vmgetinit proc~esmf_vmreducer4->proc~esmf_logfounderror proc~esmf_vmreducer4->proc~esmf_logseterror proc~esmf_vmreducer4->interface~c_esmc_vmreduce proc~esmf_vmreducer4->proc~esmf_imerr proc~esmf_vmreducer4->proc~esmf_vmgetinit proc~esmf_vmreducer8->proc~esmf_logfounderror proc~esmf_vmreducer8->proc~esmf_logseterror proc~esmf_vmreducer8->interface~c_esmc_vmreduce proc~esmf_vmreducer8->proc~esmf_imerr proc~esmf_vmreducer8->proc~esmf_vmgetinit proc~esmf_imerr->proc~esmf_logfounderror proc~esmf_initcheckdeep ESMF_InitCheckDeep proc~esmf_imerr->proc~esmf_initcheckdeep proc~esmf_logclose->proc~esmf_logflush proc~esmf_logflush->proc~esmf_utiliounitflush proc~esmf_utilarray2string ESMF_UtilArray2String proc~esmf_logflush->proc~esmf_utilarray2string proc~esmf_logopenfile->proc~esmf_utiliounitflush proc~esmf_utiliounitget ESMF_UtilIOUnitGet proc~esmf_logopenfile->proc~esmf_utiliounitget

Called by

proc~~x_comp_check_field~~CalledByGraph proc~x_comp_check_field x_comp_check_field proc~modeladvance ModelAdvance proc~modeladvance->proc~x_comp_check_field

Source Code

  subroutine x_comp_check_field(xstate, xfield, rc)
    ! arguments
    type(xdata_state), pointer, intent(in)    :: xstate
    type(xdata_field), pointer, intent(inout) :: xfield
    integer, intent(out)                      :: rc
    ! local variables

    rc = ESMF_SUCCESS

    if (.not. associated(xstate)) then
      call ESMF_LogSetError(ESMF_RC_PTR_NOTALLOC, &
        msg='XDATA: xstate has not been associated', &
        line=__LINE__, file=__FILE__, rcToReturn=rc)
      return
    endif

    if (xfield%rlze) then
      if(xfield%fdim .eq. 3) then
        xfield%lsum(1)=sum(xfield%ptr3,xfield%ptr3.ne.filv)
        xfield%lsum(2)=count(xfield%ptr3.ne.filv)
        xfield%lmin(1)=minval(xfield%ptr3,xfield%ptr3.ne.filv)
        xfield%lmax(1)=maxval(xfield%ptr3,xfield%ptr3.ne.filv)
      elseif(xfield%fdim .eq. 2) then
        xfield%lsum(1)=sum(xfield%ptr2,xfield%ptr2.ne.filv)
        xfield%lsum(2)=count(xfield%ptr2.ne.filv)
        xfield%lmin(1)=minval(xfield%ptr2,xfield%ptr2.ne.filv)
        xfield%lmax(1)=maxval(xfield%ptr2,xfield%ptr2.ne.filv)
      else
        call ESMF_LogSetError(ESMF_RC_NOT_IMPL, &
          msg=trim(xstate%cname)//": field dimension - "//trim(xfield%stdn), &
          line=__LINE__, file=__FILE__, rcToReturn=rc)
        return
      endif
      call ESMF_VMReduce(vm=xstate%vm, sendData=xfield%lsum, &
        recvData=xfield%gsum, count=2, &
        reduceflag=ESMF_REDUCE_SUM, rootPet=xstate%outid, rc=rc)
      if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
        line=__LINE__, file=__FILE__)) return
      call ESMF_VMReduce(vm=xstate%vm, sendData=xfield%lmin, &
        recvData=xfield%gmin, count=1, &
        reduceflag=ESMF_REDUCE_MIN, rootPet=xstate%outid, rc=rc)
      if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
        line=__LINE__, file=__FILE__)) return
      call ESMF_VMReduce(vm=xstate%vm, sendData=xfield%lmax, &
        recvData=xfield%gmax, count=1, &
        reduceflag=ESMF_REDUCE_MAX, rootPet=xstate%outid, rc=rc)
      if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
        line=__LINE__, file=__FILE__)) return
      if (xstate%myid .eq. xstate%outid) then
        ! calculate average
        if(xfield%gsum(2) .lt. 1) then
          xfield%gavg = 0.0_ESMF_KIND_R8
        else
          xfield%gavg = xfield%gsum(1) / xfield%gsum(2)
        endif
        ! check
        if((xfield%gmin(1) .lt. xfield%minv) .or. &
           (xfield%gmax(1) .gt. xfield%maxv)) then
          xfield%okay = .false.
        else
          xfield%okay = .true.
        endif
      endif
    else
      xfield%gsum = (/filv, 0.0_ESMF_KIND_R8/)
      xfield%gmin = filv
      xfield%gmax = filv
      xfield%gavg = 0.0_ESMF_KIND_R8
      xfield%okay = .false.
    endif
  endsubroutine x_comp_check_field