From e774c1120d9d512a8e27303a06a962bd6c579e7d Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Mon, 18 Sep 2017 20:03:05 +0000 Subject: [PATCH 01/16] Enclose contents of sfc_nst.f in a module. Replace sfc_nst with sfc_nst_run. Add empty sfc_nst_init and sfc_nst_finalize. Add parseable table of sfc_nst argument descriptions. Split nstf_name argument into: nstf_name1, nstf_name4, nstf_name5. Modify call to sfc_nst in GFS_physics_driver.F90 to call sfc_nst_run. Code passes basic canned correctness tests. --- GFS_layer/GFS_physics_driver.F90 | 30 ++++---- physics/sfc_nst.f | 121 +++++++++++++++++++++++++------ 2 files changed, 113 insertions(+), 38 deletions(-) diff --git a/GFS_layer/GFS_physics_driver.F90 b/GFS_layer/GFS_physics_driver.F90 index 9b92e4764..92bd69101 100644 --- a/GFS_layer/GFS_physics_driver.F90 +++ b/GFS_layer/GFS_physics_driver.F90 @@ -10,6 +10,7 @@ module module_physics_driver use h2o_def, only: levh2o, h2o_coeff, h2o_pres use gfs_fv3_needs, only: get_prs_fv3, get_phi_fv3 use module_nst_water_prop, only: get_dtzm_2d + use sfc_nst, only: sfc_nst_run use GFS_typedefs, only: GFS_statein_type, GFS_stateout_type, & GFS_sfcprop_type, GFS_coupling_type, & GFS_control_type, GFS_grid_type, & @@ -893,22 +894,23 @@ subroutine GFS_physics_driver & endif enddo - call sfc_nst (im, Model%lsoil, Statein%pgr, Statein%ugrs, & - Statein%vgrs, Statein%tgrs, Statein%qgrs, & - Sfcprop%tref, cd, cdq, Statein%prsl(1,1), work3, & - islmsk, Grid%xlon, Grid%sinlat, stress, & - Radtend%semis, gabsbdlw, adjsfcnsw, Sfcprop%tprcp, & - dtf, kdt, Model%solhr, xcosz, & - Tbd%phy_f2d(1,Model%num_p2d), flag_iter, & - flag_guess, Model%nstf_name, lprnt, ipr, & + call sfc_nst_run (im, Model%lsoil, Statein%pgr, Statein%ugrs, & + Statein%vgrs, Statein%tgrs, Statein%qgrs, & + Sfcprop%tref, cd, cdq, Statein%prsl(:,1), work3, & + islmsk, Grid%xlon, Grid%sinlat, stress, & + Radtend%semis, gabsbdlw, adjsfcnsw, Sfcprop%tprcp, & + dtf, kdt, Model%solhr, xcosz, & + Tbd%phy_f2d(:,Model%num_p2d), flag_iter, & + flag_guess, Model%nstf_name(1), Model%nstf_name(4),& + Model%nstf_name(5), lprnt, ipr, & ! --- Input/output - tseal, tsurf, Sfcprop%xt, Sfcprop%xs, Sfcprop%xu, & - Sfcprop%xv, Sfcprop%xz, Sfcprop%zm, Sfcprop%xtts, & - Sfcprop%xzts, Sfcprop%dt_cool, Sfcprop%z_c, & - Sfcprop%c_0, Sfcprop%c_d, Sfcprop%w_0, Sfcprop%w_d,& - Sfcprop%d_conv, Sfcprop%ifd, Sfcprop%qrain, & + tseal, tsurf, Sfcprop%xt, Sfcprop%xs, Sfcprop%xu, & + Sfcprop%xv, Sfcprop%xz, Sfcprop%zm, Sfcprop%xtts, & + Sfcprop%xzts, Sfcprop%dt_cool, Sfcprop%z_c, & + Sfcprop%c_0, Sfcprop%c_d, Sfcprop%w_0, Sfcprop%w_d,& + Sfcprop%d_conv, Sfcprop%ifd, Sfcprop%qrain, & ! --- outputs: - qss, gflx, Diag%cmm, Diag%chh, evap, hflx, ep1d) + qss, gflx, Diag%cmm, Diag%chh, evap, hflx, ep1d) ! if (lprnt) print *,' tseaz2=',tseal(ipr),' tref=',tref(ipr), ! & ' dt_cool=',dt_cool(ipr),' dt_warm=',2.0*xt(ipr)/xz(ipr), diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index 9155172d4..88f424598 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -1,19 +1,93 @@ + module sfc_nst - subroutine sfc_nst & + contains + + subroutine sfc_nst_init + + end + + subroutine sfc_nst_finalize + + end + + subroutine sfc_nst_run & !................................... ! --- inputs: & ( im, km, ps, u1, v1, t1, q1, tref, cm, ch, & & prsl1, prslki, islimsk, xlon, sinlat, stress, & & sfcemis, dlwflx, sfcnsw, rain, timestep, kdt, solhr,xcosz, & - & ddvel, flag_iter, flag_guess, nstf_name, & - & lprnt, ipr, & + & ddvel, flag_iter, flag_guess, nstf_name1, nstf_name4, & + & nstf_name5, lprnt, ipr, & ! --- input/output & tskin, tsurf, xt, xs, xu, xv, xz, zm, xtts, xzts, dt_cool, & & z_c, c_0, c_d, w_0, w_d, d_conv, ifd, qrain, & ! --- outputs: & qsurf, gflux, cmm, chh, evap, hflx, ep & & ) -! + +!!| local var name | longname | description | units | rank | type | kind | intent | optional | +!!|----------------|-------------------------------------------------------------|----------------------------------------------- |------------|------|---------|-----------|--------|----------| +!!| im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F | +!!| km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | +!!| ps | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | +!!| u1 | surface_x_wind | x component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | +!!| v1 | surface_y_wind | y component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | +!!| t1 | surface_temperature | surface layer mean temperature | K | 1 | real | kind_phys | in | F | +!!| q1 | surface_specific_humidity | surface layer mean specific humidity | kg kg-1 | 1 | real | kind_phys | in | F | +!!! tref ! sea_surface_foundation_temperature ! reference/foundation temperature ! K ! 1 ! real ! kind_phys ! in ! F ! +!!| cm | surface_drag_coefficient_for_momentum_in_air | surface exchange coeff for momentum | none | 1 | real | kind_phys | in | F | +!!| ch | surface_drag_coefficient_for_heat_and_moisture_in_air | surface exchange coeff heat & moisture | none | 1 | real | kind_phys | in | F | +!!| prsl1 | air_pressure_at_first_model_layer | Model layer 1 mean pressure | Pa | 1 | real | kind_phys | in | F | +!!| prslki | dimensionless_exner_function_at_first_model_layer | Exner function at 1st layer | ratio | 1 | real | kind_phys | in | F | +!!| islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | +!!! xlon ! longitude ! longitude | radians ! 1 ! real ! kind_phys ! in ! F ! +!!! sinlat ! sin_of_latitude ! sin of latitude ! none ! 1 ! real ! kind_phys ! in ! F ! +!!| stress | surface_wind_stress | surface wind stress | m2 s-2 | 1 | real | kind_phys | in | F | +!!| sfcemis | surface_longwave_emissivity | surface longwave emissivity | frac | 1 | real | kind_phys | in | F | +!!| dlwflx | surface_downwelling_longwave_flux | total sky surface downward longwave flux | W m-2 | 1 | real | kind_phys | in | F | +!!! sfcnsw ! net_downward_shortwave_flux_at_sea_water_surface ! total sky sfc netsw flx into ocean ! W m-2 ! 1 ! real ! kind_phys ! in ! F ! +!!! rain ! rainfall_flux ! rainfall rate ! kg m-2 s-1 ! 1 ! real ! kind_phys ! in ! F ! +!!! timestep ! timestep ! timestep interval ! s ! 0 ! real ! kind_phys ! in ! F ! +!!! kdt ! index_of_time_step ! time step counter ! count ! 0 ! integer ! ! in ! F ! +!!! solhr ! forecast_hour ! fcst hour at the end of prev time step ! none ! 0 ! real ! kind_phys ! in ! F ! +!!! xcosz ! cosine_of_solar_zenith_angle ! cosine of solar zenith angle ! none ! 1 ! real ! kind_phys ! in ! F ! +!!| ddvel | surface_wind_enhancement_due_to_convection | surface wind enhancement due to convection | m s-1 | 1 | real | kind_phys | in | F | +!!| flag_iter | flag_for_iteration | flag for iteration | flag | 1 | logical | | in | F | +!!| flag_guess | flag_for_guess_run | flag for guess run | flag | 1 | logical | | in | F | +!!! nstf_name1 ! flag_for_nsstm_run ! NSSTM flag: off/uncoupled/coupled=0/1/2 ! flag ! 1 ! integer ! ! in ! F ! +!!! nstf_name4 ! vertical_temperature_average_range_lower_bound ! zsea1 ! mm ! 1 ! integer ! ! in ! F ! +!!! nstf_name5 ! vertical_temperature_average_range_upper_bound ! zsea2 ! mm ! 1 ! integer ! ! in ! F ! +!!| lprnt | flag_print | flag for printing diagnostics to output | flag | 0 | logical | | in | F | +!!| ipr | horizontal_index_of_printed_column | horizontal index of printed column | index | 0 | integer | | in | F | +!!| tskin | surface_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | inout | F | +!!| tsurf | surface_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | +!!! xt ! diurnal thermocline layer_heat_content ! heat content in diurnal thermocline layer ! K m ! 1 ! real ! kind_phys | inout | F | +!!! xs ! sea_water_salinity ! salinity content in diurnal thermocline layer ! ppt m ! 1 ! real ! kind_phys | inout | F | +!!! xu ! diurnal_thermocline_layer_x_current ! u-current content in diurnal thermocline layer ! m2 s-1 ! 1 ! real ! kind_phys | inout | F | +!!! xv ! diurnal_thermocline_layer_y_current ! v-current content in diurnal thermocline layer ! m2 s-1 ! 1 ! real ! kind_phys | inout | F | +!!! xz ! diurnal_thermocline_layer_thickness ! diurnal thermocline layer thickness ! m ! 1 ! real ! kind_phys | inout | F | +!!! zm ! ocean_mixed_layer_thickness ! mixed layer thickness ! m ! 1 ! real ! kind_phys | inout | F | +!!! xtts ! sensitivity_of_dtl_heat_content_to_surface_temperature ! d(xt)/d(ts) ! m ! 1 ! real ! kind_phys | inout | F | +!!! xzts ! sensitivity_of_dtl_thickness_to_surface_temperature ! d(xz)/d(ts) ! m K-1 ! 1 ! real ! kind_phys | inout | F | +!!! dt_cool ! sub-layer_cooling_amount ! sub-layer cooling amount ! K ! 1 ! real ! kind_phys | inout | F | +!!! z_c ! sub-layer_cooling_thickness ! sub-layer cooling thickness ! m ! 1 ! real ! kind_phys | inout | F | +!!! c_0 ! coefficient ! coefficient1 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!! c_d ! coefficient ! coefficient2 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!! w_0 ! coefficient ! coefficient3 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!! w_d ! coefficient ! coefficient4 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!! d_conv ! free_convection_layer_thickness ! thickness of free convection layer ! m ! 1 ! real ! kind_phys | inout | F | +!!! ifd ! index_of_dtlm_start ! index to start dtlm run or not ! index ! 1 ! real ! kind_phys | inout | F | +!!! qrain ! sensible_heat_flux_due_to_rainfall ! sensible heat flux due to rainfall ! W ! 1 ! real ! kind_phys | inout | F | +!!| qsurf | surface_specific_humidity | surface specific humidity | kg kg-1 | 1 | real | kind_phys | out | F | +!!| gflux | upward_heat_flux_in_soil | upward soil heat flux | W m-2 | 1 | real | kind_phys | out | F | +!!| cmm | surface_drag_wind_speed_for_momentum_in_air | surf mom exch coef time mean surf wind | m s-1 | 1 | real | kind_phys | out | F | +!!| chh | surface_drag_mass_flux_for_heat_and_moisture_in_air | surf h&m exch coef time surf wind & density | kg m-2 s-1 | 1 | real | kind_phys | out | F | +!!| evap | surface_upward_latent_heat_flux | surface upward latent heat flux | W m-2 | 1 | real | kind_phys | out | F | +!!| hflx | surface_upward_sensible_heat_flux | surface upward sensible heat flux | W m-2 | 1 | real | kind_phys | out | F | +!!| ep | surface_upward_potential_latent_heat_flux | surface upward potential latent heat flux | W m-2 | 1 | real | kind_phys | out | F | + + + ! ===================================================================== ! ! description: ! ! ! @@ -25,8 +99,8 @@ subroutine sfc_nst & ! ( im, km, ps, u1, v1, t1, q1, tref, cm, ch, ! ! prsl1, prslki, islimsk, xlon, sinlat, stress, ! ! sfcemis, dlwflx, sfcnsw, rain, timestep, kdt,solhr,xcosz, ! -! ddvel, flag_iter, flag_guess, nstf_name, ! -! lprnt, ipr, ! +! ddvel, flag_iter, flag_guess, nstf_name1, nstf_name4, ! +! nstf_name5, lprnt, ipr, ! ! input/outputs: ! ! tskin, tsurf, xt, xs, xu, xv, xz, zm, xtts, xzts, dt_cool, ! ! z_c, c_0, c_d, w_0, w_d, d_conv, ifd, qrain, ! @@ -84,20 +158,16 @@ subroutine sfc_nst & ! flag_iter- logical, execution or not im ! ! when iter = 1, flag_iter = .true. for all grids im ! ! when iter = 2, flag_iter = .true. when wind < 2 im ! -! for both land and ocean (when nstf_name(1) > 0) im ! +! for both land and ocean (when nstf_name1 > 0) im ! ! flag_guess-logical, .true.= guess step to get CD et al im ! ! when iter = 1, flag_guess = .true. when wind < 2 im ! ! when iter = 2, flag_guess = .false. for all grids im ! -! nstf_name -integer array, NSST related flag parameters 1 ! -! nstf_name(1) : 0 = NSSTM off 1 ! -! 1 = NSSTM on but uncoupled 1 ! -! 2 = NSSTM on and coupled 1 ! -! nstf_name(2) : 1 = NSSTM spin up on 1 ! -! 0 = NSSTM spin up off 1 ! -! nstf_name(3) : 1 = NSST analysis on 1 ! -! 0 = NSSTM analysis off 1 ! -! nstf_name(4) : zsea1 in mm 1 ! -! nstf_name(5) : zsea2 in mm 1 ! +! nstf_name - integers , NSST related flag parameters 1 ! +! nstf_name1 : 0 = NSSTM off 1 ! +! 1 = NSSTM on but uncoupled 1 ! +! 2 = NSSTM on and coupled 1 ! +! nstf_name4 : zsea1 in mm 1 ! +! nstf_name5 : zsea2 in mm 1 ! ! lprnt - logical, control flag for check print out 1 ! ! ipr - integer, grid index for check print out 1 ! ! ! @@ -164,7 +234,8 @@ subroutine sfc_nst & ! --- inputs: - integer, intent(in) :: im, km, kdt, ipr,nstf_name(5) + integer, intent(in) :: im, km, kdt, ipr, nstf_name1, nstf_name4, & + & nstf_name5 real (kind=kind_phys), dimension(im), intent(in) :: ps, u1, v1, & & t1, q1, tref, cm, ch, prsl1, prslki, xlon,xcosz, & & sinlat, stress, sfcemis, dlwflx, sfcnsw, rain, ddvel @@ -293,8 +364,8 @@ subroutine sfc_nst & ! run nst model: dtm + slm ! - zsea1 = 0.001*real(nstf_name(4)) - zsea2 = 0.001*real(nstf_name(5)) + zsea1 = 0.001*real(nstf_name4) + zsea2 = 0.001*real(nstf_name5) do i = 1, im if ( flag(i) ) then tsea = tsurf(i) @@ -532,16 +603,16 @@ subroutine sfc_nst & ! update tskin when coupled and not guess run ! (all other NSST variables have been updated in this case) ! - if ( nstf_name(1) > 1 ) then + if ( nstf_name1 > 1 ) then tskin(i) = tsurf(i) - endif ! if ( nstf_name(1) > 1 then + endif ! if ( nstf_name1 > 1 then endif ! if(flag_guess(i)) then endif ! if((islimsk(i).eq. 0.) ) then enddo ! if (lprnt .and. i == ipr) print *,' beg xz8=',xz(i) - if ( nstf_name(1) > 1 ) then + if ( nstf_name1 > 1 ) then ! --- ... latent and sensible heat flux over open water with updated tskin ! for the grids of open water and the iteration is on do i = 1, im @@ -553,7 +624,7 @@ subroutine sfc_nst & hflx(i) = rch(i) * (tskin(i) - theta1(i)) endif enddo - endif ! if ( nstf_name(1) > 1 ) then + endif ! if ( nstf_name1 > 1 ) then ! do i=1,im @@ -568,3 +639,5 @@ subroutine sfc_nst & return end + + end module From 6636caf3f150726e03b3671dcb880d4693a096c2 Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Tue, 19 Sep 2017 15:07:52 +0000 Subject: [PATCH 02/16] Correct !!! by replacing with !!| --- physics/sfc_nst.f | 58 +++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index 88f424598..72363ded5 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -34,50 +34,50 @@ subroutine sfc_nst_run & !!| v1 | surface_y_wind | y component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | !!| t1 | surface_temperature | surface layer mean temperature | K | 1 | real | kind_phys | in | F | !!| q1 | surface_specific_humidity | surface layer mean specific humidity | kg kg-1 | 1 | real | kind_phys | in | F | -!!! tref ! sea_surface_foundation_temperature ! reference/foundation temperature ! K ! 1 ! real ! kind_phys ! in ! F ! +!!| tref ! sea_surface_foundation_temperature ! reference/foundation temperature ! K ! 1 ! real ! kind_phys ! in ! F ! !!| cm | surface_drag_coefficient_for_momentum_in_air | surface exchange coeff for momentum | none | 1 | real | kind_phys | in | F | !!| ch | surface_drag_coefficient_for_heat_and_moisture_in_air | surface exchange coeff heat & moisture | none | 1 | real | kind_phys | in | F | !!| prsl1 | air_pressure_at_first_model_layer | Model layer 1 mean pressure | Pa | 1 | real | kind_phys | in | F | !!| prslki | dimensionless_exner_function_at_first_model_layer | Exner function at 1st layer | ratio | 1 | real | kind_phys | in | F | !!| islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | -!!! xlon ! longitude ! longitude | radians ! 1 ! real ! kind_phys ! in ! F ! -!!! sinlat ! sin_of_latitude ! sin of latitude ! none ! 1 ! real ! kind_phys ! in ! F ! +!!| xlon ! longitude ! longitude | radians ! 1 ! real ! kind_phys ! in ! F ! +!!| sinlat ! sin_of_latitude ! sin of latitude ! none ! 1 ! real ! kind_phys ! in ! F ! !!| stress | surface_wind_stress | surface wind stress | m2 s-2 | 1 | real | kind_phys | in | F | !!| sfcemis | surface_longwave_emissivity | surface longwave emissivity | frac | 1 | real | kind_phys | in | F | !!| dlwflx | surface_downwelling_longwave_flux | total sky surface downward longwave flux | W m-2 | 1 | real | kind_phys | in | F | -!!! sfcnsw ! net_downward_shortwave_flux_at_sea_water_surface ! total sky sfc netsw flx into ocean ! W m-2 ! 1 ! real ! kind_phys ! in ! F ! -!!! rain ! rainfall_flux ! rainfall rate ! kg m-2 s-1 ! 1 ! real ! kind_phys ! in ! F ! -!!! timestep ! timestep ! timestep interval ! s ! 0 ! real ! kind_phys ! in ! F ! -!!! kdt ! index_of_time_step ! time step counter ! count ! 0 ! integer ! ! in ! F ! -!!! solhr ! forecast_hour ! fcst hour at the end of prev time step ! none ! 0 ! real ! kind_phys ! in ! F ! -!!! xcosz ! cosine_of_solar_zenith_angle ! cosine of solar zenith angle ! none ! 1 ! real ! kind_phys ! in ! F ! +!!| sfcnsw ! net_downward_shortwave_flux_at_sea_water_surface ! total sky sfc netsw flx into ocean ! W m-2 ! 1 ! real ! kind_phys ! in ! F ! +!!| rain ! rainfall_flux ! rainfall rate ! kg m-2 s-1 ! 1 ! real ! kind_phys ! in ! F ! +!!| timestep ! timestep ! timestep interval ! s ! 0 ! real ! kind_phys ! in ! F ! +!!| kdt ! index_of_time_step ! time step counter ! count ! 0 ! integer ! ! in ! F ! +!!| solhr ! forecast_hour ! fcst hour at the end of prev time step ! none ! 0 ! real ! kind_phys ! in ! F ! +!!| xcosz ! cosine_of_solar_zenith_angle ! cosine of solar zenith angle ! none ! 1 ! real ! kind_phys ! in ! F ! !!| ddvel | surface_wind_enhancement_due_to_convection | surface wind enhancement due to convection | m s-1 | 1 | real | kind_phys | in | F | !!| flag_iter | flag_for_iteration | flag for iteration | flag | 1 | logical | | in | F | !!| flag_guess | flag_for_guess_run | flag for guess run | flag | 1 | logical | | in | F | -!!! nstf_name1 ! flag_for_nsstm_run ! NSSTM flag: off/uncoupled/coupled=0/1/2 ! flag ! 1 ! integer ! ! in ! F ! -!!! nstf_name4 ! vertical_temperature_average_range_lower_bound ! zsea1 ! mm ! 1 ! integer ! ! in ! F ! -!!! nstf_name5 ! vertical_temperature_average_range_upper_bound ! zsea2 ! mm ! 1 ! integer ! ! in ! F ! +!!| nstf_name1 ! flag_for_nsstm_run ! NSSTM flag: off/uncoupled/coupled=0/1/2 ! flag ! 1 ! integer ! ! in ! F ! +!!| nstf_name4 ! vertical_temperature_average_range_lower_bound ! zsea1 ! mm ! 1 ! integer ! ! in ! F ! +!!| nstf_name5 ! vertical_temperature_average_range_upper_bound ! zsea2 ! mm ! 1 ! integer ! ! in ! F ! !!| lprnt | flag_print | flag for printing diagnostics to output | flag | 0 | logical | | in | F | !!| ipr | horizontal_index_of_printed_column | horizontal index of printed column | index | 0 | integer | | in | F | !!| tskin | surface_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | inout | F | !!| tsurf | surface_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | -!!! xt ! diurnal thermocline layer_heat_content ! heat content in diurnal thermocline layer ! K m ! 1 ! real ! kind_phys | inout | F | -!!! xs ! sea_water_salinity ! salinity content in diurnal thermocline layer ! ppt m ! 1 ! real ! kind_phys | inout | F | -!!! xu ! diurnal_thermocline_layer_x_current ! u-current content in diurnal thermocline layer ! m2 s-1 ! 1 ! real ! kind_phys | inout | F | -!!! xv ! diurnal_thermocline_layer_y_current ! v-current content in diurnal thermocline layer ! m2 s-1 ! 1 ! real ! kind_phys | inout | F | -!!! xz ! diurnal_thermocline_layer_thickness ! diurnal thermocline layer thickness ! m ! 1 ! real ! kind_phys | inout | F | -!!! zm ! ocean_mixed_layer_thickness ! mixed layer thickness ! m ! 1 ! real ! kind_phys | inout | F | -!!! xtts ! sensitivity_of_dtl_heat_content_to_surface_temperature ! d(xt)/d(ts) ! m ! 1 ! real ! kind_phys | inout | F | -!!! xzts ! sensitivity_of_dtl_thickness_to_surface_temperature ! d(xz)/d(ts) ! m K-1 ! 1 ! real ! kind_phys | inout | F | -!!! dt_cool ! sub-layer_cooling_amount ! sub-layer cooling amount ! K ! 1 ! real ! kind_phys | inout | F | -!!! z_c ! sub-layer_cooling_thickness ! sub-layer cooling thickness ! m ! 1 ! real ! kind_phys | inout | F | -!!! c_0 ! coefficient ! coefficient1 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | -!!! c_d ! coefficient ! coefficient2 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | -!!! w_0 ! coefficient ! coefficient3 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | -!!! w_d ! coefficient ! coefficient4 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | -!!! d_conv ! free_convection_layer_thickness ! thickness of free convection layer ! m ! 1 ! real ! kind_phys | inout | F | -!!! ifd ! index_of_dtlm_start ! index to start dtlm run or not ! index ! 1 ! real ! kind_phys | inout | F | -!!! qrain ! sensible_heat_flux_due_to_rainfall ! sensible heat flux due to rainfall ! W ! 1 ! real ! kind_phys | inout | F | +!!| xt ! diurnal thermocline layer_heat_content ! heat content in diurnal thermocline layer ! K m ! 1 ! real ! kind_phys | inout | F | +!!| xs ! sea_water_salinity ! salinity content in diurnal thermocline layer ! ppt m ! 1 ! real ! kind_phys | inout | F | +!!| xu ! diurnal_thermocline_layer_x_current ! u-current content in diurnal thermocline layer ! m2 s-1 ! 1 ! real ! kind_phys | inout | F | +!!| xv ! diurnal_thermocline_layer_y_current ! v-current content in diurnal thermocline layer ! m2 s-1 ! 1 ! real ! kind_phys | inout | F | +!!| xz ! diurnal_thermocline_layer_thickness ! diurnal thermocline layer thickness ! m ! 1 ! real ! kind_phys | inout | F | +!!| zm ! ocean_mixed_layer_thickness ! mixed layer thickness ! m ! 1 ! real ! kind_phys | inout | F | +!!| xtts ! sensitivity_of_dtl_heat_content_to_surface_temperature ! d(xt)/d(ts) ! m ! 1 ! real ! kind_phys | inout | F | +!!| xzts ! sensitivity_of_dtl_thickness_to_surface_temperature ! d(xz)/d(ts) ! m K-1 ! 1 ! real ! kind_phys | inout | F | +!!| dt_cool ! sub-layer_cooling_amount ! sub-layer cooling amount ! K ! 1 ! real ! kind_phys | inout | F | +!!| z_c ! sub-layer_cooling_thickness ! sub-layer cooling thickness ! m ! 1 ! real ! kind_phys | inout | F | +!!| c_0 ! coefficient ! coefficient1 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| c_d ! coefficient ! coefficient2 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| w_0 ! coefficient ! coefficient3 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| w_d ! coefficient ! coefficient4 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| d_conv ! free_convection_layer_thickness ! thickness of free convection layer ! m ! 1 ! real ! kind_phys | inout | F | +!!| ifd ! index_of_dtlm_start ! index to start dtlm run or not ! index ! 1 ! real ! kind_phys | inout | F | +!!| qrain ! sensible_heat_flux_due_to_rainfall ! sensible heat flux due to rainfall ! W ! 1 ! real ! kind_phys | inout | F | !!| qsurf | surface_specific_humidity | surface specific humidity | kg kg-1 | 1 | real | kind_phys | out | F | !!| gflux | upward_heat_flux_in_soil | upward soil heat flux | W m-2 | 1 | real | kind_phys | out | F | !!| cmm | surface_drag_wind_speed_for_momentum_in_air | surf mom exch coef time mean surf wind | m s-1 | 1 | real | kind_phys | out | F | From 4392e4e969bb7364f27f15afd83483ada37949b1 Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Tue, 19 Sep 2017 16:59:42 +0000 Subject: [PATCH 03/16] Update some table entries. --- physics/sfc_nst.f | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index 72363ded5..9fcec48b8 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -37,12 +37,12 @@ subroutine sfc_nst_run & !!| tref ! sea_surface_foundation_temperature ! reference/foundation temperature ! K ! 1 ! real ! kind_phys ! in ! F ! !!| cm | surface_drag_coefficient_for_momentum_in_air | surface exchange coeff for momentum | none | 1 | real | kind_phys | in | F | !!| ch | surface_drag_coefficient_for_heat_and_moisture_in_air | surface exchange coeff heat & moisture | none | 1 | real | kind_phys | in | F | -!!| prsl1 | air_pressure_at_first_model_layer | Model layer 1 mean pressure | Pa | 1 | real | kind_phys | in | F | +!!| prsl1 | air_pressure_at_first_model_layer | surface layer mean pressure | Pa | 1 | real | kind_phys | in | F | !!| prslki | dimensionless_exner_function_at_first_model_layer | Exner function at 1st layer | ratio | 1 | real | kind_phys | in | F | !!| islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | !!| xlon ! longitude ! longitude | radians ! 1 ! real ! kind_phys ! in ! F ! !!| sinlat ! sin_of_latitude ! sin of latitude ! none ! 1 ! real ! kind_phys ! in ! F ! -!!| stress | surface_wind_stress | surface wind stress | m2 s-2 | 1 | real | kind_phys | in | F | +!!| stress | surface_wind_stress | wind stress | m2 s-2 | 1 | real | kind_phys | in | F | !!| sfcemis | surface_longwave_emissivity | surface longwave emissivity | frac | 1 | real | kind_phys | in | F | !!| dlwflx | surface_downwelling_longwave_flux | total sky surface downward longwave flux | W m-2 | 1 | real | kind_phys | in | F | !!| sfcnsw ! net_downward_shortwave_flux_at_sea_water_surface ! total sky sfc netsw flx into ocean ! W m-2 ! 1 ! real ! kind_phys ! in ! F ! @@ -51,7 +51,7 @@ subroutine sfc_nst_run & !!| kdt ! index_of_time_step ! time step counter ! count ! 0 ! integer ! ! in ! F ! !!| solhr ! forecast_hour ! fcst hour at the end of prev time step ! none ! 0 ! real ! kind_phys ! in ! F ! !!| xcosz ! cosine_of_solar_zenith_angle ! cosine of solar zenith angle ! none ! 1 ! real ! kind_phys ! in ! F ! -!!| ddvel | surface_wind_enhancement_due_to_convection | surface wind enhancement due to convection | m s-1 | 1 | real | kind_phys | in | F | +!!| ddvel | surface_wind_enhancement_due_to_convection | wind enhancement due to convection | m s-1 | 1 | real | kind_phys | in | F | !!| flag_iter | flag_for_iteration | flag for iteration | flag | 1 | logical | | in | F | !!| flag_guess | flag_for_guess_run | flag for guess run | flag | 1 | logical | | in | F | !!| nstf_name1 ! flag_for_nsstm_run ! NSSTM flag: off/uncoupled/coupled=0/1/2 ! flag ! 1 ! integer ! ! in ! F ! @@ -71,20 +71,20 @@ subroutine sfc_nst_run & !!| xzts ! sensitivity_of_dtl_thickness_to_surface_temperature ! d(xz)/d(ts) ! m K-1 ! 1 ! real ! kind_phys | inout | F | !!| dt_cool ! sub-layer_cooling_amount ! sub-layer cooling amount ! K ! 1 ! real ! kind_phys | inout | F | !!| z_c ! sub-layer_cooling_thickness ! sub-layer cooling thickness ! m ! 1 ! real ! kind_phys | inout | F | -!!| c_0 ! coefficient ! coefficient1 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | -!!| c_d ! coefficient ! coefficient2 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | -!!| w_0 ! coefficient ! coefficient3 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | -!!| w_d ! coefficient ! coefficient4 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| c_0 ! coefficient_c_0 ! coefficient1 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| c_d ! coefficient_c_d ! coefficient2 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| w_0 ! coefficient_w_0 ! coefficient3 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| w_d ! coefficient_w_d ! coefficient4 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | !!| d_conv ! free_convection_layer_thickness ! thickness of free convection layer ! m ! 1 ! real ! kind_phys | inout | F | !!| ifd ! index_of_dtlm_start ! index to start dtlm run or not ! index ! 1 ! real ! kind_phys | inout | F | !!| qrain ! sensible_heat_flux_due_to_rainfall ! sensible heat flux due to rainfall ! W ! 1 ! real ! kind_phys | inout | F | -!!| qsurf | surface_specific_humidity | surface specific humidity | kg kg-1 | 1 | real | kind_phys | out | F | -!!| gflux | upward_heat_flux_in_soil | upward soil heat flux | W m-2 | 1 | real | kind_phys | out | F | +!!| qsurf | surface_specific_humidity | surface air saturation specific humidity | kg kg-1 | 1 | real | kind_phys | out | F | +!!| gflux | upward_heat_flux_in_soil | soil heat flux | W m-2 | 1 | real | kind_phys | out | F | !!| cmm | surface_drag_wind_speed_for_momentum_in_air | surf mom exch coef time mean surf wind | m s-1 | 1 | real | kind_phys | out | F | !!| chh | surface_drag_mass_flux_for_heat_and_moisture_in_air | surf h&m exch coef time surf wind & density | kg m-2 s-1 | 1 | real | kind_phys | out | F | -!!| evap | surface_upward_latent_heat_flux | surface upward latent heat flux | W m-2 | 1 | real | kind_phys | out | F | -!!| hflx | surface_upward_sensible_heat_flux | surface upward sensible heat flux | W m-2 | 1 | real | kind_phys | out | F | -!!| ep | surface_upward_potential_latent_heat_flux | surface upward potential latent heat flux | W m-2 | 1 | real | kind_phys | out | F | +!!| evap | surface_upward_latent_heat_flux | evaperation from latent heat flux | W m-2 | 1 | real | kind_phys | out | F | +!!| hflx | surface_upward_sensible_heat_flux | sensible heat flux | W m-2 | 1 | real | kind_phys | out | F | +!!| ep | surface_upward_potential_latent_heat_flux | potential evaporation | W m-2 | 1 | real | kind_phys | out | F | From 716760a5a858b38389f3d2dde356b9012af49d09 Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Fri, 29 Sep 2017 20:13:38 +0000 Subject: [PATCH 04/16] Update table --- physics/sfc_nst.f | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index 9fcec48b8..c56993ab9 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -45,8 +45,8 @@ subroutine sfc_nst_run & !!| stress | surface_wind_stress | wind stress | m2 s-2 | 1 | real | kind_phys | in | F | !!| sfcemis | surface_longwave_emissivity | surface longwave emissivity | frac | 1 | real | kind_phys | in | F | !!| dlwflx | surface_downwelling_longwave_flux | total sky surface downward longwave flux | W m-2 | 1 | real | kind_phys | in | F | -!!| sfcnsw ! net_downward_shortwave_flux_at_sea_water_surface ! total sky sfc netsw flx into ocean ! W m-2 ! 1 ! real ! kind_phys ! in ! F ! -!!| rain ! rainfall_flux ! rainfall rate ! kg m-2 s-1 ! 1 ! real ! kind_phys ! in ! F ! +!!| sfcnsw ! surface_net_downward_shortwave_flux ! total sky sfc netsw flx into ocean ! W m-2 ! 1 ! real ! kind_phys ! in ! F ! +!!| rain ! precipitation_amount_in_one_dynamics_time_step ! rainfall rate ! kg m-2 s-1 ! 1 ! real ! kind_phys ! in ! F ! !!| timestep ! timestep ! timestep interval ! s ! 0 ! real ! kind_phys ! in ! F ! !!| kdt ! index_of_time_step ! time step counter ! count ! 0 ! integer ! ! in ! F ! !!| solhr ! forecast_hour ! fcst hour at the end of prev time step ! none ! 0 ! real ! kind_phys ! in ! F ! @@ -60,7 +60,7 @@ subroutine sfc_nst_run & !!| lprnt | flag_print | flag for printing diagnostics to output | flag | 0 | logical | | in | F | !!| ipr | horizontal_index_of_printed_column | horizontal index of printed column | index | 0 | integer | | in | F | !!| tskin | surface_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | inout | F | -!!| tsurf | surface_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | +!!| tsurf | surface_skin_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | !!| xt ! diurnal thermocline layer_heat_content ! heat content in diurnal thermocline layer ! K m ! 1 ! real ! kind_phys | inout | F | !!| xs ! sea_water_salinity ! salinity content in diurnal thermocline layer ! ppt m ! 1 ! real ! kind_phys | inout | F | !!| xu ! diurnal_thermocline_layer_x_current ! u-current content in diurnal thermocline layer ! m2 s-1 ! 1 ! real ! kind_phys | inout | F | From 61b455e42ebf10668cb946578059c9d29123d44a Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Fri, 29 Sep 2017 20:50:21 +0000 Subject: [PATCH 05/16] Move argument table. --- physics/sfc_nst.f | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index c56993ab9..097f222a0 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -10,21 +10,7 @@ subroutine sfc_nst_finalize end - subroutine sfc_nst_run & -!................................... -! --- inputs: - & ( im, km, ps, u1, v1, t1, q1, tref, cm, ch, & - & prsl1, prslki, islimsk, xlon, sinlat, stress, & - & sfcemis, dlwflx, sfcnsw, rain, timestep, kdt, solhr,xcosz, & - & ddvel, flag_iter, flag_guess, nstf_name1, nstf_name4, & - & nstf_name5, lprnt, ipr, & -! --- input/output - & tskin, tsurf, xt, xs, xu, xv, xz, zm, xtts, xzts, dt_cool, & - & z_c, c_0, c_d, w_0, w_d, d_conv, ifd, qrain, & -! --- outputs: - & qsurf, gflux, cmm, chh, evap, hflx, ep & - & ) - +!!\section arg_table_sfc_nst_run !!| local var name | longname | description | units | rank | type | kind | intent | optional | !!|----------------|-------------------------------------------------------------|----------------------------------------------- |------------|------|---------|-----------|--------|----------| !!| im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F | @@ -85,8 +71,20 @@ subroutine sfc_nst_run & !!| evap | surface_upward_latent_heat_flux | evaperation from latent heat flux | W m-2 | 1 | real | kind_phys | out | F | !!| hflx | surface_upward_sensible_heat_flux | sensible heat flux | W m-2 | 1 | real | kind_phys | out | F | !!| ep | surface_upward_potential_latent_heat_flux | potential evaporation | W m-2 | 1 | real | kind_phys | out | F | - - + subroutine sfc_nst_run & +!................................... +! --- inputs: + & ( im, km, ps, u1, v1, t1, q1, tref, cm, ch, & + & prsl1, prslki, islimsk, xlon, sinlat, stress, & + & sfcemis, dlwflx, sfcnsw, rain, timestep, kdt, solhr,xcosz, & + & ddvel, flag_iter, flag_guess, nstf_name1, nstf_name4, & + & nstf_name5, lprnt, ipr, & +! --- input/output + & tskin, tsurf, xt, xs, xu, xv, xz, zm, xtts, xzts, dt_cool, & + & z_c, c_0, c_d, w_0, w_d, d_conv, ifd, qrain, & +! --- outputs: + & qsurf, gflux, cmm, chh, evap, hflx, ep & + & ) ! ===================================================================== ! ! description: ! From edf3e7274fd6f62ded58c5d58cda168d9bb71db9 Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Tue, 10 Oct 2017 15:36:19 +0000 Subject: [PATCH 06/16] Update long names in table. --- physics/sfc_nst.f | 121 +++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 60 deletions(-) diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index 097f222a0..a65ad6fbe 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -11,66 +11,67 @@ subroutine sfc_nst_finalize end !!\section arg_table_sfc_nst_run -!!| local var name | longname | description | units | rank | type | kind | intent | optional | -!!|----------------|-------------------------------------------------------------|----------------------------------------------- |------------|------|---------|-----------|--------|----------| -!!| im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F | -!!| km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | -!!| ps | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | -!!| u1 | surface_x_wind | x component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | -!!| v1 | surface_y_wind | y component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | -!!| t1 | surface_temperature | surface layer mean temperature | K | 1 | real | kind_phys | in | F | -!!| q1 | surface_specific_humidity | surface layer mean specific humidity | kg kg-1 | 1 | real | kind_phys | in | F | -!!| tref ! sea_surface_foundation_temperature ! reference/foundation temperature ! K ! 1 ! real ! kind_phys ! in ! F ! -!!| cm | surface_drag_coefficient_for_momentum_in_air | surface exchange coeff for momentum | none | 1 | real | kind_phys | in | F | -!!| ch | surface_drag_coefficient_for_heat_and_moisture_in_air | surface exchange coeff heat & moisture | none | 1 | real | kind_phys | in | F | -!!| prsl1 | air_pressure_at_first_model_layer | surface layer mean pressure | Pa | 1 | real | kind_phys | in | F | -!!| prslki | dimensionless_exner_function_at_first_model_layer | Exner function at 1st layer | ratio | 1 | real | kind_phys | in | F | -!!| islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | -!!| xlon ! longitude ! longitude | radians ! 1 ! real ! kind_phys ! in ! F ! -!!| sinlat ! sin_of_latitude ! sin of latitude ! none ! 1 ! real ! kind_phys ! in ! F ! -!!| stress | surface_wind_stress | wind stress | m2 s-2 | 1 | real | kind_phys | in | F | -!!| sfcemis | surface_longwave_emissivity | surface longwave emissivity | frac | 1 | real | kind_phys | in | F | -!!| dlwflx | surface_downwelling_longwave_flux | total sky surface downward longwave flux | W m-2 | 1 | real | kind_phys | in | F | -!!| sfcnsw ! surface_net_downward_shortwave_flux ! total sky sfc netsw flx into ocean ! W m-2 ! 1 ! real ! kind_phys ! in ! F ! -!!| rain ! precipitation_amount_in_one_dynamics_time_step ! rainfall rate ! kg m-2 s-1 ! 1 ! real ! kind_phys ! in ! F ! -!!| timestep ! timestep ! timestep interval ! s ! 0 ! real ! kind_phys ! in ! F ! -!!| kdt ! index_of_time_step ! time step counter ! count ! 0 ! integer ! ! in ! F ! -!!| solhr ! forecast_hour ! fcst hour at the end of prev time step ! none ! 0 ! real ! kind_phys ! in ! F ! -!!| xcosz ! cosine_of_solar_zenith_angle ! cosine of solar zenith angle ! none ! 1 ! real ! kind_phys ! in ! F ! -!!| ddvel | surface_wind_enhancement_due_to_convection | wind enhancement due to convection | m s-1 | 1 | real | kind_phys | in | F | -!!| flag_iter | flag_for_iteration | flag for iteration | flag | 1 | logical | | in | F | -!!| flag_guess | flag_for_guess_run | flag for guess run | flag | 1 | logical | | in | F | -!!| nstf_name1 ! flag_for_nsstm_run ! NSSTM flag: off/uncoupled/coupled=0/1/2 ! flag ! 1 ! integer ! ! in ! F ! -!!| nstf_name4 ! vertical_temperature_average_range_lower_bound ! zsea1 ! mm ! 1 ! integer ! ! in ! F ! -!!| nstf_name5 ! vertical_temperature_average_range_upper_bound ! zsea2 ! mm ! 1 ! integer ! ! in ! F ! -!!| lprnt | flag_print | flag for printing diagnostics to output | flag | 0 | logical | | in | F | -!!| ipr | horizontal_index_of_printed_column | horizontal index of printed column | index | 0 | integer | | in | F | -!!| tskin | surface_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | inout | F | -!!| tsurf | surface_skin_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | -!!| xt ! diurnal thermocline layer_heat_content ! heat content in diurnal thermocline layer ! K m ! 1 ! real ! kind_phys | inout | F | -!!| xs ! sea_water_salinity ! salinity content in diurnal thermocline layer ! ppt m ! 1 ! real ! kind_phys | inout | F | -!!| xu ! diurnal_thermocline_layer_x_current ! u-current content in diurnal thermocline layer ! m2 s-1 ! 1 ! real ! kind_phys | inout | F | -!!| xv ! diurnal_thermocline_layer_y_current ! v-current content in diurnal thermocline layer ! m2 s-1 ! 1 ! real ! kind_phys | inout | F | -!!| xz ! diurnal_thermocline_layer_thickness ! diurnal thermocline layer thickness ! m ! 1 ! real ! kind_phys | inout | F | -!!| zm ! ocean_mixed_layer_thickness ! mixed layer thickness ! m ! 1 ! real ! kind_phys | inout | F | -!!| xtts ! sensitivity_of_dtl_heat_content_to_surface_temperature ! d(xt)/d(ts) ! m ! 1 ! real ! kind_phys | inout | F | -!!| xzts ! sensitivity_of_dtl_thickness_to_surface_temperature ! d(xz)/d(ts) ! m K-1 ! 1 ! real ! kind_phys | inout | F | -!!| dt_cool ! sub-layer_cooling_amount ! sub-layer cooling amount ! K ! 1 ! real ! kind_phys | inout | F | -!!| z_c ! sub-layer_cooling_thickness ! sub-layer cooling thickness ! m ! 1 ! real ! kind_phys | inout | F | -!!| c_0 ! coefficient_c_0 ! coefficient1 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | -!!| c_d ! coefficient_c_d ! coefficient2 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | -!!| w_0 ! coefficient_w_0 ! coefficient3 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | -!!| w_d ! coefficient_w_d ! coefficient4 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | -!!| d_conv ! free_convection_layer_thickness ! thickness of free convection layer ! m ! 1 ! real ! kind_phys | inout | F | -!!| ifd ! index_of_dtlm_start ! index to start dtlm run or not ! index ! 1 ! real ! kind_phys | inout | F | -!!| qrain ! sensible_heat_flux_due_to_rainfall ! sensible heat flux due to rainfall ! W ! 1 ! real ! kind_phys | inout | F | -!!| qsurf | surface_specific_humidity | surface air saturation specific humidity | kg kg-1 | 1 | real | kind_phys | out | F | -!!| gflux | upward_heat_flux_in_soil | soil heat flux | W m-2 | 1 | real | kind_phys | out | F | -!!| cmm | surface_drag_wind_speed_for_momentum_in_air | surf mom exch coef time mean surf wind | m s-1 | 1 | real | kind_phys | out | F | -!!| chh | surface_drag_mass_flux_for_heat_and_moisture_in_air | surf h&m exch coef time surf wind & density | kg m-2 s-1 | 1 | real | kind_phys | out | F | -!!| evap | surface_upward_latent_heat_flux | evaperation from latent heat flux | W m-2 | 1 | real | kind_phys | out | F | -!!| hflx | surface_upward_sensible_heat_flux | sensible heat flux | W m-2 | 1 | real | kind_phys | out | F | -!!| ep | surface_upward_potential_latent_heat_flux | potential evaporation | W m-2 | 1 | real | kind_phys | out | F | +!!| local var name | longname | description | units | rank | type | kind | intent | optional | +!!|----------------|------------------------------------------------------------------------------|----------------------------------------------- |------------|------|---------|-----------|--------|----------| +!!| im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F | +!!| km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | +!!| ps | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | +!!| u1 | x_wind_at_lowest_model_layer | x component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | +!!| v1 | y_wind_at_lowest_model_layer | y component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | +!!| t1 | air_temperature_at_lowest_model_layer | surface layer mean temperature | K | 1 | real | kind_phys | in | F | +!!| q1 | specific_humidity_at_lowest_model_layer | surface layer mean specific humidity | kg kg-1 | 1 | real | kind_phys | in | F | +!!| tref ! sea_surface_foundation_temperature ! reference/foundation temperature ! K ! 1 ! real ! kind_phys ! in ! F ! +!!| cm | surface_drag_coefficient_for_momentum_in_air | surface exchange coeff for momentum | none | 1 | real | kind_phys | in | F | +!!| ch | surface_drag_coefficient_for_heat_and_moisture_in_air | surface exchange coeff heat & moisture | none | 1 | real | kind_phys | in | F | +!!| prsl1 | air_pressure_at_lowest_model_layer | surface layer mean pressure | Pa | 1 | real | kind_phys | in | F | +!!| prslki | ratio_of_exner_function_between_midlayer_and_interface_at_lowest_model_layer | Exner function at 1st layer | ratio | 1 | real | kind_phys | in | F | +!!| islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | +!!| xlon ! longitude ! longitude | radians ! 1 ! real ! kind_phys ! in ! F ! +!!| sinlat ! sin_of_latitude ! sin of latitude ! none ! 1 ! real ! kind_phys ! in ! F ! +!!| stress | surface_wind_stress | wind stress | m2 s-2 | 1 | real | kind_phys | in | F | +!!| sfcemis | surface_longwave_emissivity | surface longwave emissivity | frac | 1 | real | kind_phys | in | F | +!!| dlwflx | surface_downwelling_longwave_flux | total sky surface downward longwave flux | W m-2 | 1 | real | kind_phys | in | F | +!!| sfcnsw ! surface_net_downward_shortwave_flux ! total sky sfc netsw flx into ocean ! W m-2 ! 1 ! real ! kind_phys ! in ! F ! +!!| rain ! precipitation_amount_in_one_dynamics_time_step ! rainfall rate ! kg m-2 s-1 ! 1 ! real ! kind_phys ! in ! F ! +!!| timestep ! time_step_for_dynamics ! timestep interval ! s ! 0 ! real ! kind_phys ! in ! F ! +!!| kdt ! index_of_time_step ! time step counter ! count ! 0 ! integer ! ! in ! F ! +!!| solhr ! forecast_hour ! fcst hour at the end of prev time step ! none ! 0 ! real ! kind_phys ! in ! F ! +!!| xcosz ! cosine_of_solar_zenith_angle ! cosine of solar zenith angle ! none ! 1 ! real ! kind_phys ! in ! F ! +!!| ddvel | surface_wind_enhancement_due_to_convection | wind enhancement due to convection | m s-1 | 1 | real | kind_phys | in | F | +!!| flag_iter | flag_for_iteration | flag for iteration | flag | 1 | logical | | in | F | +!!| flag_guess | flag_for_guess_run | flag for guess run | flag | 1 | logical | | in | F | +!!| nstf_name1 ! flag_for_nsstm_run ! NSSTM flag: off/uncoupled/coupled=0/1/2 ! flag ! 1 ! integer ! ! in ! F ! +!!| nstf_name4 ! vertical_temperature_average_range_lower_bound ! zsea1 ! mm ! 1 ! integer ! ! in ! F ! +!!| nstf_name5 ! vertical_temperature_average_range_upper_bound ! zsea2 ! mm ! 1 ! integer ! ! in ! F ! +!!| lprnt | flag_print | flag for printing diagnostics to output | flag | 0 | logical | | in | F | +!!| ipr | horizontal_index_of_printed_column | horizontal index of printed column | index | 0 | integer | | in | F | +!!| tskin | surface_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | inout | F | +!!| tsurf | surface_skin_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | +!!| xt ! diurnal thermocline layer_heat_content ! heat content in diurnal thermocline layer ! K m ! 1 ! real ! kind_phys | inout | F | +!!| xs ! sea_water_salinity ! salinity content in diurnal thermocline layer ! ppt m ! 1 ! real ! kind_phys | inout | F | +!!| xu ! diurnal_thermocline_layer_x_current ! u-current content in diurnal thermocline layer ! m2 s-1 ! 1 ! real ! kind_phys | inout | F | +!!| xv ! diurnal_thermocline_layer_y_current ! v-current content in diurnal thermocline layer ! m2 s-1 ! 1 ! real ! kind_phys | inout | F | +!!| xz ! diurnal_thermocline_layer_thickness ! diurnal thermocline layer thickness ! m ! 1 ! real ! kind_phys | inout | F | +!!| zm ! ocean_mixed_layer_thickness ! mixed layer thickness ! m ! 1 ! real ! kind_phys | inout | F | +!!| xtts ! sensitivity_of_dtl_heat_content_to_surface_temperature ! d(xt)/d(ts) ! m ! 1 ! real ! kind_phys | inout | F | +!!| xzts ! sensitivity_of_dtl_thickness_to_surface_temperature ! d(xz)/d(ts) ! m K-1 ! 1 ! real ! kind_phys | inout | F | +!!| dt_cool ! sub-layer_cooling_amount ! sub-layer cooling amount ! K ! 1 ! real ! kind_phys | inout | F | +!!| z_c ! sub-layer_cooling_thickness ! sub-layer cooling thickness ! m ! 1 ! real ! kind_phys | inout | F | +!!| c_0 ! coefficient_c_0 ! coefficient1 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| c_d ! coefficient_c_d ! coefficient2 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| w_0 ! coefficient_w_0 ! coefficient3 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| w_d ! coefficient_w_d ! coefficient4 to calculate d(tz)/d(ts) ! none ! 1 ! real ! kind_phys | inout | F | +!!| d_conv ! free_convection_layer_thickness ! thickness of free convection layer ! m ! 1 ! real ! kind_phys | inout | F | +!!| ifd ! index_of_dtlm_start ! index to start dtlm run or not ! index ! 1 ! real ! kind_phys | inout | F | +!!| qrain ! sensible_heat_flux_due_to_rainfall ! sensible heat flux due to rainfall ! W ! 1 ! real ! kind_phys | inout | F | +!!| qsurf | surface_specific_humidity | surface air saturation specific humidity | kg kg-1 | 1 | real | kind_phys | out | F | +!!| gflux | upward_heat_flux_in_soil | soil heat flux | W m-2 | 1 | real | kind_phys | out | F | +!!| cmm | surface_drag_wind_speed_for_momentum_in_air | surf mom exch coef time mean surf wind | m s-1 | 1 | real | kind_phys | out | F | +!!| chh | surface_drag_mass_flux_for_heat_and_moisture_in_air | surf h&m exch coef time surf wind & density | kg m-2 s-1 | 1 | real | kind_phys | out | F | +!!| evap | kinematic_surface_upward_latent_heat_flux | evaperation from latent heat flux | W m-2 | 1 | real | kind_phys | out | F | +!!| hflx | surface_upward_sensible_heat_flux | sensible heat flux | W m-2 | 1 | real | kind_phys | out | F | +!!| ep | surface_upward_potential_latent_heat_flux | potential evaporation | W m-2 | 1 | real | kind_phys | out | F | +!! subroutine sfc_nst_run & !................................... ! --- inputs: From 0bf81e8179f1723069c196d81d364229971e48c6 Mon Sep 17 00:00:00 2001 From: "Grant.Firl" Date: Tue, 10 Oct 2017 15:01:12 -0600 Subject: [PATCH 07/16] fixed kinematic heat fluxes in table (units too); fixed merging typo --- physics/sfc_nst.f | 121 +++++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index 96791a1ba..5ba7ee836 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -27,70 +27,69 @@ subroutine sfc_nst_finalize end -<<<<<<< HEAD !> \brief Brief description of the subroutine !! !!\section arg_table_sfc_nst_run Argument Table -!!| local var name | longname | description | units | rank | type | kind | intent | optional | -!!|----------------|------------------------------------------------------------------------------|----------------------------------------------- |------------|------|---------|-----------|--------|----------| -!!| im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F | -!!| km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | -!!| ps | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | -!!| u1 | x_wind_at_lowest_model_layer | x component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | -!!| v1 | y_wind_at_lowest_model_layer | y component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | -!!| t1 | air_temperature_at_lowest_model_layer | surface layer mean temperature | K | 1 | real | kind_phys | in | F | -!!| q1 | specific_humidity_at_lowest_model_layer | surface layer mean specific humidity | kg kg-1 | 1 | real | kind_phys | in | F | -!!| tref | sea_surface_foundation_temperature | reference/foundation temperature | K | 1 | real | kind_phys | in | F | -!!| cm | surface_drag_coefficient_for_momentum_in_air | surface exchange coeff for momentum | none | 1 | real | kind_phys | in | F | -!!| ch | surface_drag_coefficient_for_heat_and_moisture_in_air | surface exchange coeff heat & moisture | none | 1 | real | kind_phys | in | F | -!!| prsl1 | air_pressure_at_lowest_model_layer | surface layer mean pressure | Pa | 1 | real | kind_phys | in | F | -!!| prslki | ratio_of_exner_function_between_midlayer_and_interface_at_lowest_model_layer | Exner function at 1st layer | ratio | 1 | real | kind_phys | in | F | -!!| islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | -!!| xlon | longitude | longitude | radians | 1 | real | kind_phys | in | F | -!!| sinlat | sin_of_latitude | sin of latitude | none | 1 | real | kind_phys | in | F | -!!| stress | surface_wind_stress | wind stress | m2 s-2 | 1 | real | kind_phys | in | F | -!!| sfcemis | surface_longwave_emissivity | surface longwave emissivity | frac | 1 | real | kind_phys | in | F | -!!| dlwflx | surface_downwelling_longwave_flux | total sky surface downward longwave flux | W m-2 | 1 | real | kind_phys | in | F | -!!| sfcnsw | surface_net_downward_shortwave_flux | total sky sfc netsw flx into ocean | W m-2 | 1 | real | kind_phys | in | F | -!!| rain | precipitation_amount_in_one_dynamics_time_step | rainfall rate | kg m-2 s-1 | 1 | real | kind_phys | in | F | -!!| timestep | time_step_for_dynamics | timestep interval | s | 0 | real | kind_phys | in | F | -!!| kdt | index_of_time_step | time step counter | count | 0 | integer | | in | F | -!!| solhr | forecast_hour | fcst hour at the end of prev time step | none | 0 | real | kind_phys | in | F | -!!| xcosz | cosine_of_solar_zenith_angle | cosine of solar zenith angle | none | 1 | real | kind_phys | in | F | -!!| ddvel | surface_wind_enhancement_due_to_convection | wind enhancement due to convection | m s-1 | 1 | real | kind_phys | in | F | -!!| flag_iter | flag_for_iteration | flag for iteration | flag | 1 | logical | | in | F | -!!| flag_guess | flag_for_guess_run | flag for guess run | flag | 1 | logical | | in | F | -!!| nstf_name1 | flag_for_nsstm_run | NSSTM flag: off/uncoupled/coupled=0/1/2 | flag | 1 | integer | | in | F | -!!| nstf_name4 | vertical_temperature_average_range_lower_bound | zsea1 | mm | 1 | integer | | in | F | -!!| nstf_name5 | vertical_temperature_average_range_upper_bound | zsea2 | mm | 1 | integer | | in | F | -!!| lprnt | flag_print | flag for printing diagnostics to output | flag | 0 | logical | | in | F | -!!| ipr | horizontal_index_of_printed_column | horizontal index of printed column | index | 0 | integer | | in | F | -!!| tskin | surface_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | inout | F | -!!| tsurf | surface_skin_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | -!!| xt | diurnal thermocline layer_heat_content | heat content in diurnal thermocline layer | K m | 1 | real | kind_phys | inout | F | -!!| xs | sea_water_salinity | salinity content in diurnal thermocline layer | ppt m | 1 | real | kind_phys | inout | F | -!!| xu | diurnal_thermocline_layer_x_current | u-current content in diurnal thermocline layer | m2 s-1 | 1 | real | kind_phys | inout | F | -!!| xv | diurnal_thermocline_layer_y_current | v-current content in diurnal thermocline layer | m2 s-1 | 1 | real | kind_phys | inout | F | -!!| xz | diurnal_thermocline_layer_thickness | diurnal thermocline layer thickness | m | 1 | real | kind_phys | inout | F | -!!| zm | ocean_mixed_layer_thickness | mixed layer thickness | m | 1 | real | kind_phys | inout | F | -!!| xtts | sensitivity_of_dtl_heat_content_to_surface_temperature | d(xt)/d(ts) | m | 1 | real | kind_phys | inout | F | -!!| xzts | sensitivity_of_dtl_thickness_to_surface_temperature | d(xz)/d(ts) | m K-1 | 1 | real | kind_phys | inout | F | -!!| dt_cool | sub-layer_cooling_amount | sub-layer cooling amount | K | 1 | real | kind_phys | inout | F | -!!| z_c | sub-layer_cooling_thickness | sub-layer cooling thickness | m | 1 | real | kind_phys | inout | F | -!!| c_0 | coefficient_c_0 | coefficient1 to calculate d(tz)/d(ts) | none | 1 | real | kind_phys | inout | F | -!!| c_d | coefficient_c_d | coefficient2 to calculate d(tz)/d(ts) | none | 1 | real | kind_phys | inout | F | -!!| w_0 | coefficient_w_0 | coefficient3 to calculate d(tz)/d(ts) | none | 1 | real | kind_phys | inout | F | -!!| w_d | coefficient_w_d | coefficient4 to calculate d(tz)/d(ts) | none | 1 | real | kind_phys | inout | F | -!!| d_conv | free_convection_layer_thickness | thickness of free convection layer | m | 1 | real | kind_phys | inout | F | -!!| ifd | index_of_dtlm_start | index to start dtlm run or not | index | 1 | real | kind_phys | inout | F | -!!| qrain | sensible_heat_flux_due_to_rainfall | sensible heat flux due to rainfall | W | 1 | real | kind_phys | inout | F | -!!| qsurf | surface_specific_humidity | surface air saturation specific humidity | kg kg-1 | 1 | real | kind_phys | out | F | -!!| gflux | upward_heat_flux_in_soil | soil heat flux | W m-2 | 1 | real | kind_phys | out | F | -!!| cmm | surface_drag_wind_speed_for_momentum_in_air | surf mom exch coef time mean surf wind | m s-1 | 1 | real | kind_phys | out | F | -!!| chh | surface_drag_mass_flux_for_heat_and_moisture_in_air | surf h&m exch coef time surf wind & density | kg m-2 s-1 | 1 | real | kind_phys | out | F | -!!| evap | kinematic_surface_upward_latent_heat_flux | evaperation from latent heat flux | W m-2 | 1 | real | kind_phys | out | F | -!!| hflx | surface_upward_sensible_heat_flux | sensible heat flux | W m-2 | 1 | real | kind_phys | out | F | -!!| ep | surface_upward_potential_latent_heat_flux | potential evaporation | W m-2 | 1 | real | kind_phys | out | F | +!!| local var name | longname | description | units | rank | type | kind | intent | optional | +!!|----------------|------------------------------------------------------------------------------|----------------------------------------------- |---------------|------|---------|-----------|--------|----------| +!!| im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F | +!!| km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | +!!| ps | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | +!!| u1 | x_wind_at_lowest_model_layer | x component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | +!!| v1 | y_wind_at_lowest_model_layer | y component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | +!!| t1 | air_temperature_at_lowest_model_layer | surface layer mean temperature | K | 1 | real | kind_phys | in | F | +!!| q1 | specific_humidity_at_lowest_model_layer | surface layer mean specific humidity | kg kg-1 | 1 | real | kind_phys | in | F | +!!| tref | sea_surface_foundation_temperature | reference/foundation temperature | K | 1 | real | kind_phys | in | F | +!!| cm | surface_drag_coefficient_for_momentum_in_air | surface exchange coeff for momentum | none | 1 | real | kind_phys | in | F | +!!| ch | surface_drag_coefficient_for_heat_and_moisture_in_air | surface exchange coeff heat & moisture | none | 1 | real | kind_phys | in | F | +!!| prsl1 | air_pressure_at_lowest_model_layer | surface layer mean pressure | Pa | 1 | real | kind_phys | in | F | +!!| prslki | ratio_of_exner_function_between_midlayer_and_interface_at_lowest_model_layer | Exner function at 1st layer | ratio | 1 | real | kind_phys | in | F | +!!| islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | +!!| xlon | longitude | longitude | radians | 1 | real | kind_phys | in | F | +!!| sinlat | sin_of_latitude | sin of latitude | none | 1 | real | kind_phys | in | F | +!!| stress | surface_wind_stress | wind stress | m2 s-2 | 1 | real | kind_phys | in | F | +!!| sfcemis | surface_longwave_emissivity | surface longwave emissivity | frac | 1 | real | kind_phys | in | F | +!!| dlwflx | surface_downwelling_longwave_flux | total sky surface downward longwave flux | W m-2 | 1 | real | kind_phys | in | F | +!!| sfcnsw | surface_net_downward_shortwave_flux | total sky sfc netsw flx into ocean | W m-2 | 1 | real | kind_phys | in | F | +!!| rain | precipitation_amount_in_one_dynamics_time_step | rainfall rate | kg m-2 s-1 | 1 | real | kind_phys | in | F | +!!| timestep | time_step_for_dynamics | timestep interval | s | 0 | real | kind_phys | in | F | +!!| kdt | index_of_time_step | time step counter | count | 0 | integer | | in | F | +!!| solhr | forecast_hour | fcst hour at the end of prev time step | none | 0 | real | kind_phys | in | F | +!!| xcosz | cosine_of_solar_zenith_angle | cosine of solar zenith angle | none | 1 | real | kind_phys | in | F | +!!| ddvel | surface_wind_enhancement_due_to_convection | wind enhancement due to convection | m s-1 | 1 | real | kind_phys | in | F | +!!| flag_iter | flag_for_iteration | flag for iteration | flag | 1 | logical | | in | F | +!!| flag_guess | flag_for_guess_run | flag for guess run | flag | 1 | logical | | in | F | +!!| nstf_name1 | flag_for_nsstm_run | NSSTM flag: off/uncoupled/coupled=0/1/2 | flag | 1 | integer | | in | F | +!!| nstf_name4 | vertical_temperature_average_range_lower_bound | zsea1 | mm | 1 | integer | | in | F | +!!| nstf_name5 | vertical_temperature_average_range_upper_bound | zsea2 | mm | 1 | integer | | in | F | +!!| lprnt | flag_print | flag for printing diagnostics to output | flag | 0 | logical | | in | F | +!!| ipr | horizontal_index_of_printed_column | horizontal index of printed column | index | 0 | integer | | in | F | +!!| tskin | surface_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | inout | F | +!!| tsurf | surface_skin_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | +!!| xt | diurnal thermocline layer_heat_content | heat content in diurnal thermocline layer | K m | 1 | real | kind_phys | inout | F | +!!| xs | sea_water_salinity | salinity content in diurnal thermocline layer | ppt m | 1 | real | kind_phys | inout | F | +!!| xu | diurnal_thermocline_layer_x_current | u-current content in diurnal thermocline layer | m2 s-1 | 1 | real | kind_phys | inout | F | +!!| xv | diurnal_thermocline_layer_y_current | v-current content in diurnal thermocline layer | m2 s-1 | 1 | real | kind_phys | inout | F | +!!| xz | diurnal_thermocline_layer_thickness | diurnal thermocline layer thickness | m | 1 | real | kind_phys | inout | F | +!!| zm | ocean_mixed_layer_thickness | mixed layer thickness | m | 1 | real | kind_phys | inout | F | +!!| xtts | sensitivity_of_dtl_heat_content_to_surface_temperature | d(xt)/d(ts) | m | 1 | real | kind_phys | inout | F | +!!| xzts | sensitivity_of_dtl_thickness_to_surface_temperature | d(xz)/d(ts) | m K-1 | 1 | real | kind_phys | inout | F | +!!| dt_cool | sub-layer_cooling_amount | sub-layer cooling amount | K | 1 | real | kind_phys | inout | F | +!!| z_c | sub-layer_cooling_thickness | sub-layer cooling thickness | m | 1 | real | kind_phys | inout | F | +!!| c_0 | coefficient_c_0 | coefficient1 to calculate d(tz)/d(ts) | none | 1 | real | kind_phys | inout | F | +!!| c_d | coefficient_c_d | coefficient2 to calculate d(tz)/d(ts) | none | 1 | real | kind_phys | inout | F | +!!| w_0 | coefficient_w_0 | coefficient3 to calculate d(tz)/d(ts) | none | 1 | real | kind_phys | inout | F | +!!| w_d | coefficient_w_d | coefficient4 to calculate d(tz)/d(ts) | none | 1 | real | kind_phys | inout | F | +!!| d_conv | free_convection_layer_thickness | thickness of free convection layer | m | 1 | real | kind_phys | inout | F | +!!| ifd | index_of_dtlm_start | index to start dtlm run or not | index | 1 | real | kind_phys | inout | F | +!!| qrain | sensible_heat_flux_due_to_rainfall | sensible heat flux due to rainfall | W | 1 | real | kind_phys | inout | F | +!!| qsurf | surface_specific_humidity | surface air saturation specific humidity | kg kg-1 | 1 | real | kind_phys | out | F | +!!| gflux | upward_heat_flux_in_soil | soil heat flux | W m-2 | 1 | real | kind_phys | out | F | +!!| cmm | surface_drag_wind_speed_for_momentum_in_air | surf mom exch coef time mean surf wind | m s-1 | 1 | real | kind_phys | out | F | +!!| chh | surface_drag_mass_flux_for_heat_and_moisture_in_air | surf h&m exch coef time surf wind & density | kg m-2 s-1 | 1 | real | kind_phys | out | F | +!!| evap | kinematic_surface_upward_latent_heat_flux | kinematic from latent heat flux | kg kg-1 m s-1 | 1 | real | kind_phys | out | F | +!!| hflx | kinematic_surface_upward_sensible_heat_flux | kinematic sensible heat flux | K m s-1 | 1 | real | kind_phys | out | F | +!!| ep | surface_upward_potential_latent_heat_flux | potential evaporation | W m-2 | 1 | real | kind_phys | out | F | !! !! \section NSST_general_algorithm General Algorithm !! \section NSST_detailed_algorithm Detailed Algorithm From 85582ff3698e548721e45355bed4ae28648e57bd Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Thu, 19 Oct 2017 18:51:47 +0000 Subject: [PATCH 08/16] Add NSST interstitials: nst_sfc_pre and nst_sfc_post. No argument table or doxygen for them yet. --- GFS_layer/GFS_physics_driver.F90 | 52 ++++------- physics/sfc_nst.f | 155 ++++++++++++++++++++++++++++++- 2 files changed, 169 insertions(+), 38 deletions(-) diff --git a/GFS_layer/GFS_physics_driver.F90 b/GFS_layer/GFS_physics_driver.F90 index 92bd69101..0acfbc3ca 100644 --- a/GFS_layer/GFS_physics_driver.F90 +++ b/GFS_layer/GFS_physics_driver.F90 @@ -9,8 +9,9 @@ module module_physics_driver use ozne_def, only: levozp, oz_coeff, oz_pres use h2o_def, only: levh2o, h2o_coeff, h2o_pres use gfs_fv3_needs, only: get_prs_fv3, get_phi_fv3 - use module_nst_water_prop, only: get_dtzm_2d use sfc_nst, only: sfc_nst_run + use sfc_nst_pre, only: sfc_nst_pre_run + use sfc_nst_post, only: sfc_nst_post_run use GFS_typedefs, only: GFS_statein_type, GFS_stateout_type, & GFS_sfcprop_type, GFS_coupling_type, & GFS_control_type, GFS_grid_type, & @@ -886,13 +887,12 @@ subroutine GFS_physics_driver & if (Model%nstf_name(1) > 0) then - do i = 1, im - if ( islmsk(i) == 0 ) then - tem = (Sfcprop%oro(i)-Sfcprop%oro_uf(i)) * rlapse - tseal(i) = Sfcprop%tsfc(i) + tem - tsurf(i) = tsurf(i) + tem - endif - enddo + call sfc_nst_pre_run(im, islmsk, Sfcprop%oro, Sfcprop%oro_uf, & + Sfcprop%tsfc, & +! --- Input/output + tsurf, & +! --- outputs: + tseal) call sfc_nst_run (im, Model%lsoil, Statein%pgr, Statein%ugrs, & Statein%vgrs, Statein%tgrs, Statein%qgrs, & @@ -912,34 +912,16 @@ subroutine GFS_physics_driver & ! --- outputs: qss, gflx, Diag%cmm, Diag%chh, evap, hflx, ep1d) -! if (lprnt) print *,' tseaz2=',tseal(ipr),' tref=',tref(ipr), -! & ' dt_cool=',dt_cool(ipr),' dt_warm=',2.0*xt(ipr)/xz(ipr), -! & ' kdt=',kdt - - do i = 1, im - if ( islmsk(i) == 0 ) then - tsurf(i) = tsurf(i) - (Sfcprop%oro(i)-Sfcprop%oro_uf(i)) * rlapse - endif - enddo -! --- ... run nsst model ... --- - - if (Model%nstf_name(1) > 1) then - zsea1 = 0.001*real(Model%nstf_name(4)) - zsea2 = 0.001*real(Model%nstf_name(5)) - call get_dtzm_2d (Sfcprop%xt, Sfcprop%xz, Sfcprop%dt_cool, & - Sfcprop%z_c, Sfcprop%slmsk, zsea1, zsea2, & - im, 1, dtzm) - do i = 1, im - if ( islmsk(i) == 0 ) then - Sfcprop%tsfc(i) = max(271.2,Sfcprop%tref(i) + dtzm(i)) - & - (Sfcprop%oro(i)-Sfcprop%oro_uf(i))*rlapse - endif - enddo - endif - -! if (lprnt) print *,' tseaz2=',tsea(ipr),' tref=',tref(ipr), & -! & ' dt_cool=',dt_cool(ipr),' dt_warm=',dt_warm(ipr),' kdt=',kdt + call sfc_nst_post_run(im, islmsk, Sfcprop%oro, Sfcprop%oro_uf, & + Model%nstf_name(1), Model%nstf_name(4), & + Model%nstf_name(5), Sfcprop%xt, Sfcprop%xz, & + Sfcprop%dt_cool, Sfcprop%z_c, Sfcprop%slmsk, & + Sfcprop%tref, Grid%xlon, & +! --- Input/output + tsurf, & +! --- outputs: + dtzm, Sfcprop%tsfc) else diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index 5ba7ee836..acdda64f9 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -7,12 +7,22 @@ module sfc_nst !> \defgroup GFS_NSST GFS Near Sea Surface Temperature !! @{ -!! \brief Brief description of the parameterization -!! \section diagram Calling Hierarchy Diagram -!! \section intraphysics Intraphysics Communication +!! \brief Brief description of the parameterization +!! +!! Blah blah blah description of parameterization +!! +!! \section diagram Calling Hierarchy Diagram +!! +!! Blah blah blah diagram +!! +!! \section intraphysics Intraphysics Communication +!! +!! Blah blah blah intraphysics communication !> \brief Brief description of the subroutine !! +!! Blah blah description of subroutine +!! !! \section arg_table_sfc_nst_init Argument Table !! subroutine sfc_nst_init @@ -21,6 +31,8 @@ subroutine sfc_nst_init !> \brief Brief description of the subroutine !! +!! Blah blah description of subroutine +!! !! \section arg_table_sfc_nst_finalize Argument Table !! subroutine sfc_nst_finalize @@ -29,6 +41,8 @@ subroutine sfc_nst_finalize !> \brief Brief description of the subroutine !! +!! Blah blah description of subroutine +!! !!\section arg_table_sfc_nst_run Argument Table !!| local var name | longname | description | units | rank | type | kind | intent | optional | !!|----------------|------------------------------------------------------------------------------|----------------------------------------------- |---------------|------|---------|-----------|--------|----------| @@ -92,6 +106,9 @@ subroutine sfc_nst_finalize !!| ep | surface_upward_potential_latent_heat_flux | potential evaporation | W m-2 | 1 | real | kind_phys | out | F | !! !! \section NSST_general_algorithm General Algorithm +!! +!! Blah blah general algorithm +!! !! \section NSST_detailed_algorithm Detailed Algorithm !! @{ subroutine sfc_nst_run & @@ -660,3 +677,135 @@ subroutine sfc_nst_run & !> @} !! @} end module + + + + module sfc_nst_pre + + contains + + subroutine sfc_nst_pre_init + + end + + subroutine sfc_nst_pre_finalize + + end + + subroutine sfc_nst_pre_run & + & ( im, islimsk, oro, oro_uf, tsfc, tsurf, tskin ) + + use machine , only : kind_phys + use physcons, only: rlapse + + implicit none + +! --- inputs: + integer, intent(in) :: im + integer, dimension(im), intent(in) :: islimsk + real (kind=kind_phys), dimension(im), intent(in) :: oro, oro_uf + real (kind=kind_phys), dimension(im), intent(in) :: tsfc + +! --- input/outputs: + real (kind=kind_phys), dimension(im), intent(inout) :: tsurf + +! --- outputs: + real (kind=kind_phys), dimension(im), intent(out) :: tskin + +! --- locals + integer :: i + real(kind=kind_phys) :: tem + + do i = 1, im + if ( islimsk(i) == 0 ) then + tem = (oro(i)-oro_uf(i)) * rlapse + tskin(i) = tsfc(i) + tem + tsurf(i) = tsurf(i) + tem + endif + enddo + + return + end + + end module + + + + + module sfc_nst_post + + contains + + subroutine sfc_nst_post_init + + end + + subroutine sfc_nst_post_finalize + + end + + subroutine sfc_nst_post_run & + & ( im, islimsk, oro, oro_uf, nstf_name1, nstf_name4, & + & nstf_name5, xt, xz, dt_cool, z_c, rslimsk, tref, xlon, & + & tsurf, dtzm, tsfc & + & ) + + use machine , only : kind_phys + use physcons, only: rlapse + use module_nst_water_prop, only: get_dtzm_2d + + implicit none + +! --- inputs: + integer, intent(in) :: im + integer, dimension(im), intent(in) :: islimsk + real (kind=kind_phys), dimension(im), intent(in) :: oro, oro_uf + integer, intent(in) :: nstf_name1, nstf_name4, nstf_name5 + real (kind=kind_phys), dimension(im), intent(in) :: xt, xz, & + & dt_cool, z_c, rslimsk, tref, xlon + +! --- input/outputs: + real (kind=kind_phys), dimension(im), intent(inout) :: tsurf + +! --- outputs: + real (kind=kind_phys), dimension(size(xlon,1)), intent(out) :: & + & dtzm + real (kind=kind_phys), dimension(im), intent(out) :: tsfc + +! --- locals + integer :: i + real(kind=kind_phys) :: zsea1, zsea2 + +! if (lprnt) print *,' tseaz2=',tseal(ipr),' tref=',tref(ipr), +! & ' dt_cool=',dt_cool(ipr),' dt_warm=',2.0*xt(ipr)/xz(ipr), +! & ' kdt=',kdt + + do i = 1, im + if ( islimsk(i) == 0 ) then + tsurf(i) = tsurf(i) - (oro(i)-oro_uf(i)) * rlapse + endif + enddo + +! --- ... run nsst model ... --- + + if (nstf_name1 > 1) then + zsea1 = 0.001*real(nstf_name4) + zsea2 = 0.001*real(nstf_name5) + call get_dtzm_2d (xt, xz, dt_cool, & + & z_c, rslimsk, zsea1, zsea2, & + & im, 1, dtzm) + do i = 1, im + if ( islimsk(i) == 0 ) then + tsfc(i) = max(271.2,tref(i) + dtzm(i)) - & + & (oro(i)-oro_uf(i))*rlapse + endif + enddo + endif + +! if (lprnt) print *,' tseaz2=',tsea(ipr),' tref=',tref(ipr), & +! & ' dt_cool=',dt_cool(ipr),' dt_warm=',dt_warm(ipr),' kdt=',kdt + + return + end + + end module From 1d3ffc4cd8d164995888409ed9308e3b9ef81eb3 Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Wed, 25 Oct 2017 20:52:47 +0000 Subject: [PATCH 09/16] Update argument tables for NSST pre/post interstitials. --- physics/sfc_nst.f | 110 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 1 deletion(-) diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index acdda64f9..0934c8ead 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -78,7 +78,7 @@ subroutine sfc_nst_finalize !!| nstf_name5 | vertical_temperature_average_range_upper_bound | zsea2 | mm | 1 | integer | | in | F | !!| lprnt | flag_print | flag for printing diagnostics to output | flag | 0 | logical | | in | F | !!| ipr | horizontal_index_of_printed_column | horizontal index of printed column | index | 0 | integer | | in | F | -!!| tskin | surface_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | inout | F | +!!| tskin | surface_skin_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | inout | F | !!| tsurf | surface_skin_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | !!| xt | diurnal thermocline layer_heat_content | heat content in diurnal thermocline layer | K m | 1 | real | kind_phys | inout | F | !!| xs | sea_water_salinity | salinity content in diurnal thermocline layer | ppt m | 1 | real | kind_phys | inout | F | @@ -684,14 +684,61 @@ module sfc_nst_pre contains +!> \defgroup GFS_NSST GFS Near Sea Surface Temperature +!! @{ +!! \brief Brief description of the parameterization +!! +!! Blah blah blah description of parameterization +!! +!! \section diagram Calling Hierarchy Diagram +!! +!! Blah blah blah diagram +!! +!! \section intraphysics Intraphysics Communication +!! +!! Blah blah blah intraphysics communication + +!> \brief Brief description of the subroutine +!! +!! Blah blah description of subroutine +!! +!! \section arg_table_sfc_nst_init Argument Table +!! subroutine sfc_nst_pre_init end +!> \brief Brief description of the subroutine +!! +!! Blah blah description of subroutine +!! +!! \section arg_table_sfc_nst_finalize Argument Table +!! subroutine sfc_nst_pre_finalize end +!> \brief Brief description of the subroutine +!! +!! Blah blah description of subroutine +!! +!!\section arg_table_sfc_nst_run Argument Table +!!| local var name | longname | description | units | rank | type | kind | intent | optional | +!!|----------------|------------------------------------------------------------------------------|----------------------------------------------- |---------------|------|---------|-----------|--------|----------| +!!| im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F | +!!| islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | +!!| oro | orography | orography | | 1 | real | kind_phys | in | F | +!!| oro_uf | orography_unfiltered | unfiltered orographyo | | 1 | real | kind_phys | in | F | +!!| tsfc | surface_skin_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | in | F | +!!| tsurf | surface_skin_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | +!!| tskin | surface_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | out | F | +!! +!! \section NSST_general_algorithm General Algorithm +!! +!! Blah blah general algorithm +!! +!! \section NSST_detailed_algorithm Detailed Algorithm +!! @{ subroutine sfc_nst_pre_run & & ( im, islimsk, oro, oro_uf, tsfc, tsurf, tskin ) @@ -727,6 +774,8 @@ subroutine sfc_nst_pre_run & return end +!> @} +!! @} end module @@ -736,14 +785,71 @@ module sfc_nst_post contains +!> \defgroup GFS_NSST GFS Near Sea Surface Temperature +!! @{ +!! \brief Brief description of the parameterization +!! +!! Blah blah blah description of parameterization +!! +!! \section diagram Calling Hierarchy Diagram +!! +!! Blah blah blah diagram +!! +!! \section intraphysics Intraphysics Communication +!! +!! Blah blah blah intraphysics communication + +!> \brief Brief description of the subroutine +!! +!! Blah blah description of subroutine +!! +!! \section arg_table_sfc_nst_init Argument Table +!! subroutine sfc_nst_post_init end +!> \brief Brief description of the subroutine +!! +!! Blah blah description of subroutine +!! +!! \section arg_table_sfc_nst_finalize Argument Table +!! subroutine sfc_nst_post_finalize end +!> \brief Brief description of the subroutine +!! +!! Blah blah description of subroutine +!! +!!\section arg_table_sfc_nst_run Argument Table +!!| local var name | longname | description | units | rank | type | kind | intent | optional | +!!|----------------|------------------------------------------------------------------------------|----------------------------------------------- |---------------|------|---------|-----------|--------|----------| +!!| im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F | +!!| islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | +!!| oro | orography | orography | | 1 | real | kind_phys | in | F | +!!| oro_uf | orography_unfiltered | unfiltered orographyo | | 1 | real | kind_phys | in | F | +!!| nstf_name1 | flag_for_nsstm_run | NSSTM flag: off/uncoupled/coupled=0/1/2 | flag | 1 | integer | | in | F | +!!| nstf_name4 | vertical_temperature_average_range_lower_bound | zsea1 | mm | 1 | integer | | in | F | +!!| nstf_name5 | vertical_temperature_average_range_upper_bound | zsea2 | mm | 1 | integer | | in | F | +!!| xt | diurnal thermocline layer_heat_content | heat content in diurnal thermocline layer | K m | 1 | real | kind_phys | in | F | +!!| xz | diurnal_thermocline_layer_thickness | diurnal thermocline layer thickness | m | 1 | real | kind_phys | in | F | +!!| dt_cool | sub-layer_cooling_amount | sub-layer cooling amount | K | 1 | real | kind_phys | in | F | +!!| z_c | sub-layer_cooling_thickness | sub-layer cooling thickness | m | 1 | real | kind_phys | in | F | +!!| rslimsk | sea_land_ice_mask_real | landmask: sea/land/ice=0/1/2 | flag | 1 | real | kind_phys | in | F | +!!| tref | sea_surface_foundation_temperature | reference/foundation temperature | K | 1 | real | kind_phys | in | F | +!!| xlon | longitude | longitude | radians | 1 | real | kind_phys | in | F | +!!| tsurf | surface_skin_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | +!!| dtzm | mean_change_over_depth_in_sea_water_temperature | mean of dT(z) (zsea1 to zsea2) | K | 1 | real | kind_phys | out | F | +!!| tsfc | surface_skin_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | out | F | +!! +!! \section NSST_general_algorithm General Algorithm +!! +!! Blah blah general algorithm +!! +!! \section NSST_detailed_algorithm Detailed Algorithm +!! @{ subroutine sfc_nst_post_run & & ( im, islimsk, oro, oro_uf, nstf_name1, nstf_name4, & & nstf_name5, xt, xz, dt_cool, z_c, rslimsk, tref, xlon, & @@ -808,4 +914,6 @@ subroutine sfc_nst_post_run & return end +!> @} +!! @} end module From 9a352bcd94a50e29d34afa61ff7ac8be1853d736 Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Thu, 26 Oct 2017 18:35:45 +0000 Subject: [PATCH 10/16] Update some Doxygen content. --- physics/sfc_nst.f | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index 0934c8ead..a13c58327 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -7,21 +7,32 @@ module sfc_nst !> \defgroup GFS_NSST GFS Near Sea Surface Temperature !! @{ -!! \brief Brief description of the parameterization +!! \brief Near Sea Surface Temperature (NSST) is a temperature profile just below the sea surface. The GFS NSST scheme is used to forecast the NSST for two main purposes: supply SSTs to the atmospheric model for the calculation of air-sea heat and moisture fluxes and providing a sub-layer temperature profile forecast for use as a first guess in the Gridpoint Statistical Interpolator (GSI) data assimilation code. !! -!! Blah blah blah description of parameterization +!! The GFS NSST scheme was initially developed at NCEP by Xu Li in 2007, and subsequently received contributions by S. Moorthi, Y.-T. Hu and J. Derber, leading to operational implementation in the GFS in 2017 (Li 2015, Li and Derber 2008 and 2009). The GFS NSST scheme predicts the vertical profile of sea temperature between the surface and a reference level (zr), which is on the order of 5 m. Only two physical process are considered in this scheme: diurnal thermocline layer warming and thermal skin layer (also known as sub-layer) cooling. All other process that could influence NSST are ignored in this simple scheme. !! -!! \section diagram Calling Hierarchy Diagram +!!This profile is a composed by subdividing the near-surface layer in three parts !! -!! Blah blah blah diagram +!!T(z) = Tr + T’w (z) + T’c (z), +!! +!!where +!!Ts = T(z=0) is the SST +!!T’c (z) is the temperature profile in the skin layer (0 < z <= zc) +!!T’w (z) is the temperature profile in the warm layer (0 < z <= zr) +!!Tr is the reference temperature +!!zc is the depth of the skin layer +!! +!!Prediction for the skin layer is made using the Thermal Skin-layer Model (TSM), while prediction for the thermocline is based on the Diurnal Thermocline Model (DTM), both with an origin on Fairall et al. (1996). Atmospheric inputs include short- and long-wave radiation, surface pressure, surface layer winds, temperature and specific humidity, and rainfall. +!! +!! \section Calling Hierarchy Diagram !! !! \section intraphysics Intraphysics Communication !! -!! Blah blah blah intraphysics communication +!! This space is reserved for a description of how this scheme uses information from other scheme types and/or how information calculated in this scheme is used in other scheme types. -!> \brief Brief description of the subroutine +!> \brief This subroutine is empty since there are no procedures that need to be done to initialize the GFS NSST code. !! -!! Blah blah description of subroutine +!! This subroutine is empty since there are no procedures that need to be done to initialize the GFS NSST code. !! !! \section arg_table_sfc_nst_init Argument Table !! @@ -29,9 +40,9 @@ subroutine sfc_nst_init end -!> \brief Brief description of the subroutine +!> \brief This subroutine is empty since there are no procedures that need to be done to finalize the GFS NSST code. !! -!! Blah blah description of subroutine +!! This subroutine is empty since there are no procedures that need to be done to finalize the GFS NSST code. !! !! \section arg_table_sfc_nst_finalize Argument Table !! @@ -39,9 +50,9 @@ subroutine sfc_nst_finalize end -!> \brief Brief description of the subroutine +!> \brief This subroutine calls the Thermal Skin-layer and Diurnal Thermocline models to update the NSST profile. !! -!! Blah blah description of subroutine +!! This subroutine calls the Thermal Skin-layer and Diurnal Thermocline models to update the NSST profile. !! !!\section arg_table_sfc_nst_run Argument Table !!| local var name | longname | description | units | rank | type | kind | intent | optional | @@ -107,9 +118,9 @@ subroutine sfc_nst_finalize !! !! \section NSST_general_algorithm General Algorithm !! -!! Blah blah general algorithm +!! This is the main subroutine for the NSST scheme, and it calls the DTM and TSM. !! -!! \section NSST_detailed_algorithm Detailed Algorithm +!! \section NSST_detailed_algorithm Under construction !! @{ subroutine sfc_nst_run & & ( im, km, ps, u1, v1, t1, q1, tref, cm, ch, & @@ -684,7 +695,7 @@ module sfc_nst_pre contains -!> \defgroup GFS_NSST GFS Near Sea Surface Temperature +!> \defgroup GFS_NSST_PRE GFS Near Sea Surface Temperature Pre !! @{ !! \brief Brief description of the parameterization !! @@ -785,7 +796,7 @@ module sfc_nst_post contains -!> \defgroup GFS_NSST GFS Near Sea Surface Temperature +!> \defgroup GFS_NSST_POST GFS Near Sea Surface Temperature Post !! @{ !! \brief Brief description of the parameterization !! From 23eca7c1018fae5e27022c8f222ff716d5f82686 Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Mon, 6 Nov 2017 23:25:16 +0000 Subject: [PATCH 11/16] Update long name in nst_sfc_run. Pass in correct slices of variables from physics driver. --- GFS_layer/GFS_physics_driver.F90 | 14 +++++++------- physics/sfc_nst.f | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/GFS_layer/GFS_physics_driver.F90 b/GFS_layer/GFS_physics_driver.F90 index 0acfbc3ca..2b14a7cd1 100644 --- a/GFS_layer/GFS_physics_driver.F90 +++ b/GFS_layer/GFS_physics_driver.F90 @@ -894,13 +894,13 @@ subroutine GFS_physics_driver & ! --- outputs: tseal) - call sfc_nst_run (im, Model%lsoil, Statein%pgr, Statein%ugrs, & - Statein%vgrs, Statein%tgrs, Statein%qgrs, & - Sfcprop%tref, cd, cdq, Statein%prsl(:,1), work3, & - islmsk, Grid%xlon, Grid%sinlat, stress, & - Radtend%semis, gabsbdlw, adjsfcnsw, Sfcprop%tprcp, & - dtf, kdt, Model%solhr, xcosz, & - Tbd%phy_f2d(:,Model%num_p2d), flag_iter, & + call sfc_nst_run (im, Model%lsoil, Statein%pgr, Statein%ugrs(:,1), & + Statein%vgrs(:,1), Statein%tgrs(:,1), & + Statein%qgrs(:,1,1), Sfcprop%tref, cd, cdq, & + Statein%prsl(:,1), work3, islmsk, Grid%xlon, & + Grid%sinlat, stress, Radtend%semis, gabsbdlw, & + adjsfcnsw, Sfcprop%tprcp, dtf, kdt, Model%solhr, & + xcosz, Tbd%phy_f2d(:,Model%num_p2d), flag_iter, & flag_guess, Model%nstf_name(1), Model%nstf_name(4),& Model%nstf_name(5), lprnt, ipr, & ! --- Input/output diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index a13c58327..aed6dd6f5 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -58,7 +58,7 @@ subroutine sfc_nst_finalize !!| local var name | longname | description | units | rank | type | kind | intent | optional | !!|----------------|------------------------------------------------------------------------------|----------------------------------------------- |---------------|------|---------|-----------|--------|----------| !!| im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F | -!!| km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | +!!| km | soil_vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | !!| ps | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | !!| u1 | x_wind_at_lowest_model_layer | x component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | !!| v1 | y_wind_at_lowest_model_layer | y component of surface layer wind | m s-1 | 1 | real | kind_phys | in | F | From a948ddb25fe3424f7f8d00c500dfd01e6aa43f38 Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Mon, 13 Nov 2017 21:21:34 +0000 Subject: [PATCH 12/16] Fix long name errors. --- physics/sfc_nst.f | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index aed6dd6f5..a24f1f710 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -71,7 +71,7 @@ subroutine sfc_nst_finalize !!| prslki | ratio_of_exner_function_between_midlayer_and_interface_at_lowest_model_layer | Exner function at 1st layer | ratio | 1 | real | kind_phys | in | F | !!| islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | !!| xlon | longitude | longitude | radians | 1 | real | kind_phys | in | F | -!!| sinlat | sin_of_latitude | sin of latitude | none | 1 | real | kind_phys | in | F | +!!| sinlat | sine_of_latitude | sin of latitude | none | 1 | real | kind_phys | in | F | !!| stress | surface_wind_stress | wind stress | m2 s-2 | 1 | real | kind_phys | in | F | !!| sfcemis | surface_longwave_emissivity | surface longwave emissivity | frac | 1 | real | kind_phys | in | F | !!| dlwflx | surface_downwelling_longwave_flux | total sky surface downward longwave flux | W m-2 | 1 | real | kind_phys | in | F | @@ -742,7 +742,7 @@ subroutine sfc_nst_pre_finalize !!| oro_uf | orography_unfiltered | unfiltered orographyo | | 1 | real | kind_phys | in | F | !!| tsfc | surface_skin_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | in | F | !!| tsurf | surface_skin_temperature_after_iteration | ocean surface skin temperature for guess run | K | 1 | real | kind_phys | inout | F | -!!| tskin | surface_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | out | F | +!!| tskin | surface_skin_temperature | ocean surface skin temperature | K | 1 | real | kind_phys | out | F | !! !! \section NSST_general_algorithm General Algorithm !! From 8585383a6855c22d94e2e6a5f81e42684edc078b Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Wed, 15 Nov 2017 21:15:50 +0000 Subject: [PATCH 13/16] Fix xcosz longname. --- physics/sfc_nst.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index a24f1f710..208225bed 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -80,7 +80,7 @@ subroutine sfc_nst_finalize !!| timestep | time_step_for_dynamics | timestep interval | s | 0 | real | kind_phys | in | F | !!| kdt | index_of_time_step | time step counter | count | 0 | integer | | in | F | !!| solhr | forecast_hour | fcst hour at the end of prev time step | none | 0 | real | kind_phys | in | F | -!!| xcosz | cosine_of_solar_zenith_angle | cosine of solar zenith angle | none | 1 | real | kind_phys | in | F | +!!| xcosz | instantaneous_cosine_of_zenith_angle | cosine of solar zenith angle | none | 1 | real | kind_phys | in | F | !!| ddvel | surface_wind_enhancement_due_to_convection | wind enhancement due to convection | m s-1 | 1 | real | kind_phys | in | F | !!| flag_iter | flag_for_iteration | flag for iteration | flag | 1 | logical | | in | F | !!| flag_guess | flag_for_guess_run | flag for guess run | flag | 1 | logical | | in | F | From 73fc8d6e3cc6fe7fafe0fddb90bc5fafab5bdcc5 Mon Sep 17 00:00:00 2001 From: Ligia Bernardet Date: Wed, 15 Nov 2017 21:42:31 +0000 Subject: [PATCH 14/16] Adding an image for NSST documentation. --- physics/docs/img/NSST.png | Bin 0 -> 88778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 physics/docs/img/NSST.png diff --git a/physics/docs/img/NSST.png b/physics/docs/img/NSST.png new file mode 100644 index 0000000000000000000000000000000000000000..60c62eaaff16971df3ed06369ab9130263680de0 GIT binary patch literal 88778 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%0D<06haOKL`+{iYrAVf3orsxju56Pu zBuznN(``&iLG}ev+&iD}h)jZPT{DVHBe!)kM#jX}r$6>~Cyrgr+XUI)aXw}|Om@>o z^5Gbg+lQlX|5meGLq~7gu^wun9@+Nk`+~?0LE|5OLF3<^LI|~Rmpq{75P2&Ky=}s& z^n2h=Z2pd;dW&?N%!YO3BMG$1-q^}LWVhC#mXx9R{m3o{ms_4fu*yf*auTJ&TVHCT=s@FMga z`Pyv=9n`976sHX%(o_gO)sa4Z9Xh*RE+%@zZp!0O&>QO81jXw>4yJ+LY{hJ8m4k%r zuokGT`Yf#I-bT*4!@i9e4t+WY-iIrX8TyZ6rQ_0nVw17tvLruxi`YBwk*#mGI*KeKyFIAEGCb3c#CyP~?w|Vo zuc2p%KKlrvxi29UKY=;t5q)3r&qStRE`qFcxR;#U-1pTp`VaCyu`mUUhIMTF)z682ypD?79;5u|344~1$P>Eza_S$POX;uvNW~A1 z+pA-6_Val(KKwXx?*pkg<5-$*y9#B@DU=^KW$zWLNDKK*%h>jti^Big8O)|_Bwl%r z8-?nr>*+L+#PJCm#a>k5UPKsc<6kc!-qrC zD=bpq>v=Iw%HQks=Hu~zUuzDEc}(Koxnh=C-g_~S*G;=U^&^_fK4h}&|DL?XtZx6z z*7Xx>{+i}2c3=FntNW5twS%7HtGUw+liA+QR1d29(WqN5w36f5wDTvgalP(Zsua&1 z8#UwDVR4v(?GO#3VuDSh)X>{i5Zjj}D#g0B-r{ogVMRpe(o)1!6VnnhISFew8)lrdLT%&OE zW3uNS^XbQmr3-syde(ToSQr&FU(Z3(Xzr)S=>gZbOfOw|V!QCd$#W_s&U(L7FZrrp zu-{NJx{_g{_vFaEQ{FsF`;$J$ea#`iMccmF13Pem8oIi!f%|3)HttS2_51t&|8s$N zR`Q4H%54zS3<9QDrC8Ouew%@p%xGzAf2`Pd&il!K?}@2rTqO1yw#ck-;oY&jX8EF- zU5U?BuL#-CNV^{Qt4**b!7!!3LzgF z8X9kV@W0cpEtlp1ql}r2M`PX$s1xrxOjhY4J`dg`M?TY!NC7jW%*6WYan8CgI?b5ppco=-Q#WT?!E zxTRPO`_I0=t@yC)yr-QE3=FCzt`Q|Ei6yC4$wjF^iowXh&|KHhP}k5j#K_Rfz|zXt pSlhtB%D_NB;CTd!hTQy=%(P0}8sd24p8z#5c)I$ztaD0e0sxJ?;C=uA literal 0 HcmV?d00001 From ba7c00b20350970c981465aa7f8a09348388a5e5 Mon Sep 17 00:00:00 2001 From: Ligia Bernardet Date: Wed, 15 Nov 2017 21:45:53 +0000 Subject: [PATCH 15/16] Modified files to add NSST documentation and correspondig bibliography. --- physics/docs/library.bib | 18 ++++++++++++++++++ physics/sfc_nst.f | 19 +++++++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/physics/docs/library.bib b/physics/docs/library.bib index 991b7d21b..113ad6dd6 100644 --- a/physics/docs/library.bib +++ b/physics/docs/library.bib @@ -59,6 +59,24 @@ @article{king_and_harshvardhan_1986 Volume = {43}, Year = {1986}} +@url{Li_2015, + Author = {Xu Li}, + Title = {The development of the NSST within the NCEP GFS/CFS}, + Url = {http://cpo.noaa.gov/sites/cpo/MAPP/workshops/rtf_technical_ws/presentations/21_Xu_Li.pdf}} + +@url{Li_Derber_2009, + Author = {Xu Li and John Derber}, + Title = {Near Sea Surface Temperatures (NSST) Analysis in NCEP GFS}, + Url = {https://www.jcsda.noaa.gov/documents/meetings/wkshp2008/4/JCSDA_2008_Li.pdf}} + +@article{Fairall_all_1996, + Author = {C. W. Fairall and E. F. Bradley and J. S. Godfrey and G. A. Wick and J. B. Edson and G. S. Young}, + Journal = {J. Geophys. Res.}, + Pages = {1295-1308}, + Title = {Cool-skin and warm-layer effects on sea surface temperature}, + Volume = {101(C1)}, + Year = {1996}} + @url{key_2002, Address = {Madison, Wisconsin}, Author = {J.R. Key}, diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index a24f1f710..2fd1d4d74 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -9,7 +9,7 @@ module sfc_nst !! @{ !! \brief Near Sea Surface Temperature (NSST) is a temperature profile just below the sea surface. The GFS NSST scheme is used to forecast the NSST for two main purposes: supply SSTs to the atmospheric model for the calculation of air-sea heat and moisture fluxes and providing a sub-layer temperature profile forecast for use as a first guess in the Gridpoint Statistical Interpolator (GSI) data assimilation code. !! -!! The GFS NSST scheme was initially developed at NCEP by Xu Li in 2007, and subsequently received contributions by S. Moorthi, Y.-T. Hu and J. Derber, leading to operational implementation in the GFS in 2017 (Li 2015, Li and Derber 2008 and 2009). The GFS NSST scheme predicts the vertical profile of sea temperature between the surface and a reference level (zr), which is on the order of 5 m. Only two physical process are considered in this scheme: diurnal thermocline layer warming and thermal skin layer (also known as sub-layer) cooling. All other process that could influence NSST are ignored in this simple scheme. +!! The GFS NSST scheme was initially developed at NCEP by Xu Li in 2007, and subsequently received contributions by S. Moorthi, Y.-T. Hu and J. Derber, leading to operational implementation in the GFS in 2017 (Li 2015 \cite Li_2015, and Li and Derber 2009 \cite Li_Derber_2009). The GFS NSST scheme predicts the vertical profile of sea temperature between the surface and a reference level (zr), which is on the order of 5 m. Only two physical process are considered in this scheme: diurnal thermocline layer warming and thermal skin layer (also known as sub-layer) cooling. All other process that could influence NSST are ignored in this simple scheme. !! !!This profile is a composed by subdividing the near-surface layer in three parts !! @@ -22,9 +22,11 @@ module sfc_nst !!Tr is the reference temperature !!zc is the depth of the skin layer !! -!!Prediction for the skin layer is made using the Thermal Skin-layer Model (TSM), while prediction for the thermocline is based on the Diurnal Thermocline Model (DTM), both with an origin on Fairall et al. (1996). Atmospheric inputs include short- and long-wave radiation, surface pressure, surface layer winds, temperature and specific humidity, and rainfall. +!!Prediction for the skin layer is made using the Thermal Skin-layer Model (TSM), while prediction for the thermocline is based on the Diurnal Thermocline Model (DTM), both with an origin on Fairall et al. (1996) \cite Fairall_all_1996. Atmospheric inputs include short- and long-wave radiation, surface pressure, surface layer winds, temperature and specific humidity, and rainfall. !! -!! \section Calling Hierarchy Diagram +!! \htmlonly +!! \endhtmlonly +!! @image html NSST.png "Figure 1: NSST profile." !! !! \section intraphysics Intraphysics Communication !! @@ -120,7 +122,10 @@ subroutine sfc_nst_finalize !! !! This is the main subroutine for the NSST scheme, and it calls the DTM and TSM. !! -!! \section NSST_detailed_algorithm Under construction +!! \section NSST_detailed_algorithm +!! +!! Under construction +!! !! @{ subroutine sfc_nst_run & & ( im, km, ps, u1, v1, t1, q1, tref, cm, ch, & @@ -707,8 +712,10 @@ module sfc_nst_pre !! !! \section intraphysics Intraphysics Communication !! -!! Blah blah blah intraphysics communication - +!! The NSST scheme is one of the three schemes used to represent the +!! surface in the GFS physics suite. The other two are the Noah land +!! surface model and the sice simplified ice model. +!! !> \brief Brief description of the subroutine !! !! Blah blah description of subroutine From a9e084f4d19b7ef2bbcea87ac0249c51c3694fd8 Mon Sep 17 00:00:00 2001 From: "Grant.Firl" Date: Fri, 17 Nov 2017 11:22:13 -0700 Subject: [PATCH 16/16] fixed argument table names to ionclude pre/post in order for longname checker scripts to run correctly --- physics/sfc_nst.f | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/physics/sfc_nst.f b/physics/sfc_nst.f index a24f1f710..2063fe657 100644 --- a/physics/sfc_nst.f +++ b/physics/sfc_nst.f @@ -733,7 +733,7 @@ subroutine sfc_nst_pre_finalize !! !! Blah blah description of subroutine !! -!!\section arg_table_sfc_nst_run Argument Table +!!\section arg_table_sfc_nst_pre_run Argument Table !!| local var name | longname | description | units | rank | type | kind | intent | optional | !!|----------------|------------------------------------------------------------------------------|----------------------------------------------- |---------------|------|---------|-----------|--------|----------| !!| im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F | @@ -834,7 +834,7 @@ subroutine sfc_nst_post_finalize !! !! Blah blah description of subroutine !! -!!\section arg_table_sfc_nst_run Argument Table +!!\section arg_table_sfc_nst_post_run Argument Table !!| local var name | longname | description | units | rank | type | kind | intent | optional | !!|----------------|------------------------------------------------------------------------------|----------------------------------------------- |---------------|------|---------|-----------|--------|----------| !!| im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F |