diff --git a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 index 731e39bbe6..5b2c877a21 100644 --- a/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 +++ b/src/addon/ESMX/Comps/ESMX_Data/ESMX_Data.F90 @@ -23,6 +23,8 @@ module esmx_data character(len=64) :: stdn = "dummy" integer :: fdim = 2 real(ESMF_KIND_R8) :: dflt = filv + 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 @@ -379,8 +381,6 @@ 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) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return endif @@ -391,10 +391,25 @@ 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%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%) == "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 call NUOPC_SetAttribute(xfield%efld, & name="Updated", value="true", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -1090,8 +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", & - "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 @@ -1122,12 +1141,26 @@ 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, & line=__LINE__, file=__FILE__)) return + 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 + 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%nfld => null() if (.not. associated(xstate%exp_flds_head)) then xstate%exp_flds_head => xfield