From 3df11713e0ba9299d95512476a9ee784048629c9 Mon Sep 17 00:00:00 2001 From: Laurie Carson Date: Fri, 16 Aug 2019 10:46:56 -0600 Subject: [PATCH 01/16] Add codeowners for NCAR fork --- CODEOWNERS | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 000000000..3ebb5b91c --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,14 @@ +# Lines starting with '#' are comments. +# Each line is a file pattern followed by one or more owners. + +# These owners will be the default owners for everything in the repo. +#* @defunkt +* @climbfuji @llpcarson @grantfirl + +# Order is important. The last matching pattern has the most precedence. +# So if a pull request only touches javascript files, only these owners +# will be requested to review. +#*.js @octocat @github/js + +# You can also use email addresses if you prefer. +#docs/* docs@example.com \ No newline at end of file From b700cae673038f82189a1e6e0cb48a10a58ea726 Mon Sep 17 00:00:00 2001 From: climbfuji Date: Fri, 30 Aug 2019 11:58:00 -0600 Subject: [PATCH 02/16] model/fv_dynamics.F90: replicating previous change to gmtb/develop branch of FV3, always allocate dtdt_m for IPD version --- model/fv_dynamics.F90 | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/model/fv_dynamics.F90 b/model/fv_dynamics.F90 index 4a9bab31a..8a723f7db 100644 --- a/model/fv_dynamics.F90 +++ b/model/fv_dynamics.F90 @@ -621,7 +621,9 @@ subroutine fv_dynamics(npx, npy, npz, nq_tot, ng, bdt, consv_te, fill, mdt = bdt / real(k_split) #ifndef CCPP - if ( idiag%id_mdt > 0 .and. (.not. do_adiabatic_init) ) then + ! Routine Lagrangian_to_Eulerian expects dtdt_m to be allocated: + ! (fv_mapz.F90, 201): line real, intent(inout):: dtdt(is:ie,js:je,km) + !if ( idiag%id_mdt > 0 .and. (.not. do_adiabatic_init) ) then allocate ( dtdt_m(is:ie,js:je,npz) ) !$OMP parallel do default(none) shared(is,ie,js,je,npz,dtdt_m) do k=1,npz @@ -631,7 +633,7 @@ subroutine fv_dynamics(npx, npy, npz, nq_tot, ng, bdt, consv_te, fill, enddo enddo enddo - endif + !endif #endif call timing_on('FV_DYN_LOOP') @@ -834,10 +836,10 @@ subroutine fv_dynamics(npx, npy, npz, nq_tot, ng, bdt, consv_te, fill, enddo ! call prt_mxm('Fast DTDT (deg/Day)', dtdt_m, is, ie, js, je, 0, npz, 1., gridstruct%area_64, domain) used = send_data(idiag%id_mdt, dtdt_m, fv_time) + endif #ifndef CCPP - deallocate ( dtdt_m ) + deallocate ( dtdt_m ) #endif - endif if( nwat == 6 ) then if (cld_amt > 0) then From 94ab0e1317ffa50279dd6269a462999a2bea15e7 Mon Sep 17 00:00:00 2001 From: "Jun.Wang" Date: Mon, 26 Aug 2019 21:03:55 +0000 Subject: [PATCH 03/16] add option to output omega --- driver/fvGFS/fv_nggps_diag.F90 | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/driver/fvGFS/fv_nggps_diag.F90 b/driver/fvGFS/fv_nggps_diag.F90 index f8c8f94b9..01066f18e 100644 --- a/driver/fvGFS/fv_nggps_diag.F90 +++ b/driver/fvGFS/fv_nggps_diag.F90 @@ -93,13 +93,13 @@ module fv_nggps_diags_mod real, parameter:: stndrd_atmos_lapse = 0.0065 logical master - integer :: id_ua, id_va, id_pt, id_delp, id_pfhy, id_pfnh - integer :: id_w, id_delz, id_diss, id_ps, id_hs, id_dbz + integer :: id_ua, id_va, id_pt, id_delp, id_pfhy, id_pfnh + integer :: id_w, id_delz, id_diss, id_ps, id_hs, id_dbz, id_omga integer :: kstt_ua, kstt_va, kstt_pt, kstt_delp, kstt_pfhy integer :: kstt_pfnh, kstt_w, kstt_delz, kstt_diss, kstt_ps,kstt_hs integer :: kend_ua, kend_va, kend_pt, kend_delp, kend_pfhy integer :: kend_pfnh, kend_w, kend_delz, kend_diss, kend_ps,kend_hs - integer :: kstt_dbz, kend_dbz + integer :: kstt_dbz, kend_dbz, kstt_omga, kend_omga integer :: kstt_windvect, kend_windvect integer :: id_wmaxup,id_wmaxdn,kstt_wup, kend_wup,kstt_wdn,kend_wdn integer :: id_uhmax03,id_uhmin03,id_uhmax25,id_uhmin25,id_maxvort01 @@ -236,6 +236,13 @@ subroutine fv_nggps_diag_init(Atm, axes, Time) endif endif + id_omga = register_diag_field ( trim(file_name), 'omga', axes(1:3), Time, & + 'Vertical pressure velocity', 'pa/sec', missing_value=missing_value ) + if (id_omga>0) then + kstt_omga = nlevs+1; kend_omga = nlevs+npzo + nlevs = nlevs + npzo + endif + id_pt = register_diag_field ( trim(file_name), 'temp', axes(1:3), Time, & 'temperature', 'K', missing_value=missing_value, range=trange ) if (id_pt>0) then @@ -482,6 +489,11 @@ subroutine fv_nggps_diag(Atm, zvir, Time) call store_data(id_w, Atm(n)%w(isco:ieco,jsco:jeco,:), Time, kstt_w, kend_w) endif + !--- OMGA (non-hydrostatic) + if ( id_omga>0 ) then + call store_data(id_omga, Atm(n)%omga(isco:ieco,jsco:jeco,:), Time, kstt_omga, kend_omga) + endif + !--- TEMPERATURE if(id_pt > 0) call store_data(id_pt, Atm(n)%pt(isco:ieco,jsco:jeco,:), Time, kstt_pt, kend_pt) @@ -1172,6 +1184,13 @@ subroutine fv_dyn_bundle_setup(axes, dyn_bundle, fcst_grid, quilting, rc) if(rc==0) num_field_dyn=num_field_dyn+1 endif endif +! + if( id_omga>0 ) then + call find_outputname(trim(file_name),'omga',output_name) + call add_field_to_bundle(trim(output_name),'Vertical pressure velocity', 'pa/sec', "time: point", & + axes(1:3), fcst_grid, kstt_omga,kend_omga, dyn_bundle, output_file, rcd=rc) + if(rc==0) num_field_dyn=num_field_dyn+1 + endif ! if(id_pt > 0) then call find_outputname(trim(file_name),'temp',output_name) From fec8205b9418dea28de4e2c9f05f347f3cf460d2 Mon Sep 17 00:00:00 2001 From: climbfuji Date: Fri, 20 Sep 2019 08:52:01 -0600 Subject: [PATCH 04/16] Remove TRANSITION mode --- makefile | 15 --------------- model/fv_mapz.F90 | 22 ---------------------- 2 files changed, 37 deletions(-) diff --git a/makefile b/makefile index 7b029e0ee..523dc111b 100644 --- a/makefile +++ b/makefile @@ -96,7 +96,6 @@ $(LIBRARY): $(OBJS) ./model/nh_utils.o : ./model/nh_utils.F90 $(FC) $(CPPDEFS) $(FPPFLAGS) $(FFLAGS) $(OTHER_FFLAGS) $(FAST) -c $< -o $@ -# For PROD/TRANSITION, this is overwritten below ./model/fv_mapz.o : ./model/fv_mapz.F90 $(FC) $(CPPDEFS) $(FPPFLAGS) $(FFLAGS) $(OTHER_FFLAGS) $(FAST) -c $< -o $@ @@ -107,20 +106,6 @@ $(LIBRARY): $(OBJS) ./driver/fvGFS/atmosphere.o : ./driver/fvGFS/atmosphere.F90 $(FC) $(CPPDEFS) $(FPPFLAGS) $(FFLAGS) $(OTHER_FFLAGS) $(ESMF_INC) -c $< -o $@ -# For CCPP acceptance: reduce optimization for certain files to -# obtain bit-for-bit identical results in PROD mode on Theia/Intel 15 -ifneq (,$(findstring TRANSITION,$(CPPDEFS))) -FFLAGS_LOPT=$(subst CORE-AVX2,CORE-AVX-I,\ - $(subst no-prec-div,prec-div,\ - $(subst no-prec-sqrt,prec-sqrt,$(FFLAGS)))) -./model/dyn_core.o : ./model/dyn_core.F90 - $(FC) $(CPPDEFS) $(FPPFLAGS) $(FFLAGS_LOPT) $(OTHER_FFLAGS) -c $< -o $@ -./model/fv_mapz.o : ./model/fv_mapz.F90 - $(FC) $(CPPDEFS) $(FPPFLAGS) $(FFLAGS_LOPT) $(OTHER_FFLAGS) $(FAST) -c $< -o $@ -./model/fv_cmp.o : ./model/fv_cmp.F90 - $(FC) $(CPPDEFS) $(FPPFLAGS) $(FFLAGS_LOPT) $(OTHER_FFLAGS) -c $< -o $@ -endif # (,$(findstring TRANSITION,$(CPPDEFS))) - .PHONY: clean clean: @echo "Cleaning fv3core ... " diff --git a/model/fv_mapz.F90 b/model/fv_mapz.F90 index 222aac9c5..4994538b9 100644 --- a/model/fv_mapz.F90 +++ b/model/fv_mapz.F90 @@ -201,10 +201,6 @@ subroutine Lagrangian_to_Eulerian(last_step, consv, ps, pe, delp, pkz, pk, & real, intent(inout):: dtdt(is:ie,js:je,km) real, intent(out):: pkz(is:ie,js:je,km) !< layer-mean pk for converting t to pt real, intent(out):: te(isd:ied,jsd:jed,km) -#if !defined(CCPP) && defined(TRANSITION) - ! For bit-for-bit reproducibility - real, volatile:: volatile_var -#endif ! !DESCRIPTION: ! @@ -663,9 +659,6 @@ subroutine Lagrangian_to_Eulerian(last_step, consv, ps, pe, delp, pkz, pk, & !$OMP ng,gridstruct,E_Flux,pdt,dtmp,reproduce_sum,q, & !$OMP mdt,cld_amt,cappa,dtdt,out_dt,rrg,akap,do_sat_adj, & !$OMP fast_mp_consv,kord_tm) & -#ifdef TRANSITION -!$OMP private(volatile_var) & -#endif #ifdef MULTI_GASES !$OMP shared(num_gas) & #endif @@ -854,28 +847,13 @@ subroutine Lagrangian_to_Eulerian(last_step, consv, ps, pe, delp, pkz, pk, & do j=js,je do i=is,ie #ifdef MOIST_CAPPA -#ifdef TRANSITION - volatile_var = log(rrg*delp(i,j,k)/delz(i,j,k)*pt(i,j,k)) - pkz(i,j,k) = exp(cappa(i,j,k)*volatile_var) -#else pkz(i,j,k) = exp(cappa(i,j,k)*log(rrg*delp(i,j,k)/delz(i,j,k)*pt(i,j,k))) -#endif -#else -#ifdef TRANSITION -#ifdef MULTI_GASES - volatile_var = log(rrg*delp(i,j,k)/delz(i,j,k)*pt(i,j,k)) - pkz(i,j,k) = exp(akap*(virqd(q(i,j,k,1:num_gas))/vicpqd(q(i,j,k,1:num_gas))*volatile_var) -#else - volatile_var = log(rrg*delp(i,j,k)/delz(i,j,k)*pt(i,j,k)) - pkz(i,j,k) = exp(akap*volatile_var) -#endif #else #ifdef MULTI_GASES pkz(i,j,k) = exp(akap*(virqd(q(i,j,k,1:num_gas))/vicpqd(q(i,j,k,1:num_gas))*log(rrg*delp(i,j,k)/delz(i,j,k)*pt(i,j,k))) #else pkz(i,j,k) = exp(akap*log(rrg*delp(i,j,k)/delz(i,j,k)*pt(i,j,k))) #endif -#endif #endif enddo enddo From 672eb0e8d67c008437724681250e7aa8aa81ec31 Mon Sep 17 00:00:00 2001 From: "fanglin.yang" Date: Thu, 5 Sep 2019 19:24:09 +0000 Subject: [PATCH 05/16] VLab Issue #68141 modified: docs/FV3_citations.bib modified: model/fv_cmp.F90 1) Add an option (namelist parameter: intqs) to use temperature instead of the liquid frozen temperature to calculate saturation mixing ratio in deriving GFDLMP PDF cloud cover. 2) Add a literature reference. --- docs/FV3_citations.bib | 10 ++++++++++ model/fv_cmp.F90 | 17 +++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/docs/FV3_citations.bib b/docs/FV3_citations.bib index 825323bae..074367fb9 100644 --- a/docs/FV3_citations.bib +++ b/docs/FV3_citations.bib @@ -33,6 +33,16 @@ @article{chen2013seasonal doi={10.1175/JCLI-D-12-00061.1} } +@article{zhou2019toward, + title={Toward Convective-Scale Prediction within the Next Generation Global Prediction System}, + author={Zhou, Linjiong and Lin, Shian-Jiann and Chen, Jan-Huey and Harris, Lucas M. and Chen, Xi and Rees, Shannon L.}, + journal={Bulletin of the American Meteorological Society}, + volume={100}, + issue={7}, + year={2019}, + doi={10.1175/bams-d-17-0246.1} +} + @article {deng2008cirrus, author = {Deng, Min and Mace, Gerald G.}, title = {Cirrus cloud microphysical properties and air motion statistics using cloud radar Doppler moments: Water content, particle size, and sedimentation relationships}, diff --git a/model/fv_cmp.F90 b/model/fv_cmp.F90 index aacf69dbe..79e7c513b 100644 --- a/model/fv_cmp.F90 +++ b/model/fv_cmp.F90 @@ -50,7 +50,7 @@ module fv_cmp_mod ! gfdl_cloud_microphys_mod ! ql_gen, qi_gen, qi0_max, ql_mlt, ql0_max, qi_lim, qs_mlt, ! tau_r2g, tau_smlt, tau_i2s, tau_v2l, tau_l2v, tau_imlt, tau_l2r, -! rad_rain, rad_snow, rad_graupel, dw_ocean, dw_land +! rad_rain, rad_snow, rad_graupel, dw_ocean, dw_land, tintqs ! ! @@ -60,7 +60,7 @@ module fv_cmp_mod use gfdl_cloud_microphys_mod, only: ql_gen, qi_gen, qi0_max, ql_mlt, ql0_max, qi_lim, qs_mlt use gfdl_cloud_microphys_mod, only: icloud_f, sat_adj0, t_sub, cld_min use gfdl_cloud_microphys_mod, only: tau_r2g, tau_smlt, tau_i2s, tau_v2l, tau_l2v, tau_imlt, tau_l2r - use gfdl_cloud_microphys_mod, only: rad_rain, rad_snow, rad_graupel, dw_ocean, dw_land + use gfdl_cloud_microphys_mod, only: rad_rain, rad_snow, rad_graupel, dw_ocean, dw_land, tintqs #ifdef MULTI_GASES use multi_gases_mod, only: virq_qpz, vicpqd_qpz, vicvqd_qpz, num_gas #endif @@ -774,9 +774,14 @@ subroutine fv_sat_adj (mdt, zvir, is, ie, js, je, ng, hydrostatic, consv_te, te0 do i = is, ie - tin = pt1 (i) - (lcp2 (i) * q_cond (i) + icp2 (i) * q_sol (i)) ! minimum temperature + if(tintqs) then + tin = pt1(i) + else +! tin = pt1 (i) - (lcp2 (i) * q_cond (i) + icp2 (i) * q_sol (i)) ! minimum temperature + tin = pt1 (i) - (lcp2 (i) * q_liq (i) + icp2 (i) * q_sol (i)) ! minimum temperature ! tin = pt1 (i) - ((lv00 + d0_vap * pt1 (i)) * q_cond (i) + & ! (li00 + dc_ice * pt1 (i)) * q_sol (i)) / (mc_air (i) + qpz (i) * c_vap) + endif ! ----------------------------------------------------------------------- ! determine saturated specific humidity @@ -820,14 +825,14 @@ subroutine fv_sat_adj (mdt, zvir, is, ie, js, je, ng, hydrostatic, consv_te, te0 ! icloud_f = 2: binary cloud scheme (0 / 1) ! ----------------------------------------------------------------------- - if (rh > 0.75 .and. qpz (i) > 1.e-6) then + if (rh > 0.75 .and. qpz (i) > 1.e-8) then dq = hvar (i) * qpz (i) q_plus = qpz (i) + dq q_minus = qpz (i) - dq if (icloud_f == 2) then if (qpz (i) > qstar (i)) then qa (i, j) = 1. - elseif (qstar (i) < q_plus .and. q_cond (i) > 1.e-6) then + elseif (qstar (i) < q_plus .and. q_cond (i) > 1.e-8) then qa (i, j) = ((q_plus - qstar (i)) / dq) ** 2 qa (i, j) = min (1., qa (i, j)) else @@ -847,7 +852,7 @@ subroutine fv_sat_adj (mdt, zvir, is, ie, js, je, ng, hydrostatic, consv_te, te0 qa (i, j) = 0. endif ! impose minimum cloudiness if substantial q_cond (i) exist - if (q_cond (i) > 1.e-6) then + if (q_cond (i) > 1.e-8) then qa (i, j) = max (cld_min, qa (i, j)) endif qa (i, j) = min (1., qa (i, j)) From e868186fd7d64fc2eeb7ec2c59e88c889e62fc93 Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Tue, 24 Sep 2019 01:57:11 +0000 Subject: [PATCH 06/16] change delz from positive value to the original value in the model --- driver/fvGFS/fv_nggps_diag.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver/fvGFS/fv_nggps_diag.F90 b/driver/fvGFS/fv_nggps_diag.F90 index 01066f18e..07a471c32 100644 --- a/driver/fvGFS/fv_nggps_diag.F90 +++ b/driver/fvGFS/fv_nggps_diag.F90 @@ -514,7 +514,7 @@ subroutine fv_nggps_diag(Atm, zvir, Time) do k=1,npzo do j=jsco,jeco do i=isco,ieco - wk(i,j,k) = -Atm(n)%delz(i,j,k) + wk(i,j,k) = Atm(n)%delz(i,j,k) enddo enddo enddo From f627bfb177dc1f2d0bd10371540c43c51ce8eec4 Mon Sep 17 00:00:00 2001 From: Dom Heinzeller Date: Mon, 7 Oct 2019 12:12:24 +0900 Subject: [PATCH 07/16] Add missing change in fv_cmp.F90 - now identical with EMC code --- model/fv_cmp.F90 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/model/fv_cmp.F90 b/model/fv_cmp.F90 index 79e7c513b..16b679b9f 100644 --- a/model/fv_cmp.F90 +++ b/model/fv_cmp.F90 @@ -777,8 +777,7 @@ subroutine fv_sat_adj (mdt, zvir, is, ie, js, je, ng, hydrostatic, consv_te, te0 if(tintqs) then tin = pt1(i) else -! tin = pt1 (i) - (lcp2 (i) * q_cond (i) + icp2 (i) * q_sol (i)) ! minimum temperature - tin = pt1 (i) - (lcp2 (i) * q_liq (i) + icp2 (i) * q_sol (i)) ! minimum temperature + tin = pt1 (i) - (lcp2 (i) * q_cond (i) + icp2 (i) * q_sol (i)) ! minimum temperature ! tin = pt1 (i) - ((lv00 + d0_vap * pt1 (i)) * q_cond (i) + & ! (li00 + dc_ice * pt1 (i)) * q_sol (i)) / (mc_air (i) + qpz (i) * c_vap) endif From 77f4fbad9311ad406c6486ad0912069de3085f07 Mon Sep 17 00:00:00 2001 From: "Man.Zhang" Date: Thu, 14 Nov 2019 13:40:59 -0700 Subject: [PATCH 08/16] implement FA scheme water loading option if nwat =4 --- model/fv_sg.F90 | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/model/fv_sg.F90 b/model/fv_sg.F90 index 594e54873..0aa3edd8e 100644 --- a/model/fv_sg.F90 +++ b/model/fv_sg.F90 @@ -299,6 +299,7 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & enddo elseif ( nwat==4 ) then do i=is,ie +#ifndef ccpp q_liq = q0(i,k,liq_wat) + q0(i,k,rainwat) #ifdef MULTI_GASES cpm(i) = (1.-(q0(i,k,sphum)+q_liq))*cp_air*vicpqd(q0(i,k,:)) + q0(i,k,sphum)*cp_vapor + q_liq*c_liq @@ -306,6 +307,20 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & #else cpm(i) = (1.-(q0(i,k,sphum)+q_liq))*cp_air + q0(i,k,sphum)*cp_vapor + q_liq*c_liq cvm(i) = (1.-(q0(i,k,sphum)+q_liq))*cv_air + q0(i,k,sphum)*cv_vap + q_liq*c_liq +#endif + +#else + q_liq = q0(i,k,liq_wat) + q0(i,k,rainwat) + q_sol = q0(i,k,ice_wat) +#ifdef MULTI_GASES + cpm(i) = (1.-(q0(i,k,sphum)+q_liq+q_sol))*cp_air*vicpqd(q0(i,k,:)) + q0(i,k,sphum)*cp_vapor + q_liq*c_liq + q_sol*c_ice + cvm(i) = (1.-(q0(i,k,sphum)+q_liq+q_sol))*cv_air*vicvqd(q0(i,k,:)) + q0(i,k,sphum)*cv_vap + q_liq*c_liq + q_sol*c_ice +#else + cpm(i) = (1.-(q0(i,k,sphum)+q_liq+q_sol))*cp_air + q0(i,k,sphum)*cp_vapor + q_liq*c_liq + q_sol*c_ice + cvm(i) = (1.-(q0(i,k,sphum)+q_liq+q_sol))*cv_air + q0(i,k,sphum)*cv_vap + q_liq*c_liq + q_sol*c_ice +#endif + + #endif enddo elseif ( nwat==5 ) then @@ -382,7 +397,11 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & elseif ( nwat==4 ) then do k=1,kbot do i=is,ie +#ifndef ccpp qcon(i,k) = q0(i,k,liq_wat) + q0(i,k,rainwat) +#else + qcon(i,k) = q0(i,k,liq_wat) + q0(i,k,rainwat) + q0(i,k,ice_wat) +#endif enddo enddo elseif ( nwat==5 ) then @@ -451,7 +470,12 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & elseif ( nwat==3 ) then ! AM3/AM4 qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,ice_wat) elseif ( nwat==4 ) then ! K_warm_rain scheme with fake ice +#ifndef ccpp qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,rainwat) +#else + qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,ice_wat) + & + q0(i,km1,rainwat) +#endif elseif ( nwat==5 ) then ! K_warm_rain scheme with fake ice qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,ice_wat) + & q0(i,km1,snowwat) + q0(i,km1,rainwat) @@ -572,6 +596,7 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & enddo elseif ( nwat == 4 ) then do i=is,ie +#ifndef ccpp q_liq = q0(i,kk,liq_wat) + q0(i,kk,rainwat) #ifdef MULTI_GASES cpm(i) = (1.-(q0(i,kk,sphum)+q_liq))*cp_air*vicpqd(q0(i,kk,:)) + q0(i,kk,sphum)*cp_vapor + q_liq*c_liq @@ -579,6 +604,19 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & #else cpm(i) = (1.-(q0(i,kk,sphum)+q_liq))*cp_air + q0(i,kk,sphum)*cp_vapor + q_liq*c_liq cvm(i) = (1.-(q0(i,kk,sphum)+q_liq))*cv_air + q0(i,kk,sphum)*cv_vap + q_liq*c_liq +#endif +#else + q_liq = q0(i,kk,liq_wat) + q0(i,kk,rainwat) + q_sol = q0(i,kk,ice_wat) +#ifdef MULTI_GASES + cpm(i) = (1.-(q0(i,kk,sphum)+q_liq+q_sol))*cp_air*vicpqd(q0(i,kk,:)) + q0(i,kk,sphum)*cp_vapor + q_liq*c_liq + q_sol*c_ice + cvm(i) = (1.-(q0(i,kk,sphum)+q_liq+q_sol))*cv_air*vicvqd(q0(i,kk,:)) + q0(i,kk,sphum)*cv_vap + q_liq*c_liq + q_sol*c_ice +#else + cpm(i) = (1.-(q0(i,kk,sphum)+q_liq+q_sol))*cp_air + q0(i,kk,sphum)*cp_vapor + q_liq*c_liq + q_sol*c_ice + cvm(i) = (1.-(q0(i,kk,sphum)+q_liq+q_sol))*cv_air + q0(i,kk,sphum)*cv_vap + q_liq*c_liq + q_sol*c_ice +#endif + + #endif enddo elseif ( nwat == 5 ) then @@ -850,6 +888,7 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & enddo elseif ( nwat==4 ) then do i=is,ie +#ifndef CCPP q_liq = q0(i,k,liq_wat) + q0(i,k,rainwat) #ifdef MULTI_GASES cpm(i) = (1.-(q0(i,k,sphum)+q_liq))*cp_air*vicpqd(q0(i,k,:)) + q0(i,k,sphum)*cp_vapor + q_liq*c_liq @@ -857,6 +896,18 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & #else cpm(i) = (1.-(q0(i,k,sphum)+q_liq))*cp_air + q0(i,k,sphum)*cp_vapor + q_liq*c_liq cvm(i) = (1.-(q0(i,k,sphum)+q_liq))*cv_air + q0(i,k,sphum)*cv_vap + q_liq*c_liq +#endif +#else + q_liq = q0(i,k,liq_wat) + q0(i,k,rainwat) + q_sol = q0(i,k,ice_wat) +#ifdef MULTI_GASES + cpm(i) = (1.-(q0(i,k,sphum)+q_liq+q_sol))*cp_air*vicpqd(q0(i,k,:)) + q0(i,k,sphum)*cp_vapor + q_liq*c_liq + q_sol*c_ice + cvm(i) = (1.-(q0(i,k,sphum)+q_liq+q_sol))*cv_air*vicvqd(q0(i,k,:)) + q0(i,k,sphum)*cv_vap + q_liq*c_liq + q_sol*c_ice +#else + cpm(i) = (1.-(q0(i,k,sphum)+q_liq+q_sol))*cp_air + q0(i,k,sphum)*cp_vapor + q_liq*c_liq + q_sol*c_ice + cvm(i) = (1.-(q0(i,k,sphum)+q_liq+q_sol))*cv_air + q0(i,k,sphum)*cv_vap + q_liq*c_liq + q_sol*c_ice +#endif + #endif enddo elseif ( nwat==5 ) then @@ -933,7 +984,11 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & elseif ( nwat==4 ) then do k=1,kbot do i=is,ie +#ifndef ccpp qcon(i,k) = q0(i,k,liq_wat) + q0(i,k,rainwat) +#else + qcon(i,k) = q0(i,k,liq_wat) + q0(i,k,rainwat) + q0(i,k,ice_wat) +#endif enddo enddo elseif ( nwat==5 ) then @@ -998,7 +1053,11 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & elseif ( nwat==3 ) then ! AM3/AM4 qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,ice_wat) elseif ( nwat==4 ) then ! K_warm_rain scheme with fake ice +#ifndef ccpp qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,rainwat) +#else + qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,rainwat) + q0(i,km1,ice_wat) +#endif elseif ( nwat==5 ) then qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,ice_wat) + & q0(i,km1,snowwat) + q0(i,km1,rainwat) @@ -1118,6 +1177,7 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & enddo elseif ( nwat == 4 ) then do i=is,ie +#ifndef ccpp q_liq = q0(i,kk,liq_wat) + q0(i,kk,rainwat) #ifdef MULTI_GASES cpm(i) = (1.-(q0(i,kk,sphum)+q_liq))*cp_air*vicpqd(q0(i,kk,:)) + q0(i,kk,sphum)*cp_vapor + q_liq*c_liq @@ -1125,6 +1185,18 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & #else cpm(i) = (1.-(q0(i,kk,sphum)+q_liq))*cp_air + q0(i,kk,sphum)*cp_vapor + q_liq*c_liq cvm(i) = (1.-(q0(i,kk,sphum)+q_liq))*cv_air + q0(i,kk,sphum)*cv_vap + q_liq*c_liq +#endif +#else + q_liq = q0(i,kk,liq_wat) + q0(i,kk,rainwat) + q_sol = q0(i,kk,ice_wat) +#ifdef MULTI_GASES + cpm(i) = (1.-(q0(i,kk,sphum)+q_liq+q_sol))*cp_air*vicpqd(q0(i,kk,:)) + q0(i,kk,sphum)*cp_vapor + q_liq*c_liq + q_sol*c_ice + cvm(i) = (1.-(q0(i,kk,sphum)+q_liq+q_sol))*cv_air*vicvqd(q0(i,kk,:)) + q0(i,kk,sphum)*cv_vap + q_liq*c_liq + q_sol*c_ice +#else + cpm(i) = (1.-(q0(i,kk,sphum)+q_liq+q_sol))*cp_air + q0(i,kk,sphum)*cp_vapor + q_liq*c_liq + q_sol*c_ice + cvm(i) = (1.-(q0(i,kk,sphum)+q_liq+q_sol))*cv_air + q0(i,kk,sphum)*cv_vap + q_liq*c_liq + q_sol*c_ice +#endif + #endif enddo elseif ( nwat == 5 ) then From f8a257a922a9047e98c176affec054e2a4d9c6a9 Mon Sep 17 00:00:00 2001 From: "Man.Zhang" Date: Thu, 14 Nov 2019 19:12:39 -0700 Subject: [PATCH 09/16] use upper-case CCPP --- model/fv_sg.F90 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/model/fv_sg.F90 b/model/fv_sg.F90 index 0aa3edd8e..a88cfdfe1 100644 --- a/model/fv_sg.F90 +++ b/model/fv_sg.F90 @@ -299,7 +299,7 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & enddo elseif ( nwat==4 ) then do i=is,ie -#ifndef ccpp +#ifndef CCPP q_liq = q0(i,k,liq_wat) + q0(i,k,rainwat) #ifdef MULTI_GASES cpm(i) = (1.-(q0(i,k,sphum)+q_liq))*cp_air*vicpqd(q0(i,k,:)) + q0(i,k,sphum)*cp_vapor + q_liq*c_liq @@ -397,7 +397,7 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & elseif ( nwat==4 ) then do k=1,kbot do i=is,ie -#ifndef ccpp +#ifndef CCPP qcon(i,k) = q0(i,k,liq_wat) + q0(i,k,rainwat) #else qcon(i,k) = q0(i,k,liq_wat) + q0(i,k,rainwat) + q0(i,k,ice_wat) @@ -470,7 +470,7 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & elseif ( nwat==3 ) then ! AM3/AM4 qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,ice_wat) elseif ( nwat==4 ) then ! K_warm_rain scheme with fake ice -#ifndef ccpp +#ifndef CCPP qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,rainwat) #else qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,ice_wat) + & @@ -596,7 +596,7 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & enddo elseif ( nwat == 4 ) then do i=is,ie -#ifndef ccpp +#ifndef CCPP q_liq = q0(i,kk,liq_wat) + q0(i,kk,rainwat) #ifdef MULTI_GASES cpm(i) = (1.-(q0(i,kk,sphum)+q_liq))*cp_air*vicpqd(q0(i,kk,:)) + q0(i,kk,sphum)*cp_vapor + q_liq*c_liq @@ -984,7 +984,7 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & elseif ( nwat==4 ) then do k=1,kbot do i=is,ie -#ifndef ccpp +#ifndef CCPP qcon(i,k) = q0(i,k,liq_wat) + q0(i,k,rainwat) #else qcon(i,k) = q0(i,k,liq_wat) + q0(i,k,rainwat) + q0(i,k,ice_wat) @@ -1053,7 +1053,7 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & elseif ( nwat==3 ) then ! AM3/AM4 qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,ice_wat) elseif ( nwat==4 ) then ! K_warm_rain scheme with fake ice -#ifndef ccpp +#ifndef CCPP qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,rainwat) #else qcon(i,km1) = q0(i,km1,liq_wat) + q0(i,km1,rainwat) + q0(i,km1,ice_wat) @@ -1177,7 +1177,7 @@ subroutine fv_subgrid_z( isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, & enddo elseif ( nwat == 4 ) then do i=is,ie -#ifndef ccpp +#ifndef CCPP q_liq = q0(i,kk,liq_wat) + q0(i,kk,rainwat) #ifdef MULTI_GASES cpm(i) = (1.-(q0(i,kk,sphum)+q_liq))*cp_air*vicpqd(q0(i,kk,:)) + q0(i,kk,sphum)*cp_vapor + q_liq*c_liq From 8805acd93152bb76d5c4d0900f314631f549fbe2 Mon Sep 17 00:00:00 2001 From: "Man.Zhang" Date: Tue, 19 Nov 2019 14:16:22 -0700 Subject: [PATCH 10/16] From Chunxi: The file fv_mapz.F90 also needs to be modified (K_warm) --- model/fv_mapz.F90 | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/model/fv_mapz.F90 b/model/fv_mapz.F90 index 4994538b9..0e49f9fe1 100644 --- a/model/fv_mapz.F90 +++ b/model/fv_mapz.F90 @@ -3465,12 +3465,26 @@ subroutine moist_cv(is,ie, isd,ied, jsd,jed, km, j, k, nwat, sphum, liq_wat, rai enddo case(4) ! K_warm_rain with fake ice do i=is,ie +#ifndef CCPP qv(i) = q(i,j,k,sphum) qd(i) = q(i,j,k,liq_wat) + q(i,j,k,rainwat) #ifdef MULTI_GASES cvm(i) = (1.-(qv(i)+qd(i)))*cv_air*vicvqd(q(i,j,k,1:num_gas)) + qv(i)*cv_vap + qd(i)*c_liq #else cvm(i) = (1.-(qv(i)+qd(i)))*cv_air + qv(i)*cv_vap + qd(i)*c_liq +#endif +#else +#else + qv(i) = q(i,j,k,sphum) + ql(i) = q(i,j,k,liq_wat) + q(i,j,k,rainwat) + qs(i) = q(i,j,k,ice_wat) + qd(i) = ql(i) + qs(i) +#ifdef MULTI_GASES + cpm(i) = (1.-(qv(i)+qd(i)))*cp_air*vicpqd(q(i,j,k,:)) + qv(i)*cp_vapor + ql(i)*c_liq + qs(i)*c_ice +#else + cpm(i) = (1.-(qv(i)+qd(i)))*cp_air + qv(i)*cp_vapor + ql(i)*c_liq + qs(i)*c_ice +#endif + #endif enddo case(5) @@ -3574,12 +3588,26 @@ subroutine moist_cp(is,ie, isd,ied, jsd,jed, km, j, k, nwat, sphum, liq_wat, rai enddo case(4) ! K_warm_rain scheme with fake ice do i=is,ie +#ifndef CCPP qv(i) = q(i,j,k,sphum) qd(i) = q(i,j,k,liq_wat) + q(i,j,k,rainwat) #ifdef MULTI_GASES cpm(i) = (1.-(qv(i)+qd(i)))*cp_air*vicpqd(q(i,j,k,:)) + qv(i)*cp_vapor + qd(i)*c_liq #else cpm(i) = (1.-(qv(i)+qd(i)))*cp_air + qv(i)*cp_vapor + qd(i)*c_liq +#endif +#else + qv(i) = q(i,j,k,sphum) + ql(i) = q(i,j,k,liq_wat) + q(i,j,k,rainwat) + qs(i) = q(i,j,k,ice_wat) + qd(i) = ql(i) + qs(i) +#ifdef MULTI_GASES + cpm(i) = (1.-(qv(i)+qd(i)))*cp_air*vicpqd(q(i,j,k,:)) + qv(i)*cp_vapor + ql(i)*c_liq + qs(i)*c_ice +#else + cpm(i) = (1.-(qv(i)+qd(i)))*cp_air + qv(i)*cp_vapor + ql(i)*c_liq + qs(i)*c_ice +#endif + + #endif enddo case(5) From 98c58ad3d0444859aae54c31bc2b86ba30b4a9ac Mon Sep 17 00:00:00 2001 From: "Man.Zhang" Date: Tue, 19 Nov 2019 14:35:10 -0700 Subject: [PATCH 11/16] bug fix --- model/fv_mapz.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/model/fv_mapz.F90 b/model/fv_mapz.F90 index 0e49f9fe1..e89b7927c 100644 --- a/model/fv_mapz.F90 +++ b/model/fv_mapz.F90 @@ -3473,7 +3473,6 @@ subroutine moist_cv(is,ie, isd,ied, jsd,jed, km, j, k, nwat, sphum, liq_wat, rai #else cvm(i) = (1.-(qv(i)+qd(i)))*cv_air + qv(i)*cv_vap + qd(i)*c_liq #endif -#else #else qv(i) = q(i,j,k,sphum) ql(i) = q(i,j,k,liq_wat) + q(i,j,k,rainwat) From b280b373b421fcb9d84bd1196a40ec56fcf279ff Mon Sep 17 00:00:00 2001 From: "Man.Zhang" Date: Tue, 19 Nov 2019 14:53:57 -0700 Subject: [PATCH 12/16] bug fix --- model/fv_mapz.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model/fv_mapz.F90 b/model/fv_mapz.F90 index e89b7927c..2c72074a1 100644 --- a/model/fv_mapz.F90 +++ b/model/fv_mapz.F90 @@ -3479,9 +3479,9 @@ subroutine moist_cv(is,ie, isd,ied, jsd,jed, km, j, k, nwat, sphum, liq_wat, rai qs(i) = q(i,j,k,ice_wat) qd(i) = ql(i) + qs(i) #ifdef MULTI_GASES - cpm(i) = (1.-(qv(i)+qd(i)))*cp_air*vicpqd(q(i,j,k,:)) + qv(i)*cp_vapor + ql(i)*c_liq + qs(i)*c_ice + cvm(i) = (1.-(qv(i)+qd(i)))*cv_air*vicvqd(q(i,j,k,1:num_gas)) + qv(i)*cv_vap + ql(i)*c_liq + qs(i)*c_ice #else - cpm(i) = (1.-(qv(i)+qd(i)))*cp_air + qv(i)*cp_vapor + ql(i)*c_liq + qs(i)*c_ice + cvm(i) = (1.-(qv(i)+qd(i)))*cv_air + qv(i)*cv_vap + ql(i)*c_liq + qs(i)*c_ice #endif #endif From f9bbb4f12e032378050cef4b7e5ac4b65a16bb70 Mon Sep 17 00:00:00 2001 From: Dom Heinzeller Date: Thu, 9 Apr 2020 20:14:24 -0600 Subject: [PATCH 13/16] Bugfix for GNU compiler in model/fv_regional_bc.F90, reduce verbosity in driver/fvGFS/atmosphere.F90 --- driver/fvGFS/atmosphere.F90 | 4 ++-- model/fv_regional_bc.F90 | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/driver/fvGFS/atmosphere.F90 b/driver/fvGFS/atmosphere.F90 index d1ed7e005..6cbd71756 100644 --- a/driver/fvGFS/atmosphere.F90 +++ b/driver/fvGFS/atmosphere.F90 @@ -112,7 +112,7 @@ module atmosphere_mod ! ! mpp_mod ! mpp_error, stdout, FATAL, NOTE, input_nml_file, mpp_root_pe, -! mpp_npes, mpp_pe, mpp_chksum,mpp_get_current_pelist, +! mpp_npes, mpp_pe, mpp_chksum,mpp_get_current_pelist, ! mpp_set_current_pelist ! ! @@ -1269,7 +1269,7 @@ subroutine atmosphere_get_bottom_layer (Atm_block, DYCORE_Data) rrg = rdgas / grav if (first_time) then - print *, 'calculating slp kr value' + if (mpp_pe() == mpp_root_pe()) print *, 'calculating slp kr value' ! determine 0.8 sigma reference level sigtop = Atm(mytile)%ak(1)/pstd_mks+Atm(mytile)%bk(1) do k = 1, npz diff --git a/model/fv_regional_bc.F90 b/model/fv_regional_bc.F90 index f73ee8909..9bd8e2b8a 100644 --- a/model/fv_regional_bc.F90 +++ b/model/fv_regional_bc.F90 @@ -5539,14 +5539,14 @@ subroutine create_restart_with_bcs(Atm) ,'yaxis_1' & ,'yaxis_2' & ,'zaxis_1' & - ,'Time' & + ,'Time ' & /) ! character(len=9),dimension(ndims_tracers) :: dim_names_tracers=(/ & 'xaxis_1' & ,'yaxis_1' & ,'zaxis_1' & - ,'Time' & + ,'Time ' & /) ! !----------------------------------------------------------------------- From 945f4e76b3287f9971ad49506b7920cf72b3fdea Mon Sep 17 00:00:00 2001 From: Dom Heinzeller Date: Fri, 26 Jun 2020 14:35:37 -0600 Subject: [PATCH 14/16] Bugfix in tools/fv_diagnostics.F90: correct dimensions of delz in several routines --- tools/fv_diagnostics.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/fv_diagnostics.F90 b/tools/fv_diagnostics.F90 index cbdac9c79..7aeb867ad 100644 --- a/tools/fv_diagnostics.F90 +++ b/tools/fv_diagnostics.F90 @@ -1549,7 +1549,7 @@ subroutine fv_diag(Atm, zvir, Time, print_freq) isc, iec, jsc, jec, 0, npz, 1.) call prt_maxmin('Bottom DZ (m)', Atm(n)%delz(isc:iec,jsc:jec,npz), & isc, iec, jsc, jec, 0, 1, 1.) -! call prt_maxmin('Top DZ (m)', Atm(n)%delz(isc:iec,jsc:jec,1), & +! call prt_maxmin('Top DZ (m)', Atm(n)%delz(is:ie,js:jec,1), & ! isc, iec, jsc, jec, 0, 1, 1.) endif @@ -5572,7 +5572,7 @@ subroutine max_vorticity(is, ie, js, je, ng, km, zvir, sphum, delz, q, hydrostat real, intent(in):: grav, zvir, z_bot, z_top real, intent(in), dimension(is-ng:ie+ng,js-ng:je+ng,km):: pt real, intent(in), dimension(is:ie,js:je,km):: vort - real, intent(in):: delz(is-ng:ie+ng,js-ng:je+ng,km) + real, intent(in):: delz(is:ie,js:je,km) real, intent(in):: q(is-ng:ie+ng,js-ng:je+ng,km,*) real, intent(in):: phis(is-ng:ie+ng,js-ng:je+ng) real, intent(in):: peln(is:ie,km+1,js:je) @@ -5630,7 +5630,7 @@ subroutine max_uh(is, ie, js, je, ng, km, zvir, sphum, uphmax,uphmin, & real, intent(in):: grav, zvir, z_bot, z_top real, intent(in), dimension(is-ng:ie+ng,js-ng:je+ng,km):: pt, w real, intent(in), dimension(is:ie,js:je,km):: vort - real, intent(in):: delz(is-ng:ie+ng,js-ng:je+ng,km) + real, intent(in):: delz(is:ie,js:je,km) real, intent(in):: q(is-ng:ie+ng,js-ng:je+ng,km,*) real, intent(in):: phis(is-ng:ie+ng,js-ng:je+ng) real, intent(in):: peln(is:ie,km+1,js:je) From cbbf2e8b746337609be754b6557ed2d2fc04006a Mon Sep 17 00:00:00 2001 From: Dom Heinzeller Date: Wed, 1 Jul 2020 21:37:23 -0600 Subject: [PATCH 15/16] Bugfix for GNU compiler in makefile, add missing include statement --- makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makefile b/makefile index 530a73d19..e35a9baba 100644 --- a/makefile +++ b/makefile @@ -23,7 +23,7 @@ endif LIBRARY = libfv3core.a -FFLAGS += -I$(FMS_DIR) -I../gfsphysics -I../ipd -I../io +FFLAGS += -I$(FMS_DIR) -I../gfsphysics -I../ipd -I../io -I. SRCS_f = From 4adaeaf1563231fcb503897261dcf5ef27b2e763 Mon Sep 17 00:00:00 2001 From: Dom Heinzeller Date: Tue, 21 Jul 2020 14:27:00 -0600 Subject: [PATCH 16/16] model/multi_gases.F90: add missing import statements --- model/multi_gases.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/multi_gases.F90 b/model/multi_gases.F90 index d100a5e0e..9ee0fdd67 100644 --- a/model/multi_gases.F90 +++ b/model/multi_gases.F90 @@ -39,7 +39,7 @@ module multi_gases_mod use constants_mod, only: rdgas, rvgas, cp_air use fv_mp_mod, only: is_master use mpp_mod, only: stdlog, input_nml_file - use fms_mod, only: check_nml_error + use fms_mod, only: check_nml_error, open_namelist_file, close_file implicit none