From 19ad3f89e67e8a9a2abc1e74ad82e74e6ee48bef Mon Sep 17 00:00:00 2001 From: anton-seaice Date: Thu, 21 May 2026 13:22:38 +1000 Subject: [PATCH] Support JRA55do in datm --- datm/atm_comp_nuopc.F90 | 12 +++++----- datm/datm_datamode_jra_mod.F90 | 42 +++++++++++++++++++++++++++------- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/datm/atm_comp_nuopc.F90 b/datm/atm_comp_nuopc.F90 index 5758916a6..aa2801466 100644 --- a/datm/atm_comp_nuopc.F90 +++ b/datm/atm_comp_nuopc.F90 @@ -364,7 +364,7 @@ subroutine InitializeAdvertise(gcomp, importState, exportState, clock, rc) ! Validate sdat datamode if (mainproc) write(logunit,*) ' datm datamode = ',trim(datamode) select case (trim(datamode)) - case ('CORE2_NYF','CORE2_IAF','CORE_IAF_JRA', & + case ('CORE2_NYF','CORE2_IAF','CORE_IAF_JRA', 'JRA55do', & 'CORE_RYF6162_JRA','CORE_RYF8485_JRA','CORE_RYF9091_JRA','CORE_RYF0304_JRA', & 'CLMNCEP','CPLHIST','GEFS','ERA5','SIMPLE') if (mainproc) write(logunit,'(3a)') subname,'datm datamode = ',trim(datamode) @@ -392,7 +392,7 @@ 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 ('CLMNCEP') @@ -659,7 +659,7 @@ 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('CLMNCEP') @@ -686,7 +686,7 @@ subroutine datm_comp_run(gcomp, importState, exportState, target_ymd, target_tod select case (trim(datamode)) case('CORE2_NYF','CORE2_IAF','CORE_IAF_JRA',& 'CORE_RYF6162_JRA','CORE_RYF8485_JRA' ,& - 'CORE_RYF9091_JRA','CORE_RYF0304_JRA' ,& + 'CORE_RYF9091_JRA','CORE_RYF0304_JRA' , 'JRA55do', & 'CLMNCEP','CPLHIST','ERA5','GEFS','SIMPLE') call dshr_restart_read(restfilm, rpfile, logunit, my_task, mpicom, sdat, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return @@ -737,7 +737,7 @@ 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('CLMNCEP') @@ -764,7 +764,7 @@ subroutine datm_comp_run(gcomp, importState, exportState, target_ymd, target_tod select case (trim(datamode)) case('CORE2_NYF','CORE2_IAF','CORE_IAF_JRA',& 'CORE_RYF6162_JRA','CORE_RYF8485_JRA' ,& - 'CORE_RYF9091_JRA','CORE_RYF0304_JRA' ,& + 'CORE_RYF9091_JRA','CORE_RYF0304_JRA','JRA55do' ,& 'CLMNCEP','CPLHIST','ERA5','GEFS','SIMPLE') call dshr_restart_write(rpfile, case_name, 'datm', inst_suffix, & target_ymd, target_tod, logunit, my_task, sdat, rc) diff --git a/datm/datm_datamode_jra_mod.F90 b/datm/datm_datamode_jra_mod.F90 index a32973791..411fec4ce 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,19 @@ 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., & - 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 + 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 , 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 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 jra datamode', rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return @@ -233,6 +247,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 +258,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 +294,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