From db84649fb5e59b3973db6012f66160304d0ce47d Mon Sep 17 00:00:00 2001 From: Timothy Brown Date: Thu, 22 Jun 2017 08:59:29 -0600 Subject: [PATCH 01/43] Initial addition of CCPP layer. Adding an IPD cap file so the IPD can be called by the CCPP. --- IPD_layer/IPD_driver_cap.f90 | 355 +++++++++++++++++++++++++++++++++++ makefile | 14 +- 2 files changed, 366 insertions(+), 3 deletions(-) create mode 100644 IPD_layer/IPD_driver_cap.f90 diff --git a/IPD_layer/IPD_driver_cap.f90 b/IPD_layer/IPD_driver_cap.f90 new file mode 100644 index 000000000..6eacc641b --- /dev/null +++ b/IPD_layer/IPD_driver_cap.f90 @@ -0,0 +1,355 @@ +! +! This work (Common Community Physics Package), identified by NOAA, NCAR, +! CU/CIRES, is free of known copyright restrictions and is placed in the +! public domain. +! +! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +! THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +! IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +! CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +! + +!> +!! @brief Semi-auto-generated cap module for the IPD_driver scheme +!! +! +module IPD_driver_cap + + use, intrinsic :: iso_c_binding, & + only: c_f_pointer, c_ptr + use :: ccpp_types, & + only: ccpp_t + use :: ccpp_fields, & + only: ccpp_fields_get + use :: ccpp_errors, & + only: ccpp_error + use :: IPD_typedefs, & + only: IPD_init_type, & + IPD_control_type, & + IPD_data_type, & + IPD_restart_type, & + IPD_diag_type + use :: IPD_driver, & + only: IPD_initialize, & + IPD_setup_step, & + IPD_radiation_step, & + IPD_physics_step1, & + IPD_physics_step2 + implicit none + + private + public :: ipd_initialize_cap, & + ipd_setup_step_cap, & + ipd_radiation_step_cap, & + ipd_physics_step1_cap, & + ipd_physics_step2_cap + + contains + + subroutine ipd_initialize_cap(ptr) bind(c) + + type(c_ptr), intent(inout) :: ptr + + integer :: ierr + integer, allocatable :: dims(:) + type(ccpp_t), pointer :: cdata => null() + type(IPD_control_type), pointer :: IPD_Control => null() + type(IPD_data_type), pointer :: IPD_Data(:) => null() + type(IPD_diag_type), pointer :: IPD_Diag(:) => null() + type(IPD_restart_type), pointer :: IPD_Restart => null() + type(IPD_init_type), pointer :: Init_parm => null() + type(c_ptr), pointer :: tmp => null() + + call c_f_pointer(ptr, cdata) + + call ccpp_fields_get(cdata, 'IPD_Control', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Control') + return + end if + call c_f_pointer(tmp, IPD_Control) + + call ccpp_fields_get(cdata, 'IPD_Data', tmp, ierr, dims=dims) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Data') + return + end if + call c_f_pointer(tmp, IPD_Data, dims) + + call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr, dims=dims) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Diag') + return + end if + call c_f_pointer(tmp, IPD_Diag, dims) + + call ccpp_fields_get(cdata, 'IPD_Restart', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Restart') + return + end if + call c_f_pointer(tmp, IPD_Restart) + + call ccpp_fields_get(cdata, 'Init_parm', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve Init_parm') + return + end if + call c_f_pointer(tmp, Init_parm) + + if (allocated(dims)) then + deallocate(dims) + end if + + call IPD_initialize(IPD_Control=IPD_Control, & + IPD_Data=IPD_Data, & + IPD_Diag=IPD_Diag, & + IPD_Restart=IPD_Restart, & + IPD_init_parm=Init_parm) + end subroutine ipd_initialize_cap + + subroutine ipd_setup_step_cap(ptr) bind(c) + + type(c_ptr), intent(inout) :: ptr + + integer :: ierr + integer, allocatable :: dims(:) + type(ccpp_t), pointer :: cdata => null() + type(IPD_control_type), pointer :: IPD_Control => null() + type(IPD_data_type), pointer :: IPD_Data(:) => null() + type(IPD_diag_type), pointer :: IPD_Diag(:) => null() + type(IPD_restart_type), pointer :: IPD_Restart => null() + type(c_ptr), pointer :: tmp => null() + + call c_f_pointer(ptr, cdata) + + call ccpp_fields_get(cdata, 'IPD_Control', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Control') + return + end if + call c_f_pointer(tmp, IPD_Control) + + call ccpp_fields_get(cdata, 'IPD_Data', tmp, ierr, dims=dims) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Data') + return + end if + call c_f_pointer(tmp, IPD_Data, dims) + + call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr, dims=dims) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Diag') + return + end if + call c_f_pointer(tmp, IPD_Diag, dims) + + call ccpp_fields_get(cdata, 'IPD_Restart', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Restart') + return + end if + call c_f_pointer(tmp, IPD_Restart) + + if (allocated(dims)) then + deallocate(dims) + end if + + call IPD_setup_step(IPD_Control=IPD_Control, & + IPD_Data=IPD_Data, & + IPD_Diag=IPD_Diag, & + IPD_Restart=IPD_Restart) + end subroutine IPD_setup_step_cap + + subroutine ipd_radiation_step_cap(ptr) bind(c) + + type(c_ptr), intent(inout) :: ptr + + integer :: ierr + integer :: nb + integer, allocatable :: dims(:) + type(ccpp_t), pointer :: cdata => null() + type(IPD_control_type), pointer :: IPD_Control => null() + type(IPD_data_type), pointer :: IPD_Data(:) => null() + type(IPD_diag_type), pointer :: IPD_Diag(:) => null() + type(IPD_restart_type), pointer :: IPD_Restart => null() + integer, pointer :: nblks => null() + type(c_ptr), pointer :: tmp => null() + + call c_f_pointer(ptr, cdata) + + call ccpp_fields_get(cdata, 'IPD_Control', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Control') + return + end if + call c_f_pointer(tmp, IPD_Control) + + call ccpp_fields_get(cdata, 'IPD_Data', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Data') + return + end if + call c_f_pointer(tmp, IPD_Data) + + call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Diag') + return + end if + call c_f_pointer(tmp, IPD_Diag, [250]) + + call ccpp_fields_get(cdata, 'IPD_Restart', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Restart') + return + end if + call c_f_pointer(tmp, IPD_Restart) + + call ccpp_fields_get(cdata, 'nblks', nblks, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve nblks') + return + end if + +!$OMP parallel do default (none) & +!$OMP schedule (dynamic,1), & +!$OMP shared (nblks, IPD_Control, IPD_Data, IPD_Diag, IPD_Restart) & +!$OMP private (nb) + do nb = 1,nblks + call IPD_radiation_step(IPD_Control=IPD_Control, & + IPD_Data=IPD_Data(nb), & + IPD_Diag=IPD_Diag, & + IPD_Restart=IPD_Restart) + end do + end subroutine ipd_radiation_step_cap + + subroutine ipd_physics_step1_cap(ptr) bind(c) + + type(c_ptr), intent(inout) :: ptr + + integer :: ierr + integer :: nb + integer, allocatable :: dims(:) + type(ccpp_t), pointer :: cdata => null() + type(IPD_control_type), pointer :: IPD_Control => null() + type(IPD_data_type), pointer :: IPD_Data(:) => null() + type(IPD_diag_type), pointer :: IPD_Diag(:) => null() + type(IPD_restart_type), pointer :: IPD_Restart => null() + integer, pointer :: nblks => null() + type(c_ptr), pointer :: tmp => null() + + call c_f_pointer(ptr, cdata) + + call ccpp_fields_get_ptr(cdata, 'IPD_Control', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Control') + return + end if + call c_f_pointer(tmp, IPD_Control) + + call ccpp_fields_get(cdata, 'IPD_Data', tmp, ierr, dims=dims) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Data') + return + end if + call c_f_pointer(tmp, IPD_Data, dims) + + call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr, dims=dims) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Diag') + return + end if + call c_f_pointer(tmp, IPD_Diag, dims) + + call ccpp_fields_get(cdata, 'IPD_Restart', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Restart') + return + end if + call c_f_pointer(tmp, IPD_Restart) + + call ccpp_fields_get(cdata, 'nblks', nblks, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve nblks') + return + end if + +!$OMP parallel do default (none) & +!$OMP schedule (dynamic,1), & +!$OMP shared (nblks, IPD_Control, IPD_Data, IPD_Diag, IPD_Restart) & +!$OMP private (nb) + do nb = 1,nblks + call IPD_physics_step1(IPD_Control=IPD_Control, & + IPD_Data=IPD_Data(nb), & + IPD_Diag=IPD_Diag, & + IPD_Restart=IPD_Restart) + end do + end subroutine ipd_physics_step1_cap + + subroutine ipd_physics_step2_cap(ptr) bind(c) + + type(c_ptr), intent(inout) :: ptr + + integer :: ierr + integer :: nb + integer, allocatable :: dims(:) + type(ccpp_t), pointer :: cdata => null() + type(IPD_control_type), pointer :: IPD_Control => null() + type(IPD_data_type), pointer :: IPD_Data(:) => null() + type(IPD_diag_type), pointer :: IPD_Diag(:) => null() + type(IPD_restart_type), pointer :: IPD_Restart => null() + integer, pointer :: nblks => null() + type(c_ptr), pointer :: tmp => null() + + call c_f_pointer(ptr, cdata) + + call ccpp_fields_get_ptr(cdata, 'IPD_Control', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Control') + return + end if + call c_f_pointer(tmp, IPD_Control) + + call ccpp_fields_get(cdata, 'IPD_Data', tmp, ierr, dims=dims) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Data') + return + end if + call c_f_pointer(tmp, IPD_Data, dims) + + call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr, dims=dims) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Diag') + return + end if + call c_f_pointer(tmp, IPD_Diag, dims) + + call ccpp_fields_get(cdata, 'IPD_Restart', tmp, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve IPD_Restart') + return + end if + call c_f_pointer(tmp, IPD_Restart) + + call ccpp_fields_get(cdata, 'nblks', nblks, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve nblks') + return + end if + +!$OMP parallel do default (none) & +!$OMP schedule (dynamic,1), & +!$OMP shared (nblks, IPD_Control, IPD_Data, IPD_Diag, IPD_Restart) & +!$OMP private (nb) + do nb = 1,nblks + call IPD_physics_step2(IPD_Control=IPD_Control, & + IPD_Data=IPD_Data(nb), & + IPD_Diag=IPD_Diag, & + IPD_Restart=IPD_Restart) + end do + end subroutine ipd_physics_step2_cap + +end module IPD_driver_cap diff --git a/makefile b/makefile index 95c891e1b..c0e8b9e25 100644 --- a/makefile +++ b/makefile @@ -15,7 +15,10 @@ else $(info ) endif -LIBRARY = libgfsphys.a +LIBRARY = libgfsphys.so +VER_MAJOR = 1 +VER_MINOR = 0 +VER_PATCH = 0 FFLAGS += -I../fms -I../fms/include @@ -127,7 +130,8 @@ SRCS_f90 = \ ./physics/module_nst_water_prop.f90 \ ./physics/ozinterp.f90 \ ./physics/physcons.f90 \ - ./physics/wam_f107_kp_mod.f90 + ./physics/wam_f107_kp_mod.f90 \ + ./IPD_layer/IPD_driver_cap.f90 SRCS_F = ./physics/aer_cloud.F \ ./physics/cldmacro.F \ @@ -163,7 +167,9 @@ OBJS = $(OBJS_f) $(OBJS_f90) $(OBJS_F) $(OBJS_F90) $(OBJS_c) all default: depend $(LIBRARY) $(LIBRARY): $(OBJS) - $(AR) $(ARFLAGS) $@ $? + $(FC) -shared -Wl,-soname,$(LIBRARY).$(VER_MAJOR) -o $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) + ln -sf $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) $(LIBRARY) + ln -sf $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) $(LIBRARY).$(VER_MAJOR) # this is the place to override default (implicit) compilation rules # and create specific (explicit) rules @@ -176,6 +182,8 @@ clean: @echo "Cleaning gfsphysics ... " @echo $(RM) -f $(LIBRARY) *__genmod.f90 *.o */*.o *.mod *.lst *.i depend + $(RM) -f $(LIBRARY).$(VER_MAJOR) + $(RM) -f $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) MKDEPENDS = ../mkDepends.pl include ../conf/make.rules From 0ae6220a1e386666bbb6fd07121743bd263b4386 Mon Sep 17 00:00:00 2001 From: Laurie Date: Wed, 9 Aug 2017 13:16:05 -0600 Subject: [PATCH 02/43] scheme definition file for gfs physics integration --- IPD_layer/scheme.xml | 166 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 IPD_layer/scheme.xml diff --git a/IPD_layer/scheme.xml b/IPD_layer/scheme.xml new file mode 100644 index 000000000..e9a3ab95c --- /dev/null +++ b/IPD_layer/scheme.xml @@ -0,0 +1,166 @@ + + + + + + IPD_Control + + IPD_Control + 0 + type(IPD_control_type) + + + IPD_Data + + IPD_Data + 1 + type(IPD_data_type) + + + IPD_Diag + + IPD_Diag + 1 + type(IPD_diag_type) + + + IPD_Restart + + IPD_Restart + 0 + type(IPD_restart_type) + + + Init_parm + + Init_parm + 0 + type(IPD_init_type) + + + + + + IPD_Control + + IPD_Control + 0 + type(IPD_control_type) + + + IPD_Data + + IPD_Data + 1 + type(IPD_data_type) + + + IPD_Diag + + IPD_Diag + 1 + type(IPD_diag_type) + + + IPD_Restart + + IPD_Restart + 0 + type(IPD_restart_type) + + + + + + IPD_Control + + IPD_Control + 0 + type(IPD_control_type) + + + IPD_Data + + IPD_Data + 0 + type(IPD_data_type) + + + IPD_Diag + + IPD_Diag + 1 + type(IPD_diag_type) + + + IPD_Restart + + IPD_Restart + 0 + type(IPD_restart_type) + + + + + + IPD_Control + + IPD_Control + 0 + type(IPD_control_type) + + + IPD_Data + + IPD_Data + 0 + type(IPD_data_type) + + + IPD_Diag + + IPD_Diag + 1 + type(IPD_diag_type) + + + IPD_Restart + + IPD_Restart + 0 + type(IPD_restart_type) + + + + + + IPD_Control + + IPD_Control + 0 + type(IPD_control_type) + + + IPD_Data + + IPD_Data + 0 + type(IPD_data_type) + + + IPD_Diag + + IPD_Diag + 1 + type(IPD_diag_type) + + + IPD_Restart + + IPD_Restart + 0 + type(IPD_restart_type) + + + + From 89c4acf30c525a6ade8aa3c1dd9cf4bde193dacc Mon Sep 17 00:00:00 2001 From: Laurie Carson Date: Wed, 16 Aug 2017 13:21:54 -0600 Subject: [PATCH 03/43] library makefile updates (#1) * makefile update: list $(OBJS) to create the dynamic library * makefile updates for dynamic lib --- makefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/makefile b/makefile index c0e8b9e25..a547da291 100644 --- a/makefile +++ b/makefile @@ -67,7 +67,6 @@ SRCS_f = \ ./physics/moninshoc.f \ ./physics/mstadb.f \ ./physics/mstadbtn.f \ - ./physics/mstadbtn2.f \ ./physics/mstcnv.f \ ./physics/namelist_soilveg.f \ ./physics/ozne_def.f \ @@ -77,7 +76,6 @@ SRCS_f = \ ./physics/precpd.f \ ./physics/precpd_shoc.f \ ./physics/precpdp.f \ - ./physics/precpd_shoc.f \ ./physics/progt2.f \ ./physics/progtm_module.f \ ./physics/rad_initialize.f \ @@ -110,8 +108,6 @@ SRCS_f = \ ./physics/sflx.f \ ./physics/shalcnv.f \ ./physics/shalcv.f \ - ./physics/shalcv_1lyr.f \ - ./physics/shalcv_fixdp.f \ ./physics/shalcv_opr.f \ ./physics/tracer_const_h.f \ ./physics/tridi2t3.f @@ -167,7 +163,7 @@ OBJS = $(OBJS_f) $(OBJS_f90) $(OBJS_F) $(OBJS_F90) $(OBJS_c) all default: depend $(LIBRARY) $(LIBRARY): $(OBJS) - $(FC) -shared -Wl,-soname,$(LIBRARY).$(VER_MAJOR) -o $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) + $(FC) -shared -Wl,-soname,$(LIBRARY).$(VER_MAJOR) $(OBJS) -o $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) ln -sf $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) $(LIBRARY) ln -sf $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) $(LIBRARY).$(VER_MAJOR) From 2f9fe3701aea7bea5b514e31e40069bfcf628f1c Mon Sep 17 00:00:00 2001 From: Laurie Date: Thu, 17 Aug 2017 11:03:34 -0600 Subject: [PATCH 04/43] Add -fPIC and LDFLAGS to the library build --- makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/makefile b/makefile index a547da291..2a92e1523 100644 --- a/makefile +++ b/makefile @@ -20,7 +20,7 @@ VER_MAJOR = 1 VER_MINOR = 0 VER_PATCH = 0 -FFLAGS += -I../fms -I../fms/include +FFLAGS += -I../fms -I../fms/include -fPIC CPPDEFS = -DNEW_TAUCTMAX -DSMALL_PE -DNEMS_GSM @@ -163,7 +163,7 @@ OBJS = $(OBJS_f) $(OBJS_f90) $(OBJS_F) $(OBJS_F90) $(OBJS_c) all default: depend $(LIBRARY) $(LIBRARY): $(OBJS) - $(FC) -shared -Wl,-soname,$(LIBRARY).$(VER_MAJOR) $(OBJS) -o $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) + $(FC) -shared -Wl,-soname,$(LIBRARY).$(VER_MAJOR) $(OBJS) $(LDFLAGS) -o $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) ln -sf $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) $(LIBRARY) ln -sf $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) $(LIBRARY).$(VER_MAJOR) From 53e5d22f334fee3c8224da857a192025fb388399 Mon Sep 17 00:00:00 2001 From: "Grant.Firl" Date: Thu, 24 Aug 2017 09:48:54 -0600 Subject: [PATCH 05/43] adding README file for workflow testing purposes --- physics/README | 1 + 1 file changed, 1 insertion(+) create mode 100644 physics/README diff --git a/physics/README b/physics/README new file mode 100644 index 000000000..7b434bf66 --- /dev/null +++ b/physics/README @@ -0,0 +1 @@ +This is a test readme file for workflow testing purposes. From 2336c4a4b7c07567202235b46c328dadbfba1721 Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Mon, 28 Aug 2017 14:53:53 -0600 Subject: [PATCH 06/43] Some small changes, in route to split apart SASAS --- physics/mfdeepcnv.f | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 3fd80606a..15496e4f1 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -1,6 +1,41 @@ - subroutine mfdeepcnv(im,ix,km,delt,delp,prslp,psp,phil,ql, + module sasas_deep + contains + + subroutine sasasdeep_init + end subroutine sasasdeep_init + + subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql, & q1,t1,u1,v1,cldwrk,rn,kbot,ktop,kcnv,islimsk,garea, & dot,ncloud,ud_mf,dd_mf,dt_mf,cnvw,cnvc) +! +! | local var name | longname | units | rank | type | +! | im +! | ix +! | km +! | delt +! | delp +! | prslp +! | psp | surface_air_pressure | Pa | 1 | real | +! | phil +! | ql +! | q1 +! | t1 +! | u1 +! | v1 +! | cldwrk +! | rn +! | kbot +! | ktop +! | kcnv +! | islimsk +! | garea +! | dot +! | ncloud +! | ud_mf +! | dd_mf +! | dt_mf +! | cnvw +! | cnvc ! use machine , only : kind_phys use funcphys , only : fpvs @@ -2247,3 +2282,5 @@ subroutine mfdeepcnv(im,ix,km,delt,delp,prslp,psp,phil,ql, !! return end + + end module sasas_deep From bdd679a6d43419c967f941209c1f25a8acf47c1e Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Tue, 29 Aug 2017 15:57:01 -0600 Subject: [PATCH 07/43] comments for each entry var, rename subrs, enclose in module --- physics/mfdeepcnv.f | 61 ++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 15496e4f1..fe331dd65 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -1,4 +1,4 @@ - module sasas_deep +module sasas_deep contains subroutine sasasdeep_init @@ -8,34 +8,37 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql, & q1,t1,u1,v1,cldwrk,rn,kbot,ktop,kcnv,islimsk,garea, & dot,ncloud,ud_mf,dd_mf,dt_mf,cnvw,cnvc) ! -! | local var name | longname | units | rank | type | -! | im -! | ix -! | km -! | delt -! | delp -! | prslp -! | psp | surface_air_pressure | Pa | 1 | real | -! | phil -! | ql -! | q1 -! | t1 -! | u1 -! | v1 -! | cldwrk -! | rn -! | kbot -! | ktop -! | kcnv -! | islimsk -! | garea -! | dot -! | ncloud -! | ud_mf -! | dd_mf -! | dt_mf -! | cnvw -! | cnvc +! | local var name | longname | description | units | rank | type | kind | intent | +! |================|=======================================================|===============================|=========|======|=========|===========|========| +! | im | horizontal_dimension | number of used points | index | 0 | integer | | in | +! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | +! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | +! | delt | time_step | physics time step | s | 0 | real | kind_phys | in | +! | delp | air_pressure_layer_difference | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | +! | prslp | air_pressure_layer | mean layer presure | Pa | 2 | real | kind_phys | in | +! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | +! | phil | geopotential | layer geopotential | m2 s-2 | 2 | real | kind_phys | in | +! | ql1 | cloud_ice_mixing_ratio | cloud ice | kg kg-1 | 2 | real | kind_phys | inout | +! | ql2 | cloud_liquid_water_mixing_ratio | cloud water | kg kg-1 | 2 | real | kind_phys | inout | +! | q1 | | updated tracers | kg kg-1 | 2 | real | kind_phys | inout | +! | t1 | air_temperature | updated temperature | K | 2 | real | kind_phys | inout | +! | u1 | grid_eastward_wind | updated zonal wind | m s-1 | 2 | real | kind_phys | inout | +! | v1 | grid_northward_wind | updated meridional wind | m s-1 | 2 | real | kind_phys | inout | +! | cldwrk | | cloud work function | m2 s-2 | 1 | real | kind_phys | out | +! | rn | convective_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | +! | kbot | index_for_cloud_base | index for cloud base | index | 1 | integer | | out | +! | ktop | index_for_cloud_top | index for cloud top | index | 1 | integer | | out | +! | kcnv | flag_deep_convection | deep convection: 0=no, 1=yes | flag | 1 | integer | | out | +! | islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | +! | garea | |description | | 1 | real | kind_phys | in | +! | dot | omega | layer mean vertical velocity | Pa s-1 | 2 | real | kind_phys | in | +! | ncloud | | number of cloud species | | 0 | integer | | in | +! | ud_mf | atmosphere_updraft_convective_mass_flux | (updraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | +! | dd_mf | atmosphere_downdraft_convective_mass_flux | (downdraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | +! | dt_mf | atmosphere_updraft_convective_mass_flux_at_cloud_top | ud_mf at cloud top | kg m-2 | 2 | real | kind_phys | out | +! | cnvw | atmosphere_convective_cloud_water_mixing_ratio | convective cloud water | kg kg-1 | 2 | real | kind_phys | out | +! | cnvc | cloud_binary_mask | convective cloud cover | flag | 2 | real | kind_phys | out | + ! use machine , only : kind_phys use funcphys , only : fpvs From aebb1a4dd8833fb65f34afb76a94a56689c9e20f Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Wed, 30 Aug 2017 10:28:10 -0600 Subject: [PATCH 08/43] few more table entries added --- physics/mfdeepcnv.f | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index fe331dd65..0bd42b4f8 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -15,22 +15,22 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql, ! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | ! | delt | time_step | physics time step | s | 0 | real | kind_phys | in | ! | delp | air_pressure_layer_difference | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | -! | prslp | air_pressure_layer | mean layer presure | Pa | 2 | real | kind_phys | in | +! | prslp | air_pressure_layer | mean layer pressure | Pa | 2 | real | kind_phys | in | ! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | ! | phil | geopotential | layer geopotential | m2 s-2 | 2 | real | kind_phys | in | ! | ql1 | cloud_ice_mixing_ratio | cloud ice | kg kg-1 | 2 | real | kind_phys | inout | ! | ql2 | cloud_liquid_water_mixing_ratio | cloud water | kg kg-1 | 2 | real | kind_phys | inout | -! | q1 | | updated tracers | kg kg-1 | 2 | real | kind_phys | inout | +! | q1 | water_vapor_mixing_ratio | updated vapor mixing ratio | kg kg-1 | 2 | real | kind_phys | inout | ! | t1 | air_temperature | updated temperature | K | 2 | real | kind_phys | inout | ! | u1 | grid_eastward_wind | updated zonal wind | m s-1 | 2 | real | kind_phys | inout | ! | v1 | grid_northward_wind | updated meridional wind | m s-1 | 2 | real | kind_phys | inout | -! | cldwrk | | cloud work function | m2 s-2 | 1 | real | kind_phys | out | +! | cldwrk | cloud_work_function | cloud work function | m2 s-2 | 1 | real | kind_phys | out | ! | rn | convective_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | ! | kbot | index_for_cloud_base | index for cloud base | index | 1 | integer | | out | ! | ktop | index_for_cloud_top | index for cloud top | index | 1 | integer | | out | ! | kcnv | flag_deep_convection | deep convection: 0=no, 1=yes | flag | 1 | integer | | out | ! | islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | -! | garea | |description | | 1 | real | kind_phys | in | +! | garea | cell_area | grid cell area | m2 | 1 | real | kind_phys | in | ! | dot | omega | layer mean vertical velocity | Pa s-1 | 2 | real | kind_phys | in | ! | ncloud | | number of cloud species | | 0 | integer | | in | ! | ud_mf | atmosphere_updraft_convective_mass_flux | (updraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | From 781b445dc800097f87b4fb7ca7be0f37d7a53702 Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Wed, 30 Aug 2017 16:15:02 -0600 Subject: [PATCH 09/43] separate ql into ql1 and ql2 --- physics/mfdeepcnv.f | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 0bd42b4f8..1ddfe15cd 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -4,8 +4,8 @@ module sasas_deep subroutine sasasdeep_init end subroutine sasasdeep_init - subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql, - & q1,t1,u1,v1,cldwrk,rn,kbot,ktop,kcnv,islimsk,garea, + subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, + & ql2,q1,t1,u1,v1,cldwrk,rn,kbot,ktop,kcnv,islimsk,garea, & dot,ncloud,ud_mf,dd_mf,dt_mf,cnvw,cnvc) ! ! | local var name | longname | description | units | rank | type | kind | intent | @@ -54,7 +54,8 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql, real(kind=kind_phys) delt real(kind=kind_phys) psp(im), delp(ix,km), prslp(ix,km) real(kind=kind_phys) ps(im), del(ix,km), prsl(ix,km), - & ql(ix,km,2),q1(ix,km), t1(ix,km), + & ql1(ix,km) ql2(ix,im) q1(ix,km), + & t1(ix,km), & u1(ix,km), v1(ix,km), ! & u1(ix,km), v1(ix,km), rcs(im), & cldwrk(im), rn(im), garea(im), @@ -2230,11 +2231,11 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql, if (k >= kbcon(i) .and. k <= ktcon(i)) then tem = dellal(i,k) * xmb(i) * dt2 tem1 = max(0.0, min(1.0, (tcr-t1(i,k))*tcrf)) - if (ql(i,k,2) > -999.0) then - ql(i,k,1) = ql(i,k,1) + tem * tem1 ! ice - ql(i,k,2) = ql(i,k,2) + tem *(1.0-tem1) ! water + if (ql2(i,k) > -999.0) then + ql1(i,k) = ql1(i,k) + tem * tem1 ! ice + ql2(i,k) = ql2(i,k) + tem *(1.0-tem1) ! water else - ql(i,k,1) = ql(i,k,1) + tem + ql1(i,k) = ql1(i,k) + tem endif endif endif From f5bc3e26621fb7bbe6f6412fafa34a8bfc0ed8c2 Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Thu, 31 Aug 2017 09:31:55 -0600 Subject: [PATCH 10/43] fill in table from Jongil Han information --- physics/mfdeepcnv.f | 68 +++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 1ddfe15cd..8de898ef8 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -8,36 +8,36 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, & ql2,q1,t1,u1,v1,cldwrk,rn,kbot,ktop,kcnv,islimsk,garea, & dot,ncloud,ud_mf,dd_mf,dt_mf,cnvw,cnvc) ! -! | local var name | longname | description | units | rank | type | kind | intent | -! |================|=======================================================|===============================|=========|======|=========|===========|========| -! | im | horizontal_dimension | number of used points | index | 0 | integer | | in | -! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | -! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | -! | delt | time_step | physics time step | s | 0 | real | kind_phys | in | -! | delp | air_pressure_layer_difference | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | -! | prslp | air_pressure_layer | mean layer pressure | Pa | 2 | real | kind_phys | in | -! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | -! | phil | geopotential | layer geopotential | m2 s-2 | 2 | real | kind_phys | in | -! | ql1 | cloud_ice_mixing_ratio | cloud ice | kg kg-1 | 2 | real | kind_phys | inout | -! | ql2 | cloud_liquid_water_mixing_ratio | cloud water | kg kg-1 | 2 | real | kind_phys | inout | -! | q1 | water_vapor_mixing_ratio | updated vapor mixing ratio | kg kg-1 | 2 | real | kind_phys | inout | -! | t1 | air_temperature | updated temperature | K | 2 | real | kind_phys | inout | -! | u1 | grid_eastward_wind | updated zonal wind | m s-1 | 2 | real | kind_phys | inout | -! | v1 | grid_northward_wind | updated meridional wind | m s-1 | 2 | real | kind_phys | inout | -! | cldwrk | cloud_work_function | cloud work function | m2 s-2 | 1 | real | kind_phys | out | -! | rn | convective_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | -! | kbot | index_for_cloud_base | index for cloud base | index | 1 | integer | | out | -! | ktop | index_for_cloud_top | index for cloud top | index | 1 | integer | | out | -! | kcnv | flag_deep_convection | deep convection: 0=no, 1=yes | flag | 1 | integer | | out | -! | islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | -! | garea | cell_area | grid cell area | m2 | 1 | real | kind_phys | in | -! | dot | omega | layer mean vertical velocity | Pa s-1 | 2 | real | kind_phys | in | -! | ncloud | | number of cloud species | | 0 | integer | | in | -! | ud_mf | atmosphere_updraft_convective_mass_flux | (updraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | -! | dd_mf | atmosphere_downdraft_convective_mass_flux | (downdraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | -! | dt_mf | atmosphere_updraft_convective_mass_flux_at_cloud_top | ud_mf at cloud top | kg m-2 | 2 | real | kind_phys | out | -! | cnvw | atmosphere_convective_cloud_water_mixing_ratio | convective cloud water | kg kg-1 | 2 | real | kind_phys | out | -! | cnvc | cloud_binary_mask | convective cloud cover | flag | 2 | real | kind_phys | out | +! | local var name | longname | description | units | rank | type | kind | intent | +! |================|=======================================================|====================================|=========|======|=========|===========|========| +! | im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | +! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | +! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | +! | delt | time_step | physics time step | s | 0 | real | kind_phys | in | +! | delp | air_pressure_layer_difference | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | +! | prslp | air_pressure_layer | mean layer pressure | Pa | 2 | real | kind_phys | in | +! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | +! | phil | geopotential | layer geopotential | m2 s-2 | 2 | real | kind_phys | in | +! | ql1 | cloud_ice_specific_humidity | cloud ice specific humidity | kg kg-1 | 2 | real | kind_phys | inout | +! | ql2 | cloud_liquid_water_specific_humidity | cloud water specific humidity | kg kg-1 | 2 | real | kind_phys | inout | +! | q1 | water_vapor_specific_humidity | updated vapor specific humidity | kg kg-1 | 2 | real | kind_phys | inout | +! | t1 | air_temperature | updated temperature | K | 2 | real | kind_phys | inout | +! | u1 | grid_eastward_wind | updated zonal wind | m s-1 | 2 | real | kind_phys | inout | +! | v1 | grid_northward_wind | updated meridional wind | m s-1 | 2 | real | kind_phys | inout | +! | cldwrk | cloud_work_function | cloud work function | m2 s-2 | 1 | real | kind_phys | out | +! | rn | convective_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | +! | kbot | index_for_cloud_base | index for cloud base | index | 1 | integer | | out | +! | ktop | index_for_cloud_top | index for cloud top | index | 1 | integer | | out | +! | kcnv | flag_deep_convection | deep convection: 0=no, 1=yes | flag | 1 | integer | | out | +! | islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | +! | garea | cell_area | grid cell area | m2 | 1 | real | kind_phys | in | +! | dot | omega | layer mean vertical velocity | Pa s-1 | 2 | real | kind_phys | in | +! | ncloud | number_of_hydrometeors | number of hydrometeors | count | 0 | integer | | in | +! | ud_mf | atmosphere_updraft_convective_mass_flux | (updraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | +! | dd_mf | atmosphere_downdraft_convective_mass_flux | (downdraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | +! | dt_mf | atmosphere_updraft_convective_mass_flux_at_cloud_top | ud_mf at cloud top | kg m-2 | 2 | real | kind_phys | out | +! | cnvw | atmosphere_convective_cloud_water_specific_humidity | convective cloud water | kg kg-1 | 2 | real | kind_phys | out | +! | cnvc | cloud_binary_mask | convective cloud cover | flag | 2 | real | kind_phys | out | ! use machine , only : kind_phys @@ -48,6 +48,8 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, &, eps => con_eps, epsm1 => con_epsm1 implicit none ! +! In the current NCEP spectral model im <= ix for reduced grid numbers +! near the pole and a parallel computing. For FV3, im=ix. integer im, ix, km, ncloud, & kbot(im), ktop(im), kcnv(im) ! &, me @@ -405,9 +407,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, c column variables c p is pressure of the layer (mb) c t is temperature at t-dt (k)..tn -c q is mixing ratio at t-dt (kg/kg)..qn -c to is temperature at t+dt (k)... this is after advection and turbulan -c qo is mixing ratio at t+dt (kg/kg)..q1 +c q is specific humidity at t-dt (kg/kg)..qn +c to is temperature at t+dt (k)... this is after advection and turbulence +c qo is specific humidity at t+dt (kg/kg)..q1 c do k = 1, km do i=1,im From 7fca15c0dd193829d443b3786ec7fc7cee2261c0 Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Thu, 31 Aug 2017 13:38:08 -0600 Subject: [PATCH 11/43] split out cloud ice and water, pass in qv only --- GFS_layer/GFS_physics_driver.F90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/GFS_layer/GFS_physics_driver.F90 b/GFS_layer/GFS_physics_driver.F90 index 9b92e4764..fbac5c992 100644 --- a/GFS_layer/GFS_physics_driver.F90 +++ b/GFS_layer/GFS_physics_driver.F90 @@ -1681,7 +1681,8 @@ subroutine GFS_physics_driver & dt_mf, cnvw, cnvc) elseif (Model%imfdeepcnv == 2) then call mfdeepcnv (im, ix, levs, dtp, del, Statein%prsl, & - Statein%pgr, Statein%phil, clw(:,:,1:2), Stateout%gq0, & + Statein%pgr, Statein%phil, clw(:,:,1), & + clw(:,:,2), Stateout%gq0(:,:,1), & Stateout%gt0, Stateout%gu0, Stateout%gv0, & cld1d, rain1, kbot, ktop, kcnv, islmsk, & garea, Statein%vvl, Model%ncld, ud_mf, dd_mf, & From ecb8737f0225b2f9e6fd997835a87bce6c0c0059 Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Thu, 31 Aug 2017 14:16:54 -0600 Subject: [PATCH 12/43] swap name from mfdeepcnv to sasasdeep_run --- GFS_layer/GFS_physics_driver.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GFS_layer/GFS_physics_driver.F90 b/GFS_layer/GFS_physics_driver.F90 index fbac5c992..249d8fd6a 100644 --- a/GFS_layer/GFS_physics_driver.F90 +++ b/GFS_layer/GFS_physics_driver.F90 @@ -1680,7 +1680,7 @@ subroutine GFS_physics_driver & islmsk, Statein%vvl, Model%ncld, ud_mf, dd_mf, & dt_mf, cnvw, cnvc) elseif (Model%imfdeepcnv == 2) then - call mfdeepcnv (im, ix, levs, dtp, del, Statein%prsl, & + call sasasdeep_run (im, ix, levs, dtp, del, Statein%prsl, & Statein%pgr, Statein%phil, clw(:,:,1), & clw(:,:,2), Stateout%gq0(:,:,1), & Stateout%gt0, Stateout%gu0, Stateout%gv0, & From 3a62e3d690419759eef29689c1aef3a1b30fe045 Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Fri, 1 Sep 2017 13:55:32 -0600 Subject: [PATCH 13/43] add the optional column --- physics/mfdeepcnv.f | 61 ++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 8de898ef8..1579b5231 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -8,37 +8,36 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, & ql2,q1,t1,u1,v1,cldwrk,rn,kbot,ktop,kcnv,islimsk,garea, & dot,ncloud,ud_mf,dd_mf,dt_mf,cnvw,cnvc) ! -! | local var name | longname | description | units | rank | type | kind | intent | -! |================|=======================================================|====================================|=========|======|=========|===========|========| -! | im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | -! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | -! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | -! | delt | time_step | physics time step | s | 0 | real | kind_phys | in | -! | delp | air_pressure_layer_difference | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | -! | prslp | air_pressure_layer | mean layer pressure | Pa | 2 | real | kind_phys | in | -! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | -! | phil | geopotential | layer geopotential | m2 s-2 | 2 | real | kind_phys | in | -! | ql1 | cloud_ice_specific_humidity | cloud ice specific humidity | kg kg-1 | 2 | real | kind_phys | inout | -! | ql2 | cloud_liquid_water_specific_humidity | cloud water specific humidity | kg kg-1 | 2 | real | kind_phys | inout | -! | q1 | water_vapor_specific_humidity | updated vapor specific humidity | kg kg-1 | 2 | real | kind_phys | inout | -! | t1 | air_temperature | updated temperature | K | 2 | real | kind_phys | inout | -! | u1 | grid_eastward_wind | updated zonal wind | m s-1 | 2 | real | kind_phys | inout | -! | v1 | grid_northward_wind | updated meridional wind | m s-1 | 2 | real | kind_phys | inout | -! | cldwrk | cloud_work_function | cloud work function | m2 s-2 | 1 | real | kind_phys | out | -! | rn | convective_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | -! | kbot | index_for_cloud_base | index for cloud base | index | 1 | integer | | out | -! | ktop | index_for_cloud_top | index for cloud top | index | 1 | integer | | out | -! | kcnv | flag_deep_convection | deep convection: 0=no, 1=yes | flag | 1 | integer | | out | -! | islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | -! | garea | cell_area | grid cell area | m2 | 1 | real | kind_phys | in | -! | dot | omega | layer mean vertical velocity | Pa s-1 | 2 | real | kind_phys | in | -! | ncloud | number_of_hydrometeors | number of hydrometeors | count | 0 | integer | | in | -! | ud_mf | atmosphere_updraft_convective_mass_flux | (updraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | -! | dd_mf | atmosphere_downdraft_convective_mass_flux | (downdraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | -! | dt_mf | atmosphere_updraft_convective_mass_flux_at_cloud_top | ud_mf at cloud top | kg m-2 | 2 | real | kind_phys | out | -! | cnvw | atmosphere_convective_cloud_water_specific_humidity | convective cloud water | kg kg-1 | 2 | real | kind_phys | out | -! | cnvc | cloud_binary_mask | convective cloud cover | flag | 2 | real | kind_phys | out | - +! | 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 | +! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | F | +! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | +! | delt | time_step | physics time step | s | 0 | real | kind_phys | in | F | +! | delp | air_pressure_layer_difference | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | F | +! | prslp | air_pressure_layer | mean layer pressure | Pa | 2 | real | kind_phys | in | F | +! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | +! | phil | geopotential | layer geopotential | m2 s-2 | 2 | real | kind_phys | in | F | +! | ql1 | cloud_ice_specific_humidity | cloud ice specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | +! | ql2 | cloud_liquid_water_specific_humidity | cloud water specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | +! | q1 | water_vapor_specific_humidity | updated vapor specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | +! | t1 | air_temperature | updated temperature | K | 2 | real | kind_phys | inout | F | +! | u1 | grid_eastward_wind | updated zonal wind | m s-1 | 2 | real | kind_phys | inout | F | +! | v1 | grid_northward_wind | updated meridional wind | m s-1 | 2 | real | kind_phys | inout | F | +! | cldwrk | cloud_work_function | cloud work function | m2 s-2 | 1 | real | kind_phys | out | F | +! | rn | convective_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | F | +! | kbot | index_for_cloud_base | index for cloud base | index | 1 | integer | | out | F | +! | ktop | index_for_cloud_top | index for cloud top | index | 1 | integer | | out | F | +! | kcnv | flag_deep_convection | deep convection: 0=no, 1=yes | flag | 1 | integer | | out | F | +! | islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | +! | garea | cell_area | grid cell area | m2 | 1 | real | kind_phys | in | F | +! | dot | omega | layer mean vertical velocity | Pa s-1 | 2 | real | kind_phys | in | F | +! | ncloud | number_of_hydrometeors | number of hydrometeors | count | 0 | integer | | in | F | +! | ud_mf | atmosphere_updraft_convective_mass_flux | (updraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | +! | dd_mf | atmosphere_downdraft_convective_mass_flux | (downdraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | +! | dt_mf | atmosphere_updraft_convective_mass_flux_at_cloud_top | ud_mf at cloud top | kg m-2 | 2 | real | kind_phys | out | F | +! | cnvw | atmosphere_convective_cloud_water_specific_humidity | convective cloud water | kg kg-1 | 2 | real | kind_phys | out | F | +! | cnvc | cloud_binary_mask | convective cloud cover | flag | 2 | real | kind_phys | out | F | ! use machine , only : kind_phys use funcphys , only : fpvs From 76384778ffb7fb45c321b5eb2e54108bb48e08ac Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Tue, 5 Sep 2017 10:47:39 -0600 Subject: [PATCH 14/43] Index errors, found by Julie --- physics/mfdeepcnv.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 1579b5231..102000868 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -55,7 +55,7 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, real(kind=kind_phys) delt real(kind=kind_phys) psp(im), delp(ix,km), prslp(ix,km) real(kind=kind_phys) ps(im), del(ix,km), prsl(ix,km), - & ql1(ix,km) ql2(ix,im) q1(ix,km), + & ql1(ix,km), ql2(ix,km) q1(ix,km), & t1(ix,km), & u1(ix,km), v1(ix,km), ! & u1(ix,km), v1(ix,km), rcs(im), From 91b4f1779cb5cb53b162788e2b078689b11bc282 Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Tue, 5 Sep 2017 10:50:16 -0600 Subject: [PATCH 15/43] ... and commas are important, too! --- physics/mfdeepcnv.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 102000868..bec1fcd94 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -55,7 +55,7 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, real(kind=kind_phys) delt real(kind=kind_phys) psp(im), delp(ix,km), prslp(ix,km) real(kind=kind_phys) ps(im), del(ix,km), prsl(ix,km), - & ql1(ix,km), ql2(ix,km) q1(ix,km), + & ql1(ix,km), ql2(ix,km), q1(ix,km), & t1(ix,km), & u1(ix,km), v1(ix,km), ! & u1(ix,km), v1(ix,km), rcs(im), From 4a910af7900955548cf06383d0327d39598e67c0 Mon Sep 17 00:00:00 2001 From: Timothy Brown Date: Wed, 6 Sep 2017 09:29:04 -0600 Subject: [PATCH 16/43] Bugfix. (#6) Bugfix to update the IPD driver cap to use the CCPP without crashing. --- IPD_layer/IPD_driver_cap.f90 | 54 +++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/IPD_layer/IPD_driver_cap.f90 b/IPD_layer/IPD_driver_cap.f90 index 6eacc641b..a4174caee 100644 --- a/IPD_layer/IPD_driver_cap.f90 +++ b/IPD_layer/IPD_driver_cap.f90 @@ -37,6 +37,8 @@ module IPD_driver_cap IPD_radiation_step, & IPD_physics_step1, & IPD_physics_step2 + use :: namelist_soilveg, & + only: salp_data, snupx, max_vegtyp implicit none private @@ -60,7 +62,9 @@ subroutine ipd_initialize_cap(ptr) bind(c) type(IPD_diag_type), pointer :: IPD_Diag(:) => null() type(IPD_restart_type), pointer :: IPD_Restart => null() type(IPD_init_type), pointer :: Init_parm => null() - type(c_ptr), pointer :: tmp => null() + type(c_ptr) :: tmp + real, pointer :: l_snupx(:) => null() + real, pointer :: l_salp_data => null() call c_f_pointer(ptr, cdata) @@ -103,11 +107,17 @@ subroutine ipd_initialize_cap(ptr) bind(c) deallocate(dims) end if + call ccpp_fields_get(cdata, 'salp_data', l_salp_data, ierr) + call ccpp_fields_get(cdata, 'snupx', l_snupx, ierr) + call IPD_initialize(IPD_Control=IPD_Control, & IPD_Data=IPD_Data, & IPD_Diag=IPD_Diag, & IPD_Restart=IPD_Restart, & IPD_init_parm=Init_parm) + + l_snupx = snupx + l_salp_data = salp_data end subroutine ipd_initialize_cap subroutine ipd_setup_step_cap(ptr) bind(c) @@ -121,7 +131,7 @@ subroutine ipd_setup_step_cap(ptr) bind(c) type(IPD_data_type), pointer :: IPD_Data(:) => null() type(IPD_diag_type), pointer :: IPD_Diag(:) => null() type(IPD_restart_type), pointer :: IPD_Restart => null() - type(c_ptr), pointer :: tmp => null() + type(c_ptr) :: tmp call c_f_pointer(ptr, cdata) @@ -175,11 +185,17 @@ subroutine ipd_radiation_step_cap(ptr) bind(c) type(IPD_data_type), pointer :: IPD_Data(:) => null() type(IPD_diag_type), pointer :: IPD_Diag(:) => null() type(IPD_restart_type), pointer :: IPD_Restart => null() - integer, pointer :: nblks => null() - type(c_ptr), pointer :: tmp => null() + integer, pointer :: nblks + type(c_ptr) :: tmp call c_f_pointer(ptr, cdata) + call ccpp_fields_get(cdata, 'nblks', nblks, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve nblks') + return + end if + call ccpp_fields_get(cdata, 'IPD_Control', tmp, ierr) if (ierr /= 0) then call ccpp_error('Unable to retrieve IPD_Control') @@ -192,7 +208,7 @@ subroutine ipd_radiation_step_cap(ptr) bind(c) call ccpp_error('Unable to retrieve IPD_Data') return end if - call c_f_pointer(tmp, IPD_Data) + call c_f_pointer(tmp, IPD_Data, [nblks]) call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr) if (ierr /= 0) then @@ -238,12 +254,18 @@ subroutine ipd_physics_step1_cap(ptr) bind(c) type(IPD_data_type), pointer :: IPD_Data(:) => null() type(IPD_diag_type), pointer :: IPD_Diag(:) => null() type(IPD_restart_type), pointer :: IPD_Restart => null() - integer, pointer :: nblks => null() - type(c_ptr), pointer :: tmp => null() + integer, pointer :: nblks + type(c_ptr) :: tmp call c_f_pointer(ptr, cdata) - call ccpp_fields_get_ptr(cdata, 'IPD_Control', tmp, ierr) + call ccpp_fields_get(cdata, 'nblks', nblks, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve nblks') + return + end if + + call ccpp_fields_get(cdata, 'IPD_Control', tmp, ierr) if (ierr /= 0) then call ccpp_error('Unable to retrieve IPD_Control') return @@ -255,7 +277,7 @@ subroutine ipd_physics_step1_cap(ptr) bind(c) call ccpp_error('Unable to retrieve IPD_Data') return end if - call c_f_pointer(tmp, IPD_Data, dims) + call c_f_pointer(tmp, IPD_Data, [nblks]) call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr, dims=dims) if (ierr /= 0) then @@ -301,12 +323,18 @@ subroutine ipd_physics_step2_cap(ptr) bind(c) type(IPD_data_type), pointer :: IPD_Data(:) => null() type(IPD_diag_type), pointer :: IPD_Diag(:) => null() type(IPD_restart_type), pointer :: IPD_Restart => null() - integer, pointer :: nblks => null() - type(c_ptr), pointer :: tmp => null() + integer, pointer :: nblks + type(c_ptr) :: tmp call c_f_pointer(ptr, cdata) - call ccpp_fields_get_ptr(cdata, 'IPD_Control', tmp, ierr) + call ccpp_fields_get(cdata, 'nblks', nblks, ierr) + if (ierr /= 0) then + call ccpp_error('Unable to retrieve nblks') + return + end if + + call ccpp_fields_get(cdata, 'IPD_Control', tmp, ierr) if (ierr /= 0) then call ccpp_error('Unable to retrieve IPD_Control') return @@ -318,7 +346,7 @@ subroutine ipd_physics_step2_cap(ptr) bind(c) call ccpp_error('Unable to retrieve IPD_Data') return end if - call c_f_pointer(tmp, IPD_Data, dims) + call c_f_pointer(tmp, IPD_Data, [nblks]) call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr, dims=dims) if (ierr /= 0) then From 4c9b73aa93a4de62451ca2905360fe81ed6d5830 Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Thu, 7 Sep 2017 13:46:22 -0600 Subject: [PATCH 17/43] column 7 for module name, turn "=" to "-" in variable table --- physics/mfdeepcnv.f | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index bec1fcd94..a441a3852 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -1,4 +1,4 @@ -module sasas_deep + module sasas_deep contains subroutine sasasdeep_init @@ -9,7 +9,7 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, & dot,ncloud,ud_mf,dd_mf,dt_mf,cnvw,cnvc) ! ! | 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 | ! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | F | ! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | From 4b5618da606129a70809501b55a8c06375d69c7d Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Thu, 7 Sep 2017 14:32:28 -0600 Subject: [PATCH 18/43] better names for u and v --- physics/mfdeepcnv.f | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index a441a3852..b76b489f6 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -22,8 +22,8 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, ! | ql2 | cloud_liquid_water_specific_humidity | cloud water specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | ! | q1 | water_vapor_specific_humidity | updated vapor specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | ! | t1 | air_temperature | updated temperature | K | 2 | real | kind_phys | inout | F | -! | u1 | grid_eastward_wind | updated zonal wind | m s-1 | 2 | real | kind_phys | inout | F | -! | v1 | grid_northward_wind | updated meridional wind | m s-1 | 2 | real | kind_phys | inout | F | +! | u1 | x_wind | updated x-direction wind | m s-1 | 2 | real | kind_phys | inout | F | +! | v1 | y_wind | updated y-direction wind | m s-1 | 2 | real | kind_phys | inout | F | ! | cldwrk | cloud_work_function | cloud work function | m2 s-2 | 1 | real | kind_phys | out | F | ! | rn | convective_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | F | ! | kbot | index_for_cloud_base | index for cloud base | index | 1 | integer | | out | F | From 59a0626c36e1934b178714af457b394a4b4fdcbb Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Tue, 12 Sep 2017 08:59:51 -0600 Subject: [PATCH 19/43] maybe some of the doxygen things --- physics/mfdeepcnv.f | 422 ++++++++++++++++++++++---------------------- 1 file changed, 212 insertions(+), 210 deletions(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index b76b489f6..50bf9bdda 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -1,43 +1,50 @@ +!> \file mfdeepcnv.f +!! This file contains NCEP's Scale Aware Simplified Arakawa Schubert Scheme +!! for convection. +!! @{ module sasas_deep contains +!! @{ subroutine sasasdeep_init end subroutine sasasdeep_init +!! @} +!! @{ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, & ql2,q1,t1,u1,v1,cldwrk,rn,kbot,ktop,kcnv,islimsk,garea, & dot,ncloud,ud_mf,dd_mf,dt_mf,cnvw,cnvc) -! -! | 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 | -! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | F | -! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | -! | delt | time_step | physics time step | s | 0 | real | kind_phys | in | F | -! | delp | air_pressure_layer_difference | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | F | -! | prslp | air_pressure_layer | mean layer pressure | Pa | 2 | real | kind_phys | in | F | -! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | -! | phil | geopotential | layer geopotential | m2 s-2 | 2 | real | kind_phys | in | F | -! | ql1 | cloud_ice_specific_humidity | cloud ice specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | -! | ql2 | cloud_liquid_water_specific_humidity | cloud water specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | -! | q1 | water_vapor_specific_humidity | updated vapor specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | -! | t1 | air_temperature | updated temperature | K | 2 | real | kind_phys | inout | F | -! | u1 | x_wind | updated x-direction wind | m s-1 | 2 | real | kind_phys | inout | F | -! | v1 | y_wind | updated y-direction wind | m s-1 | 2 | real | kind_phys | inout | F | -! | cldwrk | cloud_work_function | cloud work function | m2 s-2 | 1 | real | kind_phys | out | F | -! | rn | convective_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | F | -! | kbot | index_for_cloud_base | index for cloud base | index | 1 | integer | | out | F | -! | ktop | index_for_cloud_top | index for cloud top | index | 1 | integer | | out | F | -! | kcnv | flag_deep_convection | deep convection: 0=no, 1=yes | flag | 1 | integer | | out | F | -! | islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | -! | garea | cell_area | grid cell area | m2 | 1 | real | kind_phys | in | F | -! | dot | omega | layer mean vertical velocity | Pa s-1 | 2 | real | kind_phys | in | F | -! | ncloud | number_of_hydrometeors | number of hydrometeors | count | 0 | integer | | in | F | -! | ud_mf | atmosphere_updraft_convective_mass_flux | (updraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | -! | dd_mf | atmosphere_downdraft_convective_mass_flux | (downdraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | -! | dt_mf | atmosphere_updraft_convective_mass_flux_at_cloud_top | ud_mf at cloud top | kg m-2 | 2 | real | kind_phys | out | F | -! | cnvw | atmosphere_convective_cloud_water_specific_humidity | convective cloud water | kg kg-1 | 2 | real | kind_phys | out | F | -! | cnvc | cloud_binary_mask | convective cloud cover | flag | 2 | real | kind_phys | out | F | +!!\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 | +!! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | F | +!! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | +!! | delt | time_step | physics time step | s | 0 | real | kind_phys | in | F | +!! | delp | air_pressure_layer_difference | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | F | +!! | prslp | air_pressure_layer | mean layer pressure | Pa | 2 | real | kind_phys | in | F | +!! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | +!! | phil | geopotential | layer geopotential | m2 s-2 | 2 | real | kind_phys | in | F | +!! | ql1 | cloud_ice_specific_humidity | cloud ice specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | +!! | ql2 | cloud_liquid_water_specific_humidity | cloud water specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | +!! | q1 | water_vapor_specific_humidity | updated vapor specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | +!! | t1 | air_temperature | updated temperature | K | 2 | real | kind_phys | inout | F | +!! | u1 | x_wind | updated x-direction wind | m s-1 | 2 | real | kind_phys | inout | F | +!! | v1 | y_wind | updated y-direction wind | m s-1 | 2 | real | kind_phys | inout | F | +!! | cldwrk | cloud_work_function | cloud work function | m2 s-2 | 1 | real | kind_phys | out | F | +!! | rn | convective_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | F | +!! | kbot | index_for_cloud_base | index for cloud base | index | 1 | integer | | out | F | +!! | ktop | index_for_cloud_top | index for cloud top | index | 1 | integer | | out | F | +!! | kcnv | flag_deep_convection | deep convection: 0=no, 1=yes | flag | 1 | integer | | out | F | +!! | islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | +!! | garea | cell_area | grid cell area | m2 | 1 | real | kind_phys | in | F | +!! | dot | omega | layer mean vertical velocity | Pa s-1 | 2 | real | kind_phys | in | F | +!! | ncloud | number_of_hydrometeors | number of hydrometeors | count | 0 | integer | | in | F | +!! | ud_mf | atmosphere_updraft_convective_mass_flux | (updraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | +!! | dd_mf | atmosphere_downdraft_convective_mass_flux | (downdraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | +!! | dt_mf | atmosphere_updraft_convective_mass_flux_at_cloud_top | ud_mf at cloud top | kg m-2 | 2 | real | kind_phys | out | F | +!! | cnvw | atmosphere_convective_cloud_water_specific_humidity | convective cloud water | kg kg-1 | 2 | real | kind_phys | out | F | +!! | cnvc | cloud_binary_mask | convective cloud cover | flag | 2 | real | kind_phys | out | F | ! use machine , only : kind_phys use funcphys , only : fpvs @@ -127,30 +134,30 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, & xmb(im), xmbmax(im), xpwav(im), & xpwev(im), xlamx(im), & delubar(im),delvbar(im) -! + real(kind=kind_phys) c0(im) cj real(kind=kind_phys) cinpcr, cinpcrmx, cinpcrmn, & cinacr, cinacrmx, cinacrmn cj -! -! parameters for updraft velocity calculation + +!> parameters for updraft velocity calculation real(kind=kind_phys) bet1, cd1, f1, gam1, & bb1, bb2, wucb -! + c physical parameters parameter(g=grav,asolfac=0.89) parameter(elocp=hvap/cp,el2orc=hvap*hvap/(rv*cp)) parameter(c0s=.002,c1=.002,d0=.01) parameter(c0l=c0s*asolfac) -! -! asolfac: aerosol-aware parameter based on Lim & Hong (2012) -! asolfac= cx / c0s(=.002) -! cx = min([-0.7 ln(Nccn) + 24]*1.e-4, c0s) -! Nccn: CCN number concentration in cm^(-3) -! Until a realistic Nccn is provided, typical Nccns are assumed -! as Nccn=100 for sea and Nccn=7000 for land -! + +!> asolfac: aerosol-aware parameter based on Lim & Hong (2012) +!! asolfac= cx / c0s(=.002) +!! cx = min([-0.7 ln(Nccn) + 24]*1.e-4, c0s) +!! Nccn: CCN number concentration in cm^(-3) +!! Until a realistic Nccn is provided, typical Nccns are assumed +!! as Nccn=100 for sea and Nccn=7000 for land + parameter(cm=1.0,delta=fv) parameter(fact1=(cvap-cliq)/rv,fact2=hvap/rv-fact1*t0c) parameter(cthk=200.,dthk=25.) @@ -159,15 +166,15 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, parameter(cinacrmx=-120.,cinacrmn=-80.) parameter(bet1=1.875,cd1=.506,f1=2.0,gam1=.5) parameter(betaw=.03,dxcrtas=8.e3,dxcrtuf=15.e3) -! -! local variables and arrays + +!> local variables and arrays real(kind=kind_phys) pfld(im,km), to(im,km), qo(im,km), & uo(im,km), vo(im,km), qeso(im,km) -! for updraft velocity calculation +!> for updraft velocity calculation real(kind=kind_phys) wu2(im,km), buo(im,km), drag(im,km) real(kind=kind_phys) wc(im), scaldfunc(im), sigmagfm(im) -! -c cloud water + +!> cloud water ! real(kind=kind_phys) tvo(im,km) real(kind=kind_phys) qlko_ktcon(im), dellal(im,km), tvo(im,km), & dbyo(im,km), zo(im,km), @@ -182,11 +189,11 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, & pwo(im,km), pwdo(im,km), c0t(im,km), & tx1(im), sumx(im), cnvwt(im,km) ! &, rhbar(im) -! + logical totflg, cnvflg(im), asqecflg(im), flg(im) -! -! asqecflg: flag for the quasi-equilibrium assumption of Arakawa-Schubert -! + +!> asqecflg: flag for the quasi-equilibrium assumption of Arakawa-Schubert + ! real(kind=kind_phys) pcrit(15), acritt(15), acrit(15) !! save pcrit, acritt ! data pcrit/850.,800.,750.,700.,650.,600.,550.,500.,450.,400., @@ -202,7 +209,7 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, c----------------------------------------------------------------------- ! !************************************************************************ -! convert input Pa terms to Cb terms -- Moorthi +!> convert input Pa terms to Cb terms -- Moorthi ps = psp * 0.001 prsl = prslp * 0.001 del = delp * 0.001 @@ -210,9 +217,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, ! ! km1 = km - 1 -c -c initialize arrays -c + +!> initialize arrays + do i=1,im cnvflg(i) = .true. rn(i)=0. @@ -290,7 +297,7 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, ! val = 5400. val = 10800. dtmax = max(dt2, val ) -c model tunable parameters are all here +!> model tunable parameters are all here edtmaxl = .3 edtmaxs = .3 clam = .1 @@ -322,10 +329,10 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, w2s = -2.e-3 w3s = -1.e-3 w4s = -2.e-5 -c -c define top layer for search of the downdraft originating layer -c and the maximum thetae for updraft -c + +!> define top layer for search of the downdraft originating layer +!! and the maximum thetae for updraft + do i=1,im kbmax(i) = km kbm(i) = km @@ -345,10 +352,10 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, kbmax(i) = min(kbmax(i),kmax(i)) kbm(i) = min(kbm(i),kmax(i)) enddo -c -c hydrostatic height assume zero terr and initially assume -c updraft entrainment rate as an inverse function of height -c + +!> hydrostatic height assume zero terr and initially assume +!! updraft entrainment rate as an inverse function of height + do k = 1, km do i=1,im zo(i,k) = phil(i,k) / g @@ -361,10 +368,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, ! xlamue(i,k) = max(xlamue(i,k), crtlamu) enddo enddo -c -c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -c convert surface pressure to mb from cb -c + +!> convert surface pressure to mb from cb + do k = 1, km do i = 1, im if (k <= kmax(i)) then @@ -402,14 +408,14 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c column variables -c p is pressure of the layer (mb) -c t is temperature at t-dt (k)..tn -c q is specific humidity at t-dt (kg/kg)..qn -c to is temperature at t+dt (k)... this is after advection and turbulence -c qo is specific humidity at t+dt (kg/kg)..q1 -c + +!> column variables +!! p is pressure of the layer (mb) +!! t is temperature at t-dt (k)..tn +!! q is specific humidity at t-dt (kg/kg)..qn +!! to is temperature at t+dt (k)... this is after advection and turbulence +!! qo is specific humidity at t+dt (kg/kg)..q1 + do k = 1, km do i=1,im if (k <= kmax(i)) then @@ -424,9 +430,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c compute moist static energy -c + +!> compute moist static energy + do k = 1, km do i=1,im if (k <= kmax(i)) then @@ -438,10 +444,10 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c determine level with largest moist static energy -c this is the level where updraft starts -c + +!> determine level with largest moist static energy +!! this is the level where updraft starts + do i=1,im hmax(i) = heo(i,1) kb(i) = 1 @@ -498,9 +504,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c look for the level of free convection as cloud base -c + +!> look for the level of free convection as cloud base + do i=1,im flg(i) = .true. kbcon(i) = kmax(i) @@ -532,10 +538,10 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, pdot(i) = 0.01 * dot(i,kbcon(i)) ! Now dot is in Pa/s endif enddo -c -c turn off convection if pressure depth between parcel source level -c and cloud base is larger than a critical value, cinpcr -c + +!> turn off convection if pressure depth between parcel source level +!! and cloud base is larger than a critical value, cinpcr + do i=1,im if(cnvflg(i)) then if(islimsk(i) == 1) then @@ -575,11 +581,10 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, totflg = totflg .and. (.not. cnvflg(i)) enddo if(totflg) return -!! -c -c assume that updraft entrainment rate above cloud base is -c same as that at cloud base -c + +!> assume that updraft entrainment rate above cloud base is +!! same as that at cloud base + do i=1,im if(cnvflg(i)) then xlamx(i) = xlamue(i,kbcon(i)) @@ -593,9 +598,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c specify a background (turbulent) detrainment rate for the updrafts -c + +!> specify a background (turbulent) detrainment rate for the updrafts + do k = 1, km1 do i=1,im if(cnvflg(i) .and. k < kmax(i)) then @@ -604,10 +609,10 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c functions rapidly decreasing with height, mimicking a cloud ensemble -c (Bechtold et al., 2008) -c + +!> functions rapidly decreasing with height, mimicking a cloud ensemble +!! (Bechtold et al., 2008) + do k = 2, km1 do i=1,im if(cnvflg(i).and. @@ -618,11 +623,11 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c final entrainment and detrainment rates as the sum of turbulent part and -c organized entrainment depending on the environmental relative humidity -c (Bechtold et al., 2008) -c + +!> final entrainment and detrainment rates as the sum of turbulent part and +!! organized entrainment depending on the environmental relative humidity +!! (Bechtold et al., 2008) + do k = 2, km1 do i=1,im if(cnvflg(i) .and. @@ -634,11 +639,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -c -c determine updraft mass flux for the subcloud layers -c + +!> determine updraft mass flux for the subcloud layers + do k = km1, 1, -1 do i = 1, im if (cnvflg(i)) then @@ -651,9 +654,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c compute mass flux above cloud base -c + +!> compute mass flux above cloud base + do i = 1, im flg(i) = cnvflg(i) enddo @@ -674,9 +677,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c compute updraft cloud properties -c + +!> compute updraft cloud properties + do i = 1, im if(cnvflg(i)) then indx = kb(i) @@ -686,11 +689,11 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, pwavo(i) = 0. endif enddo -c -c cloud property is modified by the entrainment process -c -! cm is an enhancement factor in entrainment rates for momentum -! + +!> cloud property is modified by the entrainment process + +!> cm is an enhancement factor in entrainment rates for momentum + do k = 2, km1 do i = 1, im if (cnvflg(i)) then @@ -715,10 +718,10 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c taking account into convection inhibition due to existence of -c dry layers below cloud base -c + +!> taking account into convection inhibition due to existence of +!! dry layers below cloud base + do i=1,im flg(i) = cnvflg(i) kbcon1(i) = kmax(i) @@ -753,9 +756,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, enddo if(totflg) return !! -c -c calculate convective inhibition -c + +!> calculate convective inhibition + do k = 2, km1 do i = 1, im if (cnvflg(i)) then @@ -818,10 +821,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, totflg = totflg .and. (.not. cnvflg(i)) enddo if(totflg) return -!! -c -c determine first guess cloud top as the level of zero buoyancy -c + +!> determine first guess cloud top as the level of zero buoyancy + do i = 1, im flg(i) = cnvflg(i) ktcon(i) = 1 @@ -852,10 +854,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, totflg = totflg .and. (.not. cnvflg(i)) enddo if(totflg) return -!! -c -c search for downdraft originating level above theta-e minimum -c + +!> search for downdraft originating level above theta-e minimum + do i = 1, im if(cnvflg(i)) then hmin(i) = heo(i,kbcon1(i)) @@ -873,9 +874,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c make sure that jmin(i) is within the cloud -c + +!> make sure that jmin(i) is within the cloud + do i = 1, im if(cnvflg(i)) then jmin(i) = min(lmin(i),ktcon(i)-1) @@ -883,9 +884,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, if(jmin(i) >= ktcon(i)) cnvflg(i) = .false. endif enddo -c -c specify upper limit of mass flux at cloud base -c + +!> specify upper limit of mass flux at cloud base + do i = 1, im if(cnvflg(i)) then ! xmbmax(i) = .1 @@ -900,9 +901,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, ! xmbmax(i) = min(tem, xmbmax(i)) endif enddo -c -c compute cloud moisture property and precipitation -c + +!> compute cloud moisture property and precipitation + do i = 1, im if (cnvflg(i)) then ! aa1(i) = 0. @@ -930,9 +931,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, dq = eta(i,k) * (qcko(i,k) - qrch) c ! rhbar(i) = rhbar(i) + qo(i,k) / qeso(i,k) -c -c check if there is excess moisture to release latent heat -c + +!> check if there is excess moisture to release latent heat + if(k >= kbcon(i) .and. dq > 0.) then etah = .5 * (eta(i,k) + eta(i,k-1)) if(ncloud > 0 .and. k > jmin(i)) then @@ -952,9 +953,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, ! cnvwt(i,k) = (etah*qlk + pwo(i,k)) * g / dp cnvwt(i,k) = etah * qlk * g / dp endif -! -! compute buoyancy and drag for updraft velocity -! + +!> compute buoyancy and drag for updraft velocity + if(k >= kbcon(i)) then rfact = 1. + delta * cp * gamma & * to(i,k) / hvap @@ -978,9 +979,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, ! rhbar(i) = rhbar(i) / float(indx) ! endif ! enddo -c -c calculate cloud work function -c + +!> calculate cloud work function + ! do k = 2, km1 ! do i = 1, im ! if (cnvflg(i)) then @@ -1003,9 +1004,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, ! endif ! enddo ! enddo -! -! calculate cloud work function -! + +!> calculate cloud work function + do i = 1, im if (cnvflg(i)) then aa1(i) = 0. @@ -1032,12 +1033,11 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, totflg = totflg .and. (.not. cnvflg(i)) enddo if(totflg) return -!! -c -c estimate the onvective overshooting as the level -c where the [aafac * cloud work function] becomes zero, -c which is the final cloud top -c + +!> estimate the onvective overshooting as the level +!! where the [aafac * cloud work function] becomes zero, +!! which is the final cloud top + do i = 1, im if (cnvflg(i)) then aa2(i) = aafac * aa1(i) @@ -1074,10 +1074,10 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c compute cloud moisture property, detraining cloud water -c and precipitation in overshooting layers -c + +!> compute cloud moisture property, detraining cloud water +!! and precipitation in overshooting layers + do k = 2, km1 do i = 1, im if (cnvflg(i)) then @@ -1095,9 +1095,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, qrcko(i,k) = qcko(i,k) cj dq = eta(i,k) * (qcko(i,k) - qrch) -c -c check if there is excess moisture to release latent heat -c + +!> check if there is excess moisture to release latent heat + if(dq > 0.) then etah = .5 * (eta(i,k) + eta(i,k-1)) if(ncloud > 0) then @@ -1118,9 +1118,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -! -! compute updraft velocity square(wu2) -! + +!> compute updraft velocity square(wu2) + ! bb1 = 2. * (1.+bet1*cd1) ! bb2 = 2. / (f1*(1.+gam1)) ! @@ -1160,9 +1160,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -! -! compute updraft velocity average over the whole cumulus -! + +!> compute updraft velocity average over the whole cumulus + do i = 1, im wc(i) = 0. sumx(i) = 0. @@ -1190,9 +1190,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, if (wc(i) < val) cnvflg(i)=.false. endif enddo -c -c exchange ktcon with ktcon1 -c + +!> exchange ktcon with ktcon1 + do i = 1, im if(cnvflg(i)) then kk = ktcon(i) @@ -1200,13 +1200,13 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, ktcon1(i) = kk endif enddo -c -c this section is ready for cloud water -c + +!> this section is ready for cloud water + if(ncloud > 0) then -c -c compute liquid and vapor separation at cloud top -c + +!> compute liquid and vapor separation at cloud top + do i = 1, im if(cnvflg(i)) then k = ktcon(i) - 1 @@ -1214,9 +1214,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, qrch = qeso(i,k) & + gamma * dbyo(i,k) / (hvap * (1. + gamma)) dq = qcko(i,k) - qrch -c -c check if there is excess moisture to release latent heat -c + +!> check if there is excess moisture to release latent heat + if(dq > 0.) then qlko_ktcon(i) = dq qcko(i,k) = qrch @@ -1228,11 +1228,11 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, ccccc if(lat.==.latd.and.lon.==.lond.and.cnvflg(i)) then ccccc print *, ' aa1(i) before dwndrft =', aa1(i) ccccc endif -c -c------- downdraft calculations -c -c--- compute precipitation efficiency in terms of windshear -c + +!> ----- downdraft calculations + +!> - compute precipitation efficiency in terms of windshear + do i = 1, im if(cnvflg(i)) then vshear(i) = 0. @@ -1263,9 +1263,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, edtx(i)=edt(i) endif enddo -c -c determine detrainment rate between 1 and kbcon -c + +!> determine detrainment rate between 1 and kbcon + do i = 1, im if(cnvflg(i)) then sumx(i) = 0. @@ -1290,9 +1290,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, xlamd(i) = (1.-beta**tem)/dz endif enddo -c -c determine downdraft mass flux -c + +!> determine downdraft mass flux + do k = km1, 1, -1 do i = 1, im if (cnvflg(i) .and. k <= kmax(i)-1) then @@ -1308,9 +1308,9 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c--- downdraft moisture properties -c + +!> - downdraft moisture properties + do i = 1, im if(cnvflg(i)) then jmn = jmin(i) @@ -1381,11 +1381,11 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, endif enddo enddo -c -c--- final downdraft strength dependent on precip -c--- efficiency (edt), normalized condensate (pwav), and -c--- evaporate (pwev) -c + +!> - final downdraft strength dependent on precip +!! - efficiency (edt), normalized condensate (pwav), and +!! - evaporate (pwev) + do i = 1, im edtmax = edtmaxl if(islimsk(i) == 0) edtmax = edtmaxs @@ -2287,5 +2287,7 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, !! return end +!! @} end module sasas_deep +!! @} From e774c1120d9d512a8e27303a06a962bd6c579e7d Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Mon, 18 Sep 2017 20:03:05 +0000 Subject: [PATCH 20/43] 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 21/43] 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 22/43] 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 dae06e84060cb8d5b4cdba0df168e35da2336800 Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Thu, 21 Sep 2017 12:03:35 -0600 Subject: [PATCH 23/43] Table longname for time step is time_step_for_physics --- physics/mfdeepcnv.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 50bf9bdda..45d8087bf 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -20,7 +20,7 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, !! | im | horizontal_loop_extent | horizontal loop extent, start at 1 | index | 0 | integer | | in | F | !! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | F | !! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | -!! | delt | time_step | physics time step | s | 0 | real | kind_phys | in | F | +!! | delt | time_step_for_physics | physics time step | s | 0 | real | kind_phys | in | F | !! | delp | air_pressure_layer_difference | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | F | !! | prslp | air_pressure_layer | mean layer pressure | Pa | 2 | real | kind_phys | in | F | !! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | From 05d855960139997386492d83c6a77ca6b7f83d9e Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Thu, 21 Sep 2017 12:06:43 -0600 Subject: [PATCH 24/43] Add subroutine sasasdeep_finalize (just a stub right now). --- physics/mfdeepcnv.f | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 45d8087bf..b986151e5 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -10,6 +10,11 @@ subroutine sasasdeep_init end subroutine sasasdeep_init !! @} +!! @{ + subroutine sasasdeep_finalize + end subroutine sasasdeep_finalize +!! @} + !! @{ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, & ql2,q1,t1,u1,v1,cldwrk,rn,kbot,ktop,kcnv,islimsk,garea, From ab8c931e309ac0ed4e59d892e8515a154e29c072 Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Thu, 21 Sep 2017 12:53:02 -0600 Subject: [PATCH 25/43] Not just convection, DEEP convection in top description --- physics/mfdeepcnv.f | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index b986151e5..410f4ebed 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -1,17 +1,21 @@ !> \file mfdeepcnv.f !! This file contains NCEP's Scale Aware Simplified Arakawa Schubert Scheme -!! for convection. +!! for deep convection. !! @{ module sasas_deep contains !! @{ subroutine sasasdeep_init +!! \section arg_table_sasasdeep_init +!! end subroutine sasasdeep_init !! @} !! @{ subroutine sasasdeep_finalize +!! \section arg_table_sasasdeep_finalize +!! end subroutine sasasdeep_finalize !! @} @@ -19,7 +23,7 @@ end subroutine sasasdeep_finalize subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, & ql2,q1,t1,u1,v1,cldwrk,rn,kbot,ktop,kcnv,islimsk,garea, & dot,ncloud,ud_mf,dd_mf,dt_mf,cnvw,cnvc) -!!\table +!! \section arg_table_sasasdeep_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 | @@ -50,6 +54,7 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, !! | dt_mf | atmosphere_updraft_convective_mass_flux_at_cloud_top | ud_mf at cloud top | kg m-2 | 2 | real | kind_phys | out | F | !! | cnvw | atmosphere_convective_cloud_water_specific_humidity | convective cloud water | kg kg-1 | 2 | real | kind_phys | out | F | !! | cnvc | cloud_binary_mask | convective cloud cover | flag | 2 | real | kind_phys | out | F | +!! ! use machine , only : kind_phys use funcphys , only : fpvs From 716760a5a858b38389f3d2dde356b9012af49d09 Mon Sep 17 00:00:00 2001 From: Christopher Harrop Date: Fri, 29 Sep 2017 20:13:38 +0000 Subject: [PATCH 26/43] 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 27/43] 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 28/43] 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 29/43] 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 30/43] 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 31/43] 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 32/43] 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 33/43] 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 82a1ca420993d7683b6bdb5862c4e560826fce70 Mon Sep 17 00:00:00 2001 From: "Grant.Firl" Date: Mon, 6 Nov 2017 20:23:33 -0700 Subject: [PATCH 34/43] changed some longnames in the table for sasasdeep_run --- physics/mfdeepcnv.f | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 6cf1a94e4..9f204dd70 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -35,20 +35,20 @@ end subroutine sasasdeep_finalize !! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | F | !! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | !! | delt | time_step_for_physics | physics time step | s | 0 | real | kind_phys | in | F | -!! | delp | air_pressure_layer_difference | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | F | -!! | prslp | air_pressure_layer | mean layer pressure | Pa | 2 | real | kind_phys | in | F | +!! | delp | air_pressure_difference_between_midlayers | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | F | +!! | prslp | air_pressure | mean layer pressure | Pa | 2 | real | kind_phys | in | F | !! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | !! | phil | geopotential | layer geopotential | m2 s-2 | 2 | real | kind_phys | in | F | !! | ql1 | cloud_ice_specific_humidity | cloud ice specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | !! | ql2 | cloud_liquid_water_specific_humidity | cloud water specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | !! | q1 | water_vapor_specific_humidity | updated vapor specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | -!! | t1 | air_temperature | updated temperature | K | 2 | real | kind_phys | inout | F | -!! | u1 | x_wind | updated x-direction wind | m s-1 | 2 | real | kind_phys | inout | F | -!! | v1 | y_wind | updated y-direction wind | m s-1 | 2 | real | kind_phys | inout | F | +!! | t1 | air_temperature_updated_by_physics | updated temperature | K | 2 | real | kind_phys | inout | F | +!! | u1 | x_wind_updated_by_physics | updated x-direction wind | m s-1 | 2 | real | kind_phys | inout | F | +!! | v1 | y_wind_updated_by_physics | updated y-direction wind | m s-1 | 2 | real | kind_phys | inout | F | !! | cldwrk | cloud_work_function | cloud work function | m2 s-2 | 1 | real | kind_phys | out | F | -!! | rn | convective_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | F | -!! | kbot | index_for_cloud_base | index for cloud base | index | 1 | integer | | out | F | -!! | ktop | index_for_cloud_top | index for cloud top | index | 1 | integer | | out | F | +!! | rn | instantaneous_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | F | +!! | kbot | vertical_index_at_cloud_base | index for cloud base | index | 1 | integer | | out | F | +!! | ktop | vertical_index_at_cloud_top | index for cloud top | index | 1 | integer | | out | F | !! | kcnv | flag_deep_convection | deep convection: 0=no, 1=yes | flag | 1 | integer | | out | F | !! | islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | !! | garea | cell_area | grid cell area | m2 | 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 35/43] 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 36/43] 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 37/43] 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 38/43] 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 39/43] 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 | From 09c2ce52532f5568f37296e39a5ae2f4697d0c60 Mon Sep 17 00:00:00 2001 From: "Grant.Firl" Date: Fri, 17 Nov 2017 21:00:33 -0700 Subject: [PATCH 40/43] longname updates --- physics/mfdeepcnv.f | 60 ++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 9f204dd70..7f9587118 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -29,36 +29,36 @@ end subroutine sasasdeep_finalize !> \brief Brief description of the subroutine !! !! \section arg_table_sasasdeep_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 | -!! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | F | -!! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | -!! | delt | time_step_for_physics | physics time step | s | 0 | real | kind_phys | in | F | -!! | delp | air_pressure_difference_between_midlayers | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | F | -!! | prslp | air_pressure | mean layer pressure | Pa | 2 | real | kind_phys | in | F | -!! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | -!! | phil | geopotential | layer geopotential | m2 s-2 | 2 | real | kind_phys | in | F | -!! | ql1 | cloud_ice_specific_humidity | cloud ice specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | -!! | ql2 | cloud_liquid_water_specific_humidity | cloud water specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | -!! | q1 | water_vapor_specific_humidity | updated vapor specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | -!! | t1 | air_temperature_updated_by_physics | updated temperature | K | 2 | real | kind_phys | inout | F | -!! | u1 | x_wind_updated_by_physics | updated x-direction wind | m s-1 | 2 | real | kind_phys | inout | F | -!! | v1 | y_wind_updated_by_physics | updated y-direction wind | m s-1 | 2 | real | kind_phys | inout | F | -!! | cldwrk | cloud_work_function | cloud work function | m2 s-2 | 1 | real | kind_phys | out | F | -!! | rn | instantaneous_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | F | -!! | kbot | vertical_index_at_cloud_base | index for cloud base | index | 1 | integer | | out | F | -!! | ktop | vertical_index_at_cloud_top | index for cloud top | index | 1 | integer | | out | F | -!! | kcnv | flag_deep_convection | deep convection: 0=no, 1=yes | flag | 1 | integer | | out | F | -!! | islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | -!! | garea | cell_area | grid cell area | m2 | 1 | real | kind_phys | in | F | -!! | dot | omega | layer mean vertical velocity | Pa s-1 | 2 | real | kind_phys | in | F | -!! | ncloud | number_of_hydrometeors | number of hydrometeors | count | 0 | integer | | in | F | -!! | ud_mf | atmosphere_updraft_convective_mass_flux | (updraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | -!! | dd_mf | atmosphere_downdraft_convective_mass_flux | (downdraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | -!! | dt_mf | atmosphere_updraft_convective_mass_flux_at_cloud_top | ud_mf at cloud top | kg m-2 | 2 | real | kind_phys | out | F | -!! | cnvw | atmosphere_convective_cloud_water_specific_humidity | convective cloud water | kg kg-1 | 2 | real | kind_phys | out | F | -!! | cnvc | cloud_binary_mask | convective cloud cover | flag | 2 | 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 | +!! | ix | horizontal_dimension | horizontal dimension | index | 0 | integer | | in | F | +!! | km | vertical_dimension | vertical layer dimension | index | 0 | integer | | in | F | +!! | delt | time_step_for_physics | physics time step | s | 0 | real | kind_phys | in | F | +!! | delp | air_pressure_difference_between_midlayers | pres(k) - pres(k+1) | Pa | 2 | real | kind_phys | in | F | +!! | prslp | air_pressure | mean layer pressure | Pa | 2 | real | kind_phys | in | F | +!! | psp | surface_air_pressure | surface pressure | Pa | 1 | real | kind_phys | in | F | +!! | phil | geopotential | layer geopotential | m2 s-2 | 2 | real | kind_phys | in | F | +!! | ql1 | cloud_ice_specific_humidity | cloud ice specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | +!! | ql2 | cloud_liquid_water_specific_humidity | cloud water specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | +!! | q1 | water_vapor_specific_humidity_updated_by_physics | updated vapor specific humidity | kg kg-1 | 2 | real | kind_phys | inout | F | +!! | t1 | air_temperature_updated_by_physics | updated temperature | K | 2 | real | kind_phys | inout | F | +!! | u1 | x_wind_updated_by_physics | updated x-direction wind | m s-1 | 2 | real | kind_phys | inout | F | +!! | v1 | y_wind_updated_by_physics | updated y-direction wind | m s-1 | 2 | real | kind_phys | inout | F | +!! | cldwrk | cloud_work_function | cloud work function | m2 s-2 | 1 | real | kind_phys | out | F | +!! | rn | instantaneous_rainfall_amount | convective rain | m | 1 | real | kind_phys | out | F | +!! | kbot | vertical_index_at_cloud_base | index for cloud base | index | 1 | integer | | out | F | +!! | ktop | vertical_index_at_cloud_top | index for cloud top | index | 1 | integer | | out | F | +!! | kcnv | flag_deep_convection | deep convection: 0=no, 1=yes | flag | 1 | integer | | out | F | +!! | islimsk | sea_land_ice_mask | landmask: sea/land/ice=0/1/2 | flag | 1 | integer | | in | F | +!! | garea | cell_area | grid cell area | m2 | 1 | real | kind_phys | in | F | +!! | dot | omega | layer mean vertical velocity | Pa s-1 | 2 | real | kind_phys | in | F | +!! | ncloud | number_of_hydrometeors | number of hydrometeors | count | 0 | integer | | in | F | +!! | ud_mf | instantaneous_atmosphere_updraft_convective_mass_flux | (updraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | +!! | dd_mf | instantaneous_atmosphere_downdraft_convective_mass_flux | (downdraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | +!! | dt_mf | instantaneous_atmosphere_detrainment_convective_mass_flux | (detrainment mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | +!! | cnvw | convective_cloud_water_specific_humidity | convective cloud water | kg kg-1 | 2 | real | kind_phys | out | F | +!! | cnvc | convective_cloud_cover | convective cloud cover | flag | 2 | real | kind_phys | out | F | !! !! \section general General Algorithm !! \section detailed Detailed Algorithm From 40ef1e04035c132b82a8251dbbc51c1b51051e25 Mon Sep 17 00:00:00 2001 From: "Grant.Firl" Date: Thu, 7 Dec 2017 10:13:21 -0700 Subject: [PATCH 41/43] fixed cnvc units from flag to frac in mfdeepcnv.f --- physics/mfdeepcnv.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 7f9587118..9db6d0f2d 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -58,7 +58,7 @@ end subroutine sasasdeep_finalize !! | dd_mf | instantaneous_atmosphere_downdraft_convective_mass_flux | (downdraft mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | !! | dt_mf | instantaneous_atmosphere_detrainment_convective_mass_flux | (detrainment mass flux) * delt | kg m-2 | 2 | real | kind_phys | out | F | !! | cnvw | convective_cloud_water_specific_humidity | convective cloud water | kg kg-1 | 2 | real | kind_phys | out | F | -!! | cnvc | convective_cloud_cover | convective cloud cover | flag | 2 | real | kind_phys | out | F | +!! | cnvc | convective_cloud_cover | convective cloud cover | frac | 2 | real | kind_phys | out | F | !! !! \section general General Algorithm !! \section detailed Detailed Algorithm From 331ed443e49f0c1fdd7219f9f5e40b7b691fbdf0 Mon Sep 17 00:00:00 2001 From: Laurie Date: Tue, 12 Dec 2017 10:40:27 -0700 Subject: [PATCH 42/43] Remove some CCPP-related code from this branch deleted: IPD_layer/IPD_driver_cap.f90 deleted: IPD_layer/scheme.xml modified: makefile --- IPD_layer/IPD_driver_cap.f90 | 383 ----------------------------------- IPD_layer/scheme.xml | 166 --------------- makefile | 20 +- 3 files changed, 8 insertions(+), 561 deletions(-) delete mode 100644 IPD_layer/IPD_driver_cap.f90 delete mode 100644 IPD_layer/scheme.xml diff --git a/IPD_layer/IPD_driver_cap.f90 b/IPD_layer/IPD_driver_cap.f90 deleted file mode 100644 index a4174caee..000000000 --- a/IPD_layer/IPD_driver_cap.f90 +++ /dev/null @@ -1,383 +0,0 @@ -! -! This work (Common Community Physics Package), identified by NOAA, NCAR, -! CU/CIRES, is free of known copyright restrictions and is placed in the -! public domain. -! -! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -! THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -! IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -! CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -! - -!> -!! @brief Semi-auto-generated cap module for the IPD_driver scheme -!! -! -module IPD_driver_cap - - use, intrinsic :: iso_c_binding, & - only: c_f_pointer, c_ptr - use :: ccpp_types, & - only: ccpp_t - use :: ccpp_fields, & - only: ccpp_fields_get - use :: ccpp_errors, & - only: ccpp_error - use :: IPD_typedefs, & - only: IPD_init_type, & - IPD_control_type, & - IPD_data_type, & - IPD_restart_type, & - IPD_diag_type - use :: IPD_driver, & - only: IPD_initialize, & - IPD_setup_step, & - IPD_radiation_step, & - IPD_physics_step1, & - IPD_physics_step2 - use :: namelist_soilveg, & - only: salp_data, snupx, max_vegtyp - implicit none - - private - public :: ipd_initialize_cap, & - ipd_setup_step_cap, & - ipd_radiation_step_cap, & - ipd_physics_step1_cap, & - ipd_physics_step2_cap - - contains - - subroutine ipd_initialize_cap(ptr) bind(c) - - type(c_ptr), intent(inout) :: ptr - - integer :: ierr - integer, allocatable :: dims(:) - type(ccpp_t), pointer :: cdata => null() - type(IPD_control_type), pointer :: IPD_Control => null() - type(IPD_data_type), pointer :: IPD_Data(:) => null() - type(IPD_diag_type), pointer :: IPD_Diag(:) => null() - type(IPD_restart_type), pointer :: IPD_Restart => null() - type(IPD_init_type), pointer :: Init_parm => null() - type(c_ptr) :: tmp - real, pointer :: l_snupx(:) => null() - real, pointer :: l_salp_data => null() - - call c_f_pointer(ptr, cdata) - - call ccpp_fields_get(cdata, 'IPD_Control', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Control') - return - end if - call c_f_pointer(tmp, IPD_Control) - - call ccpp_fields_get(cdata, 'IPD_Data', tmp, ierr, dims=dims) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Data') - return - end if - call c_f_pointer(tmp, IPD_Data, dims) - - call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr, dims=dims) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Diag') - return - end if - call c_f_pointer(tmp, IPD_Diag, dims) - - call ccpp_fields_get(cdata, 'IPD_Restart', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Restart') - return - end if - call c_f_pointer(tmp, IPD_Restart) - - call ccpp_fields_get(cdata, 'Init_parm', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve Init_parm') - return - end if - call c_f_pointer(tmp, Init_parm) - - if (allocated(dims)) then - deallocate(dims) - end if - - call ccpp_fields_get(cdata, 'salp_data', l_salp_data, ierr) - call ccpp_fields_get(cdata, 'snupx', l_snupx, ierr) - - call IPD_initialize(IPD_Control=IPD_Control, & - IPD_Data=IPD_Data, & - IPD_Diag=IPD_Diag, & - IPD_Restart=IPD_Restart, & - IPD_init_parm=Init_parm) - - l_snupx = snupx - l_salp_data = salp_data - end subroutine ipd_initialize_cap - - subroutine ipd_setup_step_cap(ptr) bind(c) - - type(c_ptr), intent(inout) :: ptr - - integer :: ierr - integer, allocatable :: dims(:) - type(ccpp_t), pointer :: cdata => null() - type(IPD_control_type), pointer :: IPD_Control => null() - type(IPD_data_type), pointer :: IPD_Data(:) => null() - type(IPD_diag_type), pointer :: IPD_Diag(:) => null() - type(IPD_restart_type), pointer :: IPD_Restart => null() - type(c_ptr) :: tmp - - call c_f_pointer(ptr, cdata) - - call ccpp_fields_get(cdata, 'IPD_Control', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Control') - return - end if - call c_f_pointer(tmp, IPD_Control) - - call ccpp_fields_get(cdata, 'IPD_Data', tmp, ierr, dims=dims) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Data') - return - end if - call c_f_pointer(tmp, IPD_Data, dims) - - call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr, dims=dims) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Diag') - return - end if - call c_f_pointer(tmp, IPD_Diag, dims) - - call ccpp_fields_get(cdata, 'IPD_Restart', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Restart') - return - end if - call c_f_pointer(tmp, IPD_Restart) - - if (allocated(dims)) then - deallocate(dims) - end if - - call IPD_setup_step(IPD_Control=IPD_Control, & - IPD_Data=IPD_Data, & - IPD_Diag=IPD_Diag, & - IPD_Restart=IPD_Restart) - end subroutine IPD_setup_step_cap - - subroutine ipd_radiation_step_cap(ptr) bind(c) - - type(c_ptr), intent(inout) :: ptr - - integer :: ierr - integer :: nb - integer, allocatable :: dims(:) - type(ccpp_t), pointer :: cdata => null() - type(IPD_control_type), pointer :: IPD_Control => null() - type(IPD_data_type), pointer :: IPD_Data(:) => null() - type(IPD_diag_type), pointer :: IPD_Diag(:) => null() - type(IPD_restart_type), pointer :: IPD_Restart => null() - integer, pointer :: nblks - type(c_ptr) :: tmp - - call c_f_pointer(ptr, cdata) - - call ccpp_fields_get(cdata, 'nblks', nblks, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve nblks') - return - end if - - call ccpp_fields_get(cdata, 'IPD_Control', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Control') - return - end if - call c_f_pointer(tmp, IPD_Control) - - call ccpp_fields_get(cdata, 'IPD_Data', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Data') - return - end if - call c_f_pointer(tmp, IPD_Data, [nblks]) - - call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Diag') - return - end if - call c_f_pointer(tmp, IPD_Diag, [250]) - - call ccpp_fields_get(cdata, 'IPD_Restart', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Restart') - return - end if - call c_f_pointer(tmp, IPD_Restart) - - call ccpp_fields_get(cdata, 'nblks', nblks, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve nblks') - return - end if - -!$OMP parallel do default (none) & -!$OMP schedule (dynamic,1), & -!$OMP shared (nblks, IPD_Control, IPD_Data, IPD_Diag, IPD_Restart) & -!$OMP private (nb) - do nb = 1,nblks - call IPD_radiation_step(IPD_Control=IPD_Control, & - IPD_Data=IPD_Data(nb), & - IPD_Diag=IPD_Diag, & - IPD_Restart=IPD_Restart) - end do - end subroutine ipd_radiation_step_cap - - subroutine ipd_physics_step1_cap(ptr) bind(c) - - type(c_ptr), intent(inout) :: ptr - - integer :: ierr - integer :: nb - integer, allocatable :: dims(:) - type(ccpp_t), pointer :: cdata => null() - type(IPD_control_type), pointer :: IPD_Control => null() - type(IPD_data_type), pointer :: IPD_Data(:) => null() - type(IPD_diag_type), pointer :: IPD_Diag(:) => null() - type(IPD_restart_type), pointer :: IPD_Restart => null() - integer, pointer :: nblks - type(c_ptr) :: tmp - - call c_f_pointer(ptr, cdata) - - call ccpp_fields_get(cdata, 'nblks', nblks, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve nblks') - return - end if - - call ccpp_fields_get(cdata, 'IPD_Control', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Control') - return - end if - call c_f_pointer(tmp, IPD_Control) - - call ccpp_fields_get(cdata, 'IPD_Data', tmp, ierr, dims=dims) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Data') - return - end if - call c_f_pointer(tmp, IPD_Data, [nblks]) - - call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr, dims=dims) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Diag') - return - end if - call c_f_pointer(tmp, IPD_Diag, dims) - - call ccpp_fields_get(cdata, 'IPD_Restart', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Restart') - return - end if - call c_f_pointer(tmp, IPD_Restart) - - call ccpp_fields_get(cdata, 'nblks', nblks, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve nblks') - return - end if - -!$OMP parallel do default (none) & -!$OMP schedule (dynamic,1), & -!$OMP shared (nblks, IPD_Control, IPD_Data, IPD_Diag, IPD_Restart) & -!$OMP private (nb) - do nb = 1,nblks - call IPD_physics_step1(IPD_Control=IPD_Control, & - IPD_Data=IPD_Data(nb), & - IPD_Diag=IPD_Diag, & - IPD_Restart=IPD_Restart) - end do - end subroutine ipd_physics_step1_cap - - subroutine ipd_physics_step2_cap(ptr) bind(c) - - type(c_ptr), intent(inout) :: ptr - - integer :: ierr - integer :: nb - integer, allocatable :: dims(:) - type(ccpp_t), pointer :: cdata => null() - type(IPD_control_type), pointer :: IPD_Control => null() - type(IPD_data_type), pointer :: IPD_Data(:) => null() - type(IPD_diag_type), pointer :: IPD_Diag(:) => null() - type(IPD_restart_type), pointer :: IPD_Restart => null() - integer, pointer :: nblks - type(c_ptr) :: tmp - - call c_f_pointer(ptr, cdata) - - call ccpp_fields_get(cdata, 'nblks', nblks, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve nblks') - return - end if - - call ccpp_fields_get(cdata, 'IPD_Control', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Control') - return - end if - call c_f_pointer(tmp, IPD_Control) - - call ccpp_fields_get(cdata, 'IPD_Data', tmp, ierr, dims=dims) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Data') - return - end if - call c_f_pointer(tmp, IPD_Data, [nblks]) - - call ccpp_fields_get(cdata, 'IPD_Diag', tmp, ierr, dims=dims) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Diag') - return - end if - call c_f_pointer(tmp, IPD_Diag, dims) - - call ccpp_fields_get(cdata, 'IPD_Restart', tmp, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve IPD_Restart') - return - end if - call c_f_pointer(tmp, IPD_Restart) - - call ccpp_fields_get(cdata, 'nblks', nblks, ierr) - if (ierr /= 0) then - call ccpp_error('Unable to retrieve nblks') - return - end if - -!$OMP parallel do default (none) & -!$OMP schedule (dynamic,1), & -!$OMP shared (nblks, IPD_Control, IPD_Data, IPD_Diag, IPD_Restart) & -!$OMP private (nb) - do nb = 1,nblks - call IPD_physics_step2(IPD_Control=IPD_Control, & - IPD_Data=IPD_Data(nb), & - IPD_Diag=IPD_Diag, & - IPD_Restart=IPD_Restart) - end do - end subroutine ipd_physics_step2_cap - -end module IPD_driver_cap diff --git a/IPD_layer/scheme.xml b/IPD_layer/scheme.xml deleted file mode 100644 index e9a3ab95c..000000000 --- a/IPD_layer/scheme.xml +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - IPD_Control - - IPD_Control - 0 - type(IPD_control_type) - - - IPD_Data - - IPD_Data - 1 - type(IPD_data_type) - - - IPD_Diag - - IPD_Diag - 1 - type(IPD_diag_type) - - - IPD_Restart - - IPD_Restart - 0 - type(IPD_restart_type) - - - Init_parm - - Init_parm - 0 - type(IPD_init_type) - - - - - - IPD_Control - - IPD_Control - 0 - type(IPD_control_type) - - - IPD_Data - - IPD_Data - 1 - type(IPD_data_type) - - - IPD_Diag - - IPD_Diag - 1 - type(IPD_diag_type) - - - IPD_Restart - - IPD_Restart - 0 - type(IPD_restart_type) - - - - - - IPD_Control - - IPD_Control - 0 - type(IPD_control_type) - - - IPD_Data - - IPD_Data - 0 - type(IPD_data_type) - - - IPD_Diag - - IPD_Diag - 1 - type(IPD_diag_type) - - - IPD_Restart - - IPD_Restart - 0 - type(IPD_restart_type) - - - - - - IPD_Control - - IPD_Control - 0 - type(IPD_control_type) - - - IPD_Data - - IPD_Data - 0 - type(IPD_data_type) - - - IPD_Diag - - IPD_Diag - 1 - type(IPD_diag_type) - - - IPD_Restart - - IPD_Restart - 0 - type(IPD_restart_type) - - - - - - IPD_Control - - IPD_Control - 0 - type(IPD_control_type) - - - IPD_Data - - IPD_Data - 0 - type(IPD_data_type) - - - IPD_Diag - - IPD_Diag - 1 - type(IPD_diag_type) - - - IPD_Restart - - IPD_Restart - 0 - type(IPD_restart_type) - - - - diff --git a/makefile b/makefile index e99aaf95b..0f6cafba9 100644 --- a/makefile +++ b/makefile @@ -15,12 +15,9 @@ else $(info ) endif -LIBRARY = libgfsphys.so -VER_MAJOR = 1 -VER_MINOR = 0 -VER_PATCH = 0 +LIBRARY = libgfsphys.a -FFLAGS += -I../fms -I../fms/include -fPIC +FFLAGS += -I../fms -I../fms/include CPPDEFS = -DNEW_TAUCTMAX -DSMALL_PE -DNEMS_GSM @@ -67,6 +64,7 @@ SRCS_f = \ ./physics/moninshoc.f \ ./physics/mstadb.f \ ./physics/mstadbtn.f \ + ./physics/mstadbtn2.f \ ./physics/mstcnv.f \ ./physics/namelist_soilveg.f \ ./physics/ozne_def.f \ @@ -76,6 +74,7 @@ SRCS_f = \ ./physics/precpd.f \ ./physics/precpd_shoc.f \ ./physics/precpdp.f \ + ./physics/precpd_shoc.f \ ./physics/progt2.f \ ./physics/progtm_module.f \ ./physics/rad_initialize.f \ @@ -108,6 +107,8 @@ SRCS_f = \ ./physics/sflx.f \ ./physics/shalcnv.f \ ./physics/shalcv.f \ + ./physics/shalcv_1lyr.f \ + ./physics/shalcv_fixdp.f \ ./physics/shalcv_opr.f \ ./physics/tracer_const_h.f \ ./physics/tridi2t3.f @@ -126,8 +127,7 @@ SRCS_f90 = \ ./physics/module_nst_water_prop.f90 \ ./physics/ozinterp.f90 \ ./physics/physcons.f90 \ - ./physics/wam_f107_kp_mod.f90 \ - ./IPD_layer/IPD_driver_cap.f90 + ./physics/wam_f107_kp_mod.f90 SRCS_F = ./physics/aer_cloud.F \ ./physics/cldmacro.F \ @@ -163,9 +163,7 @@ OBJS = $(OBJS_f) $(OBJS_f90) $(OBJS_F) $(OBJS_F90) $(OBJS_c) all default: depend $(LIBRARY) $(LIBRARY): $(OBJS) - $(FC) -shared -Wl,-soname,$(LIBRARY).$(VER_MAJOR) $(OBJS) $(LDFLAGS) -o $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) - ln -sf $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) $(LIBRARY) - ln -sf $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) $(LIBRARY).$(VER_MAJOR) + $(AR) $(ARFLAGS) $@ $? # this is the place to override default (implicit) compilation rules # and create specific (explicit) rules @@ -181,8 +179,6 @@ clean: @echo "Cleaning gfsphysics ... " @echo $(RM) -f $(LIBRARY) *__genmod.f90 *.o */*.o *.mod *.lst *.i depend - $(RM) -f $(LIBRARY).$(VER_MAJOR) - $(RM) -f $(LIBRARY).$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) MKDEPENDS = ../mkDepends.pl include ../conf/make.rules From fc456fb1a2d678009f3f1215b3fe2d2c0e57f896 Mon Sep 17 00:00:00 2001 From: Laurie Date: Tue, 12 Dec 2017 16:49:12 -0700 Subject: [PATCH 43/43] A couple of bug-fixes to get this to compile 1. modified: GFS_layer/GFS_physics_driver.F90 add module use stmts for the sasas_deep module (was simple subr previously) 2. modified: physics/mfdeepcnv.f declare variables ql1 and ql2 (instead of ql(:,:,2) --- GFS_layer/GFS_physics_driver.F90 | 1 + physics/mfdeepcnv.f | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/GFS_layer/GFS_physics_driver.F90 b/GFS_layer/GFS_physics_driver.F90 index 4ce3fc9c0..da3891539 100644 --- a/GFS_layer/GFS_physics_driver.F90 +++ b/GFS_layer/GFS_physics_driver.F90 @@ -9,6 +9,7 @@ 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 sasas_deep, only: sasasdeep_run 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 diff --git a/physics/mfdeepcnv.f b/physics/mfdeepcnv.f index 9db6d0f2d..01384f23c 100755 --- a/physics/mfdeepcnv.f +++ b/physics/mfdeepcnv.f @@ -14,6 +14,8 @@ module sasas_deep !> \brief Brief description of the subroutine !! !! \section arg_table_sasasdeep_init Argument Table +!! | local var name | longname | description | units | rank | type | kind | intent | optional | +!! |----------------|-----------------------------------------------------------|------------------------------------|---------|------|---------|-----------|--------|----------| !! subroutine sasasdeep_init end subroutine sasasdeep_init @@ -22,6 +24,8 @@ end subroutine sasasdeep_init !> \brief Brief description of the subroutine !! !! \section arg_table_sasasdeep_finalize Argument Table +!! | local var name | longname | description | units | rank | type | kind | intent | optional | +!! |----------------|-----------------------------------------------------------|------------------------------------|---------|------|---------|-----------|--------|----------| !! subroutine sasasdeep_finalize end subroutine sasasdeep_finalize @@ -84,7 +88,7 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, & real(kind=kind_phys) delt real(kind=kind_phys) psp(im), delp(ix,km), prslp(ix,km) real(kind=kind_phys) ps(im), del(ix,km), prsl(ix,km), & - & ql(ix,km,2),q1(ix,km), t1(ix,km), & + & ql1(ix,km),ql2(ix,km), q1(ix,km), t1(ix,km), & & u1(ix,km), v1(ix,km), & !rcs(im), & cldwrk(im), rn(im), garea(im), & & dot(ix,km), phil(ix,km), & @@ -2307,7 +2311,7 @@ subroutine sasasdeep_run(im,ix,km,delt,delp,prslp,psp,phil,ql1, & enddo !! return - end + end subroutine sasasdeep_run !> @} !> @}