diff --git a/CODEOWNERS b/CODEOWNERS index 0d5230f89..b6c597371 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -3,7 +3,7 @@ # These owners will be the default owners for everything in the repo. #* @defunkt -* @climbfuji @llpcarson @grantfirl @JulieSchramm +* @DomHeinzeller # Order is important. The last matching pattern has the most precedence. # So if a pull request only touches javascript files, only these owners diff --git a/physics/GFS_debug.F90 b/physics/GFS_debug.F90 index 4680f8de7..cbb1765f0 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, '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%zs', Sfcprop%zs) - 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) diff --git a/physics/GFS_phys_time_vary.fv3.F90 b/physics/GFS_phys_time_vary.fv3.F90 index 3c894b777..d547eb308 100644 --- a/physics/GFS_phys_time_vary.fv3.F90 +++ b/physics/GFS_phys_time_vary.fv3.F90 @@ -519,6 +519,7 @@ subroutine GFS_phys_time_vary_run (Data, Model, nthrds, first_time_step, errmsg, endif enddo enddo + ! DH* 20201104: don't forget snocvr_ice for RUC LSM (see FV3GFS_io.F90) endif endif #endif diff --git a/physics/GFS_phys_time_vary.scm.F90 b/physics/GFS_phys_time_vary.scm.F90 index 5fcc9ed84..ece9d5ee9 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 6cbf35f03..d3d17213f 100644 --- a/physics/GFS_surface_composites.F90 +++ b/physics/GFS_surface_composites.F90 @@ -606,7 +606,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..717024e41 100644 --- a/physics/module_MYNNSFC_wrapper.F90 +++ b/physics/module_MYNNSFC_wrapper.F90 @@ -30,7 +30,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 +54,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 +123,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 +161,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 +174,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 +218,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..964d3ed93 100644 --- a/physics/module_MYNNSFC_wrapper.meta +++ b/physics/module_MYNNSFC_wrapper.meta @@ -63,6 +63,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 +721,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..76fa24866 100644 --- a/physics/module_sf_mynn.F90 +++ b/physics/module_sf_mynn.F90 @@ -149,7 +149,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 +351,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 +367,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 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_ruc.F90 b/physics/sfc_drv_ruc.F90 index f6be851b1..c3ad85a9e 100644 --- a/physics/sfc_drv_ruc.F90 +++ b/physics/sfc_drv_ruc.F90 @@ -140,7 +140,6 @@ subroutine lsm_ruc_init (me, master, isot, ivegsrc, nlunit, & 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 +156,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 +200,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 +215,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 +258,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 +302,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 +312,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 +339,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 +439,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 +462,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 +487,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 +516,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 +537,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 +556,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 +617,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 +652,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 +680,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 +689,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 +713,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 +806,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 +850,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 +941,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 +1003,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 +1024,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 +1054,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 +1097,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 - endif ! end if_flag_iter_and_flag_block + 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. + + 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 +1296,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..0aad3157d 100644 --- a/physics/sfc_drv_ruc.meta +++ b/physics/sfc_drv_ruc.meta @@ -331,6 +331,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 +364,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 +428,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 +465,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 +506,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 +533,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 +542,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 +674,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 +715,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) + dimensions = (horizontal_loop_extent) 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) +[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 -[slc] - standard_name = volume_fraction_of_unfrozen_soil_moisture - long_name = liquid soil moisture - units = frac - dimensions = (horizontal_loop_extent,soil_vertical_dimension) +[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 = real kind = kind_phys - intent = inout + intent = in optional = F -[lsm_ruc] - standard_name = flag_for_ruc_land_surface_scheme - long_name = flag for RUC 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 -[lsm] - standard_name = flag_for_land_surface_scheme - long_name = flag for land surface model - units = flag +[con_rv] + standard_name = gas_constant_water_vapor + long_name = ideal gas constant for water vapor + 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_g] + standard_name = gravitational_acceleration + long_name = gravitational acceleration + units = m s-2 + 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_pi] + standard_name = pi + long_name = ratio of a circle's circumference to its diameter + units = none + 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_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 = 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 - 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 +852,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 +861,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 +870,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 +915,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 +978,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 +987,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 +1005,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 +1032,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 +1041,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 +1050,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 +1059,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 +1086,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 +1131,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 +1149,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 +1370,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