From 01c79eb1ef81abf1ccd5194e3875df8398d20426 Mon Sep 17 00:00:00 2001 From: anton-seaice Date: Wed, 25 Feb 2026 14:56:07 +1100 Subject: [PATCH 1/8] Standardise jra55do datamode with other updates to CDEPS --- datm/atm_comp_nuopc.F90 | 3 +- datm/datm_datamode_jra55do_mod.F90 | 105 ++++++++++++++--------------- 2 files changed, 52 insertions(+), 56 deletions(-) diff --git a/datm/atm_comp_nuopc.F90 b/datm/atm_comp_nuopc.F90 index c0d9529f7..f68b20f19 100644 --- a/datm/atm_comp_nuopc.F90 +++ b/datm/atm_comp_nuopc.F90 @@ -400,8 +400,7 @@ subroutine InitializeAdvertise(gcomp, importState, exportState, clock, rc) call datm_datamode_jra_advertise(exportState, fldsExport, flds_scalar_name, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return case ('JRA55do') - call datm_datamode_jra55do_advertise(exportState, fldsExport, flds_scalar_name, & - flds_co2, flds_wiso, flds_presaero, flds_presndep, rc) + call datm_datamode_jra55do_advertise(exportState, fldsExport, flds_scalar_name, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return case ('CLMNCEP') call datm_datamode_clmncep_advertise(exportState, fldsExport, flds_scalar_name, rc) diff --git a/datm/datm_datamode_jra55do_mod.F90 b/datm/datm_datamode_jra55do_mod.F90 index 53d6e4988..ac6aef63c 100644 --- a/datm/datm_datamode_jra55do_mod.F90 +++ b/datm/datm_datamode_jra55do_mod.F90 @@ -23,9 +23,10 @@ module datm_datamode_jra55do_mod public :: datm_datamode_jra55do_init_pointers public :: datm_datamode_jra55do_advance - ! export state pointers real(r8), pointer :: Sa_z(:) => null() + real(r8), pointer :: Sa_u(:) => null() + real(r8), pointer :: Sa_v(:) => null() real(r8), pointer :: Sa_tbot(:) => null() real(r8), pointer :: Sa_ptem(:) => null() real(r8), pointer :: Sa_shum(:) => null() @@ -44,9 +45,15 @@ module datm_datamode_jra55do_mod real(r8), pointer :: Faxa_ndep(:,:) => null() ! stream data - real(r8), pointer :: strm_prrn(:) => null() ! Rainfall flux - real(r8), pointer :: strm_prsn(:) => null() ! Snowfall flux - real(r8), pointer :: strm_swdn(:) => null() + real(r8), pointer :: strm_Sa_tbot(:) => null() + real(r8), pointer :: strm_Sa_pslv(:) => null() + real(r8), pointer :: strm_Sa_u(:) => null() + real(r8), pointer :: strm_Sa_v(:) => null() + real(r8), pointer :: strm_Sa_shum(:) => null() + real(r8), pointer :: strm_Faxa_prrn(:) => null() ! Rainfall flux + real(r8), pointer :: strm_Faxa_prsn(:) => null() ! Snowfall flux + real(r8), pointer :: strm_Faxa_lwdn(:) => null() + real(r8), pointer :: strm_Faxa_swdn(:) => null() ! othe module arrays real(R8), pointer :: yc(:) ! array of model latitudes @@ -67,17 +74,12 @@ module datm_datamode_jra55do_mod contains !=============================================================================== - subroutine datm_datamode_jra55do_advertise(exportState, fldsexport, flds_scalar_name, & - flds_co2, flds_wiso, flds_presaero, flds_presndep, rc) + subroutine datm_datamode_jra55do_advertise(exportState, fldsexport, flds_scalar_name, rc) ! input/output variables type(esmf_State) , intent(inout) :: exportState type(fldlist_type) , pointer :: fldsexport character(len=*) , intent(in) :: flds_scalar_name - logical , intent(in) :: flds_co2 - logical , intent(in) :: flds_wiso - logical , intent(in) :: flds_presaero - logical , intent(in) :: flds_presndep integer , intent(out) :: rc ! local variables @@ -108,27 +110,6 @@ subroutine datm_datamode_jra55do_advertise(exportState, fldsexport, flds_scalar_ call dshr_fldList_add(fldsExport, 'Faxa_lwdn' ) call dshr_fldList_add(fldsExport, 'Faxa_swdn' ) - if (flds_co2) then - call dshr_fldList_add(fldsExport, 'Sa_co2prog') - call dshr_fldList_add(fldsExport, 'Sa_co2diag') - end if - if (flds_presaero) then - call dshr_fldList_add(fldsExport, 'Faxa_bcph' , ungridded_lbound=1, ungridded_ubound=3) - call dshr_fldList_add(fldsExport, 'Faxa_ocph' , ungridded_lbound=1, ungridded_ubound=3) - call dshr_fldList_add(fldsExport, 'Faxa_dstwet' , ungridded_lbound=1, ungridded_ubound=4) - call dshr_fldList_add(fldsExport, 'Faxa_dstdry' , ungridded_lbound=1, ungridded_ubound=4) - end if - if (flds_presndep) then - call dshr_fldList_add(fldsExport, 'Faxa_ndep', ungridded_lbound=1, ungridded_ubound=2) - end if - if (flds_wiso) then - call dshr_fldList_add(fldsExport, 'Faxa_rainc_wiso', ungridded_lbound=1, ungridded_ubound=3) - call dshr_fldList_add(fldsExport, 'Faxa_rainl_wiso', ungridded_lbound=1, ungridded_ubound=3) - call dshr_fldList_add(fldsExport, 'Faxa_snowc_wiso', ungridded_lbound=1, ungridded_ubound=3) - call dshr_fldList_add(fldsExport, 'Faxa_snowl_wiso', ungridded_lbound=1, ungridded_ubound=3) - call dshr_fldList_add(fldsExport, 'Faxa_shum_wiso' , ungridded_lbound=1, ungridded_ubound=3) - end if - fldlist => fldsExport ! the head of the linked list do while (associated(fldlist)) call NUOPC_Advertise(exportState, standardName=fldlist%stdname, rc=rc) @@ -171,13 +152,6 @@ subroutine datm_datamode_jra55do_init_pointers(exportState, sdat, rc) yc(n) = ownedElemCoords(2*n) end do - call shr_strdata_get_stream_pointer( sdat, 'Faxa_prrn' , strm_prrn , rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Faxa_prsn' , strm_prsn , rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Faxa_swdn' , strm_swdn , rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Sa_z' , fldptr1=Sa_z , rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return call dshr_state_getfldptr(exportState, 'Sa_tbot' , fldptr1=Sa_tbot , rc=rc) @@ -211,17 +185,40 @@ subroutine datm_datamode_jra55do_init_pointers(exportState, sdat, rc) call dshr_state_getfldptr(exportState, 'Faxa_swnet' , fldptr1=Faxa_swnet , rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - call ESMF_StateGet(exportState, 'Faxa_ndep', itemFlag, rc=rc) + call shr_strdata_get_stream_pointer( sdat, 'Sa_tbot' , strm_Sa_tbot , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Sa_tbot must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Sa_pslv' , strm_Sa_pslv , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Sa_pslv must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Sa_u' , strm_Sa_u , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Sa_u must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Sa_v' , strm_Sa_v , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Sa_v must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Sa_shum' , strm_Sa_shum , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Sa_shum must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Faxa_prrn' , strm_Faxa_prrn , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Faxa_prrn must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Faxa_prsn' , strm_Faxa_prsn , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Faxa_prsn must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Faxa_lwdn' , strm_Faxa_lwdn , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Faxa_lwdn must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Faxa_swdn' , strm_Faxa_swdn , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Faxa_swdn must be associated for jra55do datamode', rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - if (itemflag /= ESMF_STATEITEM_NOTFOUND) then - call dshr_state_getfldptr(exportState, 'Faxa_ndep', fldptr2=Faxa_ndep, rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - end if - ! erro check - if (.not. associated(strm_prrn) .or. .not. associated(strm_prsn) .or. .not. associated(strm_swdn)) then - call shr_sys_abort(trim(subname)//'ERROR: prrn, prsn and swdn must be in streams for JRA55-do') - endif + ! call ESMF_StateGet(exportState, 'Faxa_ndep', itemFlag, rc=rc) + ! if (ChkErr(rc,__LINE__,u_FILE_u)) return + ! if (itemflag /= ESMF_STATEITEM_NOTFOUND) then + ! call dshr_state_getfldptr(exportState, 'Faxa_ndep', fldptr2=Faxa_ndep, rc=rc) + ! if (ChkErr(rc,__LINE__,u_FILE_u)) return + ! end if end subroutine datm_datamode_jra55do_init_pointers @@ -263,18 +260,18 @@ subroutine datm_datamode_jra55do_advance(exportstate, target_ymd, target_tod, mo ! precipitation data Faxa_rainc(n) = 0.0_R8 ! default zero Faxa_snowc(n) = 0.0_R8 - Faxa_snowl(n) = strm_prsn(n) ! Snowfall flux - Faxa_rainl(n) = strm_prrn(n) ! Rainfall flux + Faxa_snowl(n) = strm_Faxa_prsn(n) ! Snowfall flux + Faxa_rainl(n) = strm_Faxa_prrn(n) ! Rainfall flux ! radiation data - fabricate required swdn components from net swdn - Faxa_swvdr(n) = strm_swdn(n)*(0.28_R8) - Faxa_swndr(n) = strm_swdn(n)*(0.31_R8) - Faxa_swvdf(n) = strm_swdn(n)*(0.24_R8) - Faxa_swndf(n) = strm_swdn(n)*(0.17_R8) + Faxa_swvdr(n) = strm_Faxa_swdn(n)*(0.28_R8) + Faxa_swndr(n) = strm_Faxa_swdn(n)*(0.31_R8) + Faxa_swvdf(n) = strm_Faxa_swdn(n)*(0.24_R8) + Faxa_swndf(n) = strm_Faxa_swdn(n)*(0.17_R8) ! radiation data - compute net short-wave based on LY08 latitudinally-varying albedo avg_alb = ( 0.069 - 0.011*cos(2.0_R8*yc(n)*degtorad ) ) - Faxa_swnet(n) = strm_swdn(n)*(1.0_R8 - avg_alb) + Faxa_swnet(n) = strm_Faxa_swdn(n)*(1.0_R8 - avg_alb) enddo ! lsize if (associated(Faxa_ndep)) then From 4ae74846794d707072a2e248fbc8e7d07c7abac5 Mon Sep 17 00:00:00 2001 From: anton-seaice Date: Wed, 25 Feb 2026 16:16:44 +1100 Subject: [PATCH 2/8] More changes related to https://github.com/ESCOMP/CDEPS/pull/376 --- datm/datm_datamode_jra55do_mod.F90 | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/datm/datm_datamode_jra55do_mod.F90 b/datm/datm_datamode_jra55do_mod.F90 index ac6aef63c..75ed64c4b 100644 --- a/datm/datm_datamode_jra55do_mod.F90 +++ b/datm/datm_datamode_jra55do_mod.F90 @@ -251,8 +251,15 @@ subroutine datm_datamode_jra55do_advance(exportstate, target_ymd, target_tod, mo do n = 1,lsize Sa_z(n) = 10.0_R8 - Sa_pbot(n) = Sa_pslv(n) - Sa_ptem(n) = Sa_tbot(n) + ! Set export fields as copies directly from streams + Sa_pslv(n) = strm_Sa_pslv(n) + Sa_pbot(n) = strm_Sa_pslv(n) + Sa_tbot(n) = strm_Sa_tbot(n) + Sa_ptem(n) = strm_Sa_tbot(n) + Sa_u(n) = strm_Sa_u(n) + Sa_v(n) = strm_Sa_v(n) + Sa_shum(n) = strm_Sa_shum(n) + Faxa_lwdn(n) = strm_Faxa_lwdn(n) ! density computation for JRA55-do forcing Sa_dens(n) = Sa_pbot(n)/(rdair*Sa_tbot(n)*(1 + 0.608*Sa_shum(n))) @@ -274,11 +281,6 @@ subroutine datm_datamode_jra55do_advance(exportstate, target_ymd, target_tod, mo Faxa_swnet(n) = strm_Faxa_swdn(n)*(1.0_R8 - avg_alb) enddo ! lsize - if (associated(Faxa_ndep)) then - ! convert ndep flux to units of kgN/m2/s (input is in gN/m2/s) - Faxa_ndep(:,:) = Faxa_ndep(:,:) / 1000._r8 - end if - end subroutine datm_datamode_jra55do_advance end module datm_datamode_jra55do_mod From 3731e1dbcd8f7e7d7802f8fef091df2f1beeac56 Mon Sep 17 00:00:00 2001 From: anton-seaice Date: Wed, 25 Feb 2026 16:49:42 +1100 Subject: [PATCH 3/8] fixing my handiwork --- datm/datm_datamode_jra55do_mod.F90 | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/datm/datm_datamode_jra55do_mod.F90 b/datm/datm_datamode_jra55do_mod.F90 index 75ed64c4b..4eb934792 100644 --- a/datm/datm_datamode_jra55do_mod.F90 +++ b/datm/datm_datamode_jra55do_mod.F90 @@ -42,7 +42,7 @@ module datm_datamode_jra55do_mod real(r8), pointer :: Faxa_swvdr(:) => null() real(r8), pointer :: Faxa_swvdf(:) => null() real(r8), pointer :: Faxa_swnet(:) => null() - real(r8), pointer :: Faxa_ndep(:,:) => null() + real(r8), pointer :: Faxa_lwdn(:) => null() ! stream data real(r8), pointer :: strm_Sa_tbot(:) => null() @@ -184,6 +184,8 @@ subroutine datm_datamode_jra55do_init_pointers(exportState, sdat, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return call dshr_state_getfldptr(exportState, 'Faxa_swnet' , fldptr1=Faxa_swnet , rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return + call dshr_state_getfldptr(exportState, 'Faxa_lwdn' , fldptr1=Faxa_lwdn , rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return call shr_strdata_get_stream_pointer( sdat, 'Sa_tbot' , strm_Sa_tbot , requirePointer=.true., & errmsg=subname//'ERROR: strm_Sa_tbot must be associated for jra55do datamode', rc=rc) @@ -213,13 +215,6 @@ subroutine datm_datamode_jra55do_init_pointers(exportState, sdat, rc) errmsg=subname//'ERROR: strm_Faxa_swdn must be associated for jra55do datamode', rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - ! call ESMF_StateGet(exportState, 'Faxa_ndep', itemFlag, rc=rc) - ! if (ChkErr(rc,__LINE__,u_FILE_u)) return - ! if (itemflag /= ESMF_STATEITEM_NOTFOUND) then - ! call dshr_state_getfldptr(exportState, 'Faxa_ndep', fldptr2=Faxa_ndep, rc=rc) - ! if (ChkErr(rc,__LINE__,u_FILE_u)) return - ! end if - end subroutine datm_datamode_jra55do_init_pointers !=============================================================================== @@ -250,7 +245,7 @@ subroutine datm_datamode_jra55do_advance(exportstate, target_ymd, target_tod, mo cosfactor = cos((2.0_R8*SHR_CONST_PI*rday)/365 - phs_c0) do n = 1,lsize - Sa_z(n) = 10.0_R8 + ! Set export fields as copies directly from streams Sa_pslv(n) = strm_Sa_pslv(n) Sa_pbot(n) = strm_Sa_pslv(n) @@ -261,6 +256,9 @@ subroutine datm_datamode_jra55do_advance(exportstate, target_ymd, target_tod, mo Sa_shum(n) = strm_Sa_shum(n) Faxa_lwdn(n) = strm_Faxa_lwdn(n) + ! Set Sa_z to a constant + Sa_z(n) = 10.0_R8 + ! density computation for JRA55-do forcing Sa_dens(n) = Sa_pbot(n)/(rdair*Sa_tbot(n)*(1 + 0.608*Sa_shum(n))) From ed834f2a7db004a2cabf432d8482a9e3e657630a Mon Sep 17 00:00:00 2001 From: anton-seaice Date: Thu, 26 Feb 2026 10:51:25 +1100 Subject: [PATCH 4/8] merge jra55 into jra driver --- datm/atm_comp_nuopc.F90 | 30 ++++---- datm/datm_datamode_jra55do_mod.F90 | 115 +++++++++++++++++------------ datm/datm_datamode_jra_mod.F90 | 44 +++++++++-- 3 files changed, 119 insertions(+), 70 deletions(-) diff --git a/datm/atm_comp_nuopc.F90 b/datm/atm_comp_nuopc.F90 index f68b20f19..a7697dde7 100644 --- a/datm/atm_comp_nuopc.F90 +++ b/datm/atm_comp_nuopc.F90 @@ -47,9 +47,9 @@ module cdeps_datm_comp use datm_datamode_jra_mod , only : datm_datamode_jra_init_pointers use datm_datamode_jra_mod , only : datm_datamode_jra_advance - use datm_datamode_jra55do_mod , only : datm_datamode_jra55do_advertise - use datm_datamode_jra55do_mod , only : datm_datamode_jra55do_init_pointers - use datm_datamode_jra55do_mod , only : datm_datamode_jra55do_advance +! use datm_datamode_jra55do_mod , only : datm_datamode_jra55do_advertise +! use datm_datamode_jra55do_mod , only : datm_datamode_jra55do_init_pointers +! use datm_datamode_jra55do_mod , only : datm_datamode_jra55do_advance use datm_datamode_clmncep_mod , only : datm_datamode_clmncep_advertise use datm_datamode_clmncep_mod , only : datm_datamode_clmncep_init_pointers @@ -396,12 +396,12 @@ subroutine InitializeAdvertise(gcomp, importState, exportState, clock, rc) case ('CORE2_NYF', 'CORE2_IAF') call datm_datamode_core2_advertise(exportState, fldsExport, flds_scalar_name, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - case ('CORE_IAF_JRA', 'CORE_RYF6162_JRA', 'CORE_RYF8485_JRA', 'CORE_RYF9091_JRA', 'CORE_RYF0304_JRA') + case ('CORE_IAF_JRA', 'CORE_RYF6162_JRA', 'CORE_RYF8485_JRA', 'CORE_RYF9091_JRA', 'CORE_RYF0304_JRA', 'JRA55do') call datm_datamode_jra_advertise(exportState, fldsExport, flds_scalar_name, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - case ('JRA55do') - call datm_datamode_jra55do_advertise(exportState, fldsExport, flds_scalar_name, rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return + ! case ('JRA55do') + ! call datm_datamode_jra55do_advertise(exportState, fldsExport, flds_scalar_name, rc) + ! if (ChkErr(rc,__LINE__,u_FILE_u)) return case ('CLMNCEP') call datm_datamode_clmncep_advertise(exportState, fldsExport, flds_scalar_name, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return @@ -666,12 +666,12 @@ subroutine datm_comp_run(gcomp, importState, exportState, target_ymd, target_tod case('CORE2_NYF','CORE2_IAF') call datm_datamode_core2_init_pointers(exportState, sdat, datamode, factorfn_mesh, factorfn_data, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - case ('CORE_IAF_JRA', 'CORE_RYF6162_JRA', 'CORE_RYF8485_JRA', 'CORE_RYF9091_JRA', 'CORE_RYF0304_JRA') + case ('CORE_IAF_JRA', 'CORE_RYF6162_JRA', 'CORE_RYF8485_JRA', 'CORE_RYF9091_JRA', 'CORE_RYF0304_JRA', 'JRA55do') call datm_datamode_jra_init_pointers(exportState, sdat, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - case('JRA55do') - call datm_datamode_jra55do_init_pointers(exportState, sdat, rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return + ! case('JRA55do') + ! call datm_datamode_jra55do_init_pointers(exportState, sdat, rc) + ! if (ChkErr(rc,__LINE__,u_FILE_u)) return case('CLMNCEP') call datm_datamode_clmncep_init_pointers(importState, exportState, sdat, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return @@ -747,12 +747,12 @@ subroutine datm_comp_run(gcomp, importState, exportState, target_ymd, target_tod call datm_datamode_core2_advance(datamode, target_ymd, target_tod, target_mon, & sdat%model_calendar, factorfn_mesh, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - case('CORE_IAF_JRA','CORE_RYF6162_JRA','CORE_RYF8485_JRA','CORE_RYF9091_JRA','CORE_RYF0304_JRA') + case('CORE_IAF_JRA','CORE_RYF6162_JRA','CORE_RYF8485_JRA','CORE_RYF9091_JRA','CORE_RYF0304_JRA', 'JRA55do') call datm_datamode_jra_advance(exportstate, target_ymd, target_tod, sdat%model_calendar, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - case('JRA55do') - call datm_datamode_jra55do_advance(exportstate, target_ymd, target_tod, sdat%model_calendar, rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return + ! case('JRA55do') + ! call datm_datamode_jra55do_advance(exportstate, target_ymd, target_tod, sdat%model_calendar, rc) + ! if (ChkErr(rc,__LINE__,u_FILE_u)) return case('CLMNCEP') call datm_datamode_clmncep_advance(mainproc, logunit, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return diff --git a/datm/datm_datamode_jra55do_mod.F90 b/datm/datm_datamode_jra55do_mod.F90 index 4eb934792..907dc68d0 100644 --- a/datm/datm_datamode_jra55do_mod.F90 +++ b/datm/datm_datamode_jra55do_mod.F90 @@ -3,21 +3,18 @@ module datm_datamode_jra55do_mod - use ESMF , only : ESMF_State, ESMF_StateGet, ESMF_SUCCESS, ESMF_LogWrite, ESMF_LOGMSG_INFO - use ESMF , only : ESMF_MeshGet - use ESMF , only : ESMF_StateItem_Flag, ESMF_STATEITEM_NOTFOUND, operator(/=) + use ESMF , only : ESMF_SUCCESS, ESMF_LogWrite, ESMF_LOGMSG_INFO + use ESMF , only : ESMF_State, ESMF_StateGet, ESMF_MeshGet use NUOPC , only : NUOPC_Advertise - use shr_kind_mod , only : r8=>shr_kind_r8, i8=>shr_kind_i8, cl=>shr_kind_cl, cs=>shr_kind_cs - use shr_sys_mod , only : shr_sys_abort + use shr_kind_mod , only : r8=>shr_kind_r8 use shr_cal_mod , only : shr_cal_date2julian use shr_const_mod , only : shr_const_tkfrz, shr_const_pi, shr_const_rdair use dshr_strdata_mod , only : shr_strdata_get_stream_pointer, shr_strdata_type - use dshr_methods_mod , only : dshr_state_getfldptr, dshr_fldbun_getfldptr, dshr_fldbun_regrid, chkerr - use dshr_strdata_mod , only : shr_strdata_type + use dshr_methods_mod , only : dshr_state_getfldptr, chkerr use dshr_fldlist_mod , only : fldlist_type, dshr_fldlist_add implicit none - private ! except + private public :: datm_datamode_jra55do_advertise public :: datm_datamode_jra55do_init_pointers @@ -27,6 +24,8 @@ module datm_datamode_jra55do_mod real(r8), pointer :: Sa_z(:) => null() real(r8), pointer :: Sa_u(:) => null() real(r8), pointer :: Sa_v(:) => null() + real(r8), pointer :: Sa_u10m(:) => null() + real(r8), pointer :: Sa_v10m(:) => null() real(r8), pointer :: Sa_tbot(:) => null() real(r8), pointer :: Sa_ptem(:) => null() real(r8), pointer :: Sa_shum(:) => null() @@ -42,21 +41,23 @@ module datm_datamode_jra55do_mod real(r8), pointer :: Faxa_swvdr(:) => null() real(r8), pointer :: Faxa_swvdf(:) => null() real(r8), pointer :: Faxa_swnet(:) => null() - real(r8), pointer :: Faxa_lwdn(:) => null() - - ! stream data - real(r8), pointer :: strm_Sa_tbot(:) => null() - real(r8), pointer :: strm_Sa_pslv(:) => null() - real(r8), pointer :: strm_Sa_u(:) => null() - real(r8), pointer :: strm_Sa_v(:) => null() - real(r8), pointer :: strm_Sa_shum(:) => null() - real(r8), pointer :: strm_Faxa_prrn(:) => null() ! Rainfall flux - real(r8), pointer :: strm_Faxa_prsn(:) => null() ! Snowfall flux - real(r8), pointer :: strm_Faxa_lwdn(:) => null() - real(r8), pointer :: strm_Faxa_swdn(:) => null() - - ! othe module arrays - real(R8), pointer :: yc(:) ! array of model latitudes + real(r8), pointer :: Faxa_swdn(:) => null() + real(r8), pointer :: Faxa_lwdn(:) => null() + + ! stream data pointers + real(r8), pointer :: strm_Sa_tbot(:) => null() + real(r8), pointer :: strm_Sa_pslv(:) => null() + real(r8), pointer :: strm_Sa_u(:) => null() + real(r8), pointer :: strm_Sa_v(:) => null() + real(r8), pointer :: strm_Sa_shum(:) => null() + real(r8), pointer :: strm_Faxa_prec(:) => null() ! Jra provides one precip flux + real(r8), pointer :: strm_Faxa_prrn(:) => null() ! Jra55do provides rainfall flux + real(r8), pointer :: strm_Faxa_prsn(:) => null() ! and Snowfall flux seperately + real(r8), pointer :: strm_Faxa_lwdn(:) => null() + real(r8), pointer :: strm_Faxa_swdn(:) => null() + + ! other module arrays + real(R8), pointer :: yc(:) ! array of model latitudes ! constants real(R8) , parameter :: tKFrz = SHR_CONST_TKFRZ @@ -65,9 +66,8 @@ module datm_datamode_jra55do_mod real(R8) , parameter :: phs_c0 = 0.298_R8 real(R8) , parameter :: dLWarc = -5.000_R8 - character(*), parameter :: nullstr = 'null' - character(*), parameter :: rpfile = 'rpointer.atm' - character(*), parameter :: u_FILE_u = & + character(len=*), parameter :: nullstr = 'null' + character(len=*), parameter :: u_FILE_u = & __FILE__ !=============================================================================== @@ -92,6 +92,8 @@ subroutine datm_datamode_jra55do_advertise(exportState, fldsexport, flds_scalar_ call dshr_fldList_add(fldsExport, 'Sa_z' ) call dshr_fldList_add(fldsExport, 'Sa_u' ) call dshr_fldList_add(fldsExport, 'Sa_v' ) + call dshr_fldList_add(fldsExport, 'Sa_u10m' ) + call dshr_fldList_add(fldsExport, 'Sa_v10m' ) call dshr_fldList_add(fldsExport, 'Sa_ptem' ) call dshr_fldList_add(fldsExport, 'Sa_dens' ) call dshr_fldList_add(fldsExport, 'Sa_pslv' ) @@ -130,18 +132,15 @@ subroutine datm_datamode_jra55do_init_pointers(exportState, sdat, rc) ! local variables integer :: n - integer :: lsize integer :: spatialDim ! number of dimension in mesh integer :: numOwnedElements ! size of mesh real(r8), pointer :: ownedElemCoords(:) ! mesh lat and lons - type(ESMF_StateItem_Flag) :: itemFlag - character(len=*), parameter :: subname='(datm_datamode_jra55do_init_pointers): ' + character(len=*), parameter :: subname='(datm_init_pointers): ' !------------------------------------------------------------------------------- rc = ESMF_SUCCESS - lsize = sdat%model_lsize - + ! determine yc call ESMF_MeshGet(sdat%model_mesh, spatialDim=spatialDim, numOwnedElements=numOwnedElements, rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return allocate(ownedElemCoords(spatialDim*numOwnedElements)) @@ -152,6 +151,15 @@ subroutine datm_datamode_jra55do_init_pointers(exportState, sdat, rc) yc(n) = ownedElemCoords(2*n) end do + ! initialize export state pointers + call dshr_state_getfldptr(exportState, 'Sa_u' , fldptr1=Sa_u , rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call dshr_state_getfldptr(exportState, 'Sa_v' , fldptr1=Sa_v , rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call dshr_state_getfldptr(exportState, 'Sa_u10m' , fldptr1=Sa_u10m , rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call dshr_state_getfldptr(exportState, 'Sa_v10m' , fldptr1=Sa_v10m , rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return call dshr_state_getfldptr(exportState, 'Sa_z' , fldptr1=Sa_z , rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return call dshr_state_getfldptr(exportState, 'Sa_tbot' , fldptr1=Sa_tbot , rc=rc) @@ -184,15 +192,31 @@ subroutine datm_datamode_jra55do_init_pointers(exportState, sdat, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return call dshr_state_getfldptr(exportState, 'Faxa_swnet' , fldptr1=Faxa_swnet , rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_lwdn' , fldptr1=Faxa_lwdn , rc=rc) + call dshr_state_getfldptr(exportState, 'Faxa_swdn' , fldptr1=Faxa_swdn , rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call dshr_state_getfldptr(exportState, 'Faxa_lwdn' , fldptr1=Faxa_lwdn , rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Sa_tbot' , strm_Sa_tbot , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Sa_tbot must be associated for jra55do datamode', rc=rc) + ! initialize stream pointers + call shr_strdata_get_stream_pointer( sdat, 'Faxa_prrn' , strm_Faxa_prrn , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Faxa_prrn must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Faxa_prsn' , strm_Faxa_prsn , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Faxa_prsn must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Faxa_swdn' , strm_Faxa_swdn , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Faxa_swdn must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Faxa_lwdn' , strm_Faxa_lwdn , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Faxa_lwdn must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return call shr_strdata_get_stream_pointer( sdat, 'Sa_pslv' , strm_Sa_pslv , requirePointer=.true., & errmsg=subname//'ERROR: strm_Sa_pslv must be associated for jra55do datamode', rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Sa_tbot' , strm_Sa_tbot , requirePointer=.true., & + errmsg=subname//'ERROR: strm_Sa_tbot must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return call shr_strdata_get_stream_pointer( sdat, 'Sa_u' , strm_Sa_u , requirePointer=.true., & errmsg=subname//'ERROR: strm_Sa_u must be associated for jra55do datamode', rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return @@ -202,18 +226,6 @@ subroutine datm_datamode_jra55do_init_pointers(exportState, sdat, rc) call shr_strdata_get_stream_pointer( sdat, 'Sa_shum' , strm_Sa_shum , requirePointer=.true., & errmsg=subname//'ERROR: strm_Sa_shum must be associated for jra55do datamode', rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Faxa_prrn' , strm_Faxa_prrn , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Faxa_prrn must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Faxa_prsn' , strm_Faxa_prsn , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Faxa_prsn must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Faxa_lwdn' , strm_Faxa_lwdn , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Faxa_lwdn must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Faxa_swdn' , strm_Faxa_swdn , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Faxa_swdn must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return end subroutine datm_datamode_jra55do_init_pointers @@ -230,16 +242,18 @@ subroutine datm_datamode_jra55do_advance(exportstate, target_ymd, target_tod, mo ! local variables integer :: n integer :: lsize + real(R8) :: avg_alb ! average albedo real(R8) :: rday ! elapsed day real(R8) :: cosFactor ! cosine factor - character(len=*), parameter :: subname='(datm_datamode_jra55do_advance): ' + character(len=*), parameter :: subname='(datm_datamode_jra): ' !------------------------------------------------------------------------------- rc = ESMF_SUCCESS lsize = size(Sa_z) + call shr_cal_date2julian(target_ymd, target_tod, rday, model_calendar) rday = mod((rday - 1.0_R8),365.0_R8) cosfactor = cos((2.0_R8*SHR_CONST_PI*rday)/365 - phs_c0) @@ -254,12 +268,17 @@ subroutine datm_datamode_jra55do_advance(exportstate, target_ymd, target_tod, mo Sa_u(n) = strm_Sa_u(n) Sa_v(n) = strm_Sa_v(n) Sa_shum(n) = strm_Sa_shum(n) + Faxa_swdn(n) = strm_Faxa_swdn(n) Faxa_lwdn(n) = strm_Faxa_lwdn(n) ! Set Sa_z to a constant Sa_z(n) = 10.0_R8 - ! density computation for JRA55-do forcing + ! Set Sa_u10m and Sa_v10m to Sa_u and Sa_v + Sa_u10m(n) = Sa_u(n) + Sa_v10m(n) = Sa_v(n) + + ! density computation for JRA55 forcing Sa_dens(n) = Sa_pbot(n)/(rdair*Sa_tbot(n)*(1 + 0.608*Sa_shum(n))) ! precipitation data diff --git a/datm/datm_datamode_jra_mod.F90 b/datm/datm_datamode_jra_mod.F90 index a32973791..745857da7 100644 --- a/datm/datm_datamode_jra_mod.F90 +++ b/datm/datm_datamode_jra_mod.F90 @@ -47,7 +47,9 @@ module datm_datamode_jra_mod real(r8), pointer :: strm_Sa_u(:) => null() real(r8), pointer :: strm_Sa_v(:) => null() real(r8), pointer :: strm_Sa_shum(:) => null() - real(r8), pointer :: strm_Faxa_prec(:) => null() + real(r8), pointer :: strm_Faxa_prec(:) => null() ! Jra provides one precip flux + real(r8), pointer :: strm_Faxa_prrn(:) => null() ! Jra55do provides rainfall flux + real(r8), pointer :: strm_Faxa_prsn(:) => null() ! and Snowfall flux seperately real(r8), pointer :: strm_Faxa_lwdn(:) => null() real(r8), pointer :: strm_Faxa_swdn(:) => null() @@ -120,6 +122,8 @@ end subroutine datm_datamode_jra_advertise !=============================================================================== subroutine datm_datamode_jra_init_pointers(exportState, sdat, rc) + use shr_log_mod , only : shr_log_error + ! input/output variables type(ESMF_State) , intent(inout) :: exportState type(shr_strdata_type) , intent(in) :: sdat @@ -193,9 +197,23 @@ subroutine datm_datamode_jra_init_pointers(exportState, sdat, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return ! initialize stream pointers - call shr_strdata_get_stream_pointer( sdat, 'Faxa_prec' , strm_Faxa_prec , requirePointer=.true., & + ! jra 55 + call shr_strdata_get_stream_pointer( sdat, 'Faxa_prec' , strm_Faxa_prec , & errmsg=subname//'ERROR: strm_Faxa_prec must be associated for jra datamode', rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return + ! jra 55do + call shr_strdata_get_stream_pointer( sdat, 'Faxa_prrn' , strm_Faxa_prrn , & + errmsg=subname//'ERROR: strm_Faxa_prrn must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Faxa_prsn' , strm_Faxa_prsn , & + errmsg=subname//'ERROR: strm_Faxa_prsn must be associated for jra55do datamode', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + if ( .not. ((associated(strm_Faxa_prec) & !jra 55 + .or. (associated(strm_Faxa_prrn) .and. associated(strm_Faxa_prsn))))) & !jra55do + call shr_log_error(subName//"ERROR: strm_Faxa_prec or (strm_Faxa_prrn and strm_Faxa_prsn)"//& + "must be associated for jra datamore", rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call shr_strdata_get_stream_pointer( sdat, 'Faxa_swdn' , strm_Faxa_swdn , requirePointer=.true., & errmsg=subname//'ERROR: strm_Faxa_swdn must be associated for jra datamode', rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return @@ -233,6 +251,7 @@ subroutine datm_datamode_jra_advance(exportstate, target_ymd, target_tod, model_ ! local variables integer :: n integer :: lsize + logical :: jra55do real(R8) :: avg_alb ! average albedo real(R8) :: rday ! elapsed day real(R8) :: cosFactor ! cosine factor @@ -243,6 +262,12 @@ subroutine datm_datamode_jra_advance(exportstate, target_ymd, target_tod, model_ lsize = size(Sa_z) + if (associated(strm_Faxa_prrn) .and. associated(strm_Faxa_prsn)) then + jra55do = .true. + else + jra55do = .false. + endif + call shr_cal_date2julian(target_ymd, target_tod, rday, model_calendar) rday = mod((rday - 1.0_R8),365.0_R8) cosfactor = cos((2.0_R8*SHR_CONST_PI*rday)/365 - phs_c0) @@ -273,12 +298,17 @@ subroutine datm_datamode_jra_advance(exportstate, target_ymd, target_tod, model_ ! precipitation data Faxa_rainc(n) = 0.0_R8 ! default zero Faxa_snowc(n) = 0.0_R8 - if (Sa_tbot(n) < tKFrz ) then ! assign precip to rain/snow components - Faxa_rainl(n) = 0.0_R8 - Faxa_snowl(n) = strm_Faxa_prec(n) + if (jra55do) then + Faxa_snowl(n) = strm_Faxa_prsn(n) ! Snowfall flux + Faxa_rainl(n) = strm_Faxa_prrn(n) ! Rainfall flux else - Faxa_rainl(n) = strm_Faxa_prec(n) - Faxa_snowl(n) = 0.0_R8 + if (Sa_tbot(n) < tKFrz ) then ! assign precip to rain/snow components + Faxa_rainl(n) = 0.0_R8 + Faxa_snowl(n) = strm_Faxa_prec(n) + else + Faxa_rainl(n) = strm_Faxa_prec(n) + Faxa_snowl(n) = 0.0_R8 + endif endif ! radiation data - fabricate required swdn components from net swdn From 4d3e67b12567657858f0e2c51af2794b27f283df Mon Sep 17 00:00:00 2001 From: anton-seaice Date: Thu, 26 Feb 2026 11:42:35 +1100 Subject: [PATCH 5/8] cleanup --- datm/atm_comp_nuopc.F90 | 13 -- datm/datm_datamode_jra55do_mod.F90 | 303 ----------------------------- 2 files changed, 316 deletions(-) delete mode 100644 datm/datm_datamode_jra55do_mod.F90 diff --git a/datm/atm_comp_nuopc.F90 b/datm/atm_comp_nuopc.F90 index a7697dde7..aa2801466 100644 --- a/datm/atm_comp_nuopc.F90 +++ b/datm/atm_comp_nuopc.F90 @@ -47,10 +47,6 @@ module cdeps_datm_comp use datm_datamode_jra_mod , only : datm_datamode_jra_init_pointers use datm_datamode_jra_mod , only : datm_datamode_jra_advance -! use datm_datamode_jra55do_mod , only : datm_datamode_jra55do_advertise -! use datm_datamode_jra55do_mod , only : datm_datamode_jra55do_init_pointers -! use datm_datamode_jra55do_mod , only : datm_datamode_jra55do_advance - use datm_datamode_clmncep_mod , only : datm_datamode_clmncep_advertise use datm_datamode_clmncep_mod , only : datm_datamode_clmncep_init_pointers use datm_datamode_clmncep_mod , only : datm_datamode_clmncep_advance @@ -399,9 +395,6 @@ subroutine InitializeAdvertise(gcomp, importState, exportState, clock, rc) case ('CORE_IAF_JRA', 'CORE_RYF6162_JRA', 'CORE_RYF8485_JRA', 'CORE_RYF9091_JRA', 'CORE_RYF0304_JRA', 'JRA55do') call datm_datamode_jra_advertise(exportState, fldsExport, flds_scalar_name, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - ! case ('JRA55do') - ! call datm_datamode_jra55do_advertise(exportState, fldsExport, flds_scalar_name, rc) - ! if (ChkErr(rc,__LINE__,u_FILE_u)) return case ('CLMNCEP') call datm_datamode_clmncep_advertise(exportState, fldsExport, flds_scalar_name, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return @@ -669,9 +662,6 @@ subroutine datm_comp_run(gcomp, importState, exportState, target_ymd, target_tod case ('CORE_IAF_JRA', 'CORE_RYF6162_JRA', 'CORE_RYF8485_JRA', 'CORE_RYF9091_JRA', 'CORE_RYF0304_JRA', 'JRA55do') call datm_datamode_jra_init_pointers(exportState, sdat, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - ! case('JRA55do') - ! call datm_datamode_jra55do_init_pointers(exportState, sdat, rc) - ! if (ChkErr(rc,__LINE__,u_FILE_u)) return case('CLMNCEP') call datm_datamode_clmncep_init_pointers(importState, exportState, sdat, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return @@ -750,9 +740,6 @@ subroutine datm_comp_run(gcomp, importState, exportState, target_ymd, target_tod case('CORE_IAF_JRA','CORE_RYF6162_JRA','CORE_RYF8485_JRA','CORE_RYF9091_JRA','CORE_RYF0304_JRA', 'JRA55do') call datm_datamode_jra_advance(exportstate, target_ymd, target_tod, sdat%model_calendar, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - ! case('JRA55do') - ! call datm_datamode_jra55do_advance(exportstate, target_ymd, target_tod, sdat%model_calendar, rc) - ! if (ChkErr(rc,__LINE__,u_FILE_u)) return case('CLMNCEP') call datm_datamode_clmncep_advance(mainproc, logunit, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return diff --git a/datm/datm_datamode_jra55do_mod.F90 b/datm/datm_datamode_jra55do_mod.F90 deleted file mode 100644 index 907dc68d0..000000000 --- a/datm/datm_datamode_jra55do_mod.F90 +++ /dev/null @@ -1,303 +0,0 @@ -! Copyright ACCESS-NRI and contributors. See the top-level COPYRIGHT file for details. -! SPDX-License-Identifier: Apache-2.0 - -module datm_datamode_jra55do_mod - - use ESMF , only : ESMF_SUCCESS, ESMF_LogWrite, ESMF_LOGMSG_INFO - use ESMF , only : ESMF_State, ESMF_StateGet, ESMF_MeshGet - use NUOPC , only : NUOPC_Advertise - use shr_kind_mod , only : r8=>shr_kind_r8 - use shr_cal_mod , only : shr_cal_date2julian - use shr_const_mod , only : shr_const_tkfrz, shr_const_pi, shr_const_rdair - use dshr_strdata_mod , only : shr_strdata_get_stream_pointer, shr_strdata_type - use dshr_methods_mod , only : dshr_state_getfldptr, chkerr - use dshr_fldlist_mod , only : fldlist_type, dshr_fldlist_add - - implicit none - private - - public :: datm_datamode_jra55do_advertise - public :: datm_datamode_jra55do_init_pointers - public :: datm_datamode_jra55do_advance - - ! export state pointers - real(r8), pointer :: Sa_z(:) => null() - real(r8), pointer :: Sa_u(:) => null() - real(r8), pointer :: Sa_v(:) => null() - real(r8), pointer :: Sa_u10m(:) => null() - real(r8), pointer :: Sa_v10m(:) => null() - real(r8), pointer :: Sa_tbot(:) => null() - real(r8), pointer :: Sa_ptem(:) => null() - real(r8), pointer :: Sa_shum(:) => null() - real(r8), pointer :: Sa_dens(:) => null() - real(r8), pointer :: Sa_pbot(:) => null() - real(r8), pointer :: Sa_pslv(:) => null() - real(r8), pointer :: Faxa_rainc(:) => null() - real(r8), pointer :: Faxa_rainl(:) => null() - real(r8), pointer :: Faxa_snowc(:) => null() - real(r8), pointer :: Faxa_snowl(:) => null() - real(r8), pointer :: Faxa_swndr(:) => null() - real(r8), pointer :: Faxa_swndf(:) => null() - real(r8), pointer :: Faxa_swvdr(:) => null() - real(r8), pointer :: Faxa_swvdf(:) => null() - real(r8), pointer :: Faxa_swnet(:) => null() - real(r8), pointer :: Faxa_swdn(:) => null() - real(r8), pointer :: Faxa_lwdn(:) => null() - - ! stream data pointers - real(r8), pointer :: strm_Sa_tbot(:) => null() - real(r8), pointer :: strm_Sa_pslv(:) => null() - real(r8), pointer :: strm_Sa_u(:) => null() - real(r8), pointer :: strm_Sa_v(:) => null() - real(r8), pointer :: strm_Sa_shum(:) => null() - real(r8), pointer :: strm_Faxa_prec(:) => null() ! Jra provides one precip flux - real(r8), pointer :: strm_Faxa_prrn(:) => null() ! Jra55do provides rainfall flux - real(r8), pointer :: strm_Faxa_prsn(:) => null() ! and Snowfall flux seperately - real(r8), pointer :: strm_Faxa_lwdn(:) => null() - real(r8), pointer :: strm_Faxa_swdn(:) => null() - - ! other module arrays - real(R8), pointer :: yc(:) ! array of model latitudes - - ! constants - real(R8) , parameter :: tKFrz = SHR_CONST_TKFRZ - real(R8) , parameter :: rdair = SHR_CONST_RDAIR ! dry air gas constant ~ J/K/kg - real(R8) , parameter :: degtorad = SHR_CONST_PI/180.0_R8 - real(R8) , parameter :: phs_c0 = 0.298_R8 - real(R8) , parameter :: dLWarc = -5.000_R8 - - character(len=*), parameter :: nullstr = 'null' - character(len=*), parameter :: u_FILE_u = & - __FILE__ - -!=============================================================================== -contains -!=============================================================================== - - subroutine datm_datamode_jra55do_advertise(exportState, fldsexport, flds_scalar_name, rc) - - ! input/output variables - type(esmf_State) , intent(inout) :: exportState - type(fldlist_type) , pointer :: fldsexport - character(len=*) , intent(in) :: flds_scalar_name - integer , intent(out) :: rc - - ! local variables - type(fldlist_type), pointer :: fldList - !------------------------------------------------------------------------------- - - rc = ESMF_SUCCESS - - call dshr_fldList_add(fldsExport, trim(flds_scalar_name)) - call dshr_fldList_add(fldsExport, 'Sa_z' ) - call dshr_fldList_add(fldsExport, 'Sa_u' ) - call dshr_fldList_add(fldsExport, 'Sa_v' ) - call dshr_fldList_add(fldsExport, 'Sa_u10m' ) - call dshr_fldList_add(fldsExport, 'Sa_v10m' ) - call dshr_fldList_add(fldsExport, 'Sa_ptem' ) - call dshr_fldList_add(fldsExport, 'Sa_dens' ) - call dshr_fldList_add(fldsExport, 'Sa_pslv' ) - call dshr_fldList_add(fldsExport, 'Sa_tbot' ) - call dshr_fldList_add(fldsExport, 'Sa_pbot' ) - call dshr_fldList_add(fldsExport, 'Sa_shum' ) - call dshr_fldList_add(fldsExport, 'Faxa_rainc' ) - call dshr_fldList_add(fldsExport, 'Faxa_rainl' ) - call dshr_fldList_add(fldsExport, 'Faxa_snowc' ) - call dshr_fldList_add(fldsExport, 'Faxa_snowl' ) - call dshr_fldList_add(fldsExport, 'Faxa_swndr' ) - call dshr_fldList_add(fldsExport, 'Faxa_swvdr' ) - call dshr_fldList_add(fldsExport, 'Faxa_swndf' ) - call dshr_fldList_add(fldsExport, 'Faxa_swvdf' ) - call dshr_fldList_add(fldsExport, 'Faxa_swnet' ) - call dshr_fldList_add(fldsExport, 'Faxa_lwdn' ) - call dshr_fldList_add(fldsExport, 'Faxa_swdn' ) - - fldlist => fldsExport ! the head of the linked list - do while (associated(fldlist)) - call NUOPC_Advertise(exportState, standardName=fldlist%stdname, rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call ESMF_LogWrite('(datm_comp_advertise): Fr_atm'//trim(fldList%stdname), ESMF_LOGMSG_INFO) - fldList => fldList%next - enddo - - end subroutine datm_datamode_jra55do_advertise - - !=============================================================================== - subroutine datm_datamode_jra55do_init_pointers(exportState, sdat, rc) - - ! input/output variables - type(ESMF_State) , intent(inout) :: exportState - type(shr_strdata_type) , intent(in) :: sdat - integer , intent(out) :: rc - - ! local variables - integer :: n - integer :: spatialDim ! number of dimension in mesh - integer :: numOwnedElements ! size of mesh - real(r8), pointer :: ownedElemCoords(:) ! mesh lat and lons - character(len=*), parameter :: subname='(datm_init_pointers): ' - !------------------------------------------------------------------------------- - - rc = ESMF_SUCCESS - - ! determine yc - call ESMF_MeshGet(sdat%model_mesh, spatialDim=spatialDim, numOwnedElements=numOwnedElements, rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - allocate(ownedElemCoords(spatialDim*numOwnedElements)) - allocate(yc(numOwnedElements)) - call ESMF_MeshGet(sdat%model_mesh, ownedElemCoords=ownedElemCoords) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - do n = 1,numOwnedElements - yc(n) = ownedElemCoords(2*n) - end do - - ! initialize export state pointers - call dshr_state_getfldptr(exportState, 'Sa_u' , fldptr1=Sa_u , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Sa_v' , fldptr1=Sa_v , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Sa_u10m' , fldptr1=Sa_u10m , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Sa_v10m' , fldptr1=Sa_v10m , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Sa_z' , fldptr1=Sa_z , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Sa_tbot' , fldptr1=Sa_tbot , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Sa_pbot' , fldptr1=Sa_pbot , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Sa_pslv' , fldptr1=Sa_pslv , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Sa_ptem' , fldptr1=Sa_ptem , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Sa_shum' , fldptr1=Sa_shum , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Sa_dens' , fldptr1=Sa_dens , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_rainc' , fldptr1=Faxa_rainc , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_rainl' , fldptr1=Faxa_rainl , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_snowc' , fldptr1=Faxa_snowc , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_snowl' , fldptr1=Faxa_snowl , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_swvdr' , fldptr1=Faxa_swvdr , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_swvdf' , fldptr1=Faxa_swvdf , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_swndr' , fldptr1=Faxa_swndr , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_swndf' , fldptr1=Faxa_swndf , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_swnet' , fldptr1=Faxa_swnet , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_swdn' , fldptr1=Faxa_swdn , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call dshr_state_getfldptr(exportState, 'Faxa_lwdn' , fldptr1=Faxa_lwdn , rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - - ! initialize stream pointers - call shr_strdata_get_stream_pointer( sdat, 'Faxa_prrn' , strm_Faxa_prrn , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Faxa_prrn must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Faxa_prsn' , strm_Faxa_prsn , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Faxa_prsn must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Faxa_swdn' , strm_Faxa_swdn , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Faxa_swdn must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Faxa_lwdn' , strm_Faxa_lwdn , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Faxa_lwdn must be associated for jra55do datamode', rc=rc) - - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Sa_pslv' , strm_Sa_pslv , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Sa_pslv must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Sa_tbot' , strm_Sa_tbot , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Sa_tbot must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Sa_u' , strm_Sa_u , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Sa_u must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Sa_v' , strm_Sa_v , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Sa_v must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Sa_shum' , strm_Sa_shum , requirePointer=.true., & - errmsg=subname//'ERROR: strm_Sa_shum must be associated for jra55do datamode', rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return - - end subroutine datm_datamode_jra55do_init_pointers - - !=============================================================================== - subroutine datm_datamode_jra55do_advance(exportstate, target_ymd, target_tod, model_calendar, rc) - - ! input/output variables - type(ESMF_State) , intent(inout) :: exportState - integer , intent(in) :: target_ymd - integer , intent(in) :: target_tod - character(len=*) , intent(in) :: model_calendar - integer , intent(out) :: rc - - ! local variables - integer :: n - integer :: lsize - - real(R8) :: avg_alb ! average albedo - real(R8) :: rday ! elapsed day - real(R8) :: cosFactor ! cosine factor - character(len=*), parameter :: subname='(datm_datamode_jra): ' - !------------------------------------------------------------------------------- - - rc = ESMF_SUCCESS - - lsize = size(Sa_z) - - - call shr_cal_date2julian(target_ymd, target_tod, rday, model_calendar) - rday = mod((rday - 1.0_R8),365.0_R8) - cosfactor = cos((2.0_R8*SHR_CONST_PI*rday)/365 - phs_c0) - - do n = 1,lsize - - ! Set export fields as copies directly from streams - Sa_pslv(n) = strm_Sa_pslv(n) - Sa_pbot(n) = strm_Sa_pslv(n) - Sa_tbot(n) = strm_Sa_tbot(n) - Sa_ptem(n) = strm_Sa_tbot(n) - Sa_u(n) = strm_Sa_u(n) - Sa_v(n) = strm_Sa_v(n) - Sa_shum(n) = strm_Sa_shum(n) - Faxa_swdn(n) = strm_Faxa_swdn(n) - Faxa_lwdn(n) = strm_Faxa_lwdn(n) - - ! Set Sa_z to a constant - Sa_z(n) = 10.0_R8 - - ! Set Sa_u10m and Sa_v10m to Sa_u and Sa_v - Sa_u10m(n) = Sa_u(n) - Sa_v10m(n) = Sa_v(n) - - ! density computation for JRA55 forcing - Sa_dens(n) = Sa_pbot(n)/(rdair*Sa_tbot(n)*(1 + 0.608*Sa_shum(n))) - - ! precipitation data - Faxa_rainc(n) = 0.0_R8 ! default zero - Faxa_snowc(n) = 0.0_R8 - Faxa_snowl(n) = strm_Faxa_prsn(n) ! Snowfall flux - Faxa_rainl(n) = strm_Faxa_prrn(n) ! Rainfall flux - - ! radiation data - fabricate required swdn components from net swdn - Faxa_swvdr(n) = strm_Faxa_swdn(n)*(0.28_R8) - Faxa_swndr(n) = strm_Faxa_swdn(n)*(0.31_R8) - Faxa_swvdf(n) = strm_Faxa_swdn(n)*(0.24_R8) - Faxa_swndf(n) = strm_Faxa_swdn(n)*(0.17_R8) - - ! radiation data - compute net short-wave based on LY08 latitudinally-varying albedo - avg_alb = ( 0.069 - 0.011*cos(2.0_R8*yc(n)*degtorad ) ) - Faxa_swnet(n) = strm_Faxa_swdn(n)*(1.0_R8 - avg_alb) - enddo ! lsize - - end subroutine datm_datamode_jra55do_advance - -end module datm_datamode_jra55do_mod From 3b1a873ec9df1f0867569c21510483a1516c50ea Mon Sep 17 00:00:00 2001 From: anton-seaice Date: Thu, 26 Feb 2026 11:48:25 +1100 Subject: [PATCH 6/8] cleanup #2 --- datm/datm_datamode_jra_mod.F90 | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/datm/datm_datamode_jra_mod.F90 b/datm/datm_datamode_jra_mod.F90 index 745857da7..a8242baaf 100644 --- a/datm/datm_datamode_jra_mod.F90 +++ b/datm/datm_datamode_jra_mod.F90 @@ -197,17 +197,13 @@ subroutine datm_datamode_jra_init_pointers(exportState, sdat, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return ! initialize stream pointers - ! jra 55 - call shr_strdata_get_stream_pointer( sdat, 'Faxa_prec' , strm_Faxa_prec , & - errmsg=subname//'ERROR: strm_Faxa_prec must be associated for jra datamode', rc=rc) + call shr_strdata_get_stream_pointer( sdat, 'Faxa_prec' , strm_Faxa_prec , rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - ! jra 55do - call shr_strdata_get_stream_pointer( sdat, 'Faxa_prrn' , strm_Faxa_prrn , & - errmsg=subname//'ERROR: strm_Faxa_prrn must be associated for jra55do datamode', rc=rc) + call shr_strdata_get_stream_pointer( sdat, 'Faxa_prrn' , strm_Faxa_prrn , rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - call shr_strdata_get_stream_pointer( sdat, 'Faxa_prsn' , strm_Faxa_prsn , & - errmsg=subname//'ERROR: strm_Faxa_prsn must be associated for jra55do datamode', rc=rc) + call shr_strdata_get_stream_pointer( sdat, 'Faxa_prsn' , strm_Faxa_prsn , rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return + if ( .not. ((associated(strm_Faxa_prec) & !jra 55 .or. (associated(strm_Faxa_prrn) .and. associated(strm_Faxa_prsn))))) & !jra55do call shr_log_error(subName//"ERROR: strm_Faxa_prec or (strm_Faxa_prrn and strm_Faxa_prsn)"//& From dc692fee3b476966e3e067f48a9fc766df2e55d0 Mon Sep 17 00:00:00 2001 From: anton-seaice Date: Thu, 26 Feb 2026 11:52:06 +1100 Subject: [PATCH 7/8] cleanup #2 --- datm/datm_datamode_jra_mod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datm/datm_datamode_jra_mod.F90 b/datm/datm_datamode_jra_mod.F90 index a8242baaf..94bea075e 100644 --- a/datm/datm_datamode_jra_mod.F90 +++ b/datm/datm_datamode_jra_mod.F90 @@ -206,7 +206,7 @@ subroutine datm_datamode_jra_init_pointers(exportState, sdat, rc) if ( .not. ((associated(strm_Faxa_prec) & !jra 55 .or. (associated(strm_Faxa_prrn) .and. associated(strm_Faxa_prsn))))) & !jra55do - call shr_log_error(subName//"ERROR: strm_Faxa_prec or (strm_Faxa_prrn and strm_Faxa_prsn)"//& + call shr_log_error(subName//"ERROR: strm_Faxa_prec or (strm_Faxa_prrn and strm_Faxa_prsn) "//& "must be associated for jra datamore", rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return From 2a8cfb5dc114ac24ed8f916b12dd78b531bcb78f Mon Sep 17 00:00:00 2001 From: anton-seaice Date: Thu, 26 Feb 2026 11:52:51 +1100 Subject: [PATCH 8/8] cleanup #2 --- datm/datm_datamode_jra_mod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datm/datm_datamode_jra_mod.F90 b/datm/datm_datamode_jra_mod.F90 index 94bea075e..411fec4ce 100644 --- a/datm/datm_datamode_jra_mod.F90 +++ b/datm/datm_datamode_jra_mod.F90 @@ -207,7 +207,7 @@ subroutine datm_datamode_jra_init_pointers(exportState, sdat, rc) if ( .not. ((associated(strm_Faxa_prec) & !jra 55 .or. (associated(strm_Faxa_prrn) .and. associated(strm_Faxa_prsn))))) & !jra55do call shr_log_error(subName//"ERROR: strm_Faxa_prec or (strm_Faxa_prrn and strm_Faxa_prsn) "//& - "must be associated for jra datamore", rc=rc) + "must be associated for jra datamode", rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return call shr_strdata_get_stream_pointer( sdat, 'Faxa_swdn' , strm_Faxa_swdn , requirePointer=.true., &