From f9da2a62f240670b75db7f5b312d646d8f9db1d9 Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Fri, 4 Dec 2020 09:25:12 -0700 Subject: [PATCH] feature/perf_updates --- streams/dshr_methods_mod.F90 | 113 +++++++++++++++++------------------ 1 file changed, 54 insertions(+), 59 deletions(-) diff --git a/streams/dshr_methods_mod.F90 b/streams/dshr_methods_mod.F90 index b16d0ad4..aa68721a 100644 --- a/streams/dshr_methods_mod.F90 +++ b/streams/dshr_methods_mod.F90 @@ -156,11 +156,12 @@ subroutine dshr_fldbun_GetFldPtr(FB, fldname, fldptr1, fldptr2, rank, field, rc) real(R8), pointer , intent(inout), optional :: fldptr2(:,:) integer , intent(out), optional :: rank type(ESMF_Field) , intent(out), optional :: field - integer , intent(out) :: rc + integer , intent(out) :: rc ! local variables - type(ESMF_Field) :: lfield - integer :: lrank + integer :: lrank + type(ESMF_Field) :: lfield + integer :: ungriddedUBound(1) character(len=*), parameter :: subname='(dshr_fldbun_GetFldPtr)' ! ---------------------------------------------- @@ -171,16 +172,35 @@ subroutine dshr_fldbun_GetFldPtr(FB, fldname, fldptr1, fldptr2, rank, field, rc) rc = ESMF_FAILURE return endif - call ESMF_FieldBundleGet(FB, fieldName=trim(fldname), field=lfield, rc=rc) if (chkerr(rc,__LINE__,u_FILE_u)) return - call dshr_field_getfldptr(lfield, fldptr1=fldptr1, fldptr2=fldptr2, rank=lrank, rc=rc) + call ESMF_FieldGet(lfield, ungriddedUBound=ungriddedUBound, rc=rc) if (chkerr(rc,__LINE__,u_FILE_u)) return - + if (ungriddedUBound(1) > 0) then + if (.not.present(fldptr2)) then + call ESMF_LogWrite(trim(subname)//": ERROR missing rank=2 array ", & + ESMF_LOGMSG_ERROR, line=__LINE__, file=u_FILE_u) + rc = ESMF_FAILURE + return + endif + call ESMF_FieldGet(lfield, farrayptr=fldptr2, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + lrank = 2 + else + if (.not.present(fldptr1)) then + call ESMF_LogWrite(trim(subname)//": ERROR missing rank=1 array ", & + ESMF_LOGMSG_ERROR, line=__LINE__, file=u_FILE_u) + rc = ESMF_FAILURE + return + endif + call ESMF_FieldGet(lfield, farrayptr=fldptr1, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + lrank = 1 + end if if (present(rank)) rank = lrank if (present(field)) field = lfield - end subroutine dshr_fldbun_getfldptr + end subroutine dshr_fldbun_GetFldPtr !=============================================================================== subroutine dshr_fldbun_regrid(FBsrc, FBdst, RH, zeroregion, rc) @@ -509,79 +529,54 @@ subroutine dshr_field_getfldptr(field, fldptr1, fldptr2, rank, abort, rc) ! local variables type(ESMF_FieldStatus_Flag) :: status - type(ESMF_Mesh) :: lmesh - integer :: lrank, nnodes, nelements + integer :: ungriddedUBound(1) + integer :: lrank logical :: labort character(len=*), parameter :: subname='(field_getfldptr)' ! ---------------------------------------------- - rc = ESMF_SUCCESS labort = .true. if (present(abort)) then labort = abort endif - lrank = -99 call ESMF_FieldGet(field, status=status, rc=rc) if (chkerr(rc,__LINE__,u_FILE_u)) return - if (status /= ESMF_FIELDSTATUS_COMPLETE) then - - lrank = 0 if (labort) then - call ESMF_LogWrite(trim(subname)//": ERROR data not allocated ", ESMF_LOGMSG_INFO, rc=rc) + call ESMF_LogWrite(trim(subname)//": ERROR data not allocated ", ESMF_LOGMSG_ERROR, rc=rc) rc = ESMF_FAILURE return else call ESMF_LogWrite(trim(subname)//": WARNING data not allocated ", ESMF_LOGMSG_INFO, rc=rc) endif - else - - call ESMF_FieldGet(field, rank=lrank, rc=rc) - if (chkerr(rc,__LINE__,u_FILE_u)) return - call ESMF_FieldGet(field, mesh=lmesh, rc=rc) - if (chkerr(rc,__LINE__,u_FILE_u)) return - call ESMF_MeshGet(lmesh, numOwnedNodes=nnodes, numOwnedElements=nelements, rc=rc) - if (chkerr(rc,__LINE__,u_FILE_u)) return - if (nnodes == 0 .and. nelements == 0) then - lrank = 0 - end if - - if (lrank == 0) then - call ESMF_LogWrite(trim(subname)//": no local nodes or elements ", & - ESMF_LOGMSG_INFO) - elseif (lrank == 1) then - if (.not.present(fldptr1)) then - call ESMF_LogWrite(trim(subname)//": ERROR missing rank=1 array ", & - ESMF_LOGMSG_ERROR, line=__LINE__, file=u_FILE_u) - rc = ESMF_FAILURE - return - endif - call ESMF_FieldGet(field, farrayPtr=fldptr1, rc=rc) - if (chkerr(rc,__LINE__,u_FILE_u)) return - elseif (lrank == 2) then - if (.not.present(fldptr2)) then - call ESMF_LogWrite(trim(subname)//": ERROR missing rank=2 array ", & - ESMF_LOGMSG_ERROR, line=__LINE__, file=u_FILE_u) - rc = ESMF_FAILURE - return - endif - call ESMF_FieldGet(field, farrayPtr=fldptr2, rc=rc) - if (chkerr(rc,__LINE__,u_FILE_u)) return - else - call ESMF_LogWrite(trim(subname)//": ERROR in rank ", & - ESMF_LOGMSG_ERROR, line=__LINE__, file=u_FILE_u) - rc = ESMF_FAILURE - return - endif - + call ESMF_FieldGet(field, ungriddedUBound=ungriddedUBound, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + if (ungriddedUBound(1) > 0) then + if (.not.present(fldptr2)) then + call ESMF_LogWrite(trim(subname)//": ERROR missing rank=2 array ", & + ESMF_LOGMSG_ERROR, line=__LINE__, file=u_FILE_u) + rc = ESMF_FAILURE + return + endif + call ESMF_FieldGet(field, farrayptr=fldptr2, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + lrank = 2 + else + if (.not.present(fldptr1)) then + call ESMF_LogWrite(trim(subname)//": ERROR missing rank=1 array ", & + ESMF_LOGMSG_ERROR, line=__LINE__, file=u_FILE_u) + rc = ESMF_FAILURE + return + endif + call ESMF_FieldGet(field, farrayptr=fldptr1, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + lrank = 1 + end if endif ! status - - if (present(rank)) then - rank = lrank - endif + if (present(rank)) rank = lrank end subroutine dshr_field_getfldptr