diff --git a/.gitmodules b/.gitmodules index a7209d8df..0e5ac5a7a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,8 +8,8 @@ branch = main [submodule "ccpp/physics"] path = ccpp/physics - url = https://github.com/SamuelTrahanNOAA/ccpp-physics - branch = sing_prec_from_main + url = https://github.com/DusanJovic-NOAA/ccpp-physics + branch = single_prec [submodule "upp"] path = upp url = https://github.com/NOAA-EMC/UPP diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index f125489af..b55ea324d 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -1,6 +1,6 @@ module GFS_typedefs - use machine, only: kind_phys, kind_dbl_prec + use machine, only: kind_phys, kind_dbl_prec, kind_sngl_prec use physcons, only: con_cp, con_fvirt, con_g, & con_hvap, con_hfus, con_pi, con_rd, con_rv, & con_t0c, con_cvap, con_cliq, con_eps, con_epsq, & @@ -2736,6 +2736,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: exists real(kind=kind_phys) :: tem real(kind=kind_phys) :: rinc(5) + real(kind=kind_sngl_prec) :: rinc4(5) + real(kind=kind_dbl_prec) :: rinc8(5) real(kind=kind_phys) :: wrk(1) real(kind=kind_phys), parameter :: con_hr = 3600. @@ -3217,7 +3219,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & ! max and min lon and lat for critical relative humidity integer :: max_lon=5000, max_lat=2000, min_lon=192, min_lat=94 real(kind=kind_phys) :: rhcmax = 0.9999999 !< max critical rel. hum. +#ifdef SINGLE_PREC + real(kind=kind_phys) :: huge = 9.9692099683868690E30 ! NetCDF float FillValue +#else real(kind=kind_phys) :: huge = 9.9692099683868690E36 ! NetCDF float FillValue +#endif !--- stochastic physics control parameters @@ -3245,6 +3251,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & real(kind=kind_phys) :: radar_tten_limits(2) = (/ limit_unspecified, limit_unspecified /) integer :: itime + integer :: w3kindreal,w3kindint !--- END NAMELIST VARIABLES @@ -4631,7 +4638,19 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%cdec = -9999. Model%clstp = -9999 rinc(1:5) = 0 - call w3difdat(jdat,idat,4,rinc) + call w3kind(w3kindreal,w3kindint) + if (w3kindreal == 8) then + rinc8(1:5) = 0 + call w3difdat(jdat,idat,4,rinc8) + rinc = rinc8 + else if (w3kindreal == 4) then + rinc4(1:5) = 0 + call w3difdat(jdat,idat,4,rinc4) + rinc = rinc4 + else + write(0,*)' FATAL ERROR: Invalid w3kindreal' + call abort + endif Model%phour = rinc(4)/con_hr Model%fhour = (rinc(4) + Model%dtp)/con_hr Model%zhour = mod(Model%phour,Model%fhzero) diff --git a/ccpp/physics b/ccpp/physics index 63020ec6a..82250de85 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 63020ec6a737511a46102865458b9843e340a404 +Subproject commit 82250de857dab51b8de4bcc40ec147f9e229a4e6 diff --git a/module_fcst_grid_comp.F90 b/module_fcst_grid_comp.F90 index 886f23a23..a713fbeed 100644 --- a/module_fcst_grid_comp.F90 +++ b/module_fcst_grid_comp.F90 @@ -38,6 +38,8 @@ module module_fcst_grid_comp atmos_model_exchange_phase_2, & addLsmask2grid, atmos_model_get_nth_domain_info + use GFS_typedefs, only: kind_phys, kind_sngl_prec + use constants_mod, only: constants_init use fms_mod, only: error_mesg, fms_init, fms_end, & write_version_number, uppercase @@ -161,6 +163,7 @@ subroutine SetServicesNest(nest, rc) integer,dimension(2,6):: decomptile !define delayout for the 6 cubed-sphere tiles integer,dimension(2) :: regdecomp !define delayout for the nest grid type(ESMF_Decomp_Flag):: decompflagPTile(2,6) + type(ESMF_TypeKind_Flag) :: grid_typekind character(3) :: myGridStr type(ESMF_DistGrid) :: distgrid type(ESMF_Array) :: array @@ -188,6 +191,12 @@ subroutine SetServicesNest(nest, rc) call ESMF_InfoGet(info, key="layout", values=layout, rc=rc); ESMF_ERR_ABORT(rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, line=__LINE__, file=__FILE__)) return + if (kind_phys == kind_sngl_prec) then + grid_typekind = ESMF_TYPEKIND_R4 + else + grid_typekind = ESMF_TYPEKIND_R8 + endif + if (trim(name)=="global") then ! global domain call ESMF_InfoGet(info, key="tilesize", value=tilesize, rc=rc); ESMF_ERR_ABORT(rc) @@ -200,6 +209,7 @@ subroutine SetServicesNest(nest, rc) enddo grid = ESMF_GridCreateCubedSphere(tileSize=tilesize, & coordSys=ESMF_COORDSYS_SPH_RAD, & + coordTypeKind=grid_typekind, & regDecompPTile=decomptile, & decompflagPTile=decompflagPTile, & name="fcst_grid", rc=rc) @@ -215,6 +225,7 @@ subroutine SetServicesNest(nest, rc) maxIndex=(/nx,ny/), & gridAlign=(/-1,-1/), & coordSys=ESMF_COORDSYS_SPH_RAD, & + coordTypeKind=grid_typekind, & decompflag=(/ESMF_DECOMP_SYMMEDGEMAX,ESMF_DECOMP_SYMMEDGEMAX/), & name="fcst_grid", & indexflag=ESMF_INDEX_DELOCAL, &