diff --git a/physics/GFS_debug.F90 b/physics/GFS_debug.F90 index 9adb35118..2db523355 100644 --- a/physics/GFS_debug.F90 +++ b/physics/GFS_debug.F90 @@ -491,18 +491,19 @@ subroutine GFS_diagtoscreen_run (Model, Statein, Stateout, Sfcprop, Coupling, end if ! CCPP/RUC only if (Model%lsm == Model%lsm_ruc) then - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Model%zs', Model%zs) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%sh2o', Sfcprop%sh2o) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%smois', Sfcprop%smois) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%tslb', Sfcprop%tslb) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%clw_surf', Sfcprop%clw_surf) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%qwv_surf', Sfcprop%qwv_surf) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%cndm_surf', Sfcprop%cndm_surf) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%flag_frsoil', Sfcprop%flag_frsoil) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%rhofr', Sfcprop%rhofr) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%tsnow', Sfcprop%tsnow) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%snowfallac ', Sfcprop%snowfallac) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%acsnow ', Sfcprop%acsnow) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%sh2o', Sfcprop%sh2o) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%smois', Sfcprop%smois) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%tslb', Sfcprop%tslb) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%clw_surf_land', Sfcprop%clw_surf_land) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%clw_surf_ice', Sfcprop%clw_surf_ice) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%qwv_surf_land', Sfcprop%qwv_surf_land) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%qwv_surf_ice', Sfcprop%qwv_surf_ice) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%flag_frsoil', Sfcprop%flag_frsoil) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%rhofr', Sfcprop%rhofr) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%tsnow_land', Sfcprop%tsnow_land) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%tsnow_ice', Sfcprop%tsnow_ice) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%snowfallac_land', Sfcprop%snowfallac_land) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%snowfallac_ice', Sfcprop%snowfallac_ice) end if ! Radtend call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Radtend%sfcfsw%upfxc', Radtend%sfcfsw(:)%upfxc) @@ -647,10 +648,9 @@ subroutine GFS_diagtoscreen_run (Model, Statein, Stateout, Sfcprop, Coupling, do n=1,size(Diag%dq3dt(1,1,:)) call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Diag%dq3dt_n ', Diag%dq3dt(:,:,n)) end do - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Diag%upd_mf ', Diag%upd_mf) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Diag%dwn_mf ', Diag%dwn_mf) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Diag%det_mf ', Diag%det_mf) - call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Diag%cldcov ', Diag%cldcov) + !call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Diag%upd_mf ', Diag%upd_mf) + !call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Diag%dwn_mf ', Diag%dwn_mf) + !call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Diag%det_mf ', Diag%det_mf) end if if(Model%lradar) then call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Diag%refl_10cm ', Diag%refl_10cm) diff --git a/physics/GFS_phys_time_vary.scm.F90 b/physics/GFS_phys_time_vary.scm.F90 index be62e5052..7f2377397 100644 --- a/physics/GFS_phys_time_vary.scm.F90 +++ b/physics/GFS_phys_time_vary.scm.F90 @@ -389,6 +389,7 @@ subroutine GFS_phys_time_vary_run (Grid, Statein, Model, Tbd, Sfcprop, Cldprop, endif endif enddo + ! DH* 20201104: don't forget snocvr_ice for RUC LSM (see FV3GFS_io.F90) endif endif #endif diff --git a/physics/GFS_surface_composites.F90 b/physics/GFS_surface_composites.F90 index 92367ef4b..d0f1829df 100644 --- a/physics/GFS_surface_composites.F90 +++ b/physics/GFS_surface_composites.F90 @@ -607,7 +607,7 @@ subroutine GFS_surface_composites_post_run ( tsfco(i) = tsfc(i) endif tsfcl(i) = tsfc(i) - do k=1,kice ! store tiice in stc to reduce output in the nonfrac grid case + do k=1,min(kice,km) ! store tiice in stc to reduce output in the nonfrac grid case stc(i,k) = tiice(i,k) end do endif diff --git a/physics/docs/pdftxt/GSD_adv_suite.txt b/physics/docs/pdftxt/GSD_adv_suite.txt index 39c5ebd20..1f2dbe7fa 100644 --- a/physics/docs/pdftxt/GSD_adv_suite.txt +++ b/physics/docs/pdftxt/GSD_adv_suite.txt @@ -77,9 +77,6 @@ The GSD_v1 physics suite uses the parameterizations in the following order: sfc_nst sfc_nst_post lsm_ruc - lsm_ruc_sfc_sice_pre - sfc_sice - lsm_ruc_sfc_sice_post GFS_surface_loop_control_part2 diff --git a/physics/lsm_ruc_sfc_sice_interstitial.F90 b/physics/lsm_ruc_sfc_sice_interstitial.F90 deleted file mode 100644 index 27033fcc8..000000000 --- a/physics/lsm_ruc_sfc_sice_interstitial.F90 +++ /dev/null @@ -1,123 +0,0 @@ -module lsm_ruc_sfc_sice_pre - - use machine, only: kind_phys - - implicit none - - private - - public :: lsm_ruc_sfc_sice_pre_init, lsm_ruc_sfc_sice_pre_run, lsm_ruc_sfc_sice_pre_finalize - -contains - - subroutine lsm_ruc_sfc_sice_pre_init () - end subroutine lsm_ruc_sfc_sice_pre_init - - subroutine lsm_ruc_sfc_sice_pre_finalize () - end subroutine lsm_ruc_sfc_sice_pre_finalize - -#if 0 -!> \section arg_table_lsm_ruc_sfc_sice_pre_run Argument Table -!! \htmlinclude lsm_ruc_sfc_sice_pre_run.html -!! -#endif - subroutine lsm_ruc_sfc_sice_pre_run(im, lsoil_ruc, lsoil, kice, land, icy, stc, tslb, tiice, errmsg, errflg) - - implicit none - - ! Interface variables - integer, intent(in) :: im, lsoil_ruc, lsoil, kice - logical, dimension(im), intent(in) :: land, icy -! --- on Noah levels - real (kind=kind_phys), dimension(im,lsoil), intent(inout) :: stc -! --- on RUC levels - real (kind=kind_phys), dimension(im,lsoil_ruc), intent(in) :: tslb - real (kind=kind_phys), dimension(im,kice), intent(inout) :: tiice - - character(len=*), intent(out) :: errmsg - integer, intent(out) :: errflg - - ! Local variables - integer :: i, k - - ! Initialize CCPP error handling variables - errmsg = '' - errflg = 0 - - do i=1,im - if (icy(i)) then - do k=1,kice - tiice(i,k) = tslb(i,k) - end do - else if (.not.land(i)) then - do k=1,min(lsoil,lsoil_ruc) - stc(i,k) = tslb(i,k) - end do - end if - end do - - end subroutine lsm_ruc_sfc_sice_pre_run - -end module lsm_ruc_sfc_sice_pre - -module lsm_ruc_sfc_sice_post - - use machine, only: kind_phys - - implicit none - - private - - public :: lsm_ruc_sfc_sice_post_init, lsm_ruc_sfc_sice_post_run, lsm_ruc_sfc_sice_post_finalize - -contains - - subroutine lsm_ruc_sfc_sice_post_init () - end subroutine lsm_ruc_sfc_sice_post_init - - subroutine lsm_ruc_sfc_sice_post_finalize () - end subroutine lsm_ruc_sfc_sice_post_finalize - -#if 0 -!> \section arg_table_lsm_ruc_sfc_sice_post_run Argument Table -!! \htmlinclude lsm_ruc_sfc_sice_post_run.html -!! -#endif - subroutine lsm_ruc_sfc_sice_post_run(im, lsoil_ruc, lsoil, kice, land, icy, stc, tslb, tiice, errmsg, errflg) - - implicit none - - ! Interface variables - integer, intent(in) :: im, lsoil_ruc, lsoil, kice - logical, dimension(im), intent(in) :: land, icy -! --- on Noah levels - real (kind=kind_phys), dimension(im,lsoil), intent(in) :: stc - real (kind=kind_phys), dimension(im,kice), intent(in) :: tiice -! --- on RUC levels - real (kind=kind_phys), dimension(im,lsoil_ruc), intent(inout) :: tslb - - character(len=*), intent(out) :: errmsg - integer, intent(out) :: errflg - - ! Local variables - integer :: i, k - - ! Initialize CCPP error handling variables - errmsg = '' - errflg = 0 - - do i=1,im - if (icy(i)) then - do k=1,kice - tslb(i,k) = tiice(i,k) - end do - else if (.not.land(i)) then - do k=1,min(lsoil,lsoil_ruc) - tslb(i,k) = stc(i,k) - end do - end if - end do - - end subroutine lsm_ruc_sfc_sice_post_run - -end module lsm_ruc_sfc_sice_post diff --git a/physics/lsm_ruc_sfc_sice_interstitial.meta b/physics/lsm_ruc_sfc_sice_interstitial.meta deleted file mode 100644 index d7a5736a5..000000000 --- a/physics/lsm_ruc_sfc_sice_interstitial.meta +++ /dev/null @@ -1,204 +0,0 @@ -[ccpp-table-properties] - name = lsm_ruc_sfc_sice_pre - type = scheme - dependencies = machine.F - -######################################################################## -[ccpp-arg-table] - name = lsm_ruc_sfc_sice_pre_run - type = scheme -[im] - standard_name = horizontal_loop_extent - long_name = horizontal loop extent - units = count - dimensions = () - type = integer - intent = in - optional = F -[lsoil_ruc] - standard_name = soil_vertical_dimension_for_land_surface_model - long_name = number of soil layers internal to land surface model - units = count - dimensions = () - type = integer - intent = in - optional = F -[lsoil] - standard_name = soil_vertical_dimension - long_name = soil vertical layer dimension - units = count - dimensions = () - type = integer - intent = in - optional = F -[kice] - standard_name = ice_vertical_dimension - long_name = vertical loop extent for ice levels, start at 1 - units = count - dimensions = () - type = integer - intent = in - optional = F -[land] - standard_name = flag_nonzero_land_surface_fraction - long_name = flag indicating presence of some land surface area fraction - units = flag - dimensions = (horizontal_loop_extent) - type = logical - intent = in - optional = F -[icy] - standard_name = flag_nonzero_sea_ice_surface_fraction - long_name = flag indicating presence of some sea ice surface area fraction - units = flag - dimensions = (horizontal_loop_extent) - type = logical - intent = inout - optional = F -[stc] - standard_name = soil_temperature - long_name = soil temperature - units = K - dimensions = (horizontal_loop_extent,soil_vertical_dimension) - type = real - kind = kind_phys - intent = inout - optional = F -[tslb] - standard_name = soil_temperature_for_land_surface_model - long_name = soil temperature for land surface model - units = K - dimensions = (horizontal_loop_extent,soil_vertical_dimension_for_land_surface_model) - type = real - kind = kind_phys - intent = in - optional = F -[tiice] - standard_name = internal_ice_temperature - long_name = sea ice internal temperature - units = K - dimensions = (horizontal_loop_extent,ice_vertical_dimension) - type = real - kind = kind_phys - intent = inout - optional = F -[errmsg] - standard_name = ccpp_error_message - long_name = error message for error handling in CCPP - units = none - dimensions = () - type = character - kind = len=* - intent = out - optional = F -[errflg] - standard_name = ccpp_error_flag - long_name = error flag for error handling in CCPP - units = flag - dimensions = () - type = integer - intent = out - optional = F - -######################################################################## -[ccpp-table-properties] - name = lsm_ruc_sfc_sice_post - type = scheme - dependencies = machine.F - -######################################################################## -[ccpp-arg-table] - name = lsm_ruc_sfc_sice_post_run - type = scheme -[im] - standard_name = horizontal_loop_extent - long_name = horizontal loop extent - units = count - dimensions = () - type = integer - intent = in - optional = F -[lsoil_ruc] - standard_name = soil_vertical_dimension_for_land_surface_model - long_name = number of soil layers internal to land surface model - units = count - dimensions = () - type = integer - intent = in - optional = F -[lsoil] - standard_name = soil_vertical_dimension - long_name = soil vertical layer dimension - units = count - dimensions = () - type = integer - intent = in - optional = F -[kice] - standard_name = ice_vertical_dimension - long_name = vertical loop extent for ice levels, start at 1 - units = count - dimensions = () - type = integer - intent = in - optional = F -[land] - standard_name = flag_nonzero_land_surface_fraction - long_name = flag indicating presence of some land surface area fraction - units = flag - dimensions = (horizontal_loop_extent) - type = logical - intent = in - optional = F -[icy] - standard_name = flag_nonzero_sea_ice_surface_fraction - long_name = flag indicating presence of some sea ice surface area fraction - units = flag - dimensions = (horizontal_loop_extent) - type = logical - intent = inout - optional = F -[stc] - standard_name = soil_temperature - long_name = soil temperature - units = K - dimensions = (horizontal_loop_extent,soil_vertical_dimension) - type = real - kind = kind_phys - intent = in - optional = F -[tslb] - standard_name = soil_temperature_for_land_surface_model - long_name = soil temperature for land surface model - units = K - dimensions = (horizontal_loop_extent,soil_vertical_dimension_for_land_surface_model) - type = real - kind = kind_phys - intent = inout - optional = F -[tiice] - standard_name = internal_ice_temperature - long_name = sea ice internal temperature - units = K - dimensions = (horizontal_loop_extent,ice_vertical_dimension) - type = real - kind = kind_phys - intent = inout - optional = F -[errmsg] - standard_name = ccpp_error_message - long_name = error message for error handling in CCPP - units = none - dimensions = () - type = character - kind = len=* - intent = out - optional = F -[errflg] - standard_name = ccpp_error_flag - long_name = error flag for error handling in CCPP - units = flag - dimensions = () - type = integer - intent = out - optional = F diff --git a/physics/module_MYNNSFC_wrapper.F90 b/physics/module_MYNNSFC_wrapper.F90 index 7cc64bbcf..e46a17d9a 100644 --- a/physics/module_MYNNSFC_wrapper.F90 +++ b/physics/module_MYNNSFC_wrapper.F90 @@ -11,10 +11,29 @@ MODULE mynnsfc_wrapper contains - subroutine mynnsfc_wrapper_init() +!! \section arg_table_mynnsfc_wrapper_init Argument Table +!! \htmlinclude mynnsfc_wrapper_init.html - ! initialize tables for psih and psim (stable and unstable) - CALL PSI_INIT(psi_opt) +!! + subroutine mynnsfc_wrapper_init(errmsg, errflg) + + character(len=*), intent(out) :: errmsg + integer, intent(out) :: errflg + + ! Initialize CCPP error handling variables + errmsg = '' + errflg = 0 + + ! initialize tables for psih and psim (stable and unstable) + CALL PSI_INIT(psi_opt,errmsg,errflg) + + IF (debug_code >= 1) THEN + print*,"CHECK INITIALIZATION OF PSI:" + print*,"psim_stab(0-1):",psim_stab(0),psim_stab(1) + print*,"psih_stab(0-1):",psih_stab(0),psih_stab(1) + print*,"psim_unstab(0-1):",psim_unstab(0),psim_unstab(1) + print*,"psih_unstab(0-1):",psih_unstab(0),psih_unstab(1) + ENDIF end subroutine mynnsfc_wrapper_init @@ -30,7 +49,7 @@ end subroutine mynnsfc_wrapper_finalize SUBROUTINE mynnsfc_wrapper_run( & & im,levs, & & itimestep,iter, & - & flag_init,flag_restart,lsm, & + & flag_init,flag_restart,lsm,lsm_ruc,& & sigmaf,vegtype,shdmax,ivegsrc, & !intent(in) & z0pert,ztpert, & !intent(in) & redrag,sfc_z0_type, & !intent(in) @@ -54,7 +73,8 @@ SUBROUTINE mynnsfc_wrapper_run( & & fh2_ocn, fh2_lnd, fh2_ice, & !intent(inout) & hflx_ocn, hflx_lnd, hflx_ice, & & qflx_ocn, qflx_lnd, qflx_ice, & - & QSFC, qsfc_ruc, USTM, ZOL, MOL, & + & QSFC, qsfc_lnd_ruc, qsfc_ice_ruc, & + & USTM, ZOL, MOL, & & RMOL, WSPD, ch, HFLX, QFLX, LH, & & FLHC, FLQC, & & U10, V10, TH2, T2, Q2, & @@ -122,7 +142,7 @@ SUBROUTINE mynnsfc_wrapper_run( & !MYNN-1D REAL :: delt INTEGER :: im, levs - INTEGER :: iter, k, i, itimestep, lsm + INTEGER :: iter, k, i, itimestep, lsm, lsm_ruc LOGICAL :: flag_init,flag_restart,lprnt INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE, & & IMS,IME,JMS,JME,KMS,KME, & @@ -160,11 +180,12 @@ SUBROUTINE mynnsfc_wrapper_run( & & qsfc_ocn, qsfc_lnd, qsfc_ice !MYNN-2D - real(kind=kind_phys), dimension(im), intent(in) :: & - & dx, pblh, slmsk, ps + real(kind=kind_phys), dimension(:), intent(in) :: & + & dx, pblh, slmsk, ps, & + & qsfc_lnd_ruc, qsfc_ice_ruc real(kind=kind_phys), dimension(im), intent(inout) :: & - & ustm, hflx, qflx, wspd, qsfc, qsfc_ruc, & + & ustm, hflx, qflx, wspd, qsfc, & & FLHC, FLQC, U10, V10, TH2, T2, Q2, & & CHS2, CQS2, rmol, zol, mol, ch, & & lh, wstar @@ -172,7 +193,7 @@ SUBROUTINE mynnsfc_wrapper_run( & real, dimension(im) :: & & hfx, znt, psim, psih, & & chs, ck, cd, mavail, xland, GZ1OZ0, & - & cpm, qgh, qfx + & cpm, qgh, qfx, qsfc_ruc ! Initialize CCPP error handling variables errmsg = '' @@ -216,6 +237,13 @@ SUBROUTINE mynnsfc_wrapper_run( & where (wet) znt_ocn=znt_ocn*0.01 where (icy) znt_ice=znt_ice*0.01 + ! qsfc ruc + qsfc_ruc = 0.0 + if (lsm==lsm_ruc) then + where (dry) qsfc_ruc = qsfc_lnd_ruc + where (icy) qsfc_ruc = qsfc_ice_ruc + end if + ! if (lprnt) then ! write(0,*)"CALLING SFCLAY_mynn; input:" ! write(0,*)"T:",t3d(1,1),t3d(1,2),t3d(1,3) diff --git a/physics/module_MYNNSFC_wrapper.meta b/physics/module_MYNNSFC_wrapper.meta index 6a410c297..e3e870ff2 100644 --- a/physics/module_MYNNSFC_wrapper.meta +++ b/physics/module_MYNNSFC_wrapper.meta @@ -3,6 +3,28 @@ type = scheme dependencies = machine.F,module_sf_mynn.F90 +######################################################################## +[ccpp-arg-table] + name = mynnsfc_wrapper_init + type = scheme +[errmsg] + standard_name = ccpp_error_message + long_name = error message for error handling in CCPP + units = none + dimensions = () + type = character + kind = len=* + intent = out + optional = F +[errflg] + standard_name = ccpp_error_flag + long_name = error flag for error handling in CCPP + units = flag + dimensions = () + type = integer + intent = out + optional = F + ######################################################################## [ccpp-arg-table] name = mynnsfc_wrapper_run @@ -63,6 +85,14 @@ type = integer intent = in optional = F +[lsm_ruc] + standard_name = flag_for_ruc_land_surface_scheme + long_name = flag for RUC land surface model + units = flag + dimensions = () + type = integer + intent = in + optional = F [sigmaf] standard_name = bounded_vegetation_area_fraction long_name = areal fractional cover of green vegetation bounded on the bottom @@ -713,14 +743,23 @@ kind = kind_phys intent = inout optional = F -[qsfc_ruc] - standard_name = water_vapor_mixing_ratio_at_surface - long_name = water vapor mixing ratio at surface +[qsfc_lnd_ruc] + standard_name = water_vapor_mixing_ratio_at_surface_over_land + long_name = water vapor mixing ratio at surface over land units = kg kg-1 dimensions = (horizontal_loop_extent) type = real kind = kind_phys - intent = inout + intent = in + optional = F +[qsfc_ice_ruc] + standard_name = water_vapor_mixing_ratio_at_surface_over_ice + long_name = water vapor mixing ratio at surface over ice + units = kg kg-1 + dimensions = (horizontal_dimension) + type = real + kind = kind_phys + intent = in optional = F [ustm] standard_name = surface_friction_velocity_drag diff --git a/physics/module_sf_mynn.F90 b/physics/module_sf_mynn.F90 index ebbc3dcf9..340fb703a 100644 --- a/physics/module_sf_mynn.F90 +++ b/physics/module_sf_mynn.F90 @@ -109,7 +109,7 @@ MODULE module_sf_mynn REAL, PARAMETER :: COARE_OPT=3.0 ! 3.0 or 3.5 !For debugging purposes: INTEGER, PARAMETER :: debug_code = 0 !0: no extra ouput - !1: some step-by-step output + !1: check input !2: everything - heavy I/O LOGICAL, PARAMETER :: compute_diag = .false. LOGICAL, PARAMETER :: compute_flux = .false. !shouldn't need compute @@ -122,23 +122,6 @@ MODULE module_sf_mynn CONTAINS !------------------------------------------------------------------- -!>\ingroup module_sf_mynn_mod -!> Fill the PSIM and PSIH tables. The subroutine "psi_init" was leveraged from -!! module_sf_sfclayrev.F, leveraging the work from Pedro Jimenez. -!! This subroutine returns a blended form from Dyer and Hicks (1974) -!! and Grachev et al (2000) for unstable conditions and the form -!! from Cheng and Brutsaert (2005) for stable conditions. - - SUBROUTINE mynn_sf_init_driver(allowed_to_read,psi_opt) - - LOGICAL, INTENT(in) :: allowed_to_read - INTEGER, INTENT(IN) :: psi_opt - - !CALL psi_init - CALL psi_init(psi_opt) - - END SUBROUTINE mynn_sf_init_driver - !------------------------------------------------------------------- !>\ingroup module_sf_mynn_mod !! This subroutine @@ -149,7 +132,7 @@ SUBROUTINE SFCLAY_mynn( & CP,G,ROVCP,R,XLV, & !in SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN, & !in ISFFLX,isftcflx,lsm,iz0tlnd,psi_opt, & !in - & sigmaf,vegtype,shdmax,ivegsrc, & !intent(in) + & sigmaf,vegtype,shdmax,ivegsrc, & !intent(in) & z0pert,ztpert, & !intent(in) & redrag,sfc_z0_type, & !intent(in) itimestep,iter, & !in @@ -351,7 +334,8 @@ SUBROUTINE SFCLAY_mynn( & REAL, DIMENSION( ims:ime ), INTENT(IN) :: & & tskin_ocn, tskin_lnd, tskin_ice, & & tsurf_ocn, tsurf_lnd, tsurf_ice, & - & snowh_ocn, snowh_lnd, snowh_ice + & snowh_ocn, snowh_lnd, snowh_ice, & + & qsfc_ruc REAL, DIMENSION( ims:ime), INTENT(INOUT) :: & & ZNT_ocn, ZNT_lnd, ZNT_ice, & @@ -366,8 +350,7 @@ SUBROUTINE SFCLAY_mynn( & & fh2_ocn, fh2_lnd, fh2_ice, & & HFLX_ocn, HFLX_lnd, HFLX_ice, & & QFLX_ocn, QFLX_lnd, QFLX_ice, & - & qsfc_ocn, qsfc_lnd, qsfc_ice, & - & qsfc_ruc + & qsfc_ocn, qsfc_lnd, qsfc_ice !ADDITIONAL OUTPUT !JOE-begin @@ -545,6 +528,7 @@ SUBROUTINE SFCLAY1D_mynn( & REAL, PARAMETER :: XKA=2.4E-5 !molecular diffusivity REAL, PARAMETER :: PRT=1. !prandlt number + REAL, PARAMETER :: snowh_thresh = 50. !mm REAL, INTENT(IN) :: SVP1,SVP2,SVP3,SVPT0,EP1,EP2 REAL, INTENT(IN) :: KARMAN,CP,G,ROVCP,R,XLV !,DX @@ -678,11 +662,11 @@ SUBROUTINE SFCLAY1D_mynn( & IF (debug_code >= 1) THEN write(0,*)"ITIMESTEP=",ITIMESTEP," iter=",iter DO I=its,ite - write(0,*)"=== imortant input to mynnsfclayer, i:", i + write(0,*)"=== important input to mynnsfclayer, i:", i IF (dry(i)) THEN write(0,*)"dry=",dry(i)," pblh=",pblh(i)," tsk=", tskin_lnd(i),& " tsurf=", tsurf_lnd(i)," qsfc=", qsfc_lnd(i)," znt=", znt_lnd(i),& - " ust=", ust_lnd(i)," snowh=", snowh_lnd(i),"psfcpa=",PSFCPA(i), & + " ust=", ust_lnd(i)," snowh=", snowh_lnd(i)," psfcpa=",PSFCPA(i), & " dz=",dz8w1d(i)," qflx=",qflx(i)," hflx=",hflx(i)," hpbl=",pblh(i) ENDIF IF (icy(i)) THEN @@ -860,9 +844,9 @@ SUBROUTINE SFCLAY1D_mynn( & IF (wet(i)) THEN DTHVDZ=(THV1D(I)-THVSK_ocn(I)) !-------------------------------------------------------- - ! Calculate the convective velocity scale (WSTAR) and - ! subgrid-scale velocity (VSGD) following Beljaars (1995, QJRMS) - ! and Mahrt and Sun (1995, MWR), respectively + ! Calculate the convective velocity scale (WSTAR) and + ! subgrid-scale velocity (VSGD) following Beljaars (1995, QJRMS) + ! and Mahrt and Sun (1995, MWR), respectively !------------------------------------------------------- fluxc = max(hfx(i)/RHO1D(i)/cp & & + ep1*THVSK_ocn(I)*qfx(i)/RHO1D(i),0.) @@ -884,23 +868,23 @@ SUBROUTINE SFCLAY1D_mynn( & rb_ocn(I)=MAX(rb_ocn(I),-2.0) rb_ocn(I)=MIN(rb_ocn(I), 2.0) ELSE - rb_ocn(I)=MAX(rb_ocn(I),-10.0) - rb_ocn(I)=MIN(rb_ocn(I), 10.0) + rb_ocn(I)=MAX(rb_ocn(I),-4.0) + rb_ocn(I)=MIN(rb_ocn(I), 4.0) ENDIF ENDIF ! end water point IF (dry(i)) THEN DTHVDZ=(THV1D(I)-THVSK_lnd(I)) !-------------------------------------------------------- - ! Calculate the convective velocity scale (WSTAR) and - ! subgrid-scale velocity (VSGD) following Beljaars (1995, QJRMS) - ! and Mahrt and Sun (1995, MWR), respectively + ! Calculate the convective velocity scale (WSTAR) and + ! subgrid-scale velocity (VSGD) following Beljaars (1995, QJRMS) + ! and Mahrt and Sun (1995, MWR), respectively !------------------------------------------------------- fluxc = max(hfx(i)/RHO1D(i)/cp & & + ep1*THVSK_lnd(I)*qfx(i)/RHO1D(i),0.) - !WSTAR(I) = vconvc*(g/TSK(i)*pblh(i)*fluxc)**onethird - !increase height scale, assuming that the non-local transoport - !from the mass-flux (plume) mixing exceedsd the PBLH. + ! WSTAR(I) = vconvc*(g/TSK(i)*pblh(i)*fluxc)**onethird + ! increase height scale, assuming that the non-local transoport + ! from the mass-flux (plume) mixing exceedsd the PBLH. WSTAR(I) = vconvc*(g/TSK_lnd(i)*MIN(1.5*pblh(i),4000.)*fluxc)**onethird !-------------------------------------------------------- ! Mahrt and Sun low-res correction @@ -924,23 +908,23 @@ SUBROUTINE SFCLAY1D_mynn( & rb_lnd(I)=MAX(rb_lnd(I),-2.0) rb_lnd(I)=MIN(rb_lnd(I), 2.0) ELSE - rb_lnd(I)=MAX(rb_lnd(I),-10.0) - rb_lnd(I)=MIN(rb_lnd(I), 10.0) + rb_lnd(I)=MAX(rb_lnd(I),-4.0) + rb_lnd(I)=MIN(rb_lnd(I), 4.0) ENDIF ENDIF ! end land point IF (icy(i)) THEN DTHVDZ=(THV1D(I)-THVSK_ice(I)) !-------------------------------------------------------- - ! Calculate the convective velocity scale (WSTAR) and - ! subgrid-scale velocity (VSGD) following Beljaars (1995, QJRMS) - ! and Mahrt and Sun (1995, MWR), respectively + ! Calculate the convective velocity scale (WSTAR) and + ! subgrid-scale velocity (VSGD) following Beljaars (1995, QJRMS) + ! and Mahrt and Sun (1995, MWR), respectively !------------------------------------------------------- fluxc = max(hfx(i)/RHO1D(i)/cp & & + ep1*THVSK_ice(I)*qfx(i)/RHO1D(i),0.) - !WSTAR(I) = vconvc*(g/TSK(i)*pblh(i)*fluxc)**onethird - !increase height scale, assuming that the non-local transport - !from the mass-flux (plume) mixing exceedsd the PBLH. + ! WSTAR(I) = vconvc*(g/TSK(i)*pblh(i)*fluxc)**onethird + ! increase height scale, assuming that the non-local transport + ! from the mass-flux (plume) mixing exceedsd the PBLH. WSTAR(I) = vconvc*(g/TSK_ice(i)*MIN(1.5*pblh(i),4000.)*fluxc)**onethird !-------------------------------------------------------- ! Mahrt and Sun low-res correction @@ -958,16 +942,16 @@ SUBROUTINE SFCLAY1D_mynn( & rb_ice(I)=MAX(rb_ice(I),-2.0) rb_ice(I)=MIN(rb_ice(I), 2.0) ELSE - rb_ice(I)=MAX(rb_ice(I),-10.0) - rb_ice(I)=MIN(rb_ice(I), 10.0) + rb_ice(I)=MAX(rb_ice(I),-4.0) + rb_ice(I)=MIN(rb_ice(I), 4.0) ENDIF - ENDIF ! end ice point + ENDIF ! end ice point !NOW CONDENSE THE POSSIBLE WSPD VALUES BY TAKING THE MAXIMUM WSPD(I) = MAX(WSPD_ice,WSPD_ocn) WSPD(I) = MAX(WSPD_lnd,WSPD(I)) - IF (debug_code >= 1) THEN + IF (debug_code == 2) THEN write(*,*)"===== After rb calc in mynn sfc layer:" write(*,*)"ITIMESTEP=",ITIMESTEP write(*,*)"WSPD=", WSPD(I)," WSTAR=", WSTAR(I)," vsgd=",vsgd @@ -1006,7 +990,7 @@ SUBROUTINE SFCLAY1D_mynn( & if (sfc_z0_type >= 0) then ! Avoid calculation is using wave model ! CALCULATE z0 (znt) !-------------------------------------- - IF (debug_code >= 1) THEN + IF (debug_code == 2) THEN write(*,*)"=============Input to ZNT over water:" write(*,*)"u*:",UST_ocn(i)," wspd=",WSPD(i)," visc=",visc," za=",ZA(I) ENDIF @@ -1046,7 +1030,7 @@ SUBROUTINE SFCLAY1D_mynn( & ZNTstoch_ocn(I) = ZNT_ocn(I) endif - IF (debug_code >= 1) THEN + IF (debug_code > 1) THEN write(*,*)"==========Output ZNT over water:" write(*,*)"ZNT:",ZNTstoch_ocn(i) ENDIF @@ -1060,7 +1044,7 @@ SUBROUTINE SFCLAY1D_mynn( & !-------------------------------------- !CALCULATE z_t and z_q !-------------------------------------- - IF (debug_code >= 1) THEN + IF (debug_code > 1) THEN write(*,*)"=============Input to ZT over water:" write(*,*)"u*:",UST_ocn(i)," restar=",restar," visc=",visc ENDIF @@ -1108,7 +1092,7 @@ SUBROUTINE SFCLAY1D_mynn( & rstoch1D(i),spp_pbl) ENDIF ENDIF - IF (debug_code >= 1) THEN + IF (debug_code > 1) THEN write(*,*)"=============Output ZT & ZQ over water:" write(*,*)"ZT:",ZT_ocn(i)," ZQ:",ZQ_ocn(i) ENDIF @@ -1180,7 +1164,7 @@ SUBROUTINE SFCLAY1D_mynn( & ENDIF !end land point - IF (icy(I) .OR. snowh_lnd(i) > 50.) THEN + IF (icy(I)) THEN ! add stochastic perturbaction of ZNT if (spp_pbl==1) then @@ -1248,7 +1232,7 @@ SUBROUTINE SFCLAY1D_mynn( & !Use brute-force method zol(I)=zolrib(rb_ocn(I),ZA(I),ZNTstoch_ocn(I),zt_ocn(I),GZ1OZ0_ocn(I),GZ1OZt_ocn(I),ZOL(I),psi_opt) ZOL(I)=MAX(ZOL(I),0.0) - ZOL(I)=MIN(ZOL(I),50.) + ZOL(I)=MIN(ZOL(I),20.) zolzt = zol(I)*zt_ocn(I)/ZA(I) ! zt/L zolz0 = zol(I)*ZNTstoch_ocn(I)/ZA(I) ! z0/L @@ -1363,7 +1347,7 @@ SUBROUTINE SFCLAY1D_mynn( & CALL Li_etal_2010(ZOL(I),rb_lnd(I),ZA(I)/ZNTstoch_lnd(I),zratio_lnd(I)) !ZOL(I)=ZA(I)*KARMAN*G*MOL(I)/(TH1D(I)*MAX(UST_lnd(I)*UST_lnd(I),0.0001)) ZOL(I)=MAX(ZOL(I),0.0) - ZOL(I)=MIN(ZOL(I),50.) + ZOL(I)=MIN(ZOL(I),20.) IF (debug_code >= 1) THEN IF (ZNTstoch_lnd(i) < 1E-8 .OR. Zt_lnd(i) < 1E-10) THEN @@ -1381,7 +1365,7 @@ SUBROUTINE SFCLAY1D_mynn( & !Use brute-force method zol(I)=zolrib(rb_lnd(I),ZA(I),ZNTstoch_lnd(I),zt_lnd(I),GZ1OZ0_lnd(I),GZ1OZt_lnd(I),ZOL(I),psi_opt) ZOL(I)=MAX(ZOL(I),0.0) - ZOL(I)=MIN(ZOL(I),50.) + ZOL(I)=MIN(ZOL(I),20.) zolzt = zol(I)*zt_lnd(I)/ZA(I) ! zt/L zolz0 = zol(I)*ZNTstoch_lnd(I)/ZA(I) ! z0/L @@ -1494,7 +1478,7 @@ SUBROUTINE SFCLAY1D_mynn( & CALL Li_etal_2010(ZOL(I),rb_ice(I),ZA(I)/ZNTstoch_ice(I),zratio_ice(I)) !ZOL(I)=ZA(I)*KARMAN*G*MOL(I)/(TH1D(I)*MAX(UST_ice(I)*UST_ice(I),0.0001)) ZOL(I)=MAX(ZOL(I),0.0) - ZOL(I)=MIN(ZOL(I),50.) + ZOL(I)=MIN(ZOL(I),20.) IF (debug_code >= 1) THEN IF (ZNTstoch_ice(i) < 1E-8 .OR. Zt_ice(i) < 1E-10) THEN @@ -1512,7 +1496,7 @@ SUBROUTINE SFCLAY1D_mynn( & !Use brute-force method zol(I)=zolrib(rb_ice(I),ZA(I),ZNTstoch_ice(I),zt_ice(I),GZ1OZ0_ice(I),GZ1OZt_ice(I),ZOL(I),psi_opt) ZOL(I)=MAX(ZOL(I),0.0) - ZOL(I)=MIN(ZOL(I),50.) + ZOL(I)=MIN(ZOL(I),20.) zolzt = zol(I)*zt_ice(I)/ZA(I) ! zt/L zolz0 = zol(I)*ZNTstoch_ice(I)/ZA(I) ! z0/L @@ -1634,6 +1618,8 @@ SUBROUTINE SFCLAY1D_mynn( & WSPDI(I)=MAX(SQRT(U1D(I)*U1D(I)+V1D(I)*V1D(I)), wmin) USTM(I)=0.5*USTM(I)+0.5*KARMAN*WSPDI(I)/PSIX_ocn(I) + ! for possible future changes in sea-ice fraction from 0 to >0: + if (.not. icy(i)) ust_ice(i)=ust_ocn(i) ENDIF ! end water points IF (dry(I)) THEN @@ -1666,6 +1652,9 @@ SUBROUTINE SFCLAY1D_mynn( & !Set ustm = ust over ice. USTM(I)=UST_ice(I) + + ! for possible future changes in sea-ice fraction from 1 to <1: + if (.not. wet(i)) ust_ocn(i)=ust_ice(i) ENDIF ! end ice points !---------------------------------------------------- @@ -1888,7 +1877,7 @@ SUBROUTINE SFCLAY1D_mynn( & ENDIF - IF (debug_code >= 1) THEN + IF (debug_code > 1) THEN write(*,*)"QFX=",QFX(I),"FLQC=",FLQC(I) if(icy(i))write(*,*)"ice, MAVAIL:",MAVAIL(I)," u*=",UST_ice(I)," psiq=",PSIQ_ice(i) if(dry(i))write(*,*)"lnd, MAVAIL:",MAVAIL(I)," u*=",UST_lnd(I)," psiq=",PSIQ_lnd(i) @@ -3235,7 +3224,7 @@ REAL function zolri(ri,za,z0,zt,zol1,psi_opt) ! This iterative algorithm was taken from the revised surface layer ! scheme in WRF-ARW, written by Pedro Jimenez and Jimy Dudhia and ! summarized in Jimenez et al. (2012, MWR). This function was adapted - ! to input the thermal roughness length, zt, (as well as z0) and use initial + ! to input the thermal roughness length, zt, (as well as z0) and use initial ! estimate of z/L. IMPLICIT NONE @@ -3403,10 +3392,12 @@ REAL function zolrib(ri,za,z0,zt,logz0,logzt,zol1,psi_opt) end function !==================================================================== - SUBROUTINE psi_init(psi_opt) + SUBROUTINE psi_init(psi_opt,errmsg,errflg) - INTEGER :: N,psi_opt - REAL :: zolf + integer :: N,psi_opt + real :: zolf + character(len=*), intent(out) :: errmsg + integer, intent(out) :: errflg if (psi_opt == 0) then DO N=0,1000 @@ -3434,6 +3425,16 @@ SUBROUTINE psi_init(psi_opt) ENDDO endif + !Simple test to see if initialization worked: + if (psim_stab(1) < 0. .AND. psih_stab(1) < 0. .AND. & + psim_unstab(1) > 0. .AND. psih_unstab(1) > 0.) then + errmsg = 'In MYNN SFC, Psi tables have been initialized' + errflg = 0 + else + errmsg = 'Error in MYNN SFC: Problem initializing psi tables' + errflg = 1 + endif + END SUBROUTINE psi_init ! ================================================================== ! ... integrated similarity functions from MYNN... @@ -3558,7 +3559,7 @@ REAL function psim_stable(zolf,psi_opt) nzol = int(zolf*100.) rzol = zolf*100. - nzol - if(nzol+1 .le. 1000)then + if(nzol+1 .lt. 1000)then psim_stable = psim_stab(nzol) + rzol*(psim_stab(nzol+1)-psim_stab(nzol)) else if (psi_opt == 0) then @@ -3577,7 +3578,7 @@ REAL function psih_stable(zolf,psi_opt) nzol = int(zolf*100.) rzol = zolf*100. - nzol - if(nzol+1 .le. 1000)then + if(nzol+1 .lt. 1000)then psih_stable = psih_stab(nzol) + rzol*(psih_stab(nzol+1)-psih_stab(nzol)) else if (psi_opt == 0) then @@ -3596,7 +3597,7 @@ REAL function psim_unstable(zolf,psi_opt) nzol = int(-zolf*100.) rzol = -zolf*100. - nzol - if(nzol+1 .le. 1000)then + if(nzol+1 .lt. 1000)then psim_unstable = psim_unstab(nzol) + rzol*(psim_unstab(nzol+1)-psim_unstab(nzol)) else if (psi_opt == 0) then @@ -3615,7 +3616,7 @@ REAL function psih_unstable(zolf,psi_opt) nzol = int(-zolf*100.) rzol = -zolf*100. - nzol - if(nzol+1 .le. 1000)then + if(nzol+1 .lt. 1000)then psih_unstable = psih_unstab(nzol) + rzol*(psih_unstab(nzol+1)-psih_unstab(nzol)) else if (psi_opt == 0) then diff --git a/physics/module_sf_ruclsm.F90 b/physics/module_sf_ruclsm.F90 index 024f97772..a0e74ce7a 100644 --- a/physics/module_sf_ruclsm.F90 +++ b/physics/module_sf_ruclsm.F90 @@ -506,7 +506,14 @@ SUBROUTINE LSMRUC( & soilice(k)=0. soiliqw(k)=0. enddo - endif ! init=.true., iter=1 + else ! .not. init==true. + DO J=jts,jte + DO i=its,ite + SFCRUNOFF(i,j) = 0. + UDRUNOFF(i,j) = 0. + ENDDO + ENDDO + endif ! init==.true. !----------------------------------------------------------------- @@ -6197,7 +6204,13 @@ SUBROUTINE SOILPROP( debug_print, & !--- Next 3 lines are for Johansen thermal conduct. gamd=(1.-ws)*2700. kdry=(0.135*gamd+64.7)/(2700.-0.947*gamd) - kas=kqwrtz**qwrtz*kzero**(1.-qwrtz) + !kas=kqwrtz**qwrtz*kzero**(1.-qwrtz) + !-- one more option from Christa's paper + if(qwrtz > 0.2) then + kas=kqwrtz**qwrtz*kzero**(1.-qwrtz) + else + kas=kqwrtz**qwrtz*3.**(1.-qwrtz) + endif DO K=1,NZS1 tn=tav(k) - 273.15 @@ -6256,13 +6269,13 @@ SUBROUTINE SOILPROP( debug_print, & if((ws-a).lt.0.12)then diffu(K)=0. else - H=max(0.,(soilmoism(K)-a)/(max(1.e-8,(dqm-a)))) + H=max(0.,(soilmoism(K)+qmin-a)/(max(1.e-8,(dqm-a)))) facd=1. if(a.ne.0.)facd=1.-a/max(1.e-8,soilmoism(K)) ame=max(1.e-8,dqm-riw*soilicem(K)) !--- DIFFU is diffusional conductivity of soil water diffu(K)=-BCLH*KSAT*PSIS/ame* & - (dqm/ame)**3. & + (ws/ame)**3. & *H**(BCLH+2.)*facd endif @@ -6288,7 +6301,7 @@ SUBROUTINE SOILPROP( debug_print, & fach=1. if(soilice(k).ne.0.) & fach=1.-riw*soilice(k)/max(1.e-8,soilmois(k)) - am=max(1.e-8,dqm-riw*soilice(k)) + am=max(1.e-8,ws-riw*soilice(k)) !--- HYDRO is hydraulic conductivity of soil water hydro(K)=min(KSAT,KSAT/am* & (soiliqw(K)/am) & @@ -6512,7 +6525,7 @@ SUBROUTINE VILKA(TN,D1,D2,PP,QS,TS,TT,NSTEP,ii,j,iland,isoil) REAL :: F1,T1,T2,RN INTEGER :: I,I1 - + I=(TN-1.7315E2)/.05+1 T1=173.1+FLOAT(I)*.05 F1=T1+D1*TT(I)-D2 @@ -6523,7 +6536,7 @@ SUBROUTINE VILKA(TN,D1,D2,PP,QS,TS,TT,NSTEP,ii,j,iland,isoil) T1=173.1+FLOAT(I)*.05 F1=T1+D1*TT(I)-D2 RN=F1/(.05+D1*(TT(I+1)-TT(I))) - I=I-INT(RN) + I=I-INT(RN) IF(I.GT.5000.OR.I.LT.1) GOTO 1 IF(I1.NE.I) GOTO 10 TS=T1-.05*RN diff --git a/physics/namelist_soilveg_ruc.F90 b/physics/namelist_soilveg_ruc.F90 index c40b859bf..1e05122c4 100644 --- a/physics/namelist_soilveg_ruc.F90 +++ b/physics/namelist_soilveg_ruc.F90 @@ -1,3 +1,5 @@ +!>\file namelist_soilveg_ruc.F90 +!>\ingroup RUC_lsm module namelist_soilveg_ruc implicit none save diff --git a/physics/set_soilveg_ruc.F90 b/physics/set_soilveg_ruc.F90 index e48f4ed88..cac4fd1e7 100644 --- a/physics/set_soilveg_ruc.F90 +++ b/physics/set_soilveg_ruc.F90 @@ -26,13 +26,14 @@ subroutine set_soilveg_ruc(me,isot,ivet,nlunit) real refsmc1, wltsmc1 NAMELIST /SOIL_VEG_RUC/ SLOPE_DATA, ALBTBL, Z0TBL, LEMITBL, & - & PCTBL, SHDTBL, & + & PCTBL, SHDTBL, & & IFORTBL, RSTBL, RGLTBL, HSTBL, SNUPTBL, LAITBL, MAXALB, & & LPARAM, TOPT_DATA, CMCMAX_DATA, CFACTR_DATA, & & RSMAX_DATA, BARE, NATURAL, CROP, URBAN, & & DEFINED_VEG, DEFINED_SOIL, DEFINED_SLOPE, & & BB, DRYSMC, HC, MAXSMC, REFSMC, SATPSI, SATDK, SATDW, & - & WLTSMC, QTZ, mosaic_soil, mosaic_lu, REFSMCnoah, WLTSMCnoah + & WLTSMC, QTZ, mosaic_soil, mosaic_lu, & + & REFSMCnoah, WLTSMCnoah, MAXSMCnoah if(ivet.eq.2) then ! Using umd veg classification diff --git a/physics/sfc_drv.f b/physics/sfc_drv.f index 45c501db2..4343d5dff 100644 --- a/physics/sfc_drv.f +++ b/physics/sfc_drv.f @@ -4,7 +4,9 @@ !> This module contains the CCPP-compliant Noah land surface scheme driver. module lsm_noah + use machine, only: kind_phys use set_soilveg_mod, only: set_soilveg + use namelist_soilveg implicit none @@ -20,11 +22,14 @@ module lsm_noah !! \htmlinclude lsm_noah_init.html !! subroutine lsm_noah_init(me, isot, ivegsrc, nlunit, - & errmsg, errflg) + & pores, resid, errmsg, errflg) implicit none integer, intent(in) :: me, isot, ivegsrc, nlunit + + real (kind=kind_phys), dimension(:), intent(out) :: pores, resid + character(len=*), intent(out) :: errmsg integer, intent(out) :: errflg @@ -48,6 +53,9 @@ subroutine lsm_noah_init(me, isot, ivegsrc, nlunit, !--- initialize soil vegetation call set_soilveg(me, isot, ivegsrc, nlunit) + pores (:) = maxsmc (:) + resid (:) = drysmc (:) + end subroutine lsm_noah_init @@ -199,7 +207,7 @@ subroutine lsm_noah_run & & smcwlt2, smcref2, wet1, errmsg, errflg & & ) ! - use machine , only : kind_phys + !use machine , only : kind_phys use funcphys, only : fpvs use surface_perturbation, only : ppfbet diff --git a/physics/sfc_drv.meta b/physics/sfc_drv.meta index eb3f77a98..ff1766774 100644 --- a/physics/sfc_drv.meta +++ b/physics/sfc_drv.meta @@ -39,6 +39,22 @@ type = integer intent = in optional = F +[pores] + standard_name = maximum_soil_moisture_content_for_land_surface_model + long_name = maximum soil moisture for a given soil type for land surface model + units = m + dimensions = (30) + type = real + intent = out + kind = kind_phys +[resid] + standard_name = minimum_soil_moisture_content_for_land_surface_model + long_name = minimum soil moisture for a given soil type for land surface model + units = m + dimensions = (30) + type = real + intent = out + kind = kind_phys [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP diff --git a/physics/sfc_drv_ruc.F90 b/physics/sfc_drv_ruc.F90 index f6be851b1..23d99d6ef 100644 --- a/physics/sfc_drv_ruc.F90 +++ b/physics/sfc_drv_ruc.F90 @@ -32,7 +32,7 @@ subroutine lsm_ruc_init (me, master, isot, ivegsrc, nlunit, & tsfc_lnd, tsfc_wat, & ! in tg3, smc, slc, stc, & ! in zs, sh2o, smfrkeep, tslb, smois, wetness, & ! out - tsice, errmsg, errflg) + tsice, pores, resid, errmsg, errflg) implicit none ! --- in @@ -65,6 +65,8 @@ subroutine lsm_ruc_init (me, master, isot, ivegsrc, nlunit, & real (kind=kind_phys), dimension(im,lsoil_ruc), intent(inout) :: tslb, smois real (kind=kind_phys), dimension(im,kice), intent(out) :: tsice + real (kind=kind_phys), dimension(:), intent(out) :: pores, resid + character(len=*), intent(out) :: errmsg integer, intent(out) :: errflg @@ -113,6 +115,9 @@ subroutine lsm_ruc_init (me, master, isot, ivegsrc, nlunit, & !--- initialize soil vegetation call set_soilveg_ruc(me, isot, ivegsrc, nlunit) + pores (:) = maxsmc (:) + resid (:) = drysmc (:) + soiltyp(:) = 0 vegtype(:) = 0 @@ -138,9 +143,8 @@ subroutine lsm_ruc_init (me, master, isot, ivegsrc, nlunit, & endif enddo - call init_soil_depth_3 ( zs , dzs , lsoil_ruc ) + call init_soil_depth_3 ( zs , dzs , lsoil_ruc ) - !if( .not. flag_restart) then call rucinit (flag_restart, im, lsoil_ruc, lsoil, nlev, & ! in me, master, lsm_ruc, lsm, slmsk, & ! in soiltyp, vegtype, & ! in @@ -157,7 +161,6 @@ subroutine lsm_ruc_init (me, master, isot, ivegsrc, nlunit, & enddo enddo ! i - !endif ! flag_restart !-- end of initialization if ( debug_print) then @@ -202,7 +205,6 @@ end subroutine lsm_ruc_finalize ! soiltyp - integer, soil type (integer index) im ! ! vegtype - integer, vegetation type (integer index) im ! ! sigmaf - real, areal fractional cover of green vegetation im ! -! sfcemis - real, sfc lw emissivity ( fraction ) im ! ! dlwflx - real, total sky sfc downward lw flux ( w/m**2 ) im ! ! dswflx - real, total sky sfc downward sw flux ( w/m**2 ) im ! ! snet - real, total sky sfc netsw flx into ground(w/m**2) im ! @@ -218,8 +220,6 @@ end subroutine lsm_ruc_finalize ! shdmin - real, min fractional coverage of green veg im ! ! shdmax - real, max fractnl cover of green veg (not used) im ! ! snoalb - real, upper bound on max albedo over deep snow im ! -! sfalb - real, mean sfc diffused sw albedo with effect ! -! of snow (fractional) im ! ! flag_iter- logical, im ! ! flag_guess-logical, im ! ! isot - integer, sfc soil type data source zobler or statsgo ! @@ -263,25 +263,43 @@ end subroutine lsm_ruc_finalize !! !>\section gen_lsmruc GSD RUC LSM General Algorithm subroutine lsm_ruc_run & ! inputs - & ( iter, me, master, kdt, im, nlev, lsoil_ruc, lsoil, zs, & + & ( iter, me, master, delt, kdt, im, nlev, lsm_ruc, lsm, & + & imp_physics, imp_physics_gfdl, imp_physics_thompson, & + & do_mynnsfclay, lsoil_ruc, lsoil, rdlai, zs, & & t1, q1, qc, soiltyp, vegtype, sigmaf, laixy, & - & sfcemis, dlwflx, dswsfc, snet, delt, tg3, cm, ch, & + & dlwflx, dswsfc, snet, tg3, & + & land, icy, lake, & + & rainnc, rainc, ice, snow, graupel, & & prsl1, zf, wind, shdmin, shdmax, alvwf, alnwf, & - & snoalb, sfalb, flag_iter, flag_guess, isot, ivegsrc, fice, & - & smc, stc, slc, lsm_ruc, lsm, land, islimsk, rdlai, & - & imp_physics, imp_physics_gfdl, imp_physics_thompson, & - & smcwlt2, smcref2, do_mynnsfclay, & - & con_cp, con_rv, con_rd, con_g, con_pi, con_hvap, con_fvirt,& ! constants - & weasd, snwdph, tskin, tskin_wat, & ! in/outs - & rainnc, rainc, ice, snow, graupel, & ! in - & srflag, smois, tslb, sh2o, keepfr, smfrkeep, & ! in/outs, on RUC levels - & canopy, trans, tsurf, tsnow, zorl, & - & sfcqc, sfcdew, tice, sfcqv, & - & sncovr1, qsurf, gflux, drain, evap, hflx, & ! outputs - & rhosnf, runof, runoff, srunoff, & - & chh, cmm, evbs, evcw, sbsno, stm, wetness, & - & acsnow, snowfallac, & - & flag_init, flag_restart, errmsg, errflg & + & srflag, snoalb, isot, ivegsrc, fice, smcwlt2, smcref2, & + ! --- constants + & con_cp, con_rd, con_rv, con_g, con_pi, con_hvap, & + & con_fvirt, & + ! for water + & ch_wat, tskin_wat, & + ! --- in/outs for ice and land + & semis_lnd, semis_ice, & + & sncovr1_lnd, weasd_lnd, snwdph_lnd, tskin_lnd, & + & sncovr1_ice, weasd_ice, snwdph_ice, tskin_ice, & + ! for land + & smois, tsice, tslb, sh2o, keepfr, smfrkeep, & ! on RUC levels + & canopy, trans, tsurf_lnd, tsnow_lnd, z0rl_lnd, & + & sfcqc_lnd, sfcqv_lnd, & + & qsurf_lnd, gflux_lnd, evap_lnd, hflx_lnd, & + & runof, runoff, srunoff, drain, & + & cm_lnd, ch_lnd, evbs, evcw, stm, wetness, & + & snowfallac_lnd, & + ! for ice + & sfcqc_ice, sfcqv_ice, & + & tice, tsurf_ice, tsnow_ice, z0rl_ice, & + & qsurf_ice, gflux_ice, evap_ice, ep1d_ice, hflx_ice, & + & cm_ice, ch_ice, snowfallac_ice, & + ! --- out + & rhosnf, sbsno, & + & cmm_lnd, chh_lnd, cmm_ice, chh_ice, & + ! + & flag_iter, flag_guess, flag_init, flag_restart, & + & flag_cice, frac_grid, errmsg, errflg & & ) implicit none @@ -289,6 +307,9 @@ subroutine lsm_ruc_run & ! inputs ! --- constant parameters: real(kind=kind_phys), parameter :: rhoh2o = 1000.0 real(kind=kind_phys), parameter :: stbolt = 5.670400e-8 + real(kind=kind_phys), parameter :: cimin = 0.15 !--- in GFS + !real(kind=kind_phys), parameter :: cimin = 0.02 !--- minimum ice concentration, 0.15 in GFS + real(kind=kind_phys), parameter :: con_tice = 271.2 ! --- input: integer, intent(in) :: me, master @@ -296,22 +317,26 @@ subroutine lsm_ruc_run & ! inputs integer, intent(in) :: lsm_ruc, lsm integer, intent(in) :: imp_physics, imp_physics_gfdl, imp_physics_thompson - real (kind=kind_phys), dimension(im,lsoil), intent(inout) :: smc,stc,slc - - real (kind=kind_phys), dimension(im), intent(in) :: & - & t1, sigmaf, sfcemis, dlwflx, dswsfc, snet, tg3, cm, & - & ch, prsl1, wind, shdmin, shdmax, & - & snoalb, alvwf, alnwf, zf, qc, q1 - - real (kind=kind_phys), dimension(:), intent(in) :: laixy + real (kind=kind_phys), dimension(im), intent(in) :: & + & t1, sigmaf, laixy, dlwflx, dswsfc, snet, tg3, & + & prsl1, wind, shdmin, shdmax, & + & snoalb, alvwf, alnwf, zf, qc, q1, & + ! for land + & cm_lnd, ch_lnd, & + ! for water + & ch_wat, tskin_wat, & + ! for ice + & cm_ice, ch_ice real (kind=kind_phys), intent(in) :: delt - real (kind=kind_phys), intent(in) :: con_cp, con_rv, con_g, & - con_pi, con_rd, & + real (kind=kind_phys), intent(in) :: con_cp, con_rv, con_g, & + con_pi, con_rd, & con_hvap, con_fvirt - logical, dimension(im), intent(in) :: flag_iter, flag_guess, land - integer, dimension(im), intent(in) :: islimsk ! sea/land/ice mask (=0/1/2) + logical, dimension(im), intent(in) :: flag_iter, flag_guess + logical, dimension(im), intent(in) :: land, icy, lake + logical, dimension(im), intent(in) :: flag_cice + logical, intent(in) :: frac_grid logical, intent(in) :: do_mynnsfclay logical, intent(in) :: rdlai @@ -319,61 +344,96 @@ subroutine lsm_ruc_run & ! inputs ! --- in/out: integer, dimension(im), intent(inout) :: soiltyp, vegtype real (kind=kind_phys), dimension(lsoil_ruc), intent(in) :: zs - real (kind=kind_phys), dimension(im), intent(inout) :: weasd, & - & snwdph, tskin, tskin_wat, & - & srflag, canopy, trans, tsurf, zorl, tsnow, & - & sfcqc, sfcqv, sfcdew, fice, tice, sfalb, smcwlt2, smcref2 + real (kind=kind_phys), dimension(im), intent(inout) :: srflag, & + & canopy, trans, smcwlt2, smcref2, & + ! for land + & weasd_lnd, snwdph_lnd, tskin_lnd, & + & tsurf_lnd, z0rl_lnd, tsnow_lnd, & + & sfcqc_lnd, sfcqv_lnd, & + ! for ice + & weasd_ice, snwdph_ice, tskin_ice, & + & tsurf_ice, z0rl_ice, tsnow_ice, & + & sfcqc_ice, sfcqv_ice, fice, tice + ! --- in - real (kind=kind_phys), dimension(im), intent(in) :: & + real (kind=kind_phys), dimension(im), intent(in) :: & & rainnc, rainc, ice, snow, graupel ! --- in/out: ! --- on RUC levels - real (kind=kind_phys), dimension(im,lsoil_ruc), intent(inout) :: & - & smois, tslb, sh2o, keepfr, smfrkeep + real (kind=kind_phys), dimension(im,lsoil_ruc), intent(inout) :: & + & smois, tsice, tslb, sh2o, keepfr, smfrkeep ! --- output: - real (kind=kind_phys), dimension(im), intent(inout) :: sncovr1, & - & qsurf , gflux , evap , runof , drain , & - & runoff, srunoff, hflx, cmm, chh, & - & rhosnf, evbs, evcw, sbsno, stm, wetness, & - & acsnow, snowfallac + real (kind=kind_phys), dimension(im), intent(inout) :: & + & rhosnf, runof, drain, runoff, srunoff, evbs, evcw, & + & stm, wetness, semis_lnd, semis_ice, & + ! for land + & sncovr1_lnd, qsurf_lnd, gflux_lnd, evap_lnd, & + & cmm_lnd, chh_lnd, hflx_lnd, sbsno, & + & snowfallac_lnd, & + ! for ice + & sncovr1_ice, qsurf_ice, gflux_ice, evap_ice, ep1d_ice, & + & cmm_ice, chh_ice, hflx_ice, snowfallac_ice logical, intent(in) :: flag_init, flag_restart character(len=*), intent(out) :: errmsg integer, intent(out) :: errflg ! --- locals: - real (kind=kind_phys), dimension(im) :: rch, rho, & - & q0, qs1, weasd_old, snwdph_old, & - & tprcp_old, srflag_old, tskin_old, canopy_old, & - & tsnow_old, snowfallac_old, acsnow_old, sfalb_old, & - & sfcqv_old, sfcqc_old, wetness_old, zorl_old, sncovr1_old + real (kind=kind_phys), dimension(im) :: rho, & + & q0, qs1, & + & tprcp_old, srflag_old, sr_old, canopy_old, wetness_old, & + ! for land + & weasd_lnd_old, snwdph_lnd_old, tskin_lnd_old, & + & tsnow_lnd_old, snowfallac_lnd_old, & + & sfcqv_lnd_old, sfcqc_lnd_old, z0rl_lnd_old, & + & sncovr1_lnd_old, & + ! for ice + & weasd_ice_old, snwdph_ice_old, tskin_ice_old, & + & tsnow_ice_old, snowfallac_ice_old, & + & sfcqv_ice_old, sfcqc_ice_old, z0rl_ice_old, & + & sncovr1_ice_old + real (kind=kind_phys), dimension(lsoil_ruc) :: et real (kind=kind_phys), dimension(im,lsoil_ruc,1) :: smsoil, & - slsoil, stsoil, smfrsoil, keepfrsoil + slsoil, stsoil, smfrsoil, keepfrsoil, stsice real (kind=kind_phys), dimension(im,lsoil_ruc) :: smois_old, & - & tslb_old, sh2o_old, keepfr_old, smfrkeep_old + & tsice_old, tslb_old, sh2o_old, & + & keepfr_old, smfrkeep_old real (kind=kind_phys),dimension (im,1,1) :: & & conflx2, sfcprs, sfctmp, q2, qcatm, rho2 real (kind=kind_phys),dimension (im,1) :: & - & albbck, alb, chs, flhc, flqc, wet, smmax, cmc, & - & dew, drip, ec, edir, ett, lh, esnow, etp, qfx, & - & acceta, ffrozp, lwdn, prcp, xland, xice, & + & albbck_lnd, alb_lnd, chs_lnd, flhc_lnd, flqc_lnd, & + & wet, wet_ice, smmax, cmc, drip, ec, edir, ett, & + & dew_lnd, lh_lnd, esnow_lnd, etp, qfx_lnd, acceta, & + & ffrozp, lwdn, prcp, xland, xland_wat, xice, xice_lnd, & & graupelncv, snowncv, rainncv, raincv, & - & solnet, sfcexc, & + & solnet_lnd, sfcexc, & & runoff1, runoff2, acrunoff, & - & sfcems, hfx, shdfac, shdmin1d, shdmax1d, & - & sneqv, snoalb1d, snowh, snoh, tsnav, & - & snomlt, sncovr, soilw, soilm, ssoil, soilt, tbot, & - & xlai, swdn, z0, znt, rhosnfr, infiltr, & - & precipfr, snfallac, acsn, & - & qsfc, qsg, qvg, qcg, soilt1, chklowq + & sfcems_lnd, hfx_lnd, shdfac, shdmin1d, shdmax1d, & + & sneqv_lnd, snoalb1d_lnd, snowh_lnd, snoh_lnd, tsnav_lnd, & + & snomlt_lnd, sncovr_lnd, soilw, soilm, ssoil_lnd, & + & soilt_lnd, tbot, & + & xlai, swdn, z0_lnd, znt_lnd, rhosnfr, infiltr, & + & precipfr, snfallac_lnd, acsn, & + & qsfc_lnd, qsg_lnd, qvg_lnd, qcg_lnd, soilt1_lnd, chklowq + ! ice + real (kind=kind_phys),dimension (im,1) :: & + & albbck_ice, alb_ice, chs_ice, flhc_ice, flqc_ice, & + & dew_ice, lh_ice, esnow_ice, qfx_ice, & + & solnet_ice, sfcems_ice, hfx_ice, & + & sneqv_ice, snoalb1d_ice, snowh_ice, snoh_ice, tsnav_ice, & + & snomlt_ice, sncovr_ice, ssoil_ice, soilt_ice, & + & z0_ice, znt_ice, snfallac_ice, & + & qsfc_ice, qsg_ice, qvg_ice, qcg_ice, soilt1_ice + real (kind=kind_phys) :: xice_threshold + real (kind=kind_phys) :: fwat, qsw, evapw, hfxw character(len=256) :: llanduse !< Land-use dataset. Valid values are : !! "USGS" (USGS 24/27 category dataset) and @@ -384,14 +444,16 @@ subroutine lsm_ruc_run & ! inputs real (kind=kind_phys), dimension(:,:,:), allocatable :: soilctop !< fractional soil type integer :: nsoil, iswater, isice - integer, dimension (1:im,1:1) :: stype, vtype + integer, dimension (1:im,1:1) :: stype_wat, vtype_wat + integer, dimension (1:im,1:1) :: stype_lnd, vtype_lnd + integer, dimension (1:im,1:1) :: stype_ice, vtype_ice integer :: ipr -! local + ! local integer :: ims,ime, its,ite, jms,jme, jts,jte, kms,kme, kts,kte integer :: l, k, i, j, fractional_seaice - logical :: flag(im) + logical :: flag(im), flag_ice_uncoupled(im) logical :: rdlai2d, myj, frpcpn logical :: debug_print ! @@ -405,6 +467,15 @@ subroutine lsm_ruc_run & ! inputs chklowq = 1. + do i = 1, im ! i - horizontal loop + ! - Set flag for ice points for uncoupled model (islmsk(i) == 4 when coupled to CICE) + ! - Exclude ice on the lakes if the lake model is turned on. + flag_ice_uncoupled(i) = (icy(i) .and. .not. flag_cice(i) .and. .not. lake(i)) + !> - Set flag for land and ice points. + !- 10may19 - ice points are turned off. + flag(i) = land(i) .or. flag_ice_uncoupled(i) + enddo + if (isot == 1) then nscat = 19 ! stasgo else @@ -421,15 +492,13 @@ subroutine lsm_ruc_run & ! inputs if(debug_print) then write (0,*)'RUC LSM run' - write (0,*)'noah soil temp',ipr,stc(ipr,:) - write (0,*)'noah soil mois',ipr,smc(ipr,:) write (0,*)'soiltyp=',ipr,soiltyp(ipr) write (0,*)'vegtype=',ipr,vegtype(ipr) write (0,*)'kdt, iter =',kdt,iter write (0,*)'flag_init =',flag_init write (0,*)'flag_restart =',flag_restart endif - + ims = 1 its = 1 ime = 1 @@ -452,13 +521,13 @@ subroutine lsm_ruc_run & ! inputs landusef (:,:,:) = 0.0 soilctop (:,:,:) = 0.0 - ! -- number of soil categories + !> -- number of soil categories !if(isot == 1) then !nscat = 19 ! stasgo !else !nscat = 9 ! zobler !endif - !> - Set parameters for IGBP land-use data. + !> -- set parameters for IGBP land-use data if(ivegsrc == 1) then llanduse = 'MODI-RUC' ! IGBP iswater = 17 @@ -473,7 +542,8 @@ subroutine lsm_ruc_run & ! inputs if ( fractional_seaice == 0 ) then xice_threshold = 0.5 else if ( fractional_seaice == 1 ) then - xice_threshold = 0.02 + xice_threshold = 0.02 ! HRRR value + !xice_threshold = 0.15 ! consistent with GFS physics endif nsoil = lsoil_ruc @@ -491,63 +561,60 @@ subroutine lsm_ruc_run & ! inputs endif enddo - do i = 1, im ! i - horizontal loop - !> - Set flag for land and ice points. - !- 10may19 - ice points are turned off. - flag(i) = land(i) - if (land(i) .and. (vegtype(i)==iswater .or. (vegtype(i)==isice.and.islimsk(i)==2))) then - !write(errmsg,'(a,i0,a,i0)') 'Logic error in sfc_drv_ruc_run: for i=', i, & - ! ', land(i) is true but vegtype(i) is water or ice: ', vegtype(i) - !errflg = 1 - !return - if(flag_init .and. iter==1) then - write(0,'(a,i0,a,i0)') 'Warning: in sfc_drv_ruc_run: for i=', i, & - ', land(i) is true but vegtype(i) is water or ice: ', vegtype(i) - end if - end if - enddo - do i = 1, im ! i - horizontal loop if (flag(i) .and. flag_guess(i)) then !> - Save land-related prognostic fields for guess run. !if(me==0 .and. i==ipr) write (0,*)'before call to RUC guess run', i - weasd_old(i) = weasd(i) - snwdph_old(i) = snwdph(i) - tskin_old(i) = tskin(i) - canopy_old(i) = canopy(i) - !tprcp_old(i) = tprcp(i) - srflag_old(i) = srflag(i) - tsnow_old(i) = tsnow(i) - snowfallac_old(i) = snowfallac(i) - acsnow_old(i) = acsnow(i) - sfalb_old(i) = sfalb(i) - sfcqv_old(i) = sfcqv(i) - sfcqc_old(i) = sfcqc(i) - wetness_old(i) = wetness(i) - zorl_old(i) = zorl(i) - sncovr1_old(i) = sncovr1(i) + wetness_old(i) = wetness(i) + canopy_old(i) = canopy(i) + !srflag_old(i) = srflag(i) + !acsnow_old(i) = acsnow(i) + ! for land + weasd_lnd_old(i) = weasd_lnd(i) + snwdph_lnd_old(i) = snwdph_lnd(i) + tskin_lnd_old(i) = tskin_lnd(i) + tsnow_lnd_old(i) = tsnow_lnd(i) + snowfallac_lnd_old(i) = snowfallac_lnd(i) + sfcqv_lnd_old(i) = sfcqv_lnd(i) + sfcqc_lnd_old(i) = sfcqc_lnd(i) + z0rl_lnd_old(i) = z0rl_lnd(i) + sncovr1_lnd_old(i) = sncovr1_lnd(i) + ! for ice + weasd_ice_old(i) = weasd_ice(i) + snwdph_ice_old(i) = snwdph_ice(i) + tskin_ice_old(i) = tskin_ice(i) + tsnow_ice_old(i) = tsnow_ice(i) + snowfallac_ice_old(i) = snowfallac_ice(i) + sfcqv_ice_old(i) = sfcqv_ice(i) + sfcqc_ice_old(i) = sfcqc_ice(i) + z0rl_ice_old(i) = z0rl_ice(i) + sncovr1_ice_old(i) = sncovr1_ice(i) + do k = 1, lsoil_ruc smois_old(i,k) = smois(i,k) tslb_old(i,k) = tslb(i,k) sh2o_old(i,k) = sh2o(i,k) keepfr_old(i,k) = keepfr(i,k) smfrkeep_old(i,k) = smfrkeep(i,k) + ! for ice + tsice_old(i,k) = tsice(i,k) enddo endif - enddo + enddo ! im ! --- ... initialization block do j = 1, 1 do i = 1, im ! i - horizontal loop if (flag_iter(i) .and. flag(i)) then - !if(me==0 .and. i==ipr) write (0,*)'iter run', iter, i, flag_iter(i),flag_guess(i) - evap (i) = 0.0 - hflx (i) = 0.0 - gflux(i) = 0.0 + evap_lnd(i) = 0.0 + evap_ice(i) = 0.0 + hflx_lnd (i) = 0.0 + hflx_ice (i) = 0.0 + gflux_lnd(i) = 0.0 + gflux_ice(i) = 0.0 drain(i) = 0.0 canopy(i) = max(canopy(i), 0.0) - sfcdew(i) = 0.0 evbs (i) = 0.0 evcw (i) = 0.0 @@ -555,24 +622,31 @@ subroutine lsm_ruc_run & ! inputs sbsno(i) = 0.0 !local i,j arrays - dew(i,j) = 0.0 - soilm(i,j) = 0.0 - smmax(i,j) = 0.0 - hfx(i,j) = 0.0 - qfx(i,j) = 0.0 - lh(i,j) = 0.0 - acsn(i,j) = 0.0 - sfcexc(i,j) = 0.0 - acceta(i,j) = 0.0 - ssoil(i,j) = 0.0 - snomlt(i,j) = 0.0 - infiltr(i,j) = 0.0 - runoff1(i,j) = 0.0 - runoff2(i,j) = 0.0 - acrunoff(i,j) = 0.0 - snfallac(i,j) = 0.0 - rhosnfr(i,j) = 0.0 - precipfr(i,j) = 0.0 + dew_lnd(i,j) = 0.0 + dew_ice(i,j) = 0.0 + soilm(i,j) = 0.0 + smmax(i,j) = 0.0 + hfx_lnd(i,j) = 0.0 + hfx_ice(i,j) = 0.0 + qfx_lnd(i,j) = 0.0 + qfx_ice(i,j) = 0.0 + lh_lnd(i,j) = 0.0 + lh_ice(i,j) = 0.0 + acsn(i,j) = 0.0 + sfcexc(i,j) = 0.0 + acceta(i,j) = 0.0 + ssoil_lnd(i,j) = 0.0 + ssoil_ice(i,j) = 0.0 + snomlt_lnd(i,j) = 0.0 + snomlt_ice(i,j) = 0.0 + infiltr(i,j) = 0.0 + runoff1(i,j) = 0.0 + runoff2(i,j) = 0.0 + acrunoff(i,j) = 0.0 + snfallac_lnd(i,j) = 0.0 + snfallac_ice(i,j) = 0.0 + rhosnfr(i,j) = 0.0 + precipfr(i,j) = 0.0 endif enddo ! i=1,im @@ -583,10 +657,11 @@ subroutine lsm_ruc_run & ! inputs do i = 1, im if (flag_iter(i) .and. flag(i)) then q0(i) = max(q1(i)/(1.-q1(i)), 1.e-8) !* q1=specific humidity at level 1 (kg/kg) + rho(i) = prsl1(i) / (con_rd*t1(i)*(1.0+con_fvirt*q0(i))) qs1(i) = rslf(prsl1(i),t1(i)) !* qs1=sat. mixing ratio at level 1 (kg/kg) q0 (i) = min(qs1(i), q0(i)) - endif + endif ! flag_iter & flag enddo ! i !> - Prepare variables to run RUC LSM: @@ -610,6 +685,7 @@ subroutine lsm_ruc_run & ! inputs do j = 1, 1 ! 1:1 do i = 1, im ! i - horizontal loop + xice(i,j) = 0. if (flag_iter(i) .and. flag(i)) then if (frpcpn) then @@ -618,7 +694,7 @@ subroutine lsm_ruc_run & ! inputs ffrozp(i,j) = real(nint(srflag(i)),kind_phys) endif - !tgs - rdlai is .false. when the LAI data is not available in the + !-- rdlai is .false. when the LAI data is not available in the ! - INPUT/sfc_data.nc rdlai2d = rdlai @@ -642,84 +718,88 @@ subroutine lsm_ruc_run & ! inputs !!\n \a lwdn - lw dw radiation flux at surface (\f$W m^{-2}\f$) !!\n \a swdn - sw dw radiation flux at surface (\f$W m^{-2}\f$) -!!\n \a solnet - net sw radiation flux (dn-up) (\f$W m^{-2}\f$) !!\n \a prcp - time-step total precip (\f$kg m^{-2} \f$) !!\n \a raincv - time-step convective precip (\f$kg m^{-2} \f$) !!\n \a rainncv - time-step non-convective precip (\f$kg m^{-2} \f$) !!\n \a graupelncv - time-step graupel (\f$kg m^{-2} \f$) !!\n \a snowncv - time-step snow (\f$kg m^{-2} \f$) !!\n \a precipfr - time-step precipitation in solod form (\f$kg m^{-2} \f$) -!!\n \a qsfc - specific humidity at surface (\f$kg kg^{-1}\f$) -!!\n \a qvg - water vapor mixing ratio at surface (\f$kg kg^{-1}\f$) -!!\n \a qsg - saturated water vapor mixing ratio at surface (\f$kg kg^{-1}\f$) -!!\n \a qcg - cloud water mixing ratio at surface (\f$kg kg^{-1}\f$) +!!\n \a shdfac - areal fractional coverage of green vegetation (0.0-1.0) +!!\n \a shdmin - minimum areal fractional coverage of green vegetation -> !shdmin1d +!!\n \a shdmax - maximum areal fractional coverage of green vegetation -> !shdmax1d +!!\n \a tbot - bottom soil temperature (local yearly-mean sfc air temp) lwdn(i,j) = dlwflx(i) !..downward lw flux at sfc in w/m2 swdn(i,j) = dswsfc(i) !..downward sw flux at sfc in w/m2 - solnet(i,j) = dswsfc(i)*(1.-sfalb(i)) !snet(i) !..net sw rad flx (dn-up) at sfc in w/m2 ! all precip input to RUC LSM is in [mm] !prcp(i,j) = rhoh2o * tprcp(i) ! tprcp in [m] - convective plus explicit !raincv(i,j) = rhoh2o * rainc(i) ! total time-step convective precip !rainncv(i,j) = rhoh2o * max(rain(i)-rainc(i),0.0) ! total time-step explicit precip - prcp(i,j) = rhoh2o * (rainc(i)+rainnc(i)) ! [mm] - convective plus explicit - raincv(i,j) = rhoh2o * rainc(i) ! [mm] - total time-step convective precip - rainncv(i,j) = rhoh2o * rainnc(i) ! [mm] - total time-step explicit precip + !graupelncv(i,j) = rhoh2o * graupel(i) + !snowncv(i,j) = rhoh2o * snow(i) + prcp(i,j) = rhoh2o * (rainc(i)+rainnc(i)) ! tprcp in [m] - convective plus explicit + raincv(i,j) = rhoh2o * rainc(i) ! total time-step convective precip + rainncv(i,j) = rhoh2o * rainnc(i) ! total time-step explicit precip graupelncv(i,j) = rhoh2o * graupel(i) snowncv(i,j) = rhoh2o * snow(i) - !if(prcp(i,j) > 0. .and. i==21) then - !print *,'prcp(i,j),rainncv(i,j),graupelncv(i,j),snowncv(i,j),ffrozp(i,j)',i,j, & - ! prcp(i,j),rainncv(i,j),graupelncv(i,j),snowncv(i,j),ffrozp(i,j) - !endif + ! ice precipitation is not used + ! precipfr(i,j) = rainncv(i,j) * ffrozp(i,j) + ! ice not used ! precipfr(i,j) = rainncv(i,j) * ffrozp(i,j) + !acsn(i,j) = acsnow(i) + acsn(i,j) = 0.0 - qvg(i,j) = sfcqv(i) - qsfc(i,j) = sfcqv(i)/(1.+sfcqv(i)) - qsg(i,j) = rslf(prsl1(i),tsurf(i)) - qcg(i,j) = sfcqc(i) + ! --- units % + shdfac(i,j) = sigmaf(i)*100. + shdmin1d(i,j) = shdmin(i)*100. + shdmax1d(i,j) = shdmax(i)*100. + + tbot(i,j) = tg3(i) !> - 3. canopy/soil characteristics (s): !!\n \a vegtyp - vegetation type (integer index) -> vtype !!\n \a soiltyp - soil type (integer index) -> stype -!!\n \a shdfac - areal fractional coverage of green vegetation (0.0-1.0) -!!\n \a shdmin - minimum areal fractional coverage of green vegetation -> shdmin1d -!!\n \a shdmax - maximum areal fractional coverage of green vegetation -> shdmax1d !!\n \a sfcems - surface emmisivity -> sfcemis !!\n \a 0.5*(alvwf + alnwf) - backround snow-free surface albedo (fraction) -> albbck !!\n \a snoalb - upper bound on maximum albedo over deep snow -> snoalb1d -!!\n \a sfalb - surface albedo including snow effect (unitless fraction) -> alb -!!\n \a tbot - bottom soil temperature (local yearly-mean sfc air temp) if(ivegsrc == 1) then ! IGBP - MODIS + vtype_wat(i,j) = 17 ! 17 - water (oceans and lakes) in MODIS + stype_wat(i,j) = 14 + xland_wat(i,j) = 2. ! xland = 2 for water + vtype_lnd(i,j) = vegtype(i) + stype_lnd(i,j) = soiltyp(i) + vtype_ice(i,j) = 15 ! MODIS + if(isot == 0) then + stype_ice(i,j) = 9 ! ZOBLER + else + stype_ice(i,j) = 16 ! STASGO + endif !> - Prepare land/ice/water masks for RUC LSM - !> - for land only - vtype(i,j) = vegtype(i) - stype(i,j) = soiltyp(i) + !SLMSK0 - SEA(0),LAND(1),ICE(2) MASK + !if(islmsk(i) == 0.) then + !elseif(islmsk(i) == 1.) then ! land + + if(land(i)) then ! some land + xland(i,j) = 1. + xice_lnd(i,j) = 0. + elseif(flag_ice_uncoupled(i)) then ! some ice xland(i,j) = 1. - xice(i,j) = 0. + xice(i,j) = fice(i) ! fraction of sea-ice + endif else write (0,*)'MODIS landuse is not available' endif - ! --- units % - shdfac(i,j) = sigmaf(i)*100. - shdmin1d(i,j) = shdmin(i)*100. - shdmax1d(i,j) = shdmax(i)*100. - - sfcems(i,j) = sfcemis(i) - - snoalb1d(i,j) = snoalb(i) - albbck(i,j) = max(0.01, 0.5 * (alvwf(i) + alnwf(i))) - alb(i,j) = sfalb(i) - if(rdlai2d) then xlai(i,j) = laixy(i) else xlai(i,j) = 0. endif - tbot(i,j) = tg3(i) + if (land(i)) then ! at least some land in the grid cell !> - 4. history (state) variables (h): !!\n \a cmc - canopy moisture content (\f$mm\f$) @@ -731,23 +811,43 @@ subroutine lsm_ruc_run & ! inputs !!\n \a smfrsoil(lsoil_ruc) - frozen soil moisture content (volumetric fraction) -> smfrsoil !!\n \a keepfrflag(lsoil_ruc) - flag for frozen soil physics: 0. or 1. !!\n \a wet - soil moisture availability at surface -!!\n \a snowh - actual snow depth (\f$m\f$) -!!\n \a sneqv - liquid water-equivalent snow depth (\f$m\f$) -!!\n \a sncovr - fraction of snow in the grid cell -!!\n \a ch - surface exchange coefficient for heat (\f$m s^{-1}\f$) -> chs -!!\n \a z0 - surface roughness (\f$m\f$) -> zorl(\f$cm\f$) +!!\n \a snowh_lnd - actual snow depth (\f$m\f$) +!!\n \a sneqv_lnd - liquid water-equivalent snow depth (\f$m\f$) +!!\n \a sncovr_lnd - fraction of snow in the grid cell +!!\n \a chh_lnd - surface exchange coefficient for heat (\f$m s^{-1}\f$) -> chs +!!\n \a z0_lnd - surface roughness (\f$m\f$) -> zorl(\f$cm\f$) +!!\n \a qsfc_lnd - specific humidity at surface (\f$kg kg^{-1}\f$) +!!\n \a qvg_lnd - water vapor mixing ratio at surface (\f$kg kg^{-1}\f$) +!!\n \a qsg_lnd - saturated water vapor mixing ratio at surface (\f$kg kg^{-1}\f$) +!!\n \a qcg_lnd - cloud water mixing ratio at surface (\f$kg kg^{-1}\f$) +!!\n \a solnet_lnd - net sw radiation flux (dn-up) (\f$W m^{-2}\f$) + + qvg_lnd(i,j) = sfcqv_lnd(i) + qsfc_lnd(i,j) = sfcqv_lnd(i)/(1.+sfcqv_lnd(i)) + qsg_lnd(i,j) = rslf(prsl1(i),tsurf_lnd(i)) + qcg_lnd(i,j) = sfcqc_lnd(i) + sfcems_lnd(i,j) = semis_lnd(i) + sncovr_lnd(i,j) = sncovr1_lnd(i) + snoalb1d_lnd(i,j) = snoalb(i) + albbck_lnd(i,j) = max(0.01, 0.5 * (alvwf(i) + alnwf(i))) + ! alb_lnd takes into account snow on the ground + if (sncovr_lnd(i,j) > 0.) then + !- averaged of snow-free and snow-covered + alb_lnd(i,j) = albbck_lnd(i,j) * (1.-sncovr_lnd(i,j)) + snoalb(i) * sncovr_lnd(i,j) + else + alb_lnd(i,j) = albbck_lnd(i,j) + endif + solnet_lnd(i,j) = dswsfc(i)*(1.-alb_lnd(i,j)) !snet(i) !..net sw rad flx (dn-up) at sfc in w/m2 cmc(i,j) = canopy(i) ! [mm] - soilt(i,j) = tsurf(i) ! clu_q2m_iter + soilt_lnd(i,j) = tsurf_lnd(i) ! clu_q2m_iter ! sanity check for snow temperature tsnow - if (tsnow(i) > 0. .and. tsnow(i) < 273.15) then - soilt1(i,j) = tsnow(i) + if (tsnow_lnd(i) > 0. .and. tsnow_lnd(i) < 273.15) then + soilt1_lnd(i,j) = tsnow_lnd(i) else - soilt1(i,j) = tsurf(i) + soilt1_lnd(i,j) = tsurf_lnd(i) endif - - tsnav(i,j) = 0.5*(soilt(i,j) + soilt1(i,j)) - 273.15 - + tsnav_lnd(i,j) = 0.5*(soilt_lnd(i,j) + soilt1_lnd(i,j)) - 273.15 do k = 1, lsoil_ruc smsoil (i,k,j) = smois(i,k) slsoil (i,k,j) = sh2o(i,k) @@ -755,114 +855,72 @@ subroutine lsm_ruc_run & ! inputs smfrsoil(i,k,j) = smfrkeep(i,k) keepfrsoil(i,k,j) = keepfr(i,k) enddo - - if(stype(i,j) .ne. 14) then - ! land - if (wetness(i) > 0.) then - wet(i,j) = wetness(i) - else - wet(i,j) = max(0.0001,smsoil(i,1,j)/0.3) - endif + ! land + if (wetness(i) > 0.) then + wet(i,j) = wetness(i) else - ! water - wet(i,j) = 1. + wet(i,j) = max(0.0001,smsoil(i,1,j)/0.3) endif - snowh(i,j) = snwdph(i) * 0.001 ! convert from mm to m - sneqv(i,j) = weasd(i) ! [mm] - - snfallac(i,j) = snowfallac(i) - acsn(i,j) = acsnow(i) - - ! -- sanity checks on sneqv and snowh - if (sneqv(i,j) /= 0.0 .and. snowh(i,j) == 0.0) then - snowh(i,j) = 0.003 * sneqv(i,j) ! snow density ~300 kg m-3 + chs_lnd (i,j) = ch_lnd(i) * wind(i) ! compute conductance + flhc_lnd(i,j) = chs_lnd(i,j) * rho(i) * con_cp ! * (1. + 0.84*q2(i,1,j)) + flqc_lnd(i,j) = chs_lnd(i,j) * rho(i) * wet(i,j) + ! for output + cmm_lnd(i) = cm_lnd(i) * wind(i) + chh_lnd(i) = chs_lnd(i,j) * rho(i) + ! + snowh_lnd(i,j) = snwdph_lnd(i) * 0.001 ! convert from mm to m + sneqv_lnd(i,j) = weasd_lnd(i) ! [mm] + snfallac_lnd(i,j) = snowfallac_lnd(i) + !> -- sanity checks on sneqv and snowh + if (sneqv_lnd(i,j) /= 0.0 .and. snowh_lnd(i,j) == 0.0) then + snowh_lnd(i,j) = 0.003 * sneqv_lnd(i,j) ! snow density ~300 kg m-3 endif - if (snowh(i,j) /= 0.0 .and. sneqv(i,j) == 0.0) then - sneqv(i,j) = 300. * snowh(i,j) ! snow density ~300 kg m-3 + if (snowh_lnd(i,j) /= 0.0 .and. sneqv_lnd(i,j) == 0.0) then + sneqv_lnd(i,j) = 300. * snowh_lnd(i,j) ! snow density ~300 kg m-3 endif - if (sneqv(i,j) > 0. .and. snowh(i,j) > 0.) then - if(sneqv(i,j)/snowh(i,j) > 950.) then - sneqv(i,j) = 300. * snowh(i,j) + if (sneqv_lnd(i,j) > 0. .and. snowh_lnd(i,j) > 0.) then + if(sneqv_lnd(i,j)/snowh_lnd(i,j) > 950.) then + sneqv_lnd(i,j) = 300. * snowh_lnd(i,j) endif endif - - sncovr(i,j) = sncovr1(i) - - chs(i,j) = ch(i) * wind(i) ! compute conductance - flhc(i,j) = chs(i,j) * rho(i) * con_cp * (1. + 0.84*q2(i,1,j)) - flqc(i,j) = chs(i,j) * rho(i) * wet(i,j) - ! for output - cmm(i) = cm(i) * wind(i) - chh(i) = chs(i,j) * rho(i) - ! - ! ---- ... outside sflx, roughness uses cm as unit - z0(i,j) = zorl(i)/100. - znt(i,j) = zorl(i)/100. + z0_lnd(i,j) = z0rl_lnd(i)/100. + znt_lnd(i,j) = z0rl_lnd(i)/100. if(debug_print) then - if(i==ipr) then - write (0,*)'before RUC smsoil = ',smsoil(i,:,j), i,j - write (0,*)'stsoil = ',stsoil(i,:,j), i,j - write (0,*)'soilt = ',soilt(i,j), i,j - write (0,*)'wet = ',wet(i,j), i,j - write (0,*)'soilt1 = ',soilt1(i,j), i,j - write (0,*)'delt =',delt - write (0,*)'kdt =',kdt - write (0,*)'flag_init =',flag_init - write (0,*)'flag_restart =',flag_restart - write (0,*)'nsoil =',nsoil - write (0,*)'frpcpn =',frpcpn - write (0,*)'zs =',zs - write (0,*)'graupelncv(i,j) =',i,j,graupelncv(i,j) - write (0,*)'snowncv(i,j) =',i,j,snowncv(i,j) - write (0,*)'rainncv(i,j) =',i,j,rainncv(i,j) - write (0,*)'raincv(i,j) =',i,j,raincv(i,j) - write (0,*)'prcp(i,j) =',i,j,prcp(i,j) - write (0,*)'sneqv(i,j) =',i,j,sneqv(i,j) - write (0,*)'snowh(i,j) =',i,j,snowh(i,j) - write (0,*)'sncovr(i,j) =',i,j,sncovr(i,j) - write (0,*)'ffrozp(i,j) =',i,j,ffrozp(i,j) - write (0,*)'conflx2(i,1,j) =',i,j,conflx2(i,1,j) - write (0,*)'sfcprs(i,1,j) =',i,j,sfcprs(i,1,j) - write (0,*)'sfctmp(i,1,j) =',i,j,sfctmp(i,1,j) - write (0,*)'q2(i,1,j) =',i,j,q2(i,1,j) - write (0,*)'qcatm(i,1,j) =',i,j,qcatm(i,1,j) - write (0,*)'rho2(i,1,j) =',i,j,rho2(i,1,j) - write (0,*)'lwdn(i,j) =',i,j,lwdn(i,j) - write (0,*)'solnet(i,j) =',i,j,solnet(i,j) - write (0,*)'sfcems(i,j) =',i,j,sfcems(i,j) + if(me==0 ) then + write (0,*)'before LSMRUC for land' + write (0,*)'sfcems(i,j) =',i,j,sfcems_lnd(i,j) write (0,*)'chklowq(i,j) =',i,j,chklowq(i,j) - write (0,*)'chs(i,j) =',i,j,chs(i,j) - write (0,*)'flqc(i,j) =',i,j,flqc(i,j) - write (0,*)'flhc(i,j) =',i,j,flhc(i,j) + write (0,*)'chs(i,j) =',i,j,chs_lnd(i,j) + write (0,*)'flqc(i,j) =',i,j,flqc_lnd(i,j) + write (0,*)'flhc(i,j) =',i,j,flhc_lnd(i,j) write (0,*)'wet(i,j) =',i,j,wet(i,j) write (0,*)'cmc(i,j) =',i,j,cmc(i,j) write (0,*)'shdfac(i,j) =',i,j,shdfac(i,j) - write (0,*)'alb(i,j) =',i,j,alb(i,j) - write (0,*)'znt(i,j) =',i,j,znt(i,j) - write (0,*)'z0(i,j) =',i,j,z0(i,j) - write (0,*)'snoalb1d(i,j) =',i,j,snoalb1d(i,j) - write (0,*)'alb(i,j) =',i,j,alb(i,j) + write (0,*)'alb(i,j) =',i,j,alb_lnd(i,j) + write (0,*)'znt(i,j) =',i,j,znt_lnd(i,j) + write (0,*)'z0(i,j) =',i,j,z0_lnd(i,j) + write (0,*)'snoalb1d(i,j) =',i,j,snoalb1d_lnd(i,j) write (0,*)'landusef(i,:,j) =',i,j,landusef(i,:,j) write (0,*)'soilctop(i,:,j) =',i,j,soilctop(i,:,j) write (0,*)'nlcat=',nlcat write (0,*)'nscat=',nscat - write (0,*)'qsfc(i,j) =',i,j,qsfc(i,j) - write (0,*)'qvg(i,j) =',i,j,qvg(i,j) - write (0,*)'qsg(i,j) =',i,j,qsg(i,j) - write (0,*)'qcg(i,j) =',i,j,qcg(i,j) - write (0,*)'dew(i,j) =',i,j,dew(i,j) - write (0,*)'soilt(i,j) =',i,j,soilt(i,j) - write (0,*)'tskin(i) =',i,j,tskin(i) - write (0,*)'soilt1(i,j) =',i,j,soilt1(i,j) - write (0,*)'tsnav(i,j) =',i,j,tsnav(i,j) + write (0,*)'qsfc(i,j) =',i,j,qsfc_lnd(i,j) + write (0,*)'qvg(i,j) =',i,j,qvg_lnd(i,j) + write (0,*)'qsg(i,j) =',i,j,qsg_lnd(i,j) + write (0,*)'qcg(i,j) =',i,j,qcg_lnd(i,j) + write (0,*)'dew(i,j) =',i,j,dew_lnd(i,j) + write (0,*)'soilt(i,j) =',i,j,soilt_lnd(i,j) + write (0,*)'tskin(i) =',i,j,tskin_lnd(i) + write (0,*)'soilt1(i,j) =',i,j,soilt1_lnd(i,j) + write (0,*)'tsnav(i,j) =',i,j,tsnav_lnd(i,j) write (0,*)'tbot(i,j) =',i,j,tbot(i,j) - write (0,*)'vtype(i,j) =',i,j,vtype(i,j) - write (0,*)'stype(i,j) =',i,j,stype(i,j) + write (0,*)'vtype(i,j) =',i,j,vtype_lnd(i,j) + write (0,*)'stype(i,j) =',i,j,stype_lnd(i,j) write (0,*)'xland(i,j) =',i,j,xland(i,j) write (0,*)'xice(i,j) =',i,j,xice(i,j) write (0,*)'iswater=',iswater @@ -888,60 +946,61 @@ subroutine lsm_ruc_run & ! inputs endif endif -!> - Call RUC LSM lsmruc(). - call lsmruc( delt, flag_init, flag_restart, kdt, iter, nsoil, & +!> - Call RUC LSM lsmruc() for land. + call lsmruc( & + & delt, flag_init, flag_restart, kdt, iter, nsoil, & & graupelncv(i,j), snowncv(i,j), rainncv(i,j), raincv(i,j), & - & zs, prcp(i,j), sneqv(i,j), snowh(i,j), sncovr(i,j), & + & zs, prcp(i,j), sneqv_lnd(i,j), snowh_lnd(i,j), & + & sncovr_lnd(i,j), & & ffrozp(i,j), frpcpn, & & rhosnfr(i,j), precipfr(i,j), & ! --- inputs: & conflx2(i,1,j), sfcprs(i,1,j), sfctmp(i,1,j), q2(i,1,j), & & qcatm(i,1,j), rho2(i,1,j), & - & lwdn(i,j), solnet(i,j), sfcems(i,j), chklowq(i,j), & - & chs(i,j), flqc(i,j), flhc(i,j), & + & lwdn(i,j), solnet_lnd(i,j), sfcems_lnd(i,j), chklowq(i,j), & + & chs_lnd(i,j), flqc_lnd(i,j), flhc_lnd(i,j), & ! --- input/outputs: - & wet(i,j), cmc(i,j), shdfac(i,j), alb(i,j), znt(i,j), & - & z0(i,j), snoalb1d(i,j), albbck(i,j), xlai(i,j), & - & landusef(i,:,j), nlcat, & + & wet(i,j), cmc(i,j), shdfac(i,j), alb_lnd(i,j), znt_lnd(i,j), & + & z0_lnd(i,j), snoalb1d_lnd(i,j), albbck_lnd(i,j), & + & xlai(i,j), landusef(i,:,j), nlcat, & ! --- mosaic_lu and mosaic_soil are moved to the namelist ! & mosaic_lu, mosaic_soil, & & soilctop(i,:,j), nscat, & - & qsfc(i,j), qsg(i,j), qvg(i,j), qcg(i,j), dew(i,j), & - & soilt1(i,j), & - & tsnav(i,j), tbot(i,j), vtype(i,j), stype(i,j), xland(i,j), & - & iswater, isice, xice(i,j), xice_threshold, & + & qsfc_lnd(i,j), qsg_lnd(i,j), qvg_lnd(i,j), qcg_lnd(i,j), & + & dew_lnd(i,j), soilt1_lnd(i,j), & + & tsnav_lnd(i,j), tbot(i,j), vtype_lnd(i,j), stype_lnd(i,j), & + & xland(i,j), iswater, isice, xice_lnd(i,j), xice_threshold, & ! xice=0. for the land portion of grid area ! --- constants & con_cp, con_rv, con_rd, con_g, con_pi, con_hvap, stbolt, & ! --- input/outputs: & smsoil(i,:,j), slsoil(i,:,j), soilm(i,j), smmax(i,j), & - & stsoil(i,:,j), soilt(i,j), hfx(i,j), qfx(i,j), lh(i,j), & + & stsoil(i,:,j), soilt_lnd(i,j), & + & hfx_lnd(i,j), qfx_lnd(i,j), lh_lnd(i,j), & & infiltr(i,j), runoff1(i,j), runoff2(i,j), acrunoff(i,j), & - & sfcexc(i,j), acceta(i,j), ssoil(i,j), & - & snfallac(i,j), acsn(i,j), snomlt(i,j), & + & sfcexc(i,j), acceta(i,j), ssoil_lnd(i,j), & + & snfallac_lnd(i,j), acsn(i,j), snomlt_lnd(i,j), & & smfrsoil(i,:,j),keepfrsoil(i,:,j), .false., & & shdmin1d(i,j), shdmax1d(i,j), rdlai2d, & & ims,ime, jms,jme, kms,kme, & & its,ite, jts,jte, kts,kte ) - - if(debug_print) then - if(i==ipr) then - write (0,*)'after RUC smsoil = ',smsoil(i,:,j), i, j - write (0,*)'after sneqv(i,j) =',i,j,sneqv(i,j) - write (0,*)'after snowh(i,j) =',i,j,snowh(i,j) - write (0,*)'after sncovr(i,j) =',i,j,sncovr(i,j) - write (0,*)'after vtype(i,j) =',i,j,vtype(i,j) - write (0,*)'after stype(i,j) =',i,j,stype(i,j) + if(debug_print) then + write (0,*)'after LSMRUC for land' + write (0,*)'after sneqv(i,j) =',i,j,sneqv_lnd(i,j) + write (0,*)'after snowh(i,j) =',i,j,snowh_lnd(i,j) + write (0,*)'after sncovr(i,j) =',i,j,sncovr_lnd(i,j) + write (0,*)'after vtype(i,j) =',i,j,vtype_lnd(i,j) + write (0,*)'after stype(i,j) =',i,j,stype_lnd(i,j) write (0,*)'after wet(i,j) =',i,j,wet(i,j) write (0,*)'after cmc(i,j) =',i,j,cmc(i,j) - write (0,*)'after qsfc(i,j) =',i,j,qsfc(i,j) - write (0,*)'after qvg(i,j) =',i,j,qvg(i,j) - write (0,*)'after qsg(i,j) =',i,j,qsg(i,j) - write (0,*)'after qcg(i,j) =',i,j,qcg(i,j) - write (0,*)'after dew(i,j) =',i,j,dew(i,j) - write (0,*)'after soilt(i,j) =',i,j,soilt(i,j) - write (0,*)'after tskin(i) =',i,j,tskin(i) - write (0,*)'after soilt1(i,j) =',i,j,soilt1(i,j) - write (0,*)'after tsnav(i,j) =',i,j,tsnav(i,j) + write (0,*)'after qsfc(i,j) =',i,j,qsfc_lnd(i,j) + write (0,*)'after qvg(i,j) =',i,j,qvg_lnd(i,j) + write (0,*)'after qsg(i,j) =',i,j,qsg_lnd(i,j) + write (0,*)'after qcg(i,j) =',i,j,qcg_lnd(i,j) + write (0,*)'after dew(i,j) =',i,j,dew_lnd(i,j) + write (0,*)'after soilt(i,j) =',i,j,soilt_lnd(i,j) + write (0,*)'after tskin(i) =',i,j,tskin_lnd(i) + write (0,*)'after soilt1(i,j) =',i,j,soilt1_lnd(i,j) + write (0,*)'after tsnav(i,j) =',i,j,tsnav_lnd(i,j) write (0,*)'after smsoil(i,:,j)=',i,j,smsoil(i,:,j) write (0,*)'after slsoil(i,:,j)=',i,j,slsoil(i,:,j) write (0,*)'after stsoil(i,:,j)=',i,j,stsoil(i,:,j) @@ -949,18 +1008,17 @@ subroutine lsm_ruc_run & ! inputs write (0,*)'after keepfrsoil(i,:,j)=',i,j,keepfrsoil(i,:,j) write (0,*)'after soilm(i,j) =',i,j,soilm(i,j) write (0,*)'after smmax(i,j) =',i,j,smmax(i,j) - write (0,*)'after hfx(i,j) =',i,j,hfx(i,j) - write (0,*)'after qfx(i,j) =',i,j,qfx(i,j) - write (0,*)'after lh(i,j) =',i,j,lh(i,j) + write (0,*)'after hfx(i,j) =',i,j,hfx_lnd(i,j) + write (0,*)'after qfx(i,j) =',i,j,qfx_lnd(i,j) + write (0,*)'after lh(i,j) =',i,j,lh_lnd(i,j) write (0,*)'after infiltr(i,j) =',i,j,infiltr(i,j) write (0,*)'after runoff1(i,j) =',i,j,runoff1(i,j) write (0,*)'after runoff2(i,j) =',i,j,runoff2(i,j) - write (0,*)'after ssoil(i,j) =',i,j,ssoil(i,j) - write (0,*)'after snfallac(i,j) =',i,j,snfallac(i,j) + write (0,*)'after ssoil(i,j) =',i,j,ssoil_lnd(i,j) + write (0,*)'after snfallac(i,j) =',i,j,snfallac_lnd(i,j) write (0,*)'after acsn(i,j) =',i,j,acsn(i,j) - write (0,*)'after snomlt(i,j) =',i,j,snomlt(i,j) + write (0,*)'after snomlt(i,j) =',i,j,snomlt_lnd(i,j) endif - endif !> - RUC LSM: prepare variables for return to parent model and unit conversion. @@ -971,12 +1029,29 @@ subroutine lsm_ruc_run & ! inputs !!\n \a runoff1 - surface runoff (\f$m s^{-1}\f$), not infiltrating the surface !!\n \a runoff2 - subsurface runoff (\f$m s^{-1}\f$), drainage out bottom !!\n \a snoh - phase-change heat flux from snowmelt (w m-2) +!!\n \a lh - actual latent heat flux (\f$W m^{-2}\f$: positive, if upward from sfc) +!!\n \a hfx - sensible heat flux (\f$W m^{-2}\f$: positive, if upward from sfc) +!!\n \a ssoil - soil heat flux (\f$W m^{-2}\f$: negative if downward from surface) +!!\n \a runoff1 - surface runoff (\f$m s^{-1}\f$), not infiltrating the surface +!!\n \a runoff2 - subsurface runoff (\f$m s^{-1}\f$), drainage out bottom +!!\n \a snoh - phase-change heat flux from snowmelt (w m-2) ! +! --- ... do not return the following output fields to parent model +! ec - canopy water evaporation (m s-1) +! edir - direct soil evaporation (m s-1) +! et(nsoil)-plant transpiration from a particular root layer (m s-1) +! ett - total plant transpiration (m s-1) +! esnow - sublimation from (or deposition to if <0) snowpack (m s-1) +! drip - through-fall of precip and/or dew in excess of canopy +! water-holding capacity (m) +! snomlt - snow melt (m) (water equivalent) +! xlai - leaf area index (dimensionless) +! soilw - available soil moisture in root zone (unitless fraction +! between smcwlt and smcmax) +! soilm - total soil column moisture content (frozen+unfrozen) (m) +! nroot - number of root layers, a function of veg type, determined +! in subroutine redprm. - ! Interstitial - evap(i) = qfx(i,j) / rho(i) ! kinematic - hflx(i) = hfx(i,j) / (con_cp*rho(i)) ! kinematic - gflux(i) = ssoil(i,j) !evbs(i) = edir(i,j) !evcw(i) = ec(i,j) @@ -984,42 +1059,41 @@ subroutine lsm_ruc_run & ! inputs !sbsno(i) = esnow(i,j) !snohf(i) = snoh(i,j) - sfcdew(i) = dew(i,j) - qsurf(i) = qsfc(i,j) - sncovr1(i) = sncovr(i,j) - stm(i) = soilm(i,j) - tsurf(i) = soilt(i,j) - tice(i) = tsurf(i) - - runof (i) = runoff1(i,j) * 1000.0 ! unit conversion (from m s-1 to mm s-1 and kg m-2 s-1) - drain (i) = runoff2(i,j) * 1000.0 ! unit conversion (from m s-1 to mm s-1 and kg m-2 s-1) + ! Interstitial + evap_lnd(i) = qfx_lnd(i,j) / rho(i) ! kinematic + hflx_lnd(i) = hfx_lnd(i,j) / (con_cp*rho(i)) ! kinematic + gflux_lnd(i) = ssoil_lnd(i,j) + qsurf_lnd(i) = qsfc_lnd(i,j) + tsurf_lnd(i) = soilt_lnd(i,j) + stm(i) = soilm(i,j) * 1.e-3 ! convert to [m] + + runof (i) = runoff1(i,j) + drain (i) = runoff2(i,j) wetness(i) = wet(i,j) - ! State variables - tsnow(i) = soilt1(i,j) - sfcqc(i) = qcg(i,j) - sfcqv(i) = qvg(i,j) + ! tsnow(i) = soilt1(i,j) + sfcqv_lnd(i) = qvg_lnd(i,j) + sfcqc_lnd(i) = qcg_lnd(i,j) + ! --- ... units [m/s] = [g m-2 s-1] rhosnf(i) = rhosnfr(i,j) + !acsnow(i) = acsn(i,j) ! kg m-2 ! --- ... accumulated total runoff and surface runoff - runoff(i) = runoff(i) + (drain(i)+runof(i)) * delt ! kg m-2 - srunoff(i) = srunoff(i) + runof(i) * delt ! kg m-2 + runoff(i) = runoff(i) + (drain(i)+runof(i)) * delt * 0.001 ! kg m-2 + srunoff(i) = srunoff(i) + runof(i) * delt * 0.001 ! kg m-2 ! --- ... accumulated frozen precipitation (accumulation in lsmruc) - snowfallac(i) = snfallac(i,j) ! kg m-2 - acsnow(i) = acsn(i,j) ! kg m-2 - + snowfallac_lnd(i) = snfallac_lnd(i,j) ! kg m-2 ! --- ... unit conversion (from m to mm) - snwdph(i) = snowh(i,j) * 1000.0 + snwdph_lnd(i) = snowh_lnd(i,j) * 1000.0 - canopy(i) = cmc(i,j) ! mm - weasd(i) = sneqv(i,j) ! mm - sncovr1(i) = sncovr(i,j) + canopy(i) = cmc(i,j) ! mm + weasd_lnd(i) = sneqv_lnd(i,j) ! mm + sncovr1_lnd(i) = sncovr_lnd(i,j) ! ---- ... outside RUC LSM, roughness uses cm as unit ! (update after snow's effect) - zorl(i) = znt(i,j)*100. - sfalb(i)= alb(i,j) + z0rl_lnd(i) = znt_lnd(i,j)*100. do k = 1, lsoil_ruc smois(i,k) = smsoil(i,k,j) @@ -1028,30 +1102,198 @@ subroutine lsm_ruc_run & ! inputs keepfr(i,k) = keepfrsoil(i,k,j) smfrkeep(i,k) = smfrsoil(i,k,j) enddo + if(debug_print) then + write (0,*)'LAND -i,j,stype_lnd,vtype_lnd',i,j,stype_lnd(i,j),vtype_lnd(i,j) + write (0,*)'i,j,tsurf_lnd(i)',i,j,tsurf_lnd(i) + write (0,*)'kdt,iter,stsoil(i,:,j)',kdt,iter,stsoil(i,:,j) + endif + endif ! end of land + + if (flag_ice_uncoupled(i)) then ! at least some ice in the grid cell + !-- ice point + + sncovr_ice(i,j) = sncovr1_ice(i) + snoalb1d_ice(i,j) = 0.75 ! RAP value for max snow alb on ice + albbck_ice(i,j) = 0.55 ! RAP value for ice alb + if (sncovr_ice(i,j) > 0.) then + !- averaged of snow-free and snow-covered ice + alb_ice(i,j) = albbck_ice(i,j) * (1.-sncovr_ice(i,j)) + snoalb1d_ice(i,j) * sncovr_ice(i,j) + else + ! snow-free ice + alb_ice(i,j) = albbck_ice(i,j) + endif -! --- ... do not return the following output fields to parent model -! ec - canopy water evaporation (m s-1) -! edir - direct soil evaporation (m s-1) -! et(nsoil)-plant transpiration from a particular root layer (m s-1) -! ett - total plant transpiration (m s-1) -! esnow - sublimation from (or deposition to if <0) snowpack (m s-1) -! drip - through-fall of precip and/or dew in excess of canopy -! water-holding capacity (m) -! dew - dewfall (or frostfall for t<273.15) (m) -! snomlt - snow melt (m) (water equivalent) -! sncovr - fractional snow cover (unitless fraction, 0-1) -! for a given soil layer at the end of a time step -! xlai - leaf area index (dimensionless) -! soilw - available soil moisture in root zone (unitless fraction -! between smcwlt and smcmax) -! soilm - total soil column moisture content (frozen+unfrozen) (m) -! nroot - number of root layers, a function of veg type, determined -! in subroutine redprm. + solnet_ice(i,j) = dswsfc(i)*(1.-alb_ice(i,j)) + qvg_ice(i,j) = sfcqv_ice(i) + qsfc_ice(i,j) = sfcqv_ice(i)/(1.+sfcqv_ice(i)) + qsg_ice(i,j) = rslf(prsl1(i),tsurf_ice(i)) + qcg_ice(i,j) = sfcqc_ice(i) + sfcems_ice(i,j) = semis_ice(i) + + cmc(i,j) = canopy(i) ! [mm] + soilt_ice(i,j) = tsurf_ice(i) ! clu_q2m_iter + if (tsnow_ice(i) > 0. .and. tsnow_ice(i) < 273.15) then + soilt1_ice(i,j) = tsnow_ice(i) + else + soilt1_ice(i,j) = tsurf_ice(i) + endif + tsnav_ice(i,j) = 0.5*(soilt_ice(i,j) + soilt1_ice(i,j)) - 273.15 + do k = 1, lsoil_ruc + stsice (i,k,j) = tsice(i,k) + smsoil (i,k,j) = 1. + slsoil (i,k,j) = 0. + smfrsoil(i,k,j) = 1. + keepfrsoil(i,k,j) = 1. + enddo + + wet_ice(i,j) = 1. + + chs_ice (i,j) = ch_ice(i) * wind(i) ! compute conductance + flhc_ice(i,j) = chs_ice(i,j) * rho(i) * con_cp ! * (1. + 0.84*q2(i,1,j)) + flqc_ice(i,j) = chs_ice(i,j) * rho(i) * wet_ice(i,j) + ! for output + cmm_ice(i) = cm_ice (i) * wind(i) + chh_ice(i) = chs_ice(i,j) * rho(i) + + + snowh_ice(i,j) = snwdph_ice(i) * 0.001 ! convert from mm to m + sneqv_ice(i,j) = weasd_ice(i) ! [mm] + snfallac_ice(i,j) = snowfallac_ice(i) + + !> -- sanity checks on sneqv and snowh + if (sneqv_ice(i,j) /= 0.0 .and. snowh_ice(i,j) == 0.0) then + snowh_ice(i,j) = 0.003 * sneqv_ice(i,j) ! snow density ~300 kg m-3 + endif + + if (snowh_ice(i,j) /= 0.0 .and. sneqv_ice(i,j) == 0.0) then + sneqv_ice(i,j) = 300. * snowh_ice(i,j) ! snow density ~300 kg m-3 + endif + + if (sneqv_ice(i,j) > 0. .and. snowh_ice(i,j) > 0.) then + if(sneqv_ice(i,j)/snowh_ice(i,j) > 950.) then + sneqv_ice(i,j) = 300. * snowh_ice(i,j) + endif + endif + + z0_ice(i,j) = z0rl_ice(i)/100. + znt_ice(i,j) = z0rl_ice(i)/100. + +!> - Call RUC LSM lsmruc() for ice. + call lsmruc( & + & delt, flag_init, flag_restart, kdt, iter, nsoil, & + & graupelncv(i,j), snowncv(i,j), rainncv(i,j), raincv(i,j), & + & zs, prcp(i,j), sneqv_ice(i,j), snowh_ice(i,j), & + & sncovr_ice(i,j), & + & ffrozp(i,j), frpcpn, & + & rhosnfr(i,j), precipfr(i,j), & +! --- inputs: + & conflx2(i,1,j), sfcprs(i,1,j), sfctmp(i,1,j), q2(i,1,j), & + & qcatm(i,1,j), rho2(i,1,j), & + & lwdn(i,j), solnet_ice(i,j), sfcems_ice(i,j), chklowq(i,j), & + & chs_ice(i,j), flqc_ice(i,j), flhc_ice(i,j), & +! --- input/outputs: + & wet_ice(i,j), cmc(i,j), shdfac(i,j), alb_ice(i,j), & + & znt_ice(i,j), z0_ice(i,j), snoalb1d_ice(i,j), & + & albbck_ice(i,j), xlai(i,j),landusef(i,:,j), nlcat, & +! --- mosaic_lu and mosaic_soil are moved to the namelist +! & mosaic_lu, mosaic_soil, & + & soilctop(i,:,j), nscat, & + & qsfc_ice(i,j), qsg_ice(i,j), qvg_ice(i,j), qcg_ice(i,j), & + & dew_ice(i,j), soilt1_ice(i,j), & + & tsnav_ice(i,j), tbot(i,j), vtype_ice(i,j), stype_ice(i,j), & + & xland(i,j), iswater, isice, xice(i,j), xice_threshold, & +! --- constants + & con_cp, con_rv, con_rd, con_g, con_pi, con_hvap, stbolt, & +! --- input/outputs: + & smsoil(i,:,j), slsoil(i,:,j), soilm(i,j), smmax(i,j), & + & stsice(i,:,j), soilt_ice(i,j), & + & hfx_ice(i,j), qfx_ice(i,j), lh_ice(i,j), & + & infiltr(i,j), runoff1(i,j), runoff2(i,j), acrunoff(i,j), & + & sfcexc(i,j), acceta(i,j), ssoil_ice(i,j), & + & snfallac_ice(i,j), acsn(i,j), snomlt_ice(i,j), & + & smfrsoil(i,:,j),keepfrsoil(i,:,j), .false., & + & shdmin1d(i,j), shdmax1d(i,j), rdlai2d, & + & ims,ime, jms,jme, kms,kme, & + & its,ite, jts,jte, kts,kte ) + + ! Interstitial + evap_ice(i) = qfx_ice(i,j) / rho(i) ! kinematic + ep1d_ice(i) = qfx_ice(i,j) * con_hvap + hflx_ice(i) = hfx_ice(i,j) / (con_cp*rho(i)) ! kinematic + gflux_ice(i) = ssoil_ice(i,j) + + qsurf_ice(i) = qsfc_ice(i,j) + tsurf_ice(i) = soilt_ice(i,j) + + sfcqv_ice(i) = qvg_ice(i,j) + sfcqc_ice(i) = qcg_ice(i,j) + + snowfallac_ice(i) = snfallac_ice(i,j) ! kg m-2 + ! --- ... unit conversion (from m to mm) + snwdph_ice(i) = snowh_ice(i,j) * 1000.0 + weasd_ice(i) = sneqv_ice(i,j) ! mm + sncovr1_ice(i) = sncovr_ice(i,j) + z0rl_ice(i) = znt_ice(i,j)*100. - endif ! end if_flag_iter_and_flag_block + do k = 1, lsoil_ruc + tsice(i,k) = stsice(i,k,j) + if(.not. frac_grid) then + smois(i,k) = 1. + sh2o(i,k) = 0. + tslb(i,k) = stsice(i,k,j) + keepfr(i,k) = 1. + smfrkeep(i,k) = 1. + endif + enddo + if(debug_print) then + write (0,*)'ICE - i,j,stype_ice,vtype_ice)',i,j,stype_ice(i,j),vtype_ice(i,j) + write (0,*)'i,j,tsurf_ice(i)',i,j,tsurf_ice(i) + write (0,*)'kdt,iter,stsice(i,:,j)',kdt,iter,stsice(i,:,j) + endif + + endif ! ice + + + endif ! end if_flag_iter_and_flag enddo ! j enddo ! i + !-- Take care of fractional sea ice for uncoupled run with frac_grid=.false. + !-- When frac_grid=.true. GFS_surface_composite will take care of this. + do i = 1, im ! i - horizontal loop + if ( flag_iter(i) .and. flag(i) ) then + ! Do this only when the fractional grid is not turned on! + ! Compute composite for a fractional sea ice: fice(i) < 1. + ! This is needed for the 2-way coupling + ! in the upcoupled case (when sfc_cice is not used). + if(.not. frac_grid) then + if( flag_ice_uncoupled(i) .and. fice(i) < 1.) then + !write (0,*)'Fractional sea ice at i', i, fice(i) + fwat = 1.0 - fice(i) + ! Check if ice fraction is below the minimum value: 15% in GFS + ! physics. + if (fice(i) < cimin) then ! cimin - minimal ice fraction + write (0,*)'warning: ice fraction is low:', fice(i) + fice(i) = cimin + fwat = 1.0 - cimin + write (0,*)'fix ice fraction: reset it to:', fice(i), tskin_wat(i) + endif + + ! Compute the composite of ice and open water for 2-way coupling in the + ! uncoupled sea-ice model. Use ice variables for the composite. + tsurf_ice(i) = tsurf_ice(i) * fice(i) + min(con_tice,tskin_wat(i)) * fwat + chh_ice(i) = chh_ice(i) * fice(i) + ch_wat(i) * wind(i) * rho(i) * fwat + hfxw = ch_wat(i) * wind(i) * (min(con_tice,tskin_wat(i)) - t1(i)) + hflx_ice(i) = hflx_ice(i) * fice(i) + hfxw * fwat + qsw = rslf(prsl1(i),min(con_tice,tskin_wat(i))) + evapw = ch_wat(i) * wind(i) * (qsw - q0(i)) + evap_ice(i) = evap_ice(i) * fice(i) + evapw * fwat + qsurf_ice(i) = q1(i) + evap_ice(i) * rho(i) / chh_ice(i) + endif ! flag_ice_uncoupled(i) .and. fice(i) < 1. + endif ! flag_iter, icy, not frac_grid + endif + enddo ! i + !> - Restore land-related prognostic fields for guess run. do j = 1, 1 do i = 1, im @@ -1059,50 +1301,52 @@ subroutine lsm_ruc_run & ! inputs if(debug_print) write (0,*)'end ',i,flag_guess(i),flag_iter(i) if (flag_guess(i)) then if(debug_print) write (0,*)'guess run' - weasd(i) = weasd_old(i) - snwdph(i) = snwdph_old(i) - tskin(i) = tskin_old(i) - canopy(i) = canopy_old(i) - !tprcp(i) = tprcp_old(i) - srflag(i) = srflag_old(i) - tsnow(i) = tsnow_old(i) - snowfallac(i) = snowfallac_old(i) - acsnow(i) = acsnow_old(i) - sfalb(i) = sfalb_old(i) - sfcqv(i) = sfcqv_old(i) - sfcqc(i) = sfcqc_old(i) - wetness(i) = wetness_old(i) - zorl(i) = zorl_old(i) - sncovr1(i) = sncovr1_old(i) + + weasd_lnd(i) = weasd_lnd_old(i) + snwdph_lnd(i) = snwdph_lnd_old(i) + tskin_lnd(i) = tskin_lnd_old(i) + canopy(i) = canopy_old(i) + !srflag(i) = srflag_old(i) + tsnow_lnd(i) = tsnow_lnd_old(i) + snowfallac_lnd(i) = snowfallac_lnd_old(i) + !acsnow(i) = acsnow_old(i) + sfcqv_lnd(i) = sfcqv_lnd_old(i) + sfcqc_lnd(i) = sfcqc_lnd_old(i) + wetness(i) = wetness_old(i) + z0rl_lnd(i) = z0rl_lnd_old(i) + sncovr1_lnd(i) = sncovr1_lnd_old(i) + !ice + weasd_ice(i) = weasd_ice_old(i) + snwdph_ice(i) = snwdph_ice_old(i) + tskin_ice(i) = tskin_ice_old(i) + tsnow_ice(i) = tsnow_ice_old(i) + snowfallac_ice(i) = snowfallac_ice_old(i) + sfcqv_ice(i) = sfcqv_ice_old(i) + sfcqc_ice(i) = sfcqc_ice_old(i) + z0rl_ice(i) = z0rl_ice_old(i) + sncovr1_ice(i) = sncovr1_ice_old(i) + do k = 1, lsoil_ruc - smois(i,k) = smois_old(i,k) - tslb(i,k) = tslb_old(i,k) - sh2o(i,k) = sh2o_old(i,k) - keepfr(i,k) = keepfr_old(i,k) + smois(i,k) = smois_old(i,k) + tslb(i,k) = tslb_old(i,k) + tsice(i,k) = tsice_old(i,k) + sh2o(i,k) = sh2o_old(i,k) + keepfr(i,k) = keepfr_old(i,k) smfrkeep(i,k) = smfrkeep_old(i,k) enddo - else - if(debug_print) write (0,*)'iter run', i,j, tskin(i),tsurf(i) - tskin(i) = tsurf(i) - tice (i) = tsurf(i) - endif - endif + else ! flag_guess + if(debug_print) write (0,*)'iter run', i,j, tskin_ice(i),tsurf_ice(i) + tskin_lnd(i) = tsurf_lnd(i) + tskin_ice(i) = tsurf_ice(i) + tice(i) = tsurf_ice(i) + endif ! flag_guess + endif ! flag enddo ! i enddo ! j ! deallocate(soilctop) deallocate(landusef) ! - !! Update standard (Noah LSM) soil variables for physics - !! that require these variables and for debugging purposes - do i = 1, im - do k = 1, lsoil - smc(i,k) = smois(i,k) - slc(i,k) = sh2o(i,k) - stc(i,k) = tslb(i,k) - enddo - enddo - return !................................... end subroutine lsm_ruc_run diff --git a/physics/sfc_drv_ruc.meta b/physics/sfc_drv_ruc.meta index 061979d63..229bce1fc 100644 --- a/physics/sfc_drv_ruc.meta +++ b/physics/sfc_drv_ruc.meta @@ -263,6 +263,22 @@ kind = kind_phys intent = out optional = F +[pores] + standard_name = maximum_soil_moisture_content_for_land_surface_model + long_name = maximum soil moisture for a given soil type for land surface model + units = m + dimensions = (30) + type = real + intent = out + kind = kind_phys +[resid] + standard_name = minimum_soil_moisture_content_for_land_surface_model + long_name = minimum soil moisture for a given soil type for land surface model + units = m + dimensions = (30) + type = real + intent = out + kind = kind_phys [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP @@ -331,6 +347,15 @@ type = integer intent = in optional = F +[delt] + standard_name = time_step_for_dynamics + long_name = physics time step + units = s + dimensions = () + type = real + kind = kind_phys + intent = in + optional = F [kdt] standard_name = index_of_time_step long_name = current number of time steps @@ -355,6 +380,54 @@ type = integer intent = in optional = F +[lsm_ruc] + standard_name = flag_for_ruc_land_surface_scheme + long_name = flag for RUC land surface model + units = flag + dimensions = () + type = integer + intent = in + optional = F +[lsm] + standard_name = flag_for_land_surface_scheme + long_name = flag for land surface model + units = flag + dimensions = () + type = integer + intent = in + optional = F +[imp_physics] + standard_name = flag_for_microphysics_scheme + long_name = choice of microphysics scheme + units = flag + dimensions = () + type = integer + intent = in + optional = F +[imp_physics_gfdl] + standard_name = flag_for_gfdl_microphysics_scheme + long_name = choice of GFDL microphysics scheme + units = flag + dimensions = () + type = integer + intent = in + optional = F +[imp_physics_thompson] + standard_name = flag_for_thompson_microphysics_scheme + long_name = choice of Thompson microphysics scheme + units = flag + dimensions = () + type = integer + intent = in + optional = F +[do_mynnsfclay] + standard_name = do_mynnsfclay + long_name = flag to activate MYNN surface layer + units = flag + dimensions = () + type = logical + intent = in + optional = F [lsoil_ruc] standard_name = soil_vertical_dimension_for_land_surface_model long_name = number of soil layers internal to land surface model @@ -371,6 +444,14 @@ type = integer intent = in optional = F +[rdlai] + standard_name = flag_for_reading_leaf_area_index_from_input + long_name = flag for reading leaf area index from initial conditions for RUC LSM + units = flag + dimensions = () + type = logical + intent = in + optional = F [zs] standard_name = depth_of_soil_levels_for_land_surface_model long_name = depth of soil levels for land surface model @@ -400,7 +481,7 @@ optional = F [qc] standard_name = cloud_condensed_water_mixing_ratio_at_lowest_model_layer - long_name = moist (dry+vapor, no condensates) mixing ratio of cloud water at lowest model layer + long_name = ratio of mass of cloud water to mass of dry air plus vapor (without condensates) at lowest model layer units = kg kg-1 dimensions = (horizontal_loop_extent) type = real @@ -441,15 +522,6 @@ kind = kind_phys intent = in optional = F -[sfcemis] - standard_name = surface_longwave_emissivity_over_land_interstitial - long_name = surface lw emissivity in fraction over land (temporary use as interstitial) - units = frac - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = inout - optional = F [dlwflx] standard_name = surface_downwelling_longwave_flux long_name = surface downwelling longwave flux at current time @@ -477,15 +549,6 @@ kind = kind_phys intent = in optional = F -[delt] - standard_name = time_step_for_dynamics - long_name = physics time step - units = s - dimensions = () - type = real - kind = kind_phys - intent = in - optional = F [tg3] standard_name = deep_soil_temperature long_name = deep soil temperature @@ -495,19 +558,70 @@ kind = kind_phys intent = in optional = F -[cm] - standard_name = surface_drag_coefficient_for_momentum_in_air_over_land - long_name = surface exchange coeff for momentum over land - units = none +[land] + standard_name = flag_nonzero_land_surface_fraction + long_name = flag indicating presence of some land surface area fraction + units = flag + dimensions = (horizontal_loop_extent) + type = logical + intent = in + optional = F +[icy] + standard_name = flag_nonzero_sea_ice_surface_fraction + long_name = flag indicating presence of some sea ice surface area fraction + units = flag + dimensions = (horizontal_loop_extent) + type = logical + intent = in + optional = F +[lake] + standard_name = flag_nonzero_lake_surface_fraction + long_name = flag indicating presence of some lake surface area fraction + units = flag + dimensions = (horizontal_loop_extent) + type = logical + intent = in + optional = F +[rainnc] + standard_name = lwe_thickness_of_explicit_rainfall_amount_from_previous_timestep + long_name = explicit rainfall from previous timestep + units = m dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = in optional = F -[ch] - standard_name = surface_drag_coefficient_for_heat_and_moisture_in_air_over_land - long_name = surface exchange coeff heat & moisture over land - units = none +[rainc] + standard_name = lwe_thickness_of_convective_precipitation_amount_from_previous_timestep + long_name = convective_precipitation_amount from previous timestep + units = m + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = in + optional = F +[ice] + standard_name = lwe_thickness_of_ice_amount_from_previous_timestep + long_name = ice amount from previous timestep + units = m + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = in + optional = F +[snow] + standard_name = lwe_thickness_of_snow_amount_from_previous_timestep + long_name = snow amount from previous timestep + units = m + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = in + optional = F +[graupel] + standard_name = lwe_thickness_of_graupel_amount_from_previous_timestep + long_name = graupel amount from previous timestep + units = m dimensions = (horizontal_loop_extent) type = real kind = kind_phys @@ -576,38 +690,22 @@ kind = kind_phys intent = in optional = F -[snoalb] - standard_name = upper_bound_on_max_albedo_over_deep_snow - long_name = maximum snow albedo - units = frac +[srflag] + standard_name = flag_for_precipitation_type + long_name = snow/rain flag for precipitation + units = flag dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = in optional = F -[sfalb] - standard_name = surface_diffused_shortwave_albedo - long_name = mean surface diffused sw albedo +[snoalb] + standard_name = upper_bound_on_max_albedo_over_deep_snow + long_name = maximum snow albedo units = frac dimensions = (horizontal_loop_extent) type = real kind = kind_phys - intent = inout - optional = F -[flag_iter] - standard_name = flag_for_iteration - long_name = flag for iteration - units = flag - dimensions = (horizontal_loop_extent) - type = logical - intent = in - optional = F -[flag_guess] - standard_name = flag_for_guess_run - long_name = flag for guess run - units = flag - dimensions = (horizontal_loop_extent) - type = logical intent = in optional = F [isot] @@ -633,189 +731,135 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - intent = inout + intent = in optional = F -[smc] - standard_name = volume_fraction_of_soil_moisture - long_name = total soil moisture +[smcwlt2] + standard_name = volume_fraction_of_condensed_water_in_soil_at_wilting_point + long_name = soil water fraction at wilting point units = frac - dimensions = (horizontal_loop_extent,soil_vertical_dimension) - type = real - kind = kind_phys - intent = inout - optional = F -[stc] - standard_name = soil_temperature - long_name = soil temperature - units = K - dimensions = (horizontal_loop_extent,soil_vertical_dimension) + dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = inout optional = F -[slc] - standard_name = volume_fraction_of_unfrozen_soil_moisture - long_name = liquid soil moisture +[smcref2] + standard_name = threshold_volume_fraction_of_condensed_water_in_soil + long_name = soil moisture threshold units = frac - dimensions = (horizontal_loop_extent,soil_vertical_dimension) + dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = inout optional = F -[lsm_ruc] - standard_name = flag_for_ruc_land_surface_scheme - long_name = flag for RUC land surface model - units = flag +[con_cp] + standard_name = specific_heat_of_dry_air_at_constant_pressure + long_name = specific heat !of dry air at constant pressure + units = J kg-1 K-1 dimensions = () - type = integer + type = real + kind = kind_phys intent = in optional = F -[lsm] - standard_name = flag_for_land_surface_scheme - long_name = flag for land surface model - units = flag +[con_rd] + standard_name = gas_constant_dry_air + long_name = ideal gas constant for dry air + units = J kg-1 K-1 dimensions = () - type = integer + type = real + kind = kind_phys intent = in optional = F -[land] - standard_name = flag_nonzero_land_surface_fraction - long_name = flag indicating presence of some land surface area fraction - units = flag - dimensions = (horizontal_loop_extent) - type = logical +[con_rv] + standard_name = gas_constant_water_vapor + long_name = ideal gas constant for water vapor + units = J kg-1 K-1 + dimensions = () + type = real + kind = kind_phys intent = in optional = F -[islimsk] - standard_name = sea_land_ice_mask - long_name = sea/land/ice mask (=0/1/2) - units = flag - dimensions = (horizontal_loop_extent) - type = integer +[con_g] + standard_name = gravitational_acceleration + long_name = gravitational acceleration + units = m s-2 + dimensions = () + type = real + kind = kind_phys intent = in optional = F -[rdlai] - standard_name = flag_for_reading_leaf_area_index_from_input - long_name = flag for reading leaf area index from initial conditions for RUC LSM - units = flag +[con_pi] + standard_name = pi + long_name = ratio of a circle's circumference to its diameter + units = none dimensions = () - type = logical + type = real + kind = kind_phys intent = in optional = F -[imp_physics] - standard_name = flag_for_microphysics_scheme - long_name = choice of microphysics scheme - units = flag - dimensions = () - type = integer - intent = in - optional = F -[imp_physics_gfdl] - standard_name = flag_for_gfdl_microphysics_scheme - long_name = choice of GFDL microphysics scheme - units = flag - dimensions = () - type = integer - intent = in - optional = F -[imp_physics_thompson] - standard_name = flag_for_thompson_microphysics_scheme - long_name = choice of Thompson microphysics scheme - units = flag - dimensions = () - type = integer - intent = in - optional = F -[smcwlt2] - standard_name = volume_fraction_of_condensed_water_in_soil_at_wilting_point - long_name = soil water fraction at wilting point - units = frac - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = inout - optional = F -[smcref2] - standard_name = threshold_volume_fraction_of_condensed_water_in_soil - long_name = soil moisture threshold - units = frac - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = inout - optional = F -[do_mynnsfclay] - standard_name = do_mynnsfclay - long_name = flag to activate MYNN surface layer - units = flag - dimensions = () - type = logical - intent = in - optional = F -[con_cp] - standard_name = specific_heat_of_dry_air_at_constant_pressure - long_name = specific heat !of dry air at constant pressure - units = J kg-1 K-1 +[con_hvap] + standard_name = latent_heat_of_vaporization_of_water_at_0C + long_name = latent heat of vaporization/sublimation (hvap) + units = J kg-1 dimensions = () type = real kind = kind_phys intent = in optional = F -[con_rv] - standard_name = gas_constant_water_vapor - long_name = ideal gas constant for water vapor - units = J kg-1 K-1 +[con_fvirt] + standard_name = ratio_of_vapor_to_dry_air_gas_constants_minus_one + long_name = rv/rd - 1 (rv = ideal gas constant for water vapor) + units = none dimensions = () type = real kind = kind_phys intent = in optional = F -[con_rd] - standard_name = gas_constant_dry_air - long_name = ideal gas constant for dry air - units = J kg-1 K-1 - dimensions = () +[ch_wat] + standard_name = surface_drag_coefficient_for_heat_and_moisture_in_air_over_ocean + long_name = surface exchange coeff heat & moisture over ocean + units = none + dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = in optional = F -[con_g] - standard_name = gravitational_acceleration - long_name = gravitational acceleration - units = m s-2 - dimensions = () +[tskin_wat] + standard_name = surface_skin_temperature_over_ocean_interstitial + long_name = surface skin temperature over ocean (temporary use as interstitial) + units = K + dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = in optional = F -[con_pi] - standard_name = pi - long_name = ratio of a circle's circumference to its diameter - units = none - dimensions = () +[semis_lnd] + standard_name = surface_longwave_emissivity_over_land_interstitial + long_name = surface lw emissivity in fraction over land (temporary use as interstitial) + units = frac + dimensions = (horizontal_loop_extent) type = real kind = kind_phys - intent = in + intent = inout optional = F -[con_hvap] - standard_name = latent_heat_of_vaporization_of_water_at_0C - long_name = latent heat of vaporization/sublimation (hvap) - units = J kg-1 - dimensions = () +[semis_ice] + standard_name = surface_longwave_emissivity_over_ice_interstitial + long_name = surface lw emissivity in fraction over ice (temporary use as interstitial) + units = frac + dimensions = (horizontal_loop_extent) type = real kind = kind_phys - intent = in + intent = inout optional = F -[con_fvirt] - standard_name = ratio_of_vapor_to_dry_air_gas_constants_minus_one - long_name = rv/rd - 1 (rv = ideal gas constant for water vapor) - units = none - dimensions = () +[sncovr1_lnd] + standard_name = surface_snow_area_fraction_over_land + long_name = surface snow area fraction over land + units = frac + dimensions = (horizontal_loop_extent) type = real kind = kind_phys - intent = in + intent = inout optional = F -[weasd] +[weasd_lnd] standard_name = water_equivalent_accumulated_snow_depth_over_land long_name = water equiv of acc snow depth over land units = mm @@ -824,7 +868,7 @@ kind = kind_phys intent = inout optional = F -[snwdph] +[snwdph_lnd] standard_name = surface_snow_thickness_water_equivalent_over_land long_name = water equivalent snow depth over land units = mm @@ -833,7 +877,7 @@ kind = kind_phys intent = inout optional = F -[tskin] +[tskin_lnd] standard_name = surface_skin_temperature_over_land_interstitial long_name = surface skin temperature over land use as interstitial units = K @@ -842,64 +886,37 @@ kind = kind_phys intent = inout optional = F -[tskin_wat] - standard_name = surface_skin_temperature_over_ocean_interstitial - long_name = surface skin temperature over ocean (temporary use as interstitial) - units = K - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = inout - optional = F -[rainnc] - standard_name = lwe_thickness_of_explicit_rainfall_amount_from_previous_timestep - long_name = explicit rainfall from previous timestep - units = m - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = in - optional = F -[rainc] - standard_name = lwe_thickness_of_convective_precipitation_amount_from_previous_timestep - long_name = convective_precipitation_amount from previous timestep - units = m - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = in - optional = F -[ice] - standard_name = lwe_thickness_of_ice_amount_from_previous_timestep - long_name = ice amount from previous timestep - units = m +[sncovr1_ice] + standard_name = surface_snow_area_fraction_over_ice + long_name = surface snow area fraction over ice + units = frac dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = in optional = F -[snow] - standard_name = lwe_thickness_of_snow_amount_from_previous_timestep - long_name = snow amount from previous timestep - units = m +[weasd_ice] + standard_name = water_equivalent_accumulated_snow_depth_over_ice + long_name = water equiv of acc snow depth over ice + units = mm dimensions = (horizontal_loop_extent) type = real kind = kind_phys - intent = in + intent = inout optional = F -[graupel] - standard_name = lwe_thickness_of_graupel_amount_from_previous_timestep - long_name = graupel amount from previous timestep - units = m +[snwdph_ice] + standard_name = surface_snow_thickness_water_equivalent_over_ice + long_name = water equivalent snow depth over ice + units = mm dimensions = (horizontal_loop_extent) type = real kind = kind_phys - intent = in + intent = inout optional = F -[srflag] - standard_name = flag_for_precipitation_type - long_name = snow/rain flag for precipitation - units = flag +[tskin_ice] + standard_name = surface_skin_temperature_over_ice_interstitial + long_name = surface skin temperature over ice (temporary use as interstitial) + units = K dimensions = (horizontal_loop_extent) type = real kind = kind_phys @@ -914,6 +931,15 @@ kind = kind_phys intent = inout optional = F +[tsice] + standard_name = internal_ice_temperature + long_name = sea ice internal temperature + units = K + dimensions = (horizontal_loop_extent,ice_vertical_dimension) + type = real + kind = kind_phys + intent = inout + optional = F [tslb] standard_name = soil_temperature_for_land_surface_model long_name = soil temperature for land surface model @@ -968,7 +994,7 @@ kind = kind_phys intent = out optional = F -[tsurf] +[tsurf_lnd] standard_name = surface_skin_temperature_after_iteration_over_land long_name = surface skin temperature after iteration over land units = K @@ -977,16 +1003,16 @@ kind = kind_phys intent = inout optional = F -[tsnow] - standard_name = snow_temperature_bottom_first_layer - long_name = snow temperature at the bottom of first snow layer +[tsnow_lnd] + standard_name = snow_temperature_bottom_first_layer_over_land + long_name = snow temperature at the bottom of first snow layer over land units = K dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = inout optional = F -[zorl] +[z0rl_lnd] standard_name = surface_roughness_length_over_land_interstitial long_name = surface roughness length over land (temporary use as interstitial) units = cm @@ -995,52 +1021,25 @@ kind = kind_phys intent = inout optional = F -[sfcqc] - standard_name = cloud_condensed_water_mixing_ratio_at_surface - long_name = moist cloud water mixing ratio at surface +[sfcqc_lnd] + standard_name = cloud_condensed_water_mixing_ratio_at_surface_over_land + long_name = moist cloud water mixing ratio at surface over land units = kg kg-1 dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = inout optional = F -[sfcdew] - standard_name = surface_condensation_mass - long_name = surface condensation mass - units = kg m-2 - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = inout - optional = F -[tice] - standard_name = sea_ice_temperature_interstitial - long_name = sea ice surface skin temperature use as interstitial - units = K - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = inout - optional = F -[sfcqv] - standard_name = water_vapor_mixing_ratio_at_surface - long_name = water vapor mixing ratio at surface +[sfcqv_lnd] + standard_name = water_vapor_mixing_ratio_at_surface_over_land + long_name = water vapor mixing ratio at surface over land units = kg kg-1 dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = inout optional = F -[sncovr1] - standard_name = surface_snow_area_fraction_over_land - long_name = surface snow area fraction - units = frac - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = inout - optional = F -[qsurf] +[qsurf_lnd] standard_name = surface_specific_humidity_over_land long_name = surface air saturation specific humidity over land units = kg kg-1 @@ -1049,7 +1048,7 @@ kind = kind_phys intent = inout optional = F -[gflux] +[gflux_lnd] standard_name = upward_heat_flux_in_soil_over_land long_name = soil heat flux over land units = W m-2 @@ -1058,16 +1057,7 @@ kind = kind_phys intent = out optional = F -[drain] - standard_name = subsurface_runoff_flux - long_name = subsurface runoff flux - units = kg m-2 s-1 - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = out - optional = F -[evap] +[evap_lnd] standard_name = kinematic_surface_upward_latent_heat_flux_over_land long_name = kinematic surface upward evaporation flux over land units = kg kg-1 m s-1 @@ -1076,7 +1066,7 @@ kind = kind_phys intent = out optional = F -[hflx] +[hflx_lnd] standard_name = kinematic_surface_upward_sensible_heat_flux_over_land long_name = kinematic surface upward sensible heat flux over land units = K m s-1 @@ -1085,15 +1075,6 @@ kind = kind_phys intent = out optional = F -[rhosnf] - standard_name = density_of_frozen_precipitation - long_name = density of frozen precipitation - units = kg m-3 - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = out - optional = F [runof] standard_name = surface_runoff_flux long_name = surface runoff flux @@ -1121,23 +1102,32 @@ kind = kind_phys intent = inout optional = F -[chh] - standard_name = surface_drag_mass_flux_for_heat_and_moisture_in_air_over_land - long_name = thermal exchange coefficient over land +[drain] + standard_name = subsurface_runoff_flux + long_name = subsurface runoff flux units = kg m-2 s-1 dimensions = (horizontal_loop_extent) type = real kind = kind_phys - intent = inout + intent = out optional = F -[cmm] - standard_name = surface_drag_wind_speed_for_momentum_in_air_over_land - long_name = momentum exchange coefficient over land - units = m s-1 +[cm_lnd] + standard_name = surface_drag_coefficient_for_momentum_in_air_over_land + long_name = surface exchange coeff for momentum over land + units = none dimensions = (horizontal_loop_extent) type = real kind = kind_phys - intent = inout + intent = in + optional = F +[ch_lnd] + standard_name = surface_drag_coefficient_for_heat_and_moisture_in_air_over_land + long_name = surface exchange coeff heat & moisture over land + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = in optional = F [evbs] standard_name = soil_upward_latent_heat_flux @@ -1157,15 +1147,6 @@ kind = kind_phys intent = out optional = F -[sbsno] - standard_name = snow_deposition_sublimation_upward_latent_heat_flux - long_name = latent heat flux from snow depo/subl - units = W m-2 - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - intent = out - optional = F [stm] standard_name = soil_moisture_content long_name = soil moisture content @@ -1184,24 +1165,211 @@ kind = kind_phys intent = inout optional = F -[acsnow] - standard_name = accumulated_water_equivalent_of_frozen_precip - long_name = snow water equivalent of run-total frozen precip +[snowfallac_lnd] + standard_name = total_accumulated_snowfall_over_land + long_name = run-total snow accumulation on the ground over land units = kg m-2 dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = inout optional = F -[snowfallac] - standard_name = total_accumulated_snowfall - long_name = run-total snow accumulation on the ground +[sfcqc_ice] + standard_name = cloud_condensed_water_mixing_ratio_at_surface_over_ice + long_name = moist cloud water mixing ratio at surface over ice + units = kg kg-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = inout + optional = F +[sfcqv_ice] + standard_name = water_vapor_mixing_ratio_at_surface_over_ice + long_name = water vapor mixing ratio at surface over ice + units = kg kg-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = inout + optional = F +[tice] + standard_name = sea_ice_temperature_interstitial + long_name = sea ice surface skin temperature use as interstitial + units = K + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = inout + optional = F +[tsurf_ice] + standard_name = surface_skin_temperature_after_iteration_over_ice + long_name = surface skin temperature after iteration over ice + units = K + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = inout + optional = F +[tsnow_ice] + standard_name = snow_temperature_bottom_first_layer_over_ice + long_name = snow temperature at the bottom of first snow layer over ice + units = K + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = inout + optional = F +[z0rl_ice] + standard_name = surface_roughness_length_over_ice_interstitial + long_name = surface roughness length over ice (temporary use as interstitial) + units = cm + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = inout + optional = F +[qsurf_ice] + standard_name = surface_specific_humidity_over_ice + long_name = surface air saturation specific humidity over ice + units = kg kg-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = inout + optional = F +[gflux_ice] + standard_name = upward_heat_flux_in_soil_over_ice + long_name = soil heat flux over ice + units = W m-2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = out + optional = F +[evap_ice] + standard_name = kinematic_surface_upward_latent_heat_flux_over_ice + long_name = kinematic surface upward latent heat flux over ice + units = kg kg-1 m s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = out + optional = F +[ep1d_ice] + standard_name = surface_upward_potential_latent_heat_flux_over_ice + long_name = surface upward potential latent heat flux over ice + units = W m-2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = inout + optional = F +[hflx_ice] + standard_name = kinematic_surface_upward_sensible_heat_flux_over_ice + long_name = kinematic surface upward sensible heat flux over ice + units = K m s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = out + optional = F +[cm_ice] + standard_name = surface_drag_coefficient_for_momentum_in_air_over_ice + long_name = surface exchange coeff for momentum over ice + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = in + optional = F +[ch_ice] + standard_name = surface_drag_coefficient_for_heat_and_moisture_in_air_over_ice + long_name = surface exchange coeff heat & moisture over ice + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = in + optional = F +[snowfallac_ice] + standard_name = total_accumulated_snowfall_over_ice + long_name = run-total snow accumulation on the ground over ice units = kg m-2 dimensions = (horizontal_loop_extent) type = real kind = kind_phys intent = inout optional = F +[rhosnf] + standard_name = density_of_frozen_precipitation + long_name = density of frozen precipitation + units = kg m-3 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = out + optional = F +[sbsno] + standard_name = snow_deposition_sublimation_upward_latent_heat_flux + long_name = latent heat flux from snow depo/subl + units = W m-2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = out + optional = F +[cmm_lnd] + standard_name = surface_drag_wind_speed_for_momentum_in_air_over_land + long_name = momentum exchange coefficient over land + units = m s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = out + optional = F +[chh_lnd] + standard_name = surface_drag_mass_flux_for_heat_and_moisture_in_air_over_land + long_name = thermal exchange coefficient over land + units = kg m-2 s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = out + optional = F +[cmm_ice] + standard_name = surface_drag_wind_speed_for_momentum_in_air_over_ice + long_name = momentum exchange coefficient over ice + units = m s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = out + optional = F +[chh_ice] + standard_name = surface_drag_mass_flux_for_heat_and_moisture_in_air_over_ice + long_name = thermal exchange coefficient over ice + units = kg m-2 s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = out + optional = F +[flag_iter] + standard_name = flag_for_iteration + long_name = flag for iteration + units = flag + dimensions = (horizontal_loop_extent) + type = logical + intent = in + optional = F +[flag_guess] + standard_name = flag_for_guess_run + long_name = flag for guess run + units = flag + dimensions = (horizontal_loop_extent) + type = logical + intent = in + optional = F [flag_init] standard_name = flag_for_first_time_step long_name = flag signaling first time step for time integration loop @@ -1218,6 +1386,22 @@ type = logical intent = in optional = F +[flag_cice] + standard_name = flag_for_cice + long_name = flag for cice + units = flag + dimensions = (horizontal_loop_extent) + type = logical + intent = in + optional = F +[frac_grid] + standard_name = flag_for_fractional_grid + long_name = flag for fractional grid + units = flag + dimensions = () + type = logical + intent = in + optional = F [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP diff --git a/physics/sfc_noahmp_drv.f b/physics/sfc_noahmp_drv.f index f60a4233f..4dd419f0f 100644 --- a/physics/sfc_noahmp_drv.f +++ b/physics/sfc_noahmp_drv.f @@ -25,14 +25,19 @@ module noahmpdrv !! \section arg_table_noahmpdrv_init Argument Table !! \htmlinclude noahmpdrv_init.html !! - subroutine noahmpdrv_init(me, isot, ivegsrc, nlunit, errmsg, & - & errflg) + subroutine noahmpdrv_init(me, isot, ivegsrc, nlunit, pores, resid, + & errmsg, errflg) + use machine, only: kind_phys use set_soilveg_mod, only: set_soilveg + use namelist_soilveg implicit none integer, intent(in) :: me, isot, ivegsrc, nlunit + + real (kind=kind_phys), dimension(:), intent(out) :: pores, resid + character(len=*), intent(out) :: errmsg integer, intent(out) :: errflg @@ -55,6 +60,9 @@ subroutine noahmpdrv_init(me, isot, ivegsrc, nlunit, errmsg, & !--- initialize soil vegetation call set_soilveg(me, isot, ivegsrc, nlunit) + + pores (:) = maxsmc (:) + resid (:) = drysmc (:) end subroutine noahmpdrv_init diff --git a/physics/sfc_noahmp_drv.meta b/physics/sfc_noahmp_drv.meta index ecfd3e09f..32fc2f15a 100644 --- a/physics/sfc_noahmp_drv.meta +++ b/physics/sfc_noahmp_drv.meta @@ -39,6 +39,22 @@ type = integer intent = in optional = F +[pores] + standard_name = maximum_soil_moisture_content_for_land_surface_model + long_name = maximum soil moisture for a given soil type for land surface model + units = m + dimensions = (30) + type = real + intent = out + kind = kind_phys +[resid] + standard_name = minimum_soil_moisture_content_for_land_surface_model + long_name = minimum soil moisture for a given soil type for land surface model + units = m + dimensions = (30) + type = real + intent = out + kind = kind_phys [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP diff --git a/physics/shinhongvdif.F90 b/physics/shinhongvdif.F90 index 4032f1828..e0b775f1b 100644 --- a/physics/shinhongvdif.F90 +++ b/physics/shinhongvdif.F90 @@ -131,7 +131,7 @@ subroutine shinhongvdif_run(im,km,ux,vx,tx,qx,p2d,p2di,pi2d, & ttnp real(kind=kind_phys), dimension(im, km, ntrac ) , & intent(inout) :: qtnp - real(kind=kind_phys), dimension(im,km) , & + real(kind=kind_phys), dimension(:,:) , & intent(inout) :: du3dt_PBL, dv3dt_PBL, dt3dt_PBL, dq3dt_PBL, do3dt_PBL ! 2D in integer, dimension(im) , & diff --git a/physics/tracer_sanitizer.F90 b/physics/tracer_sanitizer.F90 deleted file mode 100644 index 668cf6edd..000000000 --- a/physics/tracer_sanitizer.F90 +++ /dev/null @@ -1,113 +0,0 @@ -module tracer_sanitizer - - use machine, only : kind_phys - - implicit none - - private - - public :: tracer_sanitizer_init, tracer_sanitizer_run, tracer_sanitizer_finalize - - real(kind=kind_phys), parameter :: zero = 0.0_kind_phys - real(kind=kind_phys), parameter :: qvmin = 1.0E-6_kind_phys - -contains - - subroutine tracer_sanitizer_init() - end subroutine tracer_sanitizer_init - -!> \section arg_table_tracer_sanitizer_run Argument Table -!! \htmlinclude tracer_sanitizer_run.html -!! - subroutine tracer_sanitizer_run(tracers, ntqv, ntcw, ntiw, ntrw, ntsw, ntgl, & - ntlnc, ntinc, ntrnc, ntsnc, ntgnc, errmsg, errflg) - - ! Interface variables - integer, intent(in ) :: ntqv, ntcw, ntiw, ntrw, ntsw, ntgl, & - ntlnc, ntinc, ntrnc, ntsnc, ntgnc - real(kind=kind_phys), intent(inout) :: tracers(:,:,:) - character(len=*), intent( out) :: errmsg - integer, intent( out) :: errflg - - ! Initialize CCPP error handling variables - errmsg = '' - errflg = 0 - - ! Water vapor specific humidity - if (ntqv>0) then - where (tracers(:,:,ntqv)0) then - where (tracers(:,:,ntcw)0) then - where (tracers(:,:,ntlnc)==zero) - tracers(:,:,ntlnc)=zero - end where - end if - end if - - ! Ice water - if (ntiw>0) then - where (tracers(:,:,ntiw)0) then - where (tracers(:,:,ntinc)==zero) - tracers(:,:,ntinc)=zero - end where - end if - end if - - ! Rain water - if (ntrw>0) then - where (tracers(:,:,ntrw)0) then - where (tracers(:,:,ntrnc)==zero) - tracers(:,:,ntrnc)=zero - end where - end if - end if - - ! Snow - if (ntsw>0) then - where (tracers(:,:,ntsw)0) then - where (tracers(:,:,ntsnc)==zero) - tracers(:,:,ntsnc)=zero - end where - end if - end if - - ! Graupel - if (ntgl>0) then - where (tracers(:,:,ntgl)0) then - where (tracers(:,:,ntgnc)==zero) - tracers(:,:,ntgnc)=zero - end where - end if - end if - - end subroutine tracer_sanitizer_run - - subroutine tracer_sanitizer_finalize() - end subroutine tracer_sanitizer_finalize - -end module tracer_sanitizer \ No newline at end of file diff --git a/physics/tracer_sanitizer.meta b/physics/tracer_sanitizer.meta deleted file mode 100644 index e41d5d03d..000000000 --- a/physics/tracer_sanitizer.meta +++ /dev/null @@ -1,124 +0,0 @@ -[ccpp-table-properties] - name = tracer_sanitizer - type = scheme - dependencies = machine.F - -######################################################################## - -[ccpp-arg-table] - name = tracer_sanitizer_run - type = scheme -[tracers] - standard_name = tracer_concentration_updated_by_physics - long_name = tracer concentration updated by physics - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension,number_of_tracers) - type = real - kind = kind_phys - intent = inout - optional = F -[ntqv] - standard_name = index_for_water_vapor - long_name = tracer index for water vapor (specific humidity) - units = index - dimensions = () - type = integer - intent = in - optional = F -[ntcw] - standard_name = index_for_liquid_cloud_condensate - long_name = tracer index for cloud condensate (or liquid water) - units = index - dimensions = () - type = integer - intent = in - optional = F -[ntiw] - standard_name = index_for_ice_cloud_condensate - long_name = tracer index for ice water - units = index - dimensions = () - type = integer - intent = in - optional = F -[ntrw] - standard_name = index_for_rain_water - long_name = tracer index for rain water - units = index - dimensions = () - type = integer - intent = in - optional = F -[ntsw] - standard_name = index_for_snow_water - long_name = tracer index for snow water - units = index - dimensions = () - type = integer - intent = in - optional = F -[ntgl] - standard_name = index_for_graupel - long_name = tracer index for graupel - units = index - dimensions = () - type = integer - intent = in - optional = F -[ntlnc] - standard_name = index_for_liquid_cloud_number_concentration - long_name = tracer index for liquid number concentration - units = index - dimensions = () - type = integer - intent = in - optional = F -[ntinc] - standard_name = index_for_ice_cloud_number_concentration - long_name = tracer index for ice number concentration - units = index - dimensions = () - type = integer - intent = in - optional = F -[ntrnc] - standard_name = index_for_rain_number_concentration - long_name = tracer index for rain number concentration - units = index - dimensions = () - type = integer - intent = in - optional = F -[ntsnc] - standard_name = index_for_snow_number_concentration - long_name = tracer index for snow number concentration - units = index - dimensions = () - type = integer - intent = in - optional = F -[ntgnc] - standard_name = index_for_graupel_number_concentration - long_name = tracer index for graupel number concentration - units = index - dimensions = () - type = integer - intent = in - optional = F -[errmsg] - standard_name = ccpp_error_message - long_name = error message for error handling in CCPP - units = none - dimensions = () - type = character - kind = len=* - intent = out - optional = F -[errflg] - standard_name = ccpp_error_flag - long_name = error flag for error handling in CCPP - units = flag - dimensions = () - type = integer - intent = out - optional = F diff --git a/physics/ysuvdif.F90 b/physics/ysuvdif.F90 index 75c0b31d3..aa2980992 100644 --- a/physics/ysuvdif.F90 +++ b/physics/ysuvdif.F90 @@ -88,7 +88,7 @@ subroutine ysuvdif_run(im,km,ux,vx,tx,qx,p2d,p2di,pi2d, & intent(inout) :: utnp,vtnp,ttnp real(kind=kind_phys), dimension( im,km,ntrac ) , & intent(inout) :: qtnp - real(kind=kind_phys), dimension(im,km) , & + real(kind=kind_phys), dimension(:,:) , & intent(inout) :: du3dt_PBL, dv3dt_PBL, dt3dt_PBL, dq3dt_PBL, do3dt_PBL ! !---------------------------------------------------------------------------------