Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

performance udpates #33

Merged
merged 1 commit into from
Dec 7, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 54 additions & 59 deletions streams/dshr_methods_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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)'
! ----------------------------------------------

Expand All @@ -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)
Expand Down Expand Up @@ -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

Expand Down