From d7788e3b8cd702e4a20343b160179edf6463c1a3 Mon Sep 17 00:00:00 2001 From: Ufuk Turuncoglu Date: Tue, 26 Aug 2025 09:49:39 -0600 Subject: [PATCH 1/6] add extra option for ESMX data component --- src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 | 33 +++++++++++++++----- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 index 731e39bbe6..5a999fceec 100644 --- a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 +++ b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 @@ -23,6 +23,9 @@ module esmx_data character(len=64) :: stdn = "dummy" integer :: fdim = 2 real(ESMF_KIND_R8) :: dflt = filv + character(len=6) :: scheme = "const" + integer :: member = 1 + integer :: step = 1 logical :: rlze = .false. real(ESMF_KIND_R8) :: minv = filv real(ESMF_KIND_R8) :: maxv = filv @@ -249,7 +252,8 @@ subroutine Advertise(xdata, rc) ! advertise export fields xfield => xstate%exp_flds_head do while (associated(xfield)) - call NUOPC_Advertise(exportState, xfield%stdn, rc=rc) + call NUOPC_Advertise(exportState, xfield%stdn, & + TransferOfferGeomObject='will provide', rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return xfield => xfield%nfld @@ -379,8 +383,8 @@ subroutine DataInitialize(xdata, rc) xfield => xstate%imp_flds_head do while (associated(xfield)) if (xfield%rlze) then - call ESMF_FieldFill(xfield%efld, dataFillScheme="const", & - const1=xfield%dflt, rc=rc) + call ESMF_FieldFill(xfield%efld, dataFillScheme=trim(xfield%scheme), & + const1=xfield%dflt, member=xfield%member, step=xfield%step, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return endif @@ -391,8 +395,8 @@ subroutine DataInitialize(xdata, rc) xfield => xstate%exp_flds_head do while (associated(xfield)) if (xfield%rlze) then - call ESMF_FieldFill(xfield%efld, dataFillScheme="const", & - const1=xfield%dflt, rc=rc) + call ESMF_FieldFill(xfield%efld, dataFillScheme=trim(xfield%scheme), & + const1=xfield%dflt, member=xfield%member, step=xfield%step, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return call NUOPC_SetAttribute(xfield%efld, & @@ -1090,8 +1094,11 @@ subroutine x_comp_read_fields(xdatacfg, xstate, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return check = ESMF_HConfigValidateMapKeys(fieldcfg, & - vocabulary=["dim", & - "val" & + vocabulary=["dim ", & + "scheme", & + "member", & + "step ", & + "val " & ], badKey=badKey, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return @@ -1128,6 +1135,18 @@ subroutine x_comp_read_fields(xdatacfg, xstate, rc) defaultValue=0.0_ESMF_KIND_R8, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return + xfield%scheme = x_comp_hconfig_str(fieldcfg, "scheme", & + defaultValue="const", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__)) return + xfield%member = x_comp_hconfig_i4(fieldcfg, "member", & + defaultValue=1, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__)) return + xfield%step = x_comp_hconfig_i4(fieldcfg, "step", & + defaultValue=1, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__)) return xfield%nfld => null() if (.not. associated(xstate%exp_flds_head)) then xstate%exp_flds_head => xfield From 3892d4a0523cc0d7d61acc1ada47a87f8156bda5 Mon Sep 17 00:00:00 2001 From: Ufuk Turuncoglu Date: Wed, 27 Aug 2025 16:36:57 -0600 Subject: [PATCH 2/6] enable range for fields --- src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 | 53 +++++++++++++++----- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 index 5a999fceec..4fbde731ba 100644 --- a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 +++ b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 @@ -25,7 +25,6 @@ module esmx_data real(ESMF_KIND_R8) :: dflt = filv character(len=6) :: scheme = "const" integer :: member = 1 - integer :: step = 1 logical :: rlze = .false. real(ESMF_KIND_R8) :: minv = filv real(ESMF_KIND_R8) :: maxv = filv @@ -252,8 +251,7 @@ subroutine Advertise(xdata, rc) ! advertise export fields xfield => xstate%exp_flds_head do while (associated(xfield)) - call NUOPC_Advertise(exportState, xfield%stdn, & - TransferOfferGeomObject='will provide', rc=rc) + call NUOPC_Advertise(exportState, xfield%stdn, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return xfield => xfield%nfld @@ -384,9 +382,23 @@ subroutine DataInitialize(xdata, rc) do while (associated(xfield)) if (xfield%rlze) then call ESMF_FieldFill(xfield%efld, dataFillScheme=trim(xfield%scheme), & - const1=xfield%dflt, member=xfield%member, step=xfield%step, rc=rc) + const1=xfield%dflt, member=xfield%member, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return + if (xfield%minv .ne. filv .and. xfield%maxv .ne. filv) then + if (xfield%fdim .eq. 3) then + xfield%ptr3 = (((xfield%maxv-xfield%minv)/2.0_ESMF_KIND_R8)*xfield%ptr3)+ & + ((xfield%maxv+xfield%minv)/2.0_ESMF_KIND_R8) + elseif (xfield%fdim .eq. 2) then + xfield%ptr2 = (((xfield%maxv-xfield%minv)/2.0_ESMF_KIND_R8)*xfield%ptr2)+ & + ((xfield%maxv+xfield%minv)/2.0_ESMF_KIND_R8) + 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 + end if endif xfield => xfield%nfld enddo @@ -396,9 +408,23 @@ subroutine DataInitialize(xdata, rc) do while (associated(xfield)) if (xfield%rlze) then call ESMF_FieldFill(xfield%efld, dataFillScheme=trim(xfield%scheme), & - const1=xfield%dflt, member=xfield%member, step=xfield%step, rc=rc) + const1=xfield%dflt, member=xfield%member, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return + if (xfield%minv .ne. filv .and. xfield%maxv .ne. filv) then + if (xfield%fdim .eq. 3) then + xfield%ptr3 = (((xfield%maxv-xfield%minv)/2.0_ESMF_KIND_R8)*xfield%ptr3)+ & + ((xfield%maxv+xfield%minv)/2.0_ESMF_KIND_R8) + elseif (xfield%fdim .eq. 2) then + xfield%ptr2 = (((xfield%maxv-xfield%minv)/2.0_ESMF_KIND_R8)*xfield%ptr2)+ & + ((xfield%maxv+xfield%minv)/2.0_ESMF_KIND_R8) + 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 + end if call NUOPC_SetAttribute(xfield%efld, & name="Updated", value="true", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -1095,9 +1121,10 @@ subroutine x_comp_read_fields(xdatacfg, xstate, rc) line=__LINE__, file=__FILE__)) return check = ESMF_HConfigValidateMapKeys(fieldcfg, & vocabulary=["dim ", & + "min ", & + "max ", & "scheme", & "member", & - "step ", & "val " & ], badKey=badKey, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -1129,8 +1156,14 @@ subroutine x_comp_read_fields(xdatacfg, xstate, rc) xfield%gmin = filv xfield%gmax = filv xfield%gavg = filv - xfield%minv = 0.0_ESMF_KIND_R8 - xfield%maxv = 0.0_ESMF_KIND_R8 + xfield%minv = x_comp_hconfig_r8(fieldcfg, "min", & + defaultValue=filv, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__)) return + xfield%maxv = x_comp_hconfig_r8(fieldcfg, "max", & + defaultValue=filv, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__)) return xfield%dflt = x_comp_hconfig_r8(fieldcfg, "val", & defaultValue=0.0_ESMF_KIND_R8, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -1143,10 +1176,6 @@ subroutine x_comp_read_fields(xdatacfg, xstate, rc) defaultValue=1, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return - xfield%step = x_comp_hconfig_i4(fieldcfg, "step", & - defaultValue=1, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=__FILE__)) return xfield%nfld => null() if (.not. associated(xstate%exp_flds_head)) then xstate%exp_flds_head => xfield From e7fd17f770c1af010abafe5419672a9ca06f9285 Mon Sep 17 00:00:00 2001 From: Ufuk Turuncoglu Date: Wed, 27 Aug 2025 16:45:36 -0600 Subject: [PATCH 3/6] activate range just for sincos --- src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 index 4fbde731ba..d0b10113c1 100644 --- a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 +++ b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 @@ -385,7 +385,8 @@ subroutine DataInitialize(xdata, rc) const1=xfield%dflt, member=xfield%member, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return - if (xfield%minv .ne. filv .and. xfield%maxv .ne. filv) then + if (trim(xfield%scheme) == "sincos" .and. & + (xfield%minv .ne. filv .and. xfield%maxv .ne. filv)) then if (xfield%fdim .eq. 3) then xfield%ptr3 = (((xfield%maxv-xfield%minv)/2.0_ESMF_KIND_R8)*xfield%ptr3)+ & ((xfield%maxv+xfield%minv)/2.0_ESMF_KIND_R8) @@ -411,7 +412,8 @@ subroutine DataInitialize(xdata, rc) const1=xfield%dflt, member=xfield%member, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return - if (xfield%minv .ne. filv .and. xfield%maxv .ne. filv) then + if (trim(xfield%scheme) == "sincos" .and. & + (xfield%minv .ne. filv .and. xfield%maxv .ne. filv)) then if (xfield%fdim .eq. 3) then xfield%ptr3 = (((xfield%maxv-xfield%minv)/2.0_ESMF_KIND_R8)*xfield%ptr3)+ & ((xfield%maxv+xfield%minv)/2.0_ESMF_KIND_R8) From 17269d1ea0c18be68d8d9c52244b74018f1c381b Mon Sep 17 00:00:00 2001 From: Ufuk Turuncoglu Date: Thu, 28 Aug 2025 09:18:58 -0600 Subject: [PATCH 4/6] change default value of min, max for import --- src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 index d0b10113c1..72b52e056e 100644 --- a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 +++ b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 @@ -1072,11 +1072,11 @@ subroutine x_comp_read_fields(xdatacfg, xstate, rc) xfield%gmax = filv xfield%gavg = filv xfield%minv = x_comp_hconfig_r8(fieldcfg, "min", & - defaultValue=0.0_ESMF_KIND_R8, rc=rc) + defaultValue=filv, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return xfield%maxv = x_comp_hconfig_r8(fieldcfg, "max", & - defaultValue=0.0_ESMF_KIND_R8, rc=rc) + defaultValue=filv, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return xfield%dflt = filv From 4d6099017698c3ad154471b2120f84bfebe100cf Mon Sep 17 00:00:00 2001 From: Ufuk Turuncoglu Date: Wed, 29 Oct 2025 09:39:47 -0600 Subject: [PATCH 5/6] fix style --- src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 index 72b52e056e..b40b0e15c4 100644 --- a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 +++ b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 @@ -399,7 +399,7 @@ subroutine DataInitialize(xdata, rc) line=__LINE__, file=__FILE__, rcToReturn=rc) return endif - end if + endif endif xfield => xfield%nfld enddo @@ -426,7 +426,7 @@ subroutine DataInitialize(xdata, rc) line=__LINE__, file=__FILE__, rcToReturn=rc) return endif - end if + endif call NUOPC_SetAttribute(xfield%efld, & name="Updated", value="true", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -1499,7 +1499,6 @@ subroutine x_comp_check_field(xstate, xfield, rc) 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. From ae7d392005cf52c6686aecc440594ba78b768d05 Mon Sep 17 00:00:00 2001 From: Ufuk Turuncoglu Date: Wed, 29 Oct 2025 09:53:36 -0600 Subject: [PATCH 6/6] remove mods in import state --- src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 | 44 +++++++------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 index b40b0e15c4..5b2c877a21 100644 --- a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 +++ b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 @@ -23,8 +23,8 @@ module esmx_data character(len=64) :: stdn = "dummy" integer :: fdim = 2 real(ESMF_KIND_R8) :: dflt = filv - character(len=6) :: scheme = "const" - integer :: member = 1 + character(len=6) :: fill_mod = "const" + integer :: fill_nwave = 1 logical :: rlze = .false. real(ESMF_KIND_R8) :: minv = filv real(ESMF_KIND_R8) :: maxv = filv @@ -381,25 +381,8 @@ subroutine DataInitialize(xdata, rc) xfield => xstate%imp_flds_head do while (associated(xfield)) if (xfield%rlze) then - call ESMF_FieldFill(xfield%efld, dataFillScheme=trim(xfield%scheme), & - const1=xfield%dflt, member=xfield%member, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return - if (trim(xfield%scheme) == "sincos" .and. & - (xfield%minv .ne. filv .and. xfield%maxv .ne. filv)) then - if (xfield%fdim .eq. 3) then - xfield%ptr3 = (((xfield%maxv-xfield%minv)/2.0_ESMF_KIND_R8)*xfield%ptr3)+ & - ((xfield%maxv+xfield%minv)/2.0_ESMF_KIND_R8) - elseif (xfield%fdim .eq. 2) then - xfield%ptr2 = (((xfield%maxv-xfield%minv)/2.0_ESMF_KIND_R8)*xfield%ptr2)+ & - ((xfield%maxv+xfield%minv)/2.0_ESMF_KIND_R8) - 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 - endif endif xfield => xfield%nfld enddo @@ -408,11 +391,11 @@ subroutine DataInitialize(xdata, rc) xfield => xstate%exp_flds_head do while (associated(xfield)) if (xfield%rlze) then - call ESMF_FieldFill(xfield%efld, dataFillScheme=trim(xfield%scheme), & + call ESMF_FieldFill(xfield%efld, dataFillScheme=trim(xfield%fill_modifier), & const1=xfield%dflt, member=xfield%member, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return - if (trim(xfield%scheme) == "sincos" .and. & + if (trim(xfield%) == "sincos" .and. & (xfield%minv .ne. filv .and. xfield%maxv .ne. filv)) then if (xfield%fdim .eq. 3) then xfield%ptr3 = (((xfield%maxv-xfield%minv)/2.0_ESMF_KIND_R8)*xfield%ptr3)+ & @@ -1072,11 +1055,11 @@ subroutine x_comp_read_fields(xdatacfg, xstate, rc) xfield%gmax = filv xfield%gavg = filv xfield%minv = x_comp_hconfig_r8(fieldcfg, "min", & - defaultValue=filv, rc=rc) + defaultValue=0.0_ESMF_KIND_R8, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return xfield%maxv = x_comp_hconfig_r8(fieldcfg, "max", & - defaultValue=filv, rc=rc) + defaultValue=0.0_ESMF_KIND_R8, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return xfield%dflt = filv @@ -1122,12 +1105,12 @@ subroutine x_comp_read_fields(xdatacfg, xstate, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return check = ESMF_HConfigValidateMapKeys(fieldcfg, & - vocabulary=["dim ", & - "min ", & - "max ", & - "scheme", & - "member", & - "val " & + vocabulary=["dim ", & + "min ", & + "max ", & + "fill_modifier", & + "member ", & + "val " & ], badKey=badKey, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return @@ -1170,7 +1153,7 @@ subroutine x_comp_read_fields(xdatacfg, xstate, rc) defaultValue=0.0_ESMF_KIND_R8, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return - xfield%scheme = x_comp_hconfig_str(fieldcfg, "scheme", & + xfield%fill_modifier = x_comp_hconfig_str(fieldcfg, "fill_modifier", & defaultValue="const", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return @@ -1499,6 +1482,7 @@ subroutine x_comp_check_field(xstate, xfield, rc) 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.