From a646bb14c415f01aa4f75b749f7931af3a2a1ddf Mon Sep 17 00:00:00 2001 From: Dave Gill Date: Mon, 29 Nov 2021 06:22:03 -0700 Subject: [PATCH] Begin NMM removal from source code (#1584) TYPE: feature removed KEYWORDS: NMM SOURCE: internal DESCRIPTION OF CHANGES: If we consider the act of adding in new features to the WRF repository as a "constructionist" activity, then this PR begins the largest deconstructionist effort ever undertake in WRF. The Philosophy of Deconstructivism places an emphasis on appearance. Perhaps the bard has a quote appropos to someone working on a commit for a PR, where that PR is at once a massive change and yet is intended to have exactly zero impact: _It is a tale. Told by an idiot, full of sound and fury, Signifying nothing._ LIST OF MODIFIED FILES: _Deleted:_ D Registry/Registry.NMM D dyn_nmm/BALANCE_COMS.F D dyn_nmm/BALANCE_PARS.F D dyn_nmm/BUCKETS.F D dyn_nmm/CLTEND.F D dyn_nmm/DSTRB.F D dyn_nmm/Makefile D dyn_nmm/NMM_NEST_UTILS1.F D dyn_nmm/RDTEMP.F D dyn_nmm/adve_optim.h D dyn_nmm/adve_orig.h D dyn_nmm/depend.dyn_nmm D dyn_nmm/init_modules_nmm.F D dyn_nmm/module_ADVECTION.F D dyn_nmm/module_BC_NMM.F D dyn_nmm/module_BNDRY_COND.F D dyn_nmm/module_CLDWTR.F D dyn_nmm/module_CTLBLK.F D dyn_nmm/module_DIFFUSION_NMM.F D dyn_nmm/module_GWD.F D dyn_nmm/module_HIFREQ.F D dyn_nmm/module_IGWAVE_ADJUST.F D dyn_nmm/module_INDX.F D dyn_nmm/module_MPP.F D dyn_nmm/module_MPPINIT.F D dyn_nmm/module_NEST_UTIL.F D dyn_nmm/module_NONHY_DYNAM.F D dyn_nmm/module_PHYSICS_CALLS.F D dyn_nmm/module_PRECIP_ADJUST.F D dyn_nmm/module_SMOOTH_TERRAIN.F D dyn_nmm/module_STATS_FOR_MOVE.F D dyn_nmm/module_TERRAIN.F D dyn_nmm/module_TIMERS.F D dyn_nmm/module_ZEROX.F D dyn_nmm/module_initialize_real.F D dyn_nmm/module_initialize_tropical_cyclone.F D dyn_nmm/module_membrane_mslp.F D dyn_nmm/module_relax.F D dyn_nmm/module_si_io_nmm.F D dyn_nmm/module_swath.F D dyn_nmm/module_tornado_genesis.F D dyn_nmm/module_tracker.F D dyn_nmm/nmm_get_cpu.c D dyn_nmm/nmm_loop_basemacros.h D dyn_nmm/nmm_loop_macros.h D dyn_nmm/shift_domain_nmm.F D dyn_nmm/solve_nmm.F D dyn_nmm/start_domain_nmm.F D frame/module_io_quilt_new.F D phys/module_mp_HWRF.F D phys/module_ra_HWRF.F D test/nmm_real/namelist.input D test/nmm_real/namelist.input.HWRF D test/nmm_real/tomorrow D test/nmm_tropical_cyclone/README.NMM.TROPICAL_CYCLONE D test/nmm_tropical_cyclone/input.d D test/nmm_tropical_cyclone/land.nml D test/nmm_tropical_cyclone/namelist.input D test/nmm_tropical_cyclone/namelist.wps D test/nmm_tropical_cyclone/sigma.d D test/nmm_tropical_cyclone/sound.d D test/nmm_tropical_cyclone/sound_gfdl.d D test/nmm_tropical_cyclone/sound_jordan.d D test/nmm_tropical_cyclone/sound_wet.d D test/nmm_tropical_cyclone/storm.center _Modified:_ M .github/CODEOWNERS M Makefile M clean M compile M configure M external/RSL_LITE/gen_comms.c M external/RSL_LITE/module_dm.F M external/RSL_LITE/tfp_tester.F M frame/Makefile M frame/module_bdywrite.F M frame/module_dm_stubs.F M frame/module_domain.F M frame/module_integrate.F M frame/module_io_quilt.F M frame/module_nesting.F M frame/module_wrf_error.F M main/Makefile M main/depend.common M phys/Makefile M phys/module_cumulus_driver.F M phys/module_diagnostics_driver.F M phys/module_fddagd_driver.F M phys/module_microphysics_driver.F M phys/module_pbl_driver.F M phys/module_radiation_driver.F M phys/module_surface_driver.F M share/dfi.F M share/init_modules.F M share/input_wrf.F M share/interp_fcn.F M share/mediation_feedback_domain.F M share/mediation_force_domain.F M share/mediation_integrate.F M share/mediation_interp_domain.F M share/mediation_nest_move.F M share/mediation_wrfmain.F M share/module_check_a_mundo.F M share/module_interp_store.F M share/module_model_constants.F M share/module_optional_input.F M share/module_soil_pre.F M share/module_trajectory.F M share/output_wrf.F M share/set_timekeeping.F M share/solve_interface.F M share/start_domain.F M share/wrf_ext_write_field.F M share/wrf_timeseries.F M var/build/depend.txt TESTS CONDUCTED: 1. No "problems" per se. Just removing deadwood code. 2. All Jenkins tests are a PASS. 3. DA code still builds. 4. Restart tests OK. 5. Results for each regression test are identical before vs after. 6. Results for larger tests cases are also bit-for-bit (Wei Wang). 7. Code passes DA regression tests (Jake Liu). RELEASE NOTE: Starting with release-v4.4, the NMM dynamical core and some NMM-specific source code are being removed from the WRF repository. WRF release-v4.3.x is the latest release with the NMM build options still available. --- .github/CODEOWNERS | 2 - Makefile | 114 - Registry/Registry.NMM | 2095 ---- clean | 2 +- compile | 109 +- configure | 32 - dyn_nmm/BALANCE_COMS.F | 81 - dyn_nmm/BALANCE_PARS.F | 46 - dyn_nmm/BUCKETS.F | 394 - dyn_nmm/CLTEND.F | 95 - dyn_nmm/DSTRB.F | 188 - dyn_nmm/Makefile | 69 - dyn_nmm/NMM_NEST_UTILS1.F | 4222 ------- dyn_nmm/RDTEMP.F | 140 - dyn_nmm/adve_optim.h | 1173 -- dyn_nmm/adve_orig.h | 1173 -- dyn_nmm/depend.dyn_nmm | 82 - dyn_nmm/init_modules_nmm.F | 7 - dyn_nmm/module_ADVECTION.F | 3834 ------ dyn_nmm/module_BC_NMM.F | 15 - dyn_nmm/module_BNDRY_COND.F | 1945 --- dyn_nmm/module_CLDWTR.F | 18 - dyn_nmm/module_CTLBLK.F | 40 - dyn_nmm/module_DIFFUSION_NMM.F | 484 - dyn_nmm/module_GWD.F | 1824 --- dyn_nmm/module_HIFREQ.F | 387 - dyn_nmm/module_IGWAVE_ADJUST.F | 1226 -- dyn_nmm/module_INDX.F | 49 - dyn_nmm/module_MPP.F | 61 - dyn_nmm/module_MPPINIT.F | 447 - dyn_nmm/module_NEST_UTIL.F | 491 - dyn_nmm/module_NONHY_DYNAM.F | 1176 -- dyn_nmm/module_PHYSICS_CALLS.F | 3645 ------ dyn_nmm/module_PRECIP_ADJUST.F | 297 - dyn_nmm/module_SMOOTH_TERRAIN.F | 401 - dyn_nmm/module_STATS_FOR_MOVE.F | 1408 --- dyn_nmm/module_TERRAIN.F | 285 - dyn_nmm/module_TIMERS.F | 17 - dyn_nmm/module_ZEROX.F | 85 - dyn_nmm/module_initialize_real.F | 4742 -------- dyn_nmm/module_initialize_tropical_cyclone.F | 6772 ----------- dyn_nmm/module_membrane_mslp.F | 835 -- dyn_nmm/module_relax.F | 221 - dyn_nmm/module_si_io_nmm.F | 1885 --- dyn_nmm/module_swath.F | 395 - dyn_nmm/module_tornado_genesis.F | 470 - dyn_nmm/module_tracker.F | 1937 --- dyn_nmm/nmm_get_cpu.c | 20 - dyn_nmm/nmm_loop_basemacros.h | 9 - dyn_nmm/nmm_loop_macros.h | 130 - dyn_nmm/shift_domain_nmm.F | 186 - dyn_nmm/solve_nmm.F | 3653 ------ dyn_nmm/start_domain_nmm.F | 2598 ---- external/RSL_LITE/gen_comms.c | 41 - external/RSL_LITE/module_dm.F | 1135 -- external/RSL_LITE/tfp_tester.F | 39 - frame/Makefile | 3 +- frame/module_bdywrite.F | 782 -- frame/module_dm_stubs.F | 5 - frame/module_domain.F | 76 - frame/module_integrate.F | 3 - frame/module_io_quilt.F | 4 - frame/module_io_quilt_new.F | 5335 -------- frame/module_nesting.F | 7 - frame/module_wrf_error.F | 12 +- main/Makefile | 9 - main/depend.common | 24 +- phys/Makefile | 23 +- phys/module_cumulus_driver.F | 28 - phys/module_diagnostics_driver.F | 8 - phys/module_fddagd_driver.F | 2 - phys/module_microphysics_driver.F | 40 - phys/module_mp_HWRF.F | 2709 ----- phys/module_pbl_driver.F | 143 +- phys/module_ra_HWRF.F | 10068 ---------------- phys/module_radiation_driver.F | 105 +- phys/module_surface_driver.F | 108 - share/dfi.F | 139 - share/init_modules.F | 16 - share/input_wrf.F | 54 - share/interp_fcn.F | 1567 --- share/mediation_feedback_domain.F | 121 +- share/mediation_force_domain.F | 159 - share/mediation_integrate.F | 796 +- share/mediation_interp_domain.F | 106 - share/mediation_nest_move.F | 876 -- share/mediation_wrfmain.F | 10 - share/module_check_a_mundo.F | 76 +- share/module_interp_store.F | 39 - share/module_model_constants.F | 15 - share/module_optional_input.F | 26 - share/module_soil_pre.F | 2111 ---- share/module_trajectory.F | 32 - share/output_wrf.F | 18 +- share/set_timekeeping.F | 14 - share/solve_interface.F | 21 - share/start_domain.F | 10 - share/wrf_ext_write_field.F | 3 +- share/wrf_timeseries.F | 10 - test/nmm_real/namelist.input | 103 - test/nmm_real/namelist.input.HWRF | 152 - test/nmm_real/tomorrow | 121 - .../README.NMM.TROPICAL_CYCLONE | 37 - test/nmm_tropical_cyclone/input.d | 4 - test/nmm_tropical_cyclone/land.nml | 22 - test/nmm_tropical_cyclone/namelist.input | 143 - test/nmm_tropical_cyclone/namelist.wps | 53 - test/nmm_tropical_cyclone/sigma.d | 23 - test/nmm_tropical_cyclone/sound.d | 30 - test/nmm_tropical_cyclone/sound_gfdl.d | 30 - test/nmm_tropical_cyclone/sound_jordan.d | 30 - test/nmm_tropical_cyclone/sound_wet.d | 30 - test/nmm_tropical_cyclone/storm.center | 2 - var/build/depend.txt | 2 +- 114 files changed, 39 insertions(+), 79683 deletions(-) delete mode 100644 Registry/Registry.NMM delete mode 100644 dyn_nmm/BALANCE_COMS.F delete mode 100644 dyn_nmm/BALANCE_PARS.F delete mode 100644 dyn_nmm/BUCKETS.F delete mode 100644 dyn_nmm/CLTEND.F delete mode 100644 dyn_nmm/DSTRB.F delete mode 100644 dyn_nmm/Makefile delete mode 100644 dyn_nmm/NMM_NEST_UTILS1.F delete mode 100644 dyn_nmm/RDTEMP.F delete mode 100644 dyn_nmm/adve_optim.h delete mode 100644 dyn_nmm/adve_orig.h delete mode 100644 dyn_nmm/depend.dyn_nmm delete mode 100644 dyn_nmm/init_modules_nmm.F delete mode 100644 dyn_nmm/module_ADVECTION.F delete mode 100644 dyn_nmm/module_BC_NMM.F delete mode 100644 dyn_nmm/module_BNDRY_COND.F delete mode 100644 dyn_nmm/module_CLDWTR.F delete mode 100644 dyn_nmm/module_CTLBLK.F delete mode 100644 dyn_nmm/module_DIFFUSION_NMM.F delete mode 100644 dyn_nmm/module_GWD.F delete mode 100644 dyn_nmm/module_HIFREQ.F delete mode 100644 dyn_nmm/module_IGWAVE_ADJUST.F delete mode 100644 dyn_nmm/module_INDX.F delete mode 100644 dyn_nmm/module_MPP.F delete mode 100644 dyn_nmm/module_MPPINIT.F delete mode 100644 dyn_nmm/module_NEST_UTIL.F delete mode 100644 dyn_nmm/module_NONHY_DYNAM.F delete mode 100644 dyn_nmm/module_PHYSICS_CALLS.F delete mode 100644 dyn_nmm/module_PRECIP_ADJUST.F delete mode 100644 dyn_nmm/module_SMOOTH_TERRAIN.F delete mode 100644 dyn_nmm/module_STATS_FOR_MOVE.F delete mode 100644 dyn_nmm/module_TERRAIN.F delete mode 100644 dyn_nmm/module_TIMERS.F delete mode 100644 dyn_nmm/module_ZEROX.F delete mode 100644 dyn_nmm/module_initialize_real.F delete mode 100644 dyn_nmm/module_initialize_tropical_cyclone.F delete mode 100644 dyn_nmm/module_membrane_mslp.F delete mode 100644 dyn_nmm/module_relax.F delete mode 100644 dyn_nmm/module_si_io_nmm.F delete mode 100644 dyn_nmm/module_swath.F delete mode 100644 dyn_nmm/module_tornado_genesis.F delete mode 100644 dyn_nmm/module_tracker.F delete mode 100644 dyn_nmm/nmm_get_cpu.c delete mode 100644 dyn_nmm/nmm_loop_basemacros.h delete mode 100644 dyn_nmm/nmm_loop_macros.h delete mode 100644 dyn_nmm/shift_domain_nmm.F delete mode 100644 dyn_nmm/solve_nmm.F delete mode 100644 dyn_nmm/start_domain_nmm.F delete mode 100644 frame/module_io_quilt_new.F delete mode 100755 phys/module_mp_HWRF.F delete mode 100755 phys/module_ra_HWRF.F delete mode 100644 test/nmm_real/namelist.input delete mode 100644 test/nmm_real/namelist.input.HWRF delete mode 100755 test/nmm_real/tomorrow delete mode 100644 test/nmm_tropical_cyclone/README.NMM.TROPICAL_CYCLONE delete mode 100644 test/nmm_tropical_cyclone/input.d delete mode 100644 test/nmm_tropical_cyclone/land.nml delete mode 100644 test/nmm_tropical_cyclone/namelist.input delete mode 100644 test/nmm_tropical_cyclone/namelist.wps delete mode 100644 test/nmm_tropical_cyclone/sigma.d delete mode 100644 test/nmm_tropical_cyclone/sound.d delete mode 100644 test/nmm_tropical_cyclone/sound_gfdl.d delete mode 100644 test/nmm_tropical_cyclone/sound_jordan.d delete mode 100644 test/nmm_tropical_cyclone/sound_wet.d delete mode 100644 test/nmm_tropical_cyclone/storm.center diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9306821f16..769e8588f1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -74,7 +74,6 @@ README.md @wrf-model/global_owner # Dynamics /dyn_em/ @wrf-model/arw_dev -/dyn_nmm/ @wrf-model/hwrf_dev # WRF-Hydro @@ -101,7 +100,6 @@ README.md @wrf-model/global_owner # Test directories /test/em_* @wrf-model/arw_dev -/test/nmm_* @wrf-model/hwrf_dev /test/em_fire/ @wrf-model/fire # Executable directory diff --git a/Makefile b/Makefile index dfb3212d28..1a9d628130 100644 --- a/Makefile +++ b/Makefile @@ -41,12 +41,8 @@ DA_CONVERTOR_MODULES = $(DA_CONVERTOR_MOD_DIR) $(INCLUDE_MODULES) #### 3.d. add macros to specify the modules for this core -NMM_MODULE_DIR = -I../dyn_nmm -NMM_MODULES = $(NMM_MODULE_DIR) - ALL_MODULES = \ $(EM_MODULE_DIR) \ - $(NMM_MODULES) \ $(INCLUDE_MODULES) configcheck: @@ -114,7 +110,6 @@ wrf : framework_only $(MAKE) MODULE_DIRS="$(ALL_MODULES)" physics if [ $(WRF_CHEM) -eq 1 ] ; then $(MAKE) MODULE_DIRS="$(ALL_MODULES)" chemics ; fi if [ $(WRF_EM_CORE) -eq 1 ] ; then $(MAKE) MODULE_DIRS="$(ALL_MODULES)" em_core ; fi - if [ $(WRF_NMM_CORE) -eq 1 ] ; then $(MAKE) MODULE_DIRS="$(ALL_MODULES)" nmm_core ; fi if [ $(WRF_HYDRO) -eq 1 ] ; then $(MAKE) MODULE_DIRS="$(ALL_MODULES)" wrf_hydro ; fi ( cd main ; $(MAKE) RLFLAGS="$(RLFLAGS)" MODULE_DIRS="$(ALL_MODULES)" SOLVER=em em_wrf ) ( cd run ; /bin/rm -f wrf.exe ; ln -s ../main/wrf.exe . ) @@ -177,9 +172,6 @@ gen_be : @echo "build completed:" `date` -nmm_wrf : wrf - - # Eulerian mass coordinate initializations em_fire : wrf @@ -884,104 +876,6 @@ gocart_conv : wrf /bin/rm -f namelist.input ; cp ../test/em_real/namelist.input . ) -#### nmm converter - -### Idealized NMM tropical cyclone case -nmm_tropical_cyclone : nmm_wrf - @ echo '--------------------------------------' - ( cd main ; $(MAKE) MODULE_DIRS="$(ALL_MODULES)" SOLVER=nmm IDEAL_CASE=tropical_cyclone nmm_ideal ) - ( cd test/nmm_tropical_cyclone ; /bin/rm -f wrf.exe ; ln -s ../../main/wrf.exe . ) - ( cd test/nmm_tropical_cyclone ; /bin/rm -f ideal.exe ; ln -s ../../main/ideal.exe . ) - ( cd test/nmm_tropical_cyclone ; /bin/rm -f README.namelist ; ln -s ../../run/README.namelist . ) - ( cd run ; /bin/rm -f ideal.exe ; ln -s ../main/ideal.exe . ) - ( cd run ; if test -f namelist.input ; then \ - /bin/cp -f namelist.input namelist.input.backup.`date +%Y-%m-%d_%H_%M_%S` ; fi ; \ - /bin/rm -f namelist.input ; cp ../test/nmm_tropical_cyclone/namelist.input . ) - @echo "build started: $(START_OF_COMPILE)" - @echo "build completed:" `date` - -nmm_real : nmm_wrf - @ echo '--------------------------------------' - ( cd main ; $(MAKE) MODULE_DIRS="$(ALL_MODULES)" SOLVER=nmm IDEAL_CASE=real real_nmm ) - ( cd test/nmm_real ; /bin/rm -f wrf.exe ; ln -s ../../main/wrf.exe . ) - ( cd test/nmm_real ; /bin/rm -f real_nmm.exe ; ln -s ../../main/real_nmm.exe . ) - ( cd test/nmm_real ; /bin/rm -f README.namelist ; ln -s ../../run/README.namelist . ) - ( cd test/nmm_real ; /bin/rm -f ETAMPNEW_DATA.expanded_rain ETAMPNEW_DATA RRTM_DATA ; \ - ln -sf ../../run/ETAMPNEW_DATA . ; \ - ln -sf ../../run/ETAMPNEW_DATA.expanded_rain . ; \ - ln -sf ../../run/RRTM_DATA . ; \ - ln -sf ../../run/RRTMG_LW_DATA . ; \ - ln -sf ../../run/RRTMG_SW_DATA . ; \ - ln -sf ../../run/CAM_ABS_DATA . ; \ - ln -sf ../../run/CAM_AEROPT_DATA . ; \ - ln -sf ../../run/CAMtr_volume_mixing_ratio.RCP4.5 . ; \ - ln -sf ../../run/CAMtr_volume_mixing_ratio.RCP6 . ; \ - ln -sf ../../run/CAMtr_volume_mixing_ratio.RCP8.5 CAMtr_volume_mixing_ratio ; \ - ln -sf ../../run/CAMtr_volume_mixing_ratio.A1B . ; \ - ln -sf ../../run/CAMtr_volume_mixing_ratio.A2 . ; \ - ln -sf ../../run/CLM_ALB_ICE_DFS_DATA . ; \ - ln -sf ../../run/CLM_ALB_ICE_DRC_DATA . ; \ - ln -sf ../../run/CLM_ASM_ICE_DFS_DATA . ; \ - ln -sf ../../run/CLM_ASM_ICE_DRC_DATA . ; \ - ln -sf ../../run/CLM_DRDSDT0_DATA . ; \ - ln -sf ../../run/CLM_EXT_ICE_DFS_DATA . ; \ - ln -sf ../../run/CLM_EXT_ICE_DRC_DATA . ; \ - ln -sf ../../run/CLM_KAPPA_DATA . ; \ - ln -sf ../../run/CLM_TAU_DATA . ; \ - ln -sf ../../run/ozone.formatted . ; \ - ln -sf ../../run/ozone_lat.formatted . ; \ - ln -sf ../../run/ozone_plev.formatted . ; \ - ln -sf ../../run/aerosol.formatted . ; \ - ln -sf ../../run/aerosol_lat.formatted . ; \ - ln -sf ../../run/aerosol_lon.formatted . ; \ - ln -sf ../../run/aerosol_plev.formatted . ; \ - ln -sf ../../run/eclipse_besselian_elements.dat . ; \ - ln -sf ../../run/capacity.asc . ; \ - ln -sf ../../run/coeff_p.asc . ; \ - ln -sf ../../run/coeff_q.asc . ; \ - ln -sf ../../run/constants.asc . ; \ - ln -sf ../../run/masses.asc . ; \ - ln -sf ../../run/termvels.asc . ; \ - ln -sf ../../run/kernels.asc_s_0_03_0_9 . ; \ - ln -sf ../../run/kernels_z.asc . ; \ - ln -sf ../../run/bulkdens.asc_s_0_03_0_9 . ; \ - ln -sf ../../run/bulkradii.asc_s_0_03_0_9 . ; \ - ln -sf ../../run/CCN_ACTIVATE.BIN . ; \ - ln -sf ../../run/p3_lookupTable_1.dat-5.3-2momI . ; \ - ln -sf ../../run/p3_lookupTable_1.dat-5.3-3momI . ; \ - ln -sf ../../run/p3_lookupTable_2.dat-2momI_v5.2.2 . ; \ - ln -sf ../../run/HLC.TBL . ; \ - ln -sf ../../run/wind-turbine-1.tbl . ; \ - ln -sf ../../run/ishmael-gamma-tab.bin . ; \ - ln -sf ../../run/ishmael-qi-qc.bin . ; \ - ln -sf ../../run/ishmael-qi-qr.bin . ; \ - ln -sf ../../run/BROADBAND_CLOUD_GODDARD.bin . ; \ - if [ $(RWORDSIZE) -eq 8 ] ; then \ - ln -sf ../../run/ETAMPNEW_DATA_DBL ETAMPNEW_DATA ; \ - ln -sf ../../run/ETAMPNEW_DATA.expanded_rain_DBL ETAMPNEW_DATA.expanded_rain ; \ - ln -sf ../../run/RRTM_DATA_DBL RRTM_DATA ; \ - fi ) - ( cd test/nmm_real ; /bin/rm -f GENPARM.TBL ; ln -s ../../run/GENPARM.TBL . ) - ( cd test/nmm_real ; /bin/rm -f LANDUSE.TBL ; ln -s ../../run/LANDUSE.TBL . ) - ( cd test/nmm_real ; /bin/rm -f SOILPARM.TBL ; ln -s ../../run/SOILPARM.TBL . ) - ( cd test/nmm_real ; /bin/rm -f VEGPARM.TBL ; ln -s ../../run/VEGPARM.TBL . ) - ( cd test/nmm_real ; /bin/rm -f MPTABLE.TBL ; ln -s ../../run/MPTABLE.TBL . ) - ( cd test/nmm_real ; /bin/rm -f tr49t67 ; ln -s ../../run/tr49t67 . ) - ( cd test/nmm_real ; /bin/rm -f tr49t85 ; ln -s ../../run/tr49t85 . ) - ( cd test/nmm_real ; /bin/rm -f tr67t85 ; ln -s ../../run/tr67t85 . ) - ( cd test/nmm_real ; /bin/rm -f gribmap.txt ; ln -s ../../run/gribmap.txt . ) - ( cd test/nmm_real ; /bin/rm -f grib2map.tbl ; ln -s ../../run/grib2map.tbl . ) - ( cd test/nmm_real ; /bin/rm -f co2_trans ; ln -s ../../run/co2_trans . ) - ( cd run ; /bin/rm -f real_nmm.exe ; ln -s ../main/real_nmm.exe . ) - ( cd run ; if test -f namelist.input ; then \ - /bin/cp -f namelist.input namelist.input.backup.`date +%Y-%m-%d_%H_%M_%S` ; fi ; \ - /bin/rm -f namelist.input ; cp ../test/nmm_real/namelist.input . ) - - - -# semi-Lagrangian initializations - - io : @ echo '--------------------------------------' ( cd tools ; $(MAKE) standard.exe ) @@ -1155,14 +1049,6 @@ fortran_2003_fflush_test: fortran_2008_gamma_test: @cd tools ; /bin/rm -f fortran_2008_gamma_test.{exe,o} ; $(SFC) -o fortran_2008_gamma_test.exe fortran_2008_gamma_test.F ; cd .. -nmm_core : - @ echo '--------------------------------------' - if [ "`echo $(J) | sed -e 's/-j//g' -e 's/ \+//g'`" -gt "16" ] ; then \ - ( cd dyn_nmm ; $(MAKE) -j 16 ) ; \ - else \ - ( cd dyn_nmm ; $(MAKE) $(J) ) ; \ - fi - toolsdir : @ echo '--------------------------------------' if [ $(WRF_PLUS_CORE) -eq 0 ] ; then \ diff --git a/Registry/Registry.NMM b/Registry/Registry.NMM deleted file mode 100644 index 1759f7022d..0000000000 --- a/Registry/Registry.NMM +++ /dev/null @@ -1,2095 +0,0 @@ -# Registry file Registry.NMM - combined multi-configuration NMM Registry file -# -# At the present time this file is managed manually and edited by hand. -# -################################################################################ -# Dimension specifications -# -# This section of the Registry file is used to specify the dimensions -# that will be used to define arrays. Dim is the one-letter name of the -# dimension. How defined can either be "standard_domain", which means -# that the dimension (1) is one of the three spatial dimensions and (2) -# it will be set using the standard namelist mechanism and domain data -# structure dimension fields (e.g. sd31,ed31,sd32...). -# -# Order refers to which of the three sets of just-mentioned internal -# dimension variables the dimension is referred to by in the driver. -# That is, is it the first, second, or third dimension. The registry -# infers the mapping of its internal dimensions according to the -# combination of Order and Coord-axis that are specified in this table. -# Note that it is all right to more than one dimension name for, say, the -# x dimension. However, the Order and Coord-axis relationship must be -# consistent throughout. -# -# Note: these entries do not enforce storage order on a particular field. -# That is determined by the dimension strings for each field. But it does -# relate the dimspec to the internal data structures that the driver uses -# to maintain the three physical domain dimensions. -# -# "How defined" can also specify the name of a namelist variable from which -# the definition for the dimension will come; this is specified as -# "namelist=". The namelist variable must have been -# defined as an integer and with only one entry in the rconfig table. Or -# a constant can be specified. The coordinate axis for the dimension is -# either X, Y, Z, or C (for "not a spatial dimension"). The Dimname is -# the descriptive name of the dimension that will be included in the -# metadata in data sets. Note that the b, f, and t modifiers that appear -# as the last characters of dimension strings used # in state and # i1 -# registry definitions are not dimensions and do not need to be declared -# here. -# - -include registry.dimspec -include registry.lake - -rconfig integer halo_debug namelist,domains 1 0 - "halo_debug" "Halo clearing setting" - -############# -rconfig integer ntracers namelist,physics 1 4 - - -# option 1 -#dimspec ntracevars - constant=4 c number of 4d tracer variables -#state real - ijk{ntracevars}f tracers 1 - - - - -#state real t1 ijk{ntracevars}f tracers 1 - r - - -#state real t2 ijk{ntracevars}f tracers 1 - r - - -#state real t3 ijk{ntracevars}f tracers 1 - r - - -#state real t4 ijk{ntracevars}f tracers 1 - r - - -#package tracer_option_1 ntracers==4 - tracers:t1,t2,t3,t4 - -# option 2 -state real - ijkf szj 1 - - - - -state real szj1 ijkf szj 1 - r "szj1" "szj" "units" -state real szj2 ijkf szj 1 - r "szj2" "szj" "units" -state real szj3 ijkf szj 1 - r "szj3" "szj" "units" -state real szj4 ijkf szj 1 - r "szj4" "szj" "units" - -state real - ijkf s1z 1 - - - - -state real s1z1 ijkf s1z 1 - r "s1z1" "s1z" "units" -state real s1z2 ijkf s1z 1 - r "s1z2" "s1z" "units" -state real s1z3 ijkf s1z 1 - r "s1z3" "s1z" "units" -state real s1z4 ijkf s1z 1 - r "s1z4" "s1z" "units" - -state real - ijkf spz 1 - - - - -state real spz1 ijkf spz 1 - r "spz1" "spz" "units" -state real spz2 ijkf spz 1 - r "spz2" "spz" "units" -state real spz3 ijkf spz 1 - r "spz3" "spz" "units" -state real spz4 ijkf spz 1 - r "spz4" "spz" "units" - -state real - ijkf tcs 1 - - - - -state real tcs1 ijkf tcs 1 - r "tcs1" "tcs" "units" -state real tcs2 ijkf tcs 1 - r "tcs2" "tcs" "units" -state real tcs3 ijkf tcs 1 - r "tcs3" "tcs" "units" -state real tcs4 ijkf tcs 1 - r "tcs4" "tcs" "units" - -package tracer_option_2 ntracers==4 - szj:szj1,szj2,szj3,szj4;s1z:s1z1,s1z2,s1z3,s1z4;spz:spz1,spz2,spz3,spz4;tcs:tcs1,tcs2,tcs3,tcs4 - -################################################################################ -################################################################################ -################################################################################ - -# Lines that start with the word 'state' form a table that is -# used by the script use_registry to generate module_state_descript.F -# and other files. Also see documentation in use_registry. -# -# It is required that LU_INDEX appears before any variable that is -# interpolated with a mask, as lu_index supplies that mask. -# -state real LU_INDEX ij misc 1 f irhd=(DownNear)u=(UpNear) "LU_INDEX" "LAND USE CATEGORY" "" -state real LU_MASK ij misc 1 f i3h "LU_MASK" "0 land 1 water" "" -################################################################################ -################################################################################ - -################################ -## WPS-specific Variables -################################ - -state real p_gc ijg dyn_nmm 1 Z i1 "PRES" "pressure" "Pa" -state real vegcat ij misc 1 - i12 "VEGCAT" "VEGETATION CAT DOMINANT TYPE" "" -state real soilcat ij misc 1 - i12 "SOILCAT" "SOIL CAT DOMINANT TYPE" "" - -state real input_soil_cat ij misc 1 - i12 "SOIL_CAT" "SOIL CAT DOMINANT TYPE" "" -state real tsk_gc ij dyn_nmm 1 - i1 "SKINTEMP" "skin temperature" "K" -state real XICE_gc ij misc 1 - i014r "SEAICE" "SEA ICE" "" -state real ght_gc ijg dyn_nmm 1 Z i1 "GHT" "geopotential height" "m" -state real rh_gc ijg dyn_nmm 1 Z i1 "RH" "relative humidity" "%" -state real v_gc ijg dyn_nmm 1 Z i1 "VV" "y-wind component" "m s-1" -state real u_gc ijg dyn_nmm 1 Z i1 "UU" "x-wind component" "m s-1" -state real t_gc ijg dyn_nmm 1 Z i1 "TT" "temperature" "K" -state real snoalb ij misc 1 - i012r "SNOALB" "ANNUAL MAX SNOW ALBEDO IN FRACTION" "" -state real greenfrac_gc ijm dyn_nmm 1 Z i1 "GREENFRAC" "monthly greenness fraction" "0 - 1 fraction" -state real albedo12m_gc ijm dyn_nmm 1 Z i1 "ALBEDO12M" "background albedo" "0 - 1 fraction" -state real lai12m_gc ijm dyn_nmm 1 Z i1 "LAI12M" "monthly LAI" "m2/m2" -state real soilcbot_gc ijs misc 1 Z i1 "SOILCBOT" "description" "units" -state real soilctop_gc ijs misc 1 Z i1 "SOILCTOP" "description" "units" -state real tmn_gc ij dyn_nmm 1 - i1 "SOILTEMP" "annual mean deep soil temperature" "K" -state real htv_gc ij dyn_nmm 1 - i1 "HGT_V" "wind point topography elevation" "m" -state real ht_gc ij dyn_nmm 1 - i1 "HGT_M" "mass point topography elevation" "m" -state real landusef_gc iju misc 1 Z i1 "LANDUSEF" "description" "units" -state real vlon_gc ij dyn_nmm 1 - i1 "XLONG_V" "longitude, positive east" "degrees" -state real vlat_gc ij dyn_nmm 1 - i1 "XLAT_V" "latitude, positive north" "degrees" -state real hlon_gc ij dyn_nmm 1 - i1 "XLONG_M" "longitude, positive east" "degrees" -state real hlat_gc ij dyn_nmm 1 - i1 "XLAT_M" "latitude, positive north" "degrees" - -############################################################## -# Variables for coupling - -ifdef HWRF=1 -state real dtc - dyn_nmm 1 - irh "DTC" "Coupling timestep" "s" -state real guessdtc - dyn_nmm 1 - irh "GUESSDTC" "Guessed Coupling Timestep for Uncoupled Run" "s" -endif - -############################################################## -# Variables for nmm dynamics -# -# module_BC -# -# pdb is only 2d but registry doesn't support 2d bdy arrays right now... - -# The following arrays were added to avoid using _b and _bt arrays for nesting. -# This is gopal' doing: - -state integer nrnd1 k dyn_nmm 1 - r "NRND1" - -state real relaxwork ij dyn_nmm 1 - r "relaxwork" "Temporary Tv storage array for the membrane MSLP overrelaxation loops" "K" -state integer relaximask ij dyn_nmm 1 - r "relaximask" "Integer mask array for the membrane MSLP overrelaxation loops" "K" -state logical relaxmask ij dyn_nmm 1 - r "relaxmask" "Mask array for the membrane MSLP overrelaxation loops" "K" - -# -# For the Inlined GFDL/NCEP Tracker -# -rconfig integer vortex_tracker namelist,physics max_domains 1 - "vortex_tracker" "Vortex Tracking Algorithm" "" -ifdef HWRF=1 -include registry.tracker -endif - -# For compilation only; any setting other than zero will cause the simulation to halt -rconfig integer traj_opt namelist,physics 1 0 h "traj_opt" "activate trajectory calculation 0=no, 1=on" "" -rconfig logical dm_has_traj namelist,physics max_domains .false. rh "has_traj" "activate trajectory calculation per domain" "" -rconfig integer num_traj namelist,domains 1 1000 irh "num_traj" "#of trajectory" "" - -# Nest motion safeguard: don't let nest get close to parent boundary. -# Default values are lowest possible - anything lower would read -# outside of memory in intermediate domain. -rconfig integer corral_x namelist,domains max_domains 5 h "corral_x" "Minimum parent gridpoints on each side of nest in X direction." "" -rconfig integer corral_y namelist,domains max_domains 5 h "corral_y" "Minimum parent gridpoints on each side of nest in Y direction." "" - -# -# For the moving nest. This is gopal's doing -# - -state real pdyn ij dyn_nmm 1 - rh "PDYN" "Dynamic pressure at mean sea level" -state real mslp ij dyn_nmm 1 - rh "MSLP" "Shuell Mean Sea Level Pressure" "Pa" -ifdef HWRF=1 -state real best_mslp ij dyn_nmm 1 - rh0123d=(DownCopy) "BEST_MSLP" "Best Mean Sea Level Pressure (Shuell or Membrane)" "Pa" -endif -state real sqws ij dyn_nmm 1 - r "SQWS" "SQUARE OF WIND SPEED AT LEVEL 10" -state integer xloc - dyn_nmm 2 - r "XLOC" "I-LOCATION OF MINIMUM DYNAMIC PRESSURE" -state integer yloc - dyn_nmm 2 - r "YLOC" "J-LOCATION OF MINIMUM DYNAMIC PRESSURE" -state logical mvnest - dyn_nmm 1 - r "MVNEST" "LOGICAL SWITCH FOR NMM GRID MOTION" -#for HWRF: zhang's doing added to calculate radiation constant for moving nest for restart -state integer julyr_rst - dyn_nmm 1 - r "JULYR_RST" "JULYR for restart moving nest " -state integer julday_rst - dyn_nmm 1 - r "JULDAY_RST" "JULDAY for restart moving nest " -state real gmt_rst - dyn_nmm 1 - r "GMT_RST" "GMT for restart moving nest " -state integer NTIME0 - dyn_nmm 1 - r "NTIME0" "COUNT FOR PREVIOUS MOVING NEST" - -#for HWRF: -# flag for nest movement -state logical moved - misc 1 - r - -state real ducudt ijk misc 1 - rh "UMMIX" "U TENDENCY MOMENTUM MIXING IN SAS" -state real dvcudt ijk misc 1 - rh "VMMIX" "V TENDENCY MOMENTUM MIXING IN SAS" - -state integer randstate1 ij dyn_nmm 1 - r "randstate1" "random number generator state word 1" -state integer randstate2 ij dyn_nmm 1 - r "randstate2" "random number generator state word 2" -state integer randstate3 ij dyn_nmm 1 - r "randstate3" "random number generator state word 3" -state integer randstate4 ij dyn_nmm 1 - r "randstate4" "random number generator state word 4" -state real random ij dyn_nmm 1 - rh "random" "random number in [0,1) used by SAS" - -# Location of the SOUTH-WEST nested pointed in terms of parent grid - -state integer IIH ij dyn_nmm 1 - r -state integer JJH ij dyn_nmm 1 - r -state integer IIV ij dyn_nmm 1 - r -state integer JJV ij dyn_nmm 1 - r - -# Location of nearest parent point: - -state integer hnear_i ij dyn_nmm 1 - r "HNEAR_I" "I index of nearest parent point on H grid" -state integer hnear_j ij dyn_nmm 1 - r "HNEAR_J" "J index of nearest parent point on H grid" - -# Bi-linear weights - -state real HBWGT1 ij dyn_nmm 1 - r -state real HBWGT2 ij dyn_nmm 1 - r -state real HBWGT3 ij dyn_nmm 1 - r -state real HBWGT4 ij dyn_nmm 1 - r -state real VBWGT1 ij dyn_nmm 1 - r -state real VBWGT2 ij dyn_nmm 1 - r -state real VBWGT3 ij dyn_nmm 1 - r -state real VBWGT4 ij dyn_nmm 1 - r -#end of HWRF: - -# -state real HLON ij dyn_nmm 1 - h0123d=(NoInterp) -state real HLAT ij dyn_nmm 1 - h0123d=(NoInterp) -state real VLON ij dyn_nmm 1 - irh023 -state real VLAT ij dyn_nmm 1 - irh023 - -ifdef HWRF=1 -state integer hifreq_lun - dyn_nmm 0 - - -state integer outatcf_lun - dyn_nmm 0 - - -endif - -include registry.tornado -# Projection south and west bounds for Post: -rconfig real wbd0 derived max_domains 0 - "wbd0" "western boundary of the domain in rotated coordinates" -rconfig real sbd0 derived max_domains 0 - "sbd0" "southern boundary of the domain in rotated coordinates" -state real wbd0var - dyn_nmm 0 - h0123 "wbd0var" "western boundary of the domain" -state real sbd0var - dyn_nmm 0 - h0123 "sbd0var" "southern boundary of the domain" -#for HWRF: -rconfig logical analysis namelist,time_control max_domains .false. irh "analysis flag" "analysis control for the nested domain" -rconfig logical write_analysis namelist,time_control max_domains .true. irh "analysis output flag" "if analysis=F and write_analysis=T then analysis file is written" -rconfig integer io_form_auxinput2 namelist,time_control 1 2 - -ifdef HWRF=1 -rconfig logical high_freq namelist,time_control 1 .true. irh "high frequency output" "flag for high frequency output" -rconfig integer high_dom namelist,time_control 1 -99 irh "domain" "domain for high frequency output (-99 means all domains without children)" -endif - -state real PSTD k dyn_nmm 1 Z r -state integer KZMAX - dyn_nmm - - r -#end of HWRF: - -state real HRES_FIS ij dyn_nmm 1 - rd=(NoInterp)u=(NoInterp)f=(NoInterp) "HRES_FIS" "HIGH RESOLUTION TERRAIN DATA FOR NESTED DOMAIN" -state real HRES_AVC ij dyn_nmm 1 - - "HRES_AVC" "TEMPORARY STORAGE OF HRES_FIS/9.81" -state real HRES_LND ij dyn_nmm 1 - - "HRES_LND" "TEMPORARY STORAGE OF HIGH-RES LND" - -# -# module_MASKS -# -state real hbm2 ij dyn_nmm 1 - irh0123 "HBM2" "Height boundary mask; =0 outer 2 rows on H points" "" -state real hbm3 ij dyn_nmm 1 - irh "HBM3" "Height boundary mask; =0 outer 3 rows on H points" "" -state real vbm2 ij dyn_nmm 1 - irh "VBM2" "Velocity boundary mask; =0 outer 2 rows on V points" "" -state real vbm3 ij dyn_nmm 1 - irh "VBM3" "Velocity boundary mask; =0 outer 3 rows on V points" "" -state real sm ijb dyn_nmm 1 - i01rh0123d=(DownNear)f=(BdyNear) "SM" "Sea mask; =1 for sea, =0 for land" "" -state real sice ij dyn_nmm 1 f irh023d=(DownNear) "SICE" "Sea ice mask; =1 for sea ice, =0 for no sea ice" "" -# -# module_VRBLS -# -state integer ntsd - dyn_nmm - - rh "NTSD" "Number of timesteps done" "" -state integer nstart_hour - dyn_nmm - - r "NSTART_HOUR" "Forecast hour at start of integration" "" - -state real pd ijb dyn_nmm 1 - i01rh023u=(NoInterp)d=(NoInterp)f=(NoInterp) "PD" "Mass at I,J in the sigma domain" "Pa" -state real fis ij dyn_nmm 1 - i01rh023u=(NoInterp)d=(NoInterp)f=(NoInterp) "FIS" "Surface geopotential" "m2 s-2" -state real res ij dyn_nmm 1 - irh "RES" "Reciprocal of surface sigma" "" -state real t ijkb dyn_nmm 1 - i01rh023u=(NoInterp)d=(NoInterp)f=(NoInterp) "T" "Sensible temperature" "K" -state real q ijkb dyn_nmm 1 - i01rh023u=(NoInterp)d=(NoInterp)f=(NoInterp) "Q" "Specific humidity" "kg kg-1" -state real test_vgrid ij dyn_nmm 1 v - "test_vgrid" "Testing V grid staggering" "gibbletrons" -state real u ijkb dyn_nmm 1 v i01rh023u=(UpVel)d=(DownVel)f=(BdyVel) "U" "U component of wind" "m s-1" -state real v ijkb dyn_nmm 1 v i01rh023u=(UpVel)d=(DownVel)f=(BdyVel) "V" "V component of wind" "m s-1" -state real told ijk dyn_nmm 1 - r "TOLD" "T from previous timestep" "K" -state real uold ijk dyn_nmm 1 - r "UOLD" "U from previous timestep" "m s-1" -state real vold ijk dyn_nmm 1 - r "VOLD" "V from previous timestep" "m s-1" -# -# NMM DFI -# -state real hcoeff {ndfi} misc 1 - - "HCOEFF" "initialization weights" -state real hcoeff_tot - misc 1 - - "HCOEFF_TOT" "initialization weights" - -state real dfi_pd ij misc 1 - r "DFI_PD" "Mass at I,J in the sigma domain" "Pa" -state real dfi_pint ijk misc 1 Z r "DFI_PINT" "Model layer interface pressure" "Pa" -state real dfi_dwdt ijk misc 1 - r "DFI_DWDT" "dwdt and 1+(dwdt)/g" "m s-2" -state real dfi_t ijk misc 1 - r "DFI_T" "Sensible temperature" "K" -state real dfi_q ijk misc 1 - r "DFI_Q" "Specific humidity" "kg kg-1" -state real dfi_u ijk misc 1 - r "DFI_U" "U component of wind" "m s-1" -state real dfi_v ijk misc 1 - r "DFI_V" "V component of wind" "m s-1" -state real dfi_q2 ijk misc 1 - r "DFI_Q2" "2 * Turbulence kinetic energy" "m2 s-2" -state real dfi_cwm ijk misc 1 - r "DFI_CWM" "Total condensate" "kg kg-1" -state real dfi_rrw ijk misc 1 - r "DFI_RRW" "Tracer" "kg kg-1" -### remaining simply set aside, and restored to original values after filtering. -### -state real dfi_STC ilj misc 1 Z r "DFI_STC" "SOIL TEMPERATURE" "K" -state real dfi_SMC ilj misc 1 Z r "DFI_SMC" "SOIL MOISTURE" "m3 m-3" -state real dfi_SH2O ilj misc 1 Z r "DFI_SH2O" "UNFROZEN SOIL MOISTURE" "m3 m-3" - -state real dfi_SNOW ij misc 1 - r "dfi_SNOW" "SNOW WATER EQUIVALENT" "kg m-2" -state real dfi_SNOWH ij misc 1 - r "dfi_SNOWH" "PHYSICAL SNOW DEPTH" "m" -state real dfi_CANWAT ij misc 1 - r "dfi_CANWAT" "CANOPY WATER" "kg m-2" -state real dfi_NMM_TSK ij misc 1 - r "dfi_NMM_TSK" "saved SURFACE SKIN TEMPERATURE" -state real dfi_SNOWC ij misc 1 - r "dfi_SNOWC" "FLAG INDICATING SNOW COVERAGE (1 FOR SNOW COVER)" "" - -# -# module_DYNAM -# -state real dx_nmm ij dyn_nmm 1 - irh023 "DX_NMM" "East-west distance H-to-V points" "m" -state real area_nmm ij dyn_nmm 1 - - "AREA_NMM" "Grid cell area" "m2" -state real wpdar ij dyn_nmm 1 - ir -state real cpgfu ij dyn_nmm 1 - ir -state real curv ij dyn_nmm 1 - ir "CURV" "Curvature term= .5*DT*TAN(phi)/RadEarth" "s m-1" -state real fcp ij dyn_nmm 1 - ir -state real fdiv ij dyn_nmm 1 - ir -state real f ij dyn_nmm 1 - ir "F" "Coriolis * DT/2" "" -state real fad ij dyn_nmm 1 - ir -state real ddmpu ij dyn_nmm 1 - ir "DDMPU" "Divergence damping term for U" "m" -state real ddmpv ij dyn_nmm 1 - ir "DDMPV" "Divergence damping term for V" "m" -state real deta k dyn_nmm 1 - i01r "DETA" "Delta sigma in sigma domain" "" -state real rdeta k dyn_nmm 1 - ir "RDETA" "Reciprocal of DETA" "" -state real aeta k dyn_nmm 1 - i01r -state real f4q2 k dyn_nmm 1 - ir -state real etax k dyn_nmm 1 - i01r -state real dfl k dyn_nmm 1 Z i01r "DFL" "Standard atmosphere geopotential" "m2 s-2" -state real deta1 k dyn_nmm 1 - i01rh023 "DETA1" "Delta sigma in pressure domain" "" -state real aeta1 k dyn_nmm 1 - i01rh023 "AETA1" "Midlayer sigma value in pressure domain" "" -state real eta1 k dyn_nmm 1 Z i01rh0123 "ETA1" "Interface sigma value in pressure domain" "" -state real deta2 k dyn_nmm 1 - i01rh023 "DETA2" "Delta sigma in sigma domain" "" -state real aeta2 k dyn_nmm 1 - i01rh023 "AETA2" "Midlayer sigma value in sigma domain" "" -state real eta2 k dyn_nmm 1 Z i01rh0123 "ETA2" "Interface sigma value in sigma domain" "" -state real em q dyn_nmm 1 - ir -state real emt q dyn_nmm 1 - ir -#for HWRF: add to restart -state real adt ij dyn_nmm 1 - r "ADT" "Change of T due to advection" "K" -state real adu ij dyn_nmm 1 - r "ADU" "Change of U due to advection" "m s-1" -state real adv ij dyn_nmm 1 - r "ADV" "Change of V due to advection" "m s-1" -#end HWRF: -state real em_loc q dyn_nmm 1 - r -state real emt_loc q dyn_nmm 1 - r -state real dy_nmm - dyn_nmm - - irh023 "DY_NMM" "North-south distance H-to-V points" "m" -state real cpgfv - dyn_nmm - - ir -state real en - dyn_nmm - - ir -state real ent - dyn_nmm - - ir -state real f4d - dyn_nmm - - ir -state real f4q - dyn_nmm - - ir -state real ef4t - dyn_nmm - - ir -#for HWRF: add to restart -state logical upstrm - dyn_nmm - - - "UPSTRM" ".TRUE. => In upstream advec region of grid" "" -#end HWRF: -state real dlmd - dyn_nmm - - irh023 "DLMD" "East-west angular distance H-to-V points" "degrees" -state real dphd - dyn_nmm - - irh023 "DPHD" "North-south angular distance H-to-V points" "degrees" -state real pdtop - dyn_nmm - - i01rh023 "PDTOP" "Mass at I,J in pressure domain" "Pa" -state real pt - dyn_nmm - - i01rh023 "PT" "Pressure at top of domain" "Pa" -# -# module_CONTIN -# -#for HWRF: add to restart -state real pdsl ij dyn_nmm 1 - r "PDSL" "Sigma-domain pressure at sigma=1" "Pa" -state real pdslo ij dyn_nmm 1 - r "PDSLO" "PDSL from previous timestep" "Pa" -#end HWRF: -state real psdt ij dyn_nmm 1 - r "PSDT" "Surface pressure tendency" "Pa s-1" -state real div ijk dyn_nmm 1 - r "DIV" "Divergence" "Pa s-1" -state real def3d ijk dyn_nmm 1 - r "DEF3D" "Deformation term from horizontal diffusion" "" -#for HWRF: add to restart -state real few ijk dyn_nmm 1 - r "FEW" "Integrated east-west mass flux" "Pa m2 s-1" -state real fne ijk dyn_nmm 1 - r "FNE" "Integrated northeast-southwest mass flux" "Pa m2 s-1" -state real fns ijk dyn_nmm 1 - r "FNS" "Integrated north-south mass flux" "Pa m2 s-1" -state real fse ijk dyn_nmm 1 - r "FSE" "Integrated southeast-northwest mass flux" "Pa m2 s-1" -#end HWRF: -state real omgalf ijk dyn_nmm 1 - r "OMGALF" "Omega-alpha" "K" -#for HWRF: add to restart -state real petdt ijk dyn_nmm 1 - r "PETDT" "Vertical mass flux" "Pa s-1" -#end HWRF: -state real rtop ijk dyn_nmm 1 - r "RTOP" "Rd * Tv / P" "m3 kg-1" -# -# module_PVRBLS -# -state real pblh ij dyn_nmm 1 - rh023 "PBLH" "PBL Height" "m" -state integer lpbl ij dyn_nmm 1 - ir "LPBL" "Model layer of PBL top" "" -state real mixht ij dyn_nmm 1 - rh "MIXHT" "MXL HEIGHT" "m" -state real ustar ij dyn_nmm 1 - irh023d=(DownNear) "USTAR" "Friction velocity" "m s-1" -state real z0 ij dyn_nmm 1 - i01rh023d=(DownNear) "Z0" "Thermal Roughness length" "m" -state real mz0 ij dyn_nmm 1 - h "MZ0" "momentum Roughness length" "m" -state real scurx ij dyn_nmm 1 - irh023d=(DownNear)f=(force_sst_nmm:IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4,FORCE_SST) "SCURX" "Surface Currents(X)" "m s-1" -state real scury ij dyn_nmm 1 - irh023d=(DownNear)f=(force_sst_nmm:IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4,FORCE_SST) "SCURY" "Surface Currents(Y)" "m s-1" -state real charn ij dyn_nmm 1 - irh023d=(DownNear)f=(force_sst_nmm:IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4,FORCE_SST) "CHARN" "Charnock Coeff" " " -state real msang ij dyn_nmm 1 - irh023d=(DownNear)f=(force_sst_nmm:IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4,FORCE_SST) "MSANG" "Wind/Stress Angle" "Radian" -state real rchno ij dyn_nmm 1 - irh023 "RCHNO" "Richardson number" " " -state real zsig1 ij dyn_nmm 1 - irh023 "ZSIG1" "Height of lowest model level" "m" -state real ulowl ij dyn_nmm 1 - irh023 "ULOWL" "U at Lowest Level" "m s-1" -state real vlowl ij dyn_nmm 1 - irh023 "VLOWL" "V at Lowest Level" "m s-1" -state real rc2d ij dyn_nmm 1 - h "RC2D" "critical Richardson number" "m" -state real dku3d ijk dyn_nmm 1 - rh "DKU3D" "Momentum Diffusivity" "m*m/s" -state real dkt3d ijk dyn_nmm 1 - rh "DKT3D" "Thermal Diffusivity" "m*m/s" - -state real SCALEFUN ij dyn_nmm 1 - rh023 "SCALEFUN" "CNV Mass Scale function(0-1)" " " -state real SCALEFUN1 ij dyn_nmm 1 - rh023 "SCALEFUN1" "CNV Mass Scale function 1(0-1)" " " -state real SIGMU ij dyn_nmm 1 - rh023 "SIGMU" "CNV deep updraft fractio n(0-1)" " " -state real SIGMU1 ij dyn_nmm 1 - rh023 "SIGMU1" "CNV shallow updraft fra ction(0-1)" -state real DTHCUDT ijk dyn_nmm 1 - rh "DTHCUDT" "TH tendency due to CU" "K/s" -state real DQVCUDT ijk dyn_nmm 1 - rh "DQVCUDT" "QV tendency due to CU" "kg/kg/s" -state real DQRCUDT ijk dyn_nmm 1 - rh "DQRCUDT" "QR tendency due to CU" "kg/kg/s" -state real DQCCUDT ijk dyn_nmm 1 - rh "DQCCUDT" "QC tendency due to CU" "Kg/kg/s" -state real DQICUDT ijk dyn_nmm 1 - rh "DQICUDT" "QI tendency due to CU" "Kg/kg/s" -state real DQSCUDT ijk dyn_nmm 1 - rh "DQSCUDT" "QS tendency due to CU" "Kg/kg/s" -state real DTHBLDT ijk dyn_nmm 1 - rh "DTHBLDT" "TH tendency due to PBL" "K/s" -state real DQVBLDT ijk dyn_nmm 1 - rh "DQVBLDT" "QV tendency due to PBL" "Kg/kg/s" -state real DUBLDT ijk dyn_nmm 1 - rh "DUBLDT" "U tendency due to PBL" "m/s/s" -state real DVBLDT ijk dyn_nmm 1 - rh "DVBLDT" "V tendency due to PBL" "m/s/s" -state real hpbl2d ij dyn_nmm 1 - irh "HPBL2D" "HEIGHT OF PBL from new GFS pbl" "m" -state real heat2d ij dyn_nmm 1 - irh "HEAT2D" "" "" -state real evap2d ij dyn_nmm 1 - irh "EVAP2D" "" "" -state real z0base ij dyn_nmm 1 - ir "Z0BASE" "Base roughness height" "m" -state real ths ij dyn_nmm 1 - irh023d=(DownCopy) "THS" "Surface potential temperature" "K" -state real mavail ij dyn_nmm 1 - i -state real qsh ij dyn_nmm 1 - irh023d=(DownCopy) "QS" "Surface specific humidity" "kg kg-1" -state real twbs ij dyn_nmm 1 - irh0123 "TWBS" "Instantaneous sensible heat flux" "W m-2" -state real qwbs ij dyn_nmm 1 - irh0123 "QWBS" "Instantaneous latent heat flux" "W m-2" -state real taux ij dyn_nmm 1 - irh0123d=(DownCopy) "TAUX" "Instantaneous stress along X direction in KG/M/S^2" -state real tauy ij dyn_nmm 1 - irh0123d=(DownCopy) "TAUY" "Instantaneous stress along Y direction in KG/M/S^2" -state real prec ij dyn_nmm 1 - rh023 "PREC" "Precipitation in physics timestep" "m" -state real aprec ij dyn_nmm 1 - rh -state real acprec ij dyn_nmm 1 - rh0123d=(DownCopy) "ACPREC" "Accumulatedtotal precipitation" "m" -state real cuprec ij dyn_nmm 1 - rh0123d=(DownCopy) "CUPREC" "Accumulated convective precipitation" "m" -state real lspa ij dyn_nmm 1 - h023 "LSPA" "Land Surface Precipitation Accumulation" "kg m-2" -state real ddata ij dyn_nmm 1 - - "DDATA" "Observed precip to each physics timestep" "kg m-2" -state real accliq ij dyn_nmm 1 - r -state real sno ij dyn_nmm 1 - irh023 "SNO" "Liquid water eqiv of snow on ground" "kg m-2" -state real si ij dyn_nmm 1 - irh023 "SI" "Depth of snow on ground" "mm" -state real cldefi ij dyn_nmm 1 - rh023d=(DownCopy) "CLDEFI" "Convective cloud efficiency" "" -state real deep ij dyn_nmm 1 - r "DEEP" "Deep convection =>.TRUE." "" -state real rf ij dyn_nmm 1 - r -state real th10 ij dyn_nmm 1 - rh023d=(DownCopy) "TH10" "10-m potential temperature from MYJ" "K" -state real q10 ij dyn_nmm 1 - rh023d=(DownCopy) "Q10" "10-m specific humidity from MYJ" "kg kg-1" -state real u10e ij dyn_nmm 1 - rhd=(DownCopy) "U10E" "Special 10-m U from MYJ" "m s-1" -state real v10e ij dyn_nmm 1 - rhd=(DownCopy) "V10E" "Special 10-m V from MYJ" "m s-1" -state real pshltr ij dyn_nmm 1 - rh023d=(DownCopy) "PSHLTR" "2-m pressure from MYJ" "Pa" -state real tshltr ij dyn_nmm 1 - rh023d=(DownCopy) "TSHLTR" "2-m potential temperature from MYJ" "K" -state real qshltr ij dyn_nmm 1 - rh023d=(DownCopy) "QSHLTR" "2-m specific humidity from MYJ" "kg kg-1" -state real q2 ijkb dyn_nmm 1 - irh023u=(UpMass:@EConst,0.0)d=(DownMass:@EConst,0.0)f=(BdyMass:@EConst,0.0) "Q2" "2 * Turbulence kinetic energy" "m2 s-2" -state real t_adj ijk dyn_nmm 1 - rd=(DownNear) "T_ADJ" "T change due to precip in phys step" "K" -state real t_old ijk dyn_nmm 1 - r "T_OLD" "T before last call to precip" "K" -state real zero_3d ijk dyn_nmm 1 - r -state real W0AVG ikj dyn_nmm 1 - r "W0AVG" "AVERAGE VERTICAL VELOCITY FOR KF CUMULUS SCHEME" "m s-1" -state real qcconv ikj dyn_nmm 1 - r "QCCONV" "CLOUD MIXING RATIO FOR BMJ CUMULUS SCHEME" "kg kg-1" -state real qiconv ikj dyn_nmm 1 - r "QICONV" "ICE MIXING RATIO FOR BMJ CUMULUS SCHEME" "kg kg-1" -state real AKHS_OUT ij dyn_nmm 1 - rh023 "AKHS_OUT" "Output sfc exch coeff for heat" "m2 s-1" -state real AKMS_OUT ij dyn_nmm 1 - rh023 "AKMS_OUT" "Output sfc exch coeff for momentum" "m2 s-1" -# -# module_PHYS -# -state real cd_out ij dyn_nmm 1 - rh0123d=(DownCopy) "CD10" "sfc exch coeff for momentum at 10m" "m2 s-1" -state real ch_out ij dyn_nmm 1 - rh0123d=(DownCopy) "CH10" "sfc exch coeff for heat at 10m" "m2 s-1" - -state real albase ij dyn_nmm 1 - i01rh023d=(DownCopy) "ALBASE" "Base albedo" "" -state real albedo ij dyn_nmm 1 - irh023 "ALBEDO" "Dynamic albedo" "" -state real cnvbot ij dyn_nmm 1 - irh023 "CNVBOT" "Lowest convec cloud bottom lyr between outputs" "" -state real cnvtop ij dyn_nmm 1 - irh023 "CNVTOP" "Highest convec cloud top lyr between outputs" "" -state real czen ij dyn_nmm 1 - irh023 "CZEN" "Cosine of solar zenith angle" "" -state real czmean ij dyn_nmm 1 - irh023 "CZMEAN" "Mean CZEN between SW radiation calls" "" -state real embck ij dyn_nmm 1 - ir "EMBCK" "Background radiative emissivity" "" -state real epsr ij dyn_nmm 1 - irh023 "EPSR" "Radiative emissivity" "" -state real gffc ij dyn_nmm 1 - ir -state real glat ij dyn_nmm 1 - i01rh023 "GLAT" "Geographic latitude, radians" "" -state real glon ij dyn_nmm 1 - i01rh023 "GLON" "Geographic longitude, radians" "" -state real NMM_TSK ij dyn_nmm 1 - i01rh023d=(DownNear) "TSK" "Skin temperature" "K" -state real hdac ij dyn_nmm 1 - ir "HDAC" "Composite diffusion coeff for mass points" "s m-1" -state real hdacv ij dyn_nmm 1 - ir "HDACV" "Composite diffusion coeff for velocity points" "s m-1" -state real mxsnal ij dyn_nmm 1 - i01rh023d=(DownNear) "MXSNAL" "Maximum deep snow albedo" "" -state real radin ij dyn_nmm 1 - r -state real radot ij dyn_nmm 1 - rh023 "RADOT" "Radiative emission from surface" "W m-2" -state real sigt4 ij dyn_nmm 1 - rh023d=(DownCopy) "SIGT4" "Stefan-Boltzmann * T**4" "W m-2" -state real tg ij dyn_nmm 1 - i01rh023d=(DownNear) "TGROUND" "Deep ground soil temperature" "K" -state real dfrlg k dyn_nmm 1 Z i01r "DFRLG" "Std atmosphere height of model layer interfaces" "m" -state integer lvl ij dyn_nmm 1 - ir -state integer k22_deep ij misc 1 - - "K22_DEEP" "K22 LEVEL FROM DEEPCONVECTION (G3 only)" "" -state integer kbcon_deep ij misc 1 - - "KBCON_DEEP" "KBCON LEVEL FROM DEEP CONVECTION (G3 only)" "" -state integer ktop_deep ij misc 1 - - "KTOP_DEEP" "KTOP LEVEL FROM DEEP CONVECTION (G3 only)" "" -state real RAINCV_A ij misc 1 - r "RAINCV_A" "taveragd TIME-STEP CUMULUS PRECIPITATION" "mm" -state real RAINCV_B ij misc 1 - r "RAINCV_B" "taveragd TIME-STEP CUMULUS PRECIPITATION" "mm" -state real GD_CLOUD ikj misc 1 - r "GD_CLOUD" "CLOUD WATER/ICE MIXING RAIO IN GD CLOUD" "kg kg-1" -state real GD_CLOUD2 ikj misc 1 - r "GD_CLOUD2" "TEST for GD CLOUD" "kg kg-1" -state real GD_CLOUD_A ikj misc 1 - r "GD_CLOUD_A" "taveragd CLOUD WATER MIXING RAIO IN GD CLOUD" "kg kg-1" -state real GD_CLOUD2_A ikj misc 1 - r "GD_CLOUD2_A" "taveragd cloud ice mix ratio in GD" "kg kg-1" -state real QC_CU ikj misc 1 - r "QC_CU" "CLOUD WATER MIXING RATIO FROM A CU SCHEME" "kg kg-1" -state real QI_CU ikj misc 1 - r "QI_CU" "CLOUD ICE MIXUNG RATIO FROM A CU SCHEME" "kg kg-1" -state real GD_CLDFR ikj misc 1 - r "GD_CLDFR" "GD CLOUD Fraction" " ? " -# upward and downward clearsky and total diagnostic fluxes for radiation (RRTMG) -state real ACSWUPT ij misc 1 - rhdu "ACSWUPT" "ACCUMULATED UPWELLING SHORTWAVE FLUX AT TOP" "J m-2" -state real ACSWUPTC ij misc 1 - rhdu "ACSWUPTC" "ACCUMULATED UPWELLING CLEAR SKY SHORTWAVE FLUX AT TOP" "J m-2" -state real ACSWDNT ij misc 1 - rh023du "ACSWDNT" "ACCUMULATED DOWNWELLING SHORTWAVE FLUX AT TOP" "J m-2" -state real ACSWDNTC ij misc 1 - rhdu "ACSWDNTC" "ACCUMULATED DOWNWELLING CLEAR SKY SHORTWAVE FLUX AT TOP" "J m-2" -state real ACSWUPB ij misc 1 - rhdu "ACSWUPB" "ACCUMULATED UPWELLING SHORTWAVE FLUX AT BOTTOM" "J m-2" -state real ACSWUPBC ij misc 1 - rhdu "ACSWUPBC" "ACCUMULATED UPWELLING CLEAR SKY SHORTWAVE FLUX AT BOTTOM" "J m-2" -state real ACSWDNB ij misc 1 - rhdu "ACSWDNB" "ACCUMULATED DOWNWELLING SHORTWAVE FLUX AT BOTTOM" "J m-2" -state real ACSWDNBC ij misc 1 - rhdu "ACSWDNBC" "ACCUMULATED DOWNWELLING CLEAR SKY SHORTWAVE FLUX AT BOTTOM" "J m-2" -state real ACLWUPT ij misc 1 - rhdu "ACLWUPT" "ACCUMULATED UPWELLING LONGWAVE FLUX AT TOP" "J m-2" -state real ACLWUPTC ij misc 1 - rhdu "ACLWUPTC" "ACCUMULATED UPWELLING CLEAR SKY LONGWAVE FLUX AT TOP" "J m-2" -state real ACLWDNT ij misc 1 - rhdu "ACLWDNT" "ACCUMULATED DOWNWELLING LONGWAVE FLUX AT TOP" "J m-2" -state real ACLWDNTC ij misc 1 - rhdu "ACLWDNTC" "ACCUMULATED DOWNWELLING CLEAR SKY LONGWAVE FLUX AT TOP" "J m-2" -state real ACLWUPB ij misc 1 - rhdu "ACLWUPB" "ACCUMULATED UPWELLING LONGWAVE FLUX AT BOTTOM" "J m-2" -state real ACLWUPBC ij misc 1 - rhdu "ACLWUPBC" "ACCUMULATED UPWELLING CLEAR SKY LONGWAVE FLUX AT BOTTOM" "J m-2" -state real ACLWDNB ij misc 1 - rhdu "ACLWDNB" "ACCUMULATED DOWNWELLING LONGWAVE FLUX AT BOTTOM" "J m-2" -state real ACLWDNBC ij misc 1 - rhdu "ACLWDNBC" "ACCUMULATED DOWNWELLING CLEAR SKY LONGWAVE FLUX AT BOTTOM" "J m-2" -state real SWUPT ij misc 1 - rh023du "SWUPT" "INSTANTANEOUS UPWELLING SHORTWAVE FLUX AT TOP" "W m-2" -state real SWUPTC ij misc 1 - rhdu "SWUPTC" "INSTANTANEOUS UPWELLING CLEAR SKY SHORTWAVE FLUX AT TOP" "W m-2" -state real SWDNT ij misc 1 - rh023du "SWDNT" "INSTANTANEOUS DOWNWELLING SHORTWAVE FLUX AT TOP" "W m-2" -state real SWDNTC ij misc 1 - rhdu "SWDNTC" "INSTANTANEOUS DOWNWELLING CLEAR SKY SHORTWAVE FLUX AT TOP" "W m-2" -state real SWUPB ij misc 1 - rhdu "SWUPB" "INSTANTANEOUS UPWELLING SHORTWAVE FLUX AT BOTTOM" "W m-2" -state real SWUPBC ij misc 1 - rhdu "SWUPBC" "INSTANTANEOUS UPWELLING CLEAR SKY SHORTWAVE FLUX AT BOTTOM" "W m-2" -state real SWDNB ij misc 1 - rhdu "SWDNB" "INSTANTANEOUS DOWNWELLING SHORTWAVE FLUX AT BOTTOM" "W m-2" -state real SWDNBC ij misc 1 - rhdu "SWDNBC" "INSTANTANEOUS DOWNWELLING CLEAR SKY SHORTWAVE FLUX AT BOTTOM" "W m-2" -state real LWUPT ij misc 1 - rhdu "LWUPT" "INSTANTANEOUS UPWELLING LONGWAVE FLUX AT TOP" "W m-2" -state real LWUPTC ij misc 1 - rhdu "LWUPTC" "INSTANTANEOUS UPWELLING CLEAR SKY LONGWAVE FLUX AT TOP" "W m-2" -state real LWDNT ij misc 1 - rhdu "LWDNT" "INSTANTANEOUS DOWNWELLING LONGWAVE FLUX AT TOP" "W m-2" -state real LWDNTC ij misc 1 - rhdu "LWDNTC" "INSTANTANEOUS DOWNWELLING CLEAR SKY LONGWAVE FLUX AT TOP" "W m-2" -state real LWUPB ij misc 1 - rhdu "LWUPB" "INSTANTANEOUS UPWELLING LONGWAVE FLUX AT BOTTOM" "W m-2" -state real LWUPBC ij misc 1 - rhdu "LWUPBC" "INSTANTANEOUS UPWELLING CLEAR SKY LONGWAVE FLUX AT BOTTOM" "W m-2" -state real LWDNB ij misc 1 - rhdu "LWDNB" "INSTANTANEOUS DOWNWELLING LONGWAVE FLUX AT BOTTOM" "W m-2" -state real LWDNBC ij misc 1 - rhdu "LWDNBC" "INSTANTANEOUS DOWNWELLING CLEAR SKY LONGWAVE FLUX AT BOTTOM" "Wm-2" -state real SWVISDIR ij misc 1 Z r "SWVISDIR" "SWR VIS DIR component" "" -state real SWVISDIF ij misc 1 Z r "SWVISDIF" "SWR VIS DIF component" "" -state real SWNIRDIR ij misc 1 Z r "SWNIRDIR" "SWR NIR DIR component" "" -state real SWNIRDIF ij misc 1 Z r "SWNIRDIF" "SWR NIR DIF component" "" - -state real refl_10cm ikj dyn_nmm 1 - h023d=(DownMassIKJ:@ECopy,-35.0) "refl_10cm" "Radar reflectivity (lamda = 10 cm)" "dBZ" -state real REFD_MAX ij misc 1 - h0123d=(DownCopy) "REFD_MAX" "Composite (column maximum) radar reflectivity (lambda = 10 cm)" "dBZ" -state real qnwfa2d ij misc 1 - rhdu "QNWFA2D" "Surface aerosol number conc emission" "kg-1 s-1" -state real re_cloud ikj misc 1 - r "re_cloud" "Effective radius, cloud drops" "m" -state real re_ice ikj misc 1 - r "re_ice" "Effective radius, cloud ice" "m" -state real re_snow ikj misc 1 - r "re_snow" "Effective radius, snow" "m" -state real dfi_re_cloud ikj misc 1 - - "DFI_RE_CLOUD" "DFI Effective radius cloud water" "m" -state real dfi_re_ice ikj misc 1 - - "DFI_RE_ICE" "DFI Effective radius cloud ice" "m" -state real dfi_re_snow ikj misc 1 - - "DFI_RE_SNOW" "DFI Effective radius snow" "m" -state integer has_reqc - misc 1 - r "has_reqc" "Flag for has effective radius of cloud water" "" -state integer has_reqi - misc 1 - r "has_reqi" "Flag for has effective radius of cloud ice" "" -state integer has_reqs - misc 1 - r "has_reqs" "Flag for has effective radius of snow" "" - -# -# added WRF-Solar -state real swddir ij misc 1 - rhd "SWDDIR" "Shortwave surface downward direct irradiance" "W m-2" "" -state real swddirc ij misc 1 - rd "SWDDIRC" "Clear-sky Shortwave surface downward direct irradiance" "W m-2" "" -state real swddni ij misc 1 - rhd "SWDDNI" "Shortwave surface downward direct normal irradiance" "W m-2" "" -state real swddnic ij misc 1 - rd "SWDDNIC" "Clear-sky Shortwave surface downward direct normal irradiance" "W m-2" "" -state real swddif ij misc 1 - rhd "SWDDIF" "Shortwave surface downward diffuse irradiance" "W m-2" "" -state real Gx ij misc 1 - rd "Gx" "" "" -state real Bx ij misc 1 - rd "Bx" "" "" -state real gg ij misc 1 - rd "gg" "" "" -state real bb ij misc 1 - rd "bb" "" "" -state real coszen_ref ij misc 1 - rd "coszen_ref" "" "" -state real coszen ij misc 1 - - "coszen " "" "" -state real hrang ij misc 1 - - "hrang" "" "" -state real swdown_ref ij misc 1 - rd "swdown_ref" "" "" -state real swddir_ref ij misc 1 - rd "swddir_ref" "" "" -rconfig integer swint_opt namelist,physics 1 0 - "swint_opt" "interpolation option for sw radiation" "" -# add aerosol namelists -rconfig integer aer_type namelist,physics max_domains 1 irh "aer_type" "aerosol type: 1 is SF79 rural, 2 is SF79 urban" "" -rconfig integer aer_aod550_opt namelist,physics max_domains 1 irh "aer_aod550_opt" "input option for aerosol optical depth at 550 nm" "" -rconfig integer aer_angexp_opt namelist,physics max_domains 1 irh "aer_angexp_opt" "input option for aerosol Angstrom exponent" "" -rconfig integer aer_ssa_opt namelist,physics max_domains 1 irh "aer_ssa_opt" "input option for aerosol single-scattering albedo" "" -rconfig integer aer_asy_opt namelist,physics max_domains 1 irh "aer_asy_opt" "input option for aerosol asymmetry parameter" "" -rconfig real aer_aod550_val namelist,physics max_domains 0.12 irh "aer_aod550_val" "fixed value for aerosol optical depth at 550 nm. Valid when aer_aod550_opt=1" "" -rconfig real aer_angexp_val namelist,physics max_domains 1.3 irh "aer_angexp_val" "fixed value for aerosol Angstrom exponent. Valid when aer_angexp_opt=1" "" -rconfig real aer_ssa_val namelist,physics max_domains 0.85 irh "aer_ssa_val" "fixed value for aerosol single-scattering albedo. Valid when aer_ssa_opt=1" "" -rconfig real aer_asy_val namelist,physics max_domains 0.90 irh "aer_asy_val" "fixed value for aerosol asymmetry parameter. Valid when aer_asy_opt=1" "" - -# -# module_IGWAVE_ADJUST.F - -state real avgPchg - dyn_nmm 1 - r "avgPchg" "Average global change (hPa/3h)" "hPa/3h" - -# module_CLDWTR.F -# -state real cwm ijkb dyn_nmm 1 - rh023u=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "CWM" "Total condensate" "kg kg-1" -state real rrw ijkb dyn_nmm 1 - rh "RRW" "Tracer" "kg kg-1" -state real f_ice ikj dyn_nmm 1 - rh023d=(DownMassIKJ:@EExtrap,0.0)u=(UpMassIKJ:@EExtrap,0.0) "F_ICE" "Frozen fraction of CWM" "" -state real f_rain ikj dyn_nmm 1 - rh023d=(DownMassIKJ:@EExtrap,0.0)u=(UpMassIKJ:@EExtrap,0.0) "F_RAIN" "Rain fraction of liquid part of CWM" "" -state real f_rimef ikj dyn_nmm 1 - rh023d=(DownMassIKJ:@EExtrap,1.0)u=(UpMassIKJ:@EExtrap,1.0) "F_RIMEF" "Rime factor" "" -state real cldfra ijk dyn_nmm 1 - i023rhdu "CLDFRA" "Cloud fraction" "" -state real CONVCLD ij dyn_nmm 1 - r "CONVCLD" "BMJ CONVECTIVE CLOUD" "kg m-2" -state real CCLDFRA ikj dyn_nmm 1 - r "CCLDFRA" "CONVECTIVE CLOUD FRACTION" "" -state real sr ij dyn_nmm 1 - irh023 "SR" "Timestep mass ratio of snow:precip" "" -state real cfrach ij dyn_nmm 1 - rh023d=(DownCopy) "CFRACH" "High cloud fraction" "" -state real cfracl ij dyn_nmm 1 - rh023d=(DownCopy) "CFRACL" "Low cloud fraction" "" -state real cfracm ij dyn_nmm 1 - rh023d=(DownCopy) "CFRACM" "Middle cloud fraction" "" -state logical micro_start - dyn_nmm - - - -# -# module_SOIL.F -# -state integer islope ij dyn_nmm 1 - i01rh023d=(DownINear) "ISLOPE" -state real dzsoil k dyn_nmm 1 - irh023 "DZSOIL" "Thickness of soil layers" "m" -state real rtdpth k dyn_nmm 1 - i01r -state real sldpth k dyn_nmm 1 - i01rh023 "SLDPTH" "Depths of centers of soil layers" "m" -state real cmc ij dyn_nmm 1 - i01rh023d=(DownNear) "CMC" "Canopy moisture" "m" -state real grnflx ij dyn_nmm 1 - irh023 "GRNFLX" "Deep soil heat flux" "W m-2" -state real pctsno ij dyn_nmm 1 - irh023 -state real soiltb ij dyn_nmm 1 - i01rh023d=(DownNear) "SOILTB" "Deep ground soil temperature" "K" -state real vegfrc ij dyn_nmm 1 - i014rh023d=(DownNear) "VEGFRC" "Vegetation fraction" "" -state real shdmax ij dyn_nmm 1 - ird=(DownNear) "SHDMAX" "ANNUAL MAX VEG FRACTION" "" -state real shdmin ij dyn_nmm 1 - ird=(DownNear) "SHDMIN" "ANNUAL MIN VEG FRACTION" "" -state real sh2o ilj dyn_nmm 1 Z irh023d=(DownNearIKJ) "SH2O" "Unfrozen soil moisture volume fraction" "" -state real smc ilj dyn_nmm 1 Z irh023d=(DownNearIKJ) "SMC" "Soil moisture volume fraction" "" -state real stc ilj dyn_nmm 1 Z irh023d=(DownNearIKJ) "STC" "Soil temperature" "K" -# -# module_GWD.F -# -state real hstdv ij dyn_nmm 1 - i01rh "HSTDV" "Standard deviation of height" "m" -state real hcnvx ij dyn_nmm 1 - i01rh "HCNVX" "Normalized 4th moment of orographic convexity" "" -state real hasyw ij dyn_nmm 1 - i01rh "HASYW" "Orographic asymmetry in W-E plane" "" -state real hasys ij dyn_nmm 1 - i01rh "HASYS" "Orographic asymmetry in S-N plane" "" -state real hasysw ij dyn_nmm 1 - i01rh "HASYSW" "Orographic asymmetry in SW-NE plane" "" -state real hasynw ij dyn_nmm 1 - i01rh "HASYNW" "Orographic asymmetry in NW-SE plane" "" -state real hlenw ij dyn_nmm 1 - i01rh "HLENW" "Orographic length scale in W-E plane" "" -state real hlens ij dyn_nmm 1 - i01rh "HLENS" "Orographic length scale in S-N plane" "" -state real hlensw ij dyn_nmm 1 - i01rh "HLENSW" "Orographic length scale in SW-NE plane" "" -state real hlennw ij dyn_nmm 1 - i01rh "HLENNW" "Orographic length scale in NW-SE plane" "" -state real hangl ij dyn_nmm 1 - i01rh "HANGL" "Angle of the mountain range w/r/t east" "deg" -state real hanis ij dyn_nmm 1 - i01rh "HANIS" "Anisotropy/aspect ratio of orography" "" -state real hslop ij dyn_nmm 1 - i01rh "HSLOP" "Slope of orography" "" -state real hzmax ij dyn_nmm 1 - i01rh "HZMAX" "Maximum height above mean orography" "m" -state real crot ij dyn_nmm 1 - - "CROT" "Cosine of angle between model and earth coordinates" "" -state real srot ij dyn_nmm 1 - - "SROT" "Sine of angle between model and earth coordinates" "" -state real UGWDsfc ij dyn_nmm 1 - h "UGWDsfc" "Surface zonal wind stress due to gravity wave drag" "N m-2" -state real VGWDsfc ij dyn_nmm 1 - h "VGWDsfc" "Surface meridional wind stress due to gravity wave drag" "N m-2" -# -# Additional for topo_wind -# -state real ctopo ij misc 1 - rdu "ctopo" "Correction for topography" "" -state real ctopo2 ij misc 1 - rdu "ctopo2" "Correction for topography 2" "" -# -# module_NHYDRO.F -# -state logical hydro - dyn_nmm - - - "HYDRO" ".FALSE. => nonhydrostatic" "" -state real dwdtmn ij dyn_nmm 1 - - "DWDTMN" "Minimum value for DWDT" "m s-2" -state real dwdtmx ij dyn_nmm 1 - - "DWDTMX" "Maximum value for DWDT" "m s-2" -state real baro ij dyn_nmm 1 - - "BARO" "external mode vvel" "m s-1" -state real dwdt ijk dyn_nmm 1 - rd=(DownCopy) "DWDT" "dwdt and 1+(dwdt)/g" "m s-2" -state real pdwdt ijk dyn_nmm 1 - r -state real pint ijk dyn_nmm 1 Zn irh023d=(DownCopy)u=(NoInterp)f=(NoInterp) "PINT" "Model layer interface pressure" "Pa" -state real w ijk dyn_nmm 1 Z rd=(DownCopy) "W_nonhydro" "Vertical velocity (non-hydrostatic component only)" "m s-1" -state real w_tot ijk dyn_nmm 1 Z h023d=(DownCopy) "W" "Vertical velocity" "m s-1" -state real z ijk dyn_nmm 1 Z hd=(DownCopy) "Z" "Distance from ground" "m" -# -# module_ACCUM.F -# -state real acfrcv ij dyn_nmm 1 - rh023 "ACFRCV" "Accum convective cloud fraction" "" -state real acfrst ij dyn_nmm 1 - rh023 "ACFRST" "Accum stratiform cloud fraction" "" -state real ssroff ij dyn_nmm 1 - rh023 "SSROFF" "Surface runoff" "mm" -state real bgroff ij dyn_nmm 1 - rh "BGROFF" "Subsurface runoff" "mm" -state real rlwin ij dyn_nmm 1 - rh0123d=(DownCopy) "RLWIN" "Downward longwave at surface" "W m-2" -state real rlwout ij dyn_nmm 1 - - -state real rlwtoa ij dyn_nmm 1 - rh023 "RLWTOA" "Outgoing LW flux at top of atmos" "W m-2" -state real alwin ij dyn_nmm 1 - rh023 "ALWIN" "Accum LW down at surface" "W m-2" -state real alwout ij dyn_nmm 1 - rh023 "ALWOUT" "Accum RADOT (see above)" "W m-2" -state real alwtoa ij dyn_nmm 1 - rh023 "ALWTOA" "Accum RLWTOA" "W m-2" -state real rswin ij dyn_nmm 1 - rh0123d=(DownCopy) "RSWIN" "Downward shortwave at surface" "W m-2" -state real rswinc ij dyn_nmm 1 - rh023 "RSWINC" "Clear-sky equivalent of RSWIN" "W m-2" -state real rswout ij dyn_nmm 1 - rh0123 "RSWOUT" "Upward shortwave at surface" "W m-2" -#for HWRF: add to restart -state real rswtoa ij dyn_nmm 1 - rh023 "RSWTOA" "Outgoing SW flux at top of atmos" "W m-2" -#end HWRF -state real aswin ij dyn_nmm 1 - rh023 "ASWIN" "Accum SW down at surface" "W m-2" -state real aswout ij dyn_nmm 1 - rh023 "ASWOUT" "Accum RSWOUT" "W m-2" -state real aswtoa ij dyn_nmm 1 - rh023 "ASWTOA" "Accum RSWTOA" "W m-2" -state real sfcshx ij dyn_nmm 1 - rh023 "SFCSHX" "Accum sfc sensible heat flux" "W m-2" -state real sfclhx ij dyn_nmm 1 - rh023 "SFCLHX" "Accum sfc latent heat flux" "W m-2" -state real subshx ij dyn_nmm 1 - rh023 "SUBSHX" "Accum deep soil heat flux" "W m-2" -state real snopcx ij dyn_nmm 1 - rh "SNOPCX" "Snow phase change heat flux" "W m-2" -state real sfcuvx ij dyn_nmm 1 - rh -state real potevp ij dyn_nmm 1 - rh023 "POTEVP" "Accum potential evaporation" "m" -state real potflx ij dyn_nmm 1 - rh "POTFLX" "Energy equivalent of POTEVP" "W m-2" -state real tlmin ij dyn_nmm 1 - rh -state real tlmax ij dyn_nmm 1 - rh -state real t02_min ij dyn_nmm 1 - rh "T02_MIN" "Hourly Min Shelter Temperature" "K" -state real t02_max ij dyn_nmm 1 - rh "T02_MAX" "Hourly Max Shelter Temperature" "K" -state real rh02_min ij dyn_nmm 1 - rh "RH02_MIN" "Hourly Min Relative Humidity" "" -state real rh02_max ij dyn_nmm 1 - rh "RH02_MAX" "Hourly Max Relative Humidity" "" -state real rlwtt ijk dyn_nmm 1 - rh023d=(DownNear) "RLWTT" "Longwave temperature tendency" "K s-1" -state real rswtt ijk dyn_nmm 1 - rh023d=(DownNear) "RSWTT" "Shortwave temperature tendency" "K s-1" -#for HWRF: add to restart -state real tcucn ijk dyn_nmm 1 - rh023 "TCUCN" "Accum convec temperature tendency" "K s-1" -state real train ijk dyn_nmm 1 - rh023 "TRAIN" "Accum stratiform temp tendency" "K s-1" -#end HWRF -state integer ncfrcv ij dyn_nmm 1 - irh023 "NCFRCV" "# times convec cloud >0 between rad calls" "" -state integer ncfrst ij dyn_nmm 1 - irh023 "NCFRST" "# times stratiform cloud >0 between rad calls" "" -state integer nphs0 - dyn_nmm - - rh023 -state integer ncnvc0 - dyn_nmm - - rh -state integer nprec - dyn_nmm - - irh023 "NPREC" "# timesteps between resetting precip bucket" "" -state integer nclod - dyn_nmm - - irh023 "NCLOD" "# timesteps between resetting cloud frac accum" "" -state integer nheat - dyn_nmm - - irh023 "NHEAT" "# timesteps between resetting latent heat accum" "" -state integer nrdlw - dyn_nmm - - irh023 "NRDLW" "# timesteps between resetting longwave accums" "" -state integer nrdsw - dyn_nmm - - irh023 "NRDSW" "# timesteps between resetting shortwave accums" "" -state integer nsrfc - dyn_nmm - - irh023 "NSRFC" "# timesteps between resetting sfcflux accums" "" -state real avrain - dyn_nmm - - irh023 "AVRAIN" "# of times gridscale precip called in NHEAT steps" "" -state real avcnvc - dyn_nmm - - irh023 "AVCNVC" "# of times convective precip called in NHEAT steps" "" -state real aratim - dyn_nmm - - ir -state real acutim - dyn_nmm - - irh -state real ardlw - dyn_nmm - - irh023 "ARDLW" "# of times LW fluxes summed before resetting" "" -state real ardsw - dyn_nmm - - irh023 "ARDSW" "# of times SW fluxes summed before resetting" "" -state real asrfc - dyn_nmm - - irh023 "ASRFC" "# of times sfc fluxes summed before resetting" "" -state real aphtim - dyn_nmm - - irh -# -# module_INDX.F -# -state integer ihe j dyn_nmm 1 - - "IHE" "0 or +1 to obtain I index of V point east of H point" "" -state integer ihw j dyn_nmm 1 - - "IHW" "0 or -1 to obtain I index of V point west of H point" "" -state integer ive j dyn_nmm 1 - - "IVE" "0 or +1 to obtain I index of H point east of V point" "" -state integer ivw j dyn_nmm 1 - - "IVW" "0 or -1 to obtain I index of H point west of V point" "" -state integer irad i dyn_nmm 1 - - -#definitions for NMM east-west orientation on E grid -state integer iheg q dyn_nmm 1 - - -state integer ihwg q dyn_nmm 1 - - -state integer iveg q dyn_nmm 1 - - -state integer ivwg q dyn_nmm 1 - - -state integer iradg r dyn_nmm 1 - - -state integer n_iup_h j dyn_nmm 1 - - "N_IUP_H" "# mass points needed in each row for upstream advection" "" -state integer n_iup_v j dyn_nmm 1 - - "N_IUP_V" "# velocity points needed in each row for upstream advection" "" -state integer n_iup_adh j dyn_nmm 1 - - "N_IUP_ADH" "# mass points in each row of upstream advection" "" -state integer n_iup_adv j dyn_nmm 1 - - "N_IUP_ADV" "# velocity points in each row of upstream advection" "" -state integer iup_h ij dyn_nmm 1 - - -state integer iup_v ij dyn_nmm 1 - - -state integer iup_adh ij dyn_nmm 1 - - -state integer iup_adv ij dyn_nmm 1 - - -state integer imicrogram - misc - - r "imicrogram" "flag 0/1 0=mixratio, 1=mcrograms/m3" "" - -# Interpolation information -state real winfo ijkb dyn_nmm 1 Z u=(NoInterp)d=(NoInterp) "winfo" "Nest-parent interpolation/extrapolation weight" "" -state integer iinfo ijkb dyn_nmm 1 Z u=(NoInterp)d=(NoInterp) "iinfo" "Nest-parent interpolation index" "" - -# -# table entries are of the form -# -# -# Mask for moving nest interpolations -state integer imask_nostag ij misc - - rh "IMASK_NOSTAG" "INTERPOLATION MASK" -state integer imask_xstag ij misc X -state integer imask_ystag ij misc Y -state integer imask_xystag ij misc XY -# -#--------------------------------------------------------------------------------------------------------------------------------- -# SI - start variables from netCDF format from Standard Initialization, most eventually for use in LSM schemes -#--------------------------------------------------------------------------------------------------------------------------------- - -state real sm000007 ij misc 1 - i1 "SM000007" "LAYER SOIL MOISTURE" "m3 m-3" -state real sm007028 ij misc 1 - i1 "SM007028" "LAYER SOIL MOISTURE" "m3 m-3" -state real sm028100 ij misc 1 - i1 "SM028100" "LAYER SOIL MOISTURE" "m3 m-3" -state real sm100255 ij misc 1 - i1 "SM100255" "LAYER SOIL MOISTURE" "m3 m-3" -state real st000007 ij misc 1 - i1 "ST000007" "LAYER SOIL TEMPERATURE" "K" -state real st007028 ij misc 1 - i1 "ST007028" "LAYER SOIL TEMPERATURE" "K" -state real st028100 ij misc 1 - i1 "ST028100" "LAYER SOIL TEMPERATURE" "K" -state real st100255 ij misc 1 - i1 "ST100255" "LAYER SOIL TEMPERATURE" "K" -state real sm000010 ij misc 1 - i1 "SM000010" "description" "units" -state real sm010040 ij misc 1 - i1 "SM010040 " "description" "units" -state real sm040100 ij misc 1 - i1 "SM040100 " "description" "units" -state real sm100200 ij misc 1 - i1 "SM100200 " "description" "units" -state real sm010200 ij misc 1 - i1 "SM010200" "description" "units" -state real soilm000 ij misc 1 - i1 "SOILM000" "description" "units" -state real soilm005 ij misc 1 - i1 "SOILM005" "description" "units" -state real soilm020 ij misc 1 - i1 "SOILM020" "description" "units" -state real soilm040 ij misc 1 - i1 "SOILM040" "description" "units" -state real soilm160 ij misc 1 - i1 "SOILM160" "description" "units" -state real soilm300 ij misc 1 - i1 "SOILM300" "description" "units" -state real sw000010 ij misc 1 - i1 "SW000010" "description" "units" -state real sw010040 ij misc 1 - i1 "SW010040" "description" "units" -state real sw040100 ij misc 1 - i1 "SW040100" "description" "units" -state real sw100200 ij misc 1 - i1 "SW100200" "description" "units" -state real sw010200 ij misc 1 - i1 "SW010200" "description" "units" -state real soilw000 ij misc 1 - i1 "SOILW000" "description" "units" -state real soilw005 ij misc 1 - i1 "SOILW005" "description" "units" -state real soilw020 ij misc 1 - i1 "SOILW020" "description" "units" -state real soilw040 ij misc 1 - i1 "SOILW040" "description" "units" -state real soilw160 ij misc 1 - i1 "SOILW160" "description" "units" -state real soilw300 ij misc 1 - i1 "SOILW300" "description" "units" -state real st000010 ij misc 1 - i1 "ST000010" "description" "units" -state real st010040 ij misc 1 - i1 "ST010040" "description" "units" -state real st040100 ij misc 1 - i1 "ST040100" "description" "units" -state real st100200 ij misc 1 - i1 "ST100200" "description" "units" -state real st010200 ij misc 1 - i1 "ST010200" "description" "units" -state real soilt000 ij misc 1 - i1 "SOILT000" "description" "units" -state real soilt005 ij misc 1 - i1 "SOILT005" "description" "units" -state real soilt020 ij misc 1 - i1 "SOILT020" "description" "units" -state real soilt040 ij misc 1 - i1 "SOILT040" "description" "units" -state real soilt160 ij misc 1 - i1 "SOILT160" "description" "units" -state real soilt300 ij misc 1 - i1 "SOILT300" "description" "units" -state real landmask ij misc 1 f i01rhd=(DownNear) "LANDMASK" "description" "units" -state real topostdv ij misc 1 - i1 "TOPOSTDV" "description" "units" -state real toposlpx ij misc 1 - i1 "TOPOSLPX" "description" "units" -state real toposlpy ij misc 1 - i1 "TOPOSLPY" "description" "units" -state real greenmax ij misc 1 - i1 "GREENMAX" "description" "units" -state real greenmin ij misc 1 - i1 "GREENMIN" "description" "units" -state real albedomx ij misc 1 - i1 "ALBEDOMX" "description" "units" -state real toposoil ij misc 1 - i1d=(DownNear) "TOPOSOIL" "description" "units" -state real landusef iuj misc 1 Z - "" "description" "units" -state real soilctop isj misc 1 Z - "" "description" "units" -state real soilcbot isj misc 1 Z - "" "description" "units" - -#------------------------------------------------------------------------------------------------------------------------------- -# SI - end variables from netCDF format from Standard Initialization -#------------------------------------------------------------------------------------------------------------------------------- - -# Time series variables -state real ts_hour ?! misc - - - "TS_HOUR" "Model integration time, hours" -state real ts_u ?! misc - - - "TS_U" "Surface wind U-component, earth-relative" -state real ts_v ?! misc - - - "TS_V" "Surface wind V-component, earth-relative" -state real ts_q ?! misc - - - "TS_Q" "Surface mixing ratio" -state real ts_t ?! misc - - - "TS_T" "Surface temperature" -state real ts_psfc ?! misc - - - "TS_PSFC" "Surface pressure" -state real ts_tsk ?! misc - - - "TS_TSK" "Skin temperature" -state real ts_tslb ?! misc - - - "TS_TSLB" "Soil temperature" -state real ts_clw ?! misc - - - "TS_CLW" "Column integrated cloud water" - -#----------------------------------------------------------------------------------------------------------------------------------------------------------------- - - -# Moist Scalars - both height and mass coordinate models -# -# The first line ensures that there will be identifiers named moist and -# moist_tend even if there are not any moist scalars (so the essentially -# dry code will will still link properly) -# -state real - ijkfbt moist 1 m - - -state real qv ijkfbt moist 1 m rh023u=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QVAPOR" "Water vapor mixing ratio" "kg kg-1" -state real qc ijkfbt moist 1 m rh023u=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QCLOUD" "Cloud water mixing ratio" "kg kg-1" -state real qr ijkfbt moist 1 m rh023u=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QRAIN" "Rain water mixing ratio" "kg kg-1" -state real qi ijkfbt moist 1 m rh023u=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QICE" "Ice mixing ratio" "kg kg-1" -state real qs ijkfbt moist 1 m rh023u=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QSNOW" "Snow mixing ratio" "kg kg-1" -state real qg ijkfbt moist 1 m rh023u=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QGRAUP" "Graupel mixing ratio" "kg kg-1" -state real qh ijkfbt moist 1 m rh023u=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QHAIL" "Hail mixing ratio" "kg kg-1" - -# MAD-WRF -state real - ijkfbt tracer 1 m - - -state real tr_qc ijkfbt tracer 1 m rh023u=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "tr_qcloud" "Tracer with the liquid content" "kg kg-1" -state real tr_qi ijkfbt tracer 1 m rh023u=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "tr_qice" "Tracer with the ice content" "kg kg-1" -state real tr_qs ijkfbt tracer 1 m rh023u=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "tr_qsnow" "Tracer with the snow content" "kg kg-1" - -state real - ijkfbt dfi_moist 1 m - - -state real dfi_qv ijkfbt dfi_moist 1 m r "QVAPOR" "Water vapor mixing ratio" "kg kg-1" -state real dfi_qc ijkfbt dfi_moist 1 m r "QCLOUD" "Cloud water mixing ratio" "kg kg-1" -state real dfi_qr ijkfbt dfi_moist 1 m r "QRAIN" "Rain water mixing ratio" "kg kg-1" -state real dfi_qi ijkfbt dfi_moist 1 m r "QICE" "Ice mixing ratio" "kg kg-1" -state real dfi_qs ijkfbt dfi_moist 1 m r "QSNOW" "Snow mixing ratio" "kg kg-1" -state real dfi_qg ijkfbt dfi_moist 1 m r "QGRAUP" "Graupel mixing ratio" "kg kg-1" -state real dfi_qh ijkfbt dfi_moist 1 m r "QHAIL" "Hail mixing ratio" "kg kg-1" - - -# -# Other Scalars -state real - ijkftb scalar 1 m - - -state real qni ijkftb scalar 1 m i01h023ru=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QNICE" "Ice Number concentration" "# kg(-1)" -state real qt ikjftb scalar 1 m i01h023ru=(UpMassIKJ:@ECopy,0.0)d=(DownMassIKJ:@ECopy,0.0)f=(BdyMassIKJ:@ECopy,0.0) "QT" "Total condensate mixing ratio" "kg kg-1" -state real qns ijkftb scalar 1 m i01h023ru=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QNSNOW" "Snow Number concentration" "# kg(-1)" -state real qnr ijkftb scalar 1 m i01h023ru=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QNRAIN" "Rain Number concentration" "# kg(-1)" -state real qng ijkftb scalar 1 m i01h023ru=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QNGRAUP" "Graupel Number concentration" "# kg(-1)" -state real qnh ijkftb scalar 1 m i01h023ru=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QNHAIL" "Hail Number concentration" "# kg(-1)" -state real qnn ijkftb scalar 1 m i01h023ru=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QNCCN" "CCN Number concentration" "# kg(-1)" -state real qnc ijkftb scalar 1 m i01h023ru=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QNCLOUD" "cloud water Number concentration" "# kg(-1)" -state real qvolg ikjftb scalar 1 m i01h023ru=(UpMassIKJ:@ECopy,0.0)d=(DownMassIKJ:@ECopy,0.0)f=(BdyMassIKJ:@ECopy,0.0) "QVGRAUPEL" "Graupel Particle Volume" "m(3) kg(-1)" -state real qvolh ikjftb scalar 1 m i01h023ru=(UpMassIKJ:@ECopy,0.0)d=(DownMassIKJ:@ECopy,0.0)f=(BdyMassIKJ:@ECopy,0. 0) "QVHAIL" "Hail Particle Volume" "m(3) kg(-1)" -state real qnwfa ikjftb scalar 1 m i01h023ru=(UpMassIKJ:@ECopy,0.0)d=(DownMassIKJ:@ECopy,0.0)f=(BdyMassIKJ:@ECopy,0.0) "QNWFA" "water-friendly aerosol number con" "# kg(-1)" -state real qnifa ikjftb scalar 1 m i01h023ru=(UpMassIKJ:@ECopy,0.0)d=(DownMassIKJ:@ECopy,0.0)f=(BdyMassIKJ:@ECopy,0.0) "QNIFA" "ice-friendly aerosol number con" "# kg(-1)" -state real qndrop ikjftb scalar 1 m i01h023ru=(UpMassIKJ:@ECopy,0.0)d=(DownMassIKJ:@ECopy,0.0)f=(BdyMassIKJ:@ECopy,0.0) "QNDROP" "Droplet number mixing ratio" "# kg-1" -state real qrimef ijkftb scalar 1 m i01h023ru=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QRIMEF" "rime factor * qi" "kg kg-1" - -state real - ijkftb dfi_scalar 1 m - - -state real dfi_qndrop ijkftb dfi_scalar 1 m \ - rsu=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "DFI_QNDROP" "DFI Droplet number mixing ratio" "# kg-1" -state real dfi_qni ijkftb dfi_scalar 1 m \ - rsu=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "DFI_QNICE" "DFI Ice Number concentration" "# kg-1" -state real dfi_qt ijkftb dfi_scalar 1 m \ - rsu=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "DFI_CWM" "DFI Total condensate mixing ratio" "kg kg-1" -state real dfi_qns ijkftb dfi_scalar 1 m \ - rsu=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "DFI_QNSNOW" "DFI Snow Number concentration" "# kg(-1)" -state real dfi_qnr ijkftb dfi_scalar 1 m \ - rsu=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "DFI_QNRAIN" "DFI Rain Number concentration" "# kg(-1)" -state real dfi_qng ijkftb dfi_scalar 1 m \ - rsu=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "DFI_QNGRAUPEL" "DFI Graupel Number concentration" "# kg(-1)" -state real dfi_qnh ijkfbt dfi_scalar 1 m \ - rsu=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "QNHAIL" "Hail Number concentration" "# kg(-1)" -state real dfi_qnn ijkftb dfi_scalar 1 m \ - rsu=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "DFI_QNCC" "DFI CNN Number concentration" "# kg(-1)" -state real dfi_qnc ijkftb dfi_scalar 1 m \ - rsu=(UpMass:@ECopy,0.0)d=(DownMass:@ECopy,0.0)f=(BdyMass:@ECopy,0.0) "DFI_QNCLOUD" "DFI Cloud Number concentration" "# kg(-1)" -state real dfi_qnwfa ikjftb dfi_scalar 1 m \ - rsu=(UpMassIKJ:@ECopy,0.0)d=(DownMassIKJ:@ECopy,0.0)f=(BdyMassIKJ:@ECopy,0.0) "DFI_QNWFA" "DFI water-friendly aerosol number con" "# kg(-1)" -state real dfi_qnifa ikjftb dfi_scalar 1 m \ - rsu=(UpMassIKJ:@ECopy,0.0)d=(DownMassIKJ:@ECopy,0.0)f=(BdyMassIKJ:@ECopy,0.0) "DFI_QNIFA" "DFI ice-friendly aerosol number con" "# kg(-1)" - -# MAD-WRF -state real brtemp ij dyn_em 1 - i01h "brtemp" "Brightness temperature to calc cloud top height" "K" -state real cldmask ij dyn_em 1 - i01h "cldmask" "Cloud mask" "-" -state real cldtopz ij dyn_em 1 - i01h "cldtopz" "Cloud top height above sea level" "m asl" -state real cldbasez ij dyn_em 1 - i01h "cldbasez" "Cloud base height above ground level" "m agl" - -#----------------------------------------------------------------------------------------------------------------------------------------------------------------- - -## Chem Scalars - both height and mass coordinate models -# -state real - ikjft chem 1 - - - - -#----------------------------------------------------------------------------------------------------------------------------------------------------------------- - -# specified LBC arrays, first, Eulerian height coordinate model - - -# specified LBC arrays, next, Eulerian mass coordinate model - - -# specified LBC variables shared between the mass and height coordinate models - - -# soil model variables (Note that they are marked as staggered in the vertical dimension -# because they are "fully dimensioned" -- they use every element in that dim - - -# 2m and 10m output diagnostics - - -# lsm State Variables - -state real SMOIS ilj - 1 Z rh "SMOIS" "SOIL MOISTURE" "" -state real TSLB ilj - 1 Z r "TSLB" "SOIL TEMPERATURE" "" -state real lake_depth ij misc 1 - rd=(interp_mask_water_field:lu_index,iswater) "lake_depth" "lake depth" "m" - - -# MYJ PBL variables - - -# gfdl (eta) radiation State Variables - -# eta microphpysics State Variables - - -# new eta microphpysics State Variables - -# some mass-coordinate-model-specific variables - - - - - - -# was em_only - -################################################################# -# Physics Variables (em core) - - - -################################################################# -# Physics Variables (eh core) ; should be same as em - - - - -################################################################# -# variables added for CHEMISTRY compatibility with ARW core - kludge -################################################################# -state real GSW ij misc 1 - - "" "" -state real XLAND ij misc 1 - - "" "" -state real RAINCV ij misc 1 - - "" "" -state real RAINSH ij misc 1 - - "" "" -state real RAINSHV ij misc 1 - - "" "" -state real SHALL ij misc 1 - - "" "" - - - -################################################################# -# other misc variables (all cores) -################################################################# - -# added for surface_driver -state real PSFC ij misc 1 - i1rh "PSFC" "SFC PRESSURE" -state real dtbc - misc - - ir "dtbc" "TIME SINCE BOUNDARY READ" "" -state real TH2 ij misc 1 - irh "TH2" "POT TEMP at 2 M" "" -state real T2 ij misc 1 - ir "T2" "TEMP at 2 M" "" -state real U10 ij misc 1 - irh0123d=(DownCopy) "U10" "U at 10 M" " " -state real V10 ij misc 1 - irh0123d=(DownCopy) "V10" "V at 10 M" " " -state real XICE ij misc 1 - i01rd=(DownNear) "XICE" "SEA ICE" "" -state real ICEDEPTH ij misc 1 - i0124rhd=(DownNear) "ICEDEPTH" "SEA ICE THICKNESS" "m" -state real ALBSI ij misc 1 - i0124rhd=(DownNear) "ALBSI" "SEA ICE ALBEDO" " " -state real SNOWSI ij misc 1 - i0124rhd=(DownNear) "SNOWSI" "SNOW DEPTH ON SEA ICE" "m" -state real LAI ij misc 1 - i0124rh "LAI" "Leaf area index" "area/area" -state real SMSTAV ij misc 1 - irh023 "SMSTAV" "MOISTURE VARIBILITY" "" -state real SMSTOT ij misc 1 - irh023 "SMSTOT" "TOTAL SOIL MOISTURE" "" -state real SOLDRAIN ij misc 1 - r "SOLDRAIN" "soil column drainage" "mm" -state real SFCHEADRT ij misc 1 - r "SFCHEADRT" "surface water depth" "mm" -state real INFXSRT ij misc 1 - r "INFXSRT" "time step infiltration excess" "mm" -state real SFCRUNOFF ij misc 1 - rh "SFROFF" "SURFACE RUNOFF" "" -state real UDRUNOFF ij misc 1 - rh023 "UDROFF" "UNDERGROUND RUNOFF" "" -state integer IVGTYP ij misc 1 f irh023d=(DownINear) "IVGTYP" "VEGETATION TYPE" "" -state integer ISLTYP ij misc 1 f irh023d=(DownINear) "ISLTYP" "SOIL TYPE" " " -state real VEGFRA ij misc 1 - i014rh023d=(DownNear) "VEGFRA" "VEGETATION FRACTION" "" -state real SFCEVP ij misc 1 - irh023 "SFCEVP" "SURFACE EVAPORATION" "" -state real GRDFLX ij misc 1 - irh "GRDFLX" "GROUND HEAT FLUX" "" -state real ALBBCK ij misc 1 - i0124r "ALBBCK" "BACKGROUND ALBEDO" "NA" -state real SFCEXC ij misc 1 - irh023 "SFCEXC " "SURFACE EXCHANGE COEFFICIENT" "" -state real SNOTIME ij misc 1 - r "SNOTIME" "SNOTIME" "" -state real ACRUNOFF ij misc 1 - rh "ACRUNOFF" "ACCUMULATED SURFACE RUNOFF" "" -state real ACSNOW ij misc 1 - irh023 "ACSNOW" "ACCUMULATED SNOW" "kg m-2" -state real ACSNOM ij misc 1 - irh023 "ACSNOM" "ACCUMULATED MELTED SNOW" "kg m-2" -state real RMOL ij misc 1 - ir "RMOL" "" "" -state real SNOW ij misc 1 - i01rh "SNOW" "SNOW WATER EQUIVALENT" "kg m-2" -state real CANWAT ij misc 1 - i01rh "CANWAT" "CANOPY WATER" "" -state integer FORCE_SST k misc 1 - - "FORCE_SST" "IF FORCE_SST(1) IS 1, FEED SST FROM PARENT EVERY DT" "" -state real SST ij misc 1 - i014rh0123d=(DownNear)f=(force_sst_nmm:IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4,FORCE_SST) "SST" "SEA SURFACE TEMPERATURE" "K" -state real UOCE ij misc 1 - i014rh023 "UOCE" "SEA SURFACE ZONAL CURRENTS" "m s-1" -state real VOCE ij misc 1 - i014rh023 "VOCE" "SEA SURFACE MERIDIONAL CURRENTS" "m s-1" -state real WEASD ij misc 1 - i01rh023d=(DownNear) "WEASD" "WATER EQUIVALENT OF ACCUMULATED SNOW" "kg m-2" -state real ZNT ij misc 1 - irh023 "ZNT" "TIME-VARYING ROUGHNESS LENGTH" -state real MOL ij misc 1 - ir "MOL" "T* IN SIMILARITY THEORY" "K" -state real NOAHRES ij misc 1 - rh "NOAHRES" "RESIDUAL OF THE NOAH SURFACE ENERGY BUDGET" "W m{-2}" - -state real tke_pbl ijk misc 1 Z r "TKE_PBL" "TKE FROM PBL SCHEME" "m2 s-2" -state real el_pbl ikj misc 1 Z - "EL_PBL" "MIXING LENGTH FROM PBL SCHEME" "m" -state real EXCH_H ikj misc 1 Z r "EXCH_H" "EXCHANGE COEFFICIENTS FOR HEAT" "m2 s-1" -state real EXCH_M ikj misc 1 Z r "EXCH_M" "EXCHANGE COEFFICIENTS FOR MOMENTUM" "m2 s-1" -state real THZ0 ij misc 1 - irh023d=(DownCopy) "THZ0" "POT. TEMPERATURE AT TOP OF VISC. SUBLYR" "K" -state real QZ0 ij misc 1 - irh023d=(DownCopy) "QZ0" "SPECIFIC HUMIDITY AT TOP OF VISC. SUBLYR" "kg kg-1" -state real UZ0 ij misc 1 - irh023d=(DownVel) "UZ0" "U WIND COMPONENT AT TOP OF VISC. SUBLYR" "m s-1" -state real VZ0 ij misc 1 - irh023d=(DownVel) "VZ0" "V WIND COMPONENT AT TOP OF VISC. SUBLYR" "m s-1" -state real FLHC ij misc 1 - r "FLHC" "SURFACE EXCHANGE COEFFICIENT FOR HEAT" "" -state real FLQC ij misc 1 - r "FLQC" "SURFACE EXCHANGE COEFFICIENT FOR MOISTURE" "" -state real QSG ij misc 1 - r "QSG" "SURFACE SATURATION WATER VAPOR MIXING RATIO" "kg kg-1" -state real QVG ij misc 1 - r "QVG" "WATER VAPOR MIXING RATIO AT THE SURFACE" "kg kg-1" -state real QCG ij misc 1 - r "QCG" "CLOUD WATER MIXING RATIO AT THE SURFACE" "kg kg-1" -state real DEW ij misc 1 - r "DEW" "DEW MIXING RATIO AT THE SURFACE" "kg kg-1" -state real SOILT1 ij misc 1 - r "SOILT1" "TEMPERATURE INSIDE SNOW " "K" -state real TSNAV ij misc 1 - r "TSNAV" "AVERAGE SNOW TEMPERATURE " "C" -# added as state for HALO_NMM_MG2, mep -state real psfc_out ij dyn_nmm 1 - - -# added as state for HALO_NMM_TURBL, jm -state real UZ0h ij misc 1 - - -state real VZ0h ij misc 1 - - -state real dudt ijk misc 1 - - -state real dvdt ijk misc 1 - - - -state real QSFC ij misc 1 - irh "QSFC" "SPECIFIC HUMIDITY AT LOWER BOUNDARY" "kg kg-1" -state real AKHS ij misc 1 - ir "AKHS" "SFC EXCH COEFF FOR HEAT /DELTA Z" "m s-1" -state real AKMS ij misc 1 - ir "AKMS" "SFC EXCH COEFF FOR MOMENTUM /DELTA Z" "m s-1" -i1 real CHKLOWQ ij misc 1 - - "CHKLOWQ" "SURFACE SATURATION FLAG" "" -state real HTOP ij misc 1 - irhd=(DownNear) "HTOP" "TOP OF CONVECTION LEVEL" "" -state real HBOT ij misc 1 - irhd=(DownNear) "HBOT" "BOT OF CONVECTION LEVEL" "" -state real HTOPR ij misc 1 - ird=(DownNear) "HTOPR" "TOP OF CONVECTION LEVEL FOR RADIATION" "" -state real HBOTR ij misc 1 - ird=(DownNear) "HBOTR" "BOT OF CONVECTION LEVEL FOR RADIATION" "" -state real HTOPD ij misc 1 - rh023 "HTOPD" "TOP DEEP CONVECTION LEVEL" "" -state real HBOTD ij misc 1 - rh023 "HBOTD" "BOT DEEP CONVECTION LEVEL" "" -state real HTOPS ij misc 1 - rh023 "HTOPS" "TOP SHALLOW CONVECTION LEVEL" "" -state real HBOTS ij misc 1 - rh023 "HBOTS" "BOT SHALLOW CONVECTION LEVEL" "" -state REAL CUPPT ij misc 1 - rh023d=(DownNear) "CUPPT" "ACCUMULATED CONVECTIVE RAIN SINCE LAST CALL TO THE RADIATION" "" -state REAL CPRATE ij misc 1 - rh023 "CPRATE" "INSTANTANEOUS CONVECTIVE PRECIPITATION RATE" "" # 1-17-06a -state real F_ICE_PHY ikj misc 1 - - "F_ICE_PHY" "FRACTION OF ICE" "" -state real F_RAIN_PHY ikj misc 1 - - "F_RAIN_PHY" "FRACTION OF RAIN " "" -state real F_RIMEF_PHY ikj misc 1 - - "F_RIMEF_PHY" "MASS RATIO OF RIMED ICE " "" -state real MASS_FLUX ij misc 1 - r "MASS_FLUX" "DOWNDRAFT MASS FLUX FOR IN GRELL CUMULUS SCHEME" "mb/hour" -state real apr_gr ij misc 1 - r "APR_GR" "PRECIP FROM CLOSURE OLD_GRELL " "mm/hour" -state real apr_w ij misc 1 - r "APR_W" "PRECIP FROM CLOSURE W " "mm/hour" -state real apr_mc ij misc 1 - r "APR_MC" "PRECIP FROM CLOSURE KRISH MV" "mm/hour" -state real apr_st ij misc 1 - r "APR_ST" "PRECIP FROM CLOSURE STABILITY " "mm/hour" -state real apr_as ij misc 1 - r "APR_AS" "PRECIP FROM CLOSURE AS-TYPE " "mm/hour" -state real apr_capma ij misc 1 - r "APR_CAPMA" "PRECIP FROM MAX CAP" "mm/hour" -state real apr_capme ij misc 1 - r "APR_CAPME" "PRECIP FROM MEAN CAP" "mm/hour" -state real apr_capmi ij misc 1 - r "APR_CAPMI" "PRECIP FROM MIN CAP" "mm/hour" -state real xf_ens ije misc 1 Z r "XF_ENS" "MASS FLUX PDF IN GRELL CUMULUS SCHEME" "mb hour-1" -state real pr_ens ije misc 1 Z r "PR_ENS" "PRECIP RATE PDF IN GRELL CUMULUS SCHEME" "mb hour-1" -state real udr_kf ikj misc 1 - rh "UDR_KF" "UPDRAFT DETRAINMENT RATE FROM KF" "kg s-1" -state real ddr_kf ikj misc 1 - rh "DDR_KF" "DOWNDRAFT DETRAINMENT RATE FROM KF" "kg s-1" -state real uer_kf ikj misc 1 - rh "UER_KF" "UPDRAFT ENTRAINMENT RATE FROM KF" "kg s-1" -state real der_kf ikj misc 1 - rh "DER_KF" "DOWNDRAFT ENTRAINMENT RATE FROM KF" "kg s-1" -state real timec_kf ij misc 1 - rh "TIMEC_KF" "CONVECTIVE TIMESCALE FROM MSKF" "s" - -state real RTHFTEN ikj misc 1 - r "RTHFTEN" "TOTAL ADVECTIVE POTENTIAL TEMPERATURE TENDENCY" "K s-1" -state real RQVFTEN ikj misc 1 - r "RQVFTEN" "TOTAL ADVECTIVE MOISTURE TENDENCY" "kg kg-1 s-1" -state real SNOWH ij misc 1 - i01rhd=(DownCopy) "SNOWH" "PHYSICAL SNOW DEPTH" "m" -state real RHOSN ij misc 1 - i01rd=(DownCopy) "RHOSN" " SNOW DENSITY" "kg m-3" -state real SMFR3D ilj misc 1 Z rh "SMFR3D" "SOIL ICE" "" -state real KEEPFR3DFLAG ilj misc 1 Z r "KEEPFR3DFLAG" "FLAG - 1. FROZEN SOIL YES, 0 - NO" "" -state real RHOSNF ij misc 1 - irh "RHOSNF" "DENSITY OF FROZEN PRECIP" "kg/m^3" -state real SNOWFALLAC ij misc 1 - irh "SNOWFALLAC" "RUN-TOTAL ACCUMULATED SNOWFALL [mm]" "" -state real PRECIPFR ij misc 1 - - "PRECIPFR" "TIME-STEP FROZEN PRECIP [mm]" "" - -state real rc_mf ikj misc 1 - r "RC_MF" "RC IN THE GRID COMPUTED BY EDKF" "kg/kg" - -# For Noah-MP -rconfig integer dveg namelist,noah_mp 1 4 h "dveg" "dynamic vegetation (1 -> off ; 2 -> on)" "" -rconfig integer opt_crs namelist,noah_mp 1 1 h "opt_crs" "canopy stomatal resistance (1-> Ball-Berry; 2->Jarvis)" "" -rconfig integer opt_btr namelist,noah_mp 1 1 h "opt_btr" "soil moisture factor for stomatal resistance (1-> Noah; 2-> CLM; 3-> SSiB)" "" -rconfig integer opt_run namelist,noah_mp 1 1 h "opt_run" "runoff and groundwater (1->SIMGM; 2->SIMTOP; 3->Schaake96; 4->BATS; 5->Miguez-Macho & Fan)" "" -rconfig integer opt_sfc namelist,noah_mp 1 1 h "opt_sfc" "surface layer drag coeff (CH & CM) (1->M-O; 2->Chen97)" "" -rconfig integer opt_frz namelist,noah_mp 1 1 h "opt_frz" "supercooled liquid water (1-> NY06; 2->Koren99)" "" -rconfig integer opt_inf namelist,noah_mp 1 1 h "opt_inf" "frozen soil permeability (1-> NY06; 2->Koren99)" "" -rconfig integer opt_rad namelist,noah_mp 1 3 h "opt_rad" "radiation transfer (1->gap=F(3D,cosz); 2->gap=0; 3->gap=1-Fveg)" "" -rconfig integer opt_alb namelist,noah_mp 1 2 h "opt_alb" "snow surface albedo (1->BATS; 2->CLASS)" "" -rconfig integer opt_snf namelist,noah_mp 1 1 h "opt_snf" "rainfall & snowfall (1-Jordan91; 2->BATS; 3->Noah)" "" -rconfig integer opt_tbot namelist,noah_mp 1 2 h "opt_tbot" "lower boundary of soil temperature (1->zero-flux; 2->Noah)" "" -rconfig integer opt_stc namelist,noah_mp 1 1 h "opt_stc" "soil/snow temperature time scheme 1->semi-implicit; 2->full-implicit (original Noah)" "" -rconfig integer opt_gla namelist,noah_mp 1 1 h "opt_gla" "glacier treatment option 1->includes phase change; 2->slab ice (Noah)" "" -rconfig integer opt_rsf namelist,noah_mp 1 1 h "opt_rsf" "surface evaporation resistance option" "" -rconfig integer opt_soil namelist,noah_mp 1 1 h "opt_soil" "flag for using different input soil information" "" -rconfig integer opt_pedo namelist,noah_mp 1 1 h "opt_pedo" "pedo_transfer function option" "" -rconfig integer opt_crop namelist,noah_mp 1 0 h "opt_crop" "crop model option" "" -rconfig integer opt_irr namelist,noah_mp 1 0 h "opt_irr" "Noah-MP irrigation option" "" -rconfig integer opt_irrm namelist,noah_mp 1 0 h "opt_irrm" "Noah-MP irrigation method option" "" - -# For WRF Hydro -rconfig integer wrf_hydro derived 1 0 h "wrf_hydro" "descrip" "unit" - -# For Noah UA changes -state real flx4 ij - 1 - h "FLX4" "sensible heat from canopy" "W m{-2}" -state real fvb ij - 1 - h "FVB" "fraction of vegetation with snow below" "" -state real fbur ij - 1 - h "FBUR" "fraction of vegetation covered by snow" "" -state real fgsn ij - 1 - h "FGSN" "fraction of ground covered by snow" "" - -# For Noah-MP -state integer isnowxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "isnow" "no. of snow layer" "m3 m-3" -state real tvxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "tv" "vegetation leaf temperature" "K" -state real tgxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "tg" "bulk ground temperature" "K" -state real canicexy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "canice" "intercepted ice mass" "mm" -state real canliqxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "canliq" "intercepted liquid water" "mm" -state real eahxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "eah" "canopy air vapor pressure" "pa" -state real tahxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "tah" "canopy air temperature" "K" -state real cmxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "cm" "surf. exchange coeff. for momentum" "m/s" -state real chxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "ch" "surf. exchange coeff. for heat" "m/s" -state real fwetxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "fwet" "wetted or snowed canopy fraction" "-" -state real sneqvoxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "sneqvo" "snow mass at last time step" "mm" -state real alboldxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "albold" "snow albedo at last timestep" "-" -state real qsnowxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "qsnowxy" "snowfall on the ground" "mm/s" -state real qrainxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "qrainxy" "rainfall on the ground" "mm/s" -state real wslakexy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "wslake" "lake water storage" "mm" -state real zwtxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "zwt" "water table depth" "m" -state real waxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "wa" "water in the acquifer" "mm" -state real wtxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "wt" "groundwater storage" "mm" -state real tsnoxy i{snly}j - 1 Z i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "tsno" "snow temperature" "K" -state real zsnsoxy i{snsl}j - 1 Z i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "zsnso" "layer-bottom depth from snow surf" "m" -state real snicexy i{snly}j - 1 Z i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "snice" "snow layer ice" "mm" -state real snliqxy i{snly}j - 1 Z i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "snliq" "snow layer liquid" "mm" -state real lfmassxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "lfmass" "leaf mass" "g/m2" -state real rtmassxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "rtmass" "mass of fine roots" "g/m2" -state real stmassxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "stmass" "stem mass" "g/m2" -state real woodxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "wood" "mass of wood" "g/m2" -state real stblcpxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "stblcp" "stable carbon pool" "g/m2" -state real fastcpxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "fastcp" "short-lived carbon" "g/m2" -state real xsaixy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "xsai" "stem area index" "-" -state real taussxy ij - 1 - rh "tauss" "non-dimensional snow age" "" -state real t2mvxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "t2v" "2 meter temperature over canopy" "K" -state real t2mbxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "t2b" "2 meter temperature over bare ground" "K" -state real q2mvxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "q2v" "2 meter mixing ratio over canopy" "kg kg-1" -state real q2mbxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "q2b" "2 meter mixing ratio over bare ground" "kg kg-1" -state real tradxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "trad" "surface radiative temperature" "K" -state real neexy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "nee" "net ecosystem exchange" "g/m2/s CO2" -state real gppxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "gpp" "gross primary productivity" "g/m2/s C" -state real nppxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "npp" "net primary productivity" "g/m2/s C" -state real fvegxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "fveg" "Noah-MP vegetation fraction" "" -state real qinxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "qin" "groundwater recharge" "mm/s" -state real runsfxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "runsf" "surface runoff" "mm/s" -state real runsbxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "runsb" "subsurface runoff" "mm/s" -state real ecanxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "ecan" "evaporation of intercepted water" "mm/s" -state real edirxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "edir" "ground surface evaporation rate" "mm/s" -state real etranxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "etran" "transpiration rate" "mm/s" -state real fsaxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "fsa" "total absorbed solar radiation" "W/m2" -state real firaxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "fira" "total net longwave rad" "W/m2" -state real aparxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "apar" "photosyn active energy by canopy" "W/m2" -state real psnxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "psn" "total photosynthesis" "umol co2/m2/s" -state real savxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "sav" "solar rad absorbed by veg" "W/m2" -state real sagxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "sag" "solar rad absorbed by ground" "W/m2" -state real rssunxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "rssun" "sunlit stomatal resistance" "s/m" -state real rsshaxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "rssha" "shaded stomatal resistance" "s/m" -state real bgapxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "bgap" "between canopy gap" "fraction" -state real wgapxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "wgap" "within canopy gap" "fraction" -state real tgvxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "tgv" "ground temp. under canopy""K" -state real tgbxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "tgb" "bare ground temperature" "K" -state real chvxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "chv" "vegetated heat exchange coefficient" "m/s" -state real chbxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "chb" "bare-ground heat exchange coefficient" "m/s" -state real shgxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "shg" "sensible heat flux: ground to canopy" "W/m2" -state real shcxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "shc" "sensible heat flux: leaf to canopy" "W/m2" -state real shbxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "shb" "sensible heat flux: bare grnd to atmo" "W/m2" -state real evgxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "evg" "latent heat flux: ground to canopy" "W/m2" -state real evbxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "evb" "latent heat flux: bare grnd to atmo" "W/m2" -state real ghvxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "ghv" "heat flux into soil: under canopy" "W/m2" -state real ghbxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "ghb" "heat flux into soil: bare fraction" "W/m2" -state real irgxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "irg" "net longwave at below canopy surface" "W/m2" -state real ircxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "irc" "net longwave in canopy" "W/m2" -state real irbxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "irb" "net longwave at bare fraction surface" "W/m2" -state real trxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "tr" "transpiration" "W/m2" -state real evcxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "evc" "canopy evaporation" "W/m2" -state real chleafxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "chleaf" "leaf exchange coefficient" "m/s" -state real chucxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "chuc" "under canopy exchange coefficient" "m/s" -state real chv2xy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "chv2" "leaf exchange coefficient" "m/s" -state real chb2xy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "chb2" "under canopy exchange coefficient" "m/s" -state real chstarxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "chstar" "dummy exchange coefficient" "m/s" -state real SMOISEQ ilj - 1 Z r "SMOISEQ" "EQ. SOIL MOISTURE" "m3 m-3" -state real smcwtdxy ij - 1 - rh "smcwtd" "deep soil moisture " "m3 m-3" -state real rechxy ij - 1 - h "rech" "water table recharge" "mm" -state real deeprechxy ij - 1 - r "deeprech" "deep water table recharge" "mm" -state real soilcomp i{soilc}j - 1 Z i02rd=(interp_mask_land_field:lu_index)u=(UpNear) "SOILCOMP" "soil composition" "%" -state real soilcl1 ij - 1 - i02rd=(interp_mask_land_field:lu_index)u=(UpNear) "SOILCL1" "soil texture class - level 1" "cat" -state real soilcl2 ij - 1 - i02rd=(interp_mask_land_field:lu_index)u=(UpNear) "SOILCL2" "soil texture class - level 2" "cat" -state real soilcl3 ij - 1 - i02rd=(interp_mask_land_field:lu_index)u=(UpNear) "SOILCL3" "soil texture class - level 3" "cat" -state real soilcl4 ij - 1 - i02rd=(interp_mask_land_field:lu_index)u=(UpNear) "SOILCL4" "soil texture class - level 4" "cat" - -# Crop model only - -state real grainxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "grain" "mass of grain" "g/m2" -state real gddxy ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "gdd" "growing degree days" "" -state real croptype i{crop}j - 1 Z i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "croptype" "crop type" "fraction" -state real planting ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "planting" "planting date" "julian day" -state real harvest ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "harvest" "harvest date" "julian day" -state real season_gdd ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "season_gdd" "growing season GDD" "C" -state integer cropcat ij - 1 - rh "cropcat" "dominant crop category" "category" -state integer pgsxy ij - 1 - rh "pgs" "pgs" "" - -state real gecros_state i{gecros}j - 1 Z rhd=(interp_mask_land_field:lu_index)u=(UpNear) "gecros" "gecros state array" "-" - -#Noah-MP Irrigation -state real IRFRACT ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "IRFRACT" "Irrigation fraction" "" -state real SIFRACT ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "SIFRACT" "Sprinkler Irrigation fraction" "" -state real MIFRACT ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "MIFRACT" "Micro Irrigation fraction" "" -state real FIFRACT ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "FIFRACT" "Flood Irrigation fraction" "" -state integer IRNUMSI ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "IRNUMSI" "Sprinkler Irrigation Event Count" "" -state integer IRNUMMI ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "IRNUMMI" "Micro Irrigation Event Count" "" -state integer IRNUMFI ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "IRNUMFI" "Flood Irrigation Event Count" "" -state real IRWATSI ij - 1 - r "IRWATSI" "Sprinkler Irrigation Amount for the Event" "m" -state real IRWATMI ij - 1 - r "IRWATMI" "Micro Irrigation Amount for the Event" "m" -state real IRWATFI ij - 1 - r "IRWATFI" "Flood Irrigation Amount for the Event" "m" -state real IRSIVOL ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "IRSIVOL" "Sprinkler Irrigation Water Accumulated" "mm" -state real IRMIVOL ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "IRMIVOL" "Micro Irrigation Water Accumulated" "mm" -state real IRFIVOL ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "IRFIVOL" "Flood Irrigation Water Accumulated" "mm" -state real IRELOSS ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "IRELOSS" "Sprinkler Evaporation Loss Accumulated" "mm" -state real IRRSPLH ij - 1 - i02rhd=(interp_mask_land_field:lu_index)u=(UpNear) "IRRSPLH" "Sprinkler Evaporation Loss Accumulated" "Joules m^-2" - -# added state for etampnew microphysics (needed for restarts) -state real mp_restart_state p misc 1 - r "MP_RESTART_STATE" "STATE VECTOR FOR MICROPHYSICS RESTARTS" -state real tbpvs_state p misc 1 - r "TBPVS_STATE" "STATE FOR ETAMPNEW MICROPHYSICS" -state real tbpvs0_state p misc 1 - r "TBPVS0_STATE" "STATE FOR ETAMPNEW MICROPHYSICS" - -# State variables for landuse_init, Must be declared state because the are read in and needed for restarts. Had been SAVE vars in -# landuse_init (phys/module_physics_init.F) -state integer landuse_isice - misc - - - -state integer landuse_lucats - misc - - - -state integer landuse_luseas - misc - - - -state integer landuse_isn - misc - - - -state real lu_state p misc - - - - - -################################################################# -# - -state integer number_at_same_level - - - - - "number_at_same_level" "" "" -state real power ij misc 1 - irh "Power" "Power production" "W" - -# State for derived time quantities. -#for HWRF: add to restart -state integer itimestep - - - - rh "itimestep" "" "" -state real xtime - - - - h0123 "xtime" "minutes since simulation start" "" -state real julian - - - - - "julian" "day of year, 0.0 at 0Z on 1 Jan." "days" - -# input file descriptor for lbcs on parent domain -state integer lbc_fid - - - - - "lbc_fid" "" "" - -# indicates if tiling has been computed -state logical tiled - - - - - "tiled" "" "" -# indicates if patches have been computed -state logical patched - - - - - "patched" "" "" -# indicates whether to read input from file or generate -#state logical input_from_file - - - - - "input_from_file" "" "" - -# vortex center indices; need for restarts of moving nests -state real xi - misc - - r -state real xj - misc - - r -state real vc_i - misc - - r -state real vc_j - misc - - r - -###### -# -# Variables that are set at run-time to control configuration (namelist-settable) -# -#
- - -# Time Control -rconfig integer run_days namelist,time_control 1 0 irh "run_days" "NUMBER OF DAYS TO RUN" -rconfig integer run_hours namelist,time_control 1 0 irh "run_hours" "NUMBER OF HOURS TO RUN" -rconfig integer run_minutes namelist,time_control 1 0 irh "run_minutes" "NUMBER OF MINUTES TO RUN" -rconfig integer run_seconds namelist,time_control 1 0 irh "run_seconds" "NUMBER OF SECONDS TO RUN" -rconfig integer start_year namelist,time_control max_domains 1993 irh "start_year" "4 DIGIT YEAR OF START OF MODEL" "YEARS" -rconfig integer start_month namelist,time_control max_domains 03 irh "start_month" "2 DIGIT MONTH OF THE YEAR OF START OF MODEL, 1-12" "MONTHS" -rconfig integer start_day namelist,time_control max_domains 13 irh "start_day" "2 DIGIT DAY OF THE MONTH OF START OF MODEL, 1-31" "DAYS" -rconfig integer start_hour namelist,time_control max_domains 12 irh "start_hour" "2 DIGIT HOUR OF THE DAY OF START OF MODEL, 0-23" "HOURS" -rconfig integer start_minute namelist,time_control max_domains 00 irh "start_minute" "2 DIGIT MINUTE OF THE HOUR OF START OF MODEL, 0-59" "MINUTES" -rconfig integer start_second namelist,time_control max_domains 00 irh "start_second" "2 DIGIT SECOND OF THE MINUTE OF START OF MODEL, 0-59" "SECONDS" -rconfig integer end_year namelist,time_control max_domains 1993 irh "end_year" "4 DIGIT YEAR OF END OF MODEL" "YEARS" -rconfig integer end_month namelist,time_control max_domains 03 irh "end_month" "2 DIGIT MONTH OF THE YEAR OF END OF MODEL, 1-12" "MONTHS" -rconfig integer end_day namelist,time_control max_domains 14 irh "end_day" "2 DIGIT DAY OF THE MONTH OF END OF MODEL, 1-31" "DAYS" -rconfig integer end_hour namelist,time_control max_domains 12 irh "end_hour" "2 DIGIT HOUR OF THE DAY OF END OF MODEL, 0-23" "HOURS" -rconfig integer end_minute namelist,time_control max_domains 00 irh "end_minute" "2 DIGIT MINUTE OF THE HOUR OF END OF MODEL, 0-59" "MINUTES" -rconfig integer end_second namelist,time_control max_domains 00 irh "end_second" "2 DIGIT SECOND OF THE MINUTE OF END OF MODEL, 0-59" "SECONDS" -rconfig integer interval_seconds namelist,time_control 1 43200 irh "interval_seconds" "SECONDS BETWEEN ANALYSIS AND BOUNDARY PERIODS" "SECONDS" -rconfig logical input_from_file namelist,time_control max_domains .false. irh "input_from_file" "T/F INPUT FOR THIS DOMAIN FROM A SEPARATE INPUT FILE" "" -rconfig integer fine_input_stream namelist,time_control max_domains 0 irh "fine_input_stream" "0 THROUGH 11, WHAT INPUT STREAM IS FINE GRID IC FROM" "" - -include registry.io_boilerplate - -rconfig integer JULYR namelist,time_control max_domains 0 hr "JULYR" "" "" -rconfig integer JULDAY namelist,time_control max_domains 1 hr "JULDAY" "" "" -rconfig real GMT namelist,time_control max_domains 0. hr "GMT" "" "" - -ifdef HWRF=1 -rconfig character high_freq_outname namelist,time_control 1 "hifreq_d.htcf" - "name of hifreq output file" "" "" -rconfig character partial_atcf_outname namelist,time_control 1 "track_d.patcf" - "name of partial atcf output file" "" "" -endif - -rconfig character input_inname namelist,time_control 1 "wrfinput_d" - "name of input infile" "" "" -rconfig character input_outname namelist,time_control 1 "wrfinput_d" - "name of input outfile" "" "" -rconfig character bdy_inname namelist,time_control 1 "wrfbdy_d" - "name of boundary infile" "" "" -rconfig character bdy_outname namelist,time_control 1 "wrfbdy_d" - "name of boundary outfile" "" "" -rconfig character rst_inname namelist,time_control 1 "wrfrst_d_" - "name of restrt infile" "" "" -rconfig character rst_outname namelist,time_control 1 "wrfrst_d_" - "name of restrt outfile" "" "" -#for HWRF: -rconfig character anl_outname namelist,time_control max_domains "wrfanl_d_" - "name of analysis outfile" "" "" -rconfig logical write_input namelist,time_control 1 .false. - "write input data for 3dvar etc." "" "" -rconfig logical write_restart_at_0h namelist,time_control 1 .false. h "write_restart_at_0h" "" "" -rconfig logical write_hist_at_0h_rst namelist,time_control 1 .false. h "write_hist_at_0h_rst" "T/F write hist at 0 h of restarted forecast" -rconfig logical adjust_output_times namelist,time_control 1 .false. - "adjust_output_times" -rconfig logical adjust_input_times namelist,time_control 1 .false. - "adjust_input_times" -rconfig real tstart namelist,time_control max_domains 0. irh0123 "tstart" "forecast hour at the start of the NMM integration" -rconfig logical nocolons namelist,time_control 1 .false. - "nocolons" -rconfig logical cycling namelist,time_control 1 .false. - "true for cycling (using wrfout file as input data)" -rconfig logical output_ready_flag namelist,time_control 1 .false. - "drop a flag called wrfoutReady_d_ after history write" "" "" - -# DFI namelist -rconfig integer dfi_opt namelist,dfi_control 1 0 rh "dfi_opt" "" "" -rconfig integer dfi_savehydmeteors namelist,dfi_control 1 0 rh "dfi_radar" "DFI radar switch" "" -rconfig integer dfi_nfilter namelist,dfi_control 1 7 rh "dfi_nfilter" "Digital filter type" "" -rconfig logical dfi_write_filtered_input namelist,dfi_control 1 .true. rh "dfi_write_filtered_input" "Write a wrfinput_filtered_d0n file?" "" -rconfig logical dfi_write_dfi_history namelist,dfi_control 1 .false. rh "dfi_write_dfi_history" "Write history files during filtering?" "" -rconfig integer dfi_cutoff_seconds namelist,dfi_control 1 3600 rh "dfi_cutoff_seconds" "Digital filter cutoff time" "" -rconfig integer dfi_time_dim namelist,dfi_control 1 1000 rh "dfi_time_dim" "MAX DIMENSION FOR HCOEFF" -rconfig integer dfi_fwdstop_year namelist,dfi_control 1 2004 rh "dfi_fwdstop_year" "4 DIGIT YEAR OF START OF DFI" "YEARS" -rconfig integer dfi_fwdstop_month namelist,dfi_control 1 03 rh "dfi_fwdstop_month" "2 DIGIT MONTH OF THE YEAR OF START OF DFI" "MONTHS" -rconfig integer dfi_fwdstop_day namelist,dfi_control 1 13 rh "dfi_fwdstop_day" "2 DIGIT DAY OF THE MONTH OF START OF DFI" "DAYS" -rconfig integer dfi_fwdstop_hour namelist,dfi_control 1 12 rh "dfi_fwdstop_hour" "2 DIGIT HOUR OF THE DAY OF START OF DFI" "HOURS" -rconfig integer dfi_fwdstop_minute namelist,dfi_control 1 00 rh "dfi_fwdstop_minute" "2 DIGIT MINUTE OF THE HOUR OF START OF DFI" "MINUTES" -rconfig integer dfi_fwdstop_second namelist,dfi_control 1 00 rh "dfi_fwdstop_second" "2 DIGIT SECOND OF THE MINUTE OF START OF DFI" "SECONDS" -rconfig integer dfi_bckstop_year namelist,dfi_control 1 2004 rh "dfi_bckstop_year" "4 DIGIT YEAR OF END OF DFI" "YEARS" -rconfig integer dfi_bckstop_month namelist,dfi_control 1 03 rh "dfi_bckstop_month" "2 DIGIT MONTH OF THE YEAR OF END OF DFI" "MONTHS" -rconfig integer dfi_bckstop_day namelist,dfi_control 1 14 rh "dfi_bckstop_day" "2 DIGIT DAY OF THE MONTH OF END OF DFI" "DAYS" -rconfig integer dfi_bckstop_hour namelist,dfi_control 1 12 rh "dfi_bckstop_hour" "2 DIGIT HOUR OF THE DAY OF END OF DFI" "HOURS" -rconfig integer dfi_bckstop_minute namelist,dfi_control 1 00 rh "dfi_bckstop_minute" "2 DIGIT MINUTE OF THE HOUR OF END OF DFI" "MINUTES" -rconfig integer dfi_bckstop_second namelist,dfi_control 1 00 rh "dfi_bckstop_second" "2 DIGIT SECOND OF THE MINUTE OF END OF DFI" "SECONDS" - -# Domains -rconfig integer time_step namelist,domains 1 -1 ih0123 "time_step" -rconfig integer time_step_fract_num namelist,domains 1 0 ih0123 "time_step_fract_num" -rconfig integer time_step_fract_den namelist,domains 1 1 ih0123 "time_step_fract_den" -rconfig integer time_step_dfi namelist,domains 1 - ih0123 "time_step_dfi" -rconfig integer max_dom namelist,domains 1 1 irh "max_dom" "" "" -rconfig integer s_we namelist,domains max_domains 1 irh0123 "s_we" "" "" -rconfig integer e_we namelist,domains max_domains 32 irh0123 "e_we" "" "" -rconfig integer s_sn namelist,domains max_domains 1 irh0123 "s_sn" "" "" -rconfig integer e_sn namelist,domains max_domains 32 irh0123 "e_sn" "" "" -rconfig integer s_vert namelist,domains max_domains 1 irh0123 "s_vert" "" "" -rconfig integer e_vert namelist,domains max_domains 31 irh0123 "e_vert" "" "" -rconfig integer num_metgrid_soil_levels namelist,domains 1 4 irh "num_metgrid_soil_levels" "number of input levels or layers in 3D sm, st, sw arrays" "" -rconfig real dx namelist,domains max_domains 200 h0123 "dx" "X HORIZONTAL RESOLUTION" "METERS" -rconfig real dy namelist,domains max_domains 200 h0123 "dy" "Y HORIZONTAL RESOLUTION" "METERS" -rconfig integer grid_id namelist,domains max_domains 1 irh0123 "id" "" "" -rconfig logical grid_allowed namelist,domains max_domains .true. irh "allowed" "" "" -rconfig integer parent_id namelist,domains max_domains 0 h "parent_id" "" "" -rconfig integer i_parent_start namelist,domains max_domains 1 h0123 "i_parent_start" "" "" -rconfig integer j_parent_start namelist,domains max_domains 1 h0123 "j_parent_start" "" "" -rconfig integer parent_grid_ratio namelist,domains max_domains 1 h "parent_grid_ratio" "" "" -rconfig integer parent_time_step_ratio namelist,domains max_domains 1 h "parent_time_step_ratio" "" "" -rconfig integer feedback namelist,domains 1 0 h "feedback" "" "" -rconfig integer smooth_option namelist,domains 1 2 h "smooth_option" "" "" -rconfig real ztop namelist,domains max_domains 15000. h "ztop" "" "" -rconfig integer moad_grid_ratio namelist,domains max_domains 1 h "moad_grid_ratio" "" "" -rconfig integer moad_time_step_ratio namelist,domains max_domains 1 h "moad_time_step_ratio" "" "" -rconfig integer shw namelist,domains max_domains 2 h "stencil_half_width" "HORIZONTAL INTERPOLATION STENCIL HALF-WIDTH" "GRID POINTS" -rconfig integer tile_sz_x namelist,domains 1 0 - "tile_sz_x" "" "" -rconfig integer tile_sz_y namelist,domains 1 0 - "tile_sz_y" "" "" -rconfig integer numtiles namelist,domains 1 1 - "numtiles" "" "" -rconfig integer numtiles_inc namelist,domains 1 0 - "numtiles_inc" "" "" -rconfig integer numtiles_x namelist,domains 1 0 - "numtiles_x" "" "" -rconfig integer numtiles_y namelist,domains 1 0 - "numtiles_y" "" "" -rconfig integer tile_strategy namelist,domains 1 0 - "tile_strategy" "" "" -rconfig integer nproc_x namelist,domains 1 -1 - "nproc_x" "-1 means not set" "" -rconfig integer nproc_y namelist,domains 1 -1 - "nproc_y" "-1 means not set" "" -rconfig integer irand namelist,domains 1 0 - "irand" "" "" -rconfig real dt derived max_domains 2. h0123 "dt" "TEMPORAL RESOLUTION" "SECONDS" -rconfig integer ts_buf_size namelist,domains 1 200 - "ts_buf_size" "Size of time series buffer" -rconfig integer max_ts_locs namelist,domains 1 5 - "max_ts_locs" "Maximum number of time series locations" -rconfig logical tslist_ij derived 1 .false. rh "tslist_ij" "Use i,j locations in tslist" "" -rconfig integer num_moves namelist,domains 1 0 -rconfig integer vortex_interval namelist,domains max_domains 15 - "" "" "minutes" -rconfig integer corral_dist namelist,domains max_domains 8 -#for HWRF -- set to true for one storm, false for > 1 this gets inferred from the way the nests are configured in frame/module_domain.F -rconfig logical multi_storm derived 1 .true. -rconfig logical no_ocean namelist,domains 1 .false. # added 20151204 jm -rconfig integer move_id namelist,domains max_moves 0 -rconfig integer move_interval namelist,domains max_moves 999999999 -rconfig integer move_cd_x namelist,domains max_moves 0 -rconfig integer move_cd_y namelist,domains max_moves 0 -rconfig logical swap_x namelist,domains max_domains .false. rh "swap_x" "" "" -rconfig logical swap_y namelist,domains max_domains .false. rh "swap_y" "" "" -rconfig logical cycle_x namelist,domains max_domains .false. rh "cycle_x" "" "" -rconfig logical cycle_y namelist,domains max_domains .false. rh "cycle_y" "" "" -rconfig logical reorder_mesh namelist,domains 1 .false. rh "reorder_mesh" "" "" -rconfig logical perturb_input namelist,domains 1 .false. h "" "" "" -# WPS related -rconfig real eta_levels namelist,domains max_eta -1. -rconfig real ptsgm namelist,domains 1 42000. -rconfig integer num_metgrid_levels namelist,domains 1 43 irh "num_metgrid_levels" "" "" -rconfig real p_top_requested namelist,domains 1 5000 irh "p_top_requested" "Pa" "" -rconfig logical use_prep_hybrid namelist,domains 1 .false. irh "T=GFS spectral sigma files were used" "" "" - -# Physics -rconfig logical force_read_thompson namelist,physics 1 .false. -rconfig logical write_thompson_tables namelist,physics 1 .true. -rconfig real nssl_cccn namelist,physics max_domains 0.5e9 rh "Base CCN concentration for NSSL microphysics" "" "" -rconfig real nssl_alphah namelist,physics max_domains 0 rh "Graupel PSD shape paramter" "" "" -rconfig real nssl_alphahl namelist,physics max_domains 1 rh "Hail PSD shape paramter" "" "" -rconfig real nssl_cnoh namelist,physics max_domains 4.e5 rh "Graupel intercept paramter" "" "" -rconfig real nssl_cnohl namelist,physics max_domains 4.e4 rh "Hail intercept paramter" "" "" -rconfig real nssl_cnor namelist,physics max_domains 8.e5 rh "Rain intercept paramter" "" "" -rconfig real nssl_cnos namelist,physics max_domains 3.e6 rh "Snow intercept paramter" "" "" -rconfig real nssl_rho_qh namelist,physics max_domains 500. rh "Graupel particle density" "" "" -rconfig real nssl_rho_qhl namelist,physics max_domains 900. rh "Hail particle density" "" "" -rconfig real nssl_rho_qs namelist,physics max_domains 100. rh "Snow particle density" "" "" -rconfig integer elec_physics namelist,physics 1 0 irh "elec_physics" "" "" -# Explicit lightning (for EM core, but here for code compatibility -rconfig integer nssl_ipelec namelist,physics max_domains 0 rh "Electrification selection" "" "" -rconfig integer nssl_isaund namelist,physics 1 12 rh "Charge separation selection" "" "" - -#for HWRF: -rconfig integer mp_physics namelist,physics max_domains 0 rh0123 "mp_physics" "" "" -rconfig real mommix namelist,physics max_domains 0.7 irh "MOMENTUM MIXING FOR SAS CONVECTION SCHEME" -rconfig logical disheat namelist,physics max_domains .true. irh "nmm input 7" -#end HWRF: -rconfig integer do_radar_ref namelist,physics 1 0 rh "compute radar reflectivity for a number of schemes" -rconfig integer compute_radar_ref derived 1 0 - "compute_radar_ref" "0/1 flag: compute radar reflectivity, either do_radar_ref=1 .or. (milbrandt or NSSL schemes)" -rconfig integer ra_lw_physics namelist,physics max_domains 0 rh0123 "ra_lw_physics" "" "" -rconfig integer ra_sw_physics namelist,physics max_domains 0 rh0123 "ra_sw_physics" "" "" -rconfig integer ra_sw_eclipse namelist,physics 1 0 rh "ra_sw_eclipse" "" "" -rconfig real radt namelist,physics max_domains 0 h "RADT" "" "" -rconfig integer sf_sfclay_physics namelist,physics max_domains 0 rh0123 "sf_sfclay_physics" "" "" -rconfig integer sf_surface_physics namelist,physics max_domains 0 rh0123 "sf_surface_physics" "" "" -rconfig integer bl_pbl_physics namelist,physics max_domains 0 rh0123 "bl_pbl_physics" "" "" -rconfig integer ysu_topdown_pblmix namelist,physics max_domains 1 rh "ysu_topdown_pblmix" "" "" -rconfig integer shinhong_tke_diag namelist,physics max_domains 0 rh "shinhong_tke_diag" "" "" -rconfig integer windfarm_opt namelist,physics max_domains 0 rh "windfarm_opt" "" "" -rconfig integer windfarm_ij namelist,physics 1 0 rh "windfarm_ij" "" "" -rconfig real windfarm_tke_factor namelist,physics 1 0.25 rh "windfarm_tke_factor" "" "" -rconfig integer mfshconv namelist,physics max_domains 1 rh "mfshconv" "To activate mass flux scheme with qnse, 1=true; 0=false" "" -rconfig real BLDT namelist,physics max_domains 0 h "BLDT" "" "" -rconfig integer cu_physics namelist,physics max_domains 0 rh0123 "cu_physics" "" "" -rconfig integer shcu_physics namelist,physics max_domains 0 rh0123 "shcu_physics" "" "" -rconfig integer cu_diag namelist,physics max_domains 0 rh0123 "cu_diag" " additional t-averaged stuff for cuphys" "" -rconfig integer kf_edrates namelist,physics max_domains 0 rh "kf_edrates" "output entrainment/detrainment rates and convective timescale for KF schemes" "" - -ifdef HWRF=1 -rconfig real gfs_alpha namelist,physics max_domains 1 irh0123 "boundary depth factor" "" "" -endif - -rconfig real CUDT namelist,physics max_domains 0 h "CUDT" "" "" -rconfig real GSMDT namelist,physics max_domains 0 h "GSMDT" "" "" -rconfig integer ISFFLX namelist,physics 1 1 irh "ISFFLX" "" "" -rconfig integer ideal_xland namelist,physics 1 1 rh "IDEAL_XLAND" "land=1(def), water=2, for ideal cases with no land-use" "" -rconfig integer IFSNOW namelist,physics 1 1 irh "IFSNOW" "" "" -rconfig integer ICLOUD namelist,physics 1 1 irh "ICLOUD" "" "" -rconfig integer cldovrlp namelist,physics 1 2 irh "cldovrlp" "1=random, 2=maximum-random, 3=maximum, 4=exponential, 5=exponential-random" "" -rconfig real swrad_scat namelist,physics 1 1 irh "SWRAD_SCAT" "SCATTERING FACTOR IN SWRAD" "" -rconfig integer surface_input_source namelist,physics 1 1 irh "surface_input_source" "1=static (fractional), 2=time dependent (dominant), 3=hybrid (not yet implemented)" "" -rconfig integer num_soil_layers namelist,physics 1 5 irh "num_soil_layers" "" "" - -rconfig integer num_urban_ndm namelist,physics 1 1 irh "num_urban_ndm" "maximum number of street dimensions (ndm in BEP or BEM header)" "" -rconfig integer num_urban_ng namelist,physics 1 1 irh "num_urban_ng" "number of grid levels in the ground (ng_u in BEP or BEM header)" "" -rconfig integer num_urban_nwr namelist,physics 1 1 irh "num_urban_nwr" "number of grid levels in the walls or roof (nwr_u in BEP or BEM header)" "" -rconfig integer num_urban_ngb namelist,physics 1 1 irh "num_urban_ngb" "number of grid levels in the ground below building (ngb_u in BEM header)" "" -rconfig integer num_urban_nf namelist,physics 1 1 irh "num_urban_nf" "number of grid levels in the floors (nf_u in BEM header)" "" -rconfig integer num_urban_nz namelist,physics 1 1 irh "num_urban_nz" "maximum number of vertical levels in the urban grid (nz_um in BEP or BEM header)" "" -rconfig integer num_urban_nbui namelist,physics 1 1 irh "num_urban_nbui" "maximum number of types of buildings in an urban class (nbui_max in BEM header)" "" -rconfig integer num_urban_ngr derived 1 1 irh "num_urban_ngr" "number of grid levels in the green roof (ngr_u in BEP or BEM header)" "" - -rconfig integer urban_map_zrd derived 1 1 rh "urban_map_zrd" "urban mapping 1: ind_zrd" "" -rconfig integer urban_map_zwd derived 1 1 rh "urban_map_zwd" "urban mapping 2: ind_zwd" "" -rconfig integer urban_map_gd derived 1 1 rh "urban_map_gd" "urban mapping 3: ind_gd" "" -rconfig integer urban_map_zd derived 1 1 rh "urban_map_zd" "urban mapping 4: ind_zd" "" -rconfig integer urban_map_zdf derived 1 1 rh "urban_map_zdf" "urban mapping 5: ind_zdf" "" -rconfig integer urban_map_bd derived 1 1 rh "urban_map_bd" "urban mapping 6: ind_bd" "" -rconfig integer urban_map_wd derived 1 1 rh "urban_map_wd" "urban mapping 7: ind_wd" "" -rconfig integer urban_map_gbd derived 1 1 rh "urban_map_gbd" "urban mapping 8: ind_gbd" "" -rconfig integer urban_map_fbd derived 1 1 rh "urban_map_fbd" "urban mapping 9: ind_fbd" "" -rconfig integer urban_map_zgrd derived 1 1 rh "urban_map_zgrd" "urban mapping 10: ind_zgrd" "" - -rconfig integer sf_surface_mosaic namelist,physics 1 0 rh "sf_surface_mosaic" "1= mosaic, 0=no mosaic method, add by danli" "" -rconfig integer mosaic_cat namelist,physics 1 3 rh "mosaic_cat" "works when sf_surface_mosaic=1; it is the number of mosaic tiles" "" -rconfig integer mosaic_cat_soil derived 1 12 rh "mosaic_cat_soil" "should be the number of soil layers times the mosaic_cat" "" -rconfig integer num_urban_hi namelist,physics 1 15 irh "num_urban_hi" "" "" -rconfig integer mosaic_lu namelist,physics 1 0 irh "mosaic_lu" "" "" -rconfig integer mosaic_soil namelist,physics 1 0 irh "mosaic_soil" "" "" -rconfig integer maxiens namelist,physics 1 1 irh "maxiens" "" "" -rconfig integer maxens namelist,physics 1 3 irh "maxens" "" "" -rconfig integer maxens2 namelist,physics 1 3 irh "maxens2" "" "" -rconfig integer maxens3 namelist,physics 1 16 irh "maxens3" "" "" -rconfig integer ensdim namelist,physics 1 144 irh "ensdim" "" "" -rconfig integer chem_opt namelist,physics max_domains 0 rh "chem_opt" "" "" -rconfig integer num_land_cat namelist,physics 1 24 - "num_land_cat" "" "" -rconfig integer use_wudapt_lcz namelist,physics 1 0 - "use_wudapt_lcz" "" "" -rconfig integer num_soil_cat namelist,physics 1 16 - "num_soil_cat" "" "" -rconfig integer topo_wind namelist,physics max_domains 0 - "topo_wind" "2: Use Mass sfc drag scheme, 1: improve effects topography over surface wind, 0:not" "" -rconfig integer mp_zero_out namelist,physics 1 0 - "mp_zero_out" "microphysics fields set to zero 0=no action taken, 1=all fields but Qv, 2=all fields including Qv" "flag" -rconfig real mp_zero_out_thresh namelist,physics 1 1.e-8 - "mp_zero_out_thresh" "minimum threshold for non-Qv moist fields, below are set to zero" "kg/kg" -rconfig real seaice_threshold namelist,physics 1 100 h "seaice_threshold" "tsk below which which water points are set to sea ice for slab scheme" "K" -rconfig integer fractional_seaice namelist,physics 1 0 - "fractional_seiace" "Fractional sea-ice option" -rconfig integer seaice_albedo_opt namelist,physics 1 0 - "seaice_albedo_opt" "Method for setting albedo over sea ice" -rconfig real seaice_albedo_default namelist,physics 1 0.65 - "seaice_albedo_default" "Default value for sea-ice over albedo with seaice_albeo_opt=0" -rconfig integer seaice_snowdepth_opt namelist,physics 1 0 - "seaice_snowdepth_opt" "Method for treating snow depth on sea ice" -rconfig real seaice_snowdepth_max namelist,physics 1 1.E10 - "seaice_snowdepth_max" "Maximum allowed accumulation (m) of snow on sea ice" -rconfig real seaice_snowdepth_min namelist,physics 1 0.001 - "seaice_snowdepth_min" "Minimum snow depth (m) on sea ice" -rconfig integer seaice_thickness_opt namelist,physics 1 0 - "seaice_thickness_opt" "Method for setting sea-ice thickness" -rconfig real seaice_thickness_default namelist,physics 1 3.0 - "seaice_thickness_default" "Default value for sea-ice thickness" -rconfig logical tice2tsk_if2cold namelist,physics 1 .false. - "tice2tsk_if2cold" "Avoid low ice temps when ice frac and Tsk are inconsistent" -rconfig integer sst_update namelist,physics 1 0 i01rh "sst_update" "update sst from wrflowinp file 0=no, 1=yes" "" -rconfig logical bmj_rad_feedback namelist,physics max_domains .false. - "if true include radiative effects of bmj clouds" "" -rconfig integer sf_urban_physics namelist,physics max_domains 0 h "sf_urban_physics" "activate urban model 0=no, 1=Noah_UCM 2=BEP_UCM" "" -rconfig logical usemonalb namelist,physics 1 .true. h "usemonalb" "use 2d field vs table values false=table, True=2d" "" -rconfig logical rdmaxalb namelist,physics 1 .true. h "rdmaxalb" "false set it to table values" "" -rconfig logical rdlai2d namelist,physics 1 .false. h "rdlai2d" "false set it to table values" "" -rconfig logical ua_phys namelist,physics 1 .false. h "ua_phys" "activate UA Noah changes" "" -rconfig integer opt_thcnd namelist,physics 1 1 h "opt_thcnd" "thermal conductivity option in Noah LSM" "" - -rconfig integer gwd_opt namelist,physics max_domains 2 irh "gwd_opt" "activate gravity wave drag: 0=off, 1=ARW, 2=NMM" "" - -rconfig integer iz0tlnd namelist,physics 1 0 h "iz0tlnd" "switch to control land thermal roughness length" "" -rconfig real sas_pgcon namelist,physics max_domains 0.55 irh0123 "sas_pgcon" "convectively forced pressure gradient factor (SAS scheme)" "" -rconfig real sas_shal_pgcon namelist,physics max_domains -1 irh0123 "sas_shal_pgcon" "convectively forced pressure gradient factor, -1 means use sas_pgcon (SAS shallow conv)" "" -rconfig integer sas_shal_conv namelist,physics max_domains 1 - "sas_shal_conv" "1=enable shallow convection in SAS (must use bl_pbl_physics=83)" -rconfig real sas_mass_flux namelist,physics max_domains 9e9 - "sas_mass_flux" "mass flux limit (SAS scheme)" "" - -ifdef HWRF=1 -rconfig real var_ric namelist,physics 1 1. - "1: use variable Ric 0: constant Ric" -rconfig real coef_ric_l namelist,physics 1 0.16 - "Regression coeff for Ric 0.16:origianl value over land" -rconfig real coef_ric_s namelist,physics 1 0.16 - "Regression coeff for Ric 0.16:origianl value OVER SEA" -endif - -rconfig integer random_seed namelist,physics max_domains 0 irh "random_seed" "random number generator seed" - -rconfig integer icoef_sf namelist,physics max_domains 0 irh012 3 "icoef_sf" "Option for exchange coefficients in the surface flux scheme" "" -rconfig integer iwavecpl namelist,physics max_domains 0 irh012 3 "iwavecpl" "Option for activate coupling to sea surface wave model" "" -rconfig logical lcurr_sf namelist,physics max_domains .false. irh012 3 "lcurr_sf" "Option to include ocean currents in the surface flux calculations" "" - -ifdef HWRF=1 -#added by Zhan Zhang for perturbings for SAS and PBL -rconfig integer ens_random_seed namelist,physics max_domains -1 irh "ens_random_seed" "ensemble random number generator initial seed" -rconfig integer ensda_physics_pert namelist,physics max_domains 0 irh "ensda_physics_pert" "0: no stochastic phys pert., 1: yes" -rconfig logical pert_sas namelist,physics 1 .false. irh "pert_sas" "ensemble choice:F, no pert, T, pert SAS" -rconfig logical pert_pbl namelist,physics 1 .false. irh "pert_pbl" "ensemble choice:F, no pert, T, pert PBL" -rconfig logical pert_Cd namelist,physics 1 .false. irh "pert_Cd" "ensemble choice:F, no pert, T, pert Cd" -rconfig real ens_sasamp namelist,physics max_domains 50. irh "sas perturbation Amplitude" "unit: hPa" -rconfig real ens_pblamp namelist,physics max_domains 0.2 irh "sas perturbation Amplitude" "unit: 100*%" -rconfig real ens_Cdamp namelist,physics max_domains 0.2 irh "Cd perturbation Amplitude" "unit: 100*%" -endif - -# CLM -rconfig integer num_pft_clm namelist,physics 1 17 - "num_pft_clm" "" "" - -# nmm variables -rconfig integer idtad namelist,physics max_domains 2 irh "idtad" "fundamental timesteps between calls to NMM passive advection scheme" -rconfig integer nsoil namelist,physics max_domains 4 irh "nsoil" "number of soil layers" -rconfig integer nphs namelist,physics max_domains 10 irh "nphs" "fundamental timesteps between calls to NMM turbulence" -rconfig integer ncnvc namelist,physics max_domains 10 irh "ncnvc" "fundamental timesteps between calls to NMM convection" -rconfig integer nrand namelist,physics max_domains 10 irh "nrand" "fundamental timesteps between random number generator updates (0=use ncnvc)" -rconfig integer nrads namelist,physics max_domains 200 irh "nrads" "fundamental timesteps between calls to NMM shortwave radiation" -rconfig integer nradl namelist,physics max_domains 200 irh "nradl" "fundamental timesteps between calls to NMM longwave radiation" -rconfig real tprec namelist,physics max_domains 385. irh "tprec" "number of hours in bucket for total precipitation" -rconfig real theat namelist,physics max_domains 385. irh "theat" "number of hours in bucket for gridscale and convective heating rates" -rconfig real tclod namelist,physics max_domains 385. irh "tclod" "number of hours in bucket for cloud amounts" -rconfig real trdsw namelist,physics max_domains 385. irh "trdsw" "number of hours in bucket for short wave fluxes" -rconfig real trdlw namelist,physics max_domains 385. irh "trdlw" "number of hours in bucket for long wave fluxes" -rconfig real tsrfc namelist,physics max_domains 385. irh "tsrfc" "number of hours in bucket for evaporation / sfc fluxes" -rconfig logical pcpflg namelist,physics max_domains .false. irh "pcpflg" "logical switch that turns on/off the precipitation assimilation" -rconfig integer sigma namelist,physics max_domains 1 irh "sigma" "logical switch for NMM vertical coordinate (sigma or hybrid)" -rconfig real sfenth namelist,physics max_domains 0.0 irh "sea spray parameter" -rconfig integer co2tf namelist,physics 1 0 - "co2tf" "GFDL radiation co2 flag" -rconfig integer ra_call_offset namelist,physics 1 -1 - "ra_call_offset" "radiation call offset in timesteps (-1=old, 0=new offset)" "" -rconfig real cam_abs_freq_s namelist,physics 1 21600. - "cam_abs_freq_s" "CAM radiation frequency for clear-sky longwave calculations" "s" -rconfig integer levsiz namelist,physics 1 1 - "levsiz" "Number of ozone data levels for CAM radiation (59)" "" -rconfig integer paerlev namelist,physics 1 1 - "paerlev" "Number of aerosol data levels for CAM radiation (29)" "" -rconfig integer cam_abs_dim1 namelist,physics 1 1 - "cam_abs_dim1" "dimension for absnxt in CAM radiation" "" -rconfig integer cam_abs_dim2 namelist,physics 1 1 - "cam_abs_dim2" "dimension for abstot in CAM radiation" "" -rconfig integer no_src_types namelist,physics 1 1 - "no_src_types" "Number of aerosoal types from EC (6)" "" -rconfig integer alevsiz namelist,physics 1 1 - "alevsiz" "Number of aerosoal optical depth data levels from EC (12)" "" -rconfig integer o3input namelist,physics 1 2 - "o3input" "ozone input option for radiation" "" -rconfig integer aer_opt namelist,physics 1 0 - "aer_opt" "aerosol input option for radiation" "" -rconfig logical cu_rad_feedback namelist,physics max_domains .false. - "feedback of cumulus cloud to radiation" -rconfig integer aercu_opt namelist,physics 1 0 - "aercu_opt" "aerosol input option for multiscale KF" "" -rconfig real aercu_fct namelist,physics 1 1.0 - "aercu_fct" "aerosol multiplication factor" "" - -rconfig integer ICLOUD_CU derived 1 0 - "ICLOUD_CU" "" "" -rconfig real h_diff namelist,physics max_domains 0.1 irh "nmm input 9" - -# MAD-WRF -rconfig integer madwrf_opt namelist,physics 1 0 rh "madwrf_opt" "MAD-WRF model" "0: off, 1: Advect/diffuse hydromets, 2: Nudge advected/diffused hydrometes to model state" -rconfig real madwrf_dt_relax namelist,physics 1 60. rh "madwrf_dt_relax" "Relaxation time for hydrometeor nudging" "s" -rconfig real madwrf_dt_nudge namelist,physics 1 60. rh "madwrf_dt_nudge" "Temporal period for hydrometeor nudging" "Min" -rconfig integer madwrf_cldinit namelist,physics 1 0 rh "madwrf_cldinit" "Enhance cloud initialization" "0: Off, 1: On" - -# cam radiation variables -state real - i{ls}jf ozmixm 1 - - - -state real mth01 i{ls}jf ozmixm 1 - - "OZMIXMTH01" "Month 1 CAM ozone mixing ratio" -state real mth02 i{ls}jf ozmixm 1 - - "OZMIXMTH02" "Month 2 CAM ozone mixing ratio" -state real mth03 i{ls}jf ozmixm 1 - - "OZMIXMTH03" "Month 3 CAM ozone mixing ratio" -state real mth04 i{ls}jf ozmixm 1 - - "OZMIXMTH04" "Month 4 CAM ozone mixing ratio" -state real mth05 i{ls}jf ozmixm 1 - - "OZMIXMTH05" "Month 5 CAM ozone mixing ratio" -state real mth06 i{ls}jf ozmixm 1 - - "OZMIXMTH06" "Month 6 CAM ozone mixing ratio" -state real mth07 i{ls}jf ozmixm 1 - - "OZMIXMTH07" "Month 7 CAM ozone mixing ratio" -state real mth08 i{ls}jf ozmixm 1 - - "OZMIXMTH08" "Month 8 CAM ozone mixing ratio" -state real mth09 i{ls}jf ozmixm 1 - - "OZMIXMTH09" "Month 9 CAM ozone mixing ratio" -state real mth10 i{ls}jf ozmixm 1 - - "OZMIXMTH10" "Month 10 CAM ozone mixing ratio" -state real mth11 i{ls}jf ozmixm 1 - - "OZMIXMTH11" "Month 11 CAM ozone mixing ratio" -state real mth12 i{ls}jf ozmixm 1 - - "OZMIXMTH12" "Month 12 CAM ozone mixing ratio" -state real pin {ls} misc 1 - - "PIN" "PRESSURE LEVEL OF OZONE MIXING RATIO" "millibar" - -# new rad variables -state real o3rad ikj misc 1 - rh "o3rad" "RADIATION 3D OZONE" "ppmv" - -ifdef HWRF=1 -rconfig integer ntrack namelist,physics max_domains 10 irh "ntrack" "nest movement timestep (multiples of nphs)" -endif -rconfig integer ntrack namelist,physics max_domains 0 irh "ntrack" "nest movement timestep (multiples of nphs)" - -rconfig integer num_snso_layers namelist,physics 1 7 irh "num_snso_layers" "" "" -rconfig integer num_snow_layers namelist,physics 1 3 irh "num_snow_layers" "" "" -rconfig logical use_aero_icbc namelist,physics 1 .false. rh "use_aero_icbc" "Use GOCART climo 3D aerosols IC/BC data in Thompson-MP-Aero" "logical flag" -rconfig integer use_mp_re namelist,physics 1 1 h "use_mp_re" "use effective radii computed in some mp schemes in RRTMG" "flag" - -# The following two options are hooked into various microphysics schemes to allow for ensemble perturbations of CCN and hail/graupel PSDs - GAC (AFWA) -rconfig real ccn_conc namelist,physics 1 1.0E8 h "ccn_conc" "CCN concentration" "# m-3" -rconfig integer hail_opt namelist,physics 1 0 rh "hail_opt" "Hail/Graupel switch, 1:hail, 0:graupel" "" -rconfig integer morr_rimed_ice namelist,physics 1 1 rh "morr_rimed_ice " "Hail/Graupel switch for Morrison Scheme, 1:hail, 0:graupel" "" -rconfig integer clean_atm_diag namelist,physics 1 0 rh "clean_atm_diag" "option to switch on clean sky diagnostics (for chem)" "flag" -rconfig integer calc_clean_atm_diag derived 1 0 - "calc_clean_atm_diag" "carries decision on using clean sky diagnostics" "flag" -rconfig integer sf_lake_physics namelist,physics max_domains 0 h "sf_lake_physics" "activate lake model 0=no, 1=yes" "" - - -# Dynamics -# dynamics option (see package definitions, below) -rconfig integer dyn_opt namelist,dynamics 1 - -rconfig integer rk_ord namelist,dynamics 1 3 irh "rk_order" "" "" -rconfig integer w_damping namelist,dynamics 1 0 irh "w_damping" "" "" -# diff_opt 1=old diffusion, 2=new -rconfig integer diff_opt namelist,dynamics max_domains -1 irh "diff_opt" "" "" -# km_opt 1=old coefs, 2=tke, 3=Smagorinksy -rconfig integer km_opt namelist,dynamics max_domains -1 irh "km_opt" "" "" -rconfig integer damp_opt namelist,dynamics 1 1 irh "damp_opt" "" "" -rconfig real zdamp namelist,dynamics max_domains 5000. h "zdamp" "" "" -rconfig real base_pres namelist,dynamics 1 100000. h "base_pres" "Base state pressure - do not change (10^5 Pa), real only" "Pa" -rconfig real base_temp namelist,dynamics 1 290. h "base_temp" "Base state sea level temperature, real only" "K" -rconfig real base_lapse namelist,dynamics 1 50. h "base_lapse" "Base state temperature difference between base pres and 1/e of atm depth - do not change, real only" "K" -rconfig real iso_temp namelist,dynamics 1 0. h "iso_temp" "Isothermal temperature in stratosphere, real only" "K" -rconfig real dampcoef namelist,dynamics max_domains 0.2 h "dampcoef" "" "" -rconfig real khdif namelist,dynamics max_domains 0 h "khdif" "" "" -rconfig real kvdif namelist,dynamics max_domains 0 h "kvdif" "" "" -rconfig real c_s namelist,dynamics max_domains 0.25 h "c_s" "Smagorinsky coeff" "" -rconfig real c_k namelist,dynamics max_domains 0.15 h "c_k" "TKE coeff" "" -rconfig real smdiv namelist,dynamics max_domains 0. h "smdiv" "" "" -rconfig real emdiv namelist,dynamics max_domains 0. h "emdiv" "" "" -rconfig real epssm namelist,dynamics max_domains .1 h "epssm" "" "" -rconfig integer nhmove namelist,dynamics max_domains -1 rh "NHMOVE" "Action when nest move: 0=discard non-hydro state -1=keep nh state everywhere 1=keep except near nest edge" "" -rconfig logical non_hydrostatic namelist,dynamics max_domains .true. irh "non_hydrostatic" "" "" -rconfig integer time_step_sound namelist,dynamics max_domains 10 h "time_step_sound" "" "" -rconfig integer h_mom_adv_order namelist,dynamics max_domains 3 rh "h_mom_adv_order" "" "" -rconfig integer v_mom_adv_order namelist,dynamics max_domains 3 rh "v_mom_adv_order" "" "" -rconfig integer h_sca_adv_order namelist,dynamics max_domains 3 rh "h_sca_adv_order" "" "" -rconfig integer v_sca_adv_order namelist,dynamics max_domains 3 rh "v_sca_adv_order" "" "" -rconfig logical top_radiation namelist,dynamics max_domains .false. rh "top_radiation" "" "" -rconfig real tke_upper_bound namelist,dynamics max_domains 1000. h "tke_upper_bound" "" "" -rconfig real tke_drag_coefficient namelist,dynamics max_domains 0. h "tke_drag_coefficient" "" "" -rconfig real tke_heat_flux namelist,dynamics max_domains 0. h "tke_heat_flux" "" "" -rconfig logical pert_coriolis namelist,dynamics max_domains .false. irh "pert_coriolis" "" "" - -ifdef HWRF=1 - # HWRF configuration disables Eulerian passive advection - rconfig logical euler_adv namelist,dynamics 1 .false. irh "euler_adv" "logical flag to turn on/off Eulerian passive advection" "" - rconfig integer idtadt namelist,dynamics 1 1 irh "idtadt" "fundamental timesteps between calls to Eulerian advection for dynamics" "" - rconfig integer idtadc namelist,dynamics 1 1 irh "idtadc" "fundamental timesteps between calls to Eulerian advection for chemistry" "" -endif - -# Non-HWRF configuration uses Eulerian passive advection -rconfig logical euler_adv namelist,dynamics 1 .true. irh "euler_adv" "logical flag to turn on/off Eulerian passive advection" "" -rconfig integer idtadt namelist,dynamics 1 2 irh "idtadt" "fundamental timesteps between calls to Eulerian advection for dynamics" "" -rconfig integer idtadc namelist,dynamics 1 2 irh "idtadc" "fundamental timesteps between calls to Eulerian advection for chemistry" "" - -rconfig real codamp namelist,dynamics max_domains 6.4 irh "codamp" "divergence damping weighting factor (larger = more damping) " "" -rconfig real coac namelist,dynamics max_domains 1.6 irh "coac" "horizontal diffusion weighting factor (larger = more diffusion) " "" -rconfig real slophc namelist,dynamics max_domains 6.363961e-3 irh "slophc" "Maximum model level slope (dZ/dy) for which hor diffusion is applied" "" -rconfig real wp namelist,dynamics max_domains 0. irh "wp" "Off-centering weight in the updating of nonhyrostatic eps" -rconfig real dwdt_damping_lev namelist,dynamics max_domains 0. irh "dwdt_damping_lev" "specify the non-hydro dw/dt damping level in stratosphere (in Pa), 0: no damping " - - -rconfig integer terrain_smoothing namelist,dynamics 1 1 irh "parallel_smooth" "nest_terrain smoothing method 0=none, 1=old, 2=new" - -# Bdy_control -rconfig integer spec_bdy_width namelist,bdy_control 1 5 irh "spec_bdy_width" "" "" -rconfig integer spec_zone namelist,bdy_control 1 1 irh "spec_zone" "" "" -rconfig integer relax_zone namelist,bdy_control 1 4 irh "relax_zone" "" "" -rconfig logical specified namelist,bdy_control max_domains .false. rh "specified" "" "" -rconfig logical periodic_x namelist,bdy_control max_domains .false. rh "periodic_x" "" "" -rconfig logical symmetric_xs namelist,bdy_control max_domains .false. rh "symmetric_xs" "" "" -rconfig logical symmetric_xe namelist,bdy_control max_domains .false. rh "symmetric_xe" "" "" -rconfig logical open_xs namelist,bdy_control max_domains .false. rh "open_xs" "" "" -rconfig logical open_xe namelist,bdy_control max_domains .false. rh "open_xe" "" "" -rconfig logical periodic_y namelist,bdy_control max_domains .false. rh "periodic_y" "" "" -rconfig logical symmetric_ys namelist,bdy_control max_domains .false. rh "symmetric_ys" "" "" -rconfig logical symmetric_ye namelist,bdy_control max_domains .false. rh "symmetric_ye" "" "" -rconfig logical open_ys namelist,bdy_control max_domains .false. rh "open_ys" "" "" -rconfig logical open_ye namelist,bdy_control max_domains .false. rh "open_ye" "" "" -rconfig logical polar namelist,bdy_control max_domains .false. rh "polar" "" "" -rconfig logical nested namelist,bdy_control max_domains .false. rh "nested" "" "" -rconfig integer real_data_init_type namelist,bdy_control 1 1 irh "real_data_init_type" "REAL DATA INITIALIZATION OPTIONS: 1=SI, 2=MM5, 3=GENERIC" "PRE-PROCESSOR TYPES" -rconfig logical multi_bdy_files namelist,bdy_control 1 .false. rh "multi_bdy_files" "" "" - -rconfig integer background_proc_id namelist,grib2 1 255 rh "background_proc_id" "Background processing id for grib2" "" -rconfig integer forecast_proc_id namelist,grib2 1 255 rh "forecast_proc_id" "Analysis and forecast processing id for grib2" "" -rconfig integer production_status namelist,grib2 1 255 rh "production_status" "Background processing id for grib2" "" -rconfig integer compression namelist,grib2 1 40 rh "compression" "grib2 compression, 40 for JPEG2000 or 41 for PNG" "" - -# NAMELIST DERIVED -rconfig real cen_lat derived max_domains 0 - "cen_lat" "center latitude" "degrees, negative is south" -rconfig real cen_lon derived max_domains 0 - "cen_lon" "central longitude" "degrees, negative is west" -rconfig real truelat1 derived max_domains 0 - "true_lat1" "first standard parallel" "degrees, negative is south" -rconfig real truelat2 derived max_domains 0 - "true_lat2" "second standard parallel" "degrees, negative is south" -rconfig real moad_cen_lat derived max_domains 0 - "moad_cen_lat" "center latitude of the most coarse grid" "degrees, negative is south" -rconfig real stand_lon derived max_domains 0 - "stand_lon" "standard longitude, parallel to j-direction, perpendicular to i-direction " "degrees, negative is west" -rconfig integer FLAG_METGRID derived 1 0 - "FLAG_METGRID" "Flag in global attributes for metgrid data" -rconfig integer FLAG_SNOW derived 1 0 - "FLAG_SNOW" "Flag for snow in the global attributes for metgrid data" -rconfig integer FLAG_PSFC derived 1 0 - "FLAG_PSFC" "Flag for surface pressure in the global attributes for metgrid data" -rconfig integer FLAG_SM000010 derived 1 0 - "FLAG_SM000010" "Flag for soil moisture in the global attributes for metgrid data" -rconfig integer FLAG_SM010040 derived 1 0 - "FLAG_SM010040" "Flag for soil moisture in the global attributes for metgrid data" -rconfig integer FLAG_SM040100 derived 1 0 - "FLAG_SM040100" "Flag for soil moisture in the global attributes for metgrid data" -rconfig integer FLAG_SM100200 derived 1 0 - "FLAG_SM100200" "Flag for soil moisture in the global attributes for metgrid data" -rconfig integer FLAG_ST000010 derived 1 0 - "FLAG_ST000010" "Flag for soil temperature in the global attributes for metgrid data" -rconfig integer FLAG_ST010040 derived 1 0 - "FLAG_ST000010" "Flag for soil temperature in the global attributes for metgrid data" -rconfig integer FLAG_ST040100 derived 1 0 - "FLAG_ST010040" "Flag for soil temperature in the global attributes for metgrid data" -rconfig integer FLAG_ST100200 derived 1 0 - "FLAG_ST100200" "Flag for soil temperature in the global attributes for metgrid data" -rconfig integer FLAG_SLP derived 1 0 - "FLAG_SLP" "Flag for sea level pressure in the global attributes for metgrid data" -rconfig integer FLAG_SOILHGT derived 1 0 - "FLAG_SOILHGT" "Flag for soil height in the global attributes for metgrid data" -rconfig integer FLAG_MF_XY derived 1 0 - "FLAG_MF_XY" "Flag for MF_XYin the global attributes for metgrid data" -rconfig real bdyfrq derived max_domains 0 - "bdyfrq" "lateral boundary input frequency" "seconds" -rconfig character mminlu derived max_domains " " - "mminlu" "land use dataset" - "" -rconfig integer iswater derived max_domains 0 - "iswater" "land use index of water" "index category" -rconfig integer islake derived max_domains 0 - "islake" "land use index of inland lake" "index category" -rconfig integer isice derived max_domains 0 - "isice" "land use index of ice" "index category" -rconfig integer isurban derived max_domains 0 - "isurban" "land use index for 'urban and built-up" "index category" -rconfig integer isoilwater derived max_domains 0 - "isoilwater" "land use index of water for soil" "index category" -rconfig integer map_proj derived max_domains 0 - "map_proj" "domain map projection" "0=none, 1=Lambert, 2=polar, 3=Mercator" -rconfig integer dfi_stage derived 1 3 - "dfi_stage" "current stage of DFI processing" "0=DFI setup, 1=DFI backward integration, 2=DFI forward integration, 3=WRF forecast" -rconfig integer mp_physics_dfi derived max_domains -1 - "mp_physics_dfi" "" "-1 = no DFI and so no need to allocate DFI moistnd scalar variables, >0 = running with DFI, so allocate DFI moist and scalar variables appropriate for selected microphysics package" -rconfig integer use_wps_input derived 1 0 - "use_wps_input" "0/1 flag, using wps input" "0=no, 1=real" - -#rconfig integer simulation_start_year derived 1 0 h "simulation_start_year" "start of simulation through restarts" "4-digit year" -#rconfig integer simulation_start_month derived 1 0 h "simulation_start_month" "start of simulation through restarts" "2-digit month" -#rconfig integer simulation_start_day derived 1 0 h "simulation_start_day" "start of simulation through restarts" "2-digit day" -#rconfig integer simulation_start_hour derived 1 0 h "simulation_start_hour" "start of simulation through restarts" "2-digit hour" -#rconfig integer simulation_start_minute derived 1 0 h "simulation_start_minute" "start of simulation through restarts" "2-digit minute" -#rconfig integer simulation_start_second derived 1 0 h "simulation_start_second" "start of simulation through restarts" "2-digit second" - -# -# Single dummy declaration to define a nodyn dyn option -state integer nodyn_dummy - dyn_nodyn - - - "" "" "" - -rconfig integer maxpatch namelist,physics 1 10 irh "maxpatch" "" "" - -#key package associated package associated 4d scalars -# name namelist choice state vars - -package passivec1 chem_opt==0 - -package passiveqv mp_physics==0 - moist:qv -package kesslerscheme mp_physics==1 - moist:qv,qc,qr -package linscheme mp_physics==2 - moist:qv,qc,qr,qi,qs,qg -package wsm3scheme mp_physics==3 - moist:qv,qc,qr;state:re_cloud,re_ice,re_snow -package wsm5scheme mp_physics==4 - moist:qv,qc,qr,qi,qs;state:re_cloud,re_ice,re_snow -package fer_mp_hires mp_physics==5 - moist:qv,qc,qr,qi,qs;state:f_ice,f_rain,f_rimef -package fer_mp_hires_advect mp_physics==15 - moist:qv,qc,qr,qi;scalar:qrimef -package wsm6scheme mp_physics==6 - moist:qv,qc,qr,qi,qs,qg;state:re_cloud,re_ice,re_snow -package nuwrf4icescheme mp_physics==7 - moist:qv,qc,qr,qi,qs,qg -package thompson mp_physics==8 - moist:qv,qc,qr,qi,qs,qg;scalar:qni,qnr;state:re_cloud,re_ice,re_snow -package thompsonaero mp_physics==28 - moist:qv,qc,qr,qi,qs,qg;scalar:qni,qnr,qnc,qnwfa,qnifa;state:re_cloud,re_ice,re_snow -package milbrandt2mom mp_physics==9 - moist:qv,qc,qr,qi,qs,qg,qh;scalar:qnc,qnr,qni,qns,qng,qnh -package morr_two_moment mp_physics==10 - moist:qv,qc,qr,qi,qs,qg;scalar:qni,qns,qnr,qng -package sbu_ylinscheme mp_physics==13 - moist:qv,qc,qr,qi,qs -package wdm5scheme mp_physics==14 - moist:qv,qc,qr,qi,qs;scalar:qnn,qnc,qnr;state:re_cloud,re_ice,re_snow -package wdm6scheme mp_physics==16 - moist:qv,qc,qr,qi,qs,qg;scalar:qnn,qnc,qnr;state:re_cloud,re_ice,re_snow -package nssl_2mom mp_physics==17 - moist:qv,qc,qr,qi,qs,qg,qh;scalar:qndrop,qnr,qni,qns,qng,qnh,qvolg,qvolh;state:re_cloud,re_ice,re_snow -package nssl_2momccn mp_physics==18 - moist:qv,qc,qr,qi,qs,qg,qh;scalar:qnn,qndrop,qnr,qni,qns,qng,qnh,qvolg,qvolh;state:re_cloud,re_ice,re_snow -package nssl_1mom mp_physics==19 - moist:qv,qc,qr,qi,qs,qg,qh;scalar:qvolg -package nssl_1momlfo mp_physics==21 - moist:qv,qc,qr,qi,qs,qg -package nssl_2momg mp_physics==22 - moist:qv,qc,qr,qi,qs,qg;scalar:qndrop,qnr,qni,qns,qng,qvolg;state:re_cloud,re_ice,re_snow -package wsm7scheme mp_physics==24 - moist:qv,qc,qr,qi,qs,qg,qh;state:re_cloud,re_ice,re_snow -package wdm7scheme mp_physics==26 - moist:qv,qc,qr,qi,qs,qg,qh;scalar:qnn,qnc,qnr;state:re_cloud,re_ice,re_snow -package p3_1category mp_physics==50 - moist:qv -package p3_1category_nc mp_physics==51 - moist:qv -package p3_2category mp_physics==52 - moist:qv -package p3_1cat_3mom mp_physics==53 - moist:qv -package ntu mp_physics==56 - moist:qv -package jensen_ishmael mp_physics==86 - moist:qv -package etamp_hwrf mp_physics==85 - moist:qv,qc,qr,qi,qs;state:f_ice,f_rain,f_rimef -package etampnew mp_physics==95 - moist:qv,qc,qr,qs;state:f_ice,f_rain,f_rimef -package gsfcgcescheme mp_physics==97 - moist:qv,qc,qr,qi,qs,qg -package radar_refl compute_radar_ref==1 - state:refl_10cm,refd_max -package madwrf_mp mp_physics==96 - moist:qv,qc,qi,qs - - -# MAD-WRF -package cldinit madwrf_cldinit==1 - state:brtemp,cldmask,cldtopz,cldbasez -package madwrf madwrf_opt==2 - tracer:tr_qc,tr_qi,tr_qs - -package nodfimoist mp_physics_dfi==-1 - - -package passiveqv_dfi mp_physics_dfi==0 - dfi_moist:dfi_qv -package kesslerscheme_dfi mp_physics_dfi==1 - dfi_moist:dfi_qv,dfi_qc,dfi_qr -package linscheme_dfi mp_physics_dfi==2 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg -package wsm3scheme_dfi mp_physics_dfi==3 - dfi_moist:dfi_qv,dfi_qc,dfi_qr;state:dfi_re_cloud,dfi_re_ice,dfi_re_snow -package wsm5scheme_dfi mp_physics_dfi==4 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs;state:dfi_re_cloud,dfi_re_ice,dfi_re_snow -package fer_mp_hires_dfi mp_physics_dfi==5 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs -package wsm6scheme_dfi mp_physics_dfi==6 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg;state:dfi_re_cloud,dfi_re_ice,dfi_re_snow -package nuwrf4icescheme_dfi mp_physics_dfi==7 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg -package thompson_dfi mp_physics_dfi==8 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg;dfi_scalar:dfi_qni,dfi_qnr;state:dfi_re_cloud,dfi_re_ice,dfi_re_snow -package milbrandt2mom_dfi mp_physics_dfi==9 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg,dfi_qh;dfi_scalar:dfi_qnc,dfi_qnr,dfi_qni,dfi_qns,dfi_qng,dfi_qnh -package morr_two_moment_dfi mp_physics_dfi==10 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg;dfi_scalar:dfi_qni,dfi_qns,dfi_qnr,dfi_qng -package sbu_ylinscheme_dfi mp_physics==13 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs -package wdm5scheme_dfi mp_physics_dfi==14 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs;dfi_scalar:dfi_qnn,dfi_qnc,dfi_qnr;state:dfi_re_cloud,dfi_re_ice,dfi_re_snow -package wdm6scheme_dfi mp_physics_dfi==16 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg;dfi_scalar:dfi_qnn,dfi_qnc,dfi_qnr;state:dfi_re_cloud,dfi_re_ice,dfi_re_snow -package wsm7scheme_dfi mp_physics_dfi==24 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg,dfi_qh;state:dfi_re_cloud,dfi_re_ice,dfi_re_snow -package wdm7scheme_dfi mp_physics_dfi==26 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg,dfi_qh;dfi_scalar:dfi_qnn,dfi_qnc,dfi_qnr;state:dfi_re_cloud,dfi_re_ice,dfi_re_snow -package thompsonaero_dfi mp_physics_dfi==28 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg;dfi_scalar:dfi_qni,dfi_qnr,dfi_qnc,dfi_qnwfa,dfi_qnifa;state:dfi_re_cloud,dfi_re_ice,dfi_re_snow -package etampnew_dfi mp_physics_dfi==95 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qs -package gsfcgcescheme_dfi mp_physics_dfi==97 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg - -# package noprogn progn==0 - - -# package progndrop progn==1 - scalar:qndrop;dfi_scalar:dfi_qndrop - -package rrtmscheme ra_lw_physics==1 - - -package camlwscheme ra_lw_physics==3 - ozmixm:mth01,mth02,mth03,mth04,mth05,mth06,mth07,mth08,mth09,mth10,mth11,mth12;state:acswupt,acswuptc,acswdnt,acswdntc,acswupb,acswupbc,acswdnb,acswdnbc,aclwupt,aclwuptc,aclwdnt,aclwdntc,aclwupb,aclwupbc,aclwdnb,aclwdnbc,swupt,swuptc,swdnt,swdntc,swupb,swupbc,swdnb,swdnbc,lwupt,lwuptc,lwdnt,lwdntc,lwupb,lwupbc,lwdnb,lwdnbc,o3rad -package rrtmg_lwscheme ra_lw_physics==4 - ozmixm:mth01,mth02,mth03,mth04,mth05,mth06,mth07,mth08,mth09,mth10,mth11,mth12;state:aclwupt,aclwuptc,aclwdnt,aclwdntc,aclwupb,aclwupbc,aclwdnb,aclwdnbc,lwupt,lwuptc,lwdnt,lwdntc,lwupb,lwupbc,lwdnb,lwdnbc,o3rad -package rrtmg_lwscheme_fast ra_lw_physics==24 - - -package rrtmk_lwscheme ra_lw_physics==14 - - -package goddardlwscheme ra_lw_physics==5 - - -package flglwscheme ra_lw_physics==7 - - -package gfdllwscheme ra_lw_physics==99 - - -package hwrflwscheme ra_lw_physics==98 - state:o3rad - -# WRF-Chem specific diagnostics -package clnatmdiag calc_clean_atm_diag==1 - state:SWUPTCLN,SWDNTCLN,SWUPBCLN,SWDNBCLN,LWUPTCLN,LWDNTCLN,LWUPBCLN,LWDNBCLN -package swradscheme ra_sw_physics==1 - - -package gsfcswscheme ra_sw_physics==2 - - -package camswscheme ra_sw_physics==3 - ozmixm:mth01,mth02,mth03,mth04,mth05,mth06,mth07,mth08,mth09,mth10,mth11,mth12;state:acswupt,acswuptc,acswdnt,acswdntc,acswupb,acswupbc,acswdnb,acswdnbc,aclwupt,aclwuptc,aclwdnt,aclwdntc,aclwupb,aclwupbc,aclwdnb,aclwdnbc,swupt,swuptc,swdnt,swdntc,swupb,swupbc,swdnb,swdnbc,lwupt,lwuptc,lwdnt,lwdntc,lwupb,lwupbc,lwdnb,lwdnbc,o3rad -package rrtmg_swscheme ra_sw_physics==4 - ozmixm:mth01,mth02,mth03,mth04,mth05,mth06,mth07,mth08,mth09,mth10,mth11,mth12;state:acswupt,acswuptc,acswdnt,acswdntc,acswupb,acswupbc,acswdnb,acswdnbc,swupt,swuptc,swdnt,swdntc,swupb,swupbc,swdnb,swdnbc,o3rad -package rrtmg_swscheme_fast ra_sw_physics==24 - - -package rrtmk_swscheme ra_sw_physics==14 - - -package goddardswscheme ra_sw_physics==5 - - -package flgswscheme ra_sw_physics==7 - - -package gfdlswscheme ra_sw_physics==99 - - -package hwrfswscheme ra_sw_physics==98 - state:o3rad -package heldsuarez ra_lw_physics==31 - - -package eclipsescheme ra_sw_eclipse==1 - - - -package nosfcscheme sf_sfclay_physics==0 - - -package sfclayscheme sf_sfclay_physics==91 - - -package myjsfcscheme sf_sfclay_physics==2 - - -package gfssfcscheme sf_sfclay_physics==3 - - -package gfdlsfcscheme sf_sfclay_physics==88 - - -package qnsesfcscheme sf_sfclay_physics==4 - - -package pxsfcscheme sf_sfclay_physics==7 - - -package temfsfcscheme sf_sfclay_physics==10 - - -package sfclayrevscheme sf_sfclay_physics==1 - - -package idealscmsfcscheme sf_sfclay_physics==89 - - -package gbmpblscheme sf_sfclay_physics==12 - - - -package nolsmscheme sf_surface_physics==0 - - -package slabscheme sf_surface_physics==1 - - -package lsmscheme sf_surface_physics==2 - state:flx4,fvb,fbur,fgsn -package ruclsmscheme sf_surface_physics==3 - state:ACRUNOFF - -package noahmpscheme sf_surface_physics==4 - state:isnowxy,tvxy,tgxy,canliqxy,canicexy,eahxy,tahxy,cmxy,chxy,fwetxy,sneqvoxy,alboldxy,qsnowxy,qrainxy,wslakexy,zwtxy,waxy,wtxy,tsnoxy,zsnsoxy,snicexy,snliqxy,lfmassxy,rtmassxy,stmassxy,woodxy,stblcpxy,fastcpxy,xsaixy,taussxy,t2mvxy,t2mbxy,q2mvxy,q2mbxy,tradxy,neexy,gppxy,nppxy,fvegxy,qinxy,runsfxy,runsbxy,ecanxy,edirxy,etranxy,fsaxy,firaxy,aparxy,psnxy,savxy,sagxy,rssunxy,rsshaxy,bgapxy,wgapxy,tgvxy,tgbxy,chvxy,chbxy,shgxy,shcxy,shbxy,evgxy,evbxy,ghvxy,ghbxy,irgxy,ircxy,irbxy,trxy,evcxy,chleafxy,chucxy,chv2xy,chb2xy,chstarxy,smoiseq,smcwtdxy,rechxy,deeprechxy,fdepthxy,areaxy,rivercondxy,riverbedxy,eqzwt,pexpxy,qrfxy,qrfsxy,qspringxy,qspringsxy,qslatxy,stepwtd,gddxy,grainxy,croptype,planting,harvest,season_gdd,cropcat,pgsxy,soilcomp,soilcl1,soilcl2,soilcl3,soilcl4,gecros_state,irfract,sifract,mifract,fifract,irnumsi,irnummi,irnumfi,irwatsi,irwatmi,irwatfi,irsivol,irmivol,irfivol,ireloss,irrsplh - -package clmscheme sf_surface_physics==5 - - -package gfdlslab sf_surface_physics==88 - - -package pxlsmscheme sf_surface_physics==7 - - -package ssibscheme sf_surface_physics==8 - - -package ysuscheme bl_pbl_physics==1 - - -package myjpblscheme bl_pbl_physics==2 - - -package gfsscheme bl_pbl_physics==93 - state:hpbl2d,heat2d,evap2d,rc2d -package gfsedmfscheme bl_pbl_physics==3 - state:hpbl2d,heat2d,evap2d -package qnsepblscheme bl_pbl_physics==4 - - -package acmpblscheme bl_pbl_physics==7 - - -package boulacscheme bl_pbl_physics==8 - - -package camuwpblscheme bl_pbl_physics==9 - - -package mrfscheme bl_pbl_physics==99 - - -package temfpblscheme bl_pbl_physics==10 - - -package shinhongscheme bl_pbl_physics==11 - - -package fitchscheme windfarm_opt==1 - - - -package kfetascheme cu_physics==1 - - -package bmjscheme cu_physics==2 - state:qcconv,qiconv,convcld,ccldfra -package gdscheme cu_physics==93 - - -package sasscheme cu_physics==94 - state:hpbl2d,heat2d,evap2d -package scalesasscheme cu_physics==4 - state:hpbl2d,heat2d,evap2d -package osasscheme cu_physics==95 - state:randstate1,randstate2,randstate3,randstate4,random -package g3scheme cu_physics==5 - - -package gfscheme cu_physics==3 - - -package camzmscheme cu_physics==7 - - -package kfcupscheme cu_physics==10 - - -package g3tave cu_diag==1 - state:GD_CLOUD,GD_CLOUD2,GD_CLDFR,GD_CLOUD_A,GD_CLOUD2_A,kbcon_deep,ktop_deep,k22_deep -package kfedrates kf_edrates==1 - state:udr_kf,ddr_kf,uer_kf,der_kf,timec_kf - -package tiedtkescheme cu_physics==6 - - -package ntiedtkescheme cu_physics==16 - - -package ksasscheme cu_physics==14 - - -package nsasscheme cu_physics==96 - - -package kfscheme cu_physics==99 - - - -package g3shcuscheme shcu_physics==1 - - -package camuwshcuscheme shcu_physics==2 - - -package grimsshcuscheme shcu_physics==3 - - -package nscvshcuscheme shcu_physics==4 - - -package dengshcuscheme shcu_physics==5 - - - -package dfi_setup dfi_stage==0 - - -package dfi_bck dfi_stage==1 - - -package dfi_fwd dfi_stage==2 - - -package dfi_fst dfi_stage==3 - - -package dfi_startfwd dfi_stage==4 - - -package dfi_startbck dfi_stage==5 - - -package dfi_nodfi dfi_opt==0 - - -package dfi_dfl dfi_opt==1 - \ - state:dfi_pd,dfi_pint,dfi_dwdt,dfi_t,dfi_q,dfi_u,dfi_v,dfi_q2,dfi_cwm,dfi_rrw,dfi_STC,dfi_SMC,dfi_SH2O,dfi_SNOW,dfi_SNOWH,dfi_CANWAT,dfi_NMM_TSK,dfi_SNOWC -package dfi_ddfi dfi_opt==2 - \ - state:dfi_pd,dfi_pint,dfi_dwdt,dfi_t,dfi_q,dfi_u,dfi_v,dfi_q2,dfi_cwm,dfi_rrw,dfi_STC,dfi_SMC,dfi_SH2O,dfi_SNOW,dfi_SNOWH,dfi_CANWAT,dfi_NMM_TSK,dfi_SNOWC -package dfi_tdfi dfi_opt==3 - \ - state:dfi_pd,dfi_pint,dfi_dwdt,dfi_t,dfi_q,dfi_u,dfi_v,dfi_q2,dfi_cwm,dfi_rrw,dfi_STC,dfi_SMC,dfi_SH2O,dfi_SNOW,dfi_SNOWH,dfi_CANWAT,dfi_NMM_TSK,dfi_SNOWC - -package albsi_zero seaice_albedo_opt==0 - - -package albsi_one seaice_albedo_opt==1 - - -package albsi_two seaice_albedo_opt==2 - state:albsi -package snowsi_zero seaice_snowdepth_opt==0 - - -package snowsi_one seaice_snowdepth_opt==1 - state:snowsi -package icedepth_zero seaice_thickness_opt==0 - - -package icedepth_one seaice_thickness_opt==1 - state:icedepth - -# only need to specify these once; not for every io_form* variable -package io_intio io_form_restart==1 - - -package io_netcdf io_form_restart==2 - - -# Placeholders for additional packages (we can go beyond zzz -# but that will entail modifying frame/module_io.F and frame/md_calls.m4) -# Please note these are placeholders; HDF has not been implemented yet. -package io_hdf io_form_restart==3 - - -package io_phdf5 io_form_restart==4 - - -package io_grib1 io_form_restart==5 - - -package io_esmf io_form_restart==7 - - -package io_yyy io_form_restart==8 - - -package io_zzz io_form_restart==9 - - -package io_grib2 io_form_restart==10 - - -package io_pnetcdf io_form_restart==11 - - -package io_pio io_form_restart==12 - - - -#lightning -package ltng_none lightning_option==0 - - -package ltng_crm_PR92w lightning_option==1 - - -package ltng_crm_PR92z lightning_option==2 - - -package ltng_cpm_PR92z lightning_option==11 - - - -#WRF Hydro -package no_wrfhydro wrf_hydro==0 - - -package wrfhydro wrf_hydro==1 - state:SOLDRAIN, SFCHEADRT, INFXSRT - - -## communications - -### 8. Edit the Registry file and create a halo-exchange for x_1. - -# NMM communications - -halo HALO_NMM_INIT_1 dyn_nmm 120:HBM2 -halo HALO_NMM_INIT_2 dyn_nmm 120:HBM3,VBM2,VBM3 -halo HALO_NMM_INIT_3 dyn_nmm 120:SM,SICE -halo HALO_NMM_INIT_4 dyn_nmm 120:DX_NMM,WPDAR -halo HALO_NMM_INIT_5 dyn_nmm 120:CPGFU,CURV,FCP -halo HALO_NMM_INIT_6 dyn_nmm 120:FDIV,FAD,F -halo HALO_NMM_INIT_7 dyn_nmm 120:DDMPU,DDMPV,GLAT -halo HALO_NMM_INIT_8 dyn_nmm 120:GLON,EPSR,TG -halo HALO_NMM_INIT_9 dyn_nmm 120:GFFC,SST,ALBASE,SCURX,SCURY,CHARN,MSANG -#halo HALO_NMM_INIT_10 dyn_nmm 120:HDAC,HDACV,IVGTYP -halo HALO_NMM_INIT_10 dyn_nmm 120:HDAC,HDACV -#halo HALO_NMM_INIT_11 dyn_nmm 120:ISLTYP,ISLOPE,VEGFRC -halo HALO_NMM_INIT_11 dyn_nmm 120:VEGFRC -halo HALO_NMM_INIT_12 dyn_nmm 120:DIV,OMGALF,PD,RES -halo HALO_NMM_INIT_13 dyn_nmm 120:FIS,T,U -halo HALO_NMM_INIT_14 dyn_nmm 120:V,Q,Q2 -halo HALO_NMM_INIT_15 dyn_nmm 120:CWM,TRAIN,TCUCN -halo HALO_NMM_INIT_15B dyn_nmm 120:moist,scalar -halo HALO_NMM_INIT_16 dyn_nmm 120:RSWIN,RSWOUT,TG -halo HALO_NMM_INIT_17 dyn_nmm 120:Z0,AKMS,CZEN -halo HALO_NMM_INIT_18 dyn_nmm 120:AKHS,THS,QSH -halo HALO_NMM_INIT_19 dyn_nmm 120:TWBS,QWBS,HBOT -halo HALO_NMM_INIT_20 dyn_nmm 120:CFRACL,THZ0,QZ0 -halo HALO_NMM_INIT_21 dyn_nmm 120:UZ0,VZ0,USTAR -halo HALO_NMM_INIT_22 dyn_nmm 120:HTOP,CFRACM,SNO -halo HALO_NMM_INIT_23 dyn_nmm 120:SI,CLDEFI,RF -halo HALO_NMM_INIT_24 dyn_nmm 120:CUPPT,CFRACH,SOILTB -halo HALO_NMM_INIT_25 dyn_nmm 120:SFCEXC,SMSTAV,SMSTOT -halo HALO_NMM_INIT_26 dyn_nmm 120:GRNFLX,PCTSNO,RLWIN -halo HALO_NMM_INIT_27 dyn_nmm 120:RADOT,CZMEAN,SIGT4 -halo HALO_NMM_INIT_28 dyn_nmm 120:SR -halo HALO_NMM_INIT_29 dyn_nmm 120:PREC,ACPREC,ACCLIQ,CUPREC -halo HALO_NMM_INIT_30 dyn_nmm 120:ACFRST,ACSNOW -halo HALO_NMM_INIT_31 dyn_nmm 120:ACSNOM,SSROFF,BGROFF -halo HALO_NMM_INIT_32 dyn_nmm 120:SFCSHX,SFCLHX,SUBSHX -halo HALO_NMM_INIT_33 dyn_nmm 120:SNOPCX,SFCUVX,SFCEVP -halo HALO_NMM_INIT_34 dyn_nmm 120:POTEVP,ASWIN,ASWOUT -halo HALO_NMM_INIT_35 dyn_nmm 120:ASWTOA,ALWIN,ALWOUT -halo HALO_NMM_INIT_36 dyn_nmm 120:ALWTOA,SMC,CMC -halo HALO_NMM_INIT_37 dyn_nmm 120:STC,SH2O,ALBEDO -halo HALO_NMM_INIT_38 dyn_nmm 120:PINT,Z,DWDT -halo HALO_NMM_INIT_39 dyn_nmm 120:TOLD,UOLD,VOLD - -#for HWRF: zhang increase halo width to fix feedback bug for HALO_NMM_A (24 => 48) -#for HWRF: zhang HALO_NMM_C (24 => 48), HALO_NMM_G (24 => 48), HALO_NMM_K (8 => 24) -halo HALO_NMM_A dyn_nmm 48:pd,t,u,v,q,cwm,dwdt,div;48:pint -halo HALO_NMM_A_3 dyn_nmm 24:moist,scalar -halo HALO_NMM_B dyn_nmm 24:div -halo HALO_NMM_C dyn_nmm 48:u,v -halo HALO_NMM_D dyn_nmm 48:pd -halo HALO_NMM_E dyn_nmm 24:petdt -halo HALO_NMM_F dyn_nmm 120:t,u,v -halo HALO_NMM_F1 dyn_nmm 120:pdslo,few,fne,fse,uold,vold,told,petdt,fns -halo HALO_NMM_G dyn_nmm 48:u,v;24:z;48:w,hbm2,fad -halo HALO_NMM_H dyn_nmm 80:w,few -halo HALO_NMM_I dyn_nmm 48:q,q2,cwm,rrw -halo HALO_NMM_I_3 dyn_nmm 48:moist,scalar -halo HALO_NMM_J dyn_nmm 8:pd,uz0,vz0,t,q,cwm -halo HALO_NMM_J_3 dyn_nmm 8:moist,scalar -halo HALO_NMM_K dyn_nmm 24:q2;24:t,u,v,q,w,z -halo HALO_NMM_L dyn_nmm 8:pd,t,q,cwm,q2 -halo HALO_NMM_L_3 dyn_nmm 8:moist,scalar -halo HALO_NMM_MG dyn_nmm 8:ht_gc -halo HALO_NMM_MG2 dyn_nmm 8:pd,psfc_out -halo HALO_NMM_MG3 dyn_nmm 8:p_gc -halo HALO_NMM_RAD dyn_nmm 120:GSW,RSWIN,RSWOUT -halo HALO_NMM_TURBL_A dyn_nmm 8:uz0h,vz0h,hbm2 -halo HALO_NMM_TURBL_B dyn_nmm 8:dudt,dvdt - -# following halos added for nesting purpose (gopal's doing): - -halo HALO_NMM_TRACK dyn_nmm 120:sm,pdyn,mslp,sqws -halo HALO_NMM_FORCE_DOWN_SST dyn_nmm 120:sst,scurx,scury,charn,msang -halo HALO_NMM_WEIGHTS dyn_nmm 48:IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4,HNEAR_I,HNEAR_J - -#halo HALO_NMM_FORCE_DOWN1 dyn_nmm 24:t,u,v,q,q2,cwm,pint,pd,hres_fis,fis,pdyn_parent,pdyn_smooth -#halo HALO_NMM_FORCE_DOWN1M dyn_nmm 24:MOIST,SCALAR - -halo HALO_NMM_SAS_A dyn_nmm 24:uz0h,vz0h,hbm2 -halo HALO_NMM_SAS_B dyn_nmm 24:ducudt,dvcudt -halo HALO_TRACERS dyn_nmm 48:szj,s1z,spz,tcs - -halo HALO_NMM_TERRAIN_SMOOTH dyn_nmm 24:HRES_AVC - -halo HALO_NMM_MSLP dyn_nmm 24:MSLP - -ifdef HWRF=1 -halo HALO_NMM_VT4_MSLP dyn_nmm 8:mslp -halo HALO_NMM_VT4_NOISE dyn_nmm 8:mslp_noisy -endif - -halo HALO_NMM_INTERP_INFO dyn_nmm 8:pd,iinfo,winfo,pint -halo HALO_NMM_INT_UP dyn_nmm 120:pd,fis,hres_fis,sm - -halo HALO_NMM_MEMBRANE_RELAX dyn_nmm 8:relaxwork -halo HALO_NMM_MEMBRANE_MASK dyn_nmm 8:relaximask -halo HALO_NMM_MEMBRANE_INTERP dyn_nmm 24:u10,v10,u,v diff --git a/clean b/clean index f31ad2bfcc..007447603e 100755 --- a/clean +++ b/clean @@ -3,7 +3,7 @@ set nonomatch -foreach dir ( frame chem share dyn_em dyn_nmm phys main tools wrftladj ) +foreach dir ( frame chem share dyn_em phys main tools wrftladj ) if ( -d $dir ) then ( cd $dir ; echo $dir ; /bin/rm -f core wrf *.f90 *.exe *.kmo *.mod *.o *.obj *.inc *.F90 *.a \ db_* Warnings module_state_description.F module_dm.F gmeta \ diff --git a/compile b/compile index dfc776580e..0595d05db1 100755 --- a/compile +++ b/compile @@ -56,19 +56,6 @@ foreach a ( $argv ) echo "" exit 1 endif - else if ( ( "$a" == "nmm_real" ) || ( "$a" == "nmm_nest" ) || ( "$a" == "nmm_hwrf" ) ) then - set arglist = ( $arglist $a ) - set ZAP = ( main/wrf.exe main/real_nmm.exe ) - if ( "$a" == "nmm_real" ) then - grep "NMM_CORE=1" configure.wrf > /dev/null - if ( ! $status ) then - # If configuration file has NMM_CORE=1 hardwired, ok to set WRF_NMM_CORE to 1 - if ( ! $?WRF_NMM_CORE ) setenv WRF_NMM_CORE 1 - endif - endif - else if ( `echo $a | cut -c 1-4` == "nmm_" ) then - set arglist = ( $arglist $a ) - set ZAP = ( main/wrf.exe main/ideal_nmm.exe ) else if ( "$a" == "em_real" ) then set arglist = ( $arglist $a ) set ZAP = ( main/wrf.exe main/real.exe main/ndown.exe main/tc.exe ) @@ -100,12 +87,6 @@ foreach a ( $argv ) endif end -if ( $?WRF_NMM_CORE ) then - if ( $WRF_NMM_CORE == 1 ) then - setenv WRF_NMM_NEST 1 - endif -endif - if ( "$arglist" == "" ) then goto hlp else @@ -114,14 +95,10 @@ else unsetenv A1DCASE setenv A1DCASE `echo $arglist | grep scm` - if ( ! ( $?WRF_EM_CORE || $?WRF_NMM_CORE \ - || $?WRF_COAMPS_CORE || $?WRF_EXP_CORE \ - || $?WRF_PLUS_CORE )) then - echo 'None of WRF_EM_CORE, WRF_NMM_CORE, ' -# echo ' WRF_COAMPS_CORE, or WRF_EXP_CORE ' - echo ' specified in shell environment.... ' + if ( ! ( $?WRF_EM_CORE || $?WRF_PLUS_CORE ) ) then + echo 'Neither WRF_EM_CORE nor WRF_PLUS_CORE' + echo ' are explicitly specified in shell environment.... ' setenv WRF_EM_CORE 1 - setenv WRF_NMM_CORE 0 setenv WRF_COAMPS_CORE 0 setenv WRF_EXP_CORE 0 setenv WRF_PLUS_CORE 0 @@ -142,14 +119,11 @@ else if ( ! $?WRF_DA_CORE ) setenv WRF_DA_CORE 0 if ( ! $?WRF_EM_CORE ) setenv WRF_EM_CORE 0 - if ( ! $?WRF_NMM_CORE ) setenv WRF_NMM_CORE 0 - if ( ! $?WRF_NMM_NEST ) setenv WRF_NMM_NEST 0 if ( ! $?WRF_COAMPS_CORE ) setenv WRF_COAMPS_CORE 0 if ( ! $?WRF_EXP_CORE ) setenv WRF_EXP_CORE 0 if ( ! $?WRF_PLUS_CORE ) setenv WRF_PLUS_CORE 0 if ( ! $?WRF_CHEM ) setenv WRF_CHEM 0 if ( ! $?WRF_DFI_RADAR ) setenv WRF_DFI_RADAR 0 - if ( ! $?HWRF ) setenv HWRF 0 if ( ! $?WRF_CONVERT ) then if ( "$arglist" == "convert_em" ) then setenv WRF_CONVERT 1 @@ -159,6 +133,11 @@ else endif endif +# temporary - until all vestiges of NMM ifdefs are gone from WRF source + setenv WRF_NMM_CORE 0 + setenv WRF_NMM_NEST 0 + setenv HWRF 0 + if ( ! $?DA_ARCHFLAGS ) setenv DA_ARCHFLAGS "" # if ( ( $WRF_CHEM == 1 ) && ( $WRF_DA_CORE == 1 ) ) then @@ -186,44 +165,10 @@ else endif set overwrite=0 - if ($WRF_NMM_CORE == 1 && $WRF_DFI_RADAR == 1 ) then - echo "radar dfi not yet supported in NMM core, set WRF_DFI_RADAR to 0 " - endif - if ($WRF_NMM_CORE == 1 && $WRF_CHEM == 1 ) then - echo "Chemistry not yet supported in NMM core, set WRF_CHEM to 0 " - if ( ! -f Registry/Registry ) then - echo Registry file does not exist - set overwrite=1 - else - head -2 Registry/Registry | tail -1 | grep NMM_CHEM > /dev/null - if ( $status ) then - set overwrite=1 - else - set nmm_time=`ls -1tr Registry | cat -n | grep -w 'Registry\.NMM_CHEM' | grep -v 'Registry.NMM_CHEM.' | awk '{print $1}'` - set rg_time=`ls -1tr Registry | cat -n | grep -w 'Registry' | grep -v 'Registry.' | awk '{print $1}'` - if ( $nmm_time > $rg_time ) set overwrite=1 - endif - endif - if ( $overwrite ) then - echo copying Registry/Registry.NMM_CHEM to Registry/Registry - echo '## WARNING: this file is autogenerated from Registry/Registry.NMM_CHEM. Changes may be lost' > Registry/Registry - /bin/cat Registry/Registry.NMM_CHEM >> Registry/Registry - endif -# exit 2 - endif - - if ($WRF_EM_CORE == 1 && $WRF_NMM_CORE == 1 ) then - echo "Cannot compile both EM and NMM cores in same executable yet." - exit 2 - endif - if ($WRF_EM_CORE == 0 && $WRF_NMM_CORE == 0 && ! $WRF_CONVERT == 1 ) then - echo "Cannot compile because both EM and NMM cores are set to 0." - exit 2 - endif - if ("$arglist" == 'nmm_real' && $WRF_NMM_CORE == 0) then - echo WRF_NMM_CORE must be set to 1 in order to compile nmm_real + if ($WRF_EM_CORE == 0 && ! $WRF_CONVERT == 1 ) then + echo "Cannot compile because both EM core is set to 0." exit 2 endif if (($WRF_EM_CORE == 1)&&($WRF_DA_CORE == 0 ) &&($WRF_CHEM == 0 )&&($WRF_CONVERT == 0)&&($WRF_PLUS_CORE == 0) ) then @@ -318,10 +263,6 @@ else endif if ( $status ) then set overwrite=1 - else - set nmm_time=`ls -1tr Registry | cat -n | grep -w 'Registry\.NMM' | grep -v 'Registry.NMM.' | awk '{print $1}'` - set rg_time=`ls -1tr Registry | cat -n | grep -w 'Registry' | grep -v 'Registry.' | awk '{print $1}'` - if ( $nmm_time > $rg_time ) set overwrite=1 endif endif if ( $overwrite ) then @@ -449,35 +390,6 @@ else endif setenv DA_ARCHFLAGS "${BUFR_CPP} ${MADIS_CPP} -DFFTPACK -DNORESHAPE" endif - if (($WRF_NMM_CORE == 1)&&($WRF_CHEM == 0 )) then - if ( ! -f Registry/Registry ) then - set overwrite=1 - else - head -2 Registry/Registry | tail -1 | grep NMM > /dev/null - if ( $status ) then - set overwrite=1 - else - set nmm_time=`ls -1tr Registry | cat -n | grep -w 'Registry\.NMM' | grep -v 'Registry.NMM.' | awk '{print $1}'` - set rg_time=`ls -1tr Registry | cat -n | grep -w 'Registry' | grep -v 'Registry.' | awk '{print $1}'` - if ( $nmm_time > $rg_time ) set overwrite=1 - endif - endif - if ( $overwrite ) then - echo copying Registry/Registry.NMM to Registry/Registry - echo '## WARNING: this file is autogenerated from Registry/Registry.NMM. Changes may be lost' > Registry/Registry - /bin/cat Registry/Registry.NMM >> Registry/Registry - endif -# integrity check for a kludge where a hard coded value in the -# registry must match the same value in arch/preamble - set registryvalue=`grep 'dimspec.* q ' Registry/registry.dimspec | sed -e 's/..*constant=//' -e 's/ ..*$//'` - set preamblevalue=`grep 'DNMM_MAX_DIM=.*' arch/preamble | sed -e 's/..*-DNMM_MAX_DIM=//' -e 's/ ..*$//'` - if ( $registryvalue != $preamblevalue ) then - echo "Harded coded value of dimspec q in Registry ($registryvalue) does not" - echo "equal the hard coded value of NMM_MAX_DIM in arch/preamble ($preamblevalue)" - echo "Please fix and try again." - exit 2 - endif - endif echo " " echo "============================================================================================== " @@ -488,7 +400,6 @@ else echo -n "Compiling: " if ( $WRF_DA_CORE ) echo -n "WRF_DA_CORE " if ( $WRF_EM_CORE ) echo -n "WRF_EM_CORE " - if ( $WRF_NMM_CORE ) echo -n "WRF_NMM_CORE " if ( $WRF_COAMPS_CORE ) echo -n "WRF_COAMPS_CORE " if ( $WRF_EXP_CORE ) echo -n "WRF_EXP_CORE " echo " " diff --git a/configure b/configure index ed9f10c2f4..bd6175f957 100755 --- a/configure +++ b/configure @@ -30,7 +30,6 @@ while [ $# -ge 1 ]; do wrfda) wrf_core=DA_CORE ;; 4dvar) wrf_core=4D_DA_CORE ;; arw) wrf_core=EM_CORE ;; - nmm) wrf_core=NMM_CORE ;; coamps) wrf_core=COAMPS_CORE ;; titan) WRF_TITAN=1 ; break ;; mars) WRF_MARS=1 ; break ;; @@ -455,27 +454,6 @@ if [ -n "$PNETCDF_QUILT" ]; then echo Enabling quilt_pnc I/O server implementation. compileflags="${compileflags}!-DPNETCDF_QUILT=1" fi -if [ -n "$WRF_NMM_CORE" ]; then - if [ $WRF_NMM_CORE = 1 ]; then - export WRF_NMM_NEST=1 - if [ -n "$HWRF" ]; then - if [ $HWRF = 1 ]; then - echo building WRF with HWRF option - compileflags="${compileflags}!-DHWRF=1" - if [ -n "$IDEAL_NMM_TC" ]; then - echo building WRF with NMM Idealized Tropical Cyclone option - compileflags="${compileflags}!-DIDEAL_NMM_TC=1" - fi - fi - fi - if [ -n "$IBM_REDUCE_BUG_WORKAROUND" ]; then - if [ $IBM_REDUCE_BUG_WORKAROUND = 1 ]; then - echo adding IBM_REDUCE_BUG_WORKAROUND flag for some IBM systems - compileflags="${compileflags}!-DIBM_REDUCE_BUG_WORKAROUND" - fi - fi - fi -fi if [ -n "$WRF_DFI_RADAR" ] ; then if [ $WRF_DFI_RADAR = 1 ] ; then echo building WRF with radar dfi option @@ -507,16 +485,6 @@ if [ -n "$WRFPLUS" ] ; then fi fi -if [ -n "$WRF_NMM_CORE" -a -n "$WRF_CHEM" ]; then - if [ $WRF_NMM_CORE = 1 -a $WRF_CHEM = 1 ]; then - echo - echo "NMM is no longer compatible with the Chemistry option." - echo - # alphabetically: c=3, o=15, so co2 = 3+15+2 = 20 - exit 20 - fi -fi - type m4 > /dev/null if [ $? -ne 0 ] ; then echo diff --git a/dyn_nmm/BALANCE_COMS.F b/dyn_nmm/BALANCE_COMS.F deleted file mode 100644 index 78c633b085..0000000000 --- a/dyn_nmm/BALANCE_COMS.F +++ /dev/null @@ -1,81 +0,0 @@ -! -!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! The following common blocks are used in the TC-scale model. -! The meanings of their elements are listed below: -!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! nt ----- the counting number of time steps of model integration -! nttb---- time steps for the TKE initialization -! ktops--- Bottom level above which spounge layer is applied -! - integer nt,nttb,ktops,nstep - common /contrl/nt,nttb,ktops,nstep -! -! dtph --- fractional time steps for time integration of TKE and -! the precipitating terms in the cloud microphysics scheme -! tsf0---- temperature at sea surface -! taa ---- the time scale for Newtonian cooling -! - real dtph,tsf0,taa,epsl,vip(2:kmx,2),tvbh(kmx) - common /cddt/dtph,tsf0,taa,epsl,vip,tvbh -! -! sig ---- sigma at full levels (TKE, ...) -! sig1---- sigma at half levels (u,v,t,qv, ...) -! dsig --- thickness of the model layers between full levels -! dsig1 -- thickness between the half levels -! dsghl -- dsig(k-1)/dsig(k) -! - real sig(kmx1),sig1(kmx),dsig(kmx) - real dsig1(kmx1),dsghl(2:kmx) - common /csig/sig,sig1,dsig,dsig1,dsghl -! -! rsig --- 1/sig -! rdsig -- 1/dsig -! rdsig1 - 1/dsig1 -! - real rsig(kmx1),rdsig(kmx),rdsig1(kmx1) - common /crsig/rsig,rdsig,rdsig1 -! -! thb ---- basic potential temperature at u,v levels -! pib ---- Exner function of basic state at u,v levels -! pibh --- Exner function of basic state at half levels -! - real thb(kmx),pib(kmx),pibh(kmx1),qb(kmx) - common /thbpib/thb,pib,pibh,qb -! -! vp1,vp2,vp3 -- constant in vertical sound-wave equations -! - real vp1(kmx),vp2(kmx),vp3(kmx),thvb(kmx) - common /v123/vp1,vp2,vp3,thvb -! -! jt0 ---- nearest integal zonal gridpoint of tropical cyclone centre -! it0 ---- nearest integal meridional gridpoint of TC centre -! psmin--- minimum surface pressure at TC centre -! - integer jt0,it0 - real psmin - common /ijt0/jt0,it0,psmin -! -! vmm ---- maximum wind speed at lowest model level -! prm ---- time sequence of minimum surface pressure -! xpt ---- time sequence of TC centre in the coarse mesh domain -! ypt ---- time sequence of TC centre in the coarse mesh domain -! rmw ---- time sequence of radius of maximum wind -! - real vmm(nn),prm(nn),xpt(nn),ypt(nn),rmw(nn) - common /xytc/vmm,prm,xpt,ypt,rmw -! -! zz --- Height of half sigma-levels -! poz -- Height of sigma-levles -! - real zz(kmx1),poz(kmx),aml(kmx),amh(kmx) - common /czzp/zz,poz,aml,amh -! -! common block for sensitivity and physical process studies -! - integer nphy,nevp,micr,ngh,ihadv,ihadq - common /comexp1/nphy,nevp,micr,ngh,ihadv,ihadq - integer nenv,isfclyr,idrag,ndisht - common /cominit/nenv,isfclyr,idrag,ndisht -! -! Ends common block section -! diff --git a/dyn_nmm/BALANCE_PARS.F b/dyn_nmm/BALANCE_PARS.F deleted file mode 100644 index 2df2d1e64d..0000000000 --- a/dyn_nmm/BALANCE_PARS.F +++ /dev/null @@ -1,46 +0,0 @@ -! -!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! parameters used in the triply-nested movable mesh tropical -! cyclone model with sigma=p/ps as the vertical coordinate. -!============================================================= -! -!------------------------------------------------------------- -! nn---- the total hourly TC positions, Pmin, Vmax; -! kmx---- model levels in vertical -!-------------------------------------------------------------- - integer nn,kmx,kmx1 - parameter(nn=1241,kmx=26,kmx1=kmx+1) -!--------------------------------------------------------------- -! pse --- the base surface pressure (Pa) -! fi0 --- standard latitude of the beta or f-plane. -!--------------------------------------------------------------- - real pse,fi0 - parameter(pse=101000.,fi0=12.5) -!--------------------------------------------------------------- -! grv --- acceleration of gravity -! cp ---- specific heat of dry air at constant pressure -! cv ---- specific heat of dry air at constant volume -! rgas -- gas constant for dry air -! rcp --- rgas/cp -!-------------------------------------------------------------- - real grv,cp,rgas,rcp - parameter(grv=9.8066,cp=1004.6,rgas=287.05,rcp=rgas/cp) - real gocp,rogrv,gor - parameter(gocp=grv/cp,rogrv=rgas/grv,gor=grv/rgas) - real cv,cpocv,gocv,rocv - parameter(cv=717.0,cpocv=cp/cv,gocv=grv/cv,rocv=rgas/cv) -!-------------------------------------------------------------- -! al ---- Latent heat of condensation -! rgv --- gas constant for water vapor -!--------------------------------------------------------------- - real al,rgv - parameter(al=2.5e6,rgv=461.5) -!--------------------------------------------------------------- -! three constants in calculating the saturated WV mixing ratio -! respect to water -!--------------------------------------------------------------- - real cs2,cs3,cs4 - parameter(cs2=17.67,cs3=273.15,cs4=29.65) -!--------------------------------------------------------------- -! Ends the parameters set -!++++++++++++++++++++++++++++ diff --git a/dyn_nmm/BUCKETS.F b/dyn_nmm/BUCKETS.F deleted file mode 100644 index d18991b558..0000000000 --- a/dyn_nmm/BUCKETS.F +++ /dev/null @@ -1,394 +0,0 @@ -!----------------------------------------------------------------------- -! -!NCEP_MESO:MODEL_LAYER: ACCUMULATION BUCKETS -! -!----------------------------------------------------------------------- - SUBROUTINE BUCKETS(NTSD,NPREC,NSRFC,NRDSW,NRDLW & - & ,RESTART,TSTART & - & ,NCLOD,NHEAT,NPHS,TSPH & - & ,ACPREC,CUPREC,ACSNOW,ACSNOM,SSROFF,BGROFF & - & ,SFCEVP,POTEVP,SFCSHX,SFCLHX,SUBSHX,SNOPCX & - & ,SFCUVX,POTFLX & - & ,ARDSW,ASWIN,ASWOUT,ASWTOA & - & ,ARDLW,ALWIN,ALWOUT,ALWTOA & - & ,ACFRST,NCFRST,ACFRCV,NCFRCV & - & ,AVCNVC,AVRAIN,TCUCN,TRAIN & - & ,ASRFC & - & ,T,TLMAX,TLMIN,TSHLTR,PSHLTR,QSHLTR & - & ,T02_MAX,T02_MIN,RH02_MAX,RH02_MIN & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!----------------------------------------------------------------------- -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: BUCKETS EMPTY ACCUMULATION BUCKETS WHEN NEEDED -! PRGRMMR: BLACK ORG: W/NP22 DATE: 04-08-18 -! -! ABSTRACT: -! VARIOUS ACCUMULATING QUANTITIES NEED TO BE RESET TO ZERO AT -! SPECIFIED INTERVALS. -! -! USAGE: CALL BUCKETS FROM SOLVE_NMM -! INPUT ARGUMENT LIST: -! NTSD - CURRENT TIMESTEP -! NPREC - NUMBER OF TIMESTEPS BETWEEN EMPTYING BUCKETS FOR PRECIP -! NHEAT - NUMBER OF TIMESTEPS BETWEEN EMPTYING BUCKETS FOR -! LATENT HEATING -! NCNVC - NUMBER OF TIMESTEPS BETWEEN CALLS TO CONVECTION -! TSPH - NUMBER OF DYNAMICS TIMESTEPS PER HOUR -! ACPREC - ACCUMULATED TOTAL PRECIPITATION (M) -! CUPREC - ACCUMULATED CONVECTIVE PRECIPITATION (M) -! ACSNOW - ACCUMULATED SNOWFALL (M) -! ACSNOM - ACCUMULATED SNOWMELT (M) -! SSROFF - ACCUMULATED SURFACE RUNOFF -! BGROFF - ACCUMULATED BELOW GROUND RUNOFF -! SFCEVP - ACCUMULATED SURFACE EVAPORATION -! POTEVP - ACCUMULATED POTENTIAL EVAPORATION -! T - TEMPERATURE -! TLMAX - MAX TEMPERATURE EACH HOUR IN LOWEST LAYER -! TLMIN - MIN TEMPERATURE EACH HOUR IN LOWEST LAYER -! TSHLTR - SHELTER LEVEL (2m) POTENTIAL TEMPERATURE (K) -! PSHLTR - SHELTER LEVEL (2m) PRESSURE (Pa) -! QSHLTR - SHELTER LEVEL (2m) SPECIFIC HUMIDITY (kg/kg) -! T02_MAX - 2m HOURLY MAX TEMPERATURE (K) -! T02_MIN - 2m HOURLY MIN TEMPERATURE (K) -! RH02_MAX - 2m HOURLY MAX RELATIVE HUMIDITY (fraction) -! RH02_MIN - 2m HOURLY MIN RELATIVE HUMIDITY (fraction) -! -! OUTPUT ARGUMENT LIST: THE ACCUMULATED QUANTITIES -! -! OUTPUT FILES: NONE -! -! SUBPROGRAMS CALLED: NONE -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM -!$$$ -!----------------------------------------------------------------------- -! - USE MODULE_MODEL_CONSTANTS,ONLY: CP,CPV,R_D,R_V,RCP - USE MODULE_MP_ETANEW,ONLY: C1XPVS,C1XPVS0,C2XPVS,C2XPVS0 & - ,FPVS,FPVS0,NX,TBPVS,TBPVS0 & - ,GPVS -! -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -!*** ARGUMENTS -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: NCLOD,NHEAT,NPHS,NPREC,NRDLW,NRDSW & - ,NSRFC,NTSD & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: NCFRST,NCFRCV -! - REAL,INTENT(IN) :: TSPH,TSTART -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: PSHLTR,QSHLTR,TSHLTR -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: T -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: TLMAX,TLMIN -! - REAL,INTENT(OUT) :: ARDLW,ARDSW,ASRFC,AVCNVC,AVRAIN -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: ACPREC,ACSNOM & - & ,ACSNOW,ALWIN & - & ,ACFRST,ACFRCV & - & ,ALWOUT,ALWTOA & - & ,ASWIN,ASWOUT & - & ,ASWTOA,BGROFF & - & ,CUPREC,POTEVP & - & ,POTFLX,SFCEVP & - & ,RH02_MAX,RH02_MIN & - & ,SFCLHX,SFCSHX & - & ,SFCUVX,SNOPCX & - & ,SSROFF,SUBSHX & - & ,T02_MAX,T02_MIN -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(OUT) :: TCUCN & - & ,TRAIN -! - LOGICAL,INTENT(IN) :: RESTART -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - INTEGER :: I,J,K,NTSD_BUCKET,NTSPH - LOGICAL :: FIRST_PASS=.TRUE. - LOGICAL :: WRF_DM_ON_MONITOR - EXTERNAL WRF_DM_ON_MONITOR -! - REAL :: CAPPA_MOIST,RH02,SAT_VAPOR_PRESS,VAPOR_PRESS - REAL,SAVE :: CP_FACTOR,EPSILON,ONE_MINUS_EPSILON,R_FACTOR - REAL,SAVE :: P00_INV=1.E-5 -! - REAL,DIMENSION(ITS:ITE,JTS:JTE) :: T02 -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -!*** COMPUTE AND SAVE THE FACTORS IN R AND CP TO ACCOUNT FOR -!*** WATER VAPOR IN THE AIR. -!*** -!*** RECALL: R = Rd * (1. + Q * (1./EPSILON - 1.)) -!*** CP = CPd * (1. + Q * (CPv/CPd - 1.)) -! - IF(FIRST_PASS)THEN - FIRST_PASS=.FALSE. -! - EPSILON=R_D/R_V - ONE_MINUS_EPSILON=1.-EPSILON - R_FACTOR=1./EPSILON-1. - CP_FACTOR=CPV/CP-1. -! Make sure saturation vapor pressure lookup table is initialized - CALL GPVS - ENDIF -! -!----------------------------------------------------------------------- -! - NTSD_BUCKET=NTSD -! -!----------------------------------------------------------------------- -!*** TOTAL AND CONVECTIVE PRECIPITATION ARRAYS. -!*** TOTAL SNOW AND SNOW MELT ARRAYS. -!*** STORM SURFACE AND BASE GROUND RUN OFF ARRAYS. -!*** EVAPORATION ARRAYS. -!----------------------------------------------------------------------- -! -! IF(MOD(NTSD,NPREC)0)THEN - T02_MAX(I,J)=MAX(T02_MAX(I,J),T02(I,J)) !<--- Hourly max shelter T - T02_MIN(I,J)=MIN(T02_MIN(I,J),T02(I,J)) !<--- Hourly min shelter T - ENDIF - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** MAX/MIN RELATIVE HUMIDITY -!----------------------------------------------------------------------- -! - IF(MOD(NTSD_BUCKET,NTSPH)==0.OR.NTSD==1)THEN - DO J=JTS,JTE - DO I=ITS,ITE - RH02_MAX(I,J)=-999. - RH02_MIN(I,J)=999. - ENDDO - ENDDO -! - IF ( WRF_DM_ON_MONITOR() ) THEN - CALL WRF_MESSAGE('RESET MAX/MIN RH') - ENDIF - ENDIF -! - IF(NTSD>0)THEN -! - DO J=JTS,JTE - DO I=ITS,ITE - VAPOR_PRESS=PSHLTR(I,J)*QSHLTR(I,J)/ & - (EPSILON+QSHLTR(I,J)*ONE_MINUS_EPSILON) -! -! IF(T02(I,J)>273.15)THEN - SAT_VAPOR_PRESS=1.E3*FPVS0(T02(I,J)) -! ELSE -! SAT_VAPOR_PRESS=1.E3*FPVS(T02(I,J)) -! ENDIF -! - RH02=MIN(VAPOR_PRESS/SAT_VAPOR_PRESS,0.99) -! - RH02_MAX(I,J)=MAX(RH02_MAX(I,J),RH02) !<--- Hourly max shelter RH - RH02_MIN(I,J)=MIN(RH02_MIN(I,J),RH02) !<--- Hourly min shelter RH - ENDDO - ENDDO -! - ELSE !<-- If timestep is 0, simply set max/min to zero. - DO J=JTS,JTE - DO I=ITS,ITE - RH02_MAX(I,J)=0. - RH02_MIN(I,J)=0. - ENDDO - ENDDO -! - ENDIF -! -!----------------------------------------------------------------------- -! - END SUBROUTINE BUCKETS -! -!----------------------------------------------------------------------- diff --git a/dyn_nmm/CLTEND.F b/dyn_nmm/CLTEND.F deleted file mode 100644 index 0dc4bfea78..0000000000 --- a/dyn_nmm/CLTEND.F +++ /dev/null @@ -1,95 +0,0 @@ -! -!NCEP_MESO:MODEL_LAYER: PHYSICS -! -!********************************************************************** - SUBROUTINE CLTEND (ICLTEND,NPHS,T,T_OLD,T_ADJ & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE) -!---------------------------------------------------------------------- -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: CLTEND TEMPERATURE CHANGE BY CLOUD PROCESSES -! PRGRMMR: FERRIER ORG: W/NP22 DATE: 01-09-26 -! -! ABSTRACT: -! CLTEND GRADUALLY UPDATES TEMPERATURE TENDENCIES FROM CONVECTION -! GRID-SCALE MICROPHYSICS, AND PRECIPITATION ASSIMILATION. -! -! USAGE: CALL CLTEND FROM SOLVE_RUNSTEAM -! INPUT ARGUMENT LIST: -! ICLTEND - FLAG SET TO -1 PRIOR TO PHYSICS CALLS, 0 AFTER PHYSICS -! CALLS, AND 1 FOR UPDATING TEMPERATURES EVERY TIME STEP -! -! OUTPUT ARGUMENT LIST: NONE -! -! OUTPUT FILES: NONE -! -! SUBPROGRAMS CALLED: NONE -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!---------------------------------------------------------------------- - USE module_MPP -! - IMPLICIT NONE -! -!---------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: ICLTEND & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE & - ,NPHS -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: T & - ,T_ADJ & - ,T_OLD -! -!*** LOCAL VARIABLES -! - INTEGER :: I,J,K -! - REAL :: DELTPH -! -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- -! - IF(ICLTEND<0)THEN - DO K=KTS,KTE - DO J=JTS,JTE - DO I=ITS,ITE - T_OLD(I,J,K)=T(I,J,K) - ENDDO - ENDDO - ENDDO - ELSEIF(ICLTEND==0)THEN - DO K=KTS,KTE - DO J=JTS,JTE - DO I=ITS,ITE - T_ADJ(I,J,K)=T(I,J,K)-T_OLD(I,J,K) - T(I,J,K)=T_OLD(I,J,K) - ENDDO - ENDDO - ENDDO - ELSE - DELTPH=1./REAL(NPHS) - DO K=KTS,KTE - DO J=JTS,JTE - DO I=ITS,ITE - T(I,J,K)=T(I,J,K)+DELTPH*T_ADJ(I,J,K) - ENDDO - ENDDO - ENDDO - ENDIF -!---------------------------------------------------------------------- -! - END SUBROUTINE CLTEND -! -!---------------------------------------------------------------------- diff --git a/dyn_nmm/DSTRB.F b/dyn_nmm/DSTRB.F deleted file mode 100644 index 0f0251b258..0000000000 --- a/dyn_nmm/DSTRB.F +++ /dev/null @@ -1,188 +0,0 @@ -!----------------------------------------------------------------------- - SUBROUTINE DSTRB(ARRAYG,ARRAYL,LGS,LGE,LLS,LLE,L1 & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE) -!----------------------------------------------------------------------- -! DSTRB DISTRIBUTES THE ELEMENTS OF REAL GLOBAL ARRAY ARRG TO THE -! REAL LOCAL ARRAYS ARRL. LG IS THE VERTICAL DIMENSION OF THE -! GLOBAL ARRAY. LL IS THE VERTICAL DIMENSION OF THE LOCAL ARRAY. -! L1 IS THE SPECIFIC LEVEL OF ARRL THAT IS BEING FILLED DURING -! THIS CALL (PERTINENT WHEN LG=1 AND LL>1). -!----------------------------------------------------------------------- - USE MODULE_EXT_INTERNAL -!----------------------------------------------------------------------- - IMPLICIT NONE -!----------------------------------------------------------------------- -#if defined(DM_PARALLEL) && !defined(STUBMPI) - INCLUDE "mpif.h" -#endif -!----------------------------------------------------------------------- -!*** -!*** ARGUMENT VARIABLES -!*** - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE - INTEGER,INTENT(IN) :: L1,LGE,LGS,LLE,LLS -! - REAL,DIMENSION(IDS:IDE,JDS:JDE,LGS:LGE),INTENT(IN) :: ARRAYG - REAL,DIMENSION(IMS:IME,JMS:JME,LLS:LLE),INTENT(OUT) :: ARRAYL -!----------------------------------------------------------------------- -!*** -!*** LOCAL VARIABLES -!*** -#if defined(DM_PARALLEL) && !defined(STUBMPI) - REAL,ALLOCATABLE,DIMENSION(:) :: ARRAYX -! - INTEGER :: I,IEND,IPE,IRECV,IRTN,ISEND,ISTART,J,JEND,JSTART,KNT & - &, L,MPI_COMM_COMP,NUMVALS,MYPE,NPES - INTEGER,DIMENSION(4) :: LIMITS - INTEGER,DIMENSION(MPI_STATUS_SIZE) :: ISTAT -#else - INTEGER :: I,L,J -#endif -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -#if defined(DM_PARALLEL) && !defined(STUBMPI) -! -!*** GET OUR TASK ID AND THE COMMUNICATOR -! - CALL WRF_GET_MYPROC(MYPE) - CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP) - CALL WRF_GET_NPROC(NPES) -! -!*** INITIALIZE THE OUTPUT ARRAY -! - DO L=LLS,LLE - DO J=JMS,JME - DO I=IMS,IME - ARRAYL(I,J,L)=0. - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** TASK 0 FILLS ITS OWN LOCAL DOMAIN THEN PARCELS OUT ALL THE OTHER -!*** PIECES TO THE OTHER TASKS. -!----------------------------------------------------------------------- -! - tasks : IF(MYPE==0)THEN -! - IF(LGE==LGS)THEN - DO J=JTS,JTE - DO I=ITS,ITE - ARRAYL(I,J,L1)=ARRAYG(I,J,LGS) - ENDDO - ENDDO -! - ELSE -! - DO L=LGS,LGE - DO J=JTS,JTE - DO I=ITS,ITE - ARRAYL(I,J,L)=ARRAYG(I,J,L) - ENDDO - ENDDO - ENDDO - ENDIF -! -!*** TASK 0 NEEDS THE LIMITS FROM EACH OF THE OTHER TASKS AND THEN -!*** SENDS OUT THE APPROPRIATE PIECE OF THE GLOBAL ARRAY. -! - DO IPE=1,NPES-1 -! - CALL MPI_RECV(LIMITS,4,MPI_INTEGER,IPE,IPE,MPI_COMM_COMP & - &, ISTAT,IRECV) - ISTART=LIMITS(1) - IEND=LIMITS(2) - JSTART=LIMITS(3) - JEND=LIMITS(4) -! - NUMVALS=(IEND-ISTART+1)*(JEND-JSTART+1)*(LGE-LGS+1) - ALLOCATE(ARRAYX(NUMVALS),STAT=I) - - KNT=0 -! - DO L=LGS,LGE - DO J=JSTART,JEND - DO I=ISTART,IEND - KNT=KNT+1 - ARRAYX(KNT)=ARRAYG(I,J,L) - ENDDO - ENDDO - ENDDO -! - CALL MPI_SEND(ARRAYX,KNT,MPI_REAL,IPE,IPE,MPI_COMM_COMP,ISEND) -! - DEALLOCATE(ARRAYX) -! - ENDDO -! -!----------------------------------------------------------------------- -!*** ALL OTHER TASKS TELL TASK 0 WHAT THEIR HORIZONTAL LIMITS ARE AND -!*** RECEIVE THEIR PIECE OF THE GLOBAL ARRAY FROM TASK 0. -!----------------------------------------------------------------------- -! - ELSE -! - LIMITS(1)=ITS - LIMITS(2)=ITE - LIMITS(3)=JTS - LIMITS(4)=JTE -! - CALL MPI_SEND(LIMITS,4,MPI_INTEGER,0,MYPE,MPI_COMM_COMP,ISEND) -! - NUMVALS=(ITE-ITS+1)*(JTE-JTS+1)*(LGE-LGS+1) - ALLOCATE(ARRAYX(NUMVALS),STAT=I) -! - CALL MPI_RECV(ARRAYX,NUMVALS,MPI_REAL,0,MYPE,MPI_COMM_COMP & - &, ISTAT,IRECV) -! - KNT=0 - IF(LGE==LGS)THEN - DO J=JTS,JTE - DO I=ITS,ITE - KNT=KNT+1 - ARRAYL(I,J,L1)=ARRAYX(KNT) - ENDDO - ENDDO - ELSE - DO L=LGS,LGE - DO J=JTS,JTE - DO I=ITS,ITE - KNT=KNT+1 - ARRAYL(I,J,L)=ARRAYX(KNT) - ENDDO - ENDDO - ENDDO - ENDIF -! - DEALLOCATE(ARRAYX) -! -!----------------------------------------------------------------------- -! - ENDIF tasks -! -!----------------------------------------------------------------------- - CALL MPI_BARRIER(MPI_COMM_COMP,IRTN) -!----------------------------------------------------------------------- -! -! -!*** INITIALIZE THE OUTPUT ARRAY -! - ARRAYL=0.0 - - DO L=LGS,LGE - DO J=JDS,JDE - DO I=IDS,IDE - ARRAYL(I,J,L)=ARRAYG(I,J,L) - ENDDO - ENDDO - ENDDO - -#endif - END SUBROUTINE DSTRB -! -!----------------------------------------------------------------------- diff --git a/dyn_nmm/Makefile b/dyn_nmm/Makefile deleted file mode 100644 index e68ec77849..0000000000 --- a/dyn_nmm/Makefile +++ /dev/null @@ -1,69 +0,0 @@ -# - -LN = ln -sf -MAKE = make -i -r -RM = rm -f - - -MODULES = \ - module_TIMERS.o \ - module_GWD.o \ - module_ADVECTION.o \ - module_BC_NMM.o \ - module_BNDRY_COND.o \ - module_NEST_UTIL.o \ - module_CTLBLK.o \ - module_DIFFUSION_NMM.o \ - module_NONHY_DYNAM.o \ - module_STATS_FOR_MOVE.o \ - module_MPPINIT.o \ - module_si_io_nmm.o \ - module_initialize_real.o \ - module_PRECIP_ADJUST.o \ - module_HIFREQ.o \ - module_TERRAIN.o \ - module_SMOOTH_TERRAIN.o \ - module_PHYSICS_CALLS.o \ - module_IGWAVE_ADJUST.o \ - module_membrane_mslp.o \ - module_swath.o \ - module_tracker.o \ - module_tornado_genesis.o \ - module_relax.o \ - nmm_get_cpu.o \ - $(CASE_MODULE) - -# moved into share/Makefile -# module_MPP.o \ -# module_INDX.o \ - -# possible CASE_MODULE settings -# module_initialize_tropical_cyclone.o - -OBJS = \ - init_modules_nmm.o \ - start_domain_nmm.o \ - shift_domain_nmm.o \ - solve_nmm.o \ - RDTEMP.o \ - BUCKETS.o \ - DSTRB.o \ - CLTEND.o \ - NMM_NEST_UTILS1.o - - -LIBTARGET = dyn_nmm -TARGETDIR = ./ -$(LIBTARGET) : $(MODULES) $(OBJS) - $(AR) $(ARFLAGS) ../main/$(LIBWRFLIB) $(MODULES) $(OBJS) - -include ../configure.wrf - -clean: - @ echo 'use the clean script' - -# DEPENDENCIES : only dependencies after this line (don't remove the word DEPENDENCIES) - -include depend.dyn_nmm - -# DO NOT DELETE diff --git a/dyn_nmm/NMM_NEST_UTILS1.F b/dyn_nmm/NMM_NEST_UTILS1.F deleted file mode 100644 index 654afa172e..0000000000 --- a/dyn_nmm/NMM_NEST_UTILS1.F +++ /dev/null @@ -1,4222 +0,0 @@ -#if (NMM_NEST == 1) -!=========================================================================== -! -! E-GRID NESTING UTILITIES: This is gopal's doing -! -!=========================================================================== - -SUBROUTINE med_nest_egrid_configure ( parent , nest ) - USE module_dm - USE module_domain - USE module_configure - USE module_timing - - IMPLICIT NONE - TYPE(domain) , POINTER :: parent , nest - TYPE(domain), POINTER :: grid - REAL, PARAMETER :: ERAD=6371200. - REAL, PARAMETER :: DTR=0.01745329 - REAL, PARAMETER :: DTAD=1.0 - REAL, PARAMETER :: CP=1004.6 - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE - CHARACTER(LEN=255) :: message - CHARACTER (LEN=256) :: char_junk - - INTEGER :: comzilla - - -!---------------------------------------------------------------------------- -! PURPOSE: -! - Initialize nested domain configurations including setting up -! wbd,sbd and some other variables and 1D arrays. -! - Note that in order to obtain coincident grid points, which -! is a basic requirement for RSL, WRF infrastructure, we use -! western and southern boundaries of nested domain (nest%wbd0 -! and nest%sbd0 derived from the parent domain. In this case -! the nested domain may be considered as a part of the parent -! domain with a higher resolution (telescoping ?). -! - Also note that in this case, the central lat/lons for nested -! domain should coincide with the central lat/lons of the parent, -! although the nested domain NEED NOT be located at the center of -! the domain. -!---------------------------------------------------------------------------- -! -! BASIC TEST FOR PARENT DOMAIN: CHECK IF JMAX IS ODD. SINCE JDE IN THE NAMELIST -! IS JMAX + 1, WE NEED TO CHECK IF JDE IS EVEN IN WRF CONTEXT - - IF(MOD(parent%ed32,2) .NE. 0)THEN - CALL wrf_error_fatal("PARENT DOMAIN: JMAX IS EVEN, INCREASE e_sn IN THE namelist.input BY 1") - ENDIF - -! BASIC TEST FOR NESTED DOMAIN: CHECK IF JMAX IS ODD. SINCE JDE IN THE NAMELIST -! IS JMAX + 1, WE NEED TO CHECK IF JDE IS EVEN IN WRF CONTEXT - - IF(MOD(nest%ed32,2) .NE. 0)THEN - CALL wrf_error_fatal("NESTED DOMAIN: JMAX IS EVEN, INCREASE e_sn IN THE namelist.input BY 1") - ENDIF - -! Parent grid configuration, including, western and southern boundary - - IDS = parent%sd31 - IDE = parent%ed31 - JDS = parent%sd32 - JDE = parent%ed32 - KDS = parent%sd33 - KDE = parent%ed33 - - IMS = parent%sm31 - IME = parent%em31 - JMS = parent%sm32 - JME = parent%em32 - KMS = parent%sm33 - KME = parent%em33 - - ITS = parent%sp31 - ITE = parent%ep31 - JTS = parent%sp32 - JTE = parent%ep32 - KTS = parent%sp33 - KTE = parent%ep33 - -! grid configuration - - ! calculate wbd0 and sbd0 only for MOAD i.e. grid with parent_id == 0 - if (parent%parent_id == 0 ) then ! Dusan's doing - parent%wbd0 = -(IDE-2)*parent%dx ! WBD0: in degrees;factor 2 takes care of dummy last column - parent%sbd0 = -((JDE-1)/2)*parent%dy ! SBD0: in degrees; note that JDE-1 should be odd - parent%wbd0var = parent%wbd0 - parent%sbd0var = parent%sbd0 - end if - nest%wbd0 = parent%wbd0 + (nest%i_parent_start-1)*2.*parent%dx + mod(nest%j_parent_start+1,2)*parent%dx - nest%sbd0 = parent%sbd0 + (nest%j_parent_start-1)*parent%dy - nest%wbd0var = nest%wbd0 - nest%sbd0var = nest%sbd0 - nest%dx = parent%dx/nest%parent_grid_ratio - nest%dy = parent%dy/nest%parent_grid_ratio - - write(message,*)" - nest%id = ",nest%id - CALL wrf_message(trim(message)) - write(message,*)" - parent%id = ",nest%id - CALL wrf_message(trim(message)) - write(message,*)" - i_parent_start = ",nest%i_parent_start - CALL wrf_message(trim(message)) - write(message,*)" - j_parent_start = ",nest%j_parent_start - CALL wrf_message(trim(message)) - write(message,*)" - parent%wbd0 = ",parent%wbd0 - CALL wrf_message(trim(message)) - write(message,*)" - parent%sbd0 = ",parent%sbd0 - CALL wrf_message(trim(message)) - write(message,*)" - nest%wbd0 = ",nest%wbd0 - CALL wrf_message(trim(message)) - write(message,*)" - nest%sbd0 = ",nest%sbd0 - CALL wrf_message(trim(message)) - write(message,*)" - nest%dx = ",nest%dx - CALL wrf_message(trim(message)) - write(message,*)" - nest%dy = ",nest%dy - CALL wrf_message(trim(message)) -! - CALL nl_set_dx (nest%id , nest%dx) ! for output purpose - CALL nl_set_dy (nest%id , nest%dy) ! for output purpose - -! set lat-lons; parent set to nested domain - - CALL nl_get_cen_lat (parent%id, parent%cen_lat) ! cen_lat of parent set to nested domain - CALL nl_get_cen_lon (parent%id, parent%cen_lon) ! cen_lon of parent set to nested domain - - IF ( parent%active_this_task .AND. nest%active_this_task ) THEN - nest%cen_lat=parent%cen_lat - nest%cen_lon=parent%cen_lon -! - CALL nl_set_cen_lat ( nest%id , nest%cen_lat) ! for output purpose - CALL nl_set_cen_lon ( nest%id , nest%cen_lon) ! for output purpose - - - -! soil configuration - -#if ( HWRF == 1 ) -!zhang - if ( .not.nest%analysis ) then -#endif - nest%sldpth = parent%sldpth - nest%dzsoil = parent%dzsoil - nest%rtdpth = parent%rtdpth -#if ( HWRF == 1 ) - endif -#endif - -! numerical set up - - nest%deta = parent%deta - nest%aeta = parent%aeta - nest%etax = parent%etax - nest%dfl = parent%dfl - nest%deta1 = parent%deta1 - nest%aeta1 = parent%aeta1 - nest%eta1 = parent%eta1 - nest%deta2 = parent%deta2 - nest%aeta2 = parent%aeta2 - nest%eta2 = parent%eta2 - nest%pdtop = parent%pdtop - nest%pt = parent%pt - nest%dfrlg = parent%dfrlg - nest%num_soil_layers = parent%num_soil_layers - nest%num_moves = parent%num_moves - -! Unfortunately, some of the single value constants in used in module_initialize have -! to be defiend here instead of the usual spot in med_initialize_nest_nmm. There -! appears to be a problem in Registry and related code in this area. -! -! state logical upstrm - dyn_nmm - - - - - - nest%dlmd = nest%dx - nest%dphd = nest%dy - nest%dy_nmm = erad*(nest%dphd*dtr) - nest%cpgfv = -nest%dt/(48.*nest%dy_nmm) - nest%en = nest%dt/( 4.*nest%dy_nmm)*dtad - nest%ent = nest%dt/(16.*nest%dy_nmm)*dtad - nest%f4d = -.5*nest%dt*dtad - nest%f4q = -nest%dt*dtad - nest%ef4t = .5*nest%dt/cp - -! Other output configurations that will make grads happy - - CALL nl_get_truelat1 (parent%id, parent%truelat1 ) - CALL nl_get_truelat2 (parent%id, parent%truelat2 ) -#if ( HWRF == 1 ) -! bao : to make the restart output identical at the restart initial time for stand_lon - CALL nl_get_stand_lon (parent%id, parent%stand_lon ) -#endif - CALL nl_get_map_proj (parent%id, parent%map_proj ) - CALL nl_get_iswater (parent%id, parent%iswater ) - - nest%truelat1=parent%truelat1 - nest%truelat2=parent%truelat2 -!bao - nest%stand_lon=parent%stand_lon -!bao - nest%map_proj=parent%map_proj - nest%iswater=parent%iswater - - CALL nl_set_truelat1(nest%id, nest%truelat1) - CALL nl_set_truelat2(nest%id, nest%truelat2) -!bao - CALL nl_set_stand_lon(nest%id, nest%stand_lon) -!bao - CALL nl_set_map_proj(nest%id, nest%map_proj) - CALL nl_set_iswater(nest%id, nest%iswater) - - CALL nl_get_mminlu ( 1, char_junk ) - IF ( nest%id .GT. 1 ) THEN - CALL nl_set_mminlu ( nest%id, char_junk ) - ENDIF - - ENDIF -!!!!!!!!!!!!! -! handle case where task computes parent or nest but not both (case of both is handled above) - IF ( parent%active_this_task .OR. nest%active_this_task ) THEN - IF ( parent%active_this_task ) THEN - comzilla = mpi_comm_to_kid( which_kid( nest%id ) , parent%id ) -!debug write(0,*)__FILE__,__LINE__,'Patt: mpi_comm_to_kid ',comzilla,which_kid( nest%id ) ,nest%id, parent%id - grid => parent - ELSE - comzilla = mpi_comm_to_mom( nest%id ) -!debug write(0,*)__FILE__,__LINE__,'Natt: mpi_comm_to_mom ',comzilla,nest%id - grid => nest - ENDIF - -#define BCAST_RARRAY(X) BYTE_BCAST( X, size(X)*RWORDSIZE, comzilla ) -! soil configuration -#if ( HWRF == 1 ) -!zhang - if ( .not.nest%analysis ) then -#endif - CALL BCAST_RARRAY( grid%sldpth ) ! nest%sldpth = parent%sldpth - CALL BCAST_RARRAY( grid%dzsoil ) ! nest%dzsoil = parent%dzsoil - CALL BCAST_RARRAY( grid%rtdpth ) ! nest%rtdpth = parent%rtdpth -#if ( HWRF == 1 ) - endif -#endif - - IF ( parent%active_this_task ) THEN - CALL nl_get_mminlu ( 1, char_junk ) - ENDIF - CALL wrf_dm_bcast_string_comm( char_junk, LEN(char_junk),comzilla) ! nest%mminlu = trim(parent%mminlu) - IF ( nest%active_this_task .AND. nest%id .GT. 1 ) THEN - CALL nl_set_mminlu ( nest%id, char_junk ) - ENDIF - -! numerical set up - - CALL BYTE_BCAST( grid%cen_lat, RWORDSIZE, comzilla ) ! - CALL BYTE_BCAST( grid%cen_lon, RWORDSIZE, comzilla ) ! - CALL nl_set_cen_lat ( nest%id , nest%cen_lat) ! for output purpose - CALL nl_set_cen_lon ( nest%id , nest%cen_lon) ! for output purpose - ! "For output purposes" is not entirely true, because - ! the central lat (parent) is needed in the call to EARTH_LATLON - ! but it is derived (read from the input) so if this task isn't active - ! on the parent, it won't know it, so set it here. - ! Other way to have done this would have been to pass the nested cen_lat/lon - ! into EARTH_LATLON instead of the parent's. Flipped a coin. - IF ( .NOT. parent%active_this_task ) THEN - CALL nl_set_cen_lat ( parent%id , nest%cen_lat) ! for output purpose - CALL nl_set_cen_lon ( parent%id , nest%cen_lon) ! for output purpose - ENDIF - - IF ( nest%active_this_task ) THEN - write(message,*)" - nest%cen_lat = ",nest%cen_lat - CALL wrf_message(trim(message)) - write(message,*)" - nest%cen_lon = ",nest%cen_lon - CALL wrf_message(trim(message)) - ENDIF - - CALL BYTE_BCAST( grid%truelat1, RWORDSIZE, comzilla ) ! - CALL BYTE_BCAST( grid%truelat2, RWORDSIZE, comzilla ) ! - CALL nl_set_truelat1(nest%id, nest%truelat1) - CALL nl_set_truelat2(nest%id, nest%truelat2) - - CALL BYTE_BCAST( grid%stand_lon, RWORDSIZE, comzilla ) ! - CALL nl_set_stand_lon(nest%id, nest%stand_lon) - - CALL BYTE_BCAST( grid%map_proj, IWORDSIZE, comzilla ) ! - CALL BYTE_BCAST( grid%iswater, IWORDSIZE, comzilla ) ! - CALL nl_set_map_proj(nest%id, nest%map_proj) - CALL nl_set_iswater(nest%id, nest%iswater) - - CALL BCAST_RARRAY( grid%deta ) ! nest%deta = parent%deta - CALL BCAST_RARRAY( grid%aeta ) ! nest%aeta = parent%aeta - CALL BCAST_RARRAY( grid%etax ) ! nest%etax = parent%etax - CALL BCAST_RARRAY( grid%dfl ) ! nest%dfl = parent%dfl - CALL BCAST_RARRAY( grid%deta1 ) ! nest%deta1 = parent%deta1 - CALL BCAST_RARRAY( grid%aeta1 ) ! nest%aeta1 = parent%aeta1 - CALL BCAST_RARRAY( grid%eta1 ) ! nest%eta1 = parent%eta1 - CALL BCAST_RARRAY( grid%deta2 ) ! nest%deta2 = parent%deta2 - CALL BCAST_RARRAY( grid%aeta2 ) ! nest%aeta2 = parent%aeta2 - CALL BCAST_RARRAY( grid%eta2 ) ! nest%eta2 = parent%eta2 - CALL BYTE_BCAST( grid%pdtop, RWORDSIZE, comzilla ) ! nest%pdtop = parent%pdtop - CALL BYTE_BCAST( grid%pt, RWORDSIZE, comzilla ) ! nest%pt = parent%pt - CALL BYTE_BCAST( grid%dfrlg, RWORDSIZE, comzilla ) ! nest%dfrlg = parent%dfrlg - CALL BYTE_BCAST( grid%num_soil_layers, IWORDSIZE, comzilla ) ! nest%num_soil_layers = parent%num_soil_layers - CALL BYTE_BCAST( grid%num_moves, IWORDSIZE, comzilla ) ! nest%num_moves = parent%num_moves - -! Unfortunately, some of the single value constants in used in module_initialize have -! to be defiend here instead of the usual spot in med_initialize_nest_nmm. There -! appears to be a problem in Registry and related code in this area. -! -! state logical upstrm - dyn_nmm - - - - - ENDIF - - IF ( nest%active_this_task ) THEN - - nest%dlmd = nest%dx - nest%dphd = nest%dy - nest%dy_nmm = erad*(nest%dphd*dtr) - nest%cpgfv = -nest%dt/(48.*nest%dy_nmm) - nest%en = nest%dt/( 4.*nest%dy_nmm)*dtad - nest%ent = nest%dt/(16.*nest%dy_nmm)*dtad - nest%f4d = -.5*nest%dt*dtad - nest%f4q = -nest%dt*dtad - nest%ef4t = .5*nest%dt/cp - - ENDIF - - -! physics and other configurations -! CALL nl_get_iswater (parent%id, nest%iswater) ! iswater is just based on parents -! CALL nl_get_bl_surface_physics (nest%id, nest%bl_surface_physics ) -! CALL nl_get_num_soil_layers( parent%num_soil_layers ) -! CALL nl_get_real_data_init_type (parent%real_data_init_type) - -END SUBROUTINE med_nest_egrid_configure - -SUBROUTINE med_construct_egrid_weights ( parent , nest ) - USE module_dm - USE module_domain - USE module_configure - USE module_timing - - IMPLICIT NONE - TYPE(domain) , POINTER :: parent , nest - TYPE(domain), POINTER :: grid - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER :: I,J,II,JJ,NII,NJJ - REAL :: parent_CLAT,parent_CLON,parent_WBD,parent_SBD,parent_DLMD,parent_DPHD - REAL :: nest_WBD,nest_SBD,nest_DLMD,nest_DPHD - REAL :: SW_LATD,SW_LOND - REAL :: ADDSUM1,ADDSUM2 - REAL :: xr,zr,xc - INTEGER :: comzilla -!----------------------------------------------------------------------------------------------------------- -! PURPOSE: -! - Initialize lat-lons and determine weights -! -!---------------------------------------------------------------------------------------------------------- - -! First obtain central latitude and longitude for the parent domain - - IF ( parent%active_this_task .OR. nest%active_this_task ) THEN - IF ( parent%active_this_task ) THEN - comzilla = mpi_comm_to_kid( which_kid( nest%id ) , parent%id ) - grid => parent - ELSE - comzilla = mpi_comm_to_mom( nest%id ) - grid => nest - ENDIF - ENDIF - - CALL nl_get_cen_lat (parent%ID, parent_CLAT) - CALL nl_get_cen_lon (parent%ID, parent_CLON) - -! Parent grid configuration, including, western and southern boundary - - IDS = parent%sd31 - IDE = parent%ed31 - JDS = parent%sd32 - JDE = parent%ed32 - KDS = parent%sd33 - KDE = parent%ed33 - - IMS = parent%sm31 - IME = parent%em31 - JMS = parent%sm32 - JME = parent%em32 - KMS = parent%sm33 - KME = parent%em33 - - ITS = parent%sp31 - ITE = parent%ep31 - JTS = parent%sp32 - JTE = parent%ep32 - KTS = parent%sp33 - KTE = parent%ep33 -! - parent_DLMD = parent%dx ! DLMD: dlamda in degrees - parent_DPHD = parent%dy ! DPHD: dphi in degrees - parent_WBD = parent%wbd0 - parent_SBD = parent%sbd0 - -! Now compute Geodetic lat/lon (Positive East) of parent grid in degrees - - IF ( parent%active_this_task ) THEN - - CALL EARTH_LATLON ( parent%HLAT,parent%HLON,parent%VLAT,parent%VLON, & !output - parent_DLMD,parent_DPHD,parent_WBD,parent_SBD, & !inputs - parent_CLAT,parent_CLON, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - ENDIF - -! Nested grid configuration, including, western and southern boundary - - IDS = nest%sd31 - IDE = nest%ed31 - JDS = nest%sd32 - JDE = nest%ed32 - KDS = nest%sd33 - KDE = nest%ed33 - - IMS = nest%sm31 - IME = nest%em31 - JMS = nest%sm32 - JME = nest%em32 - KMS = nest%sm33 - KME = nest%em33 - - ITS = nest%sp31 - ITE = nest%ep31 - JTS = nest%sp32 - JTE = nest%ep32 - KTS = nest%sp33 - KTE = nest%ep33 -! - nest_DLMD = nest%dx - nest_DPHD = nest%dy - nest_WBD = nest%wbd0 - nest_SBD = nest%sbd0 - -! -! Now compute Geodetic lat/lon (Positive East) of nest in degrees, with the same central lat-lon -! as the parent grid -! - - IF ( nest%active_this_task ) THEN - CALL EARTH_LATLON ( nest%HLAT,nest%HLON,nest%VLAT,nest%VLON, & ! output - nest_DLMD,nest_DPHD,nest_WBD,nest_SBD, & ! nest inputs - parent_CLAT,parent_CLON, & ! parent central lat/lon - IDS,IDE,JDS,JDE,KDS,KDE, & ! nested domain dimension - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - -! Determine the weights of nested grid h points nearest to H points of parent domain - - if(nest%vortex_tracker /= 1) then - CALL G2T2H_new( nest%IIH,nest%JJH, & ! output grid index in parent grid - nest%HBWGT1,nest%HBWGT2, & ! output weights in terms of parent grid - nest%HBWGT3,nest%HBWGT4, & - nest%I_PARENT_START,nest%J_PARENT_START, & ! nest start I, J in parent domain - 3, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - else - CALL G2T2H( nest%IIH,nest%JJH, & ! output grid index on nested grid - nest%HBWGT1,nest%HBWGT2, & ! output weights on the nested grid - nest%HBWGT3,nest%HBWGT4, & - nest%HLAT,nest%HLON, & ! target (nest) input lat lon in degrees - parent_DLMD,parent_DPHD,parent_WBD,parent_SBD, & ! parent res, western and south boundaries - parent_CLAT,parent_CLON, & ! parent central lat,lon, all in degrees - parent%ed31,parent%ed32, & ! parent imax and jmax - IDS,IDE,JDS,JDE,KDS,KDE, & ! - IMS,IME,JMS,JME,KMS,KME, & ! nested grid configuration - ITS,ITE,JTS,JTE,KTS,KTE ) ! - endif - - -! Determine the weights of nested grid v points nearest to V points of parent domain - - if(nest%vortex_tracker /= 1) then - CALL G2T2V_new( nest%IIV,nest%JJV, & ! output grid index in parent grid - nest%VBWGT1,nest%VBWGT2, & ! output weights in terms of parent grid - nest%VBWGT3,nest%VBWGT4, & - nest%I_PARENT_START,nest%J_PARENT_START, & ! nest start I, J in parent domain - 3, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - else - CALL G2T2V( nest%IIV,nest%JJV, & ! output grid index on nested grid - nest%VBWGT1,nest%VBWGT2, & ! output weights on the nested grid - nest%VBWGT3,nest%VBWGT4, & - nest%VLAT,nest%VLON, & ! target (nest) input lat lon in degrees - parent_DLMD,parent_DPHD,parent_WBD,parent_SBD, & ! parent res, western and south boundaries - parent_CLAT,parent_CLON, & ! parent central lat,lon, all in degrees - parent%ed31,parent%ed32, & ! parent imax and jmax - IDS,IDE,JDS,JDE,KDS,KDE, & ! - IMS,IME,JMS,JME,KMS,KME, & ! nested grid configuration - ITS,ITE,JTS,JTE,KTS,KTE ) ! - endif - -! Generate nearest neighbor information for parent->nest nearest -! neighbor interpolation: - call INIT_HNEAR(nest%iih, nest%jjh, nest%hbwgt1, nest%hbwgt2, & - nest%hbwgt3, nest%hbwgt4, & - nest%hnear_i, nest%hnear_j, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - - -!*** CHECK WEIGHTS AT MASS AND VELOCITY POINTS - - CALL WEIGTS_CHECK(nest%HBWGT1,nest%HBWGT2, & ! output weights on the nested grid - nest%HBWGT3,nest%HBWGT4, & - nest%VBWGT1,nest%VBWGT2, & ! output weights on the nested grid - nest%VBWGT3,nest%VBWGT4, & - IDS,IDE,JDS,JDE,KDS,KDE, & ! - IMS,IME,JMS,JME,KMS,KME, & ! nested grid configuration - ITS,ITE,JTS,JTE,KTS,KTE ) - -!*** CHECK DOMAIN BOUNDS BEFORE PROCEEDING TO INTERPOLATION -! - CALL BOUNDS_CHECK( nest%IIH,nest%JJH,nest%IIV,nest%JJV, & - nest%i_parent_start,nest%j_parent_start,nest%shw, & - IDS,IDE,JDS,JDE,KDS,KDE, & ! - IMS,IME,JMS,JME,KMS,KME, & ! nested grid configuration - ITS,ITE,JTS,JTE,KTS,KTE ) - ENDIF - -!------------------------------------------------------------------------------------------ - -END SUBROUTINE med_construct_egrid_weights - -SUBROUTINE med_set_egrid_locs ( parent , nest ) - USE module_domain - USE module_configure - USE module_timing - - IMPLICIT NONE - TYPE(domain) :: parent , nest - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER :: I,J,II,JJ,NII,NJJ - REAL :: parent_CLAT,parent_CLON,parent_WBD,parent_SBD,parent_DLMD,parent_DPHD - REAL :: nest_WBD,nest_SBD,nest_DLMD,nest_DPHD - REAL :: SW_LATD,SW_LOND - REAL :: ADDSUM1,ADDSUM2 - REAL :: xr,zr,xc -character*255 :: message -!----------------------------------------------------------------------------------------------------------- -! PURPOSE: -! - Initialize lat-lons and determine weights -! -!---------------------------------------------------------------------------------------------------------- - -! First obtain central latitude and longitude for the parent domain - - CALL nl_get_cen_lat (parent%ID, parent_CLAT) - CALL nl_get_cen_lon (parent%ID, parent_CLON) - -! Parent grid configuration, including, western and southern boundary - - IDS = parent%sd31 - IDE = parent%ed31 - JDS = parent%sd32 - JDE = parent%ed32 - KDS = parent%sd33 - KDE = parent%ed33 - - IMS = parent%sm31 - IME = parent%em31 - JMS = parent%sm32 - JME = parent%em32 - KMS = parent%sm33 - KME = parent%em33 - - ITS = parent%sp31 - ITE = parent%ep31 - JTS = parent%sp32 - JTE = parent%ep32 - KTS = parent%sp33 - KTE = parent%ep33 -! - parent_DLMD = parent%dx ! DLMD: dlamda in degrees - parent_DPHD = parent%dy ! DPHD: dphi in degrees - parent_WBD = parent%wbd0 - parent_SBD = parent%sbd0 - -! Now compute Geodetic lat/lon (Positive East) of parent grid in degrees - - IF ( parent%active_this_task ) THEN - - CALL EARTH_LATLON ( parent%HLAT,parent%HLON,parent%VLAT,parent%VLON, & !output - parent_DLMD,parent_DPHD,parent_WBD,parent_SBD, & !inputs - parent_CLAT,parent_CLON, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - ENDIF - - if(nest%id == parent%id) return ! nothing more to do; same data structure - -! Nested grid configuration, including, western and southern boundary - - IDS = nest%sd31 - IDE = nest%ed31 - JDS = nest%sd32 - JDE = nest%ed32 - KDS = nest%sd33 - KDE = nest%ed33 - - IMS = nest%sm31 - IME = nest%em31 - JMS = nest%sm32 - JME = nest%em32 - KMS = nest%sm33 - KME = nest%em33 - - ITS = nest%sp31 - ITE = nest%ep31 - JTS = nest%sp32 - JTE = nest%ep32 - KTS = nest%sp33 - KTE = nest%ep33 -! - nest_DLMD = nest%dx - nest_DPHD = nest%dy - nest_WBD = nest%wbd0 - nest_SBD = nest%sbd0 - -! -! Now compute Geodetic lat/lon (Positive East) of nest in degrees, with the same central lat-lon -! as the parent grid -! - - IF ( nest%active_this_task ) THEN - - CALL EARTH_LATLON ( nest%HLAT,nest%HLON,nest%VLAT,nest%VLON, & ! output - nest_DLMD,nest_DPHD,nest_WBD,nest_SBD, & ! nest inputs - parent_CLAT,parent_CLON, & ! parent central lat/lon - IDS,IDE,JDS,JDE,KDS,KDE, & ! nested domain dimension - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - ENDIF - end SUBROUTINE med_set_egrid_locs -!====================================================================================== -! -! compute earth lat-lons for parent and the nest before interpolations -!------------------------------------------------------------------------------ - -SUBROUTINE EARTH_LATLON ( HLAT,HLON,VLAT,VLON, & !Earth lat,lon at H and V points - DLMD1,DPHD1,WBD1,SBD1, & !input res,west & south boundaries, - CENTRAL_LAT,CENTRAL_LON, & ! central lat,lon, all in degrees - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) -!============================================================================ -! - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - REAL, INTENT(IN ) :: DLMD1,DPHD1,WBD1,SBD1 - REAL, INTENT(IN ) :: CENTRAL_LAT,CENTRAL_LON - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HLAT,HLON,VLAT,VLON - -! local - - - INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13) - INTEGER :: I,J - REAL(KIND=KNUM) :: WB,SB,DLM,DPH,TPH0,STPH0,CTPH0 - REAL(KIND=KNUM) :: TDLM,TDPH,TLMH,TLMV,TLMH0,TLMV0,TPHH,TPHV,DTR - REAL(KIND=KNUM) :: STPH,CTPH,STPV,CTPV,PI_2 - REAL(KIND=KNUM) :: SPHH,CLMH,FACTH,SPHV,CLMV,FACTV - REAL(KIND=KNUM), DIMENSION(IMS:IME,JMS:JME) :: GLATH,GLONH,GLATV,GLONV - REAL(KIND=KNUM) :: DLMD8,DPHD8,WBD8,SBD8,CLAT8,CLON8 - REAL(KIND=KNUM) :: CPHH, CPHV -!------------------------------------------------------------------------- - DLMD8=DLMD1 - DPHD8=DPHD1 - WBD8=WBD1 - SBD8=SBD1 - CLAT8=CENTRAL_LAT - CLON8=CENTRAL_LON -! - PI_2 = ACOS(0.) - DTR = PI_2/90. - WB = WBD8 * DTR ! WB: western boundary in radians - SB = SBD8 * DTR ! SB: southern boundary in radians - DLM = DLMD8 * DTR ! DLM: dlamda in radians - DPH = DPHD8 * DTR ! DPH: dphi in radians - TDLM = DLM + DLM ! TDLM: 2.0*dlamda - TDPH = DPH + DPH ! TDPH: 2.0*DPH - -! For earth lat lon only - - TPH0 = CLAT8*DTR ! TPH0: central lat in radians - STPH0 = SIN(TPH0) - CTPH0 = COS(TPH0) - - ! .H - DO J = JTS,MIN(JTE,JDE-1) ! H./ This loop takes care of zig-zag -! ! \.H starting points along j - TLMH0 = WB - TDLM + MOD(J+1,2) * DLM ! ./ TLMH (rotated lats at H points) - TLMV0 = WB - TDLM + MOD(J,2) * DLM ! H (//ly for V points) - TPHH = SB + (J-1)*DPH ! TPHH (rotated lons at H points) are simple trans. - TPHV = TPHH ! TPHV (rotated lons at V points) are simple trans. - STPH = SIN(TPHH) - CTPH = COS(TPHH) - STPV = SIN(TPHV) - CTPV = COS(TPHV) - ! .H - DO I = ITS,MIN(ITE,IDE-1) ! / - TLMH = TLMH0 + I*TDLM ! \.H .U .H -! !H./ ----><---- - SPHH = CTPH0 * STPH + STPH0 * CTPH * COS(TLMH) ! DLM + DLM - CPHH = sqrt(1-SPHH**2) - GLATH(I,J)=ASIN(SPHH) ! GLATH: Earth Lat in radians - !CLMH = CTPH*COS(TLMH)/(COS(GLATH(I,J))*CTPH0) & - ! - TAN(GLATH(I,J))*TAN(TPH0) - CLMH = (CTPH*COS(TLMH)-SPHH*STPH0) / (CPHH*CTPH0) - IF(CLMH .GT. 1.) CLMH = 1.0 - IF(CLMH .LT. -1.) CLMH = -1.0 - FACTH = 1. - IF(TLMH .GT. 0.) FACTH = -1. - GLONH(I,J) = -CLON8*DTR + FACTH*ACOS(CLMH) - - ENDDO - - DO I = ITS,MIN(ITE,IDE-1) - TLMV = TLMV0 + I*TDLM - SPHV = CTPH0 * STPV + STPH0 * CTPV * COS(TLMV) - CPHV = sqrt(1-SPHV**2) - GLATV(I,J) = ASIN(SPHV) - !CLMV = CTPV*COS(TLMV)/(COS(GLATV(I,J))*CTPH0) & - ! - TAN(GLATV(I,J))*TAN(TPH0) - CLMV = (CTPV*COS(TLMV)-SPHV*STPH0) / (CPHV*CTPH0) - IF(CLMV .GT. 1.) CLMV = 1. - IF(CLMV .LT. -1.) CLMV = -1. - FACTV = 1. - IF(TLMV .GT. 0.) FACTV = -1. - GLONV(I,J) = -CLON8*DTR + FACTV*ACOS(CLMV) - - ENDDO - - ENDDO - -! Conversion to degrees (may not be required, eventually) - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - HLAT(I,J) = GLATH(I,J) / DTR - HLON(I,J)= -GLONH(I,J)/DTR - IF(HLON(I,J) .GT. 180.) HLON(I,J) = HLON(I,J) - 360. - IF(HLON(I,J) .LT. -180.) HLON(I,J) = HLON(I,J) + 360. -! - VLAT(I,J) = GLATV(I,J) / DTR - VLON(I,J) = -GLONV(I,J) / DTR - IF(VLON(I,J) .GT. 180.) VLON(I,J) = VLON(I,J) - 360. - IF(VLON(I,J) .LT. -180.) VLON(I,J) = VLON(I,J) + 360. - - ENDDO - ENDDO - -END SUBROUTINE EARTH_LATLON - -!----------------------------------------------------------------------------- -SUBROUTINE EARTH_LATLON_r8 ( HLAT,HLON,VLAT,VLON, & !Earth lat,lon at H and V points - DLMD1,DPHD1,WBD1,SBD1, & !input res,west & south boundaries, - CENTRAL_LAT,CENTRAL_LON, & ! central lat,lon, all in degrees - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) -!============================================================================ -! - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13) - REAL, INTENT(IN ) :: DLMD1,DPHD1,WBD1,SBD1 - REAL, INTENT(IN ) :: CENTRAL_LAT,CENTRAL_LON - REAL(KIND=KNUM), DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HLAT,HLON,VLAT,VLON - -! local - - - INTEGER :: I,J - REAL(KIND=KNUM) :: WB,SB,DLM,DPH,TPH0,STPH0,CTPH0 - REAL(KIND=KNUM) :: TDLM,TDPH,TLMH,TLMV,TLMH0,TLMV0,TPHH,TPHV,DTR - REAL(KIND=KNUM) :: STPH,CTPH,STPV,CTPV,PI_2 - REAL(KIND=KNUM) :: SPHH,CLMH,FACTH,SPHV,CLMV,FACTV - REAL(KIND=KNUM), DIMENSION(IMS:IME,JMS:JME) :: GLATH,GLONH,GLATV,GLONV - REAL(KIND=KNUM) :: DLMD8,DPHD8,WBD8,SBD8,CLAT8,CLON8 - REAL(KIND=KNUM) :: CPHH, CPHV -!------------------------------------------------------------------------- - DLMD8=DLMD1 - DPHD8=DPHD1 - WBD8=WBD1 - SBD8=SBD1 - CLAT8=CENTRAL_LAT - CLON8=CENTRAL_LON -! - PI_2 = DACOS(0.D0) - DTR = PI_2/90.D0 - WB = WBD8 * DTR ! WB: western boundary in radians - SB = SBD8 * DTR ! SB: southern boundary in radians - DLM = DLMD8 * DTR ! DLM: dlamda in radians - DPH = DPHD8 * DTR ! DPH: dphi in radians - TDLM = DLM + DLM ! TDLM: 2.0*dlamda - TDPH = DPH + DPH ! TDPH: 2.0*DPH - -! For earth lat lon only - - TPH0 = CLAT8*DTR ! TPH0: central lat in radians - STPH0 = DSIN(TPH0) - CTPH0 = DCOS(TPH0) - - ! .H - DO J = JTS,MIN(JTE,JDE-1) ! H./ This loop takes care of zig-zag -! ! \.H starting points along j - TLMH0 = WB - TDLM + MOD(J+1,2) * DLM ! ./ TLMH (rotated lats at H points) - TLMV0 = WB - TDLM + MOD(J,2) * DLM ! H (//ly for V points) - TPHH = SB + (J-1)*DPH ! TPHH (rotated lons at H points) are simple trans. - TPHV = TPHH ! TPHV (rotated lons at V points) are simple trans. - STPH = DSIN(TPHH) - CTPH = DCOS(TPHH) - STPV = DSIN(TPHV) - CTPV = COS(TPHV) - ! .H - DO I = ITS,MIN(ITE,IDE-1) ! / - TLMH = TLMH0 + I*TDLM ! \.H .U .H -! !H./ ----><---- - SPHH = CTPH0 * STPH + STPH0 * CTPH * COS(TLMH) ! DLM + DLM - CPHH = dsqrt(1-SPHH**2) - GLATH(I,J)=DASIN(SPHH) ! GLATH: Earth Lat in radians - !CLMH = CTPH*COS(TLMH)/(COS(GLATH(I,J))*CTPH0) & - ! - TAN(GLATH(I,J))*TAN(TPH0) - CLMH = (CTPH*DCOS(TLMH)-SPHH*STPH0) / (CPHH*CTPH0) - IF(CLMH .GT. 1.D0) CLMH = 1.0D0 - IF(CLMH .LT. -1.D0) CLMH = -1.0D0 - FACTH = 1. - IF(TLMH .GT. 0.) FACTH = -1.D0 - GLONH(I,J) = -CLON8*DTR + FACTH*DACOS(CLMH) - - ENDDO - - DO I = ITS,MIN(ITE,IDE-1) - TLMV = TLMV0 + I*TDLM - SPHV = CTPH0 * STPV + STPH0 * CTPV * DCOS(TLMV) - CPHV = dsqrt(1.D0-SPHV**2) - GLATV(I,J) = DASIN(SPHV) - !CLMV = CTPV*COS(TLMV)/(COS(GLATV(I,J))*CTPH0) & - ! - TAN(GLATV(I,J))*TAN(TPH0) - CLMV = (CTPV*DCOS(TLMV)-SPHV*STPH0) / (CPHV*CTPH0) - IF(CLMV .GT. 1.D0) CLMV = 1.D0 - IF(CLMV .LT. -1.D0) CLMV = -1.D0 - FACTV = 1.D0 - IF(TLMV .GT. 0.D0) FACTV = -1.D0 - GLONV(I,J) = -CLON8*DTR + FACTV*DACOS(CLMV) - - ENDDO - - ENDDO - -! Conversion to degrees (may not be required, eventually) - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - HLAT(I,J) = GLATH(I,J) / DTR - HLON(I,J)= -GLONH(I,J)/DTR - IF(HLON(I,J) .GT. 180.D0) HLON(I,J) = HLON(I,J) - 360.D0 - IF(HLON(I,J) .LT. -180.D0) HLON(I,J) = HLON(I,J) + 360.D0 -! - VLAT(I,J) = GLATV(I,J) / DTR - VLON(I,J) = -GLONV(I,J) / DTR - IF(VLON(I,J) .GT. 180.D0) VLON(I,J) = VLON(I,J) - 360.D0 - IF(VLON(I,J) .LT. -180.D0) VLON(I,J) = VLON(I,J) + 360.D0 - - ENDDO - ENDDO - -END SUBROUTINE EARTH_LATLON_r8 - -subroutine init_hnear(iih,jjh,hbwgt1,hbwgt2,hbwgt3,hbwgt4, & - hnear_i,hnear_j, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - implicit none - integer, intent(in) :: ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte, & - iih(ims:ime,jms:jme), jjh(ims:ime,jms:jme) - integer, dimension(ims:ime,jms:jme), intent(out) :: hnear_i,hnear_j - real, dimension(ims:ime,jms:jme), intent(in) :: hbwgt1, hbwgt2, hbwgt3, hbwgt4 - - integer :: i,j,iweight,a - real :: rweight - - do j=jts,min(jte,jde-1) - do i=its,min(ite,ide-1) - a=1-mod(JJH(i,j),2) - - iweight=1 - rweight=hbwgt1(i,j) - - if(hbwgt2(i,j)>rweight) then - iweight=2 ; rweight=hbwgt2(i,j) - endif - - if(hbwgt3(i,j)>rweight) then - iweight=3 ; rweight=hbwgt3(i,j) - endif - - if(hbwgt4(i,j)>rweight) then - iweight=4 - endif - - select case(iweight) - case(1) - hnear_i(i,j)=IIH(I,J) ; hnear_j(i,j)=JJH(I,J) - case(2) - hnear_i(i,j)=IIH(I,J)+1 ; hnear_j(i,j)=JJH(I,J) - case(3) - hnear_i(i,j)=IIH(I,J)+a ; hnear_j(i,j)=JJH(I,J)-1 - case default ! case(4) - hnear_i(i,j)=IIH(I,J)+a ; hnear_j(i,j)=JJH(I,J)+1 - end select - enddo - enddo -end subroutine init_hnear - -!----------------------------------------------------------------------------- - - SUBROUTINE G2T2H( IIH,JJH, & ! output grid index and weights - HBWGT1,HBWGT2, & ! output weights in terms of parent grid - HBWGT3,HBWGT4, & - HLAT,HLON, & ! target (nest) input lat lon in degrees - DLMD1,DPHD1,WBD1,SBD1, & ! parent res, west and south boundaries - CENTRAL_LAT,CENTRAL_LON, & ! parent central lat,lon, all in degrees - P_IDE,P_JDE, & ! parent imax and jmax - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dIMEnsions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - -! -!*** Tom Black - Initial Version -!*** Gopal - Revised Version for WRF (includes coincident grid points) -!*** -!*** GIVEN PARENT CENTRAL LAT-LONS, RESOLUTION AND WESTERN AND SOUTHERN BOUNDARY, -!*** AND THE NESTED GRID LAT-LONS AT H POINTS, THIS ROUTINE FIRST LOCATES THE -!*** INDICES,IIH,JJH, OF THE PARENT DOMAIN'S H POINTS THAT LIES CLOSEST TO THE -!*** h POINTS OF THE NESTED DOMAIN -! -!============================================================================ -! - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: P_IDE,P_JDE - REAL, INTENT(IN ) :: DLMD1,DPHD1,WBD1,SBD1 - REAL, INTENT(IN ) :: CENTRAL_LAT,CENTRAL_LON - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: HLAT,HLON - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH - -! local - - INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13) - INTEGER :: IMT,JMT,N2R,MK,K,I,J,DSLP0,DSLOPE - INTEGER :: NROW,NCOL,KROWS - REAL(KIND=KNUM) :: X,Y,Z,TLAT,TLON - REAL(KIND=KNUM) :: PI_2,D2R,R2D,GLAT,GLON,DPH,DLM,TPH0,TLM0,WB,SB - REAL(KIND=KNUM) :: ROW,COL,SLP0,TLATHC,TLONHC,DENOM,SLOPE - REAL(KIND=KNUM) :: TLAT1,TLAT2,TLON1,TLON2,DLM1,DLM2,DLM3,DLM4,D1,D2 - REAL(KIND=KNUM) :: DLA1,DLA2,DLA3,DLA4,S1,R1,DS1,AN1,AN2,AN3 ! Q - REAL(KIND=KNUM) :: DL1,DL2,DL3,DL4,DL1I,DL2I,DL3I,DL4I,SUMDL,TLONO,TLATO - REAL(KIND=KNUM) :: DTEMP - REAL , DIMENSION(IMS:IME,JMS:JME) :: TLATHX,TLONHX - INTEGER, DIMENSION(IMS:IME,JMS:JME) :: KOUTB -!------------------------------------------------------------------------------- - - IMT=2*P_IDE-2 ! parent i dIMEnsions - JMT=P_JDE/2 ! parent j dIMEnsions - PI_2=ACOS(0.) - D2R=PI_2/90. - R2D=1./D2R - DPH=DPHD1*D2R - DLM=DLMD1*D2R - TPH0= CENTRAL_LAT*D2R - TLM0=-CENTRAL_LON*D2R ! NOTE THE MINUS HERE - WB=WBD1*D2R ! CONVERT NESTED GRID H POINTS FROM GEODETIC - SB=SBD1*D2R - SLP0=DPHD1/DLMD1 - DSLP0=NINT(R2D*ATAN(SLP0)) - DS1=SQRT(DPH*DPH+DLM*DLM) ! Q - AN1=ASIN(DLM/DS1) - AN2=ASIN(DPH/DS1) - - DO J = JTS,MIN(JTE,JDE-1) - DO I = ITS,MIN(ITE,IDE-1) - -!*** -!*** LOCATE TARGET h POINTS (HLAT AND HLON) ON THE PARENT DOMAIN AND -!*** DETERMINE THE INDICES IN TERMS OF THE PARENT DOMAIN. FIRST -!*** CONVERT NESTED GRID h POINTS FROM GEODETIC TO TRANSFORMED -!*** COORDINATE ON THE PARENT GRID -! - - GLAT=HLAT(I,J)*D2R - GLON= (360. - HLON(I,J))*D2R - X=COS(TPH0)*COS(GLAT)*COS(GLON-TLM0)+SIN(TPH0)*SIN(GLAT) - Y=-COS(GLAT)*SIN(GLON-TLM0) - Z=COS(TPH0)*SIN(GLAT)-SIN(TPH0)*COS(GLAT)*COS(GLON-TLM0) - TLAT=R2D*ATAN(Z/SQRT(X*X+Y*Y)) - TLON=R2D*ATAN(Y/X) - -! ROW=TLAT/DPHD1+JMT ! JMT IS THE CENTRAL ROW OF THE PARENT DOMAIN -! COL=TLON/DLMD1+P_IDE-1 ! (P_IDE-1) IS THE CENTRAL COLUMN OF THE PARENT DOMAIN - - ROW=(TLAT-SBD1)/DPHD1+1 ! Dusan's doing - COL=(TLON-WBD1)/DLMD1+1 ! Dusan's doing - - NROW=INT(ROW + 0.001) ! ROUND-OFF IS AVOIDED WITHOUT USING NINT ON PURPOSE - NCOL=INT(COL + 0.001) - TLAT=TLAT*D2R - TLON=TLON*D2R - -!*** -!*** -!*** FIRST CONSIDER THE SITUATION WHERE THE POINT h IS AT -!*** -!*** V H -!*** -!*** -!*** H -!*** H V -!*** -!*** THEN LOCATE THE NEAREST H POINT ON THE PARENT GRID -!*** - IF(MOD(NROW,2).EQ.1.AND.MOD(NCOL,2).EQ.1.OR. & - MOD(NROW,2).EQ.0.AND.MOD(NCOL,2).EQ.0)THEN - TLAT1=(NROW-JMT)*DPH - TLAT2=TLAT1+DPH - TLON1=(NCOL-(P_IDE-1))*DLM - TLON2=TLON1+DLM - DLM1=TLON-TLON1 - DLM2=TLON-TLON2 -! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) -! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) - D1=ACOS(DTEMP) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - D2=ACOS(DTEMP) - IF(D1.GT.D2)THEN - NROW=NROW+1 ! FIND THE NEAREST H ROW - NCOL=NCOL+1 ! FIND THE NEAREST H COLUMN - ENDIF - ELSE -!*** -!*** NOW CONSIDER THE SITUATION WHERE THE POINT h IS AT -!*** -!*** H V -!*** -!*** -!*** H -!*** V H -!*** -!*** THEN LOCATE THE NEAREST H POINT ON THE PARENT GRID -!*** -!*** - TLAT1=(NROW+1-JMT)*DPH - TLAT2=TLAT1-DPH - TLON1=(NCOL-(P_IDE-1))*DLM - TLON2=TLON1+DLM - DLM1=TLON-TLON1 - DLM2=TLON-TLON2 -! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) -! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) - D1=ACOS(DTEMP) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - D2=ACOS(DTEMP) - IF(D1.LT.D2)THEN - NROW=NROW+1 ! FIND THE NEAREST H ROW - ELSE - NCOL=NCOL+1 ! FIND THE NEAREST H COLUMN - ENDIF - ENDIF - - KROWS=((NROW-1)/2)*IMT - IF(MOD(NROW,2).EQ.1)THEN - K=KROWS+(NCOL+1)/2 - ELSE - K=KROWS+P_IDE-1+NCOL/2 - ENDIF - -!*** -!*** WE NOW KNOW THAT THE INNER GRID POINT IN QUESTION IS -!*** NEAREST TO THE CENTER K AS SEEN BELOW. WE MUST FIND -!*** WHICH OF THE FOUR H-BOXES (OF WHICH THIS H POINT IS -!*** A VERTEX) SURROUNDS THE INNER GRID h POINT IN QUESTION. -!*** -!** -!*** H -!*** -!*** -!*** -!*** H V H -!*** -!*** -!*** H -!*** H V H V H -!*** -!*** -!*** -!*** H V H -!*** -!*** -!*** -!*** H -!*** -!*** -!*** FIND THE SLOPE OF THE LINE CONNECTING h AND THE CENTER H. -!*** - N2R=K/IMT - MK=MOD(K,IMT) -! - IF(MK.EQ.0)THEN - TLATHC=SB+(2*N2R-1)*DPH - ELSE - TLATHC=SB+(2*N2R+(MK-1)/(P_IDE-1))*DPH - ENDIF -! - IF(MK.LE.(P_IDE-1))THEN - TLONHC=WB+2*(MK-1)*DLM - ELSE - TLONHC=WB+(2*(MK-(P_IDE-1))-1)*DLM - ENDIF - -! -!*** EXECUTE CAUTION IF YOU NEED TO CHANGE THESE CONDITIONS. SINCE WE ARE -!*** DEALING WITH SLOPES TO GENERATE DIAMOND SHAPE H BOXES, WE NEED TO BE -!*** CAREFUL HERE -! - - IF(ABS(TLON-TLONHC) .LE. 1.E-4)TLONHC=TLON - IF(ABS(TLAT-TLATHC) .LE. 1.E-4)TLATHC=TLAT - DENOM=(TLON-TLONHC) -! -!*** -!***STORE THE LOCATION OF THE WESTERNMOST VERTEX OF THE H-BOX ON -!***THE OUTER GRID THAT SURROUNDS THE h POINT ON THE INNER GRID. -!*** -!*** COINCIDENT CONDITIONS - - IF(DENOM.EQ.0.0)THEN - - IF(TLATHC.EQ.TLAT)THEN - KOUTB(I,J)=K - IIH(I,J) = NCOL - JJH(I,J) = NROW - TLATHX(I,J)=TLATHC - TLONHX(I,J)=TLONHC - HBWGT1(I,J)=1.0 - HBWGT2(I,J)=0.0 - HBWGT3(I,J)=0.0 - HBWGT4(I,J)=0.0 - ELSE ! SAME LONGITUDE BUT DIFFERENT LATS -! - IF(TLATHC .GT. TLAT)THEN ! NESTED POINT SOUTH OF PARENT - KOUTB(I,J)=K-(P_IDE-1) - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW-1 - TLATHX(I,J)=TLATHC-DPH - TLONHX(I,J)=TLONHC-DLM - ELSE ! NESTED POINT NORTH OF PARENT - KOUTB(I,J)=K+(P_IDE-1)-1 - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW+1 - TLATHX(I,J)=TLATHC+DPH - TLONHX(I,J)=TLONHC-DLM - ENDIF -!*** -!*** -!*** 4 -!*** -!*** H -!*** 1 2 -!*** -!*** 3 -!*** DL 1-4 ARE THE ANGULAR DISTANCES FROM h TO EACH VERTEX - - TLATO=TLATHX(I,J) - TLONO=TLONHX(I,J) - DLM1=TLON-TLONO - DLA1=TLAT-TLATO ! Q -! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q - DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q -! - TLATO=TLATHX(I,J) - TLONO=TLONHX(I,J)+2.*DLM - DLM2=TLON-TLONO - DLA2=TLAT-TLATO ! Q -! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q - DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q -! - TLATO=TLATHX(I,J)-DPH - TLONO=TLONHX(I,J)+DLM - DLM3=TLON-TLONO - DLA3=TLAT-TLATO ! Q -! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q - DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q - - TLATO=TLATHX(I,J)+DPH - TLONO=TLONHX(I,J)+DLM - DLM4=TLON-TLONO - DLA4=TLAT-TLATO ! Q -! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q - DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q - - -! THE BILINEAR WEIGHTS -!*** -!*** - AN3=ATAN2(DLA1,DLM1) ! Q - R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1) - S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1) - R1=R1/DS1 - S1=S1/DS1 - DL1I=(1.-R1)*(1.-S1) - DL2I=R1*S1 - DL3I=R1*(1.-S1) - DL4I=(1.-R1)*S1 -! - HBWGT1(I,J)=DL1I - HBWGT2(I,J)=DL2I - HBWGT3(I,J)=DL3I - HBWGT4(I,J)=DL4I -! - ENDIF - - ELSE -! -!*** NON-COINCIDENT POINTS -! - SLOPE=(TLAT-TLATHC)/DENOM - DSLOPE=NINT(R2D*ATAN(SLOPE)) - - IF(DSLOPE.LE.DSLP0.AND.DSLOPE.GE.-DSLP0)THEN - IF(TLON.GT.TLONHC)THEN - IF(TLONHC.GE.-WB-DLM)CALL wrf_error_fatal("1H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K - IIH(I,J) = NCOL - JJH(I,J) = NROW - TLATHX(I,J)=TLATHC - TLONHX(I,J)=TLONHC - ELSE - IF(TLONHC.LE.WB+DLM)CALL wrf_error_fatal("2H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K-1 - IIH(I,J) = NCOL-2 - JJH(I,J) = NROW - TLATHX(I,J)=TLATHC - TLONHX(I,J)=TLONHC -2.*DLM - ENDIF - -! - ELSEIF(DSLOPE.GT.DSLP0)THEN - IF(TLON.GT.TLONHC)THEN - IF(TLATHC.GE.-SB-DPH)CALL wrf_error_fatal("3H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K+(P_IDE-1)-1 - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW+1 - TLATHX(I,J)=TLATHC+DPH - TLONHX(I,J)=TLONHC-DLM - ELSE - IF(TLATHC.LE.SB+DPH)CALL wrf_error_fatal("4H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K-(P_IDE-1) - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW-1 - TLATHX(I,J)=TLATHC-DPH - TLONHX(I,J)=TLONHC-DLM - ENDIF - -! - ELSEIF(DSLOPE.LT.-DSLP0)THEN - IF(TLON.GT.TLONHC)THEN - IF(TLATHC.LE.SB+DPH)CALL wrf_error_fatal("5H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K-(P_IDE-1) - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW-1 - TLATHX(I,J)=TLATHC-DPH - TLONHX(I,J)=TLONHC-DLM - ELSE - IF(TLATHC.GE.-SB-DPH)CALL wrf_error_fatal("6H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K+(P_IDE-1)-1 - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW+1 - TLATHX(I,J)=TLATHC+DPH - TLONHX(I,J)=TLONHC-DLM - ENDIF - ENDIF - -! -!*** NOW WE WILL MOVE AS FOLLOWS: -!*** -!*** -!*** 4 -!*** -!*** -!*** -!*** H -!*** 1 2 -!*** -!*** -!*** -!*** -!*** 3 -!*** -!*** -!*** -!*** DL 1-4 ARE THE ANGULAR DISTANCES FROM h TO EACH VERTEX - - TLATO=TLATHX(I,J) - TLONO=TLONHX(I,J) - DLM1=TLON-TLONO - DLA1=TLAT-TLATO ! Q -! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q - DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q -! - TLATO=TLATHX(I,J) ! redundant computations - TLONO=TLONHX(I,J)+2.*DLM - DLM2=TLON-TLONO - DLA2=TLAT-TLATO ! Q -! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q - DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q -! - TLATO=TLATHX(I,J)-DPH - TLONO=TLONHX(I,J)+DLM - DLM3=TLON-TLONO - DLA3=TLAT-TLATO ! Q -! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q - DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q -! - TLATO=TLATHX(I,J)+DPH - TLONO=TLONHX(I,J)+DLM - DLM4=TLON-TLONO - DLA4=TLAT-TLATO ! Q -! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q - DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q - -! THE BILINEAR WEIGHTS -!*** - AN3=ATAN2(DLA1,DLM1) ! Q - R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1) - S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1) - R1=R1/DS1 - S1=S1/DS1 - DL1I=(1.-R1)*(1.-S1) - DL2I=R1*S1 - DL3I=R1*(1.-S1) - DL4I=(1.-R1)*S1 -! - HBWGT1(I,J)=DL1I - HBWGT2(I,J)=DL2I - HBWGT3(I,J)=DL3I - HBWGT4(I,J)=DL4I -! - ENDIF - -! -!*** FINALLY STORE IIH IN TERMS OF E-GRID INDEX -! - IIH(I,J)=NINT(0.5*IIH(I,J)) - - HBWGT1(I,J)=MAX(HBWGT1(I,J),0.0) ! all weights must be GE zero (postive def) - HBWGT2(I,J)=MAX(HBWGT2(I,J),0.0) ! all weights must be GE zero (postive def) - HBWGT3(I,J)=MAX(HBWGT3(I,J),0.0) ! all weights must be GE zero (postive def) - HBWGT4(I,J)=MAX(HBWGT4(I,J),0.0) ! all weights must be GE zero (postive def) - -! write(message,105)"H WEIGHTS:",I,J,HBWGT1(I,J),HBWGT2(I,J),HBWGT3(I,J),HBWGT4(I,J), & -! HBWGT1(I,J)+HBWGT2(I,J)+HBWGT3(I,J)+HBWGT4(I,J),IIH(i,j),JJH(i,j) -! CALL wrf_message(trim(message)) -! 105 format(a,2i4,5f7.3,2i4) - - ENDDO - ENDDO - - - RETURN - END SUBROUTINE G2T2H -!======================================================================================== - - - SUBROUTINE G2T2V( IIV,JJV, & ! output grid index and weights - VBWGT1,VBWGT2, & ! output weights in terms of parent grid - VBWGT3,VBWGT4, & - VLAT,VLON, & ! target (nest) input lat lon in degrees - DLMD1,DPHD1,WBD1,SBD1, & ! parent res, west and south boundaries - CENTRAL_LAT,CENTRAL_LON, & ! parent central lat,lon, all in degrees - P_IDE,P_JDE, & ! parent imax and jmax - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dIMEnsions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - -! -!*** Tom Black - Initial Version -!*** Gopal - Revised Version for WRF (includes coincIDEnt grid points) -!*** -!*** GIVEN PARENT CENTRAL LAT-LONS, RESOLUTION AND WESTERN AND SOUTHERN BOUNDARY, -!*** AND THE NESTED GRID LAT-LONS AT V POINTS, THIS ROUTINE FIRST LOCATES THE -!*** INDICES,IIV,JJV, OF THE PARENT DOMAIN'S V POINTS THAT LIES CLOSEST TO THE -!*** V POINTS OF THE NESTED DOMAIN -! -!============================================================================ - - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: P_IDE,P_JDE - REAL, INTENT(IN ) :: DLMD1,DPHD1,WBD1,SBD1 - REAL, INTENT(IN ) :: CENTRAL_LAT,CENTRAL_LON - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: VLAT,VLON - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV - -! local - - INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13) ! (6) single precision - INTEGER :: IMT,JMT,N2R,MK,K,I,J,DSLP0,DSLOPE - INTEGER :: NROW,NCOL,KROWS - REAL(KIND=KNUM) :: X,Y,Z,TLAT,TLON - REAL(KIND=KNUM) :: PI_2,D2R,R2D,GLAT,GLON,DPH,DLM,TPH0,TLM0,WB,SB - REAL(KIND=KNUM) :: ROW,COL,SLP0,TLATVC,TLONVC,DENOM,SLOPE - REAL(KIND=KNUM) :: TLAT1,TLAT2,TLON1,TLON2,DLM1,DLM2,DLM3,DLM4,D1,D2 - REAL(KIND=KNUM) :: DLA1,DLA2,DLA3,DLA4,S1,R1,DS1,AN1,AN2,AN3 ! Q - REAL(KIND=KNUM) :: DL1,DL2,DL3,DL4,DL1I,DL2I,DL3I,DL4I,SUMDL,TLONO,TLATO - REAL(KIND=KNUM) :: DTEMP - REAL , DIMENSION(IMS:IME,JMS:JME) :: TLATVX,TLONVX - INTEGER, DIMENSION(IMS:IME,JMS:JME) :: KOUTB -!------------------------------------------------------------------------------------- - - IMT=2*P_IDE-2 ! parent i dIMEnsions - JMT=P_JDE/2 ! parent j dIMEnsions - PI_2=ACOS(0.) - D2R=PI_2/90. - R2D=1./D2R - DPH=DPHD1*D2R - DLM=DLMD1*D2R - TPH0= CENTRAL_LAT*D2R - TLM0=-CENTRAL_LON*D2R ! NOTE THE MINUS HERE - WB=WBD1*D2R ! DEGREES TO RADIANS - SB=SBD1*D2R - SLP0=DPHD1/DLMD1 - DSLP0=NINT(R2D*ATAN(SLP0)) - DS1=SQRT(DPH*DPH+DLM*DLM) ! Q - AN1=ASIN(DLM/DS1) - AN2=ASIN(DPH/DS1) - - DO J = JTS,MIN(JTE,JDE-1) - DO I = ITS,MIN(ITE,IDE-1) -!*** -!*** LOCATE TARGET V POINTS (VLAT AND VLON) ON THE PARENT DOMAIN AND -!*** DETERMINE THE INDICES IN TERMS OF THE PARENT DOMAIN. FIRST -!*** CONVERT NESTED GRID V POINTS FROM GEODETIC TO TRANSFORMED -!*** COORDINATE ON THE PARENT GRID -! - - GLAT=VLAT(I,J)*D2R - GLON=(360. - VLON(I,J))*D2R - X=COS(TPH0)*COS(GLAT)*COS(GLON-TLM0)+SIN(TPH0)*SIN(GLAT) - Y=-COS(GLAT)*SIN(GLON-TLM0) - Z=COS(TPH0)*SIN(GLAT)-SIN(TPH0)*COS(GLAT)*COS(GLON-TLM0) - TLAT=R2D*ATAN(Z/SQRT(X*X+Y*Y)) - TLON=R2D*ATAN(Y/X) - -! ROW=TLAT/DPHD1+JMT ! JMT IS THE CENTRAL ROW OF THE PARENT DOMAIN -! COL=TLON/DLMD1+P_IDE-1 ! (P_IDE-1) IS THE CENTRAL COLUMN OF THE PARENT DOMAIN - - ROW=(TLAT-SBD1)/DPHD1+1 ! Dusan's doing - COL=(TLON-WBD1)/DLMD1+1 ! Dusan's doing - - NROW=INT(ROW + 0.001) ! ROUND-OFF IS AVOIDED WITHOUT USING NINT ON PURPOSE - NCOL=INT(COL + 0.001) - TLAT=TLAT*D2R - TLON=TLON*D2R - -!*** -!*** -!*** FIRST CONSIDER THE SITUATION WHERE THE POINT V IS AT -!*** -!*** H V -!*** -!*** -!*** V -!*** V H -!*** -!*** THEN LOCATE THE NEAREST V POINT ON THE PARENT GRID -!*** - - IF(MOD(NROW,2).EQ.0.AND.MOD(NCOL,2).EQ.1.OR. & - MOD(NROW,2).EQ.1.AND.MOD(NCOL,2).EQ.0)THEN - TLAT1=(NROW-JMT)*DPH - TLAT2=TLAT1+DPH - TLON1=(NCOL-(P_IDE-1))*DLM - TLON2=TLON1+DLM - DLM1=TLON-TLON1 - DLM2=TLON-TLON2 -! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) -! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) - D1=ACOS(DTEMP) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - D2=ACOS(DTEMP) - IF(D1.GT.D2)THEN - NROW=NROW+1 ! FIND THE NEAREST V ROW - NCOL=NCOL+1 ! FIND THE NEAREST V COLUMN - ENDIF - ELSE - -!*** -!*** NOW CONSIDER THE SITUATION WHERE THE POINT V IS AT -!*** -!*** V H -!*** -!*** -!*** V -!*** H V -!*** -!*** THEN LOCATE THE NEAREST V POINT ON THE PARENT GRID -!*** - TLAT1=(NROW+1-JMT)*DPH - TLAT2=TLAT1-DPH - TLON1=(NCOL-(P_IDE-1))*DLM - TLON2=TLON1+DLM - DLM1=TLON-TLON1 - DLM2=TLON-TLON2 -! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) -! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) - D1=ACOS(DTEMP) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - D2=ACOS(DTEMP) - IF(D1.LT.D2)THEN - NROW=NROW+1 ! FIND THE NEAREST H ROW - ELSE - NCOL=NCOL+1 ! FIND THE NEAREST H COLUMN - ENDIF - - ENDIF - - KROWS=((NROW-1)/2)*IMT - IF(MOD(NROW,2).EQ.1)THEN - K=KROWS+NCOL/2 - ELSE - K=KROWS+P_IDE-2+(NCOL+1)/2 ! check this one should this not be P_IDE-2 ???? - ENDIF - -!*** -!*** WE NOW KNOW THAT THE INNER GRID POINT IN QUESTION IS -!*** NEAREST TO THE CENTER K AS SEEN BELOW. WE MUST FIND -!*** WHICH OF THE FOUR v-BOXES (OF WHICH THIS V POINT IS -!*** A VERTEX) SURROUNDS THE INNER GRID V POINT IN QUESTION. -!*** -!*** -!*** V -!*** -!*** -!*** -!*** V H V -!*** -!*** -!*** V -!*** V H V H V -!*** -!*** -!*** -!*** V H V -!*** -!*** -!*** -!*** V -!*** -!*** -!*** FIND THE SLOPE OF THE LINE CONNECTING V AND THE CENTER v. -!*** - N2R=K/IMT - MK=MOD(K,IMT) -! - IF(MK.EQ.0)THEN - TLATVC=SB+(2*N2R-1)*DPH - ELSE - TLATVC=SB+(2*N2R+MK/(P_IDE-1))*DPH - ENDIF -! - IF(MK.LE.(P_IDE-1)-1)THEN - TLONVC=WB+(2*MK-1)*DLM - ELSE - TLONVC=WB+2*(MK-(P_IDE-1))*DLM - ENDIF - -! -!*** EXECUTE CAUTION IF YOU NEED TO CHANGE THESE CONDITIONS. SINCE WE ARE -!*** DEALING WITH SLOPES TO GENERATE DIAMOND SHAPE V BOXES, WE NEED TO BE -!*** CAREFUL HERE -! - IF(ABS(TLON-TLONVC) .LE. 1.E-4)TLONVC=TLON - IF(ABS(TLAT-TLATVC) .LE. 1.E-4)TLATVC=TLAT - DENOM=(TLON-TLONVC) -! -!*** -!***STORE THE LOCATION OF THE WESTERNMOST VERTEX OF THE H-BOX ON -!***THE OUTER GRID THAT SURROUNDS THE h POINT ON THE INNER GRID. -!*** -!*** COINCIDENT CONDITIONS - - IF(DENOM.EQ.0.0)THEN - - IF(TLATVC.EQ.TLAT)THEN - KOUTB(I,J)=K - IIV(I,J) = NCOL - JJV(I,J) = NROW - TLATVX(I,J)=TLATVC - TLONVX(I,J)=TLONVC - VBWGT1(I,J)=1.0 - VBWGT2(I,J)=0.0 - VBWGT3(I,J)=0.0 - VBWGT4(I,J)=0.0 - ELSE ! SAME LONGITUDE BUT DIFFERENT LATS - - IF(TLATVC .GT. TLAT)THEN ! NESTED POINT SOUTH OF PARENT - KOUTB(I,J)=K-(P_IDE-1) - IIV(I,J) = NCOL-1 - JJV(I,J) = NROW-1 - TLATVX(I,J)=TLATVC-DPH - TLONVX(I,J)=TLONVC-DLM - ELSE ! NESTED POINT NORTH OF PARENT - KOUTB(I,J)=K+(P_IDE-1)-1 - IIV(I,J) = NCOL-1 - JJV(I,J) = NROW+1 - TLATVX(I,J)=TLATVC+DPH - TLONVX(I,J)=TLONVC-DLM - ENDIF - -!*** -!*** -!*** 4 -!*** -!*** V -!*** 1 2 -!*** -!*** 3 -!*** DL 1-4 ARE THE ANGULAR DISTANCES FROM h TO EACH VERTEX - - TLATO=TLATVX(I,J) - TLONO=TLONVX(I,J) - DLM1=TLON-TLONO - DLA1=TLAT-TLATO ! Q -! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q - DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q -! - TLATO=TLATVX(I,J) - TLONO=TLONVX(I,J)+2.*DLM - DLM2=TLON-TLONO - DLA2=TLAT-TLATO ! Q -! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q - DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q - - TLATO=TLATVX(I,J)-DPH - TLONO=TLONVX(I,J)+DLM - DLM3=TLON-TLONO - DLA3=TLAT-TLATO ! Q -! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q - DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q - - TLATO=TLATVX(I,J)+DPH - TLONO=TLONVX(I,J)+DLM - DLM4=TLON-TLONO - DLA4=TLAT-TLATO ! Q -! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q - DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q - -! THE BILINEAR WEIGHTS -!*** - AN3=ATAN2(DLA1,DLM1) ! Q - R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1) - S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1) - R1=R1/DS1 - S1=S1/DS1 - DL1I=(1.-R1)*(1.-S1) - DL2I=R1*S1 - DL3I=R1*(1.-S1) - DL4I=(1.-R1)*S1 -! - VBWGT1(I,J)=DL1I - VBWGT2(I,J)=DL2I - VBWGT3(I,J)=DL3I - VBWGT4(I,J)=DL4I - - ENDIF - - ELSE - -! -!*** NON-COINCIDENT POINTS -! - SLOPE=(TLAT-TLATVC)/DENOM - DSLOPE=NINT(R2D*ATAN(SLOPE)) - - IF(DSLOPE.LE.DSLP0.AND.DSLOPE.GE.-DSLP0)THEN - IF(TLON.GT.TLONVC)THEN - IF(TLONVC.GE.-WB-DLM)CALL wrf_error_fatal("1V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K - IIV(I,J)=NCOL - JJV(I,J)=NROW - TLATVX(I,J)=TLATVC - TLONVX(I,J)=TLONVC - ELSE - IF(TLONVC.LE.WB+DLM)CALL wrf_error_fatal("2V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K-1 - IIV(I,J) = NCOL-2 - JJV(I,J) = NROW - TLATVX(I,J)=TLATVC - TLONVX(I,J)=TLONVC-2.*DLM - ENDIF - - ELSEIF(DSLOPE.GT.DSLP0)THEN - IF(TLON.GT.TLONVC)THEN - IF(TLATVC.GE.-SB-DPH)CALL wrf_error_fatal("3V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K+(P_IDE-1)-1 - IIV(I,J) = NCOL-1 - JJV(I,J) = NROW+1 - TLATVX(I,J)=TLATVC+DPH - TLONVX(I,J)=TLONVC-DLM - ELSE - IF(TLATVC.LE.SB+DPH)CALL wrf_error_fatal("4V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K-(P_IDE-1) - IIV(I,J) = NCOL-1 - JJV(I,J) = NROW-1 - TLATVX(I,J)=TLATVC-DPH - TLONVX(I,J)=TLONVC-DLM - ENDIF - - ELSEIF(DSLOPE.LT.-DSLP0)THEN - IF(TLON.GT.TLONVC)THEN - IF(TLATVC.LE.SB+DPH)CALL wrf_error_fatal("5V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K-(P_IDE-1) - IIV(I,J) = NCOL-1 - JJV(I,J) = NROW-1 - TLATVX(I,J)=TLATVC-DPH - TLONVX(I,J)=TLONVC-DLM - ELSE - IF(TLATVC.GE.-SB-DPH)CALL wrf_error_fatal("6V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K+(P_IDE-1)-1 - IIV(I,J) = NCOL-1 - JJV(I,J) = NROW+1 - TLATVX(I,J)=TLATVC+DPH - TLONVX(I,J)=TLONVC-DLM - ENDIF - ENDIF -! -!*** NOW WE WILL MOVE AS FOLLOWS: -!*** -!*** -!*** 4 -!*** -!*** -!*** -!*** V -!*** 1 2 -!*** -!*** -!*** -!*** -!*** 3 -!*** -!*** -!*** -!*** DL 1-4 ARE THE ANGULAR DISTANCES FROM V TO EACH VERTEX - - TLATO=TLATVX(I,J) - TLONO=TLONVX(I,J) - DLM1=TLON-TLONO - DLA1=TLAT-TLATO ! Q -! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q - DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q -! - TLATO=TLATVX(I,J) - TLONO=TLONVX(I,J)+2.*DLM - DLM2=TLON-TLONO - DLA2=TLAT-TLATO ! Q -! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q - DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q -! - TLATO=TLATVX(I,J)-DPH - TLONO=TLONVX(I,J)+DLM - DLM3=TLON-TLONO - DLA3=TLAT-TLATO ! Q -! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q - DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q -! - TLATO=TLATVX(I,J)+DPH - TLONO=TLONVX(I,J)+DLM - DLM4=TLON-TLONO - DLA4=TLAT-TLATO ! Q -! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q - DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q - -! THE BILINEAR WEIGHTS -!*** - AN3=ATAN2(DLA1,DLM1) ! Q - R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1) - S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1) - R1=R1/DS1 - S1=S1/DS1 - DL1I=(1.-R1)*(1.-S1) - DL2I=R1*S1 - DL3I=R1*(1.-S1) - DL4I=(1.-R1)*S1 -! - VBWGT1(I,J)=DL1I - VBWGT2(I,J)=DL2I - VBWGT3(I,J)=DL3I - VBWGT4(I,J)=DL4I - - ENDIF - -! -!*** FINALLY STORE IIH IN TERMS OF E-GRID INDEX -! - IIV(I,J)=NINT(0.5*IIV(I,J)) - - VBWGT1(I,J)=MAX(VBWGT1(I,J),0.0) ! all weights must be GE zero (postive def) - VBWGT2(I,J)=MAX(VBWGT2(I,J),0.0) ! all weights must be GE zero (postive def) - VBWGT3(I,J)=MAX(VBWGT3(I,J),0.0) ! all weights must be GE zero (postive def) - VBWGT4(I,J)=MAX(VBWGT4(I,J),0.0) ! all weights must be GE zero (postive def) - - ENDDO - ENDDO - - RETURN - END SUBROUTINE G2T2V - -!----------------------------------------------------------------------------- - - SUBROUTINE G2T2H_new( IIH,JJH, & ! output grid index and weights - HBWGT1,HBWGT2, & ! output weights in terms of parent grid - HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) -! -!*** XUEJIN ZHANG --- Initial version (09/08/2008) -!*** XUEJIN ZHANG --- Modified for parallel purpose (09/10/2009) -!*** XUEJIN ZHANG --- Modified for parallel purpose (09/29/2009) -!Function: Bilnear interpolation weight and indexing for E-grid -! - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: JP - - -!*** ARRANGEMENT OF 4 VERTEXES FROM PARENT DOMAIN -!*** -!*** 4 -!*** -!*** h -!*** 1 2 -!*** -!*** -!*** 3 -! -!************************************************************* -!*** POINT (i,j) SPANS 9 NESTED POINTS -!*** A VERTEX IN THE NEST DOMAIN AND INDEXING FOR PARENT DOMAIN -!*** -!*** -!*** H -!*** -!*** h h -!*** / \ -!*** h h h -!*** / \ / \ -!*** H h h H -!*** \ / \ / -!*** h h h -!*** \ / -!*** h h -!*** -!*** H -!*** -!*** -!*** -!************************************************************* -!*** MOVING NEST ALWAYS STARTING FROM MASS GRID H -!*** PLEASE REFER TO E-GRID ARRANGEMENT FIGURE FOR MASS POINTS - - - DO J=JTS,MIN(JTE,JDE-1) - DO I=ITS,MIN(ITE,IDE-1) - JP = MOD(J,RATIO*2) - SELECT CASE(JP) - CASE ( 1 ) - CALL SUB1H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CASE ( 2 ) - CALL SUB2H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CASE ( 3 ) - CALL SUB3H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CASE ( 4 ) - CALL SUB4H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CASE ( 5 ) - CALL SUB5H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CASE ( 0 ) - CALL SUB6H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - END SELECT - 105 format(a,4i4,5f7.3) - END DO - END DO - - RETURN - END SUBROUTINE G2T2H_new - SUBROUTINE SUB1H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 1.0 - HBWGT2(I,J) = 0.0 - HBWGT3(I,J) = 0.0 - HBWGT4(I,J) = 0.0 - CASE ( 2 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 4.0/9.0 - HBWGT2(I,J) = 1.0/9.0 - HBWGT3(I,J) = 2.0/9.0 - HBWGT4(I,J) = 2.0/9.0 - CASE ( 0 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 1.0/9.0 - HBWGT2(I,J) = 4.0/9.0 - HBWGT3(I,J) = 2.0/9.0 - HBWGT4(I,J) = 2.0/9.0 - END SELECT - RETURN - END SUBROUTINE SUB1H - SUBROUTINE SUB2H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 2.0/3.0 - HBWGT2(I,J) = 0.0 - HBWGT3(I,J) = 0.0 - HBWGT4(I,J) = 1.0/3.0 - CASE ( 2 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 2.0/9.0 - HBWGT2(I,J) = 2.0/9.0 - HBWGT3(I,J) = 1.0/9.0 - HBWGT4(I,J) = 4.0/9.0 - CASE ( 0 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)+1 - HBWGT1(I,J) = 1.0/3.0 - HBWGT2(I,J) = 0.0 - HBWGT3(I,J) = 2.0/3.0 - HBWGT4(I,J) = 0.0 - END SELECT - RETURN - END SUBROUTINE SUB2H - SUBROUTINE SUB3H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)-1 - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)+1 - HBWGT1(I,J) = 2.0/9.0 - HBWGT2(I,J) = 2.0/9.0 - HBWGT3(I,J) = 4.0/9.0 - HBWGT4(I,J) = 1.0/9.0 - CASE ( 2 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 1.0/3.0 - HBWGT2(I,J) = 0.0 - HBWGT3(I,J) = 0.0 - HBWGT4(I,J) = 2.0/3.0 - CASE ( 0 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)+1 - HBWGT1(I,J) = 2.0/3.0 - HBWGT2(I,J) = 0.0 - HBWGT3(I,J) = 1.0/3.0 - HBWGT4(I,J) = 0.0 - END SELECT - RETURN - END SUBROUTINE SUB3H - SUBROUTINE SUB4H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)-1 - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 1.0/9.0 - HBWGT2(I,J) = 4.0/9.0 - HBWGT3(I,J) = 2.0/9.0 - HBWGT4(I,J) = 2.0/9.0 - CASE ( 2 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 1.0 - HBWGT2(I,J) = 0.0 - HBWGT3(I,J) = 0.0 - HBWGT4(I,J) = 0.0 - CASE ( 0 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 4.0/9.0 - HBWGT2(I,J) = 1.0/9.0 - HBWGT3(I,J) = 2.0/9.0 - HBWGT4(I,J) = 2.0/9.0 - END SELECT - RETURN - END SUBROUTINE SUB4H - SUBROUTINE SUB5H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)-1 - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 2.0/9.0 - HBWGT2(I,J) = 2.0/9.0 - HBWGT3(I,J) = 1.0/9.0 - HBWGT4(I,J) = 4.0/9.0 - CASE ( 2 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)+1 - HBWGT1(I,J) = 1.0/3.0 - HBWGT2(I,J) = 0.0 - HBWGT3(I,J) = 2.0/3.0 - HBWGT4(I,J) = 0.0 - CASE ( 0 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 2.0/3.0 - HBWGT2(I,J) = 0.0 - HBWGT3(I,J) = 0.0 - HBWGT4(I,J) = 1.0/3.0 - END SELECT - RETURN - END SUBROUTINE SUB5H - SUBROUTINE SUB6H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1 - HBWGT1(I,J) = 2.0/3.0 - HBWGT2(I,J) = 0.0 - HBWGT3(I,J) = 1.0/3.0 - HBWGT4(I,J) = 0.0 - CASE ( 2 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1 - HBWGT1(I,J) = 2.0/9.0 - HBWGT2(I,J) = 2.0/9.0 - HBWGT3(I,J) = 4.0/9.0 - HBWGT4(I,J) = 1.0/9.0 - CASE ( 0 ) - IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) - HBWGT1(I,J) = 1.0/3.0 - HBWGT2(I,J) = 0.0 - HBWGT3(I,J) = 0.0 - HBWGT4(I,J) = 2.0/3.0 - END SELECT - RETURN - END SUBROUTINE SUB6H - -!----------------------------------------------------------------------------- - - SUBROUTINE G2T2V_new( IIV,JJV, & ! output grid index and weights - VBWGT1,VBWGT2, & ! output weights in terms of parent grid - VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) -! -!*** XUEJIN ZHANG --- Initial version (09/08/2008) -!*** XUEJIN ZHANG --- Modified for parallel purpose (09/10/2009) -!*** XUEJIN ZHANG --- Modified for parallel purpose (09/29/2009) -!Function: Bilnear interpolation weight and indexing for E-grid -! - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: JP - -!*** ARRANGEMENT OF 4 VERTEXES FROM PARENT DOMAIN -!*** -!*** 4 -!*** -!*** v -!*** 1 2 -!*** -!*** -!*** 3 -! -!************************************************************* -!*** POINT (i,j) SPANS 9 NESTED POINTS -!*** A VERTEX IN THE NEST DOMAIN AND INDEXING FOR PARENT DOMAIN -!*** -!*** -!*** V -!*** -!*** v h v -!*** / \ -!*** v h v h v -!*** / \ / \ -!*** V H v h v h V H -!*** \ / \ / -!*** v h v h v -!*** \ / -!*** v h v -!*** -!*** V -!*** -!*** -!*** -!************************************************************* -!*** MOVING NEST ALWAYS STARTING FROM MASS GRID H -!*** PLEASE REFER TO E-GRID ARRANGEMENT FIGURE FOR WIND POINTS - - DO J=JTS,MIN(JTE,JDE-1) - DO I=ITS,MIN(ITE,IDE-1) - JP = MOD(J,RATIO*2) - SELECT CASE(JP) - CASE ( 1 ) - CALL SUB1V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CASE ( 2 ) - CALL SUB2V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CASE ( 3 ) - CALL SUB3V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CASE ( 4 ) - CALL SUB4V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CASE ( 5 ) - CALL SUB5V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CASE ( 0 ) - CALL SUB6V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - END SELECT - END DO - END DO - - RETURN - END SUBROUTINE G2T2V_new - SUBROUTINE SUB1V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - 1 - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 1.0/9.0 - VBWGT2(I,J) = 4.0/9.0 - VBWGT3(I,J) = 2.0/9.0 - VBWGT4(I,J) = 2.0/9.0 - CASE ( 2 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 1.0 - VBWGT2(I,J) = 0.0 - VBWGT3(I,J) = 0.0 - VBWGT4(I,J) = 0.0 - CASE ( 0 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 4.0/9.0 - VBWGT2(I,J) = 1.0/9.0 - VBWGT3(I,J) = 2.0/9.0 - VBWGT4(I,J) = 2.0/9.0 - END SELECT - RETURN - END SUBROUTINE SUB1V - SUBROUTINE SUB2V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - 1 - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 2.0/9.0 - VBWGT2(I,J) = 2.0/9.0 - VBWGT3(I,J) = 1.0/9.0 - VBWGT4(I,J) = 4.0/9.0 - CASE ( 2 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1 - VBWGT1(I,J) = 1.0/3.0 - VBWGT2(I,J) = 0.0 - VBWGT3(I,J) = 2.0/3.0 - VBWGT4(I,J) = 0.0 - CASE ( 0 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 2.0/3.0 - VBWGT2(I,J) = 0.0 - VBWGT3(I,J) = 0.0 - VBWGT4(I,J) = 1.0/3.0 - END SELECT - RETURN - END SUBROUTINE SUB2V - SUBROUTINE SUB3V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1 - VBWGT1(I,J) = 2.0/3.0 - VBWGT2(I,J) = 0.0 - VBWGT3(I,J) = 1.0/3.0 - VBWGT4(I,J) = 0.0 - CASE ( 2 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1 - VBWGT1(I,J) = 2.0/9.0 - VBWGT2(I,J) = 2.0/9.0 - VBWGT3(I,J) = 4.0/9.0 - VBWGT4(I,J) = 1.0/9.0 - CASE ( 0 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 1.0/3.0 - VBWGT2(I,J) = 0.0 - VBWGT3(I,J) = 0.0 - VBWGT4(I,J) = 2.0/3.0 - END SELECT - RETURN - END SUBROUTINE SUB3V - SUBROUTINE SUB4V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 1.0 - VBWGT2(I,J) = 0.0 - VBWGT3(I,J) = 0.0 - VBWGT4(I,J) = 0.0 - CASE ( 2 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 4.0/9.0 - VBWGT2(I,J) = 1.0/9.0 - VBWGT3(I,J) = 2.0/9.0 - VBWGT4(I,J) = 2.0/9.0 - CASE ( 0 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 1.0/9.0 - VBWGT2(I,J) = 4.0/9.0 - VBWGT3(I,J) = 2.0/9.0 - VBWGT4(I,J) = 2.0/9.0 - END SELECT - RETURN - END SUBROUTINE SUB4V - SUBROUTINE SUB5V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 2.0/3.0 - VBWGT2(I,J) = 0.0 - VBWGT3(I,J) = 0.0 - VBWGT4(I,J) = 1.0/3.0 - CASE ( 2 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 2.0/9.0 - VBWGT2(I,J) = 2.0/9.0 - VBWGT3(I,J) = 1.0/9.0 - VBWGT4(I,J) = 4.0/9.0 - CASE ( 0 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1 - VBWGT1(I,J) = 1.0/3.0 - VBWGT2(I,J) = 0.0 - VBWGT3(I,J) = 2.0/3.0 - VBWGT4(I,J) = 0.0 - END SELECT - RETURN - END SUBROUTINE SUB5V - SUBROUTINE SUB6V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV -!LOCAL VARIABLES - INTEGER :: I,J - INTEGER :: IP - IP = MOD(I,RATIO) - SELECT CASE(IP) - CASE ( 1 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - 1 - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1 - VBWGT1(I,J) = 2.0/9.0 - VBWGT2(I,J) = 2.0/9.0 - VBWGT3(I,J) = 4.0/9.0 - VBWGT4(I,J) = 1.0/9.0 - CASE ( 2 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) - VBWGT1(I,J) = 1.0/3.0 - VBWGT2(I,J) = 0.0 - VBWGT3(I,J) = 0.0 - VBWGT4(I,J) = 2.0/3.0 - CASE ( 0 ) - IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1 - VBWGT1(I,J) = 2.0/3.0 - VBWGT2(I,J) = 0.0 - VBWGT3(I,J) = 1.0/3.0 - VBWGT4(I,J) = 0.0 - END SELECT - RETURN - END SUBROUTINE SUB6V - - -!------------------------------------------------------------------------------ -! -SUBROUTINE WEIGTS_CHECK(HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - - IMPLICIT NONE - INTEGER, INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 - -! local - - REAL , PARAMETER :: EPSI=1.0E-3 - INTEGER :: I,J - REAL :: ADDSUM - CHARACTER(LEN=255):: message - -!------------------------------------------------------------------------------------- - -! DUE TO THE NEED FOR HALO EXCHANGES IN PARALLEL RUNS ONE HAS TO ENSURE CONSISTENT -! USAGE OF NUMBER OF PROCESSORS BEFORE ANY FURTHER COMPUTATIONS. WE INTRODUCE THIS -! CHECK FIRST - - IF((ITE-ITS) .LE. 4 .OR. (JTE-JTS) .LE. 4)THEN - WRITE(message,*)'ITE-ITS=',ITE-ITS,'JTE-JTS=',JTE-JTS - CALL wrf_message(trim(message)) - CALL wrf_error_fatal ('NESTED DOMAIN:PLEASE OPTIMIZE THE NUMBER OF PROCESSES; TRY SQUARES OF NUMBERS') - ENDIF - -! -! NOW CHECK WEIGHTS -! - - ADDSUM=0. - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - ADDSUM=HBWGT1(I,J)+HBWGT2(I,J)+HBWGT3(I,J)+HBWGT4(I,J) - IF(ABS(1.0-ADDSUM) .GE. EPSI)THEN - WRITE(message,*)'I=',I,'J=',J,'WEIGHTS=',HBWGT1(I,J),HBWGT2(I,J),HBWGT3(I,J),HBWGT4(I,J),1-ADDSUM - CALL wrf_message(trim(message)) - CALL wrf_error_fatal ('NESTED DOMAIN:SOMETHING IS WRONG WITH WEIGHTS COMPUTATION AT MASS POINTS') - ENDIF - ENDDO - ENDDO - - ADDSUM=0. - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - ADDSUM=VBWGT1(I,J)+VBWGT2(I,J)+VBWGT3(I,J)+VBWGT4(I,J) - IF(ABS(1.0-ADDSUM) .GE. EPSI)THEN - WRITE(message,*)'I=',I,'J=',J,'WEIGHTS=',VBWGT1(I,J),VBWGT2(I,J),VBWGT3(I,J),VBWGT4(I,J),1-ADDSUM - CALL wrf_message(trim(message)) - CALL wrf_error_fatal ('NESTED DOMAIN:SOMETHING IS WRONG WITH WEIGHTS COMPUTATION AT VELOCITY POINTS') - ENDIF - ENDDO - ENDDO - -END SUBROUTINE WEIGTS_CHECK - -!----------------------------------------------------------------------------------- - -SUBROUTINE BOUNDS_CHECK( IIH,JJH,IIV,JJV, & - IPOS,JPOS,SHW, & - IDS,IDE,JDS,JDE,KDS,KDE, & ! - IMS,IME,JMS,JME,KMS,KME, & ! nested grid configuration - ITS,ITE,JTS,JTE,KTS,KTE ) - - IMPLICIT NONE - INTEGER, INTENT(IN) :: IPOS,JPOS,SHW, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE - - INTEGER, DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IIH,JJH,IIV,JJV - -! local variables - - INTEGER :: I,J - CHARACTER(LEN=255) :: message - -!*** Gopal - Initial version -!*** -!*** CHECK DOMAIN BOUNDS BEFORE PROCEEDING TO INTERPOLATION -! -!============================================================================ - - IF(IPOS .LE. SHW)CALL wrf_error_fatal('NESTED DOMAIN TOO CLOSE TO PARENTs X-BOUNDARY') - IF(JPOS .LE. SHW)CALL wrf_error_fatal('NESTED DOMAIN TOO CLOSE TO PARENTs Y-BOUNDARY') - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - IF(IIH(I,J) .EQ. 0)CALL wrf_error_fatal ('IIH=0: SOMETHING IS WRONG') - IF(JJH(I,J) .EQ. 0)CALL wrf_error_fatal ('JJH=0: SOMETHING IS WRONG') - ENDDO - ENDDO - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - IF(IIH(I,J) .LT. (IPOS-SHW) .OR. JJH(I,J) .LT. (JPOS-SHW) .OR. & - IIV(I,J) .LT. (IPOS-SHW) .OR. JJV(I,J) .LT. (JPOS-SHW))THEN - WRITE(message,*)I,J,IIH(I,J),IPOS,JJH(I,J),JPOS,SHW - CALL wrf_message(trim(message)) - WRITE(message,*)I,J,IIV(I,J),IPOS,JJV(I,J),JPOS,SHW - CALL wrf_message(trim(message)) - CALL wrf_error_fatal ('CHECK NESTED DOMAIN BOUNDS: TRY INCREASING STENCIL WIDTH') - ENDIF - ENDDO - ENDDO - -END SUBROUTINE BOUNDS_CHECK - -!========================================================================================== - - -SUBROUTINE BASE_STATE_PARENT ( Z3d,Q3d,T3d,PSTD, & - PINT,T,Q,CWM, & - FIS,QS,PD,PDTOP,PTOP, & - ETA1,ETA2, & - DETA1,DETA2, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) -! - - USE MODULE_MODEL_CONSTANTS - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - REAL, INTENT(IN ) :: PDTOP,PTOP - REAL, DIMENSION(KMS:KME), INTENT(IN) :: ETA1,ETA2,DETA1,DETA2 - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD,QS - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q,CWM - REAL, DIMENSION(KMS:KME), INTENT(OUT):: PSTD - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(OUT):: Z3d,Q3d,T3d - -! local - - INTEGER,PARAMETER :: JTB=134 - INTEGER :: I,J,K,ILOC,JLOC - REAL, PARAMETER :: LAPSR=6.5E-3, GI=1./G,D608=0.608 - REAL, PARAMETER :: COEF3=287.05*GI*LAPSR, COEF2=-1./COEF3 - REAL, PARAMETER :: TRG=2.0*R_D*GI,LAPSI=1.0/LAPSR - REAL, PARAMETER :: P_REF=103000. - REAL :: A,B,APELP,RTOPP,DZ,ZMID - REAL, DIMENSION(IMS:IME,JMS:JME) :: SLP,TSFC,ZMSLP - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME) :: Z3d_IN - REAL,DIMENSION(JTB) :: PIN,ZIN,Y2,PIO,ZOUT,DUM1,DUM2 - REAL,DIMENSION(JTB) :: QIN,QOUT,TIN,TOUT -!-------------------------------------------------------------------------------------- - -! CLEAN Z3D ARRAY FIRST - - DO K=KDS,KDE - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - Z3d(I,J,K)=0.0 - T3d(I,J,K)=0.0 - Q3d(I,J,K)=0.0 - ENDDO - ENDDO - ENDDO - - -! DETERMINE THE HEIGHTS ON THE PARENT DOMAIN - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - Z3d_IN(I,J,1)=FIS(I,J)*GI - ENDDO - ENDDO - - DO K = KDS,KDE-1 - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - APELP = (PINT(I,J,K+1)+PINT(I,J,K)) -! RTOPP = TRG*T(I,J,K)*(1.0+Q(I,J,K)*P608-CWM(I,J,K))/APELP - RTOPP = TRG*T(I,J,K)*(1.0+Q(I,J,K)*P608)/APELP - DZ = RTOPP*(DETA1(K)*PDTOP+DETA2(K)*PD(I,J)) ! (RTv/P_TOT)*D(P_HYDRO) - Z3d_IN(I,J,K+1) = Z3d_IN(I,J,K) + DZ - ENDDO - ENDDO - ENDDO - - -! CONSTRUCT STANDARD ISOBARIC SURFACES - - DO K=KDS,KDE ! target points in model interface levels (pint) - PSTD(K) = ETA1(K)*PDTOP + ETA2(K)*(P_REF -PDTOP - PTOP) + PTOP - ENDDO - -! DETERMINE THE MSLP USE THAT TO CREATE HEIGHTS AT 1000. mb LEVEL. THESE HEIGHTS -! MAY ONLY BE USED IN VERTICAL INTERPOLATION TO ISOBARIC SURFACES WHICH ARE LOCATED -! BELOW GROUND LEVEL. - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - TSFC(I,J) = T(I,J,1)*(1.+D608*Q(I,J,1)) + LAPSR*(Z3d_IN(I,J,1)+Z3d_IN(I,J,2))*0.5 - A = LAPSR*Z3d_IN(I,J,1)/TSFC(I,J) - SLP(I,J) = PINT(I,J,1)*(1-A)**COEF2 ! sea level pressure - B = (PSTD(1)/SLP(I,J))**COEF3 - ZMSLP(I,J)= TSFC(I,J)*LAPSI*(1.0 - B) ! Height at 1000. mb level - ENDDO - ENDDO - -! INTERPOLATE Z3d_IN TO STANDARD PRESSURE INTERFACES. FOR LEVELS BELOW -! GROUND USE ZMSLP(I,J) - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) -! -! clean local array before use of spline - - PIN=0.;ZIN=0.;Y2=0;PIO=0.;ZOUT=0.;DUM1=0.;DUM2=0. - - DO K=KDS,KDE ! inputs at model interfaces - PIN(K) = PINT(I,J,KDE-K+1) - ZIN(K) = Z3d_IN(I,J,KDE-K+1) - ENDDO - - IF(PINT(I,J,1) .LE. PSTD(1))THEN - PIN(KDE) = PSTD(1) - ZIN(KDE) = ZMSLP(I,J) - ENDIF -! - Y2(1 )=0. - Y2(KDE)=0. -! - DO K=KDS,KDE - PIO(K)=PSTD(K) - ENDDO -! - CALL SPLINE1(I,J,JTB,KDE,PIN,ZIN,Y2,KDE,PIO,ZOUT,DUM1,DUM2) ! interpolate -! - - DO K=KDS,KDE ! inputs at model interfaces - Z3d(I,J,K)=ZOUT(K) - ENDDO - - ENDDO - ENDDO -! -! INTERPOLATE TEMPERATURE ONTO THE STANDARD PRESSURE LEVELS. FOR LEVELS BELOW -! GROUND USE A LAPSE RATE ATMOSPHERE -! - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) -! -! clean local array before use of spline or linear interpolation -! - PIN=0.;TIN=0.;Y2=0;PIO=0.;TOUT=0.;DUM1=0.;DUM2=0. - - DO K=KDS+1,KDE ! inputs at model levels - PIN(K-1) = EXP((ALOG(PINT(I,J,KDE-K+1))+ALOG(PINT(I,J,KDE-K+2)))*0.5) - TIN(K-1) = T(I,J,KDE-K+1) - ENDDO - - IF(PINT(I,J,1) .LE. PSTD(1))THEN - PIN(KDE-1) = EXP((ALOG(PSTD(1))+ALOG(PSTD(2)))*0.5) - ZMID = 0.5*(Z3d_IN(I,J,1)+Z3d_IN(I,J,2)) - TIN(KDE-1) = T(I,J,1) + LAPSR*(ZMID-ZMSLP(I,J)) - ENDIF -! - Y2(1 )=0. - Y2(KDE-1)=0. -! - DO K=KDS,KDE-1 - PIO(K)=EXP((ALOG(PSTD(K))+ALOG(PSTD(K+1)))*0.5) - ENDDO - - CALL SPLINE1(I,J,JTB,KDE-1,PIN,TIN,Y2,KDE-1,PIO,TOUT,DUM1,DUM2) ! interpolate - - - DO K=KDS,KDE-1 ! inputs at model levels - T3d(I,J,K)=TOUT(K) - ENDDO - - ENDDO - ENDDO - -! -! INTERPOLATE MOISTURE ONTO THE STANDARD PRESSURE LEVELS. FOR LEVELS BELOW -! GROUND USE THE SURFACE MOISTURE -! - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) -! -! clean local array before use of spline or linear interpolation - - - PIN=0.;QIN=0.;Y2=0;PIO=0.;QOUT=0.;DUM1=0.;DUM2=0. - - DO K=KDS+1,KDE ! inputs at model levels - PIN(K-1) = EXP((ALOG(PINT(I,J,KDE-K+1))+ALOG(PINT(I,J,KDE-K+2)))*0.5) - QIN(K-1) = Q(I,J,KDE-K+1) - ENDDO - - IF(PINT(I,J,1) .LE. PSTD(1))THEN - PIN(KDE-1) = EXP((ALOG(PSTD(1))+ALOG(PSTD(2)))*0.5) -! QIN(KDE-1) = QS(I,J) - ENDIF - - Y2(1 )=0. - Y2(KDE-1)=0. -! - DO K=KDS,KDE-1 - PIO(K)=EXP((ALOG(PSTD(K))+ALOG(PSTD(K+1)))*0.5) - ENDDO - - CALL SPLINE1(I,J,JTB,KDE-1,PIN,QIN,Y2,KDE-1,PIO,QOUT,DUM1,DUM2) ! interpolate - - DO K=KDS,KDE-1 ! inputs at model levels - Q3d(I,J,K)=QOUT(K) - ENDDO - - ENDDO - ENDDO - -END SUBROUTINE BASE_STATE_PARENT -!============================================================================= - SUBROUTINE SPLINE1(I,J,JTBX,NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,Q) -! -! ****************************************************************** -! * * -! * THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE * -! * PROGRAMED FOR A SMALL SCALAR MACHINE. * -! * * -! * PROGRAMER Z. JANJIC * -! * * -! * NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION. MUST BE GE 3. * -! * XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * -! * FUNCTION ARE GIVEN. MUST BE IN ASCENDING ORDER. * -! * YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD. * -! * Y2 - THE SECOND DERIVATIVES AT THE POINTS XOLD. IF NATURAL * -! * SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE * -! * SPECIFIED. * -! * NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED. * -! * XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * -! * FUNCTION ARE CALCULATED. XNEW(K) MUST BE GE XOLD(1) * -! * AND LE XOLD(NOLD). * -! * YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED. * -! * P, Q - AUXILIARY VECTORS OF THE LENGTH NOLD-2. * -! * * -! ****************************************************************** -!--------------------------------------------------------------------- - IMPLICIT NONE -!--------------------------------------------------------------------- - INTEGER,INTENT(IN) :: I,J,JTBX,NNEW,NOLD - REAL,DIMENSION(JTBX),INTENT(IN) :: XNEW,XOLD,YOLD - REAL,DIMENSION(JTBX),INTENT(INOUT) :: P,Q,Y2 - REAL,DIMENSION(JTBX),INTENT(OUT) :: YNEW -! - INTEGER :: II,JJ,K,K1,K2,KOLD,NOLDM1 - REAL :: AK,BK,CK,DEN,DX,DXC,DXL,DXR,DYDXL,DYDXR & - ,RDX,RTDXC,X,XK,XSQ,Y2K,Y2KP1 - CHARACTER(LEN=255) :: message -!--------------------------------------------------------------------- - -! debug - - II=9999 !67 !35 !50 !4 - JJ=9999 !31 !73 !115 !192 -#if ( HWRF == 1 ) - IF(I.eq.II.and.J.eq.JJ)THEN - WRITE(message,*)'DEBUG in SPLINE1:HSO= ',xnew(1:nold) - CALL wrf_debug(1,trim(message)) - DO K=1,NOLD - WRITE(message,*)'DEBUG in SPLINE1:L,ZETAI,PINTI= ' & - ,K,YOLD(K),XOLD(K) - CALL wrf_debug(1,trim(message)) - ENDDO - ENDIF -#endif - -! - NOLDM1=NOLD-1 -! - DXL=XOLD(2)-XOLD(1) - DXR=XOLD(3)-XOLD(2) - DYDXL=(YOLD(2)-YOLD(1))/DXL - DYDXR=(YOLD(3)-YOLD(2))/DXR - RTDXC=0.5/(DXL+DXR) -! - P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1)) - Q(1)=-RTDXC*DXR -! - IF(NOLD.EQ.3)GO TO 150 -!--------------------------------------------------------------------- - K=3 -! - 100 DXL=DXR - DYDXL=DYDXR - DXR=XOLD(K+1)-XOLD(K) - DYDXR=(YOLD(K+1)-YOLD(K))/DXR - DXC=DXL+DXR - DEN=1./(DXL*Q(K-2)+DXC+DXC) -! - P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2)) - Q(K-1)=-DEN*DXR -! - K=K+1 - IF(K.LT.NOLD)GO TO 100 -!----------------------------------------------------------------------- - 150 K=NOLDM1 -! - 200 Y2(K)=P(K-1)+Q(K-1)*Y2(K+1) -! - K=K-1 - IF(K.GT.1)GO TO 200 -!----------------------------------------------------------------------- - K1=1 -! - 300 XK=XNEW(K1) -! - DO 400 K2=2,NOLD -! - IF(XOLD(K2).GT.XK)THEN - KOLD=K2-1 - GO TO 450 - ENDIF -! - 400 CONTINUE -! - YNEW(K1)=YOLD(NOLD) - GO TO 600 -! - 450 IF(K1.EQ.1)GO TO 500 - IF(K.EQ.KOLD)GO TO 550 -! - 500 K=KOLD -! - Y2K=Y2(K) - Y2KP1=Y2(K+1) - DX=XOLD(K+1)-XOLD(K) - RDX=1./DX -! - AK=.1666667*RDX*(Y2KP1-Y2K) - BK=0.5*Y2K - CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K) -! - 550 X=XK-XOLD(K) - XSQ=X*X -! - YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K) - -! debug - -#if ( HWRF == 1 ) - if(i.eq.ii.and.j.eq.jj)then - write(message,*) 'DEBUG:: k1,xnew(k1),ynew(k1): ', k1,xnew(k1),ynew(k1) - CALL wrf_debug(1,trim(message)) - endif -#endif - -! - 600 K1=K1+1 - IF(K1.LE.NNEW)GO TO 300 - - RETURN - END SUBROUTINE SPLINE1 -!--------------------------------------------------------------------- - -SUBROUTINE NEST_TERRAIN ( nest, config_flags ) - - USE module_domain - USE module_configure - USE module_timing - USE module_TERRAIN - USE wrfsi_static - USE module_SMOOTH_TERRAIN - - IMPLICIT NONE - - TYPE(domain) , POINTER :: nest - TYPE(grid_config_rec_type) , INTENT(IN) :: config_flags - -! -! Local variables -! - - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - INTEGER :: ids,ide,jds,jde,kds,kde - INTEGER :: ims,ime,jms,jme,kms,kme - INTEGER :: its,ite,jts,jte,kts,kte - INTEGER :: i_parent_start, j_parent_start - INTEGER :: parent_grid_ratio - INTEGER :: n,i,j,ii,jj,nnxp,nnyp - INTEGER :: i_start,j_start,level - REAL, DIMENSION(1,1), TARGET :: nothing - REAL :: lah_nest_11, loh_nest_11 - INTEGER :: im_big, jm_big, i_add - INTEGER :: im, jm - CHARACTER(LEN=6) :: nestpath - - integer :: input_type - character(len=128) :: input_fname - character (len=32) :: cname - integer :: ndim - character (len=3) :: memorder - character (len=32) :: stagger - integer, dimension(3) :: domain_start, domain_end - integer :: wrftype - character (len=128), dimension(3) :: dimnames - - integer :: istatus - integer :: handle - integer :: comm_1, comm_2 - - real, allocatable, dimension(:,:,:) :: real_domain - - character (len=10), dimension(24) :: name = (/ "XLAT_M ", & - "XLONG_M ", & - "XLAT_V ", & - "XLONG_V ", & - "E ", & - "F ", & - "LANDMASK ", & - "LANDUSEF ", & - "LU_INDEX ", & - "HCNVX ", & - "HSTDV ", & - "HASYW ", & - "HASYS ", & - "HASYSW ", & - "HASYNW ", & - "HLENW ", & - "HLENS ", & - "HLENSW ", & - "HLENNW ", & - "HANIS ", & - "HSLOP ", & - "HANGL ", & - "HZMAX ", & - "HGT_M " /) - - integer, parameter :: IO_BIN=1, IO_NET=2 - - integer :: io_form_auxinput2 - integer :: itsok,iteok,jtsok,jteok - - CHARACTER(LEN=512) :: message - - write(message,'("Nest d",I2," entering nest_terrain")') nest%id - call wrf_debug(1,trim(message)) - - call START_TIMING() - - write(message,*)"in NEST_TERRAIN config_flags%io_form_auxinput2 = ", config_flags%io_form_auxinput2 - CALL wrf_debug(2,trim(message)) - write(message,*)"in NEST_TERRAIN config_flags%auxinput2_inname = ", config_flags%auxinput2_inname - CALL wrf_debug(2,trim(message)) - - io_form_auxinput2 = config_flags%io_form_auxinput2 - ! NOTE: input_type (WRFSI vs. WPS) triggers based on auxinput1 - ! (metgrid) because that is the only way we have of differentiating - ! between WRFSI and WPS - if (config_flags%auxinput1_inname(1:7) == "met_nmm") then - input_type = 2 - else - input_type = 1 - end if - -!---------------------------------------------------------------------------------- - - IDS = nest%sd31 - IDE = nest%ed31 - JDS = nest%sd32 - JDE = nest%ed32 - KDS = nest%sd33 - KDE = nest%ed33 - - IMS = nest%sm31 - IME = nest%em31 - JMS = nest%sm32 - JME = nest%em32 - KMS = nest%sm33 - KME = nest%em33 - - ITS = nest%sp31 - ITE = nest%ep31 - JTS = nest%sp32 - JTE = nest%ep32 - KTS = nest%sp33 - KTE = nest%ep33 - - i_parent_start = nest%i_parent_start - j_parent_start = nest%j_parent_start - parent_grid_ratio = nest%parent_grid_ratio - - NNXP=IDE-1 - NNYP=JDE-1 - im = NNXP - jm = NNYP - - ! Find nesting depth: - call find_ijstart_level (nest,i_start,j_start,level) - write(message,*)" nest%id =", nest%id , " i_start,j_start,level =", i_start,j_start,level - CALL wrf_debug(2,trim(message)) - if ( level <= 0 ) then - CALL wrf_error_fatal('this routine NEST_TERRAIN should not be called for top-level domain') - end if - - ! Monitor process stores high-resolution topography: - IF ( nest%active_this_task ) THEN - CALL push_communicators_for_domain(nest%id) -#ifdef DM_PARALLEL - monitor_only: IF ( wrf_dm_on_monitor() ) THEN -#endif - call wrf_debug(1,'NEST_TERRAIN MASTER PROCESS') - call MASTER(IDS,IDE,JDS,JDE) -#ifdef DM_PARALLEL - ELSE - call wrf_debug(1,'NEST_TERRAIN CLIENT PROCESS') - call CLIENT(IDS,IDE,JDS,JDE) - ENDIF monitor_only -#endif - - if(config_flags%terrain_smoothing==2) then - call wrf_debug(1,'Call fast smoother (smooth_terrain)') - call smooth_terrain(nest,12,12, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - elseif(config_flags%terrain_smoothing==1) then - continue ! already handled this case in the call to MASTER - elseif(config_flags%terrain_smoothing==0) then - call wrf_debug(1,'Terrain smoothing is disabled.') - else - write(message,*) 'Invalid option for terrain_smoothing: ',config_flags%terrain_smoothing - call wrf_error_fatal(message) - endif - - DO J = jts,jte - DO I = its,ite -#ifdef IDEAL_NMM_TC - nest%hres_fis(I,J)= 0.0 ! idealized -#else - nest%hres_fis(i,j)=9.81*nest%hres_avc(i,j) -#endif - ENDDO - ENDDO - - write(message,'("Nest d",I0," nest_terrain")') nest%id - CALL pop_communicators_for_domain - ENDIF - call END_TIMING(trim(message)) - -#ifdef IDEAL_NMM_TC - return ! move return after end_timing to prevent cnmax KWON -#endif - -CONTAINS -#ifdef DM_PARALLEL - SUBROUTINE CLIENT(IDS,IDE,JDS,JDE) - IMPLICIT NONE - integer, intent(in) :: IDS,IDE,JDS,JDE - REAL, DIMENSION(1,1) :: avc_nest,lnd_nest - - call wrf_debug(1,'call wrf_global_to_patch_real in nest_terrain') - call wrf_global_to_patch_real(avc_nest,nest%hres_avc,nest%domdesc,'z','xy', & - ids, ide-1, jds, jde-1, 1, 1, & - ims, ime, jms, jme, 1, 1, & - its, ite, jts, jte, 1, 1) - call wrf_global_to_patch_real(lnd_nest,nest%hres_lnd,nest%domdesc,'z','xy', & - ids, ide-1, jds, jde-1, 1, 1, & - ims, ime, jms, jme, 1, 1, & - its, ite, jts, jte, 1, 1) - call wrf_debug(1,'back from wrf_global_to_patch_real in nest_terrain') - - - END SUBROUTINE CLIENT -#endif - SUBROUTINE MASTER(IDS,IDE,JDS,JDE) - IMPLICIT NONE - integer, intent(in) :: IDS,IDE,JDS,JDE - REAL, DIMENSION(IDS:IDE,JDS:JDE) :: avc_nest, lnd_nest - type(nmm_terrain), pointer :: tr - - nullify(tr) - avc_nest = 0.0 - lnd_nest = 0.0 - - tr=>terrain_for(level,input_type,io_form_auxinput2) - - ! select subdomain from big fine grid - i_add = mod(j_start+1,2) - DO j=jds,jde - DO i=ids,ide - avc_nest(i,j) = tr%avc(i_start+i-1 + mod(j+1,2)*i_add, j_start+j-1) - lnd_nest(i,j) = tr%lnd(i_start+i-1 + mod(j+1,2)*i_add, j_start+j-1) - END DO - END DO - - i=1 ; j=1 - lah_nest_11 = tr%lah(i_start+i-1 + mod(j+1,2)*i_add, j_start+j-1) - loh_nest_11 = tr%loh(i_start+i-1 + mod(j+1,2)*i_add, j_start+j-1) - - IF(ABS(lah_nest_11-nest%HLAT(1,1)) .GE. 0.5 .OR. & - ABS(loh_nest_11-nest%HLON(1,1)) .GE. 0.5)THEN - - WRITE(message,*)'SOME MATCHING TEST i_parent_start, j_parent_start',i_parent_start,j_parent_start - CALL wrf_message(trim(message)) - CALL wrf_message('WRFSI LAT COMPUTED LAT') - WRITE(message,*)lah_nest_11,nest%HLAT(1,1) - CALL wrf_message(trim(message)) - CALL wrf_message('WRFSI LON COMPUTED LON') - WRITE(message,*)loh_nest_11,nest%HLON(1,1) - CALL wrf_message(trim(message)) - - CALL wrf_message('CHECK WRFSI CONFIGURATION AND INPUT HIGH RESOLUTION TOPOGRAPHY AND/OR GRID RATIO') -#ifndef IDEAL_NMM_TC - CALL wrf_error_fatal('LATLON MISMATCH: ERROR READING static FILE FOR THE NEST') -#endif - ENDIF - - if(config_flags%terrain_smoothing==1) then - call wrf_debug(1,'Call slow smoother (smdhld).') - call smdhld(ids,ide,jds,jde,avc_nest,lnd_nest,12,12) - endif - -#ifdef DM_PARALLEL - call wrf_debug(1,'call wrf_global_to_patch_real in nest_terrain') - call wrf_global_to_patch_real(avc_nest,nest%hres_avc,nest%domdesc,'z','xy', & - ids, ide-1, jds, jde-1, 1, 1, & - ims, ime, jms, jme, 1, 1, & - its, ite, jts, jte, 1, 1) - call wrf_global_to_patch_real(lnd_nest,nest%hres_lnd,nest%domdesc,'z','xy', & - ids, ide-1, jds, jde-1, 1, 1, & - ims, ime, jms, jme, 1, 1, & - its, ite, jts, jte, 1, 1) - call wrf_debug(1,'back from wrf_global_to_patch_real in nest_terrain') -#endif - END SUBROUTINE MASTER - -END SUBROUTINE NEST_TERRAIN - - -!=========================================================================================== - - -SUBROUTINE med_init_domain_constants_nmm ( parent, nest) !, config_flags) - ! Driver layer - USE module_domain - USE module_configure - USE module_timing - USE module_dm, ONLY : intercomm_active - - IMPLICIT NONE - TYPE(domain) , POINTER :: parent, nest, grid -! -! - INTERFACE - SUBROUTINE med_initialize_nest_nmm ( grid & -! -# include "dummy_new_args.inc" -! - ) - USE module_domain - USE module_configure - USE module_timing - IMPLICIT NONE - TYPE(domain) , POINTER :: grid -#include "dummy_new_decl.inc" - END SUBROUTINE med_initialize_nest_nmm - END INTERFACE - -!------------------------------------------------------------------------------ -! PURPOSE: -! - initialize some data, mainly 2D & 3D nmm arrays very similar to -! those done in ./dyn_nmm/module_initialize_real.f -!----------------------------------------------------------------------------- -! - - grid => nest - - IF ( intercomm_active( grid%id ) ) THEN - CALL med_initialize_nest_nmm( grid & -! -# include "actual_new_args.inc" -! - ) - ENDIF - -END SUBROUTINE med_init_domain_constants_nmm - -SUBROUTINE med_initialize_nest_nmm( grid & -! -# include "dummy_new_args.inc" -! - ) - - USE module_domain - USE module_configure - USE module_timing - IMPLICIT NONE - -! Local domain indices and counters. - - INTEGER :: ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - its, ite, jts, jte, kts, kte, & - i, j, k, nnxp, nnyp - - TYPE(domain) , POINTER :: grid - -! Local data - - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - INTEGER :: KHH,KVH,JAM,JA,IHL, IHH, L - INTEGER :: II,JJ,ISRCH,ISUM - INTEGER, ALLOCATABLE, DIMENSION(:) :: KHL2,KVL2,KHH2,KVH2,KHLA,KHHA,KVLA,KVHA - INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13) -! - REAL(KIND=KNUM) :: WB,SB,DLM,DPH,TPH0,STPH0,CTPH0 - REAL(KIND=KNUM) :: STPH,CTPH,TDLM,TDPH,FP,TPH,TLM,TLM0 - REAL :: TPH0D,TLM0D,ANBI,TSPH,DTAD,DTCF,DT - REAL :: ACDT,CDDAMP,DXP - REAL :: WBD,SBD,WBI,SBI,EBI - REAL :: DY_NMM0 - REAL :: RSNOW,SNOFAC - REAL, ALLOCATABLE, DIMENSION(:) :: DXJ,WPDARJ,CPGFUJ,CURVJ, & - FCPJ,FDIVJ,EMJ,EMTJ,FADJ, & - HDACJ,DDMPUJ,DDMPVJ -! - REAL, PARAMETER:: SALP=2.60 - REAL, PARAMETER:: SNUP=0.040 - REAL, PARAMETER:: W_NMM=0.08 -! REAL, PARAMETER:: COAC=0.75 -! REAL, PARAMETER:: CODAMP=6.4 - REAL, PARAMETER:: TWOM=.00014584 - REAL, PARAMETER:: CP=1004.6 - REAL, PARAMETER:: DFC=1.0 - REAL, PARAMETER:: DDFC=1.0 - REAL, PARAMETER:: ROI=916.6 - REAL, PARAMETER:: R=287.04 - REAL, PARAMETER:: CI=2060.0 - REAL, PARAMETER:: ROS=1500. - REAL, PARAMETER:: CS=1339.2 - REAL, PARAMETER:: DS=0.050 - REAL, PARAMETER:: AKS=.0000005 - REAL, PARAMETER:: DZG=2.85 - REAL, PARAMETER:: DI=.1000 - REAL, PARAMETER:: AKI=0.000001075 - REAL, PARAMETER:: DZI=2.0 - REAL, PARAMETER:: THL=210. - REAL, PARAMETER:: PLQ=70000. - REAL, PARAMETER:: ERAD=6371200. - REAL, PARAMETER:: DTR=0.01745329 - - REAL :: COAC - REAL :: CODAMP - - CHARACTER(LEN=255) :: message - - ! Definitions of dummy arguments to solve -#include "dummy_new_decl.inc" - -!#define COPY_IN -!#include "scalar_derefs.inc" -#ifdef DM_PARALLEL -# include "data_calls.inc" -#endif - - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - its, ite, jts, jte, kts, kte ) - - -!================================================================================= -! -! - - call nl_get_coac(grid%id,coac) - call nl_get_codamp(grid%id,codamp) - - DT=grid%dt !float(TIME_STEP)/parent_time_step_ratio - NNXP=min(ITE,IDE-1) - NNYP=min(JTE,JDE-1) - JAM=6+2*((JDE-1)-10) ! this should be the fix instead of JAM=6+2*(NNYP-10) - - WRITE(message,*)'TIME STEP ON DOMAIN',grid%id,'==',dt - CALL wrf_message(trim(message)) - - WRITE(message,*)'IDS,IDE ON DOMAIN',grid%id,'==',ids,ide - CALL wrf_message(trim(message)) -! -IF ( grid%active_this_task ) THEN - ALLOCATE(KHL2(JTS:NNYP),KVL2(JTS:NNYP),KHH2(JTS:NNYP),KVH2(JTS:NNYP)) - ALLOCATE(DXJ(JTS:NNYP),WPDARJ(JTS:NNYP),CPGFUJ(JTS:NNYP),CURVJ(JTS:NNYP)) - ALLOCATE(FCPJ(JTS:NNYP),FDIVJ(JTS:NNYP),FADJ(JTS:NNYP)) - ALLOCATE(HDACJ(JTS:NNYP),DDMPUJ(JTS:NNYP),DDMPVJ(JTS:NNYP)) - ALLOCATE(KHLA(JAM),KHHA(JAM)) - ALLOCATE(KVLA(JAM),KVHA(JAM)) - -! INITIALIZE SOME LAND/WATER SURFACE DATA ON THE BASIS OF INPUTS: SM, XICE, WEASD, -! INTERPOLATED FROM MOTHER (WRFSI) DOMAIN. THIS PART OF THE CODE HAS TO BE REVISITED -! LATER ON - -! Since SM has been changed on parent domain to be 0 over sea ice it can not be used here -! to find where sea ice is. That's why alogirthm here is slightly different than the -! one used in module_initalize_real.f - -#if ( HWRF == 1 ) -!zhang's doing: added to AVOID THIS COMPUTATION IF THE NEST IS STARTED USING ANALYSIS FILE - IF(.not. grid%analysis)THEN -#endif - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - - IF (grid%sm(I,J).GT.0.9) THEN ! OVER WATER SURFACE - grid%epsr(I,J)= 0.97 - grid%embck(I,J)= 0.97 - grid%gffc(I,J)= 0. - grid%albedo(I,J)=.06 - grid%albase(I,J)=.06 - ENDIF - - IF (grid%sice(I,J).GT.0.9) THEN ! OVER SEA-ICE - grid%sm(I,J)=0. - grid%si(I,J)=0. - grid%gffc(I,J)=0. - grid%albedo(I,J)=.60 - grid%albase(I,J)=.60 - ENDIF - - IF (grid%sm(I,J).LT.0.5.AND.grid%sice(I,J).LT.0.5) THEN ! OVER LAND SURFACE - grid%si(I,J)=5.0*grid%weasd(I,J)/1000. ! SNOW WATER EQ (mm) OBTAINED FROM PARENT (grid%si) IS INTERPOLATED - grid%epsr(I,J)=1.0 ! EMISSIVITY DEFINED OVER LAND IN THE NESTED DOMAIN - grid%embck(I,J)=1.0 ! EMISSIVITY DEFINED OVER LAND IN THE NESTED DOMAIN - grid%gffc(I,J)=0.0 ! just leave zero as irrelevant - grid%sno(I,J)=grid%si(I,J)*.20 ! LAND-SNOW COVER - ENDIF - - ENDDO - ENDDO - -! This may just be a fix and may need some Registry related changes, later on - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - grid%vegfra(I,J)=grid%vegfrc(I,J) - ENDDO - ENDDO - -! DETERMINE ALBEDO OVER LAND ON THE BASIS OF INPUTS: SM, ALBASE, MXSNAL & VEGFRA -! INTERPOLATED FROM MOTHER (WRFSI) DOMAIN - - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - - IF(grid%sm(I,J).LT.0.9.AND.grid%sice(I,J).LT.0.9) THEN -! - IF ( (grid%sno(I,J) .EQ. 0.0) .OR. & ! SNOWFREE ALBEDO - (grid%albase(I,J) .GE. grid%mxsnal(I,J) ) ) THEN - grid%albedo(I,J) = grid%albase(I,J) - ELSE - IF (grid%sno(I,J) .LT. SNUP) THEN ! MODIFY ALBEDO IF SNOWCOVER: - RSNOW = grid%sno(I,J)/SNUP ! BELOW SNOWDEPTH THRESHOLD - SNOFAC = 1. - ( EXP(-SALP*RSNOW) - RSNOW*EXP(-SALP)) - ELSE - SNOFAC = 1.0 ! ABOVE SNOWDEPTH THRESHOLD - ENDIF - grid%albedo(I,J) = grid%albase(I,J) & - + (1.0-grid%vegfra(I,J))*SNOFAC*(grid%mxsnal(I,J)-grid%albase(I,J)) - ENDIF -! - END IF - - grid%si(I,J)=5.0*grid%weasd(I,J) - grid%sno(I,J)=grid%weasd(I,J) -! this block probably superfluous. Meant to guarantee land/sea agreement - - IF (grid%sm(I,J) .gt. 0.5)THEN - grid%landmask(I,J)=0.0 - ELSE - grid%landmask(I,J)=1.0 - ENDIF - - IF (grid%sice(I,J) .eq. 1.0) then !!!! change vegtyp and sltyp to fit seaice (desireable??) - grid%isltyp(I,J)=16 - grid%ivgtyp(I,J)=24 - ENDIF - - ENDDO - ENDDO - -! Check land water interface - -! The write(20,*) statements below were very slow on Jet when using -! the intel compiler (added hours to the runtime). The fix -! suggested by Chris Harrop was to send messages to wrf_message -! instead: - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS,MIN(ITE,IDE-1) - IF(grid%sm(I,J).GT.0.9 .AND. grid%vegfra(I,J) .NE. 0) THEN -#if defined(USE_SLOW_INTERFACE_CHECK) - WRITE(20,*)'PROBLEM AT THE LAND-WATER INTERFACE (VEGFRA):', & - I,J,grid%sm(I-1,J),grid%vegfra(I-1,j),grid%sm(I,J),grid%vegfra(I,J) -#else - WRITE(message,*)'PROBLEM AT THE LAND-WATER INTERFACE (VEGFRA):', & - I,J,grid%sm(I-1,J),grid%vegfra(I-1,j),grid%sm(I,J),grid%vegfra(I,J) - CALL wrf_message(trim(message)) -#endif - ENDIF -! -#if ( HWRF == 1 ) - ! HWRF should not perform the check below because the nmm_tsk is - ! update with the correct skin temperature every timestep (on both - ! land and sea points). -#else - IF(grid%sm(I,J).GT.0.9 .AND. grid%nmm_tsk(I,J) .NE. 0) THEN -#if defined(USE_SLOW_INTERFACE_CHECK) - WRITE(20,*)'PROBLEM AT THE LAND-WATER INTERFACE (NMM_TSK):', & - I,J,grid%sm(I-1,J),grid%nmm_tsk(I-1,J),grid%sm(I,J),grid%nmm_tsk(I,J) -#else - WRITE(message,*)'PROBLEM AT THE LAND-WATER INTERFACE (NMM_TSK):', & - I,J,grid%sm(I-1,J),grid%nmm_tsk(I-1,J),grid%sm(I,J),grid%nmm_tsk(I,J) - CALL wrf_message(trim(message)) -#endif - ENDIF -#endif - ENDDO - ENDDO - - -! hardwire root depth for time being - - grid%rtdpth=0. - grid%rtdpth(1)=0.1 - grid%rtdpth(2)=0.3 - grid%rtdpth(3)=0.6 - -! hardwire soil depth for time being - - grid%sldpth=0. - grid%sldpth(1)=0.1 - grid%sldpth(2)=0.3 - grid%sldpth(3)=0.6 - grid%sldpth(4)=1.0 - -#if ( HWRF == 1 ) -!zhang's doing: added to AVOID THIS COMPUTATION IF THE NEST IS STARTED USING ANALYSIS FILE - ENDIF ! <------ for analysis set to false -#endif -!----------- END OF LAND SURFACE INITIALIZATION ------------------------------------- -! - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - grid%res(I,J)=1. - ENDDO - ENDDO - -! INITIALIZE 2D BOUNDARY MASKS - -!! grid%hbm2: - - grid%hbm2=0. - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - IF((J .GE. 3 .and. J .LE. (JDE-1)-2) .AND. & - (I .GE. 2 .and. I .LE. (IDE-1)-2+MOD(J,2))) THEN - grid%hbm2(I,J)=1. - ENDIF - ENDDO - ENDDO - -!! grid%hbm3: - - grid%hbm3=0. - DO J=JTS,MIN(JTE,JDE-1) - grid%ihwg(J)=mod(J+1,2)-1 - IF (J .ge. 4 .and. J .le. (JDE-1)-3) THEN - IHL=(IDS+1)-grid%ihwg(J) - IHH=(IDE-1)-2 - DO I=ITS,MIN(ITE,IDE-1) - IF (I .ge. IHL .and. I .le. IHH) grid%hbm3(I,J)=1. - ENDDO - ENDIF - ENDDO - -!! grid%vbm2 - - grid%vbm2=0. - DO J=JTS,MIN(JTE,JDE-1) - DO I=ITS,MIN(ITE,IDE-1) - IF((J .ge. 3 .and. J .le. (JDE-1)-2) .AND. & - (I .ge. 2 .and. I .le. (IDE-1)-1-MOD(J,2))) THEN - grid%vbm2(I,J)=1. - ENDIF - ENDDO - ENDDO - -!! grid%vbm3 - - grid%vbm3=0. - DO J=JTS,MIN(JTE,JDE-1) - DO I=ITS,MIN(ITE,IDE-1) - IF((J .ge. 4 .and. J .le. (JDE-1)-3) .AND. & - (I .ge. 3-MOD(J,2) .and. I .le. (IDE-1)-2)) THEN - grid%vbm3(I,J)=1. - ENDIF - ENDDO - ENDDO - - TPH0D = grid%CEN_LAT - TLM0D = grid%CEN_LON - TPH0 = TPH0D*DTR - WBD = grid%WBD0 ! gopal's doing: may use Registry WBD0 now - WB = WBD*DTR - SBD = grid%SBD0 ! gopal's doing: may use Registry SBD0 now - SB = SBD*DTR - DLM = grid%dlmd*DTR ! input now from med_nest_egrid_configure - DPH = grid%dphd*DTR ! input now from med_nest_egrid_configure - TDLM = DLM+DLM - TDPH = DPH+DPH - WBI = WB+TDLM - SBI = SB+TDPH - EBI = WB+((ide-1)-2)*TDLM ! gopal's doing: check this for nested domain - ANBI = SB+((jde-1)-3)*DPH ! gopal's doing: check this for nested domain - STPH0 = SIN(TPH0) - CTPH0 = COS(TPH0) - TSPH = 3600./grid%DT - DTAD = 1.0 - DTCF = 4.0 - DY_NMM0= grid%dy_nmm ! ERAD*DPH; input now from med_nest_egrid_configure - -! CORIOLIS PARAMETER (There appears to be some roundoff in computing TLM & STPH and other terms, -! in the nested domain. The problem needs to be revisited - - DO J=JTS,MIN(JTE,JDE-1) - TLM0=WB-TDLM+MOD(J,2)*DLM ! remember this is a wind point - TPH =SB+float(J-1)*DPH - STPH=SIN(TPH) - CTPH=COS(TPH) - DO I=ITS,MIN(ITE,IDE-1) - TLM=TLM0 + I*TDLM - FP=TWOM*(CTPH0*STPH+STPH0*CTPH*COS(TLM)) - grid%f(I,J)=0.5*grid%DT*FP - ENDDO - ENDDO - - - DO J=JTS,MIN(JTE,JDE-1) - KHL2(J)=(IDE-1)*(J-1)-(J-1)/2+2 - KVL2(J)=(IDE-1)*(J-1)-J/2+2 - KHH2(J)=(IDE-1)*J-J/2-1 - KVH2(J)=(IDE-1)*J-(J+1)/2-1 - ENDDO - - - TPH=SB-DPH - DO J=JTS,MIN(JTE,JDE-1) - TPH=SB+float(J-1)*DPH - DXP=ERAD*DLM*COS(TPH) - DXJ(J)=DXP - WPDARJ(J)=-W_NMM*((ERAD*DLM*AMIN1(COS(ANBI),COS(SBI)))**2+DY_NMM0**2)/ & - (grid%DT*32.*DXP*DY_NMM0) - CPGFUJ(J)=-grid%DT/(48.*DXP) - CURVJ(J)=.5*grid%DT*TAN(TPH)/ERAD - FCPJ(J)=grid%DT/(CP*192.*DXP*DY_NMM0) - FDIVJ(J)=1./(12.*DXP*DY_NMM0) - FADJ(J)=-grid%DT/(48.*DXP*DY_NMM0)*DTAD - ACDT=grid%DT*SQRT((ERAD*DLM*AMIN1(COS(ANBI),COS(SBI)))**2+DY_NMM0**2) - CDDAMP=CODAMP*ACDT - HDACJ(J)=COAC*ACDT/(4.*DXP*DY_NMM0) - DDMPUJ(J)=CDDAMP/DXP - DDMPVJ(J)=CDDAMP/DY_NMM0 - ENDDO - -! --------------DERIVED VERTICAL GRID CONSTANTS-------------------------- - - WRITE(message,*)'NEW CHANGE',grid%f4d,grid%ef4t,grid%f4q - CALL wrf_message(trim(message)) - - DO L=KDS,KDE-1 - grid%rdeta(L)=1./grid%deta(L) - grid%f4q2(L)=-.25*grid%DT*DTAD/grid%deta(L) - ENDDO - - DO J=JTS,MIN(JTE,JDE-1) - DO I=ITS,MIN(ITE,IDE-1) - grid%dx_nmm(I,J)=DXJ(J) - grid%wpdar(I,J)=WPDARJ(J)*grid%hbm2(I,J) - grid%cpgfu(I,J)=CPGFUJ(J)*grid%vbm2(I,J) - grid%curv(I,J)=CURVJ(J)*grid%vbm2(I,J) - grid%fcp(I,J)=FCPJ(J)*grid%hbm2(I,J) - grid%fdiv(I,J)=FDIVJ(J)*grid%hbm2(I,J) - grid%fad(I,J)=FADJ(J) - grid%hdacv(I,J)=HDACJ(J)*grid%vbm2(I,J) - grid%hdac(I,J)=HDACJ(J)*1.25*grid%hbm2(I,J) - ENDDO - ENDDO - - DO J=JTS, MIN(JTE,JDE-1) - IF (J.LE.5.OR.J.GE.(JDE-1)-4) THEN - KHH=(IDE-1)-2+MOD(J,2) ! KHH is global...loop over I that have - DO I=ITS,MIN(ITE,IDE-1) - IF (I .ge. 2 .and. I .le. KHH) THEN - grid%hdac(I,J)=grid%hdac(I,J)* DFC - ENDIF - ENDDO - ELSE - KHH=2+MOD(J,2) - DO I=ITS,MIN(ITE,IDE-1) - IF (I .ge. 2 .and. I .le. KHH) THEN - grid%hdac(I,J)=grid%hdac(I,J)* DFC - ENDIF - ENDDO - KHH=(IDE-1)-2+MOD(J,2) - - DO I=ITS,MIN(ITE,IDE-1) - IF (I .ge. (IDE-1)-2 .and. I .le. KHH) THEN - grid%hdac(I,J)=grid%hdac(I,J)* DFC - ENDIF - ENDDO - ENDIF - ENDDO - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - grid%ddmpu(I,J)=DDMPUJ(J)*grid%vbm2(I,J) - grid%ddmpv(I,J)=DDMPVJ(J)*grid%vbm2(I,J) - grid%hdacv(I,J)=grid%hdacv(I,J)*grid%vbm2(I,J) - ENDDO - ENDDO - -! --------------INCREASING DIFFUSION ALONG THE BOUNDARIES---------------- - - DO J=JTS,MIN(JTE,JDE-1) - IF (J.LE.5.OR.J.GE.JDE-1-4) THEN - KVH=(IDE-1)-1-MOD(J,2) - DO I=ITS,MIN(ITE,IDE-1) - IF (I .ge. 2 .and. I .le. KVH) THEN - grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC - grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC - grid%hdacv(I,J)=grid%hdacv(I,J)*DFC - ENDIF - ENDDO - ELSE - KVH=3-MOD(J,2) - DO I=ITS,MIN(ITE,IDE-1) - IF (I .ge. 2 .and. I .le. KVH) THEN - grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC - grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC - grid%hdacv(I,J)=grid%hdacv(I,J)*DFC - ENDIF - ENDDO - KVH=(IDE-1)-1-MOD(J,2) - DO I=ITS,MIN(ITE,IDE-1) - IF (I .ge. IDE-1-2 .and. I .le. KVH) THEN - grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC - grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC - grid%hdacv(I,J)=grid%hdacv(I,J)*DFC - ENDIF - ENDDO - ENDIF - ENDDO - -! This one was left over for nested domain - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - grid%GLAT(I,J)=grid%HLAT(I,J)*DTR - grid%GLON(I,J)=grid%HLON(I,J)*DTR - ENDDO - ENDDO - -!! compute EMT, EM on global domain, and only on task 0. - -! IF (wrf_dm_on_monitor()) THEN !!!! NECESSARY TO LIMIT THIS TO TASK ZERO? - - ALLOCATE(EMJ(JDS:JDE-1),EMTJ(JDS:JDE-1)) - DO J=JDS,JDE-1 - TPH=SB+float(J-1)*DPH - DXP=ERAD*DLM*COS(TPH) - EMJ(J)= grid%DT/( 4.*DXP)*DTAD - EMTJ(J)=grid%DT/(16.*DXP)*DTAD - ENDDO - - JA=0 - DO 161 J=3,5 - JA=JA+1 - KHLA(JA)=2 - KHHA(JA)=(IDE-1)-1-MOD(J+1,2) - 161 grid%emt(JA)=EMTJ(J) - DO 162 J=(JDE-1)-4,(JDE-1)-2 - JA=JA+1 - KHLA(JA)=2 - KHHA(JA)=(IDE-1)-1-MOD(J+1,2) - 162 grid%emt(JA)=EMTJ(J) - DO 163 J=6,(JDE-1)-5 - JA=JA+1 - KHLA(JA)=2 - KHHA(JA)=2+MOD(J,2) - 163 grid%emt(JA)=EMTJ(J) - DO 164 J=6,(JDE-1)-5 - JA=JA+1 - KHLA(JA)=(IDE-1)-2 - KHHA(JA)=(IDE-1)-1-MOD(J+1,2) - 164 grid%emt(JA)=EMTJ(J) - -! --------------SPREADING OF UPSTREAM VELOCITY-POINT ADVECTION FACTOR---- - - JA=0 - DO 171 J=3,5 - JA=JA+1 - KVLA(JA)=2 - KVHA(JA)=(IDE-1)-1-MOD(J,2) - 171 grid%em(JA)=EMJ(J) - DO 172 J=(JDE-1)-4,(JDE-2)-2 - JA=JA+1 - KVLA(JA)=2 - KVHA(JA)=(IDE-1)-1-MOD(J,2) - 172 grid%em(JA)=EMJ(J) - DO 173 J=6,(JDE-1)-5 - JA=JA+1 - KVLA(JA)=2 - KVHA(JA)=2+MOD(J+1,2) - 173 grid%em(JA)=EMJ(J) - DO 174 J=6,(JDE-1)-5 - JA=JA+1 - KVLA(JA)=(IDE-1)-2 - KVHA(JA)=(IDE-1)-1-MOD(J,2) - 174 grid%em(JA)=EMJ(J) - -! ENDIF ! wrf_dm_on_monitor - -!! must be a better place to put this, but will eliminate "phantom" -!! wind points here (no wind point on eastern boundary of odd numbered rows) -!! - ! phantom - IF (ABS(IDE-1-ITE) .eq. 1 ) THEN ! | - CALL wrf_message('zero phantom winds') ! H [x] H V - DO K=KDS,KDE-1 ! - DO J=JDS,JDE-1,2 ! V [H] V H - IF (J .ge. JTS .and. J .le. JTE) THEN ! - grid%u(IDE-1,J,K)=0. ! H [x] H V - grid%v(IDE-1,J,K)=0. ! ------ ------ - ENDIF ! ide-1 ide - ENDDO ! NMM/si WRF - ENDDO ! domain domain - ENDIF ! (dummy) - - -! just a test for gravity waves - -! PD=62000. -! grid%u=0.0 -! grid%v=0.0 -! T=300. -! Q=0.0 -! Q2=0.0 -! CWM=0.0 -! FIS=0.0 - -! testx -! DO J = JTS, MIN(JTE,JDE-1) -! DO K = KTS,KTE -! DO I = ITS, MIN(ITE,IDE-1) -! grid%sm(I,J)=I -! grid%u(I,K,J)=J -! ENDDO -! ENDDO -! ENDDO -! - -! deallocs - - DEALLOCATE(KHL2,KVL2,KHH2,KVH2) - DEALLOCATE(DXJ,WPDARJ,CPGFUJ,CURVJ) - DEALLOCATE(FCPJ,FDIVJ,FADJ) - DEALLOCATE(HDACJ,DDMPUJ,DDMPVJ) - DEALLOCATE(KHLA,KHHA) - DEALLOCATE(KVLA,KVHA) -ENDIF - - -END SUBROUTINE med_initialize_nest_nmm -!====================================================================== - -!-------------------------------------------------------------------------------------- -#if 0 -SUBROUTINE initial_nest_pivot ( parent , nest, iloc, jloc ) - -!========================================================================================== -! -! This program produces i_start and j_start for the nested domain depending on the -! central lat-lon of the storm. -! -!========================================================================================== - - USE module_domain - USE module_configure - USE module_timing - USE module_dm - - IMPLICIT NONE - TYPE(domain) , POINTER :: parent , nest - INTEGER, INTENT(OUT) :: ILOC,JLOC - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER :: NIDE,NJDE ! nest dimension - INTEGER :: I,J,ITER,IDUM,JDUM - REAL :: ALAT,ALON,DIFF1,DIFF2,ERR - REAL :: parent_CLAT,parent_CLON,parent_SLAT,parent_SLON - REAL :: parent_WBD,parent_SBD,parent_DLMD,parent_DPHD -!======================================================================================== - -! First obtain central latitude and longitude for the parent domain - - CALL nl_get_cen_lat (parent%ID, parent_CLAT) - CALL nl_get_cen_lon (parent%ID, parent_CLON) -! CALL nl_get_storm_lat (parent%ID, parent_SLAT) -! CALL nl_get_storm_lon (parent%ID, parent_SLON) - -! Parent grid configuration, including, western and southern boundary - - IDS = parent%sd31 - IDE = parent%ed31 - JDS = parent%sd32 - JDE = parent%ed32 - KDS = parent%sd33 - KDE = parent%ed33 - - IMS = parent%sm31 - IME = parent%em31 - JMS = parent%sm32 - JME = parent%em32 - KMS = parent%sm33 - KME = parent%em33 - - ITS = parent%sp31 - ITE = parent%ep31 - JTS = parent%sp32 - JTE = parent%ep32 - KTS = parent%sp33 - KTE = parent%ep33 - - NIDE = nest%ed31 - NJDE = nest%ed32 - - parent_DLMD = parent%dx ! DLMD: dlamda in degrees - parent_DPHD = parent%dy ! DPHD: dphi in degrees - parent_WBD = -(IDE-2)*parent%dx ! WBD0: in deg;factor 2 takes care of dummy last column - parent_SBD = -((JDE-1)/2)*parent%dy ! SBD0: in degrees; note that JDE-1 should be odd - ALAT = parent_SLAT - 0.5*(NJDE-2)*parent_DPHD/nest%parent_grid_ratio - ALON = parent_SLON - 1.0*(NIDE-2)*parent_DLMD/nest%parent_grid_ratio - - CALL EARTH_LATLON ( parent%HLAT,parent%HLON,parent%VLAT,parent%VLON, & !output - parent_DLMD,parent_DPHD,parent_WBD,parent_SBD, & !inputs - parent_CLAT,parent_CLON, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - -! start iteration - - ILOC=-99 - JLOC=-99 - ERR=0.1 - ITER=1 -100 CONTINUE - - DO J = JTS,min(JTE,JDE-1) - DO I = ITS,min(ITE,IDE-1) - DIFF1 = ABS(ALAT - parent%HLAT(I,J)) - DIFF2 = ABS(ALON - parent%HLON(I,J)) - IF(DIFF1 .LE. ERR .AND. DIFF2 .LE. ERR)THEN - ILOC=I - JLOC=J - ENDIF - ENDDO - ENDDO - - CALL wrf_dm_maxval_integer ( ILOC, idum, jdum ) - CALL wrf_dm_maxval_integer ( JLOC, idum, jdum ) - - IF(ILOC .EQ. -99 .AND. JLOC .EQ. -99)THEN - ERR=ERR+0.1 - ITER=ITER+1 - IF(ITER .LE. 100)GO TO 100 - ENDIF - - IF(ILOC .NE. -99 .AND. JLOC .NE. -99)THEN - WRITE(message,*)'NOTE: I_PARENT_START AND J_PARENT_START FOUND FOR THE NESTED DOMAIN CONFIGURATION AT ITER=',ITER - CALL wrf_message(trim(message)) - WRITE(message,*)'istart=',ILOC - CALL wrf_message(trim(message)) - WRITE(message,*)'jstart=',JLOC - CALL wrf_message(trim(message)) - ELSE - ILOC=IDE/3 - JLOC=JDE/3 -! - WRITE(message,*)'WARNING: COULD NOT LOCATE I_PARENT_START AND J_PARENT_START FROM INPUT STORM INFO' - CALL wrf_message(trim(message)) - WRITE(message,*)'ISTART=',IDE/3 - CALL wrf_message(trim(message)) - WRITE(message,*)'JSTART=',JDE/3 - CALL wrf_message(trim(message)) - ENDIF - - RETURN -END SUBROUTINE initial_nest_pivot - -!============================================================================================ -#endif - -LOGICAL FUNCTION cd_feedback_mask_orig( pig, ips_save, ipe_save , pjg, jps_save, jpe_save, xstag, ystag ) - INTEGER, INTENT(IN) :: pig, ips_save, ipe_save , pjg, jps_save, jpe_save - LOGICAL, INTENT(IN) :: xstag, ystag - - INTEGER ioff, joff - - ioff = 0 ; joff = 0 - IF ( xstag ) ioff = 1 - IF ( ystag ) joff = 1 - - cd_feedback_mask_orig = ( pig .ge. ips_save+2 .and. & - pjg .ge. jps_save+3 .and. & - pig .le. ipe_save-2-mod(pjg-jps_save,2) .and. & - pjg .le. jpe_save-3 ) - -END FUNCTION cd_feedback_mask_orig - -LOGICAL FUNCTION cd_feedback_mask( pig, ips_save, ipe_save , pjg, jps_save, jpe_save, xstag, ystag ) - INTEGER, INTENT(IN) :: pig, ips_save, ipe_save , pjg, jps_save, jpe_save - LOGICAL, INTENT(IN) :: xstag, ystag - - INTEGER ioff, joff - - ioff = 0 ; joff = 0 - IF ( xstag ) ioff = 1 - IF ( ystag ) joff = 1 - - cd_feedback_mask = ( pig .ge. ips_save+1 .and. & - pjg .ge. jps_save+2 .and. & - pig .le. ipe_save-1-mod(pjg-jps_save,2) .and. & - pjg .le. jpe_save-2 ) - -END FUNCTION cd_feedback_mask - -LOGICAL FUNCTION cd_feedback_mask_v( pig, ips_save, ipe_save , pjg, jps_save, jpe_save, xstag, ystag ) - INTEGER, INTENT(IN) :: pig, ips_save, ipe_save , pjg, jps_save, jpe_save - LOGICAL, INTENT(IN) :: xstag, ystag - - INTEGER ioff, joff - - ioff = 0 ; joff = 0 - IF ( xstag ) ioff = 1 - IF ( ystag ) joff = 1 - - cd_feedback_mask_v = ( pig .ge. ips_save+2 .and. & - pjg .ge. jps_save+3 .and. & - pig .le. ipe_save-2-mod(pjg-jps_save+1,2) .and. & - pjg .le. jpe_save-3 ) - -END FUNCTION cd_feedback_mask_v - - -!---------------------------------------------------------------------------- -#else -SUBROUTINE stub_nmm_nest_stub -END SUBROUTINE stub_nmm_nest_stub -#endif - -RECURSIVE SUBROUTINE find_ijstart_level ( grid, i_start, j_start, level ) - -! Dusan Jovic - - USE module_domain - - IMPLICIT NONE - - ! Input data. - - TYPE(domain) :: grid - INTEGER, INTENT (OUT) :: i_start, j_start, level - INTEGER :: iadd - - if (grid%parent_id == 0 ) then - i_start = 1 - j_start = 1 - level = 0 - else - call find_ijstart_level ( grid%parents(1)%ptr, i_start, j_start, level ) - if (level > 0) then - iadd = (i_start-1)*3 - if ( mod(j_start,2).ne.0 .and. mod(grid%j_parent_start,2).ne.0 ) iadd = iadd - 1 - if ( mod(j_start,2).eq.0 .and. mod(grid%j_parent_start,2).eq.0 ) iadd = iadd + 2 - else - iadd = -mod(grid%j_parent_start,2) - end if - i_start = iadd + grid%i_parent_start*3 - 1 - j_start = ( (j_start-1) + (grid%j_parent_start-1) ) * 3 + 1 - level = level + 1 - end if - -END SUBROUTINE find_ijstart_level diff --git a/dyn_nmm/RDTEMP.F b/dyn_nmm/RDTEMP.F deleted file mode 100644 index da33909e51..0000000000 --- a/dyn_nmm/RDTEMP.F +++ /dev/null @@ -1,140 +0,0 @@ -! -!NCEP_MESO:MODEL_LAYER: PHYSICS -! -!*********************************************************************** - SUBROUTINE RDTEMP(NTSD,DT,JULDAY,JULYR,XTIME,IHRST,GLAT,GLON & - & ,CZEN,CZMEAN,T,RSWTT,RLWTT,HBM2 & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: RDTEMP RADIATIVE TEMPERATURE CHANGE -! PRGRMMR: BLACK ORG: W/NP22 DATE: 93-12-29 -! -! ABSTRACT: -! RDTEMP APPLIES THE TEMPERATURE TENDENCIES DUE TO -! RADIATION AT ALL LAYERS AT EACH ADJUSTMENT TIME STEP -! -! PROGRAM HISTORY LOG: -! 87-09-?? BLACK - ORIGINATOR -! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL -! 95-11-20 ABELES - PARALLEL OPTIMIZATION -! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY -! 02-06-07 BLACK - WRF CODING STANDARDS -! 02-09-09 WOLFE - CONVERTING TO GLOBAL INDEXING -! 05-12-19 BLACK - CONVERTED FROM IKJ TO IJK -! -! USAGE: CALL RDTEMP FROM SUBROUTINE SOLVE_RUNSTREAM -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!----------------------------------------------------------------------- - USE MODULE_MPP - USE MODULE_RA_GFDLETA,ONLY : CAL_MON_DAY,ZENITH -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,INTENT(IN) :: IHRST,JULDAY,JULYR,NTSD -! - REAL,INTENT(IN) :: DT,XTIME -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: CZMEAN,GLAT,GLON & - & ,HBM2 -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: RLWTT & - & ,RSWTT -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: T -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: CZEN -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - INTEGER :: I,J,JDAY,JMONTH,K -! - INTEGER,DIMENSION(3) :: IDAT -! - REAL :: DAYI,HOUR,TIMES,TTNDKL -! - REAL,DIMENSION(IMS:IME,JMS:JME) :: CZEN2,XLAT2,XLON2 -! - REAL,DIMENSION(ITS:ITE,JTS:JTE) :: FACTR -! - REAL :: DEGRAD=3.1415926/180. - real :: xlat1,xlon1 -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- - MYIS=MAX(IDS,ITS) - MYIE=MIN(IDE,ITE) - MYJS=MAX(JDS,JTS) - MYJE=MIN(JDE,JTE) -!----------------------------------------------------------------------- -! -!*** GET CURRENT VALUE OF COS(ZENITH ANGLE) -! -! TIMES=NTSD*DT - TIMES=XTIME*60. -! - DO J=MYJS,MYJE - DO I=MYIS,MYIE - XLAT2(I,J)=GLAT(I,J) - XLON2(I,J)=GLON(I,J) -!!!!!!!!!!!!Remove the following lines after bit-correct answers -!!!!!!!!!!!!are established with the control -! xlat1=glat(i,j)/degrad -! xlat2(i,j)=xlat1*degrad -! xlon1=glon(i,j)/degrad -! xlon2(i,j)=xlon1*degrad -!!!!!!!!!!!! -!!!!!!!!!!!! - ENDDO - ENDDO -! - CALL CAL_MON_DAY(JULDAY,JULYR,JMONTH,JDAY) - - IDAT(1)=JMONTH - IDAT(2)=JDAY - IDAT(3)=JULYR -! - CALL ZENITH(TIMES,DAYI,HOUR,IDAT,IHRST,XLON2,XLAT2,CZEN2 & - & ,MYIS,MYIE,MYJS,MYJE & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - DO J=MYJS,MYJE - DO I=MYIS,MYIE - CZEN(I,J)=CZEN2(I,J) - IF(CZMEAN(I,J)>0.)THEN - FACTR(I,J)=CZEN(I,J)/CZMEAN(I,J) - ELSE - FACTR(I,J)=0. - ENDIF - ENDDO - ENDDO -! - DO K=KTS,KTE - DO J=MYJS,MYJE - DO I=MYIS,MYIE - TTNDKL=RSWTT(I,J,K)*FACTR(I,J)+RLWTT(I,J,K) - T(I,J,K)=T(I,J,K)+TTNDKL*DT*HBM2(I,J) - ENDDO - ENDDO - ENDDO -!----------------------------------------------------------------------- - END SUBROUTINE RDTEMP -!----------------------------------------------------------------------- diff --git a/dyn_nmm/adve_optim.h b/dyn_nmm/adve_optim.h deleted file mode 100644 index 313fb4c3b5..0000000000 --- a/dyn_nmm/adve_optim.h +++ /dev/null @@ -1,1173 +0,0 @@ -!*********************************************************************** - SUBROUTINE ADVE(NTSD,DT,DETA1,DETA2,PDTOP & - & ,CURV,F,FAD,F4D,EM_LOC,EMT_LOC,EN,ENT,DX,DY & - & ,HTM,HBM2,VTM,VBM2,LMH,LMV & - & ,T,U,V,PDSLO,TOLD,UOLD,VOLD & - & ,PETDT,UPSTRM & - & ,FEW,FNS,FNE,FSE & - & ,ADT,ADU,ADV & - & ,N_IUP_H,N_IUP_V & - & ,N_IUP_ADH,N_IUP_ADV & - & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV & - & ,IHE,IHW,IVE,IVW,INDX3_WRK & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: ADVE HORIZONTAL AND VERTICAL ADVECTION -! PRGRMMR: JANJIC ORG: W/NP22 DATE: 93-10-28 -! -! ABSTRACT: -! ADVE CALCULATES THE CONTRIBUTION OF THE HORIZONTAL AND VERTICAL -! ADVECTION TO THE TENDENCIES OF TEMPERATURE AND WIND AND THEN -! UPDATES THOSE VARIABLES. -! THE JANJIC ADVECTION SCHEME FOR THE ARAKAWA E GRID IS USED -! FOR ALL VARIABLES INSIDE THE FIFTH ROW. AN UPSTREAM SCHEME -! IS USED ON ALL VARIABLES IN THE THIRD, FOURTH, AND FIFTH -! OUTERMOST ROWS. THE ADAMS-BASHFORTH TIME SCHEME IS USED. -! -! PROGRAM HISTORY LOG: -! 87-06-?? JANJIC - ORIGINATOR -! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL -! 96-03-28 BLACK - ADDED EXTERNAL EDGE -! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY -! 99-07- JANJIC - CONVERTED TO ADAMS-BASHFORTH SCHEME -! COMBINING HORIZONTAL AND VERTICAL ADVECTION -! 02-02-04 BLACK - ADDED VERTICAL CFL CHECK -! 02-02-05 BLACK - CONVERTED TO WRF FORMAT -! 02-08-29 MICHALAKES - CONDITIONAL COMPILATION OF MPI -! CONVERT TO GLOBAL INDEXING -! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING -! 04-05-29 JANJIC,BLACK - CRANK-NICHOLSON VERTICAL ADVECTION -! -! USAGE: CALL ADVE FROM SUBROUTINE SOLVE_RUNSTREAM -! INPUT ARGUMENT LIST: -! -! OUTPUT ARGUMENT LIST: -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!*********************************************************************** -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V & - & ,N_IUP_ADH,N_IUP_ADV - INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V & - & ,IUP_ADH,IUP_ADV & - & ,LMH,LMV -! -!*** NMM_MAX_DIM is set in configure.wrf and must agree with -!*** the value of dimspec q in the Registry/Registry -! - INTEGER,DIMENSION(-3:3,NMM_MAX_DIM,0:6),INTENT(IN) :: INDX3_WRK -! - INTEGER,INTENT(IN) :: NTSD -! - REAL,INTENT(IN) :: DT,DY,EN,ENT,F4D,PDTOP -! - REAL,DIMENSION(NMM_MAX_DIM),INTENT(IN) :: EM_LOC,EMT_LOC -! - REAL,DIMENSION(KMS:KME),INTENT(IN) :: DETA1,DETA2 -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: CURV,DX,F,FAD,HBM2 & - & ,PDSLO,VBM2 -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: PETDT -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: HTM,VTM -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: T,TOLD & - & ,U,UOLD & - & ,V,VOLD -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: ADT,ADU & - & ,ADV & - & ,FEW,FNE & - & ,FNS,FSE -! -!----------------------------------------------------------------------- -! -!*** LOCAL VARIABLES -! - LOGICAL :: UPSTRM -! - INTEGER :: I,IEND,IFP,IFQ,II,IPQ,ISP,ISQ,ISTART & - & ,IUP_ADH_J,IVH,IVL & - & ,J,J1,JA,JAK,JEND,JGLOBAL,JJ,JKNT,JP2,JSTART & - & ,K,KNTI_ADH,KSTART,KSTOP,LMHK,LMVK & - & ,N,N_IUPH_J,N_IUPADH_J,N_IUPADV_J -! - INTEGER :: MY_IS_GLB,MY_IE_GLB,MY_JS_GLB,MY_JE_GLB -! - INTEGER :: J0_P3,J0_P2,J0_P1,J0_00,J0_M1,J1_P2,J1_P1,J1_00,J1_M1 & - & ,J2_P1,J2_00,J2_M1,J3_P2,J3_P1,J3_00 & - & ,J4_P1,J4_00,J4_M1,J5_00,J5_M1,J6_P1,J6_00 -! - INTEGER,DIMENSION(ITS-5:ITE+5,KTS:KTE) :: ISPA,ISQA -! - REAL :: ARRAY3_X,CFT,CFU,CFV,CMT,CMU,CMV & - & ,DPDE_P3,DTE,DTQ & - & ,F0,F1,F2,F3,FEW_00,FEW_P1,FNE_X,FNS_P1,FNS_X,FPP,FSE_X & - & ,HM,PDOP,PDOPU,PDOPV,PP & - & ,PVVLO,PVVLOU,PVVLOV,PVVUP,PVVUPU,PVVUPV & - & ,QP,RDP,RDPD,RDPDX,RDPDY,RDPU,RDPV & - & ,T_UP,TEMPA,TEMPB,TTA,TTB,U_UP,UDY_P1,UDY_X & - & ,VXD_X,VDX_P2,V_UP,VDX_X,VM,VTA,VUA,VVA & - & ,VVLO,VVLOU,VVLOV,VVUP,VVUPU,VVUPV -! - REAL,DIMENSION(ITS-5:ITE+5,KTS:KTE) :: ARRAY0,ARRAY1 & - & ,ARRAY2,ARRAY3 & - & ,VAD_TEND_T,VAD_TEND_U & - & ,VAD_TEND_V -! - REAL,DIMENSION(ITS-5:ITE+5,KTS:KTE) :: TEW,UEW,VEW -! - REAL,DIMENSION(KTS:KTE) :: CRT,CRU,CRV,DETA1_PDTOP & - & ,RCMT,RCMU,RCMV,RSTT,RSTU,RSTV,TN,UN & - & ,VAD_TNDX_T,VAD_TNDX_U,VAD_TNDX_V,VN -! - REAL,DIMENSION(ITS-5:ITE+5,-1:1) :: PETDTK -! - REAL,DIMENSION(ITS-5:ITE+5) :: TDN,UDN,VDN -! -!----------------------------------------------------------------------- -! -!*** TYPE 0 WORKING ARRAY -! - REAL,DIMENSION(ITS-5:ITE+5,KMS:KME,-3:3) :: DPDE -! -!*** TYPE 1 WORKING ARRAY -! - REAL,DIMENSION(ITS-5:ITE+5,KMS:KME,-2:2) :: TST,UDY,UST,VDX,VST -! -!*** TYPE 4 WORKING ARRAY -! - REAL,DIMENSION(ITS-5:ITE+5,KMS:KME,-1:1) :: TNS,UNS,VNS -! -!*** TYPE 5 WORKING ARRAY -! - REAL,DIMENSION(ITS-5:ITE+5,KMS:KME,-1:0) :: TNE,UNE,VNE -! -!*** TYPE 6 WORKING ARRAY -! - REAL,DIMENSION(ITS-5:ITE+5,KMS:KME, 0:1) :: TSE,USE,VSE -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!*********************************************************************** -! -! DPDE ----- 3 -! | J Increasing -! | -! | ^ -! FNS ----- 2 | -! | | -! | | -! | | -! VNS ----- 1 | -! | -! | -! | -! ADV ----- 0 ------> Current J -! | -! | -! | -! VNS ----- -1 -! | -! | -! | -! FNS ----- -2 -! | -! | -! | -! DPDE ----- -3 -! -!*********************************************************************** -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! - ISTART=MYIS_P2 - IEND=MYIE_P2 - IF(ITE==IDE)IEND=MYIE-3 -! - DTQ=DT*0.25 - DTE=DT*(0.5*0.25) -!*** -!*** INITIALIZE SOME WORKING ARRAYS TO ZERO -!*** - DO K=KTS,KTE - DO I=ITS-5,ITE+5 - TEW(I,K)=0. - UEW(I,K)=0. - VEW(I,K)=0. - ENDDO - ENDDO -! -!*** TYPE 0 -! - DO N=-3,3 - DO K=KTS,KTE - DO I=ITS-5,ITE+5 - DPDE(I,K,N)=0. - ENDDO - ENDDO - ENDDO -! -!*** TYPE 1 -! - DO N=-2,2 - DO K=KTS,KTE - DO I=ITS-5,ITE+5 - TST(I,K,N)=0. - UST(I,K,N)=0. - VST(I,K,N)=0. - UDY(I,K,N)=0. - VDX(I,K,N)=0. - ENDDO - ENDDO - ENDDO -! -!*** TYPES 5 AND 6 -! - DO N=-1,0 - DO K=KTS,KTE - DO I=ITS-5,ITE+5 - TNE(I,K,N)=0. - TSE(I,K,N+1)=0. - UNE(I,K,N)=0. - USE(I,K,N+1)=0. - VNE(I,K,N)=0. - VSE(I,K,N+1)=0. - ENDDO - ENDDO - ENDDO -!----------------------------------------------------------------------- -!*** -!*** PRECOMPUTE DETA1 TIMES PDTOP. -!*** -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DETA1_PDTOP(K)=DETA1(K)*PDTOP - ENDDO -!----------------------------------------------------------------------- -!*** -!*** WE NEED THE STARTING AND ENDING J FOR THIS TASK'S INTEGRATION -!*** - JSTART=MYJS2 - JEND=MYJE2 -! -! -!----------------------------------------------------------------------- -! -!*** START THE HORIZONTAL ADVECTION IN THE INITIAL SOUTHERN SLABS. -! -!----------------------------------------------------------------------- -! - DO J=-2,1 - JJ=JSTART+J - DO K=KTS,KTE - DO I=MYIS_P4,MYIE_P4 - TST(I,K,J)=T(I,K,JJ)*FFC+TOLD(I,K,JJ)*FBC - UST(I,K,J)=U(I,K,JJ)*FFC+UOLD(I,K,JJ)*FBC - VST(I,K,J)=V(I,K,JJ)*FFC+VOLD(I,K,JJ)*FBC - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** MARCH NORTHWARD THROUGH THE SOUTHERNMOST SLABS TO BEGIN -!*** FILLING THE MAIN WORKING ARRAYS WHICH ARE MULTI-DIMENSIONED -!*** IN J BECAUSE THEY ARE DIFFERENCED OR AVERAGED IN J. -!*** ONLY THE NORTHERNMOST OF EACH OF THE WORKING ARRAYS WILL BE -!*** FILLED IN THE PRIMARY INTEGRATION SECTION. -!----------------------------------------------------------------------- -! - J1=-3 - IF(JTS==JDS)J1=-2 ! Cannot go 3 south from J=2 for south tasks -! - DO J=J1,2 - JJ=JSTART+J -! - DO K=KTS,KTE - DO I=MYIS_P4,MYIE_P4 - DPDE(I,K,J)=DETA1_PDTOP(K)+DETA2(K)*PDSLO(I,JJ) - ENDDO - ENDDO -! - ENDDO -! -!----------------------------------------------------------------------- - DO J=-2,1 - JJ=JSTART+J -! - DO K=KTS,KTE - DO I=MYIS_P4,MYIE_P4 - UDY(I,K,J)=U(I,K,JJ)*DY - VDX_X=V(I,K,JJ)*DX(I,JJ) - FNS(I,K,JJ)=VDX_X*(DPDE(I,K,J-1)+DPDE(I,K,J+1)) - VDX(I,K,J)=VDX_X - ENDDO - ENDDO -! - ENDDO -! -!----------------------------------------------------------------------- - DO J=-2,0 - JJ=JSTART+J -! - DO K=KTS,KTE - DO I=MYIS_P3,MYIE_P3 - TEMPA=(UDY(I+IHE(JJ),K,J)+VDX(I+IHE(JJ),K,J)) & - & +(UDY(I,K,J+1) +VDX(I,K,J+1)) - FNE(I,K,JJ)=TEMPA*(DPDE(I,K,J)+DPDE(I+IHE(JJ),K,J+1)) - ENDDO - ENDDO -! - ENDDO -! -!----------------------------------------------------------------------- - DO J=-1,1 - JJ=JSTART+J -! - DO K=KTS,KTE - DO I=MYIS_P3,MYIE_P3 - TEMPB=(UDY(I+IHE(JJ),K,J)-VDX(I+IHE(JJ),K,J)) & - & +(UDY(I,K,J-1) -VDX(I,K,J-1)) - FSE(I,K,JJ)=TEMPB*(DPDE(I,K,J)+DPDE(I+IHE(JJ),K,J-1)) - ENDDO - ENDDO -! - ENDDO -! -!----------------------------------------------------------------------- - DO J=-1,0 - JJ=JSTART+J -! - DO K=KTS,KTE - DO I=MYIS1_P3,MYIE1_P3 - FNS_X=FNS(I,K,JJ) - TNS(I,K,J)=FNS_X*(TST(I,K,J+1)-TST(I,K,J-1)) -! - UDY_X=U(I,K,JJ)*DY - FEW(I,K,JJ)=UDY_X*(DPDE(I+IVW(JJ),K,J)+DPDE(I+IVE(JJ),K,J)) - ENDDO - ENDDO -! - DO K=KTS,KTE - DO I=MYIS1_P4,MYIE1_P4 - UNS(I,K,J)=(FNS(I+IHW(JJ),K,JJ)+FNS(I+IHE(JJ),K,JJ)) & - & *(UST(I,K,J+1)-UST(I,K,J-1)) - VNS(I,K,J)=(FNS(I,K,JJ-1)+FNS(I,K,JJ+1)) & - & *(VST(I,K,J+1)-VST(I,K,J-1)) - ENDDO - ENDDO -! - ENDDO -! -!----------------------------------------------------------------------- - JJ=JSTART-1 -! - DO K=KTS,KTE - DO I=MYIS1_P2,MYIE1_P2 - FNE_X=FNE(I,K,JJ) - TNE(I,K,-1)=FNE_X*(TST(I+IHE(JJ),K,0)-TST(I,K,-1)) -! - FSE_X=FSE(I,K,JJ+1) - TSE(I,K,0)=FSE_X*(TST(I+IHE(JJ+1),K,-1)-TST(I,K,0)) -! - UNE(I,K,-1)=(FNE(I+IVW(JJ),K,JJ)+FNE(I+IVE(JJ),K,JJ)) & - & *(UST(I+IVE(JJ),K,0)-UST(I,K,-1)) - USE(I,K,0)=(FSE(I+IVW(JJ+1),K,JJ+1)+FSE(I+IVE(JJ+1),K,JJ+1)) & - & *(UST(I+IVE(JJ+1),K,-1)-UST(I,K,0)) - VNE(I,K,-1)=(FNE(I,K,JJ-1)+FNE(I,K,JJ+1)) & - & *(VST(I+IVE(JJ),K,0)-VST(I,K,-1)) - VSE(I,K,0)=(FSE(I,K,JJ)+FSE(I,K,JJ+2)) & - & *(VST(I+IVE(JJ+1),K,-1)-VST(I,K,0)) - ENDDO - ENDDO -! - JKNT=0 -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! - main_integration : DO J=JSTART,JEND -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!*** -!*** SET THE 3RD INDEX IN THE WORKING ARRAYS (SEE SUBROUTINE INIT -!*** AND PFDHT DIAGRAMS) -!*** -!*** J[TYPE]_NN WHERE "TYPE" IS THE WORKING ARRAY TYPE SEEN IN THE -!*** LOCAL DECLARATION ABOVE (DEPENDENT UPON THE J EXTENT) AND -!*** NN IS THE NUMBER OF ROWS NORTH OF THE CENTRAL ROW WHOSE J IS -!*** THE CURRENT VALUE OF THE main_integration LOOP. -!*** (P3 denotes +3, M1 denotes -1, etc.) -!*** - -! -! John and Tom both think this is all right, even for tiles, -! as long as the slab arrays being indexed by these things -! are locally defined. -! - JKNT=JKNT+1 -! - J0_P3=INDX3_WRK(3,JKNT,0) - J0_P2=INDX3_WRK(2,JKNT,0) - J0_P1=INDX3_WRK(1,JKNT,0) - J0_00=INDX3_WRK(0,JKNT,0) - J0_M1=INDX3_WRK(-1,JKNT,0) -! - J1_P2=INDX3_WRK(2,JKNT,1) - J1_P1=INDX3_WRK(1,JKNT,1) - J1_00=INDX3_WRK(0,JKNT,1) - J1_M1=INDX3_WRK(-1,JKNT,1) -! - J2_P1=INDX3_WRK(1,JKNT,2) - J2_00=INDX3_WRK(0,JKNT,2) - J2_M1=INDX3_WRK(-1,JKNT,2) -! - J3_P2=INDX3_WRK(2,JKNT,3) - J3_P1=INDX3_WRK(1,JKNT,3) - J3_00=INDX3_WRK(0,JKNT,3) -! - J4_P1=INDX3_WRK(1,JKNT,4) - J4_00=INDX3_WRK(0,JKNT,4) - J4_M1=INDX3_WRK(-1,JKNT,4) -! - J5_00=INDX3_WRK(0,JKNT,5) - J5_M1=INDX3_WRK(-1,JKNT,5) -! - J6_P1=INDX3_WRK(1,JKNT,6) - J6_00=INDX3_WRK(0,JKNT,6) -! - MY_IS_GLB=1 ! make this a noop for global indexing - MY_IE_GLB=1 ! make this a noop for global indexing - MY_JS_GLB=1 ! make this a noop for global indexing - MY_JE_GLB=1 ! make this a noop for global indexing -! -!----------------------------------------------------------------------- -!*** THE WORKING ARRAYS FOR THE PRIMARY VARIABLES -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DO I=MYIS_P4,MYIE_P4 - TST(I,K,J1_P2)=T(I,K,J+2)*FFC+TOLD(I,K,J+2)*FBC - UST(I,K,J1_P2)=U(I,K,J+2)*FFC+UOLD(I,K,J+2)*FBC - VST(I,K,J1_P2)=V(I,K,J+2)*FFC+VOLD(I,K,J+2)*FBC - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** MASS FLUXES AND MASS POINT ADVECTION COMPONENTS -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DO I=MYIS_P4,MYIE_P4 -! -!----------------------------------------------------------------------- -!*** THE NS AND EW FLUXES IN THE FOLLOWING LOOP ARE ON V POINTS -!*** FOR T. -!----------------------------------------------------------------------- -! - DPDE_P3=DETA1_PDTOP(K)+DETA2(K)*PDSLO(I,J+3) - DPDE(I,K,J0_P3)=DPDE_P3 -! -!----------------------------------------------------------------------- - UDY(I,K,J1_P2)=U(I,K,J+2)*DY - VDX_P2=V(I,K,J+2)*DX(I,J+2) - VDX(I,K,J1_P2)=VDX_P2 - FNS(I,K,J+2)=VDX_P2*(DPDE(I,K,J0_P1)+DPDE_P3) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- - DO K=KTS,KTE - DO I=MYIS_P3,MYIE_P3 - TEMPA=(UDY(I+IHE(J+1),K,J1_P1)+VDX(I+IHE(J+1),K,J1_P1)) & - & +(UDY(I,K,J1_P2) +VDX(I,K,J1_P2)) - FNE(I,K,J+1)=TEMPA*(DPDE(I,K,J0_P1)+DPDE(I+IHE(J+1),K,J0_P2)) -! -!----------------------------------------------------------------------- - TEMPB=(UDY(I+IHE(J+2),K,J1_P2)-VDX(I+IHE(J+2),K,J1_P2)) & - & +(UDY(I,K,J1_P1) -VDX(I,K,J1_P1)) - FSE(I,K,J+2)=TEMPB*(DPDE(I,K,J0_P2)+DPDE(I+IHE(J),K,J0_P1)) -! -!----------------------------------------------------------------------- - FNS_P1=FNS(I,K,J+1) - TNS(I,K,J4_P1)=FNS_P1*(TST(I,K,J1_P2)-TST(I,K,J1_00)) -! -!----------------------------------------------------------------------- - UDY_P1=U(I,K,J+1)*DY - FEW(I,K,J+1)=UDY_P1*(DPDE(I+IVW(J+1),K,J0_P1) & - & +DPDE(I+IVE(J+1),K,J0_P1)) - FEW_00=FEW(I,K,J) - TEW(I,K)=FEW_00*(TST(I+IVE(J),K,J1_00)-TST(I+IVW(J),K,J1_00)) -! -!----------------------------------------------------------------------- -!*** THE NE AND SE FLUXES ARE ASSOCIATED WITH H POINTS -!*** (ACTUALLY JUST TO THE NE AND SE OF EACH H POINT). -!----------------------------------------------------------------------- -! - FNE_X=FNE(I,K,J) - TNE(I,K,J5_00)=FNE_X*(TST(I+IHE(J),K,J1_P1)-TST(I,K,J1_00)) -! - FSE_X=FSE(I,K,J+1) - TSE(I,K,J6_P1)=FSE_X*(TST(I+IHE(J+1),K,J1_00)-TST(I,K,J1_P1)) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** CALCULATION OF MOMENTUM ADVECTION COMPONENTS -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!*** THE NS AND EW FLUXES ARE ON H POINTS FOR U AND V. -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DO I=MYIS_P2,MYIE_P2 - UEW(I,K)=(FEW(I+IHW(J),K,J)+FEW(I+IHE(J),K,J)) & - & *(UST(I+IHE(J),K,J1_00)-UST(I+IHW(J),K,J1_00)) - UNS(I,K,J4_P1)=(FNS(I+IHW(J+1),K,J+1) & - & +FNS(I+IHE(J+1),K,J+1)) & - & *(UST(I,K,J1_P2)-UST(I,K,J1_00)) - VEW(I,K)=(FEW(I,K,J-1)+FEW(I,K,J+1)) & - & *(VST(I+IHE(J),K,J1_00)-VST(I+IHW(J),K,J1_00)) - VNS(I,K,J4_P1)=(FNS(I,K,J)+FNS(I,K,J+2)) & - & *(VST(I,K,J1_P2)-VST(I,K,J1_00)) -! -!----------------------------------------------------------------------- -!*** THE FOLLOWING NE AND SE FLUXES ARE TIED TO V POINTS AND ARE -!*** LOCATED JUST TO THE NE AND SE OF THE GIVEN I,J. -!----------------------------------------------------------------------- -! - UNE(I,K,J5_00)=(FNE(I+IVW(J),K,J)+FNE(I+IVE(J),K,J)) & - & *(UST(I+IVE(J),K,J1_P1)-UST(I,K,J1_00)) - USE(I,K,J6_P1)=(FSE(I+IVW(J+1),K,J+1) & - & +FSE(I+IVE(J+1),K,J+1)) & - & *(UST(I+IVE(J+1),K,J1_00)-UST(I,K,J1_P1)) - VNE(I,K,J5_00)=(FNE(I,K,J-1)+FNE(I,K,J+1)) & - & *(VST(I+IVE(J),K,J1_P1)-VST(I,K,J1_00)) - VSE(I,K,J6_P1)=(FSE(I,K,J)+FSE(I,K,J+2)) & - & *(VST(I+IVE(J+1),K,J1_00)-VST(I,K,J1_P1)) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** COMPUTE THE ADVECTION TENDENCIES FOR T. -!*** THE AD ARRAYS ARE ON H POINTS. -!*** SKIP TO UPSTREAM IF THESE ROWS HAVE ONLY UPSTREAM POINTS. -!----------------------------------------------------------------------- -! - - JGLOBAL=J+MY_JS_GLB-1 - IF(JGLOBAL>=6.AND.JGLOBAL<=JDE-5)THEN -! - JJ=J+MY_JS_GLB-1 ! okay because MY_JS_GLB is 1 - IF(ITS==IDS)ISTART=3+MOD(JJ,2) ! need to think about this - ! more in terms of how to - ! convert to global indexing -! - DO K=KTS,KTE - DO I=ISTART,IEND - RDPD=1./DPDE(I,K,J0_00) -! - ADT(I,K,J)=(TEW(I+IHW(J),K)+TEW(I+IHE(J),K) & - & +TNS(I,K,J4_M1)+TNS(I,K,J4_P1) & - & +TNE(I+IHW(J),K,J5_M1)+TNE(I,K,J5_00) & - & +TSE(I,K,J6_00)+TSE(I+IHW(J),K,J6_P1)) & - & *RDPD*FAD(I,J) -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** COMPUTE THE ADVECTION TENDENCIES FOR U AND V. -!*** THE AD ARRAYS ARE ON VELOCITY POINTS. -!----------------------------------------------------------------------- -! - IF(ITS==IDS)ISTART=3+MOD(JJ+1,2) -! - DO K=KTS,KTE - DO I=ISTART,IEND - RDPDX=1./(DPDE(I+IVW(J),K,J0_00)+DPDE(I+IVE(J),K,J0_00)) - RDPDY=1./(DPDE(I,K,J0_M1)+DPDE(I,K,J0_P1)) -! - ADU(I,K,J)=(UEW(I+IVW(J),K)+UEW(I+IVE(J),K) & - & +UNS(I,K,J4_M1)+UNS(I,K,J4_P1) & - & +UNE(I+IVW(J),K,J5_M1)+UNE(I,K,J5_00) & - & +USE(I,K,J6_00)+USE(I+IVW(J),K,J6_P1)) & - & *RDPDX*FAD(I+IVW(J),J) -! - ADV(I,K,J)=(VEW(I+IVW(J),K)+VEW(I+IVE(J),K) & - & +VNS(I,K,J4_M1)+VNS(I,K,J4_P1) & - & +VNE(I+IVW(J),K,J5_M1)+VNE(I,K,J5_00) & - & +VSE(I,K,J6_00)+VSE(I+IVW(J),K,J6_P1)) & - & *RDPDY*FAD(I+IVW(J),J) -! - ENDDO - ENDDO -! - ENDIF -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! -!*** END OF JANJIC HORIZONTAL ADVECTION -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!*** UPSTREAM ADVECTION OF T, U, AND V -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! - upstream : IF(UPSTRM)THEN -! -!----------------------------------------------------------------------- -!*** -!*** COMPUTE UPSTREAM COMPUTATIONS ON THIS TASK'S ROWS. -!*** -!----------------------------------------------------------------------- -! - N_IUPH_J=N_IUP_H(J) ! See explanation in INIT -! - DO K=KTS,KTE -! - DO II=0,N_IUPH_J-1 - I=IUP_H(IMS+II,J) - TTA=EMT_LOC(J)*(UST(I,K,J1_M1)+UST(I+IHW(J),K,J1_00) & - & +UST(I+IHE(J),K,J1_00)+UST(I,K,J1_P1)) - TTB=ENT *(VST(I,K,J1_M1)+VST(I+IHW(J),K,J1_00) & - & +VST(I+IHE(J),K,J1_00)+VST(I,K,J1_P1)) - PP=-TTA-TTB - QP= TTA-TTB -! - IF(PP<0.)THEN - ISPA(I,K)=-1 - ELSE - ISPA(I,K)= 1 - ENDIF -! - IF(QP<0.)THEN - ISQA(I,K)=-1 - ELSE - ISQA(I,K)= 1 - ENDIF -! - PP=ABS(PP) - QP=ABS(QP) - ARRAY3_X=PP*QP - ARRAY0(I,K)=ARRAY3_X-PP-QP - ARRAY1(I,K)=PP-ARRAY3_X - ARRAY2(I,K)=QP-ARRAY3_X - ARRAY3(I,K)=ARRAY3_X - ENDDO -! - ENDDO -!----------------------------------------------------------------------- -! - N_IUPADH_J=N_IUP_ADH(J) -! - DO K=KTS,KTE -! - KNTI_ADH=1 - IUP_ADH_J=IUP_ADH(IMS,J) -! - DO II=0,N_IUPH_J-1 - I=IUP_H(IMS+II,J) -! - ISP=ISPA(I,K) - ISQ=ISQA(I,K) - IFP=(ISP-1)/2 - IFQ=(-ISQ-1)/2 - IPQ=(ISP-ISQ)/2 -! - IF(HTM(I+IHE(J)+IFP,K,J+ISP) & - & *HTM(I+IHE(J)+IFQ,K,J+ISQ) & - & *HTM(I+IPQ,K,J+ISP+ISQ)>0.1)THEN - GO TO 150 - ENDIF -! - IF(HTM(I+IHE(J)+IFP,K,J+ISP) & - & +HTM(I+IHE(J)+IFQ,K,J+ISQ) & - & +HTM(I+IPQ,K,J+ISP+ISQ)<0.1)THEN -! - T(I+IHE(J)+IFP,K,J+ISP)=T(I,K,J) - T(I+IHE(J)+IFQ,K,J+ISQ)=T(I,K,J) - T(I+IPQ,K,J+ISP+ISQ)=T(I,K,J) -! - ELSEIF & - & (HTM(I+IHE(J)+IFP,K,J+ISP)+HTM(I+IPQ,K,J+ISP+ISQ) & - & <0.99)THEN -! - T(I+IHE(J)+IFP,K,J+ISP)=T(I,K,J) - T(I+IPQ,K,J+ISP+ISQ)=T(I+IHE(J)+IFQ,K,J+ISQ) -! - ELSEIF & - & (HTM(I+IHE(J)+IFQ,K,J+ISQ)+HTM(I+IPQ,K,J+ISP+ISQ) & - <0.99)THEN -! - T(I+IHE(J)+IFQ,K,J+ISQ)=T(I,K,J) - T(I+IPQ,K,J+ISP+ISQ)=T(I+IHE(J)+IFP,K,J+ISP) -! - ELSEIF & - & (HTM(I+IHE(J)+IFP,K,J+ISP) & - & +HTM(I+IHE(J)+IFQ,K,J+ISQ)<0.99)THEN - T(I+IHE(J)+IFP,K,J+ISP)=0.5*(T(I,K,J) & - & +T(I+IPQ,K,J+ISP+ISQ)) - T(I+IHE(J)+IFQ,K,J+ISQ)=T(I+IHE(J)+IFP,K,J+ISP) -! - ELSEIF(HTM(I+IHE(J)+IFP,K,J+ISP)<0.99)THEN - T(I+IHE(J)+IFP,K,J+ISP)=T(I,K,J) & - & +T(I+IPQ,K,J+ISP+ISQ) & - & -T(I+IHE(J)+IFQ,K,J+ISQ) -! - ELSEIF(HTM(I+IHE(J)+IFQ,K,J+ISQ)<0.99)THEN - T(I+IHE(J)+IFQ,K,J+ISQ)=T(I,K,J) & - & +T(I+IPQ,K,J+ISP+ISQ) & - & -T(I+IHE(J)+IFP,K,J+ISP) -! - ELSE - T(I+IPQ,K,J+ISP+ISQ)=T(I+IHE(J)+IFP,K,J+ISP) & - & +T(I+IHE(J)+IFQ,K,J+ISQ) & - & -T(I,K,J) -! - ENDIF -! - 150 CONTINUE -! -!----------------------------------------------------------------------- -! - IF(I==IUP_ADH_J)THEN ! Update advection H tendencies -! - ISP=ISPA(I,K) - ISQ=ISQA(I,K) - IFP=(ISP-1)/2 - IFQ=(-ISQ-1)/2 - IPQ=(ISP-ISQ)/2 -! - F0=ARRAY0(I,K) - F1=ARRAY1(I,K) - F2=ARRAY2(I,K) - F3=ARRAY3(I,K) -! - ADT(I,K,J)=F0*T(I,K,J) & - & +F1*T(I+IHE(J)+IFP,K,J+ISP) & - & +F2*T(I+IHE(J)+IFQ,K,J+ISQ) & - +F3*T(I+IPQ,K,J+ISP+ISQ) -! -!----------------------------------------------------------------------- -! - IF(KNTI_ADH Current J -! | -! | -! | -! VNS ----- -1 -! | -! | -! | -! FNS ----- -2 -! | -! | -! | -! DPDE ----- -3 -! -!*********************************************************************** -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! - ISTART=MYIS_P2 - IEND=MYIE_P2 - IF(ITE==IDE)IEND=MYIE-3 -! - DTQ=DT*0.25 - DTE=DT*(0.5*0.25) -!*** -!*** INITIALIZE SOME WORKING ARRAYS TO ZERO -!*** - DO K=KTS,KTE - DO I=ITS-5,ITE+5 - TEW(I,K)=0. - UEW(I,K)=0. - VEW(I,K)=0. - ENDDO - ENDDO -! -!*** TYPE 0 -! - DO N=-3,3 - DO K=KTS,KTE - DO I=ITS-5,ITE+5 - DPDE(I,K,N)=0. - ENDDO - ENDDO - ENDDO -! -!*** TYPE 1 -! - DO N=-2,2 - DO K=KTS,KTE - DO I=ITS-5,ITE+5 - TST(I,K,N)=0. - UST(I,K,N)=0. - VST(I,K,N)=0. - UDY(I,K,N)=0. - VDX(I,K,N)=0. - ENDDO - ENDDO - ENDDO -! -!*** TYPES 5 AND 6 -! - DO N=-1,0 - DO K=KTS,KTE - DO I=ITS-5,ITE+5 - TNE(I,K,N)=0. - TSE(I,K,N+1)=0. - UNE(I,K,N)=0. - USE(I,K,N+1)=0. - VNE(I,K,N)=0. - VSE(I,K,N+1)=0. - ENDDO - ENDDO - ENDDO -!----------------------------------------------------------------------- -!*** -!*** PRECOMPUTE DETA1 TIMES PDTOP. -!*** -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DETA1_PDTOP(K)=DETA1(K)*PDTOP - ENDDO -!----------------------------------------------------------------------- -!*** -!*** WE NEED THE STARTING AND ENDING J FOR THIS TASK'S INTEGRATION -!*** - JSTART=MYJS2 - JEND=MYJE2 -! -! -!----------------------------------------------------------------------- -! -!*** START THE HORIZONTAL ADVECTION IN THE INITIAL SOUTHERN SLABS. -! -!----------------------------------------------------------------------- -! - DO J=-2,1 - JJ=JSTART+J - DO K=KTS,KTE - DO I=MYIS_P4,MYIE_P4 - TST(I,K,J)=T(I,K,JJ)*FFC+TOLD(I,K,JJ)*FBC - UST(I,K,J)=U(I,K,JJ)*FFC+UOLD(I,K,JJ)*FBC - VST(I,K,J)=V(I,K,JJ)*FFC+VOLD(I,K,JJ)*FBC - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** MARCH NORTHWARD THROUGH THE SOUTHERNMOST SLABS TO BEGIN -!*** FILLING THE MAIN WORKING ARRAYS WHICH ARE MULTI-DIMENSIONED -!*** IN J BECAUSE THEY ARE DIFFERENCED OR AVERAGED IN J. -!*** ONLY THE NORTHERNMOST OF EACH OF THE WORKING ARRAYS WILL BE -!*** FILLED IN THE PRIMARY INTEGRATION SECTION. -!----------------------------------------------------------------------- -! - J1=-3 - IF(JTS==JDS)J1=-2 ! Cannot go 3 south from J=2 for south tasks -! - DO J=J1,2 - JJ=JSTART+J -! - DO K=KTS,KTE - DO I=MYIS_P4,MYIE_P4 - DPDE(I,K,J)=DETA1_PDTOP(K)+DETA2(K)*PDSLO(I,JJ) - ENDDO - ENDDO -! - ENDDO -! -!----------------------------------------------------------------------- - DO J=-2,1 - JJ=JSTART+J -! - DO K=KTS,KTE - DO I=MYIS_P4,MYIE_P4 - UDY(I,K,J)=U(I,K,JJ)*DY - VDX_X=V(I,K,JJ)*DX(I,JJ) - FNS(I,K,JJ)=VDX_X*(DPDE(I,K,J-1)+DPDE(I,K,J+1)) - VDX(I,K,J)=VDX_X - ENDDO - ENDDO -! - ENDDO -! -!----------------------------------------------------------------------- - DO J=-2,0 - JJ=JSTART+J -! - DO K=KTS,KTE - DO I=MYIS_P3,MYIE_P3 - TEMPA=(UDY(I+IHE(JJ),K,J)+VDX(I+IHE(JJ),K,J)) & - & +(UDY(I,K,J+1) +VDX(I,K,J+1)) - FNE(I,K,JJ)=TEMPA*(DPDE(I,K,J)+DPDE(I+IHE(JJ),K,J+1)) - ENDDO - ENDDO -! - ENDDO -! -!----------------------------------------------------------------------- - DO J=-1,1 - JJ=JSTART+J -! - DO K=KTS,KTE - DO I=MYIS_P3,MYIE_P3 - TEMPB=(UDY(I+IHE(JJ),K,J)-VDX(I+IHE(JJ),K,J)) & - & +(UDY(I,K,J-1) -VDX(I,K,J-1)) - FSE(I,K,JJ)=TEMPB*(DPDE(I,K,J)+DPDE(I+IHE(JJ),K,J-1)) - ENDDO - ENDDO -! - ENDDO -! -!----------------------------------------------------------------------- - DO J=-1,0 - JJ=JSTART+J -! - DO K=KTS,KTE - DO I=MYIS1_P3,MYIE1_P3 - FNS_X=FNS(I,K,JJ) - TNS(I,K,J)=FNS_X*(TST(I,K,J+1)-TST(I,K,J-1)) -! - UDY_X=U(I,K,JJ)*DY - FEW(I,K,JJ)=UDY_X*(DPDE(I+IVW(JJ),K,J)+DPDE(I+IVE(JJ),K,J)) - ENDDO - ENDDO -! - DO K=KTS,KTE - DO I=MYIS1_P4,MYIE1_P4 - UNS(I,K,J)=(FNS(I+IHW(JJ),K,JJ)+FNS(I+IHE(JJ),K,JJ)) & - & *(UST(I,K,J+1)-UST(I,K,J-1)) - VNS(I,K,J)=(FNS(I,K,JJ-1)+FNS(I,K,JJ+1)) & - & *(VST(I,K,J+1)-VST(I,K,J-1)) - ENDDO - ENDDO -! - ENDDO -! -!----------------------------------------------------------------------- - JJ=JSTART-1 -! - DO K=KTS,KTE - DO I=MYIS1_P2,MYIE1_P2 - FNE_X=FNE(I,K,JJ) - TNE(I,K,-1)=FNE_X*(TST(I+IHE(JJ),K,0)-TST(I,K,-1)) -! - FSE_X=FSE(I,K,JJ+1) - TSE(I,K,0)=FSE_X*(TST(I+IHE(JJ+1),K,-1)-TST(I,K,0)) -! - UNE(I,K,-1)=(FNE(I+IVW(JJ),K,JJ)+FNE(I+IVE(JJ),K,JJ)) & - & *(UST(I+IVE(JJ),K,0)-UST(I,K,-1)) - USE(I,K,0)=(FSE(I+IVW(JJ+1),K,JJ+1)+FSE(I+IVE(JJ+1),K,JJ+1)) & - & *(UST(I+IVE(JJ+1),K,-1)-UST(I,K,0)) - VNE(I,K,-1)=(FNE(I,K,JJ-1)+FNE(I,K,JJ+1)) & - & *(VST(I+IVE(JJ),K,0)-VST(I,K,-1)) - VSE(I,K,0)=(FSE(I,K,JJ)+FSE(I,K,JJ+2)) & - & *(VST(I+IVE(JJ+1),K,-1)-VST(I,K,0)) - ENDDO - ENDDO -! - JKNT=0 -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! - main_integration : DO J=JSTART,JEND -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!*** -!*** SET THE 3RD INDEX IN THE WORKING ARRAYS (SEE SUBROUTINE INIT -!*** AND PFDHT DIAGRAMS) -!*** -!*** J[TYPE]_NN WHERE "TYPE" IS THE WORKING ARRAY TYPE SEEN IN THE -!*** LOCAL DECLARATION ABOVE (DEPENDENT UPON THE J EXTENT) AND -!*** NN IS THE NUMBER OF ROWS NORTH OF THE CENTRAL ROW WHOSE J IS -!*** THE CURRENT VALUE OF THE main_integration LOOP. -!*** (P3 denotes +3, M1 denotes -1, etc.) -!*** - -! -! John and Tom both think this is all right, even for tiles, -! as long as the slab arrays being indexed by these things -! are locally defined. -! - JKNT=JKNT+1 -! - J0_P3=INDX3_WRK(3,JKNT,0) - J0_P2=INDX3_WRK(2,JKNT,0) - J0_P1=INDX3_WRK(1,JKNT,0) - J0_00=INDX3_WRK(0,JKNT,0) - J0_M1=INDX3_WRK(-1,JKNT,0) -! - J1_P2=INDX3_WRK(2,JKNT,1) - J1_P1=INDX3_WRK(1,JKNT,1) - J1_00=INDX3_WRK(0,JKNT,1) - J1_M1=INDX3_WRK(-1,JKNT,1) -! - J2_P1=INDX3_WRK(1,JKNT,2) - J2_00=INDX3_WRK(0,JKNT,2) - J2_M1=INDX3_WRK(-1,JKNT,2) -! - J3_P2=INDX3_WRK(2,JKNT,3) - J3_P1=INDX3_WRK(1,JKNT,3) - J3_00=INDX3_WRK(0,JKNT,3) -! - J4_P1=INDX3_WRK(1,JKNT,4) - J4_00=INDX3_WRK(0,JKNT,4) - J4_M1=INDX3_WRK(-1,JKNT,4) -! - J5_00=INDX3_WRK(0,JKNT,5) - J5_M1=INDX3_WRK(-1,JKNT,5) -! - J6_P1=INDX3_WRK(1,JKNT,6) - J6_00=INDX3_WRK(0,JKNT,6) -! - MY_IS_GLB=1 ! make this a noop for global indexing - MY_IE_GLB=1 ! make this a noop for global indexing - MY_JS_GLB=1 ! make this a noop for global indexing - MY_JE_GLB=1 ! make this a noop for global indexing -! -!----------------------------------------------------------------------- -!*** THE WORKING ARRAYS FOR THE PRIMARY VARIABLES -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DO I=MYIS_P4,MYIE_P4 - TST(I,K,J1_P2)=T(I,K,J+2)*FFC+TOLD(I,K,J+2)*FBC - UST(I,K,J1_P2)=U(I,K,J+2)*FFC+UOLD(I,K,J+2)*FBC - VST(I,K,J1_P2)=V(I,K,J+2)*FFC+VOLD(I,K,J+2)*FBC - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** MASS FLUXES AND MASS POINT ADVECTION COMPONENTS -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DO I=MYIS_P4,MYIE_P4 -! -!----------------------------------------------------------------------- -!*** THE NS AND EW FLUXES IN THE FOLLOWING LOOP ARE ON V POINTS -!*** FOR T. -!----------------------------------------------------------------------- -! - DPDE_P3=DETA1_PDTOP(K)+DETA2(K)*PDSLO(I,J+3) - DPDE(I,K,J0_P3)=DPDE_P3 -! -!----------------------------------------------------------------------- - UDY(I,K,J1_P2)=U(I,K,J+2)*DY - VDX_P2=V(I,K,J+2)*DX(I,J+2) - VDX(I,K,J1_P2)=VDX_P2 - FNS(I,K,J+2)=VDX_P2*(DPDE(I,K,J0_P1)+DPDE_P3) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- - DO K=KTS,KTE - DO I=MYIS_P3,MYIE_P3 - TEMPA=(UDY(I+IHE(J+1),K,J1_P1)+VDX(I+IHE(J+1),K,J1_P1)) & - & +(UDY(I,K,J1_P2) +VDX(I,K,J1_P2)) - FNE(I,K,J+1)=TEMPA*(DPDE(I,K,J0_P1)+DPDE(I+IHE(J+1),K,J0_P2)) -! -!----------------------------------------------------------------------- - TEMPB=(UDY(I+IHE(J+2),K,J1_P2)-VDX(I+IHE(J+2),K,J1_P2)) & - & +(UDY(I,K,J1_P1) -VDX(I,K,J1_P1)) - FSE(I,K,J+2)=TEMPB*(DPDE(I,K,J0_P2)+DPDE(I+IHE(J),K,J0_P1)) -! -!----------------------------------------------------------------------- - FNS_P1=FNS(I,K,J+1) - TNS(I,K,J4_P1)=FNS_P1*(TST(I,K,J1_P2)-TST(I,K,J1_00)) -! -!----------------------------------------------------------------------- - UDY_P1=U(I,K,J+1)*DY - FEW(I,K,J+1)=UDY_P1*(DPDE(I+IVW(J+1),K,J0_P1) & - & +DPDE(I+IVE(J+1),K,J0_P1)) - FEW_00=FEW(I,K,J) - TEW(I,K)=FEW_00*(TST(I+IVE(J),K,J1_00)-TST(I+IVW(J),K,J1_00)) -! -!----------------------------------------------------------------------- -!*** THE NE AND SE FLUXES ARE ASSOCIATED WITH H POINTS -!*** (ACTUALLY JUST TO THE NE AND SE OF EACH H POINT). -!----------------------------------------------------------------------- -! - FNE_X=FNE(I,K,J) - TNE(I,K,J5_00)=FNE_X*(TST(I+IHE(J),K,J1_P1)-TST(I,K,J1_00)) -! - FSE_X=FSE(I,K,J+1) - TSE(I,K,J6_P1)=FSE_X*(TST(I+IHE(J+1),K,J1_00)-TST(I,K,J1_P1)) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** CALCULATION OF MOMENTUM ADVECTION COMPONENTS -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!*** THE NS AND EW FLUXES ARE ON H POINTS FOR U AND V. -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DO I=MYIS_P2,MYIE_P2 - UEW(I,K)=(FEW(I+IHW(J),K,J)+FEW(I+IHE(J),K,J)) & - & *(UST(I+IHE(J),K,J1_00)-UST(I+IHW(J),K,J1_00)) - UNS(I,K,J4_P1)=(FNS(I+IHW(J+1),K,J+1) & - & +FNS(I+IHE(J+1),K,J+1)) & - & *(UST(I,K,J1_P2)-UST(I,K,J1_00)) - VEW(I,K)=(FEW(I,K,J-1)+FEW(I,K,J+1)) & - & *(VST(I+IHE(J),K,J1_00)-VST(I+IHW(J),K,J1_00)) - VNS(I,K,J4_P1)=(FNS(I,K,J)+FNS(I,K,J+2)) & - & *(VST(I,K,J1_P2)-VST(I,K,J1_00)) -! -!----------------------------------------------------------------------- -!*** THE FOLLOWING NE AND SE FLUXES ARE TIED TO V POINTS AND ARE -!*** LOCATED JUST TO THE NE AND SE OF THE GIVEN I,J. -!----------------------------------------------------------------------- -! - UNE(I,K,J5_00)=(FNE(I+IVW(J),K,J)+FNE(I+IVE(J),K,J)) & - & *(UST(I+IVE(J),K,J1_P1)-UST(I,K,J1_00)) - USE(I,K,J6_P1)=(FSE(I+IVW(J+1),K,J+1) & - & +FSE(I+IVE(J+1),K,J+1)) & - & *(UST(I+IVE(J+1),K,J1_00)-UST(I,K,J1_P1)) - VNE(I,K,J5_00)=(FNE(I,K,J-1)+FNE(I,K,J+1)) & - & *(VST(I+IVE(J),K,J1_P1)-VST(I,K,J1_00)) - VSE(I,K,J6_P1)=(FSE(I,K,J)+FSE(I,K,J+2)) & - & *(VST(I+IVE(J+1),K,J1_00)-VST(I,K,J1_P1)) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** COMPUTE THE ADVECTION TENDENCIES FOR T. -!*** THE AD ARRAYS ARE ON H POINTS. -!*** SKIP TO UPSTREAM IF THESE ROWS HAVE ONLY UPSTREAM POINTS. -!----------------------------------------------------------------------- -! - - JGLOBAL=J+MY_JS_GLB-1 - IF(JGLOBAL>=6.AND.JGLOBAL<=JDE-5)THEN -! - JJ=J+MY_JS_GLB-1 ! okay because MY_JS_GLB is 1 - IF(ITS==IDS)ISTART=3+MOD(JJ,2) ! need to think about this - ! more in terms of how to - ! convert to global indexing -! - DO K=KTS,KTE - DO I=ISTART,IEND - RDPD=1./DPDE(I,K,J0_00) -! - ADT(I,K,J)=(TEW(I+IHW(J),K)+TEW(I+IHE(J),K) & - & +TNS(I,K,J4_M1)+TNS(I,K,J4_P1) & - & +TNE(I+IHW(J),K,J5_M1)+TNE(I,K,J5_00) & - & +TSE(I,K,J6_00)+TSE(I+IHW(J),K,J6_P1)) & - & *RDPD*FAD(I,J) -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** COMPUTE THE ADVECTION TENDENCIES FOR U AND V. -!*** THE AD ARRAYS ARE ON VELOCITY POINTS. -!----------------------------------------------------------------------- -! - IF(ITS==IDS)ISTART=3+MOD(JJ+1,2) -! - DO K=KTS,KTE - DO I=ISTART,IEND - RDPDX=1./(DPDE(I+IVW(J),K,J0_00)+DPDE(I+IVE(J),K,J0_00)) - RDPDY=1./(DPDE(I,K,J0_M1)+DPDE(I,K,J0_P1)) -! - ADU(I,K,J)=(UEW(I+IVW(J),K)+UEW(I+IVE(J),K) & - & +UNS(I,K,J4_M1)+UNS(I,K,J4_P1) & - & +UNE(I+IVW(J),K,J5_M1)+UNE(I,K,J5_00) & - & +USE(I,K,J6_00)+USE(I+IVW(J),K,J6_P1)) & - & *RDPDX*FAD(I+IVW(J),J) -! - ADV(I,K,J)=(VEW(I+IVW(J),K)+VEW(I+IVE(J),K) & - & +VNS(I,K,J4_M1)+VNS(I,K,J4_P1) & - & +VNE(I+IVW(J),K,J5_M1)+VNE(I,K,J5_00) & - & +VSE(I,K,J6_00)+VSE(I+IVW(J),K,J6_P1)) & - & *RDPDY*FAD(I+IVW(J),J) -! - ENDDO - ENDDO -! - ENDIF -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! -!*** END OF JANJIC HORIZONTAL ADVECTION -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!*** UPSTREAM ADVECTION OF T, U, AND V -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! - upstream : IF(UPSTRM)THEN -! -!----------------------------------------------------------------------- -!*** -!*** COMPUTE UPSTREAM COMPUTATIONS ON THIS TASK'S ROWS. -!*** -!----------------------------------------------------------------------- -! - N_IUPH_J=N_IUP_H(J) ! See explanation in INIT -! - DO K=KTS,KTE -! - DO II=0,N_IUPH_J-1 - I=IUP_H(IMS+II,J) - TTA=EMT_LOC(J)*(UST(I,K,J1_M1)+UST(I+IHW(J),K,J1_00) & - & +UST(I+IHE(J),K,J1_00)+UST(I,K,J1_P1)) - TTB=ENT *(VST(I,K,J1_M1)+VST(I+IHW(J),K,J1_00) & - & +VST(I+IHE(J),K,J1_00)+VST(I,K,J1_P1)) - PP=-TTA-TTB - QP= TTA-TTB -! - IF(PP<0.)THEN - ISPA(I,K)=-1 - ELSE - ISPA(I,K)= 1 - ENDIF -! - IF(QP<0.)THEN - ISQA(I,K)=-1 - ELSE - ISQA(I,K)= 1 - ENDIF -! - PP=ABS(PP) - QP=ABS(QP) - ARRAY3_X=PP*QP - ARRAY0(I,K)=ARRAY3_X-PP-QP - ARRAY1(I,K)=PP-ARRAY3_X - ARRAY2(I,K)=QP-ARRAY3_X - ARRAY3(I,K)=ARRAY3_X - ENDDO -! - ENDDO -!----------------------------------------------------------------------- -! - N_IUPADH_J=N_IUP_ADH(J) -! - DO K=KTS,KTE -! - KNTI_ADH=1 - IUP_ADH_J=IUP_ADH(IMS,J) -! - DO II=0,N_IUPH_J-1 - I=IUP_H(IMS+II,J) -! - ISP=ISPA(I,K) - ISQ=ISQA(I,K) - IFP=(ISP-1)/2 - IFQ=(-ISQ-1)/2 - IPQ=(ISP-ISQ)/2 -! - IF(HTM(I+IHE(J)+IFP,K,J+ISP) & - & *HTM(I+IHE(J)+IFQ,K,J+ISQ) & - & *HTM(I+IPQ,K,J+ISP+ISQ)>0.1)THEN - GO TO 150 - ENDIF -! - IF(HTM(I+IHE(J)+IFP,K,J+ISP) & - & +HTM(I+IHE(J)+IFQ,K,J+ISQ) & - & +HTM(I+IPQ,K,J+ISP+ISQ)<0.1)THEN -! - T(I+IHE(J)+IFP,K,J+ISP)=T(I,K,J) - T(I+IHE(J)+IFQ,K,J+ISQ)=T(I,K,J) - T(I+IPQ,K,J+ISP+ISQ)=T(I,K,J) -! - ELSEIF & - & (HTM(I+IHE(J)+IFP,K,J+ISP)+HTM(I+IPQ,K,J+ISP+ISQ) & - & <0.99)THEN -! - T(I+IHE(J)+IFP,K,J+ISP)=T(I,K,J) - T(I+IPQ,K,J+ISP+ISQ)=T(I+IHE(J)+IFQ,K,J+ISQ) -! - ELSEIF & - & (HTM(I+IHE(J)+IFQ,K,J+ISQ)+HTM(I+IPQ,K,J+ISP+ISQ) & - <0.99)THEN -! - T(I+IHE(J)+IFQ,K,J+ISQ)=T(I,K,J) - T(I+IPQ,K,J+ISP+ISQ)=T(I+IHE(J)+IFP,K,J+ISP) -! - ELSEIF & - & (HTM(I+IHE(J)+IFP,K,J+ISP) & - & +HTM(I+IHE(J)+IFQ,K,J+ISQ)<0.99)THEN - T(I+IHE(J)+IFP,K,J+ISP)=0.5*(T(I,K,J) & - & +T(I+IPQ,K,J+ISP+ISQ)) - T(I+IHE(J)+IFQ,K,J+ISQ)=T(I+IHE(J)+IFP,K,J+ISP) -! - ELSEIF(HTM(I+IHE(J)+IFP,K,J+ISP)<0.99)THEN - T(I+IHE(J)+IFP,K,J+ISP)=T(I,K,J) & - & +T(I+IPQ,K,J+ISP+ISQ) & - & -T(I+IHE(J)+IFQ,K,J+ISQ) -! - ELSEIF(HTM(I+IHE(J)+IFQ,K,J+ISQ)<0.99)THEN - T(I+IHE(J)+IFQ,K,J+ISQ)=T(I,K,J) & - & +T(I+IPQ,K,J+ISP+ISQ) & - & -T(I+IHE(J)+IFP,K,J+ISP) -! - ELSE - T(I+IPQ,K,J+ISP+ISQ)=T(I+IHE(J)+IFP,K,J+ISP) & - & +T(I+IHE(J)+IFQ,K,J+ISQ) & - & -T(I,K,J) -! - ENDIF -! - 150 CONTINUE -! -!----------------------------------------------------------------------- -! - IF(I==IUP_ADH_J)THEN ! Update advection H tendencies -! - ISP=ISPA(I,K) - ISQ=ISQA(I,K) - IFP=(ISP-1)/2 - IFQ=(-ISQ-1)/2 - IPQ=(ISP-ISQ)/2 -! - F0=ARRAY0(I,K) - F1=ARRAY1(I,K) - F2=ARRAY2(I,K) - F3=ARRAY3(I,K) -! - ADT(I,K,J)=F0*T(I,K,J) & - & +F1*T(I+IHE(J)+IFP,K,J+ISP) & - & +F2*T(I+IHE(J)+IFQ,K,J+ISQ) & - +F3*T(I+IPQ,K,J+ISP+ISQ) -! -!----------------------------------------------------------------------- -! - IF(KNTI_ADH Current J -! | -! | -! | -! VNS ----- -1 -! | -! | -! | -! FNS ----- -2 -! | -! | -! | -! DPDE ----- -3 -! -!*********************************************************************** -!----------------------------------------------------------------------- - DO J=JTS-5,JTE+5 - DO I=ITS-5,ITE+5 - ARRAY0(I,J)=0.0 - ARRAY1(I,J)=0.0 - ARRAY2(I,J)=0.0 - ARRAY3(I,J)=0.0 - DPDE(I,J)=0.0 - RDPD(I,J)=0.0 - RDPDX(I,J)=0.0 - RDPDY(I,J)=0.0 - TEW(I,J)=0.0 - TNE(I,J)=0.0 - TNS(I,J)=0.0 - TSE(I,J)=0.0 - TST(I,J)=0.0 - UNE(I,J)=0.0 - UNED(I,J)=0.0 - UEW(I,J)=0.0 - UNS(I,J)=0.0 - USE(I,J)=0.0 - USED(I,J)=0.0 - UST(I,J)=0.0 - VEW(I,J)=0.0 - VNE(I,J)=0.0 - VNS(I,J)=0.0 - VSE(I,J)=0.0 - VST(I,J)=0.0 - ENDDO - ENDDO -!----------------------------------------------------------------------- -! - DTQ=DT*0.25 - DTE=DT*(0.5*0.25) -! -!----------------------------------------------------------------------- -!*** -!*** PRECOMPUTE DETA1 TIMES PDTOP. -!*** -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DETA1_PDTOP(K)=DETA1(K)*PDTOP - ENDDO -! -!----------------------------------------------------------------------- -!*** -!*** INITIALIZE SOME WORKING ARRAYS TO ZERO -!*** -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! -!*** COMPUTE VERTICAL ADVECTION TENDENCIES USING CRANK-NICHOLSON. -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** FIRST THE TEMPERATURE -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(cft,cfu,cfv,cmt,cmu,cmv,crt,cru,crv,i,k & -!$omp& ,pdop,pdopu,pdopv,pvvlo,pvvlou,pvvlov,pvvup,pvvupu,pvvupv & -!$omp& ,rcmt,rcmu,rcmv,rdp,rdpu,rdpv,rstt,rstu,rstv,t_k,tn & -!$omp& ,u_k,un,v_k,vn,vvlo,vvlou,vvlov,vvup,vvupu,vvupv) -!!$omp& private(adtp,adup,advp,ttlo,ttup,tulo,tuup,tvlo,tvup) -!----------------------------------------------------------------------- -! - main_vertical: DO J=MYJS2,MYJE2 -! -!----------------------------------------------------------------------- -! - iloop_for_t: DO I=MYIS1,MYIE1 -! -!----------------------------------------------------------------------- -!*** EXTRACT T FROM THE COLUMN -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - T_K(K)=T(I,J,K) - ENDDO -! -!----------------------------------------------------------------------- -! - PDOP=PDSLO(I,J) - PVVLO=PETDT(I,J,KTE-1)*DTQ - VVLO=PVVLO/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOP) - CMT=-VVLO*WGT2+1. - RCMT(KTE)=1./CMT - CRT(KTE)=VVLO*WGT2 - RSTT(KTE)=-VVLO*WGT1*(T_K(KTE-1)-T_K(KTE))+T_K(KTE) -! -!----------------------------------------------------------------------- -! - DO K=KTE-1,KTS+1,-1 - RDP=1./(DETA1_PDTOP(K)+DETA2(K)*PDOP) - PVVUP=PVVLO - PVVLO=PETDT(I,J,K-1)*DTQ - VVUP=PVVUP*RDP - VVLO=PVVLO*RDP - CFT=-VVUP*WGT2*RCMT(K+1) - CMT=-CRT(K+1)*CFT+((VVUP-VVLO)*WGT2+1.) - RCMT(K)=1./CMT - CRT(K)=VVLO*WGT2 - RSTT(K)=-RSTT(K+1)*CFT+T_K(K) & - & -(T_K(K)-T_K(K+1))*VVUP*WGT1 & - & -(T_K(K-1)-T_K(K))*VVLO*WGT1 - ENDDO -! -!----------------------------------------------------------------------- -! - PVVUP=PVVLO - VVUP=PVVUP/(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOP) - CFT=-VVUP*WGT2*RCMT(KTS+1) - CMT=-CRT(KTS+1)*CFT+VVUP*WGT2+1. - CRT(KTS)=0. - RSTT(KTS)=-(T_K(KTS)-T_K(KTS+1))*VVUP*WGT1 & - & -RSTT(KTS+1)*CFT+T_K(KTS) - TN(KTS)=RSTT(KTS)/CMT - VAD_TEND_T(I,J,KTS)=TN(KTS)-T_K(KTS) -! - DO K=KTS+1,KTE - TN(K)=(-CRT(K)*TN(K-1)+RSTT(K))*RCMT(K) - VAD_TEND_T(I,J,K)=TN(K)-T_K(K) - ENDDO -! -!----------------------------------------------------------------------- -!*** The following section is only for checking the implicit solution -!*** using back-substitution. Remove this section otherwise. -!----------------------------------------------------------------------- -! if(ntsd<=10.or.ntsd>=6000)then -! IF(I==ITEST.AND.J==JTEST)THEN -!! -! PVVLO=PETDT(I,J,KTE-1)*DT*0.25 -! VVLO=PVVLO/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOP) -! TTLO=VVLO*(T(I,J,KTE-1)-T(I,J,KTE) & -! & +TN(KTE-1)-TN(KTE)) -! ADTP=TTLO+TN(KTE)-T(I,J,KTE) -! WRITE(0,*)' NTSD=',NTSD,' I=',ITEST,' J=',JTEST,' K=',KTE & -! &, ' ADTP=',ADTP -! WRITE(0,*)' T=',T(I,J,KTE),' TN=',TN(KTE) & -! &, ' VAD_TEND_T=',VAD_TEND_T(I,J,KTE) -! WRITE(0,*)' ' -!! -! DO K=KTE-1,KTS+1,-1 -! RDP=1./(DETA1_PDTOP(K)+DETA2(K)*PDOP) -! PVVUP=PVVLO -! PVVLO=PETDT(I,J,K-1)*DT*0.25 -! VVUP=PVVUP*RDP -! VVLO=PVVLO*RDP -! TTUP=VVUP*(T(I,J,K)-T(I,J,K+1)+TN(K)-TN(K+1)) -! TTLO=VVLO*(T(I,J,K-1)-T(I,J,K)+TN(K-1)-TN(K)) -! ADTP=TTLO+TTUP+TN(K)-T(I,J,K) -! WRITE(0,*)' NTSD=',NTSD,' I=',I,' J=',J,' K=',K & -! &, ' ADTP=',ADTP -! WRITE(0,*)' T=',T(I,J,K),' TN=',TN(K) & -! &, ' VAD_TEND_T=',VAD_TEND_T(I,J,K) -! WRITE(0,*)' ' -! ENDDO -!! -! PVVUP=PVVLO -! VVUP=PVVUP/(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOP) -! TTUP=VVUP*(T(I,J,KTS)-T(I,J,KTS+1)+TN(KTS)-TN(KTS+1)) -! ADTP=TTUP+TN(KTS)-T(I,J,KTS) -! WRITE(0,*)' NTSD=',NTSD,' I=',I,' J=',J,' K=',KTS & -! &, ' ADTP=',ADTP -! WRITE(0,*)' T=',T(I,J,KTS),' TN=',TN(KTS) & -! &, ' VAD_TEND_T=',VAD_TEND_T(I,J,KTS) -! WRITE(0,*)' ' -! ENDIF -! endif -! -!----------------------------------------------------------------------- -!*** End of check. -!----------------------------------------------------------------------- -! - ENDDO iloop_for_t -! -!----------------------------------------------------------------------- -! -!*** NOW VERTICAL ADVECTION OF WIND COMPONENTS -! -!----------------------------------------------------------------------- -! - iloop_for_uv: DO I=MYIS1,MYIE1 -! -!----------------------------------------------------------------------- -!*** EXTRACT U AND V FROM THE COLUMN -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - U_K(K)=U(I,J,K) - V_K(K)=V(I,J,K) - ENDDO -! -!----------------------------------------------------------------------- -! - PDOPU=(PDSLO(I+IVW(J),J)+PDSLO(I+IVE(J),J))*0.5 - PDOPV=(PDSLO(I,J-1)+PDSLO(I,J+1))*0.5 - PVVLOU=(PETDT(I+IVW(J),J,KTE-1)+PETDT(I+IVE(J),J,KTE-1))*DTE - PVVLOV=(PETDT(I,J-1,KTE-1)+PETDT(I,J+1,KTE-1))*DTE - VVLOU=PVVLOU/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOPU) - VVLOV=PVVLOV/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOPV) - CMU=-VVLOU*WGT2+1. - CMV=-VVLOV*WGT2+1. - RCMU(KTE)=1./CMU - RCMV(KTE)=1./CMV - CRU(KTE)=VVLOU*WGT2 - CRV(KTE)=VVLOV*WGT2 - RSTU(KTE)=-VVLOU*WGT1*(U_K(KTE-1)-U_K(KTE))+U_K(KTE) - RSTV(KTE)=-VVLOV*WGT1*(V_K(KTE-1)-V_K(KTE))+V_K(KTE) -! -!----------------------------------------------------------------------- -! - DO K=KTE-1,KTS+1,-1 - RDPU=1./(DETA1_PDTOP(K)+DETA2(K)*PDOPU) - RDPV=1./(DETA1_PDTOP(K)+DETA2(K)*PDOPV) - PVVUPU=PVVLOU - PVVUPV=PVVLOV - PVVLOU=(PETDT(I+IVW(J),J,K-1)+PETDT(I+IVE(J),J,K-1))*DTE - PVVLOV=(PETDT(I,J-1,K-1)+PETDT(I,J+1,K-1))*DTE - VVUPU=PVVUPU*RDPU - VVUPV=PVVUPV*RDPV - VVLOU=PVVLOU*RDPU - VVLOV=PVVLOV*RDPV - CFU=-VVUPU*WGT2*RCMU(K+1) - CFV=-VVUPV*WGT2*RCMV(K+1) - CMU=-CRU(K+1)*CFU+(VVUPU-VVLOU)*WGT2+1. - CMV=-CRV(K+1)*CFV+(VVUPV-VVLOV)*WGT2+1. - RCMU(K)=1./CMU - RCMV(K)=1./CMV - CRU(K)=VVLOU*WGT2 - CRV(K)=VVLOV*WGT2 - RSTU(K)=-RSTU(K+1)*CFU+U_K(K) & - & -(U_K(K)-U_K(K+1))*VVUPU*WGT1 & - & -(U_K(K-1)-U_K(K))*VVLOU*WGT1 - RSTV(K)=-RSTV(K+1)*CFV+V_K(K) & - & -(V_K(K)-V_K(K+1))*VVUPV*WGT1 & - & -(V_K(K-1)-V_K(K))*VVLOV*WGT1 - ENDDO -! -!----------------------------------------------------------------------- -! - RDPU=1./(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOPU) - RDPV=1./(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOPV) - PVVUPU=PVVLOU - PVVUPV=PVVLOV - VVUPU=PVVUPU*RDPU - VVUPV=PVVUPV*RDPV - CFU=-VVUPU*WGT2*RCMU(KTS+1) - CFV=-VVUPV*WGT2*RCMV(KTS+1) - CMU=-CRU(KTS+1)*CFU+VVUPU*WGT2+1. - CMV=-CRV(KTS+1)*CFV+VVUPV*WGT2+1. - CRU(KTS)=0. - CRV(KTS)=0. - RSTU(KTS)=-(U_K(KTS)-U_K(KTS+1))*VVUPU*WGT1 & - & -RSTU(KTS+1)*CFU+U_K(KTS) - RSTV(KTS)=-(V_K(KTS)-V_K(KTS+1))*VVUPV*WGT1 & - & -RSTV(KTS+1)*CFV+V_K(KTS) - UN(KTS)=RSTU(KTS)/CMU - VN(KTS)=RSTV(KTS)/CMV - VAD_TEND_U(I,J,KTS)=UN(KTS)-U_K(KTS) - VAD_TEND_V(I,J,KTS)=VN(KTS)-V_K(KTS) -! - DO K=KTS+1,KTE - UN(K)=(-CRU(K)*UN(K-1)+RSTU(K))*RCMU(K) - VN(K)=(-CRV(K)*VN(K-1)+RSTV(K))*RCMV(K) - VAD_TEND_U(I,J,K)=UN(K)-U_K(K) - VAD_TEND_V(I,J,K)=VN(K)-V_K(K) - ENDDO -! -!----------------------------------------------------------------------- -!*** The following section is only for checking the implicit solution -!*** using back-substitution. Remove this section otherwise. -!----------------------------------------------------------------------- -! -! if(ntsd<=10.or.ntsd>=6000)then -! IF(I==ITEST.AND.J==JTEST)THEN -!! -! PDOPU=(PDSLO(I+IVW(J),J)+PDSLO(I+IVE(J),J))*0.5 -! PDOPV=(PDSLO(I,J-1)+PDSLO(I,J+1))*0.5 -! PVVLOU=(PETDT(I+IVW(J),J,KTE-1) & -! & +PETDT(I+IVE(J),J,KTE-1))*DTE -! PVVLOV=(PETDT(I,J-1,KTE-1) & -! & +PETDT(I,J+1,KTE-1))*DTE -! VVLOU=PVVLOU/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOPU) -! VVLOV=PVVLOV/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOPV) -! TULO=VVLOU*(U(I,J,KTE-1)-U(I,J,KTE)+UN(KTE-1)-UN(KTE)) -! TVLO=VVLOV*(V(I,J,KTE-1)-V(I,J,KTE)+VN(KTE-1)-VN(KTE)) -! ADUP=TULO+UN(KTE)-U(I,J,KTE) -! ADVP=TVLO+VN(KTE)-V(I,J,KTE) -! WRITE(0,*)' NTSD=',NTSD,' I=',I,' J=',J,' K=',KTE & -! &, ' ADUP=',ADUP,' ADVP=',ADVP -! WRITE(0,*)' U=',U(I,J,KTE),' UN=',UN(KTE) & -! &, ' VAD_TEND_U=',VAD_TEND_U(I,KTE) & -! &, ' V=',V(I,J,KTE),' VN=',VN(KTE) & -! &, ' VAD_TEND_V=',VAD_TEND_V(I,KTE) -! WRITE(0,*)' ' -!! -! DO K=KTE-1,KTS+1,-1 -! RDPU=1./(DETA1_PDTOP(K)+DETA2(K)*PDOPU) -! RDPV=1./(DETA1_PDTOP(K)+DETA2(K)*PDOPV) -! PVVUPU=PVVLOU -! PVVUPV=PVVLOV -! PVVLOU=(PETDT(I+IVW(J),J,K-1) & -! & +PETDT(I+IVE(J),J,K-1))*DTE -! PVVLOV=(PETDT(I,J-1,K-1)+PETDT(I,J+1,K-1))*DTE -! VVUPU=PVVUPU*RDPU -! VVUPV=PVVUPV*RDPV -! VVLOU=PVVLOU*RDPU -! VVLOV=PVVLOV*RDPV -! TUUP=VVUPU*(U(I,J,K)-U(I,J,K+1)+UN(K)-UN(K+1)) -! TVUP=VVUPV*(V(I,J,K)-V(I,J,K+1)+VN(K)-VN(K+1)) -! TULO=VVLOU*(U(I,J,K-1)-U(I,J,K)+UN(K-1)-UN(K)) -! TVLO=VVLOV*(V(I,J,K-1)-V(I,J,K)+VN(K-1)-VN(K)) -! ADUP=TUUP+TULO+UN(K)-U(I,J,K) -! ADVP=TVUP+TVLO+VN(K)-V(I,J,K) -! WRITE(0,*)' NTSD=',NTSD,' I=',ITEST,' J=',JTEST,' K=',K & -! &, ' ADUP=',ADUP,' ADVP=',ADVP -! WRITE(0,*)' U=',U(I,J,K),' UN=',UN(K) & -! &, ' VAD_TEND_U=',VAD_TEND_U(I,K) & -! &, ' V=',V(I,J,K),' VN=',VN(K) & -! &, ' VAD_TEND_V=',VAD_TEND_V(I,K) -! WRITE(0,*)' ' -! ENDDO -!! -! PVVUPU=PVVLOU -! PVVUPV=PVVLOV -! VVUPU=PVVUPU/(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOPU) -! VVUPV=PVVUPV/(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOPV) -! TUUP=VVUPU*(U(I,J,KTS)-U(I,J,KTS+1)+UN(KTS)-UN(KTS+1)) -! TVUP=VVUPV*(V(I,J,KTS)-V(I,J,KTS+1)+VN(KTS)-VN(KTS+1)) -! ADUP=TUUP+UN(KTS)-U(I,J,KTS) -! ADVP=TVUP+VN(KTS)-V(I,J,KTS) -! WRITE(0,*)' NTSD=',NTSD,' I=',ITEST,' J=',JTEST,' K=',KTS & -! &, ' ADUP=',ADUP,' ADVP=',ADVP -! WRITE(0,*)' U=',U(I,J,KTS),' UN=',UN(KTS) & -! &, ' VAD_TEND_U=',VAD_TEND_U(I,KTS) & -! &, ' V=',V(I,J,KTS),' VN=',VN(KTS) & -! &, ' VAD_TEND_V=',VAD_TEND_V(I,KTS) -! WRITE(0,*)' ' -! ENDIF -! endif -! -!----------------------------------------------------------------------- -!*** End of check. -!----------------------------------------------------------------------- -! - ENDDO iloop_for_uv -! -!----------------------------------------------------------------------- -! - ENDDO main_vertical -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! -!*** COMPUTE HORIZONTAL ADVECTION TENDENCIES. -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(adpdx,adpdy,adt,adu,adv,array0,array1,array2,array3 & -!$omp& ,array3_x,dpde,f0,f1,f2,f3,fewp,fnep,fnsp,fpp,fsep,hm & -!$omp& ,i,ifp,ifq,ii,ipq,isp,ispa,isq,isqa,iup_adh_j,j,k & -!$omp& ,knti_adh,n_iupadh_j,n_iupadv_j,n_iuph_j,pp,qp & -!$omp& ,rdpd,rdpdx,rdpdy,tew,tne,tns,tse,tst,tta,ttb & -!$omp& ,uew,udy,une,uned,uns,use,used,ust & -!$omp& ,vdx,vew,vm,vne,vns,vse,vst) -!----------------------------------------------------------------------- -! - main_horizontal: DO K=KTS,KTE -! -!----------------------------------------------------------------------- -! - DO J=MYJS_P4,MYJE_P4 - DO I=MYIS_P4,MYIE_P4 - DPDE(I,J)=DETA1_PDTOP(K)+DETA2(K)*PDSLO(I,J) - RDPD(I,J)=1./DPDE(I,J) - TST(I,J)=T(I,J,K)*FFC+TOLD(I,J,K)*FBC - UST(I,J)=U(I,J,K)*FFC+UOLD(I,J,K)*FBC - VST(I,J)=V(I,J,K)*FFC+VOLD(I,J,K)*FBC - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** MASS FLUXES AND MASS POINT ADVECTION COMPONENTS -!*** THE NS AND EW FLUXES IN THE FOLLOWING LOOP ARE ON V POINTS -!*** FOR T. -!----------------------------------------------------------------------- -! - DO J=MYJS1_P3,MYJE1_P3 - DO I=MYIS_P3,MYIE_P3 -! - ADPDX=DPDE(I+IVW(J),J)+DPDE(I+IVE(J),J) - ADPDY=DPDE(I,J-1)+DPDE(I,J+1) - RDPDX(I,J)=1./ADPDX - RDPDY(I,J)=1./ADPDY -! - UDY=U(I,J,K)*DY - VDX=V(I,J,K)*DX(I,J) -! - FEWP=UDY*ADPDX - FNSP=VDX*ADPDY -! - FEW(I,J,K)=FEWP - FNS(I,J,K)=FNSP -! - TEW(I,J)=FEWP*(TST(I+IVE(J),J)-TST(I+IVW(J),J)) - TNS(I,J)=FNSP*(TST(I,J+1)-TST(I,J-1)) -! - UNED(I,J)=UDY+VDX - USED(I,J)=UDY-VDX -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** DIAGONAL FLUXES AND DIAGONALLY AVERAGED WIND -!*** THE NE AND SE FLUXES ARE ASSOCIATED WITH H POINTS -!*** (ACTUALLY JUST TO THE NE AND SE OF EACH H POINT). -!----------------------------------------------------------------------- -! - DO J=MYJS1_P2,MYJE2_P2 - DO I=MYIS_P2,MYIE_P2 - FNEP=(UNED(I+IHE(J),J)+UNED(I ,J+1)) & - & *(DPDE(I ,J)+DPDE(I+IHE(J),J+1)) - FNE(I,J,K)=FNEP - TNE(I,J)=FNEP*(TST(I+IHE(J),J+1)-TST(I,J)) - ENDDO - ENDDO -! - DO J=MYJS2_P2,MYJE1_P2 - DO I=MYIS_P2,MYIE_P2 - FSEP=(USED(I+IHE(J),J)+USED(I ,J-1)) & - & *(DPDE(I ,J)+DPDE(I+IHE(J),J-1)) - FSE(I,J,K)=FSEP - TSE(I,J)=FSEP*(TST(I+IHE(J),J-1)-TST(I,J)) -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** HORIZONTAL T ADVECTION TENDENCY ADT IS ON H POINTS OF COURSE. -!----------------------------------------------------------------------- -! - DO J=MYJS5,MYJE5 - DO I=MYIS2,MYIE2 - ADT(I,J)=(TEW(I+IHW(J),J)+TEW(I+IHE(J),J) & - & +TNS(I,J-1)+TNS(I,J+1) & - & +TNE(I+IHW(J),J-1)+TNE(I,J) & - & +TSE(I,J)+TSE(I+IHW(J),J+1)) & - & *RDPD(I,J)*FAD(I,J) - ENDDO - ENDDO -! -! -!----------------------------------------------------------------------- -!*** CALCULATION OF MOMENTUM ADVECTION COMPONENTS. -!----------------------------------------------------------------------- -! - DO J=MYJS4_P1,MYJE4_P1 - DO I=MYIS_P1,MYIE_P1 -! -!----------------------------------------------------------------------- -!*** THE NS AND EW FLUXES ARE ON H POINTS FOR U AND V. -!----------------------------------------------------------------------- -! - UEW(I,J)=(FEW(I+IHW(J),J,K)+FEW(I+IHE(J),J,K)) & - & *(UST(I+IHE(J),J)-UST(I+IHW(J),J)) - UNS(I,J)=(FNS(I+IHW(J),J,K)+FNS(I+IHE(J),J,K)) & - & *(UST(I,J+1)-UST(I,J-1)) - VEW(I,J)=(FEW(I,J-1,K)+FEW(I,J+1,K)) & - & *(VST(I+IHE(J),J)-VST(I+IHW(J),J)) - VNS(I,J)=(FNS(I,J-1,K)+FNS(I,J+1,K)) & - & *(VST(I,J+1)-VST(I,J-1)) -! -!----------------------------------------------------------------------- -!*** THE FOLLOWING NE AND SE FLUXES ARE TIED TO V POINTS AND ARE -!*** LOCATED JUST TO THE NE AND SE OF THE GIVEN I,J. -!----------------------------------------------------------------------- -! - UNE(I,J)=(FNE(I+IVW(J),J,K)+FNE(I+IVE(J),J,K)) & - & *(UST(I+IVE(J),J+1)-UST(I,J)) - USE(I,J)=(FSE(I+IVW(J),J,K)+FSE(I+IVE(J),J,K)) & - & *(UST(I+IVE(J),J-1)-UST(I,J)) - VNE(I,J)=(FNE(I,J-1,K)+FNE(I,J+1,K)) & - & *(VST(I+IVE(J),J+1)-VST(I,J)) - VSE(I,J)=(FSE(I,J-1,K)+FSE(I,J+1,K)) & - & *(VST(I+IVE(J),J-1)-VST(I,J)) -! -!----------------------------------------------------------------------- -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** COMPUTE THE ADVECTION TENDENCIES FOR U AND V. -!*** THE AD ARRAYS ARE ON THE VELOCITY POINTS. -!----------------------------------------------------------------------- -! - DO J=MYJS5,MYJE5 - DO I=MYIS2,MYIE2 - ADU(I,J)=(UEW(I+IVW(J),J)+UEW(I+IVE(J),J) & - & +UNS(I,J-1)+UNS(I,J+1) & - & +UNE(I+IVW(J),J-1)+UNE(I,J) & - & +USE(I,J)+USE(I+IVW(J),J+1)) & - & *RDPDX(I,J)*FAD(I+IVW(J),J) -! - ADV(I,J)=(VEW(I+IVW(J),J)+VEW(I+IVE(J),J) & - & +VNS(I,J-1)+VNS(I,J+1) & - & +VNE(I+IVW(J),J-1)+VNE(I,J) & - & +VSE(I,J)+VSE(I+IVW(J),J+1)) & - & *RDPDY(I,J)*FAD(I+IVW(J),J) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! -!*** END OF JANJIC HORIZONTAL ADVECTION -! -!----------------------------------------------------------------------- -! -!*** UPSTREAM ADVECTION OF T -! -!----------------------------------------------------------------------- -! - upstream: IF(UPSTRM)THEN -! -!----------------------------------------------------------------------- -!*** -!*** COMPUTE UPSTREAM COMPUTATIONS ON THIS TASK'S ROWS. -!*** -!----------------------------------------------------------------------- -! - jloop_upstream: DO J=MYJS2,MYJE2 -! - N_IUPH_J=N_IUP_H(J) ! See explanation in START_DOMAIN_NMM - DO II=0,N_IUPH_J-1 -! - I=IUP_H(IMS+II,J) - TTA=EMT_LOC(J)*(UST(I,J-1)+UST(I+IHW(J),J) & - & +UST(I+IHE(J),J)+UST(I,J+1)) - TTB=ENT *(VST(I,J-1)+VST(I+IHW(J),J) & - & +VST(I+IHE(J),J)+VST(I,J+1)) - PP=-TTA-TTB - QP= TTA-TTB -! - IF(PP<0.)THEN - ISPA(I,J)=-1 - ELSE - ISPA(I,J)= 1 - ENDIF -! - IF(QP<0.)THEN - ISQA(I,J)=-1 - ELSE - ISQA(I,J)= 1 - ENDIF -! - PP=ABS(PP) - QP=ABS(QP) - ARRAY3_X=PP*QP - ARRAY0(I,J)=ARRAY3_X-PP-QP - ARRAY1(I,J)=PP-ARRAY3_X - ARRAY2(I,J)=QP-ARRAY3_X - ARRAY3(I,J)=ARRAY3_X - ENDDO -! -!----------------------------------------------------------------------- -! - N_IUPADH_J=N_IUP_ADH(J) - KNTI_ADH=1 - IUP_ADH_J=IUP_ADH(IMS,J) -! - iloop_T: DO II=0,N_IUPH_J-1 -! - I=IUP_H(IMS+II,J) -! - ISP=ISPA(I,J) - ISQ=ISQA(I,J) - IFP=(ISP-1)/2 - IFQ=(-ISQ-1)/2 - IPQ=(ISP-ISQ)/2 -! -!----------------------------------------------------------------------- -! - IF(I==IUP_ADH_J)THEN ! Upstream advection T tendencies -! - ISP=ISPA(I,J) - ISQ=ISQA(I,J) - IFP=(ISP-1)/2 - IFQ=(-ISQ-1)/2 - IPQ=(ISP-ISQ)/2 -! - F0=ARRAY0(I,J) - F1=ARRAY1(I,J) - F2=ARRAY2(I,J) - F3=ARRAY3(I,J) -! - ADT(I,J)=F0*T(I,J,K) & - & +F1*T(I+IHE(J)+IFP,J+ISP,K) & - & +F2*T(I+IHE(J)+IFQ,J+ISQ,K) & - +F3*T(I+IPQ,J+ISP+ISQ,K) -! -!----------------------------------------------------------------------- -! - IF(KNTI_ADH0.)THEN - SUMPQ=SUMPQ+DQP - ELSE - SUMNQ=SUMNQ+DQP - ENDIF -! - IF(DWP>0.)THEN - SUMPW=SUMPW+DWP - ELSE - SUMNW=SUMNW+DWP - ENDIF -! - IF(DEP>0.)THEN - SUMPE=SUMPE+DEP - ELSE - SUMNE=SUMNE+DEP - ENDIF -! - ENDDO antifilter -! -!----------------------------------------------------------------------- -! - DQL(KTS)=0. - DWL(KTS)=0. - DEL(KTS)=0. -! - DQL(KTE)=0. - DWL(KTE)=0. - DEL(KTE)=0. -! -!----------------------------------------------------------------------- -!*** FIRST MOMENT CONSERVING FACTOR -!----------------------------------------------------------------------- -! - if(sumpq*(-sumnq).gt.1.e-9) then - sfacqk=-sumnq/sumpq - else - sfacqk=0. - endif -! - if(sumpw*(-sumnw).gt.1.e-9) then - sfacwk=-sumnw/sumpw - else - sfacwk=0. - endif -! - if(sumpe*(-sumne).gt.1.e-9) then - sfacek=-sumne/sumpe - else - sfacek=0. - endif -! -!----------------------------------------------------------------------- -!*** IMPOSE CONSERVATION ON ANTI-FILTERING -!----------------------------------------------------------------------- -! - DO K=KTE,KTS,-1 -! - dqp=dql(k) - if(sfacqk.gt.0.) then - if(sfacqk.ge.1.) then - if(dqp.lt.0.) dqp=dqp/sfacqk - else - if(dqp.gt.0.) dqp=dqp*sfacqk - endif - else - dqp=0. - endif - q (i,j,k)=q4(k)+dqp -! - dwp=dwl(k) - if(sfacwk.gt.0.) then - if(sfacwk.ge.1.) then - if(dwp.lt.0.) dwp=dwp/sfacwk - else - if(dwp.gt.0.) dwp=dwp*sfacwk - endif - else - dwp=0. - endif - cwm(i,j,k)=w4(k)+dwp -! - dep=del(k) - if(sfacek.gt.0.) then - if(sfacek.ge.1.) then - if(dep.lt.0.) dep=dep/sfacek - else - if(dep.gt.0.) dep=dep*sfacek - endif - else - dep=0. - endif - e3 ( k)=e4(k)+dep -! - ENDDO -!----------------------------------------------------------------------- - HBM2IJ=HBM2(I,J) - Q2(I,J,KTE)=MAX(E3(KTE)+E3(KTE)-EPSQ2,EPSQ2)*HBM2IJ & - & +Q2(I,J,KTE)*(1.-HBM2IJ) - DO K=KTE-1,KTS+1,-1 - Q2(I,J,K)=MAX(E3(K)+E3(K)-Q2(I,J,K+1),EPSQ2)*HBM2IJ & - & +Q2(I,J,K)*(1.-HBM2IJ) - ENDDO -!----------------------------------------------------------------------- -! - ENDDO main_iloop -! -!----------------------------------------------------------------------- -! - ENDDO main_integration -! -!----------------------------------------------------------------------- -! - END SUBROUTINE VAD2 -! - -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*********************************************************************** - SUBROUTINE HAD2( & -#if defined(DM_PARALLEL) - & domdesc , & -#endif - & NTSD,DT,IDTAD,DX,DY & - & ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP & - & ,HBM2,HBM3 & - & ,Q,Q2,CWM,U,V,Z,HYDRO & - & ,N_IUP_H,N_IUP_V & - & ,N_IUP_ADH,N_IUP_ADV & - & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV & - & ,IHE,IHW,IVE,IVW & - & ,advect_Q2 & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: HAD2 HORIZONTAL ADVECTION OF H2O AND TKE -! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-07-19 -! -! ABSTRACT: -! HAD2 CALCULATES THE CONTRIBUTION OF THE HORIZONTAL ADVECTION -! TO THE TENDENCIES OF WATER SUBSTANCE AND TKE AND THEN -! UPDATES THOSE VARIABLES. AN ANTI-FILTERING TECHNIQUE IS USED. -! -! PROGRAM HISTORY LOG: -! 96-07-19 JANJIC - ORIGINATOR -! 98-11-02 BLACK - MODIFIED FOR DISTRIBUTED MEMORY -! 99-03-17 TUCCILLO - INCORPORATED MPI_ALLREDUCE FOR GLOBAL SUM -! 02-02-06 BLACK - CONVERTED TO WRF FORMAT -! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING -! 03-05-23 JANJIC - ADDED SLOPE FACTOR -! 04-11-23 BLACK - THREADED -! 05-12-14 BLACK - CONVERTED FROM IKJ TO IJK -! 07-08-14 janjic - no conservation in advection step -! -! USAGE: CALL HAD2 FROM SUBROUTINE SOLVE_NMM -! INPUT ARGUMENT LIST: -! -! OUTPUT ARGUMENT LIST -! -! OUTPUT FILES: -! NONE -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!*********************************************************************** -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! - LOGICAL, INTENT(IN) :: advect_Q2 - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V & - & ,N_IUP_ADH,N_IUP_ADV - INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V & - & ,IUP_ADH,IUP_ADV -! -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: IDTAD,NTSD -! - REAL,INTENT(IN) :: DT,DY,PDTOP -! - REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2 -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,HBM3,PDSL -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: U,V,Z -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: CWM,Q,Q2 -! - LOGICAL,INTENT(IN) :: HYDRO -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - REAL,PARAMETER :: FF1=0.530 -! -#ifdef DM_PARALLEL - INTEGER :: DOMDESC -#endif -! -#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI) - LOGICAL,EXTERNAL :: WRF_DM_ON_MONITOR - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,6) :: XSUMS_L - REAL,DIMENSION(IDS:IDE,JDS:JDE,KDS:KDE,6) :: XSUMS_G -#endif -! - LOGICAL :: BOT,TOP -! - INTEGER :: I,IRECV,J,JFP,JFQ,K,LAP,LLAP,MPI_COMM_COMP - INTEGER :: N -! - INTEGER,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: IFPA,IFPF & - & ,IFQA,IFQF & - & ,JFPA,JFPF & - & ,JFQA,JFQF -! - REAL :: ADDT,AFRP,CRIT,D2PQE,D2PQQ,D2PQW,DEP,DESTIJ,DQP,DQSTIJ & - & ,DVOLP,DWP,DWSTIJ,DZA,DZB,E00,E0Q,E1X,E2IJ,E4P,ENH,EP,EP0 & - & ,ESTIJ,FPQ,HAFP,HAFQ,HBM2IJ,HM,PP,PPQ00,Q00,Q0Q & - & ,Q1IJ,Q4P,QP,QP0,QSTIJ,RDY,RFACE,RFACQ,RFACW,RFC & - & ,RFEIJ,RFQIJ,RFWIJ,RR,SLOPAC,SPP,SQP,SSA,SSB,SUMNE,SUMNQ & - & ,SUMNW,SUMPE,SUMPQ,SUMPW,TTA,TTB,W00,W0Q,W1IJ,W4P,WP,WP0 & - & ,WSTIJ -! - DOUBLE PRECISION,DIMENSION(6,KTS:KTE) :: GSUMS,XSUMS -! - REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,E3,E4 & - & ,Q3,Q4,W3,W4 -! - REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: DARE,EMH -! - REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: AFP,AFQ,DEST & - & ,DQST,DVOL,DWST & - & ,E1,E2,Q1,W1 -!----------------------------------------------------------------------- - integer :: nunit,ier - save nunit -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! - RDY=1./DY - SLOPAC=SLOPHT*SQRT(2.)*0.5*50. - CRIT=SLOPAC*REAL(IDTAD)*DT*RDY*1000. -! - ADDT=REAL(IDTAD)*DT - ENH=ADDT/(08.*DY) -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS_P3,MYJE_P3 - DO I=MYIS_P2,MYIE_P2 - EMH (I,J)=ADDT/(08.*DX(I,J)) - DARE(I,J)=HBM3(I,J)*DX(I,J)*DY - ENDDO - ENDDO -!$omp parallel do & -!$omp& private(i,j) - if(advect_Q2) then - DO J=MYJS_P3,MYJE_P3 - DO I=MYIS_P2,MYIE_P2 - E1(I,J,KTE)=MAX(Q2(I,J,KTE)*0.5,EPSQ2) - E2(I,J,KTE)=E1(I,J,KTE) - ENDDO - ENDDO - endif -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(dza,dzb,e1x,fpq,hm,i,j,jfp,jfq,k,pp,qp,ssa,ssb,spp,sqp & -!$omp& ,tta,ttb) -!----------------------------------------------------------------------- -! - vertical_1: DO K=KTS,KTE -! -!----------------------------------------------------------------------- -! - DO J=MYJS_P3,MYJE_P3 - DO I=MYIS_P2,MYIE_P2 - DVOL(I,J,K)=DARE(I,J)*(DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)) - Q (I,J,K)=MAX(Q (I,J,K),EPSQ) - CWM(I,J,K)=MAX(CWM(I,J,K),CLIMIT) - Q1 (I,J,K)=Q (I,J,K) - W1 (I,J,K)=CWM(I,J,K) - ENDDO - ENDDO -! - if(advect_Q2) then - IF(KSLOPAC)THEN - SSA=DZA*SPP - IF(SSA>CRIT)THEN - SPP=0. !spp*.1 - ENDIF - ENDIF -! - IF(ABS(DZB)>SLOPAC)THEN - SSB=DZB*SQP - IF(SSB>CRIT)THEN - SQP=0. !sqp*.1 - ENDIF - ENDIF -! - ENDIF -! -!----------------------------------------------------------------------- -! - FPQ=SPP*SQP*0.25 - PP=ABS(SPP) - QP=ABS(SQP) -! - AFP(I,J,K)=(((FF4*PP+FF3)*PP+FF2)*PP+FF1)*PP - AFQ(I,J,K)=(((FF4*QP+FF3)*QP+FF2)*QP+FF1)*QP -! - Q1(I,J,K)=(Q (IFPA(I,J,K),JFPA(I,J,K),K)-Q (I,J,K))*PP & - & +(Q (IFQA(I,J,K),JFQA(I,J,K),K)-Q (I,J,K))*QP & - & +(Q (I,J-2,K)+Q (I,J+2,K) & - & -Q (I-1,J,K)-Q (I+1,J,K))*FPQ & - & +Q(I,J,K) -! - W1(I,J,K)=(CWM(IFPA(I,J,K),JFPA(I,J,K),K)-CWM(I,J,K))*PP & - & +(CWM(IFQA(I,J,K),JFQA(I,J,K),K)-CWM(I,J,K))*QP & - & +(CWM(I,J-2,K)+CWM(I,J+2,K) & - & -CWM(I-1,J,K)-CWM(I+1,J,K))*FPQ & - & +CWM(I,J,K) -! - if(advect_Q2) then - E2(I,J,K)=(E1 (IFPA(I,J,K),JFPA(I,J,K),K)-E1 (I,J,K))*PP & - & +(E1 (IFQA(I,J,K),JFQA(I,J,K),K)-E1 (I,J,K))*QP & - & +(E1 (I,J-2,K)+E1 (I,J+2,K) & - & -E1 (I-1,J,K)-E1 (I+1,J,K))*FPQ & - & +E1(I,J,K) - endif - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - ENDDO vertical_1 -! -!----------------------------------------------------------------------- -!*** ANTI-FILTERING STEP -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - XSUMS(1,K)=0. - XSUMS(2,K)=0. - XSUMS(3,K)=0. - XSUMS(4,K)=0. - XSUMS(5,K)=0. - XSUMS(6,K)=0. - ENDDO -!----------------------------------------------------------------------- -! -!*** ANTI-FILTERING LIMITERS -! -!----------------------------------------------------------------------- -#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI) - DO N=1,6 -! -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - XSUMS_L(I,J,K,N)=0. - ENDDO - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KDS,KDE - DO J=JDS,JDE - DO I=IDS,IDE - XSUMS_G(I,J,K,N)=0. - ENDDO - ENDDO - ENDDO -! - ENDDO -! -#endif -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(d2pqe,d2pqq,d2pqw,destij,dqstij,dvolp,dwstij & -!$omp& ,e00,e0q,e2ij,ep0,estij,hafp,hafq,i,j,k & -!$omp& ,q00,q0q,q1ij,qp0,qstij,w00,w0q,w1ij,wp0,wstij) -!----------------------------------------------------------------------- -! - vertical_2: DO K=KTS,KTE -! -!----------------------------------------------------------------------- -! - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 -! - DVOLP=DVOL(I,J,K) - Q1IJ =Q1(I,J,K) - W1IJ =W1(I,J,K) - E2IJ =E2(I,J,K) -! - HAFP=AFP(I,J,K) - HAFQ=AFQ(I,J,K) -! - D2PQQ=(Q1(IFPA(I,J,K),JFPA(I,J,K),K)-Q1IJ & - & -Q1IJ+Q1(IFPF(I,J,K),JFPF(I,J,K),K)) & - & *HAFP & - & +(Q1(IFQA(I,J,K),JFQA(I,J,K),K)-Q1IJ & - & -Q1IJ+Q1(IFQF(I,J,K),JFQF(I,J,K),K)) & - & *HAFQ -! - D2PQW=(W1(IFPA(I,J,K),JFPA(I,J,K),K)-W1IJ & - & -W1IJ+W1(IFPF(I,J,K),JFPF(I,J,K),K)) & - & *HAFP & - & +(W1(IFQA(I,J,K),JFQA(I,J,K),K)-W1IJ & - & -W1IJ+W1(IFQF(I,J,K),JFQF(I,J,K),K)) & - & *HAFQ -! - if( advect_Q2) then - D2PQE=(E2(IFPA(I,J,K),JFPA(I,J,K),K)-E2IJ & - & -E2IJ+E2(IFPF(I,J,K),JFPF(I,J,K),K)) & - & *HAFP & - & +(E2(IFQA(I,J,K),JFQA(I,J,K),K)-E2IJ & - & -E2IJ+E2(IFQF(I,J,K),JFQF(I,J,K),K)) & - & *HAFQ - endif -! - QSTIJ=Q1IJ-D2PQQ - WSTIJ=W1IJ-D2PQW - if(advect_q2) ESTIJ=E2IJ-D2PQE -! - Q00=Q (I ,J ,K) - QP0=Q (IFPA(I,J,K),JFPA(I,J,K),K) - Q0Q=Q (IFQA(I,J,K),JFQA(I,J,K),K) -! - W00=CWM(I ,J ,K) - WP0=CWM(IFPA(I,J,K),JFPA(I,J,K),K) - W0Q=CWM(IFQA(I,J,K),JFQA(I,J,K),K) -! - if(advect_Q2) then - E00=E1 (I ,J ,K) - EP0=E1 (IFPA(I,J,K),JFPA(I,J,K),K) - E0Q=E1 (IFQA(I,J,K),JFQA(I,J,K),K) - endif -! - QSTIJ=MAX(QSTIJ,MIN(Q00,QP0,Q0Q)) - QSTIJ=MIN(QSTIJ,MAX(Q00,QP0,Q0Q)) - WSTIJ=MAX(WSTIJ,MIN(W00,WP0,W0Q)) - WSTIJ=MIN(WSTIJ,MAX(W00,WP0,W0Q)) - if(advect_Q2) then - ESTIJ=MAX(ESTIJ,MIN(E00,EP0,E0Q)) - ESTIJ=MIN(ESTIJ,MAX(E00,EP0,E0Q)) - endif -! -! DQSTIJ=QSTIJ-Q(I,J,K) -! DWSTIJ=WSTIJ-CWM(I,J,K) -! DESTIJ=ESTIJ-E1(I,J,K) -! - dqstij=qstij-q1(i,j,k) - dwstij=wstij-w1(i,j,k) - if(advect_Q2) destij=estij-e2(i,j,k) -! - DQST(I,J,K)=DQSTIJ - DWST(I,J,K)=DWSTIJ - if(advect_Q2) DEST(I,J,K)=DESTIJ -! - DQSTIJ=DQSTIJ*DVOLP - DWSTIJ=DWSTIJ*DVOLP - if(advect_Q2) DESTIJ=DESTIJ*DVOLP -! -!----------------------------------------------------------------------- -#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI) -!----------------------------------------------------------------------- - DO N=1,6 - XSUMS_L(I,J,K,N)=0. - ENDDO -! - IF(DQSTIJ>0.)THEN - XSUMS_L(I,J,K,1)=DQSTIJ - ELSE - XSUMS_L(I,J,K,2)=DQSTIJ - ENDIF -! - IF(DWSTIJ>0.)THEN - XSUMS_L(I,J,K,3)=DWSTIJ - ELSE - XSUMS_L(I,J,K,4)=DWSTIJ - ENDIF -! - if(advect_q2) then - IF(DESTIJ>0.)THEN - XSUMS_L(I,J,K,5)=DESTIJ - ELSE - XSUMS_L(I,J,K,6)=DESTIJ - ENDIF - endif -!----------------------------------------------------------------------- -#else -!----------------------------------------------------------------------- - IF(DQSTIJ>0.)THEN - XSUMS(1,K)=XSUMS(1,K)+DQSTIJ - ELSE - XSUMS(2,K)=XSUMS(2,K)+DQSTIJ - ENDIF -! - IF(DWSTIJ>0.)THEN - XSUMS(3,K)=XSUMS(3,K)+DWSTIJ - ELSE - XSUMS(4,K)=XSUMS(4,K)+DWSTIJ - ENDIF -! - if(advect_q2) then - IF(DESTIJ>0.)THEN - XSUMS(5,K)=XSUMS(5,K)+DESTIJ - ELSE - XSUMS(6,K)=XSUMS(6,K)+DESTIJ - ENDIF - endif -!----------------------------------------------------------------------- -#endif -!----------------------------------------------------------------------- -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - ENDDO vertical_2 -! -!----------------------------------------------------------------------- -#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI) -!----------------------------------------------------------------------- - DO N=1,6 - CALL WRF_PATCH_TO_GLOBAL_REAL(XSUMS_L(IMS,JMS,KMS,N) & - &, XSUMS_G(1,1,1,N),DOMDESC & - &, 'xyz','xyz' & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE) - ENDDO -! - DO K=KTS,KTE - DO N=1,6 - GSUMS(N,K)=0. - ENDDO - ENDDO -! - IF(WRF_DM_ON_MONITOR())THEN - DO N=1,6 -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KTS,KTE - DO J=JDS,JDE - DO I=IDS,IDE - GSUMS(N,K)=GSUMS(N,K)+XSUMS_G(I,J,K,N) - ENDDO - ENDDO - ENDDO - ENDDO - ENDIF - - CALL WRF_DM_BCAST_BYTES(GSUMS,2*RWORDSIZE*6*(KTE-KTS+1) ) - -!----------------------------------------------------------------------- -#else -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** GLOBAL REDUCTION -!----------------------------------------------------------------------- -! -# if defined(DM_PARALLEL) && !defined(STUBMPI) - CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP) - CALL MPI_ALLREDUCE(XSUMS,GSUMS,6*(KTE-KTS+1) & - & ,MPI_DOUBLE_PRECISION,MPI_SUM & - & ,MPI_COMM_COMP,IRECV) -# else - DO K=KTS,KTE - DO N=1,6 - GSUMS(N,K)=XSUMS(N,K) - ENDDO - ENDDO -# endif -! -!----------------------------------------------------------------------- -#endif -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** END OF GLOBAL REDUCTION -!----------------------------------------------------------------------- -! -! if(mype==0)then -!!! if(ntsd==0)then -!!! call int_get_fresh_handle(nunit) -!!! close(nunit) -! nunit=56 -!!! open(unit=nunit,file='gsums',form='unformatted',iostat=ier) -!!! endif -! endif -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(destij,dqstij,dwstij,i,j,k,rface,rfacq,rfacw & -!$omp& ,rfeij,rfqij,rfwij,sumne,sumnq,sumnw,sumpe,sumpq,sumpw) -!----------------------------------------------------------------------- -! - vertical_3: DO K=KTS,KTE -! -!----------------------------------------------------------------------- -! if(mype==0)then -! write(nunit)(gsums(i,k),i=1,6) -! endif -!!! read(nunit)(gsums(i,k),i=1,6) -!----------------------------------------------------------------------- -! - SUMPQ=GSUMS(1,K) - SUMNQ=GSUMS(2,K) - SUMPW=GSUMS(3,K) - SUMNW=GSUMS(4,K) - SUMPE=GSUMS(5,K) - SUMNE=GSUMS(6,K) -! -!----------------------------------------------------------------------- -!*** FIRST MOMENT CONSERVING FACTOR -!----------------------------------------------------------------------- -! - IF(SUMPQ>1.)THEN - RFACQ=-SUMNQ/SUMPQ - ELSE - RFACQ=1. - ENDIF -! - IF(SUMPW>1.)THEN - RFACW=-SUMNW/SUMPW - ELSE - RFACW=1. - ENDIF -! - IF(SUMPE>1.)THEN - RFACE=-SUMNE/SUMPE - ELSE - RFACE=1. - ENDIF -! - IF(RFACQCONSERVE_MAX)RFACQ=1. - IF(RFACWCONSERVE_MAX)RFACW=1. - IF(RFACECONSERVE_MAX)RFACE=1. -! -!----------------------------------------------------------------------- -! if(mype==0.and.ntsd==181)close(nunit) -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** IMPOSE CONSERVATION ON ANTI-FILTERING -!----------------------------------------------------------------------- -! - if(rfacq<1.)then - do j=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - DQSTIJ=DQST(I,J,K) - RFQIJ=HBM2(I,J)*(RFACQ-1.)+1. - IF(DQSTIJ>=0.)DQSTIJ=DQSTIJ*RFQIJ - q(i,j,k)=q1(i,j,k)+dqstij - ENDDO - enddo - else - do j=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - DQSTIJ=DQST(I,J,K) - RFQIJ=HBM2(I,J)*(RFACQ-1.)+1. - IF(DQSTIJ<0.)DQSTIJ=DQSTIJ/RFQIJ - q(i,j,k)=q1(i,j,k)+dqstij - ENDDO - enddo - endif -! -!----------------------------------------------------------------------- -! - if(rfacw<1.)then - do j=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - DWSTIJ=DWST(I,J,K) - RFWIJ=HBM2(I,J)*(RFACW-1.)+1. - IF(DWSTIJ>=0.)DWSTIJ=DWSTIJ*RFWIJ - cwm(i,j,k)=w1(i,j,k)+dwstij - ENDDO - enddo - else - do j=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - DWSTIJ=DWST(I,J,K) - RFWIJ=HBM2(I,J)*(RFACW-1.)+1. - IF(DWSTIJ<0.)DWSTIJ=DWSTIJ/RFWIJ - cwm(i,j,k)=w1(i,j,k)+dwstij - ENDDO - enddo - endif - -!----------------------------------------------------------------------- -! - if(advect_Q2) then - if(rface<1.)then - do j=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - DESTIJ=DEST(I,J,K) - RFEIJ=HBM2(I,J)*(RFACE-1.)+1. - IF(DESTIJ>=0.)DESTIJ=DESTIJ*RFEIJ - e1(i,j,k)=e2(i,j,k)+destij - ENDDO - enddo - else - do j=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - DESTIJ=DEST(I,J,K) - RFEIJ=HBM2(I,J)*(RFACE-1.)+1. - IF(DESTIJ<0.)DESTIJ=DESTIJ/RFEIJ - e1(i,j,k)=e2(i,j,k)+destij - ENDDO - enddo - endif - endif -! -!----------------------------------------------------------------------- -! - DO J=MYJS,MYJE - DO I=MYIS,MYIE - Q (I,J,K)=MAX(Q (I,J,K),EPSQ) - CWM(I,J,K)=MAX(CWM(I,J,K),CLIMIT) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - ENDDO vertical_3 -! -!----------------------------------------------------------------------- -! - if(advect_Q2) then -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS,MYJE - DO I=MYIS,MYIE - Q2(I,J,KTE)=MAX(E1(I,J,KTE)+E1(I,J,KTE)-EPSQ2,EPSQ2) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - DO K=KTE-1,KTS+1,-1 -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS,MYJE - DO I=MYIS,MYIE - IF(K>KTS)THEN - Q2(I,J,K)=MAX(E1(I,J,K)+E1(I,J,K)-Q2(I,J,K+1),EPSQ2) - ELSE - Q2(I,J,K)=Q2(I,J,K+1) - ENDIF - ENDDO - ENDDO - ENDDO - endif -!----------------------------------------------------------------------- -! - END SUBROUTINE HAD2 -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! New routines added by Georg Grell to handle advection more like ARW -! core. Instead of VAD2/HAD2 that advect TKE, specific humidity, and -! condensed water species all in one routine, we call VAD2/HAD2_SCAL -! with multidimensioned arrays to advect each variable. For purposes -! here, solve_nmm.F calls this routine once for TKE, then again for -! all the species held in the moist array (qv, qc, qi, qr, qs, qg), -! then call again for number concentrations held in scalar array (qni). -! The dummy argument lstart is the starting index of the multidimensioned -! array for starting the advection since the 1st index of moist and -! scalar are actually empty placeholders (and the 2nd element is vapor, -! then qc, etc.) When calling with single 3D array (like TKE), just -! set NUM_SCAL=1 and lstart=1. The variable to advect is called SCAL -! herein. -!*********************************************************************** - SUBROUTINE VAD2_SCAL(NTSD,DT,IDTAD,DX,DY & - & ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP & - & ,HBM2 & - & ,SCAL,PETDT & - & ,N_IUP_H,N_IUP_V & - & ,N_IUP_ADH,N_IUP_ADV & - & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV & - & ,IHE,IHW,IVE,IVW & - & ,NUM_SCAL,LSTART & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: VAD2_SCAL VERTICAL ADVECTION OF SCALARS -! -! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-07-19 -! GRELL,PECKHAM ORG: NOAA/FSL DATE: 05-02-03 -! -! ABSTRACT: -! VAD2_SCAL CALCULATES THE CONTRIBUTION OF THE VERTICAL ADVECTION -! TO THE TENDENCIES OF SCALAR SUBSTANCES AND THEN UPDATES -! THOSE VARIABLES. AN ANTI-FILTERING TECHNIQUE IS USED. -! -! PROGRAM HISTORY LOG: -! 96-07-19 JANJIC - ORIGINATOR -! 05-02-03 GRELL,PECKHAM - MODIFIED FOR SCALARS -! -! USAGE: CALL VAD2_SCAL FROM SUBROUTINE SOLVE_NMM -! INPUT ARGUMENT LIST: -! -! OUTPUT ARGUMENT LIST -! -! OUTPUT FILES: -! NONE -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM -!$$$ -!*********************************************************************** -!---------------------------------------------------------------------- -! - IMPLICIT NONE -! -!---------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,INTENT(IN) :: LSTART,NUM_SCAL -! - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V & - & ,N_IUP_ADH,N_IUP_ADV - INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V & - & ,IUP_ADH,IUP_ADV -! - INTEGER,INTENT(IN) :: IDTAD,NTSD -! - REAL,INTENT(IN) :: DT,DY,PDTOP -! - REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2 -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,PDSL -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PETDT -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,1:NUM_SCAL) & - ,INTENT(INOUT) :: SCAL -! -!---------------------------------------------------------------------- -!*** LOCAL VARIABLES -!---------------------------------------------------------------------- -! - REAL,PARAMETER :: FF1=0.500 -! - LOGICAL,SAVE :: TRADITIONAL=.TRUE. -! - INTEGER :: I,IRECV,J,JFP,JFQ,K,L,LAP,LLAP -! - INTEGER,DIMENSION(KTS:KTE) :: LA -! - REAL*8 :: ADDT,AFRP,D2PQQ,DETAP,DPDN,DPUP,DQP & - & ,HADDT,HBM2IJ & - & ,Q00,Q4P,QP,QP0 & - & ,RFACQK,RFC,RR & - & ,SUMNQ,SUMPQ -! - REAL :: SFACQK -! - REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,E3,E4,PETDTK & - & ,RFACE,RFACQ,RFACW,Q3,Q4,W3,W4 -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! - ADDT=REAL(IDTAD)*DT -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(afr,afrp,d2pqq,detap,dpdn,dpup & -!$omp& ,dql,dqp,haddt,i,j,k & -!$omp& ,la,lap,llap,petdtk,q00,q3,q4,q4p,qp,qp0,rfacqk & -!$omp& ,rfc,rr,sfacqk,sumnq,sumpq) -!----------------------------------------------------------------------- -! - scalar_loop: DO L=LSTART,NUM_SCAL -! - main_integration: DO J=MYJS2,MYJE2 -! -!----------------------------------------------------------------------- -! - main_iloop: DO I=MYIS1_P1,MYIE1_P1 -! -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - Q3(K)=SCAL(I,J,K,L) - Q4(K)=Q3(K) - ENDDO -! - IF(TRADITIONAL)THEN - PETDTK(KTE)=PETDT(I,J,KTE-1)*0.5 -! - DO K=KTE-1,KTS+1,-1 - PETDTK(K)=(PETDT(I,J,K)+PETDT(I,J,K-1))*0.5 - ENDDO -! - PETDTK(KTS)=PETDT(I,J,KTS)*0.5 -! - ELSE -! -!----------------------------------------------------------------------- -!*** PERFORM HORIZONTAL AVERAGING OF VERTICAL VELOCITY -!----------------------------------------------------------------------- -! - PETDTK(KTE)=(PETDT(I+IHW(J-1),J-1,KTE-1) & - & +PETDT(I+IHE(J-1),J-1,KTE-1) & - & +PETDT(I+IHW(J+1),J+1,KTE-1) & - & +PETDT(I+IHE(J+1),J+1,KTE-1) & - & +PETDT(I,J,KTE-1)*4. )*0.0625 -! - DO K=KTE-1,KTS+1,-1 - PETDTK(K)=(PETDT(I+IHW(J-1),J-1,K-1) & - +PETDT(I+IHE(J-1),J-1,K-1) & - & +PETDT(I+IHW(J+1),J+1,K-1) & - & +PETDT(I+IHE(J+1),J+1,K-1) & - & +PETDT(I+IHW(J-1),J-1,K ) & - & +PETDT(I+IHE(J-1),J-1,K ) & - & +PETDT(I+IHW(J+1),J+1,K ) & - & +PETDT(I+IHE(J+1),J+1,K ) & - & +(PETDT(I,J,K-1)+PETDT(I,J,K))*4. & - & )*0.0625 - ENDDO -! - PETDTK(KTS)=(PETDT(I+IHW(J-1),J-1,KTS) & - & +PETDT(I+IHE(J-1),J-1,KTS) & - & +PETDT(I+IHW(J+1),J+1,KTS) & - & +PETDT(I+IHE(J+1),J+1,KTS) & - & +PETDT(I,J,KTS)*4. )*0.0625 - - ENDIF -! -!----------------------------------------------------------------------- -! - HADDT=-ADDT*HBM2(I,J) -! - DO K=KTE,KTS,-1 - RR=PETDTK(K)*HADDT -! - IF(RR<0.)THEN - LAP=1 - ELSE - LAP=-1 - ENDIF -! - LA(K)=LAP - LLAP=K+LAP -! - IF(LLAP>KTS-1.AND.LLAP0.9)RR=0.9 -! - AFR(K)=(((FF4*RR+FF3)*RR+FF2)*RR+FF1)*RR - DQP=(Q3(LLAP)-Q3(K))*RR - DQL(K)=DQP - ELSE - RR=0. - AFR(K)=0. - DQL(K)=0. - ENDIF - ENDDO -! -!----------------------------------------------------------------------- -! - IF(LA(KTE-1)>0)THEN - RFC=(DETA1(KTE-1)*PDTOP+DETA2(KTE-1)*PDSL(I,J)) & - & /(DETA1(KTE )*PDTOP+DETA2(KTE )*PDSL(I,J)) - DQL(KTE)=-DQL(KTE-1)*RFC - ENDIF -! - IF(LA(KTS+1)<0)THEN - RFC=(DETA1(KTS+1)*PDTOP+DETA2(KTS+1)*PDSL(I,J)) & - & /(DETA1(KTS )*PDTOP+DETA2(KTS )*PDSL(I,J)) - DQL(KTS)=-DQL(KTS+1)*RFC - ENDIF -! - DO K=KTS,KTE - Q4(K)=Q3(K)+DQL(K) - ENDDO -! -!----------------------------------------------------------------------- -!*** ANTI-FILTERING STEP -!----------------------------------------------------------------------- -! - SUMPQ=0. - SUMNQ=0. -! -!*** ANTI-FILTERING LIMITERS -! - antifilter: DO K=KTE-1,KTS+1,-1 -! - DETAP=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J) -! - Q4P=Q4(K) -! - LAP=LA(K) -! - DPDN=(AETA1(K+LAP)-AETA1(K))*PDTOP & - & +(AETA2(K+LAP)-AETA2(K))*PDSL(I,J) - DPUP=(AETA1(K)-AETA1(K-LAP))*PDTOP & - & +(AETA2(K)-AETA2(K-LAP))*PDSL(I,J) -! - AFRP=2.*AFR(K)*DPDN*DPDN/(DPDN+DPUP) - D2PQQ=((Q4(K+LAP)-Q4P)/DPDN & - & -(Q4P-Q4(K-LAP))/DPUP)*AFRP -! - QP=Q4P-D2PQQ -! - Q00=Q3(K) - QP0=Q3(K+LAP) -! - QP=MAX(QP,MIN(Q00,QP0)) - QP=MIN(QP,MAX(Q00,QP0)) -! - DQP=QP-Q00 -! - DQL(K)=DQP -! - ENDDO antifilter -! -!----------------------------------------------------------------------- -! - IF(LA(KTE-1)>0)THEN - RFC=(DETA1(KTE-1)*PDTOP+DETA2(KTE-1)*PDSL(I,J)) & - & /(DETA1(KTE )*PDTOP+DETA2(KTE )*PDSL(I,J)) - DQL(KTE)=-DQL(KTE-1)*RFC+DQL(KTE) - ENDIF -! - IF(LA(KTS+1)<0)THEN - RFC=(DETA1(KTS+1)*PDTOP+DETA2(KTS+1)*PDSL(I,J)) & - & /(DETA1(KTS )*PDTOP+DETA2(KTS )*PDSL(I,J)) - DQL(KTS)=-DQL(KTS+1)*RFC+DQL(KTS) - ENDIF -! - DO K=KTS,KTE - DETAP=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J) - DQP=DQL(K)*DETAP -! - IF(DQP>0.)THEN - SUMPQ=SUMPQ+DQP - ELSE - SUMNQ=SUMNQ+DQP - ENDIF - ENDDO -! -!----------------------------------------------------------------------- -!*** FIRST MOMENT CONSERVING FACTOR -!----------------------------------------------------------------------- -! - IF(SUMPQ>1.E-9)THEN - SFACQK=-SUMNQ/SUMPQ - ELSE - SFACQK=1. - ENDIF -! - IF(SFACQKCONSERVE_MAX)SFACQK=1. -! - RFACQK=1./SFACQK -! -!----------------------------------------------------------------------- -!*** IMPOSE CONSERVATION ON ANTI-FILTERING -!----------------------------------------------------------------------- -! - DO K=KTE,KTS,-1 - DQP=DQL(K) - IF(SFACQK>=1.)THEN - IF(DQP<0.)DQP=DQP*RFACQK - ELSE - IF(DQP>0.)DQP=DQP*SFACQK - ENDIF - SCAL(I,J,K,L)=Q3(K)+DQP - ENDDO -! -!----------------------------------------------------------------------- -! - ENDDO main_iloop -! -!----------------------------------------------------------------------- -! - ENDDO main_integration -! -!----------------------------------------------------------------------- -! - ENDDO scalar_loop -! -!----------------------------------------------------------------------- -! - END SUBROUTINE VAD2_SCAL -! -!----------------------------------------------------------------------- -! -!*********************************************************************** - SUBROUTINE HAD2_SCAL( & -#if defined(DM_PARALLEL) - & DOMDESC , & -#endif - & NTSD,DT,IDTAD,DX,DY & - & ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP & - & ,HBM2,HBM3 & - & ,SCAL,U,V,Z,HYDRO & - & ,N_IUP_H,N_IUP_V & - & ,N_IUP_ADH,N_IUP_ADV & - & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV & - & ,IHE,IHW,IVE,IVW & - & ,NUM_SCAL,LSTART & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: HAD2_SCAL HORIZONTAL ADVECTION OF SCALAR -! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-07-19 -! GRELL,PECKHAM ORG: NOAA/FSL DATE: 05-02-03 -! -! ABSTRACT: -! HAD2_SCAL CALCULATES THE CONTRIBUTION OF THE HORIZONTAL ADVECTION -! TO THE TENDENCIES OF SCALAR SUBSTANCES AND THEN -! UPDATES THOSE VARIABLES. AN ANTI-FILTERING TECHNIQUE IS USED. -! -! PROGRAM HISTORY LOG: -! 96-07-19 JANJIC - ORIGINATOR -! 05-01-03 GRELL,PECKHAM - MODIFIED FOR SCALAR -! -! USAGE: CALL HAD2_SCAL FROM SUBROUTINE SOLVE_NMM -! INPUT ARGUMENT LIST: -! -! OUTPUT ARGUMENT LIST -! -! OUTPUT FILES: -! NONE -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM -!$$$ -!*********************************************************************** -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V & - & ,N_IUP_ADH,N_IUP_ADV - INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V & - & ,IUP_ADH,IUP_ADV -! -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: IDTAD,LSTART,NTSD,NUM_SCAL -! - REAL,INTENT(IN) :: DT,DY,PDTOP -! - REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2 -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,HBM3,PDSL -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: U,V,Z -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,1:NUM_SCAL) & - ,INTENT(INOUT) :: SCAL -! - LOGICAL,INTENT(IN) :: HYDRO -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - REAL,PARAMETER :: FF1=0.530 -! -#ifdef DM_PARALLEL - INTEGER :: DOMDESC -#endif -! -#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI) - LOGICAL,EXTERNAL :: WRF_DM_ON_MONITOR - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,2) :: XSUMS_L - REAL,DIMENSION(IDS:IDE,JDS:JDE,KDS:KDE,2) :: XSUMS_G -#endif -! - LOGICAL :: BOT,TOP -! - INTEGER :: I,IRECV,J,JFP,JFQ,K,L,LAP,LLAP,MPI_COMM_COMP - INTEGER :: N -! - INTEGER,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: IFPA,IFPF & - & ,IFQA,IFQF & - & ,JFPA,JFPF & - & ,JFQA,JFQF -! - REAL :: ADDT,AFRP,CRIT,D2PQE,D2PQQ,D2PQW,DEP,DESTIJ,DQP,DQSTIJ & - & ,DVOLP,DWP,DWSTIJ,DZA,DZB,E00,E0Q,E1X,E2IJ,E4P,ENH,EP,EP0 & - & ,ESTIJ,FPQ,HAFP,HAFQ,HBM2IJ,HM,PP,PPQ00,Q00,Q0Q & - & ,Q1IJ,Q4P,QP,QP0,QSTIJ,RDY,RFACE,RFACQ,RFACW,RFC & - & ,RFEIJ,RFQIJ,RFWIJ,RR,SLOPAC,SPP,SQP,SSA,SSB,SUMNQ,SUMPQ & - & ,TTA,TTB,W00,W0Q,W1IJ,W4P,WP,WP0,WSTIJ -! - DOUBLE PRECISION,DIMENSION(2,KTS:KTE) :: GSUMS,XSUMS -! - REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,Q3,Q4 -! - REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: DARE,EMH -! - REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: AFP,AFQ,DEST & - & ,DQST,DVOL,DWST & - & ,Q1 -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME) :: Q -! -!----------------------------------------------------------------------- - integer :: nunit,ier - save nunit -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! - RDY=1./DY - SLOPAC=SLOPHT*SQRT(2.)*0.5*50. - CRIT=SLOPAC*REAL(IDTAD)*DT*RDY*1000. -! - ADDT=REAL(IDTAD)*DT - ENH=ADDT/(08.*DY) -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS_P3,MYJE_P3 - DO I=MYIS_P2,MYIE_P2 - EMH (I,J)=ADDT/(08.*DX(I,J)) - DARE(I,J)=HBM3(I,J)*DX(I,J)*DY - ENDDO - ENDDO -!----------------------------------------------------------------------- -! - scalar_loop: DO L=LSTART,NUM_SCAL -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(dza,dzb,e1x,fpq,hm,i,j,jfp,jfq,k,pp,qp,ssa,ssb,spp,sqp & -!$omp& ,tta,ttb) -!----------------------------------------------------------------------- -! - vertical_1: DO K=KTS,KTE -! -!----------------------------------------------------------------------- -! - DO J=MYJS_P3,MYJE_P3 - DO I=MYIS_P2,MYIE_P2 - DVOL(I,J,K)=DARE(I,J)*(DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)) - Q (I,J,K)=SCAL(I,J,K,L) - Q1(I,J,K)=Q(I,J,K) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 -! - HM=HBM2(I,J) - TTA=(U(I,J-1,K)+U(I+IHW(J),J,K)+U(I+IHE(J),J,K)+U(I,J+1,K)) & - & *EMH(I,J)*HM - TTB=(V(I,J-1,K)+V(I+IHW(J),J,K)+V(I+IHE(J),J,K)+V(I,J+1,K)) & - & *ENH*HBM2(I,J) -! - SPP=-TTA-TTB - SQP= TTA-TTB -! - IF(SPP<0.)THEN - JFP=-1 - ELSE - JFP=1 - ENDIF - IF(SQP<0.)THEN - JFQ=-1 - ELSE - JFQ=1 - ENDIF -! - IFPA(I,J,K)=IHE(J)+I+( JFP-1)/2 - IFQA(I,J,K)=IHE(J)+I+(-JFQ-1)/2 -! - JFPA(I,J,K)=J+JFP - JFQA(I,J,K)=J+JFQ -! - IFPF(I,J,K)=IHE(J)+I+(-JFP-1)/2 - IFQF(I,J,K)=IHE(J)+I+( JFQ-1)/2 -! - JFPF(I,J,K)=J-JFP - JFQF(I,J,K)=J-JFQ -! -!----------------------------------------------------------------------- - IF(.NOT.HYDRO)THEN ! z currently not available for hydro=.true. - DZA=(Z(IFPA(I,J,K),JFPA(I,J,K),K)-Z(I,J,K))*RDY - DZB=(Z(IFQA(I,J,K),JFQA(I,J,K),K)-Z(I,J,K))*RDY -! - IF(ABS(DZA)>SLOPAC)THEN - SSA=DZA*SPP - IF(SSA>CRIT)THEN - SPP=0. !spp*.1 - ENDIF - ENDIF -! - IF(ABS(DZB)>SLOPAC)THEN - SSB=DZB*SQP - IF(SSB>CRIT)THEN - SQP=0. !sqp*.1 - ENDIF - ENDIF -! - ENDIF -! -!----------------------------------------------------------------------- -! - FPQ=SPP*SQP*0.25 - PP=ABS(SPP) - QP=ABS(SQP) -! - AFP(I,J,K)=(((FF4*PP+FF3)*PP+FF2)*PP+FF1)*PP - AFQ(I,J,K)=(((FF4*QP+FF3)*QP+FF2)*QP+FF1)*QP -! - Q1(I,J,K)=(Q (IFPA(I,J,K),JFPA(I,J,K),K)-Q (I,J,K))*PP & - & +(Q (IFQA(I,J,K),JFQA(I,J,K),K)-Q (I,J,K))*QP & - & +(Q (I,J-2,K)+Q (I,J+2,K) & - & -Q (I-1,J,K)-Q (I+1,J,K))*FPQ & - & +Q(I,J,K) -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - ENDDO vertical_1 -! -!----------------------------------------------------------------------- -!*** ANTI-FILTERING STEP -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - XSUMS(1,K)=0. - XSUMS(2,K)=0. - ENDDO -! -!----------------------------------------------------------------------- -! -!*** ANTI-FILTERING LIMITERS -! -!----------------------------------------------------------------------- -#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI) - DO N=1,2 -! -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - XSUMS_L(I,J,K,N)=0. - ENDDO - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KDS,KDE - DO J=JDS,JDE - DO I=IDS,IDE - XSUMS_G(I,J,K,N)=0. - ENDDO - ENDDO - ENDDO -! - ENDDO -! -#endif -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(d2pqe,d2pqq,d2pqw,destij,dqstij,dvolp,dwstij & -!$omp& ,e00,e0q,ep0,estij,hafp,hafq,i,j,k & -!$omp& ,q00,q0q,q1ij,qp0,qstij,w00,w0q,wp0,wstij) -!----------------------------------------------------------------------- -! - vertical_2: DO K=KTS,KTE -! -!----------------------------------------------------------------------- -! - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 -! - DVOLP=DVOL(I,J,K) - Q1IJ =Q1(I,J,K) -! - HAFP=AFP(I,J,K) - HAFQ=AFQ(I,J,K) -! - D2PQQ=(Q1(IFPA(I,J,K),JFPA(I,J,K),K)-Q1IJ & - & -Q1IJ+Q1(IFPF(I,J,K),JFPF(I,J,K),K)) & - & *HAFP & - & +(Q1(IFQA(I,J,K),JFQA(I,J,K),K)-Q1IJ & - & -Q1IJ+Q1(IFQF(I,J,K),JFQF(I,J,K),K)) & - & *HAFQ -! - QSTIJ=Q1IJ-D2PQQ -! - Q00=Q (I ,J ,K) - QP0=Q (IFPA(I,J,K),JFPA(I,J,K),K) - Q0Q=Q (IFQA(I,J,K),JFQA(I,J,K),K) -! - QSTIJ=MAX(QSTIJ,MIN(Q00,QP0,Q0Q)) - QSTIJ=MIN(QSTIJ,MAX(Q00,QP0,Q0Q)) -! - DQSTIJ=QSTIJ-Q(I,J,K) -! - DQST(I,J,K)=DQSTIJ -! - DQSTIJ=DQSTIJ*DVOLP -! -!----------------------------------------------------------------------- -#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI) -!----------------------------------------------------------------------- - DO N=1,2 - XSUMS_L(I,J,K,N)=0. - ENDDO -! - IF(DQSTIJ>0.)THEN - XSUMS_L(I,J,K,1)=DQSTIJ - ELSE - XSUMS_L(I,J,K,2)=DQSTIJ - ENDIF -! -!----------------------------------------------------------------------- -#else -!----------------------------------------------------------------------- - IF(DQSTIJ>0.)THEN - XSUMS(1,K)=XSUMS(1,K)+DQSTIJ - ELSE - XSUMS(2,K)=XSUMS(2,K)+DQSTIJ - ENDIF -! -!----------------------------------------------------------------------- -#endif -!----------------------------------------------------------------------- -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - ENDDO vertical_2 -! -!----------------------------------------------------------------------- -#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI) -!----------------------------------------------------------------------- - DO N=1,2 - CALL WRF_PATCH_TO_GLOBAL_REAL(XSUMS_L(IMS,JMS,KMS,N) & - &, XSUMS_G(1,1,1,N),DOMDESC & - &, 'xyz','xzy' & - &, IDS,IDE,KDS,KDE,JDS,JDE & - &, IMS,IME,KMS,KME,JMS,JME & - &, ITS,ITE,KTS,KTE,JTS,JTE) - ENDDO -! - DO K=KTS,KTE - DO N=1,2 - GSUMS(N,K)=0. - ENDDO - ENDDO -! - IF(WRF_DM_ON_MONITOR())THEN - DO N=1,2 -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KDS,KDE - DO J=JDS,JDE - DO I=IDS,IDE - GSUMS(N,K)=GSUMS(N,K)+XSUMS_G(I,J,K,N) - ENDDO - ENDDO - ENDDO - ENDDO - ENDIF - - CALL WRF_DM_BCAST_BYTES(GSUMS,2*RWORDSIZE*2*(KDE-KDS+1) ) - -!----------------------------------------------------------------------- -#else -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** GLOBAL REDUCTION -!----------------------------------------------------------------------- -! -# if defined(DM_PARALLEL) && !defined(STUBMPI) - CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP) - CALL MPI_ALLREDUCE(XSUMS,GSUMS,2*(KTE-KTS+1) & - & ,MPI_DOUBLE_PRECISION,MPI_SUM & - & ,MPI_COMM_COMP,IRECV) -# else - DO K=KTS,KTE - DO N=1,2 - GSUMS(N,K)=XSUMS(N,K) - ENDDO - ENDDO -# endif -! -!----------------------------------------------------------------------- -#endif -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** END OF GLOBAL REDUCTION -!----------------------------------------------------------------------- -! -! if(mype==0)then -!!! if(ntsd==0)then -!!! call int_get_fresh_handle(nunit) -!!! close(nunit) -! nunit=56 -!!! open(unit=nunit,file='gsums',form='unformatted',iostat=ier) -!!! endif -! endif -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(destij,dqstij,dwstij,i,j,k,rface,rfacq,rfacw & -!$omp& ,rfeij,rfqij,rfwij,sumnq,sumpq) -!----------------------------------------------------------------------- -! - vertical_3: DO K=KTS,KTE -! -!----------------------------------------------------------------------- -! if(mype==0)then -! write(nunit)(gsums(i,k),i=1,6) -! endif -!!! read(nunit)(gsums(i,k),i=1,6) -!----------------------------------------------------------------------- -! - SUMPQ=GSUMS(1,K) - SUMNQ=GSUMS(2,K) -! -!----------------------------------------------------------------------- -!*** FIRST MOMENT CONSERVING FACTOR -!----------------------------------------------------------------------- -! - IF(SUMPQ>1.)THEN - RFACQ=-SUMNQ/SUMPQ - ELSE - RFACQ=1. - ENDIF -! - IF(RFACQCONSERVE_MAX)RFACQ=1. -! -!----------------------------------------------------------------------- -! if(mype==0.and.ntsd==181)close(nunit) -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** IMPOSE CONSERVATION ON ANTI-FILTERING -!----------------------------------------------------------------------- -! - DO J=MYJS2,MYJE2 - IF(RFACQ<1.)THEN - DO I=MYIS1,MYIE1 - DQSTIJ=DQST(I,J,K) - RFQIJ=HBM2(I,J)*(RFACQ-1.)+1. - IF(DQSTIJ>=0.)DQSTIJ=DQSTIJ*RFQIJ - Q(I,J,K)=Q(I,J,K)+DQSTIJ - ENDDO - ELSE - DO I=MYIS1,MYIE1 - DQSTIJ=DQST(I,J,K) - RFQIJ=HBM2(I,J)*(RFACQ-1.)+1. - IF(DQSTIJ<0.)DQSTIJ=DQSTIJ/RFQIJ - Q(I,J,K)=Q(I,J,K)+DQSTIJ - ENDDO - ENDIF - ENDDO -! -!----------------------------------------------------------------------- -! - DO J=MYJS,MYJE - DO I=MYIS,MYIE - SCAL(I,J,K,L)=Q(I,J,K) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - ENDDO vertical_3 -! -!----------------------------------------------------------------------- -! - ENDDO scalar_loop -! -!----------------------------------------------------------------------- -! - END SUBROUTINE HAD2_SCAL -! -!----------------------------------------------------------------------- -!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - subroutine adv2 & -(UPSTRM & -,mype,kss,kse & -,ids,ide,jds,jde,kds,kde & -,ims,ime,jms,jme,kms,kme & -,its,ite,jts,jte,kts,kte & -,N_IUP_H & -,N_IUP_ADH & -,IUP_H,IUP_ADH & -,ENT & -,idtad & -,dt,pdtop & -,ihe,ihw,ive,ivw & -,deta1,deta2 & -,EMT_LOC & -,fad,hbm2,pdsl,pdslo & -,petdt & -,UOLD,VOLD & -,s,sp & -!---temporary arguments------------------------------------------------- -,fne,fse,few,fns,s1,tcs) -!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -implicit none -!----------------------------------------------------------------------- -real,parameter:: & - cfc=1.533 & ! adams-bashforth positioning in time -,bfc=1.-cfc & ! adams bashforth positioning in time -,cflc=9.005 & ! -,epsq=1.e-20 & ! floor value for specific humidity -,epsq2=0.2 & ! floor value for 2tke -,epscm=2.e-6 & ! a floor value (not used) -,w1=1.0 & ! crank-nicholson uncentering -!,w1=-1.00 & ! crank-nicholson uncentering -,w2=2.-w1 ! crank-nicholson uncentering - -logical,intent(in):: & - upstrm - -integer,intent(in):: & - idtad & ! time step multiplier -,kse & ! terminal species index -,kss & ! initial species index -,mype & ! -,ids,ide,jds,jde,kds,kde & -,ims,ime,jms,jme,kms,kme & -,its,ite,jts,jte,kts,kte - -real,intent(in):: & - ent & ! -,dt & ! dynamics time step -,pdtop ! - -real,dimension(kts:kte),intent(in):: & - deta1 & ! delta sigmas -,deta2 ! delta pressures - -integer,dimension(jms:jme),intent(in):: & - ihe,ihw,ive,ivw & -,n_iup_adh,n_iup_h - -integer,dimension(ims:ime,jms:jme),intent(in):: & - iup_h,iup_adh - -real,dimension(2600),intent(in):: & !!!zj see nmm_max_dim in adve !!!zj - emt_loc - -real,dimension(ims:ime,jms:jme),intent(in):: & - fad & ! -,hbm2 & ! -,pdsl & ! sigma range pressure difference -,pdslo ! sigma range pressure difference - -real,dimension(ims:ime,jms:jme,kms:kme),intent(in):: & - petdt & ! vertical mass flux -,uold,vold - -real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(inout):: & - s ! tracers - -real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(inout):: & - sp ! s at previous time level - -!---temporary arguments------------------------------------------------- -real,dimension(ims:ime,jms:jme,kms:kme),intent(in):: & - fne & ! mass flux, ne direction -,fse & ! mass flux, se direction -,few & ! mass flux, x direction -,fns ! mass flux, y direction - -real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(inout):: & - s1 & ! intermediate value of s -,tcs ! timechange of s - -!--local variables------------------------------------------------------ -integer:: & - i & ! -,j & ! -,k & ! -,ks ! - - INTEGER :: IEND,IFP,IFQ,II,IPQ,ISP,ISQ,ISTART & - & ,IUP_ADH_J & - & ,J1,JA,JAK,JEND,JGLOBAL,JJ,JKNT,JP2,JSTART & - & ,KNTI_ADH,KSTART,KSTOP & - & ,N,N_IUPH_J,N_IUPADH_J,N_IUPADV_J - - INTEGER :: MY_IS_GLB,MY_IE_GLB,MY_JS_GLB,MY_JE_GLB - -real:: & - cf & ! temporary -,cms & ! temporary -,dtq & ! dt/4 -,fahp & ! temporary grid factor -,sn & ! -,rdp & ! 1/deltap -,vvlo & ! vertical velocity, lower interface -,vvup & ! vertical velocity, upper interface -,pvvup ! vertical mass flux, upper interface - - REAL :: ARRAY3_X & - & ,F0,F1,F2,F3 & - & ,PP & - & ,QP & - & ,TEMPA,TEMPB,TTA,TTB - -real,dimension(kts:kte):: & - deta1_pdtop ! - - INTEGER,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: ISPA,ISQA - -real,dimension(its-5:ite+5,jts-5:jte+5):: & - pdop & ! hydrostatic pressure difference at h points -,pvvlo & ! vertical mass flux, lower interface -,ss1 & ! extrapolated species between time levels -,ssne & ! flux, ne direction -,ssse & ! flux, nw direction -,ssx & ! flux, x direction -,ssy ! flux, y direction - - REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: ARRAY0,ARRAY1 & - & ,ARRAY2,ARRAY3 - -real,dimension(its-5:ite+5,jts-5:jte+5,kts:kte):: & - crs & ! vertical advection temporary -,rcms ! vertical advection temporary - -real,dimension(its-5:ite+5,jts-5:jte+5,kts:kte,kss:kse):: & - rsts ! vertical advection temporary -!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - DO J=JTS-5,JTE+5 - DO I=ITS-5,ITE+5 - pdop (i,j)=0. - pvvlo(i,j)=0. - ss1 (i,j)=0. - ssne (i,j)=0. - ssse (i,j)=0. - enddo - enddo -! - DO K=KTS,KTE - DO J=JTS-5,JTE+5 - DO I=ITS-5,ITE+5 - crs (i,j,k)=0. - rcms(i,j,k)=0. - enddo - enddo - enddo -! - do ks=kss,kse - DO K=KTS,KTE - DO J=JTS-5,JTE+5 - DO I=ITS-5,ITE+5 - rsts(i,j,k,ks)=0. - enddo - enddo - enddo - enddo -! - do ks=kss,kse - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - s1 (i,j,k,ks)=0. - tcs(i,j,k,ks)=0. - enddo - enddo - enddo - enddo -!----------------------------------------------------------------------- - do k=kts,kte - deta1_pdtop(k)=deta1(k)*pdtop - enddo -!----------------------------------------------------------------------- - do ks=kss,kse ! loop by species -!----------------------------------------------------------------------- - DO K=KTS,KTE - DO J=MYJS_P4,MYJE_P4 - DO I=MYIS_P4,MYIE_P4 - s1(i,j,k,ks)=sqrt(s(i,j,k,ks)) - enddo - enddo - enddo -!----------------------------------------------------------------------- - enddo ! end of the loop by species -!----------------------------------------------------------------------- - DO J=MYJS_P4,MYJE_P4 - DO I=MYIS_P4,MYIE_P4 - pdop(i,j)=(pdslo(i,j)+pdsl(i,j))*0.5 - enddo - enddo -!---crank-nicholson vertical advection---------------------------------- - dtq=dt*idtad*0.25 - - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - pvvlo(i,j)=petdt(i,j,kte-1)*dtq - vvlo=pvvlo(i,j)/(deta2(kte)*pdop(i,j)+deta1_pdtop(kte)) -! - cms=-vvlo*w2+1. - rcms(i,j,kte)=1./cms - crs(i,j,kte)=vvlo*w2 -! - do ks=kss,kse - rsts(i,j,kte,ks)=(-vvlo*w1) & - *(s1(i,j,kte-1,ks)-s1(i,j,kte,ks)) & - +s1(i,j,kte,ks) - enddo - enddo - enddo - DO K=KTE-1,KTS+1,-1 - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - rdp=1./(deta2(k)*pdop(i,j)+deta1_pdtop(k)) - pvvup=pvvlo(i,j) - pvvlo(i,j)=petdt(i,j,k-1)*dtq -! - vvup=pvvup*rdp - vvlo=pvvlo(i,j)*rdp -! -! if(abs(vvlo).gt.cflc) then -! if(vvlo.lt.0.) then -! vvlo=-cflc -! else -! vvlo= cflc -! endif -! endif -! - cf=-vvup*w2*rcms(i,j,k+1) - cms=-crs(i,j,k+1)*cf+((vvup-vvlo)*w2+1.) - rcms(i,j,k)=1./cms - crs(i,j,k)=vvlo*w2 -! - do ks=kss,kse - rsts(i,j,k,ks)=-rsts(i,j,k+1,ks)*cf+s1(i,j,k,ks) & - -(s1(i,j,k ,ks)-s1(i,j,k+1,ks))*vvup*w1 & - -(s1(i,j,k-1,ks)-s1(i,j,k ,ks))*vvlo*w1 - enddo - enddo - enddo - enddo - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - pvvup=pvvlo(i,j) - vvup=pvvup/(deta2(kts)*pdop(i,j)+deta1_pdtop(kts)) -! - cf=-vvup*w2*rcms(i,j,kts+1) - cms=-crs(i,j,kts+1)*cf+(vvup*w2+1.) - rcms(i,j,kts)=1./cms - crs(i,j,kts)=0. -! - do ks=kss,kse - rsts(i,j,kts,ks)=-rsts(i,j,kts+1,ks)*cf+s1(i,j,kts,ks) & - -(s1(i,j,kts,ks)-s1(i,j,kts+1,ks))*vvup*w1 -! - tcs(i,j,kts,ks)=rsts(i,j,kts,ks)*rcms(i,j,kts)-s1(i,j,kts,ks) - enddo - enddo - enddo - do ks=kss,kse - DO K=KTS+1,KTE - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - tcs(i,j,k,ks)=(-crs(i,j,k)*(s1(i,j,k-1,ks)+tcs(i,j,k-1,ks)) & - +rsts(i,j,k,ks)) & - *rcms(i,j,k)-s1(i,j,k,ks) - enddo - enddo - enddo - enddo -!----------------------------------------------------------------------- - do ks=kss,kse ! loop by species -!----------------------------------------------------------------------- - DO K=KTS,KTE - DO J=MYJS_P5,MYJE_P5 - DO I=MYIS_P5,MYIE_P5 - ss1(i,j)=s1(i,j,k,ks)*cfc+sp(i,j,k,ks)*bfc - sp(i,j,k,ks)=s1(i,j,k,ks) - enddo - enddo -!---fluxes-------------------------------------------------------------- - DO J=MYJS1_P2,MYJE1_P2 - DO I=MYIS_P2,MYIE_P3 - ssx(i,j)=(ss1(i+ive(j),j )-ss1(i+ivw(j),j ))*few(i,j,k) & - *hbm2(i,j) - ssy(i,j)=(ss1(i ,j+1)-ss1(i ,j-1))*fns(i,j,k) & - *hbm2(i,j) - enddo - enddo - DO J=MYJS1_P2,MYJE2_P2 - DO I=MYIS_P2,MYIE_P2 - ssne(i,j)=(ss1(i+ihe(j),j+1)-ss1(i,j))*fne(i,j,k)*hbm2(i,j) - enddo - enddo - DO J=MYJS2_P2,MYJE1_P2 - DO I=MYIS_P2,MYIE_P2 - ssse(i,j)=(ss1(i+ihe(j),j-1)-ss1(i,j))*fse(i,j,k)*hbm2(i,j) - enddo - enddo -!---advection of species------------------------------------------------ - DO J=MYJS5,MYJE5 - DO I=MYIS2,MYIE2 - tcs(i,j,k,ks)=((ssx (i+ihw(j),j )+ssx (i+ihe(j),j ) & - +ssy (i ,j-1)+ssy (i ,j+1) & - +ssne(i+ihw(j),j-1)+ssne(i ,j ) & - +ssse(i ,j )+ssse(i+ihw(j),j+1)) & - *fad(i,j)*2.0*idtad & !! 2.0 compensates for fad - /(deta2(k)*pdop(i,j)+deta1_pdtop(k)) & - +tcs(i,j,k,ks))*hbm2(i,j) - enddo - enddo -!----------------------------------------------------------------------- -! -!*** upstream advection -! -!----------------------------------------------------------------------- -! - upstream: IF(UPSTRM)THEN -! -!----------------------------------------------------------------------- -!*** -!*** COMPUTE UPSTREAM COMPUTATIONS ON THIS TASK'S ROWS. -!*** -!----------------------------------------------------------------------- -! - jloop_upstream: DO J=MYJS2,MYJE2 -! - N_IUPH_J=N_IUP_H(J) ! See explanation in START_DOMAIN_NMM - DO II=0,N_IUPH_J-1 -! - I=IUP_H(IMS+II,J) - tta=emt_loc(j) & - *(uold(i ,j-1,k)+uold(i+ihw(j),j ,k) & - +uold(i+ihe(j),j ,k)+uold(i ,j+1,k)) - ttb=ent & - *(vold(i ,j-1,k)+vold(i+ihw(j),j ,k) & - +vold(i+ihe(j),j ,k)+vold(i ,j+1,k)) - PP=-TTA-TTB - QP= TTA-TTB -! - IF(PP<0.)THEN - ISPA(I,J)=-1 - ELSE - ISPA(I,J)= 1 - ENDIF -! - IF(QP<0.)THEN - ISQA(I,J)=-1 - ELSE - ISQA(I,J)= 1 - ENDIF -! - PP=ABS(PP) - QP=ABS(QP) - ARRAY3_X=PP*QP - ARRAY0(I,J)=ARRAY3_X-PP-QP - ARRAY1(I,J)=PP-ARRAY3_X - ARRAY2(I,J)=QP-ARRAY3_X - ARRAY3(I,J)=ARRAY3_X - ENDDO -! -!----------------------------------------------------------------------- -! - N_IUPADH_J=N_IUP_ADH(J) - KNTI_ADH=1 - IUP_ADH_J=IUP_ADH(IMS,J) -! - iloop_T: DO II=0,N_IUPH_J-1 -! - I=IUP_H(IMS+II,J) -! - ISP=ISPA(I,J) - ISQ=ISQA(I,J) - IFP=(ISP-1)/2 - IFQ=(-ISQ-1)/2 - IPQ=(ISP-ISQ)/2 -! -!----------------------------------------------------------------------- -! - IF(I==IUP_ADH_J)THEN ! Upstream advection T tendencies -! - ISP=ISPA(I,J) - ISQ=ISQA(I,J) - IFP=(ISP-1)/2 - IFQ=(-ISQ-1)/2 - IPQ=(ISP-ISQ)/2 -! - F0=ARRAY0(I,J) - F1=ARRAY1(I,J) - F2=ARRAY2(I,J) - F3=ARRAY3(I,J) -! - tcs(i,j,k,ks)=(f0*s1(i,j,k,ks) & - & +f1*s1(i+ihe(j)+ifp,j+isp,k,ks) & - & +f2*s1(i+ihe(j)+ifq,j+isq,k,ks) & - & +f3*s1(i+ipq,j+isp+isq,k,ks))*2.0 & - & *idtad & - & +tcs(i,j,k,ks)*hbm2(i,j) -! -!----------------------------------------------------------------------- -! - IF(KNTI_ADH=300.)THEN - WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE SOUTHERN BOUNDARY AT',I,2,'GRID #',GRIDID - CALL wrf_message(trim(message)) - WRITE(message,*)' ',CWK/100. - CALL wrf_message(trim(message)) - WRITE(message,*)PD(I,3)/100.,' ',PD(I+1,3)/100. - CALL wrf_message(trim(message)) - WRITE(message,*)' ',PD(I,2)/100. - CALL wrf_message(trim(message)) - WRITE(message,*)PD(I,1)/100.,' ',PD(I+1,1)/100. - CALL wrf_message(trim(message)) - CALL wrf_message(' ') - ENDIF - - ENDDO - ENDIF -! -!*** ONE ROW SOUTH OF NORTHERN BOUNDARY -! - IF(N_BDY)THEN - - DO I=MYIS,MYIE1 - CWK=PD(I,JJM-1) -!! write(message,*)'I, PD is:', PD(I,JJM), PD(I,JJM-2),PD(I+1,JJM-2),PD(I+1,JJM) -!! call wrf_message(trim(message)) - PD(I,JJM-1)=0.25*(PD(I,JJM-2)+PD(I+1,JJM-2) & - & +PD(I,JJM)+PD(I+1,JJM)) -! -!*** NESTING TEST -! - IF(I<=IDE-1.AND.ABS(CWK-PD(I,JJM-1))>=300.)THEN - WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE NORTHERN BOUNDARY AT',I,JJM-1,'GRID #',GRIDID - CALL wrf_message(trim(message)) - WRITE(message,*)' ',CWK/100. - CALL wrf_message(trim(message)) - WRITE(message,*)PD(I,JJM)/100.,' ',PD(I+1,JJM)/100. - CALL wrf_message(trim(message)) - WRITE(message,*)' ',PD(I,JJM-1)/100. - CALL wrf_message(trim(message)) - WRITE(message,*)PD(I,JJM-2)/100.,' ',PD(I+1,JJM-2)/100. - CALL wrf_message(trim(message)) - CALL wrf_message(' ') - ENDIF - - ENDDO - ENDIF -! -!*** ONE ROW EAST OF WESTERN BOUNDARY -! - IF(W_BDY)THEN - DO J=4,JM-3,2 -! - IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 & - & .AND.J<=MY_JE_GLB+JTPAD1)THEN - CWK=PD(1,J) - JJ=J - PD(1,JJ)=0.25*(PD(1,JJ-1)+PD(2,JJ-1)+PD(1,JJ+1)+PD(2,JJ+1)) -!!BEGIN: LSM changes for LANDFALL: Subashini 7/27/2016 -#ifdef IDEAL_NMM_TC - IF(GRIDID.GT.1)THEN - SM(1,JJ)=0.5*(SM(1,JJ-1)+SM(1,JJ+1)) ! updates only along W Boundary -! TH(IIM-1,JJ)=0.5*(TH(IIM,JJ-1)+TH(IIM,JJ+1)) - ENDIF -#endif -!!END: LSM changes for LANDFALL : Subashini 7/27/2016 -! -!*** NESTING TEST -! - IF(ABS(CWK-PD(1,JJ))>300.)THEN - WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE WESTERN BOUNDARY AT',1,JJ,'GRID #',GRIDID - CALL wrf_message(trim(message)) - WRITE(message,*)' ',CWK/100. - CALL wrf_message(trim(message)) - WRITE(message,*)PD(1,JJ+1)/100.,' ',PD(2,JJ+1)/100. - CALL wrf_message(trim(message)) - WRITE(message,*)' ',PD(1,JJ)/100. - CALL wrf_message(trim(message)) - WRITE(message,*)PD(1,JJ-1)/100.,' ',PD(2,JJ-1)/100. - CALL wrf_message(trim(message)) - CALL wrf_message(' ') - ENDIF - - ENDIF -! - ENDDO - ENDIF -! -!*** ONE ROW WEST OF EASTERN BOUNDARY -! - IF(E_BDY)THEN - DO J=4,JM-3,2 -! - IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 & - & .AND.J<=MY_JE_GLB+JTPAD1)THEN - CWK=PD(IIM-1,J) - JJ=J - PD(IIM-1,JJ)=0.25*(PD(IIM-1,JJ-1)+PD(IIM,JJ-1) & - & +PD(IIM-1,JJ+1)+PD(IIM,JJ+1)) -!!BEGIN: LSM changes for LANDFALL: Subashini 7/27/2016 -#ifdef IDEAL_NMM_TC - IF(GRIDID.GT.1)THEN - SM(IIM-1,JJ)=0.5*(SM(IIM,JJ-1)+SM(IIM,JJ+1)) ! updates only along E Boundary -! TH(IIM-1,JJ)=0.5*(TH(IIM,JJ-1)+TH(IIM,JJ+1)) - ENDIF -#endif -!!END: LSM changes for LANDFALL : Subashini 7/27/2016 -! -!*** NESTING TEST -! - IF(ABS(CWK-PD(IIM-1,JJ))>300.)THEN - WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE EASTERN BOUNDARY AT',IIM-1,JJ,'GRID #',GRIDID - CALL wrf_message(trim(message)) - WRITE(message,*)' ',CWK/100. - CALL wrf_message(trim(message)) - WRITE(message,*)PD(IIM-1,JJ+1)/100.,' ',PD(IIM,JJ+1)/100. - CALL wrf_message(trim(message)) - WRITE(message,*)' ',PD(IIM-1,JJ)/100. - CALL wrf_message(trim(message)) - WRITE(message,*)PD(IIM-1,JJ-1)/100.,' ',PD(IIM,JJ-1)/100. - CALL wrf_message(trim(message)) - CALL wrf_message(' ') - ENDIF - - ENDIF -! - ENDDO - ENDIF -! -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j,jj,k) - DO 200 K=KTS,KTE -! -!----------------------------------------------------------------------- -! -!*** ONE ROW NORTH OF SOUTHERN BOUNDARY -! - IF(S_BDY)THEN - DO I=MYIS,MYIE1 - T(I,2,K)=(T(I,1,K)+T(I+1,1,K)+T(I,3,K)+T(I+1,3,K))*0.25 - Q(I,2,K)=(Q(I,1,K)+Q(I+1,1,K)+Q(I,3,K)+Q(I+1,3,K))*0.25 - Q2(I,2,K)=(Q2(I,1,K)+Q2(I+1,1,K)+Q2(I,3,K)+Q2(I+1,3,K))*0.25 - PINT(I,2,K)=ETA1(K)*PDTOP+ETA2(K)*PD(I,2)*RES(I,2)+PT - ENDDO -! - ENDIF -! -!*** ONE ROW SOUTH OF NORTHERN BOUNDARY -! - IF(N_BDY)THEN - DO I=MYIS,MYIE1 - T(I,JJM-1,K)=(T(I,JJM-2,K)+T(I+1,JJM-2,K) & - & +T(I,JJM,K)+T(I+1,JJM,K)) & - & *0.25 - Q(I,JJM-1,K)=(Q(I,JJM-2,K)+Q(I+1,JJM-2,K) & - & +Q(I,JJM,K)+Q(I+1,JJM,K)) & - & *0.25 - Q2(I,JJM-1,K)=(Q2(I,JJM-2,K)+Q2(I+1,JJM-2,K) & - & +Q2(I,JJM,K)+Q2(I+1,JJM,K)) & - & *0.25 - PINT(I,JJM-1,K)=ETA1(K)*PDTOP & - & +ETA2(K)*PD(I,JJM-1)*RES(I,JJM-1)+PT - ENDDO -! - ENDIF -! -!*** ONE ROW EAST OF WESTERN BOUNDARY -! - IF(W_BDY)THEN - DO J=4,JM-3,2 -! - IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 & - & .AND.J<=MY_JE_GLB+JTPAD1)THEN - JJ=J - T(1,JJ,K)=(T(1,JJ-1,K)+T(2,JJ-1,K) & - & +T(1,JJ+1,K)+T(2,JJ+1,K)) & - & *0.25 - Q(1,JJ,K)=(Q(1,JJ-1,K)+Q(2,JJ-1,K) & - & +Q(1,JJ+1,K)+Q(2,JJ+1,K)) & - & *0.25 - Q2(1,JJ,K)=(Q2(1,JJ-1,K)+Q2(2,JJ-1,K) & - & +Q2(1,JJ+1,K)+Q2(2,JJ+1,K)) & - & *0.25 - PINT(1,JJ,K)=ETA1(K)*PDTOP & - & +ETA2(K)*PD(1,JJ)*RES(1,JJ)+PT -! - ENDIF -! - ENDDO -! - ENDIF -! -!*** ONE ROW WEST OF EASTERN BOUNDARY -! - IF(E_BDY)THEN - DO J=4,JM-3,2 -! - IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 & - & .AND.J<=MY_JE_GLB+JTPAD1)THEN - JJ=J - T(IIM-1,JJ,K)=(T(IIM-1,JJ-1,K)+T(IIM,JJ-1,K) & - & +T(IIM-1,JJ+1,K)+T(IIM,JJ+1,K)) & - & *0.25 - Q(IIM-1,JJ,K)=(Q(IIM-1,JJ-1,K)+Q(IIM,JJ-1,K) & - & +Q(IIM-1,JJ+1,K)+Q(IIM,JJ+1,K)) & - & *0.25 - Q2(IIM-1,JJ,K)=(Q2(IIM-1,JJ-1,K)+Q2(IIM,JJ-1,K) & - & +Q2(IIM-1,JJ+1,K)+Q2(IIM,JJ+1,K)) & - & *0.25 - PINT(IIM-1,JJ,K)=ETA1(K)*PDTOP & - & +ETA2(K)*PD(IIM-1,JJ)*RES(IIM-1,JJ)+PT -! - ENDIF -! - ENDDO - ENDIF -!----------------------------------------------------------------------- -! - 200 CONTINUE -! -!----------------------------------------------------------------------- - END SUBROUTINE MASS_BOUNDARY - SUBROUTINE MP_BULK_BOUNDARY(GRIDID,NTSD,DT0 & - & ,LB,ETA1,ETA2,PDTOP,PT & - & ,CWM_BXS, CWM_BXE, CWM_BYS, CWM_BYE & - & ,CWM_BTXS, CWM_BTXE, CWM_BTYS, CWM_BTYE & - & ,Q,CWM & - & ,MOIST,N_MOIST,SCALAR,N_SCALAR & - & ,SPEC_BDY_WIDTH & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: BOCOH UPDATE MASS POINTS ON BOUNDARY -! PRGRMMR: JANJIC ORG: W/NP22 DATE: 94-03-08 -! -! ABSTRACT: -! TEMPERATURE, SPECIFIC HUMIDITY, AND SURFACE PRESSURE -! ARE UPDATED ON THE DOMAIN BOUNDARY BY APPLYING THE -! PRE-COMPUTED TENDENCIES AT EACH TIME STEP. -! -! PROGRAM HISTORY LOG: -! 87-??-?? MESINGER - ORIGINATOR -! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D in HORIZONTAL -! 96-12-13 BLACK - FINAL MODIFICATION FOR NESTED RUNS -! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY -! 00-01-06 BLACK - MODIFIED FOR JANJIC NONHYDROSTATIC CODE -! 00-09-14 BLACK - MODIFIED FOR DIRECT ACCESS READ -! 01-03-12 BLACK - CONVERTED TO WRF STRUCTURE -! 02-08-29 MICHALAKES - CHANGED II=I-MY_IS_GLB+1 TO II=I -! ADDED CONDITIONAL COMPILATION AROUND MPI -! CONVERT INDEXING FROM LOCAL TO GLOBAL -! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING -! 04-11-18 BLACK - THREADED -! 05-12-19 BLACK - CONVERTED FROM IKJ TO IJK -! 06-06-02 GOPAL - MODIFICATIONS FOR NESTING -! 07-11-14 PYLE - UPDATED FOR NEW WRF BOUNDARY FILE STRUCTURE -! -! USAGE: CALL BOCOH FROM SUBROUTINE SOLVE_NMM -! INPUT ARGUMENT LIST: -! -! NOTE THAT IDE AND JDE INSIDE ROUTINE SHOULD BE PASSED IN -! AS WHAT WRF CONSIDERS THE UNSTAGGERED GRID DIMENSIONS; THAT -! IS, 1 LESS THAN THE IDE AND JDE SET BY WRF FRAMEWORK, JM -! -! OUTPUT ARGUMENT LIST: -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM -!$$$ -!*********************************************************************** -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE - INTEGER,INTENT(IN) :: SPEC_BDY_WIDTH - INTEGER,INTENT(IN) :: N_MOIST, N_SCALAR -! - INTEGER,INTENT(IN) :: GRIDID - INTEGER,INTENT(IN) :: LB,NTSD -! - REAL,INTENT(IN) :: DT0,PDTOP,PT -! - REAL,DIMENSION(KMS:KME),INTENT(IN) :: ETA1,ETA2 -! - REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH) & - & ,INTENT(INOUT) :: CWM_BYS, CWM_BYE & - & ,CWM_BTYS, CWM_BTYE - - REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH) & - & ,INTENT(INOUT) :: CWM_BXS, CWM_BXE & - & ,CWM_BTXS, CWM_BTXE - -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: CWM,Q -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,NUM_MOIST) & - & ,INTENT(INOUT) :: MOIST - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,NUM_SCALAR) & - & ,INTENT(INOUT) :: SCALAR -! -!----------------------------------------------------------------------- -! -!*** LOCAL VARIABLES -! - INTEGER :: I,IB,IBDY,II,IIM,IM,IRTN,ISIZ1,ISIZ2 & - & ,J,JB,JJ,JJM,JM,K,KK,N,NN,NREC,NUMGAS,NV,REC - INTEGER :: MY_IS_GLB,MY_JS_GLB,MY_IE_GLB,MY_JE_GLB - INTEGER :: I_M,ILPAD1,IRPAD1,JBPAD1,JTPAD1 - INTEGER :: I1,I2,J1,J2,J1B,J2B -! - REAL :: BCHR,CONVFAC,CWK,DT,PLYR,RRI -! - LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY,ACTIVATE -! - CHARACTER(LEN=255) :: message -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! - IM=IDE-IDS+1 - JM=JDE-JDS+1 - IIM=IM - JJM=JM -! - ISIZ1=2*LB - ISIZ2=2*LB*(KME-KMS) -! - W_BDY=(ITS==IDS) - E_BDY=(ITE==IDE) - S_BDY=(JTS==JDS) - N_BDY=(JTE==JDE) -! - ILPAD1=1 - IF(W_BDY)ILPAD1=0 - IRPAD1=1 - IF(E_BDY)IRPAD1=0 - JBPAD1=1 - IF(S_BDY)JBPAD1=0 - JTPAD1=1 - IF(N_BDY)JTPAD1=0 -! - MY_IS_GLB=ITS - MY_IE_GLB=ITE - MY_JS_GLB=JTS - MY_JE_GLB=JTE -! - DT=DT0 - - ! I loop ends for N/S bdy copying: - I1=MAX(ITS-1,IDS) - I2=MIN(ITE+1,IDE) - - ! J loop ends for E/W bdy copying: - J1=MAX(JTS-1,JDS+3-1) - IF(MOD(J1,2)/=1) J1=J1+1 - J2=MIN(JTE+1,JDE-2) - IF(MOD(J2,2)/=1) J2=J2-1 - - ! J loop ends for E/W bdy 4-point averaging: - J1B=MAX(4,MY_JS_GLB-JBPAD1) - IF(MOD(J1B,2)/=0) J1B=J1B+1 - J2B=MIN(JM-3,MY_JE_GLB+JTPAD1) - IF(MOD(J2B,2)/=0) J2B=J2B-1 -! -!----------------------------------------------------------------------- -!*** SOUTH AND NORTH BOUNDARIES -!----------------------------------------------------------------------- -! -!*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH -! - ns_do: DO IBDY=1,2 -! -!*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. -! - activate=.false. - if_ns: IF(S_BDY.AND.IBDY==1) THEN - JB=1 ! Which cell in from boundary - JJ=1 ! Which cell in the domain - activate=.true. -!$omp parallel do & -!$omp& private(i,k) - DO K=KTS,KTE - DO I=I1,I2 - CWM_BYS(I,K,JB)=CWM_BYS(I,K,JB)+CWM_BTYS(I,K,JB)*DT - CWM(I,JJ,K)=CWM_BYS(I,K,JB) - ENDDO - ENDDO - - ELSEIF(N_BDY.AND.IBDY==2) THEN - JB=1 ! Which cell in from boundary - JJ=JJM ! Which cell in the domain - activate=.true. -!$omp parallel do & -!$omp& private(i,k) - DO K=KTS,KTE - DO I=I1,I2 - CWM_BYE(I,K,JB)=CWM_BYE(I,K,JB)+CWM_BTYE(I,K,JB)*DT - CWM(I,JJ,K)=CWM_BYE(I,K,JB) - ENDDO - ENDDO - - ENDIF if_ns ! for N/S boundaries - - ns_moist: IF(activate) then - DO I_M=1,N_MOIST - IF(I_M==P_QV)THEN -!$omp parallel do & -!$omp& private(i,k) - DO K=KTS,KTE - DO I=I1,I2 - MOIST(I,JJ,K,I_M)=Q(I,JJ,K)/(1.-Q(I,JJ,K)) - ENDDO - ENDDO - ELSE -!$omp parallel do & -!$omp& private(i,k) - DO K=KTS,KTE - DO I=I1,I2 - MOIST(I,JJ,K,I_M)=0. - ENDDO - ENDDO - ENDIF - ENDDO - DO I_M=2,N_SCALAR -!$omp parallel do & -!$omp& private(i,k) - DO K=KTS,KTE - DO I=I1,I2 - SCALAR(I,JJ,K,I_M)=0. - ENDDO - ENDDO - ENDDO - ENDIF ns_moist - ENDDO ns_do -! -!----------------------------------------------------------------------- -!*** WEST AND EAST BOUNDARIES -!----------------------------------------------------------------------- -! -!*** USE IBDY=1 FOR WEST; 2 FOR EAST. -! - ew_do: DO IBDY=1,2 -! -!*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. -! - activate=.false. - if_ew: IF(W_BDY.AND.IBDY==1) THEN - IB=1 ! Which cell in from boundary - II=1 ! Which cell in the domain - activate=.true. -!$omp parallel do & -!$omp& private(j,k) - DO K=KTS,KTE - DO J=J1,J2,2 -! - IF(MOD(J,2)==1)THEN - CWM_BXS(J,K,IB)=CWM_BXS(J,K,IB)+CWM_BTXS(J,K,IB)*DT - CWM(II,J,K)=CWM_BXS(J,K,IB) - ENDIF -! - ENDDO - ENDDO - - ELSEIF(E_BDY.AND.IBDY==2) THEN - IB=1 ! Which cell in from boundary - II=IIM ! Which cell in the domain - activate=.true. -!$omp parallel do & -!$omp& private(j,k) - DO K=KTS,KTE - DO J=J1,J2,2 -! - IF(MOD(J,2)==1)THEN - CWM_BXE(J,K,IB)=CWM_BXE(J,K,IB)+CWM_BTXE(J,K,IB)*DT - CWM(II,J,K)=CWM_BXE(J,K,IB) - ENDIF -! - ENDDO - ENDDO -! - ENDIF if_ew ! for W/E boundaries - ew_moist: if(activate) then - DO I_M=1,N_MOIST - IF(I_M==P_QV)THEN -!$omp parallel do & -!$omp& private(j,k) - DO K=KTS,KTE - DO J=J1,J2,2 - IF(MOD(J,2)==1)THEN - MOIST(II,J,K,I_M)=Q(II,J,K)/(1.-Q(II,J,K)) - ENDIF - ENDDO - ENDDO -! - ELSE -!$omp parallel do & -!$omp& private(j,k) - DO K=KTS,KTE - DO J=J1,J2,2 - IF(MOD(J,2)==1)THEN - MOIST(II,J,K,I_M)=0. - ENDIF - ENDDO - ENDDO -! - ENDIF - ENDDO -! - DO I_M=2,N_SCALAR -!$omp parallel do & -!$omp& private(j,k) - DO K=KTS,KTE - DO J=J1,J2,2 - IF(MOD(J,2)==1)THEN - SCALAR(II,J,K,I_M)=0. - ENDIF - ENDDO - ENDDO - ENDDO - ENDIF ew_moist - ENDDO ew_do -! -!----------------------------------------------------------------------- -!*** SPACE INTERPOLATION OF PD THEN REMAINING MASS VARIABLES -!*** AT INNER BOUNDARY -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j,jj,k) - DO 200 K=KTS,KTE -! -!----------------------------------------------------------------------- -! -!*** ONE ROW NORTH OF SOUTHERN BOUNDARY -! - IF(S_BDY)THEN - DO I=MYIS,MYIE1 - CWM(I,2,K)=(CWM(I,1,K)+CWM(I+1,1,K)+CWM(I,3,K)+CWM(I+1,3,K)) & - & *0.25 - ENDDO -! - DO I_M=1,N_MOIST - IF(I_M==P_QV)THEN - DO I=MYIS,MYIE1 - MOIST(I,2,K,I_M)=Q(I,2,K)/(1.-Q(I,2,K)) - ENDDO - ELSE - DO I=MYIS,MYIE1 - MOIST(I,2,K,I_M)=(MOIST(I,1,K,I_M) & - & +MOIST(I+1,1,K,I_M) & - & +MOIST(I,3,K,I_M) & - & +MOIST(I+1,3,K,I_M))*0.25 - ENDDO - ENDIF - ENDDO -! - DO I_M=2,N_SCALAR - DO I=MYIS,MYIE1 - SCALAR(I,2,K,I_M)=(SCALAR(I,1,K,I_M) & - & +SCALAR(I+1,1,K,I_M) & - & +SCALAR(I,3,K,I_M) & - & +SCALAR(I+1,3,K,I_M))*0.25 - ENDDO - ENDDO -! - ENDIF -! -!*** ONE ROW SOUTH OF NORTHERN BOUNDARY -! - IF(N_BDY)THEN - DO I=MYIS,MYIE1 - CWM(I,JJM-1,K)=(CWM(I,JJM-2,K)+CWM(I+1,JJM-2,K) & - & +CWM(I,JJM,K)+CWM(I+1,JJM,K)) & - & *0.25 - ENDDO -! - DO I_M=1,N_MOIST - IF(I_M==P_QV)THEN - DO I=MYIS,MYIE1 - MOIST(I,JJM-1,K,I_M)=Q(I,JJM-1,K)/(1.-Q(I,JJM-1,K)) - ENDDO - ELSE - DO I=MYIS,MYIE1 - MOIST(I,JJM-1,K,I_M)=(MOIST(I,JJM-2,K,I_M) & - & +MOIST(I+1,JJM-2,K,I_M) & - & +MOIST(I,JJM,K,I_M) & - & +MOIST(I+1,JJM,K,I_M))*0.25 - ENDDO - - ENDIF - ENDDO -! - DO I_M=2,N_SCALAR - DO I=MYIS,MYIE1 - SCALAR(I,JJM-1,K,I_M)=(SCALAR(I,JJM-2,K,I_M) & - & +SCALAR(I+1,JJM-2,K,I_M) & - & +SCALAR(I,JJM,K,I_M) & - & +SCALAR(I+1,JJM,K,I_M))*0.25 - ENDDO - ENDDO -! - ENDIF -! -!*** ONE ROW EAST OF WESTERN BOUNDARY -! - IF(W_BDY)THEN - DO J=J1B,J2B,2 - JJ=J - CWM(1,JJ,K)=(CWM(1,JJ-1,K)+CWM(2,JJ-1,K) & - & +CWM(1,JJ+1,K)+CWM(2,JJ+1,K)) & - & *0.25 -! - DO I_M=1,N_MOIST - IF(I_M==P_QV)THEN - MOIST(1,JJ,K,I_M)=Q(1,JJ,K)/(1.-Q(1,JJ,K)) - ELSE - MOIST(1,JJ,K,I_M)=(MOIST(1,JJ-1,K,I_M) & - & +MOIST(2,JJ-1,K,I_M) & - & +MOIST(1,JJ+1,K,I_M) & - & +MOIST(2,JJ+1,K,I_M))*0.25 - ENDIF - ENDDO -! - DO I_M=2,N_SCALAR - SCALAR(1,JJ,K,I_M)=(SCALAR(1,JJ-1,K,I_M) & - & +SCALAR(2,JJ-1,K,I_M) & - & +SCALAR(1,JJ+1,K,I_M) & - & +SCALAR(2,JJ+1,K,I_M))*0.25 - ENDDO -! - ENDDO -! - ENDIF -! -!*** ONE ROW WEST OF EASTERN BOUNDARY -! - IF(E_BDY)THEN - DO J=J1B,J2B,2 - JJ=J - CWM(IIM-1,JJ,K)=(CWM(IIM-1,JJ-1,K)+CWM(IIM,JJ-1,K) & - & +CWM(IIM-1,JJ+1,K)+CWM(IIM,JJ+1,K)) & - & *0.25 -! - DO I_M=1,N_MOIST - IF(I_M==P_QV)THEN - MOIST(IIM-1,JJ,K,I_M)=Q(IIM-1,JJ,K)/(1.-Q(IIM-1,JJ,K)) - ELSE - MOIST(IIM-1,JJ,K,I_M)=(MOIST(IIM-1,JJ-1,K,I_M) & - & +MOIST(IIM,JJ-1,K,I_M) & - & +MOIST(IIM-1,JJ+1,K,I_M) & - & +MOIST(IIM,JJ+1,K,I_M))*0.25 - ENDIF - ENDDO -! - DO I_M=2,N_SCALAR - SCALAR(IIM-1,JJ,K,I_M)=(SCALAR(IIM-1,JJ-1,K,I_M) & - & +SCALAR(IIM,JJ-1,K,I_M) & - & +SCALAR(IIM-1,JJ+1,K,I_M) & - & +SCALAR(IIM,JJ+1,K,I_M))*0.25 - ENDDO -! - ENDDO - ENDIF -!----------------------------------------------------------------------- -! - 200 CONTINUE -! -!----------------------------------------------------------------------- - END SUBROUTINE MP_BULK_BOUNDARY -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- - SUBROUTINE BOCOV(GRIDID,NTSD,DT,LB & - & ,U_BXS,U_BXE,U_BYS,U_BYE & - & ,V_BXS,V_BXE,V_BYS,V_BYE & - & ,U_BTXS,U_BTXE,U_BTYS,U_BTYE & - & ,V_BTXS,V_BTXE,V_BTYS,V_BTYE & - & ,U,V & - & ,SPEC_BDY_WIDTH & - & ,IHE,IHW,IVE,IVW & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: BOCOV UPDATE WIND POINTS ON BOUNDARY -! PRGRMMR: JANJIC ORG: W/NP22 DATE: 94-03-08 -! -! ABSTRACT: -! U AND V COMPONENTS OF THE WIND ARE UPDATED ON THE -! DOMAIN BOUNDARY BY APPLYING THE PRE-COMPUTED -! TENDENCIES AT EACH TIME STEP. AN EXTRAPOLATION FROM -! INSIDE THE DOMAIN IS USED FOR THE COMPONENT TANGENTIAL -! TO THE BOUNDARY IF THE NORMAL COMPONENT IS OUTWARD. -! -! PROGRAM HISTORY LOG: -! 87-??-?? MESINGER - ORIGINATOR -! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL -! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY -! 01-03-13 BLACK - CONVERTED TO WRF STRUCTURE -! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING -! 04-11-23 BLACK - THREADED -! 05-12-19 BLACK - CONVERTED FROM IKJ TO IJK -! 06-06-02 GOPAL - MODIFICATIONS FOR NESTING -! -! USAGE: CALL BOCOH FROM SUBROUTINE SOLVE_NMM -! INPUT ARGUMENT LIST: -! -! NOTE THAT IDE AND JDE INSIDE ROUTINE SHOULD BE PASSED IN -! AS WHAT WRF CONSIDERS THE UNSTAGGERED GRID DIMENSIONS; THAT -! IS, 1 LESS THAN THE IDE AND JDE SET BY WRF FRAMEWORK, JM -! -! OUTPUT ARGUMENT LIST: -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM -!$$$ -!*********************************************************************** -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE - INTEGER,INTENT(IN) :: SPEC_BDY_WIDTH -! - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW -! - INTEGER,INTENT(IN) :: GRIDID - INTEGER,INTENT(IN) :: LB,NTSD -! - REAL,INTENT(IN) :: DT -! - REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH),INTENT(INOUT) :: & - & U_BYS,U_BYE,V_BYS,V_BYE & - & ,U_BTYS,U_BTYE & - & ,V_BTYS,V_BTYE - - REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH),INTENT(INOUT) :: & - & U_BXS,U_BXE,V_BXS,V_BXE & - & ,U_BTXS,U_BTXE & - & ,V_BTXS,V_BTXE -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: U,V -!----------------------------------------------------------------------- -! -!*** LOCAL VARIABLES -! - INTEGER :: I,II,IIM,IM,J,JJ,JJM,JM,K,N - INTEGER :: MY_IS_GLB, MY_JS_GLB,MY_IE_GLB,MY_JE_GLB - INTEGER :: IBDY,JB,IB - INTEGER :: ILPAD1,IRPAD1,JBPAD1,JTPAD1 - LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** TIME INTERPOLATION OF U AND V AT THE OUTER BOUNDARY -!----------------------------------------------------------------------- -! - IM=IDE-IDS+1 - JM=JDE-JDS+1 - IIM=IM - JJM=JM -! - W_BDY=(ITS==IDS) - E_BDY=(ITE==IDE) - S_BDY=(JTS==JDS) - N_BDY=(JTE==JDE) -! - ILPAD1=1 - IF(ITS==IDS)ILPAD1=0 - IRPAD1=1 - IF(ITE==IDE)ILPAD1=0 - JBPAD1=1 - IF(JTS==JDS)JBPAD1=0 - JTPAD1=1 - IF(JTE==JDE)JTPAD1=0 -! - MY_IS_GLB=ITS - MY_IE_GLB=ITE - MY_JS_GLB=JTS - MY_JE_GLB=JTE -! -!----------------------------------------------------------------------- -!*** SOUTH AND NORTH BOUNDARIES -!*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH. -!----------------------------------------------------------------------- -! - DO IBDY=1,2 -! -!*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. -! - IF(S_BDY.AND.IBDY==1) THEN -! - JB=1 ! Which cell in from Boundary - JJ=1 ! Which cell in the Domain -! -!$omp parallel do & -!$omp& private(i,k) - DO K=KTS,KTE - DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) - U_BYS(I,K,JB)=U_BYS(I,K,JB)+U_BTYS(I,K,JB)*DT - V_BYS(I,K,JB)=V_BYS(I,K,JB)+V_BTYS(I,K,JB)*DT - U(I,JJ,K)=U_BYS(I,K,JB) - V(I,JJ,K)=V_BYS(I,K,JB) - ENDDO - ENDDO -! - - ELSEIF(N_BDY.AND.IBDY==2) THEN - JB=1 ! Which cell in from Boundary - JJ=JJM ! Which cell in the Domain - -!$omp parallel do & -!$omp& private(i,k) - DO K=KTS,KTE - DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) - U_BYE(I,K,JB)=U_BYE(I,K,JB)+U_BTYE(I,K,JB)*DT - V_BYE(I,K,JB)=V_BYE(I,K,JB)+V_BTYE(I,K,JB)*DT - U(I,JJ,K)=U_BYE(I,K,JB) - V(I,JJ,K)=V_BYE(I,K,JB) - ENDDO - ENDDO - - - ENDIF - ENDDO - -! -!----------------------------------------------------------------------- -!*** WEST AND EAST BOUNDARIES -!*** USE IBDY=1 FOR WEST; 2 FOR EAST. -!----------------------------------------------------------------------- -! - DO IBDY=1,2 -! -!*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. -! - IF(W_BDY.AND.IBDY==1) THEN - IB=1 ! Which cell in from boundary - II=1 ! Which cell in the domain -! -!$omp parallel do & -!$omp& private(j,k) - DO K=KTS,KTE - DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1) - IF(MOD(J,2)==0)THEN - U_BXS(J,K,IB)=U_BXS(J,K,IB)+U_BTXS(J,K,IB)*DT - V_BXS(J,K,IB)=V_BXS(J,K,IB)+V_BTXS(J,K,IB)*DT - U(II,J,K)=U_BXS(J,K,IB) - V(II,J,K)=V_BXS(J,K,IB) - ENDIF - ENDDO - ENDDO - - ELSEIF (E_BDY.AND.IBDY==2) THEN - IB=1 ! Which cell in from boundary - II=IIM ! Which cell in the domain - -!$omp parallel do & -!$omp& private(j,k) - DO K=KTS,KTE - DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1) - IF(MOD(J,2)==0)THEN - U_BXE(J,K,IB)=U_BXE(J,K,IB)+U_BTXE(J,K,IB)*DT - V_BXE(J,K,IB)=V_BXE(J,K,IB)+V_BTXE(J,K,IB)*DT - U(II,J,K)=U_BXE(J,K,IB) - V(II,J,K)=V_BXE(J,K,IB) - ENDIF - ENDDO - ENDDO - -! - ENDIF - - - - ENDDO - -! -!----------------------------------------------------------------------- -!*** EXTRAPOLATION OF TANGENTIAL VELOCITY AT OUTFLOW POINTS -!*** BASED ON SOME DISCUSSIONS WITH ZAVISA, AND MY EXPERIMENTS -!*** ON GRAVITY PULSE FOR NESTED DOMAIN. -!----------------------------------------------------------------------- -! - IF(GRIDID/=1)GO TO 201 -! -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j,jj,k) - DO 200 K=KTS,KTE -! -!----------------------------------------------------------------------- -! -!*** SOUTHERN BOUNDARY -! - IF(S_BDY)THEN - DO I=MYIS1_P1,MYIE2_P1 - IF(V(I,1,K)<0.)U(I,1,K)=2.*U(I,3,K)-U(I,5,K) - ENDDO - ENDIF -! -!*** NORTHERN BOUNDARY -! - IF(N_BDY)THEN - DO I=MYIS1_P1,MYIE2_P1 - IF(V(I,JJM,K)>0.) & - & U(I,JJM,K)=2.*U(I,JJM-2,K)-U(I,JJM-4,K) - ENDDO - ENDIF -! -!*** WESTERN BOUNDARY -! - DO J=4,JM-3,2 - IF(W_BDY)THEN -! - IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 & - & .AND.J<=MY_JE_GLB+JTPAD1)THEN - JJ=J - IF(U(1,JJ,K)<0.) & - & V(1,JJ,K)=2.*V(2,JJ,K)-V(3,JJ,K) - ENDIF -! - ENDIF - ENDDO -! -!*** EASTERN BOUNDARY -! - DO J=4,JM-3,2 - IF(E_BDY)THEN -! - IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 & - & .AND.J<=MY_JE_GLB+JTPAD1)THEN - JJ=J - IF(U(IIM,JJ,K)>0.) & - & V(IIM,JJ,K)=2.*V(IIM-1,JJ,K)-V(IIM-2,JJ,K) - ENDIF -! - ENDIF - ENDDO -!----------------------------------------------------------------------- -! - 200 CONTINUE - - 201 CONTINUE -! -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** SPACE INTERPOLATION OF U AND V AT THE INNER BOUNDARY -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j,jj,k) - DO 300 K=KTS,KTE -! -!----------------------------------------------------------------------- -! -!*** SOUTHWEST CORNER -! - IF(S_BDY.AND.W_BDY)THEN - U(2,2,K)=D06666*(4.*(U(1,1,K)+U(2,1,K)+U(2,3,K)) & - & + U(1,2,K)+U(1,4,K)+U(2,4,K)) - V(2,2,K)=D06666*(4.*(V(1,1,K)+V(2,1,K)+V(2,3,K)) & - & +V(1,2,K)+V(1,4,K)+V(2,4,K)) - ENDIF -! -!*** SOUTHEAST CORNER -! - IF(S_BDY.AND.E_BDY)THEN - U(IIM-1,2,K)=D06666*(4.*(U(IIM-2,1,K)+U(IIM-1,1,K) & - & +U(IIM-2,3,K)) & - & +U(IIM,2,K)+U(IIM,4,K)+U(IIM-1,4,K)) - V(IIM-1,2,K)=D06666*(4.*(V(IIM-2,1,K)+V(IIM-1,1,K) & - & +V(IIM-2,3,K)) & - & +V(IIM,2,K)+V(IIM,4,K)+V(IIM-1,4,K)) - ENDIF -! -!*** NORTHWEST CORNER -! - IF(N_BDY.AND.W_BDY)THEN - U(2,JJM-1,K)=D06666*(4.*(U(1,JJM,K)+U(2,JJM,K)+U(2,JJM-2,K)) & - & +U(1,JJM-1,K)+U(1,JJM-3,K) & - & +U(2,JJM-3,K)) - V(2,JJM-1,K)=D06666*(4.*(V(1,JJM,K)+V(2,JJM,K)+V(2,JJM-2,K)) & - & +V(1,JJM-1,K)+V(1,JJM-3,K) & - & +V(2,JJM-3,K)) - ENDIF -! -!*** NORTHEAST CORNER -! - IF(N_BDY.AND.E_BDY)THEN - U(IIM-1,JJM-1,K)= & - & D06666*(4.*(U(IIM-2,JJM,K)+U(IIM-1,JJM,K)+U(IIM-2,JJM-2,K)) & - & +U(IIM,JJM-1,K)+U(IIM,JJM-3,K)+U(IIM-1,JJM-3,K)) - V(IIM-1,JJM-1,K)= & - & D06666*(4.*(V(IIM-2,JJM,K)+V(IIM-1,JJM,K)+V(IIM-2,JJM-2,K)) & - & +V(IIM,JJM-1,K)+V(IIM,JJM-3,K)+V(IIM-1,JJM-3,K)) - ENDIF -! -!----------------------------------------------------------------------- -!*** SPACE INTERPOLATION OF U AND V AT THE INNER BOUNDARY -!----------------------------------------------------------------------- -! -!*** ONE ROW NORTH OF SOUTHERN BOUNDARY -! - IF(S_BDY)THEN - DO I=MYIS2,MYIE2 - U(I,2,K)=(U(I-1,1,K)+U(I,1,K)+U(I-1,3,K)+U(I,3,K))*0.25 - V(I,2,K)=(V(I-1,1,K)+V(I,1,K)+V(I-1,3,K)+V(I,3,K))*0.25 - ENDDO - ENDIF -! -!*** ONE ROW SOUTH OF NORTHERN BOUNDARY -! - IF(N_BDY)THEN - DO I=MYIS2,MYIE2 - U(I,JJM-1,K)=(U(I-1,JJM-2,K)+U(I,JJM-2,K) & - & +U(I-1,JJM,K)+U(I,JJM,K))*0.25 - V(I,JJM-1,K)=(V(I-1,JJM-2,K)+V(I,JJM-2,K) & - & +V(I-1,JJM,K)+V(I,JJM,K))*0.25 - ENDDO - ENDIF -! -!*** ONE ROW EAST OF WESTERN BOUNDARY -! - DO J=3,JM-2,2 - IF(W_BDY)THEN - IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 & - & .AND.J<=MY_JE_GLB+JTPAD1)THEN - JJ=J - U(1,JJ,K)=(U(1,JJ-1,K)+U(2,JJ-1,K) & - & +U(1,JJ+1,K)+U(2,JJ+1,K))*0.25 - V(1,JJ,K)=(V(1,JJ-1,K)+V(2,JJ-1,K) & - & +V(1,JJ+1,K)+V(2,JJ+1,K))*0.25 - - - ENDIF - ENDIF - ENDDO -! -!*** ONE ROW WEST OF EASTERN BOUNDARY -! - IF(E_BDY)THEN - DO J=3,JM-2,2 - IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 & - & .AND.J<=MY_JE_GLB+JTPAD1)THEN - JJ=J - U(IIM-1,JJ,K)=0.25*(U(IIM-1,JJ-1,K)+U(IIM,JJ-1,K) & - & +U(IIM-1,JJ+1,K)+U(IIM,JJ+1,K)) - V(IIM-1,JJ,K)=0.25*(V(IIM-1,JJ-1,K)+V(IIM,JJ-1,K) & - & +V(IIM-1,JJ+1,K)+V(IIM,JJ+1,K)) - ENDIF - ENDDO - ENDIF -!----------------------------------------------------------------------- -! - 300 CONTINUE -! -!----------------------------------------------------------------------- -! - END SUBROUTINE BOCOV -! -!----------------------------------------------------------------------- -! - ! ------------------------------------------------------------ - ! Non-bulk boundary/tendancy function (mass points) - ! ------------------------------------------------------------ - - SUBROUTINE MP_SPECIES_BDY(gridid, spec_bdy_width, dt, & - CWM,Q, & - MOIST,N_MOIST, & - MOIST_bxs,MOIST_bxe,MOIST_bys,MOIST_bye, & - MOIST_btxs,MOIST_btxe,MOIST_btys,MOIST_btye, & - SCALAR,N_SCALAR, & - SCALAR_bxs,SCALAR_bxe,SCALAR_bys,SCALAR_bye, & - SCALAR_btxs,SCALAR_btxe,SCALAR_btys,SCALAR_btye,& - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - - implicit none - - integer, intent(in) :: N_MOIST,N_SCALAR, & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte - integer, intent(in) :: spec_bdy_width,gridid - real, intent(in) :: dt - - real, intent(inout),dimension(ims:ime,jms:jme,kms:kme) :: & - CWM,Q - - real,dimension(ims:ime,kms:kme,spec_bdy_width,n_moist), & - intent(inout) :: MOIST_bys,MOIST_bye,MOIST_btys,MOIST_btye - - real,dimension(jms:jme,kms:kme,spec_bdy_width,n_moist), & - intent(inout) :: MOIST_bxs,MOIST_bxe,MOIST_btxs,MOIST_btxe - - real,dimension(ims:ime,kms:kme,spec_bdy_width,n_scalar), & - intent(inout) :: SCALAR_bys,SCALAR_bye,SCALAR_btys,SCALAR_btye - - real,dimension(jms:jme,kms:kme,spec_bdy_width,n_scalar), & - intent(inout) :: SCALAR_bxs,SCALAR_bxe,SCALAR_btxs,SCALAR_btxe - - real,intent(inout) :: MOIST(ims:ime,jms:jme,kms:kme,N_MOIST) - real,intent(inout) :: SCALAR(ims:ime,jms:jme,kms:kme,N_SCALAR) - - ! ------------------------------------------------------------ - ! LOCAL VARIABLES - ! ------------------------------------------------------------ - - INTEGER :: I,IB,IBDY,II,IIM,IM,IRTN,ISIZ1,ISIZ2 & - & ,J,JB,JJ,JJM,JM,K,KK,N,NN,NREC,NUMGAS,NV,REC - INTEGER :: MY_IS_GLB,MY_JS_GLB,MY_IE_GLB,MY_JE_GLB - INTEGER :: I_M,ILPAD1,IRPAD1,JBPAD1,JTPAD1 - REAL :: BCHR,CONVFAC,CWK,PLYR,RRI - LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY - INTEGER :: i1,i2,j1,j2,j1b,j2b - - ! ------------------------------------------------------------ - - IM=IDE-IDS+1 - JM=JDE-JDS+1 - IIM=IM - JJM=JM -! - W_BDY=(ITS==IDS) - E_BDY=(ITE==IDE) - S_BDY=(JTS==JDS) - N_BDY=(JTE==JDE) -! - ILPAD1=1 - IF(W_BDY)ILPAD1=0 - IRPAD1=1 - IF(E_BDY)IRPAD1=0 - JBPAD1=1 - IF(S_BDY)JBPAD1=0 - JTPAD1=1 - IF(N_BDY)JTPAD1=0 -! - MY_IS_GLB=ITS - MY_IE_GLB=ITE - MY_JS_GLB=JTS - MY_JE_GLB=JTE - - ! I loop ends for N/S bdy copying: - i1=MAX(ITS-1,IDS) - i2=MIN(ITE+1,IDE) - - ! J loop ends for E/W bdy copying: - j1=MAX(JTS-1,JDS+3-1) - if(mod(j1,2)/=1) j1=j1+1 - j2=MIN(JTE+1,JDE-2) - if(mod(j2,2)/=1) j2=j2-1 - - ! J loop ends for E/W bdy 4-point averaging: - J1B=MAX(4,MY_JS_GLB-JBPAD1) - IF(MOD(J1B,2)/=0) J1B=J1B+1 - J2B=MIN(JM-3,MY_JE_GLB+JTPAD1) - IF(MOD(J2B,2)/=0) J2B=J2B-1 - - - ! - !----------------------------------------------------------------------- - !*** SOUTH AND NORTH BOUNDARIES - !----------------------------------------------------------------------- - ! - !*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH - ! - n_s_bdy: DO IBDY=1,2 - ! - !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. - ! - if_n_s_bdy: IF(S_BDY.AND.IBDY==1) THEN - JB=1 ! Which cell in from boundary - JJ=1 ! Which cell in the domain - !$omp parallel do & - !$omp& private(i,k) - DO K=KTS,KTE - DO I=i1,i2 - cwm(i,jj,k)=0. - END DO - END DO - !$omp parallel do & - !$omp& private(i,k,im) - sbdy_type: DO IM=1,N_MOIST - if(IM==P_QV) cycle sbdy_type - DO K=KTS,KTE - DO I=i1,i2 - MOIST_BYS(I,K,JB,IM)=MOIST_BYS(I,K,JB,IM)+MOIST_BTYS(I,K,JB,IM)*DT - MOIST(I,JJ,K,IM)=MOIST_BYS(I,K,JB,IM) - CWM(I,JJ,K)=CWM(I,JJ,K) + MOIST(I,JJ,K,IM) - ENDDO - ENDDO - ENDDO sbdy_type - !$omp parallel do & - !$omp& private(i,k,im) - sbdy_Stype: DO IM=2,N_SCALAR - DO K=KTS,KTE - DO I=i1,i2 - SCALAR_BYS(I,K,JB,IM)=SCALAR_BYS(I,K,JB,IM)+SCALAR_BTYS(I,K,JB,IM)*DT - SCALAR(I,JJ,K,IM)=SCALAR_BYS(I,K,JB,IM) - ENDDO - ENDDO - ENDDO sbdy_Stype - - ELSEIF(N_BDY.AND.IBDY==2) THEN - JB=1 ! Which cell in from boundary - JJ=JJM ! Which cell in the domain - - !$omp parallel do & - !$omp& private(i,k) - DO K=KTS,KTE - DO I=i1,i2 - CWM(i,jj,k)=0. - END DO - END DO - !$omp parallel do & - !$omp& private(i,k) - nbdy_type: DO IM=1,N_MOIST - if(IM==P_QV) cycle nbdy_type - DO K=KTS,KTE - DO I=i1,i2 - MOIST_BYE(I,K,JB,IM)=MOIST_BYE(I,K,JB,IM)+MOIST_BTYE(I,K,JB,IM)*DT - MOIST(I,JJ,K,IM)=MOIST_BYE(I,K,JB,IM) - CWM(I,JJ,K)=CWM(I,JJ,K) + MOIST(I,JJ,K,IM) - ENDDO - ENDDO - ENDDO nbdy_type - !$omp parallel do & - !$omp& private(i,k) - nbdy_Stype: DO IM=1,N_SCALAR - DO K=KTS,KTE - DO I=i1,i2 - SCALAR_BYE(I,K,JB,IM)=SCALAR_BYE(I,K,JB,IM)+SCALAR_BTYE(I,K,JB,IM)*DT - SCALAR(I,JJ,K,IM)=SCALAR_BYE(I,K,JB,IM) - ENDDO - ENDDO - ENDDO nbdy_Stype - ENDIF if_n_s_bdy - ENDDO n_s_bdy -! -!----------------------------------------------------------------------- -!*** WEST AND EAST BOUNDARIES -!----------------------------------------------------------------------- -! -!*** USE IBDY=1 FOR WEST; 2 FOR EAST. -! - east_west_bt: DO IBDY=1,2 -! -!*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. -! - if_e_w_bt: IF(W_BDY.AND.IBDY==1) THEN - IB=1 ! Which cell in from boundary - II=1 ! Which cell in the domain -!$omp parallel do & -!$omp& private(j,k) - DO K=KTS,KTE - DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) - cwm(ii,j,k)=0. - ENDDO - ENDDO -!$omp parallel do & -!$omp& private(j,k,im) - w_bdy_type: DO IM=1,N_MOIST - if(IM==P_QV) cycle w_bdy_type - DO K=KTS,KTE - DO J=j1,j2,2 - MOIST_BXS(J,K,IB,IM)=MOIST_BXS(J,K,IB,IM)+MOIST_BTXS(J,K,IB,IM)*DT - MOIST(II,J,K,IM)=MOIST_BXS(J,K,IB,IM) - CWM(II,J,K)=CWM(II,J,K)+MOIST(II,J,K,IM) - ENDDO - ENDDO - ENDDO w_bdy_type -!$omp parallel do & -!$omp& private(j,k,im) - w_bdy_Stype: DO IM=2,N_SCALAR - DO K=KTS,KTE - DO J=j1,j2,2 - SCALAR_BXS(J,K,IB,IM)=SCALAR_BXS(J,K,IB,IM)+SCALAR_BTXS(J,K,IB,IM)*DT - SCALAR(II,J,K,IM)=SCALAR_BXS(J,K,IB,IM) - ENDDO - ENDDO - ENDDO w_bdy_Stype - ELSEIF(E_BDY.AND.IBDY==2) THEN - IB=1 ! Which cell in from boundary - II=IIM ! Which cell in the domain -!$omp parallel do & -!$omp& private(j,k) - DO K=KTS,KTE - DO J=j1,j2 - CWM(II,J,K)=0. - ENDDO - ENDDO -!$omp parallel do & -!$omp& private(j,k,im) - e_bdy_type: DO IM=1,N_MOIST - if(IM==P_QV) cycle e_bdy_type - DO K=KTS,KTE - DO J=j1,j2 - MOIST_BXE(J,K,IB,IM)=MOIST_BXE(J,K,IB,IM)+MOIST_BTXE(J,K,IB,IM)*DT - MOIST(II,J,K,IM)=MOIST_BXE(J,K,IB,IM) - CWM(II,J,K)=CWM(II,J,K)+MOIST(II,J,K,IM) - ENDDO - ENDDO - ENDDO e_bdy_type -!$omp parallel do & -!$omp& private(j,k,im) - e_bdy_Stype: DO IM=2,N_SCALAR - DO K=KTS,KTE - DO J=j1,j2 - SCALAR_BXE(J,K,IB,IM)=SCALAR_BXE(J,K,IB,IM)+SCALAR_BTXE(J,K,IB,IM)*DT - SCALAR(II,J,K,IM)=SCALAR_BXE(J,K,IB,IM) - ENDDO - ENDDO - ENDDO e_bdy_Stype - ENDIF if_e_w_bt - ENDDO east_west_bt - - -!----------------------------------------------------------------------- -!*** SPACE INTERPOLATION OF MICROPHYSICS VARIABLES -!*** AT INNER BOUNDARY -!----------------------------------------------------------------------- - - -! -!----------------------------------------------------------------------- -! -!*** ONE ROW NORTH OF SOUTHERN BOUNDARY -! - s_bdy_avg: IF(S_BDY)THEN - DO K=KTS,KTE - DO I=MYIS,MYIE1 - CWM(I,2,K)=(CWM(I,1,K)+CWM(I+1,1,K)+CWM(I,3,K)+CWM(I+1,3,K)) & - & *0.25 - ENDDO - ENDDO -! - DO I_M=1,N_MOIST - IF(I_M==P_QV)THEN - DO K=KTS,KTE - DO I=MYIS,MYIE1 - MOIST(I,2,K,I_M)=Q(I,2,K)/(1.-Q(I,2,K)) - ENDDO - ENDDO - ELSE - DO K=KTS,KTE - DO I=MYIS,MYIE1 - MOIST(I,2,K,I_M)=(MOIST(I,1,K,I_M) & - & +MOIST(I+1,1,K,I_M) & - & +MOIST(I,3,K,I_M) & - & +MOIST(I+1,3,K,I_M))*0.25 - ENDDO - ENDDO - ENDIF - ENDDO -! - DO I_M=2,N_SCALAR - DO K=KTS,KTE - DO I=MYIS,MYIE1 - SCALAR(I,2,K,I_M)=(SCALAR(I,1,K,I_M) & - & +SCALAR(I+1,1,K,I_M) & - & +SCALAR(I,3,K,I_M) & - & +SCALAR(I+1,3,K,I_M))*0.25 - ENDDO - ENDDO - ENDDO -! - ENDIF s_bdy_avg -! -!*** ONE ROW SOUTH OF NORTHERN BOUNDARY -! - n_bdy_avg: IF(N_BDY)THEN - DO K=KTS,KTE - DO I=MYIS,MYIE1 - CWM(I,JJM-1,K)=(CWM(I,JJM-2,K)+CWM(I+1,JJM-2,K) & - & +CWM(I,JJM,K)+CWM(I+1,JJM,K)) & - & *0.25 - ENDDO - ENDDO -! - DO I_M=1,N_MOIST - IF(I_M==P_QV)THEN - DO K=KTS,KTE - DO I=MYIS,MYIE1 - MOIST(I,JJM-1,K,I_M)=Q(I,JJM-1,K)/(1.-Q(I,JJM-1,K)) - ENDDO - ENDDO - ELSE - DO K=KTS,KTE - DO I=MYIS,MYIE1 - MOIST(I,JJM-1,K,I_M)=(MOIST(I,JJM-2,K,I_M) & - & +MOIST(I+1,JJM-2,K,I_M) & - & +MOIST(I,JJM,K,I_M) & - & +MOIST(I+1,JJM,K,I_M))*0.25 - ENDDO - ENDDO - ENDIF - ENDDO -! - DO I_M=2,N_SCALAR - DO K=KTS,KTE - DO I=MYIS,MYIE1 - SCALAR(I,JJM-1,K,I_M)=(SCALAR(I,JJM-2,K,I_M) & - & +SCALAR(I+1,JJM-2,K,I_M) & - & +SCALAR(I,JJM,K,I_M) & - & +SCALAR(I+1,JJM,K,I_M))*0.25 - ENDDO - ENDDO - ENDDO -! - ENDIF n_bdy_avg -! -!*** ONE ROW EAST OF WESTERN BOUNDARY -! - w_bdy_avg:IF(W_BDY)THEN - DO K=KTS,KTE - DO J=J1B,J2B - CWM(1,J,K)=(CWM(1,J-1,K)+CWM(2,J-1,K) & - +CWM(1,J+1,K)+CWM(2,J+1,K)) & - *0.25 - ENDDO - ENDDO - DO I_M=1,N_MOIST - IF(I_M==P_QV)THEN - DO K=KTS,KTE - DO J=J1B,J2B - MOIST(1,J,K,I_M)=Q(1,J,K)/(1.-Q(1,J,K)) - ENDDO - ENDDO - ELSE - DO K=KTS,KTE - DO J=J1B,J2B - MOIST(1,J,K,I_M)=(MOIST(1,J-1,K,I_M) & - +MOIST(2,J-1,K,I_M) & - +MOIST(1,J+1,K,I_M) & - +MOIST(2,J+1,K,I_M))*0.25 - ENDDO - ENDDO - ENDIF - ENDDO - DO I_M=2,N_SCALAR - DO K=KTS,KTE - DO J=J1B,J2B - SCALAR(1,J,K,I_M)=(SCALAR(1,J-1,K,I_M) & - & +SCALAR(2,J-1,K,I_M) & - & +SCALAR(1,J+1,K,I_M) & - & +SCALAR(2,J+1,K,I_M))*0.25 - ENDDO - ENDDO - ENDDO - ENDIF w_bdy_avg -! -!*** ONE ROW WEST OF EASTERN BOUNDARY -! - e_bdy_avg:IF(E_BDY)THEN - DO K=KTS,KTE - DO J=J1B,J2B - CWM(IIM-1,J,K)=(CWM(IIM-1,J-1,K)+CWM(IIM,J-1,K) & - +CWM(IIM-1,J+1,K)+CWM(IIM,J+1,K)) & - *0.25 - ENDDO - ENDDO - DO I_M=1,N_MOIST - IF(I_M==P_QV)THEN - DO K=KTS,KTE - DO J=J1B,J2B - MOIST(IIM-1,J,K,I_M)=Q(IIM-1,J,K)/(1.-Q(IIM-1,J,K)) - ENDDO - ENDDO - ELSE - DO K=KTS,KTE - DO J=J1B,J2B - MOIST(IIM-1,J,K,I_M)=(MOIST(IIM-1,J-1,K,I_M) & - +MOIST(IIM,J-1,K,I_M) & - +MOIST(IIM-1,J+1,K,I_M) & - +MOIST(IIM,J+1,K,I_M))*0.25 - ENDDO - ENDDO - ENDIF - ENDDO - DO I_M=2,N_SCALAR - DO K=KTS,KTE - DO J=J1B,J2B - SCALAR(IIM-1,J,K,I_M)=(SCALAR(IIM-1,J-1,K,I_M) & - +SCALAR(IIM,J-1,K,I_M) & - +SCALAR(IIM-1,J+1,K,I_M) & - +SCALAR(IIM,J+1,K,I_M))*0.25 - ENDDO - ENDDO - ENDDO - ENDIF e_bdy_avg - - END SUBROUTINE MP_SPECIES_BDY -! -!----------------------------------------------------------------------- -! - END MODULE MODULE_BNDRY_COND -! -!----------------------------------------------------------------------- diff --git a/dyn_nmm/module_CLDWTR.F b/dyn_nmm/module_CLDWTR.F deleted file mode 100644 index 3206f4cb9c..0000000000 --- a/dyn_nmm/module_CLDWTR.F +++ /dev/null @@ -1,18 +0,0 @@ -! - MODULE MODULE_CLDWTR -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- -! -!*** GRID-SCALE CLOUD WATER -! -!jm REAL,ALLOCATABLE,DIMENSION(:,:,:) :: CWM,F_ICE,F_RAIN,F_RIMEF -! -!jm REAL,ALLOCATABLE,DIMENSION(:,:) :: SR,U00 -!jm REAL,ALLOCATABLE,DIMENSION(:,:) :: CFRACH,CFRACL,CFRACM,CUPPT -! -!jm INTEGER,ALLOCATABLE,DIMENSION(:,:) :: LC -!jm INTEGER,ALLOCATABLE,DIMENSION(:) :: UL -! - LOGICAL MICRO_START -!---------------------------------------------------------------------- - END MODULE MODULE_CLDWTR diff --git a/dyn_nmm/module_CTLBLK.F b/dyn_nmm/module_CTLBLK.F deleted file mode 100644 index 2c44316b45..0000000000 --- a/dyn_nmm/module_CTLBLK.F +++ /dev/null @@ -1,40 +0,0 @@ -! - MODULE MODULE_CTLBLK -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- -! -!*** FUNDAMENTAL DOMAIN VARIABLES -! - INTEGER :: IM,JM,LM - INTEGER :: NROOT -!---------------------------------------------------------------------- -! -!*** SET SOME CONSTANTS -! - INTEGER :: LIST=6 ! STANDARD OUT UNIT NUMBER - INTEGER,PARAMETER :: LSM=39 ! NUMBER OF OUTPUT PRESSURE LEVELS -!---------------------------------------------------------------------- -! -!*** SINGLE GLOBAL OR MULTIPLE LOCAL RESTART FILES -! - LOGICAL :: SINGLRST -!---------------------------------------------------------------------- -! -!*** VARIOUS CONTROL VARIABLES -! - LOGICAL :: RUN,FIRST,RESTRT,NEST -! -!JW REAL :: DT,TLM0D,TPH0D,TSPH - REAL :: TLM0D,TPH0D,TSPH -! - INTEGER :: IHRST,NFCST,NUNIT_NBC,IOUT & - ,NTSTM,NSTART,NTDDMP,NBOCO,NSHDE -! ,NTSD,NTSTM,NSTART,NTDDMP,NPREC,NBOCO,NSHDE -! - INTEGER,DIMENSION(3) :: IDAT -! - INTEGER,DIMENSION(99) :: ISHDE -! - REAL,DIMENSION(LSM) :: SPL -!---------------------------------------------------------------------- - END MODULE MODULE_CTLBLK diff --git a/dyn_nmm/module_DIFFUSION_NMM.F b/dyn_nmm/module_DIFFUSION_NMM.F deleted file mode 100644 index 14904f6856..0000000000 --- a/dyn_nmm/module_DIFFUSION_NMM.F +++ /dev/null @@ -1,484 +0,0 @@ -!----------------------------------------------------------------------- -! -!NCEP_MESO:MODEL_LAYER: HORIZONTAL DIFFUSION -! -!----------------------------------------------------------------------- -! -#include "nmm_loop_basemacros.h" -#include "nmm_loop_macros.h" -! -!----------------------------------------------------------------------- -! - MODULE MODULE_DIFFUSION_NMM -! -!----------------------------------------------------------------------- - USE MODULE_MODEL_CONSTANTS - USE MODULE_CONFIGURE, ONLY : GRID_CONFIG_REC_TYPE - USE MODULE_STATE_DESCRIPTION -!----------------------------------------------------------------------- -! - LOGICAL :: SECOND=.TRUE. - INTEGER :: KSMUD=1 -! -!----------------------------------------------------------------------- -! - CONTAINS -! -!*********************************************************************** - SUBROUTINE HDIFF(NTSD,DT,FIS,DY,HDAC,HDACV & - & ,HBM2,DETA1,SIGMA & -#if ( HWRF == 1 ) - & ,T,Q,U,V,Q2,Z,W,SM,SICE,h_diff & -#else - & ,T,Q,U,V,Q2,Z,W,SM,SICE & -#endif - & ,DEF3D & - & ,IHE,IHW,IVE,IVW & - & ,CONFIG_FLAGS & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: HDIFF HORIZONTAL DIFFUSION -! PRGRMMR: JANJIC ORG: W/NP22 DATE: 93-11-17 -! -! ABSTRACT: -! HDIFF CALCULATES THE CONTRIBUTION OF THE HORIZONTAL DIFFUSION -! TO THE TENDENCIES OF TEMPERATURE, SPECIFIC HUMIDITY, WIND -! COMPONENTS, AND TURBULENT KINETIC ENERGY AND THEN UPDATES THOSE -! VARIABLES. A SECOND-ORDER NONLINEAR SCHEME SIMILAR TO -! SMAGORINSKY'S IS USED WHERE THE DIFFUSION COEFFICIENT IS -! A FUNCTION OF THE DEFORMATION FIELD AND OF THE TURBULENT -! KINETIC ENERGY. -! -! PROGRAM HISTORY LOG: -! 87-06-?? JANJIC - ORIGINATOR -! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL -! 96-03-28 BLACK - ADDED EXTERNAL EDGE -! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY -! 02-02-07 BLACK - CONVERTED TO WRF STRUCTURE -! 02-08-29 MICHALAKES - -! 02-09-06 WOLFE - -! 03-05-27 JANJIC - ADDED SLOPE ADJUSTMENT -! 04-11-18 BLACK - THREADED -! 05-12-12 BLACK - CONVERTED FROM IKJ TO IJK -! 06-08-15 JANJIC - ENHANCEMENT AT SLOPING SEA COAST -! -! USAGE: CALL HDIFF FROM SUBROUTINE SOLVE_RUNSTREAM -! -! INPUT ARGUMENT LIST: -! -! OUTPUT ARGUMENT LIST: -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!*********************************************************************** -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! -!*** STRUCTURE THAT CONTAINS RUN-TIME CONFIGURATION (NAMELIST) DATA FOR DOMAIN -! - TYPE(GRID_CONFIG_REC_TYPE),INTENT(IN) :: CONFIG_FLAGS -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,INTENT(IN) :: NTSD -! - REAL,INTENT(IN) :: DT,DY -#if ( HWRF == 1 ) - REAL,INTENT(IN) :: H_DIFF -#endif -! - REAL,DIMENSION(KMS:KME),INTENT(IN) :: DETA1 -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: FIS,HBM2 & - & ,HDAC,HDACV & - & ,SM,SICE -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(OUT) :: DEF3D -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: W,Z -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: T,Q,Q2 & - & ,U,V -! - INTEGER, DIMENSION(JMS:JME), INTENT(IN) :: IHE,IHW,IVE,IVW -! -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: SIGMA -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - INTEGER :: I,J,K,KS -! - REAL :: DEF_IJ,DEFSK,DEFTK,HKNE_IJ,HKSE_IJ,Q2L,RDY,SLOP,SLOPHC & - & ,UTK,VKNE_IJ,VKSE_IJ,VTK,DEF1,DEF2,DEF3,DEF4 -! - REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: DEF,HKNE,HKSE & - & ,Q2DIF,Q2NE,Q2SE & - & ,QDIF,QNE,QSE,SNE,SSE & - & ,TDIF,TNE,TSE & - & ,UDIF,UNE,USE & - & ,VDIF,VKNE,VKSE,VNE,VSE -! - LOGICAL :: CILINE,WATSLOP -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! -#if ( HWRF == 1 ) - SLOPHC=SLOPHT*SQRT(2.)*0.5*9. -#else - SLOPHC=config_flags%slophc -#endif - RDY=1./DY -! - DO J=JTS-5,JTE+5 - DO I=ITS-5,ITE+5 - DEF(I,J)=0. - TNE(I,J)=0. - QNE(I,J)=0. - Q2NE(I,J)=0. - HKNE(I,J)=0. - UNE(I,J)=0. - VNE(I,J)=0. - VKNE(I,J)=0. - TSE(I,J)=0. - QSE(I,J)=0. - Q2SE(I,J)=0. - HKSE(I,J)=0. - USE(I,J)=0. - VSE(I,J)=0. - VKSE(I,J)=0. - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** -!*** DIFFUSING Q2 AT GROUND LEVEL DOES NOT MATTER -!*** BECAUSE USTAR2 IS RECALCULATED. -!*** -!----------------------------------------------------------------------- -!*** ITERATION LOOP -!----------------------------------------------------------------------- -! - DO 600 KS=1,KSMUD -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!*** MAIN INTEGRATION LOOP -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(def1,def2,def3,def4,def_ij,defsk,deftk,hkne_ij,hkse_ij & -!$omp& ,i,j,k,q2dif,q2ne,q2se,qdif,qne,qse,slop,sne,sse & -!$omp& ,tdif,tne,tse,udif,une,use,vdif,vkne,vkne_ij & -!$omp& ,vkse,vkse_ij,vne,vse) -!----------------------------------------------------------------------- -! - main_integration : DO K=KTS,KTE - - DO J=JMS,JME - DO I=IMS,IME - DEF3D(I,J,K)=0. - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** SLOPE SWITCHES FOR MOISTURE -!----------------------------------------------------------------------- -! - IF(SIGMA==1)THEN -! -!----------------------------------------------------------------------- -!*** PRESSURE DOMAIN -!----------------------------------------------------------------------- -! - IF(DETA1(K)>0.)THEN - DO J=MYJS_P1,MYJE1_P2 - DO I=MYIS_P1,MYIE1_P1 - SNE(I,J)=1. - ENDDO - ENDDO -! - DO J=MYJS1_P1,MYJE_P2 - DO I=MYIS_P1,MYIE1_P1 - SSE(I,J)=1. - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** SIGMA DOMAIN -!----------------------------------------------------------------------- -! - ELSE - DO J=MYJS_P1,MYJE1_P1 - DO I=MYIS_P1,MYIE1_P1 - SLOP=ABS((Z(I+IHE(J),J+1,K)-Z(I,J,K))*RDY) -! - CILINE=((SM(I+IHE(J),J+1)/=SM(I,J)).OR. & - (SICE(I+IHE(J),J+1)/=SICE(I,J))) -! - WATSLOP=(SM(I+IHE(J),J+1)==1.0.AND. & - SM(I,J)==1.0.AND.SLOP/=0.) -! - IF(SLOP=KTS+1)THEN - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - Q2(I,J,K)=Q2(I,J,K)+Q2DIF(I,J) - ENDDO - ENDDO - ENDIF -! -!----------------------------------------------------------------------- -!*** 4TH ORDER DIAGONAL CONTRIBUTIONS -!----------------------------------------------------------------------- -! - ELSE -! - DO J=MYJS,MYJE1 - DO I=MYIS,MYIE1 - HKNE_IJ=HKNE(I,J) - TNE (I,J)=(TDIF (I+IHE(J),J+1)-TDIF (I,J))*HKNE_IJ - QNE (I,J)=(QDIF (I+IHE(J),J+1)-QDIF (I,J))*HKNE_IJ - Q2NE(I,J)=(Q2DIF(I+IHE(J),J+1)-Q2DIF(I,J))*HKNE_IJ - ENDDO - ENDDO -! - DO J=MYJS1,MYJE - DO I=MYIS,MYIE1 - HKSE_IJ=HKSE(I,J) - TSE (I,J)=(TDIF (I+IHE(J),J-1)-TDIF (I,J))*HKSE_IJ - QSE (I,J)=(QDIF (I+IHE(J),J-1)-QDIF (I,J))*HKSE_IJ - Q2SE(I,J)=(Q2DIF(I+IHE(J),J-1)-Q2DIF(I,J))*HKSE_IJ - ENDDO - ENDDO -! - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - T(I,J,K)=T(I,J,K)-(TNE(I,J)-TNE(I+IHW(J),J-1) & - & +TSE(I,J)-TSE(I+IHW(J),J+1))*HDAC(I,J) - Q(I,J,K)=Q(I,J,K)-(QNE(I,J)-QNE(I+IHW(J),J-1) & - & +QSE(I,J)-QSE(I+IHW(J),J+1))*HDAC(I,J) & - & *FCDIF - ENDDO - ENDDO - -! - IF(K>=KTS+1)THEN - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - Q2(I,J,K)=Q2(I,J,K)-(Q2NE(I,J)-Q2NE(I+IHW(J),J-1) & - & +Q2SE(I,J)-Q2SE(I+IHW(J),J+1)) & - & *HDAC(I,J) - ENDDO - ENDDO - ENDIF -! -!----------------------------------------------------------------------- -! - DO J=MYJS,MYJE1 - DO I=MYIS,MYIE1 - UNE(I,J)=(UDIF(I+IVE(J),J+1)-UDIF(I,J))*VKNE(I,J) - VNE(I,J)=(VDIF(I+IVE(J),J+1)-VDIF(I,J))*VKNE(I,J) - ENDDO - ENDDO -! - DO J=MYJS1,MYJE - DO I=MYIS,MYIE1 - USE(I,J)=(UDIF(I+IVE(J),J-1)-UDIF(I,J))*VKSE(I,J) - VSE(I,J)=(VDIF(I+IVE(J),J-1)-VDIF(I,J))*VKSE(I,J) - ENDDO - ENDDO -! - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 -#if ( HWRF == 1 ) - U(I,J,K)=U(I,J,K)-(UNE(I,J)-UNE(I+IVW(J),J-1) & - & +USE(I,J)-USE(I+IVW(J),J+1))*HDACV(I,J)*h_diff - V(I,J,K)=V(I,J,K)-(VNE(I,J)-VNE(I+IVW(J),J-1) & - & +VSE(I,J)-VSE(I+IVW(J),J+1))*HDACV(I,J)*h_diff -#else - U(I,J,K)=U(I,J,K)-(UNE(I,J)-UNE(I+IVW(J),J-1) & - & +USE(I,J)-USE(I+IVW(J),J+1))*HDACV(I,J) - V(I,J,K)=V(I,J,K)-(VNE(I,J)-VNE(I+IVW(J),J-1) & - & +VSE(I,J)-VSE(I+IVW(J),J+1))*HDACV(I,J) -#endif - ENDDO - ENDDO -! -!----------------------------------------------------------------------- - ENDIF ! End 4th order diffusion -!----------------------------------------------------------------------- -! - ENDDO main_integration -! -!----------------------------------------------------------------------- -! - 600 CONTINUE -! -!----------------------------------------------------------------------- -! - END SUBROUTINE HDIFF -! -!----------------------------------------------------------------------- -! - END MODULE MODULE_DIFFUSION_NMM -! -!----------------------------------------------------------------------- diff --git a/dyn_nmm/module_GWD.F b/dyn_nmm/module_GWD.F deleted file mode 100644 index cecd3a47ce..0000000000 --- a/dyn_nmm/module_GWD.F +++ /dev/null @@ -1,1824 +0,0 @@ -! -!-- Module for Gravity Wave Drag (GWD) and Mountain Blocking (MB) -! -!-- Initially incorporated into the WRF NMM from the GFS by B. Ferrier -! in April/May 2007. -! -! Search for "ORIGINAL DOCUMENTATION BLOCK" for further description. -! -!####################################################################### -! - MODULE module_gwd -! -! USE MODULE_DM ! to get processor element - USE MODULE_EXT_INTERNAL ! to assign fortan unit number -! -!-- Contains subroutines GWD_init, GWD_driver, and GWD_col -! -!####################################################################### -! - INTEGER, PARAMETER :: KIND_PHYS=SELECTED_REAL_KIND(13,60) ! the '60' maps to 64-bit real - INTEGER,PRIVATE,SAVE :: IMX, NMTVR, IDBG, JDBG - REAL,PRIVATE,SAVE :: RAD_TO_DEG !-- Convert radians to degrees - REAL,PRIVATE,SAVE :: DEG_TO_RAD !-- Convert degrees to radians - REAL (KIND=KIND_PHYS),PRIVATE,SAVE :: DELTIM,RDELTIM - REAL(kind=kind_phys),PRIVATE,PARAMETER :: SIGFAC=0.0 !-- Key tunable parameter -!dbg real,private,save :: dumin,dumax,dvmin,dvmax !dbg -! - CONTAINS -! -!-- Initialize variables used in GWD + MB -! - SUBROUTINE GWD_init (DTPHS,DELX,DELY,CEN_LAT,CEN_LON,RESTRT & - & ,GLAT,GLON,CROT,SROT,HANGL & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE ) - -! - IMPLICIT NONE -! -!== INPUT: -!-- DELX, DELY - DX, DY grid resolutions in zonal, meridional directions (m) -!-- CEN_LAT, CEN_LON - central latitude, longitude (degrees) -!-- RESTRT - logical flag for restart file (true) or WRF input file (false) -!-- GLAT, GLON - central latitude, longitude at mass points (radians) -!-- CROT, SROT - cosine and sine of the angle between Earth and model coordinates -!-- HANGL - angle of the mountain range w/r/t east (convert to degrees) -! -!-- Saved variables within module: -!-- IMX - in the GFS it is an equivalent number of points along a latitude -! circle (e.g., IMX=3600 for a model resolution of 0.1 deg) -! => Calculated at start of model integration in GWD_init -!-- NMTVR - number of input 2D orographic fields -!-- GRAV = gravitational acceleration -!-- DELTIM - physics time step (s) -!-- RDELTIM - reciprocal of physics time step (s) -! -!== INPUT indices: -!-- ids start index for i in domain -!-- ide end index for i in domain -!-- jds start index for j in domain -!-- jde end index for j in domain -!-- kds start index for k in domain -!-- kde end index for k in domain -!-- ims start index for i in memory -!-- ime end index for i in memory -!-- jms start index for j in memory -!-- jme end index for j in memory -!-- kms start index for k in memory -!-- kme end index for k in memory -!-- its start index for i in tile -!-- ite end index for i in tile -!-- jts start index for j in tile -!-- jte end index for j in tile -!-- kts start index for k in tile -!-- kte end index for k in tile -! - REAL, INTENT(IN) :: DTPHS,DELX,DELY,CEN_LAT,CEN_LON - LOGICAL, INTENT(IN) :: RESTRT - REAL, INTENT(IN), DIMENSION (ims:ime,jms:jme) :: GLON,GLAT - REAL, INTENT(OUT), DIMENSION (ims:ime,jms:jme) :: CROT,SROT - REAL, INTENT(INOUT), DIMENSION (ims:ime,jms:jme) :: HANGL - INTEGER, INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE -! -!-- Local variables: -! - REAL, PARAMETER :: POS1=1.,NEG1=-1. - REAL :: DX,DTR,LAT0,LoN0,CLAT0,SLAT0,CLAT,DLON,X,Y,TLON,ROT - INTEGER :: I,J - -!dbg -!dbg real :: xdbg,ydbg,d_x,d_y,dist,dist_min -!dbg data xdbg,ydbg / -118.3,36 / ! 118.3W 36 N - -! -!----------------------------------------------------------------------- -! - DX=SQRT((DELX)**2+(DELY)**2) !-- Model resolution in degrees -!-- IMX is the number of grid points along a latitude circle in the GFS - IMX=INT(360./DX+.5) - -!dbg IMX=1152 !dbg -- Match the grid point printed from GFS run - - NMTVR=14 !-- 14 input fields for orography - DELTIM=DTPHS - RDELTIM=1./DTPHS -! -!-- Calculate angle of rotation (ROT) between Earth and model coordinates, -! but pass back out cosine (CROT) and sine (SROT) of this angle -! - DTR=ACOS(-1.)/180. !-- convert from degrees to radians - DEG_TO_RAD=DTR !-- save conversion from degrees to radians -! - LAT0=DTR*CEN_LON !-- central latitude of grid in radians - LoN0=DTR*CEN_LAT !-- central longitude of grid in radians -! - DTR=1./DTR !-- convert from radians to degrees - RAD_TO_DEG=DTR !-- save conversion from radians to degrees -! - CLAT0=COS(LAT0) - SLAT0=SIN(LAT0) - DO J=JTS,JTE - DO I=ITS,ITE - CLAT=COS(GLAT(I,J)) - DLON=GLON(I,J)-LoN0 - X=CLAT0*CLAT*COS(DLON)+SLAT0*SIN(GLAT(I,J)) - Y=-CLAT*SIN(DLON) - TLON=ATAN(Y/X) !-- model longitude - X=SLAT0*SIN(TLON)/CLAT - Y=MIN(POS1, MAX(NEG1, X) ) - ROT=ASIN(Y) !-- angle between geodetic & model coordinates - CROT(I,J)=COS(ROT) - SROT(I,J)=SIN(ROT) - ENDDO !-- I - ENDDO !-- J - IF (.NOT.RESTRT) THEN -!-- Convert from radians to degrees for WRF input files only. -! There should have ano further conversion from rad to degree at this -! point since HANGL read from wrfinput_d01 already in degree even in -! the non restart mode... Chanh -! -! DO J=JTS,JTE -! DO I=ITS,ITE -! HANGL(I,J)=DTR*HANGL(I,J) !-- convert to degrees (+/-90 deg) -! ENDDO !-- I -! ENDDO !-- J - ENDIF -!dbg -!dbg dumin=-1. -!dbg dumax=1. -!dbg dvmin=-1. -!dbg dvmax=1. -!dbg print *,'delx=',delx,' dely=',dely,' dx=',dx,' imx=',imx -!dbg dtr=1./dtr !-- convert from degrees back to radians -!dbg dist_min=dtr*DX !-- grid length in radians -!dbg xdbg=dtr*xdbg !-- convert xdbg to radians -!dbg ydbg=dtr*ydbg !-- convert ydbg to radians -!dbg idbg=-100 -!dbg jdbg=-100 -!dbg print *,'dtr,dx,dist_min,xdbg,ydbg=',dtr,dx,dist_min,xdbg,ydbg -!dbg do j=jts,jte -!dbg do i=its,ite -!dbg !-- Find i,j for xdbg, ydbg -!dbg d_x=cos(glat(i,j))*(glon(i,j)-xdbg) -!dbg d_y=(glat(i,j)-ydbg) -!dbg dist=sqrt(d_x*d_x+d_y*d_y) -!dbg !! print *,'i,j,glon,glat,d_x,d_y,dist=',i,j,glon(i,j),glat(i,j),d_x,d_y,dist -!dbg if (dist < dist_min) then -!dbg dist_min=dist -!dbg idbg=i -!dbg jdbg=j -!dbg print *,'dist_min,idbg,jdbg=',dist_min,idbg,jdbg -!dbg endif -!dbg enddo !-- I -!dbg enddo !-- J -!dbg if (idbg>0 .and. jdbg>0) print *,'idbg=',idbg,' jdbg=',jdbg - -! - END SUBROUTINE GWD_init -! -!----------------------------------------------------------------------- -! - SUBROUTINE GWD_driver(U,V,T,Q,Z,DP,PINT,PMID,EXNR, KPBL, ITIME & - & ,HSTDV,HCNVX,HASYW,HASYS,HASYSW,HASYNW & - & ,HLENW,HLENS,HLENSW,HLENNW & - & ,HANGL,HANIS,HSLOP,HZMAX,CROT,SROT & - & ,DUDT,DVDT,UGWDsfc,VGWDsfc,XLAND & !ADDED XLAND FOR SKIPPING OCEAN POINTS(KWON) - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE ) -! -!== INPUT: -!-- U, V - zonal (U), meridional (V) winds at mass points (m/s) -!-- T, Q - temperature (C), specific humidity (kg/kg) -!-- DP - pressure thickness (Pa) -!-- Z - geopotential height (m) -!-- PINT, PMID - interface and midlayer pressures, respectively (Pa) -!-- EXNR - (p/p0)**(Rd/Cp) -!-- KPBL - vertical index at PBL top -!-- ITIME - model time step (=NTSD) -!-- HSTDV - orographic standard deviation -!-- HCNVX - normalized 4th moment of the orographic convexity -!-- Template for the next two sets of 4 arrays: -! NWD 1 2 3 4 5 6 7 8 -! WD W S SW NW E N NE SE -!-- Orographic asymmetry (HASYx, x=1-4) for upstream & downstream flow (4 planes) -!-- * HASYW - orographic asymmetry for upstream & downstream flow in W-E plane -!-- * HASYS - orographic asymmetry for upstream & downstream flow in S-N plane -!-- * HASYSW - orographic asymmetry for upstream & downstream flow in SW-NE plane -!-- * HASYNW - orographic asymmetry for upstream & downstream flow in NW-SE plane -!-- Orographic length scale or mountain width (4 planes) -!-- * HLENW - orographic length scale for upstream & downstream flow in W-E plane -!-- * HLENS - orographic length scale for upstream & downstream flow in S-N plane -!-- * HLENSW - orographic length scale for upstream & downstream flow in SW-NE plane -!-- * HLENNW - orographic length scale for upstream & downstream flow in NW-SE plane -!-- HANGL - angle (degrees) of the mountain range w/r/t east -!-- HANIS - anisotropy/aspect ratio of orography -!-- HSLOP - slope of orography -!-- HZMAX - max height above mean orography -!-- CROT, SROT - cosine & sine of the angle between Earth & model coordinates -! -!== OUTPUT: -!-- DUDT, DVDT - zonal, meridional wind tendencies -!-- UGWDsfc, VGWDsfc - zonal, meridional surface wind stresses (N/m**2) -! -!== INPUT indices: -!-- ids start index for i in domain -!-- ide end index for i in domain -!-- jds start index for j in domain -!-- jde end index for j in domain -!-- kds start index for k in domain -!-- kde end index for k in domain -!-- ims start index for i in memory -!-- ime end index for i in memory -!-- jms start index for j in memory -!-- jme end index for j in memory -!-- kms start index for k in memory -!-- kme end index for k in memory -!-- its start i index for tile -!-- ite end i index for tile -!-- jts start j index for tile -!-- jte end j index for tile -!-- kts start index for k in tile -!-- kte end index for k in tile -! -!-- INPUT variables: -! - REAL, INTENT(IN), DIMENSION (ims:ime, kms:kme, jms:jme) :: & - & U,V,T,Q,Z,DP,PINT,PMID,EXNR - REAL, INTENT(IN), DIMENSION (ims:ime, jms:jme) :: HSTDV,HCNVX & - & ,HASYW,HASYS,HASYSW,HASYNW,HLENW,HLENS,HLENSW,HLENNW,HANGL & - & ,HANIS,HSLOP,HZMAX,CROT,SROT, XLAND !ADDED XLAND BY KWON - INTEGER, INTENT(IN), DIMENSION (ims:ime, jms:jme) :: KPBL - INTEGER, INTENT(IN) :: ids,ide,jds,jde,kds,kde & - &, ims,ime,jms,jme,kms,kme & - &, its,ite,jts,jte,kts,kte,ITIME - -! -!-- OUTPUT variables: -! - REAL, INTENT(OUT), DIMENSION (ims:ime, kms:kme, jms:jme) :: & - & DUDT,DVDT - REAL, INTENT(OUT), DIMENSION (ims:ime, jms:jme) :: UGWDsfc,VGWDsfc -! -!-- Local variables -!-- DUsfc, DVsfc - zonal, meridional wind stresses (diagnostics) -! - INTEGER, PARAMETER :: IM=1 !-- Reduces changes in subroutine GWPDS - REAL(KIND=KIND_PHYS), PARAMETER :: G=9.806, GHALF=.5*G & - &, THRESH=1.E-6, dtlarge=1. !dbg - INTEGER, DIMENSION (IM) :: LPBL - REAL(KIND=KIND_PHYS), DIMENSION (IM,4) :: OA4,CLX4 - REAL(KIND=KIND_PHYS), DIMENSION (IM) :: DUsfc,DVsfc & - &, HPRIME,OC,THETA,SIGMA,GAMMA,ELVMAX - REAL(KIND=KIND_PHYS), DIMENSION (IM,KTS:KTE) :: DUDTcol,DVDTcol & - &, Ucol,Vcol,Tcol,Qcol,DPcol,Pcol,EXNcol,PHIcol - REAL(KIND=KIND_PHYS), DIMENSION (IM,KTS:KTE+1) :: PINTcol,PHILIcol - INTEGER :: I,J,IJ,K,Imid,Jmid - REAL :: Ugeo,Vgeo,Umod,Vmod, TERRtest,TERRmin - REAL(KIND=KIND_PHYS) :: TEST - CHARACTER(LEN=255) :: message - -!dbg -logical :: lprnt !dbg -character (len=26) :: label -integer :: kpblmin,kpblmax, mype, iunit -real :: hzmaxmin,hzmaxmax,hanglmin,hanglmax,hslopmin,hslopmax,hanismin,hanismax & -,hstdvmin,hstdvmax,hcnvxmin,hcnvxmax,hasywmin,hasywmax,hasysmin,hasysmax & -,hasyswmin,hasyswmax,hasynwmin,hasynwmax,hlenwmin,hlenwmax,hlensmin,hlensmax & -,hlenswmin,hlenswmax,hlennwmin,hlennwmax,zsmin,zsmax,delu,delv -! Added this declaration -real :: helvmin,helvmax -!dbg - -! -!-------------------------- Executable below ------------------------- -! - - -lprnt=.false. -!dbg -if (itime <= 1) then - CALL WRF_GET_MYPROC(MYPE) !-- Get processor number - kpblmin=100 - kpblmax=-100 - hzmaxmin=1.e6 - hzmaxmax=-1.e6 - hanglmin=1.e6 - hanglmax=-1.e6 - hslopmin=1.e6 - hslopmax=-1.e6 - hanismin=1.e6 - hanismax=-1.e6 - hstdvmin=1.e6 - hstdvmax=-1.e6 - hcnvxmin=1.e6 - hcnvxmax=-1.e6 - hasywmin=1.e6 - hasywmax=-1.e6 - hasysmin=1.e6 - hasysmax=-1.e6 - hasyswmin=1.e6 - hasyswmax=-1.e6 - hasynwmin=1.e6 - hasynwmax=-1.e6 - hlenwmin=1.e6 - hlenwmax=-1.e6 - hlensmin=1.e6 - hlensmax=-1.e6 - hlenswmin=1.e6 - hlenswmax=-1.e6 - hlennwmin=1.e6 - hlennwmax=-1.e6 - zsmin=1.e6 - zsmax=-1.e6 -! Added initialization of helvmin and helvmax - helvmin=1.e6 - helvmax=-1.e6 - do j=jts,jte - do i=its,ite - kpblmin=min(kpblmin,kpbl(i,j)) - kpblmax=max(kpblmax,kpbl(i,j)) - helvmin=min(helvmin,hzmax(i,j)) - helvmax=max(helvmax,hzmax(i,j)) - hanglmin=min(hanglmin,hangl(i,j)) - hanglmax=max(hanglmax,hangl(i,j)) - hslopmin=min(hslopmin,hslop(i,j)) - hslopmax=max(hslopmax,hslop(i,j)) - hanismin=min(hanismin,hanis(i,j)) - hanismax=max(hanismax,hanis(i,j)) - hstdvmin=min(hstdvmin,hstdv(i,j)) - hstdvmax=max(hstdvmax,hstdv(i,j)) - hcnvxmin=min(hcnvxmin,hcnvx(i,j)) - hcnvxmax=max(hcnvxmax,hcnvx(i,j)) - hasywmin=min(hasywmin,hasyw(i,j)) - hasywmax=max(hasywmax,hasyw(i,j)) - hasysmin=min(hasysmin,hasys(i,j)) - hasysmax=max(hasysmax,hasys(i,j)) - hasyswmin=min(hasyswmin,hasysw(i,j)) - hasyswmax=max(hasyswmax,hasysw(i,j)) - hasynwmin=min(hasynwmin,hasynw(i,j)) - hasynwmax=max(hasynwmax,hasynw(i,j)) - hlenwmin=min(hlenwmin,hlenw(i,j)) - hlenwmax=max(hlenwmax,hlenw(i,j)) - hlensmin=min(hlensmin,hlens(i,j)) - hlensmax=max(hlensmax,hlens(i,j)) - hlenswmin=min(hlenswmin,hlensw(i,j)) - hlenswmax=max(hlenswmax,hlensw(i,j)) - hlennwmin=min(hlennwmin,hlennw(i,j)) - hlennwmax=max(hlennwmax,hlennw(i,j)) - zsmin=min(zsmin,z(i,1,j)) - zsmax=max(zsmax,z(i,1,j)) - enddo - enddo - write(message,*) 'Maximum and minimum values within GWD-driver for MYPE=',MYPE - write(message,"(i3,2(a,e12.5))") mype,': deltim=',deltim,' rdeltim=',rdeltim - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,i3))") mype,': kpblmin=',kpblmin,' kpblmax=',kpblmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': helvmin=',helvmin,' helvmax=',helvmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hanglmin=',hanglmin,' hanglmax=',hanglmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hslopmin=',hslopmin,' hslopmax=',hslopmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hanismin=',hanismin,' hanismax=',hanismax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hstdvmin=',hstdvmin,' hstdvmax=',hstdvmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hcnvxmin=',hcnvxmin,' hcnvxmax=',hcnvxmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hasywmin=',hasywmin,' hasywmax=',hasywmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hasysmin=',hasysmin,' hasysmax=',hasysmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hasyswmin=',hasyswmin,' hasyswmax=',hasyswmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hasynwmin=',hasynwmin,' hasynwmax=',hasynwmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hlenwmin=',hlenwmin,' hlenwmax=',hlenwmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hlensmin=',hlensmin,' hlensmax=',hlensmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hlenswmin=',hlenswmin,' hlenswmax=',hlenswmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': hlennwmin=',hlennwmin,' hlennwmax=',hlennwmax - CALL wrf_message(trim(message)) - write(message,"(i3,2(a,e12.5))") mype,': zsmin=',zsmin,' zsmax=',zsmax - CALL wrf_message(trim(message)) - -endif ! if (itime <= 1) then -!dbg - -! -!-- Initialize variables -! - DO J=JMS,JME - DO K=KMS,KME - DO I=IMS,IME - DUDT(I,K,J)=0. - DVDT(I,K,J)=0. - ENDDO - ENDDO - ENDDO -! - DO J=JMS,JME - DO I=IMS,IME - UGWDsfc(I,J)=0. - VGWDsfc(I,J)=0. -! IF(ITIMIE.LE.2.OR.ITIME.GE.900) THEN -! PRINT *,'KWON: I J HSTDV IN GWD_DRIVER ',ITIME,I,J,HSTDV(I,J) -! ENDIF - ENDDO - ENDDO -! -!-- For debugging, find approximate center point within each tile -! -!dbg Imid=.5*(ITS+ITE) -!dbg Jmid=.5*(JTS+JTE) -! -!INITIALIZE THE OUPUT OF GWD_COL KWON - DO K=KTS,KTE - DUDTcol(IM,K)=0. - DVDTcol(IM,K)=0. - ENDDO - DUsfc(IM)=0. !-- U wind stress - DVsfc(IM)=0. !-- V wind stress - - - DO J=JTS,JTE - DO I=ITS,ITE - if (kpbl(i,j)kte) go to 100 -! -!-- Initial test to see if GWD calculations should be made, otherwise skip -! - TERRtest=HZMAX(I,J)+SIGFAC*HSTDV(I,J) - TERRmin=Z(I,2,J)-Z(I,1,J) - IF (TERRtest < TERRmin) GO TO 100 -! ADDED BY KWON TO SKIP OCEAN POINTS - IF (XLAND(I,J).GE.1.5) GO TO 100 -! -!-- For debugging: -! -!dbg lprnt=.false. -!dbg if (i==idbg .and. j==jdbg .and. itime<=1) lprnt=.true. -!dbg ! 200 CONTINUE -! - DO K=KTS,KTE - DUDTcol(IM,K)=0. - DVDTcol(IM,K)=0. -! -!-- Transform/rotate winds from model to geodetic (Earth) coordinates -! - Ucol(IM,K)=U(I,K,J)*CROT(I,J)+V(I,K,J)*SROT(I,J) - Vcol(IM,K)=V(I,K,J)*CROT(I,J)-U(I,K,J)*SROT(I,J) -! - Tcol(IM,K)=T(I,K,J) - Qcol(IM,K)=Q(I,K,J) -! -!-- Convert from Pa to centibars, which is what's used in subroutine GWD_col -! - DPcol(IM,K)=.001*DP(I,K,J) - PINTcol(IM,K)=.001*PINT(I,K,J) - Pcol(IM,K)=.001*PMID(I,K,J) - EXNcol(IM,K)=EXNR(I,K,J) -! -!-- Next 2 fields are geopotential above the surface at the lower interface -! and at midlayer -! - PHILIcol(IM,K)=G*(Z(I,K,J)-Z(I,1,J)) - PHIcol(IM,K)=GHALF*(Z(I,K,J)+Z(I,K+1,J))-G*Z(I,1,J) - ENDDO !- K -! - PINTcol(IM,KTE+1)=.001*PINT(I,KTE+1,J) - PHILIcol(IM,KTE+1)=G*(Z(I,KTE+1,J)-Z(I,1,J)) -! -!-- Terrain-specific inputs: -! - HPRIME(IM)=HSTDV(I,J) !-- standard deviation of orography - OC(IM)=HCNVX(I,J) !-- Normalized convexity - OA4(IM,1)=HASYW(I,J) !-- orographic asymmetry in W-E plane - OA4(IM,2)=HASYS(I,J) !-- orographic asymmetry in S-N plane - OA4(IM,3)=HASYSW(I,J) !-- orographic asymmetry in SW-NE plane - OA4(IM,4)=HASYNW(I,J) !-- orographic asymmetry in NW-SE plane - CLX4(IM,1)=HLENW(I,J) !-- orographic length scale in W-E plane - CLX4(IM,2)=HLENS(I,J) !-- orographic length scale in S-N plane - CLX4(IM,3)=HLENSW(I,J) !-- orographic length scale in SW-NE plane - CLX4(IM,4)=HLENNW(I,J) !-- orographic length scale in NW-SE plane - THETA(IM)=HANGL(I,J) ! - SIGMA(IM)=HSLOP(I,J) ! - GAMMA(IM)=HANIS(I,J) ! - ELVMAX(IM)=HZMAX(I,J) ! - LPBL(IM)=KPBL(I,J) ! -!dbg IF (LPBL(IM)KTE) & -!dbg & print *,'Wacky values for KPBL: I,J,N,LPBL=',I,J,ITIME,LPBL(IM) -! -!-- Output (diagnostics) -! - DUsfc(IM)=0. !-- U wind stress - DVsfc(IM)=0. !-- V wind stress -! -!dbg -!dbg if (LPRNT) then -!dbg ! -!dbg !-- Following code is for ingesting GFS-derived inputs for final testing -!dbg ! -!dbg CALL INT_GET_FRESH_HANDLE(iunit) -!dbg close(iunit) -!dbg open(unit=iunit,file='gfs_gwd.input',form='formatted',iostat=ier) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (Ucol(im,k), k=kts,kte) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (Vcol(im,k), k=kts,kte) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (Tcol(im,k), k=kts,kte) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (Qcol(im,k), k=kts,kte) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (PINTcol(im,k), k=kts,kte+1) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (DPcol(im,k), k=kts,kte) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (Pcol(im,k), k=kts,kte) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (EXNcol(im,k), k=kts,kte) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (PHILIcol(im,k), k=kts,kte+1) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (PHIcol(im,k), k=kts,kte) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) hprime(im) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) oc(im) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (oa4(im,k), k=1,4) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) (clx4(im,k), k=1,4) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) theta(im) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) sigma(im) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) gamma(im) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) elvmax(im) -!dbg read(iunit,*) ! skip line -!dbg read(iunit,*) lpbl(im) -!dbg close(iunit) -write(label,"('GWD:i,j,n=',2i5,i6)") I,J,ITIME -!dbg write(6,"(2a)") LABEL,' in GWD_driver: K U V T Q Pi DP P EX PHIi PHI' -!dbg do k=kts,kte -!dbg write(6,"(i3,10e12.4)") k,Ucol(im,k),Vcol(im,k),Tcol(im,k) & -!dbg ,Qcol(im,k),PINTcol(im,k),DPcol(im,k),Pcol(im,k),EXNcol(im,k) & -!dbg ,PHILIcol(im,k),PHIcol(im,k) -!dbg enddo -!dbg write(6,"(2(a,e12.4),2(a,4e12.4/),4(a,e12.4),a,i3) )") & -!dbg 'GWD_driver: hprime(im)=',hprime(im),' oc(im)=',oc(im) & -!dbg ,' oa4(im,1-4)=',(oa4(im,k),k=1,4) & -!dbg ,' clx4(im,1-4)=',(clx4(im,k),k=1,4) & -!dbg ,' theta=',theta(im),' sigma(im)=',sigma(im) & -!dbg ,' gamma(im)=',gamma(im),' elvmax(im)=',elvmax(im) & -!dbg ,' lpbl(im)=',lpbl(im) -!dbg endif -!dbg -!======================================================================= -! - CALL GWD_col(DVDTcol,DUDTcol, DUsfc,DVsfc & ! Output - &, Ucol,Vcol,Tcol,Qcol,PINTcol,DPcol,Pcol,EXNcol & ! Met input - &, PHILIcol,PHIcol & ! Met input - &, HPRIME,OC,OA4,CLX4,THETA,SIGMA,GAMMA,ELVMAX & ! Topo input - &, LPBL,IM,KTS,KTE,LABEL,LPRNT ) ! Indices + debugging -! -!======================================================================= -! -!dbg -!dbg ! -!dbg ! IF (.NOT.LPRNT) THEN -!dbg ! TEST=0. -!dbg ! DO K=KTS,KTE -!dbg ! TEST=MAX( TEST, ABS(DUDTcol(IM,K)), ABS(DVDTcol(IM,K)) ) -!dbg ! if ( ABS(DUDTcol(IM,K)) > RDELTIM) print *,'k,DUDTcol=',k,DUDTcol(IM,K) -!dbg ! if ( ABS(DVDTcol(IM,K)) > RDELTIM) print *,'k,DVDTcol=',k,DVDTcol(IM,K) -!dbg ! ENDDO -!dbg ! IF (TEST>RDELTIM) THEN -!dbg ! LPRNT=.TRUE. -!dbg ! Imid=I -!dbg ! Jmid=J -!dbg ! GO TO 200 -!dbg ! ENDIF -!dbg ! ENDIF -!dbg ! TEST=ABS(DUsfc(IM))+ABS(DVsfc(IM)) -!dbg ! if (.not.lprnt) then -!dbg ! do k=kts,kte -!dbg ! du=DUDTcol(IM,K)*DELTIM -!dbg ! dv=DVDTcol(IM,K)*DELTIM -!dbg ! if (du < dumin) then -!dbg ! lprnt=.true. -!dbg ! dumin=1.5*du -!dbg ! endif -!dbg ! if (du > dumax) then -!dbg ! lprnt=.true. -!dbg ! dumax=1.5*du -!dbg ! endif -!dbg ! if (dv < dvmin) then -!dbg ! lprnt=.true. -!dbg ! dvmin=1.5*dv -!dbg ! endif -!dbg ! if (dv > dvmax) then -!dbg ! lprnt=.true. -!dbg ! dvmax=1.5*dv -!dbg ! endif -!dbg ! enddo -!dbg ! if (lprnt) go to 200 -!dbg ! else -!dbg if (lprnt) then -!dbg print *,'DUsfc,DVsfc,CROT,SROT,DELTIM=',DUsfc(IM),DVsfc(IM) & -!dbg &,CROT(I,J),SROT(I,J),DELTIM -!dbg print *,' K P | Ucol Ugeo DUDTcol*DT U Umod DU=DUDT*DT ' & -!dbg ,'| Vcol Vgeo DVDTcol*DT V Vmod DV=DVDT*DT' -!dbg ENDIF - - DO K=KTS,KTE - TEST=ABS(DUDTcol(IM,K))+ABS(DVDTcol(IM,K)) - IF (TEST > THRESH) THEN - -!dbg -!dbg if (lprnt) then -!dbg !dbg DUDTcol(IM,K)=0. !-- Test rotation -!dbg !dbg DVDTcol(IM,K)=0. !-- Test rotation -!dbg !-- Now replace with the original winds before they were written over by -!dbg ! the values from the GFS -!dbg Ucol(IM,K)=U(I,K,J)*CROT(I,J)+V(I,K,J)*SROT(I,J) -!dbg Vcol(IM,K)=V(I,K,J)*CROT(I,J)-U(I,K,J)*SROT(I,J) -!dbg endif - -! -!-- First update winds in geodetic coordinates -! - Ugeo=Ucol(IM,K)+DUDTcol(IM,K)*DELTIM - Vgeo=Vcol(IM,K)+DVDTcol(IM,K)*DELTIM -! -!-- Transform/rotate winds from geodetic back to model coordinates -! - Umod=Ugeo*CROT(I,J)-Vgeo*SROT(I,J) - Vmod=Ugeo*SROT(I,J)+Vgeo*CROT(I,J) -! -!-- Calculate wind tendencies from the updated model winds -! - DUDT(I,K,J)=RDELTIM*(Umod-U(I,K,J)) - DVDT(I,K,J)=RDELTIM*(Vmod-V(I,K,J)) -! -!dbg - -test=abs(dudt(i,k,j))+abs(dvdt(i,k,j)) -if (test > dtlarge) write(6,"(2a,i2,2(a,e12.4))") & -label,' => k=',k,' dudt=',dudt(i,k,j),' dvdt=',dvdt(i,k,j) - -!dbg if (lprnt) write(6,"(i2,f8.2,2(' | ',6f10.4)") K,10.*Pcol(IM,K) & -!dbg ,Ucol(IM,K),Ugeo,DUDTcol(IM,K)*DELTIM,U(I,K,J),Umod,DUDT(I,K,J)*DELTIM & -!dbg ,Vcol(IM,K),Vgeo,DVDTcol(IM,K)*DELTIM,V(I,K,J),Vmod,DVDT(I,K,J)*DELTIM -!dbg - ENDIF !- IF (TEST > THRESH) THEN -! - ENDDO !- K -! -!-- Transform/rotate surface wind stresses from geodetic to model coordinates -! - UGWDsfc(I,J)=DUsfc(IM)*CROT(I,J)-DVsfc(IM)*SROT(I,J) - VGWDsfc(I,J)=DUsfc(IM)*SROT(I,J)+DVsfc(IM)*CROT(I,J) -! -100 CONTINUE - ENDDO !- I - ENDDO !- J -! - END SUBROUTINE GWD_driver -! -!----------------------------------------------------------------------- -! -!-- "A", "B" (from GFS) in GWD_col are DVDTcol, DUDTcol, respectively in GWD_driver -! - SUBROUTINE GWD_col (A,B, DUsfc,DVsfc & !-- Output - &, U1,V1,T1,Q1, PRSI,DEL,PRSL,PRSLK, PHII,PHIL & !-- Met inputs - &, HPRIME,OC,OA4,CLX4,THETA,SIGMA,GAMMA,ELVMAX & !-- Topo inputs - &, KPBL,IM,KTS,KTE, LABEL,LPRNT ) !-- Input indices, debugging -! -!=== Output fields -! -!-- A (DUDT), B (DVDT) - output zonal & meridional wind tendencies in Earth coordinates (m s^-2) -!-- DUsfc, DVsfc - surface zonal meridional wind stresses in Earth coordinates (m s^-1?) -! -!=== Input fields -! -!-- U1, V1 - zonal, meridional wind (m/s) -!-- T1 - temperature (deg K) -!-- Q1 - specific humidity (kg/kg) -!-- PRSI - lower interface pressure in centibars (1000 Pa) -!-- DEL - pressure thickness of layer in centibars (1000 Pa) -!-- PRSL - midlayer pressure in centibars (1000 Pa) -!-- PRSLK - Exner function, (P/P0)**(Rd/CP) -!-- PHII - lower interface geopotential in mks units -!-- PHIL - midlayer geopotential in mks units -!-- KDT - number of time steps into integration for diagnostics -!-- HPRIME - orographic standard deviation -!-- OC - normalized 4th moment of the orographic convexity -!-- OA4 - orographic asymmetry for upstream & downstream flow measured -! along 4 vertical planes (W-E, S-N, SW-NE, NW-SE) -!-- CLX4 - orographic length scale or mountain width measured along -! 4 vertical planes (W-E, S-N, SW-NE, NW-SE) -!-- THETA - angle of the mountain range w/r/t east -!-- SIGMA - slope of orography -!-- GAMMA - anisotropy/aspect ratio -!-- ELVMAX - max height above mean orography -!-- KPBL(IM) - vertical index at the top of the PBL -!-- KM - number of vertical levels -! -!== For diagnostics -!-- LABEL - character string for diagnostic prints -!-- LPRNT - logical flag for prints -! -!####################################################################### -!################## ORIGINAL DOCUMENTATION BLOCK ##################### -!###### The following comments are from the original GFS code ######## -!####################################################################### -! ******************************************************************** -! -----> I M P L E M E N T A T I O N V E R S I O N <---------- -! -! --- Not in this code -- History of GWDP at NCEP---- -! ---------------- ----------------------- -! VERSION 3 MODIFIED FOR GRAVITY WAVES, LOCATION: .FR30(V3GWD) *J* -!--- 3.1 INCLUDES VARIABLE SATURATION FLUX PROFILE CF ISIGST -!--- 3.G INCLUDES PS COMBINED W/ PH (GLAS AND GFDL) -!----- ALSO INCLUDED IS RI SMOOTH OVER A THICK LOWER LAYER -!----- ALSO INCLUDED IS DECREASE IN DE-ACC AT TOP BY 1/2 -!----- THE NMC GWD INCORPORATING BOTH GLAS(P&S) AND GFDL(MIGWD) -!----- MOUNTAIN INDUCED GRAVITY WAVE DRAG -!----- CODE FROM .FR30(V3MONNX) FOR MONIN3 -!----- THIS VERSION (06 MAR 1987) -!----- THIS VERSION (26 APR 1987) 3.G -!----- THIS VERSION (01 MAY 1987) 3.9 -!----- CHANGE TO FORTRAN 77 (FEB 1989) --- HANN-MING HENRY JUANG -!----- -! -! VERSION 4 -! ----- This code ----- -! -!----- MODIFIED TO IMPLEMENT THE ENHANCED LOW TROPOSPHERIC GRAVITY -!----- WAVE DRAG DEVELOPED BY KIM AND ARAKAWA(JAS, 1995). -! Orographic Std Dev (hprime), Convexity (OC), Asymmetry (OA4) -! and Lx (CLX4) are input topographic statistics needed. -! -!----- PROGRAMMED AND DEBUGGED BY HONG, ALPERT AND KIM --- JAN 1996. -!----- debugged again - moorthi and iredell --- may 1998. -!----- -! Further Cleanup, optimization and modification -! - S. Moorthi May 98, March 99. -!----- modified for usgs orography data (ncep office note 424) -! and with several bugs fixed - moorthi and hong --- july 1999. -! -!----- Modified & implemented into NRL NOGAPS -! - Young-Joon Kim, July 2000 -!----- -! VERSION lm MB (6): oz fix 8/2003 -! ----- This code ----- -! -!------ Changed to include the Lott and Miller Mtn Blocking -! with some modifications by (*j*) 4/02 -! From a Principal Coordinate calculation using the -! Hi Res 8 minute orography, the Angle of the -! mtn with that to the East (x) axis is THETA, the slope -! parameter SIGMA. The anisotropy is in GAMMA - all are input -! topographic statistics needed. These are calculated off-line -! as a function of model resolution in the fortran code ml01rg2.f, -! with script mlb2.sh. (*j*) -!----- gwdps_mb.f version (following lmi) elvmax < hncrit (*j*) -! MB3a expt to enhance elvmax mtn hgt see sigfac & hncrit -!----- -!----------------------------------------------------------------------C -!==== Below in "!GFS " are the original subroutine call and comments from -! /nwprod/sorc/global_fcst.fd/gwdps_v.f as of April 2007 -!GFS SUBROUTINE GWDPS(IM,IX,IY,KM,A,B,U1,V1,T1,Q1,KPBL, -!GFS & PRSI,DEL,PRSL,PRSLK,PHII, PHIL,RCL,DELTIM,KDT, -!GFS & HPRIME,OC,OA4,CLX4,THETA,SIGMA,GAMMA,ELVMAX, -!GFS & DUsfc,DVsfc,G, CP, RD, RV, IMX, -!GFS & nmtvr, me, lprnt, ipr) -!GFS !------------------------------------------------------------------ -!GFS ! USE -!GFS ! ROUTINE IS CALLED FROM GBPHYS (AFTER CALL TO MONNIN) -!GFS ! -!GFS ! PURPOSE -!GFS ! USING THE GWD PARAMETERIZATIONS OF PS-GLAS AND PH- -!GFS ! GFDL TECHNIQUE. THE TIME TENDENCIES OF U V -!GFS ! ARE ALTERED TO INCLUDE THE EFFECT OF MOUNTAIN INDUCED -!GFS ! GRAVITY WAVE DRAG FROM SUB-GRID SCALE OROGRAPHY INCLUDING -!GFS ! CONVECTIVE BREAKING, SHEAR BREAKING AND THE PRESENCE OF -!GFS ! CRITICAL LEVELS -!GFS ! -!GFS ! INPUT -!GFS ! A(IY,KM) NON-LIN TENDENCY FOR V WIND COMPONENT -!GFS ! B(IY,KM) NON-LIN TENDENCY FOR U WIND COMPONENT -!GFS ! U1(IX,KM) ZONAL WIND / SQRT(RCL) M/SEC AT T0-DT -!GFS ! V1(IX,KM) MERIDIONAL WIND / SQRT(RCL) M/SEC AT T0-DT -!GFS ! T1(IX,KM) TEMPERATURE DEG K AT T0-DT -!GFS ! Q1(IX,KM) SPECIFIC HUMIDITY AT T0-DT -!GFS ! -!GFS ! RCL A scaling factor = RECIPROCAL OF SQUARE OF COS(LAT) -!GFS ! FOR MRF GFS. -!GFS ! DELTIM TIME STEP SECS -!GFS ! SI(N) P/PSFC AT BASE OF LAYER N -!GFS ! SL(N) P/PSFC AT MIDDLE OF LAYER N -!GFS ! DEL(N) POSITIVE INCREMENT OF P/PSFC ACROSS LAYER N -!GFS ! KPBL(IM) is the index of the top layer of the PBL -!GFS ! ipr & lprnt for diagnostics -!GFS ! -!GFS ! OUTPUT -!GFS ! A, B AS AUGMENTED BY TENDENCY DUE TO GWDPS -!GFS ! OTHER INPUT VARIABLES UNMODIFIED. -!GFS ! ******************************************************************** -! - IMPLICIT NONE -! -!-- INPUT: -! - INTEGER, INTENT(IN) :: IM,KTS,KTE - REAL(kind=kind_phys), INTENT(IN), DIMENSION(IM,KTS:KTE) :: & - & U1,V1,T1,Q1,DEL,PRSL,PRSLK,PHIL - REAL(kind=kind_phys), INTENT(IN), DIMENSION(IM,KTS:KTE+1) :: & - & PRSI,PHII - REAL(kind=kind_phys), INTENT(IN), DIMENSION(IM,4) :: OA4,CLX4 - REAL(kind=kind_phys), INTENT(IN), DIMENSION(IM) :: & - & HPRIME,OC,THETA,SIGMA,GAMMA,ELVMAX - INTEGER, INTENT(IN), DIMENSION(IM) :: KPBL - CHARACTER (LEN=26), INTENT(IN) :: LABEL - LOGICAL, INTENT(IN) :: LPRNT -! -!-- OUTPUT: -! - REAL(kind=kind_phys), INTENT(INOUT), DIMENSION(IM,KTS:KTE) :: A,B - REAL(kind=kind_phys), INTENT(INOUT), DIMENSION(IM) :: DUsfc,DVsfc -! -!----------------------------------------------------------------------- -!-- LOCAL variables: -!----------------------------------------------------------------------- -! -! Some constants -! -! - REAL(kind=kind_phys), PARAMETER :: PI=3.1415926535897931 & - &, G=9.806, CP=1004.6, RD=287.04, RV=461.6 & - &, FV=RV/RD-1., RDI=1./RD, GOR=G/RD, GR2=G*GOR, GOCP=G/CP & - &, ROG=1./G, ROG2=ROG*ROG & - &, DW2MIN=1., RIMIN=-100., RIC=0.25, BNV2MIN=1.0E-5 & - &, EFMIN=0.0, EFMAX=10.0, hpmax=200.0 & ! or hpmax=2500.0 - &, FRC=1.0, CE=0.8, CEOFRC=CE/FRC, frmax=100. & - &, CG=0.5, GMAX=1.0, CRITAC=5.0E-4, VELEPS=1.0 & - &, FACTOP=0.5, RLOLEV=500.0, HZERO=0., HONE=1. & ! or RLOLEV=0.5 - &, HE_4=.0001, HE_2=.01 & -! -!-- Lott & Miller mountain blocking => aka "lm mtn blocking" -! - &, cdmb = 1.0 & ! non-dim sub grid mtn drag Amp (*j*) -! hncrit set to 8000m and sigfac added to enhance elvmax mtn hgt - &, hncrit=8000. & ! Max value in meters for ELVMAX (*j*) -!module top! &, sigfac=3.0 & ! MB3a expt test for ELVMAX factor (*j*) => control value is 0.1 -!module top &, sigfac=0. & ! MB3a expt test for ELVMAX factor (*j*) => control value is 0.1 - &, hminmt=50. & ! min mtn height (*j*) - &, hstdmin=25. & ! min orographic std dev in height - &, minwnd=0.1 & ! min wind component (*j*) - &, dpmin=5.0 ! Minimum thickness of the reference layer (centibars) - ! values of dpmin=0, 20 have also been used -! - integer, parameter :: mdir=8 - real(kind=kind_phys), parameter :: FDIR=mdir/(PI+PI) -! -!-- Template: -! NWD 1 2 3 4 5 6 7 8 -! WD W S SW NW E N NE SE -! - integer,save :: nwdir(mdir) - data nwdir /6,7,5,8,2,3,1,4/ -! - LOGICAL ICRILV(IM) -! -!---- MOUNTAIN INDUCED GRAVITY WAVE DRAG -! -! -! for lm mtn blocking - real(kind=kind_phys), DIMENSION(IM) :: WK,PE,EK,ZBK,UP,TAUB,XN & - & ,YN,UBAR,VBAR,ULOW,OA,CLX,ROLL,ULOI,DTFAC,XLINV,DELKS,DELKS1 & - & ,SCOR,BNV2bar, ELEVMX ! ,PSTAR -! - real(kind=kind_phys), DIMENSION(IM,KTS:KTE) :: & - & BNV2LM,DB,ANG,UDS,BNV2,RI_N,TAUD,RO,VTK,VTJ - real(kind=kind_phys), DIMENSION(IM,KTS:KTE-1) :: VELCO - real(kind=kind_phys), DIMENSION(IM,KTS:KTE+1) :: TAUP - real(kind=kind_phys), DIMENSION(KTE-1) :: VELKO -! - integer, DIMENSION(IM) :: & - & kref,kint,iwk,iwk2,ipt,kreflm,iwklm,iptlm,idxzb -! -! for lm mtn blocking -! - real(kind=kind_phys) :: ZLEN, DBTMP, R, PHIANG, DBIM & - &, xl, rcsks, bnv, fr & - &, brvf, cleff, tem, tem1, tem2, temc, temv & - &, wdir, ti, rdz, dw2, shr2, bvf2 & - &, rdelks, wtkbj, efact, coefm, gfobnv & - &, scork, rscor, hd, fro, rim, sira & - &, dtaux, dtauy, pkp1log, pklog -! - integer :: ncnt, kmm1, kmm2, lcap, lcapp1, kbps, kbpsp1,kbpsm1 & - &, kmps, kmpsp1, idir, nwd, i, j, k, klcap, kp1, kmpbl, npt, npr & - &, idxm1, ktrial, klevm1, kmll,kmds, KM & -! &, ihit,jhit & - &, ME !-- processor element for debugging - -real :: rcl,rcs !dbg - -! -!----------------------------------------------------------------------- -! - KM = KTE - npr = 0 - DO I = 1, IM - DUsfc(I) = 0. - DVsfc(I) = 0. -! -!-- ELEVMX is a local array that could be changed below -! - ELEVMX(I) = ELVMAX(I) - ENDDO -! -!-- Note that A, B already set to zero as DUDTcol, DVDTcol in subroutine GWD_driver -! - ipt = 0 - npt = 0 - IF (NMTVR >= 14) then - DO I = 1,IM - IF (elvmax(i) > HMINMT .AND. hprime(i) > HE_4) then - npt = npt + 1 - ipt(npt) = i - ENDIF - ENDDO - ELSE - DO I = 1,IM - IF (hprime(i) > HE_4) then - npt = npt + 1 - ipt(npt) = i - ENDIF - ENDDO - ENDIF !-- IF (NMTVR >= 14) then -! - -!dbg -rcl=1. -rcs=1. -!dbg if (lprnt) then -!dbg !-- Match what's in the GFS: -!dbg !dbg rcl=1.53028780126139008 ! match GFS point at 36N -!dbg !dbg rcs=sqrt(rcl) -!dbg i=im -!dbg write(6,"(a,a)") LABEL,' in GWD_col: K U V T Q Pi DP P EX PHIi PHI' -!dbg do k=kts,kte -!dbg write(6,"(i3,10e12.4)") k,U1(i,k),V1(i,k),T1(i,k),Q1(i,k),PRSI(i,k) & -!dbg ,DEL(i,k),PRSL(i,k),PRSLK(i,k),PHII(i,k),PHIL(i,k) -!dbg enddo -!dbg write(6,"(2(a,e12.4),2(a,4e12.4/),4(a,e12.4),a,i3) )") & -!dbg 'GWD_col: hprime(i)=',hprime(i),' oc(i)=',oc(i) & -!dbg ,' oa4(i,1-4)=',(oa4(i,k),k=1,4) & -!dbg ,' clx4(i,1-4)=',(clx4(i,k),k=1,4) & -!dbg ,' theta(i)=',theta(i),' sigma(i)=',sigma(i) & -!dbg ,' gamma(i)=',gamma(i),' elvmax(i)=',elvmax(i) & -!dbg ,' lpbl(i)=',kpbl(i) -!dbg endif -!dbg if (lprnt) CALL WRF_GET_MYPROC(ME) - -! -!-- Note important criterion for immediately exiting routine! -! - IF (npt <= 0) RETURN ! No gwd/mb calculation done! -! - do i=1,npt - IDXZB(i) = 0 - enddo -! - DO K = 1, KM - DO I = 1, IM - DB(I,K) = 0. - ANG(I,K) = 0. - UDS(I,K) = 0. - ENDDO - ENDDO -! -! -! NCNT = 0 - KMM1 = KM - 1 - KMM2 = KM - 2 - LCAP = KM - LCAPP1 = LCAP + 1 -! -! - IF (NMTVR .eq. 14) then -! ---- for lm and gwd calculation points -! -! --- iwklm is the level above the height of the mountain. -! --- idxzb is the level of the dividing streamline. -! INITIALIZE DIVIDING STREAMLINE (DS) CONTROL VECTOR -! - do i=1,npt - iwklm(i) = 2 - kreflm(i) = 0 - enddo -! -! -! start lm mtn blocking (mb) section -! -!.............................. -!.............................. -! -! (*j*) 11/03: test upper limit on KMLL=km - 1 -! then do not need hncrit -- test with large hncrit first. -! KMLL = km / 2 ! maximum mtnlm height : # of vertical levels / 2 - KMLL = kmm1 -! --- No mtn should be as high as KMLL (so we do not have to start at -! --- the top of the model but could do calc for all levels). -! - -!dbg -!dbg if (lprnt) print *,'k pkp1log pklog vtj(i,k) vtk(i,k) ro(i,k)' - - DO I = 1, npt - j = ipt(i) - ELEVMX(J) = min (ELEVMX(J) + sigfac * hprime(j), hncrit) - -!dbg -!dbg if (lprnt) print *,'k=',k,' elevmx(j)=',elevmx(j),' elvmax(j)=',elvmax(j) & -!dbg ,' sigfac*hprime(j)=',sigfac*hprime(j) - - ENDDO - - DO K = 1,KMLL - DO I = 1, npt - j = ipt(i) -! --- interpolate to max mtn height for index, iwklm(I) wk[gz] -! --- ELEVMX is limited to hncrit because to hi res topo30 orog. - pkp1log = phil(j,k+1) * ROG - pklog = phil(j,k) * ROG - if ( ( ELEVMX(j) .le. pkp1log ) .and. & - & ( ELEVMX(j) .ge. pklog ) ) THEN -! --- wk for diags but can be saved and reused. - wk(i) = G * ELEVMX(j) / ( phil(j,k+1) - phil(j,k) ) - iwklm(I) = MAX(iwklm(I), k+1 ) - -!dbg if (lprnt) print *,'k,wk(i),iwklm(i)=',k,wk(i),iwklm(i) !dbg - - endif -! -! --- find at prsl levels large scale environment variables -! --- these cover all possible mtn max heights - VTJ(I,K) = T1(J,K) * (1.+FV*Q1(J,K)) ! virtual temperature - VTK(I,K) = VTJ(I,K) / PRSLK(J,K) ! potential temperature - RO(I,K) = RDI * PRSL(J,K) / VTJ(I,K) ! DENSITY (1.e-3 kg m^-3) - -!dbg if (lprnt) write(6,"(i2,5e12.4)") k,pkp1log,pklog,vtj(i,k),vtk(i,k),ro(i,k) !dbg - - ENDDO !-- DO I = 1, npt -! - ENDDO !-- DO K = 1,KMLL -! -! testing for highest model level of mountain top -! -! ihit = 2 -! jhit = 0 -! do i = 1, npt -! j=ipt(i) -! if ( iwklm(i) .gt. ihit ) then -! ihit = iwklm(i) -! jhit = j -! endif -! enddo -! if (lprnt) print *, ' mb: kdt,max(iwklm),jhit,phil,me=', & -! & kdt,ihit,jhit,phil(jhit,ihit),me -! -!dbg if (lprnt) print *,'k rdz bnv2lm(i,k)' !dbg - klevm1 = KMLL - 1 - DO K = 1, klevm1 - DO I = 1, npt - j = ipt(i) - RDZ = g / ( phil(j,k+1) - phil(j,k) ) -! --- Brunt-Vaisala Frequency - BNV2LM(I,K) = (G+G) * RDZ * ( VTK(I,K+1)-VTK(I,K) ) & - & / ( VTK(I,K+1)+VTK(I,K) ) - bnv2lm(i,k) = max( bnv2lm(i,k), bnv2min ) - -!dbg if (lprnt) write(6,"(i2,2e12.4)") k,rdz,bnv2lm(i,k) !dbg - - ENDDO - ENDDO -! - DO I = 1, npt - J = ipt(i) - DELKS(I) = 1.0 / (PRSI(J,1) - PRSI(J,iwklm(i))) - DELKS1(I) = 1.0 / (PRSL(J,1) - PRSL(J,iwklm(i))) - UBAR (I) = 0.0 - VBAR (I) = 0.0 - ROLL (I) = 0.0 - PE (I) = 0.0 - EK (I) = 0.0 - BNV2bar(I) = (PRSL(J,1)-PRSL(J,2)) * DELKS1(I) * BNV2LM(I,1) - ENDDO -! -! --- find the dividing stream line height -! --- starting from the level above the max mtn downward -! --- iwklm(i) is the k-index of mtn elevmx elevation -! - DO Ktrial = KMLL, 1, -1 - DO I = 1, npt - IF ( Ktrial .LT. iwklm(I) .and. kreflm(I) .eq. 0 ) then - kreflm(I) = Ktrial - -if (lprnt) print *,'Ktrial,iwklm(i),kreflm(i)=',Ktrial,iwklm(i),kreflm(I) - - ENDIF - ENDDO - ENDDO -! -! --- in the layer kreflm(I) to 1 find PE (which needs N, ELEVMX) -! --- make averages, guess dividing stream (DS) line layer. -! --- This is not used in the first cut except for testing and -! --- is the vert ave of quantities from the surface to mtn top. -! - -!dbg -!dbg if (lprnt) print *,' k rdelks ubar vbar roll ' & -!dbg ,'bnv2bar rcsks rcs' - - DO I = 1, npt - DO K = 1, Kreflm(I) - J = ipt(i) - RDELKS = DEL(J,K) * DELKS(I) - -!dbg - RCSKS = RCS * RDELKS - UBAR(I) = UBAR(I) + RCSKS * U1(J,K) ! trial Mean U below - VBAR(I) = VBAR(I) + RCSKS * V1(J,K) ! trial Mean V below - - ROLL(I) = ROLL(I) + RDELKS * RO(I,K) ! trial Mean RO below - RDELKS = (PRSL(J,K)-PRSL(J,K+1)) * DELKS1(I) - BNV2bar(I) = BNV2bar(I) + BNV2lm(I,K) * RDELKS -! --- these vert ave are for diags, testing and GWD to follow (*j*). - -!dbg -!dbg if (lprnt) write(6,"(i2,7e12.4)") k,rdelks,ubar(i),vbar(i),roll(i) & -!dbg ,bnv2bar(i),rcsks,rcs - - ENDDO - ENDDO - -!dbg -!dbg if (lprnt) print *, 'kreflm(npt)=',kreflm(npt) & -!dbg ,' bnv2bar(npt)=',bnv2bar(npt) & -!dbg ,' ubar(npt)=',ubar(npt) & -!dbg ,' vbar(npt)=',vbar(npt) & -!dbg ,' roll(npt)=',roll(npt) & -!dbg ,' delks(npt)=',delks(npt) & -!dbg ,' delks1(npt)=',delks1(npt) - -! -! --- integrate to get PE in the trial layer. -! --- Need the first layer where PE>EK - as soon as -! --- IDXZB is not 0 we have a hit and Zb is found. -! - DO I = 1, npt - J = ipt(i) - -!dbg -!dbg if (lprnt) print *,'k phiang u1(j,k) v1(j,k) theta(j)' & -!dbg ,' ang(i,k) uds(i,k) pe(i) up(i) ek(i)' - - DO K = iwklm(I), 1, -1 - PHIANG = RAD_TO_DEG*atan2(V1(J,K),U1(J,K)) - ANG(I,K) = ( THETA(J) - PHIANG ) - if ( ANG(I,K) .gt. 90. ) ANG(I,K) = ANG(I,K) - 180. - if ( ANG(I,K) .lt. -90. ) ANG(I,K) = ANG(I,K) + 180. -! -!dbg UDS(I,K) = & - UDS(I,K) = rcs* & - & MAX(SQRT(U1(J,K)*U1(J,K) + V1(J,K)*V1(J,K)), minwnd) -! --- Test to see if we found Zb previously - IF (IDXZB(I) .eq. 0 ) then - PE(I) = PE(I) + BNV2lm(I,K) * & - & ( G * ELEVMX(J) - phil(J,K) ) * & - & ( PHII(J,K+1) - PHII(J,K) ) * ROG2 - -!dbg -!dbg & ( PHII(J,K+1) - PHII(J,K) ) / (G*G) -!dbg if (lprnt) print *, & -!dbg 'k=',k,' pe(i)=',pe(i),' bnv2lm(i,k)=',bnv2lm(i,k) & -!dbg ,' g=',g,' elevmx(j)=',elevmx(j) & -!dbg ,' g*elevmx(j)-phil(j,k)=',g*elevmx(j)-phil(j,k) & -!dbg ,' (phii(j,k+1)-phi(j,k))/(g*g)=',(PHII(J,K+1)-PHII(J,K) )*ROG2 - -! --- KE -! --- Wind projected on the line perpendicular to mtn range, U(Zb(K)). -! --- kinetic energy is at the layer Zb -! --- THETA ranges from -+90deg |_ to the mtn "largest topo variations" - UP(I) = UDS(I,K) * cos(DEG_TO_RAD*ANG(I,K)) - EK(I) = 0.5 * UP(I) * UP(I) - -! --- Dividing Stream lime is found when PE =exceeds EK. - IF ( PE(I) .ge. EK(I) ) IDXZB(I) = K -! --- Then mtn blocked flow is between Zb=k(IDXZB(I)) and surface -! - ENDIF !-- IF (IDXZB(I) .eq. 0 ) then - -!dbg -!dbg if (lprnt) write(6,"(i2,9e12.4)") & -!dbg k,phiang,u1(j,k),v1(j,k),theta(j),ang(i,k),uds(i,k),pe(i),up(i),ek(i) - - ENDDO !-- DO K = iwklm(I), 1, -1 - ENDDO !-- DO I = 1, npt -! - DO I = 1, npt - J = ipt(i) -! --- Calc if N constant in layers (Zb guess) - a diagnostic only. - ZBK(I) = ELEVMX(J) - SQRT(UBAR(I)**2 + VBAR(I)**2)/BNV2bar(I) - ENDDO -! - -!dbg -!dbg if (lprnt) print *,'iwklm=',iwklm(npt),' ZBK=',ZBK(npt) - -! -! --- The drag for mtn blocked flow -! - -!dbg -!dbg if (lprnt) print *,'k phil(j,k) g*hprime(j) ' & -!dbg ,'phil(j,idxzb(i))-phil(j,k) zlen r dbtmp db(i,k)' - -! - DO I = 1, npt - J = ipt(i) - ZLEN = 0. - IF ( IDXZB(I) .gt. 0 ) then - DO K = IDXZB(I), 1, -1 - IF (PHIL(J,IDXZB(I)) > PHIL(J,K)) THEN - ZLEN = SQRT( ( PHIL(J,IDXZB(I))-PHIL(J,K) ) / & - & ( PHIL(J,K ) + G * hprime(J) ) ) -! --- lm eq 14: - R = (cos(DEG_TO_RAD*ANG(I,K))**2 + GAMMA(J) * sin(DEG_TO_RAD*ANG(I,K))**2) / & - & (gamma(J) * cos(DEG_TO_RAD*ANG(I,K))**2 + sin(DEG_TO_RAD*ANG(I,K))**2) -! --- (negative of DB -- see sign at tendency) - DBTMP = 0.25 * CDmb * & - & MAX( 2. - 1. / R, HZERO ) * sigma(J) * & - & MAX(cos(DEG_TO_RAD*ANG(I,K)), gamma(J)*sin(DEG_TO_RAD*ANG(I,K))) * & - & ZLEN / hprime(J) - DB(I,K) = DBTMP * UDS(I,K) -! - -!dbg -!dbg if (lprnt) write(6,"(i3,7e12.4)") & -!dbg k,phil(j,k),g*hprime(j),phil(j,idxzb(i))-phil(j,k),zlen,r,dbtmp,db(i,k) - -! - ENDIF !-- IF (PHIL(J,IDXZB(I)) > PHIL(J,K) .AND. DEN > 0.) THEN - ENDDO !-- DO K = IDXZB(I), 1, -1 - endif - ENDDO !-- DO I = 1, npt -! -!............................. -!............................. -! end mtn blocking section -! - ENDIF !-- IF ( NMTVR .eq. 14) then -! -!............................. -!............................. -! - KMPBL = km / 2 ! maximum pbl height : # of vertical levels / 2 -! -! Scale cleff between IM=384*2 and 192*2 for T126/T170 and T62 -! - if (imx .gt. 0) then -! cleff = 1.0E-5 * SQRT(FLOAT(IMX)/384.0) ! this is inverse of CLEFF! -! cleff = 1.0E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF! - cleff = 0.5E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF! -! cleff = 2.0E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF! -! cleff = 2.5E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF! - endif - -!dbg -!dbg if (lprnt) print *,'imx, cleff, rcl, rcs=',imx,cleff,rcl,rcs -!dbg if (lprnt) print *,' k vtj vtk ro' - - DO K = 1,KM - DO I =1,npt - J = ipt(i) - VTJ(I,K) = T1(J,K) * (1.+FV*Q1(J,K)) - VTK(I,K) = VTJ(I,K) / PRSLK(J,K) - RO(I,K) = RDI * PRSL(J,K) / VTJ(I,K) ! DENSITY - TAUP(I,K) = 0.0 - -!dbg -!dbg if (lprnt) write(6,"(i2,3e12.4)") k,vtj(i,k),vtk(i,k),ro(i,k) !dbg - - ENDDO - ENDDO - -!dbg -!dbg if (lprnt) print *,' k ti tem rdz tem1' & -!dbg ,' tem2 dw2 shr2 bvf2 ri_n(i,k) bnv2(i,k)' - - DO K = 1,KMM1 - DO I =1,npt - J = ipt(i) - TI = 2.0 / (T1(J,K)+T1(J,K+1)) - TEM = TI / (PRSL(J,K)-PRSL(J,K+1)) -! RDZ = GOR * PRSI(J,K+1) * TEM - RDZ = g / (phil(j,k+1) - phil(j,k)) - TEM1 = U1(J,K) - U1(J,K+1) - TEM2 = V1(J,K) - V1(J,K+1) - -!dbg -! DW2 = TEM1*TEM1 + TEM2*TEM2 - DW2 = rcl*(TEM1*TEM1 + TEM2*TEM2) - - SHR2 = MAX(DW2,DW2MIN) * RDZ * RDZ - BVF2 = G*(GOCP+RDZ*(VTJ(I,K+1)-VTJ(I,K))) * TI - ri_n(I,K) = MAX(BVF2/SHR2,RIMIN) ! Richardson number -! Brunt-Vaisala Frequency -! TEM = GR2 * (PRSL(J,K)+PRSL(J,K+1)) * TEM -! BNV2(I,K) = TEM * (VTK(I,K+1)-VTK(I,K))/(VTK(I,K+1)+VTK(I,K)) - BNV2(I,K) = (G+G) * RDZ * (VTK(I,K+1)-VTK(I,K)) & - & / (VTK(I,K+1)+VTK(I,K)) - bnv2(i,k) = max( bnv2(i,k), bnv2min ) - -!dbg -!dbg if (lprnt) write(6,"(i2,10e12.4)") & -!dbg k,ti,tem,rdz,tem1,tem2,dw2,shr2,bvf2,ri_n(i,k),bnv2(i,k) - -! - ENDDO !-- DO K = 1,KMM1 - ENDDO !-- DO I =1,npt -! - -!dbg -!dbg if (lprnt) print *,'kmm1,bnv2=',kmm1,bnv2(npt,kmm1) - -! -! Apply 3 point smoothing on BNV2 -! -! do k=1,km -! do i=1,im -! vtk(i,k) = bnv2(i,k) -! enddo -! enddo -! do k=2,kmm1 -! do i=1,im -! bnv2(i,k) = 0.25*(vtk(i,k-1)+vtk(i,k+1)) + 0.5*vtk(i,k) -! enddo -! enddo -! -! Finding the first interface index above 50 hPa level -! - do i=1,npt - iwk(i) = 2 - enddo - -!dbg if (lprnt) print *,'kmpbl=',kmpbl !dbg - - DO K=3,KMPBL - DO I=1,npt - j = ipt(i) - tem = (prsi(j,1) - prsi(j,k)) - if (tem .lt. dpmin) iwk(i) = k - enddo - enddo -! - KBPS = 1 - KMPS = KM - DO I=1,npt - J = ipt(i) - kref(I) = MAX(IWK(I), KPBL(J)+1 ) ! reference level - DELKS(I) = 1.0 / (PRSI(J,1) - PRSI(J,kref(I))) - DELKS1(I) = 1.0 / (PRSL(J,1) - PRSL(J,kref(I))) - UBAR (I) = 0.0 - VBAR (I) = 0.0 - ROLL (I) = 0.0 - KBPS = MAX(KBPS, kref(I)) - KMPS = MIN(KMPS, kref(I)) -! - BNV2bar(I) = (PRSL(J,1)-PRSL(J,2)) * DELKS1(I) * BNV2(I,1) - ENDDO -! -! - KBPSP1 = KBPS + 1 - KBPSM1 = KBPS - 1 - DO K = 1,KBPS - DO I = 1,npt - IF (K .LT. kref(I)) THEN - J = ipt(i) - RDELKS = DEL(J,K) * DELKS(I) - -!dbg -! UBAR(I) = UBAR(I) + RDELKS * U1(J,K) ! Mean U below kref -! VBAR(I) = VBAR(I) + RDELKS * V1(J,K) ! Mean V below kref - RCSKS = RCS * RDELKS - UBAR(I) = UBAR(I) + RCSKS * U1(J,K) ! Mean U below kref - VBAR(I) = VBAR(I) + RCSKS * V1(J,K) ! Mean V below kref - -! - ROLL(I) = ROLL(I) + RDELKS * RO(I,K) ! Mean RO below kref - RDELKS = (PRSL(J,K)-PRSL(J,K+1)) * DELKS1(I) - BNV2bar(I) = BNV2bar(I) + BNV2(I,K) * RDELKS - ENDIF - ENDDO - ENDDO -! - -!dbg -!dbg if(lprnt) print *,'ubar(npt)=',ubar(npt) & -!dbg ,' vbar(npt)=',vbar(npt),' roll(npt)=',roll(npt) & -!dbg ,' bnv2bar(npt)=',bnv2bar(npt) - -! -! FIGURE OUT LOW-LEVEL HORIZONTAL WIND DIRECTION AND FIND 'OA' -! -! NWD 1 2 3 4 5 6 7 8 -! WD W S SW NW E N NE SE -! - DO I = 1,npt - J = ipt(i) - wdir = atan2(UBAR(I),VBAR(I)) + pi - idir = mod(nint(fdir*wdir),mdir) + 1 - nwd = nwdir(idir) - OA(I) = (1-2*INT( (NWD-1)/4 )) * OA4(J,MOD(NWD-1,4)+1) - CLX(I) = CLX4(J,MOD(NWD-1,4)+1) - ENDDO -! -!-----XN,YN "LOW-LEVEL" WIND PROJECTIONS IN ZONAL -! & MERIDIONAL DIRECTIONS -!-----ULOW "LOW-LEVEL" WIND MAGNITUDE - (= U) -!-----BNV2 BNV2 = N**2 -!-----TAUB BASE MOMENTUM FLUX -!-----= -(RO * U**3/(N*XL)*GF(FR) FOR N**2 > 0 -!-----= 0. FOR N**2 < 0 -!-----FR FROUDE = N*HPRIME / U -!-----G GMAX*FR**2/(FR**2+CG/OC) -! -!-----INITIALIZE SOME ARRAYS -! - DO I = 1,npt - XN(I) = 0.0 - YN(I) = 0.0 - TAUB (I) = 0.0 - ULOW (I) = 0.0 - DTFAC(I) = 1.0 - ICRILV(I) = .FALSE. ! INITIALIZE CRITICAL LEVEL CONTROL VECTOR -! -!----COMPUTE THE "LOW LEVEL" WIND MAGNITUDE (M/S) -! - ULOW(I) = MAX(SQRT(UBAR(I)*UBAR(I) + VBAR(I)*VBAR(I)), HONE) - ULOI(I) = 1.0 / ULOW(I) - ENDDO - -!dbg -!dbg if (lprnt) print *,'idir,nwd,wdir,oa,clx,ulow,uloi=' & -!dbg ,idir,nwd,wdir,oa(npt),clx(npt),ulow(npt),uloi(npt) - -! - DO K = 1,KMM1 - DO I = 1,npt - J = ipt(i) - -!dbg -! VELCO(I,K) = 0.5* ((U1(J,K)+U1(J,K+1))*UBAR(I) & - VELCO(I,K) = 0.5*rcs*((U1(J,K)+U1(J,K+1))*UBAR(I) & - & + (V1(J,K)+V1(J,K+1))*VBAR(I)) - - VELCO(I,K) = VELCO(I,K) * ULOI(I) - -!dbg if (lprnt) write(6,"(a,i2,a,e12.4)") 'k=',k,' velco(i,k)=',velco(i,k) !dbg - -! IF ((VELCO(I,K).LT.VELEPS) .AND. (VELCO(I,K).GT.0.)) THEN -! VELCO(I,K) = VELEPS -! ENDIF - ENDDO - ENDDO -! -! find the interface level of the projected wind where -! low levels & upper levels meet above pbl -! - do i=1,npt - kint(i) = km - enddo - do k = 1,kmm1 - do i = 1,npt - IF (K .GT. kref(I)) THEN - if(velco(i,k) .lt. veleps .and. kint(i) .eq. km) then - kint(i) = k+1 - endif - endif - enddo - enddo -! WARNING KINT = KREF !!!!!!!!! - do i=1,npt - kint(i) = kref(i) - enddo -! -! - DO I = 1,npt - J = ipt(i) - BNV = SQRT( BNV2bar(I) ) - FR = BNV * ULOI(I) * min(HPRIME(J),hpmax) - FR = MIN(FR, FRMAX) - XN(I) = UBAR(I) * ULOI(I) - YN(I) = VBAR(I) * ULOI(I) -! -! Compute the base level stress and store it in TAUB -! CALCULATE ENHANCEMENT FACTOR, NUMBER OF MOUNTAINS & ASPECT -! RATIO CONST. USE SIMPLIFIED RELATIONSHIP BETWEEN STANDARD -! DEVIATION & CRITICAL HGT -! - EFACT = (OA(I) + 2.) ** (CEOFRC*FR) - EFACT = MIN( MAX(EFACT,EFMIN), EFMAX ) -! - COEFM = (1. + CLX(I)) ** (OA(I)+1.) -! - XLINV(I) = COEFM * CLEFF -! - TEM = FR * FR * OC(J) - GFOBNV = GMAX * TEM / ((TEM + CG)*BNV) ! G/N0 -! - TAUB(I) = XLINV(I) * ROLL(I) * ULOW(I) * ULOW(I) & - & * ULOW(I) * GFOBNV * EFACT ! BASE FLUX Tau0 -! -! tem = min(HPRIME(I),hpmax) -! TAUB(I) = XLINV(I) * ROLL(I) * ULOW(I) * BNV * tem * tem -! - K = MAX(1, kref(I)-1) - TEM = MAX(VELCO(I,K)*VELCO(I,K), HE_4) - SCOR(I) = BNV2(I,K) / TEM ! Scorer parameter below ref level - ENDDO !-- DO I = 1,npt -! - -!dbg -!dbg if (lprnt) write(6,"(a,i2,10(a,e12.4))") & -!dbg 'kint=',kint(npt),' bnv=',bnv,' fr=',fr,' xn=',xn(npt) & -!dbg ,' yn=',yn(npt),' efact=',efact,' coefm=',coefm,' xlinv(npt)=',xlinv(npt) & -!dbg ,' gfobnv=',gfobnv,' taub(npt)=',taub(npt),' scor(npt)=',scor(npt) - -! -!----SET UP BOTTOM VALUES OF STRESS -! - DO K = 1, KBPS - DO I = 1,npt - IF (K .LE. kref(I)) TAUP(I,K) = TAUB(I) - ENDDO - ENDDO - -! -! Now compute vertical structure of the stress. -! - DO K = KMPS, KMM1 ! Vertical Level K Loop! - KP1 = K + 1 - DO I = 1, npt -! -!-----UNSTABLE LAYER IF RI < RIC -!-----UNSTABLE LAYER IF UPPER AIR VEL COMP ALONG SURF VEL <=0 (CRIT LAY) -!---- AT (U-C)=0. CRIT LAYER EXISTS AND BIT VECTOR SHOULD BE SET (.LE.) -! - IF (K .GE. kref(I)) THEN - ICRILV(I) = ICRILV(I) .OR. ( ri_n(I,K) .LT. RIC) & - & .OR. (VELCO(I,K) .LE. 0.0) - ENDIF - ENDDO -! - DO I = 1,npt - IF (K .GE. kref(I)) THEN - -!dbg -!dbg if (lprnt) write(6,"(2(a,i2),a,L1,3(a,e12.4))") 'k=',k,' kref(i)=',kref(i) & -!dbg ,' icrilv(i)=',icrilv(i),' taup(i,k)=',taup(i,k) & -!dbg ,' ri_n(i,k)=',ri_n(i,k),' velco(i,k)=',velco(i,k) - -! - IF (.NOT.ICRILV(I) .AND. TAUP(I,K) .GT. 0.0 ) THEN - TEMV = 1.0 / max(VELCO(I,K), HE_2) -! IF (OA(I) .GT. 0. .AND. PRSI(ipt(i),KP1).GT.RLOLEV) THEN - IF (OA(I).GT.0. .AND. kp1 .lt. kint(i)) THEN - SCORK = BNV2(I,K) * TEMV * TEMV - RSCOR = MIN(HONE, SCORK / SCOR(I)) - SCOR(I) = SCORK - ELSE - RSCOR = 1. - ENDIF -! - BRVF = SQRT(BNV2(I,K)) ! Brunt-Vaisala Frequency -! TEM1 = XLINV(I)*(RO(I,KP1)+RO(I,K))*BRVF*VELCO(I,K)*0.5 - TEM1 = XLINV(I)*(RO(I,KP1)+RO(I,K))*BRVF*0.5 & - & * max(VELCO(I,K),HE_2) - HD = SQRT(TAUP(I,K) / TEM1) - FRO = BRVF * HD * TEMV -! -! RIM is the MINIMUM-RICHARDSON NUMBER BY SHUTTS (1985) -! - TEM2 = SQRT(ri_n(I,K)) - TEM = 1. + TEM2 * FRO - RIM = ri_n(I,K) * (1.-FRO) / (TEM * TEM) -! -! CHECK STABILITY TO EMPLOY THE SATURATION HYPOTHESIS -! OF LINDZEN (1981) EXCEPT AT TROPOSPHERIC DOWNSTREAM REGIONS -! -! ---------------------- - -!dbg -!dbg if (lprnt) write(6,"(a,i2,10(a,e12.4))") & -!dbg 'k=',k,' brvf=',brvf,' tem1=',tem1,' xlinv(i)=',xlinv(i) & -!dbg ,'ROavg=',.5*(RO(I,KP1)+RO(I,K)),' hd=',hd,' temv=',temv,' fro=',fro & -!dbg ,' tem2=',tem2,' tem=',tem,' rim=',rim - -! - IF (RIM .LE. RIC .AND. & -! & (OA(I) .LE. 0. .OR. PRSI(ipt(I),KP1).LE.RLOLEV )) THEN - & (OA(I) .LE. 0. .OR. kp1 .ge. kint(i) )) THEN - TEMC = 2.0 + 1.0 / TEM2 - HD = VELCO(I,K) * (2.*SQRT(TEMC)-TEMC) / BRVF - TAUP(I,KP1) = TEM1 * HD * HD - ELSE - TAUP(I,KP1) = TAUP(I,K) * RSCOR - ENDIF - taup(i,kp1) = min(taup(i,kp1), taup(i,k)) - -!dbg -!dbg if (lprnt) write(6,"(a,i2,2(a,e12.4))") 'kp1=',kp1 & -!dbg ,' taup(i,kp1)=',taup(i,kp1),' taup(i,k)=',taup(i,k) - - ENDIF !-- IF (.NOT.ICRILV(I) .AND. TAUP(I,K) .GT. 0.0 ) THEN - ENDIF !-- IF (K .GE. kref(I)) THEN - ENDDO !-- DO I = 1,npt - ENDDO !-- DO K = KMPS, KMM1 -! -! DO I=1,IM -! taup(i,km+1) = taup(i,km) -! ENDDO -! - IF(LCAP .LE. KM) THEN - -!dbg if (lprnt) print *,'lcap,lcapp1,km=',lcap,lcapp1,km !dbg - - DO KLCAP = LCAPP1, KM+1 - DO I = 1,npt - SIRA = PRSI(ipt(I),KLCAP) / PRSI(ipt(I),LCAP) - TAUP(I,KLCAP) = SIRA * TAUP(I,LCAP) - -!dbg -!dbg if (lprnt) write(6,"(a,i2,5(a,e12.4))") & -!dbg 'klcap=',klcap,' sira=',sira,' prsi(ipt(i),klcap)=', prsi(ipt(i),klcap) & -!dbg ,' prsi(ipt(i),lcap)=',prsi(ipt(i),lcap),' taup(i,lcap)=',taup(i,lcap) & -!dbg ,' taup(i,klcap)=',taup(i,klcap) - -! - ENDDO - ENDDO - ENDIF -! -! Calculate - (g/p*)*d(tau)/d(sigma) and Decel terms DTAUX, DTAUY -! - DO I=1,npt -! SCOR(I) = 1.0 / PSTAR(I) - -!dbg -! SCOR(I) = 1.0 - SCOR(I) = 1.0/RCS - - ENDDO - DO K = 1,KM - DO I = 1,npt - TAUD(I,K) = G * (TAUP(I,K+1) - TAUP(I,K)) * SCOR(I) & - & / DEL(ipt(I),K) - -!dbg -!dbg if (lprnt) write(6,"(a,i2,4(a,e12.4))") 'k=',k,' taud(i,k)=',taud(i,k) & -!dbg ,' D(taup)=',TAUP(I,K+1)-TAUP(I,K),' del(ipt(i),k)=',del(ipt(i),k) & -!dbg ,' scor(i)=',scor(i) - - ENDDO - ENDDO - -! -!------LIMIT DE-ACCELERATION (MOMENTUM DEPOSITION ) AT TOP TO 1/2 VALUE -!------THE IDEA IS SOME STUFF MUST GO OUT THE TOP -! - DO KLCAP = LCAP, KM - DO I = 1,npt - TAUD(I,KLCAP) = TAUD(I,KLCAP) * FACTOP - -!dbg -!dbg if (lprnt) write(6,"(a,i2,a,e12.4)") 'klcap=',klcap,' taud(i,klcap)=',taud(i,klcap) - - ENDDO - ENDDO -! -!------IF THE GRAVITY WAVE DRAG WOULD FORCE A CRITICAL LINE IN THE -!------LAYERS BELOW SIGMA=RLOLEV DURING THE NEXT DELTIM TIMESTEP, -!------THEN ONLY APPLY DRAG UNTIL THAT CRITICAL LINE IS REACHED. -! - DO K = 1,KMM1 - DO I = 1,npt - IF (K .GT. kref(I) .and. PRSI(ipt(i),K) .GE. RLOLEV) THEN - IF(TAUD(I,K).NE.0.) THEN - -!dbg -! TEM = DELTIM * TAUD(I,K) - TEM = rcs*DELTIM * TAUD(I,K) - - DTFAC(I) = MIN(DTFAC(I),ABS(VELCO(I,K)/TEM)) - -!dbg -!dbg if (lprnt) write(6,"(a,i2,2(a,e12.4))") 'k=',k & -!dbg ,' tem=',tem,' dtfac(i)=',dtfac(i) - - ENDIF - ENDIF - ENDDO - ENDDO -! if(lprnt .and. npr .gt. 0) then -! print *, before A=,A(npr,:) -! print *, before B=,B(npr,:) -! endif -! - -!dbg -!dbg if (lprnt) write(6,"(a,i2,3(a,e12.4))") 'idxzb(npt)=',idxzb(npt) & -!dbg ,' dtfac=',dtfac(npt),' xn=',xn(npt),' yn=',yn(npt) - -! - DO K = 1,KM - DO I = 1,npt - J = ipt(i) - TAUD(I,K) = TAUD(I,K) * DTFAC(I) - DTAUX = TAUD(I,K) * XN(I) - DTAUY = TAUD(I,K) * YN(I) -! --- lm mb (*j*) changes overwrite GWD - if ( K .lt. IDXZB(I) .AND. IDXZB(I) .ne. 0 ) then - DBIM = DB(I,K) / (1.+ abs(DB(I,K))*DELTIM) - A(J,K) = - DBIM * V1(J,K) + A(J,K) - B(J,K) = - DBIM * U1(J,K) + B(J,K) - DUsfc(J) = DUsfc(J) - DBIM * V1(J,K) * DEL(J,K) - DVsfc(J) = DVsfc(J) - DBIM * U1(J,K) * DEL(J,K) - -!dbg -!dbg if (lprnt .and. dbim > 0.) write(6,"(a,i2,4(a,e12.4))") & -!dbg 'k=',k,' db(i,k)=',db(i,k),' dbim=',dbim & -!dbg ,' dudt=',-dbim*u1(j,k),' dvdt=',-dbim*v1(j,k) - -! - else -! - A(J,K) = DTAUY + A(J,K) - B(J,K) = DTAUX + B(J,K) - DUsfc(J) = DUsfc(J) + DTAUX * DEL(J,K) - DVsfc(J) = DVsfc(J) + DTAUY * DEL(J,K) - -!dbg -!dbg if (lprnt .and. dtaux+dtauy/=0.) write(6,"(a,i2,2(a,e12.4))") & -!dbg ',k=',k,' dudt=dtaux=',dtaux,' dvdt=dtauy=',dtauy - - endif - -!dbg -!dbg if (lprnt) write(6,"(a,i2,2(a,e12.4))") 'k=',k & -!dbg ,' dusfc(j)=',dusfc(j),' dvsfc(j)=',dvsfc(j) - - ENDDO !-- DO I = 1,npt - ENDDO !-- DO K = 1,KM -! if (lprnt) then -! print *, in gwdps_lm.f after A=,A(ipr,:) -! print *, in gwdps_lm.f after B=,B(ipr,:) -! print *, DB=,DB(ipr,:) -! endif - DO I = 1,npt - J = ipt(i) -! TEM = (-1.E3/G) * PSTAR(I) - -!dbg -! TEM = -1.E3/G - TEM = -1.E3*ROG*rcs - DUsfc(J) = TEM * DUsfc(J) - DVsfc(J) = TEM * DVsfc(J) - -!dbg -!dbg if (lprnt .and. i.eq.npr) write(6,"(3(a,e12.4))") 'tem=',tem & -!dbg ,' dusfc(j)=',dusfc(j),' dvsfc(j)=',dvsfc(j) - - ENDDO -! - END SUBROUTINE GWD_col -! -!####################################################################### -! - END MODULE module_gwd diff --git a/dyn_nmm/module_HIFREQ.F b/dyn_nmm/module_HIFREQ.F deleted file mode 100644 index d198ac67e2..0000000000 --- a/dyn_nmm/module_HIFREQ.F +++ /dev/null @@ -1,387 +0,0 @@ -module module_HIFREQ - -#if ( HWRF == 1 ) - ! This module implements the high-frequency output requested by the - ! National Hurricane Center in 2010. The hifreq_write routine will - ! write a file that contains max. 10m wind, min. MSLP, their locations, - ! and the nest center location once per timestep. The hifreq_read - ! routine is a sample routine for reading that output. The hifreq_open - ! routine is a convenience routine that can generate a nice-looking - ! filename using WRF filename generation routines. - - !------------------------------------------------------------------------------------------------------ - - private - public HIFREQ_WRITE, HIFREQ_READ, HIFREQ_OPEN - -#if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) ) - include 'mpif.h' -#else - integer, parameter :: MPI_UNDEFINED = -1 -#endif - - -CONTAINS - - !---------------------------------------------------------------------------------- - ! These two simple routines return an N, S, E or W for the hemisphere of - ! a latitude or longitude: - - character(1) function get_lat_ns(lat) - implicit none ; real lat - if(lat>=0) then - get_lat_ns='N' - else - get_lat_ns='S' - endif - end function get_lat_ns - character(1) function get_lon_ew(lon) - implicit none ; real lon - if(lon>=0) then - get_lon_ew='E' - else - get_lon_ew='W' - endif - end function get_lon_ew - - - !------------------------------------------------------------------------------------------------------ - ! - SUBROUTINE HIFREQ_READ(LUN,mingbl_mslp,maxgbl_wind,plat,plon,wlat,wlon,clat,clon,tm,ierr) - !********************************************************************** - !$$$ SUBPROGRAM DOCUMENTATION BLOCK - ! . . . - ! PRGRMMR: Sam Trahan - ! - ! ABSTRACT: - ! Call this routine to write one line to read in the values - ! written out by hifreq_write. Call this routine repeatedly - ! to retrieve all lines. - ! - ! PROGRAM HISTORY LOG: - ! 05-2011 : Sam Trahan - ! - ! ATTRIBUTES: - ! LANGUAGE: FORTRAN 90 - ! MACHINE : IBM SP - ! - ! INPUT ARGUMENTS: - ! LUN -- logical unit to read from - ! - ! OUTPUT ARGUMENTS: - ! IERR -- 0 on success, 1 on error (integer) - ! TM -- forecast second (real) - ! MINGBL_MSLP -- min. MSLP in mbar (real) - ! MAXGBL_MSLP -- max. 10m wind in knots (real) - ! plat, plon -- lat & lon of MSLP minimum (degrees, real) - ! wlat, wlon -- lat & lon of wind maximum (degrees, real) - ! clat, clon -- lat & lon of nest center (degrees, real) - !$$$ - !********************************************************************** - ! - implicit none - real, intent(out) :: MINGBL_MSLP, MAXGBL_WIND - real, intent(out) :: plat, plon - real, intent(out) :: wlat, wlon - real, intent(out) :: clat, clon - real, intent(out) :: tm - integer, intent(in) :: lun - integer, intent(out) :: ierr - character*1 :: pns,pew,wns,wew,cns,cew - - ierr=0 - -3131 format(F11.2,", ", & - F9.4,", ",F6.3,A1,", ",F7.3,A1,", ", & - F7.3,", ",F6.3,A1,", ",F7.3,A1,", ", & - F6.3,A1,", ",F7.3,A1) - read(lun,3131,err=3132) tm, & - MINGBL_MSLP,plat,pns,plon,pew, & - MAXGBL_WIND,wlat,wns,wlon,wew, & - clat,cns,clon,cew - - if(pns == 'S') plat=-plat - if(pew == 'W') plon=-plon - if(wns == 'S') wlat=-wlat - if(wew == 'W') wlon=-wlon - if(cns == 'S') clat=-clat - if(cew == 'W') clon=-clon - - return -3132 continue ! I/O error or end of file. - ierr=1 - END SUBROUTINE HIFREQ_READ - - - SUBROUTINE HIFREQ_WRITE (LUN,NTSD,DT,HLAT,HLON & - ,U10,V10,PINT,T,Q & - ,FIS,PD,PDTOP & - ,DETA1,DETA2 & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE ) - - !********************************************************************** - !$$$ SUBPROGRAM DOCUMENTATION BLOCK - ! . . . - ! PRGRMMR: Original by Young Kwon, modified by Sam Trahan - ! - ! ABSTRACT: - ! Call this routine to write one line to the given LUN, - ! containing the minimum MSLP, max 10m wind, their locations, - ! and the nest center location. - ! PROGRAM HISTORY LOG: - ! 05-2011 : Young Kwon - ! 05-2011 : Sam Trahan -- Modified for efficiency, eliminated need - ! for an external parser script. - ! - ! ATTRIBUTES: - ! LANGUAGE: FORTRAN 90 - ! MACHINE : IBM SP - !$$$ - !********************************************************************** - ! -#ifdef DM_PARALLEL - USE MODULE_DM, only : wrf_dm_minloc_real, wrf_dm_maxloc_real, mytask, local_communicator -#endif - USE MODULE_NEST_UTIL, only : MSLP_DIAG - - IMPLICIT NONE - ! - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - INTEGER,INTENT(IN) :: NTSD, LUN - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE - ! - REAL, INTENT(IN) :: PDTOP, DT - REAL, DIMENSION(KMS:KME), INTENT(IN) :: DETA1,DETA2 - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD,HLAT,HLON - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: U10,V10 - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q - - !---------------------------------------------------------------------- - - REAL, DIMENSION(IMS:IME,JMS:JME) :: WIND10SQ, MSLP - - REAL :: MINGBL_MSLP, MAXGBL_WIND, ZDUM, PREF - REAL :: CLAT,CLON,PLAT,PLON,WLAT,WLON, WREF, HAVE_CEN - INTEGER :: IWIND,JWIND, IMSLP,JMSLP - INTEGER :: ICEN,JCEN,I,J,ITF,JTF,ierr,grank,myrank - REAL :: comm(6),reduced(6),bcast(4) - - !---------------------------------------------------------------------- - - ITF=MIN(ITE,IDE-1) - JTF=MIN(JTE,JDE-1) - - ! Get the MSLP and the square of the 10m wind: - WIND10SQ(its:itf,jts:jtf) = U10(its:itf,jts:jtf)**2+ & - V10(its:itf,jts:jtf)**2 - call MSLP_DIAG (MSLP,PINT,T,Q & - ,FIS,PD,DETA1,DETA2,PDTOP & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE ) - - ! Find the location of the wind & pressure extrema in this tile: - imslp=its; jmslp=jts - iwind=its; jwind=jts - - pref=MSLP(imslp,jmslp) ! min mslp - wref=WIND10SQ(iwind,jwind) ! max wind - do j=jts,jtf - do i=its,itf - if(MSLP(i,j) < pref) then - imslp=i ; jmslp=j - pref=MSLP(imslp,jmslp) - endif - if(WIND10SQ(i,j) > wref) then - iwind=i ; jwind=j - wref=WIND10SQ(iwind,jwind) - end if - enddo - enddo - MINGBL_MSLP=pref ; MAXGBL_WIND=sqrt(wref)/0.514444 - PLAT=HLAT(imslp,jmslp) ; WLAT=HLAT(iwind,jwind) - PLON=HLON(imslp,jmslp) ; WLON=HLON(iwind,jwind) - zdum=0 - - ! Get the center of the domain: - ICEN=(IDE-1)/2 - JCEN=(JDE-1)/2 - HAVE_CEN=0 - if(ICEN>=its .and. ICEN<=itf .and. JCEN>=jts .and. JCEN<=jtf) then - HAVE_CEN=1 - CLAT=HLAT(ICEN,JCEN) - CLON=HLON(ICEN,JCEN) - end if - -#ifdef DM_PARALLEL - ! Get grid-wide extrema: - call MPI_Comm_rank(local_communicator,myrank,ierr) - comm(1)=have_cen - comm(2)=myrank - comm(3)=-mingbl_mslp - comm(4)=myrank - comm(5)=maxgbl_wind - comm(6)=myrank - call MPI_Allreduce(comm,reduced,3,MPI_2REAL,MPI_MAXLOC,local_communicator,ierr) - - have_cen=reduced(1) - grank=reduced(2) - if(myrank==grank) then - bcast=(/ clat,clon,real(icen),real(jcen) /) - endif - call MPI_Bcast(bcast,4,MPI_REAL,grank,local_communicator,ierr) - if(myrank/=grank) then - clat=bcast(1) - clon=bcast(2) - icen=bcast(3) - jcen=bcast(4) - endif - - mingbl_mslp=-reduced(3) - grank=reduced(4) - if(myrank==grank) then - bcast=(/ plat,plon,real(imslp),real(jmslp) /) - endif - call MPI_Bcast(bcast,4,MPI_REAL,grank,local_communicator,ierr) - if(myrank/=grank) then - plat=bcast(1) - plon=bcast(2) - imslp=bcast(3) - jmslp=bcast(4) - endif - - maxgbl_wind=reduced(5) - grank=reduced(6) - if(myrank==grank) then - bcast=(/ wlat,wlon,real(iwind),real(jwind) /) - endif - call MPI_Bcast(bcast,4,MPI_REAL,grank,local_communicator,ierr) - if(myrank/=grank) then - wlat=bcast(1) - wlon=bcast(2) - iwind=bcast(3) - jwind=bcast(4) - endif -#endif - - ! Monitor process writes out values. - if(wrf_dm_on_monitor()) then - ! Write out in a standard format (use hifreq_read to read it): -1313 format(F11.2,", ", & - F8.3,", ",F6.3,A1,", ",F7.3,A1,", ", & - F7.3,", ",F6.3,A1,", ",F7.3,A1,", ", & - F6.3,A1,", ",F7.3,A1) - write(LUN,1313) & - dt*ntsd, & - MINGBL_MSLP/100,abs(plat),get_lat_ns(plat),abs(plon),get_lon_ew(plon), & - MAXGBL_WIND,abs(wlat),get_lat_ns(wlat),abs(wlon),get_lon_ew(wlon), & - abs(clat),get_lat_ns(clat),abs(clon),get_lon_ew(clon) - if(mod(ntsd,126)==125) then - ! bug fix for IBM: will not write unless a flush is done periodically - flush(lun) - endif - endif - RETURN - END SUBROUTINE hifreq_write - - - SUBROUTINE hifreq_open ( grid , config_flags, atcf ) - ! Driver layer - USE module_domain , ONLY : domain, domain_clock_get - USE module_configure , ONLY : grid_config_rec_type - - IMPLICIT NONE - - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - logical, intent(in), optional :: atcf - ! Arguments - TYPE(domain) :: grid - TYPE (grid_config_rec_type) , INTENT(IN) :: config_flags - - ! Local - CHARACTER*256 :: outname - INTEGER :: fid - LOGICAL :: opened - CHARACTER*80 :: timestr - - character*255 :: message - - integer, parameter :: unitbase = 93, giveup=unitbase+1000 - logical is_atcf - - INTERFACE - SUBROUTINE construct_filename2a( result , basename , fld1 , len1 , date_char ) - IMPLICIT NONE - CHARACTER*(*) :: result - CHARACTER*(*) :: basename - CHARACTER*(*) :: date_char - INTEGER , INTENT(IN) :: fld1 , len1 - END SUBROUTINE construct_filename2a - END INTERFACE - - if(present(atcf)) then - is_atcf=atcf - call wrf_message('hifreq open: is atcf') - else - is_atcf=.false. - call wrf_message('hifreq open: is not atcf') - endif - - CALL domain_clock_get( grid, current_timestr=timestr ) - if(is_atcf) then - CALL construct_filename2a ( outname ,config_flags%partial_atcf_outname, grid%id , 2 , timestr ) - else - CALL construct_filename2a ( outname ,config_flags%high_freq_outname, grid%id , 2 , timestr ) - endif - -#ifdef DM_PARALLEL - if(wrf_dm_on_monitor()) then -#endif - ! Find an unused unit number - fid = unitbase + grid%id - fid_loop:do while(fid <= giveup) - write(message,'("HIFREQ OPEN TRY FID = ",I0)') fid - call wrf_message(message) - inquire(unit=fid,opened=opened) - if(.not.opened) then - write(message,'("HIFREQ OPEN UNUSED!! ",I0)') fid - call wrf_message(message) - exit fid_loop - end if - fid=fid+1 - enddo fid_loop - if(fid>giveup) then - call wrf_error_fatal('Could not find an unused LUN in highfreq_open') - endif - - write(message,'("HIFREQ APPEND ",A1,A80,A1)') '"',trim(outname),'"' - call wrf_message(message) - open(unit=fid,file=trim(outname),position='append',form='formatted') - -308 format(A,' output unit is now ',I0) - if(is_atcf) then - grid%outatcf_lun=fid - write(message,308) 'Partial ATCF',grid%outatcf_lun - else - grid%hifreq_lun=fid - write(message,308) 'Partial ATCF',grid%outatcf_lun - endif - call wrf_message(message) -#ifdef DM_PARALLEL - else - if(is_atcf) then - grid%outatcf_lun=-99 ! must be non-zero but invalid - else - grid%hifreq_lun=-99 ! must be non-zero but invalid - endif - endif -#endif - END SUBROUTINE hifreq_open - -! only used by HWRF... -#endif -end module module_HIFREQ diff --git a/dyn_nmm/module_IGWAVE_ADJUST.F b/dyn_nmm/module_IGWAVE_ADJUST.F deleted file mode 100644 index 48a8a610c2..0000000000 --- a/dyn_nmm/module_IGWAVE_ADJUST.F +++ /dev/null @@ -1,1226 +0,0 @@ -!----------------------------------------------------------------------- -! -!NCEP_MESO:MODEL_LAYER: INERTIAL GRAVITY WAVE ADJUSTMENT -! -!----------------------------------------------------------------------- -#include "nmm_loop_basemacros.h" -#include "nmm_loop_macros.h" -#define DATA_CALLS_INCLUDED -!----------------------------------------------------------------------- -! - MODULE MODULE_IGWAVE_ADJUST -! -!----------------------------------------------------------------------- - USE MODULE_MODEL_CONSTANTS, only: R_d, p608 -! USE MODULE_EXCHANGE - USE MODULE_MPP,ONLY: MYPE - USE MODULE_WRF_ERROR -! USE MODULE_TIMERS ! this one creates a name conflict at compile time -!----------------------------------------------------------------------- -!*** -!*** SPECIFY THE NUMBER OF TIMES TO SMOOTH THE VERTICAL VELOCITY -!*** AND THE NUMBER OF ROWS FROM THE NORTHERN AND SOUTHERN EDGES -!*** OF THE GLOBAL DOMAIN BEYOND WHICH THE SMOOTHING DOES NOT GO -!*** FOR SUBROUTINE PDTE -! - INTEGER :: KSMUD=0,LNSDT=7 -! -!----------------------------------------------------------------------- -! - CONTAINS -! -!*********************************************************************** - SUBROUTINE PFDHT(NTSD,LAST_TIME,PT,DETA1,DETA2,PDTOP,RES,FIS & - & ,HYDRO,SIGMA,FIRST,DX,DY & - & ,HBM2,VBM2,VBM3 & - & ,FDIV,FCP,WPDAR,DFL,CPGFU,CPGFV & - & ,PD,PDSL,T,Q,U,V,CWM,OMGALF,PINT,DWDT & - & ,RTOP,DIV,FEW,FNS,FNE,FSE & - & ,IHE,IHW,IVE,IVW & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: PFDHT DIVERGENCE/HORIZONTAL OMEGA-ALPHA -! PRGRMMR: JANJIC ORG: W/NP22 DATE: 93-10-28 -! -! ABSTRACT: -! PFDHT CALCULATES THE PRESSURE GRADIENT FORCE, UPDATES THE -! VELOCITY COMPONENTS DUE TO THE EFFECT OF THE PRESSURE GRADIENT -! AND CORIOILS FORCES, COMPUTES THE DIVERGENCE INCLUDING THE -! MODIFICATION PREVENTING GRAVITY WAVE GRID SEPARATION, AND -! CALCULATES THE HORIZONTAL PART OF THE OMEGA-ALPHA TERM. -! (THE PART PROPORTIONAL TO THE ADVECTION OF MASS ALONG -! COORDINATE SURFACES). -! -! PROGRAM HISTORY LOG: -! 87-06-?? JANJIC - ORIGINATOR -! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL -! 96-03-29 BLACK - ADDED EXTERNAL EDGE -! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY -! 02-02-01 BLACK - REWRITTEN FOR WRF CODING STANDARDS -! 04-02-17 JANJIC - REMOVED UPDATE OF TEMPERATURE -! 04-11-23 BLACK - THREADED -! 05-12-09 BLACK - CONVERTED FROM IKJ TO IJK -! -! USAGE: CALL PFDHT FROM MAIN PROGRAM SOLVE_RUNSTREAM -! INPUT ARGUMENT LIST: -! -! OUTPUT ARGUMENT LIST: -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- - IMPLICIT NONE -!----------------------------------------------------------------------- - LOGICAL,INTENT(IN) :: FIRST,HYDRO - INTEGER,INTENT(IN) :: SIGMA -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER, DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW -! - INTEGER,INTENT(IN) :: NTSD - LOGICAL,INTENT(IN) :: LAST_TIME -! - REAL,INTENT(IN) :: CPGFV,DY,PDTOP,PT -! - REAL,DIMENSION(KMS:KME-1),INTENT(IN) :: DETA1,DETA2 -! - REAL,DIMENSION(KMS:KME),INTENT(IN) :: DFL -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: CPGFU,DX,FCP,FDIV & - & ,PD,FIS,RES,WPDAR & - & ,HBM2,VBM2,VBM3 -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: CWM,DWDT & - & ,Q,T -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PINT -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: DIV & - & ,OMGALF & - & ,RTOP,U,V -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(OUT) :: FEW,FNS & - & ,FNE,FSE -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: PDSL -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - INTEGER :: I,J,K -! - REAL :: SLP_STD=101300.0 -! - REAL :: APELP,DFI,DCNEK,DCSEK,DPFNEK,DPFSEK,DPNEK,DPSEK & - & ,EDIV,FIUP,PRSFRC,PVNEK,PVSEK,RTOPP,VM -! - REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: ADPDNE,ADPDSE & - & ,ADPDX,ADPDY,APEL & - & ,CNE,CSE,DFDZ,DPDE & - & ,DPFEW,DPFNS & - & ,FILO,FIM,HM & - & ,PCEW,PCNE,PCNS,PCSE & - & ,PCXC,PEW,PNE,PNS & - & ,PPNE,PPSE,PSE & - & ,RDPD,RDPDX,RDPDY & - & ,TEW,TNE,TNS,TSE & - & ,UDY,VDX -! -!----------------------------------------------------------------------- -!*********************************************************************** -! -! -! CSE CSE ------- 1 -! * * -! * * -! ******* * ******* * -! * * * * * * -! CNE * * CNE * * -! TEW----------OMGALF----------TEW ------- 0 -! CSE * * CSE * * -! * * * * * * -! ******* * ******* * -! * * -! * * -! CNE CNE ------- -1 -! -! -! -! -!*********************************************************************** -! -! CSE ------- 2 -! * -! * -! * -! * -! CNE*****TNS ------- 1 -! CSE | * -! | * -! | * -! | * -! | CNE -! OMGALF ------- 0 -! | CSE -! | * -! | * -! | * -! CNE | * -! CSE*****TNS ------- -1 -! * -! * -! * -! * -! CNE ------- -2 -! -!*********************************************************************** -!----------------------------------------------------------------------- -!*** PREPARATORY CALCULATIONS -!----------------------------------------------------------------------- -! call hpm_start('PFDHT') -! -!$omp parallel do - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - OMGALF(I,J,K)=0. - DIV(I,J,K)=0. - ENDDO - ENDDO - ENDDO -! -!$omp parallel do - DO J=JMS,JME - DO I=IMS,IME - PDSL(I,J)=0. - ENDDO - ENDDO -! -!$omp parallel do - DO J=JTS-5,JTE+5 - DO I=ITS-5,ITE+5 - ADPDNE(I,J)=0. - ADPDSE(I,J)=0. - ADPDX(I,J)=0. - ADPDY(I,J)=0. - APEL(I,J)=0. - CNE (I,J)=0. - CSE (I,J)=0. - DFDZ(I,J)=0. - DPDE(I,J)=0. - DPFEW(I,J)=0. - DPFNS(I,J)=0. - FILO(I,J)=0. - FIM (I,J)=0. - HM (I,J)=0. - PCEW(I,J)=0. - PCNE(I,J)=0. - PCNS(I,J)=0. - PCSE(I,J)=0. - PCXC(I,J)=0. - PEW (I,J)=0. - PNE (I,J)=0. - PNS (I,J)=0. - PPNE(I,J)=0. - PPSE(I,J)=0. - PSE (I,J)=0. - RDPD(I,J)=0. - RDPDX(I,J)=0. - RDPDY(I,J)=0. - TEW (I,J)=0. - TNE (I,J)=0. - TNS (I,J)=0. - TSE (I,J)=0. - UDY (I,J)=0. - VDX (I,J)=0. - ENDDO - ENDDO -! - IF(SIGMA==1)THEN -!$omp parallel do - DO J=MYJS_P4,MYJE_P4 - DO I=MYIS_P4,MYIE_P4 - FILO(I,J)=FIS(I,J) - PDSL(I,J)=PD(I,J) - ENDDO - ENDDO - ELSE -!$omp parallel do - DO J=MYJS_P4,MYJE_P4 - DO I=MYIS_P4,MYIE_P4 - FILO(I,J)=0.0 - PDSL(I,J)=RES(I,J)*PD(I,J) - ENDDO - ENDDO - ENDIF -! - PRSFRC=PDTOP/(SLP_STD-PT) -! -!----------------------------------------------------------------------- -! -!*** MAIN VERTICAL INTEGRATION LOOP -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(adpdne,adpdse,adpdx,adpdy, & -!$omp& apel,cne,cse,dcnek,dcsek,dfdz,dpde,dpfew,dpfnek, & -!$omp& dpfns,dpfsek,dpnek,ediv,few,fne,fns,fse,hm, & -!$omp& pcew,pcne,pcns,pcse,pcxc,pew,pne,pns,ppne,ppse, & -!$omp& pse,pvnek,pvsek,rdpd,rdpdx,rdpdy,tew,tne,tns,tse, & -!$omp& udy,vdx,vm) -!----------------------------------------------------------------------- -! - main_integration : DO K=KTS,KTE -! -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** INTEGRATE THE GEOPOTENTIAL -!----------------------------------------------------------------------- -! - DO J=MYJS_P4,MYJE_P4 - DO I=MYIS_P4,MYIE_P4 -! - HM(I,J)=HBM2(I,J) -! - APELP=(PINT(I,J,K+1)+PINT(I,J,K))*0.5 - RTOPP=(Q(I,J,K)*P608-CWM(I,J,K)+1.)*T(I,J,K)*R_D/APELP - DFI=RTOPP*(DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)) -! - APEL(I,J)=APELP - RTOP(I,J,K)=RTOPP - DFDZ(I,J)=RTOPP -! - FIUP=FILO(I,J)+DFI - FIM(I,J)=FILO(I,J)+FIUP -! if(i==154.and.j==096)then -! write(0,10281)k,q(i,j,k),cwm(i,j,k),t(i,j,k),apelp,pdsl(i,j) -10281 format(' k=',i2,' q=',z8,' cwm=',z8,' t=',z8,' apelp=',z8,' pdsl=',z8) -! endif - FILO(I,J)=FIUP -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - DO J=MYJS_P4,MYJE_P4 - DO I=MYIS_P4,MYIE_P4 - DPDE(I,J)=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J) - ENDDO - ENDDO -! - DO J=MYJS,MYJE - DO I=MYIS,MYIE - RDPD(I,J)=1./DPDE(I,J) - ENDDO - ENDDO -! - DO J=MYJS1_P3,MYJE1_P3 - DO I=MYIS_P3,MYIE_P3 - ADPDX(I,J)=DPDE(I+IVW(J),J)+DPDE(I+IVE(J),J) - ADPDY(I,J)=DPDE(I,J+1)+DPDE(I,J-1) - RDPDX(I,J)=1./ADPDX(I,J) - RDPDY(I,J)=1./ADPDY(I,J) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** DIAGONAL CONTRIBUTIONS TO PRESSURE GRADIENT FORCE -!----------------------------------------------------------------------- -! - DO J=MYJS_P3,MYJE1_P3 - DO I=MYIS_P3,MYIE_P3 - ADPDNE(I,J)=DPDE(I+IHE(J),J+1)+DPDE(I,J) - PNE(I,J)=(FIM (I+IHE(J),J+1)-FIM (I,J)) & - & *(DWDT(I+IHE(J),J+1,K)+DWDT(I,J,K)) - PPNE(I,J)=PNE(I,J)*ADPDNE(I,J) - CNE(I,J)=(DFDZ(I+IHE(J),J+1)+DFDZ(I,J))*2. & - & *(APEL(I+IHE(J),J+1)-APEL(I,J)) - PCNE(I,J)=CNE(I,J)*ADPDNE(I,J) - ENDDO - ENDDO -! - DO J=MYJS1_P3,MYJE_P3 - DO I=MYIS_P3,MYIE_P3 - ADPDSE(I,J)=DPDE(I+IHE(J),J-1)+DPDE(I,J) - PSE(I,J)=(FIM (I+IHE(J),J-1)-FIM (I,J)) & - & *(DWDT(I+IHE(J),J-1,K)+DWDT(I,J,K)) -! if(i==154.and.j==096.and.k==kte)then -! write(0,58391)PSE(I,J),FIM(I+IHE(J),J-1),FIM(I,J),DWDT(I+IHE(J),J-1,K),DWDT(I,J,K),ihe(j) -58391 format(' pse=',z8,' fim=',2(1x,z8),' dwdt=',2(1x,z8),' ihe=',i2) -! endif - PPSE(I,J)=PSE(I,J)*ADPDSE(I,J) - CSE(I,J)=(DFDZ(I+IHE(J),J-1)+DFDZ(I,J))*2. & - & *(APEL(I+IHE(J),J-1)-APEL(I,J)) - PCSE(I,J)=CSE(I,J)*ADPDSE(I,J) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** CONTINUITY EQUATION MODIFICATION -!----------------------------------------------------------------------- -! - DO J=MYJS1_P1,MYJE1_P1 - DO I=MYIS_P1,MYIE_P1 -! if(i==155.and.j==096.and.k==kte)then -! write(0,72451)PNE(I+IVW(J),J),PNE(I,J-1),PSE(I+IVW(J),J),PSE(I,J+1),ivw(j) -! write(0,72452)CNE(I+IVW(J),J),CNE(I,J-1),CSE(I+IVW(J),J),CSE(I,J+1) -72451 format(' pne=',2(1x,z8),' pse=',2(1x,z8),' ivw=',i2) -72452 format(' cne=',2(1x,z8),' cse=',2(1x,z8)) -! endif - PCXC(I,J)=VBM3(I,J)* & - & (PNE(I+IVW(J),J)+CNE(I+IVW(J),J) & - & +PSE(I+IVW(J),J)+CSE(I+IVW(J),J) & - & -PNE(I,J-1)-CNE(I,J-1) & - & -PSE(I,J+1)-CSE(I,J+1)) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 -! if(i==155.and.j==095.and.k==kte)then -! write(0,76501)deta1(k),deta2(k),prsfrc,wpdar(i,j),ihe(j),ihw(j) -! write(0,76502)PCXC(I+IHE(J),J),PCXC(I,J+1),PCXC(I+IHW(J),J),PCXC(I,J-1) -76501 format(' deta1=',z8,' deta2=',z8,' prsfrc=',z8,' wpdar=',z8,' ihe=',i2,' ihw=',i2) -76502 format(' pcxc=',4(1x,z8)) -! endif - DIV(I,J,K)=(DETA1(K)*PRSFRC & - & +DETA2(K)*(1.-PRSFRC))*WPDAR(I,J) & - & *(PCXC(I+IHE(J),J)-PCXC(I,J+1) & - & +PCXC(I+IHW(J),J)-PCXC(I,J-1)) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** LATITUDINAL AND LONGITUDINAL PRESSURE FORCE COMPONENTS -!----------------------------------------------------------------------- -! - DO J=MYJS1_P2,MYJE1_P2 - DO I=MYIS_P2,MYIE_P3 - DPNEK=PNE(I+IVW(J),J)+PNE(I,J-1) - DPSEK=PSE(I+IVW(J),J)+PSE(I,J+1) - PEW(I,J)=DPNEK+DPSEK - PNS(I,J)=DPNEK-DPSEK - DCNEK=CNE(I+IVW(J),J)+CNE(I,J-1) - DCSEK=CSE(I+IVW(J),J)+CSE(I,J+1) - PCEW(I,J)=(DCNEK+DCSEK)*ADPDX(I,J) - PCNS(I,J)=(DCNEK-DCSEK)*ADPDY(I,J) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - IF(.NOT.FIRST)THEN ! Skip at timestep 0 -! -!----------------------------------------------------------------------- -!*** UPDATE U AND V FOR PRESSURE GRADIENT FORCE -!----------------------------------------------------------------------- -! - DO J=MYJS2_P2,MYJE2_P2 - DO I=MYIS_P2,MYIE1_P2 - DPFNEK=((PPNE(I+IVW(J),J)+PPNE(I,J-1)) & - & +(PCNE(I+IVW(J),J)+PCNE(I,J-1))) - DPFNEK=DPFNEK+DPFNEK - DPFSEK=((PPSE(I+IVW(J),J)+PPSE(I,J+1)) & - & +(PCSE(I+IVW(J),J)+PCSE(I,J+1))) - DPFSEK=DPFSEK+DPFSEK - DPFEW(I,J)=DPFNEK+DPFSEK - DPFNS(I,J)=DPFNEK-DPFSEK - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - DO J=MYJS2_P3,MYJE2_P3 - DO I=MYIS_P2,MYIE1_P2 - VM=VBM2(I,J) - U(I,J,K)=(((DPFEW(I,J)+PCEW(I,J))*RDPDX(I,J) & - & +PEW(I,J))*CPGFU(I,J))*VM+U(I,J,K) - V(I,J,K)=(((DPFNS(I,J)+PCNS(I,J))*RDPDY(I,J) & - & +PNS(I,J))*CPGFV)*VM+V(I,J,K) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - ENDIF !End of IF block executed for FIRST equal to .FALSE. -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! - IF(.NOT.LAST_TIME)THEN !Do not execute block at last timestep -! -!----------------------------------------------------------------------- -!*** LATITUDINAL AND LONGITUDINAL FLUXES AND OMEGA-ALPHA COMPONENTS -!----------------------------------------------------------------------- -! - DO J=MYJS1_P2,MYJE1_P2 - DO I=MYIS_P2,MYIE_P3 - UDY(I,J)=DY*U(I,J,K) - FEW(I,J,K)=UDY(I,J)*ADPDX(I,J) - TEW(I,J)=UDY(I,J)*PCEW(I,J) - VDX(I,J)=DX(I,J)*V(I,J,K) -! if(i==178.and.j==003.and.k==53)then -! write(0,77601)udy(i,j),dy,u(i,j,k) -77601 format(' udy=',z8,' dy=',z8,' u=',z8) -! endif - FNS(I,J,K)=VDX(I,J)*ADPDY(I,J) - TNS(I,J)=VDX(I,J)*PCNS(I,J) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** DIAGONAL FLUXES AND DIAGONALLY AVERAGED WIND -!----------------------------------------------------------------------- -! - DO J=MYJS1_P1,MYJE2_P1 - DO I=MYIS_P1,MYIE1_P1 - PVNEK=(UDY(I+IHE(J),J)+VDX(I+IHE(J),J)) & - & +(UDY(I,J+1)+VDX(I,J+1)) - FNE(I,J,K)=PVNEK*ADPDNE(I,J) -! if(i==178.and.j==003.and.k==53)then -! write(0,33781)fne(i,j,k),dpde(i+ihe(j),j+1),dpde(i,j),ihe(j) -! write(0,33782)udy(i+ihe(j),j),udy(i,j+1),vdx(i+ihe(j),j),vdx(i,j+1) -33781 format(' fne=',z8,' dpdne=',2(1x,z8),' ihe=',i2) -33782 format(' udy=',2(1x,z8),' vdx=',2(1x,z8)) -! endif - TNE(I,J)=PVNEK*PCNE(I,J)*2. - ENDDO - ENDDO -! - DO J=MYJS2_P1,MYJE1_P1 - DO I=MYIS_P1,MYIE1_P1 - PVSEK=(UDY(I+IHE(J),J)-VDX(I+IHE(J),J)) & - & +(UDY(I,J-1)-VDX(I,J-1)) - FSE(I,J,K)=PVSEK*ADPDSE(I,J) - TSE(I,J)=PVSEK*PCSE(I,J)*2. - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** HORIZONTAL PART OF OMEGA-ALPHA & DIVERGENCE -!----------------------------------------------------------------------- -! - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - OMGALF(I,J,K)=(TEW(I+IHE(J),J)+TEW(I+IHW(J),J) & - & +TNS(I,J+1) +TNS(I,J-1) & - & +TNE(I,J) +TNE(I+IHW(J),J-1) & - & +TSE(I,J) +TSE(I+IHW(J),J+1)) & - & *RDPD(I,J)*FCP(I,J)*HM(I,J) -! -! if(i==178.and.j==003.and.k==53)then -! write(0,36311)div(i,j,k),fdiv(i,j),ihe(j),ihw(j) -! write(0,36312)FEW(I+IHE(J),J,K),FEW(I+IHW(J),J,K),FNS(I,J+1,K),FNS(I,J-1,K) -! write(0,36313)FNE(I,J,K),FNE(I+IHW(J),J-1,K),FSE(I,J,K),FSE(I+IHW(J),J+1,K) -36311 format(' PFDHT div=',z8,' fdiv=',z8,' ihe=',i2,' ihw=',i2) -36312 format(' few=',2(1x,z8),' fns=',2(1x,z8)) -36313 format(' fne=',2(1x,z8),' fse=',2(1x,z8)) -! endif - EDIV=(FEW(I+IHE(J),J,K) +FNS(I,J+1,K) & - +FNE(I,J,K) +FSE(I,J,K) & - -(FEW(I+IHW(J),J,K) +FNS(I,J-1,K) & - +FNE(I+IHW(J),J-1,K)+FSE(I+IHW(J),J+1,K)))*FDIV(I,J) -! - DIV(I,J,K)=(EDIV+DIV(I,J,K))*HM(I,J) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - ENDIF !End block to skip execution at last timestep -! -!----------------------------------------------------------------------- -! - ENDDO main_integration -! -!----------------------------------------------------------------------- -! call hpm_stop('PFDHT') -!----------------------------------------------------------------------- -! - END SUBROUTINE PFDHT -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- - SUBROUTINE PDTE( & -#ifdef DM_PARALLEL - & GRID,MYPE,MPI_COMM_COMP, & -#endif - & NTSD,DT,PT,ETA2,RES,HYDRO,HBM2 & - & ,PD,PDSL,PDSLO & - & ,PETDT,DIV,PSDT & - & ,IHE,IHW,IVE,IVW & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: PDTE SURFACE PRESSURE TENDENCY CALC -! PRGRMMR: JANJIC ORG: W/NP2 DATE: 96-07-?? -! -! ABSTRACT: -! PDTE VERTICALLY INTEGRATES THE MASS FLUX DIVERGENCE TO -! OBTAIN THE SURFACE PRESSURE TENDENCY AND VERTICAL VELOCITY ON -! THE LAYER INTERFACES. THEN IT UPDATES THE HYDROSTATIC SURFACE -! PRESSURE AND THE NONHYDROSTATIC PRESSURE. -! -! PROGRAM HISTORY LOG: -! 87-06-?? JANJIC - ORIGINATOR -! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL -! 96-05-?? JANJIC - ADDED NONHYDROSTATIC EFFECTS & MERGED THE -! PREVIOUS SUBROUTINES PDTE & PDNEW -! 00-01-03 BLACK - DISTRIBUTED MEMORY AND THREADS -! 01-02-23 BLACK - CONVERTED TO WRF FORMAT -! 01-04-11 BLACK - REWRITTEN FOR WRF CODING STANDARDS -! 04-02-17 JANJIC - MOVED UPDATE OF T DUE TO OMEGA-ALPHA TERM -! AND UPDATE OF PINT TO NEW ROUTINE VTOA -! 04-11-23 BLACK - THREADED -! 05-12-09 BLACK - CONVERTED FROM IKJ TO IJK -! -! USAGE: CALL PDTE FROM SUBROUTINE SOLVE_RUNSTREAM -! INPUT ARGUMENT LIST: -! -! OUTPUT ARGUMENT LIST: -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!*********************************************************************** -#ifdef DM_PARALLEL - USE module_domain, ONLY: DOMAIN - USE MODULE_DM, ONLY : LOCAL_COMMUNICATOR & - ,MYTASK,NTASKS,NTASKS_X & - ,NTASKS_Y & - ,wrf_dm_sum_real & - ,wrf_dm_sum_integer - USE MODULE_COMM_DM, only: HALO_NMM_E_sub -#endif -!----------------------------------------------------------------------- - IMPLICIT NONE -!----------------------------------------------------------------------- -#ifdef DM_PARALLEL - TYPE (DOMAIN) :: GRID - INTEGER,INTENT(IN) :: MYPE,MPI_COMM_COMP -#endif -!----------------------------------------------------------------------- - LOGICAL,INTENT(IN) :: HYDRO -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW -! - INTEGER,INTENT(IN) :: NTSD -! - REAL,INTENT(IN) :: DT,PT -! - REAL,DIMENSION(KMS:KME),INTENT(IN) :: ETA2 -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: RES,HBM2 -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: DIV -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: PD,PDSL -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: PETDT -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: PDSLO,PSDT -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - INTEGER :: I,IHH,IHL,IX,J,JHH,JHL,JX,K,KS,NSMUD - INTEGER :: MY_IS_GLB,MY_IE_GLB,MY_JS_GLB,MY_JE_GLB - INTEGER :: LOC_NPTS, GLB_NPTS -#ifdef DM_PARALLEL - INTEGER :: IPS,IPE,JPS,JPE,KPS,KPE,IRET -#endif -!#ifdef DEREF_KLUDGE -!! SEE http://www.mmm.ucar.edu/wrf/WG2/topics/deref_kludge.htm -! INTEGER :: SM31,EM31,SM32,EM32,SM33,EM33 -! INTEGER :: SM31X,EM31X,SM32X,EM32X,SM33X,EM33X -! INTEGER :: SM31Y,EM31Y,SM32Y,EM32Y,SM33Y,EM33Y -!#endif -! - REAL :: PETDTL, TASK_CHANGE, GLOBAL_CHANGE, GLOBAL_CHANGE_WRF -! - REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: HBMS,PNE,PRET,PSE -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -!#include "deref_kludge.h" -! - DO J=JMS,JME - DO I=IMS,IME - PDSLO(I,J)=0. - ENDDO - ENDDO -! - MY_IS_GLB=ITS - MY_IE_GLB=ITE - MY_JS_GLB=JTS - MY_JE_GLB=JTE -! -!----------------------------------------------------------------------- -!*** VERTICALLY INTEGRATE THE HORIZONTAL DIVERGENCE -!----------------------------------------------------------------------- -! - - LOC_NPTS=0 - -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KTE-1,KTS,-1 - DO J=MYJS_P2,MYJE_P2 - DO I=MYIS_P2,MYIE_P2 - DIV(I,J,K)=DIV(I,J,K+1)+DIV(I,J,K) - if (K .eq. KTS) then - LOC_NPTS=LOC_NPTS+1 - endif - - ENDDO - ENDDO - ENDDO - -#ifdef DM_PARALLEL - GLB_NPTS=wrf_dm_sum_integer(LOC_NPTS) -#else - GLB_NPTS=LOC_NPTS -#endif - -! -!----------------------------------------------------------------------- -!*** COMPUTATION OF PRESSURE TENDENCY -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS_P2,MYJE_P2 - DO I=MYIS_P2,MYIE_P2 - PSDT(I,J)=-DIV(I,J,KTS) - PDSLO(I,J)=PDSL(I,J) - ENDDO - ENDDO -!----------------------------------------------------------------------- - DO J=JMS,JME - DO I=IMS,IME - PDSL(I,J)=0. - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(i,j) - - TASK_CHANGE=0. - - DO J=MYJS_P2,MYJE_P2 - DO I=MYIS_P2,MYIE_P2 - PD(I,J)=PSDT(I,J)*DT+PD(I,J) - PRET(I,J)=PSDT(I,J)*RES(I,J) - PDSL(I,J)=PD(I,J)*RES(I,J) - TASK_CHANGE=TASK_CHANGE+abs(PSDT(I,J)*108./DT) ! .01*10800/dt (hPa/3 h) - ENDDO - ENDDO - -#ifdef DM_PARALLEL - GLOBAL_CHANGE_WRF=wrf_dm_sum_real(TASK_CHANGE)/GLB_NPTS -#else - GLOBAL_CHANGE_WRF=TASK_CHANGE/GLB_NPTS -#endif - - grid%avgPchg=global_change_wrf - -! NOTE: These below messages are moved to frame/module_integrate.F, -! and are merged with the timing information. -#ifdef DM_PARALLEL - ! if ( MYPE == 0 ) then - ! write(wrf_err_message,*) 'avg global change (hPa/3h): ', GLOBAL_CHANGE_WRF - ! call wrf_debug(1,wrf_err_message) - ! endif -#else - ! write(wrf_err_message,*) 'avg global change (hPa/3h): ', GLOBAL_CHANGE_WRF - ! call wrf_debug(1,wrf_err_message) -#endif - -! -!----------------------------------------------------------------------- -!*** COMPUTATION OF PETDT -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KTE-1,KTS,-1 - DO J=MYJS_P2,MYJE_P2 - DO I=MYIS_P2,MYIE_P2 - PETDT(I,J,K)=-(PRET(I,J)*ETA2(K+1)+DIV(I,J,K+1)) & - & *HBM2(I,J) - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** SMOOTHING VERTICAL VELOCITY ALONG BOUNDARIES -!----------------------------------------------------------------------- -! - nonhydrostatic_smoothing: IF(.NOT.HYDRO.AND.KSMUD.GT.0)THEN -! - NSMUD=KSMUD -! - DO J=MYJS,MYJE - DO I=MYIS,MYIE - HBMS(I,J)=HBM2(I,J) - ENDDO - ENDDO -! - JHL=LNSDT - JHH=JDE-JHL+1 -! -!$omp parallel do & -!$omp& private(i,ihh,ihl,ix,j,jx) - DO J=JHL,JHH - IF(J.GE.MY_JS_GLB.AND.J.LE.MY_JE_GLB)THEN - IHL=JHL/2+1 - IHH=IDE-IHL+MOD(J,2) -! - DO I=IHL,IHH - IF(I.GE.MY_IS_GLB.AND.I.LE.MY_IE_GLB)THEN - IX=I ! -MY_IS_GLB+1 - JX=J ! -MY_JS_GLB+1 - HBMS(IX,JX)=0. - ENDIF - ENDDO -! - ENDIF - ENDDO -! -!----------------------------------------------------------------------- -!*** -!*** SMOOTH THE VERTICAL VELOCITY -!*** -!----------------------------------------------------------------------- -! - DO KS=1,NSMUD -! -!----------------------------------------------------------------------- -! -!*** PNE AT H(I,J) LIES BETWEEN (I,J) AND THE H POINT TO THE NE. -!*** PSE AT H(I,J) LIES BETWEEN (I,J) AND THE H POINT TO THE SE. -! -!$omp parallel do & -!$omp& private(i,j,k,petdtl,pne,pse) -! - DO K=KTS+1,KTE -! - DO J=MYJS_P1,MYJE1_P1 - DO I=MYIS_P1,MYIE1_P1 - PNE(I,J)=PETDT(I+IHE(J),J+1,K)-PETDT(I,J,K) - ENDDO - ENDDO -! - DO J=MYJS1_P1,MYJE_P1 - DO I=MYIS_P1,MYIE1_P1 - PSE(I,J)=PETDT(I+IHE(J),J-1,K)-PETDT(I,J,K) - ENDDO - ENDDO -! - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - PETDTL=(PNE(I,J)-PNE(I+IHW(J),J-1) & - & +PSE(I,J)-PSE(I+IHW(J),J+1))*HBM2(I,J) - PETDT(I,J,K)=PETDTL*HBMS(I,J)*0.125+PETDT(I,J,K) - ENDDO - ENDDO -! - ENDDO -! -#ifdef DM_PARALLEL -! IPS=ITS;IPE=ITE;JPS=JTS;JPE=JTE;KPS=KTS;KPE=KTE -# include "HALO_NMM_E.inc" -#endif -!----------------------------------------------------------------------- -! - ENDDO ! End of smoothing loop -! -!----------------------------------------------------------------------- -! - ENDIF nonhydrostatic_smoothing -! -!----------------------------------------------------------------------- -! - END SUBROUTINE PDTE -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- - SUBROUTINE VTOA( & - & NTSD,DT,PT,ETA2 & - & ,HBM2,EF4T & - & ,T,DWDT,RTOP,OMGALF & - & ,PINT,DIV,PSDT,RES & - & ,IHE,IHW,IVE,IVW & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: VTOA OMEGA-ALPHA -! PRGRMMR: JANJIC ORG: W/NP2 DATE: 04-02-17 -! -! ABSTRACT: -! VTOA UPDATES THE NONHYDROSTATIC PRESSURE AND ADDS THE -! CONTRIBUTION OF THE OMEGA-ALPHA TERM OF THE THERMODYNAMIC -! EQUATION. ALSO, THE OMEGA-ALPHA TERM IS COMPUTED FOR DIAGNOSTICS. -! -! PROGRAM HISTORY LOG: -! 04-02-17 JANJIC - SEPARATED FROM ORIGINAL PDTEDT ROUTINE -! 04-11-23 BLACK - THREADED -! - -! INPUT ARGUMENT LIST: -! -! OUTPUT ARGUMENT LIST: -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!*********************************************************************** -!----------------------------------------------------------------------- - IMPLICIT NONE - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW -! - INTEGER,INTENT(IN) :: NTSD -! - REAL,INTENT(IN) :: DT,EF4T,PT -! - REAL,DIMENSION(KMS:KME),INTENT(IN) :: ETA2 -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: HBM2,PSDT,RES -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: DIV,DWDT & - & ,RTOP -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: OMGALF,T -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: PINT -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - INTEGER :: I,J,K -! - REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: PRET,TPM -! - REAL :: DWDTP,RHS,TPMP -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -!*** PREPARATIONS -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS_P2,MYJE_P2 - DO I=MYIS_P2,MYIE_P2 - PINT(I,J,KTE+1)=PT - TPM(I,J)=PT+PINT(I,J,KTE) - PRET(I,J)=PSDT(I,J)*RES(I,J) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** KINETIC ENERGY GENERATION TERMS IN T EQUATION -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(dwdtp,i,j,rhs,tpmp) - DO J=MYJS,MYJE - DO I=MYIS,MYIE - DWDTP=DWDT(I,J,KTE) - TPMP=PINT(I,J,KTE)+PINT(I,J,KTE-1) -! - RHS=-DIV(I,J,KTE)*RTOP(I,J,KTE)*DWDTP*EF4T - OMGALF(I,J,KTE)=OMGALF(I,J,KTE)+RHS - T(I,J,KTE)=OMGALF(I,J,KTE)*HBM2(I,J)+T(I,J,KTE) - PINT(I,J,KTE)=PRET(I,J)*(ETA2(KTE+1)+ETA2(KTE))*DWDTP*DT & - & +TPM(I,J)-PINT(I,J,KTE+1) -! - TPM(I,J)=TPMP - ENDDO - ENDDO -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(dwdtp,i,j,k,rhs,tpmp) - DO K=KTE-1,KTS+1,-1 - DO J=MYJS,MYJE - DO I=MYIS,MYIE - DWDTP=DWDT(I,J,K) - TPMP=PINT(I,J,K)+PINT(I,J,K-1) -! - RHS=-(DIV(I,J,K+1)+DIV(I,J,K))*RTOP(I,J,K)*DWDTP*EF4T - OMGALF(I,J,K)=OMGALF(I,J,K)+RHS - T(I,J,K)=OMGALF(I,J,K)*HBM2(I,J)+T(I,J,K) - PINT(I,J,K)=PRET(I,J)*(ETA2(K+1)+ETA2(K))*DWDTP*DT & - & +TPM(I,J)-PINT(I,J,K+1) -! - TPM(I,J)=TPMP - ENDDO - ENDDO - ENDDO -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(dwdtp,i,j,rhs) - DO J=MYJS,MYJE - DO I=MYIS,MYIE -! - DWDTP=DWDT(I,J,KTS) -! -! if(i==77.and.j==53)then -! write(0,28361)t(i,j,kts),omgalf(i,j,kts),rtop(i,j,kts),dwdtp -! write(0,28362)div(i,j,kts),div(i,j,kts+1),ef4t -28361 format(' t=',z8,' omgalf=',z8,' rtop=',z8,' dwdtp=',z8) -28362 format(' div=',2(1x,z8),' ef4t=',z8) -! endif - RHS=-(DIV(I,J,KTS+1)+DIV(I,J,KTS))*RTOP(I,J,KTS)*DWDTP*EF4T - OMGALF(I,J,KTS)=OMGALF(I,J,KTS)+RHS - T(I,J,KTS)=OMGALF(I,J,KTS)*HBM2(I,J)+T(I,J,KTS) - PINT(I,J,KTS)=PRET(I,J)*(ETA2(KTS+1)+ETA2(KTS))*DWDTP*DT & - & +TPM(I,J)-PINT(I,J,KTS+1) - ENDDO - ENDDO -!----------------------------------------------------------------------- -! - END SUBROUTINE VTOA -! -!----------------------------------------------------------------------- -!*********************************************************************** - SUBROUTINE DDAMP(NTSD,DT,DETA1,DETA2,PDSL,PDTOP,DIV,HBM2 & - & ,T,U,V,DDMPU,DDMPV & - & ,IHE,IHW,IVE,IVW & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: DDAMP DIVERGENCE DAMPING -! PRGRMMR: JANJIC ORG: W/NP22 DATE: 94-03-08 -! -! ABSTRACT: -! DDAMP MODIFIES THE WIND COMPONENTS SO AS TO REDUCE THE -! HORIZONTAL DIVERGENCE. -! -! PROGRAM HISTORY LOG: -! 87-08-?? JANJIC - ORIGINATOR -! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL -! 95-03-28 BLACK - ADDED EXTERNAL EDGE -! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY -! 01-03-12 BLACK - CONVERTED TO WRF STRUCTURE -! 04-11-18 BLACK - THREADED -! 05-12-09 BLACK - CONVERTED FROM IKJ TO IJK -! -! USAGE: CALL DDAMP FROM SUBROUTINE SOLVE_RUNSTREAM -! -! INPUT ARGUMENT LIST: -! -! OUTPUT ARGUMENT LIST: -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!*********************************************************************** -!----------------------------------------------------------------------- - IMPLICIT NONE -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW -! - INTEGER,INTENT(IN) :: NTSD -! - REAL,INTENT(IN) :: DT,PDTOP -! - REAL,DIMENSION(KMS:KME-1),INTENT(IN) :: DETA1,DETA2 -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DDMPU,DDMPV & - & ,HBM2,PDSL -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: DIV,T & - & ,U,V -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - INTEGER :: I,J,K -! - REAL :: FCIM,FCXM,RDPDX,RDPDY -! - REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: DIVE,DPDE,PDE & - & ,XDIVX,XDIVY -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j) - DO J=JTS-5,JTE+5 - DO I=ITS-5,ITE+5 - PDE(I,J)=0. - DPDE(I,J)=0. - XDIVX(I,J)=0. - XDIVY(I,J)=0. - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - FCXM=1. -! -!$omp parallel do -!$omp& private(i,j) - DO J=MYJS_P2,MYJE_P2 - DO I=MYIS_P2,MYIE_P2 - PDE (I,J)=PDSL(I,J)+PDTOP - DIVE(I,J)=0. - ENDDO - ENDDO -! - DO K=KTS,KTE -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS_P2,MYJE_P2 - DO I=MYIS_P2,MYIE_P2 - DIVE(I,J)=DIV(I,J,K)*HBM2(I,J)+DIVE(I,J) - ENDDO - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(i,j,rdpdx,rdpdy,fcxm) - DO J=MYJS2,MYJE2 - DO I=MYIS1_P1,MYIE1_P1 - RDPDX=DDMPU(I,J)*FCXM & - & /(PDE(I+IVW(J),J) +PDE(I+IVE(J),J)) - RDPDY=DDMPV(I,J)*FCXM & - & /(PDE(I ,J-1)+PDE(I ,J+1)) -! - XDIVX(I,J)=(DIVE(I+IVE(J),J )-DIVE(I+IVW(J),J ))*RDPDX - XDIVY(I,J)=(DIVE(I ,J+1)-DIVE(I ,J-1))*RDPDY - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - FCIM=1. -! -!$omp parallel do & -!$omp& private(dpde,i,j,k,rdpdx,rdpdy,fcim) -! - fcim_loop: DO K=KTS,KTE -! -!----------------------------------------------------------------------- -! - DO J=MYJS_P2,MYJE_P2 - DO I=MYIS_P1,MYIE_P1 - DPDE(I,J)=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J) - DIV(I,J,K)=DIV(I,J,K)*HBM2(I,J) - ENDDO - ENDDO -! - DO J=MYJS2,MYJE2 - DO I=MYIS1_P1,MYIE1_P1 - RDPDX=DDMPU(I,J)*FCIM & - & /(DPDE(I+IVW(J),J) +DPDE(I+IVE(J),J)) - RDPDY=DDMPV(I,J)*FCIM & - & /(DPDE(I ,J-1)+DPDE(I ,J+1)) - U(I,J,K)=((DIV(I+IVE(J),J,K )-DIV(I+IVW(J),J,K ))*RDPDX & - & +XDIVX(I,J))+U(I,J,K) - V(I,J,K)=((DIV(I ,J+1,K)-DIV(I ,J-1,K))*RDPDY & - & +XDIVY(I,J))+V(I,J,K) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - ENDDO fcim_loop -! -!----------------------------------------------------------------------- -! - - END SUBROUTINE DDAMP -! -!----------------------------------------------------------------------- -! - END MODULE MODULE_IGWAVE_ADJUST -! -!----------------------------------------------------------------------- diff --git a/dyn_nmm/module_INDX.F b/dyn_nmm/module_INDX.F deleted file mode 100644 index b15c3c5192..0000000000 --- a/dyn_nmm/module_INDX.F +++ /dev/null @@ -1,49 +0,0 @@ -! - MODULE MODULE_INDX -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- -! -!*** INDEX INCREMENTS FOR MOVING TO NEIGHBORS ON THE E-GRID -! - INTEGER,ALLOCATABLE,DIMENSION(:) :: IHE,IHW,IVE,IVW,IRAD & - ,IHEG,IHWG,IVEG,IVWG,IRADG -!---------------------------------------------------------------------- -! -!*** INDEX INCREMENTS FOR 3RD INDEX IN WORKING ARRAYS IN PFDHT, DDAMP, -!*** ADVE, AND HDIFF. -! - INTEGER,ALLOCATABLE,DIMENSION(:,:,:) :: INDX3_WRK -!---------------------------------------------------------------------- -! -!*** INCREMENTS TO J1_00 IN UPSTREAM HORIZONTAL ADVECTION. -! - INTEGER,DIMENSION(-2:2,-2:2) :: INC_UPS -!---------------------------------------------------------------------- -! -!*** NUMBER OF POINTS NEEDED IN EACH ROW FOR UPSTREAM COMPUTATIONS -! - INTEGER,ALLOCATABLE,DIMENSION(:) :: N_IUP_H,N_IUP_V & - ,N_IUP_ADH,N_IUP_ADV -! -!*** I VALUES IN EACH ROW NEEDED FOR UPSTREAM ADVECTION -! - INTEGER,ALLOCATABLE,DIMENSION(:,:) :: IUP_H,IUP_V,IUP_ADH,IUP_ADV -!---------------------------------------------------------------------- - - CONTAINS - SUBROUTINE init_module_indx -#if 0 - ALLOCATE(IHE(-2:NMM_MAX_DIM)) - ALLOCATE(IHW(-2:NMM_MAX_DIM)) - ALLOCATE(IVE(-2:NMM_MAX_DIM)) - ALLOCATE(IVW(-2:NMM_MAX_DIM)) - ALLOCATE(IRAD(-2:NMM_MAX_DIM)) - ALLOCATE(IHEG(-2:NMM_MAX_DIM)) - ALLOCATE(IHWG(-2:NMM_MAX_DIM)) - ALLOCATE(IVEG(-2:NMM_MAX_DIM)) - ALLOCATE(IVWG(-2:NMM_MAX_DIM)) - ALLOCATE(IRADG(-2:NMM_MAX_DIM)) - ALLOCATE(INDX3_WRK(-3:3,1:NMM_MAX_DIM,0:6)) -#endif - END SUBROUTINE init_module_indx - END MODULE MODULE_INDX diff --git a/dyn_nmm/module_MPP.F b/dyn_nmm/module_MPP.F deleted file mode 100644 index 255d3adb8c..0000000000 --- a/dyn_nmm/module_MPP.F +++ /dev/null @@ -1,61 +0,0 @@ -! - MODULE MODULE_MPP -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- -! -!*** THE RANK OF THIS TASK -! - INTEGER :: MYPE -!---------------------------------------------------------------------- -! -!*** NUMBER OF TASKS -! - INTEGER :: INPES,JNPES,NPES -! -!*** FUNDAMENTAL GLOBAL AND LOCAL ARRAY EXTENTS ON EACH TASK -! - INTEGER :: MY_IS_GLB,MY_IE_GLB,MY_JS_GLB,MY_JE_GLB & - ,MY_IS_LOC,MY_IE_LOC,MY_JS_LOC,MY_JE_LOC -!---------------------------------------------------------------------- -! -!*** SUB-DOMAIN LOOP LIMITS THAT PENETRATE HALOES -! - INTEGER :: MYIS,MYIE,MYJS,MYJE & - ,MYIS1,MYIS2,MYIS3,MYIS4,MYIS5 & - ,MYIE1,MYIE2,MYIE3,MYIE4,MYIE5 & - ,MYIS_P1,MYIS_P2,MYIS_P3,MYIS_P4,MYIS_P5 & - ,MYIS1_P1,MYIS1_P2,MYIS1_P3,MYIS1_P4,MYIS1_P5 & - ,MYIS2_P1,MYIS2_P2,MYIS2_P3,MYIS2_P4,MYIS2_P5 & - ,MYIS3_P1,MYIS3_P2,MYIS3_P3,MYIS3_P4,MYIS3_P5 & - ,MYIS4_P1,MYIS4_P2,MYIS4_P3,MYIS4_P4,MYIS4_P5 & - ,MYIS5_P1,MYIS5_P2,MYIS5_P3,MYIS5_P4,MYIS5_P5 & - ,MYIE_P1,MYIE_P2,MYIE_P3,MYIE_P4,MYIE_P5 & - ,MYIE1_P1,MYIE1_P2,MYIE1_P3,MYIE1_P4,MYIE1_P5 & - ,MYIE2_P1,MYIE2_P2,MYIE2_P3,MYIE2_P4,MYIE2_P5 & - ,MYIE3_P1,MYIE3_P2,MYIE3_P3,MYIE3_P4,MYIE3_P5 & - ,MYIE4_P1,MYIE4_P2,MYIE4_P3,MYIE4_P4,MYIE4_P5 & - ,MYIE5_P1,MYIE5_P2,MYIE5_P3,MYIE5_P4,MYIE5_P5 & - ,MYJS1,MYJS2,MYJS3,MYJS4,MYJS5 & - ,MYJE1,MYJE2,MYJE3,MYJE4,MYJE5 & - ,MYJS_P1,MYJS_P2,MYJS_P3,MYJS_P4,MYJS_P5 & - ,MYJS1_P1,MYJS1_P2,MYJS1_P3,MYJS1_P4,MYJS1_P5 & - ,MYJS2_P1,MYJS2_P2,MYJS2_P3,MYJS2_P4,MYJS2_P5 & - ,MYJS3_P1,MYJS3_P2,MYJS3_P3,MYJS3_P4,MYJS3_P5 & - ,MYJS4_P1,MYJS4_P2,MYJS4_P3,MYJS4_P4,MYJS4_P5 & - ,MYJS5_P1,MYJS5_P2,MYJS5_P3,MYJS5_P4,MYJS5_P5 & - ,MYJE_P1,MYJE_P2,MYJE_P3,MYJE_P4,MYJE_P5 & - ,MYJE1_P1,MYJE1_P2,MYJE1_P3,MYJE1_P4,MYJE1_P5 & - ,MYJE2_P1,MYJE2_P2,MYJE2_P3,MYJE2_P4,MYJE2_P5 & - ,MYJE3_P1,MYJE3_P2,MYJE3_P3,MYJE3_P4,MYJE3_P5 & - ,MYJE4_P1,MYJE4_P2,MYJE4_P3,MYJE4_P4,MYJE4_P5 & - ,MYJE5_P1,MYJE5_P2,MYJE5_P3,MYJE5_P4,MYJE5_P5 - -! -!---------------------------------------------------------------------- -! -!*** MPI_COMM_COMP IS THE INTRACOMMUNICATOR FOR ALL TASKS. -! - INTEGER :: MPI_COMM_COMP - -!---------------------------------------------------------------------- - END MODULE MODULE_MPP diff --git a/dyn_nmm/module_MPPINIT.F b/dyn_nmm/module_MPPINIT.F deleted file mode 100644 index bd465cf482..0000000000 --- a/dyn_nmm/module_MPPINIT.F +++ /dev/null @@ -1,447 +0,0 @@ -! -!NCEP_MESO:MEDIATION_LAYER: SET UP DOMAIN DECOMPOSITION VARIABLES -! -! -!---------------------------------------------------------------------- -! - MODULE MODULE_MPPINIT -! -!---------------------------------------------------------------------- - USE MODULE_MPP -!---------------------------------------------------------------------- -! - CONTAINS -! -!********************************************************************** - SUBROUTINE MPPINIT(IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,IPS,IPE,JPS,JPE,KPS,KPE) -!********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: MPPINIT SET UP DECOMPOSITION VARIABLES -! PRGRMMR: BLACK ORG: W/NP22 DATE: 98-10-28 -! -! ABSTRACT: -! MPPINIT DETERMINES ALL RELEVANT VALUES FOR DIMENSIONS OF THE -! DISTRIBUTED SUBDOMAINS AND THEIR HALOES. -! -! PROGRAM HISTORY LOG: -! 97-??-?? MEYS - ORIGINATOR -! 97-??-?? BLACK - CHANGES MADE FOR CLARITY -! 98-10-29 BLACK - REWRITTEN FOR CLARITY -! -! USAGE: CALL MPPINIT FROM MAIN PROGRAM NCEP_MESO -! INPUT ARGUMENT LIST: - -! OUTPUT ARGUMENT LIST: -! NONE -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: -! NONE -! -! LIBRARY: -! NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!---------------------------------------------------------------------- -! - IMPLICIT NONE -! -!---------------------------------------------------------------------- - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,IPS,IPE,JPS,JPE,KPS,KPE -!---------------------------------------------------------------------- -!********************************************************************** -!---------------------------------------------------------------------- - - CALL wrf_get_myproc ( MYPE ) - CALL wrf_get_nproc ( NPES ) - CALL wrf_get_dm_communicator ( mpi_comm_comp ) - -!jm - MYIS = MAX( IPS-0, IDS+0 ) - MYIS_P1 = MAX( IPS-1, IDS+0 ) - MYIS_P2 = MAX( IPS-2, IDS+0 ) - MYIS_P3 = MAX( IPS-3, IDS+0 ) - MYIS_P4 = MAX( IPS-4, IDS+0 ) - MYIS_P5 = MAX( IPS-5, IDS+0 ) -! - MYIS1 = MAX( IPS-0, IDS+1 ) - MYIS1_P1= MAX( IPS-1, IDS+1 ) - MYIS1_P2= MAX( IPS-2, IDS+1 ) - MYIS1_P3= MAX( IPS-3, IDS+1 ) - MYIS1_P4= MAX( IPS-4, IDS+1 ) - MYIS1_P5= MAX( IPS-5, IDS+1 ) -! - MYIS2 = MAX( IPS-0, IDS+2 ) - MYIS2_P1= MAX( IPS-1, IDS+2 ) - MYIS2_P2= MAX( IPS-2, IDS+2 ) - MYIS2_P3= MAX( IPS-3, IDS+2 ) - MYIS2_P4= MAX( IPS-4, IDS+2 ) - MYIS2_P5= MAX( IPS-5, IDS+2 ) -! - MYIS3 = MAX( IPS-0, IDS+3 ) - MYIS3_P1= MAX( IPS-1, IDS+3 ) - MYIS3_P2= MAX( IPS-2, IDS+3 ) - MYIS3_P3= MAX( IPS-3, IDS+3 ) - MYIS3_P4= MAX( IPS-4, IDS+3 ) - MYIS3_P5= MAX( IPS-5, IDS+3 ) -! - MYIS4 = MAX( IPS-0, IDS+4 ) - MYIS4_P1= MAX( IPS-1, IDS+4 ) - MYIS4_P2= MAX( IPS-2, IDS+4 ) - MYIS4_P3= MAX( IPS-3, IDS+4 ) - MYIS4_P4= MAX( IPS-4, IDS+4 ) - MYIS4_P5= MAX( IPS-5, IDS+4 ) -! - MYIS5 = MAX( IPS-0, IDS+5 ) - MYIS5_P1= MAX( IPS-1, IDS+5 ) - MYIS5_P2= MAX( IPS-2, IDS+5 ) - MYIS5_P3= MAX( IPS-3, IDS+5 ) - MYIS5_P4= MAX( IPS-4, IDS+5 ) - MYIS5_P5= MAX( IPS-5, IDS+5 ) - -!jm - MYIE = MIN( IPE+0, IDE-0 ) - MYIE_P1 = MIN( IPE+1, IDE-0 ) - MYIE_P2 = MIN( IPE+2, IDE-0 ) - MYIE_P3 = MIN( IPE+3, IDE-0 ) - MYIE_P4 = MIN( IPE+4, IDE-0 ) - MYIE_P5 = MIN( IPE+5, IDE-0 ) -! - MYIE1 = MIN( IPE+0, IDE-1 ) - MYIE1_P1= MIN( IPE+1, IDE-1 ) - MYIE1_P2= MIN( IPE+2, IDE-1 ) - MYIE1_P3= MIN( IPE+3, IDE-1 ) - MYIE1_P4= MIN( IPE+4, IDE-1 ) - MYIE1_P5= MIN( IPE+5, IDE-1 ) -! - MYIE2 = MIN( IPE+0, IDE-2 ) - MYIE2_P1= MIN( IPE+1, IDE-2 ) - MYIE2_P2= MIN( IPE+2, IDE-2 ) - MYIE2_P3= MIN( IPE+3, IDE-2 ) - MYIE2_P4= MIN( IPE+4, IDE-2 ) - MYIE2_P5= MIN( IPE+5, IDE-2 ) -! - MYIE3 = MIN( IPE+0, IDE-3 ) - MYIE3_P1= MIN( IPE+1, IDE-3 ) - MYIE3_P2= MIN( IPE+2, IDE-3 ) - MYIE3_P3= MIN( IPE+3, IDE-3 ) - MYIE3_P4= MIN( IPE+4, IDE-3 ) - MYIE3_P5= MIN( IPE+5, IDE-3 ) -! - MYIE4 = MIN( IPE+0, IDE-4 ) - MYIE4_P1= MIN( IPE+1, IDE-4 ) - MYIE4_P2= MIN( IPE+2, IDE-4 ) - MYIE4_P3= MIN( IPE+3, IDE-4 ) - MYIE4_P4= MIN( IPE+4, IDE-4 ) - MYIE4_P5= MIN( IPE+5, IDE-4 ) -! - MYIE5 = MIN( IPE+0, IDE-5 ) - MYIE5_P1= MIN( IPE+1, IDE-5 ) - MYIE5_P2= MIN( IPE+2, IDE-5 ) - MYIE5_P3= MIN( IPE+3, IDE-5 ) - MYIE5_P4= MIN( IPE+4, IDE-5 ) - MYIE5_P5= MIN( IPE+5, IDE-5 ) - -!jm - MYJS = MAX( JPS-0, JDS+0 ) - MYJS_P1 = MAX( JPS-1, JDS+0 ) - MYJS_P2 = MAX( JPS-2, JDS+0 ) - MYJS_P3 = MAX( JPS-3, JDS+0 ) - MYJS_P4 = MAX( JPS-4, JDS+0 ) - MYJS_P5 = MAX( JPS-5, JDS+0 ) -! - MYJS1 = MAX( JPS-0, JDS+1 ) - MYJS1_P1= MAX( JPS-1, JDS+1 ) - MYJS1_P2= MAX( JPS-2, JDS+1 ) - MYJS1_P3= MAX( JPS-3, JDS+1 ) - MYJS1_P4= MAX( JPS-4, JDS+1 ) - MYJS1_P5= MAX( JPS-5, JDS+1 ) -! - MYJS2 = MAX( JPS-0, JDS+2 ) - MYJS2_P1= MAX( JPS-1, JDS+2 ) - MYJS2_P2= MAX( JPS-2, JDS+2 ) - MYJS2_P3= MAX( JPS-3, JDS+2 ) - MYJS2_P4= MAX( JPS-4, JDS+2 ) - MYJS2_P5= MAX( JPS-5, JDS+2 ) -! - MYJS3 = MAX( JPS-0, JDS+3 ) - MYJS3_P1= MAX( JPS-1, JDS+3 ) - MYJS3_P2= MAX( JPS-2, JDS+3 ) - MYJS3_P3= MAX( JPS-3, JDS+3 ) - MYJS3_P4= MAX( JPS-4, JDS+3 ) - MYJS3_P5= MAX( JPS-5, JDS+3 ) -! - MYJS4 = MAX( JPS-0, JDS+4 ) - MYJS4_P1= MAX( JPS-1, JDS+4 ) - MYJS4_P2= MAX( JPS-2, JDS+4 ) - MYJS4_P3= MAX( JPS-3, JDS+4 ) - MYJS4_P4= MAX( JPS-4, JDS+4 ) - MYJS4_P5= MAX( JPS-5, JDS+4 ) -! - MYJS5 = MAX( JPS-0, JDS+5 ) - MYJS5_P1= MAX( JPS-1, JDS+5 ) - MYJS5_P2= MAX( JPS-2, JDS+5 ) - MYJS5_P3= MAX( JPS-3, JDS+5 ) - MYJS5_P4= MAX( JPS-4, JDS+5 ) - MYJS5_P5= MAX( JPS-5, JDS+5 ) -! -!jm - MYJE = MIN( JPE+0, JDE-0 ) - MYJE_P1 = MIN( JPE+1, JDE-0 ) - MYJE_P2 = MIN( JPE+2, JDE-0 ) - MYJE_P3 = MIN( JPE+3, JDE-0 ) - MYJE_P4 = MIN( JPE+4, JDE-0 ) - MYJE_P5 = MIN( JPE+5, JDE-0 ) -! - MYJE1 = MIN( JPE+0, JDE-1 ) - MYJE1_P1= MIN( JPE+1, JDE-1 ) - MYJE1_P2= MIN( JPE+2, JDE-1 ) - MYJE1_P3= MIN( JPE+3, JDE-1 ) - MYJE1_P4= MIN( JPE+4, JDE-1 ) - MYJE1_P5= MIN( JPE+5, JDE-1 ) -! - MYJE2 = MIN( JPE+0, JDE-2 ) - MYJE2_P1= MIN( JPE+1, JDE-2 ) - MYJE2_P2= MIN( JPE+2, JDE-2 ) - MYJE2_P3= MIN( JPE+3, JDE-2 ) - MYJE2_P4= MIN( JPE+4, JDE-2 ) - MYJE2_P5= MIN( JPE+5, JDE-2 ) -! - MYJE3 = MIN( JPE+0, JDE-3 ) - MYJE3_P1= MIN( JPE+1, JDE-3 ) - MYJE3_P2= MIN( JPE+2, JDE-3 ) - MYJE3_P3= MIN( JPE+3, JDE-3 ) - MYJE3_P4= MIN( JPE+4, JDE-3 ) - MYJE3_P5= MIN( JPE+5, JDE-3 ) -! - MYJE4 = MIN( JPE+0, JDE-4 ) - MYJE4_P1= MIN( JPE+1, JDE-4 ) - MYJE4_P2= MIN( JPE+2, JDE-4 ) - MYJE4_P3= MIN( JPE+3, JDE-4 ) - MYJE4_P4= MIN( JPE+4, JDE-4 ) - MYJE4_P5= MIN( JPE+5, JDE-4 ) -! - MYJE5 = MIN( JPE+0, JDE-5 ) - MYJE5_P1= MIN( JPE+1, JDE-5 ) - MYJE5_P2= MIN( JPE+2, JDE-5 ) - MYJE5_P3= MIN( JPE+3, JDE-5 ) - MYJE5_P4= MIN( JPE+4, JDE-5 ) - MYJE5_P5= MIN( JPE+5, JDE-5 ) - -!---------------------------------------------------------------------- - END SUBROUTINE MPPINIT -!********************************************************************** -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- -!jm!********************************************************************** -!jm!---------------------------------------------------------------------- -!jm! -!jm!********************************************************************** -!jm SUBROUTINE GOSSIP(IDS,IDE,JDS,JDE,KDS,KDE & -!jm ,IMS,IME,JMS,JME,KMS,KME & -!jm ,ITS,ITE,JTS,JTE,KTS,KTE) -!jm!********************************************************************** -!jm!$$$ SUBPROGRAM DOCUMENTATION BLOCK -!jm! . . . -!jm! SUBPROGRAM: GOSSIP EXCHANGE OF FIELDS BETWEEN PROCESSORS -!jm! PRGRMMR: BLACK ORG: W/NP2 DATE: 97-08-30 -!jm! -!jm! ABSTRACT: -!jm! GOSSIP EXCHANGES MANY FIELDS BETWEEN PROCESSORS -!jm! IN ORDER TO FILL THE HALOES -!jm! -!jm! PROGRAM HISTORY LOG: -!jm! 97-05-?? MEYS - ORIGINATOR -!jm! 98-10-23 BLACK - MODIFIED FOR CURRENT VERSION OF MODEL -!jm! 01-03-21 BLACK - CONVERTED TO WRF FORMAT -!jm! -!jm! USAGE: CALL GOSSIP FROM MAIN PROGRAM EBU -!jm! INPUT ARGUMENT LIST: -!jm! IMS - TASKS'S STARTING I ADDRESS -!jm! IME - TASKS'S ENDING I ADDRESS -!jm! JMS - TASKS'S STARTING J ADDRESS -!jm! JME - TASKS'S ENDING J ADDRESS -!jm! KMS - TASKS'S STARTING K ADDRESS -!jm! KME - TASKS'S ENDING K ADDRESS -!jm! -!jm! OUTPUT ARGUMENT LIST: -!jm! NONE -!jm! -!jm! OUTPUT FILES: -!jm! NONE -!jm! -!jm! SUBPROGRAMS CALLED: -!jm! -!jm! UNIQUE: EXCH -!jm! -!jm! LIBRARY: NONE -!jm! -!jm! ATTRIBUTES: -!jm! LANGUAGE: FORTRAN 90 -!jm! MACHINE : IBM SP -!jm!$$$ -!jm!********************************************************************** -!jm!---------------------------------------------------------------------- -!jm! -!jm IMPLICIT NONE -!jm! -!jm!---------------------------------------------------------------------- -!jm INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & -!jm ,IMS,IME,JMS,JME,KMS,KME & -!jm ,ITS,ITE,JTS,JTE,KTS,KTE -!jm! -!jm INTEGER :: J -!jm!---------------------------------------------------------------------- -!jm!********************************************************************** -!jm! -!jm!*** THE NHB ARRAYS -!jm! -!jm CALL EXCH(LMH,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(LMV,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(HBM2,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(HBM3,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(VBM2,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(VBM3,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(SM,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(SICE,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(HTM,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(VTM,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(DX,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(WPDAR,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(CPGFU,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(CURV,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(FCP,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(FDIV,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(FAD,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(F,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(DDMPU,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(DDMPV,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(GLAT,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(GLON,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(EPSR,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(TG,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(GFFC,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(SST,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(ALBASE,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(HDAC,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(HDACV,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(IVGTYP,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(ISLTYP,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(ISLOPE,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH(VEGFRC,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm! -!jm!*** THE RESTRT FILE ARRAYS -!jm! -!jm CALL EXCH (OMGALF,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (PD,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (RES,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (FIS,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (T,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (U,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (V,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (Q,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (Q2,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (CWM,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (TRAIN,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (TCUCN,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (RSWIN,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (RSWOUT,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (TG,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (Z0,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (AKMS,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (CZEN,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (AKHS,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (THS,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (QS,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (TWBS,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (QWBS,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (HBOT,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (CFRACL,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (THZ0,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (QZ0,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (UZ0,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (VZ0,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (USTAR,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (HTOP,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (CFRACM,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SNO,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SI,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (CLDEFI,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (RF,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (CUPPT,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (CFRACH,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SOILTB,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SFCEXC,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SMSTAV,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SMSTOT,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (GRNFLX,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (PCTSNO,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (RLWIN,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (RADOT,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (CZMEAN,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SIGT4,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (U00,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (LC,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SR,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (PREC,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ACPREC,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ACCLIQ,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (CUPREC,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ACFRCV,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (NCFRCV,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ACFRST,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (NCFRST,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ACSNOW,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ACSNOM,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SSROFF,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (BGROFF,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SFCSHX,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SFCLHX,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SUBSHX,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SNOPCX,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SFCUVX,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SFCEVP,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (POTEVP,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ASWIN,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ASWOUT,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ASWTOA,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ALWIN,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ALWOUT,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ALWTOA,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SMC,NSOIL,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (CMC,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (STC,NSOIL,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (SH2O,NSOIL,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (ALBEDO,1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm! -!jm CALL EXCH (PINT,LM+1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (Z,LM+1,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (DWDT,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (TOLD,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (UOLD,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm CALL EXCH (VOLD,LM,5,5,IMS,IME,JMS,JME,KMS,KME) -!jm! -!jm DO J=MYJS_P4,MYJE_P4 -!jm IVW(J)=IVWG(J+MY_JS_GLB-1) -!jm IVE(J)=IVEG(J+MY_JS_GLB-1) -!jm IHE(J)=IHEG(J+MY_JS_GLB-1) -!jm IHW(J)=IHWG(J+MY_JS_GLB-1) -!jm ENDDO -!jm! -!jm!---------------------------------------------------------------------- -!jm END SUBROUTINE GOSSIP -!---------------------------------------------------------------------- - END MODULE MODULE_MPPINIT - diff --git a/dyn_nmm/module_NEST_UTIL.F b/dyn_nmm/module_NEST_UTIL.F deleted file mode 100644 index 1ccda134ba..0000000000 --- a/dyn_nmm/module_NEST_UTIL.F +++ /dev/null @@ -1,491 +0,0 @@ -! -!NCEP_MESO:MODEL_LAYER: BOUNDARY CONDITION UPDATES -! -!---------------------------------------------------------------------- -! - MODULE module_NEST_UTIL -! -!---------------------------------------------------------------------- - USE MODULE_MPP - USE MODULE_STATE_DESCRIPTION - USE MODULE_DM -! -!#ifdef DM_PARALLEL -! INCLUDE "mpif.h" -!#endif -!---------------------------------------------------------------------- - CONTAINS -! -!********************************************************************************************* - SUBROUTINE NESTBC_PATCH(PD_BXS,PD_BXE,PD_BYS,PD_BYE & - ,T_BXS,T_BXE,T_BYS,T_BYE,Q_BXS,Q_BXE,Q_BYS,Q_BYE & - ,U_BXS,U_BXE,U_BYS,U_BYE,V_BXS,V_BXE,V_BYS,V_BYE & - ,Q2_BXS,Q2_BXE,Q2_BYS,Q2_BYE & - ,CWM_BXS,CWM_BXE,CWM_BYS,CWM_BYE & - ,PD_BTXS,PD_BTXE,PD_BTYS,PD_BTYE & - ,T_BTXS,T_BTXE,T_BTYS,T_BTYE,Q_BTXS,Q_BTXE,Q_BTYS,Q_BTYE & - ,U_BTXS,U_BTXE,U_BTYS,U_BTYE,V_BTXS,V_BTXE,V_BTYS,V_BTYE & - ,Q2_BTXS,Q2_BTXE,Q2_BTYS,Q2_BTYE & - ,CWM_BTXS,CWM_BTXE,CWM_BTYS,CWM_BTYE & -! - ,PDTMP_B,TTMP_B, QTMP_B,UTMP_B,VTMP_B,Q2TMP_B,CWMTMP_B & - ,PDTMP_BT,TTMP_BT,QTMP_BT,UTMP_BT,VTMP_BT,Q2TMP_BT,CWMTMP_BT & -! - ,SPEC_BDY_WIDTH & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE ) -!********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: PATCH -! PRGRMMR: gopal -! -! ABSTRACT: -! THIS IS JUST A FIX FOR USING NESTED BOUNDARIES IN THE HALO REGION -! PROGRAM HISTORY LOG: -! 09-23-2004 : gopal -! -! USAGE: CALL PATCH FROM SUBROUTINE SOLVE_RUNSTREAM FOR NESTED DOMAIN ONLY -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!********************************************************************** -!---------------------------------------------------------------------- -! - IMPLICIT NONE -! -!---------------------------------------------------------------------- -! - - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE - INTEGER,INTENT(IN) :: SPEC_BDY_WIDTH -! -! - REAL,DIMENSION(IMS:IME,1,SPEC_BDY_WIDTH) & - ,INTENT(INOUT) :: PD_BYS,PD_BYE & - ,PD_BTYS,PD_BTYE - - REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH) & - ,INTENT(INOUT) :: CWM_BYS,CWM_BYE & - ,Q_BYS,Q_BYE & - ,Q2_BYS,Q2_BYE & - ,T_BYS,T_BYE & - ,U_BYS,U_BYE & - ,V_BYS,V_BYE - - REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH) & - ,INTENT(INOUT) :: CWM_BTYS,CWM_BTYE & - ,Q_BTYS,Q_BTYE & - ,Q2_BTYS,Q2_BTYE & - ,T_BTYS,T_BTYE & - ,U_BTYS,U_BTYE & - ,V_BTYS,V_BTYE - -! - - REAL,DIMENSION(JMS:JME,1,SPEC_BDY_WIDTH) & - ,INTENT(INOUT) :: PD_BXS,PD_BXE & - ,PD_BTXS,PD_BTXE - - REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH) & - ,INTENT(INOUT) :: CWM_BXS,CWM_BXE & - ,Q_BXS,Q_BXE & - ,Q2_BXS,Q2_BXE & - ,T_BXS,T_BXE & - ,U_BXS,U_BXE & - ,V_BXS,V_BXE - - REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH) & - ,INTENT(INOUT) :: CWM_BTXS,CWM_BTXE & - ,Q_BTXS,Q_BTXE & - ,Q2_BTXS,Q2_BTXE & - ,T_BTXS,T_BTXE & - ,U_BTXS,U_BTXE & - ,V_BTXS,V_BTXE - -! - - REAL,DIMENSION(IMS:IME,JMS:JME) & - ,INTENT(IN) :: PDTMP_B,PDTMP_BT - - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME) & - ,INTENT(IN) :: CWMTMP_B,CWMTMP_BT & - ,QTMP_B,QTMP_BT & - ,Q2TMP_B,Q2TMP_BT & - ,TTMP_B,TTMP_BT & - ,UTMP_B,UTMP_BT & - ,VTMP_B,VTMP_BT - -! - -!---------------------------------------------------------------------- -! -!*** LOCAL VARIABLES -! - LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY - INTEGER :: I,J,K,IBDY,II,JJ,IB,JB,IIM,JJM,BF -!---------------------------------------------------------------------- -!********************************************************************** -!---------------------------------------------------------------------- -! - W_BDY=(ITS==IDS) - E_BDY=(ITE==IDE) - S_BDY=(JTS==JDS) - N_BDY=(JTE==JDE) - -!---------------------------------------------------------------------- -!*** WEST AND EAST BOUNDARIES -!---------------------------------------------------------------------- -! -!*** USE IBDY=1 FOR WEST; 2 FOR EAST. - -! WRITE(0,*)'WESTERN BC FOR PATCH',IDS,MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) -! - - DO IBDY=1,2 -! -!*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. -! - IF(W_BDY.AND.IBDY.EQ.1)THEN -! BF=P_XSB ! Which boundary (XSB=the boundary where X is at its start) - IB=1 ! Which cell in from boundary - II=1 ! Which cell in the domain - - DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) - IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9 - PD_BXS(J,1,IB) =PDTMP_B(II,J) - PD_BTXS(J,1,IB) =PDTMP_BT(II,J) - ENDIF - ENDDO -! - DO K=KTS,KTE - DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) - IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9 - T_BXS(J,K,IB) = TTMP_B(II,J,K) - T_BTXS(J,K,IB) = TTMP_BT(II,J,K) - Q_BXS(J,K,IB) = QTMP_B(II,J,K) - Q_BTXS(J,K,IB) = QTMP_BT(II,J,K) - Q2_BXS(J,K,IB) = Q2TMP_B(II,J,K) - Q2_BTXS(J,K,IB) = Q2TMP_BT(II,J,K) - CWM_BXS(J,K,IB) = CWMTMP_B(II,J,K) - CWM_BTXS(J,K,IB) = CWMTMP_BT(II,J,K) - ENDIF - ENDDO - ENDDO - - DO K=KTS,KTE - DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1) - IF(MOD(J,2).EQ.0)THEN ! J=2,4,6,8 - U_BXS(J,K,IB) = UTMP_B(II,J,K) - U_BTXS(J,K,IB) = UTMP_BT(II,J,K) - V_BXS(J,K,IB) = VTMP_B(II,J,K) - V_BTXS(J,K,IB) = VTMP_BT(II,J,K) - ENDIF - ENDDO - ENDDO - - ELSEIF (E_BDY.AND.IBDY.EQ.2) THEN - -! BF=P_XEB ! Which boundary (XEB=the boundary where X is at its end) - IB=1 ! Which cell in from boundary - II=IDE ! Which cell in the domain - - DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) - IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9 - PD_BXE(J,1,IB) =PDTMP_B(II,J) - PD_BTXE(J,1,IB) =PDTMP_BT(II,J) - ENDIF - ENDDO -! - DO K=KTS,KTE - DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) - IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9 - T_BXE(J,K,IB) = TTMP_B(II,J,K) - T_BTXE(J,K,IB) = TTMP_BT(II,J,K) - Q_BXE(J,K,IB) = QTMP_B(II,J,K) - Q_BTXE(J,K,IB) = QTMP_BT(II,J,K) - Q2_BXE(J,K,IB) = Q2TMP_B(II,J,K) - Q2_BTXE(J,K,IB) = Q2TMP_BT(II,J,K) - CWM_BXE(J,K,IB) = CWMTMP_B(II,J,K) - CWM_BTXE(J,K,IB) = CWMTMP_BT(II,J,K) - ENDIF - ENDDO - ENDDO - - DO K=KTS,KTE - DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1) - IF(MOD(J,2).EQ.0)THEN ! J=2,4,6,8 - U_BXE(J,K,IB) = UTMP_B(II,J,K) - U_BTXE(J,K,IB) = UTMP_BT(II,J,K) - V_BXE(J,K,IB) = VTMP_B(II,J,K) - V_BTXE(J,K,IB) = VTMP_BT(II,J,K) - ENDIF - ENDDO - ENDDO - - ENDIF - ENDDO -! -!---------------------------------------------------------------------- -!*** SOUTH AND NORTH BOUNDARIES -!---------------------------------------------------------------------- -! -!*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH -! - DO IBDY=1,2 -! -!*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. -! - IF(S_BDY.AND.IBDY.EQ.1) THEN -! -! BF=P_YSB ! Which boundary (YSB=the boundary where Y is at its start) - JB=1 ! Which cell in from boundary - JJ=1 ! Which cell in the domain -! - DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) - PD_BYS(I,1,JB) = PDTMP_B(I,JJ) - PD_BTYS(I,1,JB)= PDTMP_BT(I,JJ) - ENDDO - -! - DO K=KTS,KTE - DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) - T_BYS(I,K,JB) = TTMP_B(I,JJ,K) - T_BTYS(I,K,JB) = TTMP_BT(I,JJ,K) - Q_BYS(I,K,JB) = QTMP_B(I,JJ,K) - Q_BTYS(I,K,JB) = QTMP_BT(I,JJ,K) - Q2_BYS(I,K,JB) = Q2TMP_B(I,JJ,K) - Q2_BTYS(I,K,JB) = Q2TMP_BT(I,JJ,K) - CWM_BYS(I,K,JB) = CWMTMP_B(I,JJ,K) - CWM_BTYS(I,K,JB)= CWMTMP_BT(I,JJ,K) - ENDDO - ENDDO - - DO K=KTS,KTE - DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) - U_BYS(I,K,JB) = UTMP_B(I,JJ,K) - U_BTYS(I,K,JB) = UTMP_BT(I,JJ,K) - V_BYS(I,K,JB) = VTMP_B(I,JJ,K) - V_BTYS(I,K,JB) = VTMP_BT(I,JJ,K) - ENDDO - ENDDO - - ELSEIF (N_BDY.AND.IBDY.EQ.2) THEN -! BF=P_YEB ! Which boundary (YEB=the boundary where Y is at its end) - JB=1 ! Which cell in from boundary - JJ=JDE ! Which cell in the domain - - DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) - PD_BYE(I,1,JB) = PDTMP_B(I,JJ) - PD_BTYE(I,1,JB)= PDTMP_BT(I,JJ) - ENDDO - -! - DO K=KTS,KTE - DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) - T_BYE(I,K,JB) = TTMP_B(I,JJ,K) - T_BTYE(I,K,JB) = TTMP_BT(I,JJ,K) - Q_BYE(I,K,JB) = QTMP_B(I,JJ,K) - Q_BTYE(I,K,JB) = QTMP_BT(I,JJ,K) - Q2_BYE(I,K,JB) = Q2TMP_B(I,JJ,K) - Q2_BTYE(I,K,JB) = Q2TMP_BT(I,JJ,K) - CWM_BYE(I,K,JB) = CWMTMP_B(I,JJ,K) - CWM_BTYE(I,K,JB)= CWMTMP_BT(I,JJ,K) - ENDDO - ENDDO - - DO K=KTS,KTE - DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) - U_BYE(I,K,JB) = UTMP_B(I,JJ,K) - U_BTYE(I,K,JB) = UTMP_BT(I,JJ,K) - V_BYE(I,K,JB) = VTMP_B(I,JJ,K) - V_BTYE(I,K,JB) = VTMP_BT(I,JJ,K) - ENDDO - ENDDO - - - - ENDIF - ENDDO -END SUBROUTINE NESTBC_PATCH -!---------------------------------------------------------------------------------- -SUBROUTINE MSLP_DIAG (MSLP,PINT,T,Q & - ,FIS,PD,DETA1,DETA2,PDTOP & - ,IDS,IDF,JDS,JDF,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE ) - - -!********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: MSLP_DIAG -! PRGRMMR: gopal -! -! ABSTRACT: -! THIS ROUTINE COMPUTES MSLP OVER THE PARENT DOMAIN FOR DIAGONOSTIC PURPOSE -! -! Note: domain I & J end bounds are NOT the usual bounds. They are -! IDE-1 and JDE-1. -! -! PROGRAM HISTORY LOG: -! 07-21-2005 : gopal -! 01-23-2012 : sam: removed 3D Z calculation, updated comments -! -! USAGE: CALL MSLP_DIAG FROM THE SOLVER -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP/Linux cluster -!$$$ - - USE MODULE_MODEL_CONSTANTS - USE MODULE_DM - - IMPLICIT NONE - -! global variables - - INTEGER,INTENT(IN) :: IDS,IDF,JDS,JDF,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE - - REAL, INTENT(IN) :: PDTOP - REAL, DIMENSION(KMS:KME), INTENT(IN) :: DETA1,DETA2 - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: MSLP - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q - -! local variables - - REAL, PARAMETER :: LAPSR=6.5E-3, GI=1./G,D608=0.608 - REAL, PARAMETER :: COEF3=287.05*GI*LAPSR, COEF2=-1./COEF3 - REAL, PARAMETER :: TRG=2.0*R_D*GI,LAPSI=1.0/LAPSR - REAL :: RTOPP,APELP,DZ,SFCT,A,Z1,Z2 - INTEGER :: I,J,K -!----------------------------------------------------------------------------------------------------- - - MSLP=-9999.99 - K=1 - DO J = JTS, MIN(JTE,JDF) - DO I = ITS, MIN(ITE,IDF) - Z1 = FIS(I,J)*GI - APELP = (PINT(I,J,K+1)+PINT(I,J,K)) - RTOPP = TRG*T(I,J,K)*(1.0+Q(I,J,K)*P608)/APELP - DZ = RTOPP*(DETA1(K)*PDTOP+DETA2(K)*PD(I,J)) - Z2 = Z1 + DZ - - SFCT = T(I,J,1)*(1.+D608*Q(I,J,1)) + LAPSR*(Z1+Z2)*0.5 - A = LAPSR*Z1/SFCT - MSLP(I,J) = PINT(I,J,1)*(1-A)**COEF2 - ENDDO - ENDDO - -END SUBROUTINE MSLP_DIAG -!!BEGIN: LSM changes for LANDFALL: Subashini 7/27/2016 -#ifdef IDEAL_NMM_TC -SUBROUTINE MOVE_LAND (SM,TSK & - ,SST,FIS & - ,PINT,T,Q & - ,NTSD & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE,DIRN) - - USE MODULE_MODEL_CONSTANTS - USE MODULE_DM - - IMPLICIT NONE - -! global variables - - INTEGER,INTENT(IN) :: NTSD,DIRN - - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE - - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: SM,TSK - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: SST,FIS - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q - -! local variables - - INTEGER :: I,J,K,CNT - REAL :: PSFC,EXNSFC,CAPA,SUMTHS,AVGTHS -!----------------------------------------------------------------------------------------------------- -! -! Note: make appropriate changes for boundary condition updates in -! d02 and d03 by adding "i01rhd=(DownNear)f=(BdyNear)" for SM in the -! Registry.NMM_HWRF. Also module_BNDRY_COND.F needs to be updated -! for SM. This is subashini's doing for advecting land surface in -! idealized framework -! - IF(DIRN == 1) THEN - DO J = MAX(JTS,2), MIN(JTE,JDE-1) - DO I = MIN(ITE,IDE),MAX(ITS,2),-1 - SM(I,J)=SM(I-1,J) ! Motion of land (0) from West to East - ENDDO - ENDDO - ELSE - DO J = MAX(JTS,2), MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - SM(I,J)=SM(I+1,J) ! Motion of land (0) from East to west - ENDDO - ENDDO - ENDIF - -END SUBROUTINE MOVE_LAND -#endif -!!END: LSM changes for LANDFALL : Subashini 7/27/2016 -!------------------------------------------------------------------------------------------------------ -SUBROUTINE CALC_BEST_MSLP(BEST_MSLP,MSLP,MEMBRANE_MSLP,FIS & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE ) - ! Author: Sam Trahan, January 2014 - - ! Calculates a "best estimate" BEST_MSLP from the low-quality MSLP - ! (updated every timestep) and high-quality MEMBRANE_MSLP (updated - ! infrequently). The MSLP is generally bad over high or sharp - ! terrain. - ! Cases: - ! invalid membrane_mslp: use mslp (leading edge of nest after move) - ! height>200m: use membrane_mslp, which is better over terrain - ! height<=0m: use mslp, which should be identical to membrane_mslp here - ! 0 0 .and. WP .ge. 0.001) THEN - DIFFW=.TRUE. - ELSE - DIFFW=.FALSE. - ENDIF - - IF(DIFFW) THEN - - DO K=KTS,KTE - DO J=MYJS_P1,MYJE1_P1 - DO I=MYIS_P1,MYIE1_P1 - HKNE_IJ=(DEF3D(I,J,K)+DEF3D(I+IHE(J),J+1,K)) - HKSE_IJ=(DEF3D(I+IHE(J),J-1,K)+DEF3D(I,J,K)) - WNE(I,J)=(W (I+IHE(J),J+1,K)-W (I,J,K))*HKNE_IJ - WSE(I,J)=(W (I+IHE(J),J-1,K)-W (I,J,K))*HKSE_IJ - ENDDO - ENDDO - - DO J=MYJS2,MYJE2 - DO I=MYIS,MYIE - DWDT(I,J,K)= DWDT(I,J,K) - ( WNE (I,J)-WNE (I+IHW(J),J-1) + & - WSE (I,J)-WSE (I+IHW(J),J+1) ) * & - HDAC(I,J)*HBM2(I,J)*RDT - ENDDO - ENDDO - ENDDO - - ENDIF -! -!----------------------------------------------------------------------- -!*** -!*** VERTICAL ADVECTION -!*** -!----------------------------------------------------------------------- -! - DO J=MYJS2,MYJE2 - DO I=MYIS,MYIE - TTB(I,J)=0. - ENDDO - ENDDO -! - DO K=KTE,KTS+1,-1 -! -!$omp parallel do & -!$omp& private(i,j,ttal) - DO J=MYJS2,MYJE2 - DO I=MYIS,MYIE - TTAL=(W(I,J,K-1)-W(I,J,K))*PETDT(I,J,K-1)*0.5 - DWDT(I,J,K)=(TTAL+TTB(I,J)) & - /(DETA1(K)*PDTOP+DETA2(K)*PDSLO(I,J)) & - +DWDT(I,J,K) - TTB(I,J)=TTAL - ENDDO - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - TTB(I,J)=(W(I,J,KTS)-W(I,J,KTS+1))*PETDT(I,J,KTS)*0.5 - DWDT(I,J,KTS)=TTB(I,J)/(DETA1(KTS)*PDTOP+DETA2(KTS)*PDSLO(I,J)) & - +DWDT(I,J,KTS) - ENDDO - ENDDO -!----------------------------------------------------------------------- -!*** -!*** END OF VERTICAL ADVECTION -!*** -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** -!*** HORIZONTAL ADVECTION -!*** -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(dpde,i,j,k) -! - main_horizontal: DO K=KTS,KTE -! -!----------------------------------------------------------------------- -!*** THE WORKING ARRAYS FOR THE PRIMARY VARIABLES -!----------------------------------------------------------------------- -! - DO J=MYJS1_P3,MYJE1_P3 - DO I=MYIS_P3,MYIE_P3 - WEW(I,J)=FEW(I,J,K)*(W(I+IVE(J),J,K)-W(I+IVW(J),J,K)) - WNS(I,J)=FNS(I,J,K)*(W(I,J+1,K)-W(I,J-1,K)) - ENDDO - ENDDO -! -!*** DIAGONAL FLUXES AND DIAGONALLY AVERAGED WIND -! - DO J=MYJS1_P2,MYJE2_P2 - DO I=MYIS_P2,MYIE1_P2 - WNE(I,J)=FNE(I,J,K)*(W(I+IHE(J),J+1,K)-W(I,J,K)) - ENDDO - ENDDO -! - DO J=MYJS2_P2,MYJE1_P2 - DO I=MYIS_P2,MYIE1_P2 - WSE(I,J)=FSE(I,J,K)*(W(I+IHE(J),J-1,K)-W(I,J,K)) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** ADVECTION OF W -!----------------------------------------------------------------------- -! - DO J=MYJS3,MYJE3 - DO I=MYIS2,MYIE2 - DPDE=DETA1(K)*PDTOP+DETA2(K)*PDSLO(I,J) - ADVEC=-(WEW(I+IHW(J),J) +WEW(I+IHE(J),J) & - +WNS(I,J-1) +WNS(I,J+1) & - +WNE(I+IHW(J),J-1) +WNE(I,J) & - +WSE(I,J) +WSE(I+IHW(J),J+1)) & - *FAD(I,J)*2.0*HBM3(I,J)/(DPDE*DT) - DWDT(I,J,K)= ADVEC + DWDT(I,J,K) - ENDDO - ENDDO - - ENDDO main_horizontal - -!----------------------------------------------------------------------- -!*** -!*** END OF HORIZONTAL ADVECTION -!*** -!----------------------------------------------------------------------- - - IF (WP .ge. 0.001) then - - do l=1,KTE - why(l)=-99. - enddo -! - lsltp=0 - SLTP=(PT+AETA1(KTE-1)*PDTOP+PT+AETA1(KTE)*PDTOP)*0.5 - DO L=KTE,2,-1 - PAVG=PT+PDTOP*(AETA1(L)+AETA1(L-1))*0.5 - ARG=( PAVG-SLTP )/SLPD - if(arg.gt.1.) exit - why(l)=1.-cos(arg*pi*0.5)**2 - lsltp=l - enddo - - -! - DO l=lsltp,KTE - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 - dwdt(i,j,l)=dwdt(i,j,l)*why(l) - ENDDO - ENDDO - ENDDO - -!----------------------------------------------------------------------- -!---taking external mode out-------------------------------------------- -!----------------------------------------------------------------------- - - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 - TTB(I,J)=0. - ENDDO - ENDDO -! - DO K=KTS,KTE - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 - DPDE=DETA1(K)*PDTOP+DETA2(K)*PDSLO(I,J) - TTB(I,J)=DPDE*DWDT(I,J,K)+TTB(I,J) - ENDDO - ENDDO - ENDDO -! - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 - TTB(I,J)=TTB(I,J)/(PDSLO(I,J)+PDTOP) - ENDDO - ENDDO -! - DO K=KTS,KTE - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 - DWDT(I,J,K)=DWDT(I,J,K)-TTB(I,J) - ENDDO - ENDDO - ENDDO - endif - -!dumping dwdt at stratsphere, Zhan - - if ( dwdt_damping_lev .ge. 0.001 ) then - lsltp=0 - SLTP=(PT+AETA1(KTE-1)*PDTOP+PT+AETA1(KTE)*PDTOP)*0.5 - DO L=KTE,2,-1 - PAVG=PT+PDTOP*(AETA1(L)+AETA1(L-1))*0.5 - ARG=( PAVG-SLTP )/dwdt_damping_lev - if(arg.gt.1.) exit - why(l)=1.-cos(arg*pi*0.5)**2 - lsltp=l - enddo -! - DO l=lsltp,KTE - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 - dwdt(i,j,l)=dwdt(i,j,l)*why(l) - ENDDO - ENDDO - ENDDO - endif -!dumping dwdt at stratsphere, Zhan - -!$omp parallel do & -!$omp& private(dwdtt,i,j,k) - DO K=KTS,KTE - DO J=MYJS,MYJE - DO I=MYIS,MYIE - DWDTT=DWDT(I,J,K) - DWDTT=MAX(DWDTT,DWDTMN(I,J)) - DWDTT=MIN(DWDTT,DWDTMX(I,J)) -! - DWDT(I,J,K)=(DWDTT*RG+1.)*(1.-WP)+PDWDT(I,J,K)*WP - ENDDO - ENDDO - ENDDO -!----------------------------------------------------------------------- -!---setting dwdt (epsilon at this point) on h points to 1. along bdy --- -!----------------------------------------------------------------------- - IF (WP .ge. 0.001) THEN - - do K=KTS,KTE - if (JDS .eq. JTS) then - do J=jts,jts+1 - do I=its,ite - DWDT(I,J,K)=1. - enddo - enddo - endif -! - if (JTE .ge. JDE-2) then - do j=jte-1,jte - do i=its,ite - DWDT(I,J,K)=1. - enddo - enddo - endif -! - if(ITS .eq. IDS)then - do j=jts,jte - do i=its,its+1 - DWDT(I,J,K)=1. - enddo - enddo - endif -! - if(ITE .ge. IDE-2)then - do j=jts,jte - do i=ite-1,ite - DWDT(I,J,K)=1. - enddo - enddo - endif - enddo - - ENDIF - - GDT=G*DT - GDT2=GDT*GDT - FFC=-R_D/GDT2 -! -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(b1_ik,b2_ik,b3_ik,c0_ik,chi_ik,coff_ik,cwm_ik, & -!$omp& delp,dppl,dpstr,dptl,dptu_i,dwdt_ik,fct,i,j,k, & -!$omp& pint_ik,pnp1_i,pp1,pstr_ik,pstrdn,pstrup_i,q_ik, & -!$omp& rdpdn,rdpup,rtop_ik,t_ik,tfc,tmp,ttfc,w_ik) -! - - - final_update: DO J=MYJS3,MYJE3 -! -!----------------------------------------------------------------------- -!*** EXTRACT COLUMNS FROM 3-D ARRAYS -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DO I=MYIS2,MYIE2 - CWM_IK(I,K)=CWM(I,J,K) - DWDT_IK(I,K)=DWDT(I,J,K) - Q_IK(I,K)=Q(I,J,K) - RTOP_IK(I,K)=RTOP(I,J,K) - T_IK(I,K)=T(I,J,K) - ENDDO - ENDDO -! - DO K=KTS,KTE+1 - DO I=MYIS2,MYIE2 - PINT_IK(I,K)=PINT(I,J,K) - W_IK(I,K)=W(I,J,K) - ENDDO - ENDDO -! - DO I=MYIS2,MYIE2 - PSTR_IK(I,KTE+1)=PT - ENDDO -! -!----------------------------------------------------------------------- -! - DO K=KTE,KTS,-1 -! - IF(K==KTE)THEN - DO I=MYIS2,MYIE2 - DPPL=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J) - RDPP_IK(I,K)=1./DPPL - DPSTR=DWDT_IK(I,K)*DPPL - PSTR_IK(I,K)=PT+DPSTR - PP1=PT+DPSTR - PNP1_I(I)=(PP1-PINT_IK(I,K))*WGHT+PINT_IK(I,K) - TFC=Q_IK(I,K)*P608+(1.-CWM_IK(I,K)) - TTFC=-CAPA*TFC+1. - COFF_IK(I,K)=T_IK(I,K)*TTFC*TFC*DPPL*FFC & - /((PT+PNP1_I(I))*(PT+PNP1_I(I))) - ENDDO - ELSE - DO I=MYIS2,MYIE2 - DPPL=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J) - RDPP_ik(I,K)=1./DPPL - DPSTR=DWDT_IK(I,K)*DPPL - PSTR_IK(I,K)=PSTR_IK(I,K+1)+DPSTR - PP1=PNP1_I(I)+DPSTR - PNP=(PP1-PINT_IK(I,K))*WGHT+PINT_IK(I,K) - TFC=Q_IK(I,K)*P608+(1.-CWM_IK(I,K)) - TTFC=-CAPA*TFC+1. - COFF_IK(I,K)=T_IK(I,K)*TTFC*TFC*DPPL*FFC & - /((PNP1_I(I)+PNP)*(PNP+PNP1_I(I))) - PNP1_I(I)=PNP - ENDDO - ENDIF -! - ENDDO -! -!----------------------------------------------------------------------- -! - DO I=MYIS2,MYIE2 -!!BUG!! PSTRUP_I(I)=-(PSTR_IK(I,KTE)-PINT_IK(I,KTE))*COFF_IK(I,KTE) - PSTRUP_I(I)=-(PSTR_IK(I,KTE+1)+PSTR_IK(I,KTE) & - -PINT_IK(I,KTE+1)-PINT_IK(I,KTE))*COFF_IK(I,KTE) - ENDDO -! -!----------------------------------------------------------------------- - DO K=KTE-1,KTS,-1 -! - IF(K==KTE-1)THEN - DO I=MYIS2,MYIE2 - RDPDN=RDPP_IK(I,K) - RDPUP=RDPP_IK(I,K+1) -! - PSTRDN=-(PSTR_IK(I,K+1)+PSTR_IK(I,K) & - -PINT_IK(I,K+1)-PINT_IK(I,K)) & - *COFF_IK(I,K) -! - B1_IK(I,K)=COFF_IK(I,K+1)+RDPUP - B2_IK(I,K)=(COFF_IK(I,K+1)+COFF_IK(I,K))-(RDPUP+RDPDN) - B3_IK(I,K)=COFF_IK(I,K)+RDPDN - C0_IK(I,K)=PSTRUP_I(I)+PSTRDN - PSTRUP_I(I)=PSTRDN - ENDDO - ELSE - DO I=MYIS2,MYIE2 - RDPDN=RDPP_IK(I,K) - RDPUP=RDPP_IK(I,K+1) -! - PSTRDN=-(PSTR_IK(I,K+1)+PSTR_IK(I,K) & - -PINT_IK(I,K+1)-PINT_IK(I,K)) & - *COFF_IK(I,K) -! - B1_IK(I,K)=COFF_IK(I,K+1)+RDPUP - B2_IK(I,K)=(COFF_IK(I,K+1)+COFF_IK(I,K))-(RDPUP+RDPDN) - B3_IK(I,K)=COFF_IK(I,K)+RDPDN - C0_IK(I,K)=PSTRUP_I(I)+PSTRDN - PSTRUP_I(I)=PSTRDN - ENDDO - ENDIF -! - ENDDO -! -!----------------------------------------------------------------------- -!*** ELIMINATION -!----------------------------------------------------------------------- -! - DO K=KTE-2,KTS,-1 -! - IF(K>KTS)THEN - DO I=MYIS2,MYIE2 - TMP=-B1_IK(I,K)/B2_IK(I,K+1) - B2_IK(I,K)=B3_IK(I,K+1)*TMP+B2_IK(I,K) - C0_IK(I,K)=C0_IK(I,K+1)*TMP+C0_IK(I,K) - ENDDO - ELSE - DO I=MYIS2,MYIE2 - TMP=-B1_IK(I,K)/B2_IK(I,K+1) - B2_IK(I,K)=B3_IK(I,K+1)*TMP & - +(B2_IK(I,KTS)+B3_IK(I,KTS)) - C0_IK(I,K)=C0_IK(I,K+1)*TMP+C0_IK(I,K) - ENDDO - ENDIF -! - ENDDO -! -!----------------------------------------------------------------------- -!*** BACK SUBSTITUTION -!----------------------------------------------------------------------- -! - DO K=KTS+1,KTE -! - IF(K==KTS+1)THEN - DO I=MYIS2,MYIE2 - CHI_IK(I,K)=C0_IK(I,KTS)/B2_IK(I,KTS) - CHI_IK(I,KTS)=CHI_IK(I,K) - ENDDO - ELSE - DO I=MYIS2,MYIE2 - CHI_IK(I,K)=(-B3_IK(I,K-1)*CHI_IK(I,K-1)+C0_IK(I,K-1)) & - /B2_IK(I,K-1) - ENDDO - ENDIF -! - ENDDO -!----------------------------------------------------------------------- -! - FCT=0.5/CP -! - DO K=KTE,KTS,-1 -! - IF(K==KTE)THEN - DO I=MYIS2,MYIE2 - DPTL=(CHI_IK(I,K)+PSTR_IK(I,K)-PINT_IK(I,K))*HBM3(I,J) - PINT_IK(I,K)=PINT_IK(I,K)+DPTL - T_IK(I,K)=DPTL*RTOP_IK(I,K)*FCT+T_IK(I,K) - DELP=(PINT_IK(I,K)-PINT_IK(I,K+1))*RDPP_IK(I,K) - W_IK(I,K)=((DELP-DWDT_IK(I,K))*GDT+W_IK(I,K))*HBM3(I,J) - DWDT_IK(I,K)=(DELP-1.)*HBM3(I,J)+1. - DPTU_I(I)=DPTL - ENDDO - ELSE - DO I=MYIS2,MYIE2 - DPTL=(CHI_IK(I,K)+PSTR_IK(I,K)-PINT_IK(I,K))*HBM3(I,J) - PINT_IK(I,K)=PINT_IK(I,K)+DPTL - T_IK(I,K)=(DPTU_I(I)+DPTL)*RTOP_IK(I,K)*FCT+T_IK(I,K) - DELP=(PINT_IK(I,K)-PINT_IK(I,K+1))*RDPP_IK(I,K) - W_IK(I,K)=((DELP-DWDT_IK(I,K))*GDT+W_IK(I,K))*HBM3(I,J) - DWDT_IK(I,K)=(DELP-1.)*HBM3(I,J)+1. - DPTU_I(I)=DPTL - ENDDO - ENDIF -! - ENDDO -! -!----------------------------------------------------------------------- - DO K=KTS,KTE - DO I=MYIS2,MYIE2 - PINT(I,J,K)=PINT_IK(I,K) - T(I,J,K)=T_IK(I,K) - W(I,J,K)=W_IK(I,K) - DWDT(I,J,K)=DWDT_IK(I,K) - ENDDO - ENDDO -!----------------------------------------------------------------------- -! - ENDDO final_update -! -!----------------------------------------------------------------------- -!*** DEFINE OUTPUT W FIELD -!----------------------------------------------------------------------- -! - IF (WP .ge. 0.001) THEN - DO K=KTS,KTE+1 - DO J=MYJS,MYJE - DO I=MYIS,MYIE - W_TOT(I,J,K)=W(I,J,K)+BARO(I,J) - ENDDO - ENDDO - ENDDO - ELSE - DO K=KTS,KTE+1 - DO J=MYJS,MYJE - DO I=MYIS,MYIE - W_TOT(I,J,K)=W(I,J,K) - ENDDO - ENDDO - ENDDO - ENDIF -! -!----------------------------------------------------------------------- -! - END SUBROUTINE EPS -! -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*********************************************************************** - SUBROUTINE VADZ(NTSD,DT,FIS,SIGMA,DFL,HBM2 & - ,DETA1,DETA2,PDTOP & - ,PINT,PDSL,PDSLO,PETDT & - ,RTOP,T,Q,CWM,Z,W,DWDT,PDWDT & - ,IHE,IHW,IVE,IVW & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: VADZ VERTICAL ADVECTION OF HEIGHT -! PRGRMMR: JANJIC ORG: W/NP22 DATE: 93-11-17 -! -! ABSTRACT: -! VADV CALCULATES THE CONTRIBUTION OF THE VERTICAL ADVECTION -! OF HEIGHT IN ORDER TO COMPUTE W=DZ/DT DIAGNOSTICALLY -! -! PROGRAM HISTORY LOG: -! 96-05-?? JANJIC - ORIGINATOR -! 00-01-04 BLACK - DISTRIBUTED MEMORY AND THREADS -! 01-03-26 BLACK - CONVERTED TO WRF STRUCTURE -! 02-02-19 BLACK - CONVERSION UPDATED -! 04-11-22 BLACK - THREADED -! 05-12-12 BLACK - CONVERTED FROM IKJ TO IJK -! -! USAGE: CALL VADZ FROM MAIN PROGRAM -! INPUT ARGUMENT LIST: -! -! OUTPUT ARGUMENT LIST: -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!*********************************************************************** -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -#ifdef AS_RECEIVED - LOGICAL,INTENT(IN) :: SIGMA -#else - INTEGER,INTENT(IN) :: SIGMA -#endif -! - INTEGER,INTENT(IN) :: NTSD -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW -! -!----------------------------------------------------------------------- -! - REAL,INTENT(IN) :: DT,PDTOP -! - REAL,DIMENSION(KTS:KTE),INTENT(IN) :: DETA1,DETA2 -! - REAL,DIMENSION(KTS:KTE+1),INTENT(IN) :: DFL -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: FIS,HBM2,PDSL,PDSLO -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PETDT -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: CWM,Q & - ,RTOP,T -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(OUT) :: PDWDT -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: DWDT -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PINT -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(OUT) :: W,Z -!----------------------------------------------------------------------- -! -!*** LOCAL VARIABLES -! -!----------------------------------------------------------------------- - INTEGER :: I,J,K -! - REAL,DIMENSION(IMS:IME,JMS:JME) :: FNE,FSE,TTB -! - REAL :: DZ,RDT,TTAL,ZETA -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- - RDT=1./DT -! - DO K=KTS,KTE - DO J=MYJS,MYJE - DO I=MYIS,MYIE - PDWDT(I,J,K)=DWDT(I,J,K) - DWDT(I,J,K)=W(I,J,K) - ENDDO - ENDDO - ENDDO -! - DO J=MYJS,MYJE - DO I=MYIS,MYIE - W(I,J,KTS)=0. -! -#ifdef AS_RECEIVED - IF(SIGMA)THEN -#else - IF(SIGMA==1)THEN -#endif - Z(I,J,KTS)=FIS(I,J)*RG - ELSE - Z(I,J,KTS)=0. - ENDIF - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(dz,i,j,k,zeta) -!----------------------------------------------------------------------- -! - kloop1 : DO K=KTS,KTE -! -!----------------------------------------------------------------------- -! - DO J=MYJS,MYJE - DO I=MYIS,MYIE -! - ZETA=DFL(K+1)*RG - DZ=(Q(I,J,K)*P608-CWM(I,J,K)+1.)*T(I,J,K) & - /(PINT(I,J,K+1)+PINT(I,J,K)) & - *(DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J))*TRG - Z(I,J,K+1)=Z(I,J,K)+DZ - W(I,J,K+1)=(DZ-RTOP(I,J,K) & - *(DETA1(K)*PDTOP+DETA2(K)*PDSLO(I,J))*RG) & - *HBM2(I,J) & - +W(I,J,K) -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - ENDDO kloop1 -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(i,j,k) -!----------------------------------------------------------------------- - DO K=KTS,KTE -! - DO J=MYJS,MYJE - DO I=MYIS,MYIE - Z(I,J,K)=(Z(I,J,K+1)+Z(I,J,K))*0.5 - W(I,J,K)=(W(I,J,K+1)+W(I,J,K))*HBM2(I,J)*0.5*RDT - ENDDO - ENDDO -! - ENDDO -!----------------------------------------------------------------------- -! - DO J=MYJS,MYJE - DO I=MYIS,MYIE - TTB(I,J)=0. - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(i,j,k,ttal) -!----------------------------------------------------------------------- - DO K=KTE,KTS+1,-1 - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - TTAL=(Z(I,J,K-1)-Z(I,J,K))*PETDT(I,J,K-1)*0.5 - W(I,J,K)=(TTAL+TTB(I,J))/(DETA1(K)*PDTOP+DETA2(K)*PDSLO(I,J)) & - +W(I,J,K) - TTB(I,J)=TTAL - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(i,j) -!----------------------------------------------------------------------- - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - W(I,J,KTS)=TTB(I,J)/(DETA1(KTS)*PDTOP+DETA2(KTS)*PDSLO(I,J)) & - +W(I,J,KTS) - ENDDO - ENDDO -!----------------------------------------------------------------------- - END SUBROUTINE VADZ -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*********************************************************************** - SUBROUTINE HADZ(NTSD,DT,HYDRO,HBM2,DETA1,DETA2,PDTOP & - ,DX,DY,FAD & - ,FEW,FNS,FNE,FSE & - ,PDSL,U,V,W,Z,WP,BARO & - ,IHE,IHW,IVE,IVW & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: HADZ HORIZONTAL ADVECTION OF HEIGHT -! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-05-?? -! -! ABSTRACT: -! HADZ CALCULATES DIAGNOSTICALLY THE CONTRIBUTION OF -! THE HORIZONTAL ADVECTION OF HEIGHT -! -! PROGRAM HISTORY LOG: -! 96-05-?? JANJIC - ORIGINATOR -! 00-01-04 BLACK - DISTRIBUTED MEMORY AND THREADS -! 01-03-26 BLACK - CONVERTED TO WRF STRUCTURE -! 04-11-22 BLACK - THREADED -! 05-12-12 BLACK - CONVERTED FROM IKJ TO IJK -! -! USAGE: CALL HADZ FROM MAIN PROGRAM -! INPUT ARGUMENT LIST: -! -! OUTPUT ARGUMENT LIST: -! NONE -! -! OUTPUT FILES: -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!*********************************************************************** -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- - LOGICAL,INTENT(IN) :: HYDRO -! - INTEGER,INTENT(IN) :: NTSD -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE -! - INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW -! -!----------------------------------------------------------------------- -! - REAL,INTENT(IN) :: DT,DY,PDTOP,WP -! - REAL,DIMENSION(KMS:KME-1),INTENT(IN) :: DETA1,DETA2 -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,FAD,HBM2,PDSL - - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: BARO -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: U,V -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(OUT) :: FEW,FNE & - ,FNS,FSE -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: Z -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: W -!----------------------------------------------------------------------- -! -!*** LOCAL VARIABLES -! -!----------------------------------------------------------------------- - INTEGER,PARAMETER :: NTSHY=2 -! - INTEGER :: I,J,K -! - REAL :: FEWP,FNEP,FNSP,FSEP,UDY,VDX -! - REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: DPDE,UNED,USED & - & ,ZEW,ZNE,ZNS,ZSE,TTB -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- - IF(NTSD+1<=NTSHY.OR.HYDRO)THEN -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KTS,KTE - DO J=MYJS,MYJE - DO I=MYIS,MYIE - W(I,J,K)=0. - ENDDO - ENDDO - ENDDO -!*** - RETURN -!*** - ENDIF -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! -!*** FIRST ZERO OUT SOME WORKING ARRAYS -! -!$omp parallel do & -!$omp& private(i,j) - DO J=JTS-5,JTE+5 - DO I=ITS-5,ITE+5 - ZEW(i,j)=0 - ZNE(i,j)=0 - ZNS(i,j)=0 - ZSE(i,j)=0 - TTB(i,j)=0 - DPDE(I,J)=0. - UNED(I,J)=0. - USED(I,J)=0. - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(dpde,fewp,fnep,fnsp,fsep,i,j,udy,uned,used,vdx & -!$omp& ,zew,zne,zns,zse) -!----------------------------------------------------------------------- -! - main_integration: DO K=KTS,KTE -! -!----------------------------------------------------------------------- -! -!*** MASS FLUXES AND MASS POINT ADVECTION COMPONENTS -! -!----------------------------------------------------------------------- -! - DO J=MYJS_P3,MYJE_P3 - DO I=MYIS_P4,MYIE_P4 - DPDE(I,J)=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J) - ENDDO - ENDDO -! - DO J=MYJS1_P3,MYJE1_P3 - DO I=MYIS_P3,MYIE_P3 - UDY=U(I,J,K)*DY - VDX=V(I,J,K)*DX(I,J) -! - FEWP=UDY*(DPDE(I+IVW(J),J)+DPDE(I+IVE(J),J)) - FNSP=VDX*(DPDE(I,J-1)+DPDE(I,J+1)) -! - FEW(I,J,K)=FEWP - FNS(I,J,K)=FNSP -! - ZEW(I,J)=FEWP*(Z(I+IVE(J),J,K)-Z(I+IVW(J),J,K)) - ZNS(I,J)=FNSP*(Z(I,J+1,K)-Z(I,J-1,K)) -! - UNED(I,J)=UDY+VDX - USED(I,J)=UDY-VDX -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! -!*** DIAGONAL FLUXES AND DIAGONALLY AVERAGED WIND -! -!----------------------------------------------------------------------- - DO J=MYJS1_P2,MYJE2_P2 - DO I=MYIS_P2,MYIE1_P2 - FNEP=(UNED(I+IHE(J),J)+UNED(I,J+1)) & - & *(DPDE(I,J)+DPDE(I+IHE(J),J+1)) - FNE(I,J,K)=FNEP - ZNE(I,J)=FNEP*(Z(I+IHE(J),J+1,K)-Z(I,J,K)) - ENDDO - ENDDO -! - DO J=MYJS2_P2,MYJE1_P2 - DO I=MYIS_P2,MYIE1_P2 - FSEP=(USED(I+IHE(J),J)+USED(I,J-1)) & - & *(DPDE(I,J)+DPDE(I+IHE(J),J-1)) - FSE(I,J,K)=FSEP - ZSE(I,J)=FSEP*(Z(I+IHE(J),J-1,K)-Z(I,J,K)) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! -!*** ADVECTION OF Z -! -!----------------------------------------------------------------------- -! - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 - - W(I,J,K)=-(ZEW(I+IHW(J),J) +ZEW(I+IHE(J),J) & - +ZNS(I,J-1) +ZNS(I,J+1) & - +ZNE(I+IHW(J),J-1)+ZNE(I,J) & - +ZSE(I,J) +ZSE(I+IHW(J),J+1)) & - *FAD(I,J)*2.0*HBM2(I,J)/(DPDE(I,J)*DT) & - +W(I,J,K) - - ENDDO - ENDDO - - ENDDO main_integration - - IF (WP .ge. 0.001) then -!----------------------------------------------------------------------- -!---taking external mode out-------------------------------------------- -!----------------------------------------------------------------------- - - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 - BARO(I,J)=0. - ENDDO - ENDDO -! - DO K=KTS,KTE - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 - DPDE(I,J)=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J) - BARO(I,J)=(DPDE(I,J))*W(I,J,K)+BARO(I,J) - ENDDO - ENDDO - ENDDO -! - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 - BARO(I,J)=BARO(I,J)/(PDSL(I,J)+PDTOP) - ENDDO - ENDDO -! - - DO K=KTS,KTE - DO J=MYJS2_P1,MYJE2_P1 - DO I=MYIS1_P1,MYIE1_P1 - W(I,J,K)=W(I,J,K)-BARO(I,J) - ENDDO - ENDDO - ENDDO - - ENDIF -! -!----------------------------------------------------------------------- -! - END SUBROUTINE HADZ -! -!----------------------------------------------------------------------- -! - END MODULE MODULE_NONHY_DYNAM -! -!----------------------------------------------------------------------- diff --git a/dyn_nmm/module_PHYSICS_CALLS.F b/dyn_nmm/module_PHYSICS_CALLS.F deleted file mode 100644 index 877823ef3f..0000000000 --- a/dyn_nmm/module_PHYSICS_CALLS.F +++ /dev/null @@ -1,3645 +0,0 @@ -!----------------------------------------------------------------------- -! -!NCEP_MESO:MODEL_LAYER: PHYSICS -! -!----------------------------------------------------------------------- -#include "nmm_loop_basemacros.h" -#include "nmm_loop_macros.h" -!----------------------------------------------------------------------- -! - MODULE MODULE_PHYSICS_CALLS -! -!----------------------------------------------------------------------- - USE MODULE_DOMAIN - USE MODULE_DM - USE MODULE_CONFIGURE - USE MODULE_TILES - USE MODULE_STATE_DESCRIPTION,ONLY : P_QV,P_QC,P_QR,P_QI,P_QS,P_QG,P_QNI,P_QNR - USE MODULE_MODEL_CONSTANTS - USE MODULE_RA_GFDLETA,ONLY : CAL_MON_DAY,ZENITH - USE MODULE_RADIATION_DRIVER - USE MODULE_SF_MYJSFC - USE MODULE_SURFACE_DRIVER - USE MODULE_PBL_DRIVER - USE MODULE_GWD - USE MODULE_CU_BMJ - USE MODULE_CUMULUS_DRIVER - USE MODULE_MP_ETANEW - USE MODULE_MICROPHYSICS_DRIVER - USE MODULE_MICROPHYSICS_ZERO_OUT -!----------------------------------------------------------------------- -! - CONTAINS -! -!----------------------------------------------------------------------- -!*********************************************************************** - SUBROUTINE QITEND_FER_HIRES_ADVECT(QI,QRIMEF,QITEND) - IMPLICIT NONE - REAL, INTENT(INOUT) :: QI, QRIMEF - REAL, INTENT(IN) :: QITEND - REAL :: F_RIMEF - real, parameter :: max_f_rimef = 60.0, min_f_rimef=1.0 - - ! For the advected Ferrier-Aligo, we have to handle the QRIMEF - ! during tendency updates. - - ! Determine old rime factor from old QI and old QRIMEF: - IF(QI0.)THEN - CZMEAN(I,J)=CZMEAN(I,J)+CZEN(I,J) - TOT(I,J)=TOT(I,J)+1. - ENDIF - ENDDO - ENDDO -! - ENDDO -! -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS,MYJE - DO I=MYIS,MYIE - IF(TOT(I,J)>0.)CZMEAN(I,J)=CZMEAN(I,J)/TOT(I,J) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** COMPUTE TOTAL SFC SHORTWAVE DOWN FOR NON-GFDL SCHEMES -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 -! - IF(HBM2(I,J)>0.5)THEN - TOTSWDN(I,J)=SWNETDN(I,J)/(1.-ALBEDO(I,J)) -! -!--- No value currently available for clear-sky solar fluxes from -! non GFDL schemes, though it's needed for air quality forecasts. -! For the time being, set to the total downward solar fluxes. -! - TOTSWDNC(I,J)=TOTSWDN(I,J) - ENDIF -! - ENDDO - ENDDO -! - ENDIF !End non-GFDL block -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,iendx,j) - DO J=MYJS2,MYJE2 - IENDX=MYIE1 - IF(MOD(J,2)==0.AND.ITE==IDE)IENDX=IENDX-1 - DO I=MYIS1,IENDX -! - RSWIN(I,J)=TOTSWDN(I,J) - RSWINC(I,J)=TOTSWDNC(I,J) - RSWOUT(I,J)=TOTSWDN(I,J)-SWNETDN(I,J) -! - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(i,iendx,j,k) - DO J=MYJS2,MYJE2 - IENDX=MYIE1 - IF(MOD(J,2)==0.AND.ITE==IDE)IENDX=IENDX-1 - DO I=MYIS1,IENDX - DO K=KTS,KTE - RSWTT(I,J,K)=THRATENSW(I,K,J)*PI_PHY(I,K,J) - ENDDO -! - ENDDO - ENDDO -! - ENDIF nrads_block -! -!----------------------------------------------------------------------- -!*** LONGWAVE -!----------------------------------------------------------------------- -! - nradl_block: IF(MOD(NTSD,NRADL)==0)THEN -! -!$omp parallel do & -!$omp& private(i,iendx,j) - DO J=MYJS2,MYJE2 - IENDX=MYIE1 - IF(MOD(J,2)==0.AND.ITE==IDE)IENDX=IENDX-1 - DO I=MYIS1,IENDX -! - IF(HBM2(I,J)>0.5)THEN - TDUM=T(I,J,KTS) - SIGT4(I,J)=STBOLT*TDUM*TDUM*TDUM*TDUM - RLWIN(I,J)=TOTLWDN(I,J) - ENDIF -! - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(i,iendx,j,k) - DO J=MYJS2,MYJE2 - IENDX=MYIE1 - IF(MOD(J,2)==0.AND.ITE==IDE)IENDX=IENDX-1 -! - DO K=KTS,KTE - DO I=MYIS1,IENDX - IF(HBM2(I,J)>0.5)THEN - RLWTT(I,J,K)=THRATENLW(I,K,J)*PI_PHY(I,K,J) - ENDIF - ENDDO - ENDDO -! - ENDDO -! - ENDIF nradl_block -! -!----------------------------------------------------------------------- -!*** STORE 3D CLOUD FRACTIONS. -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,iendx,j,k) - DO K=KTS,KTE - DO J=MYJS2,MYJE2 - IENDX=MYIE1 - IF(MOD(J,2)==0.AND.ITE==IDE)IENDX=IENDX-1 - DO I=MYIS1,IENDX - CLDFRA(I,J,K)=CLFR(I,K,J) - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** RESET THE DIAGNOSTIC CONVECTIVE CLOUD TOPS/BOTTOMS AFTER -!*** EACH RADIATION CALL. -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,iendx,j) -!if (config_flags%ra_sw_physics/=hwrfswscheme.and.config_flags%ra_lw_physics/=hwrflwscheme)then - DO J=MYJS2,MYJE2 - IENDX=MYIE1 - IF(MOD(J,2)==0.AND.ITE==IDE)IENDX=IENDX-1 - DO I=MYIS1,IENDX - HBOT(I,J)=HBOTR(I,J) - HTOP(I,J)=HTOPR(I,J) - CUPPT(I,J)=CUPPTR(I,J) - ENDDO - ENDDO -!endif -! -!----------------------------------------------------------------------- -!*** ZERO OUT BOUNDARY ROWS. -!----------------------------------------------------------------------- -! - DO J=JTS,JTE - DO I=ITS,ITE - IF(HBM2(I,J)<0.5)THEN - ACFRST(I,J)=0. - ACFRCV(I,J)=0. - CFRACL(I,J)=0. - CFRACM(I,J)=0. - CFRACH(I,J)=0. - RSWTOA(I,J)=0. - RLWTOA(I,J)=0. - ENDIF - ENDDO - ENDDO -! -! -!----------------------------------------------------------------------- -!*** UPDATE THE PROGNOSTIC MOIST ARRAY. -!----------------------------------------------------------------------- -! - DO N=2,N_MOIST -!$omp parallel do & -!$omp& private(i,j,k) - DO J=JMS,JME - DO K=KMS,KME - DO I=IMS,IME - MOIST(I,J,K,N)=MOIST_TRANS(I,K,J,N) - ENDDO - ENDDO - ENDDO - ENDDO -! - DEALLOCATE(MOIST_TRANS,STAT=ISTAT) -! -!----------------------------------------------------------------------- -! - END SUBROUTINE RADIATION -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- - SUBROUTINE TURBL(NTSD,DT,NPHS,RESTRT & - & ,N_MOIST,N_SCALAR,NSOIL,SLDPTH,DZSOIL & - & ,DETA1,DETA2,AETA1,AETA2,ETA1,ETA2,PDTOP,PT & - & ,SM,HBM2,VBM2,DX_ARRAY,DFRLG & - & ,CZEN,CZMEAN,SIGT4,RLWIN,RSWIN,RADOT & -!- RLWIN/RSWIN - downward longwave/shortwave at the surface (also TOTLWDN/TOTSWDN in RADIATION) - & ,PD,RES,PINT,T,Q,CWM,F_ICE,F_RAIN,SR & - & ,Q2,U,V,THS,TSFC,SST,PREC,SNO & - & ,SCURX,SCURY & - & ,FIS,Z0,MZ0,Z0BASE,USTAR,MIXHT,PBLH,LPBL,EL_MYJ & !MZ0: MOMENTUM Z0 (KWON) - & ,MOIST,SCALAR,RMOL,MOL & - & ,EXCH_H,EXCH_M,F,AKHS,AKMS,AKHS_OUT,AKMS_OUT & - & ,THZ0,QZ0,UZ0,VZ0,QS,MAVAIL & - & ,STC,SMC,CMC,SMSTAV,SMSTOT,SSROFF,BGROFF & - & ,IVGTYP,ISLTYP,VEGFRC,SHDMIN,SHDMAX,GRNFLX & - & ,SNOTIME & - & ,SFCEXC,ACSNOW,ACSNOM,SNOPCX,SICE,TG,SOILTB & - & ,ALBSI,ICEDEPTH,SNOWSI & - & ,ALBASE,MXSNAL,ALBEDO,SH2O,SI,EPSR,EMBCK & - & ,U10,V10,UOCE,VOCE,TH10,Q10,TSHLTR,QSHLTR,PSHLTR & - & ,T2,QSG,QVG,QCG,SOILT1,TSNAV,SMFR3D,KEEPFR3DFLAG & - & ,TWBS,QWBS,TAUX,TAUY,SFCSHX,SFCLHX,SFCEVP,RTHRATEN& - & ,POTEVP,POTFLX,SUBSHX & - & ,APHTIM,ARDSW,ARDLW,ASRFC & - & ,RSWOUT,RSWTOA,RLWTOA & - & ,ASWIN,ASWOUT,ASWTOA,ALWIN,ALWOUT,ALWTOA & - & ,UZ0H,VZ0H,DUDT,DVDT,UGWDsfc,VGWDsfc,SFENTH & ! GWD - & ,RTHBLTEN,RQVBLTEN & - & ,PCPFLG,DDATA & ! PRECIP ASSIM - & ,HSTDV,HCNVX,HASYW,HASYS,HASYSW,HASYNW,HLENW & ! GWD - & ,HLENS,HLENSW,HLENNW,HANGL,HANIS,HSLOP,HZMAX & ! GWD - & ,CROT,SROT & ! GWD - & ,DEW & ! RUC LSM - & ,RC_MF & ! QNSE - & ,GRID,CONFIG_FLAGS & - & ,IHE,IHW,IVE,IVW & - & ,DISHEAT,DKU3D,DKT3D & - & ,HPBL2D, EVAP2D, HEAT2D,RC2D & !Kwon S&P - & ,SFCHEADRT,INFXSRT,SOLDRAIN & !Hydrology, no-op right now - & ,cd_out,ch_out & - & ,ulowl, vlowl & - & ,zkmax, ribn & - & ,charn, msang & - & ,DUBLDT,DVBLDT,DTHBLDT,DQVBLDT & - & ,hpbl_hold & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,IPS,IPE,JPS,JPE,KPS,KPE & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: TURBL TURBULENCE OUTER DRIVER -! PRGRMMR: BLACK ORG: W/NP22 DATE: 02-04-19 -! -! ABSTRACT: -! TURBL DRIVES THE TURBULENCE SCHEMES -! -! PROGRAM HISTORY LOG (with changes to called routines) : -! 95-03-15 JANJIC - ORIGINATOR OF THE SUBROUTINES CALLED -! BLACK & JANJIC - ORIGINATORS OF THE DRIVER -! 95-03-28 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL -! 96-03-29 BLACK - ADDED EXTERNAL EDGE; REMOVED SCRCH COMMON -! 96-07-19 MESINGER - ADDED Z0 EFFECTIVE -! 98-??-?? TUCCILLO - MODIFIED FOR CLASS VIII PARALLELISM -! 98-10-27 BLACK - PARALLEL CHANGES INTO MOST RECENT CODE -! 02-01-10 JANJIC - MOIST TURBULENCE (DRIVER, MIXLEN, VDIFH) -! 02-01-10 JANJIC - VERT. DIF OF Q2 INCREASED (Grenier & Bretherton) -! 02-02-02 JANJIC - NEW SFCDIF -! 02-04-19 BLACK - ORIGINATOR OF THIS OUTER DRIVER FOR WRF -! 02-05-03 JANJIC - REMOVAL OF SUPERSATURATION AT 2m AND 10m -! 04-11-18 BLACK - THREADED -! 05-12-15 BLACK - CONVERTED FROM IKJ TO IJK -! 07-05-15 FERRIER - ADDED GRAVITY WAVE DRAG (GWD) & MOUNTAIN BLOCKING -! -! USAGE: CALL TURBL FROM SOLVE_NMM -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM -!$$$ -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! -#if (NMM_CORE==1) - LOGICAL,INTENT(IN) :: DISHEAT ! hwrf's doing -#endif - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,IPS,IPE,JPS,JPE,KPS,KPE & - & ,ITS,ITE,JTS,JTE,KTS,KTE & - & ,N_MOIST,NPHS,NSOIL,NTSD,N_SCALAR -! - INTEGER, DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW -! - INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: ISLTYP,IVGTYP -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: HPBL2D, EVAP2D, HEAT2D , RC2D !Kwon S&P -! - INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: LPBL -! - REAL,INTENT(IN) :: DT,PDTOP,PT -! - REAL,INTENT(IN) :: SFENTH - REAL,INTENT(INOUT) :: APHTIM,ARDSW,ARDLW,ASRFC -! - REAL,DIMENSION(KMS:KME-1),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2 -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: RTHRATEN !Kwon S&P -! - REAL,DIMENSION(KMS:KME),INTENT(IN) :: DFRLG,ETA1,ETA2 -! - REAL,DIMENSION(NSOIL),INTENT(IN) :: DZSOIL,SLDPTH -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: CZEN,CZMEAN & - & ,DX_ARRAY & - & ,F,FIS,HBM2 & - & ,PD,RES & - & ,RLWIN,RLWTOA & - & ,RSWIN,RSWOUT,RSWTOA & - & ,SHDMIN,SHDMAX & -! & ,SICE,SIGT4,SM,SR & !Bandaid - & ,SIGT4 & - & ,HSTDV,HCNVX,HASYW,HASYS,HASYSW,HASYNW,HLENW & ! GWD - & ,HLENS,HLENSW,HLENNW,HANGL,HANIS,HSLOP,HZMAX & ! GWD - & ,CROT,SROT & ! GWD - & ,VBM2,VEGFRC - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: SST - REAL,DIMENSION(IMS:IME,JMS:JME) :: ALBSI - REAL,DIMENSION(IMS:IME,JMS:JME) :: ICEDEPTH - REAL,DIMENSION(IMS:IME,JMS:JME) :: SNOWSI -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: SM,EPSR,SR & !Bandaid - ,TG,SICE & - ,EMBCK - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: ALBASE,MXSNAL -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: ACSNOM,ACSNOW & - & ,SNOTIME & - & ,AKHS,AKMS & - & ,ALBEDO & - & ,BGROFF,CMC & - & ,MAVAIL,MOL & - & ,MIXHT & - & ,PBLH,POTEVP & - & ,POTFLX,PREC & - & ,QCG,QS,QSG & - & ,QVG,QZ0 & - & ,RMOL & - & ,SFCEVP & - & ,SFCLHX,SFCSHX & - & ,SI,SMSTOT & - & ,SNO,SNOPCX & - & ,SOILT1 & - & ,SSROFF,SUBSHX & - & ,T2,THS,THZ0 & - & ,TSFC,TSNAV & - & ,USTAR,UZ0,UZ0H & - & ,VZ0,VZ0H & - & ,DEW & !RUC LSM - & ,Z0,MZ0,Z0BASE !MZ0 (KWON) -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: AKHS_OUT,AKMS_OUT & - & ,ALWIN,ALWOUT & - & ,ALWTOA,ASWIN & - & ,ASWOUT,ASWTOA & - & ,PSHLTR,Q10,QSHLTR & - & ,TH10,TSHLTR & - & ,U10,V10 & ! GWD - & ,UOCE,VOCE & - & ,UGWDsfc,VGWDsfc ! GWD -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: GRNFLX,QWBS,RADOT & - ,SFCEXC,SMSTAV & - ,SOILTB,TWBS -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: scurx, scury - - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: cd_out,ch_out - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: & - DTHBLDT & - ,DQVBLDT & - ,DUBLDT & - ,DVBLDT - - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: taux, tauy - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: zkmax, ribn - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: charn, msang - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PINT -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: CWM & - & ,DUDT & - & ,DVDT & - & ,Q,Q2 & - & ,T,U,V -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: F_ICE & !<--- Used only in physics (IKJ) - & ,F_RAIN & - & ,RQVBLTEN & - & ,RTHBLTEN -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: EL_MYJ & !<--- Used only in physics (IKJ) - & ,EXCH_H & - & ,EXCH_M -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(OUT) :: DKU3D,DKT3D ! KWON - REAL,DIMENSION(IMS:IME,NSOIL,JMS:JME),INTENT(INOUT) :: KEEPFR3DFLAG & !<--- Used only in physics (IKJ) - & ,SH2O,SMC & - & ,SMFR3D,STC - - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: RC_MF ! QNSE only -! - REAL,DIMENSION(IMS:IME,NSOIL,JMS:JME) :: SMCREL -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,N_MOIST) & - & ,INTENT(INOUT) :: MOIST -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,N_SCALAR) & - & ,INTENT(INOUT) :: SCALAR -! - LOGICAL,INTENT(IN) :: RESTRT -! - TYPE(DOMAIN),TARGET :: GRID -! - TYPE(GRID_CONFIG_REC_TYPE),INTENT(IN) :: CONFIG_FLAGS -! -! For precip assimilation: - LOGICAL,INTENT(IN) :: PCPFLG - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DDATA - - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: SFCHEADRT ! Hydrology, no-op right now - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: INFXSRT,SOLDRAIN ! Hydrology, no-op right now -! -!----------------------------------------------------------------------- -!*** -!*** LOCAL VARIABLES -!*** -!----------------------------------------------------------------------- - INTEGER :: I,I_M,IDUMMY,IEND,ISFFLX,ISTAT,ISTR,J,K,KOUNT_ALL & - & ,LENGTH_ROW,LLIJ,LLYR,N,SST_UPDATE,SF_URBAN_PHYSICS,NUM_URBAN_LAYERS - INTEGER :: FASDAS -! - INTEGER,DIMENSION(IMS:IME,JMS:JME) :: KPBL,LOWLYR -! - REAL :: TRESH=0.95 -! - REAL :: ALTITUDE,CWML,DQDT,DTDT,DTPHS,DX,DZHALF,FACTR,FACTRL & - & ,G_INV,PLYR,PSFC,QI,QL,QOLD,QR,QW,RATIOMX,RDTPHS,DY & - & ,ROG,RWMSK,SDEPTH,SNO_FACTR,TL,TLMH,TLMH4,TNEW,TSFC2 & - & ,U_FRAME,V_FRAME,XLVRW -! - REAL :: APES,CAPA,CKLQ,EXNER,FACTOR,FFS,PQ0X,Q2SAT,QFC1,QLOWX & - & ,RLIVWV,THBOT,DPL -! - REAL,DIMENSION(IMS:IME,JMS:JME) :: BR,CHKLOWQ,CT,CWMLOW,ELFLX & - & ,EXNSFC,FACTRS,FLHC,FLQC,GZ1OZ0 & - & ,FH,FM,ZOL & - & ,ONE,PDSL,PLM,PSFC_OUT,PSIH & - & ,PSIM,Q2X,QLOW,RAIN,RAINBL & - & ,RLW_DN_SFC,RSW_NET_SFC & - & ,RSW_DN_SFC & - & ,SFCEVPX,SFCZ,SNOW,SNOWC,SNOWH & - & ,TH2X,THLOW,TLOW,VGFRCK & - & ,RS,XLAIDYN & - & ,WSPD,XLAND,REGIME,HOL -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME) :: DUDT_PHY,DVDT_PHY,DZ & - & ,P_PHY,P8W,PI_PHY & - & ,RQCBLTEN,RQIBLTEN & -!BSF & ,RQSBLTEN,RQRBLTEN,RQGBLTEN & - & ,RR,DELP & ! GWD - & ,T_PHY,TH_PHY,TKE & - & ,DUDT_GWD,DVDT_GWD & ! GWD - & ,U_PHY,V_PHY,Z -! - REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: ULOWL, VLOWL -! - REAL,DIMENSION(:,:,:,:),ALLOCATABLE :: MOIST_TRANS -! - REAL,DIMENSION(IMS:IME,NSOIL,JMS:JME) :: ZERO_SOIL -! - REAL,DIMENSION(IMS:IME,JMS:JME) :: wstar_ysu, delta_ysu - REAL,DIMENSION(IMS:IME,JMS:JME) :: hpbl_hold -! - LOGICAL :: E_BDY,WARM_RAIN - LOGICAL :: IS_CAMMGMP_USED=.FALSE. -! - INTEGER :: NUM_ROOF_LAYERS,NUM_WALL_LAYERS,NUM_ROAD_LAYERS ! urban - INTEGER :: FRACTIONAL_SEAICE - INTEGER :: SEAICE_ALBEDO_OPT - REAL :: SEAICE_ALBEDO_DEFAULT - INTEGER :: SEAICE_THICKNESS_OPT - REAL :: SEAICE_THICKNESS_DEFAULT - INTEGER :: SEAICE_SNOWDEPTH_OPT - REAL :: SEAICE_SNOWDEPTH_MAX - REAL :: SEAICE_SNOWDEPTH_MIN - INTEGER :: IFNDALBSI - INTEGER :: IFNDICEDEPTH - INTEGER :: IFNDSNOWSI - REAL :: WIND - INTEGER :: IGS,IGE,JGS,JGE, PQ_I !BSF - LOGICAL :: FQ_I, ETAMP_PHYSICS,ETAMP_Regional !BSF - - CHARACTER(len=255) :: message -#if HWRF==1 -!dbg integer :: kpblmin,kpblmax,lpblmin,lpblmax !dbg - logical :: pert_pbl - logical :: pert_Cd - real :: ens_Cdamp - real :: ens_pblamp - integer :: ens_random_seed -#endif -! -! - TYPE(WRFU_Time) :: currentTime - INTEGER :: yr, month, day, hr, minute, sec, rc - CHARACTER*80 :: mesg - - INTEGER :: isurban - CHARACTER(len=256) :: MMINLU - REAL :: VAR_RIC,coef_ric_s,coef_ric_l !KWON for variable Ric (=1) -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! - ALLOCATE(MOIST_TRANS(IMS:IME,KMS:KME,JMS:JME,N_MOIST),STAT=ISTAT) -! - SF_URBAN_PHYSICS=CONFIG_FLAGS%SF_URBAN_PHYSICS - FASDAS=0 - - if ( config_flags%bl_pbl_physics == BOULACSCHEME ) then - call wrf_error_fatal("Cannot use BOULAC PBL with NMM") - endif - - FRACTIONAL_SEAICE = CONFIG_FLAGS%FRACTIONAL_SEAICE - IF ( FRACTIONAL_SEAICE == 1 ) THEN - CALL WRF_ERROR_FATAL("NMM cannot use FRACTIONAL_SEAICE = 1.") - ENDIF - - SEAICE_ALBEDO_OPT = CONFIG_FLAGS%SEAICE_ALBEDO_OPT - IF ( SEAICE_ALBEDO_OPT /= 0 ) THEN - CALL WRF_ERROR_FATAL("NMM must use SEAICE_ALBEDO_OPT = 0") - ENDIF - - IFNDALBSI = 0 - IFNDSNOWSI = 0 - IFNDICEDEPTH = 0 - BR=10 - - SEAICE_ALBEDO_DEFAULT = CONFIG_FLAGS%SEAICE_ALBEDO_DEFAULT - SEAICE_THICKNESS_OPT = CONFIG_FLAGS%SEAICE_THICKNESS_OPT - SEAICE_THICKNESS_DEFAULT = CONFIG_FLAGS%SEAICE_THICKNESS_DEFAULT - SEAICE_SNOWDEPTH_OPT = CONFIG_FLAGS%SEAICE_SNOWDEPTH_OPT - SEAICE_SNOWDEPTH_MAX = CONFIG_FLAGS%SEAICE_SNOWDEPTH_MAX - SEAICE_SNOWDEPTH_MIN = CONFIG_FLAGS%SEAICE_SNOWDEPTH_MIN -! - DTPHS=NPHS*DT - RDTPHS=1./DTPHS - G_INV=1./G - ROG=R_D*G_INV - FACTOR=-XLV*RHOWATER/DTPHS - CAPA=R_D/CP -! - U_FRAME=0. - V_FRAME=0. -! - IDUMMY=0 - ISFFLX=1 - DX=0. - DY=0. - SST_UPDATE=config_flags%SST_UPDATE -! -!$omp parallel do & -!$omp& private(i,j) - DO J=JMS,JME - DO I=IMS,IME - UZ0H(I,J)=0. - VZ0H(I,J)=0. - ONE(I,J)=1. - RMOL(I,J)=0. !Reciprocal of Monin-Obukhov length - SFCEVPX(I,J)=0. !Dummy for accumulated latent energy, not flux - ZOL(I,J)=0. - ENDDO - ENDDO -! - IF(MODEL_CONFIG_REC%SF_SURFACE_PHYSICS(GRID%ID)==99)THEN - SNO_FACTR=1. - ELSE - SNO_FACTR=0.001 - ENDIF -! -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS,MYJE - DO I=MYIS,MYIE - LOWLYR(I,J)=1 - VGFRCK(I,J)=100.*VEGFRC(I,J) - SNOW(I,J)=SNO(I,J) - SNOWH(I,J)=SI(I,J)*SNO_FACTR - XLAND(I,J)=SM(I,J)+1. - T2(I,J)=TSFC(I,J) - ENDDO - ENDDO -! - IF(NTSD==0)THEN -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS,MYJE - DO I=MYIS,MYIE - Z0BASE(I,J)=Z0(I,J) - IF(SM(I,J)>0.5.AND.SICE(I,J)>0.5)THEN !Bandaid - SM(I,J)=0. - ENDIF - ENDDO - ENDDO - ENDIF -! -!$omp parallel do & -!$omp& private(i,j,k) - DO J=MYJS,MYJE - DO K=KTS,KTE+1 - DO I=MYIS,MYIE - Z(I,K,J)=0. - DZ(I,K,J)=0. - EXCH_H(I,K,J)=0. - EXCH_M(I,K,J)=0. - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! -!*** PREPARE NEEDED ARRAYS FOR CALLING THE INNER DRIVER. -! -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(factrl,i,j,llij,tlmh) - DO J=MYJS,MYJE - DO I=MYIS,MYIE -! - PDSL(I,J)=PD(I,J)*RES(I,J) -!!! PSFC=PD(I,J)+PDTOP+PT -!!! P8W(I,KTS,J)=PSFC - P8W(I,KTS,J)=PINT(I,J,KTS) - PSFC=PINT(I,J,KTS) - LOWLYR(I,J)=KTS !<---- The lowest model layer counted from the bottom. - EXNSFC(I,J)=(1.E5/PSFC)**CAPA - THS(I,J)=(SST(I,J)*EXNSFC(I,J))*SM(I,J)+THS(I,J)*(1.-SM(I,J)) - TSFC(I,J)=THS(I,J)/EXNSFC(I,J) - SFCZ(I,J)=FIS(I,J)*G_INV -!YL RAIN(I,J)=PREC(I,J)*RHOWATER - IF (PCPFLG.AND.DDATA(I,J)<100.)THEN - RAIN(I,J)=DDATA(I,J)*RHOWATER - ELSE - RAIN(I,J)=PREC(I,J)*RHOWATER - ENDIF -!YL - RAINBL(I,J)=0. - IF(SNO(I,J)>0.)SNOWC(I,J)=1. - LLIJ=LOWLYR(I,J) - PLM(I,J)=(PINT(I,J,LLIJ)+PINT(I,J,LLIJ+1))*0.5 - TH2X(I,J)=T(I,J,LLIJ)*(1.E5/PLM(I,J))**CAPA - Q2X(I,J)=Q(I,J,LLIJ) -! -!----------------------------------------------------------------------- -!*** LONG AND SHORTWAVE FLUX AT GROUND SURFACE -!----------------------------------------------------------------------- -! - IF(CZMEAN(I,J)>0.)THEN - FACTRS(I,J)=CZEN(I,J)/CZMEAN(I,J) - ELSE - FACTRS(I,J)=0. - ENDIF -! - IF(SIGT4(I,J)>0.)THEN - TLMH=T(I,J,LLIJ) - FACTRL=STBOLT*TLMH*TLMH*TLMH*TLMH/SIGT4(I,J) - ELSE - FACTRL=0. - ENDIF -! -!- RLWIN/RSWIN - downward longwave/shortwave at the surface -! - RLW_DN_SFC(I,J)=RLWIN(I,J)*HBM2(I,J)*FACTRL - RSW_NET_SFC(I,J)=(RSWIN(I,J)-RSWOUT(I,J))*HBM2(I,J)*FACTRS(I,J) -! -!- Instant downward solar for nmm_lsm -! - RSW_DN_SFC(I,J)=RSWIN(I,J)*HBM2(I,J)*FACTRS(I,J) -! - Z(I,KTS,J)=SFCZ(I,J) -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** FILL THE ARRAYS FOR CALLING THE INNER DRIVER. -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(cwml,i,j,k,plyr,qi,ql,qr,qw,tl) - DO J=MYJS,MYJE - DO K=KTS,KTE - DO I=MYIS,MYIE - Q2(I,J,K)=MAX(Q2(I,J,K)*HBM2(I,J),EPSQ2) - QL=MAX(Q(I,J,K),EPSQ) - PLYR=(PINT(I,J,K)+PINT(I,J,K+1))*0.5 -!!! PLYR=AETA1(K)*PDTOP+AETA2(K)*PDSL(I,J)+PT - TL=T(I,J,K) - CWML=CWM(I,J,K) -! - RR(I,K,J)=PLYR/(R_D*TL) - T_PHY(I,K,J)=TL -! - EXNER=(1.E5/PLYR)**CAPA - PI_PHY(I,K,J)=1./EXNER - TH_PHY(I,K,J)=TL*EXNER - P8W(I,K+1,J)=PINT(I,J,K+1) -!!! P8W(I,K+1,J)=ETA1(K+1)*PDTOP+ETA2(K+1)*PDSL(I,J)+PT - P_PHY(I,K,J)=PLYR - TKE(I,K,J)=0.5*Q2(I,J,K) -! - RTHBLTEN(I,K,J)=0. - RQVBLTEN(I,K,J)=0. - RQCBLTEN(I,K,J)=0. - RQIBLTEN(I,K,J)=0. -!BSF RQSBLTEN(I,K,J)=0. -!BSF RQRBLTEN(I,K,J)=0. -!BSF RQGBLTEN(I,K,J)=0. -! -!-- Next 3 lines modified for GWD -! - DPL=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J) - Z(I,K+1,J)=Z(I,K,J)+TL/PLYR*DPL*ROG*(Q(I,J,K)*P608-CWML+1.) - DELP(I,K,J)=DPL - DZ(I,K,J)=Z(I,K+1,J)-Z(I,K,J) - ENDDO - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(i,j,llyr,qlowx) - DO J=MYJS,MYJE - DO I=MYIS,MYIE - TWBS(I,J)=0. - QWBS(I,J)=0. - LLYR=LOWLYR(I,J) - THLOW(I,J)=TH_PHY(I,LLYR,J) - TLOW(I,J)=T_PHY(I,LLYR,J) - QLOW(I,J)=MAX(Q(I,J,LLYR),EPSQ) - QLOWX=QLOW(I,J)/(1.-QLOW(I,J)) - QLOW(I,J)=QLOWX/(1.+QLOWX) - CWMLOW(I,J)=CWM(I,J,LLYR) - PBLH(I,J)=MAX(PBLH(I,J),0.) - PBLH(I,J)=MIN(PBLH(I,J),Z(I,KTE,J)) - ENDDO - ENDDO -!----------------------------------------------------------------------- -! -!*** COMPUTE VELOCITY COMPONENTS AT MASS POINTS -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KTS,KTE - DO J=MYJS1_P1,MYJE1_P1 - DO I=MYIS_P1,MYIE_P1 - U_PHY(I,K,J)=(U(I+IHE(J),J,K)+U(I+IHW(J),J,K) & - & +U(I,J+1,K)+U(I,J-1,K)) & - & *0.25 - V_PHY(I,K,J)=(V(I+IHE(J),J,K)+V(I+IHW(J),J,K) & - & +V(I,J+1,K)+V(I,J-1,K)) & - & *0.25 - IF ( K == KTS ) THEN - ULOWL(I,J) = U_PHY(I,K,J) - VLOWL(I,J) = V_PHY(I,K,J) - ENDIF - ENDDO - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(i,iend,istr,j) - DO J=MYJS1_P1,MYJE1_P1 - IF(MOD(J,2)==0)THEN - ISTR=MYIS_P1 - IEND=MIN(MYIE_P1,IDE-1) - ELSE - ISTR=MAX(MYIS_P1,IDS+1) - IEND=MIN(MYIE_P1,IDE-1) - ENDIF -! - DO I=ISTR,IEND - UZ0H(I,J)=(UZ0(I+IHE(J),J)+UZ0(I+IHW(J),J) & - & +UZ0(I,J+1)+UZ0(I,J-1))*0.25 -!!! & +UZ0(I,J+1)+UZ0(I,J-1))*HBM2(I,J)*0.25 - VZ0H(I,J)=(VZ0(I+IHE(J),J)+VZ0(I+IHW(J),J) & - & +VZ0(I,J+1)+VZ0(I,J-1))*0.25 -!!! & +VZ0(I,J+1)+VZ0(I,J-1))*HBM2(I,J)*0.25 - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** SET MAVAIL EQUAL TO 1. ONLY FOR NMM LSM -!----------------------------------------------------------------------- -! - DO J=JTS,JTE - DO I=ITS,ITE - IF(MODEL_CONFIG_REC%SF_SURFACE_PHYSICS(GRID%ID)==2.OR. & - MODEL_CONFIG_REC%SF_SURFACE_PHYSICS(GRID%ID)==99)THEN - ONE(I,J)=1. - ELSE -!*** MAVAIL should not be equal to 1. for other LSMs - ONE(I,J)=MAVAIL(I,J) - ENDIF - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** TRANSPOSE THE MOIST ARRAY (IJK) FOR THE PHYSICS (IKJ). -!----------------------------------------------------------------------- -! - DO N=1,N_MOIST -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - MOIST_TRANS(I,K,J,N)=MOIST(I,J,K,N) - ENDDO - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** URBAN RELATED VARIABLES ARE ADDED TO ARGUMENTS OF SURFACE_DRIVER -!----------------------------------------------------------------------- -! - NUM_ROOF_LAYERS=GRID%NUM_SOIL_LAYERS !urban - NUM_WALL_LAYERS=GRID%NUM_SOIL_LAYERS !urban - NUM_ROAD_LAYERS=GRID%NUM_SOIL_LAYERS !urban - CALL nl_get_isurban(grid%id, isurban) - call nl_get_mminlu(grid%id, mminlu) - - CALL domain_clock_get( grid, current_time=currentTime, & - current_timestr=mesg ) - CALL WRFU_TimeGet( currentTime, YY=yr, dayOfYear=day, H=hr, M=minute, S=sec, rc=rc) - IF( rc/= WRFU_SUCCESS)THEN - CALL wrf_error_fatal('WRFU_TimeGet failed') - ENDIF - - -! -!----------------------------------------------------------------------- -! -!*** CALL SURFACE LAYER AND LAND SURFACE PHYSICS -! -!----------------------------------------------------------------------- -! - CALL SET_TILES(GRID,IDS,IDE-1,JDS+1,JDE-1,ITS,ITE,JTS,JTE) - -! - CALL SURFACE_DRIVER( & - & HYDRO_dt=-1.0, SFCHEADRT=SFCHEADRT, & - & INFXSRT=INFXSRT, SOLDRAIN=SOLDRAIN, & - & JULIAN_IN=grid%julian, & - & ACSNOM=ACSNOM,ACSNOW=ACSNOW,AKHS=AKHS,AKMS=AKMS & - & ,ALBEDO=ALBEDO,BR=BR,CANWAT=CMC,CHKLOWQ=CHKLOWQ & - & ,DT=DT,DX=DX,DZ8W=DZ,DZS=DZSOIL,GLW=RLW_DN_SFC & - & ,GRDFLX=GRNFLX,GSW=RSW_NET_SFC,SWDOWN=RSW_DN_SFC & - & ,GZ1OZ0=GZ1OZ0,HFX=TWBS & - & ,HT=SFCZ,IFSNOW=IDUMMY,ISFFLX=ISFFLX & - & ,FRACTIONAL_SEAICE=FRACTIONAL_SEAICE & - & ,SEAICE_ALBEDO_OPT=SEAICE_ALBEDO_OPT & - & ,SEAICE_ALBEDO_DEFAULT=SEAICE_ALBEDO_DEFAULT & - & ,SEAICE_THICKNESS_OPT=SEAICE_THICKNESS_OPT & - & ,SEAICE_THICKNESS_DEFAULT=SEAICE_THICKNESS_DEFAULT & - & ,SEAICE_SNOWDEPTH_OPT=SEAICE_SNOWDEPTH_OPT & - & ,SEAICE_SNOWDEPTH_MAX=SEAICE_SNOWDEPTH_MAX & - & ,SEAICE_SNOWDEPTH_MIN=SEAICE_SNOWDEPTH_MIN & - & ,TICE2TSK_IF2COLD=CONFIG_FLAGS%TICE2TSK_IF2COLD & - & ,IFNDALBSI=IFNDALBSI,IFNDICEDEPTH=IFNDICEDEPTH & - & ,IFNDSNOWSI=IFNDSNOWSI & - & ,ISLTYP=ISLTYP & - & ,ITIMESTEP=NTSD,IVGTYP=IVGTYP,LOWLYR=LOWLYR & - & ,MAVAIL=ONE,RMOL=RMOL,MOL=MOL & - & ,NUM_SOIL_LAYERS=NSOIL,P8W=P8W & - & ,PBLH=PBLH,PI_PHY=PI_PHY,PSHLTR=PSHLTR,PSIH=PSIH & - & ,PSIM=PSIM,P_PHY=P_PHY,Q10=Q10,Q2=Q2X,QFX=QWBS,TAUX=TAUX,TAUY=TAUY,QSFC=QS & - & ,QSHLTR=QSHLTR,QZ0=QZ0 & - & ,ICOEF_SF=CONFIG_FLAGS%ICOEF_SF & - & ,LCURR_SF=CONFIG_FLAGS%LCURR_SF &!for gfdl-sf drag - & ,ZKMAX=ZKMAX,RIBN=RIBN & - & ,CHARN=CHARN,MSANG=MSANG,SCURX=SCURX,SCURY=SCURY & - & ,IWAVECPL=CONFIG_FLAGS%IWAVECPL & -#if (HWRF==1) - & ,pert_Cd=config_flags%pert_Cd & - & ,ens_random_seed=config_flags%ens_random_seed & - & ,ens_Cdamp=config_flags%ens_Cdamp & -#endif - & ,cd_out=grid%cd_out,ch_out=grid%ch_out & - & ,RAINCV=RAIN & - & ,RHO=RR,SFCEVP=SFCEVPX,SFCEXC=SFCEXC,SFCRUNOFF=SSROFF & - & ,SMOIS=SMC,SMSTAV=SMSTAV,SMSTOT=SMSTOT,SNOALB=MXSNAL & - & ,SNOW=SNOW,SNOWC=SNOWC,SNOWH=SNOWH,STEPBL=NPHS & - & ,SMCREL=SMCREL & - & ,SST=SST,SST_UPDATE=SST_UPDATE,MAX_EDOM=-1 & - & ,TH10=TH10,TH2=TH2X,T2=T2,THZ0=THZ0,TH_PHY=TH_PHY & - & ,TMN=TG,TSHLTR=TSHLTR,TSK=TSFC,TSLB=STC,T_PHY=T_PHY & - & ,U10=U10,UDRUNOFF=BGROFF,UST=USTAR,UZ0=UZ0H & - & ,U_FRAME=U_FRAME,U_PHY=U_PHY,V10=V10,VEGFRA=VGFRCK & - & ,U10E=grid%U10E,V10E=grid%V10E & - & ,UOCE=UOCE,VOCE=VOCE & - & ,VZ0=VZ0H,V_FRAME=V_FRAME,V_PHY=V_PHY & - & ,WARM_RAIN=WARM_RAIN,WSPD=WSPD,XICE=SICE,XICEM=SICE & - & ,ALBSI=albsi,ICEDEPTH=icedepth,SNOWSI=snowsi & - & ,ISICE=GRID%LANDUSE_ISICE,ISWATER=GRID%ISWATER & - & ,XLAND=XLAND,Z=Z,ZNT=Z0 & -#if ( HWRF == 1 ) - & ,MZNT=MZ0 & -#endif - & ,ZS=SLDPTH,CT=CT,TKE_PBL=TKE,SFENTH=SFENTH & !KWON - & ,ALBBCK=ALBASE,LH=ELFLX,SH2O=SH2O,SHDMAX=SHDMAX & - & ,SHDMIN=SHDMIN,Z0=Z0BASE,FLQC=FLQC,FLHC=FLHC & - & ,FM=FM,FHH=FH,ZOL=ZOL & - & ,PSFC=PSFC_OUT,EMISS=EPSR,EMBCK=EMBCK & - & ,SF_SFCLAY_PHYSICS=CONFIG_FLAGS%SF_SFCLAY_PHYSICS & - & ,BL_PBL_PHYSICS=config_flags%bl_pbl_physics & - & ,SF_SURFACE_PHYSICS=CONFIG_FLAGS%SF_SURFACE_PHYSICS & - & ,RA_LW_PHYSICS=CONFIG_FLAGS%RA_LW_PHYSICS & - & ,RA_SW_PHYSICS=CONFIG_FLAGS%RA_SW_PHYSICS & - & ,LAI=GRID%LAI,IZ0TLND=CONFIG_FLAGS%IZ0TLND & - & ,SF_URBAN_PHYSICS=SF_URBAN_PHYSICS & -! & ,GMT=GMT,XLAT=XLAT,XLONG=XLONG,JULDAY=JULDAY & - & ,num_urban_ndm = config_flags%num_urban_ndm & !multi-layer urban - & ,urban_map_zrd = config_flags%urban_map_zrd & !multi-layer urban - & ,urban_map_zwd = config_flags%urban_map_zwd & !multi-layer urban - & ,urban_map_gd = config_flags%urban_map_gd & !multi-layer urban - & ,urban_map_zd = config_flags%urban_map_zd & !multi-layer urban - & ,urban_map_zdf = config_flags%urban_map_zdf & !multi-layer urban - & ,urban_map_bd = config_flags%urban_map_bd & !multi-layer urban - & ,urban_map_wd = config_flags%urban_map_wd & !multi-layer urban - & ,urban_map_gbd = config_flags%urban_map_gbd & !multi-layer urban - & ,urban_map_fbd = config_flags%urban_map_fbd & !multi-layer urban - & ,urban_map_zgrd = config_flags%urban_map_zgrd & !multi-layer urban - & ,NUM_URBAN_HI=config_flags%num_urban_hi & !multi-layer urban - & ,IDS=IDS,IDE=IDE,JDS=JDS,JDE=JDE,KDS=KDS,KDE=KDE & - & ,IMS=IMS,IME=IME,JMS=JMS,JME=JME,KMS=KMS,KME=KME & - & ,IPS=ips,IPE=ipe, JPS=jps,JPE=jpe, KPS=kps,KPE=kpe & - & ,I_START=GRID%I_START,I_END=GRID%I_END & - & ,J_START=GRID%J_START,J_END=GRID%J_END & - & ,KTS=KTS,KTE=KTE,NUM_TILES=GRID%NUM_TILES & - ! Optional args - & ,QV_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QV),F_QV=F_QV & - & ,QC_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QC),F_QC=F_QC & - & ,QR_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QR),F_QR=F_QR & - & ,QI_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QI),F_QI=F_QI & - & ,QS_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QS),F_QS=F_QS & - & ,QG_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QG),F_QG=F_QG & - & ,RAINBL=RAINBL & - & ,LAGDAY=1 & ! tmn_update -! for RUCLSM - & ,QSG=QSG,QVG=QVG,QCG=QCG,SOILT1=SOILT1 & - & ,TSNAV=TSNAV,SMFR3D=SMFR3D,KEEPFR3DFLAG=KEEPFR3DFLAG & - & ,POTEVP=POTEVP,SNOPCX=SNOPCX,SOILTB=SOILTB,SR=SR & - & ,DEW=DEW,ACRUNOFF=grid%ACRUNOFF & - & ,MOSAIC_LU=CONFIG_FLAGS%MOSAIC_LU & - & ,MOSAIC_SOIL=CONFIG_FLAGS%MOSAIC_SOIL & - & ,LANDUSEF=grid%landusef & - & ,SOILCTOP=grid%soilctop & - & ,rhosnf=grid%rhosnf,precipfr=grid%precipfr & - & ,snowfallac=grid%snowfallac & -! for URBAN - & ,NUM_ROOF_LAYERS=NUM_ROOF_LAYERS & ! urban - & ,NUM_WALL_LAYERS=NUM_WALL_LAYERS & ! urban - & ,NUM_ROAD_LAYERS=NUM_ROAD_LAYERS & ! urban -! for YSU - & ,REGIME=REGIME & -! for PX LSM - & ,NLCAT=grid%num_land_cat, NSCAT=grid%num_soil_cat & ! P-X LSM - & ,ISURBAN=isurban, MMINLU=TRIM(mminlu) & - & ,SNOTIME = grid%SNOTIME & - & ,RDLAI2D=config_flags%rdlai2d & - & ,usemonalb=config_flags%usemonalb & - & ,NOAHRES=grid%noahres & - & ,opt_thcnd=config_flags%opt_thcnd & -! for Noah UA changes - & ,ua_phys=config_flags%ua_phys,flx4=grid%flx4,fvb=grid%fvb & - & ,fbur=grid%fbur,fgsn=grid%fgsn & -! vertical dimensions for ocean model, not used for NMM - & ,okms = 1, okme=2 & -! for NOAH-MP LSM - & ,YR=yr & - & ,idveg=config_flags%dveg, iopt_crs=config_flags%opt_crs & - & ,iopt_btr=config_flags%opt_btr, iopt_run=config_flags%opt_run & - & ,iopt_sfc=config_flags%opt_sfc, iopt_frz=config_flags%opt_frz & - & ,iopt_inf=config_flags%opt_inf, iopt_rad=config_flags%opt_rad & - & ,iopt_alb=config_flags%opt_alb, iopt_snf=config_flags%opt_snf & - & ,iopt_tbot=config_flags%opt_tbot, iopt_stc=config_flags%opt_stc & - & ,iopt_gla=config_flags%opt_gla, iopt_rsf=config_flags%opt_rsf & - & ,iopt_soil=config_flags%opt_soil, iopt_pedo=config_flags%opt_pedo & - & ,iopt_crop=config_flags%opt_crop, iopt_irr=config_flags%opt_irr & - & ,iopt_irrm=config_flags%opt_irrm & - & , isnowxy=grid%isnowxy , tvxy=grid%tvxy , tgxy=grid%tgxy & - & ,canicexy=grid%canicexy ,canliqxy=grid%canliqxy, eahxy=grid%eahxy & - & , tahxy=grid%tahxy , cmxy=grid%cmxy , chxy=grid%chxy & - & , fwetxy=grid%fwetxy ,sneqvoxy=grid%sneqvoxy,alboldxy=grid%alboldxy & - & , qsnowxy=grid%qsnowxy ,qrainxy=grid%qrainxy ,wslakexy=grid%wslakexy & - & , zwtxy=grid%zwtxy & - & , waxy=grid%waxy , wtxy=grid%wtxy , tsnoxy=grid%tsnoxy & - & , zsnsoxy=grid%zsnsoxy , snicexy=grid%snicexy , snliqxy=grid%snliqxy & - & ,lfmassxy=grid%lfmassxy ,rtmassxy=grid%rtmassxy,stmassxy=grid%stmassxy & - & , woodxy=grid%woodxy ,stblcpxy=grid%stblcpxy,fastcpxy=grid%fastcpxy & - & , grainxy=grid%grainxy , gddxy=grid%gddxy , pgsxy=grid%pgsxy & - & , cropcat=grid%cropcat & - & ,planting=grid%planting , harvest=grid%harvest ,season_gdd=grid%season_gdd & - & , soilcomp=grid%soilcomp & - & , soilcl1=grid%soilcl1 , soilcl2=grid%soilcl2 & - & , soilcl3=grid%soilcl3 , soilcl4=grid%soilcl4 & - & , xsaixy=grid%xsaixy , taussxy=grid%taussxy & - & , t2mvxy=grid%t2mvxy , t2mbxy=grid%t2mbxy & - & , q2mvxy=grid%q2mvxy , q2mbxy=grid%q2mbxy & - & , tradxy=grid%tradxy , neexy=grid%neexy , gppxy=grid%gppxy & - & , nppxy=grid%nppxy , fvegxy=grid%fvegxy , runsfxy=grid%runsfxy & - & , runsbxy=grid%runsbxy , ecanxy=grid%ecanxy , edirxy=grid%edirxy & - & , etranxy=grid%etranxy , fsaxy=grid%fsaxy , firaxy=grid%firaxy & - & , aparxy=grid%aparxy , psnxy=grid%psnxy , savxy=grid%savxy & - & , sagxy=grid%sagxy , rssunxy=grid%rssunxy , rsshaxy=grid%rsshaxy & - & , bgapxy=grid%bgapxy , wgapxy=grid%wgapxy , tgvxy=grid%tgvxy & - & , tgbxy=grid%tgbxy , chvxy=grid%chvxy , chbxy=grid%chbxy & - & , shgxy=grid%shgxy , shcxy=grid%shcxy , shbxy=grid%shbxy & - & , evgxy=grid%evgxy , evbxy=grid%evbxy , ghvxy=grid%ghvxy & - & , ghbxy=grid%ghbxy , irgxy=grid%irgxy , ircxy=grid%ircxy & - & , irbxy=grid%irbxy , trxy=grid%trxy , evcxy=grid%evcxy & - & ,chleafxy=grid%chleafxy , chucxy=grid%chucxy & - & , chv2xy=grid%chv2xy , chb2xy=grid%chb2xy , chstarxy=grid%chstarxy & -! Noah-MP irrigation - & , IRFRACT=grid%IRFRACT , SIFRACT=grid%SIFRACT ,MIFRACT=grid%MIFRACT & - & , FIFRACT=grid%FIFRACT , IRNUMSI=grid%IRNUMSI ,IRNUMMI=grid%IRNUMMI & - & , IRNUMFI=grid%IRNUMFI , IRWATSI=grid%IRWATSI ,IRWATMI=grid%IRWATMI & - & , IRWATFI=grid%IRWATFI , IRELOSS=grid%IRELOSS ,IRSIVOL=grid%IRSIVOL & - & , IRMIVOL=grid%IRMIVOL , IRFIVOL=grid%IRFIVOL ,IRRSPLH=grid%IRRSPLH & - & , smoiseq=grid%smoiseq, smcwtdxy=grid%smcwtdxy, rechxy=grid%rechxy & - & , deeprechxy=grid%deeprechxy & - & ,gecros_state=grid%gecros_state & ! Optional gecros crop - & ,coszen=grid%czen,xlat_urb2d=grid%hlat & - & ,rs=rs,xlaidyn=xlaidyn & -! mosaic tiling for Noah - & ,sf_surface_mosaic=config_flags%sf_surface_mosaic, mosaic_cat=config_flags%mosaic_cat & -! lake module - & ,lakedepth2d=grid%lakedepth2d, savedtke12d=grid%savedtke12d, snowdp2d=grid%snowdp2d, h2osno2d=grid%h2osno2d & - & ,snl2d=grid%snl2d, t_grnd2d=grid%t_grnd2d, t_lake3d=grid%t_lake3d, lake_icefrac3d=grid%lake_icefrac3d & - & ,z_lake3d=grid%z_lake3d, dz_lake3d=grid%dz_lake3d, t_soisno3d=grid%t_soisno3d, h2osoi_ice3d=grid%h2osoi_ice3d & - & ,h2osoi_liq3d=grid%h2osoi_liq3d, h2osoi_vol3d=grid%h2osoi_vol3d, z3d=grid%z3d, dz3d=grid%dz3d & - & ,zi3d=grid%zi3d, watsat3d=grid%watsat3d, csol3d=grid%csol3d, tkmg3d=grid%tkmg3d & - & ,tkdry3d=grid%tkdry3d,tksatu3d=grid%tksatu3d, LakeModel=grid%sf_lake_physics, lake_min_elev=grid%lake_min_elev & -! end lake module - & ,maxpatch=1,inest=1,history_interval=config_flags%history_interval & !clm - & ,fasdas=fasdas,do_bioe=.false.,do_meganfile=.false.,num_pft_input=grid%num_pft_clm & - & ) -! -!----------------------------------------------------------------------- -! -!*** CALL FREE ATMOSPHERE TURBULENCE -! -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j,k) - DO J=JMS,JME - DO K=KMS,KME - DO I=IMS,IME - DUDT_PHY(I,K,J)=0. - DVDT_PHY(I,K,J)=0. - ENDDO - ENDDO - ENDDO -! -!*** THE SURFACE EXCHANGE COEFFICIENTS AKHS AND AKMS ARE ACTUALLY -!*** MULTIPLIED BY HALF THE DEPTH OF THE LOWEST LAYER. WE MUST RETAIN -!*** THOSE VALUES FOR THE NEXT TIMESTEP SO USE AUXILLIARY ARRAYS FOR -!*** THE OUTPUT. -! -!$omp parallel do & -!$omp& private(dzhalf,i,j) - DO J=JTS,JTE - DO I=ITS,ITE - DZHALF=0.5*DZ(I,KTS,J) - AKHS_OUT(I,J)=AKHS(I,J)*DZHALF - AKMS_OUT(I,J)=AKMS(I,J)*DZHALF - ENDDO - ENDDO -! -!-- ETAMP_Regional logical is true for regional NAM (ETAMPNEW) or HRW (ETAMPNEW) microphysics -! - ETAMP_Regional=.FALSE. - IF (CONFIG_FLAGS%MP_PHYSICS==ETAMPNEW .OR. & - & CONFIG_FLAGS%MP_PHYSICS==FER_MP_HIRES) ETAMP_Regional=.TRUE. -! - IF(ETAMP_Regional) THEN -!-- Logical FQ_I and index PQ_I are set to values associated with snow -! for the regional (NAM, HWRF) versions of the microphysics - FQ_I=F_QS - PQ_I=P_QS - ELSE - FQ_I=F_QI - PQ_I=P_QI - ENDIF -#if HWRF==1 - CALL nl_get_var_ric(1, var_ric) - CALL nl_get_coef_ric_s(1, coef_ric_s) - CALL nl_get_coef_ric_l(1, coef_ric_l) - CALL nl_get_pert_pbl(1,pert_pbl) - CALL nl_get_ens_pblamp(1,ens_pblamp) -! write(0,*) 'var_ric & coef_ric_s l from namelist Kwon ',var_ric,coef_ric_s,coef_ric_l -#endif -! - CALL PBL_DRIVER( & - & ITIMESTEP=NTSD,DT=DT & - & ,U_FRAME=U_FRAME,V_FRAME=V_FRAME & - & ,RUBLTEN=DUDT_PHY,RVBLTEN=DVDT_PHY & - & ,RTHBLTEN=RTHBLTEN,RQVBLTEN=RQVBLTEN & !BSF - & ,RQCBLTEN=RQCBLTEN,RQIBLTEN=RQIBLTEN & !BSF -!BSF & ,RQRBLTEN=RQRBLTEN,RQSBLTEN=RQSBLTEN & !BSF -!BSF & ,RQGBLTEN=RQGBLTEN & !BSF - & ,TSK=TSFC,XLAND=XLAND,ZNT=Z0 & -#if ( HWRF == 1 ) - & ,MSANG=MSANG,SCURX=SCURX,SCURY=SCURY & - & ,IWAVECPL=CONFIG_FLAGS%IWAVECPL & - & ,LCURR_SF=CONFIG_FLAGS%LCURR_SF & - - & ,MZNT=MZ0 & -#endif - & ,HPBL_HOLD=HPBL_HOLD & !for new KSAS - & ,HT=SFCZ & !KWON - & ,UST=USTAR,MIXHT=MIXHT,PBLH=PBLH & - & ,HFX=TWBS,QFX=QWBS,GRDFLX=GRNFLX & - & ,U_PHY=U_PHY,V_PHY=V_PHY,TH_PHY=TH_PHY,RHO=RR & - & ,P_PHY=P_PHY,PI_PHY=PI_PHY,P8W=P8W,T_PHY=T_PHY & - & ,DZ8W=DZ,Z=Z,TKE_PBL=TKE,EL_PBL=EL_MYJ,F=F & - & ,EXCH_H=EXCH_H,EXCH_M=EXCH_M,AKHS=AKHS,AKMS=AKMS & - & ,FM=FM,FHH=FH & - & ,YSU_TOPDOWN_PBLMIX=CONFIG_FLAGS%YSU_TOPDOWN_PBLMIX & - & ,SHINHONG_TKE_DIAG=CONFIG_FLAGS%SHINHONG_TKE_DIAG & - & ,THZ0=THZ0,QZ0=QZ0,UZ0=UZ0H,VZ0=VZ0H & - & ,QSFC=QS,LOWLYR=LOWLYR & - & ,PSIM=PSIM,PSIH=PSIH,GZ1OZ0=GZ1OZ0 & - & ,U10=U10,V10=V10,UOCE=UOCE,VOCE=VOCE,T2=T2,WSPD=WSPD,BR=BR,CHKLOWQ=CHKLOWQ & - & ,DX=DX,DY=DY,STEPBL=NPHS,WARM_RAIN=WARM_RAIN & - & ,KPBL=KPBL,CT=CT,LH=ELFLX,SNOW=SNOW,XICE=SICE & - & ,BL_PBL_PHYSICS=config_flags%bl_pbl_physics & - & ,RA_LW_PHYSICS=config_flags%ra_lw_physics & - & ,MFSHCONV=config_flags%mfshconv & ! work with QNSE PBL - & ,rc_mf=rc_mf & ! QNSE - & ,IDS=IDS,IDE=IDE,JDS=JDS,JDE=JDE,KDS=KDS,KDE=KDE & - & ,IMS=IMS,IME=IME,JMS=JMS,JME=JME,KMS=KMS,KME=KME & - & ,I_START=GRID%I_START,I_END=GRID%I_END & - & ,J_START=GRID%J_START,J_END=GRID%J_END & - & ,KTS=KTS,KTE=KTE,NUM_TILES=GRID%NUM_TILES & - & ,CTOPO=grid%ctopo,CTOPO2=grid%ctopo2 & - & ,WINDFARM_OPT=config_flags%windfarm_opt & - & ,POWER=grid%POWER & - & ,NUM_SCALAR=1, NUM_TRACER=1 & ! parameters not used by NMM -#if (NMM_CORE==1) - & ,DISHEAT=DISHEAT & -#endif - ! Optional args - & ,RTHRATEN=RTHRATEN & -#if (HWRF==1) - & ,GFS_ALPHA=GRID%GFS_ALPHA & -#endif - & ,HPBL2D=HPBL2D, EVAP2D=EVAP2D, HEAT2D=HEAT2D & !Kwon S&P - & ,RC2D=RC2D & !KWON -#if HWRF==1 - & ,VAR_RIC=VAR_RIC & !Kwon Ric -#endif - & ,DKU3D=DKU3D,DKT3D=DKT3D -#if HWRF==1 - & ,coef_ric_l=coef_ric_l,coef_ric_s=coef_ric_s & !Kwon for Ric - & ,pert_pbl=pert_pbl & - & ,ens_random_seed=ens_random_seed & - & ,ens_pblamp=ens_pblamp & -#endif - & ,QV_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QV),F_QV=F_QV & - & ,QC_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QC),F_QC=F_QC & - & ,QI_CURR=MOIST_TRANS(IMS,KMS,JMS,PQ_I),F_QI=FQ_I & - & ,QR_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QR),F_QR=F_QR & - & ,QS_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QS),F_QS=F_QS & - & ,QG_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QG),F_QG=F_QG & - & ,HOL=HOL,sf_sfclay_physics=CONFIG_FLAGS%SF_SFCLAY_PHYSICS & - & ,IS_CAMMGMP_USED=IS_CAMMGMP_USED & - & ,wstar=wstar_ysu,delta=delta_ysu & - & ,fasdas=fasdas & - & ,sf_urban_physics=CONFIG_FLAGS%SF_URBAN_PHYSICS) -! -!output PBL tendency -! -!$omp parallel do & -!$omp& private(i,j,k) - DO J=JMS,JME - DO K=KMS,KME - DO I=IMS,IME - DUBLDT(I,J,K)=DUDT_PHY(I,K,J) - DVBLDT(I,J,K)=DVDT_PHY(I,K,J) - DTHBLDT(I,J,K)=RTHBLTEN(I,K,J) - DQVBLDT(I,J,K)=RQVBLTEN(I,K,J) - ENDDO - ENDDO - ENDDO -! - -!*** NOTE THAT THE EXCHANGE COEFFICIENTS FOR HEAT EXCH_H COMING OUT OF -!*** PBL_DRIVER ARE DEFINED AT THE TOPS OF THE LAYERS KTS TO KTE-1 -!*** IF MODULE_BL_MYJPBL WAS INVOKED. -! -!----------------------------------------------------------------------- -! UNCOMPUTED LOCATIONS MUST BE FILLED IN FOR THE POST-PROCESSOR -!----------------------------------------------------------------------- -! -!*** EASTERN GLOBAL BOUNDARY -! - IF(MYIE==IDE)THEN -!$omp parallel do & -!$omp& private(i,j) - DO J=JDS,JDE - IF (J>=MYJS.AND.J<=MYJE)THEN - TH10(MYIE,J)=TH10(MYIE-1,J) - Q10(MYIE,J)=Q10(MYIE-1,J) - U10(MYIE,J)=U10(MYIE-1,J) - V10(MYIE,J)=V10(MYIE-1,J) - TSHLTR(MYIE,J)=TSHLTR(MYIE-1,J) - QSHLTR(MYIE,J)=QSHLTR(MYIE-1,J) - ENDIF - ENDDO - ENDIF -! -!*** SOUTHERN GLOBAL BOUNDARY -! - - IF(MYJS==JDS)THEN - DO J=JDS,JDS+1 - DO I=IDS,IDE - IF (I>=MYIS.AND.I<=MYIE) THEN - TH10(I,J)=TH10(I,MYJS+2) - Q10(I,J)=Q10(I,MYJS+2) - U10(I,J)=U10(I,MYJS+2) - V10(I,J)=V10(I,MYJS+2) - TSHLTR(I,J)=TSHLTR(I,MYJS+2) - QSHLTR(I,J)=QSHLTR(I,MYJS+2) - ENDIF - ENDDO - ENDDO - ENDIF -! -!*** NORTHERN GLOBAL BOUNDARY -! - IF(MYJE==JDE)THEN -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJE-1,MYJE - DO I=IDS,IDE - IF (I>=MYIS.AND.I<=MYIE) THEN - TH10(I,J)=TH10(I,MYJE-2) - Q10(I,J)=Q10(I,MYJE-2) - U10(I,J)=U10(I,MYJE-2) - V10(I,J)=V10(I,MYJE-2) - TSHLTR(I,J)=TSHLTR(I,MYJE-2) - QSHLTR(I,J)=QSHLTR(I,MYJE-2) - ENDIF - ENDDO - ENDDO - ENDIF -! -#if ( HWRF == 1 ) - if(size(grid%windsq_swath)>1) then - do j=max(jts,jds),min(jte,jde-1) - do i=max(its,ids),min(ite,ide-1) - if(grid%interesting(i,j)==0) cycle - wind=u10(i,j)**2 + v10(i,j)**2 - if(wind>grid%windsq_swath(i,j)) grid%windsq_swath(i,j)=wind - enddo - enddo - endif -#endif - - IF(CONFIG_FLAGS%SF_SFCLAY_PHYSICS==1)THEN ! non-NMM package -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS1,MYJE1 - DO I=MYIS,MYIE1 -! TSHLTR(I,J)=TSHLTR(I,J)*(1.E5/PSHLTR(I,J))**RCP - IF(TSHLTR(I,J)<200..OR.TSHLTR(I,J)>350.)THEN - WRITE(message,*)'Troublesome TSHLTR...I,J,TSHLTR,PSHLTR: ' & - ,I,J,TSHLTR(I,J),PSHLTR(I,J) - CALL wrf_message(trim(message)) - ENDIF - ENDDO - ENDDO - ENDIF -! -!----------------------------------------------------------------------- -!*** COMPUTE MODEL LAYER CONTAINING THE TOP OF THE BOUNDARY LAYER -!----------------------------------------------------------------------- -! - IF(CONFIG_FLAGS%BL_PBL_PHYSICS/=MYJPBLSCHEME)THEN - LENGTH_ROW=MYIE1-MYIS1+1 - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - KPBL(I,J)=-1000 - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(altitude,i,j,k,kount_all) - DO J=MYJS2,MYJE2 - KOUNT_ALL=0 - find_kpbl : DO K=KTS,KTE - DO I=MYIS1,MYIE1 - ALTITUDE=Z(I,K+1,J)-SFCZ(I,J) - IF(PBLH(I,J)<=ALTITUDE.AND.KPBL(I,J)<0)THEN - KPBL(I,J)=K - KOUNT_ALL=KOUNT_ALL+1 - ENDIF - IF(KOUNT_ALL==LENGTH_ROW)EXIT find_kpbl - ENDDO - ENDDO find_kpbl - ENDDO - ENDIF -! - IF(MODEL_CONFIG_REC%SF_SURFACE_PHYSICS(GRID%ID)==99)THEN - SNO_FACTR=1. - ELSE - SNO_FACTR=1000. - ENDIF -! -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - SNO(I,J)=SNOW(I,J) - SI(I,J)=SNOWH(I,J)*SNO_FACTR - LPBL(I,J)=KTE-KPBL(I,J)+1 - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** DIAGNOSTIC RADIATION ACCUMULATION -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j,tsfc2) - DO J=MYJS2,MYJE2 - DO I=MYIS,MYIE - ASWIN (I,J)=ASWIN (I,J)+RSWIN(I,J)*HBM2(I,J)*FACTRS(I,J) - ASWOUT(I,J)=ASWOUT(I,J)-RSWOUT(I,J)*HBM2(I,J)*FACTRS(I,J) - ASWTOA(I,J)=ASWTOA(I,J)+RSWTOA(I,J)*HBM2(I,J)*FACTRS(I,J) - ALWIN (I,J)=ALWIN (I,J)+RLW_DN_SFC(I,J) - ALWOUT(I,J)=ALWOUT(I,J)-RADOT (I,J)*HBM2(I,J) - ALWTOA(I,J)=ALWTOA(I,J)+RLWTOA(I,J)*HBM2(I,J) -! - TSFC2=TSFC(I,J)*TSFC(I,J) - RADOT(I,J)=HBM2(I,J)*EPSR(I,J)*STBOLT*TSFC2*TSFC2 - THS(I,J)=TSFC(I,J)*EXNSFC(I,J) - PREC(I,J)=0. - ENDDO - ENDDO -! -!======================================================================= -!=== Begin gravity wave drag (GWD) and mountain blocking (MB) ======== -!======================================================================= -! - IGS=MYIS1 - IGE=MYIE1 - JGS=MYJS2 - JGE=MYJE2 -!dbg !dbg -!dbg kpblmin=100 -!dbg kpblmax=-100 -!dbg DO J=JGS,JGE -!dbg DO I=IGS,IGE -!dbg kpblmin=min(kpblmin,kpbl(i,j)) -!dbg kpblmax=max(kpblmax,kpbl(i,j)) -!dbg enddo -!dbg enddo -!dbg print *,'TURBL: IGS,IGE,JGS,JGE,kpblmin,kpblmax=',IGS,IGE,JGS,JGE,kpblmin,kpblmax -!dbg - -! print *,'grid%id gwd_opt at module_PHYSICS ',grid%id, grid%gwd_opt -! WRITE(0,*)'grid%id gwd_opt at module_PHYSICS ',grid%id, grid%gwd_opt -! WRITE(MESSAGE,125)grid%gwd_opt -!125 FORMAT(1X,'grid%id module_PHYSICS.F : gwd_opt ',I2,2X,I2) - - -#if ( HWRF == 1 ) - IF (grid%gwd_opt .eq. 2 .AND. grid%id.eq.1) THEN !Kwon's doing for parent only now -#else - IF (grid%gwd_opt .eq. 2) THEN -#endif -! print *,'==grid%id gwd_opt at module_PHYSICS inside gwd ',grid%id, grid%gwd_opt !because there is no data for nest domain - - CALL wrf_message("GWD usage currently may be problematic for some cases - use at own risk") - - CALL GWD_driver(U=U_PHY,V=V_PHY,T=T_PHY & - & ,Q=MOIST_TRANS(IMS,KMS,JMS,P_QV) & - & ,Z=Z,DP=DELP,PINT=P8W,PMID=P_PHY,EXNR=PI_PHY & - & ,KPBL=KPBL,ITIME=NTSD & - & ,HSTDV=HSTDV,HCNVX=HCNVX,HASYW=HASYW,HASYS=HASYS & - & ,HASYSW=HASYSW,HASYNW=HASYNW,HLENW=HLENW & - & ,HLENS=HLENS,HLENSW=HLENSW,HLENNW=HLENNW & - & ,HANGL=HANGL,HANIS=HANIS,HSLOP=HSLOP,HZMAX=HZMAX & - & ,CROT=CROT,SROT=SROT & - & ,DUDT=DUDT_GWD,DVDT=DVDT_GWD & - & ,UGWDsfc=UGWDsfc,VGWDsfc=VGWDsfc,XLAND=XLAND & !ADDED BY KWON FOR OCEAN - & ,IDS=IDS,IDE=IDE,JDS=JDS,JDE=JDE,KDS=KDS,KDE=KDE & - & ,IMS=IMS,IME=IME,JMS=JMS,JME=JME,KMS=KMS,KME=KME & - & ,ITS=IGS,ITE=IGE,JTS=JGS,JTE=JGE,KTS=KTS,KTE=KTE ) - -!======================================================================= -!===== End gravity wave drag (GWD) and mountain blocking (MB) ======== -!======================================================================= -! -!----------------------------------------------------------------------- -!*** TRANSFER THE WIND TENDENCIES. -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DO J=JTS,JTE - DO I=ITS,ITE - - -!mp temporary bandaid limiting GWD/MB wind tendencies - - IF (DUDT_GWD(I,K,J) .gt. 1.6) then - write(message,*) 'BIG DUDT_GWD:: ', I,K,J, DUDT_GWD(I,K,J) - CALL wrf_message(message) - DUDT_GWD(I,K,J)=1.6 - ENDIF - - IF (DUDT_GWD(I,K,J) .lt. -1.6) then - write(message,*) 'BIG DUDT_GWD:: ', I,K,J, DUDT_GWD(I,K,J) - CALL wrf_message(message) - DUDT_GWD(I,K,J)=-1.6 - ENDIF - - IF (DVDT_GWD(I,K,J) .gt. 1.6) then - write(message,*) 'BIG DVDT_GWD:: ', I,K,J, DVDT_GWD(I,K,J) - CALL wrf_message(message) - DVDT_GWD(I,K,J)=1.6 - ENDIF - - IF (DVDT_GWD(I,K,J) .lt. -1.6) then - write(message,*) 'BIG DVDT_GWD:: ', I,K,J, DVDT_GWD(I,K,J) - CALL wrf_message(message) - DVDT_GWD(I,K,J)=-1.6 - ENDIF - -!mp end temporary bandaid - - DUDT(I,J,K)=DUDT_PHY(I,K,J)+DUDT_GWD(I,K,J) - DVDT(I,J,K)=DVDT_PHY(I,K,J)+DVDT_GWD(I,K,J) - - ENDDO - ENDDO - ENDDO - - ELSE ! no GWD - - DO K=KTS,KTE - DO J=JTS,JTE - DO I=ITS,ITE - DUDT(I,J,K)=DUDT_PHY(I,K,J) - DVDT(I,J,K)=DVDT_PHY(I,K,J) - ENDDO - ENDDO - ENDDO - - ENDIF ! gwd_opt -! -!----------------------------------------------------------------------- -!*** TRANSPOSE THE MOIST_TRANS ARRAY BACK TO THE PROGNOSTIC MOIST ARRAY. -!----------------------------------------------------------------------- -! - DO N=1,N_MOIST -!$omp parallel do & -!$omp& private(i,j,k) - DO J=JMS,JME - DO K=KMS,KME - DO I=IMS,IME - MOIST(I,J,K,N)=MOIST_TRANS(I,K,J,N) - ENDDO - ENDDO - ENDDO - ENDDO -! - DEALLOCATE(MOIST_TRANS,STAT=ISTAT) -! -!----------------------------------------------------------------------- -!*** UPDATE TEMPERATURE, SPECIFIC HUMIDITY, CLOUD, AND TKE. -!----------------------------------------------------------------------- -! - E_BDY=(ITE>=IDE) -! - ETAMP_PHYSICS=ETAMP_Regional - IF (CONFIG_FLAGS%MP_PHYSICS==ETAMP_HWRF) ETAMP_PHYSICS=.TRUE. -! -!$omp parallel do & -!$omp& private(dqdt,dtdt,i,iend,j,k,qi,qold,qr,qw,ratiomx,i_m) - DO K=KTS,KTE - DO J=MYJS2,MYJE2 - IEND=MYIE1 - IF(E_BDY.AND.MOD(J,2)==0)IEND=IEND-1 -! - DO I=MYIS1,IEND - DTDT=RTHBLTEN(I,K,J)*PI_PHY(I,K,J) - DQDT=RQVBLTEN(I,K,J) !Mixing ratio tendency - T(I,J,K)=T(I,J,K)+DTDT*DTPHS - QOLD=Q(I,J,K) - RATIOMX=QOLD/(1.-QOLD)+DQDT*DTPHS - Q(I,J,K)=RATIOMX/(1.+RATIOMX) -! Q(I,J,K)=MAX(Q(I,J,K),EPSQ) - MOIST(I,J,K,P_QV)=MAX(EPSQ,(MOIST(I,J,K,P_QV)+RQVBLTEN(I,K,J)*DTPHS) ) - CWM(I,J,K)=0. -! - pbl_check1: IF(config_flags%mp_physics==fer_mp_hires_advect) then - ! Update QI and QRIMEF: - call QITEND_FER_HIRES_ADVECT( & - MOIST(I,J,K,P_QI), & - SCALAR(I,J,K,P_QRIMEF), & - RQIBLTEN(I,K,J)*DTPHS) - - ! Update QC: - MOIST(I,J,K,P_QC)=MAX(EPSQ,(MOIST(I,J,K,P_QC)+RQCBLTEN(I,K,J)*DTPHS)) - ELSEIF (.NOT.ETAMP_PHYSICS) THEN - - DO I_M=1,N_MOIST - IF(I_M==P_QC) THEN - MOIST(I,J,K,I_M)=MAX(EPSQ,(MOIST(I,J,K,I_M)+RQCBLTEN(I,K,J)*DTPHS) ) - ELSE IF(I_M==P_QI) THEN - MOIST(I,J,K,I_M)=MAX(EPSQ,(MOIST(I,J,K,I_M)+RQIBLTEN(I,K,J)*DTPHS) ) - ENDIF - IF(I_M/=P_QV) CWM(I,J,K)=CWM(I,J,K)+MOIST(I,J,K,I_M) - ENDDO - ELSE pbl_check1 -! -!-- Allow vertical mixing to modify cloud ice + snow for ETAMPNEW -! - QW=MAX(0.,MOIST(I,J,K,P_QC)+RQCBLTEN(I,K,J)*DTPHS ) - pbl_check2: IF (ETAMP_Regional) THEN - QI=MAX(0.,MOIST(I,J,K,P_QS)+RQIBLTEN(I,K,J)*DTPHS ) !-- Total ice -!BSF QR=MAX(0.,MOIST(I,J,K,P_QR)+RQRBLTEN(I,K,J)*DTPHS ) - QR=MAX(0.,MOIST(I,J,K,P_QR) ) - MOIST(I,J,K,P_QC)=QW - MOIST(I,J,K,P_QS)=QI - MOIST(I,J,K,P_QR)=QR - ELSE IF (CONFIG_FLAGS%MP_PHYSICS==ETAMP_HWRF) THEN !-- pbl_check2 - QI=MAX(0.,MOIST(I,J,K,P_QI)+RQIBLTEN(I,K,J)*DTPHS ) !-- Total ice -!BSF QR=MAX(0.,MOIST(I,J,K,P_QR)+RQRBLTEN(I,K,J)*DTPHS ) - QR=MAX(0.,MOIST(I,J,K,P_QR) ) - MOIST(I,J,K,P_QC)=QW - MOIST(I,J,K,P_QI)=QI - MOIST(I,J,K,P_QR)=QR - ENDIF pbl_check2 - CWM(I,J,K)=QW+QI+QR -! - IF(QI<=EPSQ)THEN - F_ICE(I,K,J)=0. - ELSE - F_ICE(I,K,J)=MAX(0.,MIN(1.,QI/CWM(I,J,K))) - ENDIF -! - IF(QR<=EPSQ)THEN - F_RAIN(I,K,J)=0. - ELSE - F_RAIN(I,K,J)=QR/(QW+QR) - ENDIF -! - ENDIF pbl_check1 -! - Q2(I,J,K)=2.*TKE(I,K,J) - ENDDO - ENDDO -! - ENDDO -! -!----------------------------------------------------------------------- -!*** -!*** SAVE SURFACE-RELATED FIELDS. -!*** -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(i,j,llij,xlvrw) - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - LLIJ=LOWLYR(I,J) -! -!----------------------------------------------------------------------- -!*** INSTANTANEOUS SENSIBLE AND LATENT HEAT FLUX -!----------------------------------------------------------------------- -! - TWBS(I,J)=-TWBS(I,J) - QWBS(I,J)=-QWBS(I,J)*XLV*CHKLOWQ(I,J) -! -!----------------------------------------------------------------------- -!*** ACCUMULATED QUANTITIES. -!*** IN OPNL LSM, SFCEVP APPEARS TO BE IN UNITS OF -!*** METERS OF LIQUID WATER. IT IS COMING FROM -!*** WRF MODULE AS KG/M**2. -!----------------------------------------------------------------------- -! - SFCSHX(I,J)=SFCSHX(I,J)+TWBS(I,J) - SFCLHX(I,J)=SFCLHX(I,J)+QWBS(I,J) - XLVRW=DTPHS/(XLV*RHOWATER) - SFCEVP(I,J)=SFCEVP(I,J)-QWBS(I,J)*XLVRW - POTEVP(I,J)=POTEVP(I,J)-QWBS(I,J)*SM(I,J)*XLVRW - POTFLX(I,J)=POTEVP(I,J)*FACTOR - SUBSHX(I,J)=SUBSHX(I,J)+GRNFLX(I,J) - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** COUNTERS -!----------------------------------------------------------------------- -! - APHTIM=APHTIM+1. - ARDSW =ARDSW +1. - ARDLW =ARDLW +1. - ASRFC =ASRFC +1. -!----------------------------------------------------------------------- -! - END SUBROUTINE TURBL -! -!----------------------------------------------------------------------- -!*********************************************************************** - SUBROUTINE UV_H_TO_V(NTSD,DT,NPHS,UZ0H,VZ0H,UZ0,VZ0 & - & ,DUDT,DVDT,U,V,HBM2,IVE,IVW & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: UV_H_TO_V INTERPOLATE WINDS FROM H TO V POINTS -! PRGRMMR: BLACK ORG: W/NP22 DATE: 05-02-22 -! -! ABSTRACT: -! INTERPOLATE WINDS BACK TO V POINTS AFTER TURBULENCE -! -! PROGRAM HISTORY LOG : -! 05-02-22 BLACK - ORIGINATOR -! 05-12-12 BLACK - CONVERTED FROM IKJ TO IJK -! -! USAGE: CALL TURBL FROM SOLVE_NMM -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM -!$$$ -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE & - & ,NPHS,NTSD -! - INTEGER, DIMENSION(JMS:JME),INTENT(IN) :: IVE,IVW -! - REAL,INTENT(IN) :: DT -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: HBM2,UZ0H,VZ0H -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: DUDT,DVDT -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: UZ0,VZ0 -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: U,V -! -!----------------------------------------------------------------------- -!*** -!*** LOCAL VARIABLES -!*** -!----------------------------------------------------------------------- -! - INTEGER :: I,IEND,J,K -! - REAL :: DTPHS -! - LOGICAL :: E_BDY -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -! - DTPHS=NPHS*DT - E_BDY=(ITE>=IDE) -! -!----------------------------------------------------------------------- -!*** RECONSTRUCT UZ0 AND VZ0 ON VELOCITY POINTS. -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS2,MYJE2 - DO I=MYIS,MYIE - UZ0(I,J)=(UZ0H(I+IVE(J),J)*HBM2(I+IVE(J),J) & - & +UZ0H(I+IVW(J),J)*HBM2(I+IVW(J),J) & - & +UZ0H(I,J+1)*HBM2(I,J+1)+UZ0H(I,J-1)*HBM2(I,J-1))*0.25 - VZ0(I,J)=(VZ0H(I+IVE(J),J)*HBM2(I+IVE(J),J) & - & +VZ0H(I+IVW(J),J)*HBM2(I+IVW(J),J) & - & +VZ0H(I,J+1)*HBM2(I,J+1)+VZ0H(I,J-1)*HBM2(I,J-1))*0.25 - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** INTERPOLATE WIND TENDENCIES TO VELOCITY POINTS AND UPDATE WINDS. -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(i,iend,j,k) - DO K=KTS,KTE - DO J=MYJS2,MYJE2 - IEND=MYIE1 - IF(E_BDY.AND.MOD(J,2)==1)IEND=IEND-1 -! - DO I=MYIS1,IEND - U(I,J,K)=(DUDT(I+IVE(J),J,K)+DUDT(I+IVW(J),J,K) & - & +DUDT(I,J+1,K)+DUDT(I,J-1,K))*0.25*DTPHS & - & +U(I,J,K) - V(I,J,K)=(DVDT(I+IVE(J),J,K)+DVDT(I+IVW(J),J,K) & - & +DVDT(I,J+1,K)+DVDT(I,J-1,K))*0.25*DTPHS & - & +V(I,J,K) - ENDDO - ENDDO - ENDDO -!----------------------------------------------------------------------- -! - END SUBROUTINE UV_H_TO_V -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- - SUBROUTINE CUCNVC(NTSD,DT,NCNVC,NRADS,NRADL & - & ,GPS,RESTRT,HYDRO & - & ,CLDEFI,N_MOIST,N_SCALAR,ENSDIM & - & ,MOIST,SCALAR & - & ,DETA1,DETA2,AETA1,AETA2,ETA1,ETA2 & - & ,F_ICE,F_RAIN & -!*** Changes for other cu-schemes, most for gd scheme - & ,APR_GR,APR_W,APR_MC,TTEN,QTEN & - & ,APR_ST,APR_AS,APR_CAPMA & - & ,APR_CAPME ,APR_CAPMI & - & ,MASS_FLUX ,XF_ENS & - & ,PR_ENS,GSW & - & ,GD_CLOUD,GD_CLOUD2,KTOP_DEEP & - & ,PDTOP,PT,PD,RES,PINT,T,Q,CWM,TCUCN & - & ,OMGALF,U,V,W,Z,FIS,W0AVG & - & ,PREC,ACPREC,CUPREC,CUPPT,CPRATE & - & ,SM,HBM2,PBLH,LPBL,CNVBOT,CNVTOP & - & ,HTOP,HBOT,HTOPD,HBOTD,HTOPS,HBOTS & - & ,RTHBLTEN,RQVBLTEN,RTHRATEN & -#if (NMM_CORE==1) - & ,TWBS,QWBS & - & ,DUCUDT, DVCUDT, MOMMIX, store_rand & - & ,DTHCUDT,DQVCUDT,DQRCUDT,DQCCUDT,DQICUDT &! added output CU tendency - & ,DQSCUDT &! added output CU tendency - -#endif - & ,HPBL2D,EVAP2D,HEAT2D & !Kwon S&P - & ,DX2D,DYNMM & ! Scale-aware sas - & ,SCALEFUN, SCALEFUN1 & !scale functions - & ,SIGMU, SIGMU1 & !updraft fraction - & ,AVCNVC,ACUTIM,IHE,IHW & - & ,GRID,CONFIG_FLAGS & - & ,HPBL_HOLD & ! for new KSAS - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,IPS,IPE,JPS,JPE,KPS,KPE & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: CUCNVC CONVECTIVE PRECIPITATION OUTER DRIVER -! PRGRMMR: BLACK ORG: W/NP22 DATE: 02-03-21 -! -! ABSTRACT: -! CUCVNC DRIVES THE WRF CONVECTION SCHEMES -! -! PROGRAM HISTORY LOG: -! 02-03-21 BLACK - ORIGINATOR -! 04-11-18 BLACK - THREADED -! 05-12-15 BLACK - CONVERTED FROM IKJ TO IJK -! -! USAGE: CALL CUCNVC FROM SOLVE_NMM -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM -!$$$ -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: ENSDIM & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,IPS,IPE,JPS,JPE,KPS,KPE & - & ,ITS,ITE,JTS,JTE,KTS,KTE & - & ,N_MOIST,NCNVC,NTSD,NRADS,NRADL,N_SCALAR -! - INTEGER, DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW -! - INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: LPBL - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX2D ! scale-sware sas - REAL,INTENT(IN) :: DYNMM ! Delt_Y - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: SCALEFUN,SCALEFUN1 ! scale-sware sas - ! scale functions - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: SIGMU,SIGMU1 ! updraft fractional area - -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: HPBL2D,EVAP2D,HEAT2D !Kwon S&P - - REAL,DIMENSION(IMS:IME,JMS:JME) :: SHALL -! - REAL,INTENT(IN) :: DT,GPS,PDTOP,PT -! - REAL,INTENT(INOUT) :: ACUTIM,AVCNVC -! - REAL,DIMENSION(KMS:KME-1),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2 - REAL,DIMENSION(KMS:KME ),INTENT(IN) :: ETA1,ETA2 -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: FIS,HBM2,PD,RES,SM -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: ACPREC,CLDEFI & - & ,CNVBOT,CNVTOP & - & ,CUPPT,CUPREC & - & ,HBOT,HTOP & - & ,HBOTD,HTOPD & - & ,HBOTS,HTOPS & - & ,PREC,CPRATE & - & ,APR_GR,APR_W,APR_MC & - & ,APR_ST,APR_AS,APR_CAPMA & - & ,APR_CAPME,APR_CAPMI & - & ,GSW,MASS_FLUX -#if (NMM_CORE==1) - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: store_rand -#endif -!Biswas - REAL,DIMENSION(IMS:IME,JMS:JME) :: HFX,QFX,PBLH - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: TWBS,QWBS - REAL,DIMENSION(KMS:KME) :: ZNU - REAL, DIMENSION(IMS:IME, KMS:KME, JMS:JME) :: & - RUCUTEN, & - RVCUTEN,RQVFTEN - - REAL,DIMENSION(IMS:IME,JMS:JME) :: HPBL_HOLD -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: F_ICE & - & ,F_RAIN -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: QTEN & - & ,RQVBLTEN & - & ,RTHBLTEN & - & ,RTHRATEN & - & ,TTEN -! -#if (NMM_CORE==1) - REAL, INTENT(INOUT)::MOMMIX - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT):: DUCUDT, DVCUDT -! 2015-12-14 added output tendency from CU - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT):: DTHCUDT & - & , DQVCUDT & - & , DQRCUDT & - & , DQCCUDT & - & , DQICUDT & - & , DQSCUDT -! - REAL,DIMENSION(IDS:IDE,JDS:JDE) :: DATA1 - LOGICAL, EXTERNAL::wrf_dm_on_monitor -#endif - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: CWM & - & ,OMGALF & - & ,Q,T & - & ,TCUCN & - & ,U,V & - & ,W,Z -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PINT -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: W0AVG -! - REAL,DIMENSION(IMS:IME,JMS:JME,1:ENSDIM),INTENT(INOUT) :: PR_ENS & - & ,XF_ENS -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,N_MOIST) & - & ,INTENT(INOUT) :: MOIST -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,N_SCALAR) & - & ,INTENT(INOUT) :: SCALAR -! - - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: GD_CLOUD & - & ,GD_CLOUD2 - INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: KTOP_DEEP -! - LOGICAL,INTENT(IN) :: HYDRO,RESTRT - LOGICAL :: IS_CAMMGMP_USED=.FALSE. -! - TYPE(DOMAIN),TARGET :: GRID -! - TYPE(GRID_CONFIG_REC_TYPE),INTENT(IN) :: CONFIG_FLAGS -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - INTEGER :: I,ICLDCK,IENDX,ISTAT,J,K,MNTO,N,N_TIMSTPS_OUTPUT & - & ,NCUBOT,NCUTOP,NSTEP_CNV -! - INTEGER,DIMENSION(IMS:IME,JMS:JME) :: KPBL,LBOT,LOWLYR,LTOP -! - REAL :: CAPA,CF_HI,DPL,DQDT,DTCNVC,DTDT,FICE,FRAIN,G_INV & - & ,PCPCOL,PLYR,QI,QL_K,QR,QW,RDTCNVC,TL_K,WC,WMID,PLYRB - -! - REAL,DIMENSION(KMS:KME-1) :: QL,TL -! - REAL,DIMENSION(IMS:IME,JMS:JME) :: CUBOT,CUTOP,NCA,PDSL & - & ,RAINC,SFCZ,XLAND - REAL,DIMENSION(IMS:IME,JMS:JME) :: RAINCV -! - REAL,DIMENSION(ITS:ITE,JTS:JTE) :: WMID_L -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME) :: DZ,P8W,P_PHY,PI_PHY & - & ,RQCCUTEN,RQRCUTEN & - & ,RQICUTEN,RQSCUTEN & - & ,RQVCUTEN,RR,RTHCUTEN & - & ,T_PHY,TH_PHY & - & ,U_PHY,V_PHY,WINT -! - REAL,DIMENSION(IMS:IME,JMS:JME,ENSDIM) :: ZERO_GD -! - REAL,DIMENSION(:,:,:,:),ALLOCATABLE :: MOIST_TRANS -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME) :: CLDFRA_DP, CLDFRA_SH - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME) :: QC_CU, QI_CU -! - LOGICAL :: RESTART,WARM_RAIN,ETAMP_Regional, have_tg_tp, have_swath - LOGICAL,DIMENSION(IMS:IME,JMS:JME) :: CU_ACT_FLAG -! - CHARACTER(LEN=255) :: message -! -!----------------------------------------------------------------------- -!*** FOR TEMPERATURE CHANGE CHECK ONLY. -!----------------------------------------------------------------------- - INTEGER :: DTEMP_CHECK=2.0 - REAL :: TCHANGE -! random number restart - INTEGER, SAVE :: nfirst - data nfirst /0/ -#if (NMM_CORE==1) - INTEGER :: IDT - REAL, DIMENSION(2) :: RND1 -#endif -#if HWRF==1 - logical :: pert_sas - integer :: ens_random_seed - real :: ens_sasamp -#endif -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! -!----------------------------------------------------------------------- -!*** RESET THE HBOT/HTOP CONVECTIVE CLOUD BOTTOM (BASE) AND TOP ARRAYS -!*** USED IN RADIATION. THEY STORE THE MAXIMUM VERTICAL LIMITS OF -!*** CONVECTIVE CLOUD BETWEEN RADIATION CALLS. CUPPT IS THE ACCUMULATED -!*** CONVECTIVE PRECIPITATION BETWEEN RADIATION CALLS. -!----------------------------------------------------------------------- -! -! Biswas's doing - DO J=MYJS,MYJE - DO I=MYIS,MYIE -! DO J=JMS,JME -! DO I=IMS,IME - HFX(I,J)=0. - QFX(I,J)=0. - ENDDO - ENDDO -!End - - IF(MOD(NTSD,NRADS)==0.OR.MOD(NTSD,NRADL)==0)THEN - DO J=JMS,JME - DO I=IMS,IME - HTOP(I,J)=0. - HTOPD(I,J)=0. - HTOPS(I,J)=0. - HBOT(I,J)=REAL(KTE+1) - HBOTD(I,J)=REAL(KTE+1) - HBOTS(I,J)=REAL(KTE+1) - CUTOP(I,J)=0. - CUBOT(I,J)=REAL(KTE+1) - CUPPT(I,J)=0. - ENDDO - ENDDO - ENDIF -!----------------------------------------------------------------------- - IF(MOD(NTSD,NCNVC)/=0.AND. & - & CONFIG_FLAGS%CU_PHYSICS==BMJSCHEME)RETURN - IF(MOD(NTSD,NCNVC)/=0.AND. & - & CONFIG_FLAGS%CU_PHYSICS==KSASSCHEME)RETURN - IF(MOD(NTSD,NCNVC)/=0.AND. & - & CONFIG_FLAGS%CU_PHYSICS==NSASSCHEME)RETURN - IF(MOD(NTSD,NCNVC)/=0.AND. & - & CONFIG_FLAGS%CU_PHYSICS==TIEDTKESCHEME)RETURN - IF(MOD(NTSD,NCNVC)/=0.AND. & - & CONFIG_FLAGS%CU_PHYSICS==OSASSCHEME)RETURN - IF(MOD(NTSD,NCNVC)/=0.AND. & - & CONFIG_FLAGS%CU_PHYSICS==SASSCHEME)RETURN - IF(MOD(NTSD,NCNVC)/=0.AND. & - & CONFIG_FLAGS%CU_PHYSICS==SCALESASSCHEME)RETURN - -!----------------------------------------------------------------------- - NSTEP_CNV=NCNVC -! - RESTART=RESTRT -!----------------------------------------------------------------------- - IF(CONFIG_FLAGS%CU_PHYSICS==KFETASCHEME)THEN -! - IF(.NOT.RESTART.AND.NTSD==0)THEN -!$omp parallel do & -!$omp& private(i,j,k) - DO J=JTS,JTE - DO K=KTS,KTE - DO I=ITS,ITE - W0AVG(I,K,J)=0. - ENDDO - ENDDO - ENDDO - ENDIF -! - ENDIF -! -!----------------------------------------------------------------------- -!*** GENERAL PREPARATION -!----------------------------------------------------------------------- -! - AVCNVC=AVCNVC+1. - ACUTIM=ACUTIM+1. -! - DTCNVC=NCNVC*DT - RDTCNVC=1./DTCNVC - CAPA=R_D/CP - G_INV=1./G -! -!$omp parallel do & -!$omp& private(I,J) - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 -! - PDSL(I,J)=PD(I,J)*RES(I,J) - RAINCV(I,J)=0. - RAINC(I,J)=0. - P8W(I,KTS,J)=PD(I,J)+PDTOP+PT - LOWLYR(I,J)=KTS !<---- The lowest model layer counted from the bottom. - XLAND(I,J)=SM(I,J)+1. - NCA(I,J)=0. - SFCZ(I,J)=FIS(I,J)*G_INV -! -!Biswas's doing - HFX(I,J)=-TWBS(I,J) - QFX(I,J)=-QWBS(I,J)/XLV -!End - - CUTOP(I,J)=HTOP(I,J) - CUBOT(I,J)=HBOT(I,J) -! -!*** LPBL IS THE MODEL LAYER CONTAINING THE PBL TOP -!*** COUNTING DOWNWARD FROM THE TOP OF THE DOMAIN -!*** SO KPBL IS THE SAME LAYER COUNTING UPWARD FROM -!*** THE GROUND. -! - KPBL(I,J)=KTE-LPBL(I,J)+1 - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(dpl,fice,frain,i,j,k,plyr,qi,ql,qr,qw,wc) - DO J=MYJS2,MYJE2 - DO K=KTS,KTE - DO I=MYIS1,MYIE1 - DPL=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J) - QL(K)=MAX(Q(I,J,K),EPSQ) - PLYR=AETA1(K)*PDTOP+AETA2(K)*PDSL(I,J)+PT - PLYRB=AETA1(K)*PDTOP+AETA2(K)*(1.E5-PDTOP)+PT - ZNU(K)=(PLYRB-PT)/1.E5 - TL(K)=T(I,J,K) -! - RR(I,K,J)=PLYR/(R_D*TL(K)*(P608*QL(K)+1.)) - T_PHY(I,K,J)=TL(K) - - TH_PHY(I,K,J)=TL(K)*(1.E5/PLYR)**CAPA -!!! P8W(I,KFLIP,J)=PINT(I,J,K+1) - P8W(I,K+1,J)=ETA1(K+1)*PDTOP+ETA2(K+1)*PDSL(I,J)+PT - P_PHY(I,K,J)=PLYR - PI_PHY(I,K,J)=(PLYR*1.E-5)**CAPA -! - ENDDO -! - ENDDO - ENDDO - -!$omp parallel do & -!$omp& private(i,j,k) - DO J=JTS,JTE - DO K=KTS,KTE - DO I=ITS,ITE - RTHCUTEN(I,K,J)=0. - RQVCUTEN(I,K,J)=0. - RQCCUTEN(I,K,J)=0. - RQRCUTEN(I,K,J)=0. - RQICUTEN(I,K,J)=0. - RQSCUTEN(I,K,J)=0. - ENDDO - ENDDO - ENDDO -#if (NMM_CORE==1) -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KTS,KTE - DO J=JTS,JTE - DO I=ITS,ITE - DUCUDT(i,j,k)=0.0 - DVCUDT(i,j,k)=0.0 - DTHCUDT(i,j,k)=0.0 - DQVCUDT(i,j,k)=0.0 - DQRCUDT(i,j,k)=0.0 - DQCCUDT(i,j,k)=0.0 - DQICUDT(i,j,k)=0.0 - DQSCUDT(i,j,k)=0.0 - ENDDO - ENDDO - ENDDO -#endif - -! -!----------------------------------------------------------------------- -! - - IF(.NOT.HYDRO)THEN -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KTS,KTE - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - DZ(I,K,J)=Z(I,J,K+1)-Z(I,J,K) - ENDDO - ENDDO - ENDDO -! - IF(NTSD==0)THEN -!$omp parallel do & -!$omp& private(i,j,k) - DO J=MYJS2,MYJE2 - DO K=KTS,KTE+1 ! zero for all interfaces - DO I=MYIS1,MYIE1 - WINT(I,K,J)=0. - ENDDO - ENDDO - ENDDO - - ELSE ! not NTSD=0 - - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - WINT(I,KTS,J)=0. - WINT(I,KTE+1,J)=0. - ENDDO - ENDDO - - DO J=MYJS2,MYJE2 - DO K=KTS+1,KTE - DO I=MYIS1,MYIE1 - WINT(I,K,J)=0.5*(W(I,J,K)+W(I,J,K-1)) - ENDDO - ENDDO - ENDDO - - ENDIF - - ELSE ! hydrostatic - - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - WINT(I,KTS,J)=0. - WINT(I,KTE+1,J)=0. - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(i,j,k,plyr) - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - WMID_L(I,J)=-OMGALF(I,J,KTS)*CP/(G*DT) - PDSL(I,J)=PD(I,J)*RES(I,J) - PLYR=AETA1(KTS)*PDTOP+AETA2(KTS)*PDSL(I,J)+PT - DZ(I,KTS,J)=T(I,J,KTS)*(P608*Q(I,J,KTS)+1.)*R_D & - & *(P8W(I,KTS,J)-P8W(I,KTS+1,J)) & - & /(PLYR*G) - ENDDO - ENDDO -! -!$omp parallel do & -!$omp& private(i,j,k,ql_k,tl_k,wmid) - DO J=MYJS2,MYJE2 - DO K=KTS+1,KTE - DO I=MYIS1,MYIE1 - TL_K=T_PHY(I,K,J) - QL_K=MAX(Q(I,J,K),EPSQ) - WMID=-OMGALF(I,J,K)*CP/(G*DT) - WINT(I,K,J)=0.5*(WMID_L(I,J)+WMID) - WMID_L(I,J)=WMID - DZ(I,K,J)=TL_K*(P608*QL_K+1.)*R_D & - & *(P8W(I,K,J)-P8W(I,K+1,J)) & - & /(P_PHY(I,K,J)*G) - ENDDO - ENDDO - ENDDO -! - ENDIF -! -!----------------------------------------------------------------------- -!*** COMPUTE VELOCITY COMPONENTS AT MASS POINTS -!----------------------------------------------------------------------- -! - IF(CONFIG_FLAGS%CU_PHYSICS/=BMJSCHEME)THEN -! -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KTS,KTE -! - DO J=MYJS1_P1,MYJE1_P1 - DO I=MYIS_P1,MYIE_P1 - U_PHY(I,K,J)=(U(I+IHE(J),J,K)+U(I+IHW(J),J,K) & - & +U(I,J+1,K)+U(I,J-1,K)) & - & *0.25 - V_PHY(I,K,J)=(V(I+IHE(J),J,K)+V(I+IHW(J),J,K) & - & +V(I,J+1,K)+V(I,J-1,K)) & - & *0.25 - ENDDO - ENDDO -! - ENDDO -! - ENDIF -! -!----------------------------------------------------------------------- -!*** TRANSPOSE THE MOIST ARRAY (IJK) FOR THE PHYSICS (IKJ). -!----------------------------------------------------------------------- -! - IF(.NOT.ALLOCATED(MOIST_TRANS))THEN - ALLOCATE(MOIST_TRANS(IMS:IME,KMS:KME,JMS:JME,N_MOIST),STAT=ISTAT) - ENDIF -! - DO N=1,N_MOIST -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - MOIST_TRANS(I,K,J,N)=MOIST(I,J,K,N) - ENDDO - ENDDO - ENDDO - ENDDO - - - CALL SET_TILES(GRID,IDS+1,IDE-1,JDS+2,JDE-2,ITS,ITE,JTS,JTE) -#if HWRF==1 - CALL nl_get_pert_sas(1,pert_sas) - CALL nl_get_ens_random_seed(1,ens_random_seed) - CALL nl_get_ens_sasamp(1,ens_sasamp) -#endif - -#if (NMM_CORE==1) -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - DUCUDT(i,j,k)=0.0 - DVCUDT(i,j,k)=0.0 - DTHCUDT(i,j,k)=0.0 - DQVCUDT(i,j,k)=0.0 - DQRCUDT(i,j,k)=0.0 - DQCCUDT(i,j,k)=0.0 - DQICUDT(i,j,k)=0.0 - DQSCUDT(i,j,k)=0.0 - ENDDO - ENDDO - ENDDO -#endif - CALL CUMULUS_DRIVER(GRID & - & ,IDS=IDS,IDE=IDE,JDS=JDS,JDE=JDE,KDS=KDS,KDE=KDE & - & ,IMS=IMS,IME=IME,JMS=JMS,JME=JME,KMS=KMS,KME=KME & - & ,IPS=ips,IPE=ipe,JPS=jps,JPE=jpe,KPS=kps,KPE=kpe & - & ,I_START=GRID%I_START,I_END=GRID%I_END & - & ,J_START=GRID%J_START,J_END=GRID%J_END & - & ,KTS=KTS,KTE=KTE,NUM_TILES=GRID%NUM_TILES & - ! Prognostic - & ,U=U_PHY,V=V_PHY,TH=TH_PHY,T=T_PHY,W=WINT & - & ,P=P_PHY,PI=PI_PHY,RHO=RR,W0AVG=W0AVG & - ! Others - & ,ITIMESTEP=NTSD,DT=DT,DX=GPS & - & ,RAINC=RAINC,RAINCV=RAINCV,NCA=NCA & - & ,CLDFRA_DP=CLDFRA_DP,CLDFRA_SH=CLDFRA_SH & - & ,CCLDFRA=grid%ccldfra, CONVCLD=grid%convcld & - & ,QCCONV=grid%qcconv, QICONV=grid%qiconv & - & ,QC_CU=QC_CU, QI_CU=QI_CU & - & ,DZ8W=DZ,P8W=P8W,FORCET=TTEN,FORCEQ=QTEN & - & ,CLDEFI=CLDEFI,LOWLYR=LOWLYR,XLAND=XLAND & - & ,CU_ACT_FLAG=CU_ACT_FLAG,WARM_RAIN=WARM_RAIN & -! kf_edrates - & ,UDR_KF=grid%udr_kf,DDR_KF=grid%ddr_kf & - & ,UER_KF=grid%uer_kf,DER_KF=grid%der_kf & - & ,TIMEC_KF=grid%timec_kf & - & ,KF_EDRATES=config_flags%kf_edrates & -!Biswas - & ,HFX=HFX,QFX=QFX,PBLH=PBLH & - & ,HPBL_HOLD=HPBL_HOLD & - & ,ZNU=ZNU & - & ,STEPCU=NSTEP_CNV,GSW=GSW & - & ,PERIODIC_X=.FALSE.,PERIODIC_Y=.FALSE. & - & ,HTOP=CUTOP,HBOT=CUBOT,KPBL=KPBL,HT=SFCZ,Z=Z & - & ,APR_GR=APR_GR,APR_W=APR_W,APR_MC=APR_MC & - & ,APR_ST=APR_ST,APR_AS=APR_AS,APR_CAPMA=APR_CAPMA & - & ,APR_CAPME=APR_CAPME,APR_CAPMI=APR_CAPMI & - & ,MASS_FLUX=MASS_FLUX,XF_ENS=XF_ENS & - & ,PR_ENS=PR_ENS & - & ,GD_CLOUD=GD_CLOUD,GD_CLOUD2=GD_CLOUD2 & - & ,KTOP_DEEP=KTOP_DEEP & - & ,ENSDIM=ENSDIM,MAXIENS=1,MAXENS=3 & - & ,MAXENS2=3,MAXENS3=16 & - & ,RTHCUTEN=RTHCUTEN,RQVCUTEN=RQVCUTEN & - & ,RQCCUTEN=RQCCUTEN,RQRCUTEN=RQRCUTEN & - & ,RQICUTEN=RQICUTEN,RQSCUTEN=RQSCUTEN & - & ,RTHBLTEN=RTHBLTEN,RQVBLTEN=RQVBLTEN & - & ,RTHRATEN=RTHRATEN & -#if (NMM_CORE==1) - & ,RUCUTEN=DUCUDT, RVCUTEN=DVCUDT, MOMMIX=MOMMIX & - ,store_rand=store_rand & -#if (HWRF==1) - & ,pert_sas=pert_sas & - & ,ens_random_seed=ens_random_seed & - & ,ens_sasamp=ens_sasamp & -#endif -#endif - & ,SHALL=grid%shall & - & ,HPBL2D=HPBL2D,EVAP2D=EVAP2D,HEAT2D=HEAT2D & - & ,DX2D=DX2D,DYNMM=DYNMM & ! scale-sware SAS - & ,SCALEFUN=SCALEFUN, SCALEFUN1=SCALEFUN1 & ! scale function - & ,SIGMU=SIGMU, SIGMU1=SIGMU1 & ! updraft fraction - - & ,pgcon=config_flags%sas_pgcon & - & ,sas_mass_flux=config_flags%sas_mass_flux & - & ,shalconv=config_flags%sas_shal_conv & - & ,shal_pgcon=config_flags%sas_shal_pgcon & - & ,IS_CAMMGMP_USED=IS_CAMMGMP_USED & - & ,BMJ_RAD_FEEDBACK=config_flags%bmj_rad_feedback & - ! Selection argument - & ,CU_PHYSICS=CONFIG_FLAGS%CU_PHYSICS & - & ,MP_PHYSICS=CONFIG_FLAGS%MP_PHYSICS & - ! Moisture tracer arguments - & ,QV_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QV),F_QV=F_QV & - & ,QC_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QC),F_QC=F_QC & - & ,QR_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QR),F_QR=F_QR & - & ,QI_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QI),F_QI=F_QI & - & ,QS_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QS),F_QS=F_QS & - & ,QG_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QG),F_QG=F_QG) -! -#if (NMM_CORE==1) -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - DTHCUDT(i,j,k)=RTHCUTEN(i,k,j) - DQVCUDT(i,j,k)=RQVCUTEN(i,k,j) - DQRCUDT(i,j,k)=RQRCUTEN(i,k,j) - DQCCUDT(i,j,k)=RQCCUTEN(i,k,j) - DQICUDT(i,j,k)=RQICUTEN(i,k,j) - DQSCUDT(i,j,k)=RQSCUTEN(i,k,j) - ENDDO - ENDDO - ENDDO -#endif - -!----------------------------------------------------------------------- -! -!*** CNVTOP/CNVBOT HOLD THE MAXIMUM VERTICAL LIMITS OF CONVECTIVE CLOUD -!*** BETWEEN HISTORY OUTPUT TIMES. HBOTS/HTOPS STORE SIMILIAR INFORMATION -!*** FOR SHALLOW (NONPRECIPITATING) CONVECTION, AND HBOTD/HTOPD ARE FOR -!*** DEEP (PRECIPITATING) CONVECTION. -! - CF_HI=CONFIG_FLAGS%HISTORY_INTERVAL - - if(CF_HI<1e-5) then - CF_HI = config_flags%history_interval_s/60. & - + config_flags%history_interval_m & - + config_flags%history_interval_h*3600. & - + config_flags%history_interval_d*3600.*24. - endif - - N_TIMSTPS_OUTPUT=NINT(60.*CF_HI/DT) - MNTO=MOD(NTSD,max(1,N_TIMSTPS_OUTPUT)) -! - IF(MNTO>0.AND.MNTO<=NCNVC)THEN - DO J=MYJS2,MYJE2 - IENDX=MYIE1 - IF(MOD(J,2)==0.AND.ITE==IDE-1)IENDX=IENDX-1 - DO I=MYIS1,IENDX - CNVBOT(I,J)=REAL(KTE+1.) - CNVTOP(I,J)=0. - HBOTD(I,J)=REAL(KTE+1.) - HTOPD(I,J)=0. - HBOTS(I,J)=REAL(KTE+1.) - HTOPS(I,J)=0. - ENDDO - ENDDO - ENDIF -! -!----------------------------------------------------------------------- -! - - have_tg_tp = .false. - have_swath = .false. - have_tg_tp = (size(grid%tg_total_precip)>1) -#if ( HWRF == 1 ) - have_swath = ( size(grid%precip_swath)>1 ) -#endif -!$omp parallel do & -!$omp& private(i,iendx,j,ncubot,ncutop,pcpcol) - pcp_cloud: DO J=MYJS2,MYJE2 - IENDX=MYIE1 - IF(MOD(J,2)==0.AND.ITE==IDE-1)IENDX=IENDX-1 - DO I=MYIS1,IENDX -! -!*** UPDATE PRECIPITATION -! - PCPCOL=RAINCV(I,J)*1.E-3*NSTEP_CNV - PREC(I,J)=PREC(I,J)+PCPCOL - ACPREC(I,J)=ACPREC(I,J)+PCPCOL - CUPREC(I,J)=CUPREC(I,J)+PCPCOL - CUPPT(I,J)=CUPPT(I,J)+PCPCOL - CPRATE(I,J)=PCPCOL - if(have_tg_tp) then - grid%tg_total_precip(i,j) = grid%tg_total_precip(i,j) + PCPCOL - endif -#if ( HWRF == 1 ) - if(have_swath) then - if(grid%interesting(i,j)/=0) then - grid%precip_swath(i,j) = grid%precip_swath(i,j) + PCPCOL - if(size(grid%cuprecip_swath)>0) then - grid%cuprecip_swath(i,j) = grid%cuprecip_swath(i,j) + PCPCOL - endif - endif - endif -#endif -! -!*** SAVE CLOUD TOP AND BOTTOM FOR RADIATION (HTOP/HBOT) AND -!*** FOR OUTPUT (CNVTOP/CNVBOT, HTOPS/HBOTS, HTOPD/HBOTD) ARRAYS. -!*** THEY MUST BE TREATED SEPARATELY FROM EACH OTHER. -! - CUTOP(I,J)=MIN(CUTOP(I,J),REAL(KDE)) - CUTOP(I,J)=MAX(CUTOP(I,J),0.0) - CUBOT(I,J)=MIN(CUBOT(I,J),REAL(KDE)) - CUBOT(I,J)=MAX(CUBOT(I,J),0.0) - - NCUTOP=NINT(CUTOP(I,J)) - NCUBOT=NINT(CUBOT(I,J)) -! - IF(NCUTOP>1.AND.NCUTOP0.)THEN - HTOPD(I,J)=MAX(CUTOP(I,J),HTOPD(I,J)) - ELSE - HTOPS(I,J)=MAX(CUTOP(I,J),HTOPS(I,J)) - ENDIF - ENDIF -! - IF(NCUBOT>0.AND.NCUBOT0.)THEN - HBOTD(I,J)=MIN(CUBOT(I,J),HBOTD(I,J)) - ELSE - HBOTS(I,J)=MIN(CUBOT(I,J),HBOTS(I,J)) - ENDIF - ENDIF -! - ENDDO - ENDDO pcp_cloud -! -!----------------------------------------------------------------------- -!*** UPDATE TEMPERATURE, SPECIFIC HUMIDITY, AND HEATING. -!----------------------------------------------------------------------- -! -!-- ETAMP_Regional logical is true for regional NAM (ETAMPNEW) or HRW (ETAMPNEW) microphysics -! - ETAMP_Regional=.FALSE. - IF (CONFIG_FLAGS%MP_PHYSICS==ETAMPNEW .OR. & - & CONFIG_FLAGS%MP_PHYSICS==FER_MP_HIRES) ETAMP_Regional=.TRUE. -! -!$omp parallel do & -!$omp& private(dqdt,dtdt,i,iendx,j,k,tchange) - DO K=KTS,KTE - DO J=MYJS2,MYJE2 - IENDX=MYIE1 - IF(MOD(J,2)==0.AND.ITE==IDE-1)IENDX=IENDX-1 - DO I=MYIS1,IENDX -! -!*** RQVCUTEN IN BMJDRV IS THE MIXING RATIO TENDENCY, -!*** SO RETRIEVE DQDT BY CONVERTING TO SPECIFIC HUMIDITY. -! - DQDT=RQVCUTEN(I,K,J)/(1.+MOIST_TRANS(I,K,J,P_QV))**2 -! -!*** RTHCUTEN IN BMJDRV IS DTDT OVER PI. -! - DTDT=RTHCUTEN(I,K,J)*PI_PHY(I,K,J) - T(I,J,K)=T(I,J,K)+DTDT*DTCNVC - Q(I,J,K)=Q(I,J,K)+DQDT*DTCNVC - TCUCN(I,J,K)=TCUCN(I,J,K)+DTDT - MOIST_TRANS(I,K,J,P_QV)=Q(I,J,K)/(1.-Q(I,J,K)) !Convert to mixing ratio -! - cps_select: SELECT CASE(config_flags%cu_physics) -! - CASE (KFSCHEME,KFETASCHEME,GDSCHEME,SASSCHEME,SCALESASSCHEME,OSASSCHEME,KSASSCHEME,NSASSCHEME,TIEDTKESCHEME) - IF(config_flags%mp_physics==fer_mp_hires_advect) THEN - ! Update QI and QRIMEF: - call QITEND_FER_HIRES_ADVECT( & - MOIST_TRANS(I,K,J,P_QI), & - SCALAR(I,J,K,P_QRIMEF), & - RQICUTEN(I,K,J)*DTCNVC) - ELSEIF (ETAMP_Regional) THEN - MOIST_TRANS(I,K,J,P_QS)=MAX(0.,MOIST_TRANS(I,K,J,P_QS)+RQICUTEN(I,K,J)*DTCNVC+RQSCUTEN(I,K,J)*DTCNVC) - ELSE - MOIST_TRANS(I,K,J,P_QI)=MAX(0.,MOIST_TRANS(I,K,J,P_QI)+RQICUTEN(I,K,J)*DTCNVC) - MOIST_TRANS(I,K,J,P_QS)=MAX(0.,MOIST_TRANS(I,K,J,P_QS)+RQSCUTEN(I,K,J)*DTCNVC) - ENDIF - MOIST_TRANS(I,K,J,P_QR)=MAX(0.,MOIST_TRANS(I,K,J,P_QR)+RQRCUTEN(I,K,J)*DTCNVC) - MOIST_TRANS(I,K,J,P_QC)=MAX(0.,MOIST_TRANS(I,K,J,P_QC)+RQCCUTEN(I,K,J)*DTCNVC) - END SELECT cps_select -! - TCHANGE=DTDT*DTCNVC - IF(ABS(TCHANGE)>DTEMP_CHECK)THEN - WRITE(message,*)'BIG T CHANGE BY CONVECTION=',TCHANGE & - ,' AT (',I,',',J,',',K,') FOR NTSD=',NTSD - CALL wrf_message(trim(message)) - ENDIF -! - ENDDO - ENDDO - ENDDO -!----------------------------------------------------------------------- -!*** REFILL THE MOIST ARRAY. -!----------------------------------------------------------------------- -! - DO N=1,N_MOIST -!$omp parallel do & -!$omp& private(i,j,k) - DO J=JMS,JME - DO K=KMS,KME - DO I=IMS,IME - MOIST(I,J,K,N)=MOIST_TRANS(I,K,J,N) - ENDDO - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - DEALLOCATE(MOIST_TRANS,STAT=ISTAT) -! -!----------------------------------------------------------------------- -! - END SUBROUTINE CUCNVC -! -!----------------------------------------------------------------------- -!*********************************************************************** - SUBROUTINE GSMDRIVE(NTSD,DT,NPHS,N_MOIST & - & ,DX,DY,SM,HBM2,FIS & - & ,DETA1,DETA2,AETA1,AETA2,ETA1,ETA2 & - & ,PDTOP,PT,PD,RES,PINT,T,Q,CWM,TRAIN & - & ,MOIST,SCALAR,N_SCALAR & - & ,F_ICE,F_RAIN,F_RIMEF,SR & - & ,PREC,ACPREC,AVRAIN & - & ,MP_RESTART_STATE & - & ,TBPVS_STATE & - & ,TBPVS0_STATE & - & ,GRID,CONFIG_FLAGS & - & ,re_cloud,re_ice,re_snow & ! G. Thompson - & ,has_reqc,has_reqi,has_reqs & ! G. Thompson - & ,diag_flag & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: GSMDRIVE MICROPHYSICS OUTER DRIVER -! PRGRMMR: BLACK ORG: W/NP22 DATE: 02-03-26 -! -! ABSTRACT: -! GSMDRIVE DRIVES THE MICROPHYSICS SCHEMES -! -! PROGRAM HISTORY LOG: -! 02-03-26 BLACK - ORIGINATOR -! 04-11-18 BLACK - THREADED -! 05-12-19 BLACK - CONVERTED FROM IKJ TO IJK -! -! USAGE: CALL GSMDRIVE FROM SOLVE_NMM -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM -!$$$ -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE & - & ,N_MOIST,N_SCALAR,NPHS,NTSD -! - REAL,INTENT(IN) :: DT,DX,DY,PDTOP,PT -! - REAL,INTENT(INOUT) :: AVRAIN -! - REAL,DIMENSION(KMS:KME-1),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2 - REAL,DIMENSION(KMS:KME),INTENT(IN) :: ETA1,ETA2 -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: FIS,HBM2,PD,RES,SM -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PINT -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: ACPREC,PREC -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: CWM,Q & - & ,T,TRAIN -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: F_ICE & !<--- Used only with physics (IKJ) - & ,F_RAIN & - & ,F_RIMEF - - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,N_MOIST) & - & ,INTENT(INOUT) :: MOIST - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,N_SCALAR) & - & ,INTENT(INOUT) :: SCALAR -! -!*** State var for etampnew microphysics (JM, 2005 05 02) -! - REAL,DIMENSION(:),INTENT(INOUT) :: MP_RESTART_STATE & - & ,TBPVS_STATE,TBPVS0_STATE -! - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: SR -! -!..Additions for coupling cloud physics effective radii and radiation. G. Thompson - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT):: re_cloud, re_ice, re_snow - INTEGER, INTENT(IN):: has_reqc, has_reqi, has_reqs -! - TYPE(DOMAIN),TARGET :: GRID -! - TYPE(GRID_CONFIG_REC_TYPE),INTENT(IN) :: CONFIG_FLAGS -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - INTEGER :: I,IENDX,IJ,ISTAT,J,K,N -! - INTEGER,DIMENSION(IMS:IME,JMS:JME) :: LOWLYR -! - REAL :: CAPA,DPL,DTPHS,PCPCOL,PLYR,RDTPHS,RG,TNEW -! - REAL,DIMENSION(KMS:KME-1) :: QL,TL -! - REAL,DIMENSION(IMS:IME,JMS:JME) :: CUBOT,CUTOP,PDSL & - & ,RAINNC,RAINNCV,XLAND -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME) :: CWM_PHY,DZ & - & ,P8W,P_PHY,PI_PHY & - & ,RR,T_PHY,TH_PHY -! - REAL,DIMENSION(:,:,:,:),ALLOCATABLE :: MOIST_TRANS - REAL,DIMENSION(:,:,:,:),ALLOCATABLE :: SCALAR_TRANS - REAL,DIMENSION(:,:,:), ALLOCATABLE :: W_TRANS -! - LOGICAL :: diag_flag - LOGICAL :: E_BDY,F_QT,QT_PRESENT,WARM_RAIN, have_tg_tp, have_swath -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! - ALLOCATE(MOIST_TRANS(IMS:IME,KMS:KME,JMS:JME,N_MOIST),STAT=ISTAT) - ALLOCATE(SCALAR_TRANS(IMS:IME,KMS:KME,JMS:JME,N_SCALAR),STAT=ISTAT) - ALLOCATE(W_TRANS(IMS:IME,KMS:KME,JMS:JME)) -! -!----------------------------------------------------------------------- -!*** TRANSPOSE THE MOIST ARRAY (IJK) FOR THE PHYSICS (IKJ). -!----------------------------------------------------------------------- -! - DO N=2,N_MOIST -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - MOIST_TRANS(I,K,J,N)=MOIST(I,J,K,N) - ENDDO - ENDDO - ENDDO - ENDDO - do k=kts,kte - do j=jts,jte - do i=its,ite - w_trans(i,k,j)=max(grid%w(i,j,k),grid%w_tot(i,j,k)) - enddo - enddo - enddo -! -!----------------------------------------------------------------------- -! -!-- QT_PRESENT logical is true for regional NAM (ETAMPNEW), HRW (ETAMPNEW), -! or HWRF (ETAMP_HWRF) microphysics -! - QT_PRESENT=.FALSE. - IF (CONFIG_FLAGS%MP_PHYSICS==ETAMPNEW .OR. & - & CONFIG_FLAGS%MP_PHYSICS==FER_MP_HIRES .OR. & - & CONFIG_FLAGS%MP_PHYSICS==ETAMP_HWRF) QT_PRESENT=.TRUE. -! - micro_check1: IF(.NOT.QT_PRESENT) THEN - DO N=2,N_SCALAR -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - SCALAR_TRANS(I,K,J,N)=SCALAR(I,J,K,N) - ENDDO - ENDDO - ENDDO - ENDDO - ENDIF micro_check1 -! -!----------------------------------------------------------------------- -! - DTPHS=NPHS*DT - RDTPHS=1./DTPHS - CAPA=R_D/CP - RG=1./G - AVRAIN=AVRAIN+1. -! -!----------------------------------------------------------------------- -! -!*** PREPARE NEEDED ARRAYS -! -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(i,j) - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 -! - PDSL(I,J)=PD(I,J)*RES(I,J) - P8W(I,KTE+1,J)=PT - LOWLYR(I,J)=KTS !<---- The lowest model layer counted from the bottom. - XLAND(I,J)=SM(I,J)+1. -!----------------------------------------------------------------------- -!*** FILL RAINNC WITH ZERO (NORMALLY CONTAINS THE NONCONVECTIVE -!*** ACCUMULATED RAIN BUT NOT YET USED BY NMM). -!*** CAN BE OBTAINED FROM ACPREC AND CUPREC (ACPREC-CUPREC). -!----------------------------------------------------------------------- - RAINNC(I,J)=0. -! - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** FILL THE SINGLE-COLUMN INPUT -!----------------------------------------------------------------------- -! -!$omp parallel do & -!$omp& private(dpl,i,j,k,plyr,ql,tl) - DO J=MYJS2,MYJE2 - DO K=KTS,KTE - DO I=MYIS1,MYIE1 - DPL=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J) - QL(K)=MAX(Q(I,J,K),EPSQ) -!!! PLYR=AETA1(K)*PDTOP+AETA2(K)*PDSL(I,J)+PT - PLYR=(PINT(I,J,K)+PINT(I,J,K+1))*0.5 - TL(K)=T(I,J,K) -! - RR(I,K,J)=PLYR/(R_D*TL(K)*(P608*QL(K)+1.)) - T_PHY(I,K,J)=TL(K) - PI_PHY(I,K,J)=(PLYR*1.E-5)**CAPA - TH_PHY(I,K,J)=TL(K)/PI_PHY(I,K,J) -!!! P8W(I,KFLIP,J)=PINT(I,J,K+1) - P8W(I,K,J)=ETA1(K)*PDTOP+ETA2(K)*PDSL(I,J)+PT - P_PHY(I,K,J)=PLYR - DZ(I,K,J)=DPL*RG/RR(I,K,J) - CWM_PHY(I,K,J)=CWM(I,J,K) - ENDDO -! - ENDDO - ENDDO -!----------------------------------------------------------------------- -! -!*** CALL MICROPHYSICS -! -!----------------------------------------------------------------------- -! - CALL SET_TILES(GRID,IDS+1,IDE-1,JDS+2,JDE-2,ITS,ITE,JTS,JTE) -! - CALL MICROPHYSICS_DRIVER( & - & TH=TH_PHY,RHO=RR,PI_PHY=PI_PHY,P=P_PHY & - & ,RAINNC=RAINNC,RAINNCV=RAINNCV & - & ,DZ8W=DZ,P8W=P8W,DT=DTPHS,DX=DX,DY=DY & - & ,W=w_trans & - & ,MP_PHYSICS=CONFIG_FLAGS%MP_PHYSICS & - & ,SPECIFIED=CONFIG_FLAGS%SPECIFIED & - & .OR.CONFIG_FLAGS%NESTED & - & ,SPEC_ZONE=0,WARM_RAIN=WARM_RAIN & - & ,XLAND=XLAND,ITIMESTEP=NTSD-1 & - & ,F_ICE_PHY=F_ICE,F_RAIN_PHY=F_RAIN & - & ,F_RIMEF_PHY=F_RIMEF & - & ,LOWLYR=LOWLYR,SR=SR & - & ,QV_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QV),F_QV=F_QV & - & ,QC_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QC),F_QC=F_QC & - & ,QR_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QR),F_QR=F_QR & - & ,QI_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QI),F_QI=F_QI & - & ,QS_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QS),F_QS=F_QS & - & ,QG_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QG),F_QG=F_QG & - & ,QH_CURR=MOIST_TRANS(IMS,KMS,JMS,P_QH),F_QH=F_QH & - & , QNN_CURR=SCALAR_TRANS(ims,kms,jms,P_QNN), F_QNN=F_QNN & - & , QNDROP_CURR=SCALAR_TRANS(ims,kms,jms,P_QNDROP), F_QNDROP=F_QNDROP & - & , QNI_CURR=SCALAR_TRANS(ims,kms,jms,P_QNI), F_QNI=F_QNI & - & , QNC_CURR=SCALAR_TRANS(ims,kms,jms,P_QNC), F_QNC=F_QNC & - & , QNR_CURR=SCALAR_TRANS(ims,kms,jms,P_QNR), F_QNR=F_QNR & - & , QNS_CURR=SCALAR_TRANS(ims,kms,jms,P_QNS), F_QNS=F_QNS & - & , QNG_CURR=SCALAR_TRANS(ims,kms,jms,P_QNG), F_QNG=F_QNG & - & , QNH_CURR=SCALAR_TRANS(ims,kms,jms,P_QNH), F_QNH=F_QNH & ! for milbrandt2mom and nssl_2mom - & , QVOLG_CURR=SCALAR_TRANS(ims,kms,jms,P_QVOLG), F_QVOLG=F_QVOLG & ! for nssl_2mom - & , QVOLH_CURR=SCALAR_TRANS(ims,kms,jms,P_QVOLH), F_QVOLH=F_QVOLH & ! for nssl_2mom - & ,QRIMEF_CURR=SCALAR_TRANS(IMS,KMS,JMS,P_QRIMEF),F_QRIMEF=F_QRIMEF & - & ,QT_CURR=CWM_PHY,F_QT=QT_PRESENT & - & ,MP_RESTART_STATE=MP_RESTART_STATE & - & ,TBPVS_STATE=TBPVS_STATE & - & ,TBPVS0_STATE=TBPVS0_STATE & - & ,IDS=IDS,IDE=IDE,JDS=JDS,JDE=JDE,KDS=KDS,KDE=KDE & - & ,IMS=IMS,IME=IME,JMS=JMS,JME=JME,KMS=KMS,KME=KME & - & ,I_START=GRID%I_START,I_END=GRID%I_END & - & ,J_START=GRID%J_START,J_END=GRID%J_END & - & ,KTS=KTS,KTE=KTE,NUM_TILES=GRID%NUM_TILES & - & ,DO_RADAR_REF=config_flags%do_radar_ref & - & ,DIAGFLAG=diag_flag & - & ,ID=grid%id & - & ,num_scalar=1 & !mchen temporary - & ,refl_10cm=grid%refl_10cm & ! to calc. radar reflectivity - & ,re_cloud=grid%re_cloud & ! G. Thompson - & ,re_ice=grid%re_ice & ! G. Thompson - & ,re_snow=grid%re_snow & ! G. Thompson - & ,has_reqc=has_reqc & ! G. Thompson - & ,has_reqi=has_reqi & ! G. Thompson - & ,has_reqs=has_reqs & ! G. Thompson - & ,ccn_conc=config_flags%ccn_conc & - & ,aercu_opt=config_flags%aercu_opt & - ) - -!$omp parallel do & -!$omp& private(ij) - DO IJ=1,GRID%NUM_TILES - CALL MICROPHYSICS_ZERO_OUTA( & - MOIST_TRANS,N_MOIST,CONFIG_FLAGS & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,GRID%I_START(IJ),GRID%I_END(IJ) & - ,GRID%J_START(IJ),GRID%J_END(IJ) & - ,KTS,KTE ) - ENDDO - - - -! -!----------------------------------------------------------------------- -! - E_BDY=(ITE>=IDE) -! -!----------------------------------------------------------------------- -!*** UPDATE TEMPERATURE, SPECIFIC HUMIDITY, CLOUD WATER, AND HEATING. -!----------------------------------------------------------------------- -!$omp parallel do & -!$omp& private(i,iendx,j,k,tnew) - DO K=KTS,KTE - DO J=MYJS2,MYJE2 - IENDX=MYIE1 - IF(E_BDY.AND.MOD(J,2)==0)IENDX=IENDX-1 - DO I=MYIS1,IENDX - TNEW=TH_PHY(I,K,J)*PI_PHY(I,K,J) - TRAIN(I,J,K)=TRAIN(I,J,K)+(TNEW-T(I,J,K))*RDTPHS - T(I,J,K)=TNEW - Q(I,J,K)=MOIST_TRANS(I,K,J,P_QV)/(1.+MOIST_TRANS(I,K,J,P_QV)) - CWM(I,J,K)=CWM_PHY(I,K,J) - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** UPDATE PRECIPITATION. -!*** NOTE: RAINNC IS ACCUMULATED INSIDE MICROPHYSICS BUT NMM ZEROES IT -!*** OUT ABOVE SINCE IT IS ONLY A LOCAL ARRAY FOR NOW. -!----------------------------------------------------------------------- -! -#if ( HWRF == 1 ) - have_swath = ( size(grid%precip_swath)>1 ) -#endif - have_tg_tp = (size(grid%tg_total_precip)>1) -!$omp parallel do & -!$omp& private(i,iendx,j,pcpcol) - DO J=MYJS2,MYJE2 - IENDX=MYIE1 - IF(E_BDY.AND.MOD(J,2)==0)IENDX=IENDX-1 - DO I=MYIS1,IENDX - PCPCOL=RAINNCV(I,J)*1.E-3 - PREC(I,J)=PREC(I,J)+PCPCOL - ACPREC(I,J)=ACPREC(I,J)+PCPCOL - if(have_tg_tp) then - grid%tg_total_precip(i,j) = grid%tg_total_precip(i,j) + PCPCOL - endif -#if ( HWRF == 1 ) - if(have_swath) then - if(grid%interesting(i,j)/=0) & - grid%precip_swath(i,j) = grid%precip_swath(i,j) + PCPCOL - endif -#endif - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** REFILL THE MOIST ARRAY. -!----------------------------------------------------------------------- -! - DO N=2,N_MOIST -!$omp parallel do & -!$omp& private(i,j,k) - DO J=JMS,JME - DO K=KMS,KME - DO I=IMS,IME - MOIST(I,J,K,N)=MOIST_TRANS(I,K,J,N) - ENDDO - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - micro_check2: IF (.NOT.QT_PRESENT) THEN - DO N=2,N_SCALAR -!$omp parallel do & -!$omp& private(i,j,k) - DO J=JMS,JME - DO K=KMS,KME - DO I=IMS,IME - SCALAR(I,J,K,N)=SCALAR_TRANS(I,K,J,N) - ENDDO - ENDDO - ENDDO - ENDDO - ENDIF micro_check2 -! -!----------------------------------------------------------------------- -! - DEALLOCATE(MOIST_TRANS,STAT=ISTAT) - DEALLOCATE(SCALAR_TRANS,STAT=ISTAT) -! -!----------------------------------------------------------------------- -! - END SUBROUTINE GSMDRIVE -! -!----------------------------------------------------------------------- -!*********************************************************************** - SUBROUTINE UPDATE_MOIST(MOIST,Q,CWM,F_ICE,F_RAIN,N_MOIST & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!*********************************************************************** -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE & - & ,N_MOIST -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: CWM,Q -! - REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: F_ICE & !<--- Used only with physics (IKJ) - & ,F_RAIN -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,N_MOIST),INTENT(OUT) :: MOIST -! -!----------------------------------------------------------------------- -!*** LOCAL VARIABLES -!----------------------------------------------------------------------- -! - INTEGER :: I,J,K -! - REAL :: FICE,FRAIN,QI,QR,QW,WC -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! - DO K=KTS,KTE - DO J=MYJS,MYJE - DO I=MYIS,MYIE - MOIST(I,J,K,P_QV)=Q(I,J,K)/(1.-Q(I,J,K)) - WC=CWM(I,J,K) - QI=0. - QR=0. - QW=0. - FICE=F_ICE(I,K,J) - FRAIN=F_RAIN(I,K,J) -! - IF(FICE>=1.)THEN - QI=WC - ELSEIF(FICE<=0.)THEN - QW=WC - ELSE - QI=FICE*WC - QW=WC-QI - ENDIF -! - IF(QW>0..AND.FRAIN>0.)THEN - IF(FRAIN>=1.)THEN - QR=QW - QW=0. - ELSE - QR=FRAIN*QW - QW=QW-QR - ENDIF - ENDIF -! - MOIST(I,J,K,P_QC)=QW - MOIST(I,J,K,P_QR)=QR - MOIST(I,J,K,P_QI)=0. - MOIST(I,J,K,P_QS)=QI - MOIST(I,J,K,P_QG)=0. - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -! - END SUBROUTINE UPDATE_MOIST -! -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- -! - END MODULE MODULE_PHYSICS_CALLS -! -!------------------------------------------------------------------- diff --git a/dyn_nmm/module_PRECIP_ADJUST.F b/dyn_nmm/module_PRECIP_ADJUST.F deleted file mode 100644 index 50626d6125..0000000000 --- a/dyn_nmm/module_PRECIP_ADJUST.F +++ /dev/null @@ -1,297 +0,0 @@ -!----------------------------------------------------------------------- -! -!NCEP_MESO:MODEL_LAYER: PHYSICS -! -!---------------------------------------------------------------------- -#include "nmm_loop_basemacros.h" -#include "nmm_loop_macros.h" -!----------------------------------------------------------------------- -! - MODULE MODULE_PRECIP_ADJUST -! -! This module contains 3 subroutines: -! READPCP -! CHKSNOW -! ADJPPT -!----------------------------------------------------------------------- -!*** -!*** Specify the diagnostic point here: (i,j) and the processor number. -!*** Remember that in WRF, local and global (i,j) are the same, so don't -!*** use the "local(i,j)" output from glb2loc.f; use the GLOBAL (I,J) -!*** and the PE_WRF. -!*** -! - INTEGER :: ITEST=346,JTEST=256,TESTPE=53 -!----------------------------------------------------------------------- -! - CONTAINS -! -!----------------------------------------------------------------------- - SUBROUTINE READPCP(PPTDAT,DDATA,LSPA & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! -! **************************************************************** -! * * -! * PRECIPITATION ASSIMILATION INITIALIZATION. * -! * READ IN PRECIP ANALYSIS AND DATA MASK AND SET UP ALL * -! * APPROPRIATE VARIABLES. * -! * MIKE BALDWIN, MARCH 1994 * -! * Adapted to 2-D code, Ying Lin, Mar 1996 * -! * For WRF/NMM: Y.Lin Mar 2005 * -! * * -! **************************************************************** -!----------------------------------------------------------------------- -! -! READ THE BINARY VERSION OF THE PRECIP ANALYSIS. -! - IMPLICIT NONE - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, & - & IMS,IME,JMS,JME,KMS,KME, & - & ITS,ITE,JTS,JTE,KTS,KTE - REAL,DIMENSION(IDS:IDE,JDS:JDE) :: TEMPG - REAL,DIMENSION(IMS:IME,JMS:JME) :: TEMPL - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: DDATA, LSPA - REAL,DIMENSION(IMS:IME,JMS:JME,3),INTENT(OUT) :: PPTDAT - INTEGER :: I, J, IHR - INTEGER :: MYPE - CHARACTER*256 :: MESSAGE -! -! Get the value of MYPE: -! - CALL WRF_GET_MYPROC(MYPE) -! - TEMPG=999. -! - DO IHR=1,3 - IF(MYPE==0)THEN - READ(40+IHR) ((TEMPG(I,J),I=IDS,IDE-1),J=JDS,JDE-1) - WRITE(MESSAGE,*) 'IHR=', IHR, ' FINISHED READING PCP TO TEMPG' - CALL WRF_MESSAGE(MESSAGE) - CLOSE(40+IHR) -! - DO J=JDS,JDE-1 - DO I=IDS,IDE-1 -! In the binary version of the precip data, missing data are denoted as '999.' -! Convert the valid data from mm to m: - IF (TEMPG(I,J).LT.900.) TEMPG(I,J)=TEMPG(I,J)*0.001 - ENDDO - ENDDO - ENDIF -! -! Distribute to local temp array: - CALL DSTRB(TEMPG,TEMPL,1,1,1,1,1 & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE) -! -! Place into correct hour slot in PPTDAT: - DO J=JMS,JME - DO I=IMS,IME - PPTDAT(I,J,IHR)=TEMPL(I,J) - ENDDO - ENDDO -! - IF(MYPE==TESTPE)THEN - WRITE(MESSAGE,*) 'ADJPPT-READPCP, IHR',IHR, 'PPTDAT=', & - & PPTDAT(ITEST,JTEST,IHR) - CALL WRF_MESSAGE(MESSAGE) - ENDIF - - ENDDO -! -! Give DDATA (hourly precipitation analysis partitioned into each physics -! timestep; partitioning done in ADJPPT) an initial value of 999, because -! TURBL/SURFCE is called before ADJPPT. Also initialize LSPA to zero. -! - DDATA=999. - LSPA=0. -! - RETURN - END SUBROUTINE READPCP -! - SUBROUTINE CHKSNOW(NTSD,DT,NPHS,SR,PPTDAT & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! -! AT THE FIRST PHYSICS TIME STEP AFTER THE TOP OF EACH HOUR, CHECK THE SNOW -! ARRAY AGAINST THE SR (SNOW/TOTAL PRECIP RATIO). IF SR .GE. 0.9, SET THIS -! POINT TO MISSING (SO WE WON'T DO SNOW ADJUSTMENT HERE). -! -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! - INTEGER,INTENT(IN) :: NTSD,NPHS - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, & - & IMS,IME,JMS,JME,KMS,KME, & - & ITS,ITE,JTS,JTE,KTS,KTE - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: SR - REAL,DIMENSION(IMS:IME,JMS:JME,3),INTENT(INOUT) :: PPTDAT - REAL,INTENT(IN) :: DT - REAL :: TIMES - INTEGER :: I, J, IHR - INTEGER :: MYPE - CHARACTER*256 :: MESSAGE -!----------------------------------------------------------------------- - TIMES=NTSD*DT - IF (MOD(TIMES,3600.) < NPHS*DT) THEN - IHR=INT(TIMES)/3600+1 - IF (IHR > 3) go to 10 - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - IF (SR(I,J) >= 0.9) PPTDAT(I,J,IHR) = 999. - ENDDO - ENDDO -! -! Get the value of MYPE: -! - CALL WRF_GET_MYPROC(MYPE) -! - IF (MYPE==TESTPE) THEN - WRITE(MESSAGE,1010) TIMES,SR(ITEST,JTEST) - 1010 FORMAT('ADJPPT-CHKSNOW: TIMES, SR=',F6.0,1X,F6.4) - CALL WRF_MESSAGE(MESSAGE) - ENDIF - ENDIF - 10 CONTINUE - RETURN - END SUBROUTINE CHKSNOW -! - SUBROUTINE ADJPPT(NTSD,DT,NPHS,PREC,LSPA,PPTDAT,DDATA & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - -!*********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: ADJPPT PRECIPITATION/CLOUD ADJUSTMENT -! PRGRMMR: Y. LIN ORG: W/NP22 DATE: 2005/03/30 -! -! ABSTRACT: -! ADJPPT MAKES ADJUSTMENT TO MODEL'S TEMPERATURE, MOISTURE, HYDROMETEOR -! FIELDS TO BE MORE CONSISTENT WITH THE OBSERVED PRECIPITATION AND CLOUD -! TOP PRESSURE -! -! FOR NOW, AS A FIRST STEP, JUST PARTITION THE INPUT HOURLY PRECIPITATION -! OBSERVATION INTO TIME STEPS, AND FEED IT INTO THE SOIL. -! PROGRAM HISTORY LOG: -! -! 2005/03/30 LIN - BAREBONES PRECIPITATION PARTITION/FEEDING TO GROUND -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM -!$$$ -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- - INTEGER,INTENT(IN) :: NPHS, NTSD - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, & - & IMS,IME,JMS,JME,KMS,KME, & - & ITS,ITE,JTS,JTE,KTS,KTE - REAL,INTENT(IN) :: DT - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: PREC - REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: DDATA, LSPA - REAL,DIMENSION(IMS:IME,JMS:JME,3),INTENT(OUT) :: PPTDAT -!----------------------------------------------------------------------- -!*** -!*** LOCAL VARIABLES -!*** -!----------------------------------------------------------------------- - REAL :: DTPHS, FRACT, FRACT1, FRACT2, TIMES, TPHS1, TPHS2 - INTEGER :: I, J, IHR, IHR1, IHR2, NTSP - INTEGER :: MYPE - CHARACTER*256 :: MESSAGE -! -! Get the value of MYPE: -! - CALL WRF_GET_MYPROC(MYPE) -! - TIMES=NTSD*DT - IHR=INT(TIMES)/3600+1 -! Size of physics time step: - DTPHS=NPHS*DT -! -! Compute the beginning and ending time of the current physics time step, -! TPHS1 and TPHS2: -! - NTSP=NTSD/NPHS+1 - TPHS1=(NTSP-1)*DTPHS - TPHS2=NTSP*DTPHS -! - IHR1=INT(TPHS1)/3600+1 - IHR2=INT(TPHS2)/3600+1 -! -! Fraction of an hour that falls into IHR1 and IHR2. Note that IHR1 and IHR2 -! might be identical. - IF (IHR1 > 3) THEN - GO TO 200 - ELSEIF (IHR2 > 3) THEN - IHR2=3 - FRACT1=(3600.- MOD(INT(TPHS1),3600))/3600. - FRACT2=0. - ELSEIF (IHR1 .EQ. IHR2) THEN - FRACT1=0.5*DTPHS/3600. - FRACT2=FRACT1 - ELSE - FRACT1=(3600.- MOD(INT(TPHS1),3600))/3600. - FRACT2=FLOAT(MOD(INT(TPHS2),3600))/3600. - ENDIF -! - FRACT=FRACT1 + FRACT2 -! - IF (MYPE==TESTPE) THEN - WRITE(MESSAGE,1010) NTSD,NTSP,TIMES,IHR1,IHR2,TPHS1,TPHS2, & - & FRACT1,FRACT2 - 1010 FORMAT('ADJPPT: NTSD,NTSP,TIMES=',I4,1X,I4,1X,F6.0,' IHR1,IHR2=' & - & ,I1,1X,I1,' TPHS1,TPHS2=',F6.0,1X,F6.0,' FRACT1,FRACT2=' & - & ,2(1X,F6.4)) - CALL WRF_MESSAGE(MESSAGE) - ENDIF -! -!----------------------------------------------------------------------- -! FRACT1/2 IS THE FRACTION OF IHR1/2'S PRECIP THAT WE WANT FOR -! THIS ADJUSTMENT (assuming that the physics time step spans over -! IHR1 and IHR2. If not, then IHR1=IHR2). -!----------------------------------------------------------------------- -! SET UP OBSERVED PRECIP FOR THIS TIMESTEP IN DDATA -!----------------------------------------------------------------------- - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 -! Note sometimes IHR1=IHR2. - IF (PPTDAT(I,J,IHR1).GT.900..OR.PPTDAT(I,J,IHR2).GT.900.) THEN - DDATA(I,J) = 999. - LSPA(I,J) = LSPA(I,J) + PREC(I,J) - GO TO 100 - ELSE - IF (IHR2 .LE. 3) then - DDATA(I,J) = PPTDAT(I,J,IHR1)*FRACT1 & - & + PPTDAT(I,J,IHR2)*FRACT2 - ELSE - DDATA(I,J) = PPTDAT(I,J,IHR1)*FRACT1 - ENDIF -! - LSPA(I,J) = LSPA(I,J) + DDATA(I,J) - ENDIF - IF (I.EQ.ITEST .AND. J.EQ.JTEST .AND. MYPE.EQ.TESTPE) THEN - WRITE(MESSAGE,1020) DDATA(I,J), PREC(I,J), LSPA(I,J) - 1020 FORMAT('ADJPPT: DDATA=',E12.6, ' PREC=',E12.6,' LSPA=',E12.6) - CALL WRF_MESSAGE(MESSAGE) - ENDIF -! - 100 CONTINUE - ENDDO - ENDDO -! - 200 CONTINUE - - RETURN - END SUBROUTINE ADJPPT -END MODULE module_PRECIP_ADJUST diff --git a/dyn_nmm/module_SMOOTH_TERRAIN.F b/dyn_nmm/module_SMOOTH_TERRAIN.F deleted file mode 100644 index 8977bcc2db..0000000000 --- a/dyn_nmm/module_SMOOTH_TERRAIN.F +++ /dev/null @@ -1,401 +0,0 @@ -module module_SMOOTH_TERRAIN -#if (NMM_NEST == 1) -contains - subroutine smooth_terrain(grid,lines,nsmud, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - - ! Parallelized smoothing routine for NMM domain terrain heights. - ! Also supports serial setups. - ! - ! Author: Sam Trahan, September 2011 - - ! This is a replacement for, and based on, SMDHLD, which can be - ! found lower down in this module. This smooths boundaries of the - ! grid%HRES_AVC. - - ! Two grid%variables are used: HRES_LND (land mask) and HRES_AVC. - ! Those are initialized in NEST_TERRAIN and module_TERRAIN's - ! terrain_for. This routine is not sensitive to the units of - ! HRES_AVC, so it could potentially be called on HRES_FIS instead. - - USE MODULE_DOMAIN, ONLY : DOMAIN, GET_IJK_FROM_GRID -#ifdef DM_PARALLEL - USE MODULE_COMM_DM, ONLY: HALO_NMM_TERRAIN_SMOOTH_sub - USE MODULE_DM, ONLY: ntasks_x, ntasks_y, mytask, ntasks, local_communicator -#endif - - implicit none - - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: IPS,IPE,JPS,JPE,KPS,KPE - integer, intent(in) :: lines,nsmud - character(len=256) :: message - type(domain) :: grid - integer :: i,j,k,jmelin,ibas,buf - - integer :: im,jm - integer :: ihl,ihh,ks,m2l,imid,jmid,itgt,jtgt - real :: hbms(ips:ipe,jps:jpe) - - integer :: ihw((jps-2):(jpe+2)),ihe((jps-2):(jpe+2)) - real :: hse((ips-1):(ipe+1),(jps-1):(jpe+1)) - real :: hne((ips-1):(ipe+1),(jps-1):(jpe+1)) - !----------------------------------------------------------------------- - - im=ide-1 - jm=jde-1 - imid=(ips+ipe)/2 - jmid=(jps+jpe)/2 - - itgt=1 - jtgt=143 - buf=1 - - !----------------------------------------------------------------------- - do j=max(1,jps-2),min(jm,jpe+2) - ihw(j)=-mod(j,2) - ihe(j)=ihw(j)+1 - enddo - !----------------------------------------------------------------------- - - do j=jps,jpe - do i=ips,ipe - hbms(i,j)=grid%hres_lnd(i,j) - enddo - enddo - ! - jmelin=jm-lines+1 - ibas=lines/2 - m2l=mod(lines,2) - ! - do j=max(jps,lines),min(jpe,jmelin) - ihl=ibas+mod(j,2)+m2l*mod(j+1,2) - ihh=im-ibas-m2l*mod(j+1,2) - - ! - do i=max(ihl,ips),min(ihh,ipe) - hbms(i,j)=0. - enddo - enddo - - !----------------------------------------------------------------------- - smooth_loop: do ks=1,nsmud - -#ifdef DM_PARALLEL -# include "HALO_NMM_TERRAIN_SMOOTH.inc" -#endif - do j=max(jps-1,1),min(jpe+1,jm-1) - do i=max(ips-1,1),min(ipe+1,im-1) - hne(i,j)=grid%hres_avc(i+ihe(j),j+1)-grid%hres_avc(i,j) - enddo - enddo - do j=max(jps-1,2),min(jpe+1,jm) - do i=max(ips-1,1),min(ipe+1,im-1) - hse(i,j)=grid%hres_avc(i+ihe(j),j-1)-grid%hres_avc(i,j) - enddo - enddo - ! - do j=max(jps,2),min(jpe,jm-1) - do i=max(ips,1+mod(j,2)),min(ipe,im-1) - grid%hres_avc(i,j)=(hne(i,j)-hne(i+ihw(j),j-1) & - & +hse(i,j)-hse(i+ihw(j),j+1))*hbms(i,j)*0.125+grid%hres_avc(i,j) - enddo - enddo - - !-------------------------------------------------------------------- - - ! smooth around boundary somehow? - ! special treatment for four corners - - wbound: if(1>=ips .and. 1<=ipe) then - if(1>=jps .and. 1<=jpe) then - if (hbms(1,1) .eq. 1) then - grid%hres_avc(1,1)=0.75*grid%hres_avc(1,1)+0.125*grid%hres_avc(1+ihe(1),2)+ & - 0.0625*(grid%hres_avc(2,1)+grid%hres_avc(1,3)) - endif - endif - if(jm>=jps .and. jm<=jpe) then - if (hbms(1,jm) .eq. 1) then - grid%hres_avc(1,jm)=0.75*grid%hres_avc(1,jm)+0.125*grid%hres_avc(1+ihe(jm),jm-1)+ & - 0.0625*(grid%hres_avc(2,jm)+grid%hres_avc(1,jm-2)) - endif - endif - endif wbound - ebound: if(im>=ips .and. im<=ipe) then - if(1>=jps .and. 1<=jpe) then - if (hbms(im,1) .eq. 1) then - grid%hres_avc(im,1)=0.75*grid%hres_avc(im,1)+0.125*grid%hres_avc(im+ihw(1),2)+ & - 0.0625*(grid%hres_avc(im-1,1)+grid%hres_avc(im,3)) - endif - endif - if(jm>=jps .and. jm<=jpe) then - if (hbms(im,jm) .eq. 1) then - grid%hres_avc(im,jm)=0.75*grid%hres_avc(im,jm)+0.125*grid%hres_avc(im+ihw(jm),jm-1)+ & - 0.0625*(grid%hres_avc(im-1,jm)+grid%hres_avc(im,jm-2)) - endif - endif - endif ebound - -#ifdef DM_PARALLEL -# include "HALO_NMM_TERRAIN_SMOOTH.inc" -#endif - - ! S bound - if(1>=jps .and. 1<=jpe) then - J=1 - do I=max(ips,2),min(ipe,im-1) - if (hbms(I,J) .eq. 1) then - hne(i,j)=0.125*(grid%hres_avc(I+ihw(J),J+1)+grid%hres_avc(I+ihe(J),J+1)) - endif - enddo - do I=max(ips,2),min(ipe,im-1) - if (hbms(I,J) .eq. 1) then - grid%hres_avc(I,J)=0.75*grid%hres_avc(I,J)+hne(i,j) - endif - enddo - endif - - ! N bound - if(jm>=jps .and. jm<=jpe) then - J=JM - do I=max(ips,2),min(ipe,im-1) - if (hbms(I,J) .eq. 1) then - grid%hres_avc(I,J)=0.75*grid%hres_avc(I,J)+0.125*(grid%hres_avc(I+ihw(J),J-1)+grid%hres_avc(I+ihe(J),J-1)) - endif - enddo - do I=max(ips,2),min(ipe,im-1) - if (hbms(I,J) .eq. 1) then - hne(i,j)=0.125*(grid%hres_avc(I+ihw(J),J-1)+grid%hres_avc(I+ihe(J),J-1)) - endif - enddo - endif - - ! W bound - if(1>=ips .and. 1<=ipe) then - I=1 - do J=max(jps,3),min(jpe,jm-2) - if (hbms(I,J) .eq. 1) then - hne(i,j)=0.125*(grid%hres_avc(I+ihe(J),J+1)+grid%hres_avc(I+ihe(J),J-1)) - endif - enddo - do J=max(jps,3),min(jpe,jm-2) - if (hbms(I,J) .eq. 1) then - grid%hres_avc(I,J)=0.75*grid%hres_avc(I,J)+hne(i,j) - endif - enddo - endif - - ! E bound - if(im>=ips .and. im<=ipe) then - I=IM - do J=max(jps,3),min(jpe,jm-2) - if (hbms(I,J) .eq. 1) then - hne(i,j)=0.125*(grid%hres_avc(I+ihw(J),J+1)+grid%hres_avc(I+ihw(J),J-1)) - endif - enddo - do J=max(jps,3),min(jpe,jm-2) - if (hbms(I,J) .eq. 1) then - grid%hres_avc(I,J)=0.75*grid%hres_avc(I,J)+hne(i,j) - endif - enddo - endif - - enddo smooth_loop - -#ifdef DM_PARALLEL -# include "HALO_NMM_TERRAIN_SMOOTH.inc" -#endif - - !-------------4-point averaging of mountains along inner boundary------- - - if(2>=jps .and. 2<=jpe) then - do i=max(ips,1),min(ipe,im-1) - grid%hres_avc(i,2)=0.25*(grid%hres_avc(i,1)+grid%hres_avc(i+1,1)+ & - & grid%hres_avc(i,3)+grid%hres_avc(i+1,3)) - enddo - endif - - if(jm-1>=jps .and. jm-1<=jpe) then - do i=max(ips,1),min(ipe,im-1) - grid%hres_avc(i,jm-1)=0.25*(grid%hres_avc(i,jm-2)+grid%hres_avc(i+1,jm-2)+ & - & grid%hres_avc(i,jm)+grid%hres_avc(i+1,jm)) - enddo - endif - -#ifdef DM_PARALLEL -# include "HALO_NMM_TERRAIN_SMOOTH.inc" -#endif - if(2>=ips .and. 2<=ipe) then - do j=4,jm-3,2 - if(j>=jps .and. j<=jpe) then - grid%hres_avc(1,j)=0.25*(grid%hres_avc(1,j-1)+ & - grid%hres_avc(2,j-1)+grid%hres_avc(1,j+1)+ & - grid%hres_avc(2,j+1)) - endif - enddo - endif - - if(im-1>=ips .and. im-1<=ipe) then - do j=4,jm-3,2 - if(j>=jps .and. j<=jpe) then - grid%hres_avc(im-1,j)=0.25*(grid%hres_avc(im-1,j-1)+ & - grid%hres_avc(im,j-1)+grid%hres_avc(im-1,j+1)+ & - grid%hres_avc(im,j+1)) - endif - enddo - endif - end subroutine smooth_terrain - - ! --------------------------------------------------------------------- - - - ! --------------------------------------------------------------------- - - - subroutine smdhld(ids,ide,jds,jde,h,s1,lines,nsmud) - ! This is the old serial smoothing routine from NMM_NEST_UTILS1.F - character(len=255) :: message - dimension ihw(jde-1),ihe(jde-1) - dimension h(ids:ide,jds:jde),s1(ids:ide,jds:jde) & - & ,hbms(ide-1,jde-1),hne(ide-1,jde-1),hse(ide-1,jde-1) - - jm=jde-1 - im=ide-1 - !----------------------------------------------------------------------- - do j=1,jm - ihw(j)=-mod(j,2) - ihe(j)=ihw(j)+1 - enddo - !----------------------------------------------------------------------- - - do j=1,jm - do i=1,im - hbms(i,j)=s1(i,j) - enddo - enddo - ! - jmelin=jm-lines+1 - ibas=lines/2 - m2l=mod(lines,2) - ! - do j=lines,jmelin - ihl=ibas+mod(j,2)+m2l*mod(j+1,2) - ihh=im-ibas-m2l*mod(j+1,2) - - ! - do i=ihl,ihh - hbms(i,j)=0. - enddo - enddo - - !----------------------------------------------------------------------- - ks_loop: do ks=1,nsmud - - !----------------------------------------------------------------------- - do j=1,jm-1 - do i=1,im-1 - hne(i,j)=h(i+ihe(j),j+1)-h(i,j) - enddo - enddo - do j=2,jm - do i=1,im-1 - hse(i,j)=h(i+ihe(j),j-1)-h(i,j) - enddo - enddo - ! - do j=2,jm-1 - do i=1+mod(j,2),im-1 - h(i,j)=(hne(i,j)-hne(i+ihw(j),j-1) & - & +hse(i,j)-hse(i+ihw(j),j+1))*hbms(i,j)*0.125+h(i,j) - enddo - enddo - - !----------------------------------------------------------------------- - - ! smooth around boundary somehow? - ! special treatment for four corners - - if (hbms(1,1) .eq. 1) then - h(1,1)=0.75*h(1,1)+0.125*h(1+ihe(1),2)+ & - & 0.0625*(h(2,1)+h(1,3)) - endif - - if (hbms(im,1) .eq. 1) then - h(im,1)=0.75*h(im,1)+0.125*h(im+ihw(1),2)+ & - & 0.0625*(h(im-1,1)+h(im,3)) - endif - - if (hbms(1,jm) .eq. 1) then - h(1,jm)=0.75*h(1,jm)+0.125*h(1+ihe(jm),jm-1)+ & - & 0.0625*(h(2,jm)+h(1,jm-2)) - endif - - if (hbms(im,jm) .eq. 1) then - h(im,jm)=0.75*h(im,jm)+0.125*h(im+ihw(jm),jm-1)+ & - & 0.0625*(h(im-1,jm)+h(im,jm-2)) - endif - - ! S bound - - J=1 - do I=2,im-1 - if (hbms(I,J) .eq. 1) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J+1)+h(I+ihe(J),J+1)) - endif - enddo - - ! N bound - - J=JM - do I=2,im-1 - if (hbms(I,J) .eq. 1) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J-1)+h(I+ihe(J),J-1)) - endif - enddo - - ! W bound - - I=1 - do J=3,jm-2 - if (hbms(I,J) .eq. 1) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihe(J),J+1)+h(I+ihe(J),J-1)) - endif - enddo - - ! E bound - - I=IM - do J=3,jm-2 - if (hbms(I,J) .eq. 1) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J+1)+h(I+ihw(J),J-1)) - endif - enddo - - enddo ks_loop - - !-------------4-point averaging of mountains along inner boundary------- - - do i=1,im-1 - h(i,2)=0.25*(h(i,1)+h(i+1,1)+h(i,3)+h(i+1,3)) - enddo - - do i=1,im-1 - h(i,jm-1)=0.25*(h(i,jm-2)+h(i+1,jm-2)+h(i,jm)+h(i+1,jm)) - enddo - - do j=4,jm-3,2 - h(1,j)=0.25*(h(1,j-1)+h(2,j-1)+h(1,j+1)+h(2,j+1)) - enddo - - do j=4,jm-3,2 - h(im-1,j)=0.25*(h(im-1,j-1)+h(im,j-1)+h(im-1,j+1)+h(im,j+1)) - enddo - - !----------------------------------------------------------------------- - return - end subroutine smdhld -#endif -end module module_SMOOTH_TERRAIN diff --git a/dyn_nmm/module_STATS_FOR_MOVE.F b/dyn_nmm/module_STATS_FOR_MOVE.F deleted file mode 100644 index a4c098dd4b..0000000000 --- a/dyn_nmm/module_STATS_FOR_MOVE.F +++ /dev/null @@ -1,1408 +0,0 @@ -module module_stats_for_move - implicit none - private -#if ( NMM_NEST == 1 ) - public :: stats_for_move, vorttrak_init - - ! Tuning parameters for the PDYN-following algorithm: - - ! Maximum, minimum and initial search radii: - real, parameter :: vt5_max_radius=250000.0 - real, parameter :: vt5_min_radius=100000.0 - real, parameter :: vt5_start_radius=vt5_max_radius - - ! How much to increase or decrease search radius after a move or - ! non-move (but it will never exceed the prescribed min/max): - real, parameter :: vt5_move_factor=1.1 - real, parameter :: vt5_nomove_factor=0.8 - -contains - - SUBROUTINE VORTTRAK_INIT(grid,config_flags,init, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - USE MODULE_CONFIGURE, ONLY : grid_config_rec_type - USE MODULE_DOMAIN, ONLY : domain -#if ( HWRF == 1 ) - USE module_tracker, only: ncep_tracker_init -#endif - IMPLICIT NONE - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: ITS,ITE,JTS,JTE,KTS,KTE - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer :: vortex_tracker - character*255 :: message - logical, intent(in) :: init ! True if this is the simulation start - - ! For vortex_tracker==4 option: - integer :: cx,cy ! center x,y - real :: xfar,yfar,far ! distance from center: x,y components and dist^2 - integer :: xshift ! for handling grid staggering - integer :: i,j - -#if ( HWRF == 1 ) - vortex_tracker=grid%vortex_tracker - if(vortex_tracker<1 .or. vortex_tracker>7) then -31 format('Domain ',I0,' has invalid value ',I0,' for vortex_tracker: it must be an integer from 1-7') - write(message,31) grid%id,vortex_tracker - call wrf_error_fatal(message) - endif - - if(grid%swath_mode==1) then - ! Check swath area of interest configuration, correct errors and - ! give meaningful error messages: - if(grid%interest_storms/=0 .and. vortex_tracker/=6 .and. vortex_tracker/=7) then - grid%interest_storms=0 - if(vortex_tracker==2) then - if(grid%interest_kids/=0) then - ! User set up vortex_tracker 2 and is requesting a storm - ! area of interest, and not a kid area of interest. - ! Switch to kid interest and warn them: - grid%interest_kids=1 -39 format('Grid ',I0,' switching from interest_storms to interest_kids due to vortex_tracker==2 (nest following)') - write(message,39) grid%id - call wrf_message(message) - else - ! User set things up correctly: vortex_tracker==2, and - ! it has interest_kids, but they also turned on - ! interest_storms, probably because it is on by - ! default in the registry. Disable interest_storms - ! and warn them in a level 2 debug message: -37 format('Grid ',I0,' using nest area of interest (already enabled) instead of storm area of interest due to vortex_tracker==2 (nest following).') - write(message,37) grid%id - call wrf_debug(2,message) - endif - elseif(grid%interest_self==0) then - ! User requested a tracker other than 2, 6 and 7, but wants - ! a storm area of interest. Not possible. Switch to - ! interest_kids if there are nests, and interest_self - ! otherwise. - if(grid%num_nests<1) then - grid%interest_self=1 - grid%interest_rad_self=grid%interest_rad_storm -38 format('Grid ',I0,' switching from interest_storm to interest_self due to lack of vortex information. You must use vortex tracker 6 or 7 to get a storm area of interest.') - write(message,38) grid%id - call wrf_message(message) - else - grid%interest_kids=1 -35 format('Grid ',I0,' switching from interest_storm to interest_kids due to lack of vortex information, and presence of nests. You must use vortex tracker 6 and 7 to get a storm area of interest.') - write(message,35) grid%id - call wrf_message(message) - endif - endif - endif - endif - - ! Signify that the pdyn smooth and parent smooth are invalid in - ! this domain: - grid%pdyn_parent_age=0 - grid%pdyn_smooth_age=0 - - if(size(grid%pdyn_smooth)>1) then - !write(0,*) 'in start domain, call update_pdyn_mslp for grid ',grid%id - CALL UPDATE_PDYN_MSLP(grid,config_flags, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - - end if - - is_vt45: if(vortex_tracker==4 .or. vortex_tracker==5) then - call wrf_message('in VORTTRAK_INIT for vortex tracker 4 or 5') - if(vortex_tracker==4) then - if(.not.(grid%vt4_pmax<0.0)) then - if(grid%vt4_pmax<100000.0 .or. grid%vt4_pmax>107000) then - write(message,'("vt4_pmax bad: vt4_pmax must be either <0 or within [1e5,1.07e5], but it is ",F15.5,". We recommend -1.")') grid%vt4_pmax - call wrf_error_fatal(message) - endif - endif - endif - - if(vortex_tracker==5) then - if(init) then - grid%vt5searchrad=vt5_start_radius -13011 format("Search radius now ",F0.3,"km for domain ",I0) - !write(message,13011) grid%vt5searchrad/1000.0,grid%id - !call wrf_debug(1,message) - endif - endif - endif is_vt45 - - distsq: if(size(grid%distsq)>1) then - cx=ide/2 - cy=jde/2 - ! Calculate distance of various points from the domain center: - jdo: do j = jts, min(jte,jde) - if(mod(j,2)==1) then - xshift=1. - else - xshift=-1. - endif - do i = its, min(ite,ide) - xfar=(i-cx)*grid%dx_nmm(i,j)*2 - yfar=(j-cy)*grid%dy_nmm - if(mod(cy-j,2) /= 0) then - xfar=xfar + grid%dx_nmm(i,j)*xshift - endif - far = xfar*xfar + yfar*yfar - GRID%distsq(i,j)=far - enddo - enddo jdo - endif distsq -#endif - -#if ( HWRF == 1 ) - if(init .and. (vortex_tracker==6 .or. vortex_tracker==7) ) then - call ncep_tracker_init(grid) - endif -#endif - - END SUBROUTINE VORTTRAK_INIT - -#if ( HWRF == 1 ) - !---------------------------------------------------------------------- - ! - SUBROUTINE UPDATE_PDYN_MSLP(grid,config_flags, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE ) - USE MODULE_CONFIGURE, ONLY : grid_config_rec_type - USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid -#ifdef DM_PARALLEL - USE MODULE_COMM_DM, ONLY : HALO_NMM_TRACK_sub - USE MODULE_DM, ONLY: ntasks_x, ntasks_y, mytask, ntasks, local_communicator -#endif - use module_membrane_mslp - implicit none - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: IPS,IPE,JPS,JPE,KPS,KPE - integer :: i,j - logical bad - - ! Update pdyn, mslp and sqws: - CALL STATS_MAKE_MSLP (grid%PDYN,grid%membrane_MSLP,grid%MSLP,grid%SQWS, & - grid%PINT,grid%T,grid%Q,grid%U,grid%V, & - grid%FIS,grid%PD,grid%SM, & - grid%PDTOP,grid%PT, & - grid%DETA1,grid%DETA2,grid%ETA2, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - - ! Store average of parent pdyn_smooth and my pdyn in pdyn_smooth - ! to send to child for its tracking for vortex tracker 5 - if(size(grid%pdyn_smooth)>1) then - if(grid%id==1) then - ! No parent, so pdyn_smooth==pdyn and pdyn_parent is ignored - !write(0,*) 'no parent (gid=1) so storing pdyn in pdyn_smooth' - do j=max(jds,jps),min(jpe,jde-1) - do i=max(ids,ips),min(ipe,ide-1) - grid%pdyn_smooth(i,j)=grid%pdyn(i,j) - enddo - enddo - else - !write(0,*) 'grid ',grid%id,' storing average of pdyn and pdyn_parent in pdyn_smooth' - do j=max(jds,jps),min(jpe,jde-1) - do i=max(ids,ips),min(ipe,ide-1) - grid%pdyn_smooth(i,j) = & - 0.5*grid%pdyn(i,j) + & - 0.5*grid%pdyn_parent(i,j) - enddo - enddo - endif - - grid%pdyn_smooth_age=max(1,grid%pdyn_smooth_age+1) - else - call wrf_error_fatal('pdyn_smooth not allocated') - endif - -#ifdef DM_PARALLEL -# include "HALO_NMM_TRACK.inc" -#endif - - END SUBROUTINE UPDATE_PDYN_MSLP - -#endif - - !---------------------------------------------------------------------- - ! - SUBROUTINE STATS_FOR_MOVE(grid,config_flags, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, & - ITS,ITE,JTS,JTE,KTS,KTE ) - ! STATS_FOR_MOVE - ! - ! PURPOSE: If it is time to consider the possibility of nest - ! motion, then this routine calculates certain nest motion - ! dynamical fields (PDYN, MSLP, SQWS), locates the vortex in those - ! fields and then decides if the domain needs to be moved to - ! recenter on the vortex. - ! - ! Several vortex tracking methods are implemented, and are - ! chosen using the vortex_tracker namelist parameter: - ! - ! vortex_tracker=1 -- old pre-2012 HWRF method: center on minimum MSLP - ! vortex_tracker=2 -- not a vortex tracker. Instead, it tracks - ! its child domain. This is used in the 9km domain of the 27:9:3 - ! vortex_tracker=3 -- old HWRF-X algorithm. This is a mass-based - ! centroid algorithm. It works well for strong storms. With - ! weaker storms, it can be fooled by other nearby high- or - ! low-pressure systems, or noise in the MSLP field due to - ! explicitly resolved gravity waves near sharp terrain changes. - ! vortex_tracker=4 -- new centroid algorithm. This is similar to - ! option 3, but uses the dynamic pressure PDYN and includes PDYN - ! noise removal. Plus, it only searches within X km of the nest - ! center to avoid other nearby systems. - ! vortex_tracker=5 -- track average of parent and grandparent PDYN - ! vortex_tracker=6 -- simplified version of Tim Marchok's tracker - ! - ! vortex_tracker=7 -- nearly the full storm tracking algorithm - ! from Tim Marchok's tracker. The only part that is missing - ! is the part that gives up when the storm dissipates. That - ! is left out intentionally. - ! - ! HISTORY: - ! 2004? - initial implementation by gopal - ! 2004-2010 - gopal, xuejin, young added vortex tracker changes - ! late 2010 - sam added vortex_tracker variable to switch between trackers - ! late 2010 - sam added a new child tracker (vortex_tracker=2) - ! Nov 08 2011 - sam split implementation into several functions and - ! added the vortex_tracker=4 option - ! Mar 2013 - sam added options 5 & 6 - ! Sep 2013 - sam added option 7 - ! Feb 2014 - sam added hooks for area of interest -#if ( HWRF == 1 ) - USE module_tracker, only: ncep_tracker_center -#endif - USE MODULE_CONFIGURE, ONLY : grid_config_rec_type - USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid - use module_membrane_mslp -#ifdef DM_PARALLEL -# if ( HWRF == 1 ) - USE MODULE_COMM_DM, ONLY : HALO_NMM_VT4_NOISE_sub, HALO_NMM_VT4_MSLP_sub - USE MODULE_DM, ONLY: ntasks_x, ntasks_y, mytask, ntasks, local_communicator -# endif -#endif - IMPLICIT NONE - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer :: i,movefreq - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: IPS,IPE,JPS,JPE,KPS,KPE - integer, intent(in) :: ITS,ITE,JTS,JTE,KTS,KTE - integer :: vortex_tracker,j - character*255 :: message - logical :: skip_nest_motion - - ! KEEP NEST MOTION IN SINK WITH PHYSICS TIME STEPS - -#if ( NMM_NEST == 1 ) -#if ( HWRF == 1 ) - MOVEFREQ=grid%ntrack*grid%nphs - vortex_tracker=grid%vortex_tracker -#else - MOVEFREQ=grid%nphs - vortex_tracker=-1 -#endif - skip_nest_motion=.false. - IF(MOD(grid%NTSD+1,MOVEFREQ)/=0 .or. grid%id==1)THEN -#if ( HWRF == 1 ) - IF(grid%MOVED .and. grid%id/=1) then - grid%NTIME0=grid%NTSD !FOR UPDATING NTIM0 - ENDIF -#endif - grid%MVNEST=.FALSE. - skip_nest_motion=.true. - ENDIF - -#if ( HWRF == 1 ) - if(skip_nest_motion .and. ( grid%pdyn_smooth_age/=0 .or. size(grid%pdyn_smooth)<=1)) then - ! Pdyn_smooth is up to date and it is not yet time to move the - ! nest, so we can return now. - !write(0,*) 'skipping pdyn_smooth in grid ',grid%id - return - else - ! Either we need to move the nest, or the pdyn values are - ! invalid due to nest initialization or recent nest motion, so - ! we cannot return yet. - endif - - ! Update membrane_mslp: - call make_membrane_mslp(grid) - - - ! Update regular mslp: - CALL UPDATE_PDYN_MSLP(grid,config_flags, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - - if(skip_nest_motion) then - ! We get here if we had to update pdyn_smooth, but it is not - ! yet time to move the nest. - return - endif -#endif - - ! HAND OFF CONTROL TO STATS_FOR_MOVE_123 FOR TRACKERS 1, 2 and 3 - oldmove: if(vortex_tracker<4) then - ! PDYN causes noise in the presence of strong vorticity variations, - ! so it is not used by HWRF for nest tracking. - CALL STATS_FOR_MOVE_123 (grid%XLOC_2,grid%YLOC_2 & -#if ( HWRF == 1 ) - ,grid%MSLP & -#else - ,grid%PDYN & -#endif - ,grid%sm & -#if ( HWRF == 1 ) - ,GRID%RESTART,grid%NTIME0 & - ,GRID%MOVED,grid%MVNEST,grid%ntsd,GRID%NPHS,GRID%NTRACK & -#else - ,GRID%MOVED,grid%MVNEST,grid%ntsd,GRID%NPHS & -#endif - ,GRID%VORTEX_TRACKER & - ,IDS,IDE-1,JDS,JDE-1,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE) - RETURN -#if ( HWRF == 1 ) - elseif(vortex_tracker==6 .or. vortex_tracker==7) then - ! Tracker #6 and #7: do whatever the inline NCEP Tracker says - call ncep_tracker_center(grid) - call vt67_move(grid%tracker_ifix,grid%tracker_jfix, & - grid%tracker_gave_up,grid%tracker_havefix, & - grid%xloc_2,grid%yloc_2, grid%id, & - grid%xloc_1,grid%yloc_1, grid%mvnest, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - - ! Update area of interest after storm moves if the storm is an - ! area of interest: - if(grid%interest_storms/=0) then -38 format('grid ',I2,' updating area of interest due to storm motion') - write(message,38) grid%id - call wrf_message(trim(message)) - grid%update_interest=.true. - else -39 format('grid ',I2,' not updating area of interest after storm motion because grid%interest_storms is 0') - write(message,39) grid%id - call wrf_message(trim(message)) - endif - elseif(vortex_tracker==5) then - ! Tracker #5: follow average of grandparent and parent PDYN - call vt5_move(grid%pdyn_parent,grid%distsq,grid%vt5searchrad, & - grid%xloc_2,grid%yloc_2, grid%id, & - grid%xloc_1,grid%yloc_1, grid%mvnest, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - - ! Adjust nest movement search radius for the next timestep - ! based on whether we moved this timestep or not. - if(grid%mvnest) then - grid%vt5searchrad=max(vt5_min_radius,min(vt5_max_radius, & - grid%vt5searchrad*vt5_move_factor)) - else - grid%vt5searchrad=max(vt5_min_radius,min(vt5_max_radius, & - grid%vt5searchrad*vt5_nomove_factor)) - endif -13011 format("Search radius now ",F0.3,"km for domain ",I0) - write(message,13011) grid%vt5searchrad/1000.0,grid%id - call wrf_debug(1,message) - else - ! HANDLE VORTEX TRACKER 4 HERE - - ! (we only get here in HWRF mode) - if(config_flags%vt4_noise_iter<0) then - grid%mslp_noisy=0 - else -# ifdef DM_PARALLEL -# include "HALO_NMM_VT4_MSLP.inc" -# endif - call vt4_noise_detect(grid%mslp,grid%mslp_noisy, & - config_flags%vt4_noise_pmax, & - config_flags%vt4_noise_pmin, & - config_flags%vt4_noise_dpdr, & - grid%dx_nmm,grid%dy_nmm, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - do i=1,config_flags%vt4_noise_iter -# ifdef DM_PARALLEL -# include "HALO_NMM_VT4_NOISE.inc" -# endif - call vt4_noise_iter(grid%mslp_noisy, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - enddo - endif - call vt4_move(grid%mslp,grid%weightout,grid%distsq, & - grid%mslp_noisy, grid%dx_nmm, & - grid%dy_nmm,grid%xloc_2,grid%yloc_2, & - grid%xloc_1,grid%yloc_1,grid%mvnest, & - config_flags%vt4_radius, & - config_flags%vt4_weightexp, & - config_flags%vt4_pmax, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, & - ITS,ITE,JTS,JTE,KTS,KTE) -#endif - endif oldmove -#endif - END SUBROUTINE STATS_FOR_MOVE - - SUBROUTINE vt4_noise_iter(NOISY, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - ! VT4_NOISE_DETECT - ! - ! PURPOSE: Takes in a "NOISY" array, finds all points where - ! NOISY(I,J)/=01, and marks all surrounding points with a 1. - ! With repeated calls, this will produce diamond-shaped - ! areas of 1s around areas that originally had a 1. - ! - ! The first and last row and column are not modified. - ! - ! HISTORY: - ! Nov 08 2011 - written by Sam Trahan - IMPLICIT NONE - integer,dimension(ims:ime,jms:jme), intent(inout) :: noisy - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE - integer :: i,j,iadd - -#if ( HWRF == 1 ) - do j = max(jds+1,jts), min(jte,jde-2) - iadd=mod(j,2)-1 - do i = max(ids+1,its), min(ite,ide-2) - if( noisy(i+1+iadd,j+1)/=0 & - .or. noisy(i+1+iadd,j-1)/=0 & - .or. noisy(i+iadd,j+1)/=0 & - .or. noisy(i+iadd,j-1)/=0) then - noisy(i,j)=1 - endif - enddo - enddo -#endif - END SUBROUTINE vt4_noise_iter - SUBROUTINE vt4_noise_detect(MSLP,NOISY,PMAX,PMIN,DPDR, & - DX_NMM, DY_NMM, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - ! VT4_NOISE_DETECT - ! - ! PURPOSE: Finds "noisy" MSLP values and marks a "1" in the - ! "NOISY" array wherever such noisy values occur. An MSLP - ! value is "noisy" if it meets one of these criteria: - ! - ! MSLP > PMAX - ! MSLP < PMIN - ! |d(MSLP)/d(northwest-southeast)| > DPDR - ! |d(MSLP)/d(southwest-northeast)| > DPDR - ! - ! HISTORY: - ! Nov 08 2011 - written by Sam Trahan - IMPLICIT NONE - real,dimension(ims:ime,jms:jme), intent(in) :: mslp,dx_nmm - real, intent(in) :: dy_nmm,pmax,pmin,dpdr - integer,dimension(ims:ime,jms:jme), intent(out) :: noisy - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE - real :: dp2,dy2,dx2,pdiff,dp2max - integer :: i,j - integer :: iadd - -#ifdef EXPENSIVE_HWRF_DEBUG_STUFF - character*255 :: message - integer :: nprint - - nprint=10 -#endif - -#if ( HWRF == 1 ) - dy2=dy_nmm*dy_nmm*4 - dp2max=dpdr*dpdr - - - do j=jts,min(jte,jde-1) - iadd=mod(j,2)-1 - do i=its,min(ite,ide-1) - noisetype: if(mslp(i,j)>pmax) then -#ifdef EXPENSIVE_HWRF_DEBUG_STUFF - if(nprint>0) then -3088 format('MSLP(',I0,',',I0,') = ',F0.3,' > pmax = ',F0.3) - write(message,3088) i,j,mslp(i,j),pmax - call wrf_message(message) - nprint=nprint-1 - endif -#endif - noisy(i,j)=1 - elseif(mslp(i,j)0) then -3089 format('MSLP(',I0,',',I0,') = ',F0.3,' < pmin = ',F0.3) - write(message,3089) i,j,mslp(i,j),pmin - call wrf_message(message) - nprint=nprint-1 - endif -#endif - noisy(i,j)=1 - else - dx2=dx_nmm(i,j)*dx_nmm(i,j)*4 - - notbdy: if(i>ids .and. ijds .and. jdp2max) then - noisy(i,j)=1 -#ifdef EXPENSIVE_HWRF_DEBUG_STUFF - if(nprint>0) then -3091 format('dpdr(',I0,',',I0,') in NE-SW dir = ',F0.5,' > dpdrmax = ',F0.5) - write(message,3091) i,j,sqrt(dp2),sqrt(dp2max) - call wrf_message(message) - nprint=nprint-1 - endif -#endif - cycle - endif - - ! southeast-northwest direction: - pdiff=mslp(i+1+iadd,j-1)-mslp(i+iadd,j+1) - dp2=pdiff*pdiff/(dx2+dy2) - if(dp2>dp2max) then - noisy(i,j)=1 -#ifdef EXPENSIVE_HWRF_DEBUG_STUFF - if(nprint>0) then -3092 format('dpdr(',I0,',',I0,') in SE-NW dir = ',F0.5,' > dpdrmax = ',F0.5) - write(message,3092) i,j,sqrt(dp2),sqrt(dp2max) - call wrf_message(message) - nprint=nprint-1 - endif -#endif - cycle - endif - endif notbdy - - ! We get here if the point and its surroudings are not - ! "noisy" - noisy(i,j)=0 - endif noisetype - enddo - enddo -#endif - END SUBROUTINE vt4_noise_detect - -#if ( HWRF == 1 ) - SUBROUTINE vt5_move(PDYN,distsq,searchrad,xloc,yloc,gridid,cx,cy,mvnest, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - use module_dm, only: wrf_dm_minval_real - implicit none - real, intent(in) :: PDYN(ims:ime,jms:jme) - real, intent(in) :: distsq(ims:ime,jms:jme) - real, intent(in) :: searchrad - integer, intent(inout) :: xloc,yloc - integer, intent(in) :: cx,cy,gridid - logical, intent(out) :: mvnest - integer :: & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE - - real, parameter :: big_pdyn=999999.9 - integer i,j,iloc,jloc - real pdynloc,xdiff,ydiff,radsq - character*255 message - - if(gridid==1) then ! Do nothing for MOAD - !write(0,*) 'Grid 1 (MOAD): skipping vt5_move' - mvnest=.false. - xloc=cx - yloc=cy - return - endif - -201 format("Search for minimum PDYN (<",F10.2,") within searchrad=",F0.3,"km of domain center cx=",I0," cy=",I0) - !write(message,201) big_pdyn,searchrad/1000.0,cx,cy - - radsq=searchrad*searchrad - iloc=-1 - jloc=-1 - pdynloc=big_pdyn - do j=jts,min(jde-1,jte) - do i=its,min(ide-1,ite) - if(distsq(i,j)PMAX are ignored, - ! where PMAX is either the maximum pressure in the non-noisy MSLP - ! if SEARCHPMAX<0, or SEARCHPMAX if SEARCHPMAX>=0. - ! - ! The center is found using a weighted average of point I and J - ! locations for all points that survive the above conditions. - ! - ! HISTORY: - ! Nov 08 2011 - written by Sam Trahan - -#if defined(DM_PARALLEL) && !defined(STUBMPI) - USE module_dm, only: wrf_dm_maxval_real, wrf_dm_sum_real, & - local_communicator_y, local_communicator_x - IMPLICIT NONE - INCLUDE 'mpif.h' -#else - IMPLICIT NONE -#endif - character*512 :: message - integer, intent(out) :: xloc,yloc - integer, intent(in) :: cx,cy - real,dimension(ims:ime,jms:jme), intent(in) :: mslp,distsq,dx_nmm - real, intent(in) :: dy_nmm,searchrad,searchpow,searchpmax - real,dimension(ims:ime,jms:jme), intent(out) :: weightout - integer,dimension(ims:ime,jms:jme), intent(inout) :: noisy - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, & - ITS,ITE,JTS,JTE,KTS,KTE - logical, intent(out) :: mvnest - real :: pmax,sr2,weight,xsum,ysum,xwsum,ywsum - real :: centroid_x, centroid_y, xdiff, ydiff - real :: xweight,yweight,maxweight - integer :: i,j,idum,jdum,ierr,ctx,cty - integer :: xcount(jps:jpe),ycount(ips:ipe) - integer :: myxcount(jps:jpe),myycount(ips:ipe) - - - ! NOTE: cx and cy MUST match the domain center used in - ! direction_of_move2 in mediation_nest_move.F - - if(searchradjde-11) then - noisy(its:ite,j)=3 - else - do i=its,min(ite,ide-1) - if(iide-8) then - noisy(i,j)=3 - elseif(distsq(i,j)>sr2 .and. noisy(i,j)/=1) then - noisy(i,j)=2 - endif - enddo - endif - enddo - - ! Get the number of points in the X and Y directions along each - ! row and column. - myxcount=0 - myycount=0 - do j=jps,min(jpe,jde-1) - do i=ips,min(ipe,ide-1) - if(noisy(i,j)==0) then - myxcount(j)=myxcount(j)+1 - endif - enddo - enddo - do j=jps,min(jpe,jde-1) - do i=ips,min(ipe,ide-1) - if(noisy(i,j)==0) then - myycount(i)=myycount(i)+1 - endif - enddo - enddo -#ifdef DM_PARALLEL - call MPI_Allreduce(myxcount,xcount,jpe-jps+1,MPI_INTEGER,MPI_SUM,local_communicator_x,ierr) - call MPI_Allreduce(myycount,ycount,ipe-ips+1,MPI_INTEGER,MPI_SUM,local_communicator_y,ierr) -#else - xcount=myxcount - ycount=myycount -#endif -#ifdef EXPENSIVE_HWRF_DEBUG_STUFF - do j=jps,min(jpe,jde-1) - write(message,'("xcount(",I0,") = ",I0)') j,xcount(j) - call wrf_debug(5,message) - enddo - do i=ips,min(ipe,ide-1) - write(message,'("ycount(",I0,") = ",I0)') i,ycount(i) - call wrf_debug(5,message) - enddo -#endif - - ! Find maximum pressure if requested - findpmax: if(searchpmax<0.0) then - pmax=-9e9 - do j = max(jds+2,jts), min(jte,jde-3) - do i = max(ids+1,its), min(ite,ide-2) - if(noisy(i,j)==0 .and. mslp(i,j)>pmax) then - pmax=mslp(i,j) - endif - enddo - enddo - - idum=-99 ; jdum=-99 ! to keep debug modes happy - call wrf_dm_maxval_real(pmax,idum,jdum) - pmax=min(105000.0,pmax) - else - pmax=searchpmax - endif findpmax - ! Find vortex location. - - xsum=0.0 ; ysum=0.0 ; xwsum=0.0 ; ywsum=0.0 - maxweight=-99. - - if_pow_1: if(abs(searchpow-1.0)<1e-5) then - ! Special copy of loop for exponent of 1, for efficiency - !call wrf_debug(10,'got into pow=1 loop') - do j = max(jds+2,jts), min(jte,jde-3) - do i = max(ids+1,its), min(ite,ide-2) - if(noisy(i,j)==0) then - weight = pmax - mslp(i,j) - if(weight>0) then - if(weight>maxweight) maxweight=weight - weight=weight/pmax - weightout(i,j)=weight - xweight=weight/ycount(i) - yweight=weight/xcount(j) - xsum=xsum + i*xweight - ysum=ysum + j*yweight - xwsum=xwsum + xweight - ywsum=ywsum + yweight - else - weightout(i,j)=0 - end if - else - weightout(i,j)=0 - endif - enddo - enddo - else - if_sqrt: if(abs(searchpow-0.5)<1e-5) then - !call wrf_debug(10,'got into pow=0.5 loop') - do j = max(jds+2,jts), min(jte,jde-3) - do i = max(ids+1,its), min(ite,ide-2) - if(noisy(i,j)==0) then - weight = pmax - mslp(i,j) - if(weight>0) then - if(weight>maxweight) maxweight=weight - weight=sqrt(weight/pmax) - weightout(i,j)=weight - xweight=weight/ycount(i) - yweight=weight/xcount(j) - xsum=xsum + i*xweight - ysum=ysum + j*yweight - xwsum=xwsum + xweight - ywsum=ywsum + yweight - else - weightout(i,j)=0 - end if - else - weightout(i,j)=0 - endif - enddo - enddo - else - ! General loop for exponents other than 1: - do j = max(jds+2,jts), min(jte,jde-3) - do i = max(ids+1,its), min(ite,ide-2) - if(noisy(i,j)==0) then - weight = pmax - mslp(i,j) - if(weight>0) then - if(weight>maxweight) maxweight=weight - weight=(weight/pmax)**searchpow - weightout(i,j)=weight - xweight=weight/ycount(i) - yweight=weight/xcount(j) - xsum=xsum + i*xweight - ysum=ysum + j*yweight - xwsum=xwsum + xweight - ywsum=ywsum + yweight - else - weightout(i,j)=0 - end if - else - weightout(i,j)=0 - endif - enddo - enddo - endif if_sqrt - endif if_pow_1 - - if(maxweight<=0) then - !call wrf_debug(1,'No valid points found in this tile.') - else - !write(message,'("Max weight was ",F0.3)') maxweight - !call wrf_debug(1,message) - endif - - xwsum = wrf_dm_sum_real(xwsum) - - no_vortex: if(xwsum <= 0) then - ! All pressures are >= pmax so disable move by - ! specifying the vortex center at the domain center. - centroid_x=cx - centroid_y=cy - - write(message,*) 'Lost the storm. Search rad,pmax,pow = ', & - searchrad,pmax,searchpow - call wrf_message(message) - mvnest=.false. - return - else - ywsum = wrf_dm_sum_real(ywsum) - xsum = wrf_dm_sum_real(xsum) - ysum = wrf_dm_sum_real(ysum) - centroid_x = xsum/xwsum - centroid_y = ysum/ywsum - - 383 format("XSUM=",F0.3," YSUM=",F0.3," XWSUM=",F0.3," YWSUM=",F0.3, & - " Center=(",I0,",",I0,")", & - " Centroid=(",F0.3,",",F0.3,")") - write(message,383) xsum,ysum,xwsum,ywsum,cx,cy,centroid_x,centroid_y - call wrf_message(message) - endif no_vortex - - ! Place a plus at the centroid in the "noisy" array - ctx=nint(centroid_x) - cty=nint(centroid_y) - do j=cty-1,cty+1 - do i=ctx-4,ctx+4 - if(i>=its .and. i<=ite .and. j>=jts .and. j<=jte) then - noisy(i,j)=noisy(i,j)-6 - endif - enddo - enddo - do j=cty-4,cty+4 - do i=ctx-1,ctx+1 - if(i>=its .and. i<=ite .and. j>=jts .and. j<=jte) then - noisy(i,j)=noisy(i,j)-6 - endif - enddo - enddo - - xdiff=abs(centroid_x-real(cx))/3.0 - ydiff=abs(centroid_y-real(cy))/6.0 - if(xdiff>=1. .or. ydiff>=1.) then - ! We have moved >1 parent gridpoints in X or >2 parent - ! gridpoints in Y, so trigger a nest move: - mvnest=.true. - xloc=nint(centroid_x) - yloc=nint(centroid_y) - call wrf_debug(1,'Centroid is far enough from nest center to trigger a move.') - else - mvnest=.false. - xloc=cx - yloc=cy - call wrf_debug(1,'Nest has not moved far enough yet.') - endif - END SUBROUTINE vt4_move -#endif - - SUBROUTINE STATS_MAKE_MSLP(PDYN,MEMBRANE_MSLP,MSLP,SQWS & - ,PINT,T,Q,U,V & - ,FIS,PD,SM,PDTOP,PTOP & - ,DETA1,DETA2,ETA2 & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE) - ! STATS_MAKE_MSLP - ! - ! PURPOSE: Calculates the PDYN, MSLP and SQWS fields needed - ! by the vortex trackers. This code was taken from the old - ! STATS_FOR_MOVE routine. - ! - ! HISTORY: - ! 2004? : written by gopal - ! 2004-2011 : various modifications by gopal, xuejin, young, sam - ! Nov 08 2011: moved code into a seperate STATS_MAKE_MSLP routine - - USE MODULE_MODEL_CONSTANTS - IMPLICIT NONE - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE - - REAL, DIMENSION(KMS:KME), INTENT(IN) :: DETA1,DETA2,ETA2 - REAL, INTENT(IN) :: PDTOP,PTOP - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD,SM - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q,U,V - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: PDYN,MSLP,SQWS - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: MEMBRANE_MSLP - - INTEGER :: ITF,JTF, i,j,k - REAL :: DZ,RTOPP,APELP,A,TSFC - - REAL, PARAMETER :: LAPSR=6.5E-3, GI=1./G,D608=0.608 - REAL, PARAMETER :: COEF3=287.05*GI*LAPSR, COEF2=-1./COEF3 - REAL, PARAMETER :: TRG=2.0*R_D*GI,LAPSI=1.0/LAPSR - - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME) :: Z - - REAL :: densum,presum,density,pdyntemp,vpres - - ITF=MIN(ITE,IDE-1) - JTF=MIN(JTE,JDE-1) - - ! DETERMINE THE HEIGHTS ON THE PARENT DOMAIN - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - Z(I,J,1)=FIS(I,J)*GI - ENDDO - ENDDO - ! - !write(0,*) 'kde=',kde,' kte=',kte - DO K = KTS,min(kde-1,KTE) - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - APELP = (PINT(I,J,K+1)+PINT(I,J,K)) - RTOPP = TRG*T(I,J,K)*(1.0+Q(I,J,K)*P608)/APELP - DZ = RTOPP*(DETA1(K)*PDTOP+DETA2(K)*PD(I,J)) - Z(I,J,K+1) = Z(I,J,K) + DZ - ENDDO - ENDDO - ENDDO - - ! DETERMINE THE MEAN SEA LEVEL PRESSURE, THE VERTICALLY AVERAGED WIND - ! SPEED AT ABOUT LEVELS 9 10 AND 11 AND THE DYNAMIC PRESSURES DEFINED - ! FROM BASIC BERNOULLI's THEOREM - - DO J = JTS, MIN(JTE,JDE-1) - DO I = ITS, MIN(ITE,IDE-1) - TSFC = T(I,J,1)*(1.+D608*Q(I,J,1)) + LAPSR*(Z(I,J,1)+Z(I,J,2))*0.5 - A = LAPSR*Z(I,J,1)/TSFC - MSLP(I,J) = PINT(I,J,1)*(1-A)**COEF2 - - SQWS(I,J) = (U(I,J,9)*U(I,J,9) + V(I,J,9)*V(I,J,9) & - + U(I,J,10)*U(I,J,10) + V(I,J,10)*V(I,J,10) & - + U(I,J,11)*U(I,J,11) + V(I,J,11)*V(I,J,11))/3.0 - - PDYN(I,J) = 1.1*SQWS(I,J)/2.0 + MEMBRANE_MSLP(I,J) - ENDDO - ENDDO - - END SUBROUTINE STATS_MAKE_MSLP - - !---------------------------------------------------------------------- - ! - SUBROUTINE STATS_FOR_MOVE_123 (XLOC,YLOC,PRES,SM & -#if ( HWRF == 1 ) - ,RESTART,NTIME0 & ! zhang's doing - ,MOVED,MVNEST,NTSD,NPHS,CFREQ & ! CFREQ*DT*NPHS=540s -#else - ,MOVED,MVNEST,NTSD,NPHS & -#endif - ,vortex_tracker & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE ) - - !********************************************************************** - !$$$ SUBPROGRAM DOCUMENTATION BLOCK - ! . . . - ! SUBPROGRAM: STATS_FOR_MOVE_123 - ! PRGRMMR: gopal - ! - ! ABSTRACT: - ! THIS ROUTINE COMPUTES SOME STATS REQUIRED FOR AUTOMATIC GRID MOTION - ! THERE ARE THREE DIFFERENT MODES: - ! vortex_tracker=1 -- follow vortex using pre-2012 HWRF algorithm - ! vortex_tracker=2 -- follow child - ! vortex_tracker=3 -- follow vortex using HWRF-X algorithm - ! NOTE: This routine does not handle vortex_tracker==4. The - ! stats_for_move routine handles that vortex tracker. - ! PROGRAM HISTORY LOG: - ! (inbetween) : gopal, xuejin, young added vortex tracker changes - ! late 2010 : sam added vortex_tracker variable to switch between trackers - ! late 2010 : sam added a new child tracker (vortex_tracker=2) - ! 11-08-2011 : renamed to stats_for_move_123, and moved all PRES - ! calculation stuff to another routine. - ! - ! USAGE: CALL STATS_FOR_MOVE FROM SUBROUTINE SOLVE_RUNSTREAM FOR NESTED DOMAIN ONLY - ! - ! ATTRIBUTES: - ! LANGUAGE: FORTRAN 90 - ! MACHINE : IBM SP - !$$$ - !********************************************************************** - - USE MODULE_MODEL_CONSTANTS - USE MODULE_DM - USE MODULE_WRF_ERROR - - IMPLICIT NONE - ! - LOGICAL,INTENT(INOUT) :: MVNEST ! NMM SWITCH FOR GRID MOTION - LOGICAL,INTENT(IN) :: MOVED - INTEGER,INTENT(IN) :: vortex_tracker - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE & -#if ( HWRF == 1 ) - ,NTSD,NPHS,CFREQ -#else - ,NTSD,NPHS -#endif - ! - INTEGER, INTENT(OUT) :: XLOC,YLOC - INTEGER :: NXLOC,NYLOC - REAL :: NSUM1,NSUM2,NSUM3 - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: SM,PRES - - ! - ! LOCAL - - character*256 :: message -#if ( HWRF == 1 ) - !zhang's doing - INTEGER,INTENT(INOUT) :: NTIME0 - LOGICAL,INTENT(IN) :: RESTART - REAL :: far,weight,sr2,pmax,xfar,yfar,xshift,yshift - integer :: cx,cy -#else - INTEGER,SAVE :: NTIME0 -#endif - INTEGER :: IM,JM,IP,JP - INTEGER :: I,K,J,XR,YR,DTMOVE,IDUM,JDUM,ITF,JTF - REAL :: STMP0,STMP1 - REAL :: SMSUM,SMOUT,XDIFF,YDIFF,PCUT,PGR - REAL :: MINGBL_PRES,MAXGBL_PRES,MAXGBL_SQWS - REAL :: MINGBL_MIJ - REAL, DIMENSION(IMS:IME,JMS:JME) :: MIJ - - ! Bug in the original code that is intentionally preserved: - ! IDE is already IDE-1, but the code subtracts 1 again and - ! uses ITF - ITF=min(ITE,IDE-1) - JTF=min(JTE,JDE-1) - - ! FILTER OUT PRES AND STORE THAT IN MIJ. THE MAXIMUM VALUE OF - ! MIJ GIVES THE STORM CENTER ALSO DO THAT WITHIN A SUB DOMAIN - MAXGBL_PRES=MAXVAL(PRES(ITS:ITF,JTS:JTF)) - CALL WRF_DM_MAXVAL(MAXGBL_PRES,IDUM,JDUM) - MINGBL_PRES=MINVAL(PRES(ITS:ITF,JTS:JTF)) - CALL WRF_DM_MINVAL(MINGBL_PRES,IDUM,JDUM) - PCUT = 0.5*(MAXGBL_PRES + MINGBL_PRES) - ! - IM=IDE/2 - IDE/6 - IP=IDE/2 + IDE/6 - JM=JDE/2 - JDE/4 - JP=JDE/2 + JDE/4 - ! - DO J = JTS, MIN(JTE,JDE) - DO I = ITS, MIN(ITE,IDE) - IF(I .GE. IM .AND. I .LE. IP .AND. J .GE. JM .AND. J .LE. JP & - .AND. PCUT .GT. PRES(I,J))THEN - MIJ(I,J) = PRES(I,J) - ELSE - MIJ(I,J) = 105000.0 - ENDIF - ENDDO - ENDDO - - ! BEGIN OLD TRACKER CODE ---------------------------------------------------- - old_tracker_1: if(vortex_tracker == 1) then - ! - ! DETERMINE THE LOCATION OF CENTER OF THE CIRCULATION DEFINED BY MIJ AND FIND THE CORRESPONDING PRES - ! - STMP0=MAXGBL_PRES*100. ! define arbitrary maximum - MINGBL_MIJ=MINVAL(MIJ(ITS:ITF,JTS:JTF)) - DO J = JTS, MIN(JTE,JDE) - DO I = ITS, MIN(ITE,IDE) - IF(MIJ(I,J) .EQ. MINGBL_MIJ)THEN - XLOC=I - YLOC=J - STMP0=PRES(I,J) - ENDIF - ENDDO - ENDDO - - CALL WRF_DM_MINVAL(MINGBL_MIJ,XLOC,YLOC) - CALL WRF_DM_MINVAL(STMP0,IDUM,JDUM) - endif old_tracker_1 - ! END OLD TRACKER CODE ------------------------------------------------------ - - - ! BEGIN HWRF-X TRACKER CODE ------------------------------------------------- - hwrfx_tracker: if(vortex_tracker == 3) then - ! USE CENTROID TO FIND THE CENTER Xuejin's doing - - NSUM1=0.0 - NSUM2=0.0 - NSUM3=0.0 - DO J = JTS, MIN(JTE,JDE) - DO I = ITS, MIN(ITE,IDE) - IF(I .GE. IM .AND. I .LE. IP .AND. J .GE. JM .AND. J .LE. JP )THEN - ! IF(I .EQ. IM .AND. J .EQ. JM)THEN - NSUM1 = NSUM1 + I*(105000.1 - MIJ(I,J)) - NSUM2 = NSUM2 + J*(105000.1 - MIJ(I,J)) - NSUM3 = NSUM3 + (105000.1 - MIJ(I,J)) - ! WRITE(0,*)'TEST',NSUM1,I,J,0.01*(105000.0 - MIJ(I,J)),MIJ(I,J) - ENDIF - ENDDO - ENDDO - NSUM1 = WRF_DM_SUM_REAL(NSUM1) - NSUM2 = WRF_DM_SUM_REAL(NSUM2) - NSUM3 = WRF_DM_SUM_REAL(NSUM3) - NXLOC = NINT(NSUM1/NSUM3) - NYLOC = NINT(NSUM2/NSUM3) - - XLOC = NXLOC - YLOC = NYLOC - - !WRITE(message,*)'NEW CALC',NSUM1,NSUM2,NSUM3 - !call wrf_debug(1,message) - !WRITE(message,*)'XLOC,YLOC',NXLOC,XLOC,NYLOC,YLOC - !call wrf_debug(1,message) - - endif hwrfx_tracker - ! END HWRF-X TRACKER CODE --------------------------------------------------- - - ! BEGIN OLD TRACKER CODE ---------------------------------------------------- - ! DETERMINE THE MAXIMUM MIJ AT ABOUT 18 GRID POINTS AWAY FROM THE STORM CENTER - old_tracker_2: if ( vortex_tracker == 1 ) then - - STMP1=0.0 - DO J = JTS, MIN(JTE,JDE) - DO I = ITS, MIN(ITE,IDE) - IF(I .EQ. XLOC+18)THEN - XR=I - YR=J - STMP1=MIJ(I,J) - ENDIF - ENDDO - ENDDO - - CALL WRF_DM_MAXVAL(STMP1,XR,YR) - - ! - ! DETERMINE IF THE ENTIRE NESTED DOMAIN IS OVER LAND (SM=0) - ! - - SMSUM = 0.0 - DO J = JTS, MIN(JTE,JDE) - DO I = ITS, MIN(ITE,IDE) - SMSUM = SMSUM + SM(I,J) - ENDDO - ENDDO - - SMOUT=WRF_DM_SUM_REAL(SMSUM)/(IDE*JDE) - - ! STOP GRID MOTION. AVOID MOVING TOO RAPID GRID MOTION, SAY SOMETHING LIKE EVERY - ! OTHER TIME STEP OR SO - - PGR=STMP1-STMP0 - endif old_tracker_2 - ! END OLD TRACKER CODE ------------------------------------------------ - - - XDIFF=ABS(XLOC - IDE/2) - YDIFF=ABS(YLOC - JDE/2) -#if ( HWRF == 1 ) - !zhang's doing - IF((.NOT.RESTART .AND. NTSD==0) .OR. MOVED)NTIME0=NTSD -#else - IF(NTSD==0 .OR. MOVED)NTIME0=NTSD -#endif - DTMOVE=NTSD-NTIME0 ! TIME INTERVAL SINCE THE PREVIOUS MOVE - ! - ! DECIDE IF NEST MOTION SHOULD HAPPEN - ! - if(vortex_tracker == 3) then - ! Using HWRF-X tracker. Move if centroid moved. - IF(XDIFF .GE. 1 .OR. YDIFF .GE. 2) THEN - MVNEST=.TRUE. - NTIME0=NTSD - ELSE - ! Centroid has not moved one parent gridpoint yet. - MVNEST=.FALSE. - ENDIF - elseif(vortex_tracker==2) then - ! Tracking child domain. Nest motion check happens in - ! direction_of_move2, but we MUST set mvnest=true here: - MVNEST=.TRUE. - elseif(vortex_tracker==1) then - ! Using old HWRF tracker. Decide if it wants to move. - IF(DTMOVE .LE. 45 .OR. PGR .LE. 200.)THEN - WRITE(message,*)'SUSPEND MOTION: SMALL DTMOVE OR WEAK PGF:','DTMOVE=',DTMOVE,'PGR=',PGR - call wrf_debug(1,message) - MVNEST=.FALSE. ! SET STATIC GRID - ELSE IF(STMP0 .GE. STMP1)THEN - WRITE(message,*)'SUSPEND MOTION: THERE IS NO VORTEX IN THE DOMAIN:','STMP0=',STMP0,'STMP1=',STMP1 - call wrf_debug(1,message) - MVNEST=.FALSE. - ELSE IF(XDIFF .GT. 24 .OR. YDIFF .GT. 24)THEN - WRITE(message,*)'SUSPEND MOTION: LOST VORTEX ','DTMOVE=',DTMOVE,'XDIFF=',XDIFF,'YDIFF=',YDIFF - call wrf_debug(1,message) - MVNEST=.FALSE. - ELSE IF(SMOUT .LE. 0.2 .AND. XDIFF .GT. 12 .AND. YDIFF .GT. 12)THEN - WRITE(message,*)'SUSPEND MOTION: VORTEX LOST OVER LAND ','DTMOVE=',DTMOVE,'XDIFF=',XDIFF,'YDIFF=',YDIFF - call wrf_debug(1,message) - MVNEST=.FALSE. - ELSE IF(SMOUT .LE. 0.2 .AND. PGR .LE. 400.)THEN - WRITE(message,*)'SUSPEND MOTION: VORTEX WEAK OVER LAND ','SMOUT=',SMOUT,'PGR=',PGR - call wrf_debug(1,message) - MVNEST=.FALSE. - ELSE IF(SMOUT .LE. 0.2 .AND. DTMOVE .GE. 1500)THEN - WRITE(message,*)'SUSPEND MOTION: STOP MOTION OVER LAND','SMOUT=',SMOUT,'DTMOVE=',DTMOVE - call wrf_debug(1,message) - MVNEST=.FALSE. - ELSE - MVNEST=.TRUE. - ENDIF - else - ! Not using any valid trackers, so set MVNEST to false. - MVNEST=.false. - endif - - RETURN - - END SUBROUTINE STATS_FOR_MOVE_123 - -! End "if NMM_NEST == 1" -#endif - -END module module_stats_for_move diff --git a/dyn_nmm/module_TERRAIN.F b/dyn_nmm/module_TERRAIN.F deleted file mode 100644 index b92f306f7b..0000000000 --- a/dyn_nmm/module_TERRAIN.F +++ /dev/null @@ -1,285 +0,0 @@ -module module_TERRAIN - private - public :: terrain_for, nmm_terrain - - type nmm_terrain - integer :: nx,ny,level,input_type,io_form - real, pointer, dimension(:,:) :: avc,lnd,lah,loh - logical :: initialized - end type nmm_terrain - - logical, save :: initialized=.false. - integer, parameter :: minlevel=0,maxlevel=20 - - type(nmm_terrain), target, save :: terrain(minlevel:maxlevel) -contains - function terrain_for(level,input_type,io_form) result(tr) - implicit none - type(nmm_terrain), pointer :: tr - character*256 :: message - integer, intent(in) :: level,input_type,io_form - integer i - - if(levelmaxlevel) then -3304 format("INVALID NESTING LEVEL ",I0,": only ",I0," through ",I0," are allowed.") - write(message,3304) level,minlevel,maxlevel - call wrf_error_fatal(message) - endif - - if(.not. initialized) then - call wrf_debug(3,'initialize...') - do i=minlevel,maxlevel - tr=>terrain(i) - tr%nx=0 ; tr%ny=0 - tr%level=i - tr%initialized=.false. - nullify(tr%avc) - nullify(tr%lnd) - nullify(tr%lah) - nullify(tr%loh) - end do - initialized=.true. - call wrf_debug(3,'done with init.') - endif - - call wrf_debug(3,'get terrain for this level') - tr=>terrain(level) - - if(.not. tr%initialized) then - call wrf_debug(1,'terrain_for: need to read terrain') - call read_terrain(tr,input_type,io_form) - endif - - call wrf_debug(3,'check input type and io form') - if(input_type /= tr%input_type) then -3306 format("MISMATCH IN INPUT_TYPE AT LEVEL ",I0,": input_type=",I0," and ",I0," both requested.") - write(message,3306) level,tr%input_type,input_type - call wrf_error_fatal(message) - endif - - if(io_form /= tr%io_form) then -3309 format("MISMATCH IN IO_FORM AT LEVEL ",I0,": io_form=",I0," and ",I0," both reqested.") - write(message,3309) level,tr%io_form,io_form - call wrf_error_fatal(message) - endif - call wrf_debug(1,'terrain_for: returning') - end function terrain_for - - subroutine read_terrain(tr,input_type,io_form) - USE module_domain - USE module_configure - USE module_timing - USE wrfsi_static - - implicit none - - type(nmm_terrain), pointer :: tr - integer, intent(in) :: io_form, input_type - integer, parameter :: IO_BIN=1, IO_NET=2, IO_PNC=11 - CHARACTER(LEN=6) :: nestpath - character(len=128) :: input_fname - integer :: comm_1,comm_2, handle,istatus - integer :: level - character (len=32) :: cname - integer :: ndim - character (len=3) :: memorder - character (len=32) :: stagger - integer, dimension(3) :: domain_start, domain_end - integer :: wrftype,n,i,j - character (len=128), dimension(3) :: dimnames - character*256 :: message - real, allocatable, dimension(:,:,:) :: real_domain - character (len=10), parameter :: name(24) = (/ "XLAT_M ", & - "XLONG_M ", & - "XLAT_V ", & - "XLONG_V ", & - "E ", & - "F ", & - "LANDMASK ", & - "LANDUSEF ", & - "LU_INDEX ", & - "HCNVX ", & - "HSTDV ", & - "HASYW ", & - "HASYS ", & - "HASYSW ", & - "HASYNW ", & - "HLENW ", & - "HLENS ", & - "HLENSW ", & - "HLENNW ", & - "HANIS ", & - "HSLOP ", & - "HANGL ", & - "HZMAX ", & - "HGT_M " /) - - - level=tr%level - write(nestpath,"(a4,i1,a1)") 'nest',level,'/' - - input_types: if (input_type == 1) then - ! - ! si version of the static file - ! - CALL get_wrfsi_static_dims(nestpath,tr%nx,tr%ny) - ALLOCATE (tr%avc(tr%nx,tr%ny)) - ALLOCATE (tr%lnd(tr%nx,tr%ny)) - ALLOCATE (tr%lah(tr%nx,tr%ny)) - ALLOCATE (tr%loh(tr%nx,tr%ny)) - CALL get_wrfsi_static_2d(nestpath, 'avc', tr%avc) - CALL get_wrfsi_static_2d(nestpath, 'lnd', tr%lnd) - CALL get_wrfsi_static_2d(nestpath, 'lah', tr%lah) - CALL get_wrfsi_static_2d(nestpath, 'loh', tr%loh) - - else if (input_type == 2) then - ! - ! WPS version of the static file - ! - call wrf_debug(3,'wps static file') -#ifdef INTIO - if (io_form == IO_BIN) write(input_fname,"(A,I2.2,A)") "geo_nmm_nest.l",level,".int" -#endif -#ifdef NETCDF - if (io_form == IO_PNC) call wrf_message("WARNING: module_TERRAIN.F: pNetCDF specified, but using serial NetCDF to read geo_nmm_nest file") - if (io_form == IO_NET .OR. io_form == IO_PNC) write(input_fname,"(A,I2.2,A)") "geo_nmm_nest.l",level,".nc" -#endif - - comm_1 = 1 - comm_2 = 1 - -#ifdef INTIO - if (io_form == IO_BIN) & - call ext_int_open_for_read(trim(input_fname), comm_1, comm_2, 'sysdep info', handle, istatus) -#endif -#ifdef NETCDF - if (io_form == IO_NET .OR. io_form == IO_PNC ) & - call ext_ncd_open_for_read(trim(input_fname), comm_1, comm_2, 'sysdep info', handle, istatus) -#endif -!idealized KWON if (istatus /= 0) CALL wrf_error_fatal('NEST_TERRAIN error after ext_XXX_open_for_read '//trim(input_fname)) - - - read_loop: do n=1,24 - - cname = name(n) - - domain_start = 1 - domain_end = 1 -#ifdef INTIO - if (io_form == IO_BIN) & - call ext_int_get_var_info(handle, cname, ndim, memorder, stagger, domain_start, domain_end, wrftype, istatus) -#endif -#ifdef NETCDF - if (io_form == IO_NET .OR. io_form == IO_PNC ) & - call ext_ncd_get_var_info(handle, cname, ndim, memorder, stagger, domain_start, domain_end, wrftype, istatus) -#endif - - if (allocated(real_domain)) deallocate(real_domain) - allocate(real_domain(domain_start(1):domain_end(1), domain_start(2):domain_end(2), domain_start(3):domain_end(3))) - -#ifdef INTIO - if (io_form == IO_BIN) then - call ext_int_read_field(handle, '0000-00-00_00:00:00', cname, real_domain, wrftype, & - 1, 1, 0, memorder, stagger, & - dimnames, domain_start, domain_end, domain_start, domain_end, & - domain_start, domain_end, istatus) - end if -#endif -#ifdef NETCDF - if (io_form == IO_NET .OR. io_form == IO_PNC ) then - call ext_ncd_read_field(handle, '0000-00-00_00:00:00', cname, real_domain, wrftype, & - 1, 1, 0, memorder, stagger, & - dimnames, domain_start, domain_end, domain_start, domain_end, & - domain_start, domain_end, istatus) - end if -#endif - - write(message,'("domain nx=",I0," ny=",I0)') domain_end(1),domain_end(2) - tr%nx = domain_end(1) - tr%ny = domain_end(2) - write(message,'("nx=",I0," ny=",I0)') tr%nx,tr%ny - if (cname(1:10) == "XLAT_M ") then - call wrf_debug(10,'tr%lah...') - ALLOCATE (tr%lah(tr%nx,tr%ny)) - call wrf_debug(10,'allocated...') - do j=1,tr%ny - do i=1,tr%nx - tr%lah(i,j) = real_domain(i,j,1) - end do - end do - call wrf_debug(10,'tr%lah.') - else if (cname(1:10) == "XLONG_M ") then - call wrf_debug(10,'tr%loh...') - ALLOCATE (tr%loh(tr%nx,tr%ny)) - call wrf_debug(10,'allocated...') - do j=1,tr%ny - do i=1,tr%nx - tr%loh(i,j) = real_domain(i,j,1) - end do - end do - call wrf_debug(10,'tr%loh.') - else if (cname(1:10) == "LANDMASK ") then - call wrf_debug(10,'tr%lnd...') - ALLOCATE (tr%lnd(tr%nx,tr%ny)) - call wrf_debug(10,'allocated...') - do j=1,tr%ny - do i=1,tr%nx - tr%lnd(i,j) = real_domain(i,j,1) - end do - end do - call wrf_debug(10,'tr%lnd') - else if (cname(1:10) == "HGT_M ") then - call wrf_debug(10,'tr%avc...') - ALLOCATE (tr%avc(tr%nx,tr%ny)) - call wrf_debug(10,'allocated...') - do j=1,tr%ny - do i=1,tr%nx - tr%avc(i,j) = real_domain(i,j,1) - end do - end do - call wrf_debug(10,'tr%avc.') - end if - - end do read_loop - call wrf_debug(10,"past read loop") - if(allocated(real_domain)) deallocate(real_domain) - call wrf_debug(10,'past deallocate') -#ifdef INTIO - if (io_form == IO_BIN) then - call ext_int_ioclose(handle, istatus) - end if -#endif -#ifdef NETCDF - if (io_form == IO_NET .OR. io_form == IO_PNC ) then - call ext_ncd_ioclose(handle, istatus) - end if -#endif - call wrf_debug(10,"past close") - if(.not. associated(tr%lah)) call readfail(tr,input_fname,'lah') - if(.not. associated(tr%loh)) call readfail(tr,input_fname,'loh') - if(.not. associated(tr%lnd)) call readfail(tr,input_fname,'lnd') - if(.not. associated(tr%avc)) call readfail(tr,input_fname,'avc') - - else - CALL wrf_error_fatal('NEST_TERRAIN wrong input_type') - end if input_types - - - tr%input_type=input_type - tr%io_form=io_form - tr%initialized=.true. - call wrf_debug(10,"done in read_terrain") - end subroutine read_terrain - - subroutine readfail(tr,input_fname,what) - implicit none - type(nmm_terrain), pointer :: tr - character*256 :: message - character*3 :: what - character(len=128) :: input_fname - -3123 format('Did not find "',A,'" in file "',A,'".') - write(message,3123) trim(what),trim(input_fname) - call wrf_error_fatal(message) - end subroutine readfail -end module module_TERRAIN diff --git a/dyn_nmm/module_TIMERS.F b/dyn_nmm/module_TIMERS.F deleted file mode 100644 index acba2fd671..0000000000 --- a/dyn_nmm/module_TIMERS.F +++ /dev/null @@ -1,17 +0,0 @@ -! - MODULE MODULE_TIMERS -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- -!*** TIMERS OF FORECAST COMPONENTS -! - REAL :: adve_tim,bocoh_tim,bocov_tim,chkout_tim,cltend_tim & - ,cucnvc_tim,ddamp_tim,eps_tim,exch_tim,goss_tim & - ,gsmdrive_tim,had2_tim,hadz_tim,hdiff_tim & - ,init_tim,nhb_tim,pdtedt_tim,pfdht_tim & - ,radtn_tim,rdtemp_tim,res_tim,surfce_tim,turbl_tim & - ,vad2_tim,vadz_tim - REAL :: allocm_tim,allocs_tim,digflt_tim,fltas_tim & - ,gossip_tim,mpp_tim,runstream_tim - REAL :: brun_tim,btim,btimx,pct,tot_tim,tot2_tim -!---------------------------------------------------------------------- - END MODULE MODULE_TIMERS diff --git a/dyn_nmm/module_ZEROX.F b/dyn_nmm/module_ZEROX.F deleted file mode 100644 index af6812fb2b..0000000000 --- a/dyn_nmm/module_ZEROX.F +++ /dev/null @@ -1,85 +0,0 @@ - MODULE MODULE_ZEROX -!---------------------------------------------------------------------- - CONTAINS -!---------------------------------------------------------------------- -!********************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: ZEROx ZERO OUT MULTI-DIMENSIONAL ARRAY -! PRGRMMR: BLACK ORG: W/NP2 DATE: 01-03-20 -! -! ABSTRACT: -! SUBROUTINE ZEROx FILLS REAL ARRAYS WITH ZEROES -! -! CURRENT INTERFACES: ZERO2, ZERO3 -! -! PROGRAM HISTORY LOG: -! 01-03-20 BLACK - ORIGINATOR -! -! USAGE: CALL ZERO WHERE NEEDED -! INPUT ARGUMENT LIST: -! ARR2 - THE ARRAY TO BE FILLED -! IMS - THE STARTING I VALUE FOR LOCAL MEMORY -! IME - THE ENDING I VALUE FOR LOCAL MEMORY -! JMS - THE STARTING J VALUE FOR LOCAL MEMORY -! JME - THE ENDING J VALUE FOR LOCAL MEMORY -! -! OUTPUT ARGUMENT LIST: -! ARR2 -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! COMMON BLOCKS: NONE -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!********************************************************************** - SUBROUTINE ZERO2(ARR2,IS,IE,JS,JE) -!---------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER,INTENT(IN) :: IE,IS,JE,JS - REAL,DIMENSION(IS:IE,JS:JE),INTENT(INOUT) :: ARR2 -! - INTEGER :: I,J -!********************************************************************** -!---------------------------------------------------------------------- - DO J=JS,JE - DO I=IS,IE - ARR2(I,J)=0. - ENDDO - ENDDO -!---------------------------------------------------------------------- - END SUBROUTINE ZERO2 -!********************************************************************** - SUBROUTINE ZERO3(ARR2,IS,IE,JS,JE,KS,KE) -!---------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER,INTENT(IN) :: IE,IS,JE,JS,KE,KS - REAL,DIMENSION(IS:IE,KS:KE,JS:JE),INTENT(INOUT) :: ARR2 -! - INTEGER :: I,J,K -!********************************************************************** -!---------------------------------------------------------------------- - DO J=JS,JE - DO K=KS,KE - DO I=IS,IE - ARR2(I,K,J)=0. - ENDDO - ENDDO - ENDDO -!---------------------------------------------------------------------- - END SUBROUTINE ZERO3 -!********************************************************************** -!---------------------------------------------------------------------- - END MODULE MODULE_ZEROX diff --git a/dyn_nmm/module_initialize_real.F b/dyn_nmm/module_initialize_real.F deleted file mode 100644 index c665ab947f..0000000000 --- a/dyn_nmm/module_initialize_real.F +++ /dev/null @@ -1,4742 +0,0 @@ -!REAL:MODEL_LAYER:INITIALIZATION - -! This MODULE holds the routines which are used to perform various initializations -! for individual domains utilizing the NMM dynamical core. - -!----------------------------------------------------------------------- - -MODULE module_initialize_real - - USE module_bc - USE module_configure - USE module_domain - USE module_io_domain - USE module_model_constants -! USE module_si_io_nmm - USE module_state_description - USE module_timing - USE module_soil_pre -#ifdef DM_PARALLEL - USE module_dm, ONLY : LOCAL_COMMUNICATOR & - ,MYTASK,NTASKS,NTASKS_X & - ,NTASKS_Y - USE module_comm_dm - USE module_ext_internal -#endif - - INTEGER :: internal_time_loop - INTEGER:: MPI_COMM_COMP,MYPE - INTEGER:: loopinc, iloopinc - -CONTAINS - -!------------------------------------------------------------------- - - SUBROUTINE init_domain ( grid ) - - IMPLICIT NONE - - ! Input space and data. No gridded meteorological data has been stored, though. - -! TYPE (domain), POINTER :: grid - TYPE (domain) :: grid - - ! Local data. - - INTEGER :: idum1, idum2 - - CALL set_scalar_indices_from_config ( head_grid%id , idum1, idum2 ) - - CALL init_domain_nmm (grid & -! -#include "actual_new_args.inc" -! - ) - - END SUBROUTINE init_domain - -!------------------------------------------------------------------- -!--------------------------------------------------------------------- - SUBROUTINE init_domain_nmm ( grid & -! -# include "dummy_new_args.inc" -! - ) - - USE module_optional_input - IMPLICIT NONE - - ! Input space and data. No gridded meteorological data has been stored, though. - -! TYPE (domain), POINTER :: grid - TYPE (domain) :: grid - -# include "dummy_new_decl.inc" - - TYPE (grid_config_rec_type) :: config_flags - - ! Local domain indices and counters. - - INTEGER :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat - - INTEGER :: & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - its, ite, jts, jte, kts, kte, & - ips, ipe, jps, jpe, kps, kpe, & - i, j, k, NNXP, NNYP - - ! Local data - - CHARACTER(LEN=19):: start_date - -#ifdef DM_PARALLEL - - LOGICAL,EXTERNAL :: WRF_DM_ON_MONITOR - logical :: test - -! INTEGER :: DOMDESC - REAL,ALLOCATABLE :: SICE_G(:,:), SM_G(:,:) - INTEGER, ALLOCATABLE:: IHE_G(:),IHW_G(:) - INTEGER, ALLOCATABLE:: ITEMP(:,:) - INTEGER :: my_e,my_n,my_s,my_w,my_ne,my_nw,my_se,my_sw,myi,myj,npe - INTEGER :: istat,inpes,jnpes -#else - integer, allocatable:: ihw(:),ihe(:) -#endif - - - CHARACTER (LEN=255) :: message - - INTEGER :: error - REAL :: p_surf, p_level - REAL :: cof1, cof2 - REAL :: qvf , qvf1 , qvf2 , pd_surf - REAL :: p00 , t00 , a - REAL :: hold_znw, rmin,rmax - - REAL :: p_top_requested , ptsgm - INTEGER :: num_metgrid_levels, ICOUNT - REAL , DIMENSION(max_eta) :: eta_levels - - LOGICAL :: stretch_grid, dry_sounding, debug, log_flag_sst, hyb_coor - - REAL, ALLOCATABLE,DIMENSION(:,:):: ADUM2D,SNOWC,HT,TG_ALT, & - PDVP,PSFC_OUTV - - REAL, ALLOCATABLE,DIMENSION(:,:,:):: P3D_OUT,P3DV_OUT,P3DV_IN, & - QTMP,QTMP2 - - INTEGER, ALLOCATABLE, DIMENSION(:):: KHL2,KVL2,KHH2,KVH2, & - KHLA,KHHA,KVLA,KVHA - -! INTEGER, ALLOCATABLE, DIMENSION(:,:):: grid%lu_index - - REAL, ALLOCATABLE, DIMENSION(:):: DXJ,WPDARJ,CPGFUJ,CURVJ, & - FCPJ,FDIVJ,EMJ,EMTJ,FADJ, & - HDACJ,DDMPUJ,DDMPVJ - - REAL, ALLOCATABLE,DIMENSION(:),SAVE:: SG1,SG2,DSG1,DSG2, & - SGML1,SGML2 - -!-- Carsel and Parrish [1988] - REAL , DIMENSION(100) :: lqmi - integer iicount - - REAL:: TPH0D,TLM0D - REAL:: TPH0,WB,SB,TDLM,TDPH - REAL:: WBI,SBI,EBI,ANBI,STPH0,CTPH0 - REAL:: TSPH,DTAD,DTCF - REAL:: ACDT,CDDAMP,DXP,FP - REAL:: WBD,SBD - REAL:: RSNOW,SNOFAC - REAL, PARAMETER:: SALP=2.60 - REAL, PARAMETER:: SNUP=0.040 - REAL:: SMCSUM,STCSUM,SEAICESUM,FISX - REAL:: cur_smc, aposs_smc - - REAL:: COAC, CODAMP - - INTEGER,PARAMETER:: DOUBLE=SELECTED_REAL_KIND(15,300) - REAL(KIND=DOUBLE):: TERM1,APH,TLM,TPH,DLM,DPH,STPH,CTPH - - INTEGER:: KHH,KVH,JAM,JA, IHL, IHH, L - INTEGER:: II,JJ,ISRCH,ISUM,ITER,Ilook,Jlook - REAL :: NDLMD,NDPHD,NWBD,NSBD - INTEGER :: NIDE,NJDE - - REAL, PARAMETER:: DTR=0.01745329 - REAL, PARAMETER:: W_NMM=0.08 -#if ( HWRF == 1 ) - REAL, PARAMETER:: DDFC=1.0 -#else - REAL, PARAMETER:: DDFC=8.0 -#endif - REAL, PARAMETER:: TWOM=.00014584 - REAL, PARAMETER:: CP=1004.6 - REAL, PARAMETER:: DFC=1.0 - REAL, PARAMETER:: ROI=916.6 - REAL, PARAMETER:: R=287.04 - REAL, PARAMETER:: CI=2060.0 - REAL, PARAMETER:: ROS=1500. - REAL, PARAMETER:: CS=1339.2 - REAL, PARAMETER:: DS=0.050 - REAL, PARAMETER:: AKS=.0000005 - REAL, PARAMETER:: DZG=2.85 - REAL, PARAMETER:: DI=.1000 - REAL, PARAMETER:: AKI=0.000001075 - REAL, PARAMETER:: DZI=2.0 - REAL, PARAMETER:: THL=210. - REAL, PARAMETER:: PLQ=70000. - REAL, PARAMETER:: ERAD=6371200. - REAL, PARAMETER:: TG0=258.16 - REAL, PARAMETER:: TGA=30.0 - integer :: numzero,numexamined -#if ( HWRF == 1 ) -!============================================================================ -! gopal's doing for ocean coupling -!============================================================================ - - - INTEGER fid, ierr, nprocs - CHARACTER*255 f65name, SysString - -!============================================================================ -! end gopal's doing for ocean coupling -!============================================================================ -#endif - - if (ALLOCATED(ADUM2D)) DEALLOCATE(ADUM2D) - if (ALLOCATED(TG_ALT)) DEALLOCATE(TG_ALT) - -!#define COPY_IN -!#include "scalar_derefs.inc" -#ifdef DM_PARALLEL -# include "data_calls.inc" -#endif - - SELECT CASE ( model_data_order ) - CASE ( DATA_ORDER_ZXY ) - kds = grid%sd31 ; kde = grid%ed31 ; - ids = grid%sd32 ; ide = grid%ed32 ; - jds = grid%sd33 ; jde = grid%ed33 ; - - kms = grid%sm31 ; kme = grid%em31 ; - ims = grid%sm32 ; ime = grid%em32 ; - jms = grid%sm33 ; jme = grid%em33 ; - - kts = grid%sp31 ; kte = grid%ep31 ; ! tile is entire patch - its = grid%sp32 ; ite = grid%ep32 ; ! tile is entire patch - jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch - - CASE ( DATA_ORDER_XYZ ) - ids = grid%sd31 ; ide = grid%ed31 ; - jds = grid%sd32 ; jde = grid%ed32 ; - kds = grid%sd33 ; kde = grid%ed33 ; - - ims = grid%sm31 ; ime = grid%em31 ; - jms = grid%sm32 ; jme = grid%em32 ; - kms = grid%sm33 ; kme = grid%em33 ; - - its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch - jts = grid%sp32 ; jte = grid%ep32 ; ! tile is entire patch - kts = grid%sp33 ; kte = grid%ep33 ; ! tile is entire patch - - CASE ( DATA_ORDER_XZY ) - ids = grid%sd31 ; ide = grid%ed31 ; - kds = grid%sd32 ; kde = grid%ed32 ; - jds = grid%sd33 ; jde = grid%ed33 ; - - ims = grid%sm31 ; ime = grid%em31 ; - kms = grid%sm32 ; kme = grid%em32 ; - jms = grid%sm33 ; jme = grid%em33 ; - - its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch - kts = grid%sp32 ; kte = grid%ep32 ; ! tile is entire patch - jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch - - END SELECT - -#ifdef DM_PARALLEL - CALL WRF_GET_MYPROC(MYPE) - CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP) - call wrf_get_nprocx(inpes) - call wrf_get_nprocy(jnpes) -! - allocate(itemp(inpes,jnpes),stat=istat) - npe=0 -! - do j=1,jnpes - do i=1,inpes - itemp(i,j)=npe - if(npe==mype)then - myi=i - myj=j - endif - npe=npe+1 - enddo - enddo -! - my_n=-1 - if(myj+1<=jnpes)my_n=itemp(myi,myj+1) -! - my_e=-1 - if(myi+1<=inpes)my_e=itemp(myi+1,myj) -! - my_s=-1 - if(myj-1>=1)my_s=itemp(myi,myj-1) -! - my_w=-1 - if(myi-1>=1)my_w=itemp(myi-1,myj) -! - my_ne=-1 - if((myi+1<=inpes).and.(myj+1<=jnpes)) & - my_ne=itemp(myi+1,myj+1) -! - my_se=-1 - if((myi+1<=inpes).and.(myj-1>=1)) & - my_se=itemp(myi+1,myj-1) -! - my_sw=-1 - if((myi-1>=1).and.(myj-1>=1)) & - my_sw=itemp(myi-1,myj-1) -! - my_nw=-1 - if((myi-1>=1).and.(myj+1<=jnpes)) & - my_nw=itemp(myi-1,myj+1) -! -! my_neb(1)=my_n -! my_neb(2)=my_e -! my_neb(3)=my_s -! my_neb(4)=my_w -! my_neb(5)=my_ne -! my_neb(6)=my_se -! my_neb(7)=my_sw -! my_neb(8)=my_nw -! - deallocate(itemp) -#endif - - NNXP=min(ITE,IDE-1) - NNYP=min(JTE,JDE-1) - - write(message,*) 'IDE, JDE: ', IDE,JDE - write(message,*) 'NNXP, NNYP: ', NNXP,NNYP - CALL wrf_message(message) - - JAM=6+2*(JDE-JDS-10) - - if (internal_time_loop .eq. 1) then - ALLOCATE(ADUM2D(grid%sm31:grid%em31,jms:jme)) - ALLOCATE(KHL2(JTS:NNYP),KVL2(JTS:NNYP),KHH2(JTS:NNYP),KVH2(JTS:NNYP)) - ALLOCATE(DXJ(JTS:NNYP),WPDARJ(JTS:NNYP),CPGFUJ(JTS:NNYP),CURVJ(JTS:NNYP)) - ALLOCATE(FCPJ(JTS:NNYP),FDIVJ(JTS:NNYP),& - FADJ(JTS:NNYP)) - ALLOCATE(HDACJ(JTS:NNYP),DDMPUJ(JTS:NNYP),DDMPVJ(JTS:NNYP)) - ALLOCATE(KHLA(JAM),KHHA(JAM)) - ALLOCATE(KVLA(JAM),KVHA(JAM)) - endif - - - CALL model_to_grid_config_rec ( grid%id , model_config_rec , config_flags ) - - IF ( CONFIG_FLAGS%FRACTIONAL_SEAICE == 1 ) THEN - CALL WRF_ERROR_FATAL("NMM cannot use FRACTIONAL_SEAICE = 1") - ENDIF - - if ( config_flags%bl_pbl_physics == BOULACSCHEME ) then - call wrf_error_fatal("Cannot use BOULAC PBL with NMM") - endif - - write(message,*) 'cen_lat: ', config_flags%cen_lat - CALL wrf_debug(100,message) - write(message,*) 'cen_lon: ', config_flags%cen_lon - CALL wrf_debug(100,message) - write(message,*) 'dx: ', config_flags%dx - CALL wrf_debug(100,message) - write(message,*) 'dy: ', config_flags%dy - CALL wrf_debug(100,message) - write(message,*) 'config_flags%start_year: ', config_flags%start_year - CALL wrf_debug(100,message) - write(message,*) 'config_flags%start_month: ', config_flags%start_month - CALL wrf_debug(100,message) - write(message,*) 'config_flags%start_day: ', config_flags%start_day - CALL wrf_debug(100,message) - write(message,*) 'config_flags%start_hour: ', config_flags%start_hour - CALL wrf_debug(100,message) - - write(start_date,435) config_flags%start_year, config_flags%start_month, & - config_flags%start_day, config_flags%start_hour - 435 format(I4,'-',I2.2,'-',I2.2,'_',I2.2,':00:00') - - grid%dlmd=config_flags%dx - grid%dphd=config_flags%dy - tph0d=config_flags%cen_lat - tlm0d=config_flags%cen_lon - -!========================================================================== - -!! - - ! Check to see if the boundary conditions are set - ! properly in the namelist file. - ! This checks for sufficiency and redundancy. - - CALL boundary_condition_check( config_flags, bdyzone, error, grid%id ) - - ! Some sort of "this is the first time" initialization. Who knows. - - grid%itimestep=0 - - ! Pull in the info in the namelist to compare it to the input data. - - grid%real_data_init_type = model_config_rec%real_data_init_type - write(message,*) 'what is flag_metgrid: ', flag_metgrid - CALL wrf_message(message) - - IF ( flag_metgrid .EQ. 1 ) THEN ! <----- START OF VERTICAL INTERPOLATION PART ----> - - num_metgrid_levels = grid%num_metgrid_levels - - - IF (grid%ght_gc(its,jts,num_metgrid_levels/2) .lt. grid%ght_gc(its,jts,num_metgrid_levels/2+1)) THEN - - write(message,*) 'normal ground up file order' - hyb_coor=.false. - CALL wrf_message(message) - - ELSE - - hyb_coor=.true. - write(message,*) 'reverse the order of coordinate' - CALL wrf_message(message) - - CALL reverse_vert_coord(grid%ght_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - -#if ( HWRF == 1 ) - if(.not. grid%use_prep_hybrid) then -#endif - - CALL reverse_vert_coord(grid%p_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - CALL reverse_vert_coord(grid%t_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - CALL reverse_vert_coord(grid%u_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - CALL reverse_vert_coord(grid%v_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - CALL reverse_vert_coord(grid%rh_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - -#if ( HWRF == 1 ) - endif -#endif - - endif - - - IF (hyb_coor) THEN - ! limit extreme deviations from source model topography - ! due to potential for nasty extrapolation/interpolation issues - ! - write(message,*) 'min, max of grid%ht_gc before adjust: ', minval(grid%ht_gc), maxval(grid%ht_gc) - CALL wrf_debug(100,message) - ICOUNT=0 - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - IF ((grid%ht_gc(I,J) - grid%ght_gc(I,J,2)) .LT. -150.) THEN - grid%ht_gc(I,J)=grid%ght_gc(I,J,2)-150. - IF (ICOUNT .LT. 20) THEN - write(message,*) 'increasing NMM topo toward RUC ', I,J - CALL wrf_debug(100,message) - ICOUNT=ICOUNT+1 - ENDIF - ELSEIF ((grid%ht_gc(I,J) - grid%ght_gc(I,J,2)) .GT. 150.) THEN - grid%ht_gc(I,J)=grid%ght_gc(I,J,2)+150. - IF (ICOUNT .LT. 20) THEN - write(message,*) 'decreasing NMM topo toward RUC ', I,J - CALL wrf_debug(100,message) - ICOUNT=ICOUNT+1 - ENDIF - ENDIF - END DO - END DO - - write(message,*) 'min, max of ht_gc after correct: ', minval(grid%ht_gc), maxval(grid%ht_gc) - CALL wrf_debug(100,message) - ENDIF - - CALL boundary_smooth(grid%ht_gc,grid%landmask, grid, 12 , 12 & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - if (grid%landmask(I,J) .gt. 0.5) grid%sm(I,J)=0. - if (grid%landmask(I,J) .le. 0.5) grid%sm(I,J)=1. - if (grid%tsk_gc(I,J) .gt. 0.) then - grid%nmm_tsk(I,J)=grid%tsk_gc(I,J) - else -#if ( HWRF == 1 ) - if(grid%use_prep_hybrid) then - if(grid%t(I,J,1)<100) then - write(*,*) 'NO VALID SURFACE TEMPERATURE: I,J,TSK_GC(I,J),T(I,J,1) = ', & - I,J,grid%TSK_GC(I,J),grid%T(I,J,1) - else - grid%nmm_tsk(I,J)=grid%t(I,J,1) ! stopgap measure - end if - else -#endif - grid%nmm_tsk(I,J)=grid%t_gc(I,J,1) ! stopgap measure -#if ( HWRF == 1 ) - endif -#endif - endif -! - grid%glat(I,J)=grid%hlat_gc(I,J)*DEGRAD - grid%glon(I,J)=grid%hlon_gc(I,J)*DEGRAD - grid%weasd(I,J)=grid%snow(I,J) - grid%xice(I,J)=grid%xice_gc(I,J) - ENDDO - ENDDO -! First item is to define the target vertical coordinate - - num_metgrid_levels = grid%num_metgrid_levels - eta_levels(1:kde) = model_config_rec%eta_levels(1:kde) - ptsgm = model_config_rec%ptsgm - p_top_requested = grid%p_top_requested - grid%pt=p_top_requested - - if (internal_time_loop .eq. 1) then - - if (eta_levels(1) .ne. 1.0) then -#if ( HWRF == 1 ) - if(grid%use_prep_hybrid) then - call wrf_error_fatal('PREP_HYBRID ERROR: eta_levels is not specified, but use_prep_hybrid=.true.') - end if -#endif - - write(message,*) '********************************************************************* ' - CALL wrf_message(message) - write(message,*) '** eta_levels appears not to be specified in the namelist' - CALL wrf_message(message) - write(message,*) '** We will call compute_nmm_levels to define layer thicknesses.' - CALL wrf_message(message) - write(message,*) '** These levels should be reasonable for running the model, ' - CALL wrf_message(message) - write(message,*) '** but may not be ideal for the simulation being made. Consider ' - CALL wrf_message(message) - write(message,*) '** defining your own levels by specifying eta_levels in the model ' - CALL wrf_message(message) - write(message,*) '** namelist. ' - CALL wrf_message(message) - write(message,*) '********************************************************************** ' - CALL wrf_message(message) - - CALL compute_nmm_levels(KDE,p_top_requested,eta_levels) - - DO L=1,KDE - write(message,*) 'L, eta_levels(L) returned :: ', L,eta_levels(L) - CALL wrf_message(message) - ENDDO - - endif - - write(message,*) 'KDE-1: ', KDE-1 - CALL wrf_debug(1,message) - allocate(SG1(1:KDE-1)) - allocate(SG2(1:KDE-1)) - allocate(DSG1(1:KDE-1)) - allocate(DSG2(1:KDE-1)) - allocate(SGML1(1:KDE)) - allocate(SGML2(1:KDE)) - - CALL define_nmm_vertical_coord (kde-1, ptsgm, grid%pt,grid%pdtop, eta_levels, & - grid%eta1,grid%deta1,grid%aeta1, & - grid%eta2,grid%deta2,grid%aeta2, grid%dfl, grid%dfrlg ) - - DO L=KDS,KDE-1 - grid%deta(L)=eta_levels(L)-eta_levels(L+1) - ENDDO - endif - - write(message,*) 'num_metgrid_levels: ', num_metgrid_levels - CALL wrf_message(message) - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - grid%fis(I,J)=grid%ht_gc(I,J)*g -! -! IF ( grid%p_gc(I,J,1) .ne. 200100. .AND. (grid%ht_gc(I,J) .eq. grid%ght_gc(I,J,1)) .AND. grid%ht_gc(I,J) .ne. 0) THEN - IF ( grid%p_gc(I,J,1) .ne. 200100. .AND. (abs(grid%ht_gc(I,J)-grid%ght_gc(I,J,1)) .lt. 0.01) .AND. grid%ht_gc(I,J) .ne. 0) THEN - IF (mod(I,10) .eq. 0 .and. mod(J,10) .eq. 0) THEN - write(message,*) 'grid%ht_gc and grid%toposoil to swap, flag_soilhgt ::: ', & - I,J, grid%ht_gc(I,J),grid%toposoil(I,J),flag_soilhgt - CALL wrf_debug(10,message) - ENDIF - IF ( ( flag_soilhgt.EQ. 1 ) ) THEN - grid%ght_gc(I,J,1)=grid%toposoil(I,J) - ENDIF - ENDIF - - ENDDO - ENDDO - - numzero=0 - numexamined=0 - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - numexamined=numexamined+1 - if(grid%fis(i,j)<1e-5 .and. grid%fis(i,j)>-1e5 ) then - numzero=numzero+1 - end if - enddo - enddo - write(message,*) 'TOTAL NEAR-ZERO FIS POINTS: ',numzero,' OF ',numexamined - call wrf_debug(10,message) -#if ( HWRF == 1 ) - interp_notph: if(.not. grid%use_prep_hybrid) then -#endif - if (.NOT. allocated(PDVP)) allocate(PDVP(IMS:IME,JMS:JME)) - if (.NOT. allocated(P3D_OUT)) allocate(P3D_OUT(IMS:IME,JMS:JME,KDS:KDE-1)) - if (.NOT. allocated(PSFC_OUTV)) allocate(PSFC_OUTV(IMS:IME,JMS:JME)) - if (.NOT. allocated(P3DV_OUT)) allocate(P3DV_OUT(IMS:IME,JMS:JME,KDS:KDE-1)) - if (.NOT. allocated(P3DV_IN)) allocate(P3DV_IN(IMS:IME,JMS:JME,num_metgrid_levels)) - - CALL compute_nmm_surfacep (grid%ht_gc, grid%ght_gc, grid%p_gc , grid%t_gc & - &, grid%psfc_out, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) ! H points - - if (internal_time_loop .eq. 1) then - - write(message,*) 'psfc points (final combined)' - loopinc=max( (JTE-JTS)/20,1) - iloopinc=max( (ITE-ITS)/10,1) - CALL wrf_message(message) - DO J=min(JTE,JDE-1),JTS,-loopinc - write(message,633) (grid%psfc_out(I,J)/100.,I=its,min(ite,IDE-1),iloopinc) - CALL wrf_message(message) - ENDDO - - endif - - 633 format(35(f5.0,1x)) - - CALL compute_3d_pressure (grid%psfc_out,grid%aeta1,grid%aeta2 & - &, grid%pdtop,grid%pt,grid%pd,p3d_out & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - -#ifdef DM_PARALLEL - ips=its ; ipe=ite ; jps=jts ; jpe=jte ; kps=kts ; kpe=kte -# include "HALO_NMM_MG2.inc" -#endif - -#ifdef DM_PARALLEL -# include "HALO_NMM_MG3.inc" -#endif - - do K=1,num_metgrid_levels - do J=JTS,min(JTE,JDE-1) - do I=ITS,min(ITE,IDE-1) - - IF (K .eq. KTS) THEN - IF (J .eq. JDS .and. I .lt. IDE-1) THEN ! S boundary - PDVP(I,J)=0.5*(grid%pd(I,J)+grid%pd(I+1,J)) - PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J)+grid%psfc_out(I+1,J)) - ELSEIF (J .eq. JDE-1 .and. I .lt. IDE-1) THEN ! N boundary - PDVP(I,J)=0.5*(grid%pd(I,J)+grid%pd(I+1,J)) - PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J)+grid%psfc_out(I+1,J)) - ELSEIF (I .eq. IDS .and. mod(J,2) .eq. 0) THEN ! W boundary - PDVP(I,J)=0.5*(grid%pd(I,J-1)+grid%pd(I,J+1)) - PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J-1)+grid%psfc_out(I,J+1)) - ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 0) THEN ! E boundary - PDVP(I,J)=0.5*(grid%pd(I,J-1)+grid%pd(I,J+1)) - PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J-1)+grid%psfc_out(I,J+1)) - ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 1) THEN ! phantom E boundary - PDVP(I,J)=grid%pd(I,J) - PSFC_OUTV(I,J)=grid%psfc_out(I,J) - ELSEIF (mod(J,2) .eq. 0) THEN ! interior even row - PDVP(I,J)=0.25*(grid%pd(I,J)+grid%pd(I-1,J)+grid%pd(I,J+1)+grid%pd(I,J-1)) - PSFC_OUTV(I,J)=0.25*(grid%psfc_out(I,J)+grid%psfc_out(I-1,J)+ & - grid%psfc_out(I,J+1)+grid%psfc_out(I,J-1)) - ELSE ! interior odd row - PDVP(I,J)=0.25*(grid%pd(I,J)+grid%pd(I+1,J)+grid%pd(I,J+1)+grid%pd(I,J-1)) - PSFC_OUTV(I,J)=0.25*(grid%psfc_out(I,J)+grid%psfc_out(I+1,J)+ & - grid%psfc_out(I,J+1)+grid%psfc_out(I,J-1)) - ENDIF - ENDIF - - IF (J .eq. JDS .and. I .lt. IDE-1) THEN ! S boundary - P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J,K)+grid%p_gc(I+1,J,K)) - ELSEIF (J .eq. JDE-1 .and. I .lt. IDE-1) THEN ! N boundary - P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J,K)+grid%p_gc(I+1,J,K)) - ELSEIF (I .eq. IDS .and. mod(J,2) .eq. 0) THEN ! W boundary - P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J-1,K)+grid%p_gc(I,J+1,K)) - ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 0) THEN ! E boundary - P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J-1,K)+grid%p_gc(I,J+1,K)) - ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 1) THEN ! phantom E boundary - P3DV_IN(I,J,K)=grid%p_gc(I,J,K) - ELSEIF (mod(J,2) .eq. 0) THEN ! interior even row - P3DV_IN(I,J,K)=0.25*(grid%p_gc(I,J,K)+grid%p_gc(I-1,J,K) + & - grid%p_gc(I,J+1,K)+grid%p_gc(I,J-1,K)) - ELSE ! interior odd row - P3DV_IN(I,J,K)=0.25*(grid%p_gc(I,J,K)+grid%p_gc(I+1,J,K) + & - grid%p_gc(I,J+1,K)+grid%p_gc(I,J-1,K)) - ENDIF - - enddo - enddo - enddo - - CALL compute_3d_pressure (psfc_outv,grid%aeta1,grid%aeta2 & - &, grid%pdtop,grid%pt,pdvp,p3dv_out & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - CALL interp_press2press_lin(grid%p_gc, p3d_out & - &, grid%t_gc, grid%t,num_metgrid_levels & - &, .TRUE.,.TRUE.,.TRUE. & ! extrap, ignore_lowest, t_field - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop ) - - - CALL interp_press2press_lin(p3dv_in, p3dv_out & - &, grid%u_gc, grid%u,num_metgrid_levels & - &, .FALSE.,.TRUE.,.FALSE. & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop ) - - CALL interp_press2press_lin(p3dv_in, p3dv_out & - &, grid%v_gc, grid%v,num_metgrid_levels & - &, .FALSE.,.TRUE.,.FALSE. & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop ) - - IF (hyb_coor) THEN - CALL wind_adjust(p3dv_in,p3dv_out,grid%u_gc,grid%v_gc,grid%u,grid%v & - &, num_metgrid_levels,5000. & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - ENDIF - - - ALLOCATE(qtmp(IMS:IME,JMS:JME,num_metgrid_levels)) - ALLOCATE(qtmp2(IMS:IME,JMS:JME,num_metgrid_levels)) - - CALL rh_to_mxrat (grid%rh_gc, grid%t_gc, grid%p_gc, qtmp , .TRUE. , & - ids , ide , jds , jde , 1 , num_metgrid_levels , & - ims , ime , jms , jme , 1 , num_metgrid_levels , & - its , ite , jts , jte , 1 , num_metgrid_levels ) - - do K=1,num_metgrid_levels - do J=JTS,min(JTE,JDE-1) - do I=ITS,min(ITE,IDE-1) - QTMP2(I,J,K)=QTMP(I,J,K)/(1.0+QTMP(I,J,K)) - end do - end do - end do - - CALL interp_press2press_log(grid%p_gc, p3d_out & - &, QTMP2, grid%q,num_metgrid_levels & - &, .FALSE.,.TRUE. & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop ) - - IF (ALLOCATED(QTMP)) DEALLOCATE(QTMP) - IF (ALLOCATED(QTMP)) DEALLOCATE(QTMP2) -#if ( HWRF == 1 ) - else ! we are using prep_hybrid - ! Compute surface pressure: - grid%psfc_out=grid%pdtop+grid%pd - end if interp_notph -#endif - - ! Get the monthly values interpolated to the current date - ! for the traditional monthly - ! fields of green-ness fraction and background grid%albedo. - - if (internal_time_loop .eq. 1 .or. config_flags%sst_update .eq. 1) then - - CALL monthly_interp_to_date ( grid%greenfrac_gc , current_date , grid%vegfra , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - CALL monthly_interp_to_date ( grid%albedo12m_gc , current_date , grid%albbck , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - ! Get the min/max of each i,j for the monthly green-ness fraction. - - CALL monthly_min_max ( grid%greenfrac_gc , grid%shdmin , grid%shdmax , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - ! The model expects the green-ness values in percent, not fraction. - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) -!! grid%vegfra(i,j) = grid%vegfra(i,j) * 100. - grid%shdmax(i,j) = grid%shdmax(i,j) * 100. - grid%shdmin(i,j) = grid%shdmin(i,j) * 100. - grid%vegfrc(I,J)=grid%vegfra(I,J) - END DO - END DO - - ! The model expects the albedo fields as - ! a fraction, not a percent. Set the water values to 8%. - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - if (grid%albbck(i,j) .lt. 5.) then - write(message,*) 'reset albedo to 8%... I,J,albbck:: ', I,J,grid%albbck(I,J) - CALL wrf_debug(10,message) - grid%albbck(I,J)=8. - endif - grid%albbck(i,j) = grid%albbck(i,j) / 100. - grid%snoalb(i,j) = grid%snoalb(i,j) / 100. - IF ( grid%landmask(i,j) .LT. 0.5 ) THEN - grid%albbck(i,j) = 0.08 - grid%snoalb(i,j) = 0.08 - END IF - grid%albase(i,j)=grid%albbck(i,j) - grid%mxsnal(i,j)=grid%snoalb(i,j) - END DO - END DO - - endif - -#if ( HWRF == 1 ) - if(.not.grid%use_prep_hybrid) then -#endif -! new deallocs - DEALLOCATE(p3d_out,p3dv_out,p3dv_in) -#if ( HWRF == 1 ) - end if -#endif - - END IF ! <----- END OF VERTICAL INTERPOLATION PART ----> - - DO j = jts, MIN(jde-1,jte) ! <--- Initialize the arrays from WW/Ocean Biju! - DO i = its, MIN(ide-1,ite) - grid%scurx(i,j) = 0.0 - grid%scury(i,j) = 0.0 - grid%charn(i,j) = 0.0185 - grid%msang(i,j) = 0.0 - grid%rchno(i,j) = 1e-03 - grid%zsig1(i,j) = 20.0 - END DO - END DO ! <----- END ----> - -!! compute SST at each time if updating SST - if (config_flags%sst_update == 1) then - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - if (grid%SM(I,J) .lt. 0.5) then - grid%SST(I,J)=0. - endif - - if (grid%SM(I,J) .gt. 0.5) then - grid%SST(I,J)=grid%NMM_TSK(I,J) - grid%NMM_TSK(I,J)=0. - endif - - IF ( (grid%NMM_TSK(I,J)+grid%SST(I,J)) .lt. 200. .or. & - (grid%NMM_TSK(I,J)+grid%SST(I,J)) .gt. 350. ) THEN - write(message,*) 'TSK, SST trouble at : ', I,J - CALL wrf_message(message) - write(message,*) 'SM, NMM_TSK,SST ', grid%SM(I,J),grid%NMM_TSK(I,J),grid%SST(I,J) - CALL wrf_message(message) - ENDIF - - ENDDO - ENDDO - - endif ! sst_update test - - if (internal_time_loop .eq. 1) then - -!!! weasd has "snow water equivalent" in mm - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - - IF(grid%sm(I,J).GT.0.9) THEN - - IF (grid%xice(I,J) .gt. 0) then - grid%si(I,J)=1.0 - ENDIF - -! SEA - grid%epsr(I,J)=.97 - grid%embck(I,J)=.97 - grid%gffc(I,J)=0. - grid%albedo(I,J)=.06 - grid%albase(I,J)=.06 - IF(grid%si (I,J).GT.0. ) THEN -! SEA-ICE - grid%sm(I,J)=0. - grid%si(I,J)=0. - grid%sice(I,J)=1. - grid%gffc(I,J)=0. ! just leave zero as irrelevant - grid%albedo(I,J)=.60 - grid%albase(I,J)=.60 - ENDIF - ELSE - - grid%si(I,J)=5.0*grid%weasd(I,J)/1000. -! LAND - grid%epsr(I,J)=1.0 - grid%embck(I,J)=1.0 - grid%gffc(I,J)=0.0 ! just leave zero as irrelevant - grid%sice(I,J)=0. - grid%sno(I,J)=grid%si(I,J)*.20 - ENDIF - ENDDO - ENDDO - -! DETERMINE grid%albedo OVER LAND - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - IF(grid%sm(I,J).LT.0.9.AND.grid%sice(I,J).LT.0.9) THEN -! SNOWFREE albedo - IF ( (grid%sno(I,J) .EQ. 0.0) .OR. & - (grid%albase(I,J) .GE. grid%mxsnal(I,J) ) ) THEN - grid%albedo(I,J) = grid%albase(I,J) - ELSE -! MODIFY albedo IF SNOWCOVER: -! BELOW SNOWDEPTH THRESHOLD... - IF (grid%sno(I,J) .LT. SNUP) THEN - RSNOW = grid%sno(I,J)/SNUP - SNOFAC = 1. - ( EXP(-SALP*RSNOW) - RSNOW*EXP(-SALP)) -! ABOVE SNOWDEPTH THRESHOLD... - ELSE - SNOFAC = 1.0 - ENDIF -! CALCULATE grid%albedo ACCOUNTING FOR SNOWDEPTH AND VGFRCK - grid%albedo(I,J) = grid%albase(I,J) & - + (1.0-grid%vegfra(I,J))*SNOFAC*(grid%mxsnal(I,J)-grid%albase(I,J)) - ENDIF - END IF - grid%si(I,J)=5.0*grid%weasd(I,J) - grid%sno(I,J)=grid%weasd(I,J) - -!! convert vegfra - grid%vegfra(I,J)=grid%vegfra(I,J)*100. -! - ENDDO - ENDDO - -#ifdef DM_PARALLEL - - ALLOCATE(SM_G(IDS:IDE,JDS:JDE),SICE_G(IDS:IDE,JDS:JDE)) - - CALL WRF_PATCH_TO_GLOBAL_REAL( grid%sice(IMS,JMS) & - &, SICE_G,grid%DOMDESC & - &, 'z','xy' & - &, IDS,IDE-1,JDS,JDE-1,1,1 & - &, IMS,IME,JMS,JME,1,1 & - &, ITS,ITE,JTS,JTE,1,1 ) - - CALL WRF_PATCH_TO_GLOBAL_REAL( grid%sm(IMS,JMS) & - &, SM_G,grid%DOMDESC & - &, 'z','xy' & - &, IDS,IDE-1,JDS,JDE-1,1,1 & - &, IMS,IME,JMS,JME,1,1 & - &, ITS,ITE,JTS,JTE,1,1 ) - - - IF (WRF_DM_ON_MONITOR()) THEN - - 637 format(40(f3.0,1x)) - - allocate(IHE_G(JDS:JDE-1),IHW_G(JDS:JDE-1)) - DO j = JDS, JDE-1 - IHE_G(J)=MOD(J+1,2) - IHW_G(J)=IHE_G(J)-1 - ENDDO - - DO ITER=1,10 - DO j = jds+1, (jde-1)-1 - DO i = ids+1, (ide-1)-1 - -! any sea ice around point in question? - - IF (SM_G(I,J) .ge. 0.9) THEN - SEAICESUM=SICE_G(I+IHE_G(J),J+1)+SICE_G(I+IHW_G(J),J+1)+ & - SICE_G(I+IHE_G(J),J-1)+SICE_G(I+IHW_G(J),J-1) - IF (SEAICESUM .ge. 1. .and. SEAICESUM .lt. 3.) THEN - - IF ((SICE_G(I+IHE_G(J),J+1).lt.0.1 .and. SM_G(I+IHE_G(J),J+1).lt.0.1) .OR. & - (SICE_G(I+IHW_G(J),J+1).lt.0.1 .and. SM_G(I+IHW_G(J),J+1).lt.0.1) .OR. & - (SICE_G(I+IHE_G(J),J-1).lt.0.1 .and. SM_G(I+IHE_G(J),J-1).lt.0.1) .OR. & - (SICE_G(I+IHW_G(J),J-1).lt.0.1 .and. SM_G(I+IHW_G(J),J-1).lt.0.1)) THEN - -! HAVE SEA ICE AND A SURROUNDING LAND POINT - CONVERT TO SEA ICE - - write(message,*) 'making seaice (1): ', I,J - CALL wrf_debug(100,message) - SICE_G(I,J)=1.0 - SM_G(I,J)=0. - - ENDIF - - ELSEIF (SEAICESUM .ge. 3) THEN - -! WATER POINT SURROUNDED BY ICE - CONVERT TO SEA ICE - - write(message,*) 'making seaice (2): ', I,J - CALL wrf_debug(100,message) - SICE_G(I,J)=1.0 - SM_G(I,J)=0. - ENDIF - - ENDIF - - ENDDO - ENDDO - ENDDO - - ENDIF - - CALL WRF_GLOBAL_TO_PATCH_REAL( SICE_G, grid%sice & - &, grid%DOMDESC & - &, 'z','xy' & - &, IDS,IDE-1,JDS,JDE-1,1,1 & - &, IMS,IME,JMS,JME,1,1 & - &, ITS,ITE,JTS,JTE,1,1 ) - - CALL WRF_GLOBAL_TO_PATCH_REAL( SM_G,grid%sm & - &, grid%DOMDESC & - &, 'z','xy' & - &, IDS,IDE-1,JDS,JDE-1,1,1 & - &, IMS,IME,JMS,JME,1,1 & - &, ITS,ITE,JTS,JTE,1,1 ) - - IF (WRF_DM_ON_MONITOR()) THEN -#if ( HWRF == 1 ) - ! SM_G is still needed for the high-res grid -#else - DEALLOCATE(SM_G) -#endif - deallocate(SICE_G) - DEALLOCATE(IHE_G,IHW_G) - - ENDIF - -! write(message,*) 'revised sea ice on patch' -! CALL wrf_debug(100,message) -! DO J=JTE,JTS,-(((JTE-JTS)/25)+1) -! write(message,637) (grid%sice(I,J),I=ITS,ITE,ITE/20) -! CALL wrf_debug(100,message) -! END DO - -#else -! serial sea ice reprocessing - allocate(IHE(JDS:JDE-1),IHW(JDS:JDE-1)) - - DO j = jts, MIN(jte,jde-1) - IHE(J)=MOD(J+1,2) - IHW(J)=IHE(J)-1 - ENDDO - - DO ITER=1,10 - DO j = jts+1, MIN(jte,jde-1)-1 - DO i = its+1, MIN(ite,ide-1)-1 - -! any sea ice around point in question? - - IF (grid%sm(I,J) .gt. 0.9) THEN - SEAICESUM=grid%sice(I+IHE(J),J+1)+grid%sice(I+IHW(J),J+1)+ & - grid%sice(I+IHE(J),J-1)+grid%sice(I+IHW(J),J-1) - IF (SEAICESUM .ge. 1. .and. SEAICESUM .lt. 3.) THEN - IF ((grid%sice(I+IHE(J),J+1).lt.0.1 .and. grid%sm(I+IHE(J),J+1).lt.0.1) .OR. & - (grid%sice(I+IHW(J),J+1).lt.0.1 .and. grid%sm(I+IHW(J),J+1).lt.0.1) .OR. & - (grid%sice(I+IHE(J),J-1).lt.0.1 .and. grid%sm(I+IHE(J),J-1).lt.0.1) .OR. & - (grid%sice(I+IHW(J),J-1).lt.0.1 .and. grid%sm(I+IHW(J),J-1).lt.0.1)) THEN - -! HAVE SEA ICE AND A SURROUNDING LAND POINT - CONVERT TO SEA ICE - grid%sice(I,J)=1.0 - grid%sm(I,J)=0. - ENDIF - ELSEIF (SEAICESUM .ge. 3) THEN -! WATER POINT SURROUNDED BY ICE - CONVERT TO SEA ICE - grid%sice(I,J)=1.0 - grid%sm(I,J)=0. - ENDIF - ENDIF - - ENDDO - ENDDO - ENDDO - - DEALLOCATE(IHE,IHW) -#endif - -! this block meant to guarantee land/sea agreement between sm and landmask - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - - IF (grid%sm(I,J) .gt. 0.5) THEN - grid%landmask(I,J)=0.0 - ELSEIF (grid%sm(I,J) .lt. 0.5 .and. grid%sice(I,J) .gt. 0.9) then - grid%landmask(I,J)=0.0 - ELSEIF (grid%sm(I,J) .lt. 0.5 .and. grid%sice(I,J) .lt. 0.1) then - grid%landmask(I,J)=1.0 - ELSE - write(message,*) 'missed point in grid%landmask definition ' , I,J - CALL wrf_message(message) - grid%landmask(I,J)=0.0 - ENDIF -! - IF (grid%sice(I,J) .gt. 0.5 .and. grid%nmm_tsk(I,J) .lt. 0.1 .and. grid%sst(I,J) .gt. 0.) THEN - write(message,*) 'set grid%nmm_tsk to: ', grid%sst(I,J) - CALL wrf_message(message) - grid%nmm_tsk(I,J)=grid%sst(I,J) - grid%sst(I,J)=0. - endif - - ENDDO - ENDDO - - ! For sf_surface_physics = 1, we want to use close to a 10 cm value - ! for the bottom level of the soil temps. - - IF ( ( model_config_rec%sf_surface_physics(grid%id) .EQ. 1 ) .AND. & - ( flag_st000010 .EQ. 1 ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - grid%soiltb(i,j) = grid%st000010(i,j) - END DO - END DO - END IF - - ! Adjust the various soil temperature values depending on the difference in - ! in elevation between the current model's elevation and the incoming data's - ! orography. - - IF ( ( flag_toposoil .EQ. 1 ) ) THEN - - ALLOCATE(HT(ims:ime,jms:jme)) - - DO J=jms,jme - DO I=ims,ime - HT(I,J)=grid%fis(I,J)/9.81 - END DO - END DO - -! if (maxval(grid%toposoil) .gt. 100.) then -! -! Being avoided. Something to revisit eventually. -! -!1219 might be simply a matter of including toposoil -! -! CODE NOT TESTED AT NCEP USING THIS FUNCTIONALITY, -! SO TO BE SAFE WILL AVOID FOR RETRO RUNS. -! -! CALL adjust_soil_temp_new ( grid%soiltb , 2 , & -! grid%nmm_tsk , ht , grid%toposoil , grid%landmask, flag_toposoil , & -! grid%st000010 , st010040 , st040100 , st100200 , st010200 , & -! flag_st000010 , flag_st010040 , flag_st040100 , & -! flag_st100200 , flag_st010200 , & -! soilt000 , soilt005 , soilt020 , soilt040 , & -! soilt160 , soilt300 , & -! flag_soilt000 , flag_soilt005 , flag_soilt020 , & -! flag_soilt040 , flag_soilt160 , flag_soilt300 , & -! ids , ide , jds , jde , kds , kde , & -! ims , ime , jms , jme , kms , kme , & -! its , ite , jts , jte , kts , kte ) -! endif - - END IF - - ! Process the LSM data. - - ! surface_input_source=1 => use data from static file - ! (fractional category as input) - ! surface_input_source=2 => use data from grib file - ! (dominant category as input) - - IF ( config_flags%surface_input_source .EQ. 1 ) THEN - grid%vegcat (its,jts) = 0 - grid%soilcat(its,jts) = 0 - END IF - - ! Generate the vegetation and soil category information - ! from the fractional input - ! data, or use the existing dominant category fields if they exist. - - IF ((grid%soilcat(its,jts) .LT. 0.5) .AND. (grid%vegcat(its,jts) .LT. 0.5)) THEN - - num_veg_cat = SIZE ( grid%landusef_gc , DIM=3 ) - num_soil_top_cat = SIZE ( grid%soilctop_gc , DIM=3 ) - num_soil_bot_cat = SIZE ( grid%soilcbot_gc , DIM=3 ) - - do J=JMS,JME - do K=1,num_veg_cat - do I=IMS,IME - grid%landusef(I,K,J)=grid%landusef_gc(I,J,K) - enddo - enddo - enddo - - do J=JMS,JME - do K=1,num_soil_top_cat - do I=IMS,IME - grid%soilctop(I,K,J)=grid%soilctop_gc(I,J,K) - enddo - enddo - enddo - - do J=JMS,JME - do K=1,num_soil_bot_cat - do I=IMS,IME - grid%soilcbot(I,K,J)=grid%soilcbot_gc(I,J,K) - enddo - enddo - enddo - -! grid%sm (1=water, 0=land) -! grid%landmask(0=water, 1=land) - - - write(message,*) 'landmask into process_percent_cat_new' - - CALL wrf_debug(1,message) - do J=JTE,JTS,-(((JTE-JTS)/20)+1) - write(message,641) (grid%landmask(I,J),I=ITS,min(ITE,IDE-1),((ITE-ITS)/15)+1) - CALL wrf_debug(1,message) - enddo - 641 format(25(f3.0,1x)) - - CALL process_percent_cat_new ( grid%landmask , & - grid%landusef , grid%soilctop , grid%soilcbot , & - grid%isltyp , grid%ivgtyp , & - num_veg_cat , num_soil_top_cat , num_soil_bot_cat , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte , & - model_config_rec%iswater(grid%id) ) - - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - grid%vegcat(i,j) = grid%ivgtyp(i,j) - grid%soilcat(i,j) = grid%isltyp(i,j) - END DO - END DO - - ELSE - - ! Do we have dominant soil and veg data from the input already? - - IF ( grid%soilcat(its,jts) .GT. 0.5 ) THEN - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - grid%isltyp(i,j) = NINT( grid%soilcat(i,j) ) - END DO - END DO - END IF - IF ( grid%vegcat(its,jts) .GT. 0.5 ) THEN - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - grid%ivgtyp(i,j) = NINT( grid%vegcat(i,j) ) - END DO - END DO - END IF - - ENDIF - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - IF (grid%sice(I,J) .lt. 0.1) THEN - IF (grid%landmask(I,J) .gt. 0.5 .and. grid%sm(I,J) .gt. 0.5) THEN - write(message,*) 'land mask and grid%sm both > 0.5: ', & - I,J,grid%landmask(I,J),grid%sm(I,J) - CALL wrf_message(message) - grid%sm(I,J)=0. - ELSEIF (grid%landmask(I,J) .lt. 0.5 .and. grid%sm(I,J) .lt. 0.5) THEN - write(message,*) 'land mask and grid%sm both < 0.5: ', & - I,J, grid%landmask(I,J),grid%sm(I,J) - CALL wrf_message(message) - grid%sm(I,J)=1. - ENDIF - ELSE - IF (grid%landmask(I,J) .gt. 0.5 .and. grid%sm(I,J)+grid%sice(I,J) .gt. 0.9) then - write(message,*) 'landmask says LAND, sm/sice say SEAICE: ', I,J - ENDIF - ENDIF - - ENDDO - ENDDO - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - if (grid%sice(I,J) .gt. 0.9) then - grid%isltyp(I,J)=16 - grid%ivgtyp(I,J)=24 - endif - - ENDDO - ENDDO - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - if (grid%sm(I,J) .lt. 0.5) then - grid%sst(I,J)=0. - endif - - if (grid%sm(I,J) .gt. 0.5) then - if (grid%sst(I,J) .lt. 0.1) then - grid%sst(I,J)=grid%nmm_tsk(I,J) - endif - grid%nmm_tsk(I,J)=0. - endif - - IF ( (grid%nmm_tsk(I,J)+grid%sst(I,J)) .lt. 200. .or. & - (grid%nmm_tsk(I,J)+grid%sst(I,J)) .gt. 350. ) THEN - write(message,*) 'TSK, sst trouble at : ', I,J - CALL wrf_message(message) - write(message,*) 'sm, nmm_tsk,sst ', grid%sm(I,J),grid%nmm_tsk(I,J),grid%sst(I,J) - CALL wrf_message(message) - ENDIF - - ENDDO - ENDDO - - write(message,*) 'grid%sm' - CALL wrf_message(message) - - DO J=min(jde-1,jte),jts,-((jte-jts)/15+1) - write(message,635) (grid%sm(i,J),I=its,ite,((ite-its)/10)+1) - CALL wrf_message(message) - END DO - - write(message,*) 'sst/nmm_tsk' - CALL wrf_debug(10,message) - DO J=min(jde-1,jte),jts,-((jte-jts)/15+1) - write(message,635) (grid%sst(I,J)+grid%nmm_tsk(I,J),I=ITS,min(ide-1,ite),((ite-its)/10)+1) - CALL wrf_debug(10,message) - END DO - - 635 format(20(f5.1,1x)) - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - IF ( ( grid%landmask(i,j) .LT. 0.5 ) .AND. ( flag_sst .EQ. 1 ) ) THEN - grid%soiltb(i,j) = grid%sst(i,j) - ELSE IF ( grid%landmask(i,j) .GT. 0.5 ) THEN - grid%soiltb(i,j) = grid%nmm_tsk(i,j) - END IF - END DO - END DO - -! END IF - - ! Land use categories, dominant soil and vegetation types (if available). - -! allocate(grid%lu_index(ims:ime,jms:jme)) - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - grid%lu_index(i,j) = grid%ivgtyp(i,j) - END DO - END DO - - if (flag_sst .eq. 1) log_flag_sst=.true. - if (flag_sst .eq. 0) log_flag_sst=.false. - - write(message,*) 'st_input dimensions: ', size(st_input,dim=1), & - size(st_input,dim=2),size(st_input,dim=3) - CALL wrf_debug(100,message) - -! write(message,*) 'maxval st_input(1): ', maxval(st_input(:,1,:)) -! CALL wrf_message(message) -! write(message,*) 'maxval st_input(2): ', maxval(st_input(:,2,:)) -! CALL wrf_message(message) -! write(message,*) 'maxval st_input(3): ', maxval(st_input(:,3,:)) -! CALL wrf_message(message) -! write(message,*) 'maxval st_input(4): ', maxval(st_input(:,4,:)) -! CALL wrf_message(message) - -! ============================================================= - - IF (.NOT. ALLOCATED(TG_ALT))ALLOCATE(TG_ALT(grid%sm31:grid%em31,jms:jme)) - - TPH0=TPH0D*DTR - WBD=-(((ide-1)-1)*grid%dlmd) - WB= WBD*DTR - SBD=-(((jde-1)/2)*grid%dphd) - SB= SBD*DTR - DLM=grid%dlmd*DTR - DPH=grid%dphd*DTR - TDLM=DLM+DLM - TDPH=DPH+DPH - WBI=WB+TDLM - SBI=SB+TDPH - EBI=WB+(ide-2)*TDLM - ANBI=SB+(jde-2)*DPH - STPH0=SIN(TPH0) - CTPH0=COS(TPH0) - TSPH=3600./GRID%DT - DO J=JTS,min(JTE,JDE-1) - TLM=WB-TDLM+MOD(J,2)*DLM !For velocity points on the E grid - TPH=SB+float(J-1)*DPH - STPH=SIN(TPH) - CTPH=COS(TPH) - DO I=ITS,MIN(ITE,IDE-1) - - if (I .eq. ITS) THEN - TLM=TLM+TDLM*ITS - else - TLM=TLM+TDLM - endif - - TERM1=(STPH0*CTPH*COS(TLM)+CTPH0*STPH) - FP=TWOM*(TERM1) - grid%f(I,J)=0.5*GRID%DT*FP - ENDDO - ENDDO - DO J=JTS,min(JTE,JDE-1) - TLM=WB-TDLM+MOD(J+1,2)*DLM !For mass points on the E grid - TPH=SB+float(J-1)*DPH - STPH=SIN(TPH) - CTPH=COS(TPH) - DO I=ITS,MIN(ITE,IDE-1) - - if (I .eq. ITS) THEN - TLM=TLM+TDLM*ITS - else - TLM=TLM+TDLM - endif - - TERM1=(STPH0*CTPH*COS(TLM)+CTPH0*STPH) - TERM1=MIN(TERM1,1.0D0) - TERM1=MAX(TERM1,-1.0D0) - APH=ASIN(TERM1) - TG_ALT(I,J)=TG0+TGA*COS(APH)-grid%fis(I,J)/3333. - ENDDO - ENDDO - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) -! IF ( ( grid%landmask(i,j) .LT. 0.5 ) .AND. ( flag_sst .EQ. 1 ) .AND. & -! grid%sice(I,J) .eq. 0. ) THEN -! grid%tg(i,j) = grid%sst(i,j) -! ELSEIF (grid%sice(I,J) .eq. 1) THEN -! grid%tg(i,j) = 271.16 -! END IF - - if (grid%tg(I,J) .lt. 200.) then ! only use default TG_ALT definition if - ! not getting TGROUND from grid%si - grid%tg(I,J)=TG_ALT(I,J) - endif - - if (grid%tg(I,J) .lt. 200. .or. grid%tg(I,J) .gt. 320.) then - write(message,*) 'problematic grid%tg point at : ', I,J - CALL wrf_message( message ) - endif - - adum2d(i,j)=grid%nmm_tsk(I,J)+grid%sst(I,J) - - END DO - END DO - - DEALLOCATE(TG_ALT) - - write(message,*) 'call process_soil_real with num_st_levels_input: ', num_st_levels_input - CALL wrf_message( message ) - -! ============================================================= - - CALL process_soil_real ( adum2d, grid%tg , & - grid%landmask, grid%sst, & - st_input, sm_input, sw_input, & - st_levels_input , sm_levels_input , & - sw_levels_input , & - grid%sldpth , grid%dzsoil , grid%stc , grid%smc , grid%sh2o, & - flag_sst , flag_soilt000, flag_soilm000, & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte , & - model_config_rec%sf_surface_physics(grid%id) , & - model_config_rec%num_soil_layers , & - model_config_rec%real_data_init_type , & - num_st_levels_input , num_sm_levels_input , & - num_sw_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , & - num_sw_levels_alloc ) - -! ============================================================= - -! Minimum soil values, residual, from RUC LSM scheme. -! For input from Noah and using -! RUC LSM scheme, this must be subtracted from the input -! total soil moisture. For input RUC data and using the Noah LSM scheme, -! this value must be added to the soil moisture_input. - - lqmi(1:num_soil_top_cat) = & - (/0.045, 0.057, 0.065, 0.067, 0.034, 0.078, 0.10, & - 0.089, 0.095, 0.10, 0.070, 0.068, 0.078, 0.0, & - 0.004, 0.065 /) !dusan , 0.020, 0.004, 0.008 /) - -! At the initial time we care about values of soil moisture and temperature, -! other times are ignored by the model, so we ignore them, too. - - account_for_zero_soil_moisture : SELECT CASE ( model_config_rec%sf_surface_physics(grid%id) ) - - CASE ( LSMSCHEME ) - iicount = 0 - IF ( FLAG_SM000010 .EQ. 1 ) THEN - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - IF ((grid%landmask(i,j).gt.0.5) .and. (grid%stc(i,1,j) .gt. 200) .and. & - (grid%stc(i,1,j) .lt. 400) .and. (grid%smc(i,1,j) .lt. 0.005)) then - write(message,*) 'Noah > Noah: bad soil moisture at i,j = ',i,j,grid%smc(i,:,j) - CALL wrf_message(message) - iicount = iicount + 1 - grid%smc(i,:,j) = 0.005 - END IF - END DO - END DO - IF ( iicount .GT. 0 ) THEN - write(message,*) 'Noah -> Noah: total number of small soil moisture locations= ',& - iicount - CALL wrf_message(message) - END IF - ELSE IF ( FLAG_SOILM000 .EQ. 1 ) THEN - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - grid%smc(i,:,j) = grid%smc(i,:,j) + lqmi(grid%isltyp(i,j)) - END DO - END DO - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - IF ((grid%landmask(i,j).gt.0.5) .and. (grid%stc(i,1,j) .gt. 200) .and. & - (grid%stc(i,1,j) .lt. 400) .and. (grid%smc(i,1,j) .lt. 0.004)) then - write(message,*) 'RUC -> Noah: bad soil moisture at i,j = ' & - ,i,j,grid%smc(i,:,j) - CALL wrf_message(message) - iicount = iicount + 1 - grid%smc(i,:,j) = 0.004 - END IF - END DO - END DO - IF ( iicount .GT. 0 ) THEN - write(message,*) 'RUC -> Noah: total number of small soil moisture locations = ',& - iicount - CALL wrf_message(message) - END IF - END IF - CASE ( RUCLSMSCHEME ) - iicount = 0 - IF ( FLAG_SM000010 .EQ. 1 ) THEN - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - grid%smc(i,:,j) = MAX ( grid%smc(i,:,j) - lqmi(grid%isltyp(i,j)) , 0. ) - END DO - END DO - ELSE IF ( FLAG_SOILM000 .EQ. 1 ) THEN - ! no op - END IF - - END SELECT account_for_zero_soil_moisture - -!!! zero out grid%nmm_tsk at water points again - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - if (grid%sm(I,J) .gt. 0.5) then - grid%nmm_tsk(I,J)=0. - endif - END DO - END DO - -!! check on grid%stc - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - IF (grid%sice(I,J) .gt. 0.9) then - DO L = 1, grid%num_soil_layers - grid%stc(I,L,J)=271.16 ! grid%tg value used by Eta/NMM - END DO - END IF - - IF (grid%sm(I,J) .gt. 0.9) then - DO L = 1, grid%num_soil_layers - grid%stc(I,L,J)=273.16 ! grid%tg value used by Eta/NMM - END DO - END IF - - END DO - END DO - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - if (grid%sm(I,J) .lt. 0.1 .and. grid%stc(I,1,J) .lt. 0.1) THEN - write(message,*) 'troublesome grid%sm,grid%stc,grid%smc value: ', I,J,grid%sm(I,J), grid%stc(I,1,J),grid%smc(I,1,J) - CALL wrf_message(message) - do JJ=J-1,J+1 - do L=1, grid%num_soil_layers - do II=I-1,I+1 - - if (II .ge. its .and. II .le. MIN(ide-1,ite) .and. & - JJ .ge. jts .and. JJ .le. MIN(jde-1,jte)) then - - grid%stc(I,L,J)=amax1(grid%stc(I,L,J),grid%stc(II,L,JJ)) - cur_smc=grid%smc(I,L,J) - - if ( grid%smc(II,L,JJ) .gt. 0.005 .and. grid%smc(II,L,JJ) .lt. 1.0) then - aposs_smc=grid%smc(II,L,JJ) - - if ( cur_smc .eq. 0 ) then - cur_smc=aposs_smc - grid%smc(I,L,J)=cur_smc - else - cur_smc=amin1(cur_smc,aposs_smc) - cur_smc=amin1(cur_smc,aposs_smc) - grid%smc(I,L,J)=cur_smc - endif - endif - - endif ! bounds check - - enddo - enddo - enddo - write(message,*) 'grid%stc, grid%smc(1) now: ', grid%stc(I,1,J),grid%smc(I,1,J) - CALL wrf_message(message) - endif - - if (grid%stc(I,1,J) .lt. 0.1) then - write(message,*) 'QUITTING DUE TO STILL troublesome grid%stc value: ', I,J, grid%stc(I,1,J),grid%smc(I,1,J) - call wrf_error_fatal(message) - endif - - ENDDO - ENDDO - -!hardwire soil stuff for time being - -! RTDPTH=0. -! RTDPTH(1)=0.1 -! RTDPTH(2)=0.3 -! RTDPTH(3)=0.6 - -! grid%sldpth=0. -! grid%sldpth(1)=0.1 -! grid%sldpth(2)=0.3 -! grid%sldpth(3)=0.6 -! grid%sldpth(4)=1.0 - -!!! main body of nmm_specific starts here -! - do J=jts,min(jte,jde-1) - do I=its,min(ite,ide-1) - grid%res(I,J)=1. - enddo - enddo - -!! grid%hbm2 - - grid%hbm2=0. - - do J=jts,min(jte,jde-1) - do I=its,min(ite,ide-1) - - IF ( (J .ge. 3 .and. J .le. (jde-1)-2) .AND. & - (I .ge. 2 .and. I .le. (ide-1)-2+mod(J,2)) ) THEN - grid%hbm2(I,J)=1. - ENDIF - enddo - enddo - -!! grid%hbm3 - grid%hbm3=0. - -!! LOOP OVER LOCAL DIMENSIONS - - do J=jts,min(jte,jde-1) - grid%ihwg(J)=mod(J+1,2)-1 - IF (J .ge. 4 .and. J .le. (jde-1)-3) THEN - IHL=(ids+1)-grid%ihwg(J) - IHH=(ide-1)-2 - do I=its,min(ite,ide-1) - IF (I .ge. IHL .and. I .le. IHH) grid%hbm3(I,J)=1. - enddo - ENDIF - enddo - -!! grid%vbm2 - - grid%vbm2=0. - - do J=jts,min(jte,jde-1) - do I=its,min(ite,ide-1) - - IF ( (J .ge. 3 .and. J .le. (jde-1)-2) .AND. & - (I .ge. 2 .and. I .le. (ide-1)-1-mod(J,2)) ) THEN - - grid%vbm2(I,J)=1. - - ENDIF - - enddo - enddo - -!! grid%vbm3 - - grid%vbm3=0. - - do J=jts,min(jte,jde-1) - do I=its,min(ite,ide-1) - - IF ( (J .ge. 4 .and. J .le. (jde-1)-3) .AND. & - (I .ge. 3-mod(J,2) .and. I .le. (ide-1)-2) ) THEN - grid%vbm3(I,J)=1. - ENDIF - - enddo - enddo - - COAC=model_config_rec%coac(grid%id) - CODAMP=model_config_rec%codamp(grid%id) - - DTAD=1.0 -! IDTCF=DTCF, IDTCF=4 - DTCF=4.0 ! used? - - grid%dy_nmm=ERAD*DPH - grid%cpgfv=-GRID%DT/(48.*grid%dy_nmm) - grid%en= GRID%DT/( 4.*grid%dy_nmm)*DTAD - grid%ent=GRID%DT/(16.*grid%dy_nmm)*DTAD - - DO J=jts,nnyp - KHL2(J)=(IDE-1)*(J-1)-(J-1)/2+2 - KVL2(J)=(IDE-1)*(J-1)-J/2+2 - KHH2(J)=(IDE-1)*J-J/2-1 - KVH2(J)=(IDE-1)*J-(J+1)/2-1 - ENDDO - - TPH=SB-DPH - - DO J=jts,min(jte,jde-1) - TPH=SB+float(J-1)*DPH - DXP=ERAD*DLM*COS(TPH) - DXJ(J)=DXP - WPDARJ(J)=-W_NMM * & - ((ERAD*DLM*AMIN1(COS(ANBI),COS(SBI)))**2+grid%dy_nmm**2)/ & - (GRID%DT*32.*DXP*grid%dy_nmm) - - CPGFUJ(J)=-GRID%DT/(48.*DXP) - CURVJ(J)=.5*GRID%DT*TAN(TPH)/ERAD - FCPJ(J)=GRID%DT/(CP*192.*DXP*grid%dy_nmm) - FDIVJ(J)=1./(12.*DXP*grid%dy_nmm) -! EMJ(J)= GRID%DT/( 4.*DXP)*DTAD -! EMTJ(J)=GRID%DT/(16.*DXP)*DTAD - FADJ(J)=-GRID%DT/(48.*DXP*grid%dy_nmm)*DTAD - ACDT=GRID%DT*SQRT((ERAD*DLM*AMIN1(COS(ANBI),COS(SBI)))**2+grid%dy_nmm**2) - CDDAMP=CODAMP*ACDT - HDACJ(J)=COAC*ACDT/(4.*DXP*grid%dy_nmm) - DDMPUJ(J)=CDDAMP/DXP - DDMPVJ(J)=CDDAMP/grid%dy_nmm - ENDDO - - DO J=JTS,min(JTE,JDE-1) - TLM=WB-TDLM+MOD(J,2)*DLM - TPH=SB+float(J-1)*DPH - STPH=SIN(TPH) - CTPH=COS(TPH) - DO I=ITS,MIN(ITE,IDE-1) - - if (I .eq. ITS) THEN - TLM=TLM+TDLM*ITS - else - TLM=TLM+TDLM - endif - - FP=TWOM*(CTPH0*STPH+STPH0*CTPH*COS(TLM)) - grid%f(I,J)=0.5*GRID%DT*FP - - ENDDO - ENDDO - -! --------------DERIVED VERTICAL GRID CONSTANTS-------------------------- - - grid%ef4t=.5*GRID%DT/CP - grid%f4q = -GRID%DT*DTAD - grid%f4d =-.5*GRID%DT*DTAD - - DO L=KDS,KDE-1 - grid%rdeta(L)=1./grid%deta(L) - grid%f4q2(L)=-.25*GRID%DT*DTAD/grid%deta(L) - ENDDO - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - grid%dx_nmm(I,J)=DXJ(J) - grid%wpdar(I,J)=WPDARJ(J)*grid%hbm2(I,J) - grid%cpgfu(I,J)=CPGFUJ(J)*grid%vbm2(I,J) - grid%curv(I,J)=CURVJ(J)*grid%vbm2(I,J) - grid%fcp(I,J)=FCPJ(J)*grid%hbm2(I,J) - grid%fdiv(I,J)=FDIVJ(J)*grid%hbm2(I,J) - grid%fad(I,J)=FADJ(J) - grid%hdacv(I,J)=HDACJ(J)*grid%vbm2(I,J) - grid%hdac(I,J)=HDACJ(J)*1.25*grid%hbm2(I,J) - ENDDO - ENDDO - - DO J=JTS, MIN(JDE-1,JTE) - - IF (J.LE.5.OR.J.GE.(JDE-1)-4) THEN - - KHH=(IDE-1)-2+MOD(J,2) ! KHH is global...loop over I that have - DO I=ITS,MIN(IDE-1,ITE) - IF (I .ge. 2 .and. I .le. KHH) THEN - grid%hdac(I,J)=grid%hdac(I,J)* DFC - ENDIF - ENDDO - - ELSE - - KHH=2+MOD(J,2) - DO I=ITS,MIN(IDE-1,ITE) - IF (I .ge. 2 .and. I .le. KHH) THEN - grid%hdac(I,J)=grid%hdac(I,J)* DFC - ENDIF - ENDDO - - KHH=(IDE-1)-2+MOD(J,2) - - DO I=ITS,MIN(IDE-1,ITE) - IF (I .ge. (IDE-1)-2 .and. I .le. KHH) THEN - grid%hdac(I,J)=grid%hdac(I,J)* DFC - ENDIF - ENDDO - ENDIF - ENDDO - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - grid%ddmpu(I,J)=DDMPUJ(J)*grid%vbm2(I,J) - grid%ddmpv(I,J)=DDMPVJ(J)*grid%vbm2(I,J) - grid%hdacv(I,J)=grid%hdacv(I,J)*grid%vbm2(I,J) - ENDDO - ENDDO -! --------------INCREASING DIFFUSION ALONG THE BOUNDARIES---------------- - - DO J=JTS,MIN(JDE-1,JTE) - IF (J.LE.5.OR.J.GE.JDE-1-4) THEN - KVH=(IDE-1)-1-MOD(J,2) - DO I=ITS,min(IDE-1,ITE) - IF (I .ge. 2 .and. I .le. KVH) THEN - grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC - grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC - grid%hdacv(I,J)=grid%hdacv(I,J)* DFC - ENDIF - ENDDO - ELSE - KVH=3-MOD(J,2) - DO I=ITS,min(IDE-1,ITE) - IF (I .ge. 2 .and. I .le. KVH) THEN - grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC - grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC - grid%hdacv(I,J)=grid%hdacv(I,J)* DFC - ENDIF - ENDDO - KVH=(IDE-1)-1-MOD(J,2) - DO I=ITS,min(IDE-1,ITE) - IF (I .ge. IDE-1-2 .and. I .le. KVH) THEN - grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC - grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC - grid%hdacv(I,J)=grid%hdacv(I,J)* DFC - ENDIF - ENDDO - ENDIF - ENDDO - - write(message,*) 'grid%stc(1)' - CALL wrf_message(message) - DO J=min(jde-1,jte),jts,-((jte-jts)/15+1) - write(message,635) (grid%stc(I,1,J),I=its,min(ite,ide-1),(ite-its)/12+1) - CALL wrf_message(message) - ENDDO - - write(message,*) 'grid%smc(1)' - CALL wrf_message(message) - DO J=min(jde-1,jte),jts,-((jte-jts)/15+1) - write(message,635) (grid%smc(I,1,J),I=its,min(ite,ide-1),(ite-its)/12+1) - CALL wrf_message(message) - ENDDO - - DO j = jts, MIN(jde-1,jte) - DO i= ITS, MIN(IDE-1,ITE) - - if (grid%sm(I,J) .lt. 0.1 .and. grid%smc(I,1,J) .gt. 0.5 .and. grid%sice(I,J) .lt. 0.1) then - write(message,*) 'very moist on land point: ', I,J,grid%smc(I,1,J) - CALL wrf_debug(10,message) - endif - - enddo - enddo - -!!! compute grid%emt, grid%em on global domain, and only on task 0. - -#ifdef DM_PARALLEL - IF (wrf_dm_on_monitor()) THEN !!!! NECESSARY TO LIMIT THIS TO TASK ZERO? -#else - IF (JDS .eq. JTS) THEN !! set unfailable condition for serial job -#endif - - ALLOCATE(EMJ(JDS:JDE-1),EMTJ(JDS:JDE-1)) - - DO J=JDS,JDE-1 - TPH=SB+float(J-1)*DPH - DXP=ERAD*DLM*COS(TPH) - EMJ(J)= GRID%DT/( 4.*DXP)*DTAD - EMTJ(J)=GRID%DT/(16.*DXP)*DTAD - ENDDO - - JA=0 - DO 161 J=3,5 - JA=JA+1 - KHLA(JA)=2 - KHHA(JA)=(IDE-1)-1-MOD(J+1,2) - 161 grid%emt(JA)=EMTJ(J) - DO 162 J=(JDE-1)-4,(JDE-1)-2 - JA=JA+1 - KHLA(JA)=2 - KHHA(JA)=(IDE-1)-1-MOD(J+1,2) - 162 grid%emt(JA)=EMTJ(J) - DO 163 J=6,(JDE-1)-5 - JA=JA+1 - KHLA(JA)=2 - KHHA(JA)=2+MOD(J,2) - 163 grid%emt(JA)=EMTJ(J) - DO 164 J=6,(JDE-1)-5 - JA=JA+1 - KHLA(JA)=(IDE-1)-2 - KHHA(JA)=(IDE-1)-1-MOD(J+1,2) - 164 grid%emt(JA)=EMTJ(J) - -! --------------SPREADING OF UPSTREAM VELOCITY-POINT ADVECTION FACTOR---- - - JA=0 - DO 171 J=3,5 - JA=JA+1 - KVLA(JA)=2 - KVHA(JA)=(IDE-1)-1-MOD(J,2) - 171 grid%em(JA)=EMJ(J) - DO 172 J=(JDE-1)-4,(JDE-1)-2 - JA=JA+1 - KVLA(JA)=2 - KVHA(JA)=(IDE-1)-1-MOD(J,2) - 172 grid%em(JA)=EMJ(J) - DO 173 J=6,(JDE-1)-5 - JA=JA+1 - KVLA(JA)=2 - KVHA(JA)=2+MOD(J+1,2) - 173 grid%em(JA)=EMJ(J) - DO 174 J=6,(JDE-1)-5 - JA=JA+1 - KVLA(JA)=(IDE-1)-2 - KVHA(JA)=(IDE-1)-1-MOD(J,2) - 174 grid%em(JA)=EMJ(J) - - 696 continue - ENDIF ! wrf_dm_on_monitor/serial job - - call NMM_SH2O(IMS,IME,JMS,JME,ITS,NNXP,JTS,NNYP,grid%num_soil_layers,grid%isltyp, & - grid%sm,grid%sice,grid%stc,grid%smc,grid%sh2o) - -!! must be a better place to put this, but will eliminate "phantom" -!! wind points here (no wind point on eastern boundary of odd numbered rows) - - IF ( abs(IDE-1-ITE) .eq. 1 ) THEN ! along eastern boundary - write(message,*) 'zero phantom winds' - CALL wrf_message(message) - DO K=1,KDE-1 - DO J=JDS,JDE-1,2 - IF (J .ge. JTS .and. J .le. JTE) THEN - grid%u(IDE-1,J,K)=0. - grid%v(IDE-1,J,K)=0. - ENDIF - ENDDO - ENDDO - ENDIF - - 969 continue - - DO j = jms, jme - DO i = ims, ime - fisx=max(grid%fis(i,j),0.) - grid%z0(I,J) =grid%sm(I,J)*Z0SEA+(1.-grid%sm(I,J))* & - & (0.*Z0MAX+FISx *FCM+Z0LAND) - ENDDO - ENDDO - - write(message,*) 'grid%z0 over memory, leaving module_initialize_real' - CALL wrf_message(message) - DO J=JME,JMS,-((JME-JMS)/20+1) - write(message,635) (grid%z0(I,J),I=IMS,IME,(IME-IMS)/14+1) - CALL wrf_message(message) - ENDDO - - - endif ! on first_time check - - write(message,*) 'leaving init_domain_nmm' - CALL wrf_message( TRIM(message) ) -! - write(message,*)'STUFF MOVED TO REGISTRY:',grid%IDTAD, & - & grid%NSOIL,grid%NRADL,grid%NRADS,grid%NPHS,grid%NCNVC,grid%sigma - CALL wrf_message( TRIM(message) ) -#if ( HWRF == 1 ) -!========================================================================================= -! gopal's doing for ocean coupling. Produce a high resolution grid for the entire domain -!========================================================================================= - - if(internal_time_loop.eq.1) then !Kwon's doing - - NDLMD=grid%dlmd/3. - NDPHD=grid%dphd/3. - NIDE=3*(IDE-1)-2 - NJDE=3*(JDE-1)-2 - NWBD= WBD ! + (ILOC -1)*2.*grid%dlmd + MOD(JLOC+1,2)*grid%dlmd - NSBD= SBD ! + (JLOC -1)*grid%dphd - - grid%sbd0=sbd - grid%wbd0=wbd - -#if ( HWRF == 1 ) - CALL EARTH_LATLON ( grid%HLAT,grid%HLON,grid%VLAT,grid%VLON, & !output - grid%DLMD,grid%DPHD,WBD,SBD, & !inputs - tph0d,tlm0d, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - call make_coupler_fort65(grid,NDLMD,NDPHD,NWBD,NSBD,& - NIDE,NJDE,IDE-1,JDE-1,tph0d,tlm0d) -#endif - endif !Kwon's doing - -!================================================================================== -! end gopal's doing for ocean coupling. -!================================================================================== -#endif - -!#define COPY_OUT -!#include "scalar_derefs.inc" - RETURN - - END SUBROUTINE init_domain_nmm - - real function greatarc(lat1,lon1,lat2,lon2) - ! greatarc -- gets the great arc distance (along-Earth distance) - ! between two points. The earth radius used in the - ! calculation is the average of the radius at the two - ! points. - ! lat1,lon1 -- the first point's latitude - ! lat2,lon2 -- the second point's latitude - ! returns -- the distance in meters. - implicit none - real, parameter :: Requator = 6378137.0000 - real, parameter :: pi = 3.141592653589793238 - real, parameter :: flattening = 1/298.257223563 - real, parameter :: DEGRAD = pi/180 - real, intent(in) :: lat1,lon1, lat2,lon2 - real :: rlat1,rlon1, rlat2,rlon2 - real :: Rearth1,Rearth2 - real, parameter :: deg2rad=DEGRAD - real, parameter :: flattening_inv=1/flattening - - rlat1=lat1*deg2rad ; rlon1=lon1*deg2rad - rlat2=lat2*deg2rad ; rlon2=lon2*deg2rad - - Rearth1=Requator*(1-sin(rlat1)**2/flattening_inv) - Rearth2=Requator*(1-sin(rlat2)**2/flattening_inv) - - greatarc=(Rearth1+Rearth2)*asin(min(1.0,sqrt( & - sin((rlat1-rlat2)/2)**2+ & - cos(rlat1)*cos(rlat2)*sin((rlon1-rlon2)/2)**2))) - end function greatarc - -#if ( HWRF == 1 ) - SUBROUTINE make_coupler_fort65(grid,& - NDLMD,NDPHD,NWBD,NSBD,& - NIDE,NJDE,PIFE,PJFE,tph0d,tlm0d) - use module_dm,only: local_communicator - implicit none -#if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) ) - include 'mpif.h' -#else - integer, parameter :: MPI_UNDEFINED = -1 -#endif - type(domain), intent(in) :: grid - INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13) - REAL(KIND=KNUM), DIMENSION(:,:), ALLOCATABLE :: NHLAT,NHLON,NVLAT,NVLON - REAL :: NHLAT_temp,NHLON_temp - REAL, DIMENSION(:,:), ALLOCATABLE :: HRES_SM, & - HBWGT1, HBWGT2, HBWGT3, HBWGT4 - INTEGER, DIMENSION(:,:), ALLOCATABLE :: IIH, JJH, HNEAR_I,HNEAR_J,CENFLAG - REAL, INTENT(IN) :: NDLMD,NDPHD,NWBD,NSBD,tph0d,tlm0d - INTEGER, INTENT(IN) :: NIDE,NJDE,PIFE,PJFE - INTEGER :: ci,cj, ni,nj, bad - character(len=255) :: message - INTEGER :: count, bigcount, noncount, ierr - REAL :: dlon, mindist,maxdist,dist,maxweight - real, dimension(:,:,:), allocatable :: bigsm,bighlat,bighlon - integer :: & - pids, pide, pjds, pjde, pkds, pkde, & - pims, pime, pjms, pjme, pkms, pkme, & - pits, pite, pjts, pjte, pkts, pkte - logical, external :: wrf_dm_on_monitor - - CALL get_ijk_from_grid ( grid , & - pids, pide, pjds, pjde, pkds, pkde, & - pims, pime, pjms, pjme, pkms, pkme, & - pits, pite, pjts, pjte, pkts, pkte) - - if(pife/=pide-1 .or. pjfe/=pjde-1) then - 38 format('Caller sent wrong dimensions: ',I0,'x',I0, & - ' instead of ',I0,'x',I0) - write(message,38) pife,pjfe,pide-1,pjde-1 - call wrf_error_fatal(message) - endif - if(wrf_dm_on_monitor()) then - allocate(bigsm(pids:pide,pjds:pjde,1), & - bighlat(pids:pide,pjds:pjde,1), & - bighlon(pids:pide,pjds:pjde,1)) - else - allocate(bigsm(1,1,1),bighlat(1,1,1),bighlon(1,1,1)) - endif - - call wrf_patch_to_global_real(& - grid%sm,bigsm,grid%domdesc,'xy','xy',& - pids, pide, pjds, pjde, 1, 1, & - pims, pime, pjms, pjme, 1, 1, & - pits, pite, pjts, pjte, 1, 1) - - if(.not.wrf_dm_on_monitor()) then - call MPI_Barrier(local_communicator,ierr) - deallocate(bigsm,bighlat,bighlon) - return - else - call wrf_debug(100,'Working on fort.65 stuff.') - endif - - allocate(NHLAT(nide,njde),NHLON(nide,njde),NVLAT(nide,njde)) - allocate(NVLON(nide,njde),HRES_SM(nide,njde)) - allocate(IIH(nide,njde),JJH(nide,njde),HBWGT1(nide,njde)) - allocate(HBWGT2(nide,njde),HBWGT3(nide,njde),HBWGT4(nide,njde)) - allocate(HNEAR_I(nide,njde),HNEAR_J(nide,njde),CENFLAG(nide,njde)) - - CALL EARTH_LATLON_r8 ( NHLAT,NHLON,NVLAT,NVLON, & ! rotated lat,lon at H&V - NDLMD,NDPHD,NWBD,NSBD, & ! resolution & SW corner - tph0d,tlm0d, & ! projection center - 1,NIDE+1,1,NJDE+1,1,1, & ! WRF domain size - 1,NIDE,1,NJDE,1,1, & ! memory size - 1,NIDE,1,NJDE,1,1 ) ! patch size - - HBWGT1=999 - HBWGT2=999 - HBWGT3=999 - HBWGT4=999 - CALL G2T2H_new( IIH,JJH, & ! output grid index in parent grid - HBWGT1,HBWGT2, & ! output weights in terms of - HBWGT3,HBWGT4, & ! parent grid - 1,1, & ! nest start I, J in parent domain - 3, & ! Ratio of parent and child grid ( - ! always = 3 for NMM) - 1,NIDE+1,1,NJDE+1,1,1, & ! WRF domain size - 1,NIDE,1,NJDE,1,1, & ! memory size - 1,NIDE,1,NJDE,1,1 ) ! patch size - - call INIT_HNEAR(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4,HNEAR_I,HNEAR_J,& - 1,NIDE+1,1,NJDE+1,1,1, & ! WRF domain size - 1,NIDE,1,NJDE,1,1, & ! memory size - 1,NIDE,1,NJDE,1,1 ) ! patch size - - ! Land sea mask nearest neighbor interpolation: - bad=0 - maxdist=-1e9 - mindist=1e9 - noncount=0 - bigcount=0 - count=0 - call wrf_debug(1,'Master enters big loop.') - do nj=1,njde - do ni=1,nide - ci=HNEAR_I(ni,nj) - cj=HNEAR_J(ni,nj) - if(ci<1 .or. ci>pife .or. cj<1 .or. cj>pjfe) then -33 format('ERROR: Invalid HNEAR nest ',I0,',',I0,' parent ',& - I0,',',I0,' outside parent bounds ',I0,',',I0) - write(message,33) ni,nj,ci,cj,pife,pjfe - call wrf_message(trim(message)) - bad=bad+1 - endif - HRES_SM(ni,nj)=bigSM(ci,cj,1) - maxweight=max(HBWGT1(ni,nj),HBWGT2(ni,nj),HBWGT3(ni,nj),HBWGT4(ni,nj)) - if(maxweight>0.9999 .and. maxweight<1.03) then - cenflag(ni,nj)=1 - NHLON_temp=NHLON(ni,nj) - NHLAT_temp=NHLAT(ni,nj) - dist=greatarc(bigHLAT(ci,cj,1),bigHLON(ci,cj,1),& - NHLAT_temp,NHLON_temp) - if(dist>100) then - bigcount=bigcount+1 - endif - mindist=min(dist,mindist) - maxdist=max(dist,maxdist) - count=count+1 - elseif(maxweight>=1.03) then - call wrf_error_fatal('Big weights.') - elseif(maxweight<0.03) then - call wrf_error_fatal('Zero weights.') - else - noncount=noncount+1 - cenflag(ni,nj)=0 - endif -! dlon=mod(3600.+180.+NHLON(ni,nj)-grid%HLON(ci,cj),360.)-180 -! if(dlon<0.004 .and. dlon>1e-3) then -! 44 format('Big nest-parent longitude difference: lat,lon at ',& -! 'Parent ',I0,',',I0,' ',F0.7,',',F0.7, & -! ' Nest ',I0,',',I0,' ',F0.7,',',F0.7) -! write(message,44) ci,cj,grid%HLAT(ci,cj),grid%HLON(ci,cj), & -! ni,nj,NHLAT(ni,nj),NHLON(ni,nj) -! call wrf_message(trim(message)) -! !bad=bad+1 -! endif - enddo - enddo -48 format('Dist min=',F0.7,' max=',F0.7,' count of >100m = ',I0,'/',I0,' skipping ',I0) - write(message,48) mindist,maxdist,bigcount,count,noncount - call wrf_message(message) - if(bad>0) then -55 format('Errors in coupler prep (bad count = ',I0,'). Aborting.') - write(message,55) bad - call wrf_error_fatal(message) - endif - - open(file='fort.65',unit=65,form='UNFORMATTED') - WRITE(65)NHLAT(1:NIDE,1:NJDE) - WRITE(65)NHLON(1:NIDE,1:NJDE) - WRITE(65)NVLAT(1:NIDE,1:NJDE) - WRITE(65)NVLON(1:NIDE,1:NJDE) - WRITE(65)HRES_SM(1:NIDE,1:NJDE) - close(65) - !WRITE(65)HNEAR_I(1:NIDE,1:NJDE) - !WRITE(65)HNEAR_J(1:NIDE,1:NJDE) - !WRITE(65)CENFLAG(1:NIDE,1:NJDE) - - deallocate(NHLAT,NHLON,NVLAT,NVLON,HRES_SM,IIH,JJH) - deallocate(HBWGT1,HBWGT2,HBWGT3,HBWGT4,HNEAR_I,HNEAR_J) - deallocate(bigsm,bighlat,bighlon) - - call MPI_Barrier(local_communicator,ierr) - END SUBROUTINE make_coupler_fort65 -#endif - -!------------------------------------------------------ - - SUBROUTINE define_nmm_vertical_coord ( LM, PTSGM, pt, pdtop,HYBLEVS, & - SG1,DSG1,SGML1, & - SG2,DSG2,SGML2,dfl, dfrlg ) - - IMPLICIT NONE - -! USE module_model_constants - -!!! certain physical parameters here probably don't need to be defined, as defined -!!! elsewhere within WRF. Done for initial testing purposes. - - INTEGER :: LM, LPT2, L - REAL :: PTSGM, pt, PL, PT2, pdtop - REAL :: RGOG, PSIG,PHYB,PHYBM - REAL, PARAMETER :: Rd = 287.04 ! J deg{-1} kg{-1} - REAL, PARAMETER :: CP=1004.6,GAMMA=.0065,PRF0=101325.,T0=288. - REAL, PARAMETER :: g=9.81 - - REAL, DIMENSION(LM) :: DSG,DSG1,DSG2 - REAL, DIMENSION(LM) :: SGML1,SGML2 - REAL, DIMENSION(LM+1) :: SG1,SG2,HYBLEVS,dfl,dfrlg - - CHARACTER(LEN=255) :: message - - LPT2=LM+1 - - write(message,*) 'pt= ', pt - CALL wrf_message(message) - - DO L=LM+1,1,-1 - pl=HYBLEVS(L)*(101325.-pt)+pt - if(pl.lt.ptSGm) LPT2=l - ENDDO - - IF(LPT2.lt.LM+1) THEN - pt2=HYBLEVS(LPT2)*(101325.-pt)+pt - ELSE - pt2=pt - ENDIF - - write(message,*) '*** Sigma system starts at ',pt2,' Pa, from level ',LPT2 - CALL wrf_message(message) - - pdtop=pt2-pt - - write(message,*) 'allocating DSG,DSG1,DSG2 as ', LM - CALL wrf_debug(10,message) - - DSG=-99. - - DO L=1,LM - DSG(L)=HYBLEVS(L)- HYBLEVS(L+1) - ENDDO - - DSG1=0. - DSG2=0. - - DO L=LM,1,-1 - - IF(L.ge.LPT2) then - DSG1(L)=DSG(L) - ELSE - DSG2(L)=DSG(L) - ENDIF - - ENDDO - - SGML1=-99. - SGML2=-99. - - IF(LPT2.le.LM+1) THEN - - DO L=LM+1,LPT2,-1 - SG2(L)=0. - ENDDO - - DO L=LPT2,2,-1 - SG2(L-1)=SG2(L)+DSG2(L-1) - ENDDO - - DO L=LPT2-1,1,-1 - SG2(L)=SG2(L)/SG2(1) - ENDDO - SG2(1)=1. - - DO L=LPT2-1,1,-1 - DSG2(L)=SG2(L)-SG2(L+1) - SGML2(l)=(SG2(l)+SG2(l+1))*0.5 - ENDDO - - ENDIF - - DO L=LM,LPT2,-1 - DSG2(L)=0. - SGML2(L)=0. - ENDDO - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - SG1(LM+1)=0. - - DO L=LM+1,LPT2,-1 - SG1(L-1)=SG1(L)+DSG1(L-1) - ENDDO - - DO L=LM,LPT2,-1 - SG1(L)=SG1(L)/SG1(LPT2-1) - ENDDO - - SG1(LPT2-1)=1. - - do l=LPT2-2,1,-1 - SG1(l)=1. - enddo - - - DO L=LM,LPT2,-1 - DSG1(L)=SG1(L)-SG1(L+1) - SGML1(L)=(SG1(L)+SG1(L+1))*0.5 - ENDDO - - DO L=LPT2-1,1,-1 - DSG1(L)=0. - SGML1(L)=1. - ENDDO - - 1000 format('l,hyblevs,psig,SG1,SG2,phyb,phybm') - 1100 format(' ',i4,f7.4,f10.2,2f7.4,2f10.2) - - write(message,1000) - CALL wrf_debug(100,message) - - do l=1,LM+1 - psig=HYBLEVS(L)*(101325.-pt)+pt - phyb=SG1(l)*pdtop+SG2(l)*(101325.-pdtop-pt)+pt - if(l.lt.LM+1) then - phybm=SGML1(l)*pdtop+SGML2(l)*(101325.-pdtop-pt)+pt - else - phybm=-99. - endif - - write(message,1100) l,HYBLEVS(L),psig & - ,SG1(l),SG2(l),phyb,phybm - CALL wrf_debug(100,message) - enddo - - - 632 format(f9.6) - - write(message,*) 'SG1' - CALL wrf_debug(100,message) - do L=LM+1,1,-1 - write(message,632) SG1(L) - CALL wrf_debug(100,message) - enddo - - write(message,*) 'SG2' - CALL wrf_debug(100,message) - do L=LM+1,1,-1 - write(message,632) SG2(L) - CALL wrf_debug(100,message) - enddo - - write(message,*) 'DSG1' - CALL wrf_debug(100,message) - do L=LM,1,-1 - write(message,632) DSG1(L) - CALL wrf_debug(100,message) - enddo - - write(message,*) 'DSG2' - CALL wrf_debug(100,message) - do L=LM,1,-1 - write(message,632) DSG2(L) - CALL wrf_debug(100,message) - enddo - - write(message,*) 'SGML1' - CALL wrf_debug(100,message) - do L=LM,1,-1 - write(message,632) SGML1(L) - CALL wrf_debug(100,message) - enddo - - write(message,*) 'SGML2' - CALL wrf_debug(100,message) - do L=LM,1,-1 - write(message,632) SGML2(L) - CALL wrf_debug(100,message) - enddo - - rgog=(rd*gamma)/g - DO L=1,LM+1 - dfl(L)=g*T0*(1.-((pt+SG1(L)*pdtop+SG2(L)*(101325.-pt2)) & - /101325.)**rgog)/gamma - dfrlg(L)=dfl(L)/g - write(message,*) 'L, dfl(L): ', L, dfl(L) - CALL wrf_debug(100,message) - ENDDO - - END SUBROUTINE define_nmm_vertical_coord - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - SUBROUTINE compute_nmm_surfacep ( TERRAIN_HGT_T, Z3D_IN, PRESS3D_IN, T3D_IN & - &, psfc_out,generic & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - - IMPLICIT NONE - - real, allocatable:: dum2d(:,:),DUM2DB(:,:) - - integer :: IDS,IDE,JDS,JDE,KDS,KDE - integer :: IMS,IME,JMS,JME,KMS,KME - integer :: ITS,ITE,JTS,JTE,KTS,KTE,Ilook,Jlook - integer :: I,J,II,generic,L,KINSERT,K,bot_lev,LL - integer :: IHE(JMS:JME),IHW(JMS:JME) - - real :: TERRAIN_HGT_T(IMS:IME,JMS:JME) - real :: Z3D_IN(IMS:IME,JMS:JME,generic) - real :: T3D_IN(IMS:IME,JMS:JME,generic) - real :: PRESS3D_IN(IMS:IME,JMS:JME,generic) - real :: PSFC_IN(IMS:IME,JMS:JME),TOPO_IN(IMS:IME,JMS:JME) - real :: psfc_out(IMS:IME,JMS:JME),rincr(IMS:IME,JMS:JME) - real :: dif1,dif2,dif3,dif4,dlnpdz,BOT_INPUT_HGT,BOT_INPUT_PRESS,dpdz,rhs - real :: zin(generic),pin(generic) - - character (len=255) :: message - - logical :: DEFINED_PSFC(IMS:IME,JMS:JME), DEFINED_PSFCB(IMS:IME,JMS:JME) - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - Ilook=25 - Jlook=25 - - DO j = JMS, JME - IHE(J)=MOD(J+1,2) - IHW(J)=IHE(J)-1 - ENDDO - - DO J=JMS,JME - DO I=IMS,IME - DEFINED_PSFC(I,J)=.FALSE. - DEFINED_PSFCB(I,J)=.FALSE. - IF (PRESS3D_IN(I,J,1) .ne. 200100.) THEN - PSFC_IN(I,J)=PRESS3D_IN(I,J,1) - TOPO_IN(I,J)=Z3D_IN(I,J,1) - ELSE - PSFC_IN(I,J)=PRESS3D_IN(I,J,2) - TOPO_IN(I,J)=Z3D_IN(I,J,2) - ENDIF - ENDDO - ENDDO - -! input surface pressure smoothing over the ocean - still needed for NAM? - - II_loop: do II=1,8 - - CYCLE II_loop - - do J=JTS+1,min(JTE,JDE-1)-1 - do I=ITS+1,min(ITE,IDE-1)-1 - rincr(I,J)=0. - - if (PSFC_IN(I,J) .gt. 100000. .and. & - PSFC_IN(I+IHE(J),J+1) .gt. 100000. .and. & - PSFC_IN(I+IHE(J),J-1) .gt. 100000. .and. & - PSFC_IN(I+IHW(J),J+1) .gt. 100000. .and. & - PSFC_IN(I+IHW(J),J-1) .gt. 100000. ) then - - dif1=abs(PSFC_IN(I,J)-PSFC_IN(I+IHE(J),J+1)) - dif2=abs(PSFC_IN(I,J)-PSFC_IN(I+IHE(J),J-1)) - dif3=abs(PSFC_IN(I,J)-PSFC_IN(I+IHW(J),J+1)) - dif4=abs(PSFC_IN(I,J)-PSFC_IN(I+IHW(J),J-1)) - - if (max(dif1,dif2,dif3,dif4) .lt. 200. .and. TOPO_IN(I,J).le. 0.5 .and. & - TOPO_IN(I+IHE(J),J+1) .le. 0.5 .and. & - TOPO_IN(I+IHW(J),J+1) .le. 0.5 .and. & - TOPO_IN(I+IHE(J),J-1) .le. 0.5 .and. & - TOPO_IN(I+IHW(J),J-1) .lt. 0.5) then - - rincr(I,J)=0.125*( 4.*PSFC_IN(I,J)+ & - PSFC_IN(I+IHE(J),J+1)+PSFC_IN(I+IHE(J),J-1)+ & - PSFC_IN(I+IHW(J),J+1)+PSFC_IN(I+IHW(J),J-1) ) & - - PSFC_IN(I,J) - -! if (rincr(I,J) .ne. 0 .and. abs(rincr(I,J)) .gt. 20.) then -! write(message,*) 'II, I,J,rincr: ', II, I,J,rincr(I,J) -! CALL wrf_message(message) -! endif - - endif - endif - - ENDDO - ENDDO - - DO J=JTS+1,min(JTE,JDE-1)-1 - DO I=ITS+1,min(ITE,IDE-1)-1 - PSFC_IN(I,J)=PSFC_IN(I,J) + rincr(I,J) - ENDDO - ENDDO - -! write(message,*) ' -------------------------------------------------- ' -! CALL wrf_message(message) - - end do II_loop - - ALLOCATE(DUM2D(IMS:IME,JMS:JME)) - - DO J=JMS,JME - DO I=IMS,IME - DUM2D(I,J)=-9. - END DO - END DO - - DO J=JTS,min(JTE,JDE-1) - I_loop: DO I=ITS,min(ITE,IDE-1) - - IF (PSFC_IN(I,J) .lt. 0.1) THEN - write(message,*) 'QUITTING BECAUSE I,J, PSFC_IN: ', I,J,PSFC_IN(I,J) - call wrf_error_fatal(message) - ENDIF - - BOT_INPUT_PRESS=PSFC_IN(I,J) - BOT_INPUT_HGT=TOPO_IN(I,J) - - IF (I .eq. Ilook .AND. J .eq. Jlook) THEN - - write(message,*) ' TERRAIN_HGT_T: ', I,J, TERRAIN_HGT_T(I,J) - CALL wrf_message(message) - write(message,*) ' PSFC_IN, TOPO_IN: ', & - I, J, PSFC_IN(I,J),TOPO_IN(I,J) - CALL wrf_message(message) - - DO L=1,generic - write(message,*) ' L,PRESS3D_IN, Z3D_IN: ', & - I,J,L, PRESS3D_IN(I,J,L),Z3D_IN(I,J,L) - CALL wrf_debug(10,message) - END DO - ENDIF - - DO L=2,generic-1 - - IF ( PRESS3D_IN(i,j,L) .gt. PSFC_IN(I,J) .AND. & - Z3D_IN(I,J,L) .lt. TERRAIN_HGT_T(I,J) .AND. & - Z3D_IN(I,J,L+1) .gt. TERRAIN_HGT_T(I,J) ) THEN - - BOT_INPUT_PRESS=PRESS3D_IN(i,j,L) - BOT_INPUT_HGT=Z3D_IN(I,J,L) - -! IF (I .eq. Ilook .and. J .eq. Jlook) THEN -! write(message,*) 'BOT_INPUT_PRESS, BOT_INPUT_HGT NOW : ', & -! Ilook,Jlook, BOT_INPUT_PRESS, BOT_INPUT_HGT -! CALL wrf_message(message) -! ENDIF - - ENDIF - END DO - -!!!!!!!!!!!!!!!!!!!!!! START HYDRO CHECK - - IF ( PRESS3D_IN(i,j,1) .ne. 200100. .AND. & - (PSFC_IN(I,J) .gt. PRESS3D_IN(i,j,2) .OR. & - TOPO_IN(I,J) .lt. Z3D_IN(I,J,2)) ) THEN ! extrapolate downward - - IF (J .eq. JTS .AND. I .eq. ITS) THEN - write(message,*) 'hydro check - should only be for isobaric input' - CALL wrf_message(message) - ENDIF - - IF (Z3D_IN(I,J,2) .ne. TOPO_IN(I,J)) THEN - dpdz=(PRESS3D_IN(i,j,2)-PSFC_IN(I,J))/(Z3D_IN(I,J,2)-TOPO_IN(I,J)) - rhs=-9.81*((PRESS3D_IN(i,j,2)+ PSFC_IN(I,J))/2.)/(287.04* T3D_IN(I,J,2)) - - IF ( abs(PRESS3D_IN(i,j,2)-PSFC_IN(I,J)) .gt. 290.) THEN - IF (dpdz .lt. 1.05*rhs .OR. dpdz .gt. 0.95*rhs) THEN - write(message,*) 'I,J,P(2),Psfc,Z(2),Zsfc: ', & - I,J,PRESS3D_IN(i,j,2),PSFC_IN(I,J),Z3D_IN(I,J,2),TOPO_IN(I,J) - IF (mod(I,5).eq.0 .AND. mod(J,5).eq.0) CALL wrf_debug(50,message) - CYCLE I_loop - ENDIF - - ENDIF - - ELSE ! z(2) equals TOPO_IN - - IF (PRESS3D_IN(i,j,2) .eq. PSFC_IN(I,J)) THEN -! write(message,*) 'all equal at I,J: ', I,J -! CALL wrf_message(message) - ELSE -! write(message,*) 'heights equal, pressures not: ', & -! PRESS3D_IN(i,j,2), PSFC_IN(I,J) -! CALL wrf_message(message) - CYCLE I_loop - ENDIF - - ENDIF - - IF ( abs(PRESS3D_IN(i,j,2)-PSFC_IN(I,J)) .gt. 290.) THEN - IF (PRESS3D_IN(i,j,2) .lt. PSFC_IN(I,J) .and. & - Z3D_IN(I,J,2) .lt. TOPO_IN(I,J)) THEN -! write(message,*) 'surface data mismatch(a) at I,J: ', I,J -! CALL wrf_message(message) - CYCLE I_loop - ELSEIF (PRESS3D_IN(i,j,2) .gt. PSFC_IN(I,J) .AND. & - Z3D_IN(I,J,2) .gt. TOPO_IN(I,J)) THEN -! write(message,*) 'surface data mismatch(b) at I,J: ', I,J -! CALL wrf_message(message) - CYCLE I_loop - ENDIF - ENDIF - ENDIF - -!!!!!!! loop over a few more levels - - DO L=3,6 - IF ( PRESS3D_IN(i,j,1) .ne. 200100. .AND. & - (((PSFC_IN(I,J)-PRESS3D_IN(i,j,L)) .lt. 400.) .OR. & - TOPO_IN(I,J) .lt. Z3D_IN(I,J,L))) then - - IF (Z3D_IN(I,J,L) .ne. TOPO_IN(I,J)) THEN - dpdz=(PRESS3D_IN(i,j,L)-PSFC_IN(I,J))/ & - (Z3D_IN(I,J,L)-TOPO_IN(I,J)) - rhs=-9.81*((PRESS3D_IN(i,j,L)+ PSFC_IN(I,J))/2.)/ & - (287.04*T3D_IN(I,J,L)) - IF ( abs(PRESS3D_IN(i,j,L)-PSFC_IN(I,J)) .gt. 290.) THEN - IF (dpdz .lt. 1.05*rhs .or. dpdz .gt. 0.95*rhs) THEN - write(message,*) 'I,J,L,Piso,Psfc,Ziso,Zsfc: ', & - I,J,L,PRESS3D_IN(i,j,L),PSFC_IN(I,J),& - Z3D_IN(I,J,L),TOPO_IN(I,J) - IF (mod(I,5).eq.0 .AND. mod(J,5).eq.0) & - CALL wrf_debug(50,message) - CYCLE I_loop - ENDIF - ENDIF - ELSE - IF (PRESS3D_IN(i,j,2) .eq. PSFC_IN(I,J)) THEN -! write(message,*) 'all equal at I,J: ', I,J -! CALL wrf_message(message) - ELSE - CYCLE I_loop - ENDIF - ENDIF - ENDIF - - IF ( abs(PRESS3D_IN(i,j,L)-PSFC_IN(I,J)) .gt. 290.) THEN - IF (PRESS3D_IN(i,j,L) .lt. PSFC_IN(I,J) .AND. & - Z3D_IN(I,J,L) .lt. TOPO_IN(I,J)) THEN - CYCLE I_loop - ELSEIF (PRESS3D_IN(i,j,L) .gt. PSFC_IN(I,J) .AND. & - Z3D_IN(I,J,L) .gt. TOPO_IN(I,J)) THEN - CYCLE I_loop - ENDIF - ENDIF - END DO -!!!!!!!!!!!!!!!!!!!!!! END HYDRO CHECK - - IF (TERRAIN_HGT_T(I,J) .eq. BOT_INPUT_HGT ) THEN - dum2d(I,J)=BOT_INPUT_PRESS - - IF (BOT_INPUT_HGT .ne. 0. .and. (BOT_INPUT_HGT-INT(BOT_INPUT_HGT) .ne. 0.) ) THEN - write(message,*) 'with BOT_INPUT_HGT: ', BOT_INPUT_HGT, & - 'set dum2d to bot_input_pres: ', I,J,dum2d(I,J) - CALL wrf_message(message) - ENDIF - - IF (dum2d(I,J) .lt. 50000. .OR. dum2d(I,J) .gt. 109000.) THEN - write(message,*) 'bad dum2d(a): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - ENDIF - - ELSEIF (TERRAIN_HGT_T(I,J) .lt. BOT_INPUT_HGT ) THEN - -! target is below lowest possible input...extrapolate - - IF ( BOT_INPUT_PRESS-PRESS3D_IN(I,J,2) .gt. 500. ) THEN - dlnpdz= (log(BOT_INPUT_PRESS)-log(PRESS3D_IN(i,j,2)) ) / & - (BOT_INPUT_HGT-Z3D_IN(i,j,2)) - IF (I .eq. Ilook .and. J .eq. Jlook) THEN - write(message,*) 'I,J,dlnpdz(a): ', I,J,dlnpdz - CALL wrf_message(message) - ENDIF - - ELSE - -!! thin layer and/or just have lowest level - difference with 3rd level data - IF ( abs(BOT_INPUT_PRESS - PRESS3D_IN(i,j,3)) .gt. 290. ) THEN - - dlnpdz= (log(BOT_INPUT_PRESS)-log(PRESS3D_IN(i,j,3)) ) / & - (BOT_INPUT_HGT-Z3D_IN(i,j,3)) - - IF (I .eq. Ilook .and. J .eq. Jlook) then - write(message,*) 'p diff: ', BOT_INPUT_PRESS, PRESS3D_IN(i,j,3) - CALL wrf_message(message) - write(message,*) 'z diff: ', BOT_INPUT_HGT, Z3D_IN(i,j,3) - CALL wrf_message(message) - ENDIF - - ELSE - -!! Loop up to level 7 looking for a sufficiently thick layer - - FIND_THICK: DO LL=4,7 - IF( abs(BOT_INPUT_PRESS - PRESS3D_IN(i,j,LL)) .gt. 290.) THEN - dlnpdz= (log(BOT_INPUT_PRESS)-log(PRESS3D_IN(i,j,LL)) ) / & - (BOT_INPUT_HGT-Z3D_IN(i,j,LL)) - EXIT FIND_THICK - ENDIF - END DO FIND_THICK - - ENDIF - - ENDIF - - dum2d(I,J)= exp(log(BOT_INPUT_PRESS) + dlnpdz * & - (TERRAIN_HGT_T(I,J) - BOT_INPUT_HGT) ) - - IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN - write(message,*) 'bad dum2d(b): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - write(message,*) 'BOT_INPUT_PRESS, dlnpdz, TERRAIN_HGT_T, BOT_INPUT_HGT: ', & - BOT_INPUT_PRESS, dlnpdz, TERRAIN_HGT_T(I,J), BOT_INPUT_HGT - CALL wrf_message(message) - write(message,*) 'Z3D_IN: ', Z3D_IN(I,J,1:10) - CALL wrf_message(message) - write(message,*) 'PRESS3D_IN: ', PRESS3D_IN(I,J,1:10) - CALL wrf_message(message) - ENDIF - - ELSE ! target level bounded by input levels - - DO L=2,generic-1 - IF (TERRAIN_HGT_T(I,J) .gt. Z3D_IN(i,j,L) .AND. & - TERRAIN_HGT_T(I,J) .lt. Z3D_IN(i,j,L+1) ) THEN - dlnpdz= (log(PRESS3D_IN(i,j,l))-log(PRESS3D_IN(i,j,L+1)) ) / & - (Z3D_IN(i,j,l)-Z3D_IN(i,j,L+1)) - dum2d(I,J)= log(PRESS3D_IN(i,j,l)) + & - dlnpdz * (TERRAIN_HGT_T(I,J) - Z3D_IN(i,j,L) ) - dum2d(i,j)=exp(dum2d(i,j)) - IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN - write(message,*) 'bad dum2d(c): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - ENDIF - ENDIF - ENDDO - -!!! account for situation where BOT_INPUT_HGT < TERRAIN_HGT_T < Z3D_IN(:,2,:) - IF (dum2d(I,J) .eq. -9 .AND. BOT_INPUT_HGT .lt. TERRAIN_HGT_T(I,J) & - .AND. TERRAIN_HGT_T(I,J) .lt. Z3D_IN(I,J,2)) then - - IF (mod(I,50) .eq. 0 .AND. mod(J,50) .eq. 0) THEN - write(message,*) 'I,J,BOT_INPUT_HGT, bot_pres, TERRAIN_HGT_T: ', & - I,J,BOT_INPUT_HGT, BOT_INPUT_PRESS, TERRAIN_HGT_T(I,J) - CALL wrf_message(message) - ENDIF - - dlnpdz= (log(PSFC_IN(i,j))-log(PRESS3D_IN(i,j,2)) ) / & - (TOPO_IN(i,j)-Z3D_IN(i,j,2)) - dum2d(I,J)= log(PSFC_IN(i,j)) + & - dlnpdz * (TERRAIN_HGT_T(I,J) - TOPO_IN(i,j) ) - dum2d(i,j)= exp(dum2d(i,j)) - IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN - write(message,*) 'bad dum2d(d): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - ENDIF - ENDIF - - IF (dum2d(I,J) .eq. -9.) THEN - write(message,*) 'must have flukey situation in new ', I,J - CALL wrf_message(message) - write(message,*) 'I,J,BOT_INPUT_HGT, bot_pres, TERRAIN_HGT_T: ', & - I,J,BOT_INPUT_HGT, BOT_INPUT_PRESS, TERRAIN_HGT_T(I,J) - CALL wrf_message(message) - - DO L=1,generic-1 - IF ( TERRAIN_HGT_T(I,J) .eq. Z3D_IN(i,j,L) ) THEN -! problematic with HGT_M substitution for "input" surface height? - dum2d(i,j)=PRESS3D_IN(I,J,L) - IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN - write(message,*) 'bad dum2d(e): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - ENDIF - ENDIF - ENDDO - - IF ( TERRAIN_HGT_T(I,J) .eq. TOPO_IN(I,J)) THEN - dum2d(I,J)=PSFC_IN(I,J) - IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN - write(message,*) 'bad dum2d(grid%f): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - ENDIF - write(message,*) 'matched input topo, psfc: ', I,J,TOPO_IN(I,J),PSFC_IN(I,J) - CALL wrf_message(message) - ENDIF - - IF (dum2d(I,J) .eq. -9.) THEN - CALL wrf_error_fatal("quitting due to undefined surface pressure") - ENDIF - ENDIF - - DEFINED_PSFC(I,J)=.TRUE. - - IF (I .eq. Ilook .AND. J .eq. Jlook) THEN - write(message,*) 'newstyle psfc: ', I,J,dum2d(I,J) - CALL wrf_message(message) - ENDIF - - ENDIF - - ENDDO I_loop - ENDDO - -! write(message,*) 'psfc points (new style)' -! CALL wrf_message(message) - -! DO J=min(JTE,JDE-1),JTS,-loopinc -! write(message,633) (dum2d(I,J)/100.,I=ITS,min(ITE,IDE-1),iloopinc) -! CALL wrf_message(message) -! END DO - - 633 format(35(f5.0,1x)) - - write(message,*) 'PSFC extremes (new style)' - CALL wrf_message(message) - write(message,*) minval(dum2d,MASK=DEFINED_PSFC),maxval(dum2d,MASK=DEFINED_PSFC) - CALL wrf_message(message) - -! IF (minval(dum2d,MASK=DEFINED_PSFC) .lt. 50000. .or. maxval(dum2d,MASK=DEFINED_PSFC) .gt. 108000.) THEN - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - - IF (DEFINED_PSFC(I,J) .AND. dum2d(I,J) .lt. 50000. ) THEN - IF (TERRAIN_HGT_T(I,J) .gt. 4500.) THEN - WRITE(message,*) 'low surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - - IF (DEFINED_PSFC(I,J) .AND. dum2d(I,J) .gt. 108000. ) THEN - IF (TERRAIN_HGT_T(I,J) .lt. -10.) THEN - WRITE(message,*) 'high surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - - END DO - END DO - - - -!! "traditional" isobaric only approach ------------------------------------------------ - - ALLOCATE (DUM2DB(IMS:IME,JMS:JME)) - DO J=JMS,JME - DO I=IMS,IME - DUM2DB(I,J)=-9. - END DO - END DO - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - - IF (TERRAIN_HGT_T(I,J) .lt. Z3D_IN(i,j,2)) THEN ! targ below lowest - - IF ( abs(PRESS3D_IN(i,j,2)-PRESS3D_IN(i,j,3)) .gt. 290.) THEN - dlnpdz= (log(PRESS3D_IN(i,j,2))-log(PRESS3D_IN(i,j,3)) ) / & - (Z3D_IN(i,j,2)-Z3D_IN(i,j,3)) - ELSE - dlnpdz= (log(PRESS3D_IN(i,j,2))-log(PRESS3D_IN(i,j,4)) ) / & - (Z3D_IN(i,j,2)-Z3D_IN(i,j,4)) - ENDIF - - DUM2DB(I,J)= exp( log(PRESS3D_IN(i,j,2)) + dlnpdz * & - (TERRAIN_HGT_T(I,J) - Z3D_IN(i,j,2)) ) - - IF (I .eq. Ilook .and. J .eq. Jlook) THEN - write(message,*) 'I,K, trad: dlnpdz, press_in(2), terrain_t, Z3D_IN(2): ', I,J,dlnpdz, & - PRESS3D_IN(i,j,2), TERRAIN_HGT_T(I,J), Z3D_IN(i,j,2) - CALL wrf_message(message) - ENDIF - - DEFINED_PSFCB(i,j)=.true. - - ELSEIF (TERRAIN_HGT_T(I,J) .gt. Z3D_IN(i,j,2)) THEN ! target level bounded by input levels - - DO L=2,generic-1 - IF (TERRAIN_HGT_T(I,J) .gt. Z3D_IN(i,j,L) .AND. & - TERRAIN_HGT_T(I,J) .lt. Z3D_IN(i,j,L+1) ) THEN - - dlnpdz= (log(PRESS3D_IN(i,j,l))-log(PRESS3D_IN(i,j,L+1)) ) / & - (Z3D_IN(i,j,l)-Z3D_IN(i,j,L+1)) - - DUM2DB(I,J)= log(PRESS3D_IN(i,j,l)) + & - dlnpdz * (TERRAIN_HGT_T(I,J) - Z3D_IN(i,j,L) ) - DUM2DB(i,j)=exp(DUM2DB(i,j)) - - DEFINED_PSFCB(i,j)=.true. - - IF (DUM2DB(I,J) .lt. 13000.) THEN - write(message,*) 'I,J,L,terrain,Z3d(L),z3d(L+1),p3d(L),p3d(l+1): ', I,J,L, & - TERRAIN_HGT_T(I,J),Z3D_IN(I,J,L),Z3D_IN(I,J,L+1),PRESS3D_IN(I,J,L), & - PRESS3D_IN(I,J,L+1) - CALL wrf_error_fatal(message) - ENDIF - ENDIF - ENDDO - - ELSEIF (TERRAIN_HGT_T(I,J) .eq. Z3D_IN(i,j,2)) THEN - DUM2DB(i,j)=PRESS3D_IN(I,J,2) - DEFINED_PSFCB(i,j)=.true. - ENDIF - - IF (DUM2DB(I,J) .eq. -9.) THEN - write(message,*) 'must have flukey situation in trad ', I,J - CALL wrf_message(message) - DO L=1,generic-1 - IF ( TERRAIN_HGT_T(I,J) .eq. Z3D_IN(i,j,L) ) THEN - DUM2DB(i,j)=PRESS3D_IN(I,J,L) - DEFINED_PSFCB(i,j)=.true. - ENDIF - ENDDO - ENDIF - - IF (DUM2DB(I,J) .eq. -9.) THEN - write(message,*) 'HOPELESS PSFC, I QUIT' - CALL wrf_error_fatal(message) - ENDIF - - if (I .eq. Ilook .and. J .eq. Jlook) THEN - write(message,*) ' traditional psfc: ', I,J,DUM2DB(I,J) - CALL wrf_message(message) - ENDIF - - ENDDO - ENDDO - -! write(message,*) 'psfc points (traditional)' -! CALL wrf_message(message) -! DO J=min(JTE,JDE-1),JTS,-loopinc -! write(message,633) (DUM2DB(I,J)/100.,I=its,min(ite,IDE-1),iloopinc) -! CALL wrf_message(message) -! ENDDO - - write(message,*) 'PSFC extremes (traditional)' - CALL wrf_message(message) - write(message,*) minval(DUM2DB,MASK=DEFINED_PSFCB),maxval(DUM2DB,MASK=DEFINED_PSFCB) - CALL wrf_message(message) - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - - IF (DEFINED_PSFCB(I,J) .AND. dum2db(I,J) .lt. 50000. ) THEN - IF (TERRAIN_HGT_T(I,J) .gt. 4500.) THEN - WRITE(message,*) 'low surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - - IF (DEFINED_PSFCB(I,J) .AND. dum2db(I,J) .gt. 108000. ) THEN - IF (TERRAIN_HGT_T(I,J) .lt. -10.) THEN - WRITE(message,*) 'high surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - -! IF (DEFINED_PSFCB(I,J) .AND. ( dum2db(I,J) .lt. 50000. .OR. dum2db(I,J) .gt. 108000. )) THEN -! IF (TERRAIN_HGT_T(I,J) .gt. -10. .and. TERRAIN_HGT_T(I,J) .lt. 5000.) THEN -! write(0,*) 'I,J, terrain_hgt_t, dum2db: ', I,J, terrain_hgt_t(I,J),dum2db(I,J) -! CALL wrf_error_fatal("quit due to unrealistic surface pressure") -! ELSE -! WRITE(message,*) 'surface pressure allowed because surface height is extreme value of: ', TERRAIN_HGT_T(I,J) -! CALL wrf_debug(2,message) -! ENDIF -! ENDIF - - ENDDO - ENDDO - -!!!!! end traditional - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - IF (DEFINED_PSFCB(I,J) .and. DEFINED_PSFC(I,J)) THEN - - IF ( abs(dum2d(I,J)-DUM2DB(I,J)) .gt. 400.) THEN - write(message,*) 'BIG DIFF I,J, dum2d, DUM2DB: ', I,J,dum2d(I,J),DUM2DB(I,J) - CALL wrf_message(message) - ENDIF - -!! do we have enough confidence in new style to give it more than 50% weight? - psfc_out(I,J)=0.5*(dum2d(I,J)+DUM2DB(I,J)) - - ELSEIF (DEFINED_PSFC(I,J)) THEN - psfc_out(I,J)=dum2d(I,J) - ELSEIF (DEFINED_PSFCB(I,J)) THEN - psfc_out(I,J)=DUM2DB(I,J) - ELSE - write(message,*) 'I,J,dum2d,DUM2DB: ', I,J,dum2d(I,J),DUM2DB(I,J) - CALL wrf_message(message) - write(message,*) 'I,J,DEFINED_PSFC(I,J),DEFINED_PSFCB(I,J): ', I,J,DEFINED_PSFC(I,J),DEFINED_PSFCB(I,J) - CALL wrf_message(message) - call wrf_error_fatal("psfc_out completely undefined") - ENDIF - - IF (I .eq. Ilook .AND. J .eq. Jlook) THEN - write(message,*) ' combined psfc: ', I,J,psfc_out(I,J) - CALL wrf_message(message) - ENDIF - - IF (psfc_out(I,J) .lt. 50000. ) THEN - IF (TERRAIN_HGT_T(I,J) .gt. 4500.) THEN - WRITE(message,*) 'low surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - write(message,*) 'possibly bad combo on psfc_out: ', I,J, psfc_out(I,J) - CALL wrf_debug(2,message) - write(message,*) 'DEFINED_PSFC, dum2d: ', DEFINED_PSFC(I,J),dum2d(I,J) - CALL wrf_debug(2,message) - write(message,*) 'DEFINED_PSFCB, DUM2DB: ', DEFINED_PSFCB(I,J),DUM2DB(I,J) - CALL wrf_debug(2,message) - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - - IF (psfc_out(I,J) .gt. 108000. ) THEN - IF (TERRAIN_HGT_T(I,J) .lt. -10.) THEN - WRITE(message,*) 'high surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - write(message,*) 'possibly bad combo on psfc_out: ', I,J, psfc_out(I,J) - CALL wrf_debug(2,message) - write(message,*) 'DEFINED_PSFC, dum2d: ', DEFINED_PSFC(I,J),dum2d(I,J) - CALL wrf_debug(2,message) - write(message,*) 'DEFINED_PSFCB, DUM2DB: ', DEFINED_PSFCB(I,J),DUM2DB(I,J) - CALL wrf_debug(2,message) - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - - ENDDO - ENDDO - - deallocate(dum2d,dum2db) - - END SUBROUTINE compute_nmm_surfacep - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - SUBROUTINE compute_3d_pressure(psfc_out,SGML1,SGML2,pdtop,pt & - &, pd,p3d_out & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE - - REAL, INTENT(IN) :: psfc_out(IMS:IME,JMS:JME) - REAL, INTENT(IN) :: SGML1(KDE),SGML2(KDE),pdtop,pt - - REAL, INTENT(OUT):: p3d_out(IMS:IME,JMS:JME,KDS:KDE-1) - REAL, INTENT(OUT):: pd(IMS:IME,JMS:JME) - - CHARACTER (len=255) :: message - -! write(message,*) 'pdtop, pt, psfc_out(1,1): ', pdtop, pt, psfc_out(1,1) -! CALL wrf_message(message) - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - pd(I,J)=psfc_out(I,J)-pdtop-pt - ENDDO - ENDDO - - DO J=JTS,min(JTE,JDE-1) - DO K=KDS,KDE-1 - DO I=ITS,min(ITE,IDE-1) - p3d_out(I,J,K)=pd(I,J)*SGML2(K)+pdtop*SGML1(K)+pt - - IF (p3d_out(I,J,K) .ge. psfc_out(I,J) .or. p3d_out(I,J,K) .le. pt) THEN - write(message,*) 'I,K,J,p3d_out: ', I,K,J,p3d_out(I,J,K) - CALL wrf_error_fatal(message) - ENDIF - - ENDDO - ENDDO - ENDDO - - END SUBROUTINE compute_3d_pressure - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - SUBROUTINE interp_press2press_lin(press_in,press_out, & - data_in, data_out,generic & - &, extrapolate,ignore_lowest,TFIELD & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time ) - - ! Interpolates data from one set of pressure surfaces to - ! another set of pressures - - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE,generic - INTEGER :: internal_time - -! REAL, INTENT(IN) :: press_in(IMS:IME,generic,JMS:JME) - REAL, INTENT(IN) :: press_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(IN) :: press_out(IMS:IME,JMS:JME,KDS:KDE-1) -! REAL, INTENT(IN) :: data_in(IMS:IME,generic,JMS:JME) - REAL, INTENT(IN) :: data_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(OUT) :: data_out(IMS:IME,JMS:JME,KMS:KME) - LOGICAL, INTENT(IN) :: extrapolate, ignore_lowest, TFIELD - LOGICAL :: col_smooth - - INTEGER :: i,j - INTEGER :: k,kk - REAL :: desired_press - REAL :: dvaldlnp,dlnp,tadiabat,tiso - - REAL, PARAMETER :: ADIAFAC=9.81/1004. - REAL, PARAMETER :: TSTEXTRAPFAC=.0065 - - - - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - DATA_OUT(I,J,K)=-99999.9 - ENDDO - ENDDO - ENDDO - - IF (ignore_lowest) then - LMIN=2 - ELSE - LMIN=1 - ENDIF - - DO j = JTS, min(JTE,JDE-1) - test_i: DO i = ITS, min(ITE,IDE-1) - - IF (internal_time_loop .gt. 1) THEN - IF (J .ne. JDS .and. J .ne. JDE-1 .and. & - I .ne. IDS .and. I .ne. IDE-1 ) THEN -!! not on boundary - CYCLE test_i - ENDIF - ENDIF - - - col_smooth=.false. - - output_loop: DO k = KDS,KDE-1 - - desired_press = press_out(i,j,k) - - if (K .gt. KDS) then - if (TFIELD .and. col_smooth .and. desired_press .le. press_in(i,j,LMIN) & - .and. press_out(i,j,k-1) .ge. press_in(i,j,LMIN)) then - MAX_SMOOTH=K -! write(message,*) 'I,J, MAX_SMOOTH: ', I,J, MAX_SMOOTH -! CALL wrf_debug(100,message) - endif - endif - -! keep track of where the extrapolation begins - - IF (desired_press .GT. press_in(i,j,LMIN)) THEN - IF (TFIELD .and. K .eq. 1 .and. (desired_press - press_in(i,j,LMIN)) .gt. 3000.) then - col_smooth=.TRUE. ! due to large extrapolation distance - ENDIF - - - IF ((desired_press - press_in(i,j,LMIN)).LT. 50.) THEN ! 0.5 mb - data_out(i,j,k) = data_in(i,j,LMIN) - ELSE - IF (extrapolate) THEN - ! Extrapolate downward because desired P level is below - ! the lowest level in our input data. Extrapolate using simple - ! 1st derivative of value with respect to ln P for the bottom 2 - ! input layers. - - ! Add a check to make sure we are not using the gradient of - ! a very thin layer - - if (TFIELD) then - tiso=0.5*(data_in(i,j,1)+data_in(i,j,2)) - endif - - - IF ( (press_in(i,j,LMIN)-press_in(i,j,LMIN+1)) .GT. 500.) THEN ! likely isobaric data - dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+1)) - dvaldlnp = (data_in(i,j,LMIN) - data_in(i,j,LMIN+1)) / dlnp - ELSE ! assume terrain following - dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+5)) - dvaldlnp = (data_in(i,j,LMIN) - data_in(i,j,LMIN+5)) / dlnp - ENDIF - data_out(i,j,k) = data_in(i,j,LMIN) + dvaldlnp * & - ( log(desired_press)-log(press_in(i,j,LMIN)) ) - - if (TFIELD .and. data_out(i,j,k) .lt. tiso-0.2) then - -! restrict slope to -1K/10 hPa - dvaldlnp=max(dvaldlnp, -1.0/ & - log( press_in(i,j,LMIN) / & - ( press_in(i,j,LMIN)-1000.) )) - - data_out(I,J,K)= data_in(i,j,LMIN) + dvaldlnp * & - ( log(desired_press)-log(press_in(i,j,LMIN)) ) - - elseif (TFIELD .and. data_out(i,j,k) .gt. tiso+0.2) then - -! restrict slope to +0.8K/10 hPa - dvaldlnp=min(dvaldlnp, 0.8/ & - log( press_in(i,j,LMIN) / & - ( press_in(i,j,LMIN)-1000.) )) - - data_out(I,J,K)= data_in(i,j,LMIN) + dvaldlnp * & - ( log(desired_press)-log(press_in(i,j,LMIN)) ) - - endif - - ELSE - data_out(i,j,k) = data_in(i,j,LMIN) - ENDIF - ENDIF - ELSE IF (desired_press .LT. press_in(i,j,generic)) THEN - IF ( (press_in(i,j,generic) - desired_press) .LT. 10.) THEN - data_out(i,j,k) = data_in(i,j,generic) - ELSE - IF (extrapolate) THEN - ! Extrapolate upward - IF ((press_in(i,j,generic-1)-press_in(i,j,generic)).GT.50.) THEN - dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-1)) - dvaldlnp=(data_in(i,j,generic)-data_in(i,j,generic-1))/dlnp - ELSE - dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-2)) - dvaldlnp=(data_in(i,j,generic)-data_in(i,j,generic-2))/dlnp - ENDIF - data_out(i,j,k) = data_in(i,j,generic) + & - dvaldlnp * (log(desired_press)-log(press_in(i,j,generic))) - ELSE - data_out(i,j,k) = data_in(i,j,generic) - ENDIF - ENDIF - ELSE - ! We can trap between two levels and linearly interpolate - - input_loop: DO kk = LMIN, generic-1 - IF (desired_press .EQ. press_in(i,j,kk) )THEN - data_out(i,j,k) = data_in(i,j,kk) - EXIT input_loop - ELSE IF ( (desired_press .LT. press_in(i,j,kk)) .AND. & - (desired_press .GT. press_in(i,j,kk+1)) ) THEN - -! do trapped in lnp - - dlnp = log(press_in(i,j,kk)) - log(press_in(i,j,kk+1)) - dvaldlnp = (data_in(i,j,kk)-data_in(i,j,kk+1))/dlnp - data_out(i,j,k) = data_in(i,j,kk+1)+ & - dvaldlnp*(log(desired_press)-log(press_in(i,j,kk+1))) - - EXIT input_loop - ENDIF - - ENDDO input_loop - ENDIF - ENDDO output_loop - - if (col_smooth) then - do K=max(KDS,MAX_SMOOTH-4),MAX_SMOOTH+4 - data_out(I,J,K)=0.5*(data_out(I,J,K)+data_out(I,J,K+1)) - enddo - endif - - ENDDO test_i - ENDDO - END SUBROUTINE interp_press2press_lin - - SUBROUTINE wind_adjust(press_in,press_out, & - U_in, V_in,U_out,V_out & - &, generic,depth_replace & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE,generic - INTEGER :: MAXLIN,MAXLOUT - - REAL, INTENT(IN) :: press_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(IN) :: press_out(IMS:IME,JMS:JME,KDS:KDE-1) - REAL, INTENT(IN) :: U_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(IN) :: V_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(INOUT) :: U_out(IMS:IME,KMS:KME,JMS:JME) - REAL, INTENT(INOUT) :: V_out(IMS:IME,KMS:KME,JMS:JME) - REAL :: p1d_in(generic) - REAL :: p1d_out(KDS:KDE-1) - - - DO j = JTS, min(JTE,JDE-1) - DO i = ITS, min(ITE,IDE-1) - -! IF (press_out(I,J,1) .lt. press_in(I,J,2)) then - IF( (press_in(I,J,2)-press_out(I,J,1)) .gt. 200.) then - - U_out(I,1,J)=U_in(I,J,2) - V_out(I,1,J)=V_in(I,J,2) - - INLOOP: DO L=2,generic - p1d_in(L)=-9999. - IF ( (press_in(I,J,2)-press_in(I,J,L)) .lt. depth_replace) THEN - p1d_in(L)=(press_in(I,J,2)-press_in(I,J,L)) - MAXLIN=L - ELSE - p1d_in(L)=(press_in(I,J,2)-press_in(I,J,L)) - EXIT INLOOP - ENDIF - END DO INLOOP - - OUTLOOP: DO L=KDS,KDE-1 - p1d_out(L)=-9999. - IF ( (press_out(I,J,1)-press_out(I,J,L)) .lt. depth_replace) THEN - p1d_out(L)=(press_out(I,J,1)-press_out(I,J,L)) - MAXLOUT=L - ELSE - EXIT OUTLOOP - ENDIF - END DO OUTLOOP - - DO L=1,MAXLOUT - ptarg=p1d_out(L) - - FINDLOOP: DO LL=2,MAXLIN - - if (p1d_in(LL) .lt. ptarg .and. p1d_in(LL+1) .gt. ptarg) then - - dlnp=log(p1d_in(LL))-log(p1d_in(LL+1)) - dudlnp=(U_in(I,J,LL)-U_in(I,J,LL+1))/dlnp - dvdlnp=(V_in(I,J,LL)-V_in(I,J,LL+1))/dlnp - U_out(I,L,J)=U_in(I,J,LL)+dudlnp*(log(ptarg)-log(p1d_in(LL))) - V_out(I,L,J)=V_in(I,J,LL)+dvdlnp*(log(ptarg)-log(p1d_in(LL))) - - EXIT FINDLOOP - endif - - END DO FINDLOOP - END DO ! MAXLOUT loop - - - ENDIF - - ENDDO - ENDDO - - - - END SUBROUTINE wind_adjust -!-------------------------------------------------------------------- - - SUBROUTINE interp_press2press_log(press_in,press_out, & - data_in, data_out, generic & - &, extrapolate,ignore_lowest & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time ) - - ! Interpolates ln(data) from one set of pressure surfaces to - ! another set of pressures - - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE,generic - INTEGER :: internal_time - -! REAL, INTENT(IN) :: press_in(IMS:IME,generic,JMS:JME) - REAL, INTENT(IN) :: press_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(IN) :: press_out(IMS:IME,JMS:JME,KDS:KDE-1) -! REAL, INTENT(IN) :: data_in(IMS:IME,generic,JMS:JME) -! REAL, INTENT(IN) :: data_in(IMS:IME,JMS:JME,generic) - REAL :: data_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(OUT) :: data_out(IMS:IME,JMS:JME,KMS:KME) - LOGICAL, INTENT(IN) :: extrapolate, ignore_lowest - - INTEGER :: i,j - INTEGER :: k,kk - REAL :: desired_press - REAL :: dlnvaldlnp,dlnp - - - DO K=1,generic - DO j = JTS, min(JTE,JDE-1) - DO i = ITS, min(ITE,IDE-1) - DATA_IN(I,J,K)=max(DATA_in(I,J,K),1.e-13) - ENDDO - ENDDO - ENDDO - - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - DATA_OUT(I,J,K)=-99999.9 - ENDDO - ENDDO - ENDDO - - IF (ignore_lowest) then - LMIN=2 - ELSE - LMIN=1 - ENDIF - - DO j = JTS, min(JTE,JDE-1) - test_i: DO i = ITS, min(ITE,IDE-1) - - IF (internal_time .gt. 1) THEN - IF (J .ne. JDS .and. J .ne. JDE-1 .and. & - I .ne. IDS .and. I .ne. IDE-1 ) THEN -!! not on boundary - CYCLE test_i - ENDIF - ENDIF - - - output_loop: DO k = KDS,KDE-1 - - desired_press = press_out(i,j,k) - - IF (desired_press .GT. press_in(i,j,LMIN)) THEN - - IF ((desired_press - press_in(i,j,LMIN)).LT. 10.) THEN ! 0.1 mb - data_out(i,j,k) = data_in(i,j,LMIN) - ELSE - IF (extrapolate) THEN - ! Extrapolate downward because desired P level is below - ! the lowest level in our input data. Extrapolate using simple - ! 1st derivative of value with respect to ln P for the bottom 2 - ! input layers. - - ! Add a check to make sure we are not using the gradient of - ! a very thin layer - - IF ( (press_in(i,j,LMIN)-press_in(i,j,LMIN+1)) .GT. 100.) THEN - dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+1)) - dlnvaldlnp = ( log(data_in(i,j,LMIN)) - log(data_in(i,j,LMIN+1)) ) / dlnp - - ELSE - - dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+2)) - dlnvaldlnp = (log(data_in(i,j,LMIN)) - log(data_in(i,j,LMIN+2))) / dlnp - - ENDIF - - data_out(i,j,k) = exp(log(data_in(i,j,LMIN)) + dlnvaldlnp * & - ( log(desired_press)-log(press_in(i,j,LMIN)))) - ELSE - data_out(i,j,k) = data_in(i,j,LMIN) - ENDIF - ENDIF - ELSE IF (desired_press .LT. press_in(i,j,generic)) THEN - IF ( (press_in(i,j,generic) - desired_press) .LT. 10.) THEN - data_out(i,j,k) = data_in(i,j,generic) - ELSE - IF (extrapolate) THEN - ! Extrapolate upward - IF ((press_in(i,j,generic-1)-press_in(i,j,generic)).GT.50.) THEN - dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-1)) - dlnvaldlnp=(log(data_in(i,j,generic))-log(data_in(i,j,generic-1)))/dlnp - ELSE - dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-2)) - dlnvaldlnp=(log(data_in(i,j,generic))-log(data_in(i,j,generic-2)))/dlnp - ENDIF - data_out(i,j,k) = exp(log(data_in(i,j,generic)) + & - dlnvaldlnp * (log(desired_press)-log(press_in(i,j,generic)))) - ELSE - data_out(i,j,k) = data_in(i,j,generic) - ENDIF - ENDIF - ELSE - ! We can trap between two levels and linearly interpolate - - input_loop: DO kk = LMIN, generic-1 - IF (desired_press .EQ. press_in(i,j,kk) )THEN - data_out(i,j,k) = data_in(i,j,kk) - EXIT input_loop - ELSE IF ( (desired_press .LT. press_in(i,j,kk)) .AND. & - (desired_press .GT. press_in(i,j,kk+1)) ) THEN - -! do trapped in lnp - - dlnp = log(press_in(i,j,kk)) - log(press_in(i,j,kk+1)) - dlnvaldlnp = (log(data_in(i,j,kk))-log(data_in(i,j,kk+1)))/dlnp - data_out(i,j,k) = exp(log(data_in(i,j,kk+1))+ & - dlnvaldlnp*(log(desired_press)-log(press_in(i,j,kk+1)))) - - EXIT input_loop - - ENDIF - - ENDDO input_loop - ENDIF - ENDDO output_loop - ENDDO test_i - ENDDO - END SUBROUTINE interp_press2press_log - -!------------------------------------------------------------------- - SUBROUTINE rh_to_mxrat (rh, t, p, q , wrt_liquid , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte - - LOGICAL , INTENT(IN) :: wrt_liquid - -! REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(IN) :: p , t -! REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(INOUT) :: rh - REAL , DIMENSION(ims:ime,jms:jme,kms:kme) , INTENT(IN) :: p , t - REAL , DIMENSION(ims:ime,jms:jme,kms:kme) , INTENT(INOUT) :: rh - REAL , DIMENSION(ims:ime,jms:jme,kms:kme) , INTENT(OUT) :: q - - ! Local vars - - INTEGER :: i , j , k - - REAL :: ew , q1 , t1 - - REAL, PARAMETER :: T_REF = 0.0 - REAL, PARAMETER :: MW_AIR = 28.966 - REAL, PARAMETER :: MW_VAP = 18.0152 - - REAL, PARAMETER :: A0 = 6.107799961 - REAL, PARAMETER :: A1 = 4.436518521e-01 - REAL, PARAMETER :: A2 = 1.428945805e-02 - REAL, PARAMETER :: A3 = 2.650648471e-04 - REAL, PARAMETER :: A4 = 3.031240396e-06 - REAL, PARAMETER :: A5 = 2.034080948e-08 - REAL, PARAMETER :: A6 = 6.136820929e-11 - - REAL, PARAMETER :: ES0 = 6.1121 - - REAL, PARAMETER :: C1 = 9.09718 - REAL, PARAMETER :: C2 = 3.56654 - REAL, PARAMETER :: C3 = 0.876793 - REAL, PARAMETER :: EIS = 6.1071 - REAL :: RHS - REAL, PARAMETER :: TF = 273.16 - REAL :: TK - - REAL :: ES - REAL :: QS - REAL, PARAMETER :: EPS = 0.622 - REAL, PARAMETER :: SVP1 = 0.6112 - REAL, PARAMETER :: SVP2 = 17.67 - REAL, PARAMETER :: SVP3 = 29.65 - REAL, PARAMETER :: SVPT0 = 273.15 - - ! This subroutine computes mixing ratio (q, kg/kg) from basic variables - ! pressure (p, Pa), temperature (t, K) and relative humidity (rh, 1-100%). - ! The reference temperature (t_ref, C) is used to describe the temperature - ! at which the liquid and ice phase change occurs. - - DO k = kts , kte - DO j = jts , MIN ( jde-1 , jte ) - DO i = its , MIN (ide-1 , ite ) - rh(i,j,k) = MIN ( MAX ( rh(i,j,k) , 1. ) , 100. ) - END DO - END DO - END DO - - IF ( wrt_liquid ) THEN - DO k = kts , kte - DO j = jts , MIN ( jde-1 , jte ) - DO i = its , MIN (ide-1 , ite ) - es=svp1*10.*EXP(svp2*(t(i,j,k)-svpt0)/(t(i,j,k)-svp3)) - qs=eps*es/(p(i,j,k)/100.-es) - q(i,j,k)=MAX(.01*rh(i,j,k)*qs,0.0) - END DO - END DO - END DO - - ELSE - DO k = kts , kte - DO j = jts , MIN ( jde-1 , jte ) - DO i = its , MIN (ide-1 , ite ) - - t1 = t(i,j,k) - 273.16 - - ! Obviously dry. - - IF ( t1 .lt. -200. ) THEN - q(i,j,k) = 0 - - ELSE - - ! First compute the ambient vapor pressure of water - - IF ( ( t1 .GE. t_ref ) .AND. ( t1 .GE. -47.) ) THEN ! liq phase ESLO - ew = a0 + t1 * (a1 + t1 * (a2 + t1 * (a3 + t1 * (a4 + t1 * (a5 + t1 * a6))))) - - ELSE IF ( ( t1 .GE. t_ref ) .AND. ( t1 .LT. -47. ) ) then !liq phas poor ES - ew = es0 * exp(17.67 * t1 / ( t1 + 243.5)) - - ELSE - tk = t(i,j,k) - rhs = -c1 * (tf / tk - 1.) - c2 * alog10(tf / tk) + & - c3 * (1. - tk / tf) + alog10(eis) - ew = 10. ** rhs - - END IF - - ! Now sat vap pres obtained compute local vapor pressure - - ew = MAX ( ew , 0. ) * rh(i,j,k) * 0.01 - - ! Now compute the specific humidity using the partial vapor - ! pressures of water vapor (ew) and dry air (p-ew). The - ! constants assume that the pressure is in hPa, so we divide - ! the pressures by 100. - - q1 = mw_vap * ew - q1 = q1 / (q1 + mw_air * (p(i,j,k)/100. - ew)) - - q(i,j,k) = q1 / (1. - q1 ) - - END IF - - END DO - END DO - END DO - - END IF - - END SUBROUTINE rh_to_mxrat - -!--=------------------------------------------------------------------ - - SUBROUTINE boundary_smooth(h, landmask, grid, nsmth , nrow & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - implicit none - - TYPE (domain) :: grid - - integer :: IDS,IDE,JDS,JDE,KDS,KDE - integer :: IMS,IME,JMS,JME,KMS,KME - integer :: ITS,ITE,JTS,JTE,KTS,KTE - integer:: ihw(JDS:JDE-1),ihe(JDS:JDE-1),nsmth,nrow - real:: h(IMS:IME,JMS:JME),landmask(IMS:IME,JMS:JME) - real :: h_old(IMS:IME,JMS:JME) - real :: hbms(IDS:IDE-1,JDS:JDE-1) - real :: hse(IDS:IDE-1,JDS:JDE-1) - real :: hne(IDS:IDE-1,JDS:JDE-1) - integer :: IPS,IPE,JPS,JPE,KPS,KPE - integer :: ihl, ihh, m2l, ibas,jmelin - integer :: I,J,KS,IOFFSET,JSTART,JEND - character (len=255) :: message - - ips=its - ipe=ite - jps=jts - jpe=jte - kps=kts - kpe=kte - - do j= JTS,min(JTE,JDE-1) - ihw(J)=-mod(J,2) - ihe(j)=ihw(J)+1 - end do - - do J=JTS,min(JTE,JDE-1) - do I=ITS,min(ITE,IDE-1) - hbms(I,J)=landmask(I,J) - enddo - enddo - - jmelin=(JDE-1)-nrow+1 - ibas=nrow/2 - m2l=mod(nrow,2) - - do j=jts,min(jte,jde-1) - ihl=ibas+mod(j,2)+m2l*mod(J+1,2) - ihh=(IDE-1)-ibas-m2l*mod(J+1,2) - do i=its,min(ite,ide-1) - if (I .ge. ihl .and. I .le. ihh .and. J .ge. nrow .and. J .le. jmelin) then - hbms(I,J)=0. - endif - end do - end do - - 634 format(30(f2.0,1x)) - - do KS=1,nsmth - - grid%ht_gc=h -#ifdef DM_PARALLEL -# include "HALO_NMM_MG.inc" -#endif - h=grid%ht_gc - h_old=grid%ht_gc - - do J=JTS,min(JTE,JDE-1) - do I=ITS, min(ITE,IDE-1) - if (I .ge. (IDS+mod(J,2)) .and. J .gt. JDS .and. J .lt. JDE-1 .and. I .lt. IDE-1) then - h(i,j)= ( h_old(i+ihe(j),j+1) + h_old(i+ihw(j),j-1) + h_old(i+ihe(j),j-1) + h_old(i+ihw(j),j+1) - & - 4. *h_old(i,j) )*hbms(i,j)*0.125+h_old(i,j) - endif - - enddo - enddo - -! special treatment for four corners - - if (hbms(1,1) .eq. 1 .and. ITS .le. 1 .and. JTS .le. 1) then - h(1,1)=0.75*h(1,1)+0.125*h(1+ihe(1),2)+ & - 0.0625*(h(2,1)+h(1,3)) - endif - - if (hbms(IDE-1,1) .eq. 1 .and. ITE .ge. IDE-2 .and. JTS .le. 1) then - h(IDE-1,1)=0.75*h(IDE-1,1)+0.125*h(IDE-1+ihw(1),2)+ & - 0.0625*(h(IDE-1-1,1)+h(IDE-1,3)) - endif - - if (hbms(1,JDE-1) .eq. 1 .and. ITS .le. 1 .and. JTE .ge. JDE-2) then - h(1,JDE-1)=0.75*h(1,JDE-1)+0.125*h(1+ihe(JDE-1),JDE-1-1)+ & - 0.0625*(h(2,JDE-1)+h(1,JDE-1-2)) - endif - - if (hbms(IDE-1,JDE-1) .eq. 1 .and. ITE .ge. IDE-2 .and. JTE .ge. JDE-2) then - h(IDE-1,JDE-1)=0.75*h(IDE-1,JDE-1)+0.125*h(IDE-1+ihw(JDE-1),JDE-1-1)+ & - 0.0625*(h(IDE-1-1,JDE-1)+h(IDE-1,JDE-1-2)) - endif - - do J=JMS,JME - do I=IMS,IME - grid%ht_gc(I,J)=h(I,J) - enddo - enddo -#ifdef DM_PARALLEL -# include "HALO_NMM_MG.inc" -#endif - do J=JMS,JME - do I=IMS,IME - h(I,J)=grid%ht_gc(I,J) - enddo - enddo - - -! S bound - if (JTS .eq. JDS) then - J=JTS - - do I=ITS,ITE - if (I .ge. IDS+1 .and. I .le. IDE-2) then - if (hbms(I,J) .eq. 1) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J+1)+h(I+ihe(J),J+1)) - endif - endif - enddo - - endif - -! N bound - if (JTE .eq. JDE) then - J=JDE-1 - write(message,*) 'DOING N BOUND SMOOTHING for J= ', J - CALL wrf_debug(100,message) - do I=ITS,min(ITE,IDE-1) - if (hbms(I,J) .eq. 1 .and. I .ge. IDS+1 .and. I .le. IDE-2) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J-1)+h(I+ihe(J),J-1)) - endif - enddo - endif - -! W bound - if (ITS .eq. IDS) then - I=ITS - do J=JTS,min(JTE,JDE-1) - if (hbms(I,J) .eq. 1 .and. J .ge. JDS+2 .and. J .le. JDE-3 .and. mod(J,2) .eq. 1) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihe(J),J+1)+h(I+ihe(J),J-1)) - endif - enddo - endif - -! E bound - if (ITE .eq. IDE) then - write(message,*) 'DOING E BOUND SMOOTHING for I= ', min(ITE,IDE-1) - CALL wrf_debug(100,message) - I=min(ITE,IDE-1) - do J=JTS,min(JTE,JDE-1) - if (hbms(I,J) .eq. 1 .and. J .ge. JDS+2 .and. J .le. JDE-3 .and. mod(J,2) .eq. 1) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J+1)+h(I+ihw(J),J-1)) - endif - enddo - endif - - enddo ! end ks loop - - do J=JMS,JME - do I=IMS,IME - grid%ht_gc(I,J)=h(I,J) - enddo - enddo -#ifdef DM_PARALLEL -#include "HALO_NMM_MG.inc" -#endif - do J=JMS,JME - do I=IMS,IME - h(I,J)=grid%ht_gc(I,J) - enddo - enddo - -! extra smoothing along inner boundary - - if (JTS .eq. JDS) then - if (ITE .eq. IDE) then - IOFFSET=1 - else - IOFFSET=0 - endif -! Southern Boundary - do i=its,min(ITE,IDE-1)-IOFFSET - h(i,2)=0.25*(h(i,1)+h(i+1,1)+ & - h(i,3)+h(i+1,3)) - enddo - endif - - - if (JTE .eq. JDE) then - if (ITE .eq. IDE) then - IOFFSET=1 - else - IOFFSET=0 - endif - do i=its,min(ITE,IDE-1)-IOFFSET - h(i,(JDE-1)-1)=0.25*(h(i,(JDE-1)-2)+h(i+1,(JDE-1)-2)+ & - h(i,JDE-1)+h(i+1,JDE-1)) - enddo - endif - - if (JTS .eq. 1) then - JSTART=4 - else - JSTART=JTS+mod(JTS,2) ! needs to be even - endif - - if (JTE .eq. JDE) then - JEND=(JDE-1)-3 - else - JEND=JTE - endif - - if (ITS .eq. IDS) then - -! Western Boundary - do j=JSTART,JEND,2 - h(1,j)=0.25*(h(1,j-1)+h(2,j-1)+ & - h(1,j+1)+h(2,j+1)) - - enddo - endif - - - if (ITE .eq. IDE) then -! Eastern Boundary - do j=JSTART,JEND,2 - h((IDE-1)-1,j)=0.25*(h((IDE-1)-1,j-1)+h((IDE-1),j-1)+ & - h((IDE-1)-1,j+1)+h((IDE-1),j+1)) - enddo - endif - - - END SUBROUTINE boundary_smooth - -!-------------------------------------------------------------------- - - SUBROUTINE monthly_interp_to_date ( field_in , date_str , field_out , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - ! Linrarly in time interpolate data to a current valid time. The data is - ! assumed to come in "monthly", valid at the 15th of every month. - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte - - CHARACTER (LEN=24) , INTENT(IN) :: date_str - REAL , DIMENSION(ims:ime,jms:jme,12) , INTENT(IN) :: field_in - REAL , DIMENSION(ims:ime, jms:jme) , INTENT(OUT) :: field_out - - ! Local vars - - INTEGER :: i , j , l - INTEGER , DIMENSION(0:13) :: middle - INTEGER :: target_julyr , target_julday , target_date - INTEGER :: julyr , julday , int_month, next_month - REAL :: gmt - CHARACTER (LEN=4) :: yr - CHARACTER (LEN=2) :: mon , day15 - - - WRITE(day15,FMT='(I2.2)') 15 - DO l = 1 , 12 - WRITE(mon,FMT='(I2.2)') l - CALL get_julgmt ( date_str(1:4)//'-'//mon//'-'//day15//'_'//'00:00:00.0000' , julyr , julday , gmt ) - middle(l) = julyr*1000 + julday - END DO - - l = 0 - middle(l) = middle( 1) - 31 - - l = 13 - middle(l) = middle(12) + 31 - - CALL get_julgmt ( date_str , target_julyr , target_julday , gmt ) - target_date = target_julyr * 1000 + target_julday - find_month : DO l = 0 , 12 - IF ( ( middle(l) .LT. target_date ) .AND. ( middle(l+1) .GE. target_date ) ) THEN - DO j = jts , MIN ( jde-1 , jte ) - DO i = its , MIN (ide-1 , ite ) - int_month = MOD ( l , 12 ) - IF ( int_month .EQ. 0 ) int_month = 12 - - IF (int_month == 12) THEN - next_month=1 - ELSE - next_month=int_month+1 - ENDIF - - field_out(i,j) = ( field_in(i,j,next_month) * ( target_date - middle(l) ) + & - field_in(i,j,int_month ) * ( middle(l+1) - target_date ) ) / & - ( middle(l+1) - middle(l) ) - END DO - END DO - EXIT find_month - END IF - END DO find_month - END SUBROUTINE monthly_interp_to_date - -!--------------------------------------------------------------------- - SUBROUTINE monthly_min_max ( field_in , field_min , field_max , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - ! Plow through each month, find the max, min values for each i,j. - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte - - REAL , DIMENSION(ims:ime,jms:jme,12) , INTENT(IN) :: field_in - REAL , DIMENSION(ims:ime, jms:jme) , INTENT(OUT) :: field_min , field_max - - ! Local vars - - INTEGER :: i , j , l - REAL :: minner , maxxer - - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - minner = field_in(i,j,1) - maxxer = field_in(i,j,1) - DO l = 2 , 12 - IF ( field_in(i,j,l) .LT. minner ) THEN - minner = field_in(i,j,l) - END IF - IF ( field_in(i,j,l) .GT. maxxer ) THEN - maxxer = field_in(i,j,l) - END IF - END DO - field_min(i,j) = minner - field_max(i,j) = maxxer - END DO - END DO - - END SUBROUTINE monthly_min_max - -!----------------------------------------------------------------------- - - SUBROUTINE reverse_vert_coord ( field, start_z, end_z & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte, & - start_z, end_z - - REAL, INTENT(INOUT) :: field(IMS:IME,JMS:JME,end_z) -! local - - INTEGER :: I,J,L - REAL, ALLOCATABLE :: dum3d(:,:,:) - - allocate(dum3d(IMS:IME,JMS:JME,end_z)) - - DO L=start_z,end_z - DO J=jts,min(jte,jde-1) - DO I=its,min(ite,ide-1) - dum3d(I,J,L)=field(I,J,end_z-L+start_z) - END DO - END DO - END DO - - DO L=start_z,end_z - DO J=jts,min(jte,jde-1) - DO I=its,min(ite,ide-1) - field(I,J,L)=dum3d(I,J,L) - END DO - END DO - END DO - - DEALLOCATE(dum3d) - - END SUBROUTINE reverse_vert_coord - - -!-------------------------------------------------------------------- - - SUBROUTINE compute_nmm_levels(ninterface, ptop, eta_levels) - - USE module_model_constants - - IMPLICIT NONE - - character(len=132):: message - integer :: ninterface,Lthick,L - real, parameter:: gamma=.0065 - real, parameter:: t_stand=288. - real, parameter:: p_stand=101325. - - real :: maxdz_compute, ptop - real :: plower,pupper,tlay, sum - - real :: eta_levels(ninterface) - real, allocatable:: Z(:) - real, allocatable:: deta_levels_spline(:) - - logical:: print_pbl_warn - -!---------------------------------------------------- - - allocate(Z(ninterface)) - allocate(deta_levels_spline(ninterface-1)) - - CALL compute_eta_spline(ninterface-1,deta_levels_spline,ptop) - - sum=0. - DO L=1,ninterface-1 - sum=sum+deta_levels_spline(L) - ENDDO - - eta_levels(1)=1.00 - - DO L=2,ninterface - eta_levels(L)=eta_levels(L-1)-deta_levels_spline(L-1) - ENDDO - - eta_levels(ninterface)=0.00 - - DO L=2,ninterface-1 - eta_levels(L)=0.5*(eta_levels(L))+0.25*(eta_levels(L-1)+eta_levels(L+1)) - ENDDO - - Z(1)=0. - maxdz_compute=0. - print_pbl_warn=.false. - - DO L=2,ninterface - tlay=max( t_stand-gamma*Z(L-1), 216.5) - plower=ptop+(p_stand-ptop)*eta_levels(L-1) - pupper=ptop+(p_stand-ptop)*eta_levels(L) - Z(L)=Z(L-1)+(tlay*r_d/g)*(log(plower)-log(pupper)) - - if (plower .gt. 85000. .and. pupper .lt. 85000. .and. L .lt. 10) then - print_pbl_warn=.true. - endif - - write(message,*) 'L, eta(l), pupper, Z(L): ', L, eta_levels(L),pupper,Z(L) - CALL wrf_debug(100,message) - - if (Z(L)-Z(L-1) .gt. maxdz_compute) then - Lthick=L - endif - - maxdz_compute=max(maxdz_compute,Z(L)-Z(L-1)) - ENDDO - - if (print_pbl_warn) then - write(message,*) 'WARNING - PBL MAY BE POORLY RESOLVED WITH NUMBER OF VERTICAL LEVELS' - CALL wrf_message(message) - write(message,*) ' - CONSIDER INCREASING THE VERTICAL RESOLUTION' - CALL wrf_message(message) - endif - - write(message,*) 'thickest layer was: ', maxdz_compute , 'meters thick at level: ', Lthick - CALL wrf_message(message) - - END SUBROUTINE compute_nmm_levels - -!--------------------------- - - SUBROUTINE compute_eta_spline(LM, dsg, ptop) - - IMPLICIT NONE - - real:: dsg(LM), ptop, sum, rsum - real, allocatable:: xold(:),dold(:) - real, allocatable:: xnew(:),sgm(:) - real, allocatable:: pps(:),qqs(:),y2s(:) - integer nlev,LM,L,KOLD - - IF (LM .ge. 46) THEN - KOLD=9 - allocate(xold(KOLD)) - allocate(dold(KOLD)) - - xold(1)=.00 - dold(1)=.006 - xold(2)=.13 - dold(2)=.009 - xold(3)=.19 - dold(3)=.012 - xold(4)=.30 - dold(4)=.036 - xold(5)=.42 - dold(5)=.041 - xold(6)=.56 - dold(6)=.040 - xold(7)=.69 - dold(7)=.018 - - if (ptop .ge. 2000.) then - xold(8)=.90 - dold(8)=.012 - xold(9)=1.0 - dold(9)=.006 - else - xold(8)=.90 - dold(8)=.008 - xold(9)=1.0 - dold(9)=.003 - endif - - ELSE - - KOLD=8 - allocate(xold(KOLD)) - allocate(dold(KOLD)) - - xold(1)=.00 - dold(1)=.006 - xold(2)=.18 - dold(2)=.015 - xold(3)=.32 - dold(3)=.035 - xold(4)=.50 - dold(4)=.040 - xold(5)=.68 - dold(5)=.030 - xold(6)=.75 - dold(6)=.017 - xold(7)=.85 - dold(7)=.012 - - if (ptop .ge. 2000.) then - xold(8)=1.0 - dold(8)=.013 - else - xold(8)=1.0 - dold(8)=.008 - endif - - ENDIF - - allocate(xnew(lm)) - allocate(sgm(lm+1)) - allocate(pps(lm)) - allocate(qqs(lm)) - allocate(y2s(lm)) - - DO L=1,LM - xnew(l)=float(l-1)/float(lm-1) - ENDDO - - y2s=0. - - CALL spline(kold,xold,dold,y2s,lm,xnew,dsg,pps,qqs) - - sum=0. - DO l=1,lm - sum=sum+dsg(l) - ENDDO - - rsum=1./sum - sgm(1)=0. - - DO L=1,lm-1 - dsg(l)=dsg(l)*rsum - sgm(l+1)=sgm(l)+dsg(l) - ENDDO - sgm(lm+1)=1. - dsg(lm)=sgm(lm+1)-sgm(lm) - - END SUBROUTINE compute_eta_spline - -! ------------------------------------------------------------------- - - subroutine spline(NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,q) - -! ******************************************************************** -! * * -! * THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE * -! * PROGRAMED FOR A SMALL SCALAR MACHINE. * -! * * -! * PROGRAMER Z. JANJIC * -! * * -! * NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION. MUST BE GE 3. * -! * XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * -! * FUNCTION ARE GIVEN. MUST BE IN ASCENDING ORDER. * -! * YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD. * -! * Y2 - THE SECOND DERIVATIVES AT THE POINTS XOLD. IF NATURAL * -! * SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE * -! * SPECIFIED. * -! * NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED. * -! * XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * -! * FUNCTION ARE CALCULATED. XNEW(K) MUST BE GE XOLD(1) * -! * AND LE XOLD(NOLD). * -! * YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED. * -! * P, q - AUXILIARY VECTORS OF THE LENGTH NOLD-2. * -! * * -! ******************************************************************** -! -! LOG: -! -! JOVIC - July 2008 - fixed incorrectly dimensioned arrays, -! PYLE and do loop leading to out of bound array -! reference -!------ -! -! PYLE - June 2007 - eliminated use of GO TO statements. -! -!----------------------------------------------------------------------- - IMPLICIT NONE -!----------------------------------------------------------------------- - INTEGER,INTENT(IN) :: NNEW,NOLD - REAL,DIMENSION(NOLD),INTENT(IN) :: XOLD,YOLD - REAL,DIMENSION(NNEW),INTENT(IN) :: XNEW - REAL,DIMENSION(NNEW),INTENT(OUT) :: YNEW - REAL,DIMENSION(NOLD+2),INTENT(INOUT) :: P,q,Y2 -! - INTEGER :: K,K1,K2,KOLD,NOLDM1, K2_hold, K_hold - REAL :: AK,BK,CK,DEN,DX,DXC,DXL,DXR,DYDXL,DYDXR & - & ,RDX,RTDXC,X,XK,XSQ,Y2K,Y2KP1 -!----------------------------------------------------------------------- - - NOLDM1=NOLD-1 - - DXL=XOLD(2)-XOLD(1) - DXR=XOLD(3)-XOLD(2) - DYDXL=(YOLD(2)-YOLD(1))/DXL - DYDXR=(YOLD(3)-YOLD(2))/DXR - RTDXC=0.5/(DXL+DXR) - - P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1)) - q(1)=-RTDXC*DXR - - K=3 - first_loop: DO K=3,NOLD-1 - DXL=DXR - DYDXL=DYDXR - DXR=XOLD(K+1)-XOLD(K) - DYDXR=(YOLD(K+1)-YOLD(K))/DXR - DXC=DXL+DXR - DEN=1./(DXL*q(K-2)+DXC+DXC) - P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2)) - q(K-1)=-DEN*DXR - END DO first_loop - - DO K=NOLDM1,2,-1 - Y2(K)=P(K-1)+q(K-1)*Y2(K+1) - K_hold=K - END DO - - K=K_hold - -!----------------------------------------------------------------------- - second_loop: DO K1=1,NNEW - XK=XNEW(K1) - third_loop: DO K2=2,NOLD - - IF(XOLD(K2)>XK)THEN - KOLD=K2-1 - K2_hold=K2 - exit third_loop - ENDIF - K2_hold=K2 - END DO third_loop - - IF (XOLD(K2_hold) .le. XK) THEN - YNEW(K1)=YOLD(NOLD) - CYCLE second_loop - ENDIF - - IF (K1 .eq. 1 .or. K .ne. KOLD) THEN - K=KOLD - Y2K=Y2(K) - Y2KP1=Y2(K+1) - DX=XOLD(K+1)-XOLD(K) - RDX=1./DX - AK=.1666667*RDX*(Y2KP1-Y2K) - BK=0.5*Y2K - CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K) - ENDIF - - X=XK-XOLD(K) - XSQ=X*X - YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K) - - END DO second_loop - - END SUBROUTINE SPLINE -!-------------------------------------------------------------------- - SUBROUTINE NMM_SH2O(IMS,IME,JMS,JME,ISTART,IM,JSTART,JM,& - NSOIL,ISLTPK, & - sm,sice,stc,smc,sh2o) - -!! INTEGER, PARAMETER:: NSOTYP=9 -! INTEGER, PARAMETER:: NSOTYP=16 - INTEGER, PARAMETER:: NSOTYP=19 !!!!!!!!MAYBE??? - - REAL :: PSIS(NSOTYP),BETA(NSOTYP),SMCMAX(NSOTYP) - REAL :: stc(IMS:IME,NSOIL,JMS:JME), & - smc(IMS:IME,NSOIL,JMS:JME) - REAL :: sh2o(IMS:IME,NSOIL,JMS:JME),sice(IMS:IME,JMS:JME),& - sm(IMS:IME,JMS:JME) - REAL :: HLICE,GRAV,T0,BLIM - INTEGER :: ISLTPK(IMS:IME,JMS:JME) - CHARACTER(LEN=255) :: message - -! Constants used in cold start sh2o initialization - DATA HLICE/3.335E5/,GRAV/9.81/,T0/273.15/ - DATA BLIM/5.5/ -! DATA PSIS /0.04,0.62,0.47,0.14,0.10,0.26,0.14,0.36,0.04/ -! DATA BETA /4.26,8.72,11.55,4.74,10.73,8.17,6.77,5.25,4.26/ -! DATA SMCMAX /0.421,0.464,0.468,0.434,0.406, & -! 0.465,0.404,0.439,0.421/ - - -!!! NOT SURE...PSIS=SATPSI, BETA=BB?? - - DATA PSIS /0.069, 0.036, 0.141, 0.759, 0.759, 0.355, & - 0.135, 0.617, 0.263, 0.098, 0.324, 0.468, & - 0.355, 0.000, 0.069, 0.036, 0.468, 0.069, 0.069 / - - DATA BETA/2.79, 4.26, 4.74, 5.33, 5.33, 5.25, & - 6.66, 8.72, 8.17, 10.73, 10.39, 11.55, & - 5.25, 0.00, 2.79, 4.26, 11.55, 2.79, 2.79 / - - DATA SMCMAX/0.339, 0.421, 0.434, 0.476, 0.476, 0.439, & - 0.404, 0.464, 0.465, 0.406, 0.468, 0.468, & - 0.439, 1.000, 0.200, 0.421, 0.468, 0.200, 0.339/ - - DO K=1,NSOIL - DO J=JSTART,JM - DO I=ISTART,IM - -!tst - IF (smc(I,K,J) .gt. SMCMAX(ISLTPK(I,J))) then - if (K .eq. 1) then - write(message,*) 'I,J,reducing smc from ' ,I,J,smc(I,K,J), 'to ', SMCMAX(ISLTPK(I,J)) - CALL wrf_debug(100,message) - endif - smc(I,K,J)=SMCMAX(ISLTPK(I,J)) - ENDIF -!tst - - IF ( (sm(I,J) .lt. 0.5) .and. (sice(I,J) .lt. 0.5) ) THEN - - IF (ISLTPK(I,J) .gt. 19) THEN - WRITE(message,*) 'FORCING ISLTPK at : ', I,J - CALL wrf_message(message) - ISLTPK(I,J)=9 - ELSEIF (ISLTPK(I,J) .le. 0) then - WRITE(message,*) 'FORCING ISLTPK at : ', I,J - CALL wrf_message(message) - ISLTPK(I,J)=1 - ENDIF - - -! cold start: determine liquid soil water content (sh2o) -! sh2o <= smc for t < 273.149K (-0.001C) - - IF (stc(I,K,J) .LT. 273.149) THEN - -! first guess following explicit solution for Flerchinger Eqn from Koren -! et al, JGR, 1999, Eqn 17 (KCOUNT=0 in FUNCTION FRH2O). - - BX = BETA(ISLTPK(I,J)) - IF ( BETA(ISLTPK(I,J)) .GT. BLIM ) BX = BLIM - - if ( GRAV*(-PSIS(ISLTPK(I,J))) .eq. 0 ) then - write(message,*) 'TROUBLE' - CALL wrf_message(message) - write(message,*) 'I,J: ', i,J - CALL wrf_message(message) - write(message,*) 'grav, isltpk, psis(isltpk): ', grav,isltpk(I,J),& - psis(isltpk(I,J)) - CALL wrf_message(message) - endif - - if (BX .eq. 0 .or. stc(I,K,J) .eq. 0) then - write(message,*) 'TROUBLE -- I,J,BX, stc: ', I,J,BX,stc(I,K,J) - CALL wrf_message(message) - endif - FK = (((HLICE/(GRAV*(-PSIS(ISLTPK(I,J)))))* & - ((stc(I,K,J)-T0)/stc(I,K,J)))** & - (-1/BX))*SMCMAX(ISLTPK(I,J)) - IF (FK .LT. 0.02) FK = 0.02 - sh2o(I,K,J) = MIN ( FK, smc(I,K,J) ) -! ---------------------------------------------------------------------- -! now use iterative solution for liquid soil water content using -! FUNCTION FRH2O (from the Eta "NOAH" land-surface model) with the -! initial guess for sh2o from above explicit first guess. - - sh2o(I,K,J)=FRH2O_init(stc(I,K,J),smc(I,K,J),sh2o(I,K,J), & - SMCMAX(ISLTPK(I,J)),BETA(ISLTPK(I,J)), & - PSIS(ISLTPK(I,J))) - - ELSE ! above freezing - sh2o(I,K,J)=smc(I,K,J) - ENDIF - - - ELSE ! water point - sh2o(I,K,J)=smc(I,K,J) - - ENDIF ! test on land/ice/sea - if (sh2o(I,K,J) .gt. SMCMAX(ISLTPK(I,J))) then - write(message,*) 'sh2o > THAN SMCMAX ', I,J,sh2o(I,K,J),SMCMAX(ISLTPK(I,J)),smc(I,K,J) - CALL wrf_message(message) - endif - - ENDDO - ENDDO - ENDDO - - END SUBROUTINE NMM_SH2O - -!------------------------------------------------------------------- - - FUNCTION FRH2O_init(TKELV,smc,sh2o,SMCMAX,B,PSIS) - - IMPLICIT NONE - -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! PURPOSE: CALCULATE AMOUNT OF SUPERCOOLED LIQUID SOIL WATER CONTENT -! IF TEMPERATURE IS BELOW 273.15K (T0). REQUIRES NEWTON-TYPE ITERATION -! TO SOLVE THE NONLINEAR IMPLICIT EQUATION GIVEN IN EQN 17 OF -! KOREN ET AL. (1999, JGR, VOL 104(D16), 19569-19585). -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! -! New version (JUNE 2001): much faster and more accurate newton iteration -! achieved by first taking log of eqn cited above -- less than 4 -! (typically 1 or 2) iterations achieves convergence. Also, explicit -! 1-step solution option for special case of parameter Ck=0, which reduces -! the original implicit equation to a simpler explicit form, known as the -! ""Flerchinger Eqn". Improved handling of solution in the limit of -! freezing point temperature T0. -! -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! -! INPUT: -! -! TKELV.........Temperature (Kelvin) -! smc...........Total soil moisture content (volumetric) -! sh2o..........Liquid soil moisture content (volumetric) -! SMCMAX........Saturation soil moisture content (from REDPRM) -! B.............Soil type "B" parameter (from REDPRM) -! PSIS..........Saturated soil matric potential (from REDPRM) -! -! OUTPUT: -! FRH2O.........supercooled liquid water content. -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - - REAL B - REAL BLIM - REAL BX - REAL CK - REAL DENOM - REAL DF - REAL DH2O - REAL DICE - REAL DSWL - REAL ERROR - REAL FK - REAL FRH2O_init - REAL GS - REAL HLICE - REAL PSIS - REAL sh2o - REAL smc - REAL SMCMAX - REAL SWL - REAL SWLK - REAL TKELV - REAL T0 - - INTEGER NLOG - INTEGER KCOUNT - PARAMETER (CK=8.0) -! PARAMETER (CK=0.0) - PARAMETER (BLIM=5.5) -! PARAMETER (BLIM=7.0) - PARAMETER (ERROR=0.005) - - PARAMETER (HLICE=3.335E5) - PARAMETER (GS = 9.81) - PARAMETER (DICE=920.0) - PARAMETER (DH2O=1000.0) - PARAMETER (T0=273.15) - -! ### LIMITS ON PARAMETER B: B < 5.5 (use parameter BLIM) #### -! ### SIMULATIONS SHOWED IF B > 5.5 UNFROZEN WATER CONTENT #### -! ### IS NON-REALISTICALLY HIGH AT VERY LOW TEMPERATURES #### -! ################################################################ -! - BX = B - IF ( B .GT. BLIM ) BX = BLIM -! ------------------------------------------------------------------ - -! INITIALIZING ITERATIONS COUNTER AND ITERATIVE SOLUTION FLAG. - NLOG=0 - KCOUNT=0 - -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! C IF TEMPERATURE NOT SIGNIFICANTLY BELOW FREEZING (T0), sh2o = smc -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - - - IF (TKELV .GT. (T0 - 1.E-3)) THEN - - FRH2O_init=smc - - ELSE - -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - IF (CK .NE. 0.0) THEN - -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! CCCCCCCCC OPTION 1: ITERATED SOLUTION FOR NONZERO CK CCCCCCCCCCC -! CCCCCCCCCCCC IN KOREN ET AL, JGR, 1999, EQN 17 CCCCCCCCCCCCCCCCC - -! INITIAL GUESS FOR SWL (frozen content) - SWL = smc-sh2o -! KEEP WITHIN BOUNDS. - IF (SWL .GT. (smc-0.02)) SWL=smc-0.02 - IF(SWL .LT. 0.) SWL=0. -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! C START OF ITERATIONS -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - DO WHILE (NLOG .LT. 10 .AND. KCOUNT .EQ. 0) - NLOG = NLOG+1 - DF = ALOG(( PSIS*GS/HLICE ) * ( ( 1.+CK*SWL )**2. ) * & - ( SMCMAX/(smc-SWL) )**BX) - ALOG(-(TKELV-T0)/TKELV) - DENOM = 2. * CK / ( 1.+CK*SWL ) + BX / ( smc - SWL ) - SWLK = SWL - DF/DENOM -! BOUNDS USEFUL FOR MATHEMATICAL SOLUTION. - IF (SWLK .GT. (smc-0.02)) SWLK = smc - 0.02 - IF(SWLK .LT. 0.) SWLK = 0. -! MATHEMATICAL SOLUTION BOUNDS APPLIED. - DSWL=ABS(SWLK-SWL) - SWL=SWLK -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! CC IF MORE THAN 10 ITERATIONS, USE EXPLICIT METHOD (CK=0 APPROX.) -! CC WHEN DSWL LESS OR EQ. ERROR, NO MORE ITERATIONS REQUIRED. -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - IF ( DSWL .LE. ERROR ) THEN - KCOUNT=KCOUNT+1 - END IF - END DO -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! C END OF ITERATIONS -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! BOUNDS APPLIED WITHIN DO-BLOCK ARE VALID FOR PHYSICAL SOLUTION. - FRH2O_init = smc - SWL - -! CCCCCCCCCCCCCCCCCCCCCCCC END OPTION 1 CCCCCCCCCCCCCCCCCCCCCCCCCCC - - ENDIF - - IF (KCOUNT .EQ. 0) THEN -! Print*,'Flerchinger used in NEW version. Iterations=',NLOG - -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! CCCCC OPTION 2: EXPLICIT SOLUTION FOR FLERCHINGER EQ. i.e. CK=0 CCCCCCCC -! CCCCCCCCCCCCC IN KOREN ET AL., JGR, 1999, EQN 17 CCCCCCCCCCCCCCC - - FK=(((HLICE/(GS*(-PSIS)))*((TKELV-T0)/TKELV))**(-1/BX))*SMCMAX -! APPLY PHYSICAL BOUNDS TO FLERCHINGER SOLUTION - IF (FK .LT. 0.02) FK = 0.02 - FRH2O_init = MIN ( FK, smc ) - -! CCCCCCCCCCCCCCCCCCCCCCCCC END OPTION 2 CCCCCCCCCCCCCCCCCCCCCCCCCC - - ENDIF - - ENDIF - - RETURN - - END FUNCTION FRH2O_init - - -!-------------------------------------------------------------------- - - SUBROUTINE init_module_initialize - END SUBROUTINE init_module_initialize - -!--------------------------------------------------------------------- - -END MODULE module_initialize_real diff --git a/dyn_nmm/module_initialize_tropical_cyclone.F b/dyn_nmm/module_initialize_tropical_cyclone.F deleted file mode 100644 index eda929f756..0000000000 --- a/dyn_nmm/module_initialize_tropical_cyclone.F +++ /dev/null @@ -1,6772 +0,0 @@ -!REAL:MODEL_LAYER:INITIALIZATION - -! This MODULE holds the routines which are used to perform various initializations -! for individual domains utilizing the NMM dynamical core. - -!----------------------------------------------------------------------- - -MODULE module_initialize_ideal - - USE module_bc - USE module_configure - USE module_domain - USE module_io_domain - USE module_model_constants -! USE module_si_io_nmm - USE module_state_description - USE module_timing - USE module_soil_pre -#ifdef DM_PARALLEL - USE module_dm, ONLY : LOCAL_COMMUNICATOR & - ,MYTASK,NTASKS,NTASKS_X & - ,NTASKS_Y - USE module_comm_dm - USE module_ext_internal -#endif - - INTEGER :: internal_time_loop - INTEGER:: MPI_COMM_COMP,MYPE - INTEGER:: loopinc, iloopinc - -CONTAINS - -!------------------------------------------------------------------- - - SUBROUTINE init_domain ( grid ) - - IMPLICIT NONE - - ! Input space and data. No gridded meteorological data has been stored, though. - -! TYPE (domain), POINTER :: grid - TYPE (domain) :: grid - - ! Local data. - - INTEGER :: idum1, idum2 - - CALL set_scalar_indices_from_config ( head_grid%id , idum1, idum2 ) - - CALL init_domain_nmm (grid & -! -#include "actual_new_args.inc" -! - ) - - END SUBROUTINE init_domain - -!------------------------------------------------------------------- -!--------------------------------------------------------------------- - SUBROUTINE init_domain_nmm ( grid & -! -# include "dummy_new_args.inc" -! - ) - - USE module_optional_input - IMPLICIT NONE - - ! Input space and data. No gridded meteorological data has been stored, though. - -! TYPE (domain), POINTER :: grid - TYPE (domain) :: grid - -# include "dummy_new_decl.inc" - - -real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_metgrid_levels) :: ght_out -real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_metgrid_levels) :: rh_out -real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_metgrid_levels) :: t_out -real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_metgrid_levels) :: u_out -real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_metgrid_levels) :: v_out -real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_land_cat) :: landusef_out -real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_soil_cat) :: soilcbot_out -real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_soil_cat) :: soilctop_out - - TYPE (grid_config_rec_type) :: config_flags - - ! Local domain indices and counters. - - INTEGER :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat - INTEGER :: num_veg_gc , num_soil_top_gc , num_soil_bot_gc - - INTEGER :: & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - its, ite, jts, jte, kts, kte, & - ips, ipe, jps, jpe, kps, kpe, & - i, j, k, NNXP, NNYP - - ! Local data - - CHARACTER(LEN=19):: start_date - -#ifdef DM_PARALLEL - - LOGICAL,EXTERNAL :: WRF_DM_ON_MONITOR - logical :: test - -! INTEGER :: DOMDESC - REAL,ALLOCATABLE :: SICE_G(:,:), SM_G(:,:) - INTEGER, ALLOCATABLE:: IHE_G(:),IHW_G(:) - INTEGER, ALLOCATABLE:: ITEMP(:,:) - INTEGER :: my_e,my_n,my_s,my_w,my_ne,my_nw,my_se,my_sw,myi,myj,npe - INTEGER :: istat,inpes,jnpes -#else - integer, allocatable:: ihw(:),ihe(:) -#endif - - - CHARACTER (LEN=255) :: message - - INTEGER :: error - REAL :: p_surf, p_level - REAL :: cof1, cof2 - REAL :: qvf , qvf1 , qvf2 , pd_surf - REAL :: p00 , t00 , a - REAL :: hold_znw, rmin,rmax - - REAL :: p_top_requested , ptsgm - INTEGER :: num_metgrid_levels, ICOUNT - REAL , DIMENSION(max_eta) :: eta_levels - - LOGICAL :: stretch_grid, dry_sounding, debug, log_flag_sst, hyb_coor - - REAL, ALLOCATABLE,DIMENSION(:,:):: ADUM2D,SNOWC,HT,TG_ALT, & - PDVP,PSFC_OUTV - - REAL, ALLOCATABLE,DIMENSION(:,:,:):: P3D_OUT,P3DV_OUT,P3DV_IN, & - QTMP,QTMP2 - - INTEGER, ALLOCATABLE, DIMENSION(:):: KHL2,KVL2,KHH2,KVH2, & - KHLA,KHHA,KVLA,KVHA - -! INTEGER, ALLOCATABLE, DIMENSION(:,:):: grid%lu_index - - REAL, ALLOCATABLE, DIMENSION(:):: DXJ,WPDARJ,CPGFUJ,CURVJ, & - FCPJ,FDIVJ,EMJ,EMTJ,FADJ, & - HDACJ,DDMPUJ,DDMPVJ - - REAL, ALLOCATABLE,DIMENSION(:),SAVE:: SG1,SG2,DSG1,DSG2, & - SGML1,SGML2 - -!-- Carsel and Parrish [1988] - REAL , DIMENSION(100) :: lqmi - integer iicount - - REAL:: TPH0D,TLM0D - REAL:: TPH0,WB,SB,TDLM,TDPH - REAL:: WBI,SBI,EBI,ANBI,STPH0,CTPH0 - REAL:: TSPH,DTAD,DTCF - REAL:: ACDT,CDDAMP,DXP,FP - REAL:: WBD,SBD - REAL:: RSNOW,SNOFAC - REAL, PARAMETER:: SALP=2.60 - REAL, PARAMETER:: SNUP=0.040 - REAL:: SMCSUM,STCSUM,SEAICESUM,FISX - REAL:: cur_smc, aposs_smc - - REAL:: COAC, CODAMP - - INTEGER,PARAMETER:: DOUBLE=SELECTED_REAL_KIND(15,300) - REAL(KIND=DOUBLE):: TERM1,APH,TLM,TPH,DLM,DPH,STPH,CTPH - - INTEGER:: KHH,KVH,JAM,JA, IHL, IHH, L - INTEGER:: II,JJ,ISRCH,ISUM,ITER,Ilook,Jlook - - REAL, PARAMETER:: DTR=0.01745329 - REAL, PARAMETER:: W_NMM=0.08 -#if ( HWRF == 1 ) - REAL, PARAMETER:: DDFC=1.0 -#else - REAL, PARAMETER:: DDFC=8.0 -#endif - REAL, PARAMETER:: TWOM=.00014584 - REAL, PARAMETER:: CP=1004.6 - REAL, PARAMETER:: DFC=1.0 - REAL, PARAMETER:: ROI=916.6 - REAL, PARAMETER:: R=287.04 - REAL, PARAMETER:: CI=2060.0 - REAL, PARAMETER:: ROS=1500. - REAL, PARAMETER:: CS=1339.2 - REAL, PARAMETER:: DS=0.050 - REAL, PARAMETER:: AKS=.0000005 - REAL, PARAMETER:: DZG=2.85 - REAL, PARAMETER:: DI=.1000 - REAL, PARAMETER:: AKI=0.000001075 - REAL, PARAMETER:: DZI=2.0 - REAL, PARAMETER:: THL=210. - REAL, PARAMETER:: PLQ=70000. - REAL, PARAMETER:: ERAD=6371200. - REAL, PARAMETER:: TG0=258.16 - REAL, PARAMETER:: TGA=30.0 - integer :: numzero,numexamined -#if ( HWRF == 1 ) -!============================================================================ -! gopal's doing for ocean coupling -!============================================================================ - - REAL, DIMENSION(:,:), ALLOCATABLE :: NHLAT,NHLON,NVLAT,NVLON,HRES_SM - REAL :: NDLMD,NDPHD,NWBD,NSBD - INTEGER :: NIDE,NJDE,ILOC,JLOC - - INTEGER fid, ierr, nprocs - CHARACTER*255 f65name, SysString - -!============================================================================ -! end gopal's doing for ocean coupling -!============================================================================ -#endif - - if (ALLOCATED(ADUM2D)) DEALLOCATE(ADUM2D) - if (ALLOCATED(TG_ALT)) DEALLOCATE(TG_ALT) - -!#define COPY_IN -!#include "scalar_derefs.inc" -#ifdef DM_PARALLEL -# include "data_calls.inc" -#endif - - SELECT CASE ( model_data_order ) - CASE ( DATA_ORDER_ZXY ) - kds = grid%sd31 ; kde = grid%ed31 ; - ids = grid%sd32 ; ide = grid%ed32 ; - jds = grid%sd33 ; jde = grid%ed33 ; - - kms = grid%sm31 ; kme = grid%em31 ; - ims = grid%sm32 ; ime = grid%em32 ; - jms = grid%sm33 ; jme = grid%em33 ; - - kts = grid%sp31 ; kte = grid%ep31 ; ! tile is entire patch - its = grid%sp32 ; ite = grid%ep32 ; ! tile is entire patch - jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch - - CASE ( DATA_ORDER_XYZ ) - ids = grid%sd31 ; ide = grid%ed31 ; - jds = grid%sd32 ; jde = grid%ed32 ; - kds = grid%sd33 ; kde = grid%ed33 ; - - ims = grid%sm31 ; ime = grid%em31 ; - jms = grid%sm32 ; jme = grid%em32 ; - kms = grid%sm33 ; kme = grid%em33 ; - - its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch - jts = grid%sp32 ; jte = grid%ep32 ; ! tile is entire patch - kts = grid%sp33 ; kte = grid%ep33 ; ! tile is entire patch - - CASE ( DATA_ORDER_XZY ) - ids = grid%sd31 ; ide = grid%ed31 ; - kds = grid%sd32 ; kde = grid%ed32 ; - jds = grid%sd33 ; jde = grid%ed33 ; - - ims = grid%sm31 ; ime = grid%em31 ; - kms = grid%sm32 ; kme = grid%em32 ; - jms = grid%sm33 ; jme = grid%em33 ; - - its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch - kts = grid%sp32 ; kte = grid%ep32 ; ! tile is entire patch - jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch - - END SELECT - -#ifdef DM_PARALLEL - CALL WRF_GET_MYPROC(MYPE) - CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP) - call wrf_get_nprocx(inpes) - call wrf_get_nprocy(jnpes) -! - allocate(itemp(inpes,jnpes),stat=istat) - npe=0 -! - do j=1,jnpes - do i=1,inpes - itemp(i,j)=npe - if(npe==mype)then - myi=i - myj=j - endif - npe=npe+1 - enddo - enddo -! - my_n=-1 - if(myj+1<=jnpes)my_n=itemp(myi,myj+1) -! - my_e=-1 - if(myi+1<=inpes)my_e=itemp(myi+1,myj) -! - my_s=-1 - if(myj-1>=1)my_s=itemp(myi,myj-1) -! - my_w=-1 - if(myi-1>=1)my_w=itemp(myi-1,myj) -! - my_ne=-1 - if((myi+1<=inpes).and.(myj+1<=jnpes)) & - my_ne=itemp(myi+1,myj+1) -! - my_se=-1 - if((myi+1<=inpes).and.(myj-1>=1)) & - my_se=itemp(myi+1,myj-1) -! - my_sw=-1 - if((myi-1>=1).and.(myj-1>=1)) & - my_sw=itemp(myi-1,myj-1) -! - my_nw=-1 - if((myi-1>=1).and.(myj+1<=jnpes)) & - my_nw=itemp(myi-1,myj+1) -! -! my_neb(1)=my_n -! my_neb(2)=my_e -! my_neb(3)=my_s -! my_neb(4)=my_w -! my_neb(5)=my_ne -! my_neb(6)=my_se -! my_neb(7)=my_sw -! my_neb(8)=my_nw -! - deallocate(itemp) -#endif - - grid%DT=float(grid%TIME_STEP) - - NNXP=min(ITE,IDE-1) - NNYP=min(JTE,JDE-1) - - write(message,*) 'IDE, JDE: ', IDE,JDE - write(message,*) 'NNXP, NNYP: ', NNXP,NNYP - CALL wrf_message(message) - - JAM=6+2*(JDE-JDS-10) - - if (internal_time_loop .eq. 1) then - ALLOCATE(ADUM2D(grid%sm31:grid%em31,jms:jme)) - ALLOCATE(KHL2(JTS:NNYP),KVL2(JTS:NNYP),KHH2(JTS:NNYP),KVH2(JTS:NNYP)) - ALLOCATE(DXJ(JTS:NNYP),WPDARJ(JTS:NNYP),CPGFUJ(JTS:NNYP),CURVJ(JTS:NNYP)) - ALLOCATE(FCPJ(JTS:NNYP),FDIVJ(JTS:NNYP),& - FADJ(JTS:NNYP)) - ALLOCATE(HDACJ(JTS:NNYP),DDMPUJ(JTS:NNYP),DDMPVJ(JTS:NNYP)) - ALLOCATE(KHLA(JAM),KHHA(JAM)) - ALLOCATE(KVLA(JAM),KVHA(JAM)) - endif - - - CALL model_to_grid_config_rec ( grid%id , model_config_rec , config_flags ) - - IF ( CONFIG_FLAGS%FRACTIONAL_SEAICE == 1 ) THEN - CALL WRF_ERROR_FATAL("NMM cannot use FRACTIONAL_SEAICE = 1") - ENDIF - - if ( config_flags%bl_pbl_physics == BOULACSCHEME ) then - call wrf_error_fatal("Cannot use BOULAC PBL with NMM") - endif - - write(message,*) 'cen_lat: ', config_flags%cen_lat - CALL wrf_debug(100,message) - write(message,*) 'cen_lon: ', config_flags%cen_lon - CALL wrf_debug(100,message) - write(message,*) 'dx: ', config_flags%dx - CALL wrf_debug(100,message) - write(message,*) 'dy: ', config_flags%dy - CALL wrf_debug(100,message) - write(message,*) 'config_flags%start_year: ', config_flags%start_year - CALL wrf_debug(100,message) - write(message,*) 'config_flags%start_month: ', config_flags%start_month - CALL wrf_debug(100,message) - write(message,*) 'config_flags%start_day: ', config_flags%start_day - CALL wrf_debug(100,message) - write(message,*) 'config_flags%start_hour: ', config_flags%start_hour - CALL wrf_debug(100,message) - - write(start_date,435) config_flags%start_year, config_flags%start_month, & - config_flags%start_day, config_flags%start_hour - 435 format(I4,'-',I2.2,'-',I2.2,'_',I2.2,':00:00') - - grid%dlmd=config_flags%dx - grid%dphd=config_flags%dy - tph0d=config_flags%cen_lat - tlm0d=config_flags%cen_lon - -!========================================================================== - -!! - - ! Check to see if the boundary conditions are set - ! properly in the namelist file. - ! This checks for sufficiency and redundancy. - - CALL boundary_condition_check( config_flags, bdyzone, error, grid%id ) - - ! Some sort of "this is the first time" initialization. Who knows. - - grid%itimestep=0 - - ! Pull in the info in the namelist to compare it to the input data. - - grid%real_data_init_type = model_config_rec%real_data_init_type -! write(message,*) 'what is flag_metgrid: ', flag_metgrid -! CALL wrf_message(message) - - IF ( flag_metgrid .EQ. 1 ) THEN ! <----- START OF VERTICAL INTERPOLATION PART ----> - - num_metgrid_levels = grid%num_metgrid_levels - -!--------------------------------------------------------------------- -! bug fix for albedo and emissivity - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - grid%landmask(I,J) = 0. - END DO - END DO -! end bug fix for albedo and emissivity - -! -! gopal's doing for ideal cases -! - - num_veg_gc = SIZE ( grid%landusef_gc , DIM=3 ) - num_soil_top_gc = SIZE ( grid%soilctop_gc , DIM=3 ) - num_soil_bot_gc = SIZE ( grid%soilcbot_gc , DIM=3 ) - -#ifdef DM_PARALLEL -ips=its ; ipe=ite ; jps=jts ; jpe=jte ; kps=kts ; kpe=kte -!JWB # include "HALO_NMM_IDEAL_1.inc" -#endif -! - WRITE(message,*)'--------------- ght_gc before calling vortex --------------------------' -! call wrf_debug(1,message) -! WRITE(message,*)grid%ght_gc(100,100,:) - - CALL vortex ( grid%ght_gc,grid%rh_gc,grid%t_gc,grid%u_gc,grid%v_gc,grid%p_gc & - &, ght_out,rh_out,t_out,u_out,v_out & - &, grid%ht_gc,grid%tsk_gc,grid%xice_gc & - &, grid%hlat_gc,grid%hlon_gc,grid%vlat_gc,grid%vlon_gc & - &, grid%greenfrac_gc,grid%albedo12m_gc,grid%landusef_gc & - &, grid%soilctop_gc,grid%soilcbot_gc & - &, landusef_out,soilctop_out,soilcbot_out & - &, num_veg_gc,num_soil_top_gc,num_soil_bot_gc & - &, config_flags%dx,internal_time_loop & - &, 1,grid%num_metgrid_levels,config_flags%sf_surface_physics & - &, ids,ide,jds,jde,kds,kde & - &, ims,ime,jms,jme,kms,kme & - &, its,ite,jts,jte,kts,kte ) - -!---------------------------------------------------------------------- - - IF (grid%ght_gc(its,jts,num_metgrid_levels/2) .lt. grid%ght_gc(its,jts,num_metgrid_levels/2+1)) THEN - - write(message,*) 'normal ground up file order' - hyb_coor=.false. - CALL wrf_message(message) - - ELSE - - hyb_coor=.true. - write(message,*) 'reverse the order of coordinate' - CALL wrf_message(message) - - CALL reverse_vert_coord(grid%ght_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - -#if ( HWRF == 1 ) - if(.not. grid%use_prep_hybrid) then -#endif - - CALL reverse_vert_coord(grid%p_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - CALL reverse_vert_coord(grid%t_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - CALL reverse_vert_coord(grid%u_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - CALL reverse_vert_coord(grid%v_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - CALL reverse_vert_coord(grid%rh_gc, 2, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - -#if ( HWRF == 1 ) - endif -#endif - - endif - - - IF (hyb_coor) THEN - ! limit extreme deviations from source model topography - ! due to potential for nasty extrapolation/interpolation issues - ! - write(message,*) 'min, max of grid%ht_gc before adjust: ', minval(grid%ht_gc), maxval(grid%ht_gc) - CALL wrf_debug(100,message) - ICOUNT=0 - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - IF ((grid%ht_gc(I,J) - grid%ght_gc(I,J,2)) .LT. -150.) THEN - grid%ht_gc(I,J)=grid%ght_gc(I,J,2)-150. - IF (ICOUNT .LT. 20) THEN - write(message,*) 'increasing NMM topo toward RUC ', I,J - CALL wrf_debug(100,message) - ICOUNT=ICOUNT+1 - ENDIF - ELSEIF ((grid%ht_gc(I,J) - grid%ght_gc(I,J,2)) .GT. 150.) THEN - grid%ht_gc(I,J)=grid%ght_gc(I,J,2)+150. - IF (ICOUNT .LT. 20) THEN - write(message,*) 'decreasing NMM topo toward RUC ', I,J - CALL wrf_debug(100,message) - ICOUNT=ICOUNT+1 - ENDIF - ENDIF - END DO - END DO - - write(message,*) 'min, max of ht_gc after correct: ', minval(grid%ht_gc), maxval(grid%ht_gc) - CALL wrf_debug(100,message) - ENDIF - - CALL boundary_smooth(grid%ht_gc,grid%landmask, grid, 12 , 12 & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - if (grid%landmask(I,J) .gt. 0.5) grid%sm(I,J)=0. - if (grid%landmask(I,J) .le. 0.5) grid%sm(I,J)=1. - if (grid%tsk_gc(I,J) .gt. 0.) then - grid%nmm_tsk(I,J)=grid%tsk_gc(I,J) - else -#if ( HWRF == 1 ) - if(grid%use_prep_hybrid) then - if(grid%t(I,J,1)<100) then - write(message,*) 'NO VALID SURFACE TEMPERATURE: I,J,TSK_GC(I,J),T(I,J,1) = ', & - I,J,grid%TSK_GC(I,J),grid%T(I,J,1) - call wrf_debug(1,message) - else - grid%nmm_tsk(I,J)=grid%t(I,J,1) ! stopgap measure - end if - else -#endif - grid%nmm_tsk(I,J)=grid%t_gc(I,J,1) ! stopgap measure -#if ( HWRF == 1 ) - endif -#endif - endif -! - grid%glat(I,J)=grid%hlat_gc(I,J)*DEGRAD - grid%glon(I,J)=grid%hlon_gc(I,J)*DEGRAD - grid%weasd(I,J)=grid%snow(I,J) - grid%xice(I,J)=grid%xice_gc(I,J) - ENDDO - ENDDO -! First item is to define the target vertical coordinate - - num_metgrid_levels = grid%num_metgrid_levels - eta_levels(1:kde) = model_config_rec%eta_levels(1:kde) - ptsgm = model_config_rec%ptsgm - p_top_requested = grid%p_top_requested - grid%pt=p_top_requested - - if (internal_time_loop .eq. 1) then - - if (eta_levels(1) .ne. 1.0) then -#if ( HWRF == 1 ) - if(grid%use_prep_hybrid) then - call wrf_error_fatal('PREP_HYBRID ERROR: eta_levels is not specified, but use_prep_hybrid=.true.') - end if -#endif - - write(message,*) '********************************************************************* ' - CALL wrf_message(message) - write(message,*) '** eta_levels appears not to be specified in the namelist' - CALL wrf_message(message) - write(message,*) '** We will call compute_nmm_levels to define layer thicknesses.' - CALL wrf_message(message) - write(message,*) '** These levels should be reasonable for running the model, ' - CALL wrf_message(message) - write(message,*) '** but may not be ideal for the simulation being made. Consider ' - CALL wrf_message(message) - write(message,*) '** defining your own levels by specifying eta_levels in the model ' - CALL wrf_message(message) - write(message,*) '** namelist. ' - CALL wrf_message(message) - write(message,*) '********************************************************************** ' - CALL wrf_message(message) - - CALL compute_nmm_levels(KDE,p_top_requested,eta_levels) - - DO L=1,KDE - write(message,*) 'L, eta_levels(L) returned :: ', L,eta_levels(L) - CALL wrf_message(message) - ENDDO - - endif - - write(message,*) 'KDE-1: ', KDE-1 - CALL wrf_debug(1,message) - allocate(SG1(1:KDE-1)) - allocate(SG2(1:KDE-1)) - allocate(DSG1(1:KDE-1)) - allocate(DSG2(1:KDE-1)) - allocate(SGML1(1:KDE)) - allocate(SGML2(1:KDE)) - - CALL define_nmm_vertical_coord (kde-1, ptsgm, grid%pt,grid%pdtop, eta_levels, & - grid%eta1,grid%deta1,grid%aeta1, & - grid%eta2,grid%deta2,grid%aeta2, grid%dfl, grid%dfrlg ) - - DO L=KDS,KDE-1 - grid%deta(L)=eta_levels(L)-eta_levels(L+1) - ENDDO - endif - - write(message,*) 'num_metgrid_levels: ', num_metgrid_levels - CALL wrf_message(message) - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - grid%fis(I,J)=grid%ht_gc(I,J)*g -! -! IF ( grid%p_gc(I,J,1) .ne. 200100. .AND. (grid%ht_gc(I,J) .eq. grid%ght_gc(I,J,1)) .AND. grid%ht_gc(I,J) .ne. 0) THEN - IF ( grid%p_gc(I,J,1) .ne. 200100. .AND. (abs(grid%ht_gc(I,J)-grid%ght_gc(I,J,1)) .lt. 0.01) .AND. grid%ht_gc(I,J) .ne. 0) THEN - IF (mod(I,10) .eq. 0 .and. mod(J,10) .eq. 0) THEN - write(message,*) 'grid%ht_gc and grid%toposoil to swap, flag_soilhgt ::: ', & - I,J, grid%ht_gc(I,J),grid%toposoil(I,J),flag_soilhgt - CALL wrf_debug(10,message) - ENDIF - IF ( ( flag_soilhgt.EQ. 1 ) ) THEN - grid%ght_gc(I,J,1)=grid%toposoil(I,J) - ENDIF - ENDIF - - ENDDO - ENDDO - - numzero=0 - numexamined=0 - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - numexamined=numexamined+1 - if(grid%fis(i,j)<1e-5 .and. grid%fis(i,j)>-1e5 ) then - numzero=numzero+1 - end if - enddo - enddo - write(message,*) 'TOTAL NEAR-ZERO FIS POINTS: ',numzero,' OF ',numexamined - call wrf_debug(10,message) -#if ( HWRF == 1 ) - interp_notph: if(.not. grid%use_prep_hybrid) then -#endif - if (.NOT. allocated(PDVP)) allocate(PDVP(IMS:IME,JMS:JME)) - if (.NOT. allocated(P3D_OUT)) allocate(P3D_OUT(IMS:IME,JMS:JME,KDS:KDE-1)) - if (.NOT. allocated(PSFC_OUTV)) allocate(PSFC_OUTV(IMS:IME,JMS:JME)) - if (.NOT. allocated(P3DV_OUT)) allocate(P3DV_OUT(IMS:IME,JMS:JME,KDS:KDE-1)) - if (.NOT. allocated(P3DV_IN)) allocate(P3DV_IN(IMS:IME,JMS:JME,num_metgrid_levels)) - - CALL compute_nmm_surfacep (grid%ht_gc, grid%ght_gc, grid%p_gc , grid%t_gc & - &, grid%psfc_out, num_metgrid_levels & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) ! H points - - if (internal_time_loop .eq. 1) then - - write(message,*) 'psfc points (final combined)' - loopinc=max( (JTE-JTS)/20,1) - iloopinc=max( (ITE-ITS)/10,1) - CALL wrf_message(message) - DO J=min(JTE,JDE-1),JTS,-loopinc - write(message,633) (grid%psfc_out(I,J)/100.,I=its,min(ite,IDE-1),iloopinc) - CALL wrf_message(message) - ENDDO - - endif - - 633 format(35(f5.0,1x)) - - CALL compute_3d_pressure (grid%psfc_out,grid%aeta1,grid%aeta2 & - &, grid%pdtop,grid%pt,grid%pd,p3d_out & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - -#ifdef DM_PARALLEL - ips=its ; ipe=ite ; jps=jts ; jpe=jte ; kps=kts ; kpe=kte -# include "HALO_NMM_MG2.inc" -#endif - -#ifdef DM_PARALLEL -# include "HALO_NMM_MG3.inc" -#endif - - do K=1,num_metgrid_levels - do J=JTS,min(JTE,JDE-1) - do I=ITS,min(ITE,IDE-1) - - IF (K .eq. KTS) THEN - IF (J .eq. JDS .and. I .lt. IDE-1) THEN ! S boundary - PDVP(I,J)=0.5*(grid%pd(I,J)+grid%pd(I+1,J)) - PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J)+grid%psfc_out(I+1,J)) - ELSEIF (J .eq. JDE-1 .and. I .lt. IDE-1) THEN ! N boundary - PDVP(I,J)=0.5*(grid%pd(I,J)+grid%pd(I+1,J)) - PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J)+grid%psfc_out(I+1,J)) - ELSEIF (I .eq. IDS .and. mod(J,2) .eq. 0) THEN ! W boundary - PDVP(I,J)=0.5*(grid%pd(I,J-1)+grid%pd(I,J+1)) - PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J-1)+grid%psfc_out(I,J+1)) - ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 0) THEN ! E boundary - PDVP(I,J)=0.5*(grid%pd(I,J-1)+grid%pd(I,J+1)) - PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J-1)+grid%psfc_out(I,J+1)) - ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 1) THEN ! phantom E boundary - PDVP(I,J)=grid%pd(I,J) - PSFC_OUTV(I,J)=grid%psfc_out(I,J) - ELSEIF (mod(J,2) .eq. 0) THEN ! interior even row - PDVP(I,J)=0.25*(grid%pd(I,J)+grid%pd(I-1,J)+grid%pd(I,J+1)+grid%pd(I,J-1)) - PSFC_OUTV(I,J)=0.25*(grid%psfc_out(I,J)+grid%psfc_out(I-1,J)+ & - grid%psfc_out(I,J+1)+grid%psfc_out(I,J-1)) - ELSE ! interior odd row - PDVP(I,J)=0.25*(grid%pd(I,J)+grid%pd(I+1,J)+grid%pd(I,J+1)+grid%pd(I,J-1)) - PSFC_OUTV(I,J)=0.25*(grid%psfc_out(I,J)+grid%psfc_out(I+1,J)+ & - grid%psfc_out(I,J+1)+grid%psfc_out(I,J-1)) - ENDIF - ENDIF - - IF (J .eq. JDS .and. I .lt. IDE-1) THEN ! S boundary - P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J,K)+grid%p_gc(I+1,J,K)) - ELSEIF (J .eq. JDE-1 .and. I .lt. IDE-1) THEN ! N boundary - P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J,K)+grid%p_gc(I+1,J,K)) - ELSEIF (I .eq. IDS .and. mod(J,2) .eq. 0) THEN ! W boundary - P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J-1,K)+grid%p_gc(I,J+1,K)) - ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 0) THEN ! E boundary - P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J-1,K)+grid%p_gc(I,J+1,K)) - ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 1) THEN ! phantom E boundary - P3DV_IN(I,J,K)=grid%p_gc(I,J,K) - ELSEIF (mod(J,2) .eq. 0) THEN ! interior even row - P3DV_IN(I,J,K)=0.25*(grid%p_gc(I,J,K)+grid%p_gc(I-1,J,K) + & - grid%p_gc(I,J+1,K)+grid%p_gc(I,J-1,K)) - ELSE ! interior odd row - P3DV_IN(I,J,K)=0.25*(grid%p_gc(I,J,K)+grid%p_gc(I+1,J,K) + & - grid%p_gc(I,J+1,K)+grid%p_gc(I,J-1,K)) - ENDIF - - enddo - enddo - enddo - - CALL compute_3d_pressure (psfc_outv,grid%aeta1,grid%aeta2 & - &, grid%pdtop,grid%pt,pdvp,p3dv_out & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - CALL interp_press2press_lin(grid%p_gc, p3d_out & - &, grid%t_gc, grid%t,num_metgrid_levels & - &, .TRUE.,.TRUE.,.TRUE. & ! extrap, ignore_lowest, t_field - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop ) - - - CALL interp_press2press_lin(p3dv_in, p3dv_out & - &, grid%u_gc, grid%u,num_metgrid_levels & - &, .FALSE.,.TRUE.,.FALSE. & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop ) - - CALL interp_press2press_lin(p3dv_in, p3dv_out & - &, grid%v_gc, grid%v,num_metgrid_levels & - &, .FALSE.,.TRUE.,.FALSE. & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop ) - - IF (hyb_coor) THEN - CALL wind_adjust(p3dv_in,p3dv_out,grid%u_gc,grid%v_gc,grid%u,grid%v & - &, num_metgrid_levels,5000. & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - ENDIF - - - ALLOCATE(qtmp(IMS:IME,JMS:JME,num_metgrid_levels)) - ALLOCATE(qtmp2(IMS:IME,JMS:JME,num_metgrid_levels)) - - CALL rh_to_mxrat (grid%rh_gc, grid%t_gc, grid%p_gc, qtmp , .TRUE. , & - ids , ide , jds , jde , 1 , num_metgrid_levels , & - ims , ime , jms , jme , 1 , num_metgrid_levels , & - its , ite , jts , jte , 1 , num_metgrid_levels ) - - do K=1,num_metgrid_levels - do J=JTS,min(JTE,JDE-1) - do I=ITS,min(ITE,IDE-1) - QTMP2(I,J,K)=QTMP(I,J,K)/(1.0+QTMP(I,J,K)) - end do - end do - end do - - CALL interp_press2press_log(grid%p_gc, p3d_out & - &, QTMP2, grid%q,num_metgrid_levels & - &, .FALSE.,.TRUE. & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop ) - - IF (ALLOCATED(QTMP)) DEALLOCATE(QTMP) - IF (ALLOCATED(QTMP)) DEALLOCATE(QTMP2) -#if ( HWRF == 1 ) - else ! we are using prep_hybrid - ! Compute surface pressure: - grid%psfc_out=grid%pdtop+grid%pd - end if interp_notph -#endif - - ! Get the monthly values interpolated to the current date - ! for the traditional monthly - ! fields of green-ness fraction and background grid%albedo. - - if (internal_time_loop .eq. 1 .or. config_flags%sst_update .eq. 1) then - - CALL monthly_interp_to_date ( grid%greenfrac_gc , current_date , grid%vegfra , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - CALL monthly_interp_to_date ( grid%albedo12m_gc , current_date , grid%albbck , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - ! Get the min/max of each i,j for the monthly green-ness fraction. - - CALL monthly_min_max ( grid%greenfrac_gc , grid%shdmin , grid%shdmax , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - ! The model expects the green-ness values in percent, not fraction. - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) -!! grid%vegfra(i,j) = grid%vegfra(i,j) * 100. - grid%shdmax(i,j) = grid%shdmax(i,j) * 100. - grid%shdmin(i,j) = grid%shdmin(i,j) * 100. - grid%vegfrc(I,J)=grid%vegfra(I,J) - END DO - END DO - - ! The model expects the albedo fields as - ! a fraction, not a percent. Set the water values to 8%. - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - if (grid%albbck(i,j) .lt. 5.) then - write(message,*) 'reset albedo to 8%... I,J,albbck:: ', I,J,grid%albbck(I,J) - CALL wrf_debug(10,message) - grid%albbck(I,J)=8. - endif - grid%albbck(i,j) = grid%albbck(i,j) / 100. - grid%snoalb(i,j) = grid%snoalb(i,j) / 100. - IF ( grid%landmask(i,j) .LT. 0.5 ) THEN - grid%albbck(i,j) = 0.08 - grid%snoalb(i,j) = 0.08 - END IF - grid%albase(i,j)=grid%albbck(i,j) - grid%mxsnal(i,j)=grid%snoalb(i,j) - END DO - END DO - - endif - -#if ( HWRF == 1 ) - if(.not.grid%use_prep_hybrid) then -#endif -! new deallocs - DEALLOCATE(p3d_out,p3dv_out,p3dv_in) -#if ( HWRF == 1 ) - end if -#endif - - END IF ! <----- END OF VERTICAL INTERPOLATION PART ----> - - -!! compute SST at each time if updating SST - if (config_flags%sst_update == 1) then - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - if (grid%SM(I,J) .lt. 0.5) then - grid%SST(I,J)=0. - endif - - if (grid%SM(I,J) .gt. 0.5) then - grid%SST(I,J)=grid%NMM_TSK(I,J) - grid%NMM_TSK(I,J)=0. - endif - - IF ( (grid%NMM_TSK(I,J)+grid%SST(I,J)) .lt. 200. .or. & - (grid%NMM_TSK(I,J)+grid%SST(I,J)) .gt. 350. ) THEN - write(message,*) 'TSK, SST trouble at : ', I,J - CALL wrf_message(message) - write(message,*) 'SM, NMM_TSK,SST ', grid%SM(I,J),grid%NMM_TSK(I,J),grid%SST(I,J) - CALL wrf_message(message) - ENDIF - - ENDDO - ENDDO - - endif ! sst_update test - - if (internal_time_loop .eq. 1) then - -!!! weasd has "snow water equivalent" in mm - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - - IF(grid%sm(I,J).GT.0.9) THEN - - IF (grid%xice(I,J) .gt. 0) then - grid%si(I,J)=1.0 - ENDIF - -! SEA - grid%epsr(I,J)=.97 - grid%embck(I,J)=.97 - grid%gffc(I,J)=0. - grid%albedo(I,J)=.06 - grid%albase(I,J)=.06 - IF(grid%si (I,J).GT.0. ) THEN -! SEA-ICE - grid%sm(I,J)=0. - grid%si(I,J)=0. - grid%sice(I,J)=1. - grid%gffc(I,J)=0. ! just leave zero as irrelevant - grid%albedo(I,J)=.60 - grid%albase(I,J)=.60 - ENDIF - ELSE - - grid%si(I,J)=5.0*grid%weasd(I,J)/1000. -! LAND - grid%epsr(I,J)=1.0 - grid%embck(I,J)=1.0 - grid%gffc(I,J)=0.0 ! just leave zero as irrelevant - grid%sice(I,J)=0. - grid%sno(I,J)=grid%si(I,J)*.20 - ENDIF - ENDDO - ENDDO - -! DETERMINE grid%albedo OVER LAND - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - IF(grid%sm(I,J).LT.0.9.AND.grid%sice(I,J).LT.0.9) THEN -! SNOWFREE albedo - IF ( (grid%sno(I,J) .EQ. 0.0) .OR. & - (grid%albase(I,J) .GE. grid%mxsnal(I,J) ) ) THEN - grid%albedo(I,J) = grid%albase(I,J) - ELSE -! MODIFY albedo IF SNOWCOVER: -! BELOW SNOWDEPTH THRESHOLD... - IF (grid%sno(I,J) .LT. SNUP) THEN - RSNOW = grid%sno(I,J)/SNUP - SNOFAC = 1. - ( EXP(-SALP*RSNOW) - RSNOW*EXP(-SALP)) -! ABOVE SNOWDEPTH THRESHOLD... - ELSE - SNOFAC = 1.0 - ENDIF -! CALCULATE grid%albedo ACCOUNTING FOR SNOWDEPTH AND VGFRCK - grid%albedo(I,J) = grid%albase(I,J) & - + (1.0-grid%vegfra(I,J))*SNOFAC*(grid%mxsnal(I,J)-grid%albase(I,J)) - ENDIF - END IF - grid%si(I,J)=5.0*grid%weasd(I,J) - grid%sno(I,J)=grid%weasd(I,J) - -!! convert vegfra - grid%vegfra(I,J)=grid%vegfra(I,J)*100. -! - ENDDO - ENDDO - -#ifdef DM_PARALLEL - - ALLOCATE(SM_G(IDS:IDE,JDS:JDE),SICE_G(IDS:IDE,JDS:JDE)) - - CALL WRF_PATCH_TO_GLOBAL_REAL( grid%sice(IMS,JMS) & - &, SICE_G,grid%DOMDESC & - &, 'z','xy' & - &, IDS,IDE-1,JDS,JDE-1,1,1 & - &, IMS,IME,JMS,JME,1,1 & - &, ITS,ITE,JTS,JTE,1,1 ) - - CALL WRF_PATCH_TO_GLOBAL_REAL( grid%sm(IMS,JMS) & - &, SM_G,grid%DOMDESC & - &, 'z','xy' & - &, IDS,IDE-1,JDS,JDE-1,1,1 & - &, IMS,IME,JMS,JME,1,1 & - &, ITS,ITE,JTS,JTE,1,1 ) - - - IF (WRF_DM_ON_MONITOR()) THEN - - 637 format(40(f3.0,1x)) - - allocate(IHE_G(JDS:JDE-1),IHW_G(JDS:JDE-1)) - DO j = JDS, JDE-1 - IHE_G(J)=MOD(J+1,2) - IHW_G(J)=IHE_G(J)-1 - ENDDO - - DO ITER=1,10 - DO j = jds+1, (jde-1)-1 - DO i = ids+1, (ide-1)-1 - -! any sea ice around point in question? - - IF (SM_G(I,J) .ge. 0.9) THEN - SEAICESUM=SICE_G(I+IHE_G(J),J+1)+SICE_G(I+IHW_G(J),J+1)+ & - SICE_G(I+IHE_G(J),J-1)+SICE_G(I+IHW_G(J),J-1) - IF (SEAICESUM .ge. 1. .and. SEAICESUM .lt. 3.) THEN - - IF ((SICE_G(I+IHE_G(J),J+1).lt.0.1 .and. SM_G(I+IHE_G(J),J+1).lt.0.1) .OR. & - (SICE_G(I+IHW_G(J),J+1).lt.0.1 .and. SM_G(I+IHW_G(J),J+1).lt.0.1) .OR. & - (SICE_G(I+IHE_G(J),J-1).lt.0.1 .and. SM_G(I+IHE_G(J),J-1).lt.0.1) .OR. & - (SICE_G(I+IHW_G(J),J-1).lt.0.1 .and. SM_G(I+IHW_G(J),J-1).lt.0.1)) THEN - -! HAVE SEA ICE AND A SURROUNDING LAND POINT - CONVERT TO SEA ICE - - write(message,*) 'making seaice (1): ', I,J - CALL wrf_debug(100,message) - SICE_G(I,J)=1.0 - SM_G(I,J)=0. - - ENDIF - - ELSEIF (SEAICESUM .ge. 3) THEN - -! WATER POINT SURROUNDED BY ICE - CONVERT TO SEA ICE - - write(message,*) 'making seaice (2): ', I,J - CALL wrf_debug(100,message) - SICE_G(I,J)=1.0 - SM_G(I,J)=0. - ENDIF - - ENDIF - - ENDDO - ENDDO - ENDDO - - ENDIF - - CALL WRF_GLOBAL_TO_PATCH_REAL( SICE_G, grid%sice & - &, grid%DOMDESC & - &, 'z','xy' & - &, IDS,IDE-1,JDS,JDE-1,1,1 & - &, IMS,IME,JMS,JME,1,1 & - &, ITS,ITE,JTS,JTE,1,1 ) - - CALL WRF_GLOBAL_TO_PATCH_REAL( SM_G,grid%sm & - &, grid%DOMDESC & - &, 'z','xy' & - &, IDS,IDE-1,JDS,JDE-1,1,1 & - &, IMS,IME,JMS,JME,1,1 & - &, ITS,ITE,JTS,JTE,1,1 ) - - IF (WRF_DM_ON_MONITOR()) THEN -#if ( HWRF == 1 ) - ! SM_G is still needed for the high-res grid -#else - DEALLOCATE(SM_G) -#endif - deallocate(SICE_G) - DEALLOCATE(IHE_G,IHW_G) - - ENDIF - -! write(message,*) 'revised sea ice on patch' -! CALL wrf_debug(100,message) -! DO J=JTE,JTS,-(((JTE-JTS)/25)+1) -! write(message,637) (grid%sice(I,J),I=ITS,ITE,ITE/20) -! CALL wrf_debug(100,message) -! END DO - -#else -! serial sea ice reprocessing - allocate(IHE(JDS:JDE-1),IHW(JDS:JDE-1)) - - DO j = jts, MIN(jte,jde-1) - IHE(J)=MOD(J+1,2) - IHW(J)=IHE(J)-1 - ENDDO - - DO ITER=1,10 - DO j = jts+1, MIN(jte,jde-1)-1 - DO i = its+1, MIN(ite,ide-1)-1 - -! any sea ice around point in question? - - IF (grid%sm(I,J) .gt. 0.9) THEN - SEAICESUM=grid%sice(I+IHE(J),J+1)+grid%sice(I+IHW(J),J+1)+ & - grid%sice(I+IHE(J),J-1)+grid%sice(I+IHW(J),J-1) - IF (SEAICESUM .ge. 1. .and. SEAICESUM .lt. 3.) THEN - IF ((grid%sice(I+IHE(J),J+1).lt.0.1 .and. grid%sm(I+IHE(J),J+1).lt.0.1) .OR. & - (grid%sice(I+IHW(J),J+1).lt.0.1 .and. grid%sm(I+IHW(J),J+1).lt.0.1) .OR. & - (grid%sice(I+IHE(J),J-1).lt.0.1 .and. grid%sm(I+IHE(J),J-1).lt.0.1) .OR. & - (grid%sice(I+IHW(J),J-1).lt.0.1 .and. grid%sm(I+IHW(J),J-1).lt.0.1)) THEN - -! HAVE SEA ICE AND A SURROUNDING LAND POINT - CONVERT TO SEA ICE - grid%sice(I,J)=1.0 - grid%sm(I,J)=0. - ENDIF - ELSEIF (SEAICESUM .ge. 3) THEN -! WATER POINT SURROUNDED BY ICE - CONVERT TO SEA ICE - grid%sice(I,J)=1.0 - grid%sm(I,J)=0. - ENDIF - ENDIF - - ENDDO - ENDDO - ENDDO - - DEALLOCATE(IHE,IHW) -#endif - -! this block meant to guarantee land/sea agreement between sm and landmask - - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - - IF (grid%sm(I,J) .gt. 0.5) THEN - grid%landmask(I,J)=0.0 - ELSEIF (grid%sm(I,J) .lt. 0.5 .and. grid%sice(I,J) .gt. 0.9) then - grid%landmask(I,J)=0.0 - ELSEIF (grid%sm(I,J) .lt. 0.5 .and. grid%sice(I,J) .lt. 0.1) then - grid%landmask(I,J)=1.0 - ELSE - write(message,*) 'missed point in grid%landmask definition ' , I,J - CALL wrf_message(message) - grid%landmask(I,J)=0.0 - ENDIF -! - IF (grid%sice(I,J) .gt. 0.5 .and. grid%nmm_tsk(I,J) .lt. 0.1 .and. grid%sst(I,J) .gt. 0.) THEN - write(message,*) 'set grid%nmm_tsk to: ', grid%sst(I,J) - CALL wrf_message(message) - grid%nmm_tsk(I,J)=grid%sst(I,J) - grid%sst(I,J)=0. - endif - - ENDDO - ENDDO - - ! For sf_surface_physics = 1, we want to use close to a 10 cm value - ! for the bottom level of the soil temps. - - IF ( ( model_config_rec%sf_surface_physics(grid%id) .EQ. 1 ) .AND. & - ( flag_st000010 .EQ. 1 ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - grid%soiltb(i,j) = grid%st000010(i,j) - END DO - END DO - END IF - - ! Adjust the various soil temperature values depending on the difference in - ! in elevation between the current model's elevation and the incoming data's - ! orography. - - IF ( ( flag_toposoil .EQ. 1 ) ) THEN - - ALLOCATE(HT(ims:ime,jms:jme)) - - DO J=jms,jme - DO I=ims,ime - HT(I,J)=grid%fis(I,J)/9.81 - END DO - END DO - -! if (maxval(grid%toposoil) .gt. 100.) then -! -! Being avoided. Something to revisit eventually. -! -!1219 might be simply a matter of including toposoil -! -! CODE NOT TESTED AT NCEP USING THIS FUNCTIONALITY, -! SO TO BE SAFE WILL AVOID FOR RETRO RUNS. -! -! CALL adjust_soil_temp_new ( grid%soiltb , 2 , & -! grid%nmm_tsk , ht , grid%toposoil , grid%landmask, flag_toposoil , & -! grid%st000010 , st010040 , st040100 , st100200 , st010200 , & -! flag_st000010 , flag_st010040 , flag_st040100 , & -! flag_st100200 , flag_st010200 , & -! soilt000 , soilt005 , soilt020 , soilt040 , & -! soilt160 , soilt300 , & -! flag_soilt000 , flag_soilt005 , flag_soilt020 , & -! flag_soilt040 , flag_soilt160 , flag_soilt300 , & -! ids , ide , jds , jde , kds , kde , & -! ims , ime , jms , jme , kms , kme , & -! its , ite , jts , jte , kts , kte ) -! endif - - END IF - - ! Process the LSM data. - - ! surface_input_source=1 => use data from static file - ! (fractional category as input) - ! surface_input_source=2 => use data from grib file - ! (dominant category as input) - - IF ( config_flags%surface_input_source .EQ. 1 ) THEN - grid%vegcat (its,jts) = 0 - grid%soilcat(its,jts) = 0 - END IF - - ! Generate the vegetation and soil category information - ! from the fractional input - ! data, or use the existing dominant category fields if they exist. - - IF ((grid%soilcat(its,jts) .LT. 0.5) .AND. (grid%vegcat(its,jts) .LT. 0.5)) THEN - - num_veg_cat = SIZE ( grid%landusef_gc , DIM=3 ) - num_soil_top_cat = SIZE ( grid%soilctop_gc , DIM=3 ) - num_soil_bot_cat = SIZE ( grid%soilcbot_gc , DIM=3 ) - - do J=JMS,JME - do K=1,num_veg_cat - do I=IMS,IME - grid%landusef(I,K,J)=grid%landusef_gc(I,J,K) - enddo - enddo - enddo - - do J=JMS,JME - do K=1,num_soil_top_cat - do I=IMS,IME - grid%soilctop(I,K,J)=grid%soilctop_gc(I,J,K) - enddo - enddo - enddo - - do J=JMS,JME - do K=1,num_soil_bot_cat - do I=IMS,IME - grid%soilcbot(I,K,J)=grid%soilcbot_gc(I,J,K) - enddo - enddo - enddo - -! grid%sm (1=water, 0=land) -! grid%landmask(0=water, 1=land) - - - write(message,*) 'landmask into process_percent_cat_new' - - CALL wrf_debug(1,message) - do J=JTE,JTS,-(((JTE-JTS)/20)+1) - write(message,641) (grid%landmask(I,J),I=ITS,min(ITE,IDE-1),((ITE-ITS)/15)+1) - CALL wrf_debug(1,message) - enddo - 641 format(25(f3.0,1x)) - - CALL process_percent_cat_new ( grid%landmask , & - grid%landusef , grid%soilctop , grid%soilcbot , & - grid%isltyp , grid%ivgtyp , & - num_veg_cat , num_soil_top_cat , num_soil_bot_cat , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte , & - model_config_rec%iswater(grid%id) ) - - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - grid%vegcat(i,j) = grid%ivgtyp(i,j) - grid%soilcat(i,j) = grid%isltyp(i,j) - END DO - END DO - - ELSE - - ! Do we have dominant soil and veg data from the input already? - - IF ( grid%soilcat(its,jts) .GT. 0.5 ) THEN - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - grid%isltyp(i,j) = NINT( grid%soilcat(i,j) ) - END DO - END DO - END IF - IF ( grid%vegcat(its,jts) .GT. 0.5 ) THEN - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - grid%ivgtyp(i,j) = NINT( grid%vegcat(i,j) ) - END DO - END DO - END IF - - ENDIF - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - IF (grid%sice(I,J) .lt. 0.1) THEN - IF (grid%landmask(I,J) .gt. 0.5 .and. grid%sm(I,J) .gt. 0.5) THEN - write(message,*) 'land mask and grid%sm both > 0.5: ', & - I,J,grid%landmask(I,J),grid%sm(I,J) - CALL wrf_message(message) - grid%sm(I,J)=0. - ELSEIF (grid%landmask(I,J) .lt. 0.5 .and. grid%sm(I,J) .lt. 0.5) THEN - write(message,*) 'land mask and grid%sm both < 0.5: ', & - I,J, grid%landmask(I,J),grid%sm(I,J) - CALL wrf_message(message) - grid%sm(I,J)=1. - ENDIF - ELSE - IF (grid%landmask(I,J) .gt. 0.5 .and. grid%sm(I,J)+grid%sice(I,J) .gt. 0.9) then - write(message,*) 'landmask says LAND, sm/sice say SEAICE: ', I,J - ENDIF - ENDIF - - ENDDO - ENDDO - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - if (grid%sice(I,J) .gt. 0.9) then - grid%isltyp(I,J)=16 - grid%ivgtyp(I,J)=24 - endif - - ENDDO - ENDDO - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - if (grid%sm(I,J) .lt. 0.5) then - grid%sst(I,J)=0. - endif - - if (grid%sm(I,J) .gt. 0.5) then - if (grid%sst(I,J) .lt. 0.1) then - grid%sst(I,J)=grid%nmm_tsk(I,J) - endif - grid%nmm_tsk(I,J)=0. - endif - - IF ( (grid%nmm_tsk(I,J)+grid%sst(I,J)) .lt. 200. .or. & - (grid%nmm_tsk(I,J)+grid%sst(I,J)) .gt. 350. ) THEN - write(message,*) 'TSK, sst trouble at : ', I,J - CALL wrf_message(message) - write(message,*) 'sm, nmm_tsk,sst ', grid%sm(I,J),grid%nmm_tsk(I,J),grid%sst(I,J) - CALL wrf_message(message) - ENDIF - - ENDDO - ENDDO - - write(message,*) 'grid%sm' - CALL wrf_message(message) - - DO J=min(jde-1,jte),jts,-((jte-jts)/15+1) - write(message,635) (grid%sm(i,J),I=its,ite,((ite-its)/10)+1) - CALL wrf_message(message) - END DO - - write(message,*) 'sst/nmm_tsk' - CALL wrf_debug(10,message) - DO J=min(jde-1,jte),jts,-((jte-jts)/15+1) - write(message,635) (grid%sst(I,J)+grid%nmm_tsk(I,J),I=ITS,min(ide-1,ite),((ite-its)/10)+1) - CALL wrf_debug(10,message) - END DO - - 635 format(20(f5.1,1x)) - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - IF ( ( grid%landmask(i,j) .LT. 0.5 ) .AND. ( flag_sst .EQ. 1 ) ) THEN - grid%soiltb(i,j) = grid%sst(i,j) - ELSE IF ( grid%landmask(i,j) .GT. 0.5 ) THEN - grid%soiltb(i,j) = grid%nmm_tsk(i,j) - END IF - END DO - END DO - -! END IF - - ! Land use categories, dominant soil and vegetation types (if available). - -! allocate(grid%lu_index(ims:ime,jms:jme)) - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - grid%lu_index(i,j) = grid%ivgtyp(i,j) - END DO - END DO - - if (flag_sst .eq. 1) log_flag_sst=.true. - if (flag_sst .eq. 0) log_flag_sst=.false. - - write(message,*) 'st_input dimensions: ', size(st_input,dim=1), & - size(st_input,dim=2),size(st_input,dim=3) - CALL wrf_debug(100,message) - -! write(message,*) 'maxval st_input(1): ', maxval(st_input(:,1,:)) -! CALL wrf_message(message) -! write(message,*) 'maxval st_input(2): ', maxval(st_input(:,2,:)) -! CALL wrf_message(message) -! write(message,*) 'maxval st_input(3): ', maxval(st_input(:,3,:)) -! CALL wrf_message(message) -! write(message,*) 'maxval st_input(4): ', maxval(st_input(:,4,:)) -! CALL wrf_message(message) - -! ============================================================= - - IF (.NOT. ALLOCATED(TG_ALT))ALLOCATE(TG_ALT(grid%sm31:grid%em31,jms:jme)) - - TPH0=TPH0D*DTR - WBD=-(((ide-1)-1)*grid%dlmd) - WB= WBD*DTR - SBD=-(((jde-1)/2)*grid%dphd) - SB= SBD*DTR - DLM=grid%dlmd*DTR - DPH=grid%dphd*DTR - TDLM=DLM+DLM - TDPH=DPH+DPH - WBI=WB+TDLM - SBI=SB+TDPH - EBI=WB+(ide-2)*TDLM - ANBI=SB+(jde-2)*DPH - STPH0=SIN(TPH0) - CTPH0=COS(TPH0) - TSPH=3600./GRID%DT - DO J=JTS,min(JTE,JDE-1) - TLM=WB-TDLM+MOD(J,2)*DLM !For velocity points on the E grid - TPH=SB+float(J-1)*DPH - STPH=SIN(TPH) - CTPH=COS(TPH) - DO I=ITS,MIN(ITE,IDE-1) - - if (I .eq. ITS) THEN - TLM=TLM+TDLM*ITS - else - TLM=TLM+TDLM - endif - - TERM1=(STPH0*CTPH*COS(TLM)+CTPH0*STPH) - FP=TWOM*(TERM1) -! jbao orig grid%f(I,J)=0.5*GRID%DT*FP -! jbao Coriolis correction for idealized! - grid%f(I,J)=3.15656e-5*0.5*GRID%DT -! jbao Coriolis correction for idealized! - - ENDDO - ENDDO - DO J=JTS,min(JTE,JDE-1) - TLM=WB-TDLM+MOD(J+1,2)*DLM !For mass points on the E grid - TPH=SB+float(J-1)*DPH - STPH=SIN(TPH) - CTPH=COS(TPH) - DO I=ITS,MIN(ITE,IDE-1) - - if (I .eq. ITS) THEN - TLM=TLM+TDLM*ITS - else - TLM=TLM+TDLM - endif - - TERM1=(STPH0*CTPH*COS(TLM)+CTPH0*STPH) - TERM1=MIN(TERM1,1.0D0) - TERM1=MAX(TERM1,-1.0D0) - APH=ASIN(TERM1) - TG_ALT(I,J)=TG0+TGA*COS(APH)-grid%fis(I,J)/3333. - ENDDO - ENDDO - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) -! IF ( ( grid%landmask(i,j) .LT. 0.5 ) .AND. ( flag_sst .EQ. 1 ) .AND. & -! grid%sice(I,J) .eq. 0. ) THEN -! grid%tg(i,j) = grid%sst(i,j) -! ELSEIF (grid%sice(I,J) .eq. 1) THEN -! grid%tg(i,j) = 271.16 -! END IF - - if (grid%tg(I,J) .lt. 200.) then ! only use default TG_ALT definition if - ! not getting TGROUND from grid%si - grid%tg(I,J)=TG_ALT(I,J) - endif - - if (grid%tg(I,J) .lt. 200. .or. grid%tg(I,J) .gt. 320.) then - write(message,*) 'problematic grid%tg point at : ', I,J - CALL wrf_message( message ) - endif - - adum2d(i,j)=grid%nmm_tsk(I,J)+grid%sst(I,J) - - END DO - END DO - - DEALLOCATE(TG_ALT) - - write(message,*) 'call process_soil_real with num_st_levels_input: ', num_st_levels_input - CALL wrf_message( message ) - -! ============================================================= - - CALL process_soil_real ( adum2d, grid%tg , & - grid%landmask, grid%sst, & - st_input, sm_input, sw_input, & - st_levels_input , sm_levels_input , & - sw_levels_input , & - grid%sldpth , grid%dzsoil , grid%stc , grid%smc , grid%sh2o, & - flag_sst , flag_soilt000, flag_soilm000, & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte , & - model_config_rec%sf_surface_physics(grid%id) , & - model_config_rec%num_soil_layers , & - model_config_rec%real_data_init_type , & - num_st_levels_input , num_sm_levels_input , & - num_sw_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , & - num_sw_levels_alloc ) - -! ============================================================= - -! Minimum soil values, residual, from RUC LSM scheme. -! For input from Noah and using -! RUC LSM scheme, this must be subtracted from the input -! total soil moisture. For input RUC data and using the Noah LSM scheme, -! this value must be added to the soil moisture_input. - - lqmi(1:num_soil_top_cat) = & - (/0.045, 0.057, 0.065, 0.067, 0.034, 0.078, 0.10, & - 0.089, 0.095, 0.10, 0.070, 0.068, 0.078, 0.0, & - 0.004, 0.065 /) !dusan , 0.020, 0.004, 0.008 /) - -! At the initial time we care about values of soil moisture and temperature, -! other times are ignored by the model, so we ignore them, too. - - account_for_zero_soil_moisture : SELECT CASE ( model_config_rec%sf_surface_physics(grid%id) ) - - CASE ( LSMSCHEME ) - iicount = 0 - IF ( FLAG_SM000010 .EQ. 1 ) THEN - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - IF ((grid%landmask(i,j).gt.0.5) .and. (grid%stc(i,1,j) .gt. 200) .and. & - (grid%stc(i,1,j) .lt. 400) .and. (grid%smc(i,1,j) .lt. 0.005)) then - write(message,*) 'Noah > Noah: bad soil moisture at i,j = ',i,j,grid%smc(i,:,j) - CALL wrf_message(message) - iicount = iicount + 1 - grid%smc(i,:,j) = 0.005 - END IF - END DO - END DO - IF ( iicount .GT. 0 ) THEN - write(message,*) 'Noah -> Noah: total number of small soil moisture locations= ',& - iicount - CALL wrf_message(message) - END IF - ELSE IF ( FLAG_SOILM000 .EQ. 1 ) THEN - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - grid%smc(i,:,j) = grid%smc(i,:,j) + lqmi(grid%isltyp(i,j)) - END DO - END DO - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - IF ((grid%landmask(i,j).gt.0.5) .and. (grid%stc(i,1,j) .gt. 200) .and. & - (grid%stc(i,1,j) .lt. 400) .and. (grid%smc(i,1,j) .lt. 0.004)) then - write(message,*) 'RUC -> Noah: bad soil moisture at i,j = ' & - ,i,j,grid%smc(i,:,j) - CALL wrf_message(message) - iicount = iicount + 1 - grid%smc(i,:,j) = 0.004 - END IF - END DO - END DO - IF ( iicount .GT. 0 ) THEN - write(message,*) 'RUC -> Noah: total number of small soil moisture locations = ',& - iicount - CALL wrf_message(message) - END IF - END IF - CASE ( RUCLSMSCHEME ) - iicount = 0 - IF ( FLAG_SM000010 .EQ. 1 ) THEN - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - grid%smc(i,:,j) = MAX ( grid%smc(i,:,j) - lqmi(grid%isltyp(i,j)) , 0. ) - END DO - END DO - ELSE IF ( FLAG_SOILM000 .EQ. 1 ) THEN - ! no op - END IF - - END SELECT account_for_zero_soil_moisture - -!!! zero out grid%nmm_tsk at water points again - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - if (grid%sm(I,J) .gt. 0.5) then - grid%nmm_tsk(I,J)=0. - endif - END DO - END DO - -!! check on grid%stc - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - IF (grid%sice(I,J) .gt. 0.9) then - DO L = 1, grid%num_soil_layers - grid%stc(I,L,J)=271.16 ! grid%tg value used by Eta/NMM - END DO - END IF - - IF (grid%sm(I,J) .gt. 0.9) then - DO L = 1, grid%num_soil_layers - grid%stc(I,L,J)=273.16 ! grid%tg value used by Eta/NMM - END DO - END IF - - END DO - END DO - - DO j = jts, MIN(jde-1,jte) - DO i = its, MIN(ide-1,ite) - - if (grid%sm(I,J) .lt. 0.1 .and. grid%stc(I,1,J) .lt. 0.1) THEN - write(message,*) 'troublesome grid%sm,grid%stc,grid%smc value: ', I,J,grid%sm(I,J), grid%stc(I,1,J),grid%smc(I,1,J) - CALL wrf_message(message) - do JJ=J-1,J+1 - do L=1, grid%num_soil_layers - do II=I-1,I+1 - - if (II .ge. its .and. II .le. MIN(ide-1,ite) .and. & - JJ .ge. jts .and. JJ .le. MIN(jde-1,jte)) then - - grid%stc(I,L,J)=amax1(grid%stc(I,L,J),grid%stc(II,L,JJ)) - cur_smc=grid%smc(I,L,J) - - if ( grid%smc(II,L,JJ) .gt. 0.005 .and. grid%smc(II,L,JJ) .lt. 1.0) then - aposs_smc=grid%smc(II,L,JJ) - - if ( cur_smc .eq. 0 ) then - cur_smc=aposs_smc - grid%smc(I,L,J)=cur_smc - else - cur_smc=amin1(cur_smc,aposs_smc) - cur_smc=amin1(cur_smc,aposs_smc) - grid%smc(I,L,J)=cur_smc - endif - endif - - endif ! bounds check - - enddo - enddo - enddo - write(message,*) 'grid%stc, grid%smc(1) now: ', grid%stc(I,1,J),grid%smc(I,1,J) - CALL wrf_message(message) - endif - - if (grid%stc(I,1,J) .lt. 0.1) then - write(message,*) 'QUITTING DUE TO STILL troublesome grid%stc value: ', I,J, grid%stc(I,1,J),grid%smc(I,1,J) - call wrf_error_fatal(message) - endif - - ENDDO - ENDDO - -!hardwire soil stuff for time being - -! RTDPTH=0. -! RTDPTH(1)=0.1 -! RTDPTH(2)=0.3 -! RTDPTH(3)=0.6 - -! grid%sldpth=0. -! grid%sldpth(1)=0.1 -! grid%sldpth(2)=0.3 -! grid%sldpth(3)=0.6 -! grid%sldpth(4)=1.0 - -!!! main body of nmm_specific starts here -! - do J=jts,min(jte,jde-1) - do I=its,min(ite,ide-1) - grid%res(I,J)=1. - enddo - enddo - -!! grid%hbm2 - - grid%hbm2=0. - - do J=jts,min(jte,jde-1) - do I=its,min(ite,ide-1) - - IF ( (J .ge. 3 .and. J .le. (jde-1)-2) .AND. & - (I .ge. 2 .and. I .le. (ide-1)-2+mod(J,2)) ) THEN - grid%hbm2(I,J)=1. - ENDIF - enddo - enddo - -!! grid%hbm3 - grid%hbm3=0. - -!! LOOP OVER LOCAL DIMENSIONS - - do J=jts,min(jte,jde-1) - grid%ihwg(J)=mod(J+1,2)-1 - IF (J .ge. 4 .and. J .le. (jde-1)-3) THEN - IHL=(ids+1)-grid%ihwg(J) - IHH=(ide-1)-2 - do I=its,min(ite,ide-1) - IF (I .ge. IHL .and. I .le. IHH) grid%hbm3(I,J)=1. - enddo - ENDIF - enddo - -!! grid%vbm2 - - grid%vbm2=0. - - do J=jts,min(jte,jde-1) - do I=its,min(ite,ide-1) - - IF ( (J .ge. 3 .and. J .le. (jde-1)-2) .AND. & - (I .ge. 2 .and. I .le. (ide-1)-1-mod(J,2)) ) THEN - - grid%vbm2(I,J)=1. - - ENDIF - - enddo - enddo - -!! grid%vbm3 - - grid%vbm3=0. - - do J=jts,min(jte,jde-1) - do I=its,min(ite,ide-1) - - IF ( (J .ge. 4 .and. J .le. (jde-1)-3) .AND. & - (I .ge. 3-mod(J,2) .and. I .le. (ide-1)-2) ) THEN - grid%vbm3(I,J)=1. - ENDIF - - enddo - enddo - - COAC=model_config_rec%coac(grid%id) - CODAMP=model_config_rec%codamp(grid%id) - - DTAD=1.0 -! IDTCF=DTCF, IDTCF=4 - DTCF=4.0 ! used? - - grid%dy_nmm=ERAD*DPH - grid%cpgfv=-GRID%DT/(48.*grid%dy_nmm) - grid%en= GRID%DT/( 4.*grid%dy_nmm)*DTAD - grid%ent=GRID%DT/(16.*grid%dy_nmm)*DTAD - - DO J=jts,nnyp - KHL2(J)=(IDE-1)*(J-1)-(J-1)/2+2 - KVL2(J)=(IDE-1)*(J-1)-J/2+2 - KHH2(J)=(IDE-1)*J-J/2-1 - KVH2(J)=(IDE-1)*J-(J+1)/2-1 - ENDDO - - TPH=SB-DPH - - DO J=jts,min(jte,jde-1) - TPH=SB+float(J-1)*DPH - DXP=ERAD*DLM*COS(TPH) - DXJ(J)=DXP - WPDARJ(J)=-W_NMM * & - ((ERAD*DLM*AMIN1(COS(ANBI),COS(SBI)))**2+grid%dy_nmm**2)/ & - (GRID%DT*32.*DXP*grid%dy_nmm) - - CPGFUJ(J)=-GRID%DT/(48.*DXP) - CURVJ(J)=.5*GRID%DT*TAN(TPH)/ERAD - FCPJ(J)=GRID%DT/(CP*192.*DXP*grid%dy_nmm) - FDIVJ(J)=1./(12.*DXP*grid%dy_nmm) -! EMJ(J)= GRID%DT/( 4.*DXP)*DTAD -! EMTJ(J)=GRID%DT/(16.*DXP)*DTAD - FADJ(J)=-GRID%DT/(48.*DXP*grid%dy_nmm)*DTAD - ACDT=GRID%DT*SQRT((ERAD*DLM*AMIN1(COS(ANBI),COS(SBI)))**2+grid%dy_nmm**2) - CDDAMP=CODAMP*ACDT - HDACJ(J)=COAC*ACDT/(4.*DXP*grid%dy_nmm) - DDMPUJ(J)=CDDAMP/DXP - DDMPVJ(J)=CDDAMP/grid%dy_nmm - ENDDO - - DO J=JTS,min(JTE,JDE-1) - TLM=WB-TDLM+MOD(J,2)*DLM - TPH=SB+float(J-1)*DPH - STPH=SIN(TPH) - CTPH=COS(TPH) - DO I=ITS,MIN(ITE,IDE-1) - - if (I .eq. ITS) THEN - TLM=TLM+TDLM*ITS - else - TLM=TLM+TDLM - endif - - FP=TWOM*(CTPH0*STPH+STPH0*CTPH*COS(TLM)) -!jbao orig grid%f(I,J)=0.5*GRID%DT*FP -! jbao Coriolis correction for idealized! - grid%f(I,J)=3.15656e-5*0.5*GRID%DT - print*,'real 2griddt is ',grid%dt -! jbao Coriolis correction for idealized! - - - ENDDO - ENDDO - -! --------------DERIVED VERTICAL GRID CONSTANTS-------------------------- - - grid%ef4t=.5*GRID%DT/CP - grid%f4q = -GRID%DT*DTAD - grid%f4d =-.5*GRID%DT*DTAD - - DO L=KDS,KDE-1 - grid%rdeta(L)=1./grid%deta(L) - grid%f4q2(L)=-.25*GRID%DT*DTAD/grid%deta(L) - ENDDO - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - grid%dx_nmm(I,J)=DXJ(J) - grid%wpdar(I,J)=WPDARJ(J)*grid%hbm2(I,J) - grid%cpgfu(I,J)=CPGFUJ(J)*grid%vbm2(I,J) - grid%curv(I,J)=CURVJ(J)*grid%vbm2(I,J) - grid%fcp(I,J)=FCPJ(J)*grid%hbm2(I,J) - grid%fdiv(I,J)=FDIVJ(J)*grid%hbm2(I,J) - grid%fad(I,J)=FADJ(J) - grid%hdacv(I,J)=HDACJ(J)*grid%vbm2(I,J) - grid%hdac(I,J)=HDACJ(J)*1.25*grid%hbm2(I,J) - ENDDO - ENDDO - - DO J=JTS, MIN(JDE-1,JTE) - - IF (J.LE.5.OR.J.GE.(JDE-1)-4) THEN - - KHH=(IDE-1)-2+MOD(J,2) ! KHH is global...loop over I that have - DO I=ITS,MIN(IDE-1,ITE) - IF (I .ge. 2 .and. I .le. KHH) THEN - grid%hdac(I,J)=grid%hdac(I,J)* DFC - ENDIF - ENDDO - - ELSE - - KHH=2+MOD(J,2) - DO I=ITS,MIN(IDE-1,ITE) - IF (I .ge. 2 .and. I .le. KHH) THEN - grid%hdac(I,J)=grid%hdac(I,J)* DFC - ENDIF - ENDDO - - KHH=(IDE-1)-2+MOD(J,2) - - DO I=ITS,MIN(IDE-1,ITE) - IF (I .ge. (IDE-1)-2 .and. I .le. KHH) THEN - grid%hdac(I,J)=grid%hdac(I,J)* DFC - ENDIF - ENDDO - ENDIF - ENDDO - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - grid%ddmpu(I,J)=DDMPUJ(J)*grid%vbm2(I,J) - grid%ddmpv(I,J)=DDMPVJ(J)*grid%vbm2(I,J) - grid%hdacv(I,J)=grid%hdacv(I,J)*grid%vbm2(I,J) - ENDDO - ENDDO -! --------------INCREASING DIFFUSION ALONG THE BOUNDARIES---------------- - - DO J=JTS,MIN(JDE-1,JTE) - IF (J.LE.5.OR.J.GE.JDE-1-4) THEN - KVH=(IDE-1)-1-MOD(J,2) - DO I=ITS,min(IDE-1,ITE) - IF (I .ge. 2 .and. I .le. KVH) THEN - grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC - grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC - grid%hdacv(I,J)=grid%hdacv(I,J)* DFC - ENDIF - ENDDO - ELSE - KVH=3-MOD(J,2) - DO I=ITS,min(IDE-1,ITE) - IF (I .ge. 2 .and. I .le. KVH) THEN - grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC - grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC - grid%hdacv(I,J)=grid%hdacv(I,J)* DFC - ENDIF - ENDDO - KVH=(IDE-1)-1-MOD(J,2) - DO I=ITS,min(IDE-1,ITE) - IF (I .ge. IDE-1-2 .and. I .le. KVH) THEN - grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC - grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC - grid%hdacv(I,J)=grid%hdacv(I,J)* DFC - ENDIF - ENDDO - ENDIF - ENDDO - - write(message,*) 'grid%stc(1)' - CALL wrf_message(message) - DO J=min(jde-1,jte),jts,-((jte-jts)/15+1) - write(message,635) (grid%stc(I,1,J),I=its,min(ite,ide-1),(ite-its)/12+1) - CALL wrf_message(message) - ENDDO - - write(message,*) 'grid%smc(1)' - CALL wrf_message(message) - DO J=min(jde-1,jte),jts,-((jte-jts)/15+1) - write(message,635) (grid%smc(I,1,J),I=its,min(ite,ide-1),(ite-its)/12+1) - CALL wrf_message(message) - ENDDO - - DO j = jts, MIN(jde-1,jte) - DO i= ITS, MIN(IDE-1,ITE) - - if (grid%sm(I,J) .lt. 0.1 .and. grid%smc(I,1,J) .gt. 0.5 .and. grid%sice(I,J) .lt. 0.1) then - write(message,*) 'very moist on land point: ', I,J,grid%smc(I,1,J) - CALL wrf_debug(10,message) - endif - - enddo - enddo - -!!! compute grid%emt, grid%em on global domain, and only on task 0. - -#ifdef DM_PARALLEL - IF (wrf_dm_on_monitor()) THEN !!!! NECESSARY TO LIMIT THIS TO TASK ZERO? -#else - IF (JDS .eq. JTS) THEN !! set unfailable condition for serial job -#endif - - ALLOCATE(EMJ(JDS:JDE-1),EMTJ(JDS:JDE-1)) - - DO J=JDS,JDE-1 - TPH=SB+float(J-1)*DPH - DXP=ERAD*DLM*COS(TPH) - EMJ(J)= GRID%DT/( 4.*DXP)*DTAD - EMTJ(J)=GRID%DT/(16.*DXP)*DTAD - ENDDO - - JA=0 - DO 161 J=3,5 - JA=JA+1 - KHLA(JA)=2 - KHHA(JA)=(IDE-1)-1-MOD(J+1,2) - 161 grid%emt(JA)=EMTJ(J) - DO 162 J=(JDE-1)-4,(JDE-1)-2 - JA=JA+1 - KHLA(JA)=2 - KHHA(JA)=(IDE-1)-1-MOD(J+1,2) - 162 grid%emt(JA)=EMTJ(J) - DO 163 J=6,(JDE-1)-5 - JA=JA+1 - KHLA(JA)=2 - KHHA(JA)=2+MOD(J,2) - 163 grid%emt(JA)=EMTJ(J) - DO 164 J=6,(JDE-1)-5 - JA=JA+1 - KHLA(JA)=(IDE-1)-2 - KHHA(JA)=(IDE-1)-1-MOD(J+1,2) - 164 grid%emt(JA)=EMTJ(J) - -! --------------SPREADING OF UPSTREAM VELOCITY-POINT ADVECTION FACTOR---- - - JA=0 - DO 171 J=3,5 - JA=JA+1 - KVLA(JA)=2 - KVHA(JA)=(IDE-1)-1-MOD(J,2) - 171 grid%em(JA)=EMJ(J) - DO 172 J=(JDE-1)-4,(JDE-1)-2 - JA=JA+1 - KVLA(JA)=2 - KVHA(JA)=(IDE-1)-1-MOD(J,2) - 172 grid%em(JA)=EMJ(J) - DO 173 J=6,(JDE-1)-5 - JA=JA+1 - KVLA(JA)=2 - KVHA(JA)=2+MOD(J+1,2) - 173 grid%em(JA)=EMJ(J) - DO 174 J=6,(JDE-1)-5 - JA=JA+1 - KVLA(JA)=(IDE-1)-2 - KVHA(JA)=(IDE-1)-1-MOD(J,2) - 174 grid%em(JA)=EMJ(J) - - 696 continue - ENDIF ! wrf_dm_on_monitor/serial job - - call NMM_SH2O(IMS,IME,JMS,JME,ITS,NNXP,JTS,NNYP,grid%num_soil_layers,grid%isltyp, & - grid%sm,grid%sice,grid%stc,grid%smc,grid%sh2o) - -!! must be a better place to put this, but will eliminate "phantom" -!! wind points here (no wind point on eastern boundary of odd numbered rows) - - IF ( abs(IDE-1-ITE) .eq. 1 ) THEN ! along eastern boundary - write(message,*) 'zero phantom winds' - CALL wrf_message(message) - DO K=1,KDE-1 - DO J=JDS,JDE-1,2 - IF (J .ge. JTS .and. J .le. JTE) THEN - grid%u(IDE-1,J,K)=0. - grid%v(IDE-1,J,K)=0. - ENDIF - ENDDO - ENDDO - ENDIF - - 969 continue - - DO j = jms, jme - DO i = ims, ime - fisx=max(grid%fis(i,j),0.) - grid%z0(I,J) =grid%sm(I,J)*Z0SEA+(1.-grid%sm(I,J))* & - & (0.*Z0MAX+FISx *FCM+Z0LAND) - ENDDO - ENDDO - - write(message,*) 'grid%z0 over memory, leaving module_initialize_real' - CALL wrf_message(message) - DO J=JME,JMS,-((JME-JMS)/20+1) - write(message,635) (grid%z0(I,J),I=IMS,IME,(IME-IMS)/14+1) - CALL wrf_message(message) - ENDDO - - - endif ! on first_time check - - write(message,*) 'leaving init_domain_nmm' - CALL wrf_message( TRIM(message) ) -! - write(message,*)'STUFF MOVED TO REGISTRY:',grid%IDTAD, & - & grid%NSOIL,grid%NRADL,grid%NRADS,grid%NPHS,grid%NCNVC,grid%sigma - CALL wrf_message( TRIM(message) ) -#if ( HWRF == 1 ) -!========================================================================================= -! gopal's doing for ocean coupling. Produce a high resolution grid for the entire domain -!========================================================================================= - - if(internal_time_loop.eq.1) then !Kwon's doing - - NDLMD=grid%dlmd/3. - NDPHD=grid%dphd/3. - NIDE=3*(IDE-1)-2 - NJDE=3*(JDE-1)-2 - ILOC=1 - JLOC=1 - NWBD= WBD ! + (ILOC -1)*2.*grid%dlmd + MOD(JLOC+1,2)*grid%dlmd - NSBD= SBD ! + (JLOC -1)*grid%dphd - - ALLOCATE (NHLAT(NIDE,NJDE)) - ALLOCATE (NHLON(NIDE,NJDE)) - ALLOCATE (NVLAT(NIDE,NJDE)) - ALLOCATE (NVLON(NIDE,NJDE)) - ALLOCATE (HRES_SM(NIDE,NJDE)) - -#if defined(DM_PARALLEL) - if(wrf_dm_on_monitor()) then - ! Only the monitor process does the actual work (kinda - ! stupid; should be parallelized, but it's better than - ! writing garbage like it did before with >1 process) - - ! Get high-res lat & lon: - CALL EARTH_LATLON_hwrf ( NHLAT,NHLON,NVLAT,NVLON, & ! rotated lat,lon at H and V points - NDLMD,NDPHD,NWBD,NSBD, & - tph0d,tlm0d, & - 1,NIDE,1,NJDE,1,1, & - 1,NIDE,1,NJDE,1,1, & - 1,NIDE,1,NJDE,1,1 ) - - ! Interpolate landmask to high-res grid: - CALL G2T2H_hwrf ( SM_G,HRES_SM, & ! output grid index and weights - NHLAT,NHLON, & ! target (hres) input lat lon in degrees - grid%DLMD,grid%DPHD,WBD,SBD, & ! parent res, west and south boundaries - tph0d,tlm0d, & ! parent central lat,lon, all in degrees - IDE,JDE,IDS,IDE,JDS,JDE, & ! parent imax and jmax, ime,jme - 1,NIDE,1,NJDE,1,1, & - 1,NIDE,1,NJDE,1,1, & - 1,NIDE,1,NJDE,1,1 ) - - ! We're done with the low-res sm grid now: - deallocate(SM_G) - - ! Write out high-res grid for coupler: - WRITE(65)NHLAT(1:NIDE,1:NJDE) - WRITE(65)NHLON(1:NIDE,1:NJDE) - WRITE(65)NVLAT(1:NIDE,1:NJDE) - WRITE(65)NVLON(1:NIDE,1:NJDE) - WRITE(65)HRES_SM(1:NIDE,1:NJDE) - endif -#else - ! This code is the same as above, but for the non-mpi version: - CALL EARTH_LATLON_hwrf ( NHLAT,NHLON,NVLAT,NVLON, & ! rotated lat,lon at H and V points - NDLMD,NDPHD,NWBD,NSBD, & - tph0d,tlm0d, & - 1,NIDE,1,NJDE,1,1, & - 1,NIDE,1,NJDE,1,1, & - 1,NIDE,1,NJDE,1,1 ) - CALL G2T2H_hwrf ( grid%SM,HRES_SM, & ! output grid index and weights - NHLAT,NHLON, & ! target (hres) input lat lon in degrees - grid%DLMD,grid%DPHD,WBD,SBD, & ! parent res, west and south boundaries - tph0d,tlm0d, & ! parent central lat,lon, all in degrees - IDE,JDE,IMS,IME,JMS,JME, & ! parent imax and jmax, ime,jme - 1,NIDE,1,NJDE,1,1, & - 1,NIDE,1,NJDE,1,1, & - 1,NIDE,1,NJDE,1,1 ) - - WRITE(65)NHLAT(1:NIDE,1:NJDE) - WRITE(65)NHLON(1:NIDE,1:NJDE) - WRITE(65)NVLAT(1:NIDE,1:NJDE) - WRITE(65)NVLON(1:NIDE,1:NJDE) - WRITE(65)HRES_SM(1:NIDE,1:NJDE) -#endif - - DEALLOCATE (NHLAT) - DEALLOCATE (NHLON) - DEALLOCATE (NVLAT) - DEALLOCATE (NVLON) - DEALLOCATE (HRES_SM) - - endif !Kwon's doing - -!================================================================================== -! end gopal's doing for ocean coupling. -!================================================================================== -#endif - -!#define COPY_OUT -!#include "scalar_derefs.inc" - RETURN - - END SUBROUTINE init_domain_nmm - -!------------------------------------------------------ - - SUBROUTINE define_nmm_vertical_coord ( LM, PTSGM, pt, pdtop,HYBLEVS, & - SG1,DSG1,SGML1, & - SG2,DSG2,SGML2,dfl, dfrlg ) - - IMPLICIT NONE - -! USE module_model_constants - -!!! certain physical parameters here probably don't need to be defined, as defined -!!! elsewhere within WRF. Done for initial testing purposes. - - INTEGER :: LM, LPT2, L - REAL :: PTSGM, pt, PL, PT2, pdtop - REAL :: RGOG, PSIG,PHYB,PHYBM - REAL, PARAMETER :: Rd = 287.04 ! J deg{-1} kg{-1} - REAL, PARAMETER :: CP=1004.6,GAMMA=.0065,PRF0=101325.,T0=288. - REAL, PARAMETER :: g=9.81 - - REAL, DIMENSION(LM) :: DSG,DSG1,DSG2 - REAL, DIMENSION(LM) :: SGML1,SGML2 - REAL, DIMENSION(LM+1) :: SG1,SG2,HYBLEVS,dfl,dfrlg - - CHARACTER(LEN=255) :: message - - LPT2=LM+1 - - write(message,*) 'pt= ', pt - CALL wrf_message(message) - - DO L=LM+1,1,-1 - pl=HYBLEVS(L)*(101325.-pt)+pt - if(pl.lt.ptSGm) LPT2=l - ENDDO - - IF(LPT2.lt.LM+1) THEN - pt2=HYBLEVS(LPT2)*(101325.-pt)+pt - ELSE - pt2=pt - ENDIF - - write(message,*) '*** Sigma system starts at ',pt2,' Pa, from level ',LPT2 - CALL wrf_message(message) - - pdtop=pt2-pt - - write(message,*) 'allocating DSG,DSG1,DSG2 as ', LM - CALL wrf_debug(10,message) - - DSG=-99. - - DO L=1,LM - DSG(L)=HYBLEVS(L)- HYBLEVS(L+1) - ENDDO - - DSG1=0. - DSG2=0. - - DO L=LM,1,-1 - - IF(L.ge.LPT2) then - DSG1(L)=DSG(L) - ELSE - DSG2(L)=DSG(L) - ENDIF - - ENDDO - - SGML1=-99. - SGML2=-99. - - IF(LPT2.le.LM+1) THEN - - DO L=LM+1,LPT2,-1 - SG2(L)=0. - ENDDO - - DO L=LPT2,2,-1 - SG2(L-1)=SG2(L)+DSG2(L-1) - ENDDO - - DO L=LPT2-1,1,-1 - SG2(L)=SG2(L)/SG2(1) - ENDDO - SG2(1)=1. - - DO L=LPT2-1,1,-1 - DSG2(L)=SG2(L)-SG2(L+1) - SGML2(l)=(SG2(l)+SG2(l+1))*0.5 - ENDDO - - ENDIF - - DO L=LM,LPT2,-1 - DSG2(L)=0. - SGML2(L)=0. - ENDDO - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - SG1(LM+1)=0. - - DO L=LM+1,LPT2,-1 - SG1(L-1)=SG1(L)+DSG1(L-1) - ENDDO - - DO L=LM,LPT2,-1 - SG1(L)=SG1(L)/SG1(LPT2-1) - ENDDO - - SG1(LPT2-1)=1. - - do l=LPT2-2,1,-1 - SG1(l)=1. - enddo - - - DO L=LM,LPT2,-1 - DSG1(L)=SG1(L)-SG1(L+1) - SGML1(L)=(SG1(L)+SG1(L+1))*0.5 - ENDDO - - DO L=LPT2-1,1,-1 - DSG1(L)=0. - SGML1(L)=1. - ENDDO - - 1000 format('l,hyblevs,psig,SG1,SG2,phyb,phybm') - 1100 format(' ',i4,f7.4,f10.2,2f7.4,2f10.2) - - write(message,1000) - CALL wrf_debug(100,message) - - do l=1,LM+1 - psig=HYBLEVS(L)*(101325.-pt)+pt - phyb=SG1(l)*pdtop+SG2(l)*(101325.-pdtop-pt)+pt - if(l.lt.LM+1) then - phybm=SGML1(l)*pdtop+SGML2(l)*(101325.-pdtop-pt)+pt - else - phybm=-99. - endif - - write(message,1100) l,HYBLEVS(L),psig & - ,SG1(l),SG2(l),phyb,phybm - CALL wrf_debug(100,message) - enddo - - - 632 format(f9.6) - - write(message,*) 'SG1' - CALL wrf_debug(100,message) - do L=LM+1,1,-1 - write(message,632) SG1(L) - CALL wrf_debug(100,message) - enddo - - write(message,*) 'SG2' - CALL wrf_debug(100,message) - do L=LM+1,1,-1 - write(message,632) SG2(L) - CALL wrf_debug(100,message) - enddo - - write(message,*) 'DSG1' - CALL wrf_debug(100,message) - do L=LM,1,-1 - write(message,632) DSG1(L) - CALL wrf_debug(100,message) - enddo - - write(message,*) 'DSG2' - CALL wrf_debug(100,message) - do L=LM,1,-1 - write(message,632) DSG2(L) - CALL wrf_debug(100,message) - enddo - - write(message,*) 'SGML1' - CALL wrf_debug(100,message) - do L=LM,1,-1 - write(message,632) SGML1(L) - CALL wrf_debug(100,message) - enddo - - write(message,*) 'SGML2' - CALL wrf_debug(100,message) - do L=LM,1,-1 - write(message,632) SGML2(L) - CALL wrf_debug(100,message) - enddo - - rgog=(rd*gamma)/g - DO L=1,LM+1 - dfl(L)=g*T0*(1.-((pt+SG1(L)*pdtop+SG2(L)*(101325.-pt2)) & - /101325.)**rgog)/gamma - dfrlg(L)=dfl(L)/g - write(message,*) 'L, dfl(L): ', L, dfl(L) - CALL wrf_debug(100,message) - ENDDO - - END SUBROUTINE define_nmm_vertical_coord - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - SUBROUTINE compute_nmm_surfacep ( TERRAIN_HGT_T, Z3D_IN, PRESS3D_IN, T3D_IN & - &, psfc_out,generic & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - - IMPLICIT NONE - - real, allocatable:: dum2d(:,:),DUM2DB(:,:) - - integer :: IDS,IDE,JDS,JDE,KDS,KDE - integer :: IMS,IME,JMS,JME,KMS,KME - integer :: ITS,ITE,JTS,JTE,KTS,KTE,Ilook,Jlook - integer :: I,J,II,generic,L,KINSERT,K,bot_lev,LL - integer :: IHE(JMS:JME),IHW(JMS:JME) - - real :: TERRAIN_HGT_T(IMS:IME,JMS:JME) - real :: Z3D_IN(IMS:IME,JMS:JME,generic) - real :: T3D_IN(IMS:IME,JMS:JME,generic) - real :: PRESS3D_IN(IMS:IME,JMS:JME,generic) - real :: PSFC_IN(IMS:IME,JMS:JME),TOPO_IN(IMS:IME,JMS:JME) - real :: psfc_out(IMS:IME,JMS:JME),rincr(IMS:IME,JMS:JME) - real :: dif1,dif2,dif3,dif4,dlnpdz,BOT_INPUT_HGT,BOT_INPUT_PRESS,dpdz,rhs - real :: zin(generic),pin(generic) - - character (len=255) :: message - - logical :: DEFINED_PSFC(IMS:IME,JMS:JME), DEFINED_PSFCB(IMS:IME,JMS:JME) - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - Ilook=25 - Jlook=25 - - DO j = JMS, JME - IHE(J)=MOD(J+1,2) - IHW(J)=IHE(J)-1 - ENDDO - - DO J=JMS,JME - DO I=IMS,IME - DEFINED_PSFC(I,J)=.FALSE. - DEFINED_PSFCB(I,J)=.FALSE. - IF (PRESS3D_IN(I,J,1) .ne. 200100.) THEN - PSFC_IN(I,J)=PRESS3D_IN(I,J,1) - TOPO_IN(I,J)=Z3D_IN(I,J,1) - ELSE - PSFC_IN(I,J)=PRESS3D_IN(I,J,2) - TOPO_IN(I,J)=Z3D_IN(I,J,2) - ENDIF - ENDDO - ENDDO - -! input surface pressure smoothing over the ocean - still needed for NAM? - - II_loop: do II=1,8 - - CYCLE II_loop - - do J=JTS+1,min(JTE,JDE-1)-1 - do I=ITS+1,min(ITE,IDE-1)-1 - rincr(I,J)=0. - - if (PSFC_IN(I,J) .gt. 100000. .and. & - PSFC_IN(I+IHE(J),J+1) .gt. 100000. .and. & - PSFC_IN(I+IHE(J),J-1) .gt. 100000. .and. & - PSFC_IN(I+IHW(J),J+1) .gt. 100000. .and. & - PSFC_IN(I+IHW(J),J-1) .gt. 100000. ) then - - dif1=abs(PSFC_IN(I,J)-PSFC_IN(I+IHE(J),J+1)) - dif2=abs(PSFC_IN(I,J)-PSFC_IN(I+IHE(J),J-1)) - dif3=abs(PSFC_IN(I,J)-PSFC_IN(I+IHW(J),J+1)) - dif4=abs(PSFC_IN(I,J)-PSFC_IN(I+IHW(J),J-1)) - - if (max(dif1,dif2,dif3,dif4) .lt. 200. .and. TOPO_IN(I,J).le. 0.5 .and. & - TOPO_IN(I+IHE(J),J+1) .le. 0.5 .and. & - TOPO_IN(I+IHW(J),J+1) .le. 0.5 .and. & - TOPO_IN(I+IHE(J),J-1) .le. 0.5 .and. & - TOPO_IN(I+IHW(J),J-1) .lt. 0.5) then - - rincr(I,J)=0.125*( 4.*PSFC_IN(I,J)+ & - PSFC_IN(I+IHE(J),J+1)+PSFC_IN(I+IHE(J),J-1)+ & - PSFC_IN(I+IHW(J),J+1)+PSFC_IN(I+IHW(J),J-1) ) & - - PSFC_IN(I,J) - -! if (rincr(I,J) .ne. 0 .and. abs(rincr(I,J)) .gt. 20.) then -! write(message,*) 'II, I,J,rincr: ', II, I,J,rincr(I,J) -! CALL wrf_message(message) -! endif - - endif - endif - - ENDDO - ENDDO - - DO J=JTS+1,min(JTE,JDE-1)-1 - DO I=ITS+1,min(ITE,IDE-1)-1 - PSFC_IN(I,J)=PSFC_IN(I,J) + rincr(I,J) - ENDDO - ENDDO - -! write(message,*) ' -------------------------------------------------- ' -! CALL wrf_message(message) - - end do II_loop - - ALLOCATE(DUM2D(IMS:IME,JMS:JME)) - - DO J=JMS,JME - DO I=IMS,IME - DUM2D(I,J)=-9. - END DO - END DO - - DO J=JTS,min(JTE,JDE-1) - I_loop: DO I=ITS,min(ITE,IDE-1) - - IF (PSFC_IN(I,J) .lt. 0.1) THEN - write(message,*) 'QUITTING BECAUSE I,J, PSFC_IN: ', I,J,PSFC_IN(I,J) - call wrf_error_fatal(message) - ENDIF - - BOT_INPUT_PRESS=PSFC_IN(I,J) - BOT_INPUT_HGT=TOPO_IN(I,J) - - IF (I .eq. Ilook .AND. J .eq. Jlook) THEN - - write(message,*) ' TERRAIN_HGT_T: ', I,J, TERRAIN_HGT_T(I,J) - CALL wrf_message(message) - write(message,*) ' PSFC_IN, TOPO_IN: ', & - I, J, PSFC_IN(I,J),TOPO_IN(I,J) - CALL wrf_message(message) - - DO L=1,generic - write(message,*) ' L,PRESS3D_IN, Z3D_IN: ', & - I,J,L, PRESS3D_IN(I,J,L),Z3D_IN(I,J,L) - CALL wrf_debug(10,message) - END DO - ENDIF - - DO L=2,generic-1 - - IF ( PRESS3D_IN(i,j,L) .gt. PSFC_IN(I,J) .AND. & - Z3D_IN(I,J,L) .lt. TERRAIN_HGT_T(I,J) .AND. & - Z3D_IN(I,J,L+1) .gt. TERRAIN_HGT_T(I,J) ) THEN - - BOT_INPUT_PRESS=PRESS3D_IN(i,j,L) - BOT_INPUT_HGT=Z3D_IN(I,J,L) - -! IF (I .eq. Ilook .and. J .eq. Jlook) THEN -! write(message,*) 'BOT_INPUT_PRESS, BOT_INPUT_HGT NOW : ', & -! Ilook,Jlook, BOT_INPUT_PRESS, BOT_INPUT_HGT -! CALL wrf_message(message) -! ENDIF - - ENDIF - END DO - -!!!!!!!!!!!!!!!!!!!!!! START HYDRO CHECK - - IF ( PRESS3D_IN(i,j,1) .ne. 200100. .AND. & - (PSFC_IN(I,J) .gt. PRESS3D_IN(i,j,2) .OR. & - TOPO_IN(I,J) .lt. Z3D_IN(I,J,2)) ) THEN ! extrapolate downward - - IF (J .eq. JTS .AND. I .eq. ITS) THEN - write(message,*) 'hydro check - should only be for isobaric input' - CALL wrf_message(message) - ENDIF - - IF (Z3D_IN(I,J,2) .ne. TOPO_IN(I,J)) THEN - dpdz=(PRESS3D_IN(i,j,2)-PSFC_IN(I,J))/(Z3D_IN(I,J,2)-TOPO_IN(I,J)) - rhs=-9.81*((PRESS3D_IN(i,j,2)+ PSFC_IN(I,J))/2.)/(287.04* T3D_IN(I,J,2)) - - IF ( abs(PRESS3D_IN(i,j,2)-PSFC_IN(I,J)) .gt. 290.) THEN - IF (dpdz .lt. 1.05*rhs .OR. dpdz .gt. 0.95*rhs) THEN - write(message,*) 'I,J,P(2),Psfc,Z(2),Zsfc: ', & - I,J,PRESS3D_IN(i,j,2),PSFC_IN(I,J),Z3D_IN(I,J,2),TOPO_IN(I,J) - IF (mod(I,5).eq.0 .AND. mod(J,5).eq.0) CALL wrf_debug(50,message) - CYCLE I_loop - ENDIF - - ENDIF - - ELSE ! z(2) equals TOPO_IN - - IF (PRESS3D_IN(i,j,2) .eq. PSFC_IN(I,J)) THEN -! write(message,*) 'all equal at I,J: ', I,J -! CALL wrf_message(message) - ELSE -! write(message,*) 'heights equal, pressures not: ', & -! PRESS3D_IN(i,j,2), PSFC_IN(I,J) -! CALL wrf_message(message) - CYCLE I_loop - ENDIF - - ENDIF - - IF ( abs(PRESS3D_IN(i,j,2)-PSFC_IN(I,J)) .gt. 290.) THEN - IF (PRESS3D_IN(i,j,2) .lt. PSFC_IN(I,J) .and. & - Z3D_IN(I,J,2) .lt. TOPO_IN(I,J)) THEN -! write(message,*) 'surface data mismatch(a) at I,J: ', I,J -! CALL wrf_message(message) - CYCLE I_loop - ELSEIF (PRESS3D_IN(i,j,2) .gt. PSFC_IN(I,J) .AND. & - Z3D_IN(I,J,2) .gt. TOPO_IN(I,J)) THEN -! write(message,*) 'surface data mismatch(b) at I,J: ', I,J -! CALL wrf_message(message) - CYCLE I_loop - ENDIF - ENDIF - ENDIF - -!!!!!!! loop over a few more levels - - DO L=3,6 - IF ( PRESS3D_IN(i,j,1) .ne. 200100. .AND. & - (((PSFC_IN(I,J)-PRESS3D_IN(i,j,L)) .lt. 400.) .OR. & - TOPO_IN(I,J) .lt. Z3D_IN(I,J,L))) then - - IF (Z3D_IN(I,J,L) .ne. TOPO_IN(I,J)) THEN - dpdz=(PRESS3D_IN(i,j,L)-PSFC_IN(I,J))/ & - (Z3D_IN(I,J,L)-TOPO_IN(I,J)) - rhs=-9.81*((PRESS3D_IN(i,j,L)+ PSFC_IN(I,J))/2.)/ & - (287.04*T3D_IN(I,J,L)) - IF ( abs(PRESS3D_IN(i,j,L)-PSFC_IN(I,J)) .gt. 290.) THEN - IF (dpdz .lt. 1.05*rhs .or. dpdz .gt. 0.95*rhs) THEN - write(message,*) 'I,J,L,Piso,Psfc,Ziso,Zsfc: ', & - I,J,L,PRESS3D_IN(i,j,L),PSFC_IN(I,J),& - Z3D_IN(I,J,L),TOPO_IN(I,J) - IF (mod(I,5).eq.0 .AND. mod(J,5).eq.0) & - CALL wrf_debug(50,message) - CYCLE I_loop - ENDIF - ENDIF - ELSE - IF (PRESS3D_IN(i,j,2) .eq. PSFC_IN(I,J)) THEN -! write(message,*) 'all equal at I,J: ', I,J -! CALL wrf_message(message) - ELSE - CYCLE I_loop - ENDIF - ENDIF - ENDIF - - IF ( abs(PRESS3D_IN(i,j,L)-PSFC_IN(I,J)) .gt. 290.) THEN - IF (PRESS3D_IN(i,j,L) .lt. PSFC_IN(I,J) .AND. & - Z3D_IN(I,J,L) .lt. TOPO_IN(I,J)) THEN - CYCLE I_loop - ELSEIF (PRESS3D_IN(i,j,L) .gt. PSFC_IN(I,J) .AND. & - Z3D_IN(I,J,L) .gt. TOPO_IN(I,J)) THEN - CYCLE I_loop - ENDIF - ENDIF - END DO -!!!!!!!!!!!!!!!!!!!!!! END HYDRO CHECK - - IF (TERRAIN_HGT_T(I,J) .eq. BOT_INPUT_HGT ) THEN - dum2d(I,J)=BOT_INPUT_PRESS - - IF (BOT_INPUT_HGT .ne. 0. .and. (BOT_INPUT_HGT-INT(BOT_INPUT_HGT) .ne. 0.) ) THEN - write(message,*) 'with BOT_INPUT_HGT: ', BOT_INPUT_HGT, & - 'set dum2d to bot_input_pres: ', I,J,dum2d(I,J) - CALL wrf_message(message) - ENDIF - - IF (dum2d(I,J) .lt. 50000. .OR. dum2d(I,J) .gt. 109000.) THEN - write(message,*) 'bad dum2d(a): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - ENDIF - - ELSEIF (TERRAIN_HGT_T(I,J) .lt. BOT_INPUT_HGT ) THEN - -! target is below lowest possible input...extrapolate - - IF ( BOT_INPUT_PRESS-PRESS3D_IN(I,J,2) .gt. 500. ) THEN - dlnpdz= (log(BOT_INPUT_PRESS)-log(PRESS3D_IN(i,j,2)) ) / & - (BOT_INPUT_HGT-Z3D_IN(i,j,2)) - IF (I .eq. Ilook .and. J .eq. Jlook) THEN - write(message,*) 'I,J,dlnpdz(a): ', I,J,dlnpdz - CALL wrf_message(message) - ENDIF - - ELSE - -!! thin layer and/or just have lowest level - difference with 3rd level data - IF ( abs(BOT_INPUT_PRESS - PRESS3D_IN(i,j,3)) .gt. 290. ) THEN - - dlnpdz= (log(BOT_INPUT_PRESS)-log(PRESS3D_IN(i,j,3)) ) / & - (BOT_INPUT_HGT-Z3D_IN(i,j,3)) - - IF (I .eq. Ilook .and. J .eq. Jlook) then - write(message,*) 'p diff: ', BOT_INPUT_PRESS, PRESS3D_IN(i,j,3) - CALL wrf_message(message) - write(message,*) 'z diff: ', BOT_INPUT_HGT, Z3D_IN(i,j,3) - CALL wrf_message(message) - ENDIF - - ELSE - -!! Loop up to level 7 looking for a sufficiently thick layer - - FIND_THICK: DO LL=4,7 - IF( abs(BOT_INPUT_PRESS - PRESS3D_IN(i,j,LL)) .gt. 290.) THEN - dlnpdz= (log(BOT_INPUT_PRESS)-log(PRESS3D_IN(i,j,LL)) ) / & - (BOT_INPUT_HGT-Z3D_IN(i,j,LL)) - EXIT FIND_THICK - ENDIF - END DO FIND_THICK - - ENDIF - - ENDIF - - dum2d(I,J)= exp(log(BOT_INPUT_PRESS) + dlnpdz * & - (TERRAIN_HGT_T(I,J) - BOT_INPUT_HGT) ) - - IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN - write(message,*) 'bad dum2d(b): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - write(message,*) 'BOT_INPUT_PRESS, dlnpdz, TERRAIN_HGT_T, BOT_INPUT_HGT: ', & - BOT_INPUT_PRESS, dlnpdz, TERRAIN_HGT_T(I,J), BOT_INPUT_HGT - CALL wrf_message(message) - write(message,*) 'Z3D_IN: ', Z3D_IN(I,J,1:10) - CALL wrf_message(message) - write(message,*) 'PRESS3D_IN: ', PRESS3D_IN(I,J,1:10) - CALL wrf_message(message) - ENDIF - - ELSE ! target level bounded by input levels - - DO L=2,generic-1 - IF (TERRAIN_HGT_T(I,J) .gt. Z3D_IN(i,j,L) .AND. & - TERRAIN_HGT_T(I,J) .lt. Z3D_IN(i,j,L+1) ) THEN - dlnpdz= (log(PRESS3D_IN(i,j,l))-log(PRESS3D_IN(i,j,L+1)) ) / & - (Z3D_IN(i,j,l)-Z3D_IN(i,j,L+1)) - dum2d(I,J)= log(PRESS3D_IN(i,j,l)) + & - dlnpdz * (TERRAIN_HGT_T(I,J) - Z3D_IN(i,j,L) ) - dum2d(i,j)=exp(dum2d(i,j)) - IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN - write(message,*) 'bad dum2d(c): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - ENDIF - ENDIF - ENDDO - -!!! account for situation where BOT_INPUT_HGT < TERRAIN_HGT_T < Z3D_IN(:,2,:) - IF (dum2d(I,J) .eq. -9 .AND. BOT_INPUT_HGT .lt. TERRAIN_HGT_T(I,J) & - .AND. TERRAIN_HGT_T(I,J) .lt. Z3D_IN(I,J,2)) then - - IF (mod(I,50) .eq. 0 .AND. mod(J,50) .eq. 0) THEN - write(message,*) 'I,J,BOT_INPUT_HGT, bot_pres, TERRAIN_HGT_T: ', & - I,J,BOT_INPUT_HGT, BOT_INPUT_PRESS, TERRAIN_HGT_T(I,J) - CALL wrf_message(message) - ENDIF - - dlnpdz= (log(PSFC_IN(i,j))-log(PRESS3D_IN(i,j,2)) ) / & - (TOPO_IN(i,j)-Z3D_IN(i,j,2)) - dum2d(I,J)= log(PSFC_IN(i,j)) + & - dlnpdz * (TERRAIN_HGT_T(I,J) - TOPO_IN(i,j) ) - dum2d(i,j)= exp(dum2d(i,j)) - IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN - write(message,*) 'bad dum2d(d): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - ENDIF - ENDIF - - IF (dum2d(I,J) .eq. -9.) THEN - write(message,*) 'must have flukey situation in new ', I,J - CALL wrf_message(message) - write(message,*) 'I,J,BOT_INPUT_HGT, bot_pres, TERRAIN_HGT_T: ', & - I,J,BOT_INPUT_HGT, BOT_INPUT_PRESS, TERRAIN_HGT_T(I,J) - CALL wrf_message(message) - - DO L=1,generic-1 - IF ( TERRAIN_HGT_T(I,J) .eq. Z3D_IN(i,j,L) ) THEN -! problematic with HGT_M substitution for "input" surface height? - dum2d(i,j)=PRESS3D_IN(I,J,L) - IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN - write(message,*) 'bad dum2d(e): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - ENDIF - ENDIF - ENDDO - - IF ( TERRAIN_HGT_T(I,J) .eq. TOPO_IN(I,J)) THEN - dum2d(I,J)=PSFC_IN(I,J) - IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN - write(message,*) 'bad dum2d(grid%f): ', I,J,DUM2D(I,J) - CALL wrf_message(message) - ENDIF - write(message,*) 'matched input topo, psfc: ', I,J,TOPO_IN(I,J),PSFC_IN(I,J) - CALL wrf_message(message) - ENDIF - - IF (dum2d(I,J) .eq. -9.) THEN - CALL wrf_error_fatal("quitting due to undefined surface pressure") - ENDIF - ENDIF - - DEFINED_PSFC(I,J)=.TRUE. - - IF (I .eq. Ilook .AND. J .eq. Jlook) THEN - write(message,*) 'newstyle psfc: ', I,J,dum2d(I,J) - CALL wrf_message(message) - ENDIF - - ENDIF - - ENDDO I_loop - ENDDO - -! write(message,*) 'psfc points (new style)' -! CALL wrf_message(message) - -! DO J=min(JTE,JDE-1),JTS,-loopinc -! write(message,633) (dum2d(I,J)/100.,I=ITS,min(ITE,IDE-1),iloopinc) -! CALL wrf_message(message) -! END DO - - 633 format(35(f5.0,1x)) - - write(message,*) 'PSFC extremes (new style)' - CALL wrf_message(message) - write(message,*) minval(dum2d,MASK=DEFINED_PSFC),maxval(dum2d,MASK=DEFINED_PSFC) - CALL wrf_message(message) - -! IF (minval(dum2d,MASK=DEFINED_PSFC) .lt. 50000. .or. maxval(dum2d,MASK=DEFINED_PSFC) .gt. 108000.) THEN - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - - IF (DEFINED_PSFC(I,J) .AND. dum2d(I,J) .lt. 50000. ) THEN - IF (TERRAIN_HGT_T(I,J) .gt. 4500.) THEN - WRITE(message,*) 'low surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - - IF (DEFINED_PSFC(I,J) .AND. dum2d(I,J) .gt. 108000. ) THEN - IF (TERRAIN_HGT_T(I,J) .lt. -10.) THEN - WRITE(message,*) 'high surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - - END DO - END DO - - - -!! "traditional" isobaric only approach ------------------------------------------------ - - ALLOCATE (DUM2DB(IMS:IME,JMS:JME)) - DO J=JMS,JME - DO I=IMS,IME - DUM2DB(I,J)=-9. - END DO - END DO - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - - IF (TERRAIN_HGT_T(I,J) .lt. Z3D_IN(i,j,2)) THEN ! targ below lowest - - IF ( abs(PRESS3D_IN(i,j,2)-PRESS3D_IN(i,j,3)) .gt. 290.) THEN - dlnpdz= (log(PRESS3D_IN(i,j,2))-log(PRESS3D_IN(i,j,3)) ) / & - (Z3D_IN(i,j,2)-Z3D_IN(i,j,3)) - ELSE - dlnpdz= (log(PRESS3D_IN(i,j,2))-log(PRESS3D_IN(i,j,4)) ) / & - (Z3D_IN(i,j,2)-Z3D_IN(i,j,4)) - ENDIF - - DUM2DB(I,J)= exp( log(PRESS3D_IN(i,j,2)) + dlnpdz * & - (TERRAIN_HGT_T(I,J) - Z3D_IN(i,j,2)) ) - - IF (I .eq. Ilook .and. J .eq. Jlook) THEN - write(message,*) 'I,K, trad: dlnpdz, press_in(2), terrain_t, Z3D_IN(2): ', I,J,dlnpdz, & - PRESS3D_IN(i,j,2), TERRAIN_HGT_T(I,J), Z3D_IN(i,j,2) - CALL wrf_message(message) - ENDIF - - DEFINED_PSFCB(i,j)=.true. - - ELSEIF (TERRAIN_HGT_T(I,J) .gt. Z3D_IN(i,j,2)) THEN ! target level bounded by input levels - - DO L=2,generic-1 - IF (TERRAIN_HGT_T(I,J) .gt. Z3D_IN(i,j,L) .AND. & - TERRAIN_HGT_T(I,J) .lt. Z3D_IN(i,j,L+1) ) THEN - - dlnpdz= (log(PRESS3D_IN(i,j,l))-log(PRESS3D_IN(i,j,L+1)) ) / & - (Z3D_IN(i,j,l)-Z3D_IN(i,j,L+1)) - - DUM2DB(I,J)= log(PRESS3D_IN(i,j,l)) + & - dlnpdz * (TERRAIN_HGT_T(I,J) - Z3D_IN(i,j,L) ) - DUM2DB(i,j)=exp(DUM2DB(i,j)) - - DEFINED_PSFCB(i,j)=.true. - - IF (DUM2DB(I,J) .lt. 13000.) THEN - write(message,*) 'I,J,L,terrain,Z3d(L),z3d(L+1),p3d(L),p3d(l+1): ', I,J,L, & - TERRAIN_HGT_T(I,J),Z3D_IN(I,J,L),Z3D_IN(I,J,L+1),PRESS3D_IN(I,J,L), & - PRESS3D_IN(I,J,L+1) - CALL wrf_error_fatal(message) - ENDIF - ENDIF - ENDDO - - ELSEIF (TERRAIN_HGT_T(I,J) .eq. Z3D_IN(i,j,2)) THEN - DUM2DB(i,j)=PRESS3D_IN(I,J,2) - DEFINED_PSFCB(i,j)=.true. - ENDIF - - IF (DUM2DB(I,J) .eq. -9.) THEN - write(message,*) 'must have flukey situation in trad ', I,J - CALL wrf_message(message) - DO L=1,generic-1 - IF ( TERRAIN_HGT_T(I,J) .eq. Z3D_IN(i,j,L) ) THEN - DUM2DB(i,j)=PRESS3D_IN(I,J,L) - DEFINED_PSFCB(i,j)=.true. - ENDIF - ENDDO - ENDIF - - IF (DUM2DB(I,J) .eq. -9.) THEN - write(message,*) 'HOPELESS PSFC, I QUIT' - CALL wrf_error_fatal(message) - ENDIF - - if (I .eq. Ilook .and. J .eq. Jlook) THEN - write(message,*) ' traditional psfc: ', I,J,DUM2DB(I,J) - CALL wrf_message(message) - ENDIF - - ENDDO - ENDDO - -! write(message,*) 'psfc points (traditional)' -! CALL wrf_message(message) -! DO J=min(JTE,JDE-1),JTS,-loopinc -! write(message,633) (DUM2DB(I,J)/100.,I=its,min(ite,IDE-1),iloopinc) -! CALL wrf_message(message) -! ENDDO - - write(message,*) 'PSFC extremes (traditional)' - CALL wrf_message(message) - write(message,*) minval(DUM2DB,MASK=DEFINED_PSFCB),maxval(DUM2DB,MASK=DEFINED_PSFCB) - CALL wrf_message(message) - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - - IF (DEFINED_PSFCB(I,J) .AND. dum2db(I,J) .lt. 50000. ) THEN - IF (TERRAIN_HGT_T(I,J) .gt. 4500.) THEN - WRITE(message,*) 'low surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - - IF (DEFINED_PSFCB(I,J) .AND. dum2db(I,J) .gt. 108000. ) THEN - IF (TERRAIN_HGT_T(I,J) .lt. -10.) THEN - WRITE(message,*) 'high surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - -! IF (DEFINED_PSFCB(I,J) .AND. ( dum2db(I,J) .lt. 50000. .OR. dum2db(I,J) .gt. 108000. )) THEN -! IF (TERRAIN_HGT_T(I,J) .gt. -10. .and. TERRAIN_HGT_T(I,J) .lt. 5000.) THEN -! write(0,*) 'I,J, terrain_hgt_t, dum2db: ', I,J, terrain_hgt_t(I,J),dum2db(I,J) -! CALL wrf_error_fatal("quit due to unrealistic surface pressure") -! ELSE -! WRITE(message,*) 'surface pressure allowed because surface height is extreme value of: ', TERRAIN_HGT_T(I,J) -! CALL wrf_debug(2,message) -! ENDIF -! ENDIF - - ENDDO - ENDDO - -!!!!! end traditional - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - IF (DEFINED_PSFCB(I,J) .and. DEFINED_PSFC(I,J)) THEN - - IF ( abs(dum2d(I,J)-DUM2DB(I,J)) .gt. 400.) THEN - write(message,*) 'BIG DIFF I,J, dum2d, DUM2DB: ', I,J,dum2d(I,J),DUM2DB(I,J) - CALL wrf_message(message) - ENDIF - -!! do we have enough confidence in new style to give it more than 50% weight? - psfc_out(I,J)=0.5*(dum2d(I,J)+DUM2DB(I,J)) - - ELSEIF (DEFINED_PSFC(I,J)) THEN - psfc_out(I,J)=dum2d(I,J) - ELSEIF (DEFINED_PSFCB(I,J)) THEN - psfc_out(I,J)=DUM2DB(I,J) - ELSE - write(message,*) 'I,J,dum2d,DUM2DB: ', I,J,dum2d(I,J),DUM2DB(I,J) - CALL wrf_message(message) - write(message,*) 'I,J,DEFINED_PSFC(I,J),DEFINED_PSFCB(I,J): ', I,J,DEFINED_PSFC(I,J),DEFINED_PSFCB(I,J) - CALL wrf_message(message) - call wrf_error_fatal("psfc_out completely undefined") - ENDIF - - IF (I .eq. Ilook .AND. J .eq. Jlook) THEN - write(message,*) ' combined psfc: ', I,J,psfc_out(I,J) - CALL wrf_message(message) - ENDIF - - IF (psfc_out(I,J) .lt. 50000. ) THEN - IF (TERRAIN_HGT_T(I,J) .gt. 4500.) THEN - WRITE(message,*) 'low surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - write(message,*) 'possibly bad combo on psfc_out: ', I,J, psfc_out(I,J) - CALL wrf_debug(2,message) - write(message,*) 'DEFINED_PSFC, dum2d: ', DEFINED_PSFC(I,J),dum2d(I,J) - CALL wrf_debug(2,message) - write(message,*) 'DEFINED_PSFCB, DUM2DB: ', DEFINED_PSFCB(I,J),DUM2DB(I,J) - CALL wrf_debug(2,message) - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - - IF (psfc_out(I,J) .gt. 108000. ) THEN - IF (TERRAIN_HGT_T(I,J) .lt. -10.) THEN - WRITE(message,*) 'high surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J) - CALL wrf_debug(2,message) - ELSE - write(message,*) 'possibly bad combo on psfc_out: ', I,J, psfc_out(I,J) - CALL wrf_debug(2,message) - write(message,*) 'DEFINED_PSFC, dum2d: ', DEFINED_PSFC(I,J),dum2d(I,J) - CALL wrf_debug(2,message) - write(message,*) 'DEFINED_PSFCB, DUM2DB: ', DEFINED_PSFCB(I,J),DUM2DB(I,J) - CALL wrf_debug(2,message) - CALL wrf_error_fatal("quit due to unrealistic surface pressure") - ENDIF - ENDIF - - ENDDO - ENDDO - - deallocate(dum2d,dum2db) - - END SUBROUTINE compute_nmm_surfacep - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - SUBROUTINE compute_3d_pressure(psfc_out,SGML1,SGML2,pdtop,pt & - &, pd,p3d_out & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE - - REAL, INTENT(IN) :: psfc_out(IMS:IME,JMS:JME) - REAL, INTENT(IN) :: SGML1(KDE),SGML2(KDE),pdtop,pt - - REAL, INTENT(OUT):: p3d_out(IMS:IME,JMS:JME,KDS:KDE-1) - REAL, INTENT(OUT):: pd(IMS:IME,JMS:JME) - - CHARACTER (len=255) :: message - -! write(message,*) 'pdtop, pt, psfc_out(1,1): ', pdtop, pt, psfc_out(1,1) -! CALL wrf_message(message) - - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - pd(I,J)=psfc_out(I,J)-pdtop-pt - ENDDO - ENDDO - - DO J=JTS,min(JTE,JDE-1) - DO K=KDS,KDE-1 - DO I=ITS,min(ITE,IDE-1) - p3d_out(I,J,K)=pd(I,J)*SGML2(K)+pdtop*SGML1(K)+pt - - IF (p3d_out(I,J,K) .ge. psfc_out(I,J) .or. p3d_out(I,J,K) .le. pt) THEN - write(message,*) 'I,K,J,p3d_out: ', I,K,J,p3d_out(I,J,K) - CALL wrf_error_fatal(message) - ENDIF - - ENDDO - ENDDO - ENDDO - - END SUBROUTINE compute_3d_pressure - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - SUBROUTINE interp_press2press_lin(press_in,press_out, & - data_in, data_out,generic & - &, extrapolate,ignore_lowest,TFIELD & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time ) - - ! Interpolates data from one set of pressure surfaces to - ! another set of pressures - - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE,generic - INTEGER :: internal_time - -! REAL, INTENT(IN) :: press_in(IMS:IME,generic,JMS:JME) - REAL, INTENT(IN) :: press_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(IN) :: press_out(IMS:IME,JMS:JME,KDS:KDE-1) -! REAL, INTENT(IN) :: data_in(IMS:IME,generic,JMS:JME) - REAL, INTENT(IN) :: data_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(OUT) :: data_out(IMS:IME,JMS:JME,KMS:KME) - LOGICAL, INTENT(IN) :: extrapolate, ignore_lowest, TFIELD - LOGICAL :: col_smooth - - INTEGER :: i,j - INTEGER :: k,kk - REAL :: desired_press - REAL :: dvaldlnp,dlnp,tadiabat,tiso - - REAL, PARAMETER :: ADIAFAC=9.81/1004. - REAL, PARAMETER :: TSTEXTRAPFAC=.0065 - - - - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - DATA_OUT(I,J,K)=-99999.9 - ENDDO - ENDDO - ENDDO - - IF (ignore_lowest) then - LMIN=2 - ELSE - LMIN=1 - ENDIF - - DO j = JTS, min(JTE,JDE-1) - test_i: DO i = ITS, min(ITE,IDE-1) - - IF (internal_time_loop .gt. 1) THEN - IF (J .ne. JDS .and. J .ne. JDE-1 .and. & - I .ne. IDS .and. I .ne. IDE-1 ) THEN -!! not on boundary - CYCLE test_i - ENDIF - ENDIF - - - col_smooth=.false. - - output_loop: DO k = KDS,KDE-1 - - desired_press = press_out(i,j,k) - - if (K .gt. KDS) then - if (TFIELD .and. col_smooth .and. desired_press .le. press_in(i,j,LMIN) & - .and. press_out(i,j,k-1) .ge. press_in(i,j,LMIN)) then - MAX_SMOOTH=K -! write(message,*) 'I,J, MAX_SMOOTH: ', I,J, MAX_SMOOTH -! CALL wrf_debug(100,message) - endif - endif - -! keep track of where the extrapolation begins - - IF (desired_press .GT. press_in(i,j,LMIN)) THEN - IF (TFIELD .and. K .eq. 1 .and. (desired_press - press_in(i,j,LMIN)) .gt. 3000.) then - col_smooth=.TRUE. ! due to large extrapolation distance - ENDIF - - - IF ((desired_press - press_in(i,j,LMIN)).LT. 50.) THEN ! 0.5 mb - data_out(i,j,k) = data_in(i,j,LMIN) - ELSE - IF (extrapolate) THEN - ! Extrapolate downward because desired P level is below - ! the lowest level in our input data. Extrapolate using simple - ! 1st derivative of value with respect to ln P for the bottom 2 - ! input layers. - - ! Add a check to make sure we are not using the gradient of - ! a very thin layer - - if (TFIELD) then - tiso=0.5*(data_in(i,j,1)+data_in(i,j,2)) - endif - - - IF ( (press_in(i,j,LMIN)-press_in(i,j,LMIN+1)) .GT. 500.) THEN ! likely isobaric data - dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+1)) - dvaldlnp = (data_in(i,j,LMIN) - data_in(i,j,LMIN+1)) / dlnp - ELSE ! assume terrain following - dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+5)) - dvaldlnp = (data_in(i,j,LMIN) - data_in(i,j,LMIN+5)) / dlnp - ENDIF - data_out(i,j,k) = data_in(i,j,LMIN) + dvaldlnp * & - ( log(desired_press)-log(press_in(i,j,LMIN)) ) - - if (TFIELD .and. data_out(i,j,k) .lt. tiso-0.2) then - -! restrict slope to -1K/10 hPa - dvaldlnp=max(dvaldlnp, -1.0/ & - log( press_in(i,j,LMIN) / & - ( press_in(i,j,LMIN)-1000.) )) - - data_out(I,J,K)= data_in(i,j,LMIN) + dvaldlnp * & - ( log(desired_press)-log(press_in(i,j,LMIN)) ) - - elseif (TFIELD .and. data_out(i,j,k) .gt. tiso+0.2) then - -! restrict slope to +0.8K/10 hPa - dvaldlnp=min(dvaldlnp, 0.8/ & - log( press_in(i,j,LMIN) / & - ( press_in(i,j,LMIN)-1000.) )) - - data_out(I,J,K)= data_in(i,j,LMIN) + dvaldlnp * & - ( log(desired_press)-log(press_in(i,j,LMIN)) ) - - endif - - ELSE - data_out(i,j,k) = data_in(i,j,LMIN) - ENDIF - ENDIF - ELSE IF (desired_press .LT. press_in(i,j,generic)) THEN - IF ( (press_in(i,j,generic) - desired_press) .LT. 10.) THEN - data_out(i,j,k) = data_in(i,j,generic) - ELSE - IF (extrapolate) THEN - ! Extrapolate upward - IF ((press_in(i,j,generic-1)-press_in(i,j,generic)).GT.50.) THEN - dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-1)) - dvaldlnp=(data_in(i,j,generic)-data_in(i,j,generic-1))/dlnp - ELSE - dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-2)) - dvaldlnp=(data_in(i,j,generic)-data_in(i,j,generic-2))/dlnp - ENDIF - data_out(i,j,k) = data_in(i,j,generic) + & - dvaldlnp * (log(desired_press)-log(press_in(i,j,generic))) - ELSE - data_out(i,j,k) = data_in(i,j,generic) - ENDIF - ENDIF - ELSE - ! We can trap between two levels and linearly interpolate - - input_loop: DO kk = LMIN, generic-1 - IF (desired_press .EQ. press_in(i,j,kk) )THEN - data_out(i,j,k) = data_in(i,j,kk) - EXIT input_loop - ELSE IF ( (desired_press .LT. press_in(i,j,kk)) .AND. & - (desired_press .GT. press_in(i,j,kk+1)) ) THEN - -! do trapped in lnp - - dlnp = log(press_in(i,j,kk)) - log(press_in(i,j,kk+1)) - dvaldlnp = (data_in(i,j,kk)-data_in(i,j,kk+1))/dlnp - data_out(i,j,k) = data_in(i,j,kk+1)+ & - dvaldlnp*(log(desired_press)-log(press_in(i,j,kk+1))) - - EXIT input_loop - ENDIF - - ENDDO input_loop - ENDIF - ENDDO output_loop - - if (col_smooth) then - do K=max(KDS,MAX_SMOOTH-4),MAX_SMOOTH+4 - data_out(I,J,K)=0.5*(data_out(I,J,K)+data_out(I,J,K+1)) - enddo - endif - - ENDDO test_i - ENDDO - END SUBROUTINE interp_press2press_lin - - SUBROUTINE wind_adjust(press_in,press_out, & - U_in, V_in,U_out,V_out & - &, generic,depth_replace & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE,generic - INTEGER :: MAXLIN,MAXLOUT - - REAL, INTENT(IN) :: press_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(IN) :: press_out(IMS:IME,JMS:JME,KDS:KDE-1) - REAL, INTENT(IN) :: U_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(IN) :: V_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(INOUT) :: U_out(IMS:IME,KMS:KME,JMS:JME) - REAL, INTENT(INOUT) :: V_out(IMS:IME,KMS:KME,JMS:JME) - REAL :: p1d_in(generic) - REAL :: p1d_out(KDS:KDE-1) - - - DO j = JTS, min(JTE,JDE-1) - DO i = ITS, min(ITE,IDE-1) - -! IF (press_out(I,J,1) .lt. press_in(I,J,2)) then - IF( (press_in(I,J,2)-press_out(I,J,1)) .gt. 200.) then - - U_out(I,1,J)=U_in(I,J,2) - V_out(I,1,J)=V_in(I,J,2) - - INLOOP: DO L=2,generic - p1d_in(L)=-9999. - IF ( (press_in(I,J,2)-press_in(I,J,L)) .lt. depth_replace) THEN - p1d_in(L)=(press_in(I,J,2)-press_in(I,J,L)) - MAXLIN=L - ELSE - p1d_in(L)=(press_in(I,J,2)-press_in(I,J,L)) - EXIT INLOOP - ENDIF - END DO INLOOP - - OUTLOOP: DO L=KDS,KDE-1 - p1d_out(L)=-9999. - IF ( (press_out(I,J,1)-press_out(I,J,L)) .lt. depth_replace) THEN - p1d_out(L)=(press_out(I,J,1)-press_out(I,J,L)) - MAXLOUT=L - ELSE - EXIT OUTLOOP - ENDIF - END DO OUTLOOP - - DO L=1,MAXLOUT - ptarg=p1d_out(L) - - FINDLOOP: DO LL=2,MAXLIN - - if (p1d_in(LL) .lt. ptarg .and. p1d_in(LL+1) .gt. ptarg) then - - dlnp=log(p1d_in(LL))-log(p1d_in(LL+1)) - dudlnp=(U_in(I,J,LL)-U_in(I,J,LL+1))/dlnp - dvdlnp=(V_in(I,J,LL)-V_in(I,J,LL+1))/dlnp - U_out(I,L,J)=U_in(I,J,LL)+dudlnp*(log(ptarg)-log(p1d_in(LL))) - V_out(I,L,J)=V_in(I,J,LL)+dvdlnp*(log(ptarg)-log(p1d_in(LL))) - - EXIT FINDLOOP - endif - - END DO FINDLOOP - END DO ! MAXLOUT loop - - - ENDIF - - ENDDO - ENDDO - - - - END SUBROUTINE wind_adjust -!-------------------------------------------------------------------- - - SUBROUTINE interp_press2press_log(press_in,press_out, & - data_in, data_out, generic & - &, extrapolate,ignore_lowest & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time ) - - ! Interpolates ln(data) from one set of pressure surfaces to - ! another set of pressures - - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE,generic - INTEGER :: internal_time - -! REAL, INTENT(IN) :: press_in(IMS:IME,generic,JMS:JME) - REAL, INTENT(IN) :: press_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(IN) :: press_out(IMS:IME,JMS:JME,KDS:KDE-1) -! REAL, INTENT(IN) :: data_in(IMS:IME,generic,JMS:JME) -! REAL, INTENT(IN) :: data_in(IMS:IME,JMS:JME,generic) - REAL :: data_in(IMS:IME,JMS:JME,generic) - REAL, INTENT(OUT) :: data_out(IMS:IME,JMS:JME,KMS:KME) - LOGICAL, INTENT(IN) :: extrapolate, ignore_lowest - - INTEGER :: i,j - INTEGER :: k,kk - REAL :: desired_press - REAL :: dlnvaldlnp,dlnp - - - DO K=1,generic - DO j = JTS, min(JTE,JDE-1) - DO i = ITS, min(ITE,IDE-1) - DATA_IN(I,J,K)=max(DATA_in(I,J,K),1.e-13) - ENDDO - ENDDO - ENDDO - - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - DATA_OUT(I,J,K)=-99999.9 - ENDDO - ENDDO - ENDDO - - IF (ignore_lowest) then - LMIN=2 - ELSE - LMIN=1 - ENDIF - - DO j = JTS, min(JTE,JDE-1) - test_i: DO i = ITS, min(ITE,IDE-1) - - IF (internal_time .gt. 1) THEN - IF (J .ne. JDS .and. J .ne. JDE-1 .and. & - I .ne. IDS .and. I .ne. IDE-1 ) THEN -!! not on boundary - CYCLE test_i - ENDIF - ENDIF - - - output_loop: DO k = KDS,KDE-1 - - desired_press = press_out(i,j,k) - - IF (desired_press .GT. press_in(i,j,LMIN)) THEN - - IF ((desired_press - press_in(i,j,LMIN)).LT. 10.) THEN ! 0.1 mb - data_out(i,j,k) = data_in(i,j,LMIN) - ELSE - IF (extrapolate) THEN - ! Extrapolate downward because desired P level is below - ! the lowest level in our input data. Extrapolate using simple - ! 1st derivative of value with respect to ln P for the bottom 2 - ! input layers. - - ! Add a check to make sure we are not using the gradient of - ! a very thin layer - - IF ( (press_in(i,j,LMIN)-press_in(i,j,LMIN+1)) .GT. 100.) THEN - dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+1)) - dlnvaldlnp = ( log(data_in(i,j,LMIN)) - log(data_in(i,j,LMIN+1)) ) / dlnp - - ELSE - - dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+2)) - dlnvaldlnp = (log(data_in(i,j,LMIN)) - log(data_in(i,j,LMIN+2))) / dlnp - - ENDIF - - data_out(i,j,k) = exp(log(data_in(i,j,LMIN)) + dlnvaldlnp * & - ( log(desired_press)-log(press_in(i,j,LMIN)))) - ELSE - data_out(i,j,k) = data_in(i,j,LMIN) - ENDIF - ENDIF - ELSE IF (desired_press .LT. press_in(i,j,generic)) THEN - IF ( (press_in(i,j,generic) - desired_press) .LT. 10.) THEN - data_out(i,j,k) = data_in(i,j,generic) - ELSE - IF (extrapolate) THEN - ! Extrapolate upward - IF ((press_in(i,j,generic-1)-press_in(i,j,generic)).GT.50.) THEN - dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-1)) - dlnvaldlnp=(log(data_in(i,j,generic))-log(data_in(i,j,generic-1)))/dlnp - ELSE - dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-2)) - dlnvaldlnp=(log(data_in(i,j,generic))-log(data_in(i,j,generic-2)))/dlnp - ENDIF - data_out(i,j,k) = exp(log(data_in(i,j,generic)) + & - dlnvaldlnp * (log(desired_press)-log(press_in(i,j,generic)))) - ELSE - data_out(i,j,k) = data_in(i,j,generic) - ENDIF - ENDIF - ELSE - ! We can trap between two levels and linearly interpolate - - input_loop: DO kk = LMIN, generic-1 - IF (desired_press .EQ. press_in(i,j,kk) )THEN - data_out(i,j,k) = data_in(i,j,kk) - EXIT input_loop - ELSE IF ( (desired_press .LT. press_in(i,j,kk)) .AND. & - (desired_press .GT. press_in(i,j,kk+1)) ) THEN - -! do trapped in lnp - - dlnp = log(press_in(i,j,kk)) - log(press_in(i,j,kk+1)) - dlnvaldlnp = (log(data_in(i,j,kk))-log(data_in(i,j,kk+1)))/dlnp - data_out(i,j,k) = exp(log(data_in(i,j,kk+1))+ & - dlnvaldlnp*(log(desired_press)-log(press_in(i,j,kk+1)))) - - EXIT input_loop - - ENDIF - - ENDDO input_loop - ENDIF - ENDDO output_loop - ENDDO test_i - ENDDO - END SUBROUTINE interp_press2press_log - -!------------------------------------------------------------------- - SUBROUTINE rh_to_mxrat (rh, t, p, q , wrt_liquid , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte - - LOGICAL , INTENT(IN) :: wrt_liquid - -! REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(IN) :: p , t -! REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(INOUT) :: rh - REAL , DIMENSION(ims:ime,jms:jme,kms:kme) , INTENT(IN) :: p , t - REAL , DIMENSION(ims:ime,jms:jme,kms:kme) , INTENT(INOUT) :: rh - REAL , DIMENSION(ims:ime,jms:jme,kms:kme) , INTENT(OUT) :: q - - ! Local vars - - INTEGER :: i , j , k - - REAL :: ew , q1 , t1 - - REAL, PARAMETER :: T_REF = 0.0 - REAL, PARAMETER :: MW_AIR = 28.966 - REAL, PARAMETER :: MW_VAP = 18.0152 - - REAL, PARAMETER :: A0 = 6.107799961 - REAL, PARAMETER :: A1 = 4.436518521e-01 - REAL, PARAMETER :: A2 = 1.428945805e-02 - REAL, PARAMETER :: A3 = 2.650648471e-04 - REAL, PARAMETER :: A4 = 3.031240396e-06 - REAL, PARAMETER :: A5 = 2.034080948e-08 - REAL, PARAMETER :: A6 = 6.136820929e-11 - - REAL, PARAMETER :: ES0 = 6.1121 - - REAL, PARAMETER :: C1 = 9.09718 - REAL, PARAMETER :: C2 = 3.56654 - REAL, PARAMETER :: C3 = 0.876793 - REAL, PARAMETER :: EIS = 6.1071 - REAL :: RHS - REAL, PARAMETER :: TF = 273.16 - REAL :: TK - - REAL :: ES - REAL :: QS - REAL, PARAMETER :: EPS = 0.622 - REAL, PARAMETER :: SVP1 = 0.6112 - REAL, PARAMETER :: SVP2 = 17.67 - REAL, PARAMETER :: SVP3 = 29.65 - REAL, PARAMETER :: SVPT0 = 273.15 - - ! This subroutine computes mixing ratio (q, kg/kg) from basic variables - ! pressure (p, Pa), temperature (t, K) and relative humidity (rh, 1-100%). - ! The reference temperature (t_ref, C) is used to describe the temperature - ! at which the liquid and ice phase change occurs. - - DO k = kts , kte - DO j = jts , MIN ( jde-1 , jte ) - DO i = its , MIN (ide-1 , ite ) - rh(i,j,k) = MIN ( MAX ( rh(i,j,k) , 1. ) , 100. ) - END DO - END DO - END DO - - IF ( wrt_liquid ) THEN - DO k = kts , kte - DO j = jts , MIN ( jde-1 , jte ) - DO i = its , MIN (ide-1 , ite ) - es=svp1*10.*EXP(svp2*(t(i,j,k)-svpt0)/(t(i,j,k)-svp3)) - qs=eps*es/(p(i,j,k)/100.-es) - q(i,j,k)=MAX(.01*rh(i,j,k)*qs,0.0) - END DO - END DO - END DO - - ELSE - DO k = kts , kte - DO j = jts , MIN ( jde-1 , jte ) - DO i = its , MIN (ide-1 , ite ) - - t1 = t(i,j,k) - 273.16 - - ! Obviously dry. - - IF ( t1 .lt. -200. ) THEN - q(i,j,k) = 0 - - ELSE - - ! First compute the ambient vapor pressure of water - - IF ( ( t1 .GE. t_ref ) .AND. ( t1 .GE. -47.) ) THEN ! liq phase ESLO - ew = a0 + t1 * (a1 + t1 * (a2 + t1 * (a3 + t1 * (a4 + t1 * (a5 + t1 * a6))))) - - ELSE IF ( ( t1 .GE. t_ref ) .AND. ( t1 .LT. -47. ) ) then !liq phas poor ES - ew = es0 * exp(17.67 * t1 / ( t1 + 243.5)) - - ELSE - tk = t(i,j,k) - rhs = -c1 * (tf / tk - 1.) - c2 * alog10(tf / tk) + & - c3 * (1. - tk / tf) + alog10(eis) - ew = 10. ** rhs - - END IF - - ! Now sat vap pres obtained compute local vapor pressure - - ew = MAX ( ew , 0. ) * rh(i,j,k) * 0.01 - - ! Now compute the specific humidity using the partial vapor - ! pressures of water vapor (ew) and dry air (p-ew). The - ! constants assume that the pressure is in hPa, so we divide - ! the pressures by 100. - - q1 = mw_vap * ew - q1 = q1 / (q1 + mw_air * (p(i,j,k)/100. - ew)) - - q(i,j,k) = q1 / (1. - q1 ) - - END IF - - END DO - END DO - END DO - - END IF - - END SUBROUTINE rh_to_mxrat - -!--=------------------------------------------------------------------ - - SUBROUTINE boundary_smooth(h, landmask, grid, nsmth , nrow & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - implicit none - - TYPE (domain) :: grid - - integer :: IDS,IDE,JDS,JDE,KDS,KDE - integer :: IMS,IME,JMS,JME,KMS,KME - integer :: ITS,ITE,JTS,JTE,KTS,KTE - integer:: ihw(JDS:JDE-1),ihe(JDS:JDE-1),nsmth,nrow - real:: h(IMS:IME,JMS:JME),landmask(IMS:IME,JMS:JME) - real :: h_old(IMS:IME,JMS:JME) - real :: hbms(IDS:IDE-1,JDS:JDE-1) - real :: hse(IDS:IDE-1,JDS:JDE-1) - real :: hne(IDS:IDE-1,JDS:JDE-1) - integer :: IPS,IPE,JPS,JPE,KPS,KPE - integer :: ihl, ihh, m2l, ibas,jmelin - integer :: I,J,KS,IOFFSET,JSTART,JEND - character (len=255) :: message - - ips=its - ipe=ite - jps=jts - jpe=jte - kps=kts - kpe=kte - - do j= JTS,min(JTE,JDE-1) - ihw(J)=-mod(J,2) - ihe(j)=ihw(J)+1 - end do - - do J=JTS,min(JTE,JDE-1) - do I=ITS,min(ITE,IDE-1) - hbms(I,J)=landmask(I,J) - enddo - enddo - - jmelin=(JDE-1)-nrow+1 - ibas=nrow/2 - m2l=mod(nrow,2) - - do j=jts,min(jte,jde-1) - ihl=ibas+mod(j,2)+m2l*mod(J+1,2) - ihh=(IDE-1)-ibas-m2l*mod(J+1,2) - do i=its,min(ite,ide-1) - if (I .ge. ihl .and. I .le. ihh .and. J .ge. nrow .and. J .le. jmelin) then - hbms(I,J)=0. - endif - end do - end do - - 634 format(30(f2.0,1x)) - - do KS=1,nsmth - - grid%ht_gc=h -#ifdef DM_PARALLEL -# include "HALO_NMM_MG.inc" -#endif - h=grid%ht_gc - h_old=grid%ht_gc - - do J=JTS,min(JTE,JDE-1) - do I=ITS, min(ITE,IDE-1) - if (I .ge. (IDS+mod(J,2)) .and. J .gt. JDS .and. J .lt. JDE-1 .and. I .lt. IDE-1) then - h(i,j)= ( h_old(i+ihe(j),j+1) + h_old(i+ihw(j),j-1) + h_old(i+ihe(j),j-1) + h_old(i+ihw(j),j+1) - & - 4. *h_old(i,j) )*hbms(i,j)*0.125+h_old(i,j) - endif - - enddo - enddo - -! special treatment for four corners - - if (hbms(1,1) .eq. 1 .and. ITS .le. 1 .and. JTS .le. 1) then - h(1,1)=0.75*h(1,1)+0.125*h(1+ihe(1),2)+ & - 0.0625*(h(2,1)+h(1,3)) - endif - - if (hbms(IDE-1,1) .eq. 1 .and. ITE .ge. IDE-2 .and. JTS .le. 1) then - h(IDE-1,1)=0.75*h(IDE-1,1)+0.125*h(IDE-1+ihw(1),2)+ & - 0.0625*(h(IDE-1-1,1)+h(IDE-1,3)) - endif - - if (hbms(1,JDE-1) .eq. 1 .and. ITS .le. 1 .and. JTE .ge. JDE-2) then - h(1,JDE-1)=0.75*h(1,JDE-1)+0.125*h(1+ihe(JDE-1),JDE-1-1)+ & - 0.0625*(h(2,JDE-1)+h(1,JDE-1-2)) - endif - - if (hbms(IDE-1,JDE-1) .eq. 1 .and. ITE .ge. IDE-2 .and. JTE .ge. JDE-2) then - h(IDE-1,JDE-1)=0.75*h(IDE-1,JDE-1)+0.125*h(IDE-1+ihw(JDE-1),JDE-1-1)+ & - 0.0625*(h(IDE-1-1,JDE-1)+h(IDE-1,JDE-1-2)) - endif - - do J=JMS,JME - do I=IMS,IME - grid%ht_gc(I,J)=h(I,J) - enddo - enddo -#ifdef DM_PARALLEL -# include "HALO_NMM_MG.inc" -#endif - do J=JMS,JME - do I=IMS,IME - h(I,J)=grid%ht_gc(I,J) - enddo - enddo - - -! S bound - if (JTS .eq. JDS) then - J=JTS - - do I=ITS,ITE - if (I .ge. IDS+1 .and. I .le. IDE-2) then - if (hbms(I,J) .eq. 1) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J+1)+h(I+ihe(J),J+1)) - endif - endif - enddo - - endif - -! N bound - if (JTE .eq. JDE) then - J=JDE-1 - write(message,*) 'DOING N BOUND SMOOTHING for J= ', J - CALL wrf_debug(100,message) - do I=ITS,min(ITE,IDE-1) - if (hbms(I,J) .eq. 1 .and. I .ge. IDS+1 .and. I .le. IDE-2) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J-1)+h(I+ihe(J),J-1)) - endif - enddo - endif - -! W bound - if (ITS .eq. IDS) then - I=ITS - do J=JTS,min(JTE,JDE-1) - if (hbms(I,J) .eq. 1 .and. J .ge. JDS+2 .and. J .le. JDE-3 .and. mod(J,2) .eq. 1) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihe(J),J+1)+h(I+ihe(J),J-1)) - endif - enddo - endif - -! E bound - if (ITE .eq. IDE) then - write(message,*) 'DOING E BOUND SMOOTHING for I= ', min(ITE,IDE-1) - CALL wrf_debug(100,message) - I=min(ITE,IDE-1) - do J=JTS,min(JTE,JDE-1) - if (hbms(I,J) .eq. 1 .and. J .ge. JDS+2 .and. J .le. JDE-3 .and. mod(J,2) .eq. 1) then - h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J+1)+h(I+ihw(J),J-1)) - endif - enddo - endif - - enddo ! end ks loop - - do J=JMS,JME - do I=IMS,IME - grid%ht_gc(I,J)=h(I,J) - enddo - enddo -#ifdef DM_PARALLEL -#include "HALO_NMM_MG.inc" -#endif - do J=JMS,JME - do I=IMS,IME - h(I,J)=grid%ht_gc(I,J) - enddo - enddo - -! extra smoothing along inner boundary - - if (JTS .eq. JDS) then - if (ITE .eq. IDE) then - IOFFSET=1 - else - IOFFSET=0 - endif -! Southern Boundary - do i=its,min(ITE,IDE-1)-IOFFSET - h(i,2)=0.25*(h(i,1)+h(i+1,1)+ & - h(i,3)+h(i+1,3)) - enddo - endif - - - if (JTE .eq. JDE) then - if (ITE .eq. IDE) then - IOFFSET=1 - else - IOFFSET=0 - endif - do i=its,min(ITE,IDE-1)-IOFFSET - h(i,(JDE-1)-1)=0.25*(h(i,(JDE-1)-2)+h(i+1,(JDE-1)-2)+ & - h(i,JDE-1)+h(i+1,JDE-1)) - enddo - endif - - if (JTS .eq. 1) then - JSTART=4 - else - JSTART=JTS+mod(JTS,2) ! needs to be even - endif - - if (JTE .eq. JDE) then - JEND=(JDE-1)-3 - else - JEND=JTE - endif - - if (ITS .eq. IDS) then - -! Western Boundary - do j=JSTART,JEND,2 - h(1,j)=0.25*(h(1,j-1)+h(2,j-1)+ & - h(1,j+1)+h(2,j+1)) - - enddo - endif - - - if (ITE .eq. IDE) then -! Eastern Boundary - do j=JSTART,JEND,2 - h((IDE-1)-1,j)=0.25*(h((IDE-1)-1,j-1)+h((IDE-1),j-1)+ & - h((IDE-1)-1,j+1)+h((IDE-1),j+1)) - enddo - endif - - - END SUBROUTINE boundary_smooth - -!-------------------------------------------------------------------- - - SUBROUTINE monthly_interp_to_date ( field_in , date_str , field_out , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - ! Linrarly in time interpolate data to a current valid time. The data is - ! assumed to come in "monthly", valid at the 15th of every month. - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte - - CHARACTER (LEN=24) , INTENT(IN) :: date_str - REAL , DIMENSION(ims:ime,jms:jme,12) , INTENT(IN) :: field_in - REAL , DIMENSION(ims:ime, jms:jme) , INTENT(OUT) :: field_out - - ! Local vars - - INTEGER :: i , j , l - INTEGER , DIMENSION(0:13) :: middle - INTEGER :: target_julyr , target_julday , target_date - INTEGER :: julyr , julday , int_month, next_month - REAL :: gmt - CHARACTER (LEN=4) :: yr - CHARACTER (LEN=2) :: mon , day15 - - - WRITE(day15,FMT='(I2.2)') 15 - DO l = 1 , 12 - WRITE(mon,FMT='(I2.2)') l - CALL get_julgmt ( date_str(1:4)//'-'//mon//'-'//day15//'_'//'00:00:00.0000' , julyr , julday , gmt ) - middle(l) = julyr*1000 + julday - END DO - - l = 0 - middle(l) = middle( 1) - 31 - - l = 13 - middle(l) = middle(12) + 31 - - CALL get_julgmt ( date_str , target_julyr , target_julday , gmt ) - target_date = target_julyr * 1000 + target_julday - find_month : DO l = 0 , 12 - IF ( ( middle(l) .LT. target_date ) .AND. ( middle(l+1) .GE. target_date ) ) THEN - DO j = jts , MIN ( jde-1 , jte ) - DO i = its , MIN (ide-1 , ite ) - int_month = MOD ( l , 12 ) - IF ( int_month .EQ. 0 ) int_month = 12 - - IF (int_month == 12) THEN - next_month=1 - ELSE - next_month=int_month+1 - ENDIF - - field_out(i,j) = ( field_in(i,j,next_month) * ( target_date - middle(l) ) + & - field_in(i,j,int_month ) * ( middle(l+1) - target_date ) ) / & - ( middle(l+1) - middle(l) ) - END DO - END DO - EXIT find_month - END IF - END DO find_month - END SUBROUTINE monthly_interp_to_date - -!--------------------------------------------------------------------- - SUBROUTINE monthly_min_max ( field_in , field_min , field_max , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - ! Plow through each month, find the max, min values for each i,j. - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte - - REAL , DIMENSION(ims:ime,jms:jme,12) , INTENT(IN) :: field_in - REAL , DIMENSION(ims:ime, jms:jme) , INTENT(OUT) :: field_min , field_max - - ! Local vars - - INTEGER :: i , j , l - REAL :: minner , maxxer - - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - minner = field_in(i,j,1) - maxxer = field_in(i,j,1) - DO l = 2 , 12 - IF ( field_in(i,j,l) .LT. minner ) THEN - minner = field_in(i,j,l) - END IF - IF ( field_in(i,j,l) .GT. maxxer ) THEN - maxxer = field_in(i,j,l) - END IF - END DO - field_min(i,j) = minner - field_max(i,j) = maxxer - END DO - END DO - - END SUBROUTINE monthly_min_max - -!----------------------------------------------------------------------- - - SUBROUTINE reverse_vert_coord ( field, start_z, end_z & - &, IDS,IDE,JDS,JDE,KDS,KDE & - &, IMS,IME,JMS,JME,KMS,KME & - &, ITS,ITE,JTS,JTE,KTS,KTE ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte, & - start_z, end_z - - REAL, INTENT(INOUT) :: field(IMS:IME,JMS:JME,end_z) -! local - - INTEGER :: I,J,L - REAL, ALLOCATABLE :: dum3d(:,:,:) - - allocate(dum3d(IMS:IME,JMS:JME,end_z)) - - DO L=start_z,end_z - DO J=jts,min(jte,jde-1) - DO I=its,min(ite,ide-1) - dum3d(I,J,L)=field(I,J,end_z-L+start_z) - END DO - END DO - END DO - - DO L=start_z,end_z - DO J=jts,min(jte,jde-1) - DO I=its,min(ite,ide-1) - field(I,J,L)=dum3d(I,J,L) - END DO - END DO - END DO - - DEALLOCATE(dum3d) - - END SUBROUTINE reverse_vert_coord - - -!-------------------------------------------------------------------- - - SUBROUTINE compute_nmm_levels(ninterface, ptop, eta_levels) - - USE module_model_constants - - IMPLICIT NONE - - character(len=132):: message - integer :: ninterface,Lthick,L - real, parameter:: gamma=.0065 - real, parameter:: t_stand=288. - real, parameter:: p_stand=101325. - - real :: maxdz_compute, ptop - real :: plower,pupper,tlay, sum - - real :: eta_levels(ninterface) - real, allocatable:: Z(:) - real, allocatable:: deta_levels_spline(:) - - logical:: print_pbl_warn - -!---------------------------------------------------- - - allocate(Z(ninterface)) - allocate(deta_levels_spline(ninterface-1)) - - CALL compute_eta_spline(ninterface-1,deta_levels_spline,ptop) - - sum=0. - DO L=1,ninterface-1 - sum=sum+deta_levels_spline(L) - ENDDO - - eta_levels(1)=1.00 - - DO L=2,ninterface - eta_levels(L)=eta_levels(L-1)-deta_levels_spline(L-1) - ENDDO - - eta_levels(ninterface)=0.00 - - DO L=2,ninterface-1 - eta_levels(L)=0.5*(eta_levels(L))+0.25*(eta_levels(L-1)+eta_levels(L+1)) - ENDDO - - Z(1)=0. - maxdz_compute=0. - print_pbl_warn=.false. - - DO L=2,ninterface - tlay=max( t_stand-gamma*Z(L-1), 216.5) - plower=ptop+(p_stand-ptop)*eta_levels(L-1) - pupper=ptop+(p_stand-ptop)*eta_levels(L) - Z(L)=Z(L-1)+(tlay*r_d/g)*(log(plower)-log(pupper)) - - if (plower .gt. 85000. .and. pupper .lt. 85000. .and. L .lt. 10) then - print_pbl_warn=.true. - endif - - write(message,*) 'L, eta(l), pupper, Z(L): ', L, eta_levels(L),pupper,Z(L) - CALL wrf_debug(100,message) - - if (Z(L)-Z(L-1) .gt. maxdz_compute) then - Lthick=L - endif - - maxdz_compute=max(maxdz_compute,Z(L)-Z(L-1)) - ENDDO - - if (print_pbl_warn) then - write(message,*) 'WARNING - PBL MAY BE POORLY RESOLVED WITH NUMBER OF VERTICAL LEVELS' - CALL wrf_message(message) - write(message,*) ' - CONSIDER INCREASING THE VERTICAL RESOLUTION' - CALL wrf_message(message) - endif - - write(message,*) 'thickest layer was: ', maxdz_compute , 'meters thick at level: ', Lthick - CALL wrf_message(message) - - END SUBROUTINE compute_nmm_levels - -!--------------------------- - - SUBROUTINE compute_eta_spline(LM, dsg, ptop) - - IMPLICIT NONE - - real:: dsg(LM), ptop, sum, rsum - real, allocatable:: xold(:),dold(:) - real, allocatable:: xnew(:),sgm(:) - real, allocatable:: pps(:),qqs(:),y2s(:) - integer nlev,LM,L,KOLD - - IF (LM .ge. 46) THEN - KOLD=9 - allocate(xold(KOLD)) - allocate(dold(KOLD)) - - xold(1)=.00 - dold(1)=.006 - xold(2)=.13 - dold(2)=.009 - xold(3)=.19 - dold(3)=.012 - xold(4)=.30 - dold(4)=.036 - xold(5)=.42 - dold(5)=.041 - xold(6)=.56 - dold(6)=.040 - xold(7)=.69 - dold(7)=.018 - - if (ptop .ge. 2000.) then - xold(8)=.90 - dold(8)=.012 - xold(9)=1.0 - dold(9)=.006 - else - xold(8)=.90 - dold(8)=.008 - xold(9)=1.0 - dold(9)=.003 - endif - - ELSE - - KOLD=8 - allocate(xold(KOLD)) - allocate(dold(KOLD)) - - xold(1)=.00 - dold(1)=.006 - xold(2)=.18 - dold(2)=.015 - xold(3)=.32 - dold(3)=.035 - xold(4)=.50 - dold(4)=.040 - xold(5)=.68 - dold(5)=.030 - xold(6)=.75 - dold(6)=.017 - xold(7)=.85 - dold(7)=.012 - - if (ptop .ge. 2000.) then - xold(8)=1.0 - dold(8)=.013 - else - xold(8)=1.0 - dold(8)=.008 - endif - - ENDIF - - allocate(xnew(lm)) - allocate(sgm(lm+1)) - allocate(pps(lm)) - allocate(qqs(lm)) - allocate(y2s(lm)) - - DO L=1,LM - xnew(l)=float(l-1)/float(lm-1) - ENDDO - - y2s=0. - - CALL spline(kold,xold,dold,y2s,lm,xnew,dsg,pps,qqs) - - sum=0. - DO l=1,lm - sum=sum+dsg(l) - ENDDO - - rsum=1./sum - sgm(1)=0. - - DO L=1,lm-1 - dsg(l)=dsg(l)*rsum - sgm(l+1)=sgm(l)+dsg(l) - ENDDO - sgm(lm+1)=1. - dsg(lm)=sgm(lm+1)-sgm(lm) - - END SUBROUTINE compute_eta_spline - -! ------------------------------------------------------------------- - - subroutine spline(NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,q) - -! ******************************************************************** -! * * -! * THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE * -! * PROGRAMED FOR A SMALL SCALAR MACHINE. * -! * * -! * PROGRAMER Z. JANJIC * -! * * -! * NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION. MUST BE GE 3. * -! * XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * -! * FUNCTION ARE GIVEN. MUST BE IN ASCENDING ORDER. * -! * YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD. * -! * Y2 - THE SECOND DERIVATIVES AT THE POINTS XOLD. IF NATURAL * -! * SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE * -! * SPECIFIED. * -! * NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED. * -! * XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * -! * FUNCTION ARE CALCULATED. XNEW(K) MUST BE GE XOLD(1) * -! * AND LE XOLD(NOLD). * -! * YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED. * -! * P, q - AUXILIARY VECTORS OF THE LENGTH NOLD-2. * -! * * -! ******************************************************************** -! -! LOG: -! -! JOVIC - July 2008 - fixed incorrectly dimensioned arrays, -! PYLE and do loop leading to out of bound array -! reference -!------ -! -! PYLE - June 2007 - eliminated use of GO TO statements. -! -!----------------------------------------------------------------------- - IMPLICIT NONE -!----------------------------------------------------------------------- - INTEGER,INTENT(IN) :: NNEW,NOLD - REAL,DIMENSION(NOLD),INTENT(IN) :: XOLD,YOLD - REAL,DIMENSION(NNEW),INTENT(IN) :: XNEW - REAL,DIMENSION(NNEW),INTENT(OUT) :: YNEW - REAL,DIMENSION(NOLD+2),INTENT(INOUT) :: P,q,Y2 -! - INTEGER :: K,K1,K2,KOLD,NOLDM1, K2_hold, K_hold - REAL :: AK,BK,CK,DEN,DX,DXC,DXL,DXR,DYDXL,DYDXR & - & ,RDX,RTDXC,X,XK,XSQ,Y2K,Y2KP1 -!----------------------------------------------------------------------- - - NOLDM1=NOLD-1 - - DXL=XOLD(2)-XOLD(1) - DXR=XOLD(3)-XOLD(2) - DYDXL=(YOLD(2)-YOLD(1))/DXL - DYDXR=(YOLD(3)-YOLD(2))/DXR - RTDXC=0.5/(DXL+DXR) - - P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1)) - q(1)=-RTDXC*DXR - - K=3 - first_loop: DO K=3,NOLD-1 - DXL=DXR - DYDXL=DYDXR - DXR=XOLD(K+1)-XOLD(K) - DYDXR=(YOLD(K+1)-YOLD(K))/DXR - DXC=DXL+DXR - DEN=1./(DXL*q(K-2)+DXC+DXC) - P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2)) - q(K-1)=-DEN*DXR - END DO first_loop - - DO K=NOLDM1,2,-1 - Y2(K)=P(K-1)+q(K-1)*Y2(K+1) - K_hold=K - END DO - - K=K_hold - -!----------------------------------------------------------------------- - second_loop: DO K1=1,NNEW - XK=XNEW(K1) - third_loop: DO K2=2,NOLD - - IF(XOLD(K2)>XK)THEN - KOLD=K2-1 - K2_hold=K2 - exit third_loop - ENDIF - K2_hold=K2 - END DO third_loop - - IF (XOLD(K2_hold) .le. XK) THEN - YNEW(K1)=YOLD(NOLD) - CYCLE second_loop - ENDIF - - IF (K1 .eq. 1 .or. K .ne. KOLD) THEN - K=KOLD - Y2K=Y2(K) - Y2KP1=Y2(K+1) - DX=XOLD(K+1)-XOLD(K) - RDX=1./DX - AK=.1666667*RDX*(Y2KP1-Y2K) - BK=0.5*Y2K - CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K) - ENDIF - - X=XK-XOLD(K) - XSQ=X*X - YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K) - - END DO second_loop - - END SUBROUTINE SPLINE -!-------------------------------------------------------------------- - SUBROUTINE NMM_SH2O(IMS,IME,JMS,JME,ISTART,IM,JSTART,JM,& - NSOIL,ISLTPK, & - sm,sice,stc,smc,sh2o) - -!! INTEGER, PARAMETER:: NSOTYP=9 -! INTEGER, PARAMETER:: NSOTYP=16 - INTEGER, PARAMETER:: NSOTYP=19 !!!!!!!!MAYBE??? - - REAL :: PSIS(NSOTYP),BETA(NSOTYP),SMCMAX(NSOTYP) - REAL :: stc(IMS:IME,NSOIL,JMS:JME), & - smc(IMS:IME,NSOIL,JMS:JME) - REAL :: sh2o(IMS:IME,NSOIL,JMS:JME),sice(IMS:IME,JMS:JME),& - sm(IMS:IME,JMS:JME) - REAL :: HLICE,GRAV,T0,BLIM - INTEGER :: ISLTPK(IMS:IME,JMS:JME) - CHARACTER(LEN=255) :: message - -! Constants used in cold start sh2o initialization - DATA HLICE/3.335E5/,GRAV/9.81/,T0/273.15/ - DATA BLIM/5.5/ -! DATA PSIS /0.04,0.62,0.47,0.14,0.10,0.26,0.14,0.36,0.04/ -! DATA BETA /4.26,8.72,11.55,4.74,10.73,8.17,6.77,5.25,4.26/ -! DATA SMCMAX /0.421,0.464,0.468,0.434,0.406, & -! 0.465,0.404,0.439,0.421/ - - -!!! NOT SURE...PSIS=SATPSI, BETA=BB?? - - DATA PSIS /0.069, 0.036, 0.141, 0.759, 0.759, 0.355, & - 0.135, 0.617, 0.263, 0.098, 0.324, 0.468, & - 0.355, 0.000, 0.069, 0.036, 0.468, 0.069, 0.069 / - - DATA BETA/2.79, 4.26, 4.74, 5.33, 5.33, 5.25, & - 6.66, 8.72, 8.17, 10.73, 10.39, 11.55, & - 5.25, 0.00, 2.79, 4.26, 11.55, 2.79, 2.79 / - - DATA SMCMAX/0.339, 0.421, 0.434, 0.476, 0.476, 0.439, & - 0.404, 0.464, 0.465, 0.406, 0.468, 0.468, & - 0.439, 1.000, 0.200, 0.421, 0.468, 0.200, 0.339/ - - DO K=1,NSOIL - DO J=JSTART,JM - DO I=ISTART,IM - -!tst - IF (smc(I,K,J) .gt. SMCMAX(ISLTPK(I,J))) then - if (K .eq. 1) then - write(message,*) 'I,J,reducing smc from ' ,I,J,smc(I,K,J), 'to ', SMCMAX(ISLTPK(I,J)) - CALL wrf_debug(100,message) - endif - smc(I,K,J)=SMCMAX(ISLTPK(I,J)) - ENDIF -!tst - - IF ( (sm(I,J) .lt. 0.5) .and. (sice(I,J) .lt. 0.5) ) THEN - - IF (ISLTPK(I,J) .gt. 19) THEN - WRITE(message,*) 'FORCING ISLTPK at : ', I,J - CALL wrf_message(message) - ISLTPK(I,J)=9 - ELSEIF (ISLTPK(I,J) .le. 0) then - WRITE(message,*) 'FORCING ISLTPK at : ', I,J - CALL wrf_message(message) - ISLTPK(I,J)=1 - ENDIF - - -! cold start: determine liquid soil water content (sh2o) -! sh2o <= smc for t < 273.149K (-0.001C) - - IF (stc(I,K,J) .LT. 273.149) THEN - -! first guess following explicit solution for Flerchinger Eqn from Koren -! et al, JGR, 1999, Eqn 17 (KCOUNT=0 in FUNCTION FRH2O). - - BX = BETA(ISLTPK(I,J)) - IF ( BETA(ISLTPK(I,J)) .GT. BLIM ) BX = BLIM - - if ( GRAV*(-PSIS(ISLTPK(I,J))) .eq. 0 ) then - write(message,*) 'TROUBLE' - CALL wrf_message(message) - write(message,*) 'I,J: ', i,J - CALL wrf_message(message) - write(message,*) 'grav, isltpk, psis(isltpk): ', grav,isltpk(I,J),& - psis(isltpk(I,J)) - CALL wrf_message(message) - endif - - if (BX .eq. 0 .or. stc(I,K,J) .eq. 0) then - write(message,*) 'TROUBLE -- I,J,BX, stc: ', I,J,BX,stc(I,K,J) - CALL wrf_message(message) - endif - FK = (((HLICE/(GRAV*(-PSIS(ISLTPK(I,J)))))* & - ((stc(I,K,J)-T0)/stc(I,K,J)))** & - (-1/BX))*SMCMAX(ISLTPK(I,J)) - IF (FK .LT. 0.02) FK = 0.02 - sh2o(I,K,J) = MIN ( FK, smc(I,K,J) ) -! ---------------------------------------------------------------------- -! now use iterative solution for liquid soil water content using -! FUNCTION FRH2O (from the Eta "NOAH" land-surface model) with the -! initial guess for sh2o from above explicit first guess. - - sh2o(I,K,J)=FRH2O_init(stc(I,K,J),smc(I,K,J),sh2o(I,K,J), & - SMCMAX(ISLTPK(I,J)),BETA(ISLTPK(I,J)), & - PSIS(ISLTPK(I,J))) - - ELSE ! above freezing - sh2o(I,K,J)=smc(I,K,J) - ENDIF - - - ELSE ! water point - sh2o(I,K,J)=smc(I,K,J) - - ENDIF ! test on land/ice/sea - if (sh2o(I,K,J) .gt. SMCMAX(ISLTPK(I,J))) then - write(message,*) 'sh2o > THAN SMCMAX ', I,J,sh2o(I,K,J),SMCMAX(ISLTPK(I,J)),smc(I,K,J) - CALL wrf_message(message) - endif - - ENDDO - ENDDO - ENDDO - - END SUBROUTINE NMM_SH2O - -!------------------------------------------------------------------- - - FUNCTION FRH2O_init(TKELV,smc,sh2o,SMCMAX,B,PSIS) - - IMPLICIT NONE - -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! PURPOSE: CALCULATE AMOUNT OF SUPERCOOLED LIQUID SOIL WATER CONTENT -! IF TEMPERATURE IS BELOW 273.15K (T0). REQUIRES NEWTON-TYPE ITERATION -! TO SOLVE THE NONLINEAR IMPLICIT EQUATION GIVEN IN EQN 17 OF -! KOREN ET AL. (1999, JGR, VOL 104(D16), 19569-19585). -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! -! New version (JUNE 2001): much faster and more accurate newton iteration -! achieved by first taking log of eqn cited above -- less than 4 -! (typically 1 or 2) iterations achieves convergence. Also, explicit -! 1-step solution option for special case of parameter Ck=0, which reduces -! the original implicit equation to a simpler explicit form, known as the -! ""Flerchinger Eqn". Improved handling of solution in the limit of -! freezing point temperature T0. -! -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! -! INPUT: -! -! TKELV.........Temperature (Kelvin) -! smc...........Total soil moisture content (volumetric) -! sh2o..........Liquid soil moisture content (volumetric) -! SMCMAX........Saturation soil moisture content (from REDPRM) -! B.............Soil type "B" parameter (from REDPRM) -! PSIS..........Saturated soil matric potential (from REDPRM) -! -! OUTPUT: -! FRH2O.........supercooled liquid water content. -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - - REAL B - REAL BLIM - REAL BX - REAL CK - REAL DENOM - REAL DF - REAL DH2O - REAL DICE - REAL DSWL - REAL ERROR - REAL FK - REAL FRH2O_init - REAL GS - REAL HLICE - REAL PSIS - REAL sh2o - REAL smc - REAL SMCMAX - REAL SWL - REAL SWLK - REAL TKELV - REAL T0 - - INTEGER NLOG - INTEGER KCOUNT - PARAMETER (CK=8.0) -! PARAMETER (CK=0.0) - PARAMETER (BLIM=5.5) -! PARAMETER (BLIM=7.0) - PARAMETER (ERROR=0.005) - - PARAMETER (HLICE=3.335E5) - PARAMETER (GS = 9.81) - PARAMETER (DICE=920.0) - PARAMETER (DH2O=1000.0) - PARAMETER (T0=273.15) - -! ### LIMITS ON PARAMETER B: B < 5.5 (use parameter BLIM) #### -! ### SIMULATIONS SHOWED IF B > 5.5 UNFROZEN WATER CONTENT #### -! ### IS NON-REALISTICALLY HIGH AT VERY LOW TEMPERATURES #### -! ################################################################ -! - BX = B - IF ( B .GT. BLIM ) BX = BLIM -! ------------------------------------------------------------------ - -! INITIALIZING ITERATIONS COUNTER AND ITERATIVE SOLUTION FLAG. - NLOG=0 - KCOUNT=0 - -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! C IF TEMPERATURE NOT SIGNIFICANTLY BELOW FREEZING (T0), sh2o = smc -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - - - IF (TKELV .GT. (T0 - 1.E-3)) THEN - - FRH2O_init=smc - - ELSE - -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - IF (CK .NE. 0.0) THEN - -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! CCCCCCCCC OPTION 1: ITERATED SOLUTION FOR NONZERO CK CCCCCCCCCCC -! CCCCCCCCCCCC IN KOREN ET AL, JGR, 1999, EQN 17 CCCCCCCCCCCCCCCCC - -! INITIAL GUESS FOR SWL (frozen content) - SWL = smc-sh2o -! KEEP WITHIN BOUNDS. - IF (SWL .GT. (smc-0.02)) SWL=smc-0.02 - IF(SWL .LT. 0.) SWL=0. -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! C START OF ITERATIONS -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - DO WHILE (NLOG .LT. 10 .AND. KCOUNT .EQ. 0) - NLOG = NLOG+1 - DF = ALOG(( PSIS*GS/HLICE ) * ( ( 1.+CK*SWL )**2. ) * & - ( SMCMAX/(smc-SWL) )**BX) - ALOG(-(TKELV-T0)/TKELV) - DENOM = 2. * CK / ( 1.+CK*SWL ) + BX / ( smc - SWL ) - SWLK = SWL - DF/DENOM -! BOUNDS USEFUL FOR MATHEMATICAL SOLUTION. - IF (SWLK .GT. (smc-0.02)) SWLK = smc - 0.02 - IF(SWLK .LT. 0.) SWLK = 0. -! MATHEMATICAL SOLUTION BOUNDS APPLIED. - DSWL=ABS(SWLK-SWL) - SWL=SWLK -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! CC IF MORE THAN 10 ITERATIONS, USE EXPLICIT METHOD (CK=0 APPROX.) -! CC WHEN DSWL LESS OR EQ. ERROR, NO MORE ITERATIONS REQUIRED. -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - IF ( DSWL .LE. ERROR ) THEN - KCOUNT=KCOUNT+1 - END IF - END DO -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! C END OF ITERATIONS -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! BOUNDS APPLIED WITHIN DO-BLOCK ARE VALID FOR PHYSICAL SOLUTION. - FRH2O_init = smc - SWL - -! CCCCCCCCCCCCCCCCCCCCCCCC END OPTION 1 CCCCCCCCCCCCCCCCCCCCCCCCCCC - - ENDIF - - IF (KCOUNT .EQ. 0) THEN -! Print*,'Flerchinger used in NEW version. Iterations=',NLOG - -! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -! CCCCC OPTION 2: EXPLICIT SOLUTION FOR FLERCHINGER EQ. i.e. CK=0 CCCCCCCC -! CCCCCCCCCCCCC IN KOREN ET AL., JGR, 1999, EQN 17 CCCCCCCCCCCCCCC - - FK=(((HLICE/(GS*(-PSIS)))*((TKELV-T0)/TKELV))**(-1/BX))*SMCMAX -! APPLY PHYSICAL BOUNDS TO FLERCHINGER SOLUTION - IF (FK .LT. 0.02) FK = 0.02 - FRH2O_init = MIN ( FK, smc ) - -! CCCCCCCCCCCCCCCCCCCCCCCCC END OPTION 2 CCCCCCCCCCCCCCCCCCCCCCCCCC - - ENDIF - - ENDIF - - RETURN - - END FUNCTION FRH2O_init - - -!-------------------------------------------------------------------- - - SUBROUTINE init_module_initialize - END SUBROUTINE init_module_initialize - -!--------------------------------------------------------------------- -!------------------------------------------------------------------------------- - - SUBROUTINE vortex ( ght_gc,rh_gc,t_gc,u_gc,v_gc,p_gc & - &, ght_out,rh_out,t_out,u_out,v_out & - &, ht_gc,tsk_gc,xice_gc & - &, hlat_gc,hlon_gc,vlat_gc,vlon_gc & - &, greenfrac_gc,albedo12m_gc,landusef_gc & - &, soilctop_gc,soilcbot_gc & - &, landusef_out,soilctop_out,soilcbot_out & - &, num_veg_cat,num_soil_top_cat,num_soil_bot_cat & - &, dx,internal_time_loop & - &, start_z,end_z,sf_surface_physics & - &, ids,ide,jds,jde,kds,kde & - &, ims,ime,jms,jme,kms,kme & - &, its,ite,jts,jte,kts,kte ) - - - USE module_dm - IMPLICIT NONE - - LOGICAL,EXTERNAL :: WRF_DM_ON_MONITOR - -INTEGER, INTENT(IN):: ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte, & - internal_time_loop,sf_surface_physics - - INTEGER, INTENT(IN):: num_veg_cat,num_soil_top_cat,num_soil_bot_cat,start_z, end_z - - REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z),INTENT(INOUT) :: ght_gc,rh_gc,t_gc,u_gc,v_gc,p_gc - REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z),INTENT(INOUT) :: ght_out,rh_out,t_out,u_out,v_out - REAL, DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: ht_gc,tsk_gc,xice_gc - REAL, DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: hlat_gc,hlon_gc,vlat_gc,vlon_gc - - REAL, DIMENSION(ims:ime,jms:jme,12) , INTENT(INOUT) :: greenfrac_gc,albedo12m_gc - REAL, DIMENSION(ims:ime,jms:jme,num_veg_cat), INTENT(INOUT) :: landusef_gc,landusef_out - - REAL, DIMENSION(ims:ime,jms:jme,num_soil_top_cat),INTENT(INOUT):: soilctop_gc,soilctop_out - REAL, DIMENSION(ims:ime,jms:jme,num_soil_bot_cat),INTENT(INOUT):: soilcbot_gc,soilcbot_out - REAL, INTENT(INOUT):: dx - - REAL, PARAMETER :: eradius=6371221.3 - INTEGER :: i,j,l,iter,nmax,nres,nfilter - INTEGER :: id0,jd0,id1,jd1 - REAL :: factor,glon0,glat0,dist,cavlat,minval_gh - REAL :: beta1,vmax,rmax,dx_km - REAL, DIMENSION(start_z:end_z) :: vmax1,rmax1 - REAL, DIMENSION(IMS:IME,JMS:JME) :: dist1,dir1,diffx,diffy - REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z) :: pert_ght,pert_rh,pert_t,pert_u,pert_v,pert_p,temp0 -!New Vortex Related - DATA beta1 /0.0/ ! 0.0 sets non-linear balance equation vortex. GFDL vortex for beta1 between 0.1 and 1.5 - character*255 :: message - REAL, ALLOCATABLE,DIMENSION(:,:) :: psc - REAL, ALLOCATABLE,DIMENSION(:,:,:) :: u_temp,v_temp,t_temp,ght_temp,rh_temp -!!BEGIN: LSM changes for LANDFALL: Subashini 7/27/2016 - INTEGER :: imin,jmin,imax,jmax,proceed,VEG_ID,SOIL_ID - LOGICAL :: mvland, logic_temp - REAL :: s_temp - NAMELIST / init_land /imin,jmin,imax,jmax,proceed,VEG_ID,SOIL_ID,mvland,logic_temp,s_temp -!! END: LSM changes for LANDFALL : Subashini 7/27/2016 -!---------------------------------------------------------------------------- -! PURPOSE: -! - HURRICANE VORTEX FILTERING -! - HURRICANE VORTEX INITIALIZATION -! -! This is gopal's doing -!---------------------------------------------------------------------------- - - WRITE(0,*)'---------------- IDEAL CASE -------------------------' - call wrf_debug(1,message) - WRITE(message,*)'number of pressure levels',end_z - call wrf_debug(1,message) - WRITE(message,*)'number of vegcat levels',num_veg_cat - call wrf_debug(1,message) - WRITE(message,*)'number of soiltop levels',num_soil_top_cat - call wrf_debug(1,message) - WRITE(message,*)'number of soilbot levels',num_soil_bot_cat - call wrf_debug(1,message) - WRITE(message,*)'--------------- ght_gc --------------------------' -! call wrf_debug(1,message) -! WRITE(message,*)ght_gc(100,100,:) -! call wrf_debug(1,message) - WRITE(message,*)'--------------- p_gc --------------------------' -! call wrf_debug(1,message) -! WRITE(message,*)p_gc(100,100,:) -! call wrf_debug(1,message) - WRITE(message,*)'--------------- rh_gc ---------------------------' -! call wrf_debug(1,message) -! WRITE(message,*)rh_gc(100,100,:) -! call wrf_debug(1,message) - WRITE(message,*)'--------------- t_gc --------------------------' -! call wrf_debug(1,message) -! WRITE(message,*)t_gc(100,100,:) -! call wrf_debug(1,message) - WRITE(message,*)'------------------------------------------------' -! call wrf_debug(1,message) -! WRITE(message,*)'------------------------------------------------' -! call wrf_debug(1,message) - -! -! SET UP IDEAL CONDITIONS -! -!!BEGIN: LSM changes for LANDFALL: Subashini 7/27/2016 - - open (7,FILE='land.nml') - read (UNIT=7, NML=init_land) - close (UNIT=7) - - if (mvland .and. sf_surface_physics .ne. GFDLSLAB) then - CALL wrf_error_fatal('LSM must be GFDLSLAB when mvland is true') - endif - - do l = 1,num_veg_cat - do j = jts, MIN(jte,jde-1) - do i = its, MIN(ite,ide-1) -! create land patch that will move from W2E - if(mvland .and. (i .ge. imin .and. i .le. imax .and. j .ge. jmin .and. j.le. jmax))then - if(l==VEG_ID)THEN - landusef_out(i,j,l)=1 ! barren land - else - landusef_out(i,j,l)=0 - endif - else ! original ocean world - if(l==16)THEN - landusef_out(i,j,l)=1 ! create ocean elsewhere - else - landusef_out(i,j,l)=0 - endif - endif -! - enddo - enddo - enddo - - do l = 1,num_soil_top_cat - do j = jts, MIN(jte,jde-1) - do i = its, MIN(ite,ide-1) -! create land patch that will move from W2E - if(mvland .and. (i .ge. imin .and. i .le. imax .and. j .ge. jmin .and. j.le. jmax))then - if(l==SOIL_ID)THEN - soilctop_out(i,j,l)=1 ! sandy soil - else - soilctop_out(i,j,l)=0 - endif - else ! original ocean world - if(l==14)THEN - soilctop_out(i,j,l)=1 ! create ocean everywhere - else - soilctop_out(i,j,l)=0 - endif - endif -! - enddo - enddo - enddo - - do l = 1,num_soil_bot_cat - do j = jts, MIN(jte,jde-1) - do i = its, MIN(ite,ide-1) -! create land patch that will move from W2E - if(mvland .and. (i .ge. imin .and. i .le. imax .and. j .ge. jmin .and. j.le. jmax))then - if(l==SOIL_ID)THEN - soilcbot_out(i,j,l)=1 ! sandy soil - else - soilcbot_out(i,j,l)=0 - endif - else ! original ocean world - if(l==14)THEN - soilcbot_out(i,j,l)=1 ! create ocean everywhere - else - soilcbot_out(i,j,l)=0 - endif - endif -! - enddo - enddo - enddo - - landusef_gc=landusef_out !=landusef_gc - soilcbot_gc=soilcbot_out !=soilcbot_gc - soilctop_gc=soilctop_out !=soilctop_gc - - do j = jts, MIN(jte,jde-1) - do i = its, MIN(ite,ide-1) - xice_gc(i,j)=0. - ht_gc(i,j)=0. ! uniform terrain - ght_gc(i,j,1)=0. ! uniform gpm at level 1 -! create land patch that will move from W2E - if(mvland .and. (i .ge. imin .and. i .le. imax .and. j .ge. jmin .and.j.le. jmax))then - if(logic_temp .eq. .true.) then - tsk_gc(i,j)=s_temp ! uniform land temperature or t_gc(i,j,1) for applying first level temperature - else - tsk_gc(i,j)= t_gc(i,j,1) - endif - else - tsk_gc(i,j)=302.0 ! uniform SSTs - endif - enddo - enddo - - -!! END: LSM changes for LANDFALL : Subashini 7/27/2016 - -! -! Make sure the GFDL analysis does not have temperature problems especially -! near the surface. I noticed some problems with the wps outputs (met_nmm file.) -! - do j=jts,min(jte,jde-1) - do i=its,min(ite,ide-1) - if(t_gc(i,j,1) .le. 250.0)t_gc(i,j,1)=302.5 - enddo - enddo -! -! READ IN LAT-LONS FROM STORM MESSAGE FILE -! - IF (WRF_DM_ON_MONITOR()) THEN -!orig OPEN(21,file='../MESSAGES/storm.center',status='old') -!repository messages - OPEN(21,file='storm.center',status='old') - read(21,*)glat0 - read(21,*)glon0 - close(21) - ENDIF - - CALL wrf_dm_bcast_bytes (glat0,IWORDSIZE) - CALL wrf_dm_bcast_bytes (glon0,IWORDSIZE) - - WRITE(message,*)'glat0 and glon0',glat0,glon0 - call wrf_debug(1,message) - -! -! -! FIND THE CENTER OF THE HURRICANE BASED ON THE STORM MESSAGE FILE -! - id0 = -999 - jd0 = -999 - factor = 4.0*ATAN(1.)/180. - dist = -1 - do j=jts,min(jte,jde-1) - do i=its,min(ite,ide-1) - diffx(i,j) = (hlon_gc(i,j) - glon0)*factor - diffy(i,j) = (hlat_gc(i,j) - glat0)*factor - cavlat= cos((hlat_gc(i,j) + glat0)*0.5*factor) - dist1(i,j) = eradius*sqrt(cavlat*cavlat*diffx(i,j)*diffx(i,j) + diffy(i,j)*diffy(i,j)) - if(dist1(i,j).LE.dist .OR. dist.LT.0.)then - dist = dist1(i,j) - id0 = i - jd0 = j - endif - enddo - enddo - -! -! SECONDARY SEARCH FOR THE CENTER -! - - id1=-999 - jd1=-999 - minval_gh=MINVAL(ght_gc(ids:ide-1,jds:jde-1,10)) - write(message,*)'MIN VAL OF GH NEW=',minval_gh - call wrf_debug(1,message) - do j=jts,min(jte,jde-1) - do i=its,min(ite,ide-1) - if(minval_gh .EQ. ght_gc(i,j,10))then - id1=i - jd1=j - endif - enddo - enddo -! jbao-put storm in center - id1=ide/2 - jd1=jde/2 -! end jbao-put storm in center - - - IF(abs(ID0-ID1) .GE. 5 .OR. abs(JD0-JD1) .GE. 5)THEN -! call wrf_error_fatal("LAT LON INFO IN STROM MESSAGE FILE IN INCORRECT") - write(message,*) 'WARNING - ACTUAL STORM LOCATION DIFFERENT FROM MODEL LOCATION' - call wrf_debug(1,message) - WRITE(message,*)'OLD CENTER',ID0,JD0 - call wrf_debug(1,message) - WRITE(message,*)'NEW CENTER',ID1,JD1 - call wrf_debug(1,message) - ELSE - WRITE(message,*)'OLD CENTER',ID0,JD0 - call wrf_debug(1,message) - WRITE(message,*)'NEW CENTER',ID1,JD1 - call wrf_debug(1,message) - ENDIF - -! -! RECOMPUTE RADIUS FROM THE CENTER BASED ON MODEL/ANALYSED STORM CENTER -! - do j=jts,min(jte,jde-1) - do i=its,min(ite,ide-1) - diffx(i,j) = (hlon_gc(i,j) - hlon_gc(id1,jd1))*factor - diffy(i,j) = (hlat_gc(i,j) - hlat_gc(id1,jd1))*factor - cavlat= cos((hlat_gc(i,j) + hlat_gc(id1,jd1))*0.5*factor) - dist1(i,j) = eradius*sqrt(cavlat*cavlat*diffx(i,j)*diffx(i,j) + diffy(i,j)*diffy(i,j)) - enddo - enddo - - - ght_out=ght_gc - t_out=t_gc - rh_out=rh_gc - u_out=u_gc - v_out=v_gc - -! -! Beta is the intensity parameter -! - - IF(BETA1 .NE. 0.)THEN ! Adjustment of the GFDL vortex - -! -! DEFINE THE NUMBER OF RECRUSSIVE OPERATIONS (NMAX) REQUIRED TO -! REMOVE OR MODIFY THE INITIAL GRIB ANALYSIS. IF beta1 IS SET TO -! < 0.01, THE VORTEX IS COMPLETELY FILTERED OUT. ALSO, FILTERING -! RELATED TO COMPLETE VORTEX REMOVAL IS ONLY CALLED AT THE INITIAL -! TIME ASSUMING THAT THE VORTEX IS FAR AWAY FROM THE BOUNDARIES. -! - - nres=0.18/dx - nfilter=1 -! - if(nres==3.and. internal_time_loop .eq. 1)then - nmax=9*nfilter - else - nmax=1*nfilter - endif - - WRITE(message,*)'CALLING HBFILTER' - call wrf_debug(1,message) - - CALL hbfilter ( ght_gc,ght_out & - &, nmax,start_z,end_z & - &, ids,ide,jds,jde & - &, ims,ime,jms,jme & - &, its,ite,jts,jte ) - - WRITE(message,*)'COMPLETED FILTERING ght_gc' - call wrf_debug(1,message) - - CALL hbfilter ( t_gc,t_out & - &, nmax,start_z,end_z & - &, ids,ide,jds,jde & - &, ims,ime,jms,jme & - &, its,ite,jts,jte ) - - WRITE(message,*)'COMPLETED FILTERING t_gc' - call wrf_debug(1,message) - - CALL hbfilter ( rh_gc,rh_out & - &, nmax,start_z,end_z & - &, ids,ide,jds,jde & - &, ims,ime,jms,jme & - &, its,ite,jts,jte ) - - WRITE(message,*)'COMPLETED FILTERING rh_gc' - call wrf_debug(1,message) - - CALL hbfilter ( u_gc,u_out & - &, nmax,start_z,end_z & - &, ids,ide,jds,jde & - &, ims,ime,jms,jme & - &, its,ite,jts,jte ) - - WRITE(message,*)'COMPLETED FILTERING u_gc' - call wrf_debug(1,message) - - CALL hbfilter ( v_gc,v_out & - &, nmax,start_z,end_z & - &, ids,ide,jds,jde & - &, ims,ime,jms,jme & - &, its,ite,jts,jte ) - - WRITE(message,*)'COMPLETED FILTERING v_gc' - call wrf_debug(1,message) - - WRITE(message,*)'END OF HBFILTER' - call wrf_debug(1,message) -! - do l=start_z,end_z - do j=jts,min(jte,jde-1) - do i=its,min(ite,ide-1) - pert_ght(i,j,l) = (ght_gc(i,j,l) - ght_out(i,j,l)) ! vortex only - pert_t(i,j,l) = (t_gc(i,j,l) - t_out(i,j,l)) - pert_rh(i,j,l) = (rh_gc(i,j,l) - rh_out(i,j,l)) - pert_u(i,j,l) = (u_gc(i,j,l) - u_out(i,j,l)) - pert_v(i,j,l) = (v_gc(i,j,l) - v_out(i,j,l)) - enddo - enddo - enddo -! - do l=start_z,end_z - do j=jts,min(jte,jde-1) - do i=its,min(ite,ide-1) - ght_gc(i,j,l) = ght_out(i,j,l) + beta1*pert_ght(i,j,l) ! vortex only - t_gc(i,j,l) = t_out(i,j,l) + beta1*pert_t(i,j,l) - rh_gc(i,j,l) = rh_out(i,j,l) + beta1*pert_rh(i,j,l) - u_gc(i,j,l) = u_out(i,j,l) + beta1*pert_u(i,j,l) - v_gc(i,j,l) = v_out(i,j,l) + beta1*pert_v(i,j,l) - enddo - enddo - enddo -! -! DIAGNOSTICS - - ght_out=0.;t_out=0.;rh_out=0.;u_out=0.;v_out=0. - do l=start_z,end_z - do j=jts,min(jte,jde-1) - do i=its,min(ite,ide-1) - ght_out(i,j,l)= beta1*pert_ght(i,j,l) - t_out(i,j,l) = beta1*pert_t(i,j,l) - rh_out(i,j,l) = beta1*pert_rh(i,j,l) - u_out(i,j,l) = beta1*pert_u(i,j,l) - v_out(i,j,l) = beta1*pert_v(i,j,l) - enddo - enddo - enddo - - ELSE ! Balanced vortex option - -!jwb IF(internal_time_loop .eq. 1)THEN ! use balancing only at the initial time - IF(internal_time_loop .le. 2)THEN ! use balancing only at the initial time - - -! -! INSERT NEW VORTEX USING THE BALANCING ALGORITHM DEVELOPED BY ZHIHUA ZENG & -! JIAN-WEN BAO. THIS ALGORITHM IS BASED ON INVERSE BALANCE EQUATION -! - - WRITE(message,*)'CALLING TCBOGUS' - call wrf_debug(1,message) - - allocate(u_temp(ide,jde,end_z));allocate(v_temp(ide,jde,end_z)) - allocate(t_temp(ide,jde,end_z));allocate(ght_temp(ide,jde,end_z)) - allocate(rh_temp(ide,jde,end_z));allocate(psc(ide,jde)) - - dx_km=110000.0*dx ! dx in kilometers - - CALL tcbogus( u_temp,v_temp,t_temp,ght_temp,rh_temp,psc, & - dx_km,id1,jd1, & - start_z,end_z+1, & - ids,ide,jds,jde, & - ids,ide,jds,jde, & - ids,ide,jds,jde ) - -! DIAGNOSTICS AND REVERSAL OF LOOP - - ght_out=0.;t_out=0.;rh_out=0.;u_out=0.;v_out=0. - do l=start_z,end_z - do j=jts,min(jte,jde-1) - do i=its,min(ite,ide-1) - if(l .lt.end_z)ght_out(i,j,l+1)= ght_temp(i,j,end_z-l+1) - t_out(i,j,l) = t_temp(i,j,end_z-l+1) - rh_out(i,j,l) = rh_temp(i,j,end_z-l+1) - u_out(i,j,l) = u_temp(i,j,end_z-l+1) - v_out(i,j,l) = v_temp(i,j,end_z-l+1) - enddo - enddo - enddo - - do l=start_z,end_z - do j=jts,min(jte,jde-1) - do i=its,min(ite,ide-1) - ght_gc(i,j,l) = ght_out(i,j,l) - t_gc(i,j,l) = t_out(i,j,l) - rh_gc(i,j,l) = rh_out(i,j,l) - u_gc(i,j,l) = u_out(i,j,l) - v_gc(i,j,l) = v_out(i,j,l) - if(l .eq. 1)p_gc(i,j,1)=psc(i,j) - enddo - enddo - enddo - - WRITE(message,*)'--------------- new ght_gc --------------------------' -! call wrf_debug(1,message) -! WRITE(message,*)ght_gc(100,100,:) -! call wrf_debug(1,message) - WRITE(message,*)'--------------- new p_gc --------------------------' -! call wrf_debug(1,message) -! WRITE(message,*)p_gc(100,100,:) -! call wrf_debug(1,message) - WRITE(message,*)'--------------- new rh_gc ---------------------------' -! call wrf_debug(1,message) -! WRITE(message,*)rh_gc(100,100,:) -! call wrf_debug(1,message) - WRITE(message,*)'--------------- new t_gc --------------------------' -! call wrf_debug(1,message) -! WRITE(message,*)t_gc(100,100,:) -! call wrf_debug(1,message) -! WRITE(message,*)'---------------------------------------------------' -! call wrf_debug(1,message) - - WRITE(0,*)'tcbogus completed' - WRITE(message,*)'tcbogus completed' - call wrf_debug(1,message) - - ENDIF ! for internal_time_loop .eq. 1 - - ENDIF ! endif for beta=0.- 1.5 - - END SUBROUTINE vortex - -!------------------------------------------------------------------------- -! SUBROUTINE hbfilter -! ------------------- -! input - field to be filtered -! output - filtered output -! nmax - recrussive application of filter ( suggested 3 for 9 km and 27 for 3 km) -! start_z,end_zstart - usually 1 to ktop -! ids,ide,jds,jde - domain index, namely,imin,imax,jmin,jmax -! ims,ime,jms,jme - memory index, for 1 processor set this to above values -! its,ite,jts,jte - tile index, for 1 processor set this to above values - - - SUBROUTINE hbfilter ( input, output & - &, nmax,start_z,end_z & - &, ids,ide,jds,jde & - &, ims,ime,jms,jme & - &, its,ite,jts,jte ) - IMPLICIT NONE - - INTEGER, INTENT(IN) :: ids,ide,jds,jde,ims,ime,jms,jme,its,ite,jts,jte - INTEGER, INTENT(IN) :: start_z,end_z,nmax - REAL :: dx - REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z),INTENT(IN) :: INPUT - REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z),INTENT(INOUT) :: OUTPUT - -! local - - INTEGER :: I,J,K,N,JMIN,JMAX,IMIN,IMAX,NRES,REPEAT - REAL :: PI - REAL, DIMENSION(11) :: M - DATA M /2,3,4,2,5,6,7,2,8,9,2/ - INTEGER, PARAMETER :: NF=11 - REAL, DIMENSION(NF) :: FK - REAL, DIMENSION(IMS:IME,NF) :: XTU - REAL, DIMENSION(JMS:JME,NF) :: YTU - - -!------------------------------------------------------------------ -! -! Purpose: This routine filters and removes -! hurricane signals (Kurihara et al., 1993, MWR) -! -! Called from: vortex -! -! Original Code: Qingfu Liu (EMC) -! Modification history: This is gopal's doing -!----------------------------------------------------------------- -! -! DOMAIN - - IMIN=1 !(1,ID0-40) - IMAX=IDE-1 !min(IDE-1,ID0+40) - JMIN=1 !max(1,JD0-67) - JMAX=JDE-1 !min(JDE-1,JD0+67) - -! INPUT: Local variable defined for testing - - PI=4.0* ATAN(1.0) - DO K=start_z,end_z - DO J=JMIN,JMAX - DO I=IMIN,IMAX - OUTPUT(I,J,K)= INPUT(I,J,K) !SIN(2.0*PI/(21-1)*(I-1)) ! INPUT(I,J,K) - ENDDO - ENDDO - ENDDO - -! DEFINE FILTER FUNCTION - - DO N=1,NF - FK(N)=0.5/(1-COS(2.*PI/M(N))) - ENDDO - - DO K=start_z,end_z - -!.. DO ZONAL FILTER - - DO REPEAT=1,nmax - DO J=JMIN,JMAX-1 - DO N=1,NF - XTU(IMIN,N) = OUTPUT(IMIN,J,K) - XTU(IMAX,N) = OUTPUT(IMAX,J,K) - ENDDO - - DO I=IMIN+1,IMAX-1 - XTU(I,1) = OUTPUT(I,J,K)+FK(1)*(OUTPUT(I-1,J,K)+OUTPUT(I+1,J,K)-2.*OUTPUT(I,J,K)) - ENDDO - - DO N=2,NF - DO I=IMIN+1,IMAX-1 - XTU(I,N)=XTU(I,N-1)+FK(N)*(XTU(I-1,N-1)+XTU(I+1,N-1)-2.*XTU(I,N-1)) - ENDDO - ENDDO - - DO I=IMIN,IMAX-1 - OUTPUT(I,J,K) = XTU(I,NF) - ENDDO - ENDDO ! J loop - ENDDO ! End recrussive repeat - -!.. DO MERIDIONAL FILTER - - DO REPEAT=1,nmax - DO I=IMIN,IMAX - DO N=1,NF - YTU(JMIN,N) = OUTPUT(I,JMIN,K) - YTU(JMAX,N) = OUTPUT(I,JMAX,K) - ENDDO - - DO J=JMIN+1,JMAX-1 - YTU(J,1) = OUTPUT(I,J,K) + FK(1)*(OUTPUT(I,J-1,K) + OUTPUT(I,J+1,K) -2.*OUTPUT(I,J,K)) - ENDDO - - DO N = 2,NF - DO J = JMIN+1,JMAX-1 - YTU(J,N) = YTU(J,N-1) + FK(N)*(YTU(J-1,N-1) + YTU(J+1,N-1) - 2.*YTU(J,N-1)) - ENDDO - ENDDO - - DO J = JMIN,JMAX-1 - OUTPUT(I,J,K) = YTU(J,NF) - ENDDO - ENDDO ! I loop - ENDDO ! End recrussive repeat - - ENDDO ! K loop - RETURN - - - END SUBROUTINE hbfilter -!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++c -! This program performs the idealized vortex initialization for ARW_WRF c -! was written by Zhihua Zeng (Shanghai Typhoon Institute/CMA) and Jian-Wen c -! Bao (NOAA/PSD) in 2009. c -! c -! Contact Eamil: c -! zengzh@mail.typhoon.gov.cn or Jian-Wen.Bao@noaa.gov c -! c -! References: c -! Wang Y.,1995:On inverse balance equation in sigma-coordinates c -! for model initialization, MWR, 123, 482-488. c -! Zeng Z. et al,2009: Simulation of spiral rainbands and vertical c -! resolution, 10th annual WRF user's workshop,23-26 June, c -! Boulder,CO. c -! -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! This program performs the vortex initialisation using a nonlinear -! balance equation in sigma coordinate following Wang (1995, MWR) -! but with some modifications. -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - subroutine tcbogus( uw,vw,tw,ghw,rhw,psc & - &, dsc,id1,jd1 & - &, start_z,end_z1 & - &, ids,ide,jds,jde & - &, ims,ime,jms,jme & - &, its,ite,jts,jte ) - implicit none - include 'BALANCE_PARS.F' - include 'BALANCE_COMS.F' - - INTEGER, INTENT(IN):: start_z,end_z1,id1,jd1 - INTEGER, INTENT(IN):: ids,ide,jds,jde,ims,ime,jms,jme,its,ite,jts,jte -! - REAL, INTENT(IN) :: dsc - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: psc - REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z1),INTENT(INOUT) :: uw,vw,tw,ghw,rhw - -! local variables - INTEGER, PARAMETER :: nv=30 - INTEGER :: i,j,k,km,kd,indx,jtc,itc - INTEGER :: ji,ii,itime,jjt,nwest - REAL :: f0,beta0,beta,pia,betk,txc,tyc,sigma - REAL :: tk,t6,rh,rm,vm0,rm0,ts - REAL, DIMENSION(JMS:JME) :: fc,fe - REAL, DIMENSION(start_z:end_z1) :: up1,pp1,pp1o - REAL, DIMENSION(start_z:end_z1-1) :: up,tvb - REAL, DIMENSION(IMS:IME,JMS:JME) :: betkc - REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z1-1) :: uc,vc,tc,rqc,ppc - REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z1-1) :: tvbc,ghc,rhc - character*255 message -! - common /comp1/tk(kmx),t6(kmx1),rh(kmx),rm,vm0,ts - km=end_z1-1 -! -!******************************************************************* - open(22,file='sigma.d',form='formatted') - do k=1,end_z1 - read(22,*) kd, sig(k) - enddo - 5 format(2x,i2,4x,f10.6) - close(22) - - do k=1,km - sig1(k)=0.5*(sig(k)+sig(k+1)) - enddo -! - open(20,file='input.d',form='formatted',status='unknown') - read(20,1) indx - read(20,2) nenv - read(20,3) vm0 - read(20,3) rm0 -! read(20,4) tsf0 - close(20) - 1 format(i1) - 2 format(i2) - 3 format(f5.1) - 4 format(f8.2) -! - rm=rm0*1000.0 -! -! write(6,*) vm0,rm0 -! write(6,*) nenv -! - do k=1,km - up(k)=0.0 - enddo - do k=1,end_z1 - up1(k)=0.0 - enddo - jjt=0.0 -! - nwest=-(ide-1)/2+25 - jjt=max(jjt,nwest) - write(6,*) jjt -! - txc=id1 !(float(ide)+1.0)/3.0 !2.0 - tyc=jd1 !(float(jde)+1.0)/3.0 !2.0 - write(6,*)'txc= ', txc,'tyc= ',tyc -! - call tem(tk,t6,rh,km,end_z1,pp1) -! - ts=t6(end_z1) - write(6,*) ts -!------------------------------------- -!--to calculate the Coriolis parameter -!------------------------------------- - pia=4.0*atan(1.0)/180.0 - f0=14.584e-5*sin(pia*fi0) - beta=14.584e-5*cos(pia*fi0)/6.3712e6 - if(indx.eq.0) beta=0.0 - do i=1,jde - fc(i)=f0+beta*(float(i)-tyc)*dsc - enddo -!--------------------------------------------------- - call env(tc,psc,fc,ide,jde,dsc,tyc,up1,km,end_z1) -!--------------------------------------------------- - do k=1,km - do i=1,jde - do j=1,ide - tc(j,i,k)=tk(k)+tc(j,i,k) - enddo - enddo - enddo -! - call result(uc,vc,tc,rqc,psc,fc,ide,jde,dsc,tyc,txc, & - up1,up,km,end_z1,beta) - - write(message,*)'out of result' - call wrf_debug(1,message) -! - itime=0.0 -! - do k=1,km - qb(k)=rqc(1,1,k) - enddo -! - do i=1,jde - do k=1,km - do j=1,ide - ppc(j,i,k)=sig1(k)*psc(j,i) - enddo - enddo - enddo -! -!-------------------------------------- -!--to calculate the height of the u,v,t -!-------------------------------------- - do k=1,km - tvb(k)=tk(k)*(1.0+0.608*qb(k)) - enddo - betk=(rgas/grv)*log(1.0/sig1(km)) - poz(km)=betk*tvb(km) -! write(10,*) poz(km) - do k=km-1,1,-1 - betk=0.5*(rgas/grv)*log(sig1(k+1)/sig1(k)) - poz(k)=poz(k+1)+betk*(tvb(k)+tvb(k+1)) -! write(10,*) poz(k) - enddo -! - write(message,*)'before interpolation' - call wrf_debug(1,message) - call interpz(uc,vc,tc,ppc,rqc,ide,jde,km) -! - if(vm0.gt.1.0) then -! -!-------------------------------------- - do k=1,km - do i=1,jde - do j=1,ide - rhc(j,i,k)=rh(k) - fe(i)=0.0 - enddo - enddo - enddo - -!-------------------------------------- - do k=1,km - do i=1,jde - do j=1,ide - tvbc(j,i,k)=tc(j,i,k)*(1.0+0.608*rqc(j,i,k)) - enddo - enddo - enddo - do i=1,jde - do j=1,ide - betkc(j,i)=(rgas/grv)*log(0.01*psc(j,i)/pp1(km)) !! psc is hPa - ghc(j,i,km)=betkc(j,i)*tvbc(j,i,km) - enddo - enddo - do k=km-1,1,-1 - do i=1,jde - do j=1,ide -! write(63,*)k,i,j,pp1(k+1),pp1(k) - if(pp1(k) .gt. 0.)then - betkc(j,i)=0.5*(rgas/grv)*log(pp1(k+1)/pp1(k)) - else - betkc(j,i)=0.0 - endif - ghc(j,i,k)=ghc(j,i,k+1)+betkc(j,i)*(tvbc(j,i,k)+tvbc(j,i,k+1)) - enddo - enddo - enddo -! - write(message,*)'---------- test write out -----------' - call wrf_debug(1,message) - do k=1,km - do i=1,jde - do j=1,ide - uw(j,i,k)=uc(j,i,k) - vw(j,i,k)=vc(j,i,k) - tw(j,i,k)=tc(j,i,k) - ghw(j,i,k)=ghc(j,i,k) - rhw(j,i,k)=rhc(j,i,k) - if(i .eq. 10 .and. j .eq. 10) then - write(message,*)k,uw(j,i,k),vw(j,i,k),ghw(j,i,k),tw(j,i,k) - call wrf_debug(1,message) - endif - if(i .eq. 100 .and. j .eq. 98) then - write(message,*)k,uw(j,i,k),vw(j,i,k),ghw(j,i,k),tw(j,i,k) - call wrf_debug(1,message) - endif - enddo - enddo - enddo - - endif -! - return - end subroutine tcbogus -! -!----------------------------------------------------------------- -! - subroutine result(u,v,t,rq,ps,f,lq,lp,ds,ty0,tx0,up1, & - up,km,end_z1,beta) -! -!----------------------------------------------------------------- - implicit none - include 'BALANCE_PARS.F' - include 'BALANCE_COMS.F' - integer i,j,k,lq,lp,km,end_z1,nnt,jti,iti - real ds,ds2,err,uee,tx0,ty0,beta,ajac,vor,forc1,forc2,forc3 - real ees,rqs,sgg,reh,ta,pp,alpi - real u(lq,lp,km),v(lq,lp,km),t(lq,lp,km),rq(lq,lp,km),ps(lq,lp) - real alp(lq,lp),tt(lq,lp,end_z1),tt2(2:km),xx(lq,lp),forc(lq,lp) - real ux(lq,lp),vy(lq,lp),tt1(lq,lp,km),gg1(lq,lp,end_z1),f(lp) - real up1(end_z1),up(km) - real tk,t6,rh,rm,vm0,ts - character*255 message - common /comp1/tk(kmx),t6(kmx1),rh(kmx),rm,vm0,ts -! - ds2=ds*ds - err=3.0e-6 - do i=1,lp - do j=1,lq - forc(j,i)=0.0 - alp(j,i)=log(ps(j,i)) - enddo - enddo -! - uee=up1(end_z1) - - WRITE(message,*)'CALLING VORTEX 1' - call wrf_debug(1,message) - - call vortex1(ux,vy,1.0,ds,lq,lp,ty0,tx0,uee) - do 1 i=2,lp-1 - do 1 j=2,lq-1 - ajac=((ux(j+1,i)-ux(j-1,i))*(vy(j,i+1)-vy(j,i-1))-(ux(j,i+1) & - -ux(j,i-1))*(vy(j+1,i)-vy(j-1,i)))/(2.0*ds2) - vor=f(i)*(vy(j+1,i)-vy(j-1,i)-ux(j,i+1)+ux(j,i-1))/(2.0*ds) - forc(j,i)=ds2*(ajac+vor-beta*ux(j,i))/(rgas*ts) - 1 continue - call posn(alp,forc,5.0e-10,1,lq,lp) - - do i=1,lp - do j=1,lq - ps(j,i)=exp(alp(j,i)) - enddo - enddo - do 2 i=1,lp - do 2 j=1,lq - do 2 k=1,km - t(j,i,k)=t(j,i,k)-tk(k) - 2 continue -! - do 5 k=1,end_z1 -! - sgg=sig(k) - uee=up1(k) - - WRITE(message,*)'CALLING VORTEX 2',k - call wrf_debug(1,message) - - call vortex1(ux,vy,sgg,ds,lq,lp,ty0,tx0,uee) - do 3 i=2,lp-1 - do 3 j=2,lq-1 - ajac=((ux(j+1,i)-ux(j-1,i))*(vy(j,i+1)-vy(j,i-1))-(ux(j,i+1) & - -ux(j,i-1))*(vy(j+1,i)-vy(j-1,i)))/(2.0*ds2) - vor=f(i)*(vy(j+1,i)-vy(j-1,i)-ux(j,i+1)+ux(j,i-1))/(2.0*ds) - gg1(j,i,k)=ajac+vor-beta*ux(j,i) - 3 continue -! - 5 continue -! - nnt=0 - 6 nnt=nnt+1 -! - do 8 j=1,lq - do 8 i=1,lp - do k=2,km - tt2(k)=t(j,i,k-1)+(t(j,i,k)-t(j,i,k-1))*(sig(k)-sig1(k-1)) & - /(sig1(k)-sig1(k-1)) - enddo - do k=1,km - if(k.eq.1) then - tt(j,i,k)=(tt2(k+1)-t(j,i,k))/log(sig(k+1)/sig1(k)) - else if(k.eq.km) then - tt(j,i,k)=(t(j,i,k)-tt2(k))/log(sig1(k)/sig(k)) - else - tt(j,i,k)=(tt2(k+1)-tt2(k))/log(sig(k+1)/sig(k)) - endif - enddo - 8 continue -! - do 15 k=1,km -! - do 9 j=2,lq-1 - do 9 i=2,lp-1 - alpi=alp(j-1,i)+alp(j,i-1)-4.0*alp(j,i)+alp(j+1,i)+alp(j,i+1) - if(k.eq.1) then - forc1=(t6(k+1)-tk(k))*alpi/log(sig(k+1)/sig1(k)) - forc3=(gg1(j,i,k+1)-gg1(j,i,k+2))*ds2/ & - (rgas*log(sig(k+2)/sig(k+1))) - else - forc1=(t6(k+1)-t6(k))*alpi/log(sig(k+1)/sig(k)) - forc3=(gg1(j,i,k)-gg1(j,i,k+1))*ds2/(rgas*log(sig(k+1)/sig(k))) - endif - forc2=(tt(j+1,i,k)+tt(j,i,k))*(alp(j+1,i)-alp(j,i))-(tt(j,i,k)+ & - tt(j-1,i,k))*(alp(j,i)-alp(j-1,i))+(tt(j,i+1,k)+tt(j,i,k))*(alp & - (j,i+1)-alp(j,i))-(tt(j,i,k)+tt(j,i-1,k))*(alp(j,i)-alp(j,i-1)) - forc(j,i)=forc1+0.5*forc2+forc3 - 9 continue - do 10 j=1,lq - do 10 i=1,lp - xx(j,i)=t(j,i,k) - 10 continue -! - call posn(xx,forc,err,nnt,lq,lp) -! - do 12 j=1,lq - do 12 i=1,lp - 12 t(j,i,k)=xx(j,i) -! - 15 continue -! - if(nnt.ne.4) goto 6 -! - jti=int(tx0+0.5) - iti=int(ty0+0.5) -! - do k=1,km - write(6,*) t(jti,iti,k) - enddo -! - do 18 k=1,km - do 18 i=1,lp - do 18 j=1,lq - t(j,i,k)=t(j,i,k)+tk(k) - reh=amin1(1.0,rh(k)*0.01) - if(nphy.eq.0) reh=0.0 - pp=sig1(k)*ps(j,i) - ta=t(j,i,k) - ees=611.2*exp(cs2*(ta-cs3)/(ta-cs4)) - ees=amin1(0.5*pp,ees) - rqs=0.622*ees/(pp-ees) - rq(j,i,k)=reh*rqs - 18 continue -! - do 20 k=1,km - sgg=sig1(k) - uee=up(k) - - WRITE(message,*)'CALLING VORTEX 3',k - call wrf_debug(1,message) - - call vortex1(ux,vy,sgg,ds,lq,lp,ty0,tx0,uee) - do 20 i=1,lp - do 20 j=1,lq - u(j,i,k)=ux(j,i) - v(j,i,k)=vy(j,i) - 20 continue -! - return - end subroutine result -! -!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! - subroutine vortex1(ux,vy,sgg,ds,lq,lp,ty0,tx0,uee) -! -!---------------------------------------------------------------- - implicit none - include 'BALANCE_PARS.F' - character*255 message - integer i,j,lq,lp - real ahem,pi,sgt,sgb,sgg,ds,ty0,tx0,uee,vm,b,r0,rr,rd,ty,tx - real ux(lq,lp),vy(lq,lp) - real tk,t6,rh,rm,vm0,ts,vt - common /comp1/tk(kmx),t6(kmx1),rh(kmx),rm,vm0,ts -! - WRITE(message,*)'INSIDE VORTEX' - call wrf_debug(1,message) - ahem=1.0 - if(fi0.lt.0.0) ahem=-1.0 - pi=2.0*atan(1.0) - sgt=0.15 - sgb=0.95 - if(sgg.ge.sgb) then - vm=vm0 - else if(sgg.le.sgt) then - vm=0.0 - else - vm=vm0*sin(pi*(sgg-sgt)/(sgb-sgt)) - endif -! - b=1.0 - r0=10.0*rm - do i=1,lp - ty=(float(i)-ty0)*ds - do j=1,lq - tx=(float(j)-tx0)*2.0*ds ! factor 2.0: gopal's doing for E grid - rr=sqrt(ty*ty+tx*tx) - rd=rr/rm - vt=vm/rm*(exp((1.0-rd**b)/b)-abs(rr-rm)/(r0-rm) & - *exp((1.0-(r0/rm)**b)/b)) - if(rr.ge.r0) vt=0.0 - ux(j,i)=-vt*ty*ahem+uee - vy(j,i)=vt*tx*ahem - enddo - enddo -! - return - end subroutine vortex1 -! -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! - subroutine posn(xx,forc,err,nnt,lq,lp) -! -!-------------------------------------------------------- - implicit none - include 'BALANCE_PARS.F' - include 'BALANCE_COMS.F' -! - integer i,j,nnt,lq,lp - real xx(lq,lp),forc(lq,lp),err - real*8 rji,ane,arm,anorm - real*8 tem(lq,lp),wk(lq,lp),fc(lq,lp) -! - do i=1,lp - do j=1,lq - tem(j,i)=xx(j,i) - fc(j,i)=forc(j,i) - enddo - enddo -! - if(nnt.eq.1.and.nenv.ne.0) then - do 1 i=2,lp-1 - do 1 j=2,lq-1 - tem(j,i)=tem(j,i)-0.25*fc(j,i) - 1 continue - endif -! - nt=0 - 2 nt=nt+1 -! - anorm=0.0d0 -! - do 10 i=2,lp-1 - do 10 j=2,lq-1 - rji=fc(j,i)-(tem(j-1,i)+tem(j,i-1)+ & - tem(j+1,i)+tem(j,i+1)-4.0d0*tem(j,i)) - ane=-0.25d0*rji - wk(j,i)=tem(j,i)+ane - arm=abs(ane) - if(arm.gt.anorm) anorm=arm - 10 continue -! - do 20 i=2,lp-1 - do 20 j=2,lq-1 - 20 tem(j,i)=wk(j,i) -! - !Gopal's doing on June 17th, 2015. The line below was erroneously removed from the code. - if(anorm.gt.err) goto 2 - write(6,*) nt,anorm,err -! - do i=1,lp - do j=1,lq - xx(j,i)=tem(j,i) - enddo - enddo -! - return - end subroutine posn -! -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! - subroutine tem(ttk,ttk1,rh,km,end_z1,pp1) -! -!---------------------------------------------------------------- - implicit none - include 'BALANCE_PARS.F' - include 'BALANCE_COMS.F' - integer km,end_z1,nv,k,n1 - parameter(nv=30) - real ppk(km),ttk(km),ttk1(end_z1),tt(nv),pp(nv),rh(km) - real pp1(end_z1) - real rho(nv),t1,t2,p1,p2,pk,r1,r2,b,rk -! -! Wilis Island sounding (January) -! - open(30,file='sound.d',form='formatted',status='old') - do k=1,nv - read(30,*) pp(k),tt(k),rho(k) - enddo -! 2 format(1x,f7.1,7x,f7.2,8x,f4.1) - close(30) -! - do k=1,nv - tt(k)=tt(k)+273.15 - enddo -! - do k=1,km - ppk(k)=sig1(k)*pse/100.0 - pp1(k)=sig(k)*pse/100.0 - enddo - pp1(end_z1)=pse/100.0 -! - do k=1,km - pk=ppk(k) -! - do n1=1,nv-1 - if(pp(n1).le.pk.and.pp(n1+1).gt.pk) then - t1=tt(n1) - t2=tt(n1+1) - p1=pp(n1) - p2=pp(n1+1) - endif - enddo - write(6,*) ' p1, p2=',p1,p2 -! - b=(t2-t1)/(p2-p1) - ttk(k)=t1+b*(pk-p1) - enddo -! - do k=2,end_z1 - pk=pp1(k) -! - do n1=1,nv-1 - if(pp(n1).le.pk.and.pp(n1+1).gt.pk) then - t1=tt(n1) - t2=tt(n1+1) - p1=pp(n1) - p2=pp(n1+1) - endif - enddo -! - b=(t2-t1)/(p2-p1) - ttk1(k)=t1+b*(pk-p1) - enddo - ttk1(1)=ttk(1) -! - do k=1,km - pk=ppk(k) -! - do n1=1,nv-1 - if(pp(n1).le.pk.and.pp(n1+1).gt.pk) then - r1=rho(n1) - r2=rho(n1+1) - p1=pp(n1) - p2=pp(n1+1) - endif - enddo -! - b=(r2-r1)/(p2-p1) - rk=r1+b*(pk-p1) - rh(k)=rk - enddo -! - open(23,file='pp.d',form='formatted') - do k=1,end_z1 - write(23,3) k,sig(k),pp1(k),ttk1(k)-273.15 - enddo -! - do k=1,km - write(23,4) k,sig1(k),ppk(k),ttk(k)-273.15,rh(k) - enddo - 3 format(2x,'k=',i2,', sig=',f8.4,', p=',f8.3,', t=',f7.2) - 4 format(2x,'k=',i2,', sig=',f8.4,', p=',f8.3,', t=',f7.2,', rh=', & - f6.3) - close(23) -! - return - end subroutine tem - - subroutine env(t,ps,f,lq,lp,ds,ty0,up1,km,end_z1) -! -!------------------------------------------------------------ -! This subroutine performs initialization for a zonal flow -! using a nonlinear balance equation in sigma coordinate. -!------------------------------------------------------------ - implicit none - include 'BALANCE_PARS.F' - include 'BALANCE_COMS.F' - integer i,j,k,lq,lp,km,end_z1,nnt - real ds,ty0,forc1,forc2,forc3 - real alp(lp),tt(lp,end_z1),xx(lp),forc(lp) - real alpy(lp),f(lp),t(lq,lp,km),ps(lq,lp) - real tt2(2:km),up1(end_z1) - real tk,t6,rh,rm,vm0,ts - common /comp1/tk(kmx),t6(kmx1),rh(kmx),rm,vm0,ts -! - it0=int(ty0+0.5) -! - do 1 k=1,km - do 1 i=1,lp - do 1 j=1,lq - 1 t(j,i,k)=0.0 -! - do i=1,lp - alpy(i)=-f(i)*up1(end_z1)/(rgas*ts) - enddo - alp(it0)=log(pse) - do i=it0-1,1,-1 - alp(i)=alp(i+1)-0.5*(alpy(i)+alpy(i+1))*ds - enddo - do i=it0+1,lp - alp(i)=alp(i-1)+0.5*(alpy(i)+alpy(i-1))*ds - enddo -! - do 2 j=1,lq - do 2 i=1,lp - ps(j,i)=exp(alp(i)) - 2 continue -! - nnt=0 - 6 nnt=nnt+1 -! - do 8 i=1,lp - do k=2,km - tt2(k)=t(1,i,k-1)+(t(1,i,k)-t(1,i,k-1))*(sig(k)-sig1(k-1)) & - /(sig1(k)-sig1(k-1)) - enddo - do k=1,km - if(k.eq.1) then - tt(i,k)=(tt2(k+1)-t(1,i,k))/log(sig(k+1)/sig1(k)) - else if(k.eq.km) then - tt(i,k)=(t(1,i,k)-tt2(k))/log(sig1(k)/sig(k)) - else - tt(i,k)=(tt2(k+1)-tt2(k))/log(sig(k+1)/sig(k)) - endif - enddo - 8 continue -! - do 15 k=1,km -! Bug fix for idealized simulation by Lin Zhu. forc2. The bug is associated with -! thermal wind relationship in sheared environment. - do 9 i=1,lp - forc1=tt(i,k)*alpy(i) - if(k.eq.1) then - forc2= - f(i)*(up1(3)-up1(2))/(rgas*log(sig(3)/sig(2))) - forc3=(t6(2)-tk(1))*alpy(i)/log(sig(2)/sig1(1)) - else - forc2= - f(i)*(up1(3)-up1(2))/(rgas*log(sig(3)/sig(2))) - forc3=(t6(k+1)-t6(k))*alpy(i)/log(sig(k+1)/sig(k)) - endif - forc(i)=forc1+forc2+forc3 - 9 continue -! - xx(it0)=0.0 - do i=it0-1,1,-1 - xx(i)=xx(i+1)-0.5*(forc(i)+forc(i+1))*ds - enddo - do i=it0+1,lp - xx(i)=xx(i-1)+0.5*(forc(i)+forc(i-1))*ds - enddo -! - do i=1,lp - do j=1,lq - t(j,i,k)=xx(i) - enddo - enddo -! -! - 15 continue -! - if(nnt.ne.6) goto 6 -! - return - end subroutine env -! -!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - real function splin(x,a,b,c,d) - implicit none - real a,b,c,d - real x(4) - splin=(-a*x(1)+b*x(2)+c*x(3)-d*x(4))/81.0 - return - end function splin -! - -!------------------------------------------------------ -! - subroutine interpz(u,v,t,pp,qv,lq,lp,km) -! -!****************************************************** - implicit none - include 'BALANCE_PARS.F' - include 'BALANCE_COMS.F' - integer i,j,k,lq,lp,km - real ees,pa,ta,rqs,betk - real u(lq,lp,km),v(lq,lp,km),qv(lq,lp,km),t(lq,lp,km) - real tv(lq,lp,km),pp(lq,lp,km),pzz(lq,lp,km) -!*************************************************** -! - do i=1,lp - do k=1,km - do j=1,lq - tv(j,i,k)=t(j,i,k)*(1.0+0.608*qv(j,i,k)) - enddo - enddo - enddo -! - do i=1,lp - do j=1,lq - betk=(rgas/grv)*log(1.0/sig1(km)) - pzz(j,i,km)=betk*tv(j,i,km) - enddo - enddo - do i=1,lp - do k=km-1,1,-1 - do j=1,lq - betk=0.5*(rgas/grv)*log(sig1(k+1)/sig1(k)) - pzz(j,i,k)=pzz(j,i,k+1)+betk*(tv(j,i,k)+tv(j,i,k+1)) - enddo - enddo - enddo -! - do i=1,lp - do k=1,km - do j=1,lq - pa=pp(j,i,k) - ta=t(j,i,k) - ees=611.2*exp(cs2*(ta-cs3)/(ta-cs4)) - rqs=0.622*ees/(pa-ees) - qv(j,i,k)=qv(j,i,k)/rqs - enddo - enddo - enddo -! - call interps(u,pzz,poz,lq,lp,km) - call interps(v,pzz,poz,lq,lp,km) - call interps(t,pzz,poz,lq,lp,km) - call interps(pp,pzz,poz,lq,lp,km) - call interps(qv,pzz,poz,lq,lp,km) -! - do i=1,lp - do k=1,km - do j=1,lq - pa=pp(j,i,k) - ta=t(j,i,k) - ees=611.2*exp(cs2*(ta-cs3)/(ta-cs4)) - rqs=0.622*ees/(pa-ees) - qv(j,i,k)=qv(j,i,k)*rqs - enddo - enddo - enddo -! - return - end subroutine interpz -! -!------------------------------------------------- -! this subroutine performs vertical interpotation -!------------------------------------------------- -! - subroutine interps(as,zz,poz,lq,lp,km) -! -!------------------------------------------------- - implicit none - integer i,j,k,lq,lp,km,n1,nn - real a1,a2,sg,sg1,sg2,b - real as(lq,lp,km),poz(km),zz(lq,lp,km),wk(lq,lp,km) -! - do 100 i=1,lp - do 100 j=1,lq -! - do 100 k=1,km - sg=poz(k) - if(sg.le.zz(j,i,km)) then - n1=km-1 - else if(sg.gt.zz(j,i,1)) then - n1=1 - else - do nn=1,km-1 - if(sg.gt.zz(j,i,nn+1).and.sg.le.zz(j,i,nn)) then - n1=nn - goto 20 - endif - enddo - 20 continue - endif - a1=as(j,i,n1+1) - a2=as(j,i,n1) - sg1=zz(j,i,n1+1) - sg2=zz(j,i,n1) - sg2=zz(j,i,n1) - b=(a2-a1)/(sg2-sg1) - wk(j,i,k)=a1+b*(sg-sg1) -! - 100 continue -! - do 200 i=1,lp - do 200 k=1,km - do 200 j=1,lq - as(j,i,k)=wk(j,i,k) - 200 continue -! - return - end subroutine interps - - - -#if ( HWRF == 1 ) -! compute earth lat-lons for before interpolations. This is gopal's doing for ocean coupling -!============================================================================================ - -SUBROUTINE EARTH_LATLON_hwrf ( HLAT,HLON,VLAT,VLON, & !Earth lat,lon at H and V points - DLMD1,DPHD1,WBD1,SBD1, & !input res,west & south boundaries, - CENTRAL_LAT,CENTRAL_LON, & ! central lat,lon, all in degrees - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) -!============================================================================ -! - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - REAL, INTENT(IN ) :: DLMD1,DPHD1,WBD1,SBD1 - REAL, INTENT(IN ) :: CENTRAL_LAT,CENTRAL_LON - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HLAT,HLON,VLAT,VLON - -! local - - INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13) - INTEGER :: I,J - REAL(KIND=KNUM) :: WB,SB,DLM,DPH,TPH0,STPH0,CTPH0 - REAL(KIND=KNUM) :: TDLM,TDPH,TLMH,TLMV,TLMH0,TLMV0,TPHH,TPHV,DTR - REAL(KIND=KNUM) :: STPH,CTPH,STPV,CTPV,PI_2 - REAL(KIND=KNUM) :: SPHH,CLMH,FACTH,SPHV,CLMV,FACTV - REAL(KIND=KNUM), DIMENSION(IMS:IME,JMS:JME) :: GLATH,GLONH,GLATV,GLONV -!------------------------------------------------------------------------- - -! - PI_2 = ACOS(0.) - DTR = PI_2/90. - WB = WBD1 * DTR ! WB: western boundary in radians - SB = SBD1 * DTR ! SB: southern boundary in radians - DLM = DLMD1 * DTR ! DLM: dlamda in radians - DPH = DPHD1 * DTR ! DPH: dphi in radians - TDLM = DLM + DLM ! TDLM: 2.0*dlamda - TDPH = DPH + DPH ! TDPH: 2.0*DPH - -! For earth lat lon only - - TPH0 = CENTRAL_LAT*DTR ! TPH0: central lat in radians - STPH0 = SIN(TPH0) - CTPH0 = COS(TPH0) - - DO J = JTS,MIN(JTE,JDE) !-1) ! H./ This loop takes care of zig-zag -! ! \.H starting points along j - TLMH0 = WB - TDLM + MOD(J+1,2) * DLM ! ./ TLMH (rotated lats at H points) - TLMV0 = WB - TDLM + MOD(J,2) * DLM ! H (//ly for V points) - TPHH = SB + (J-1)*DPH ! TPHH (rotated lons at H points) are simple trans. - TPHV = TPHH ! TPHV (rotated lons at V points) are simple trans. - STPH = SIN(TPHH) - CTPH = COS(TPHH) - STPV = SIN(TPHV) - CTPV = COS(TPHV) - - ! .H - DO I = ITS,MIN(ITE,IDE) !-1) ! / - TLMH = TLMH0 + I*TDLM ! \.H .U .H -! !H./ ----><---- - SPHH = CTPH0 * STPH + STPH0 * CTPH * COS(TLMH) ! DLM + DLM - GLATH(I,J)=ASIN(SPHH) ! GLATH: Earth Lat in radians - CLMH = CTPH*COS(TLMH)/(COS(GLATH(I,J))*CTPH0) & - - TAN(GLATH(I,J))*TAN(TPH0) - IF(CLMH .GT. 1.) CLMH = 1.0 - IF(CLMH .LT. -1.) CLMH = -1.0 - FACTH = 1. - IF(TLMH .GT. 0.) FACTH = -1. - GLONH(I,J) = -CENTRAL_LON*DTR + FACTH*ACOS(CLMH) - - ENDDO - - DO I = ITS,MIN(ITE,IDE) !-1) - TLMV = TLMV0 + I*TDLM - SPHV = CTPH0 * STPV + STPH0 * CTPV * COS(TLMV) - GLATV(I,J) = ASIN(SPHV) - CLMV = CTPV*COS(TLMV)/(COS(GLATV(I,J))*CTPH0) & - - TAN(GLATV(I,J))*TAN(TPH0) - IF(CLMV .GT. 1.) CLMV = 1. - IF(CLMV .LT. -1.) CLMV = -1. - FACTV = 1. - IF(TLMV .GT. 0.) FACTV = -1. - GLONV(I,J) = -CENTRAL_LON*DTR + FACTV*ACOS(CLMV) - - ENDDO - - ENDDO - -! Conversion to degrees (may not be required, eventually) - - DO J = JTS, MIN(JTE,JDE) !-1) - DO I = ITS, MIN(ITE,IDE) !-1) - HLAT(I,J) = GLATH(I,J) / DTR - HLON(I,J)= -GLONH(I,J)/DTR - IF(HLON(I,J) .GT. 180.) HLON(I,J) = HLON(I,J) - 360. - IF(HLON(I,J) .LT. -180.) HLON(I,J) = HLON(I,J) + 360. -! - VLAT(I,J) = GLATV(I,J) / DTR - VLON(I,J) = -GLONV(I,J) / DTR - IF(VLON(I,J) .GT. 180.) VLON(I,J) = VLON(I,J) - 360. - IF(VLON(I,J) .LT. -180.) VLON(I,J) = VLON(I,J) + 360. - - ENDDO - ENDDO - -END SUBROUTINE EARTH_LATLON_hwrf - - SUBROUTINE G2T2H_hwrf( SM,HRES_SM, & ! output grid index and weights - HLAT,HLON, & ! target (nest) input lat lon in degrees - DLMD1,DPHD1,WBD1,SBD1, & ! parent res, west and south boundaries - CENTRAL_LAT,CENTRAL_LON, & ! parent central lat,lon, all in degrees - P_IDE,P_JDE,P_IMS,P_IME,P_JMS,P_JME, & ! parent imax and jmax - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dIMEnsions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - -! -!*** Tom Black - Initial Version -!*** Gopal - Revised Version for WRF (includes coincident grid points) -!*** -!*** GIVEN PARENT CENTRAL LAT-LONS, RESOLUTION AND WESTERN AND SOUTHERN BOUNDARY, -!*** AND THE NESTED GRID LAT-LONS AT H POINTS, THIS ROUTINE FIRST LOCATES THE -!*** INDICES,IIH,JJH, OF THE PARENT DOMAIN'S H POINTS THAT LIES CLOSEST TO THE -!*** h POINTS OF THE NESTED DOMAIN -! -!============================================================================ -! - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: P_IDE,P_JDE,P_IMS,P_IME,P_JMS,P_JME - REAL, INTENT(IN ) :: DLMD1,DPHD1,WBD1,SBD1 - REAL, INTENT(IN ) :: CENTRAL_LAT,CENTRAL_LON - REAL, DIMENSION(P_IMS:P_IME,P_JMS:P_JME), INTENT(IN) :: SM - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: HLAT,HLON - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HRES_SM - -! local - - INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13) - INTEGER :: IMT,JMT,N2R,MK,K,I,J,DSLP0,DSLOPE,N - INTEGER :: NROW,NCOL,KROWS - REAL(KIND=KNUM) :: X,Y,Z,TLAT,TLON - REAL(KIND=KNUM) :: PI_2,D2R,R2D,GLAT,GLON,DPH,DLM,TPH0,TLM0,WB,SB - REAL(KIND=KNUM) :: ROW,COL,SLP0,TLATHC,TLONHC,DENOM,SLOPE - REAL(KIND=KNUM) :: TLAT1,TLAT2,TLON1,TLON2,DLM1,DLM2,DLM3,DLM4,D1,D2 - REAL(KIND=KNUM) :: DLA1,DLA2,DLA3,DLA4,S1,R1,DS1,AN1,AN2,AN3 ! Q - REAL(KIND=KNUM) :: DL1,DL2,DL3,DL4,DL1I,DL2I,DL3I,DL4I,SUMDL,TLONO,TLATO - REAL(KIND=KNUM) :: DTEMP - REAL , DIMENSION(IMS:IME,JMS:JME) :: TLATHX,TLONHX - INTEGER, DIMENSION(IMS:IME,JMS:JME) :: KOUTB - REAL SUM,AMAXVAL - REAL, DIMENSION (4, ims:ime, jms:jme ) :: NBWGT - LOGICAL FLIP - REAL, DIMENSION(IMS:IME,JMS:JME) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME) :: IIH,JJH - character*255 message -!------------------------------------------------------------------------------- - - IMT=2*P_IDE-2 ! parent i dIMEnsions - JMT=P_JDE/2 ! parent j dIMEnsions - PI_2=ACOS(0.) - D2R=PI_2/90. - R2D=1./D2R - DPH=DPHD1*D2R - DLM=DLMD1*D2R - TPH0= CENTRAL_LAT*D2R - TLM0=-CENTRAL_LON*D2R ! NOTE THE MINUS HERE - WB=WBD1*D2R ! CONVERT NESTED GRID H POINTS FROM GEODETIC - SB=SBD1*D2R - SLP0=DPHD1/DLMD1 - DSLP0=NINT(R2D*ATAN(SLP0)) - DS1=SQRT(DPH*DPH+DLM*DLM) ! Q - AN1=ASIN(DLM/DS1) - AN2=ASIN(DPH/DS1) - - - DO J = JTS,MIN(JTE,JDE) !-1) - DO I = ITS,MIN(ITE,IDE) !-1) - -!*** -!*** LOCATE TARGET h POINTS (HLAT AND HLON) ON THE PARENT DOMAIN AND -!*** DETERMINE THE INDICES IN TERMS OF THE PARENT DOMAIN. FIRST -!*** CONVERT NESTED GRID h POINTS FROM GEODETIC TO TRANSFORMED -!*** COORDINATE ON THE PARENT GRID -! - - GLAT=HLAT(I,J)*D2R - GLON= (360. - HLON(I,J))*D2R - X=COS(TPH0)*COS(GLAT)*COS(GLON-TLM0)+SIN(TPH0)*SIN(GLAT) - Y=-COS(GLAT)*SIN(GLON-TLM0) - Z=COS(TPH0)*SIN(GLAT)-SIN(TPH0)*COS(GLAT)*COS(GLON-TLM0) - TLAT=R2D*ATAN(Z/SQRT(X*X+Y*Y)) - TLON=R2D*ATAN(Y/X) - -! - ROW=TLAT/DPHD1+JMT ! JMT IS THE CENTRAL ROW OF THE PARENT DOMAIN - COL=TLON/DLMD1+P_IDE-1 ! (P_IDE-1) IS THE CENTRAL COLUMN OF THE PARENT DOMAIN - NROW=INT(ROW + 0.001) ! ROUND-OFF IS AVOIDED WITHOUT USING NINT ON PURPOSE - NCOL=INT(COL + 0.001) - TLAT=TLAT*D2R - TLON=TLON*D2R - -! WRITE(60,*)'============================================================' -! WRITE(60,*)' ','i=',i,'j=',j -!*** -!*** -!*** FIRST CONSIDER THE SITUATION WHERE THE POINT h IS AT -!*** -!*** V H -!*** -!*** -!*** h -!*** H V -!*** -!*** THEN LOCATE THE NEAREST H POINT ON THE PARENT GRID -!*** - IF(MOD(NROW,2).EQ.1.AND.MOD(NCOL,2).EQ.1.OR. & - MOD(NROW,2).EQ.0.AND.MOD(NCOL,2).EQ.0)THEN - TLAT1=(NROW-JMT)*DPH - TLAT2=TLAT1+DPH - TLON1=(NCOL-(P_IDE-1))*DLM - TLON2=TLON1+DLM - DLM1=TLON-TLON1 - DLM2=TLON-TLON2 -! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) -! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) - D1=ACOS(DTEMP) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - D2=ACOS(DTEMP) - IF(D1.GT.D2)THEN - NROW=NROW+1 ! FIND THE NEAREST H ROW - NCOL=NCOL+1 ! FIND THE NEAREST H COLUMN - ENDIF -! WRITE(60,*)'NEAREST PARENT IS:','col=',COL,'row=',ROW,'ncol=',NCOL,'nrow=',NROW - ELSE -!*** -!*** NOW CONSIDER THE SITUATION WHERE THE POINT h IS AT -!*** -!*** H V -!*** -!*** -!*** h -!*** V H -!*** -!*** THEN LOCATE THE NEAREST H POINT ON THE PARENT GRID -!*** -!*** - TLAT1=(NROW+1-JMT)*DPH - TLAT2=TLAT1-DPH - TLON1=(NCOL-(P_IDE-1))*DLM - TLON2=TLON1+DLM - DLM1=TLON-TLON1 - DLM2=TLON-TLON2 -! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) -! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1)) - D1=ACOS(DTEMP) - DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2)) - D2=ACOS(DTEMP) - IF(D1.LT.D2)THEN - NROW=NROW+1 ! FIND THE NEAREST H ROW - ELSE - NCOL=NCOL+1 ! FIND THE NEAREST H COLUMN - ENDIF -! WRITE(60,*)'NEAREST PARENT IS:','col=',COL,'row=',ROW,'ncol=',NCOL,'nrow=',NROW - ENDIF - - KROWS=((NROW-1)/2)*IMT - IF(MOD(NROW,2).EQ.1)THEN - K=KROWS+(NCOL+1)/2 - ELSE - K=KROWS+P_IDE-1+NCOL/2 - ENDIF - -!*** -!*** WE NOW KNOW THAT THE INNER GRID POINT IN QUESTION IS -!*** NEAREST TO THE CENTER K AS SEEN BELOW. WE MUST FIND -!*** WHICH OF THE FOUR H-BOXES (OF WHICH THIS H POINT IS -!*** A VERTEX) SURROUNDS THE INNER GRID h POINT IN QUESTION. -!*** -!** -!*** H -!*** -!*** -!*** -!*** H V H -!*** -!*** -!*** h -!*** H V H V H -!*** -!*** -!*** -!*** H V H -!*** -!*** -!*** -!*** H -!*** -!*** -!*** FIND THE SLOPE OF THE LINE CONNECTING h AND THE CENTER H. -!*** - N2R=K/IMT - MK=MOD(K,IMT) -! - IF(MK.EQ.0)THEN - TLATHC=SB+(2*N2R-1)*DPH - ELSE - TLATHC=SB+(2*N2R+(MK-1)/(P_IDE-1))*DPH - ENDIF -! - IF(MK.LE.(P_IDE-1))THEN - TLONHC=WB+2*(MK-1)*DLM - ELSE - TLONHC=WB+(2*(MK-(P_IDE-1))-1)*DLM - ENDIF - -! -!*** EXECUTE CAUTION IF YOU NEED TO CHANGE THESE CONDITIONS. SINCE WE ARE -!*** DEALING WITH SLOPES TO GENERATE DIAMOND SHAPE H BOXES, WE NEED TO BE -!*** CAREFUL HERE -! - - IF(ABS(TLON-TLONHC) .LE. 1.E-4)TLONHC=TLON - IF(ABS(TLAT-TLATHC) .LE. 1.E-4)TLATHC=TLAT - DENOM=(TLON-TLONHC) -! -!*** -!***STORE THE LOCATION OF THE WESTERNMOST VERTEX OF THE H-BOX ON -!***THE OUTER GRID THAT SURROUNDS THE h POINT ON THE INNER GRID. -!*** -!*** COINCIDENT CONDITIONS - - IF(DENOM.EQ.0.0)THEN - - IF(TLATHC.EQ.TLAT)THEN - KOUTB(I,J)=K - IIH(I,J) = NCOL - JJH(I,J) = NROW - TLATHX(I,J)=TLATHC - TLONHX(I,J)=TLONHC - HBWGT1(I,J)=1.0 - HBWGT2(I,J)=0.0 - HBWGT3(I,J)=0.0 - HBWGT4(I,J)=0.0 -! WRITE(60,*)'TRIVIAL SOLUTION' - ELSE ! SAME LONGITUDE BUT DIFFERENT LATS -! - IF(TLATHC .GT. TLAT)THEN ! NESTED POINT SOUTH OF PARENT - KOUTB(I,J)=K-(P_IDE-1) - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW-1 - TLATHX(I,J)=TLATHC-DPH - TLONHX(I,J)=TLONHC-DLM -! WRITE(60,*)'VANISHING SLOPE, -ve: TLATHC-DPH, TLONHC-DLM' - ELSE ! NESTED POINT NORTH OF PARENT - KOUTB(I,J)=K+(P_IDE-1)-1 - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW+1 - TLATHX(I,J)=TLATHC+DPH - TLONHX(I,J)=TLONHC-DLM -! WRITE(60,*)'VANISHING SLOPE, +ve: TLATHC+DPH, TLONHC-DLM' - ENDIF -!*** -!*** -!*** 4 -!*** -!*** h -!*** 1 2 -!*** -!*** 3 -!*** DL 1-4 ARE THE ANGULAR DISTANCES FROM h TO EACH VERTEX - - TLATO=TLATHX(I,J) - TLONO=TLONHX(I,J) - DLM1=TLON-TLONO - DLA1=TLAT-TLATO ! Q -! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q - DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q -! - TLATO=TLATHX(I,J) - TLONO=TLONHX(I,J)+2.*DLM - DLM2=TLON-TLONO - DLA2=TLAT-TLATO ! Q -! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q - DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q -! - TLATO=TLATHX(I,J)-DPH - TLONO=TLONHX(I,J)+DLM - DLM3=TLON-TLONO - DLA3=TLAT-TLATO ! Q -! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q - DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q - - TLATO=TLATHX(I,J)+DPH - TLONO=TLONHX(I,J)+DLM - DLM4=TLON-TLONO - DLA4=TLAT-TLATO ! Q -! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q - DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q - - -! THE BILINEAR WEIGHTS -!*** -!*** - AN3=ATAN2(DLA1,DLM1) ! Q - R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1) - S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1) - R1=R1/DS1 - S1=S1/DS1 - DL1I=(1.-R1)*(1.-S1) - DL2I=R1*S1 - DL3I=R1*(1.-S1) - DL4I=(1.-R1)*S1 -! - HBWGT1(I,J)=DL1I - HBWGT2(I,J)=DL2I - HBWGT3(I,J)=DL3I - HBWGT4(I,J)=DL4I -! - ENDIF - - ELSE -! -!*** NON-COINCIDENT POINTS -! - SLOPE=(TLAT-TLATHC)/DENOM - DSLOPE=NINT(R2D*ATAN(SLOPE)) - - IF(DSLOPE.LE.DSLP0.AND.DSLOPE.GE.-DSLP0)THEN - IF(TLON.GT.TLONHC)THEN -! IF(TLONHC.GE.-WB-DLM)CALL wrf_error_fatal("1H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K - IIH(I,J) = NCOL - JJH(I,J) = NROW - TLATHX(I,J)=TLATHC - TLONHX(I,J)=TLONHC -! WRITE(60,*)'HERE WE GO1: TLATHC, TLONHC' - ELSE -! IF(TLONHC.LE.WB+DLM)CALL wrf_error_fatal("2H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K-1 - IIH(I,J) = NCOL-2 - JJH(I,J) = NROW - TLATHX(I,J)=TLATHC - TLONHX(I,J)=TLONHC -2.*DLM -! WRITE(60,*)'HERE WE GO2: TLATHC, TLONHC -2.*DLM' - ENDIF - -! - ELSEIF(DSLOPE.GT.DSLP0)THEN - IF(TLON.GT.TLONHC)THEN -! IF(TLATHC.GE.-SB-DPH)CALL wrf_error_fatal("3H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K+(P_IDE-1)-1 - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW+1 - TLATHX(I,J)=TLATHC+DPH - TLONHX(I,J)=TLONHC-DLM -! WRITE(60,*)'HERE WE GO3: TLATHC+DPH, TLONHC-DLM' - ELSE -! IF(TLATHC.LE.SB+DPH)CALL wrf_error_fatal("4H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K-(P_IDE-1) - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW-1 - TLATHX(I,J)=TLATHC-DPH - TLONHX(I,J)=TLONHC-DLM -! WRITE(60,*)'HERE WE GO4: TLATHC-DPH, TLONHC-DLM' - ENDIF - -! - ELSEIF(DSLOPE.LT.-DSLP0)THEN - IF(TLON.GT.TLONHC)THEN -! IF(TLATHC.LE.SB+DPH)CALL wrf_error_fatal("5H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K-(P_IDE-1) - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW-1 - TLATHX(I,J)=TLATHC-DPH - TLONHX(I,J)=TLONHC-DLM -! WRITE(60,*)'HERE WE GO5: TLATHC-DPH, TLONHC-DLM' - ELSE -! IF(TLATHC.GE.-SB-DPH)CALL wrf_error_fatal("6H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT") - KOUTB(I,J)=K+(P_IDE-1)-1 - IIH(I,J) = NCOL-1 - JJH(I,J) = NROW+1 - TLATHX(I,J)=TLATHC+DPH - TLONHX(I,J)=TLONHC-DLM -! WRITE(60,*)'HERE WE GO6: TLATHC+DPH, TLONHC-DLM' - ENDIF - ENDIF - -! -!*** NOW WE WILL MOVE AS FOLLOWS: -!*** -!*** -!*** 4 -!*** -!*** -!*** -!*** h -!*** 1 2 -!*** -!*** -!*** -!*** -!*** 3 -!*** -!*** -!*** -!*** DL 1-4 ARE THE ANGULAR DISTANCES FROM h TO EACH VERTEX - - TLATO=TLATHX(I,J) - TLONO=TLONHX(I,J) - DLM1=TLON-TLONO - DLA1=TLAT-TLATO ! Q -! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q - DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q -! - TLATO=TLATHX(I,J) ! redundant computations - TLONO=TLONHX(I,J)+2.*DLM - DLM2=TLON-TLONO - DLA2=TLAT-TLATO ! Q -! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q - DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q -! - TLATO=TLATHX(I,J)-DPH - TLONO=TLONHX(I,J)+DLM - DLM3=TLON-TLONO - DLA3=TLAT-TLATO ! Q -! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q - DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q -! - TLATO=TLATHX(I,J)+DPH - TLONO=TLONHX(I,J)+DLM - DLM4=TLON-TLONO - DLA4=TLAT-TLATO ! Q -! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q - DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q - -! THE BILINEAR WEIGHTS -!*** - AN3=ATAN2(DLA1,DLM1) ! Q - R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1) - S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1) - R1=R1/DS1 - S1=S1/DS1 - DL1I=(1.-R1)*(1.-S1) - DL2I=R1*S1 - DL3I=R1*(1.-S1) - DL4I=(1.-R1)*S1 -! - HBWGT1(I,J)=DL1I - HBWGT2(I,J)=DL2I - HBWGT3(I,J)=DL3I - HBWGT4(I,J)=DL4I -! - ENDIF -! -!*** FINALLY STORE IIH IN TERMS OF E-GRID INDEX -! - IIH(I,J)=NINT(0.5*IIH(I,J)) - - ENDDO - ENDDO - -! -!*** EXTENSION TO NEAREST NEIGHBOR -! - DO J = JTS,MIN(JTE,JDE) !-1) - DO I = ITS,MIN(ITE,IDE) !-1) - NBWGT(1,I,J)=HBWGT1(I,J) - NBWGT(2,I,J)=HBWGT2(I,J) - NBWGT(3,I,J)=HBWGT3(I,J) - NBWGT(4,I,J)=HBWGT4(I,J) - ENDDO - ENDDO - - DO J = JTS,MIN(JTE,JDE) !-1) - DO I = ITS,MIN(ITE,IDE) !-1) - AMAXVAL=0. - DO N=1,4 - AMAXVAL=amax1(NBWGT(N,I,J),AMAXVAL) - ENDDO -! - FLIP=.TRUE. - SUM=0.0 - DO N=1,4 - IF(AMAXVAL .EQ. NBWGT(N,I,J) .AND. FLIP)THEN - NBWGT(N,I,J)=1.0 - FLIP=.FALSE. - ELSE - NBWGT(N,I,J)=0.0 - ENDIF - SUM=SUM+NBWGT(N,I,J) - IF(SUM .GT. 1.0)CALL wrf_error_fatal ( "horizontal interp error - interp_hnear_nmm" ) - ENDDO - - - IF((NBWGT(1,I,J)+NBWGT(2,I,J)+NBWGT(3,I,J)+NBWGT(4,I,J)) .NE. 1)THEN - WRITE(message,*)'------------------------------------------------------------------------' - call wrf_debug(1,message) - WRITE(message,*)'FATAL: SOMETHING IS WRONG WITH THE WEIGHTS IN module_initialize_real.F' - call wrf_debug(1,message) - WRITE(message,*)'------------------------------------------------------------------------' - call wrf_debug(1,message) - STOP - ENDIF - -! WRITE(66,*)I,J,NBWGT(1,I,J),NBWGT(2,I,J),NBWGT(3,I,J),NBWGT(4,I,J) - - ENDDO - ENDDO - - - DO J=MAX(3,JTS),MIN(JTE,JDE) !-1) - DO I=MAX(3,ITS),MIN(ITE,IDE) !-1) - IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 - HRES_SM(I,J) = NBWGT(1,I,J)*SM(IIH(I,J),JJH(I,J) ) & - + NBWGT(2,I,J)*SM(IIH(I,J)+1, JJH(I,J) ) & - + NBWGT(3,I,J)*SM(IIH(I,J), JJH(I,J)-1) & - + NBWGT(4,I,J)*SM(IIH(I,J), JJH(I,J)+1) -! WRITE(68,*)I,J,SM(IIH(I,J),JJH(I,J)),SM(IIH(I,J)+1, JJH(I,J)), & -! SM(IIH(I,J), JJH(I,J)-1),SM(IIH(I,J), JJH(I,J)+1),HRES_SM(I,J) - ELSE - HRES_SM(I,J) = NBWGT(1,I,J)*SM(IIH(I,J), JJH(I,J) ) & - + NBWGT(2,I,J)*SM(IIH(I,J)+1, JJH(I,J) ) & - + NBWGT(3,I,J)*SM(IIH(I,J)+1, JJH(I,J)-1) & - + NBWGT(4,I,J)*SM(IIH(I,J)+1, JJH(I,J)+1) - -! WRITE(68,*)I,J,SM(IIH(I,J),JJH(I,J)),SM(IIH(I,J)+1, JJH(I,J)), & -! SM(IIH(I,J)+1, JJH(I,J)-1),SM(IIH(I,J)+1, JJH(I,J)+1),HRES_SM(I,J) - - ENDIF - - ENDDO - ENDDO -! Boundary treatment in J direction - DO J=MAX(3,JTS),MIN(JTE,JDE) - HRES_SM(2,J)=HRES_SM(3,J) - HRES_SM(1,J)=HRES_SM(2,J) - END DO -! Boundary treatment in J direction and 4 corners - DO I=ITS,MIN(ITE,IDE) - HRES_SM(I,2)=HRES_SM(I,3) - HRES_SM(I,1)=HRES_SM(I,2) - END DO - - - RETURN - END SUBROUTINE G2T2H_hwrf -!======================================================================================== -! end gopal's doing for ocean coupling -!============================================================================================ -#endif -END MODULE module_initialize_ideal diff --git a/dyn_nmm/module_membrane_mslp.F b/dyn_nmm/module_membrane_mslp.F deleted file mode 100644 index d2fb59b7b5..0000000000 --- a/dyn_nmm/module_membrane_mslp.F +++ /dev/null @@ -1,835 +0,0 @@ -module module_membrane_mslp - implicit none - private - -#if ( HWRF == 1 ) - - public :: make_membrane_mslp - - integer, parameter :: npres = 33 - real, parameter :: badheight=-9e9 - - ! NCEP Unified Post standard pressure levels (SLPDEF) used for this - ! membrane MSLP calculation. These are ALL of the post pressure - ! levels up to 200mbar: - real, parameter :: post_stdpres(npres) = (/ 20000., & - 22500., 25000., 27500., 30000., 32500., 35000., 37500., 40000., & - 42500., 45000., 47500., 50000., 52500., 55000., 57500., 60000., & - 62500., 65000., 67500., 70000., 72500., 75000., 77500., 80000., & - 82500., 85000., 87500., 90000., 92500., 95000., 97500.,100000./) - - ! index within post_stdpres of the 850mbar, 700mbar and 500mbar - ! levels, respectively: - integer, parameter :: k850 = 27, k700=21, k500=13 - - ! Pressure "interface" levels, used only for interpolation. These - ! are half-way between pressure levels (post_stdpres) in pressure - ! space (instead of z, Z or density), to match assumptions made in - ! the post's Memberane MSLP calculation: - real, parameter :: post_istdpres(npres+1) = (/ 18750., & - 21250., 23750., 26250., 28750., 31250., 33750., 36250., 38750., & - 41250., 43750., 46250., 48750., 51250., 53750., 56250., 58750., & - 61250., 63750., 66250., 68750., 71250., 73750., 76250., 78750., & - 81250., 83750., 86250., 88750., 91250., 93750., 96250., 98750., & - 101250./) - - ! Constants from the NCEP Unified Post used for interpolation and - ! extrapolation: - real, parameter :: post_H1=1.0 - real, parameter :: post_PQ0=379.90516 - real, parameter :: post_A2=17.2693882 - real, parameter :: post_A3=273.16 - real, parameter :: post_A4=35.86 - real, parameter :: post_D608=0.608 - real, parameter :: post_RD=287.04 - real, parameter :: post_G=9.81 - real, parameter :: post_GAMMA=6.5E-3 - real, parameter :: post_RGAMOG=post_RD*post_GAMMA/post_G - real, parameter :: post_RHmin=1.0E-6 ! minimal RH bound - real, parameter :: post_smallQ=1.E-12 - - real, parameter :: post_slope=-6.6e-4 ! K/km - - REAL, PARAMETER :: old_COEF3=post_RD*post_SLOPE - REAL, PARAMETER :: old_COEF2=-1./old_COEF3 - -contains - - subroutine make_membrane_mslp(grid) - USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid - implicit none - type(domain), intent(inout) :: grid - character*255 :: message - - integer :: IDS,IDE,JDS,JDE,KDS,KDE - integer :: IMS,IME,JMS,JME,KMS,KME - integer :: IPS,IPE,JPS,JPE,KPS,KPE - - ! Make sure the two constant pressure level values are right: -100 format('In module_membrane_mslp, post_stdpres(',A,')=',F0.3,' but should be ',F0.3) - if(abs(post_stdpres(k850)-85000.)>1) then - write(message,100) 'k850',post_stdpres(k850),85000. - call wrf_error_fatal(message) - endif - if(abs(post_stdpres(k700)-70000.)>1) then - write(message,100) 'k850',post_stdpres(k700),70000. - call wrf_error_fatal(message) - endif - - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - call membrane_mslp_impl(grid, & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - end subroutine make_membrane_mslp - - ! ------------------------------------------------------------ - ! BEGIN IMPLEMENTATION - ! ------------------------------------------------------------ - - - ! ------------------------------------------------------------ - ! membrane_mslp_impl - top-level implementation function - subroutine membrane_mslp_impl(grid, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - USE MODULE_DOMAIN, ONLY : domain - USE MODULE_RELAX -#ifdef DM_PARALLEL - USE MODULE_COMM_DM, ONLY : HALO_NMM_MEMBRANE_INTERP_sub - USE MODULE_DM, ONLY: ntasks_x, ntasks_y, mytask, ntasks, local_communicator - use module_dm, only: wrf_dm_minval_real, wrf_dm_maxval_integer -#endif - - implicit none - - type(domain), intent(inout) :: grid - - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: IPS,IPE,JPS,JPE,KPS,KPE - - real :: presTv(ips:ipe,jps:jpe,npres), Pmsl(ips:ipe,jps:jpe) - real :: presZ(ips:ipe,jps:jpe,npres) - - real :: interP(ips:ipe,jps:jpe,npres+1), interZ(ips:ipe,jps:jpe,npres+1) - - logical :: ground_mask(ips:ipe,jps:jpe,npres) - integer :: ground_level(ips:ipe,jps:jpe) - integer :: ipres,i,j,mpres,imin,jmin,k,need_to_relax,imax,jmax - real :: pmin - character*255 :: message - - if(size(grid%p700rv)>1) then - ! Need a halo for winds in order to get vorticity and H point wind magnetudes: -#ifdef DM_PARALLEL -# include "HALO_NMM_MEMBRANE_INTERP.inc" -#endif - endif - - ! UPPER BOUND: MPRES - - ! Find mpres: the lowest pressure that we need to handle. This is - ! mostly for efficiency: we don't need to interpolate or relax - ! anything higher in the atmosphere than the next pressure level - ! above the domain-wide lowest surface pressure: - pmin=9e9 - imin=-99 - jmin=-99 - do j=max(jps,jds),min(jpe,jde-1) - do i=max(ips,ids),min(ipe,ide-1) - pmin=min(pmin,grid%pint(i,j,1)) - imin=i - jmin=j - enddo - enddo -#ifdef DM_PARALLEL - call wrf_dm_minval_real(pmin,imin,jmin) -#endif - - ! FIXME: DON'T HANDLE ANYTHING ABOVE PMIN - ! NOTE: MUST HANDLE TWO LEVELS ABOVE - - ! Step 1: calculate Tv, Q and Z on pressure levels using the same - ! method as the NCEP Unified Post: - call calculate_3D(grid,presTv,presZ,ground_mask,ground_level, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - - ! Step 2: smooth Tv through an overrelaxation method: - - ! Modify the relax mask so that the outermost three rows and - ! columns are always relaxed. This is needed to overcome bad - ! values fed in from the parent every timestep. Setting the mask - ! to true on the boundaries of the domain prevent them from being - ! used as boundaries of the overrelaxation. - - ! (Some of the reasons for boundary issues: The parent and nest - ! terrain will never match because the nest terrain is smoothed on - ! the boundary, and the parent is not. Also, the user may have - ! set a different terrain for different domains in their - ! namelist.wps, in which case you'll get an even worse mismatch. - ! Every time the nest moves, ips terrain changes on the leading - ! and trailing edges of the nest. That causes huge shocks when - ! there are high mountains near the boundaries. If you do a plot - ! of 500mbar geopotential height, it looks like a piece of jello - ! shaking every time the nest moves. Also, there is some - ! weirdness on the lateral boundaries of the MOAD due to the - ! mismatch between GFS terrain (which has its higher spectral - ! components discarded) and the smoothed HWRF terrain.) - - grid%relaxmask=.true. - - ! Now loop over all vertical levels and relax them: - do ipres=npres,1,-1 - ! In the inner regions (all but outermost row & col) set the - ! relaxmask to the ground_mask: - need_to_relax=0 - do j=max(jps,jds+1),min(jde-2,jpe) - do i=max(ips,ids+1),min(ide-2,ipe) - grid%relaxmask(i,j)=ground_mask(i,j,ipres) - if(grid%relaxmask(i,j)) need_to_relax=1 - enddo - enddo - - ! If we do not need to relax any points, we are done. -#ifdef DM_PARALLEL - call wrf_dm_maxval_integer(need_to_relax,imax,jmax) -#endif - if(need_to_relax==0) then - 38 format('end mslp relax loop at ',I0) - write(message,38) ipres - call wrf_debug(2,message) - exit - endif - - ! Store Tv in relaxwork: - do j=jps,min(jde-1,jpe) - do i=ips,min(ide-1,ipe) - grid%relaxwork(i,j)=presTv(i,j,ipres) - enddo - enddo - - ! Overrelax: - call relax4e(grid,0.7,100,2, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - - ! Copy back the modified relaxation mask - do j=jps,min(jde-1,jpe) - do i=ips,min(ide-1,ipe) - ground_mask(i,j,ipres)=grid%relaxmask(i,j) - enddo - enddo - - ! Copy the relaxed values back to Tv: - do j=jps,min(jde-1,jpe) - do i=ips,min(ide-1,ipe) - presTv(i,j,ipres)=grid%relaxwork(i,j) - enddo - enddo - end do - - ! Step 3: Solve for Z on interface levels (pressure space - ! interface levels) using the hydrostatic equation. Once Z=0 is - ! reached, solve for Pmsl. - call calculate_interP(presTv,presZ,grid%Z,Pmsl,grid%PINT, & - grid%T(:,:,1), grid%Q(:,:,1), & - ground_level, ground_mask,grid%fis, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - - ! Copy the MSLP values back to the grid: - do j=jps,min(jde-1,jpe) - do i=ips,min(ide-1,ipe) - grid%membrane_MSLP(i,j)=Pmsl(i,j) - enddo - enddo - - ! Smooth the membrane_mslp values: - call smoothMSLP(grid,1, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - - if(size(grid%p850z)>1) then - ! Copy 700 and 850 mbar heights to their arrays: - do j=max(jds,jps),min(jde-1,jpe) - do i=max(ids,ips),min(ide-1,ipe) - grid%p850z(i,j)=presZ(i,j,k850) - grid%p700z(i,j)=presZ(i,j,k700) - enddo - enddo - endif - - end subroutine membrane_mslp_impl - - subroutine calculate_3D(grid,presTv,presZ,ground_mask,ground_level, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - USE MODULE_DOMAIN, ONLY : domain -#ifdef DM_PARALLEL - USE MODULE_DM, ONLY: ntasks_x, ntasks_y, mytask, ntasks, local_communicator - USE MODULE_COMM_DM, ONLY : HALO_NMM_MEMBRANE_INTERP_sub - use module_dm, only: wrf_dm_maxval_integer -#endif - implicit none - - type(domain), intent(inout) :: grid - - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: IPS,IPE,JPS,JPE,KPS,KPE - - real, intent(inout) :: presTv(ips:ipe,jps:jpe,npres) - real, intent(inout) :: presZ(ips:ipe,jps:jpe,npres) - - logical, intent(inout) :: ground_mask(ips:ipe,jps:jpe,npres) - integer, intent(inout) :: ground_level(ips:ipe,jps:jpe) - - integer :: Tkdest(ips:ipe,jps:jpe), Zkdest(ips:ipe,jps:jpe), Zbottom(ips:ipe,jps:jpe) - integer :: i,j,ks,a,kd,k - real :: weight, TL,QL,PL, tempT, RHL, TVRL, TVRBLO, TBLO,QBLO - - integer,target, dimension(ips:ipe,jps:jpe) :: ks850,ks700,ks500 - real, target,dimension(ips:ipe,jps:jpe) :: dummy1,dummy2 - integer, pointer, dimension(:,:) :: ksX - integer :: nanfound - real, pointer, dimension(:,:) :: preswind,presrv,presu,presv - - real :: Pmass(ips:ipe,jps:jpe,kds:kde) - real :: numsum,densum,modelP1,modelP2,pdiff,presQ,presT,ZL,QSAT, U1, V1, U2, V2, dudy1,dvdx1, dudy2,dvdx2 - character*255 :: message - logical :: wantuv - -#ifdef DM_PARALLEL -# include "HALO_NMM_MEMBRANE_INTERP.inc" -#endif - - ! ks: k in source (model level) array - ! kd: k in destination (pressure level) array - ground_level=0 - ground_mask=.false. - Zkdest=1 - Tkdest=1 - Zbottom=0 - - ks850=0 - ks700=0 - ks500=0 - - ! Interpolate geopotential height to post_stdpres pressure levels - ! and create a temporary array with non-hydrostatic pressure - ! (PINT) on model mass points: - do ks=kde-1,kds,-1 - do j=jps,min(jde-1,jpe) - iZ: do i=ips,min(ide-1,ipe) - Pmass(i,j,ks)=sqrt(grid%PINT(i,j,ks)*grid%PINT(i,j,ks+1)) - enddo iZ - enddo - enddo - - ! Interpolate temperature and specific humidity to post_stdpres - ! pressure levels: - do ks=kde-1,kds+1,-1 - do j=jps,min(jde-1,jpe) - iTQ: do i=ips,min(ide-1,ipe) - kd=Tkdest(i,j) - if(kd<=npres) then - innerTQ: do while(kd<=npres) - if(.not.(post_stdpres(kd)<=Pmass(i,j,ks-1) & - .and. post_stdpres(kd)>=Pmass(i,j,ks))) then - cycle iTQ - endif - weight=log(post_stdpres(kd)/Pmass(i,j,ks))/log(Pmass(i,j,ks-1)/Pmass(i,j,ks)) - - presZ(i,j,kd)=weight*grid%Z(i,j,ks-1) + (1.-weight)*grid%Z(i,j,ks) - - presT=weight*grid%T(i,j,ks-1) + (1.-weight)*grid%T(i,j,ks) - presQ=weight*grid%Q(i,j,ks-1) + (1.-weight)*grid%Q(i,j,ks) - presTv(i,j,kd)=presT*(1.+post_D608*presQ) - - if(kd==k850) then - ks850(i,j)=ks - elseif(kd==k700) then - ks700(i,j)=ks - elseif(kd==k500) then - ks500(i,j)=ks - endif - -103 format('interp ks=',I0,' kd=',I0,' presT(i=',I0,',j=',I0,',kd)=',F0.3, & - ' between T(i,j,ks-1)=',F0.3,' and T(i,j,ks)=', & - F0.3,' using weight=',F0.3) - !write(0,103) ks,kd,i,j,presT,grid%T(i,j,ks-1),grid%T(i,j,ks),weight -104 format(' Pmass(i,j,ks)=',F0.3,' Pmass(i,j,ks-1)=',F0.3,' post_stdpres(kd)=',F0.3) - !write(0,104) Pmass(i,j,ks),Pmass(i,j,ks-1),post_stdpres(kd) - if(weight<0 .or. weight>1) then - write(0,*) 'Bad weight: ',weight - call wrf_error_fatal('bad weight') - endif - kd=kd+1 - Tkdest(i,j)=kd - Zkdest(i,j)=kd - Zbottom(i,j)=ks - end do innerTQ - end if - end do iTQ - end do - end do - - ! Interpolate to regions between the middle of the lowest mass - ! level and the bottom of the atmosphere: - do j=jps,min(jde-1,jpe) - iTQ2: do i=ips,min(ide-1,ipe) - kd=Zkdest(i,j) - if(kd<=npres) then - do while(kd<=npres) - if(.not.(post_stdpres(kd)<=grid%PINT(i,j,kds) & - .and. post_stdpres(kd)>=Pmass(i,j,kds))) then - cycle iTQ2 - endif - - presT=grid%T(i,j,1) - presQ=grid%Q(i,j,1) - presTv(i,j,kd)=presT*(1.+post_D608*presQ) - - weight=log(post_stdpres(kd)/Pmass(i,j,kds))/log(grid%PINT(i,j,kds)/Pmass(i,j,kds)) - presZ(i,j,kd)=(1.-weight)*grid%Z(i,j,1)+weight*grid%fis(i,j)/post_g - - kd=kd+1 - Tkdest(i,j)=kd - Zkdest(i,j)=kd - Zbottom(i,j)=ks - end do - end if - end do iTQ2 - end do - -1234 format('grid ',I0,': size(',A,') = ',I0) - write(message,1234) grid%id,'grid%p700rv',size(grid%p700rv) - call wrf_debug(2,trim(message)) - write(message,1234) grid%id,'grid%p700u',size(grid%p700u) - call wrf_debug(2,trim(message)) - - wantuv=(grid%vortex_tracker == 7) ! do I need to calc. presu & presv? - - ifwind: if(size(grid%p700rv)>1 .or. size(grid%p700u)>1) then - ! Interpolate wind to H points on pressure levels, calculating - ! horizontal wind vector magnitude and vertical component of - ! vorticity. Interpolate only to 700 and 850 mbar, except for U & - ! V which are also interpolated to 500mbar. - nullify(presu) - nullify(presv) - windloop: do k=0,2 - if(k==0) then - ! Only need wind components at 500 mbar - kd=k500 - ksX=>ks500 - preswind=>dummy1 - presrv=>dummy2 - if(wantuv) then - presu=>grid%p500u - presv=>grid%p500v - endif - elseif(k==1) then - ksX=>ks700 - preswind=>grid%p700wind - presrv=>grid%p700rv - kd=k700 - if(wantuv) then - presu=>grid%p700u - presv=>grid%p700v - endif - elseif(k==2) then - ksX=>ks850 - kd=k850 - preswind=>grid%p850wind - presrv=>grid%p850rv - if(wantuv) then - presu=>grid%p850u - presv=>grid%p850v - endif - endif - - ! No wind on boundaries: - if(jps<=jds) then - do i=ips,min(ide-1,ipe) - preswind(i,jds)=0 - presrv(i,jds)=0 - enddo - if(wantuv) then - do i=ips,min(ide-1,ipe) - presu(i,jds)=0 - presv(i,jds)=0 - enddo - endif - endif - if(jpe>=jde-1) then - do i=ips,min(ide-1,ipe) - preswind(i,jde-1)=0 - presrv(i,jde-1)=0 - enddo - if(wantuv) then - do i=ips,min(ide-1,ipe) - presu(i,jde-1)=0 - presv(i,jde-1)=0 - enddo - endif - endif - if(ips<=ids) then - do j=jps,min(jde-1,jpe) - preswind(ids,j)=0 - presrv(ids,j)=0 - enddo - if(wantuv) then - do j=jps,min(jde-1,jpe) - presu(ids,j)=0 - presv(ids,j)=0 - enddo - endif - endif - if(ipe>=ide-1) then - do j=jps,min(jde-1,jpe) - preswind(ide-1,j)=0 - presrv(ide-1,j)=0 - enddo - if(wantuv) then - do j=jps,min(jde-1,jpe) - presu(ide-1,j)=0 - presv(ide-1,j)=0 - enddo - endif - endif - - ! Interpolate winds: - do j=max(jps,jds+2),min(jde-2,jpe) - a=mod(j,2) - do i=max(ips,ids+2),min(ide-2,ipe) - ks=ksX(i,j) - if(ks>1) then - ! Interpolate between mass levels: - weight=log(post_stdpres(kd)/Pmass(i,j,ks))/log(Pmass(i,j,ks-1)/Pmass(i,j,ks)) - - U1=0.25*(grid%u(i,j-1,ks) + grid%u(i,j+1,ks) + grid%u(i-a,j,ks) + grid%u(i+1-a,j,ks)) - V1=0.25*(grid%v(i,j-1,ks) + grid%v(i,j+1,ks) + grid%v(i-a,j,ks) + grid%v(i+1-a,j,ks)) - U2=0.25*(grid%u(i,j-1,ks-1) + grid%u(i,j+1,ks-1) + grid%u(i-a,j,ks-1) + grid%u(i+1-a,j,ks-1)) - V2=0.25*(grid%v(i,j-1,ks-1) + grid%v(i,j+1,ks-1) + grid%v(i-a,j,ks-1) + grid%v(i+1-a,j,ks-1)) - - dvdx1 = (grid%v(i+1-a,j,ks)-grid%v(i-a,j,ks))/(2.*grid%dx_nmm(i,j)) - dudy1 = (grid%u(i,j+1,ks)-grid%u(i,j-1,ks))/(2.*grid%dy_nmm) - dvdx2 = (grid%v(i+1-a,j,ks-1)-grid%v(i-a,j,ks-1))/(2.*grid%dx_nmm(i,j)) - dudy2 = (grid%u(i,j+1,ks-1)-grid%u(i,j-1,ks-1))/(2.*grid%dy_nmm) - - if(wantuv) then - presu(i,j)=weight*u2+(1.-weight)*u1 - presv(i,j)=weight*v2+(1.-weight)*v1 - endif - preswind(i,j)=weight*sqrt(u2*u2+v2*v2) + (1.-weight)*sqrt(u1*u1+v1*v1) - presrv(i,j)=(dvdx2-dudy2)*weight + (dvdx1-dudy1)*(1.-weight) - elseif(post_stdpres(kd)>=Pmass(i,j,kds)) then - ! At and below lowest mass level, use lowest model level winds - ks=1 - U1=0.25*(grid%u(i,j-1,ks) + grid%u(i,j+1,ks) + grid%u(i-a,j,ks) + grid%u(i+1-a,j,ks)) - V1=0.25*(grid%v(i,j-1,ks) + grid%v(i,j+1,ks) + grid%v(i-a,j,ks) + grid%v(i+1-a,j,ks)) - - dvdx1 = (grid%v(i+1-a,j,ks)-grid%v(i-a,j,ks))/(2.*grid%dx_nmm(i,j)) - dudy1 = (grid%u(i,j+1,ks)-grid%u(i,j-1,ks))/(2.*grid%dy_nmm) - - preswind(i,j)=sqrt(u1*u1 + v1*v1) - presrv(i,j)=dvdx1-dudy1 - if(wantuv) then - presu(i,j)=u1 - presv(i,j)=v1 - endif - endif - end do - end do - enddo windloop - - ! Calculate 10m wind magnitude and vorticity - ! NOTE: u10 and v10 are already on H points - nanfound=0 - do j=max(jps,jds+1),min(jpe,jde-2) - a=mod(j,2) - do i=max(ips,ids+1),min(ipe,ide-2) - grid%m10wind(i,j)=sqrt(grid%u10(i,j)*grid%u10(i,j) + grid%v10(i,j)*grid%v10(i,j)) - dvdx1 = 0.5*(grid%v10(i-a+1,j+1)-grid%v10(i-a,j+1) + & - grid%v10(i-a+1,j-1)-grid%v10(i-a,j-1)) / (2*grid%dx_nmm(i,j)) - dudy1 = 0.5*(grid%u10(i-a,j+1)-grid%u10(i-a,j-1) + & - grid%u10(i-a+1,j+1)-grid%u10(i-a+1,j-1)) / (2*grid%dy_nmm) - grid%m10rv(i,j) = dvdx1 - dudy1 - if(grid%m10rv(i,j) == grid%m10rv(i,j)) then - call wrf_debug(1000,'FIXME: REMOVE THIS CHECK') - else -3088 format('NaN m10rv at i=',I0,' j=',I0,': a=',I0,' dx=',F0.3,' dy=',F0.3) - write(message,3088) i,j,a,grid%dx_nmm(i,j),grid%dy_nmm - call wrf_message2(trim(message)) -3089 format('NaN m10rv at i=',I0,' j=',I0,': dvdx1=',F0.5,' dudy=',F0.5) - write(message,3089) i,j,dvdx1,dudy1 - call wrf_message2(trim(message)) - nanfound=1 - endif - enddo - enddo -#ifdef DM_PARALLEL - call wrf_dm_maxval_integer(nanfound,i,j) -#endif - if(nanfound/=0) then - call wrf_error_fatal('ERROR: NaN m10rv seen; aborting.') - endif - elseif(grid%id==3) then - call wrf_error_fatal('ERROR: NOT INTERPOLATING WIND') - endif ifwind - - do j=jps,min(jde-1,jpe) - do i=ips,min(ide-1,ipe) - ground_level(i,j)=min(Zkdest(i,j),Tkdest(i,j)) - enddo - enddo - - do kd=1,npres - do j=jps,min(jde-1,jpe) - do i=ips,min(ide-1,ipe) - ground_mask(i,j,kd) = (kd>=ground_level(i,j)) - enddo - enddo - enddo - - ! Extrapolate below-ground temperature but not height. Fill in - ! badheight for height below ground. - jloop2: do j=jps,min(jde-1,jpe) - iloop2: do i=ips,min(ide-1,ipe) - if(ground_level(i,j)>npres) then -301 format('Extrap: i=',I0,' j=',I0,' NO EXTRAP: ground at ',I0) - !write(0,301) i,j,ground_level(i,j) - cycle iloop2 - else -302 format('Extrap: i=',I0,' j=',I0,' extrap from ',F0.3,' ground at ',I0) - !write(0,302) i,j,post_stdpres(ground_level(i,j)),ground_level(i,j) - endif - kloop2: do kd=ground_level(i,j),npres - ! Extrapolate first guess below-ground values using the - ! exact same method used in the post. Even the constants - ! are copied from the post: - PL=grid%PINT(I,J,2) - ZL=0.5*(grid%Z(I,J,2)+grid%Z(I,J,1)) - TL=0.5*(grid%T(I,J,2)+grid%T(I,J,1)) - QL=0.5*(grid%Q(I,J,2)+grid%Q(I,J,1)) - QSAT=post_PQ0/PL*EXP(post_A2*(TL-post_A3)/(TL-post_A4)) - ! - RHL=QL/QSAT - ! - IF(RHL.GT.1.)THEN - RHL=1. - QL =RHL*QSAT - ENDIF - ! - IF(RHL.LT.post_RHmin)THEN - RHL=post_RHmin - QL =RHL*QSAT - ENDIF - ! - TVRL =TL*(1.+post_D608*QL) - TVRBLO=TVRL*(post_stdpres(kd)/PL)**post_RGAMOG - TBLO =TVRBLO/(1.+post_D608*QL) - - !QSAT=post_PQ0/post_stdpres(kd)*EXP(post_A2*(TBLO-post_A3)/(TBLO-post_A4)) - - !QBLO =RHL*QSAT - !presQ(i,j,kd)=AMAX1(post_smallQ,QBLO) - - presTv(i,j,kd)=TBLO - - ! Extrapolated virtual temperature: - !presTv(i,j,kd)=TBLO*(1.+post_D608*QBLO) - - ! extrapolated temperature, with virtual part removed using extrapolated specific humidity: - !presTv(i,j,kd)=TVRBLO/(1.+post_D608*QBLO) - - ! Below-ground Z is recalcluated after smoothing Tv. We - ! only fill in badval here: - presZ(i,j,kd)=badheight - -303 format('Extrap i=',I0,' j=',I0,' kd=',I0,' presTv=',F0.3,' presZ=',F0.3) -304 format(' TL=',F0.3,' QL=',F0.3,' ZL=',F0.3,' QSAT=',F0.3) -305 format(' TVRL=',F0.3,' TVRBLO=',F0.3,' TBLO=',F0.3,' RHL=',F0.3) - !write(0,303) i,j,kd,presTv(i,j,kd),presZ(i,j,kd) - !write(0,304) TL,QL,ZL,QSAT - !write(0,305) TVRL,TVRBLO,TBLO,RHL - enddo kloop2 - enddo iloop2 - enddo jloop2 - end subroutine calculate_3D - - subroutine calculate_interP( & - presTv,presZ,modelZ,Pmsl,PINT,T1,Q1, & - ground_level,ground_mask,fis, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - USE MODULE_DOMAIN, ONLY : domain - - implicit none - - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: IPS,IPE,JPS,JPE,KPS,KPE - - real, intent(in) :: PINT(ims:ime,jms:jme,kms:kme), modelZ(ims:ime,jms:jme,kms:kme) - real, intent(in) :: T1(ims:ime,jms:jme,1) - real, intent(in) :: Q1(ims:ime,jms:jme,1) - - real, intent(in) :: fis(ims:ime,jms:jme) - real, intent(out) :: Pmsl(ips:ipe,jps:jpe) - real, intent(inout) :: presTv(ips:ipe,jps:jpe,npres) - real, intent(inout) :: presZ(ips:ipe,jps:jpe,npres) - - logical, intent(inout) :: ground_mask(ips:ipe,jps:jpe,npres) - integer, intent(inout) :: ground_level(ips:ipe,jps:jpe) - - real :: Z,midTv,dZ,newZ,P,newP,TVRT,TLYR,DIS,oa,slope - integer :: kp,ip,i,j - - ! What this code does: - - ! For every point where the surface is above Z=0, we start from - ! the lowest above-ground pressure and integrate the hydrostatic - ! equation downward to find P at Z=0. - - ! For points where the surface Z<=0 (surface is at or below sea - ! level), we interpolate to get P at Z=0. - - - ! STEP 1: extrapolate below-ground values - do j=jps,min(jde-1,jpe) - iloop: do i=ips,min(ide-1,ipe) - ! nearground: if(modelZ(i,j,1)<50.0) then - ! Pmsl(i,j)=pint1(i,j,1) - ! method(i,j)=-30 - ! else - if(ground_level(i,j)post_stdpres(npres) .and. modelZ(i,j,1)>0.)then - ! ! Model surface pressure is a higher pressure than the - ! ! highest standard pressure level. Use the model - ! ! fields to extrapolate. - ! TVRT=T1(I,J,1)*(post_H1+post_D608*Q1(I,J,1)) - ! !DIS=modelZ(I,J,2)-modelZ(I,J,1)+0.5*modelZ(I,J,2) ??? - ! DIS=0.5*(modelZ(I,J,2)+modelZ(I,J,1)) - ! TLYR=TVRT-DIS*post_SLOPE*post_G*0.5 - ! Pmsl(I,J)=PINT(I,J,1)*EXP((modelZ(I,J,1))*post_G/(post_RD*TLYR)) - ! ! 1023 format(' use model: TVRT=',F0.3,' DIS=',F0.3,' TLYR=',F0.3,' Pmsl=',F0.3) - ! ! 1024 format(' result: ',F0.3,'*EXP(',F0.3,'/(',F0.3,'*',F0.3'))') - ! ! write(0,1023) TVRT,DIS,TLYR,Pmsl(i,j) - ! ! write(0,1024) PINT(I,J,1),modelZ(I,J,2),post_RD,TLYR - ! method(i,j)=-20 - ! ELSE - ! Highest pressure level (post_stdpres(1)) has a - ! higher pressure than the model surface pressure, so - ! extrapolate using the pressure level values. -1025 format(' use npres: TLYR=',F0.3,' Pmsl=',F0.3) -1026 format(' result: ',F0.3,'/EXP(-',F0.3,'*',F0.3,'/(',F0.3,'*',F0.3,'))') - TLYR=presTv(I,J,npres)-presZ(I,J,npres)*post_SLOPE*post_G*0.5 - Pmsl(I,J)=post_stdpres(npres)/EXP(-presZ(I,J,npres)*post_G/(post_RD*TLYR)) - !oa=0.5*post_SLOPE*post_g*presZ(i,j,npres)/TLYR - !Pmsl(i,j)=post_stdpres(npres)*(1.-oa)**old_coef2 - !write(0,1025) TLYR,Pmsl(I,J) - !write(0,1026) post_stdpres(npres),presZ(I,J,npres),post_G,post_RD,TLYR -! method(i,j)=-10 - ! END IF - ! endif nearground - enddo iloop - enddo - end subroutine calculate_interP - - subroutine smoothMSLP(grid,iterations, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - use module_relax - USE MODULE_DOMAIN, ONLY : domain - implicit none - type(domain), intent(inout) :: grid - integer, intent(in) :: iterations - - integer :: IDS,IDE,JDS,JDE,KDS,KDE - integer :: IMS,IME,JMS,JME,KMS,KME - integer :: IPS,IPE,JPS,JPE,KPS,KPE - integer :: i,j - - do j=jps,min(jde-1,jpe) - do i=ips,min(ide-1,ipe) - grid%relaxmask(i,j)=.true. - grid%relaxwork(i,j)=grid%membrane_mslp(i,j) - enddo - enddo - - call relax4e(grid,0.5,iterations,0, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - - do j=jps,min(jde-1,jpe) - do i=ips,min(ide-1,ipe) - grid%membrane_mslp(i,j)=grid%relaxwork(i,j) - enddo - enddo - - end subroutine smoothMSLP - -#endif -end module module_membrane_mslp diff --git a/dyn_nmm/module_relax.F b/dyn_nmm/module_relax.F deleted file mode 100644 index 9b3a33e012..0000000000 --- a/dyn_nmm/module_relax.F +++ /dev/null @@ -1,221 +0,0 @@ -module module_relax - implicit none -contains - subroutine relax4e(grid,relax_coeff,nrelax,expand, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid -#ifdef DM_PARALLEL - USE MODULE_COMM_DM, ONLY : HALO_NMM_MEMBRANE_RELAX_sub, HALO_NMM_MEMBRANE_MASK_sub - USE MODULE_DM, ONLY: ntasks_x, ntasks_y, mytask, ntasks, local_communicator -#endif - implicit none - type(domain), intent(inout) :: grid - real, intent(in) :: relax_coeff - integer, intent(in) :: nrelax - integer, intent(in) :: expand - - integer :: IDS,IDE,JDS,JDE,KDS,KDE - integer :: IMS,IME,JMS,JME,KMS,KME - integer :: IPS,IPE,JPS,JPE,KPS,KPE - real :: nextvalue(ims:ime,jms:jme) - real :: r,r1 - integer :: i,j,irelax,a,iter - - ! Aliases to simplify the expressions below, we'll use "r" instead - ! of relax_coeff, and r1 instead of 1-r: - r=relax_coeff - r1=1.0-r - - ! Relax all points within "expand" gridpoints of a point that - ! wants to be relaxed: - expand_relax: if(expand>0) then - do j=jps,min(jpe,jde-1) - do i=ips,min(ipe,ide-1) - if(grid%relaxmask(i,j)) then - grid%relaximask(i,j)=1 - else - grid%relaximask(i,j)=0 - endif - enddo - enddo - if(.false.) then - do iter=1,expand -#ifdef DM_PARALLEL -# include "HALO_NMM_MEMBRANE_MASK.inc" -#endif - do j=max(jps,jds+1),min(jpe,jde-2) - a=mod(j,2) - do i=max(ips,ids+1),min(ipe,ide-2) - grid%relaximask(i,j) = grid%relaximask(i,j) + & - grid%relaximask(i-a, j-1) + & - grid%relaximask(i-a, j+1) + & - grid%relaximask(i+1-a, j+1) + & - grid%relaximask(i+1-a, j-1) - enddo - enddo - enddo - endif - do j=jps,min(jpe,jde-1) - do i=ips,min(ipe,ide-1) - if(grid%relaximask(i,j)>0) then - grid%relaxmask(i,j)=.true. - endif - enddo - enddo - endif expand_relax - relaxloop: do irelax=1,nrelax -#ifdef DM_PARALLEL -# include "HALO_NMM_MEMBRANE_RELAX.inc" -#endif - - !$omp parallel do & - !$omp private(i,j,a) - bigj: do j=max(jps,jds+1),min(jpe,jde-2) - a=mod(j,2) - bigi: do i=max(ips,ids+1),min(ipe,ide-2) - if(grid%relaxmask(i,j)) then - nextvalue(i,j) = & - r1 * grid%relaxwork(i,j) + & - r * ( & - grid%relaxwork(i-a, j-1) + & - grid%relaxwork(i-a, j+1) + & - grid%relaxwork(i+1-a,j+1) + & - grid%relaxwork(i+1-a,j-1) )/4. - else - nextvalue(i,j) = grid%relaxwork(i,j) - endif - enddo bigi - enddo bigj - ! Handle boundary points next. - ! SOUTH: - if(jps<=jds) then - j=1 - a=mod(j,2) - !$omp parallel do & - !$omp private(i,j,a) - do i=max(ips,ids+1),min(ipe,ide-2) - if(grid%relaxmask(i,j)) then - nextvalue(i,j) = & - r1 * grid%relaxwork(i,j) + r * & - (grid%relaxwork(i-a, j+1) + grid%relaxwork(i+1-a,j+1) )/2. - else - nextvalue(i,j)=grid%relaxwork(i,j) - endif - enddo - endif - ! NORTH: - if(jpe>=jde-1) then - j=jde-1 - a=mod(j,2) - !$omp parallel do & - !$omp private(i,j,a) - do i=max(ips,ids+1),min(ipe,ide-2) - if(grid%relaxmask(i,j)) then - nextvalue(i,j) = & - r1 * grid%relaxwork(i,j) + r * & - (grid%relaxwork(i-a, j-1) + grid%relaxwork(i+1-a,j-1) )/2. - else - nextvalue(i,j)=grid%relaxwork(i,j) - endif - enddo - endif - ! WEST: - if(ips<=ids) then - i=1 - !$omp parallel do & - !$omp private(i,j,a) - do j=max(jps,jds+1),min(jpe,jde-2) - a=mod(j,2) - if(grid%relaxmask(i,j)) then - nextvalue(i,j) = & - r1 * grid%relaxwork(i,j) + r * & - (grid%relaxwork(i+1-a,j+1) + grid%relaxwork(i+1-a,j-1) )/2. - else - nextvalue(i,j)=grid%relaxwork(i,j) - endif - enddo - endif - ! EAST: - if(ipe>=ide-1) then - i=ide-1 - !$omp parallel do & - !$omp private(i,j,a) - do j=max(jps,jds+1),min(jpe,jde-2) - a=mod(j,2) - if(grid%relaxmask(i,j)) then - nextvalue(i,j) = & - r1 * grid%relaxwork(i,j) + r * & - (grid%relaxwork(i-a,j+1) + grid%relaxwork(i-a,j-1) )/2. - else - nextvalue(i,j)=grid%relaxwork(i,j) - endif - enddo - endif - - ! Finally, handle corner points: - ! SOUTHWEST: - if(ips<=ids .and. jps<=jds) then - if(grid%relaxmask(ids,jds)) then - nextvalue(ids,jds) = & - r1 * grid%relaxwork(ids,jds) + r * & - grid%relaxwork(ids, jds+1) - else - nextvalue(ids,jds)=grid%relaxwork(ids,jds) - end if - endif - ! SOUTHEAST: - if(ipe>=ide-1 .and. jps<=jds) then - if(grid%relaxmask(ide-1,jds)) then - nextvalue(ide-1,jds) = & - r1 * grid%relaxwork(ide-1,jds) + r * & - (grid%relaxwork(ide-1,jds+1) + grid%relaxwork(ide-2,jds))/2. - else - nextvalue(ide-1,jds)=grid%relaxwork(ide-1,jds) - endif - endif - ! NORTHWEST: - if(ips<=ids .and. jpe>=jde-1) then - if(grid%relaxmask(ids,jde-1)) then - a=mod(jde-1,2) - if(a==1) then - nextvalue(ids,jde-1) = & - r1 * grid%relaxwork(ids,jde-1) + r * & - grid%relaxwork(ids,jde-2) - else - nextvalue(ids,jde-1) = & - r1 * grid%relaxwork(ids,jde-1) + r * & - (grid%relaxwork(ids,jde-2) + grid%relaxwork(ids+1,jde-2))/2. - endif - else - nextvalue(ids,jde-1)=grid%relaxwork(ids,jde-1) - endif - endif - ! NORTHEAST: - if(ipe>=ide-1 .and. jpe>=jde-1) then - if(grid%relaxmask(ide-1,jde-1)) then - a=mod(jde-1,2) - if(a==0) then - nextvalue(ide-1,jde-1) = & - r1 * grid%relaxwork(ide-1,jde-1) + r * & - grid%relaxwork(ide-1,jde-2) - else - nextvalue(ide-1,jde-1) = & - r1 * grid%relaxwork(ide-1,jde-1) + r * & - (grid%relaxwork(ide-1,jde-2) + grid%relaxwork(ide-2,jde-2))/2. - endif - else - nextvalue(ide-1,jde-1)=grid%relaxwork(ide-1,jde-1) - endif - endif - - do j=max(jps,jds),min(jpe,jde-1) - a=mod(j,2) - do i=max(ips,ids),min(ipe,ide-1) - grid%relaxwork(i,j)=nextvalue(i,j) - enddo - enddo - enddo relaxloop - end subroutine relax4e -end module module_relax diff --git a/dyn_nmm/module_si_io_nmm.F b/dyn_nmm/module_si_io_nmm.F deleted file mode 100644 index 93050f6815..0000000000 --- a/dyn_nmm/module_si_io_nmm.F +++ /dev/null @@ -1,1885 +0,0 @@ -MODULE module_si_io_nmm - - USE module_optional_input -! USE, intrinsic :: iso_c_binding, only: c_int32_t -! USE module_io_int_idx - - IMPLICIT NONE -!! FROM MODULE_KINDS - -! The numerical data types defined in this module are: -! i_byte - specification kind for byte (1-byte) integer variable -! i_short - specification kind for short (2-byte) integer variable -! i_long - specification kind for long (4-byte) integer variable -! i_llong - specification kind for double long (8-byte) integer variable -! r_single - specification kind for single precision (4-byte) real variable -! r_double - specification kind for double precision (8-byte) real variable -! r_quad - specification kind for quad precision (16-byte) real variable -! -! i_kind - generic specification kind for default integer -! r_kind - generic specification kind for default floating point -! -! -! Integer type definitions below - -! Integer types - integer, parameter, public :: i_byte = selected_int_kind(1) ! byte integer - integer, parameter, public :: i_short = selected_int_kind(4) ! short integer - integer, parameter, public :: i_long = selected_int_kind(8) ! long integer - integer, parameter, private :: llong_t = selected_int_kind(16) ! llong integer - integer, parameter, public :: i_llong = max( llong_t, i_long ) - -! Expected 8-bit byte sizes of the integer kinds - integer, parameter, public :: num_bytes_for_i_byte = 1 - integer, parameter, public :: num_bytes_for_i_short = 2 - integer, parameter, public :: num_bytes_for_i_long = 4 - integer, parameter, public :: num_bytes_for_i_llong = 8 - -! Define arrays for default definition - integer, parameter, private :: num_i_kinds = 4 - integer, parameter, dimension( num_i_kinds ), private :: integer_types = (/ & - i_byte, i_short, i_long, i_llong /) - integer, parameter, dimension( num_i_kinds ), private :: integer_byte_sizes = (/ & - num_bytes_for_i_byte, num_bytes_for_i_short, & - num_bytes_for_i_long, num_bytes_for_i_llong /) - -! Default values -! **** CHANGE THE FOLLOWING TO CHANGE THE DEFAULT INTEGER TYPE KIND *** - integer, parameter, private :: default_integer = 2 ! 1=byte, - ! 2=short, - ! 3=long, - ! 4=llong - integer, parameter, public :: i_kind = integer_types( default_integer ) - integer, parameter, public :: num_bytes_for_i_kind = & - integer_byte_sizes( default_integer ) - - -! Real definitions below - -! Real types - integer, parameter, public :: r_single = selected_real_kind(6) ! single precision - integer, parameter, public :: r_double = selected_real_kind(15) ! double precision - integer, parameter, private :: quad_t = selected_real_kind(20) ! quad precision - integer, parameter, public :: r_quad = max( quad_t, r_double ) - -! Expected 8-bit byte sizes of the real kinds - integer, parameter, public :: num_bytes_for_r_single = 4 - integer, parameter, public :: num_bytes_for_r_double = 8 - integer, parameter, public :: num_bytes_for_r_quad = 16 - -! Define arrays for default definition - integer, parameter, private :: num_r_kinds = 3 - integer, parameter, dimension( num_r_kinds ), private :: real_kinds = (/ & - r_single, r_double, r_quad /) - integer, parameter, dimension( num_r_kinds ), private :: real_byte_sizes = (/ & - num_bytes_for_r_single, num_bytes_for_r_double, & - num_bytes_for_r_quad /) - -! Default values -! **** CHANGE THE FOLLOWING TO CHANGE THE DEFAULT REAL TYPE KIND *** - integer, parameter, private :: default_real = 2 ! 1=single, - ! 2=double, -!! END FROM MODULE_KINDS - - ! Input 3D meteorological fields. - - REAL , DIMENSION(:,:,:) , ALLOCATABLE :: u_input , v_input , & - q_input , t_input - - ! Input 3D LSM fields. - - REAL , DIMENSION(:,:,:) , ALLOCATABLE :: landuse_frac_input , & - soil_top_cat_input , & - soil_bot_cat_input - - REAL, ALLOCATABLE:: htm_in(:,:,:),vtm_in(:,:,:) - - ! Input 2D surface fields. - - REAL , DIMENSION(:,:) , ALLOCATABLE,save :: soilt010_input , soilt040_input , & - soilt100_input , soilt200_input , & - soilm010_input , soilm040_input , & - soilm100_input , soilm200_input , & - psfc_in,pmsl - - REAL , DIMENSION(:,:) , ALLOCATABLE :: lat_wind, lon_wind - - REAL , DIMENSION(:) , ALLOCATABLE :: DETA_in, AETA_in, ETAX_in - REAL , DIMENSION(:) , ALLOCATABLE :: DETA1_in, AETA1_in, ETA1_in - REAL , DIMENSION(:) , ALLOCATABLE :: DETA2_in, AETA2_in, ETA2_in, DFL_in - - REAL , DIMENSION(:,:,:), ALLOCATABLE,save :: st_inputx , sm_inputx, sw_inputx - - ! Local input arrays - - REAL,DIMENSION(:,:),ALLOCATABLE :: dum2d - INTEGER,DIMENSION(:,:),ALLOCATABLE :: idum2d - REAL,DIMENSION(:,:,:),ALLOCATABLE :: dum3d - - LOGICAL , SAVE :: first_time_in = .TRUE. - - INTEGER :: flag_soilt010 , flag_soilt100 , flag_soilt200 , & - flag_soilm010 , flag_soilm100 , flag_soilm200 - -! Some constants to allow simple dimensions in the defined types -! given below. - - INTEGER, PARAMETER :: var_maxdims = 5 - INTEGER, PARAMETER :: max_staggers_xy_new = 4 - INTEGER, PARAMETER :: max_staggers_xy_old = 3 - INTEGER, PARAMETER :: max_staggers_z = 2 - INTEGER, PARAMETER :: max_standard_lats = 4 - INTEGER, PARAMETER :: max_standard_lons = 4 - INTEGER, PARAMETER :: max_fg_variables = 200 - INTEGER, PARAMETER :: max_vertical_levels = 2000 - -! This module defines the items needed for the WRF metadata -! which is broken up into three levels: -! Global metadata: Those things which apply to the -! entire simulation that are -! independent of time, domain, or -! variable -! -! Domain metadata: Those things which apply to -! a single domain (this may -! or may not be time dependent) -! -! Variable metadata: Those things which apply to -! a specific variable at a -! specific time -! -! The variable names and definitions can be -! found in the wrf_metadata spec, which is still -! a living document as coding goes on. The names -! may not match exactly, but you should be able -! to figure things out. -! - - TYPE wrf_var_metadata - CHARACTER (LEN=8) :: name - CHARACTER (LEN=16) :: units - CHARACTER (LEN=80) :: description - INTEGER :: domain_id - INTEGER :: ndim - INTEGER :: dim_val (var_maxdims) - CHARACTER(LEN=4) :: dim_desc (var_maxdims) - INTEGER :: start_index(var_maxdims) - INTEGER :: stop_index(var_maxdims) - INTEGER :: h_stagger_index - INTEGER :: v_stagger_index - CHARACTER(LEN=8) :: array_order - CHARACTER(LEN=4) :: field_type - CHARACTER(LEN=8) :: field_source_prog - CHARACTER(LEN=80) :: source_desc - CHARACTER(LEN=8) :: field_time_type - INTEGER :: vt_date_start - REAL :: vt_time_start - INTEGER :: vt_date_stop - REAL :: vt_time_stop - END TYPE wrf_var_metadata - - TYPE(wrf_var_metadata) :: var_meta , var_info - - TYPE wrf_domain_metadata - INTEGER :: id - INTEGER :: parent_id - CHARACTER(LEN=8) :: dyn_init_src - CHARACTER(LEN=8) :: static_init_src - INTEGER :: vt_date - REAL :: vt_time - INTEGER :: origin_parent_x - INTEGER :: origin_parent_y - INTEGER :: ratio_to_parent - REAL :: delta_x - REAL :: delta_y - REAL :: top_level - INTEGER :: origin_parent_z - REAL :: corner_lats_new(4,max_staggers_xy_new) - REAL :: corner_lons_new(4,max_staggers_xy_new) - REAL :: corner_lats_old(4,max_staggers_xy_old) - REAL :: corner_lons_old(4,max_staggers_xy_old) - INTEGER :: xdim - INTEGER :: ydim - INTEGER :: zdim - END TYPE wrf_domain_metadata - TYPE(wrf_domain_metadata) :: dom_meta - - TYPE wrf_global_metadata - CHARACTER(LEN=80) :: simulation_name - CHARACTER(LEN=80) :: user_desc - INTEGER :: si_version - INTEGER :: analysis_version - INTEGER :: wrf_version - INTEGER :: post_version - CHARACTER(LEN=32) :: map_projection - REAL :: moad_known_lat - REAL :: moad_known_lon - CHARACTER(LEN=8) :: moad_known_loc - REAL :: moad_stand_lats(max_standard_lats) - REAL :: moad_stand_lons(max_standard_lons) - REAL :: moad_delta_x - REAL :: moad_delta_y - CHARACTER(LEN=4) :: horiz_stagger_type - INTEGER :: num_stagger_xy - REAL :: stagger_dir_x_new(max_staggers_xy_new) - REAL :: stagger_dir_y_new(max_staggers_xy_new) - REAL :: stagger_dir_x_old(max_staggers_xy_old) - REAL :: stagger_dir_y_old(max_staggers_xy_old) - INTEGER :: num_stagger_z - REAL :: stagger_dir_z(max_staggers_z) - CHARACTER(LEN=8) :: vertical_coord - INTEGER :: num_domains - INTEGER :: init_date - REAL :: init_time - INTEGER :: end_date - REAL :: end_time - CHARACTER(LEN=4) :: lu_source - INTEGER :: lu_water - INTEGER :: lu_ice - END TYPE wrf_global_metadata - TYPE(wrf_global_metadata) :: global_meta - -CONTAINS - - SUBROUTINE read_si ( grid, file_date_string ) - - USE module_soil_pre - USE module_domain - - IMPLICIT NONE - - TYPE(domain) , INTENT(INOUT) :: grid - CHARACTER (LEN=19) , INTENT(IN) :: file_date_string - - INTEGER :: ids,ide,jds,jde,kds,kde & - ,ims,ime,jms,jme,kms,kme & - ,its,ite,jts,jte,kts,kte - - INTEGER :: i , j , k , loop, IMAX, JMAX - - REAL :: dummy - - CHARACTER (LEN= 8) :: dummy_char - CHARACTER (LEN=256) :: dummy_char_256 - - INTEGER :: ok , map_proj , ok_open - REAL :: pt - INTEGER :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat - - SELECT CASE ( model_data_order ) - CASE ( DATA_ORDER_ZXY ) - kds = grid%sd31 ; kde = grid%ed31 ; - ids = grid%sd32 ; ide = grid%ed32 ; - jds = grid%sd33 ; jde = grid%ed33 ; - - kms = grid%sm31 ; kme = grid%em31 ; - ims = grid%sm32 ; ime = grid%em32 ; - jms = grid%sm33 ; jme = grid%em33 ; - - kts = grid%sp31 ; kte = grid%ep31 ; ! tile is entire patch - its = grid%sp32 ; ite = grid%ep32 ; ! tile is entire patch - jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch - - CASE ( DATA_ORDER_XYZ ) - ids = grid%sd31 ; ide = grid%ed31 ; - jds = grid%sd32 ; jde = grid%ed32 ; - kds = grid%sd33 ; kde = grid%ed33 ; - - ims = grid%sm31 ; ime = grid%em31 ; - jms = grid%sm32 ; jme = grid%em32 ; - kms = grid%sm33 ; kme = grid%em33 ; - - its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch - jts = grid%sp32 ; jte = grid%ep32 ; ! tile is entire patch - kts = grid%sp33 ; kte = grid%ep33 ; ! tile is entire patch - - CASE ( DATA_ORDER_XZY ) - ids = grid%sd31 ; ide = grid%ed31 ; - kds = grid%sd32 ; kde = grid%ed32 ; - jds = grid%sd33 ; jde = grid%ed33 ; - - ims = grid%sm31 ; ime = grid%em31 ; - kms = grid%sm32 ; kme = grid%em32 ; - jms = grid%sm33 ; jme = grid%em33 ; - - its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch - kts = grid%sp32 ; kte = grid%ep32 ; ! tile is entire patch - jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch - - END SELECT - - ! Initialize what soil temperature and moisture is available. - -! write(0,*) 'dum3d I allocs: ', ids,ide-1 -! write(0,*) 'dum3d J allocs: ', jds,jde-1 -! write(0,*) 'dum3d K allocs: ', kds,kde-1 - - flag_st000010 = 0 - flag_st010040 = 0 - flag_st040100 = 0 - flag_st100200 = 0 - flag_sm000010 = 0 - flag_sm010040 = 0 - flag_sm040100 = 0 - flag_sm100200 = 0 - flag_st010200 = 0 - flag_sm010200 = 0 - - flag_soilt010 = 0 - flag_soilt040 = 0 - flag_soilt100 = 0 - flag_soilt200 = 0 - flag_soilm010 = 0 - flag_soilm040 = 0 - flag_soilm100 = 0 - flag_soilm200 = 0 - - flag_sst = 0 - flag_toposoil = 0 - - ! How many soil levels have we found? Well, right now, none. - - num_st_levels_input = 0 - num_sm_levels_input = 0 - st_levels_input = -1 - sm_levels_input = -1 - - ! Get the space for the data if this is the first time here. - - write(6,*) 'enter read_si...first_time_in:: ', first_time_in - - IF ( first_time_in ) THEN - - CLOSE(12) - OPEN ( FILE = 'real_input_nm.global.metadata' , & - UNIT = 12 , & - STATUS = 'OLD' , & - ACCESS = 'SEQUENTIAL' , & - FORM = 'UNFORMATTED' , & - IOSTAT = ok_open ) - - IF ( ok_open .NE. 0 ) THEN - PRINT '(A)','You asked for WRF SI data, but no real_input_nm.global.metadata file exists.' - STOP 'No_real_input_nm.global.metadata_exists' - END IF - - READ(12) global_meta%simulation_name, global_meta%user_desc, & - global_meta%si_version, global_meta%analysis_version, & - global_meta%wrf_version, global_meta%post_version - - REWIND (12) - - IF ( global_meta%si_version .EQ. 1 ) THEN - READ(12) global_meta%simulation_name, global_meta%user_desc, & - global_meta%si_version, global_meta%analysis_version, & - global_meta%wrf_version, global_meta%post_version, & - global_meta%map_projection, global_meta%moad_known_lat, & - global_meta%moad_known_lon, global_meta%moad_known_loc, & - global_meta%moad_stand_lats, global_meta%moad_stand_lons, & - global_meta%moad_delta_x, global_meta%moad_delta_y, & - global_meta%horiz_stagger_type, global_meta%num_stagger_xy, & - global_meta%stagger_dir_x_old, global_meta%stagger_dir_y_old, & - global_meta%num_stagger_z, global_meta%stagger_dir_z, & - global_meta%vertical_coord, global_meta%num_domains, & - global_meta%init_date, global_meta%init_time, & - global_meta%end_date, global_meta%end_time - ELSE IF ( global_meta%si_version .EQ. 2 ) THEN - READ(12) global_meta%simulation_name, global_meta%user_desc, & - global_meta%si_version, global_meta%analysis_version, & - global_meta%wrf_version, global_meta%post_version, & - global_meta%map_projection, global_meta%moad_known_lat, & - global_meta%moad_known_lon, global_meta%moad_known_loc, & - global_meta%moad_stand_lats, global_meta%moad_stand_lons, & - global_meta%moad_delta_x, global_meta%moad_delta_y, & - global_meta%horiz_stagger_type, global_meta%num_stagger_xy, & - global_meta%stagger_dir_x_new, global_meta%stagger_dir_y_new, & - global_meta%num_stagger_z, global_meta%stagger_dir_z, & - global_meta%vertical_coord, global_meta%num_domains, & - global_meta%init_date, global_meta%init_time, & - global_meta%end_date, global_meta%end_time , & - global_meta%lu_source, global_meta%lu_water, global_meta%lu_ice - END IF - CLOSE (12) - - print *,'GLOBAL METADATA' - print *,'global_meta%simulation_name', global_meta%simulation_name - print *,'global_meta%user_desc', global_meta%user_desc - print *,'global_meta%user_desc', global_meta%user_desc - print *,'global_meta%si_version', global_meta%si_version - print *,'global_meta%analysis_version', global_meta%analysis_version - print *,'global_meta%wrf_version', global_meta%wrf_version - print *,'global_meta%post_version', global_meta%post_version - print *,'global_meta%map_projection', global_meta%map_projection - print *,'global_meta%moad_known_lat', global_meta%moad_known_lat - print *,'global_meta%moad_known_lon', global_meta%moad_known_lon - print *,'global_meta%moad_known_loc', global_meta%moad_known_loc - print *,'global_meta%moad_stand_lats', global_meta%moad_stand_lats - print *,'global_meta%moad_stand_lons', global_meta%moad_stand_lons - print *,'global_meta%moad_delta_x', global_meta%moad_delta_x - print *,'global_meta%moad_delta_y', global_meta%moad_delta_y - print *,'global_meta%horiz_stagger_type', global_meta%horiz_stagger_type - print *,'global_meta%num_stagger_xy', global_meta%num_stagger_xy - IF ( global_meta%si_version .EQ. 1 ) THEN - print *,'global_meta%stagger_dir_x', global_meta%stagger_dir_x_old - print *,'global_meta%stagger_dir_y', global_meta%stagger_dir_y_old - ELSE IF ( global_meta%si_version .EQ. 2 ) THEN - print *,'global_meta%stagger_dir_x', global_meta%stagger_dir_x_new - print *,'global_meta%stagger_dir_y', global_meta%stagger_dir_y_new - END IF - print *,'global_meta%num_stagger_z', global_meta%num_stagger_z - print *,'global_meta%stagger_dir_z', global_meta%stagger_dir_z - print *,'global_meta%vertical_coord', global_meta%vertical_coord - print *,'global_meta%num_domains', global_meta%num_domains - print *,'global_meta%init_date', global_meta%init_date - print *,'global_meta%init_time', global_meta%init_time - print *,'global_meta%end_date', global_meta%end_date - print *,'global_meta%end_time', global_meta%end_time - IF ( global_meta%si_version .EQ. 2 ) THEN - print *,'global_meta%lu_source', global_meta%lu_source - print *,'global_meta%lu_water', global_meta%lu_water - print *,'global_meta%lu_ice', global_meta%lu_ice - END IF - print *,' ' - - ! 1D - this is the definition of the vertical coordinate. - - IF (.NOT. ALLOCATED (DETA_in)) ALLOCATE(DETA_in(kds:kde-1)) - IF (.NOT. ALLOCATED (AETA_in)) ALLOCATE(AETA_in(kds:kde-1)) - IF (.NOT. ALLOCATED (ETAX_in)) ALLOCATE(ETAX_in(kds:kde)) - - IF (.NOT. ALLOCATED (DETA1_in)) ALLOCATE(DETA1_in(kds:kde-1)) - IF (.NOT. ALLOCATED (AETA1_in)) ALLOCATE(AETA1_in(kds:kde-1)) - IF (.NOT. ALLOCATED (ETA1_in)) ALLOCATE(ETA1_in(kds:kde)) - - IF (.NOT. ALLOCATED (DETA2_in)) ALLOCATE(DETA2_in(kds:kde-1)) - IF (.NOT. ALLOCATED (AETA2_in)) ALLOCATE(AETA2_in(kds:kde-1)) - IF (.NOT. ALLOCATED (ETA2_in)) ALLOCATE(ETA2_in(kds:kde)) - - IF (.NOT. ALLOCATED (DFL_in)) ALLOCATE(DFL_in(kds:kde)) - - ! 3D met - - IF (.NOT. ALLOCATED (u_input) ) ALLOCATE ( u_input(its:ite,jts:jte,kts:kte) ) - IF (.NOT. ALLOCATED (v_input) ) ALLOCATE ( v_input(its:ite,jts:jte,kts:kte) ) - IF (.NOT. ALLOCATED (q_input) ) ALLOCATE ( q_input(its:ite,jts:jte,kts:kte) ) - IF (.NOT. ALLOCATED (t_input) ) ALLOCATE ( t_input(its:ite,jts:jte,kts:kte) ) - IF (.NOT. ALLOCATED (htm_in) ) ALLOCATE ( htm_in(its:ite,jts:jte,kts:kte) ) - IF (.NOT. ALLOCATED (vtm_in) ) ALLOCATE ( vtm_in(its:ite,jts:jte,kts:kte) ) - - ! 2D pressure fields - - IF (.NOT. ALLOCATED (pmsl) ) ALLOCATE ( pmsl(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (psfc_in) ) ALLOCATE ( psfc_in(its:ite,jts:jte) ) - - ! 2D - for LSM, these are computed from the categorical precentage values. - - ! 2D - for LSM, the various soil temperature and moisture levels that are available. - - IF (.NOT. ALLOCATED (st_inputx)) ALLOCATE (st_inputx(its:ite,jts:jte,num_st_levels_alloc)) - IF (.NOT. ALLOCATED (sm_inputx)) ALLOCATE (sm_inputx(its:ite,jts:jte,num_st_levels_alloc)) - IF (.NOT. ALLOCATED (sw_inputx)) ALLOCATE (sw_inputx(its:ite,jts:jte,num_st_levels_alloc)) - - IF (.NOT. ALLOCATED (soilt010_input) ) ALLOCATE ( soilt010_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilt040_input) ) ALLOCATE ( soilt040_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilt100_input) ) ALLOCATE ( soilt100_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilt200_input) ) ALLOCATE ( soilt200_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilm010_input) ) ALLOCATE ( soilm010_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilm040_input) ) ALLOCATE ( soilm040_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilm100_input) ) ALLOCATE ( soilm100_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilm200_input) ) ALLOCATE ( soilm200_input(its:ite,jts:jte) ) - - IF (.NOT. ALLOCATED (lat_wind) ) ALLOCATE (lat_wind(its:ite,jts:jte)) - IF (.NOT. ALLOCATED (lon_wind) ) ALLOCATE (lon_wind(its:ite,jts:jte)) - - ! Local arrays - IF (.NOT. ALLOCATED (dum2d) ) ALLOCATE (dum2d(IDS:IDE-1,JDS:JDE-1)) - IF (.NOT. ALLOCATED (idum2d) ) ALLOCATE (idum2d(IDS:IDE-1,JDS:JDE-1)) - IF (.NOT. ALLOCATED (dum3d) ) ALLOCATE (dum3d(IDS:IDE-1,JDS:JDE-1,KDS:KDE-1)) - - - END IF - - CLOSE(13) - - write(6,*) 'file_date_string: ', file_date_string - write(6,*) 'opening real_input_nm.d01.'//file_date_string//' as unit 13' - OPEN ( FILE = 'real_input_nm.d01.'//file_date_string , & - UNIT = 13 , & - STATUS = 'OLD' , & - ACCESS = 'SEQUENTIAL' , & - FORM = 'UNFORMATTED' ) - - IF ( global_meta%si_version .EQ. 1 ) THEN - READ (13) dom_meta%id,dom_meta%parent_id,dom_meta%dyn_init_src,& - dom_meta%static_init_src, dom_meta%vt_date, dom_meta%vt_time, & - dom_meta%origin_parent_x, dom_meta%origin_parent_y, & - dom_meta%ratio_to_parent, dom_meta%delta_x, dom_meta%delta_y, & - dom_meta%top_level, dom_meta%origin_parent_z, & - dom_meta%corner_lats_old, dom_meta%corner_lons_old, dom_meta%xdim, & - dom_meta%ydim, dom_meta%zdim - ELSE IF ( global_meta%si_version .EQ. 2 ) THEN - READ (13) dom_meta%id,dom_meta%parent_id,dom_meta%dyn_init_src,& - dom_meta%static_init_src, dom_meta%vt_date, dom_meta%vt_time, & - dom_meta%origin_parent_x, dom_meta%origin_parent_y, & - dom_meta%ratio_to_parent, dom_meta%delta_x, dom_meta%delta_y, & - dom_meta%top_level, dom_meta%origin_parent_z, & - dom_meta%corner_lats_new, dom_meta%corner_lons_new, dom_meta%xdim, & - dom_meta%ydim, dom_meta%zdim - END IF - - print *,'DOMAIN METADATA' - print *,'dom_meta%id=', dom_meta%id - print *,'dom_meta%parent_id=', dom_meta%parent_id - print *,'dom_meta%dyn_init_src=', dom_meta%dyn_init_src - print *,'dom_meta%static_init_src=', dom_meta%static_init_src - print *,'dom_meta%vt_date=', dom_meta%vt_date - print *,'dom_meta%vt_time=', dom_meta%vt_time - print *,'dom_meta%origin_parent_x=', dom_meta%origin_parent_x - print *,'dom_meta%origin_parent_y=', dom_meta%origin_parent_y - print *,'dom_meta%ratio_to_parent=', dom_meta%ratio_to_parent - print *,'dom_meta%delta_x=', dom_meta%delta_x - print *,'dom_meta%delta_y=', dom_meta%delta_y - print *,'dom_meta%top_level=', dom_meta%top_level - print *,'dom_meta%origin_parent_z=', dom_meta%origin_parent_z - IF ( global_meta%si_version .EQ. 1 ) THEN - print *,'dom_meta%corner_lats=', dom_meta%corner_lats_old - print *,'dom_meta%corner_lons=', dom_meta%corner_lons_old - ELSE IF ( global_meta%si_version .EQ. 2 ) THEN - print *,'dom_meta%corner_lats=', dom_meta%corner_lats_new - print *,'dom_meta%corner_lons=', dom_meta%corner_lons_new - END IF - print *,'dom_meta%xdim=', dom_meta%xdim - print *,'dom_meta%ydim=', dom_meta%ydim - print *,'dom_meta%zdim=', dom_meta%zdim - print *,' ' - - ! A simple domain size test. - - -!! relax constraint, as model namelist has +1 for i and j, while -!! si data has true dimensions - - IF ( abs(dom_meta%xdim - (ide-1)) .gt. 1 & - .OR. abs(dom_meta%ydim - (jde-1)) .gt. 1 & - .OR. abs(dom_meta%zdim - (kde-1)) .gt. 1) THEN - PRINT '(A)','Namelist does not match the input data.' - PRINT '(A,3I5,A)','Namelist dimensions =',ide-1,jde-1,kde-1,'.' - PRINT '(A,3I5,A)','Input data dimensions =',dom_meta%xdim,dom_meta%ydim,dom_meta%zdim,'.' - STOP 'Wrong_data_size' - END IF - - ! How about the grid distance? Is it the same as in the namelist? - - IF ( global_meta%si_version .EQ. 1 ) THEN - CALL nl_set_cen_lat ( grid%id , ( dom_meta%corner_lats_old(1,1) + dom_meta%corner_lats_old(2,1) + & - dom_meta%corner_lats_old(3,1) + dom_meta%corner_lats_old(4,1) ) * 0.25 ) - ELSE IF ( ( global_meta%si_version .EQ. 2 ) .AND. ( global_meta%moad_known_loc(1:6) .EQ. 'CENTER' ) ) THEN - CALL nl_set_cen_lat ( grid%id , global_meta%moad_known_lat ) - ELSE IF ( global_meta%si_version .EQ. 2 ) THEN - CALL nl_set_cen_lat ( grid%id , ( dom_meta%corner_lats_new(1,1) + dom_meta%corner_lats_new(2,1) + & - dom_meta%corner_lats_new(3,1) + dom_meta%corner_lats_new(4,1) ) * 0.25 ) - END IF - - -!!! might be trouble here - - CALL nl_set_cen_lon ( grid%id , global_meta%moad_stand_lons(1) ) -!!!!! - write(6,*) 'set_cen_lat... global_meta%moad_stand_lats(1): ', global_meta%moad_stand_lats(1) - CALL nl_set_cen_lat ( grid%id , global_meta%moad_stand_lats(1) ) -!!!!! - CALL nl_set_truelat1 ( grid%id , global_meta%moad_stand_lats(1) ) - CALL nl_set_truelat2 ( grid%id , global_meta%moad_stand_lats(2) ) - - pt = dom_meta%top_level - - IF ( global_meta%map_projection(1:17) .EQ. 'LAMBERT CONFORMAL' ) THEN - map_proj = 1 - ELSE IF ( global_meta%map_projection(1:19) .EQ. 'POLAR STEREOGRAPHIC' ) THEN - map_proj = 2 - ELSE IF ( global_meta%map_projection(1: 8) .EQ. 'MERCATOR' ) THEN - map_proj = 3 - ELSE IF ( global_meta%map_projection(1:14) .EQ. 'ROTATED LATLON' ) THEN - map_proj = 203 !? - ELSE - PRINT '(A,A,A)','Undefined map projection: ',TRIM(global_meta%map_projection(1:20)),'.' - STOP 'Undefined_map_proj_si' - END IF - CALL nl_set_map_proj ( grid%id , map_proj ) - -! write(0,*) 'global_meta%si_version: ', global_meta%si_version -! write(0,*) 'global_meta%lu_source: ', global_meta%lu_source -! write(0,*) 'global_meta%lu_water: ', global_meta%lu_water - IF ( global_meta%si_version .EQ. 1 ) THEN - CALL nl_set_mminlu (grid%id, 'USGS' ) - CALL nl_set_iswater (grid%id, 16 ) - ELSE IF ( global_meta%si_version .EQ. 2 ) THEN - CALL nl_set_mminlu ( grid%id, global_meta%lu_source ) - CALL nl_set_iswater (grid%id, global_meta%lu_water ) - CALL nl_set_isice (grid%id, global_meta%lu_ice ) - END IF - - CALL nl_set_gmt (grid%id, dom_meta%vt_time / 3600. ) - CALL nl_set_julyr (grid%id, dom_meta%vt_date / 1000 ) - CALL nl_set_julday (grid%id, dom_meta%vt_date - ( dom_meta%vt_date / 1000 ) * 1000 ) - - write(6,*) 'start reading from unit 13' - read_all_the_data : DO - - READ (13,IOSTAT=OK) var_info%name, var_info%units, & - var_info%description, var_info%domain_id, var_info%ndim, & - var_info%dim_val, var_info%dim_desc, var_info%start_index, & - var_info%stop_index, var_info%h_stagger_index, var_info%v_stagger_index,& - var_info%array_order, var_info%field_type, var_info%field_source_prog, & - var_info%source_desc, var_info%field_time_type, var_info%vt_date_start, & - var_info%vt_time_start, var_info%vt_date_stop, var_info%vt_time_stop - - IF ( OK .NE. 0 ) THEN - PRINT '(A,A,A)','End of file found for real_input_nm.d01.',file_date_string,'.' - EXIT read_all_the_data - END IF - -! print *,'VARIABLE METADATA' - PRINT '(A,A)','var_info%name=', var_info%name -! print *,'var_info%units=', var_info%units -! print *,'var_info%description=', var_info%description -! print *,'var_info%domain_id=', var_info%domain_id -! print *,'var_info%ndim=', var_info%ndim -! print *,'var_info%dim_val=', var_info%dim_val -! print *,'var_info%dim_desc=', var_info%dim_desc -! print *,'var_info%start_index=', var_info%start_index -! print *,'var_info%stop_index=', var_info%stop_index -! print *,'var_info%h_stagger_index=', var_info%h_stagger_index -! print *,'var_info%v_stagger_index=', var_info%v_stagger_index -! print *,'var_info%array_order=', var_info%array_order -! print *,'var_info%field_type=', var_info%field_type -! print *,'var_info%field_source_prog=', var_info%field_source_prog -! print *,'var_info%source_desc=', var_info%source_desc -! print *,'var_info%field_time_type=', var_info%field_time_type -! print *,'var_info%vt_date_start=', var_info%vt_date_start -! print *,'var_info%vt_time_start=', var_info%vt_time_start -! print *,'var_info%vt_date_stop=', var_info%vt_date_stop -! print *,'var_info%vt_time_stop=', var_info%vt_time_stop - - JMAX=min(JDE-1,JTE) - IMAX=min(IDE-1,ITE) - ! 3D meteorological fields. - -! write(0,*)' read_si var_info%name=',var_info%name(1:8) - - IF ( var_info%name(1:8) .EQ. 'T ' ) THEN - READ (13) dum3d - do k=kts,kte-1 - do j=jts,JMAX - do i=its,IMAX - t_input(i,j,k)=dum3d(i,j,k) - enddo - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'U ' ) THEN - READ (13) dum3d - do k=kts,kte-1 - do j=jts,JMAX - do i=its,IMAX - u_input(i,j,k)=dum3d(i,j,k) - enddo - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'V ' ) THEN - READ (13) dum3d - do k=kts,kte-1 - do j=jts,JMAX - do i=its,IMAX - v_input(i,j,k)=dum3d(i,j,k) - enddo - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'Q ' ) THEN - READ (13) dum3d - do k=kts,kte-1 - do j=jts,JMAX - do i=its,IMAX - q_input(i,j,k)=dum3d(i,j,k) - enddo - enddo - enddo - - ! 3D LSM fields. Don't know the 3rd dimension until we read it in. - - ELSE IF ( var_info%name(1:8) .EQ. 'LANDUSEF' ) THEN - IF ( ( first_time_in ) .AND. ( .NOT. ALLOCATED ( landuse_frac_input) ) ) THEN - ALLOCATE (landuse_frac_input(its:ite,jts:jte,var_info%dim_val(3)) ) - END IF - READ (13) (((dum3d(i,j,k),i=ids,ide-1),j=jds,jde-1),k=1,var_info%dim_val(3)) - do k=1,var_info%dim_val(3) - do j=jts,JMAX - do i=its,IMAX - landuse_frac_input(i,j,k)=dum3d(i,j,k) - enddo - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'SOILCTOP' ) THEN - IF ( ( first_time_in ) .AND. ( .NOT. ALLOCATED ( soil_top_cat_input) ) ) THEN - ALLOCATE (soil_top_cat_input(its:ite,jts:jte,var_info%dim_val(3)) ) - END IF - READ (13) (((dum3d(i,j,k),i=ids,ide-1),j=jds,jde-1),k=1,var_info%dim_val(3)) - do k=1,var_info%dim_val(3) - do j=jts,JMAX - do i=its,IMAX - soil_top_cat_input(i,j,k)=dum3d(i,j,k) - enddo - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'SOILCBOT' ) THEN - IF ( ( first_time_in ) .AND. ( .NOT. ALLOCATED ( soil_bot_cat_input) ) ) THEN - ALLOCATE (soil_bot_cat_input(its:ite,jts:jte,var_info%dim_val(3)) ) - END IF - READ (13) (((dum3d(i,j,k),i=ids,ide-1),j=jds,jde-1),k=1,var_info%dim_val(3)) - do k=1,var_info%dim_val(3) - do j=jts,JMAX - do i=its,IMAX - soil_bot_cat_input(i,j,k)=dum3d(i,j,k) - enddo - enddo - enddo - - ! 2D dry pressure minus ptop. - - ELSE IF ( var_info%name(1:8) .EQ. 'PD ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%pd(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'PSFC ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - psfc_in(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'PMSL ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - pmsl(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'PDTOP ' ) THEN - READ (13) grid%pdtop - - ELSE IF ( var_info%name(1:8) .EQ. 'PT ' ) THEN - READ (13) grid%pt - - ! 2D surface fields. - - ELSE IF ( var_info%name(1:8) .eq. 'GLAT ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%glat(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .eq. 'GLON ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%glon(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .eq. 'LAT_V ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - lat_wind(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .eq. 'LON_V ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - lon_wind(i,j)=dum2d(i,j) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'ST000010' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%st000010(i,j)=dum2d(i,j) - enddo - enddo - flag_st000010 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int2(var_info%name(3:8)) - do j=jts,JMAX - do i=its,IMAX - st_inputx(I,J,num_st_levels_input + 1) = grid%st000010(i,j) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'ST010040' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%st010040(i,j)=dum2d(i,j) - enddo - enddo - flag_st010040 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int2(var_info%name(3:8)) - do j=jts,JMAX - do i=its,IMAX - st_inputx(I,J,num_st_levels_input + 1) = grid%st010040(i,j) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'ST040100' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%st040100(i,j)=dum2d(i,j) - enddo - enddo - flag_st040100 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int2(var_info%name(3:8)) - do j=jts,JMAX - do i=its,IMAX - st_inputx(I,J,num_st_levels_input + 1) = grid%st040100(i,j) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'ST100200' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%st100200(i,j)=dum2d(i,j) - enddo - enddo - flag_st100200 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int2(var_info%name(3:8)) - do j=jts,JMAX - do i=its,IMAX - st_inputx(I,J,num_st_levels_input + 1) = grid%st100200(i,j) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'ST010200' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%st010200(i,j)=dum2d(i,j) - enddo - enddo - flag_st010200 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int2(var_info%name(3:8)) - do j=jts,JMAX - do i=its,IMAX - st_inputx(I,J,num_st_levels_input + 1) = grid%st010200(i,j) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'SM000010' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%sm000010(i,j)=dum2d(i,j) - enddo - enddo - flag_sm000010 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int2(var_info%name(3:8)) - do j=jts,JMAX - do i=its,IMAX - sm_inputx(I,J,num_sm_levels_input + 1) = grid%sm000010(i,j) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'SM010040' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%sm010040(i,j)=dum2d(i,j) - enddo - enddo - flag_sm010040 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int2(var_info%name(3:8)) - do j=jts,JMAX - do i=its,IMAX - sm_inputx(I,J,num_sm_levels_input + 1) = grid%sm010040(i,j) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'SM040100' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%sm040100(i,j)=dum2d(i,j) - enddo - enddo - flag_sm040100 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int2(var_info%name(3:8)) - do j=jts,JMAX - do i=its,IMAX - sm_inputx(I,J,num_sm_levels_input + 1) = grid%sm040100(i,j) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'SM100200' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%sm100200(i,j)=dum2d(i,j) - enddo - enddo - flag_sm100200 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int2(var_info%name(3:8)) - do j=jts,JMAX - do i=its,IMAX - sm_inputx(I,J,num_sm_levels_input + 1) = grid%sm100200(i,j) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'SM010200' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%sm010200(i,j)=dum2d(i,j) - enddo - enddo - flag_sm010200 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int2(var_info%name(3:8)) - do j=jts,JMAX - do i=its,IMAX - sm_inputx(I,J,num_sm_levels_input + 1) = grid%sm010200(i,j) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'SOILT010' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - soilt010_input(i,j)=dum2d(i,j) - enddo - enddo - flag_soilt010 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int1(var_info%name(6:8)) -!mp st_inputx(:,:,num_st_levels_input + 1) = soilt010_input - do j=jts,JMAX - do i=its,IMAX - st_inputx(I,J,num_st_levels_input + 1) = soilt010_input(I,J) - enddo - enddo - write(6,*) 'num_st_levels_input=',num_st_levels_input - ELSE IF ( var_info%name(1:8) .EQ. 'SOILT040' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - soilt040_input(i,j)=dum2d(i,j) - enddo - enddo - flag_soilt040 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int1(var_info%name(6:8)) -!mp st_inputx(:,:,num_st_levels_input + 1) = soilt040_input - do j=jts,JMAX - do i=its,IMAX - st_inputx(I,J,num_st_levels_input + 1) = soilt040_input(I,J) - enddo - enddo - write(6,*) 'num_st_levels_input=',num_st_levels_input - ELSE IF ( var_info%name(1:8) .EQ. 'SOILT100' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - soilt100_input(i,j)=dum2d(i,j) - enddo - enddo - flag_soilt100 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int1(var_info%name(6:8)) -!mp st_inputx(:,:,num_st_levels_input + 1) = soilt100_input - do j=jts,JMAX - do i=its,IMAX - st_inputx(I,J,num_st_levels_input + 1) = soilt100_input(I,J) - enddo - enddo - write(6,*) 'num_st_levels_input=',num_st_levels_input - ELSE IF ( var_info%name(1:8) .EQ. 'SOILT200' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - soilt200_input(i,j)=dum2d(i,j) - enddo - enddo - flag_soilt200 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int1(var_info%name(6:8)) -!mp st_inputx(:,:,num_st_levels_input + 1) = soilt200_input - do j=jts,JMAX - do i=its,IMAX - st_inputx(I,J,num_st_levels_input + 1) = soilt200_input(I,J) - enddo - enddo - write(6,*) 'num_st_levels_input=',num_st_levels_input - ELSE IF ( var_info%name(1:8) .EQ. 'SOILM010' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - soilm010_input(i,j)=dum2d(i,j) - enddo - enddo - flag_soilm010 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int1(var_info%name(6:8)) -!mp sm_inputx(:,:,num_sm_levels_input + 1) = soilm010_input - do j=jts,JMAX - do i=its,IMAX - sm_inputx(I,J,num_sm_levels_input + 1) = soilm010_input(I,J) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'SOILM040' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - soilm040_input(i,j)=dum2d(i,j) - enddo - enddo - flag_soilm040 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int1(var_info%name(6:8)) -!mp sm_inputx(:,:,num_sm_levels_input + 1) = soilm040_input - do j=jts,JMAX - do i=its,IMAX - sm_inputx(I,J,num_sm_levels_input + 1) = soilm040_input(I,J) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'SOILM100' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - soilm100_input(i,j)=dum2d(i,j) - enddo - enddo - flag_soilm100 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int1(var_info%name(6:8)) -!mp sm_inputx(:,:,num_sm_levels_input + 1) = soilm100_input - do j=jts,JMAX - do i=its,IMAX - sm_inputx(I,J,num_sm_levels_input + 1) = soilm100_input(I,J) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'SOILM200' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - soilm200_input(i,j)=dum2d(i,j) - enddo - enddo - flag_soilm200 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int1(var_info%name(6:8)) -!mp sm_inputx(:,:,num_sm_levels_input + 1) = soilm200_input - do j=jts,JMAX - do i=its,IMAX - sm_inputx(I,J,num_sm_levels_input + 1) = soilm200_input(I,J) - enddo - enddo - - ELSE IF ( var_info%name(1:8) .EQ. 'SEAICE ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%xice(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'WEASD ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%weasd(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'CANWAT ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%canwat(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'LANDMASK' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%landmask(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'SKINTEMP' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%nmm_tsk(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'TGROUND ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%tg(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'SOILTB ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%soiltb(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'SST ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%sst(i,j)=dum2d(i,j) - enddo - enddo - flag_sst = 1 - ELSE IF ( var_info%name(1:8) .EQ. 'GREENFRC' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%vegfrc(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'ISLOPE ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%islope(i,j)=nint(dum2d(i,j)) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'GREENMAX' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%greenmax(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'GREENMIN' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%greenmin(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'FIS ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%fis(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'Z0 ' ) THEN -! ELSE IF ( var_info%name(1:8) .EQ. 'STDEV ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%z0(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'CMC ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%cmc(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'HTM ' ) THEN - READ (13) dum3d - do k=kts,kte-1 - do j=jts,JMAX - do i=its,IMAX - htm_in(i,j,k)=dum3d(i,j,k) - enddo - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'VTM ' ) THEN - READ (13) dum3d - do k=kts,kte-1 - do j=jts,JMAX - do i=its,IMAX - vtm_in(i,j,k)=dum3d(i,j,k) - enddo - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'SM ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%sm(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'ALBASE ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%albase(i,j)=dum2d(i,j) - enddo - enddo - ELSE IF ( var_info%name(1:8) .EQ. 'MXSNAL ' ) THEN - READ (13) dum2d - do j=jts,JMAX - do i=its,IMAX - grid%mxsnal(i,j)=dum2d(i,j) - enddo - enddo - - ! 1D vertical coordinate. - - ELSE IF ( var_info%name(1:8) .EQ. 'DETA ' ) THEN - READ(13) DETA_in - ELSE IF ( var_info%name(1:8) .EQ. 'DETA1 ' ) THEN - READ(13) DETA1_in - ELSE IF ( var_info%name(1:8) .EQ. 'DETA2 ' ) THEN - READ(13) DETA2_in - ELSE IF ( var_info%name(1:8) .EQ. 'ETAX ' ) THEN - READ(13) ETAX_in - ELSE IF ( var_info%name(1:8) .EQ. 'ETA1 ' ) THEN - READ(13) ETA1_in - ELSE IF ( var_info%name(1:8) .EQ. 'ETA2 ' ) THEN - READ(13) ETA2_in - ELSE IF ( var_info%name(1:8) .EQ. 'AETA ' ) THEN - READ(13) AETA_in - ELSE IF ( var_info%name(1:8) .EQ. 'AETA1 ' ) THEN - READ(13) AETA1_in - ELSE IF ( var_info%name(1:8) .EQ. 'AETA2 ' ) THEN - READ(13) AETA2_in - ELSE IF ( var_info%name(1:8) .EQ. 'DFL ' ) THEN - READ(13) DFL_in - -! ELSE IF ( var_info%name(1:8) .EQ. 'ETAPHALF' ) THEN -! READ (13) etahalf -! ELSE IF ( var_info%name(1:8) .EQ. 'ETAPFULL' ) THEN -! READ (13) etafull - - ! wrong input data. - - ELSE IF ( var_info%name(1:8) .EQ. 'ZETAFULL' ) THEN - PRINT '(A)','Oops, you put in the height data.' - STOP 'this_is_mass_not_height' - - - ! Stuff that we do not want or need is just skipped over. - - ELSE -print *,'------------------> skipping ', var_info%name(1:8) - READ (13) dummy - END IF - - END DO read_all_the_data - - CLOSE (13) - - first_time_in = .FALSE. - -!new - sw_inputx=0. -!new - - do k=kts,kte-1 - do j=jts,JMAX - do i=its,IMAX - grid%U(I,J,K)=U_input(I,J,K) - grid%V(I,J,K)=V_input(I,J,K) - grid%T(I,J,K)=T_input(I,J,K) - grid%Q(I,J,K)=Q_input(I,J,K) - enddo - enddo - enddo - -! write(0,*) 'size sw_input: ', size(sw_input,dim=1),size(sw_input,dim=2),size(sw_input,dim=3) -! write(0,*) 'size sw_inputx: ', size(sw_inputx,dim=1),size(sw_inputx,dim=2),size(sw_inputx,dim=3) - sw_input=0. - -! write(0,*) 'maxval st_inputx(1): ', maxval(st_input(:,:,1)) -! write(0,*) 'maxval st_inputx(2): ', maxval(st_input(:,:,2)) -! write(0,*) 'maxval st_inputx(3): ', maxval(st_input(:,:,3)) -! write(0,*) 'maxval st_inputx(4): ', maxval(st_input(:,:,4)) - - - do J=JTS,min(JDE-1,JTE) - do K=1,num_st_levels_alloc - do I=ITS,min(IDE-1,ITE) - st_input(I,K,J)=st_inputx(I,J,K) - sm_input(I,K,J)=sm_inputx(I,J,K) - sw_input(I,K,J)=sw_inputx(I,J,K) - enddo - enddo - enddo - -! write(0,*) 'maxval st_input(1): ', maxval(st_input(:,1,:)) -! write(0,*) 'maxval st_input(2): ', maxval(st_input(:,2,:)) -! write(0,*) 'maxval st_input(3): ', maxval(st_input(:,3,:)) -! write(0,*) 'maxval st_input(4): ', maxval(st_input(:,4,:)) - - - num_veg_cat = SIZE ( grid%landusef , DIM=2 ) - num_soil_top_cat = SIZE ( grid%soilctop , DIM=2 ) - num_soil_bot_cat = SIZE ( grid%soilcbot , DIM=2 ) - - do J=JTS,min(JDE-1,JTE) - do K=1,num_soil_top_cat - do I=ITS,min(IDE-1,ITE) - grid%SOILCTOP(I,K,J)=soil_top_cat_input(I,J,K) - grid%SOILCTOP_gc(I,J,K)=soil_top_cat_input(I,J,K) - enddo - enddo - enddo - - do J=JTS,min(JDE-1,JTE) - do K=1,num_soil_bot_cat - do I=ITS,min(IDE-1,ITE) - grid%SOILCBOT(I,K,J)=soil_bot_cat_input(I,J,K) - grid%SOILCBOT_gc(I,J,K)=soil_bot_cat_input(I,J,K) - enddo - enddo - enddo - - do J=JTS,min(JDE-1,JTE) - do K=1,num_veg_cat - do I=ITS,min(IDE-1,ITE) - grid%LANDUSEF(I,K,J)=landuse_frac_input(I,J,K) - grid%LANDUSEF_gc(I,J,K)=landuse_frac_input(I,J,K) - enddo - enddo - enddo - - - do K=KDS,KDE - grid%ETAX(K)=ETAX_in(KDE-K+1) - grid%ETA1(K)=ETA1_in(KDE-K+1) - grid%ETA2(K)=ETA2_in(KDE-K+1) - grid%DFL(K)=DFL_in(KDE-K+1) - enddo - - do K=KDS,KDE-1 - grid%DETA(K)=DETA_in(KDE-K) - grid%DETA1(K)=DETA1_in(KDE-K) - grid%DETA2(K)=DETA2_in(KDE-K) - grid%AETA(K)=AETA_in(KDE-K) - grid%AETA1(K)=AETA1_in(KDE-K) - grid%AETA2(K)=AETA2_in(KDE-K) - enddo - - END SUBROUTINE read_si - -! ------------------------------------------------------------ -! ------------------------------------------------------------ -! ------------------------------------------------------------ -! ------------------------------------------------------------ -! ------------------------------------------------------------ -! ------------------------------------------------------------ - -#if defined ( NO_IEEE_MODULE ) - SUBROUTINE read_wps ( grid, filename, file_date_string, num_metgrid_levels ) - - USE module_domain - - IMPLICIT NONE - -#if defined(DM_PARALLEL) && !defined(STUBMPI) - INCLUDE "mpif.h" -#endif - - TYPE(domain) , INTENT(INOUT) :: grid - CHARACTER (*) , INTENT(IN) :: filename - CHARACTER (LEN=19) , INTENT(IN) :: file_date_string !not used - INTEGER , INTENT(IN) :: num_metgrid_levels - - END SUBROUTINE read_wps -#else - SUBROUTINE read_wps ( grid, filename, file_date_string, num_metgrid_levels ) - - USE module_soil_pre - USE module_domain - USE module_io_int_idx, only: io_int_index, r_info - USE module_io_int_read, only: io_int_fetch_data - - IMPLICIT NONE - -#if defined(DM_PARALLEL) && !defined(STUBMPI) - INCLUDE "mpif.h" -#endif - - TYPE(domain) , INTENT(INOUT) :: grid - CHARACTER (*) , INTENT(IN) :: filename - CHARACTER (LEN=19) , INTENT(IN) :: file_date_string !not used - INTEGER , INTENT(IN) :: num_metgrid_levels - CHARACTER (LEN=19) :: VarName - CHARACTER (LEN=150) :: chartemp - CHARACTER (LEN=256) :: mminlu_loc, message - - INTEGER :: ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte - - INTEGER :: i , j , k , IMAX, JMAX - INTEGER :: iunit, ierr - - REAL :: garb - INTEGER :: igarb - INTEGER :: num_veg_cat, num_gfrac, & - num_soil_top_cat , num_soil_bot_cat - - type(r_info), pointer :: r(:) => NULL() - - - CALL get_ijk_from_grid (grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - its, ite, jts, jte, kts, kte ) - IMAX=min(IDE-1,ITE) - JMAX=min(JDE-1,JTE) - - mminlu_loc='' - - ! Initialize what soil temperature and moisture is available. - flag_st000010 = 0 - flag_st010040 = 0 - flag_st010200 = 0 - flag_st040100 = 0 - flag_st100200 = 0 - - flag_sm000010 = 0 - flag_sm010040 = 0 - flag_sm010200 = 0 - flag_sm040100 = 0 - flag_sm100200 = 0 - - flag_soilt010 = 0 - flag_soilt040 = 0 - flag_soilt100 = 0 - flag_soilt200 = 0 - - flag_soilm010 = 0 - flag_soilm040 = 0 - flag_soilm100 = 0 - flag_soilm200 = 0 - - flag_sst = 0 - flag_toposoil = 0 - - ! How many soil levels have we found? Well, right now, none. - num_st_levels_input = 0 - num_sm_levels_input = 0 - st_levels_input = -1 - sm_levels_input = -1 - - num_soil_top_cat = SIZE(grid%soilctop_gc, DIM=3) - num_soil_bot_cat = SIZE(grid%soilcbot_gc, DIM=3) - num_gfrac = SIZE(grid%greenfrac_gc, DIM=3) - - ! Get the space for the data if this is the first time here. - - IF (.NOT. ALLOCATED (pmsl) ) ALLOCATE ( pmsl(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (psfc_in) ) ALLOCATE ( psfc_in(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (st_inputx)) ALLOCATE (st_inputx(its:ite,jts:jte,num_st_levels_alloc)) - IF (.NOT. ALLOCATED (sm_inputx)) ALLOCATE (sm_inputx(its:ite,jts:jte,num_st_levels_alloc)) - IF (.NOT. ALLOCATED (sw_inputx)) ALLOCATE (sw_inputx(its:ite,jts:jte,num_st_levels_alloc)) - IF (.NOT. ALLOCATED (soilt010_input) ) ALLOCATE ( soilt010_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilt040_input) ) ALLOCATE ( soilt040_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilt100_input) ) ALLOCATE ( soilt100_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilt200_input) ) ALLOCATE ( soilt200_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilm010_input) ) ALLOCATE ( soilm010_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilm040_input) ) ALLOCATE ( soilm040_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilm100_input) ) ALLOCATE ( soilm100_input(its:ite,jts:jte) ) - IF (.NOT. ALLOCATED (soilm200_input) ) ALLOCATE ( soilm200_input(its:ite,jts:jte) ) - - ! Create an index for the file - call io_int_index(filename, r, ierr) - if (ierr .ne. 0) then - call wrf_error_fatal("Error obtaining index") - return - end if - -#if defined(DM_PARALLEL) && !defined(STUBMPI) - call mpi_file_open(mpi_comm_world, trim(filename), & - mpi_mode_rdonly, mpi_info_null, & - iunit, ierr) - if (ierr /= 0) then - write(message,*) 'Error opening ', trim(filename), & - 'with MPI IO code: ', ierr - call wrf_error_fatal3(__FILE__, __LINE__, message) - end if -#else - iunit = 33 - open(unit=iunit, file=trim(filename), iostat=ierr, & - access='stream') - if (ierr /= 0) then - write(message,*) 'Error opening ', trim(filename), & - 'with stream access: ', ierr - call wrf_error_fatal3(__FILE__, __LINE__, message) - end if -#endif - - call io_int_fetch_data(iunit, r, 'CEN_LAT', garb, ierr) - call nl_set_cen_lat(grid%id , garb) - - call io_int_fetch_data(iunit, r, 'CEN_LON', garb, ierr) - call nl_set_cen_lon(grid%id , garb) - call nl_set_stand_lon(grid%id , garb) - - call io_int_fetch_data(iunit, r, 'TRUELAT1', garb, ierr) - call nl_set_truelat1(grid%id , garb) - - call io_int_fetch_data(iunit, r, 'TRUELAT2', garb, ierr) - call nl_set_truelat2(grid%id , garb) - - call io_int_fetch_data(iunit, r, 'MAP_PROJ', igarb, ierr) - call nl_set_map_proj(grid%id , igarb) - - call io_int_fetch_data(iunit, r, 'NUM_LAND_CAT', num_veg_cat, ierr) - - call io_int_fetch_data(iunit, r, 'ISWATER', igarb, ierr) - call nl_set_iswater(grid%id, igarb) - - call io_int_fetch_data(iunit, r, 'ISICE', igarb, ierr) - call nl_set_isice(grid%id, igarb) - - call io_int_fetch_data(iunit, r, 'ISLAKE', igarb, ierr) - call nl_set_islake(grid%id, igarb) - - call io_int_fetch_data(iunit, r, 'FLAG_SNOWH', flag_snowh, ierr) - - call io_int_fetch_data(iunit, r, 'MMINLU', mminlu_loc, ierr) - call nl_set_mminlu(grid%id, mminlu_loc) - -! call io_int_fetch_data(iunit, 'NUM_METGRID_SOIL_LEVELS', igarb, ierr) - - call io_int_fetch_data(iunit, r, 'PRES', & - grid%p_gc(its:imax, jts:jmax, kts:num_metgrid_levels),& - ierr) - - call io_int_fetch_data(iunit, r, 'GHT', & - grid%ght_gc(its:imax, jts:jmax, kts:num_metgrid_levels),& - ierr) - - call io_int_fetch_data(iunit, r, 'SNOWH', & - grid%snowh(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'SNOW', & - grid%snow(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'SKINTEMP', & - grid%tsk_gc(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'SOILHGT', & - grid%toposoil(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'SEAICE', & - grid%xice_gc(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'ST100200', & - grid%st100200(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'ST040100', & - grid%st040100(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'ST010040', & - grid%st010040(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'ST000010', & - grid%st000010(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'SM100200', & - grid%sm100200(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'SM040100', & - grid%sm040100(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'SM010040', & - grid%sm010040(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'SM000010', & - grid%sm000010(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'PSFC', & - grid%psfc(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'RH', & - grid%rh_gc(its:imax, jts:jmax, kts:num_metgrid_levels),& - ierr) - - call io_int_fetch_data(iunit, r, 'VV', & - grid%v_gc(its:imax, jts:jmax, kts:num_metgrid_levels),& - ierr) - - call io_int_fetch_data(iunit, r, 'UU', & - grid%u_gc(its:imax, jts:jmax, kts:num_metgrid_levels),& - ierr) - - call io_int_fetch_data(iunit, r, 'TT', & - grid%t_gc(its:imax, jts:jmax, kts:num_metgrid_levels),& - ierr) - - call io_int_fetch_data(iunit, r, 'SNOALB', & - grid%snoalb(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'GREENFRAC', & - grid%greenfrac_gc(its:imax, jts:jmax, kts:num_gfrac), & - ierr) - - call io_int_fetch_data(iunit, r, 'ALBEDO12M', & - grid%albedo12m_gc(its:imax, jts:jmax, kts:num_gfrac), & - ierr) - - call io_int_fetch_data(iunit, r, 'SOILCBOT', & - grid%soilcbot_gc(its:imax, jts:jmax, kts:num_soil_bot_cat),& - ierr) - - call io_int_fetch_data(iunit, r, 'SOILCTOP', & - grid%soilctop_gc(its:imax, jts:jmax, kts:num_soil_bot_cat),& - ierr) - - call io_int_fetch_data(iunit, r, 'SOILTEMP', & - grid%tmn_gc(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HGT_V', & - grid%htv_gc(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HGT_M', & - grid%ht_gc(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HZMAX', & - grid%hzmax(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HANGL', & - grid%hangl(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HSLOP', & - grid%hslop(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HLENNW', & - grid%hlennw(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HLENSW', & - grid%hlensw(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HLENS', & - grid%hlens(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HLENW', & - grid%hlenw(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HASYNW', & - grid%hasynw(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HASYSW', & - grid%hasysw(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HASYS', & - grid%hasys(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HASYW', & - grid%hasyw(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HSTDV', & - grid%hstdv(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'HCNVX', & - grid%hcnvx(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'LU_INDEX', & - grid%lu_index(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'LANDUSEF', & - grid%landusef_gc(its:imax, jts:jmax, kts:num_veg_cat),& - ierr) - - call io_int_fetch_data(iunit, r, 'LANDMASK', & - grid%landmask(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'XLONG_V', & - grid%vlon_gc(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'XLAT_V', & - grid%vlat_gc(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'XLONG_M', & - grid%hlon_gc(its:imax, jts:jmax), & - ierr) - - call io_int_fetch_data(iunit, r, 'XLAT_M', & - grid%hlat_gc(its:imax, jts:jmax), & - ierr) - -! These variables are NOT in the WPS file.... -! call io_int_fetch_data(iunit, r, 'VEGCAT', & -! grid%vegcat(its:imax, jts:jmax), & -! ierr) -! -! call io_int_fetch_data(iunit, r, 'SOIL_CAT', & -! grid%input_soil_cat(its:imax, jts:jmax), & -! ierr) -! -! call io_int_fetch_data(iunit, r, 'CANWAT', & -! grid%canwat(its:imax, jts:jmax), & -! ierr) -! call io_int_fetch_data(iunit, r, 'SOILCAT', & -! grid%soilcat(its:imax, jts:jmax), & -! ierr) - -#if defined(DM_PARALLEL) && !defined(STUBMPI) - call mpi_file_close(iunit, ierr) -#else - close(iunit) -#endif - - varName='ST000010' - flag_st000010 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int2(varName(3:8)) - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - st_inputx(I,J,num_st_levels_input + 1) = grid%st000010(i,j) - ENDDO - ENDDO - - varName='ST010040' - flag_st010040 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int2(varName(3:8)) - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - st_inputx(I,J,num_st_levels_input + 1) = grid%st010040(i,j) - ENDDO - ENDDO - - varName='ST040100' - flag_st040100 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int2(varName(3:8)) - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - st_inputx(I,J,num_st_levels_input + 1) = grid%st040100(i,j) - ENDDO - ENDDO - - varName='ST100200' - flag_st100200 = 1 - num_st_levels_input = num_st_levels_input + 1 - st_levels_input(num_st_levels_input) = char2int2(varName(3:8)) - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - st_inputx(I,J,num_st_levels_input + 1) = grid%st100200(i,j) - ENDDO - ENDDO - - varName='SM000010' - flag_sm000010 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int2(varName(3:8)) - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - sm_inputx(I,J,num_sm_levels_input + 1) = grid%sm000010(i,j) - ENDDO - ENDDO - - varName='SM010040' - flag_sm010040 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int2(varName(3:8)) - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - sm_inputx(I,J,num_sm_levels_input + 1) = grid%sm010040(i,j) - ENDDO - ENDDO - - varName='SM040100' - flag_sm040100 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int2(varName(3:8)) - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - sm_inputx(I,J,num_sm_levels_input + 1) = grid%sm040100(i,j) - ENDDO - ENDDO - - varName='SM100200' - flag_sm100200 = 1 - num_sm_levels_input = num_sm_levels_input + 1 - sm_levels_input(num_sm_levels_input) = char2int2(varName(3:8)) - DO J=JTS,min(JTE,JDE-1) - DO I=ITS,min(ITE,IDE-1) - sm_inputx(I,J,num_sm_levels_input + 1) = grid%sm100200(i,j) - ENDDO - ENDDO - - flag_sst = 1 - sw_inputx = 0. - sw_input = 0. - - - do J=JTS,min(JDE-1,JTE) - do K=1,num_st_levels_alloc - do I=ITS,min(IDE-1,ITE) - st_input(I,K,J)=st_inputx(I,J,K) - sm_input(I,K,J)=sm_inputx(I,J,K) - sw_input(I,K,J)=sw_inputx(I,J,K) - enddo - enddo - enddo - - end subroutine read_wps -#endif - -END MODULE module_si_io_nmm diff --git a/dyn_nmm/module_swath.F b/dyn_nmm/module_swath.F deleted file mode 100644 index a43de20450..0000000000 --- a/dyn_nmm/module_swath.F +++ /dev/null @@ -1,395 +0,0 @@ -module module_swath -#if ( HWRF == 1 ) - -#ifdef DM_PARALLEL - use module_dm, only: wrf_dm_sum_integer, local_communicator, & - getrealmpitype -#endif - use module_domain, only : domain,get_ijk_from_grid - use module_state_description, only: vt_ncep_2013, vt_ncep_2014 - - implicit none - - private - - public :: update_interest, init_swath, sustained_wind, check_for_kid_move - -contains - - subroutine init_swath(grid,config_flags,init,reinit) - USE MODULE_CONFIGURE, ONLY : grid_config_rec_type - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - logical, intent(in) :: init ! .true. = first initialization in wrf.exe, non-restart run - logical, intent(in) :: reinit ! .true. = first initialization in this execution of wrf.exe (may be restart) - character*255 :: message - if(init) then -3088 format('Grid ',I0,' is resetting swath data.') - write(message,3088) grid%id - call wrf_message(message) - if(size(grid%interesting)>1) grid%interesting=0 - if(size(grid%precip_swath)>1) grid%precip_swath=0 - if(size(grid%windsq_swath)>1) grid%windsq_swath=0 - if(size(grid%suswind)>1) grid%suswind=0 - if(size(grid%suswind_swath)>1) grid%suswind_swath=0 - if(size(grid%wind10_ratio)>1) grid%wind10_ratio=1 - grid%suswind_time=0 - endif - if(reinit) then -3000 format('Grid ',I0,' is resetting wind sustainment timer.') - write(message,3000) grid%id - call wrf_message(message) - grid%suswind_time=0 - endif - end subroutine init_swath - - subroutine sustained_wind(grid,config_flags,ips,ipe,jps,jpe,turbl_step) - USE MODULE_CONFIGURE, ONLY : grid_config_rec_type - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer, intent(in) :: ips,ipe,jps,jpe - logical, intent(in) :: turbl_step ! .true. = PBL and surface layer just called - integer :: i,j - real :: windsq, wind10sq, maxsus,minsus - if(size(grid%wind10_ratio)<=1) return - - update_sustained: if(turbl_step) then - ! Update ratio of wind and use 10m wind to update sustained - ! wind calculation - !write(0,*) 'Update wind10_ratio and sustain wind with 10m wind.' - maxsus=-999 - minsus=999 - do j=jps,jpe - do i=ips,ipe - windsq=grid%u(i,j,1)*grid%u(i,j,1) + grid%v(i,j,1)*grid%v(i,j,1) - wind10sq=grid%u10(i,j)*grid%u10(i,j) + grid%v10(i,j)*grid%v10(i,j) - if(wind10sq<1e-12) then - grid%wind10_ratio(i,j)=1.0 - else - grid%wind10_ratio(i,j)=sqrt(windsq/wind10sq) - endif - if(grid%suswind_time>1e-5 .and. grid%suswind(i,j)>1e-3) then - grid%suswind(i,j)=min(grid%suswind(i,j),sqrt(wind10sq)) - else - grid%suswind(i,j)=sqrt(wind10sq) - endif - maxsus=max(grid%suswind(i,j),maxsus) - minsus=min(grid%suswind(i,j),minsus) - enddo - enddo - !write(0,*) 'suswind range:',maxsus,minsus - else - ! Use lowest model level wind adjusted by previous TURBL step - ! wind ratio to update sustained wind calculation. - !write(0,*) 'Update sustain wind with lowest model level wind and wind10_ratio.' - maxsus=-999 - minsus=999 - do j=jps,jpe - do i=ips,ipe - windsq=grid%u(i,j,1)*grid%u(i,j,1) + grid%v(i,j,1)*grid%v(i,j,1) - if(grid%wind10_ratio(i,j)>1e-3) then - wind10sq=windsq/grid%wind10_ratio(i,j) - else - wind10sq=windsq - endif - if(grid%suswind_time>1e-5 .and. grid%suswind(i,j)>1e-3) then - grid%suswind(i,j)=min(grid%suswind(i,j),sqrt(wind10sq)) - else - grid%suswind(i,j)=sqrt(wind10sq) - endif - maxsus=max(grid%suswind(i,j),maxsus) - minsus=min(grid%suswind(i,j),minsus) - enddo - enddo - !write(0,*) 'suswind range:',maxsus,minsus - end if update_sustained - - ! Update wind sustainment time and maximum sustained wind swath: - grid%suswind_time = grid%suswind_time + grid%dt - - !write(0,*) 'add to suswind_time: ',grid%dt - - ! FIXME: grid%suswind_accum_time - update_swath: if(grid%suswind_time>60.0) then - !write(0,*) 'update suswind_swath with max of itself and suswind' - maxsus=-999 - minsus=999 - do j=jps,jpe - do i=ips,ipe - if(grid%interesting(i,j)/=0) then - grid%suswind_swath(i,j)=max(grid%suswind(i,j),grid%suswind_swath(i,j)) - endif - wind10sq=grid%u10(i,j)*grid%u10(i,j) + grid%v10(i,j)*grid%v10(i,j) - grid%suswind(i,j)=sqrt(wind10sq) - maxsus=max(grid%suswind(i,j),maxsus) - minsus=min(grid%suswind(i,j),minsus) - enddo - enddo - grid%suswind_time=0 - !write(0,*) 'suswind_swath range:',maxsus,minsus - else - !write(0,*) 'Not yet time to sustain: ',grid%suswind_time - endif update_swath - end subroutine sustained_wind - - function dx_at(grid, i,j, ips,ipe,jps,jpe) result(dx) - include 'mpif.h' - type(domain), intent(inout) :: grid - real :: dx, dx_local - integer, intent(in) :: ips,ipe,jps,jpe, i,j - integer :: in,jn,ierr - if(i>=ips .and. i<=ipe .and. j>=jps .and. j<=jpe) then - dx_local=max(0.,grid%dx_nmm(i,j)) - else - dx_local=0 - endif -#ifdef DM_PARALLEL - call mpi_allreduce(dx_local,dx,1,getrealmpitype(),MPI_MAX,local_communicator,ierr) -#else - dx=dx_local -#endif - end function dx_at - - subroutine storm_interest(grid) - use module_tracker, only: update_tracker_post_move - type(domain), intent(inout) :: grid - integer :: ids,ide,jds,jde,kds,kde - integer :: ims,ime,jms,jme,kms,kme - integer :: ips,ipe,jps,jpe,kps,kpe - integer :: i,j - real :: sdistsq - - call get_ijk_from_grid(grid, & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - ips,ipe,jps,jpe,kps,kpe ) - - sdistsq=grid%interest_rad_storm**2*1e6 - do j=max(jps,jds),min(jpe,jde) - do i=max(ips,ids),min(ipe,ide) - if(grid%tracker_distsq(i,j)<=sdistsq .and. grid%tracker_distsq(i,j)>1e-5) then - grid%interesting(i,j) = ior(grid%interesting(i,j),1) - endif - enddo - enddo - end subroutine storm_interest - - subroutine kid_scanner(parent,nest,check) - ! Sets parent%interest to 1 within nest%intrest_rad_parent - ! kilometers of the nest parent center. - type(domain), intent(inout) :: parent,nest - logical, intent(inout), optional :: check - - integer :: ni1,nj1,ni2,nj2, nimid, njmid - integer :: nims,nime,njms,njme,nkms,nkme - integer :: nids,nide,njds,njde,nkds,nkde - integer :: nips,nipe,njps,njpe,nkps,nkpe - integer :: pims,pime,pjms,pjme,pkms,pkme - integer :: pids,pide,pjds,pjde,pkds,pkde - integer :: pips,pipe,pjps,pjpe,pkps,pkpe - real :: dx,dy, dy2dx2, maxflatdist,flatdist, xshift, xfar,yfar,far - integer :: ispan,istart,iend, jspan,jstart,jend, orwhat - integer :: ki1,ki2,kj1,kj2,i,j - character*255 :: message - -#ifdef DM_PARALLEL - integer :: yin,yang ! dummy variables for wrf_dm_maxval_real - yin=-1 - yang=1 -#endif - - call get_ijk_from_grid(nest, & - nids,nide,njds,njde,nkds,nkde, & - nims,nime,njms,njme,nkms,nkme, & - nips,nipe,njps,njpe,nkps,nkpe ) - - call get_ijk_from_grid(parent, & - pids,pide,pjds,pjde,pkds,pkde, & - pims,pime,pjms,pjme,pkms,pkme, & - pips,pipe,pjps,pjpe,pkps,pkpe ) - - ki1=nest%i_parent_start - kj1=nest%j_parent_start - ki2=ki1 + (nide-nids+1)/3 - kj2=kj1 + (njde-njds+1)/3 - nimid = (ki1 + ki2) / 2 - njmid = (kj1 + kj2) / 2 - - dy=parent%dy_nmm - dx=dx_at(parent,nimid,njmid, pips,pipe,pjps,pjpe) - if(dx<1e-5) then - write(message,30) nest%id, nimid,njmid, parent%id, ki1,kj1,ki2,kj2 - call wrf_error_fatal(message) -30 format("Nest ",I0," middle point ",I0,",",I0," is not inside parent ", & - I0," (ki1=",I0," kj1=",I0," ki2=",I0," kj2=",I0,")") - endif - - if(present(check)) then - ! Just check, do not update anything - if ( parent%nest_imid(nest%id) /= nimid .or. & - parent%nest_jmid(nest%id) /= njmid ) then - check=.true. - endif - return - else - parent%nest_imid(nest%id) = nimid - parent%nest_jmid(nest%id) = njmid - endif - - ispan =ceiling(1e3*nest%interest_rad_parent/dx)+1 - istart=max(pids, nimid-ispan) - iend =min(pide-1,nimid+ispan) - - jspan =ceiling(1e3*nest%interest_rad_parent/dy)+1 - jstart=max(pjds, njmid-jspan) - jend =min(pjde-1,njmid+jspan) - - dy2dx2 = dy*dy / (dx*dx) - maxflatdist=nest%interest_rad_parent**2*1e6 - if(nest%id>0 .and. nest%id<=20) then - orwhat=ishft(1,nest%id) - else - orwhat=ishft(1,21) - endif - - if(jstart<=pjpe .or. jend>=pjps .or. istart<=pipe .or. iend>=pipe) then - do j=pjps,min(pjpe,pjde-1) - if(mod(j,2)==1) then - xshift=1. - else - xshift=-1. - endif - do i=pips,min(pipe,pide-1) - xfar=(i-nimid)*parent%dx_nmm(i,j)*2 - yfar=(j-njmid)*dy - if(mod(njmid-j,2) /= 0) then - xfar=xfar + parent%dx_nmm(i,j)*xshift - endif - far = xfar*xfar + yfar*yfar - if(far0 .and. grid%id<=20) then - orwhat=ishft(1,grid%id) - else - orwhat=ishft(1,21) - endif - - do j=jps,min(jpe,jde-1) - do i=ips,min(ipe,ide-1) - if(grid%distsq(i,j) <= maxflatdist) & - grid%interesting(i,j) = ior(grid%interesting(i,j),orwhat) - enddo - enddo - end subroutine self_interest - - logical function check_for_kid_move(grid,config_flags) - USE MODULE_CONFIGURE, ONLY : grid_config_rec_type - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer :: ikid - check_for_kid_move=.false. - - if(config_flags%interest_kids==1) then - do ikid=1,grid%num_nests - if(associated(grid%nests(ikid)%ptr)) & - call kid_scanner(grid,grid%nests(ikid)%ptr,check_for_kid_move) - enddo - else - call wrf_debug('Not checking if kid moved since I have no kids yet.') - endif - if(check_for_kid_move) & - call wrf_debug(1,'At least one of my nests moved.') - end function check_for_kid_move - - subroutine update_interest(grid,config_flags) - USE MODULE_CONFIGURE, ONLY : grid_config_rec_type - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer :: max_dom, nestid, parent_id, ikid, ki0,kj0,kni,knj - logical :: nestless - - call wrf_debug(1,'Reset and recalculate area of interest.') - grid%interesting=0 - - likes_kids: if(config_flags%interest_kids==1) then - do ikid=1,grid%num_nests - if(associated(grid%nests(ikid)%ptr)) & - call kid_scanner(grid,grid%nests(ikid)%ptr) - enddo - endif likes_kids - - likes_storms: if(config_flags%interest_storms==1 .and. & - ( grid%vortex_tracker == vt_ncep_2013 .or. & - grid%vortex_tracker == vt_ncep_2014 ) ) then - ! Region near cyclone is flagged as "interesting" - call storm_interest(grid) - endif likes_storms - - if(config_flags%interest_self==1) & - call self_interest(grid) - - call print_interest(grid) - end subroutine update_interest -#else - ! Make sure the module is not empty in non-HWRF mode. -contains - subroutine swath_dummy() - end subroutine swath_dummy -#endif -end module module_swath diff --git a/dyn_nmm/module_tornado_genesis.F b/dyn_nmm/module_tornado_genesis.F deleted file mode 100644 index a8941b784d..0000000000 --- a/dyn_nmm/module_tornado_genesis.F +++ /dev/null @@ -1,470 +0,0 @@ -module module_tornado_genesis - implicit none - private - - public :: init_tornado_genesis, calc_tornado_genesis, & - reset_tornado_genesis, request_tg_reset - - real, parameter :: wwind_cutoff = 40000.0 ! pascals - -contains - - subroutine update_tg_time(grid,init) - ! Helper function that updates the three time interval variables - ! based on the grid's clock. If init=.true. then both times - ! (interval start and end) are set to the current time, otherwise - ! only the interval end is updated. In either case, tg_duration - ! is set to the length in seconds of the interval. - use module_domain, only: domain, domain_get_time_since_sim_start - use module_symbols_util, only: WRFU_TimeIntervalGet, WRFU_TimeInterval - type(domain), intent(inout) :: grid - type(WRFU_TimeInterval) :: since_start - logical, intent(in) :: init - integer :: s_i, s_n, s_d - - since_start=domain_get_time_since_sim_start(grid) - s_i=0 - s_n=0 - s_d=1 - call WRFU_TimeIntervalGet(since_start,S=s_i,Sn=s_n,Sd=s_d) - if(s_d==0) s_d=1 - grid%tg_interval_end=real(s_i) + real(s_n)/real(s_d) - if(init) grid%tg_interval_start=grid%tg_interval_end - grid%tg_duration=grid%tg_interval_end-grid%tg_interval_start - end subroutine update_tg_time - - subroutine init_tg_vars(grid,config_flags, & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - ! Helper function that resets all min/max accumulation arrays to 0 - use module_domain, only: domain, get_ijk_from_grid - use module_configure, only : grid_config_rec_type - use module_state_description, only: tg_emc2014spc - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: IPS,IPE,JPS,JPE,KPS,KPE - integer :: i,j, istart,iend, jstart,jend - character*255 message - - if(config_flags%tg_option/=tg_emc2014spc) return - jstart=max(jds,jps) - jend=min(jpe,jde-1) - istart=max(ids,ips) - iend=min(ipe,ide-1) - -3012 format("Grid ",I2,": filling tornado genesis data with zeros") - write(message,3012) grid%id - call wrf_debug(1,message) - - do j=jstart,jend - do i=istart,iend - grid%tg_max_m10wind(i,j)=0 - grid%tg_max_wwind(i,j)=0 - grid%tg_min_wwind(i,j)=0 - grid%tg_max_zhel_25(i,j)=0 - grid%tg_min_zhel_25(i,j)=0 - grid%tg_max_zhel_03(i,j)=0 - grid%tg_min_zhel_03(i,j)=0 - grid%tg_max_updhel03(i,j)=0 - grid%tg_max_updhel25(i,j)=0 - grid%tg_updhel03(i,j)=0 - grid%tg_updhel25(i,j)=0 - grid%tg_total_precip(i,j)=0 - enddo - enddo - - if(size(grid%tlow)>1 .and. size(grid%zlow)>1) then - do j=jstart,jend - do i=istart,iend - grid%tlow(i,j)=0 - grid%zlow(i,j)=0 - enddo - enddo - endif - - if(size(grid%rotangle)>1) then - do j=jstart,jend - do i=istart,iend - grid%rotangle(i,j)=0 - end do - end do - endif - - grid%tg_interval_end=grid%tg_interval_start - grid%tg_duration=0.0 - grid%tg_want_reset=0 -#if (HWRF == 1) -! this flag is used by HWRF with moving nests... N/A for NMM - grid%update_interest=.true. -#endif - - end subroutine init_tg_vars - - subroutine init_tornado_genesis(grid,config_flags) - ! Called to initialize tornado genesis data arrays. Should only - ! be called at initial time. - use module_domain, only: domain, get_ijk_from_grid - use module_state_description, only: tg_emc2014spc - use module_configure, only : grid_config_rec_type - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer :: IDS,IDE,JDS,JDE,KDS,KDE - integer :: IMS,IME,JMS,JME,KMS,KME - integer :: IPS,IPE,JPS,JPE,KPS,KPE - - grid%tg_want_reset=0 ! to avoid needless calls to reset_tornado_genesis - if(config_flags%tg_option/=tg_emc2014spc) return - - if(grid%hydro) then - call wrf_error_fatal('Tornado genesis products require non-hydrostatic integration.') - endif - - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - call init_tg_vars(grid,config_flags, & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - call update_tg_time(grid,.true.) - end subroutine init_tornado_genesis - - subroutine request_tg_reset(grid,config_flags,stream) - use module_state_description, only: tg_emc2014spc - use module_domain, only: domain, get_ijk_from_grid - use module_configure, only : grid_config_rec_type - use module_io_domain, only: first_history - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer, intent(in) :: stream - character*255 :: message - integer :: histnum - - if(config_flags%tg_option/=tg_emc2014spc) return - - histnum=stream-first_history - if(config_flags%tg_reset_stream == histnum) then -3012 format('Grid ',I2,': resetting tornado genesis data after stream ',I0,' output') - write(message,3012) grid%id,histnum - call wrf_message(trim(message)) - grid%tg_want_reset=1 - endif - end subroutine request_tg_reset - - subroutine reset_tornado_genesis(grid,config_flags) - ! Called after writing output for a given stream. Resets all - ! min/max information for all fields if the stream is the - ! tg_reset_stream. - use module_state_description, only: tg_emc2014spc - use module_domain, only: domain, get_ijk_from_grid - use module_configure, only : grid_config_rec_type - use module_io_domain, only: first_history - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer :: IDS,IDE,JDS,JDE,KDS,KDE - integer :: IMS,IME,JMS,JME,KMS,KME - integer :: IPS,IPE,JPS,JPE,KPS,KPE - character*255 :: message - integer :: histnum - - if(config_flags%tg_option/=tg_emc2014spc) return - if(grid%tg_want_reset==0) return - -3012 format('Grid ',I2,': resetting tornado genesis data') - write(message,3012) grid%id - call wrf_message(trim(message)) - - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - ! Previous interval end time is now this interval's start time - ! since we're entering the next interval: - grid%tg_interval_start=grid%tg_interval_end - - call init_tg_vars(grid,config_flags, & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - end subroutine reset_tornado_genesis - - subroutine rotate_winds(grid,config_flags, & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - ! Compute wind rotation angle - use module_model_constants, only: DEGRAD - use module_domain, only: domain - use module_configure, only : grid_config_rec_type - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: IPS,IPE,JPS,JPE,KPS,KPE - integer :: i,j - real :: cenlat,cenlon, lmbd0,phi0, cos_phi0,sin_phi0 - real :: big_denom, relm, lat, lon, cos_alpha, sin_alpha - - ! Get the projection center from the MOAD center: - call nl_get_cen_lat(1,cenlat) - call nl_get_cen_lon(1,cenlon) - if(cenlon<0) cenlon=cenlon+360. - lmbd0=cenlon*DEGRAD - phi0=cenlat*DEGRAD - - cos_phi0=cos(phi0) - sin_phi0=sin(phi0) - do j=max(jps,jds),min(jpe,jde-1) - do i=max(ips,ids),min(ipe,ide-1) - lon=grid%GLON(i,j) - lat=grid%GLAT(i,j) - relm=lon-lmbd0 - big_denom=cos(asin( cos_phi0*sin(lat) - sin_phi0*cos(lat)*cos(relm) )) - sin_alpha=sin_phi0*sin(relm)/big_denom - cos_alpha=(cos_phi0*cos(lat)+sin_phi0*sin(lat)*cos(relm))/big_denom - grid%rotangle(i,j) = atan2(sin_alpha,cos_alpha) - enddo - enddo - end subroutine rotate_winds - - subroutine calc_tornado_genesis(grid,config_flags) - ! Updates max/min information for tornado genesis wind fields from - ! grid data at the current time. The tg_total_precip is handled - ! in module_PHYSICS_CALLS instead. - use module_comm_dm, only: HALO_NMM_C_sub - use module_state_description, only: tg_emc2014spc - use module_domain, only: domain, get_ijk_from_grid - use module_configure, only : grid_config_rec_type -#ifdef DM_PARALLEL - use module_dm, only: wrf_dm_maxval_real, wrf_dm_minval_real, & - ntasks_x, ntasks_y, mytask, ntasks, local_communicator -#endif - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - integer :: IDS,IDE,JDS,JDE,KDS,KDE - integer :: IMS,IME,JMS,JME,KMS,KME - integer :: IPS,IPE,JPS,JPE,KPS,KPE - integer :: i,j,k, istart,iend, jstart,jend, a, imin,imax - real :: dudy, dvdx, w, zhel, maxmaxwind, minminw, maxmaxw, sec, updhel03, updhel25 - real :: height, height1, height2, height0, maxmaxzhel, minminzhel, updhelpart - character*255 :: message - - if(config_flags%tg_option/=tg_emc2014spc) return - if(grid%hydro) then - call wrf_error_fatal('Tornado genesis products require non-hydrostatic integration.') - endif - - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - jstart=max(jps,jds+1) - jend=min(jpe,jde-2) - istart=max(ips,ids+1) - iend=min(ipe,ide-2) - imin=max(ips,ids) - imax=min(ipe,ide-1) - -#ifdef DM_PARALLEL -# include "HALO_NMM_C.inc" -#endif - - if(size(grid%tlow)>1 .and. size(grid%zlow)>1) then - ! Near surface Z & T for wave model: - do j=max(jps,jds),min(jpe,jde-1) - do i=max(ips,ids),min(ipe,ide-1) - grid%tlow(i,j)=grid%T(i,j,kds) - grid%zlow(i,j)=(grid%Z(i,j,kds+1)-grid%Z(i,j,kds))/2 - enddo - enddo - endif - - if(size(grid%rotangle)>1) then - call rotate_winds(grid,config_flags, & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - endif - - ! Maximum 10m wind vector magnitude: - maxmaxwind=0.0 - do j=jstart,jend - do i=istart,iend - grid%tg_max_m10wind(i,j)=max(grid%tg_max_m10wind(i,j), & - sqrt(grid%u10(i,j)*grid%u10(i,j) + grid%v10(i,j)*grid%v10(i,j))) - maxmaxwind=max(maxmaxwind,grid%tg_max_m10wind(i,j)) - enddo - enddo - -#ifdef DM_PARALLEL - call wrf_dm_maxval_real(maxmaxwind,i,j) -#endif - - ! Min/max vertical wind below 400mbar: - minminw=0.0 - maxmaxw=0.0 - do j=jstart,jend - do i=istart,iend - kloop: do k=kds+1,kde-1 - if(grid%pint(i,j,1)-grid%pint(i,j,k)>wwind_cutoff) exit kloop - w=grid%w(i,j,k) - grid%tg_min_wwind(i,j)=min(grid%tg_min_wwind(i,j),w) - minminw=min(minminw,grid%tg_min_wwind(i,j)) - grid%tg_max_wwind(i,j)=max(grid%tg_max_wwind(i,j),w) - maxmaxw=max(maxmaxw,grid%tg_max_wwind(i,j)) - enddo kloop - enddo - enddo - -#ifdef DM_PARALLEL - call wrf_dm_maxval_real(maxmaxw,i,j) - call wrf_dm_minval_real(minminw,i,j) -#endif - - ! Min/max helicity for 0-3km layer and 2-5km layer. Note this is - ! X km above ground (lowest interface level geopotential height), - ! not above sea level. - minminzhel=0.0 - maxmaxzhel=0.0 - do j=jstart,jend - a=mod(j,2) - do i=istart,iend - k=kds - height0=grid%Z(i,j,k) ! height0=lowest interface level height - height1=0.0 ! height1=lower height bound for layer - updhel03=0 - updhel25=0 - do while(k0) then - updhel03=updhel03+updhelpart - endif - endif - if(height2>2000.0) then - grid%tg_max_zhel_25(i,j)=max(grid%tg_max_zhel_25(i,j),zhel) - grid%tg_min_zhel_25(i,j)=min(grid%tg_min_zhel_25(i,j),zhel) - minminzhel=min(grid%tg_min_zhel_25(i,j),minminzhel) - maxmaxzhel=max(grid%tg_max_zhel_25(i,j),maxmaxzhel) - updhelpart=max(zhel*(height2-height1),0.) - if(grid%glat(i,j)<0) updhelpart=-updhelpart - if(updhelpart>0) then - updhel25=updhel25+updhelpart - endif - endif - - k=k+1 - height1=height2 - enddo - grid%tg_updhel25(i,j)=updhel25 - grid%tg_updhel03(i,j)=updhel03 - if(updhel25>grid%tg_max_updhel25(i,j)) & - grid%tg_max_updhel25(i,j)=updhel25 - if(updhel03>grid%tg_max_updhel03(i,j)) & - grid%tg_max_updhel03(i,j)=updhel03 - enddo - enddo - -#ifdef DM_PARALLEL - call wrf_dm_maxval_real(maxmaxzhel,i,j) - call wrf_dm_minval_real(minminzhel,i,j) -#endif - - ! I boundaries copy from nearest point that has data, excluding corner points: - if(ips<=ids) then - grid%tg_max_zhel_25(ids,jstart:jend)=grid%tg_max_zhel_25(ids+1,jstart:jend) - grid%tg_max_zhel_03(ids,jstart:jend)=grid%tg_max_zhel_03(ids+1,jstart:jend) - grid%tg_min_zhel_25(ids,jstart:jend)=grid%tg_min_zhel_25(ids+1,jstart:jend) - grid%tg_min_zhel_03(ids,jstart:jend)=grid%tg_min_zhel_03(ids+1,jstart:jend) - grid%tg_updhel25(ids,jstart:jend)=grid%tg_updhel25(ids+1,jstart:jend) - grid%tg_updhel03(ids,jstart:jend)=grid%tg_updhel03(ids+1,jstart:jend) - grid%tg_max_updhel25(ids,jstart:jend)=grid%tg_max_updhel25(ids+1,jstart:jend) - grid%tg_max_updhel03(ids,jstart:jend)=grid%tg_max_updhel03(ids+1,jstart:jend) - grid%tg_max_wwind(ids,jstart:jend)=grid%tg_max_wwind(ids+1,jstart:jend) - grid%tg_min_wwind(ids,jstart:jend)=grid%tg_min_wwind(ids+1,jstart:jend) - grid%tg_max_m10wind(ids,jstart:jend)=grid%tg_max_m10wind(ids+1,jstart:jend) - endif - - if(ipe>=ide-2) then - grid%tg_max_zhel_25(ide-1,jstart:jend)=grid%tg_max_zhel_25(ide-2,jstart:jend) - grid%tg_max_zhel_03(ide-1,jstart:jend)=grid%tg_max_zhel_03(ide-2,jstart:jend) - grid%tg_min_zhel_25(ide-1,jstart:jend)=grid%tg_min_zhel_25(ide-2,jstart:jend) - grid%tg_min_zhel_03(ide-1,jstart:jend)=grid%tg_min_zhel_03(ide-2,jstart:jend) - grid%tg_updhel25(ide-1,jstart:jend)=grid%tg_updhel25(ide-2,jstart:jend) - grid%tg_updhel03(ide-1,jstart:jend)=grid%tg_updhel03(ide-2,jstart:jend) - grid%tg_max_updhel25(ide-1,jstart:jend)=grid%tg_max_updhel25(ide-2,jstart:jend) - grid%tg_max_updhel03(ide-1,jstart:jend)=grid%tg_max_updhel03(ide-2,jstart:jend) - grid%tg_max_wwind(ide-1,jstart:jend)=grid%tg_max_wwind(ide-2,jstart:jend) - grid%tg_min_wwind(ide-1,jstart:jend)=grid%tg_min_wwind(ide-2,jstart:jend) - grid%tg_max_m10wind(ide-1,jstart:jend)=grid%tg_max_m10wind(ide-2,jstart:jend) - endif - - ! J boundaries: copy from nearest point that has data. We use - ! imin:imax instead of istart:iend to get the corner points. - if(jps<=jds) then - grid%tg_max_zhel_25(imin:imax,jds)=grid%tg_max_zhel_25(imin:imax,jds+1) - grid%tg_max_zhel_03(imin:imax,jds)=grid%tg_max_zhel_03(imin:imax,jds+1) - grid%tg_min_zhel_25(imin:imax,jds)=grid%tg_min_zhel_25(imin:imax,jds+1) - grid%tg_min_zhel_03(imin:imax,jds)=grid%tg_min_zhel_03(imin:imax,jds+1) - grid%tg_updhel25(imin:imax,jds)=grid%tg_updhel25(imin:imax,jds+1) - grid%tg_updhel03(imin:imax,jds)=grid%tg_updhel03(imin:imax,jds+1) - grid%tg_max_updhel25(imin:imax,jds)=grid%tg_max_updhel25(imin:imax,jds+1) - grid%tg_max_updhel03(imin:imax,jds)=grid%tg_max_updhel03(imin:imax,jds+1) - grid%tg_max_wwind(imin:imax,jds)=grid%tg_max_wwind(imin:imax,jds+1) - grid%tg_min_wwind(imin:imax,jds)=grid%tg_min_wwind(imin:imax,jds+1) - grid%tg_max_m10wind(imin:imax,jds)=grid%tg_max_m10wind(imin:imax,jds+1) - endif - - if(jpe>=jde-2) then - grid%tg_max_zhel_25(imin:imax,jde-1)=grid%tg_max_zhel_25(imin:imax,jde-2) - grid%tg_max_zhel_03(imin:imax,jde-1)=grid%tg_max_zhel_03(imin:imax,jde-2) - grid%tg_min_zhel_25(imin:imax,jde-1)=grid%tg_min_zhel_25(imin:imax,jde-2) - grid%tg_min_zhel_03(imin:imax,jde-1)=grid%tg_min_zhel_03(imin:imax,jde-2) - grid%tg_updhel25(imin:imax,jde-1)=grid%tg_updhel25(imin:imax,jde-2) - grid%tg_updhel03(imin:imax,jde-1)=grid%tg_updhel03(imin:imax,jde-2) - grid%tg_max_updhel25(imin:imax,jde-1)=grid%tg_max_updhel25(imin:imax,jde-2) - grid%tg_max_updhel03(imin:imax,jde-1)=grid%tg_max_updhel03(imin:imax,jde-2) - grid%tg_max_wwind(imin:imax,jde-1)=grid%tg_max_wwind(imin:imax,jde-2) - grid%tg_min_wwind(imin:imax,jde-1)=grid%tg_min_wwind(imin:imax,jde-2) - grid%tg_max_m10wind(imin:imax,jde-1)=grid%tg_max_m10wind(imin:imax,jde-2) - endif - - call update_tg_time(grid,.false.) - -3313 format('TG extrema: max(wind)=',F0.2,' max(w)=',F0.2,' min(w)=',F0.2,' max(zhel)=',F0.4,' min(zhel)=',F0.4) - write(message,3313) maxmaxwind,maxmaxw,minminw,maxmaxzhel,minminzhel - call wrf_debug(1,message) - end subroutine calc_tornado_genesis - -end module module_tornado_genesis - -subroutine nmm_request_tg_reset(grid,config_flags,stream) - ! This subroutine is a wrapper kludge to work around the WRF build - ! order and limitations of make. The module_tornado_genesis module - ! file does not exist when mediation_integrate is compiled, so - ! med_hist_out has to call a non-module function instead. - use module_domain, only: domain - use module_configure, only : grid_config_rec_type - use module_tornado_genesis, only: request_tg_reset - implicit none - integer, intent(in) :: stream - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - call request_tg_reset(grid,config_flags,stream) -end subroutine nmm_request_tg_reset diff --git a/dyn_nmm/module_tracker.F b/dyn_nmm/module_tracker.F deleted file mode 100644 index be4055382f..0000000000 --- a/dyn_nmm/module_tracker.F +++ /dev/null @@ -1,1937 +0,0 @@ -module module_tracker - implicit none - private -#if ( HWRF == 1 ) - public :: ncep_tracker_center, ncep_tracker_init, update_tracker_post_move - - real, parameter :: invE=0.36787944117 ! 1/e - - ! Copied from tracker: - real,parameter :: searchrad_6=250.0 ! km - ignore data more than this far from domain center - real,parameter :: searchrad_7=200.0 ! km - ignore data more than this far from domain center - integer, parameter :: maxtp=11 ! number of tracker parameters - real, parameter :: uverrmax = 225.0 ! For use in get_uv_guess - real, parameter :: ecircum = 40030.2 ! Earth's circumference - ! (km) using erad=6371.e3 - real, parameter :: rads_vmag=120.0 ! max search radius for wind minimum - real, parameter :: err_reg_init=300.0 ! max err at initial time (km) - real, parameter :: err_reg_max=225.0 ! max err at other times (km) - - real, parameter :: errpmax=485.0 ! max stddev of track parameters - real, parameter :: errpgro=1.25 ! stddev multiplier - - real, parameter :: max_wind_search_radius=searchrad_7 ! max radius for vmax search - real, parameter :: min_mlsp_search_radius=searchrad_7 ! max radius for pmin search - - ! Also used: - real, parameter :: km2nmi = 0.539957, kn2mps=0.514444, mps2kn=1./kn2mps, pi180=0.01745329251 -contains - - !---------------------------------------------------------------------------------- - ! These two simple routines return an N, S, E or W for the - ! hemisphere of a latitude or longitude. They are copied from - ! module_HIFREQ to avoid a relatively pointless compiler dependency. - - character(1) function get_lat_ns(lat) - ! This could be written simply as merge('N','S',lat>=0) if WRF allowed F95 - implicit none ; real lat - if(lat>=0) then - get_lat_ns='N' - else - get_lat_ns='S' - endif - end function get_lat_ns - character(1) function get_lon_ew(lon) - ! This could be written simply as merge('E','W',lon>=0) if WRF allowed F95 - implicit none ; real lon - if(lon>=0) then - get_lon_ew='E' - else - get_lon_ew='W' - endif - end function get_lon_ew - - subroutine ncep_tracker_init(grid) - ! Initialize tracker variables in the grid structure. - use module_domain, only: domain - implicit none - type(domain), intent(inout) :: grid - call wrf_message('ncep_tracker_init') - grid%track_stderr_m1=-99.9 - grid%track_stderr_m2=-99.9 - grid%track_stderr_m3=-99.9 - grid%track_n_old=0 - grid%track_old_lon=0 - grid%track_old_lat=0 - grid%track_old_ntsd=0 - - grid%tracker_angle=0 - grid%tracker_fixlon=-999.0 - grid%tracker_fixlat=-999.0 - grid%tracker_ifix=-99 - grid%tracker_jfix=-99 - grid%tracker_havefix=.false. - grid%tracker_gave_up=.false. - grid%tracker_pmin=-99999. - grid%tracker_vmax=-99. - grid%tracker_rmw=-99. - - grid%track_have_guess=.false. - grid%track_guess_lat=-999.0 - grid%track_guess_lon=-999.0 - end subroutine ncep_tracker_init - - subroutine ncep_tracker_center(grid) - ! Top-level entry to the inline ncep tracker. Finds the center of - ! the storm in the specified grid and updates the grid variables. - ! Will do nothing and return immediately if - ! grid%tracker_gave_up=.true. - - USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid - implicit none - type(domain), intent(inout) :: grid - character*255 :: message - - integer :: IDS,IDE,JDS,JDE,KDS,KDE - integer :: IMS,IME,JMS,JME,KMS,KME - integer :: IPS,IPE,JPS,JPE,KPS,KPE - - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - call ntc_impl(grid, & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - end subroutine ncep_tracker_center - - subroutine ntc_impl(grid, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - ! This is the main entry point to the tracker. It is most similar - ! to the function "tracker" in the GFDL/NCEP vortex tracker. - - USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid -#ifdef DM_PARALLEL - use module_dm, only: wrf_dm_sum_real -#endif - implicit none - logical, external :: wrf_dm_on_monitor - type(domain), intent(inout) :: grid - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: IPS,IPE,JPS,JPE,KPS,KPE - - real :: dxdymean, sum - integer :: i,j, iweights,ip - - - integer :: iguess, jguess ! first guess location - real :: latguess, longuess ! same, but in lat & lon - - integer :: iuvguess, juvguess ! "second guess" location using everything except wind maxima - real :: srsq - integer :: ifinal,jfinal - real :: latfinal,lonfinal - integer :: ierr - integer :: icen(maxtp), jcen(maxtp) ! center locations for each parameter - real :: loncen(maxtp), latcen(maxtp) ! lat, lon locations in degrees - logical :: calcparm(maxtp) ! do we have a valid center location for this parameter? - real :: max_wind,min_pres ! for ATCF output - real :: rcen(maxtp) ! center value (max wind, min mslp, etc.) - character*255 :: message - logical :: north_hemi ! true = northern hemisphere - logical :: have_guess ! first guess is available - real :: guessdist,guessdeg ! first guess distance to nearest point on grid - real :: latnear, lonnear ! nearest point in grid to first guess - - ! icen,jcen: Same meaning as clon, clat in tracker, but uses i and - ! j indexes of the center instead of lat/lon. Tracker comment: - ! Holds the coordinates for the center positions for - ! all storms at all times for all parameters. - ! (max_#_storms, max_fcst_times, max_#_parms). - ! For the third position (max_#_parms), here they are: - ! 1: Relative vorticity at 850 mb - ! 2: Relative vorticity at 700 mb - ! 3: Vector wind magnitude at 850 mb - ! 4: NOT CURRENTLY USED - ! 5: Vector wind magnitude at 700 mb - ! 6: NOT CURRENTLY USED - ! 7: Geopotential height at 850 mb - ! 8: Geopotential height at 700 mb - ! 9: Mean Sea Level Pressure - ! 10: Vector wind magnitude at 10 m - ! 11: Relative vorticity at 10 m - - call wrf_message('ncep_tracker_center') - - ! Initialize center information to invalid values for all centers: - icen=-99 - jcen=-99 - latcen=9e9 - loncen=9e9 - rcen=9e9 - calcparm=.false. - if(grid%vortex_tracker==6) then - srsq=searchrad_6*searchrad_6*1e6 - else - srsq=searchrad_7*searchrad_7*1e6 - endif - - ! Get the first guess from the prior nest motion timestep: - have_guess=grid%track_have_guess - if(have_guess) then - ! We have a first guess center. We have to translate it to gridpoint space. - longuess=grid%track_guess_lon - latguess=grid%track_guess_lat - call get_nearest_lonlat(grid,iguess,jguess,ierr,longuess,latguess, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - ips,ipe, jps,jpe, kps,kpe, lonnear, latnear) - if(ierr==0) then - call calcdist(longuess,latguess, lonnear,latnear, guessdist,guessdeg) - if(guessdist*1e3>3*grid%dy) then -108 format('WARNING: guess lon=',F0.3,',lat=',F0.3, & - ' too far (',F0.3,'km) from nearest point lon=',F0.3,',lat=',F0.3, & - '. Will use domain center as first guess.') - write(message,108) grid%track_guess_lon,grid%track_guess_lat, & - guessdist,lonnear,latnear - call wrf_message(message) - have_guess=.false. ! indicate that the first guess is unusable - else - latguess=latnear - longuess=lonnear - endif - else - have_guess=.false. ! indicate that the first guess is unusable. -109 format('WARNING: guess lon=',F0.3,',lat=',F0.3, & - ' does not exist in this domain. Will use domain center as first guess.') - write(message,109) grid%track_guess_lon,grid%track_guess_lat - call wrf_message(message) - endif - endif - - ! If we could not get the first guess from the prior nest motion - ! timestep, then use the default first guess: the domain center. - if(grid%vortex_tracker==6 .or. .not.have_guess) then - ! vt=6: hard coded first-guess center is domain center: - ! vt=7: first guess comes from prior timestep - ! Initial first guess is domain center. - ! Backup first guess is domain center if first guess is unusable. - iguess=ide/2 - jguess=jde/2 - if(grid%vortex_tracker==7) then - call wrf_message('Using domain center as first guess since no valid first guess is available.') - endif - call get_lonlat(grid,iguess,jguess,longuess,latguess,ierr, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - ips,ipe, jps,jpe, kps,kpe) - if(ierr/=0) then - call wrf_error_fatal("ERROR: center of domain is not inside the domain") - endif - have_guess=.true. - endif - - if(.not.have_guess) then - call wrf_error_fatal("INTERNAL ERROR: No first guess is available (should never happen).") - endif - - north_hemi = latguess>0.0 - - ! Get the mean V-to-H point-to-point distance: - sum=0 - do j=jps,min(jde-1,jpe) - do i=ips,min(ide-1,ipe) - sum=sum+grid%dx_nmm(i,j) - enddo - enddo -#ifdef DM_PARALLEL - sum=wrf_dm_sum_real(sum) -#endif - dxdymean=0.5*(grid%dy_nmm + sum/( (ide-ids) * (jde-jds) ))/1000.0 -33 format ('dxdymean=',F0.3,' dx=',F0.3,' dy=',F0.3,' sum=',F0.3,' count=',I0) - !write(0,33) dxdymean,grid%dx_nmm((ips+ipe)/2,(jps+jpe)/2),grid%dy_nmm, & - ! sum,(ide-ids) * (jde-jds) - - ! Find the centers of all fields except the wind minima: - call find_center(grid,grid%p850rv,grid%sp850rv,srsq, & - icen(1),jcen(1),rcen(1),calcparm(1),loncen(1),latcen(1),dxdymean,'zeta', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, north_hemi=north_hemi) - call find_center(grid,grid%p700rv,grid%sp700rv,srsq, & - icen(2),jcen(2),rcen(2),calcparm(2),loncen(2),latcen(2),dxdymean,'zeta', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, north_hemi=north_hemi) - call find_center(grid,grid%p850z,grid%sp850z,srsq, & - icen(7),jcen(7),rcen(7),calcparm(7),loncen(7),latcen(7),dxdymean,'hgt', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - call find_center(grid,grid%p700z,grid%sp700z,srsq, & - icen(8),jcen(8),rcen(8),calcparm(8),loncen(8),latcen(8),dxdymean,'hgt', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - call find_center(grid,grid%membrane_mslp,grid%smslp,srsq, & - icen(9),jcen(9),rcen(9),calcparm(9),loncen(9),latcen(9),dxdymean,'slp', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - call find_center(grid,grid%m10rv,grid%sm10rv,srsq, & - icen(11),jcen(11),rcen(11),calcparm(11),loncen(11),latcen(11),dxdymean,'zeta', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, north_hemi=north_hemi) - - ! Get a guess center location for the wind minimum searches: - call get_uv_guess(grid,icen,jcen,loncen,latcen,calcparm, & - iguess,jguess,longuess,latguess,iuvguess,juvguess, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - - ! Find wind minima. Requires a first guess center: - windmin: if(grid%vortex_tracker==6) then - call find_center(grid,grid%p850wind,grid%sp850wind,srsq, & - icen(3),jcen(3),rcen(3),calcparm(3),loncen(3),latcen(3),dxdymean,'wind', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, & - iuvguess=iuvguess, juvguess=juvguess) - call find_center(grid,grid%p700wind,grid%sp700wind,srsq, & - icen(5),jcen(5),rcen(5),calcparm(5),loncen(5),latcen(5),dxdymean,'wind', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, & - iuvguess=iuvguess, juvguess=juvguess) - call find_center(grid,grid%m10wind,grid%sm10wind,srsq, & - icen(10),jcen(10),rcen(10),calcparm(10),loncen(10),latcen(10),dxdymean,'wind', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, & - iuvguess=iuvguess, juvguess=juvguess) - else - call get_uv_center(grid,grid%p850wind, & - icen(3),jcen(3),rcen(3),calcparm(3),loncen(3),latcen(3),dxdymean,'wind', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, & - iuvguess=iuvguess, juvguess=juvguess) - call get_uv_center(grid,grid%p700wind, & - icen(5),jcen(5),rcen(5),calcparm(5),loncen(5),latcen(5),dxdymean,'wind', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, & - iuvguess=iuvguess, juvguess=juvguess) - call get_uv_center(grid,grid%m10wind, & - icen(10),jcen(10),rcen(10),calcparm(10),loncen(10),latcen(10),dxdymean,'wind', & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE, & - iuvguess=iuvguess, juvguess=juvguess) - endif windmin - - ! Get a final guess center location: - call fixcenter(grid,icen,jcen,calcparm,loncen,latcen, & - iguess,jguess,longuess,latguess, & - ifinal,jfinal,lonfinal,latfinal, & - north_hemi, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - ips,ipe, jps,jpe, kps,kpe) - - grid%tracker_fixes=0 - do ip=1,maxtp - if(calcparm(ip)) then -300 format('Parameter ',I0,': i=',I0,' j=',I0,' lon=',F0.2,' lat=',F0.2) - !write(0,300) ip,icen(ip),jcen(ip),loncen(ip),latcen(ip) - if(icen(ip)>=ips .and. icen(ip)<=ipe & - .and. jcen(ip)>=jps .and. jcen(ip)<=jpe) then - grid%tracker_fixes(icen(ip),jcen(ip))=ip - endif - else -301 format('Parameter ',I0,' invalid') - !write(0,301) ip - endif - enddo - - if(iguess>=ips .and. iguess<=ipe .and. jguess>=jps .and. jguess<=jpe) then - grid%tracker_fixes(iguess,jguess)=-1 -201 format('First guess: i=',I0,' j=',I0,' lon=',F0.2,' lat=',F0.2) - !write(0,201) iguess,jguess,longuess,latguess - endif - - if(iuvguess>=ips .and. iuvguess<=ipe .and. juvguess>=jps .and. juvguess<=jpe) then - grid%tracker_fixes(iuvguess,juvguess)=-2 -202 format('UV guess: i=',I0,' j=',I0) - !write(0,202) iguess,jguess - endif - -1000 format('Back with final lat/lon at i=',I0,' j=',I0,' lon=',F0.3,' lat=',F0.3) - !write(0,1000) ifinal,jfinal,lonfinal,latfinal - - if(ifinal>=ips .and. ifinal<=ipe .and. jfinal>=jps .and. jfinal<=jpe) then - grid%tracker_fixes(ifinal,jfinal)=-3 -203 format('Final fix: i=',I0,' j=',I0,' lon=',F0.2,' lat=',F0.2) - !write(0,201) ifinal,jfinal,lonfinal,latfinal - endif - - call get_tracker_distsq(grid, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - - call get_wind_pres_intensity(grid, & - grid%tracker_pmin,grid%tracker_vmax,grid%tracker_rmw, & - max_wind_search_radius, min_mlsp_search_radius, & - lonfinal,latfinal, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - -#ifdef DM_PARALLEL - if(wrf_dm_on_monitor()) then -#endif - call output_partial_atcfunix(grid, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) -#ifdef DM_PARALLEL - endif -#endif - -! if(grid%vortex_tracker==7) then -! call get_first_ges(grid,iguess,jguess,longuess,latguess, & -! IDS,IDE,JDS,JDE,KDS,KDE, & -! IMS,IME,JMS,JME,KMS,KME, & -! IPS,IPE,JPS,JPE,KPS,KPE) - -! call store_old_fixes(grid, & -! IDS,IDE,JDS,JDE,KDS,KDE, & -! IMS,IME,JMS,JME,KMS,KME, & -! IPS,IPE,JPS,JPE,KPS,KPE) - -! ! Store the first guess: -! grid%track_have_guess=.true. -! grid%track_guess_lat=latguess -! grid%track_guess_lon=longuess -! 3011 format('First guess: lon=',F0.3,' lat=',F0.3) -! write(message,3011) grid%track_guess_lon,grid%track_guess_lat -! call wrf_debug(1,message) -! endif - - end subroutine ntc_impl - - subroutine get_first_ges(grid, & - iguess,jguess,longuess,latguess, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - ! This replicates the functionality of the tracker get_first_ges - ! routine, whose purpose is to analyze the storm and guess where - ! it will be at the next nest motion timestep. It does that using - ! two different methods, similar to the GFDL/NCEP Tracker's - ! methods: - ! - ! 1. Use the present, and past few, fix locations and extrapolate - ! to the next location. - ! - ! 2. Calculate the mean motion and extrapolate to get the - ! location at the next nest motion timestep. - ! - ! The average of the two results is used. - -#ifdef DM_PARALLEL - use module_dm, only: wrf_dm_maxval_real -#endif - USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid - use module_wrf_error, only: wrf_at_debug_level - implicit none - type(domain), intent(inout) :: grid - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: IPS,IPE,JPS,JPE,KPS,KPE - integer, intent(out) :: iguess,jguess - real, intent(out) :: longuess,latguess - - character*255 message - integer :: iold, inew, jold, jnew - integer :: ifix,jfix,jrot,irot,ierr, pinky,brain, n, tsum, ntsd_plus_1, i, told - real :: motion_grideast, motion_gridnorth, fixdx - real :: dxeast,dynorth, xeast, ynorth - real :: dxrot, dyrot, tracker_dt, xsum, ysum, ytsum, xtsum, xxsum, yysum, ttsum - real :: mx, my, bx, by ! x=mx*t+bx ; y=my*t+by - real :: xrot,yrot - logical :: have_motion_guess, have_line_guess - - have_motion_guess=.false. - have_line_guess=.false. - - if(grid%tracker_havefix) then - ifix=grid%tracker_ifix - jfix=grid%tracker_jfix - - call mean_motion(grid, motion_grideast, motion_gridnorth, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - -#ifdef DM_PARALLEL - fixdx=0 - if(ifix>=ips .and. ifix<=ipe .and. jfix>=jps .and. jfix<=jpe) then - fixdx=grid%dx_nmm(ifix,jfix) - endif - pinky=2 ; brain=308 - call wrf_dm_maxval_real(fixdx,pinky,brain) -#else - fixdx=grid%dx_nmm(ifix,jfix) -#endif - - ! Rotated east and north motion in gridpoints per second, on the combined H+V grid: - tracker_dt=grid%dt*grid%nphs*grid%ntrack - dxeast = motion_grideast * tracker_dt / fixdx - dynorth = motion_gridnorth * tracker_dt / grid%dy_nmm - - ! Combine the H & V coordinate systems and rotate 45 degrees. - ! This puts the H points on a rectangular grid. Add storm motion - ! to the rotated coordinates and round to nearest H point - xeast=ifix*2 - ynorth=jfix - if(mod(jfix,2)==0) xeast=xeast+1 - jrot=nint((xeast+ynorth)/2 + (dxeast+dynorth)/2) - irot=nint((ynorth-xeast)/2 + ((jde-1)/2) + (dynorth-dxeast)/2) - - ! Translate back to usual E grid H points - iguess=irot-jrot+((jde-1)/2) - jguess=irot+jrot-((jde-1)/2) - if(mod(jguess,2)==0) then - iguess=(iguess-1)/2 - else - iguess=iguess/2 - endif - - ! This last step should not be necessary but done just in case: - have_motion_guess = .not.(iguesside*3/4 .or. jguessjde*3/4) - - !print *,'got have_motion_guess=',have_motion_guess - endif - - if(.not.have_motion_guess) then - ! Could not find the storm, so give the domain center as the - ! next first guess location. - iguess=ide/2 - jguess=jde/2 - !print *,'cannot find storm, so using domain center for motion guess' - endif - - if(grid%track_n_old>0) then - !print *,'line guess: have old' - n=1 - call to_rot45_grid(grid%tracker_ifix,grid%tracker_jfix,jde,xrot,yrot) - xsum=xrot - ysum=yrot - tsum=grid%ntsd - xtsum=xsum*tsum - xxsum=xsum*xsum - yysum=ysum*ysum - ytsum=ysum*tsum - ttsum=tsum*tsum - - do i=1,grid%track_n_old - call get_nearest_lonlat(grid,iold,jold,ierr, & - grid%track_old_lon(i),grid%track_old_lat(i), & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - ips,ipe, jps,jpe, kps,kpe) - if(ierr==0) then - !print *,'insert: i=',iold,' j=',jold,' lon=',grid%track_old_lon(i),' lat=',grid%track_old_lat(i),' t=',grid%track_old_ntsd(i) - call to_rot45_grid(iold,jold,jde,xrot,yrot) - n=n+1 - xsum=xsum+xrot - ysum=ysum+yrot - told=grid%track_old_ntsd(i) - tsum=tsum+told - xtsum=xtsum+xrot*told - xxsum=xxsum+xrot*xrot - ytsum=ytsum+yrot*told - yysum=xxsum+yrot*yrot - ttsum=ttsum+told*told - endif - enddo - !print *,'line guess: n=',n - - if(n>1) then - ntsd_plus_1 = grid%ntsd + grid%ntrack*grid%nphs - mx=(xtsum-(xsum*tsum)/real(n))/(ttsum-(tsum*tsum)/real(n)) - my=(ytsum-(ysum*tsum)/real(n))/(ttsum-(tsum*tsum)/real(n)) - bx=(xsum-mx*tsum)/real(n) - by=(ysum-my*tsum)/real(n) - !print *,'mx=',mx,' my=',my,' bx=',bx,' by=',by,' t+1=',ntsd_plus_1 - xrot=nint(mx*ntsd_plus_1+bx) - yrot=nint(my*ntsd_plus_1+by) - call from_rot45_grid(inew,jnew,jde,xrot,yrot) - !print *,'inew=',inew,' jnew=',jnew,' xrot=',xrot,' yrot=',yrot - have_line_guess=.not.(inewide*3/4 & - .or. jnewjde*3/4) - else - have_line_guess=.false. - endif - endif - - print_locs: if(wrf_at_debug_level(2)) then - call get_lonlat(grid,iguess,jguess,longuess,latguess,ierr, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - ips,ipe, jps,jpe, kps,kpe) - if(ierr==0) then - if(have_motion_guess) then -3088 format('Motion Guess: lon=',F0.3,' lat=',F0.3) - write(message,3088) longuess,latguess - call wrf_debug(2,message) - else -3089 format('Motion Guess failed; use domain center: lon=',F0.3,' lat=',F0.3) - write(message,3089) longuess,latguess - call wrf_debug(2,message) - endif - else -3090 format('Motion guess ierr=',I0) - write(message,3090) ierr - call wrf_debug(2,message) - endif - if(have_line_guess) then - call get_lonlat(grid,inew,jnew,longuess,latguess,ierr, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - ips,ipe, jps,jpe, kps,kpe) - if(ierr==0) then -3091 format('Line guess: lon=',F0.3,' lat=',F0.3) - write(message,3091) longuess,latguess - call wrf_debug(2,message) - else -3092 format('Line guess ierr=',I0) - write(message,3092) ierr - call wrf_debug(2,message) - endif - endif - endif print_locs - - if(have_line_guess) then - if(have_motion_guess) then - call wrf_debug(1,'get_first_ges: have MOTION and LINE guesses') - iguess=(iguess+inew)/2 - jguess=(jguess+jnew)/2 - else - call wrf_debug(1,'get_first_ges: have LINE guess only') - iguess=inew - jguess=jnew - endif - elseif(have_motion_guess) then - call wrf_debug(1,'get_first_ges: have MOTION guess only') - else - call wrf_debug(1,'get_first_ges: have no guesses; will use domain center') - endif - - ! Now get lats & lons: - call get_lonlat(grid,iguess,jguess,longuess,latguess,ierr, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - ips,ipe, jps,jpe, kps,kpe) - if(ierr/=0) then - ! Should never get here due to max/min check before. - call wrf_error_fatal("ERROR: domain is not inside the domain in get_first_ges (!?)") - endif - -38 format('First guess: i=',I0,' j=',I0,' lat=',F8.3,' lon=',F8.3) - write(message,38) iguess,jguess,latguess,longuess - call wrf_message(message) - end subroutine get_first_ges - - subroutine store_old_fixes(grid, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - ! This stores old fix locations for later use in the get_first_ges - ! routine's line of best fit. - USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid - implicit none - type(domain), intent(inout) :: grid - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: IPS,IPE,JPS,JPE,KPS,KPE - integer i - if(grid%tracker_havefix) then - !print *,'in store old, have fix' - if(grid%track_n_old>0) then - !print *,'in store old, shifting old' - do i=1,grid%num_old_fixes-1 - grid%track_old_lon(i+1)=grid%track_old_lon(i) - grid%track_old_lat(i+1)=grid%track_old_lat(i) - grid%track_old_ntsd(i+1)=grid%track_old_ntsd(i) - enddo - endif - grid%track_old_lon(1)=grid%tracker_fixlon - grid%track_old_lat(1)=grid%tracker_fixlat - grid%track_old_ntsd(1)=grid%ntsd - grid%track_n_old=min(grid%num_old_fixes,grid%track_n_old+1) - !print *,'in store old, now have ',grid%track_n_old - endif - end subroutine store_old_fixes - - subroutine to_rot45_grid(i,j,jde,x,y) - implicit none - integer, intent(in) :: i,j,jde - real, intent(inout) :: x,y - real :: a,b - a=i*2 - b=j - if(mod(j,2)==0) a=a+1 - x=(a+b)/2 - y=(b-a)/2+((jde-1)/2) - end subroutine to_rot45_grid - - subroutine from_rot45_grid(i,j,jde,x,y) - implicit none - integer, intent(inout) :: i,j - integer, intent(in) :: jde - real, intent(in) :: x,y - i=x-y+((jde-1)/2) - j=x+y-((jde-1)/2) - if(mod(j,2)==0) then - i=(i-1)/2 - else - i=i/2 - endif - end subroutine from_rot45_grid - - subroutine get_nearest_lonlat(grid,iloc,jloc,ierr,lon,lat, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - ips,ipe, jps,jpe, kps,kpe, & - lonnear, latnear) - ! Finds the nearest point in the domain to the specified lon,lat - ! location. -#ifdef DM_PARALLEL - use module_dm, only: wrf_dm_minloc_real -#endif - USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid - implicit none - type(domain), intent(inout) :: grid - integer, intent(in) :: IDS,IDE,JDS,JDE,KDS,KDE - integer, intent(in) :: IMS,IME,JMS,JME,KMS,KME - integer, intent(in) :: IPS,IPE,JPS,JPE,KPS,KPE - integer, intent(out) :: iloc,jloc,ierr - real, intent(in) :: lon,lat - real :: dx,dy,d,dmin, zdummy, latmin,lonmin - integer :: i,j,imin,jmin - real, intent(out), optional :: latnear, lonnear - - zdummy=42 - dmin=9e9 - imin=-99 - jmin=-99 - latmin=9e9 - lonmin=9e9 - ierr=0 - do j=jps,min(jde-1,jpe) - do i=ips,min(ide-1,ipe) - dy=abs(lat-grid%hlat(i,j)) - dx=abs(mod(3600.+180.+(lon-grid%hlon(i,j)),360.)-180.) - d=dx*dx+dy*dy - if(dlocalextreme) then - localextreme=windsq - locali=i - localj=j - endif - endif - enddo - enddo - if(localextreme>0) localextreme=sqrt(localextreme) - - globalextreme=localextreme - globali=locali - globalj=localj -#ifdef DM_PARALLEL - call wrf_dm_maxval_real(globalextreme,globali,globalj) -#endif - - call get_lonlat(grid,globali,globalj,globallon,globallat,ierr, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte) - if(ierr/=0) then - call wrf_message("WARNING: Unable to find location of wind maximum.") - rmw=-99 - else - call calcdist(clon,clat,globallon,globallat,rmw,degrees) - end if - - ! Get the guess location for the next time: - max_wind=globalextreme - if(globali<0 .or. globalj<0) then - call wrf_message("WARNING: No wind values found that were greater than -9*10^9.") - min_mslp=-999 - endif - - end subroutine get_wind_pres_intensity - - subroutine mean_motion(grid,motion_grideast,motion_gridnorth, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte) - ! This calculates the mean motion of the storm by calculating the - ! average wind vector at 850, 700 and 500 mbars. - -#ifdef DM_PARALLEL - use module_dm, only: wrf_dm_sum_real8, wrf_dm_sum_integer -#endif - use module_wrf_error - USE MODULE_DOMAIN, ONLY : domain, domain_clock_get - implicit none - integer, intent(in) :: & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte - type(domain), intent(in) :: grid - real, intent(out) :: motion_grideast,motion_gridnorth - integer :: count,i,j,ierr - real :: distsq, dist - real*8 :: e,n - - e=0 ; n=0 ; count=0 ! east sum, north sum, count - - dist = min(grid%tracker_edge_dist, max(50e3, 3e3*grid%tracker_rmw)) - distsq = dist * dist - - ! print *,'motion search radius (m) = ',dist - ! print *,' considered edge dist = ',grid%tracker_edge_dist - ! print *,' considered 3e3*rmw = ',3e3*grid%tracker_rmw - ! print *,' considered 50e3.' - - do j=jts,min(jte,jde-1) - do i=its,min(ite,ide-1) - if(grid%tracker_distsq(i,j) 2 .and. ip < 7) .or. ip == 10) then - cycle ! because 3-6 are for 850 & 700 u & v and 10 is - ! for surface wind magnitude. - elseif(calcparm(ip)) then - call calcdist (longuess,latguess,loncen(ip),latcen(ip),dist,degrees) - if(dist90.) then - ylat1=180.-ylat1 - xlon1=mod(xlon1+360.,360.)-180. - elseif(ylat1<-90.) then - ylat1=-180. - ylat1 - xlon1=mod(xlon1+360.,360.)-180. - endif - end subroutine clean_lon_lat - - subroutine calcdist(rlonb,rlatb,rlonc,rlatc,xdist,degrees) - ! Copied from gettrk_main.f - ! - ! ABSTRACT: This subroutine computes the distance between two - ! lat/lon points by using spherical coordinates to - ! calculate the great circle distance between the points. - ! Figure out the angle (a) between pt.B and pt.C, - ! N. Pole then figure out how much of a % of a great - ! x circle distance that angle represents. - ! / \ - ! b/ \ cos(a) = (cos b)(cos c) + (sin b)(sin c)(cos A) - ! / \ . - ! pt./<--A-->\c NOTE: The latitude arguments passed to the - ! B / \ subr are the actual lat vals, but in - ! \ the calculation we use 90-lat. - ! a \ . - ! \pt. NOTE: You may get strange results if you: - ! C (1) use positive values for SH lats AND - ! you try computing distances across the - ! equator, or (2) use lon values of 0 to - ! -180 for WH lons AND you try computing - ! distances across the 180E meridian. - ! - ! NOTE: In the diagram above, (a) is the angle between pt. B and - ! pt. C (with pt. x as the vertex), and (A) is the difference in - ! longitude (in degrees, absolute value) between pt. B and pt. C. - ! - ! !!! NOTE !!! -- THE PARAMETER ecircum IS DEFINED (AS OF THE - ! ORIGINAL WRITING OF THIS SYSTEM) IN KM, NOT M, SO BE AWARE THAT - ! THE DISTANCE RETURNED FROM THIS SUBROUTINE IS ALSO IN KM. - ! - implicit none - - real, intent(inout) :: degrees - real, intent(out) :: xdist - real, intent(in) :: rlonb,rlatb,rlonc,rlatc - real, parameter :: dtr = 0.0174532925199433 - real :: distlatb,distlatc,pole,difflon,cosanga,circ_fract - ! - if (rlatb < 0.0 .or. rlatc < 0.0) then - pole = -90. - else - pole = 90. - endif - ! - distlatb = (pole - rlatb) * dtr - distlatc = (pole - rlatc) * dtr - difflon = abs( (rlonb - rlonc)*dtr ) - ! - cosanga = ( cos(distlatb) * cos(distlatc) + & - sin(distlatb) * sin(distlatc) * cos(difflon)) - - ! This next check of cosanga is needed since I have had ACOS crash - ! when calculating the distance between 2 identical points (should - ! = 0), but the input for ACOS was just slightly over 1 - ! (e.g., 1.00000000007), due to (I'm guessing) rounding errors. - - if (cosanga > 1.0) then - cosanga = 1.0 - endif - - degrees = acos(cosanga) / dtr - circ_fract = degrees / 360. - xdist = circ_fract * ecircum - ! - ! NOTE: whether this subroutine returns the value of the distance - ! in km or m depends on the scale of the parameter ecircum. - ! At the original writing of this subroutine (7/97), ecircum - ! was given in km. - ! - return - end subroutine calcdist - - ! subroutine get_lonlat(grid,iguess,jguess,longuess,latguess, & - ! ids,ide, jds,jde, kds,kde, & - ! ims,ime, jms,jme, kms,kme, & - ! ips,ipe, jps,jpe, kps,kpe) - ! ! Returns the latitude (latguess) and longitude (longuess) of the - ! ! specified location (iguess,jguess) in the specified grid. - ! USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid - ! USE MODULE_DM, ONLY: wrf_dm_at_ij_real - ! implicit none - ! integer, intent(in) :: & - ! ids,ide, jds,jde, kds,kde, & - ! ims,ime, jms,jme, kms,kme, & - ! ips,ipe, jps,jpe, kps,kpe - ! type(domain), intent(inout) :: grid - ! integer, intent(in) :: iguess,jguess - ! real, intent(inout) :: longuess,latguess - - ! call wrf_dm_at_ij_real(grid,iguess,jguess,ims,ime, jms,jme, & - ! longuess,grid%hlon, & - ! val2=latguess,field2=grid%hlat) - ! end subroutine get_lonlat - - - subroutine get_lonlat(grid,iguess,jguess,longuess,latguess,ierr, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - ips,ipe, jps,jpe, kps,kpe) - ! Returns the latitude (latguess) and longitude (longuess) of the - ! specified location (iguess,jguess) in the specified grid. - USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid - USE MODULE_DM, ONLY: wrf_dm_maxloc_real - implicit none - integer, intent(in) :: & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - ips,ipe, jps,jpe, kps,kpe - integer, intent(out) :: ierr - type(domain), intent(inout) :: grid - integer, intent(in) :: iguess,jguess - real, intent(inout) :: longuess,latguess - real :: weight,zjunk - integer :: itemp,jtemp - - ierr=0 - zjunk=1 - if(iguess>=ips .and. iguess<=ipe .and. jguess>=jps .and. jguess<=jpe) then - weight=1 - longuess=grid%hlon(iguess,jguess) - latguess=grid%hlat(iguess,jguess) - itemp=iguess - jtemp=jguess - else - weight=0 - longuess=-999.9 - latguess=-999.9 - itemp=-99 - jtemp=-99 - endif - -#ifdef DM_PARALLEL - call wrf_dm_maxloc_real(weight,latguess,longuess,zjunk,itemp,jtemp) -#endif - - if(itemp==-99 .and. jtemp==-99) then - ierr=95 - endif - end subroutine get_lonlat - - subroutine update_tracker_post_move(grid) - ! This updates the tracker i/j fix location and square of the - ! distance to the tracker center after a nest move. - USE MODULE_DOMAIN, ONLY : domain,get_ijk_from_grid - type(domain), intent(inout) :: grid - integer :: ierr, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE - - ! Get the grid bounds: - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - ! Get the i/j center location from the fix location: - ierr=0 - call get_nearest_lonlat(grid,grid%tracker_ifix,grid%tracker_jfix, & - ierr,grid%tracker_fixlon,grid%tracker_fixlat, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - - ! Get the square of the approximate distance to the tracker center - ! at all points: - if(ierr==0) & - call get_tracker_distsq(grid, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE) - end subroutine update_tracker_post_move -#endif -end module module_tracker - -#if (HWRF == 1) -subroutine nmm_med_tracker_post_move(grid) - ! This updates the tracker i/j fix location and square of the - ! distance to the tracker center after a nest move. - use module_tracker, only: update_tracker_post_move - use module_domain, only : domain - type(domain), intent(inout) :: grid - call update_tracker_post_move(grid) -end subroutine nmm_med_tracker_post_move -#endif diff --git a/dyn_nmm/nmm_get_cpu.c b/dyn_nmm/nmm_get_cpu.c deleted file mode 100644 index e728b32573..0000000000 --- a/dyn_nmm/nmm_get_cpu.c +++ /dev/null @@ -1,20 +0,0 @@ -#if defined(__linux) && defined(NMM_FIND_LOAD_IMBALANCE) -#define _GNU_SOURCE -#include - -void nmm_get_cpu(int *cpu,int *ierr) { - *cpu=sched_getcpu(); - *ierr = (*cpu>=0); -} -#else -void nmm_get_cpu(int *cpu,int *ierr) { - *cpu=0; - *ierr=0; -} -#endif - -void nmm_get_cpu_(int *c,int*i) { nmm_get_cpu(c,i); } -void nmm_get_cpu__(int *c,int*i) { nmm_get_cpu(c,i); } -void NMM_GET_CPU(int *c,int*i) { nmm_get_cpu(c,i); } -void NMM_GET_CPU_(int *c,int*i) { nmm_get_cpu(c,i); } -void NMM_GET_CPU__(int *c,int*i) { nmm_get_cpu(c,i); } diff --git a/dyn_nmm/nmm_loop_basemacros.h b/dyn_nmm/nmm_loop_basemacros.h deleted file mode 100644 index 3cb00bf6fd..0000000000 --- a/dyn_nmm/nmm_loop_basemacros.h +++ /dev/null @@ -1,9 +0,0 @@ -! these define the various loop range variables -! that were defined in module_MPP. Defined as macros -! here to allow thread-safety/tile callability - -#define MY_IS(A,B) max(ids+(A),its-(B)) -#define MY_IE(A,B) min(ide-(A),ite+(B)) -#define MY_JS(A,B) max(jds+(A),jts-(B)) -#define MY_JE(A,B) min(jde-(A),jte+(B)) - diff --git a/dyn_nmm/nmm_loop_macros.h b/dyn_nmm/nmm_loop_macros.h deleted file mode 100644 index a77ddab2b3..0000000000 --- a/dyn_nmm/nmm_loop_macros.h +++ /dev/null @@ -1,130 +0,0 @@ -! these define the various loop range variables -! that were defined in module_MPP. Defined as macros -! here to allow thread-safety/tile callability - -#define MYIS MY_IS( 0 , 0 ) -#define MYIS_P1 MY_IS( 0 , 1 ) -#define MYIS_P2 MY_IS( 0 , 2 ) -#define MYIS_P3 MY_IS( 0 , 3 ) -#define MYIS_P4 MY_IS( 0 , 4 ) -#define MYIS_P5 MY_IS( 0 , 5 ) -#define MYIS1 MY_IS( 1 , 0 ) -#define MYIS1_P1 MY_IS( 1 , 1 ) -#define MYIS1_P2 MY_IS( 1 , 2 ) -#define MYIS1_P3 MY_IS( 1 , 3 ) -#define MYIS1_P4 MY_IS( 1 , 4 ) -#define MYIS1_P5 MY_IS( 1 , 5 ) -#define MYIS2 MY_IS( 2 , 0 ) -#define MYIS2_P1 MY_IS( 2 , 1 ) -#define MYIS2_P2 MY_IS( 2 , 2 ) -#define MYIS2_P3 MY_IS( 2 , 3 ) -#define MYIS2_P4 MY_IS( 2 , 4 ) -#define MYIS2_P5 MY_IS( 2 , 5 ) -#define MYIS3 MY_IS( 3 , 0 ) -#define MYIS3_P1 MY_IS( 3 , 1 ) -#define MYIS3_P2 MY_IS( 3 , 2 ) -#define MYIS3_P3 MY_IS( 3 , 3 ) -#define MYIS3_P4 MY_IS( 3 , 4 ) -#define MYIS3_P5 MY_IS( 3 , 5 ) -#define MYIS4 MY_IS( 4 , 0 ) -#define MYIS4_P1 MY_IS( 4 , 1 ) -#define MYIS4_P2 MY_IS( 4 , 2 ) -#define MYIS4_P3 MY_IS( 4 , 3 ) -#define MYIS4_P4 MY_IS( 4 , 4 ) -#define MYIS4_P5 MY_IS( 4 , 5 ) - -#define MYIE MY_IE( 0 , 0 ) -#define MYIE_P1 MY_IE( 0 , 1 ) -#define MYIE_P2 MY_IE( 0 , 2 ) -#define MYIE_P3 MY_IE( 0 , 3 ) -#define MYIE_P4 MY_IE( 0 , 4 ) -#define MYIE_P5 MY_IE( 0 , 5 ) -#define MYIE1 MY_IE( 1 , 0 ) -#define MYIE1_P1 MY_IE( 1 , 1 ) -#define MYIE1_P2 MY_IE( 1 , 2 ) -#define MYIE1_P3 MY_IE( 1 , 3 ) -#define MYIE1_P4 MY_IE( 1 , 4 ) -#define MYIE1_P5 MY_IE( 1 , 5 ) -#define MYIE2 MY_IE( 2 , 0 ) -#define MYIE2_P1 MY_IE( 2 , 1 ) -#define MYIE2_P2 MY_IE( 2 , 2 ) -#define MYIE2_P3 MY_IE( 2 , 3 ) -#define MYIE2_P4 MY_IE( 2 , 4 ) -#define MYIE2_P5 MY_IE( 2 , 5 ) -#define MYIE3 MY_IE( 3 , 0 ) -#define MYIE3_P1 MY_IE( 3 , 1 ) -#define MYIE3_P2 MY_IE( 3 , 2 ) -#define MYIE3_P3 MY_IE( 3 , 3 ) -#define MYIE3_P4 MY_IE( 3 , 4 ) -#define MYIE3_P5 MY_IE( 3 , 5 ) -#define MYIE4 MY_IE( 4 , 0 ) -#define MYIE4_P1 MY_IE( 4 , 1 ) -#define MYIE4_P2 MY_IE( 4 , 2 ) -#define MYIE4_P3 MY_IE( 4 , 3 ) -#define MYIE4_P4 MY_IE( 4 , 4 ) -#define MYIE4_P5 MY_IE( 4 , 5 ) - -#define MYJS MY_JS( 0 , 0 ) -#define MYJS_P1 MY_JS( 0 , 1 ) -#define MYJS_P2 MY_JS( 0 , 2 ) -#define MYJS_P3 MY_JS( 0 , 3 ) -#define MYJS_P4 MY_JS( 0 , 4 ) -#define MYJS_P5 MY_JS( 0 , 5 ) -#define MYJS1 MY_JS( 1 , 0 ) -#define MYJS1_P1 MY_JS( 1 , 1 ) -#define MYJS1_P2 MY_JS( 1 , 2 ) -#define MYJS1_P3 MY_JS( 1 , 3 ) -#define MYJS1_P4 MY_JS( 1 , 4 ) -#define MYJS1_P5 MY_JS( 1 , 5 ) -#define MYJS2 MY_JS( 2 , 0 ) -#define MYJS2_P1 MY_JS( 2 , 1 ) -#define MYJS2_P2 MY_JS( 2 , 2 ) -#define MYJS2_P3 MY_JS( 2 , 3 ) -#define MYJS2_P4 MY_JS( 2 , 4 ) -#define MYJS2_P5 MY_JS( 2 , 5 ) -#define MYJS3 MY_JS( 3 , 0 ) -#define MYJS3_P1 MY_JS( 3 , 1 ) -#define MYJS3_P2 MY_JS( 3 , 2 ) -#define MYJS3_P3 MY_JS( 3 , 3 ) -#define MYJS3_P4 MY_JS( 3 , 4 ) -#define MYJS3_P5 MY_JS( 3 , 5 ) -#define MYJS4 MY_JS( 4 , 0 ) -#define MYJS4_P1 MY_JS( 4 , 1 ) -#define MYJS4_P2 MY_JS( 4 , 2 ) -#define MYJS4_P3 MY_JS( 4 , 3 ) -#define MYJS4_P4 MY_JS( 4 , 4 ) -#define MYJS4_P5 MY_JS( 4 , 5 ) -#define MYJS5 MY_JS( 5 , 0 ) - -#define MYJE MY_JE( 0 , 0 ) -#define MYJE_P1 MY_JE( 0 , 1 ) -#define MYJE_P2 MY_JE( 0 , 2 ) -#define MYJE_P3 MY_JE( 0 , 3 ) -#define MYJE_P4 MY_JE( 0 , 4 ) -#define MYJE_P5 MY_JE( 0 , 5 ) -#define MYJE1 MY_JE( 1 , 0 ) -#define MYJE1_P1 MY_JE( 1 , 1 ) -#define MYJE1_P2 MY_JE( 1 , 2 ) -#define MYJE1_P3 MY_JE( 1 , 3 ) -#define MYJE1_P4 MY_JE( 1 , 4 ) -#define MYJE1_P5 MY_JE( 1 , 5 ) -#define MYJE2 MY_JE( 2 , 0 ) -#define MYJE2_P1 MY_JE( 2 , 1 ) -#define MYJE2_P2 MY_JE( 2 , 2 ) -#define MYJE2_P3 MY_JE( 2 , 3 ) -#define MYJE2_P4 MY_JE( 2 , 4 ) -#define MYJE2_P5 MY_JE( 2 , 5 ) -#define MYJE3 MY_JE( 3 , 0 ) -#define MYJE3_P1 MY_JE( 3 , 1 ) -#define MYJE3_P2 MY_JE( 3 , 2 ) -#define MYJE3_P3 MY_JE( 3 , 3 ) -#define MYJE3_P4 MY_JE( 3 , 4 ) -#define MYJE3_P5 MY_JE( 3 , 5 ) -#define MYJE4 MY_JE( 4 , 0 ) -#define MYJE4_P1 MY_JE( 4 , 1 ) -#define MYJE4_P2 MY_JE( 4 , 2 ) -#define MYJE4_P3 MY_JE( 4 , 3 ) -#define MYJE4_P4 MY_JE( 4 , 4 ) -#define MYJE4_P5 MY_JE( 4 , 5 ) -#define MYJE5 MY_JE( 5 , 0 ) - diff --git a/dyn_nmm/shift_domain_nmm.F b/dyn_nmm/shift_domain_nmm.F deleted file mode 100644 index a0435ec77c..0000000000 --- a/dyn_nmm/shift_domain_nmm.F +++ /dev/null @@ -1,186 +0,0 @@ -SUBROUTINE shift_domain_nmm ( grid , disp_x, disp_y & -! -# include "dummy_new_args.inc" -! - ) - USE module_domain - USE module_timing - USE module_configure - USE module_dm - USE module_comm_dm - USE module_timing - IMPLICIT NONE - ! Arguments - INTEGER disp_x, disp_y ! number of parent domain points to move - TYPE(domain) , POINTER :: grid - - ! Local - INTEGER :: i, j, ii, ipf, jpf - INTEGER :: px, py ! number and direction of nd points to move - INTEGER :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - ips , ipe , jps , jpe , kps , kpe - TYPE (grid_config_rec_type) :: config_flags - TYPE( fieldlist ), POINTER :: p - - LOGICAL :: E_BDY,N_BDY,S_BDY,W_BDY - - CHARACTER(LEN=255) :: message - - ! Definitions of dummy arguments to solve -#include "dummy_new_decl.inc" - -IF ( grid%active_this_task ) THEN - -#ifdef DM_PARALLEL -# include "data_calls.inc" -#endif - - CALL model_to_grid_config_rec ( grid%id , model_config_rec , config_flags ) - - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - - S_BDY=(JPS==JDS) - N_BDY=(JPE==JDE) - W_BDY=(IPS==IDS) - E_BDY=(IPE==IDE) - - write(message,*)' S_BDY,N_BDY,W_BDY,E_BDY ', S_BDY,N_BDY,W_BDY,E_BDY - CALL wrf_message(trim(message)) - - grid%imask_nostag=0 -#if 1 - IF ( disp_x > 0 ) THEN - IF ( E_BDY ) THEN - DO J=jps,min(jde-1,jpe) - DO I=ips,min(ide-1,ipe-2-mod(j+1,2)) - grid%imask_nostag(i,j) = 1 - END DO - END DO - ELSE - DO J=jps,min(jde-1,jpe) - DO I=ips,min(ide-1,ipe) - grid%imask_nostag(i,j) = 1 - END DO - END DO - END IF -! - IF ( disp_y > 0 ) THEN - IF ( N_BDY ) THEN - DO J=min(jde-1,jpe-2),max(jde-1,jpe) - DO I=ips,min(ide-1,ipe) - grid%imask_nostag(i,j) = 0 - END DO - END DO - ENDIF - ELSEIF ( disp_y < 0 ) THEN - IF ( S_BDY ) THEN - DO J=jps,jps+1 - DO I=ips,min(ide-1,ipe) - grid%imask_nostag(i,j) = 0 - END DO - END DO - ENDIF - ENDIF !disp_y -! - ELSEIF ( disp_x < 0 ) THEN - IF ( W_BDY ) THEN - DO J=jps,min(jde-1,jpe) - DO I=ips+1,min(ide-1,ipe) - grid%imask_nostag(i,j) = 1 - END DO - END DO - ELSE - DO J=jps,min(jde-1,jpe) - DO I=ips,min(ide-1,ipe) - grid%imask_nostag(i,j) = 1 - END DO - END DO - END IF -! - IF ( disp_y > 0 ) THEN - IF ( N_BDY ) THEN - DO J=min(jde-1,jpe-2),max(jde-1,jpe) - DO I=ips,min(ide-1,ipe) - grid%imask_nostag(i,j) = 0 - END DO - END DO - ENDIF - ELSEIF ( disp_y < 0 ) THEN - IF ( S_BDY ) THEN - DO J=jps,jps+1 - DO I=ips,min(ide-1,ipe) - grid%imask_nostag(i,j) = 0 - END DO - END DO - ENDIF - ENDIF !disp_y -! - ELSE ! disp_x = 0 -! - IF ( disp_y > 0 ) THEN - IF ( N_BDY ) THEN - DO J=jps,min(jde-1,jpe-3) - DO I=ips,min(ide-1,ipe) - grid%imask_nostag(i,j) = 1 - END DO - END DO - ELSE - DO J=jps,min(jde-1,jpe) - DO I=ips,min(ide-1,ipe) - grid%imask_nostag(i,j) = 1 - END DO - END DO - END IF - END IF - IF ( disp_y < 0 ) THEN - IF ( S_BDY ) THEN - DO J=jps+2,min(jde-1,jpe) - DO I=ips,min(ide-1,ipe) - grid%imask_nostag(i,j) = 1 - END DO - END DO - ELSE - DO J=jps,min(jde-1,jpe) - DO I=ips,min(ide-1,ipe) - grid%imask_nostag(i,j) = 1 - END DO - END DO - END IF - END IF -! - END IF -! - -#else - grid%imask_nostag(ips:min(ide-4,ipe),jps:min(jde-1,jpe)) = 1 -! grid%imask_nostag(ips+1:min(ide-2,ipe),jps+1:min(jde-2,jpe)) = 1 -! grid%imask_nostag(ips+1:min(ide-1,ipe-1),jps+2:min(jde-1,jpe-2)) = 1 -#endif - - px = isign(grid%parent_grid_ratio,disp_x) - py = isign(grid%parent_grid_ratio,disp_y) - -#ifdef DM_PARALLEL -! shift the nest domain in x - do ii = 1,abs(disp_x) -#include "../inc/SHIFT_HALO_X_HALO.inc" -#include "../frame/loop_based_x_shift_code.h" - enddo - -! shift the nest domain in y - do ii = 1,abs(disp_y) -#include "../inc/SHIFT_HALO_Y_HALO.inc" -#include "../frame/loop_based_y_shift_code.h" - enddo -#endif - -ENDIF - - RETURN - -END SUBROUTINE shift_domain_nmm diff --git a/dyn_nmm/solve_nmm.F b/dyn_nmm/solve_nmm.F deleted file mode 100644 index ae9c85bf6b..0000000000 --- a/dyn_nmm/solve_nmm.F +++ /dev/null @@ -1,3653 +0,0 @@ -#define HRD_MULTIPLE_STORMS -!----------------------------------------------------------------------- -! -!NCEP_MESO:MEDIATION_LAYER:SOLVER -! -!----------------------------------------------------------------------- -#include "nmm_loop_basemacros.h" -#include "nmm_loop_macros.h" -!----------------------------------------------------------------------- -! - SUBROUTINE SOLVE_NMM(GRID,CONFIG_FLAGS & -! -#include "dummy_new_args.inc" -! - & ) -!----------------------------------------------------------------------- - use module_timing - USE MODULE_DOMAIN, ONLY : DOMAIN, GET_IJK_FROM_GRID & - ,domain_clock_get,is_alarm_tstep_nphs - USE MODULE_CONFIGURE, ONLY : GRID_CONFIG_REC_TYPE - USE MODULE_MODEL_CONSTANTS - USE MODULE_STATE_DESCRIPTION - USE MODULE_CTLBLK - use MODULE_RANDOM, ONLY : rand_grid_r4 -#ifdef DM_PARALLEL - USE MODULE_DM, ONLY : LOCAL_COMMUNICATOR & - ,MYTASK,NTASKS,NTASKS_X & - ,NTASKS_Y - USE MODULE_COMM_DM -#endif -#if ( HWRF == 1 ) - USE MODULE_SWATH, ONLY : UPDATE_INTEREST, SUSTAINED_WIND, CHECK_FOR_KID_MOVE - USE MODULE_HIFREQ, ONLY: HIFREQ_WRITE, HIFREQ_OPEN -#endif - USE MODULE_TORNADO_GENESIS, ONLY: CALC_TORNADO_GENESIS, RESET_TORNADO_GENESIS - USE MODULE_IGWAVE_ADJUST, ONLY: PDTE,PFDHT,DDAMP,VTOA - USE MODULE_ADVECTION, ONLY: ADVE,VAD2,HAD2 & - ,ADV2,MONO & - ,VAD2_SCAL,HAD2_SCAL - USE MODULE_NONHY_DYNAM, ONLY: EPS,VADZ,HADZ - USE MODULE_DIFFUSION_NMM, ONLY: HDIFF - USE MODULE_BNDRY_COND, ONLY: & - BOCOV, MASS_BOUNDARY, MP_BULK_BOUNDARY, MP_SPECIES_BDY - USE MODULE_PHYSICS_CALLS - USE MODULE_EXT_INTERNAL - USE MODULE_PRECIP_ADJUST - USE MODULE_NEST_UTIL ! USEs module_MPP (contains MYPE,NPES,MPI_COMM_COMP) -#ifdef MOVE_NESTS - USE MODULE_STATS_FOR_MOVE, ONLY: STATS_FOR_MOVE -#endif - USE MODULE_DIAG_REFL - - -!----------------------------------------------------------------------- -! - IMPLICIT NONE -! -!----------------------------------------------------------------------- -! -!*** INPUT DATA -! -!----------------------------------------------------------------------- -! - TYPE(DOMAIN),TARGET :: GRID -! -!*** DEFINITIONS OF DUMMY ARGUMENTS TO THIS ROUTINE (GENERATED FROM REGISTRY) -! -! NOTE, REGISTRY NO LONGER GENERATES DUMMY ARGUMENTS OR DUMMY ARGUMENT -! DECLARATIONS FOR RCONFIG ENTRIES. THEY ARE STILL PART OF STATE. ACCESS -! TO THESE VARIABLES IS NOW THROUGH GRID STRUCTURE, AS MODIFIED BELOW. -! AFFECTED VARIABLES: SIGMA, DT, NPHS, IDTAD, NRADS, NRADL, JULDAY, -! JULYR, NUM_SOIL_LAYERS, NCNVC, ENSDIM, DY, AND SPEC_BDY_WIDTH. -! JM, 20050819 -! -!---------------------------- -#include "dummy_new_decl.inc" -!---------------------------- -! -!*** STRUCTURE THAT CONTAINS RUN-TIME CONFIGURATION (NAMELIST) DATA FOR DOMAIN -! - TYPE(GRID_CONFIG_REC_TYPE),INTENT(IN) :: CONFIG_FLAGS -! -!----------------------------------------------------------------------- -! -!*** LOCAL VARIABLES -! -!----------------------------------------------------------------------- -! - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,IPS,IPE,JPS,JPE,KPS,KPE & - & ,ITS,ITE,JTS,JTE,KTS,KTE -! - LOGICAL :: advect_q2 - INTEGER :: I,ICLTEND,IDF,IRTN,J,JC,JDF,K,KDF,LB,N_MOIST & - & ,NTSD_current,L -#if ( HWRF == 1 ) -#ifdef HRD_MULTIPLE_STORMS -!XUEJIN's doing - INTEGER, PARAMETER :: max_simulation_domains=11 !The max number of domains in the HWRF simulation. Currently hard-coded to 5 storms. This should eventually be replaced with CONFIG_FLAGS%MAX_DOM. - INTEGER :: kid1 - INTEGER,SAVE,DIMENSION(max_simulation_domains) :: NTSD_restart1 -#else -!zhang's doing - INTEGER,SAVE :: NTSD_restart1,NTSD_restart2,NTSD_restart3 -#endif - LOGICAL :: multi_storm, no_ocean -#endif -#ifdef NMM_FIND_LOAD_IMBALANCE - integer, save :: cpu - integer :: newcpu -#endif - integer :: ierr,nrand,idt - INTEGER,SAVE :: NTSD_restart -! INTEGER :: MPI_COMM_COMP,MYPE,MYPROC,NPES - INTEGER :: MYPROC,imid,jmid - INTEGER :: KVH,NTSD_rad,RC - INTEGER :: NUM_AEROSOLC -! - REAL :: DT_INV,FICE,FRAIN,GPS,QI,QR,QW,WC,WP - REAL :: dwdt_damping_lev -! - LOGICAL :: LAST_TIME,OPERATIONAL_PHYSICS,ETAMP_PHYSICS -! - CHARACTER(80) :: MESSAGE -! -!*** For precip assimilation: - INTEGER :: ISTAT,DOM,one - LOGICAL :: HF - REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:) :: PPTDAT -! -!----------------------------------------------------------------------- -!*** For physics compatibility with other packages -!----------------------------------------------------------------------- -! - REAL,ALLOCATABLE,DIMENSION(:,:,:) :: TTEN,QTEN - REAL,ALLOCATABLE,DIMENSION(:,:,:) :: RTHRATEN,RTHBLTEN,RQVBLTEN - REAL,ALLOCATABLE,DIMENSION(:,:) :: HPBL_HOLD -! -! Double precision lat/lon for coupler - REAL*8,ALLOCATABLE,DIMENSION(:,:) :: HLAT_DBL,HLON_DBL,VLAT_DBL,VLON_DBL - REAL :: parent_CLAT,parent_CLON,WBD,SBD,DLMD,DPHD -!----------------------------------------------------------------------- -! - LOGICAL wrf_dm_on_monitor - EXTERNAL wrf_dm_on_monitor -! -!----------------------------------------------------------------------- -!*** TIMING VARIABLES -!----------------------------------------------------------------------- - real,save :: solve_tim,exch_tim,pdte_tim,adve_tim,vtoa_tim & - &, vadz_tim,hadz_tim,eps_tim,vad2_tim,had2_tim & - &, radiation_tim,rdtemp_tim,turbl_tim,cltend_tim & - &, cucnvc_tim,gsmdrive_tim,hdiff_tim,bocoh_tim & - &, pfdht_tim,ddamp_tim,bocov_tim,uv_htov_tim,sum_tim & -#if ( HWRF == 1 ) - &, sst_tim,flux_tim,hifreq_tim,wav_tim,cplstep_tim & -#endif - &, diag_tim,adjppt_tim,tornado_tim - -! Flag for producing diagnostic fields (e.g., radar reflectivity) - LOGICAL :: diag_flag - -#ifdef NMM_FIND_LOAD_IMBALANCE - real,save :: loadimbal_tim,previmbal_tim -#endif - real,save :: exch_tim_max - real :: ttim,btimx - real :: et_max,this_tim - double precision :: fhr - integer :: n_print_time -!!BEGIN: LSM changes for LANDFALL: Subashini 7/27/2016 - integer :: move_land_time - integer :: SOIL_ID, VEG_ID, DIRN - real :: land_albedo, land_emiss, land_vgfrac, land_smc, land_z0 - NAMELIST/param_land/SOIL_ID, VEG_ID, DIRN, land_albedo, land_emiss, land_vgfrac, land_smc,land_z0 -!! END: LSM changes for LANDFALL : Subashini 7/27/2016 - -! -!----------------------------------------------------------------------- -! -!#ifdef DEREF_KLUDGE -!! SEE http://www.mmm.ucar.edu/wrf/WG2/topics/deref_kludge.htm -! INTEGER :: SM31,EM31,SM32,EM32,SM33,EM33 -! INTEGER :: SM31X,EM31X,SM32X,EM32X,SM33X,EM33X -! INTEGER :: SM31Y,EM31Y,SM32Y,EM32Y,SM33Y,EM33Y -!#endif -! -!----------------------------------------------------------------------- -!*** Passive substance variables -!----------------------------------------------------------------------- -! - LOGICAL :: EULER - INTEGER :: IDTADT - INTEGER :: IDTADC - INTEGER :: KS ! species index in 4d tracer array -! - REAL,SAVE :: SUMDRRW -! -!----------------------------------------------------------------------- -! -! LIMIT THE NUMBER OF ARGUMENTS IF COMPILED WITH -DLIMIT_ARGS BY COPYING -! SCALAR (NON-ARRAY) ARGUMENTS OUT OF THE GRID DATA STRUCTURE INTO LOCALLY -! DEFINED COPIES (DEFINED IN EM_DUMMY_DECL.INC, ABOVE, AS THEY ARE IF THEY -! ARE ARGUMENTS). AN EQUIVALENT INCLUDE OF EM_SCALAR_DEREFS.INC APPEARS -! AT THE END OF THE ROUTINE TO COPY BACK ANY CHNAGED NON-ARRAY VALUES. -! THE DEFINITION OF COPY_IN OR COPY_OUT BEFORE THE INCLUDE DEFINES THE -! DIRECTION OF THE COPY. NMM_SCALAR_DEREFS IS GENERATED FROM REGISTRY. -! -!----------------------------------------------------------------------- -!#define COPY_IN -!#include "scalar_derefs.inc" -!----------------------------------------------------------------------- -! -! TRICK PROBLEMATIC COMPILERS INTO NOT PERFORMING COPY-IN/COPY-OUT BY ADDING -! INDICES TO ARRAY ARGUMENTS IN THE CALL STATEMENTS IN THIS ROUTINE. -! IT HAS THE EFFECT OF PASSING ONLY THE FIRST ELEMENT OF THE ARRAY, RATHER -! THAN THE ENTIRE ARRAY. SEE: -! http://www.mmm.ucar.edu/wrf/WG2/topics/deref_kludge.htm -! -!----------------------------------------------------------------------- -#include "deref_kludge.h" -!----------------------------------------------------------------------- -! -! NEEDED BY SOME COMM LAYERS, E.G. RSL. IF NEEDED, nmm_data_calls.inc IS -! GENERATED FROM THE REGISTRY. THE DEFINITION OF REGISTER_I1 ALLOWS -! I1 DATA TO BE COMMUNICATED IN THIS ROUTINE IF NECESSARY. -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!*********************************************************************** -!*** -!*** THE MAIN TIME INTEGRATION LOOP -!*** -!----------------------------------------------------------------------- -! -!*** ntsd IS THE TIMESTEP COUNTER (Number of Time Steps Done) -! -!----------------------------------------------------------------------- -!*** -!*** ADVANCE_count STARTS AT ZERO FOR ALL RUNS (REGULAR AND RESTART). -!*** -!----------------------------------------------------------------------- -! - ttim=now_time() ! used to calculate total time spent in solver - CALL DOMAIN_CLOCK_GET(GRID,ADVANCEcOUNT=NTSD_current) -! - IF(NTSD_current==0)THEN - IF(GRID%RESTART.AND.GRID%TSTART>0.)THEN -#if ( HWRF == 1 ) -#ifdef HRD_MULTIPLE_STORMS -!XUEJIN's doing - do kid1=1,max_simulation_domains - if( grid%id .eq. kid1 ) NTSD_restart1(kid1)=INT(grid%TSTART*3600./GRID%DT+0.5) - end do -#else -!zhang's doing: temporarily hardwired for two domains - if( grid%id .eq. 1 ) NTSD_restart1=INT(grid%TSTART*3600./GRID%DT+0.5) - if( grid%id .eq. 2 ) NTSD_restart2=INT(grid%TSTART*3600./GRID%DT+0.5) - if( grid%id .eq. 3 ) NTSD_restart3=INT(grid%TSTART*3600./GRID%DT+0.5) -#endif -#endif - IHRST=grid%nstart_hour - NTSD_restart=grid%ntsd - ELSE - IHRST=GRID%GMT - grid%nstart_hour=IHRST -#if ( HWRF == 1 ) -#ifdef HRD_MULTIPLE_STORMS -!XUEJIN's doing - NTSD_restart1=0 -#else -!zhang's doing - NTSD_restart1=0 - NTSD_restart2=0 - NTSD_restart3=0 -#endif -#else - NTSD_restart=0 -#endif - ENDIF - ENDIF -#if ( HWRF == 1 ) -#ifdef HRD_MULTIPLE_STORMS -!XUEJIN's doing - do kid1=1,max_simulation_domains - if( grid%id .eq. kid1 ) grid%ntsd=NTSD_restart1(kid1)+NTSD_current - end do -#else -!zhang's doing - if( grid%id .eq. 1 ) grid%ntsd=NTSD_restart1+NTSD_current - if( grid%id .eq. 2 ) grid%ntsd=NTSD_restart2+NTSD_current - if( grid%id .eq. 3 ) grid%ntsd=NTSD_restart3+NTSD_current -#endif -#else - grid%ntsd=NTSD_restart+NTSD_current -#endif - LAST_TIME=domain_last_time_step(GRID) -!----------------------------------------------------------------------------- -! -! Set diagnostic flag value at history output time -!----------------------------------------------------------------------------- - - diag_flag = & - is_alarm_tstep_nphs(grid%domain_clock, grid%alarms(HISTORY_ALARM), grid%nphs) & - .or. & - is_alarm_tstep_nphs(grid%domain_clock, grid%alarms(AUXHIST1_ALARM), grid%nphs) & - .or. & - is_alarm_tstep_nphs(grid%domain_clock, grid%alarms(AUXHIST2_ALARM), grid%nphs) & - .or. & - is_alarm_tstep_nphs(grid%domain_clock, grid%alarms(AUXHIST3_ALARM), grid%nphs) - -! -!----------------------------------------------------------------------- -! -!!!!! IF(WRF_DM_ON_MONITOR() )THEN - WRITE(MESSAGE,125)grid%id,grid%ntsd,grid%ntsd*GRID%DT/3600. - 125 FORMAT(' SOLVE_NMM: ',I3,' TIMESTEP IS ',I5,' TIME IS ',F7.3,' HOURS') -!!!! CALL WRF_MESSAGE(TRIM(MESSAGE)) -!!!! ENDIF -! -!----------------------------------------------------------------------- -! - EULER=model_config_rec%EULER_ADV - IDTADT=model_config_rec%IDTADT - IDTADC=model_config_rec%IDTADC - WP=model_config_rec%WP(grid%id) - dwdt_damping_lev=model_config_rec%dwdt_damping_lev(grid%id) -! -!----------------------------------------------------------------------- - CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP) - CALL WRF_GET_NPROC(NPES) - CALL WRF_GET_MYPROC(MYPROC) - MYPE=MYPROC -!----------------------------------------------------------------------- -! -!*** OBTAIN DIMENSION INFORMATION STORED IN THE GRID DATA STRUCTURE. -! - CALL GET_IJK_FROM_GRID(GRID & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,IPS,IPE,JPS,JPE,KPS,KPE ) -!----------------------------------------------------------------------- -! -!*** COMPUTE THESE STARTING AND STOPPING LOCATIONS FOR EACH TILE AND -!*** NUMBER OF TILES. -!*** SEE: http://www.mmm.ucar.edu/wrf/WG2/topics/settiles -! - CALL SET_TILES(GRID,IDS,IDE,JDS,JDE,IPS,IPE,JPS,JPE) -! -!----------------------------------------------------------------------- -!*** SET FLAG FOR NAM, HRW, or HWRF (Ferrier-based) microphysics -!----------------------------------------------------------------------- -! - ETAMP_PHYSICS=.FALSE. -! - IF (CONFIG_FLAGS%MP_PHYSICS == ETAMPNEW .OR. & - & CONFIG_FLAGS%MP_PHYSICS == FER_MP_HIRES .OR. & - & CONFIG_FLAGS%MP_PHYSICS == ETAMP_HWRF ) THEN -! - ETAMP_PHYSICS=.TRUE. -! - ENDIF - - ADVECT_Q2=.TRUE. - if(CONFIG_FLAGS%BL_PBL_PHYSICS == GFSSCHEME .OR. & - CONFIG_FLAGS%BL_PBL_PHYSICS == GFSEDMFSCHEME) THEN - ADVECT_Q2=.FALSE. - endif - -! -!----------------------------------------------------------------------- -!*** SET FLAG FOR THE OPERATIONAL PHYSICS SUITE. -!*** THIS WILL BE USED TO SAVE CLOCKTIME BY SKIPPING -!*** FREQUENT UPDATES OF THE MOIST ARRAY AND INSTEAD -!*** UPDATE IT ONLY WHEN IT IS NEEDED FOR PHYSICS. -!----------------------------------------------------------------------- -! - OPERATIONAL_PHYSICS=.FALSE. -! - IF(CONFIG_FLAGS%RA_SW_PHYSICS ==GFDLSWSCHEME.AND. & - & CONFIG_FLAGS%RA_LW_PHYSICS ==GFDLLWSCHEME.AND. & - & CONFIG_FLAGS%SF_SFCLAY_PHYSICS==MYJSFCSCHEME.AND. & - & CONFIG_FLAGS%BL_PBL_PHYSICS ==MYJPBLSCHEME.AND. & - & CONFIG_FLAGS%CU_PHYSICS ==BMJSCHEME.AND. & - & ETAMP_PHYSICS ) THEN - -! - OPERATIONAL_PHYSICS=.TRUE. -! - ENDIF -! -!----------------------------------------------------------------------- -! -!*** TTEN, QTEN are used by GD convection scheme -! - ALLOCATE(TTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT) - ALLOCATE(QTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT) - ALLOCATE(RTHBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT) - ALLOCATE(RQVBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT) - ALLOCATE(RTHRATEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT) - ALLOCATE(HPBL_HOLD(IMS:IME,JMS:JME),STAT=ISTAT) -! -!Zhan: Double precision lat/lon for coupler - ALLOCATE(HLAT_DBL(IMS:IME,JMS:JME),STAT=ISTAT) - ALLOCATE(HLON_DBL(IMS:IME,JMS:JME),STAT=ISTAT) - ALLOCATE(VLAT_DBL(IMS:IME,JMS:JME),STAT=ISTAT) - ALLOCATE(VLON_DBL(IMS:IME,JMS:JME),STAT=ISTAT) - -! - IF(CONFIG_FLAGS%CU_PHYSICS==GDSCHEME.OR. & - & CONFIG_FLAGS%CU_PHYSICS==TIEDTKESCHEME.OR. & - & CONFIG_FLAGS%CU_PHYSICS==KFETASCHEME)THEN - - DO J=JMS,JME - DO K=KMS,KME - DO I=IMS,IME - TTEN(I,K,J)=grid%t(I,J,K) - QTEN(I,K,J)=grid%q(I,J,K) - ENDDO - ENDDO - ENDDO - ENDIF -! - GRID%SIGMA=1 - - IF (config_flags%non_hydrostatic) THEN - grid%hydro=.FALSE. - ELSE - grid%hydro=.TRUE. - ENDIF -! - IDF=IDE-1 - JDF=JDE-1 - KDF=KDE-1 -! -!----------------------------------------------------------------------- -! -!*** FOR NOW SET CONTROLS FOR TILES TO PATCHES -! -!----------------------------------------------------------------------- - ITS=IPS - ITE=MIN(IPE,IDF) - JTS=JPS - JTE=MIN(JPE,JDF) - KTS=KPS - KTE=MIN(KPE,KDF) -!----------------------------------------------------------------------- -! - if(grid%ntsd==0)then - write(message,*)' its=',its,' ite=',ite - call wrf_message(trim(message)) - write(message,*)' jts=',jts,' jte=',jte - call wrf_message(trim(message)) - write(message,*)' kts=',kts,' kte=',kte - call wrf_message(trim(message)) -! -!----------------------------------------------------------------------- - endif -!----------------------------------------------------------------------- -!*** SET TIMING VARIABLES TO ZERO AT START OF FORECAST. -!----------------------------------------------------------------------- - if(grid%ntsd==0)then - sum_tim=0. - solve_tim=0. - exch_tim=0. - pdte_tim=0. - adve_tim=0. - vtoa_tim=0. - vadz_tim=0. - hadz_tim=0. - eps_tim=0. - vad2_tim=0. - had2_tim=0. - radiation_tim=0. - rdtemp_tim=0. - turbl_tim=0. - cltend_tim=0. - cucnvc_tim=0. - gsmdrive_tim=0. - hdiff_tim=0. - bocoh_tim=0. - pfdht_tim=0. - ddamp_tim=0. - bocov_tim=0. - uv_htov_tim=0. - exch_tim_max=0. - adjppt_tim=0. - diag_tim=0. - tornado_tim=0. -#if ( HWRF == 1 ) - sst_tim=0. - cplstep_tim=0. - wav_tim=0. - flux_tim=0. - hifreq_tim=0. -#endif -#ifdef NMM_FIND_LOAD_IMBALANCE - previmbal_tim=0. - loadimbal_tim=0. - call nmm_get_cpu(cpu,ierr) -#endif - endif -!----------------------------------------------------------------------- - N_MOIST=NUM_MOIST - -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(previmbal_tim,'top of solve_nmm') - call nmm_get_cpu(newcpu,ierr) - if(cpu/=newcpu) then -3011 format('warning: CPU changed from ',I0,' to ',I0) - write(message,3011) cpu,newcpu - call wrf_message(message) - cpu=newcpu - endif -#endif -! - DO J=MYJS_P4,MYJE_P4 - grid%iheg(J)=MOD(J+1,2) - grid%ihwg(J)=grid%iheg(J)-1 - grid%iveg(J)=MOD(J,2) - grid%ivwg(J)=grid%iveg(J)-1 - ENDDO - - DO J=MYJS_P4,MYJE_P4 - grid%ivw(J)=grid%ivwg(J) - grid%ive(J)=grid%iveg(J) - grid%ihe(J)=grid%iheg(J) - grid%ihw(J)=grid%ihwg(J) - ENDDO -! -!*** LATERAL POINTS IN THE BOUNDARY ARRAYS -! - LB=2*(IDF-IDS+1)+(JDF-JDS+1)-3 -! -!*** APPROXIMATE GRIDPOINT SPACING (METERS) -! - JC=jps+(jpe-jps)/2 - GPS=SQRT(grid%dx_nmm(ips,JC)**2+grid%dy_nmm**2) -! -!*** TIMESTEPS PER HOUR -! - TSPH=3600./GRID%DT -! - n_print_time=nint(3600./grid%dt) ! Print stats once per hour -!----------------------------------------------------------------------- -! - NBOCO=0 -! -!----------------------------------------------------------------------- -! -#if (NMM_NEST == 1) -!----------------------------------------------------------------------------- -!*** PATCHING NESTED BOUNDARIES. -!----------------------------------------------------------------------------- -! - CALL wrf_debug ( 100 , 'nmm: in patch' ) -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after alloc and init') -#endif - btimx=now_time() -!#ifdef DM_PARALLEL -!# include "HALO_NMM_ZZ.inc" -!#endif - - IF(GRID%ID/=1)THEN -! -#ifdef MOVE_NESTS - - IF(GRID%ID/=1.AND.MOD(grid%ntsd,1)==0.AND.GRID%NUM_MOVES==-99)THEN - grid%XLOC_1=(IDE-1)/2 ! This maneuvers the storm to the center of the nest quickly - grid%YLOC_1=(JDE-1)/2 ! This maneuvers the storm to the center of the nest quickly - ENDIF - - ! If we have any nests, check to see if they moved so we know - ! if we need to update the nest-centric area of interest: - IF(grid%ntsd>1 .and. MOD(grid%ntsd,grid%nphs)==0) THEN - grid%update_interest = grid%update_interest .or. & - check_for_kid_move(grid,config_flags) - ENDIF - -#endif - - ENDIF -#endif -! -!----------------------------------------------------------------------- -!*** ALLOCATE PPTDAT ARRAY (PRECIP ASSIM): -!----------------------------------------------------------------------- -! - IF(GRID%PCPFLG.AND..NOT.ALLOCATED(PPTDAT))THEN - ALLOCATE(PPTDAT(IMS:IME,JMS:JME,3),STAT=ISTAT) - ENDIF -! -!----------------------------------------------------------------------- -!*** -!*** Call READPCP to -!*** 1) READ IN PRECIPITATION FOR HOURS 1, 2 and 3; -!*** 2) Initialize grid%ddata to 999. (this is the amount -!*** of input precip allocated to each physics time step -!*** in ADJPPT; TURBL/SURFCE, which uses grid%ddata, is called -!*** before ADJPPT) -!*** 3) Initialize grid%lspa to zero -!*** -!----------------------------------------------------------------------- - - IF (grid%ntsd==0) THEN - IF (GRID%PCPFLG) THEN - CALL READPCP(PPTDAT,grid%ddata,grid%lspa & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - ENDIF - ENDIF -!----------------------------------------------------------------------- -! -! -!----------------------------------------------------------------------- -!*** UPDATE RANDOM NUMBERS IF REQUIRED -!----------------------------------------------------------------------- - - randif: IF(in_use_for_config(grid%id,'random')) THEN -! - nrand=config_flags%nrand - if(nrand==0) nrand=grid%ncnvc - if(nrand==0) nrand=1 - IDT=MOD(grid%NTSD,nrand) - - IF(IDT.EQ.0 .OR. grid%NTSD .EQ. 0)THEN - call start_timing - call wrf_message('Update random numbers...') - one=1 - - imid=(its+ite)/2 ; jmid=(jts+jte)/2 - - write(message,'(A,": random(",I0,",",I0,") = ",E15.10)') 'before call',imid,jmid,grid%random(imid,jmid) - call wrf_debug(3,message) - - call rand_grid_r4(grid%randstate1,grid%randstate2, & - grid%randstate3,grid%randstate4, & - grid%random, & - IDS,IDE,JDS,JDE,one,one, & - IMS,IME,JMS,JME,one,one, & - ITS,ITE,JTS,JTE,one,one) - - write(message,'(A,": random(",I0,",",I0,") = ",E15.10)') 'after call',imid,jmid,grid%random(imid,jmid) - call wrf_debug(3,message) - - call end_timing('Updating random numbers') - ENDIF ! for IF(IDT.EQ.0 .OR. NTSD .EQ. 0) - ENDIF randif -!----------------------------------------------------------------------- -!*** RESET TORNADO GENESIS ACCUMULATORS WHEN NEEDED. -!----------------------------------------------------------------------- - IF(grid%tg_want_reset/=0) THEN - btimx=now_time() - CALL RESET_TORNADO_GENESIS(GRID,CONFIG_FLAGS) - tornado_tim=tornado_tim+now_time()-btimx - ENDIF -!----------------------------------------------------------------------- -!*** UPDATE AREA OF INTEREST -!----------------------------------------------------------------------- -#if ( HWRF == 1 ) - if(size(grid%precip_swath)>1 .and. grid%update_interest) then - call update_interest(grid,config_flags) - grid%update_interest=.false. - endif -#endif -!----------------------------------------------------------------------- -!*** ZERO OUT ACCUMULATED QUANTITIES WHEN NEEDED. -!----------------------------------------------------------------------- -! - CALL BUCKETS(grid%ntsd,grid%nprec,grid%nsrfc,grid%nrdsw,grid%nrdlw & - & ,GRID%RESTART,GRID%TSTART & - & ,grid%nclod,grid%nheat,GRID%NPHS,TSPH & - & ,grid%acprec,grid%cuprec,grid%acsnow,grid%acsnom,grid%ssroff,grid%bgroff & - & ,grid%sfcevp,grid%potevp,grid%sfcshx,grid%sfclhx,grid%subshx,grid%snopcx & - & ,grid%sfcuvx,grid%potflx & - & ,grid%ardsw,grid%aswin,grid%aswout,grid%aswtoa & - & ,grid%ardlw,grid%alwin,grid%alwout,grid%alwtoa & - & ,grid%acfrst,grid%ncfrst,grid%acfrcv,grid%ncfrcv & - & ,grid%avcnvc,grid%avrain,grid%tcucn,grid%train & - & ,grid%asrfc & - & ,grid%t,grid%tlmax,grid%tlmin,grid%tshltr,grid%pshltr,grid%qshltr & - & ,grid%t02_max,grid%t02_min,grid%rh02_max,grid%rh02_min & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!----------------------------------------------------------------------- -! -!!#if ( HWRF == 1 ) -!!!zhang -!! IF(NTSD_current==0)THEN -!!#else - IF(grid%ntsd==0)THEN -!!#endif - FIRST=.TRUE. -! call hpm_init() -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'before halo & init stuff') -#endif - btimx=now_time() -!emc_2010_bugfix_h50 - grid%mommix=amin1(grid%mommix,1.0) -!emc_2010_bugfix_h50 -! -!----------------------------------------------------------------------- -!*** FIRST STEP INITIALIZATION OF PASSIVE SUBSTANCE VARIABLES -!----------------------------------------------------------------------- -! - IF(EULER) THEN - SUMDRRW=0. -! - DO K=KTS,KTE - DO J=JMS,JME - DO I=IMS,IME - grid%rrw(I,J,K)=0. -! - IF(I>=IDE/2-6.AND.I<=IDE/2+6.AND. & - J>=JDE/2-6.AND.J<=JDE/2+6 ) THEN - grid%rrw(I,J,K)=10.0 !youhua -! grid%rrw(I,J,K)=0.9 !zj - ENDIF -! - ENDDO - ENDDO - ENDDO -! - DO KS=PARAM_FIRST_SCALAR,NUM_SZJ - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - SZJ(I,J,K,KS)=0. - S1Z(I,J,K,KS)=0. - SPZ(I,J,K,KS)=0. - TCS(I,J,K,KS)=0. - ENDDO - ENDDO - ENDDO - ENDDO -! - ENDIF -! -!----------------------------------------------------------------------- -! -!!#ifdef DM_PARALLEL -!!# include "HALO_NMM_A.inc" -!!#endif -! -!----------------------------------------------------------------------- -!!#ifdef DM_PARALLEL -!! IF (.NOT.ETAMP_PHYSICS) THEN -!!# include "HALO_NMM_A_3.inc" -!! ENDIF -!!#endif -!----------------------------------------------------------------------- -!*** FIRST STEP INITIALIZATION OF PASSIVE SUBSTANCE VARIABLES -!----------------------------------------------------------------------- -! - IF(EULER) THEN -! - DO K=KTS,KTE - DO J=JMS,JME - DO I=IMS,IME - SPZ(I,J,K,P_SPZ1)=SQRT(MAX(grid%q (I,J,K),EPSQ)) - SPZ(I,J,K,P_SPZ2)=SQRT(MAX(grid%cwm(I,J,K),EPSQ)) - SPZ(I,J,K,P_SPZ4)=SQRT(MAX(grid%rrw(I,J,K),0. )) - ENDDO - ENDDO - ENDDO -! - DO J=JMS,JME - DO I=IMS,IME - SPZ(I,J,KTE,P_SPZ3)=SQRT(MAX((grid%q2(I,J,KTE)+EPSQ2)*0.5,EPSQ2)) - ENDDO - ENDDO -! - DO K=KTE-1,KTS,-1 - DO J=JMS,JME - DO I=IMS,IME - SPZ(I,J,K,P_SPZ3)=SQRT(MAX((grid%q2(I,J,K)+grid%q2(I,J,K+1))*0.5,EPSQ2)) - ENDDO - ENDDO - ENDDO -! - ENDIF -! -!----------------------------------------------------------------------- -!*** USE THE FOLLOWING VARIABLES TO KEEP TRACK OF EXCHANGE TIMES. -!----------------------------------------------------------------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo and init stuff') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -!----------------------------------------------------------------------- -! -#if ( HWRF == 1 ) -!zhang's doing - if(GRID%RESTART) then - FIRST=.FALSE. - else - GO TO 2003 - endif -!end of zhang's doing -#else - GO TO 2003 -#endif - ENDIF -! -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- - 2000 CONTINUE -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -#if ( HWRF == 1 ) - CALL nl_get_multi_storm(1,multi_storm) - CALL nl_get_no_ocean(1,no_ocean) - IF ( .NOT. multi_storm .OR. no_ocean) THEN - write(message,*)' No Ocean Coupling Run' - call wrf_debug(1,trim(message)) -! Coupling insertion:-> - ELSE - btimx=now_time() - CALL nl_get_cen_lat (GRID%ID, parent_CLAT) - CALL nl_get_cen_lon (GRID%ID, parent_CLON) - DLMD = grid%dx - DPHD = grid%dy - WBD = grid%wbd0 - SBD = grid%sbd0 - CALL EARTH_LATLON_r8 ( HLAT_DBL,HLON_DBL,VLAT_DBL,VLON_DBL, & !output - DLMD,DPHD,WBD,SBD, & !inputs - parent_CLAT,parent_CLON, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - - call ATM_TSTEP_INIT(NTSD_current,grid%NPHS,GRID%ID,grid%NPHS*grid%dt, & - ids,idf,jds,jdf,its,ite,jts,jte,ims,ime,jms,jme, & - kds,kde,kts,kte,kms,kme, & - HLON_DBL,HLAT_DBL,VLON_DBL,VLAT_DBL,grid%sm, & - grid%i_parent_start,grid%j_parent_start, & - grid%guessdtc,grid%dtc) - cplstep_tim=cplstep_tim+now_time()-btimx - ENDIF -!<-:coupling insertion -! - -#endif -!----------------------------------------------------------------------- -!*** PRESSURE TENDENCY, SIGMA DOT, VERTICAL PART OF OMEGA-ALPHA -!----------------------------------------------------------------------- -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after atm_tstep_init') -#endif - btimx=now_time() -!----------------- -!!#ifdef DM_PARALLEL -!!# include "HALO_NMM_D.inc" -!!#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo d') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! - btimx=now_time() -! - call check_grid(grid,config_flags,'before PDTE', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL PDTE( & -#ifdef DM_PARALLEL - & GRID,MYPE,MPI_COMM_COMP, & -#endif - & grid%ntsd,GRID%DT,grid%pt,grid%eta2,grid%res,grid%hydro,grid%hbm2 & - & ,grid%pd,grid%pdsl,grid%pdslo & - & ,grid%petdt,grid%div,grid%psdt & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - - - pdte_tim=pdte_tim+now_time()-btimx -! -!----------------------------------------------------------------------- -!*** ADVECTION OF grid%t, grid%u, AND grid%v -!----------------------------------------------------------------------- -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after pdte') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_F.inc" -# include "HALO_NMM_F1.inc" -#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo F & F1') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max - btimx=now_time() -! - call check_grid(grid,config_flags,'before ADVE', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL ADVE(grid%ntsd,GRID%DT,grid%deta1,grid%deta2,grid%pdtop & - & ,grid%curv,grid%f,grid%fad,grid%f4d,grid%em_loc,grid%emt_loc,grid%en,grid%ent,grid%dx_nmm,grid%dy_nmm & - & ,grid%hbm2,grid%vbm2 & - & ,grid%t,grid%u,grid%v,grid%pdslo,grid%told,grid%uold,grid%vold & - & ,grid%petdt,grid%upstrm & - & ,grid%few,grid%fns,grid%fne,grid%fse & - & ,grid%adt,grid%adu,grid%adv & - & ,grid%n_iup_h,grid%n_iup_v & - & ,grid%n_iup_adh,grid%n_iup_adv & - & ,grid%iup_h,grid%iup_v,grid%iup_adh,grid%iup_adv & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - adve_tim=adve_tim+now_time()-btimx -! -!----------------------------------------------------------------------- -!*** PASSIVE SUBSTANCE WORKING PART -!----------------------------------------------------------------------- -! - eulerian: IF(EULER) THEN ! Eulerian advection for model tracers -! -!----------------------------------------------------------------------- -! -!mp - allow for it to be applied in the no-physics realm - IF(.NOT.ETAMP_PHYSICS.and.CONFIG_FLAGS%MP_PHYSICS/=0) THEN - WRITE( wrf_err_message , * ) 'EULER advection works only with ETAMPNEW microphysics.' - CALL wrf_error_fatal ( wrf_err_message ) - ENDIF -! -!----------------------------------------------------------------------- - idtadt_block: IF(MOD(grid%ntsd,IDTADT)==0) THEN -!----------------------------------------------------------------------- -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after adve') -#endif - btimx=now_time() -!!#ifdef DM_PARALLEL -!!# include "HALO_NMM_I.inc" -!!#endif - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo I') -#endif -! - btimx=now_time() -! - DO K=KTS,KTE - DO J=JMS,JME - DO I=IMS,IME - SZJ(I,J,K,P_SPZ1)=MAX(grid%q (I,J,K),EPSQ) - SZJ(I,J,K,P_SPZ2)=MAX(grid%cwm(I,J,K),EPSQ) - SZJ(I,J,K,P_SPZ4)=MAX(grid%rrw(I,J,K),0. ) - ENDDO - ENDDO - ENDDO -! - DO J=JMS,JME - DO I=IMS,IME - SZJ(I,J,KTE,P_SPZ3)=MAX((grid%q2 (I,J,KTE)+EPSQ2)*0.5,EPSQ2) - ENDDO - ENDDO -! - DO K=KTE-1,KTS,-1 - DO J=JMS,JME - DO I=IMS,IME - SZJ(I,J,K,P_SPZ3)=MAX((grid%q2 (I,J,K)+grid%q2 (I,J,K+1))*0.5,EPSQ2) - ENDDO - ENDDO - ENDDO -! -#ifdef DM_PARALLEL -# include "HALO_TRACERS.inc" -#endif - call check_grid(grid,config_flags,'before ADV2', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL ADV2 & - (grid%upstrm & - ,MYPE,PARAM_FIRST_SCALAR,NUM_SZJ & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE & - ,grid%n_iup_h & - ,grid%n_iup_adh & - ,grid%iup_h,grid%iup_adh & - ,grid%ent & - ,IDTADT & - ,grid%DT,grid%pdtop & - ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - ,grid%deta1,grid%deta2 & - ,grid%emt_loc & - ,grid%fad,grid%hbm2,grid%pdsl,grid%pdslo & - ,grid%petdt & - ,grid%uold,grid%vold & - ,SZJ,SPZ & - !temporary arguments - ,grid%fne,grid%fse,grid%few,grid%fns,S1Z,TCS) -! -#ifdef DM_PARALLEL -# include "HALO_TRACERS.inc" -#endif - call check_grid(grid,config_flags,'before MONO', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL MONO & - ( & -#if defined(DM_PARALLEL) - GRID%DOMDESC, & -#endif - MYPE,grid%ntsd,grid%ntsd*GRID%DT/3600.,PARAM_FIRST_SCALAR,NUM_SZJ & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE & - ,IDTADT & - ,grid%dy_nmm,grid%pdtop & - ,SUMDRRW & - ,grid%ihe,grid%ihw & - ,grid%deta1,grid%deta2 & - ,grid%dx_nmm,grid%hbm2,grid%pdsl & - ,SZJ & - !temporary arguments - ,S1Z,TCS) -! - DO KS=PARAM_FIRST_SCALAR,NUM_SZJ ! loop by species - DO K=KTS,KTE - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - SZJ(I,J,K,KS)=SZJ(I,J,K,KS)+TCS(I,J,K,KS) - ENDDO - ENDDO - ENDDO - ENDDO ! end of the loop by the species -! - DO K=KTS,KTE - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - grid%q (I,J,K)=SZJ(I,J,K,P_SZJ1) - grid%cwm(I,J,K)=SZJ(I,J,K,P_SZJ2) - grid%rrw(I,J,K)=SZJ(I,J,K,P_SZJ4) - ENDDO - ENDDO - ENDDO -! - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - grid%q2(I,J,KTE)=MAX(SZJ(I,J,KTE,P_SZJ3)+SZJ(I,J,KTE,P_SZJ3)-EPSQ2 & - ,EPSQ2) - ENDDO - ENDDO -! - DO K=KTE-1,KTS+1,-1 - DO J=MYJS2,MYJE2 - DO I=MYIS1,MYIE1 - IF(K>KTS)THEN - grid%q2(I,J,K)=MAX(SZJ(I,J,K,P_SZJ3)+SZJ(I,J,K,P_SZJ3)-grid%q2(I,J,K+1) & - ,EPSQ2) - ELSE - grid%q2(I,J,K)=grid%q2(I,J,K+1) - ENDIF - ENDDO - ENDDO - ENDDO -!----------------------------------------------------------------------- - -! -!*** UPDATE MOIST ARRAY. -!*** REMEMBER THAT MOIST IS ONLY USED WITH THE PHYSICS AND THUS -!*** THE P_QV SLOT (=2) IS MIXING RATIO, NOT SPECIFIC HUMIDITY. -!*** ALTHOUGH MOIST IS ONLY USED FOR PHYSICS IN OPERATIONS, IT IS -!*** UPDATED HERE FROM grid%q EVERY ADVECTION TIMESTEP FOR NON-OPERATIONAL -!*** CONFIGURATIONS WHERE IT MAY BE USED OUTSIDE OF THE PHYSICS. -! - IF(.NOT.OPERATIONAL_PHYSICS)THEN - call ETAMP_TO_MOIST() - ENDIF -! - had2_tim=had2_tim+now_time()-btimx -!----------------------------------------------------------------------- -! - ENDIF idtadt_block -! -!----------------------------------------------------------------------- -! - ENDIF eulerian ! eulerian advection for model tracers -! -!----------------------------------------------------------------------- -! -! -!----------------------------------------------------------------------- -!*** PRESSURE TENDENCY, ETA/SIGMADOT, VERTICAL PART OF OMEGA-ALPHA TERM -!----------------------------------------------------------------------- -! - btimx=now_time() -! - call check_grid(grid,config_flags,'before VTOA', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL VTOA( & - & grid%ntsd,GRID%DT,grid%pt,grid%eta2 & - & ,grid%hbm2,grid%ef4t & - & ,grid%t,grid%dwdt,grid%rtop,grid%omgalf & - & ,grid%pint,grid%div,grid%psdt,grid%res & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - vtoa_tim=vtoa_tim+now_time()-btimx -! -!----------------------------------------------------------------------- -!*** VERTICAL ADVECTION OF HEIGHT -!----------------------------------------------------------------------- -! - btimx=now_time() -! - - - - call check_grid(grid,config_flags,'before VADZ', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL VADZ(grid%ntsd,GRID%DT,grid%fis,GRID%SIGMA,grid%dfl,grid%hbm2 & - & ,grid%deta1,grid%deta2,grid%pdtop & - & ,grid%pint,grid%pdsl,grid%pdslo,grid%petdt & - & ,grid%rtop,grid%t,grid%q,grid%cwm,grid%z,grid%w,grid%dwdt,grid%pdwdt & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - - vadz_tim=vadz_tim+now_time()-btimx -! -!----------------------------------------------------------------------- -!*** HORIZONTAL ADVECTION OF HEIGHT -!----------------------------------------------------------------------- -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after vadz') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_G.inc" -#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo G') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! - btimx=now_time() -! - call check_grid(grid,config_flags,'before HADZ', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL HADZ(grid%ntsd,GRID%DT,grid%hydro,grid%hbm2,grid%deta1,grid%deta2,grid%pdtop & - & ,grid%dx_nmm,grid%dy_nmm,grid%fad & - & ,grid%few,grid%fns,grid%fne,grid%fse & - & ,grid%pdsl,grid%u,grid%v,grid%w,grid%z,WP,grid%BARO & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - hadz_tim=hadz_tim+now_time()-btimx -! -!----------------------------------------------------------------------- -!*** ADVECTION OF grid%w -!----------------------------------------------------------------------- -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after hadz') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_H.inc" -#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo H') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! - btimx=now_time() -! - call check_grid(grid,config_flags,'before EPS', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - - CALL EPS(grid%ntsd,GRID%DT,grid%hydro,grid%dx_nmm,grid%dy_nmm,grid%fad & - & ,grid%aeta1,grid%deta1,grid%deta2,grid%pdtop,grid%pt & - & ,grid%hbm2,grid%hbm3 & - & ,grid%pdsl,grid%pdslo,grid%pint,grid%rtop,grid%petdt,grid%pdwdt & - & ,grid%dwdt,grid%dwdtmn,grid%dwdtmx & - & ,grid%fns,grid%few,grid%fne,grid%fse & - & ,grid%t,grid%u,grid%v,grid%w,grid%w_tot,grid%q,grid%cwm & - & ,grid%def3d,grid%hdac,grid%baro & - & ,WP,dwdt_damping_lev & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - eps_tim=eps_tim+now_time()-btimx -! -!----------------------------------------------------------------------- -! - not_euler: IF(.NOT.EULER) THEN ! Lagrangian model tracer advection -! -!----------------------------------------------------------------------- -!*** VERTICAL ADVECTION OF grid%q, TKE, AND CLOUD WATER -!----------------------------------------------------------------------- -! - call check_grid(grid,config_flags,'before VAD2', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - IF(MOD(grid%ntsd,GRID%IDTAD)==0)THEN - btimx=now_time() -! - vad2_micro_check: IF (ETAMP_PHYSICS) THEN - CALL VAD2(grid%ntsd,GRID%DT,GRID%IDTAD,grid%dx_nmm,grid%dy_nmm & - & ,grid%aeta1,grid%aeta2,grid%deta1,grid%deta2,grid%pdsl,grid%pdtop,grid%hbm2 & - & ,grid%q,grid%q2,grid%cwm,grid%petdt & - & ,grid%n_iup_h,grid%n_iup_v & - & ,grid%n_iup_adh,grid%n_iup_adv & - & ,grid%iup_h,grid%iup_v,grid%iup_adh,grid%iup_adv & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - ELSE vad2_micro_check - CALL VAD2_SCAL(grid%ntsd,GRID%DT,GRID%IDTAD,grid%dx_nmm,grid%dy_nmm & - & ,grid%aeta1,grid%aeta2,grid%deta1,grid%deta2,grid%pdsl,grid%pdtop & - & ,grid%hbm2 & - & ,grid%q2,grid%petdt & - & ,grid%n_iup_h,grid%n_iup_v & - & ,grid%n_iup_adh,grid%n_iup_adv & - & ,grid%iup_h,grid%iup_v,grid%iup_adh,grid%iup_adv & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,1,1 & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - - CALL VAD2_SCAL(grid%ntsd,GRID%DT,GRID%IDTAD,grid%dx_nmm,grid%dy_nmm & - & ,grid%aeta1,grid%aeta2,grid%deta1,grid%deta2,grid%pdsl,grid%pdtop & - & ,grid%hbm2 & - & ,MOIST,grid%petdt & - & ,grid%n_iup_h,grid%n_iup_v & - & ,grid%n_iup_adh,grid%n_iup_adv & - & ,grid%iup_h,grid%iup_v,grid%iup_adh,grid%iup_adv & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,NUM_MOIST,2 & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - CALL VAD2_SCAL(grid%ntsd,GRID%DT,GRID%IDTAD,grid%dx_nmm,grid%dy_nmm & - & ,grid%aeta1,grid%aeta2,grid%deta1,grid%deta2,grid%pdsl,grid%pdtop & - & ,grid%hbm2 & - & ,SCALAR,grid%petdt & - & ,grid%n_iup_h,grid%n_iup_v & - & ,grid%n_iup_adh,grid%n_iup_adv & - & ,grid%iup_h,grid%iup_v,grid%iup_adh,grid%iup_adv & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,NUM_SCALAR,2 & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - - DO K=KTS,KTE - DO J=MYJS,MYJE - DO I=MYIS,MYIE - grid%q(I,J,K)=MOIST(I,J,K,P_QV)/(1.+MOIST(I,J,K,P_QV)) - ENDDO - ENDDO - ENDDO -! - ENDIF vad2_micro_check -! - vad2_tim=vad2_tim+now_time()-btimx -! - ENDIF -! -!----------------------------------------------------------------------- -!*** HORIZONTAL ADVECTION OF grid%q, TKE, AND CLOUD WATER -!----------------------------------------------------------------------- -! - idtad_block: IF(MOD(grid%ntsd,GRID%IDTAD)==0)THEN -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after vad2') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_I.inc" -#endif -! -#ifdef DM_PARALLEL - IF (.NOT.ETAMP_PHYSICS) THEN -# include "HALO_NMM_I_3.inc" - ENDIF -#endif -! -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo I & I3') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! - btimx=now_time() -! -!----------------------------------------------------------------------- - call check_grid(grid,config_flags,'before HAD2', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - had2_micro_check: IF (ETAMP_PHYSICS) THEN -!----------------------------------------------------------------------- -! - CALL HAD2( & -#if defined(DM_PARALLEL) - & GRID%DOMDESC, & -#endif - & grid%ntsd,GRID%DT,GRID%IDTAD,grid%dx_nmm,grid%dy_nmm & - & ,grid%aeta1,grid%aeta2,grid%deta1,grid%deta2,grid%pdsl,grid%pdtop & - & ,grid%hbm2,grid%hbm3 & - & ,grid%q,grid%q2,grid%cwm,grid%u,grid%v,grid%z,grid%hydro & - & ,grid%n_iup_h,grid%n_iup_v & - & ,grid%n_iup_adh,grid%n_iup_adv & - & ,grid%iup_h,grid%iup_v,grid%iup_adh,grid%iup_adv & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,advect_Q2 & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! -!*** UPDATE MOIST ARRAY. -!*** REMEMBER THAT MOIST IS ONLY USED WITH THE PHYSICS AND THUS -!*** THE P_QV SLOT (=2) IS MIXING RATIO, NOT SPECIFIC HUMIDITY. -!*** ALTHOUGH MOIST IS ONLY USED FOR PHYSICS IN OPERATIONS, IT IS -!*** UPDATED HERE FROM grid%q EVERY ADVECTION TIMESTEP FOR NON-OPERATIONAL -!*** CONFIGURATIONS WHERE IT MAY BE USED OUTSIDE OF THE PHYSICS. -! - IF(.NOT.OPERATIONAL_PHYSICS)THEN - call ETAMP_TO_MOIST() - ENDIF -! -!----------------------------------------------------------------------- - ELSE had2_micro_check -!----------------------------------------------------------------------- -! - CALL HAD2_SCAL( & -#if defined(DM_PARALLEL) - & GRID%DOMDESC, & -#endif - & grid%ntsd,GRID%DT,GRID%IDTAD,grid%dx_nmm,grid%dy_nmm & - & ,grid%aeta1,grid%aeta2,grid%deta1,grid%deta2,grid%pdsl,grid%pdtop & - & ,grid%hbm2,grid%hbm3 & - & ,grid%q2,grid%u,grid%v,grid%z,grid%hydro & - & ,grid%n_iup_h,grid%n_iup_v & - & ,grid%n_iup_adh,grid%n_iup_adv & - & ,grid%iup_h,grid%iup_v,grid%iup_adh,grid%iup_adv & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,1,1 & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - CALL HAD2_SCAL( & -#if defined(DM_PARALLEL) - & GRID%DOMDESC, & -#endif - & grid%ntsd,GRID%DT,GRID%IDTAD,grid%dx_nmm,grid%dy_nmm & - & ,grid%aeta1,grid%aeta2,grid%deta1,grid%deta2,grid%pdsl,grid%pdtop & - & ,grid%hbm2,grid%hbm3 & - & ,MOIST,grid%u,grid%v,grid%z,grid%hydro & - & ,grid%n_iup_h,grid%n_iup_v & - & ,grid%n_iup_adh,grid%n_iup_adv & - & ,grid%iup_h,grid%iup_v,grid%iup_adh,grid%iup_adv & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,NUM_MOIST,2 & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - CALL HAD2_SCAL( & -#if defined(DM_PARALLEL) - & GRID%DOMDESC, & -#endif - & grid%ntsd,GRID%DT,GRID%IDTAD,grid%dx_nmm,grid%dy_nmm & - & ,grid%aeta1,grid%aeta2,grid%deta1,grid%deta2,grid%pdsl,grid%pdtop & - & ,grid%hbm2,grid%hbm3 & - & ,SCALAR,grid%u,grid%v,grid%z,grid%hydro & - & ,grid%n_iup_h,grid%n_iup_v & - & ,grid%n_iup_adh,grid%n_iup_adv & - & ,grid%iup_h,grid%iup_v,grid%iup_adh,grid%iup_adv & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,NUM_SCALAR,2 & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - DO K=KTS,KTE - DO J=MYJS,MYJE - DO I=MYIS,MYIE - grid%q(I,J,K)=MOIST(I,J,K,P_QV)/(1.+MOIST(I,J,K,P_QV)) - ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- - ENDIF had2_micro_check -!----------------------------------------------------------------------- - had2_tim=had2_tim+now_time()-btimx -!----------------------------------------------------------------------- -! - ENDIF idtad_block -! -!---------------------------------------------------------------------- -! - ENDIF not_euler ! Lagrangian model tracer advection -! -!---------------------------------------------------------------------- -!*** RADIATION -!---------------------------------------------------------------------- -! -!*** When allocating CAM radiation 4d arrays (ozmixm, aerosolc), -!*** the following two scalars are not needed. -! - NUM_AEROSOLC=1 -! - IF(grid%ntsd<=0)THEN - NTSD_rad=grid%ntsd - ELSE -! -!*** Call radiation just BEFORE the top of the hour -!*** so that updated fields are written to history files. -! - NTSD_rad=grid%ntsd+1 - ENDIF -! -#if ( HWRF == 1 ) -!emc_2010_bugfix_h50 -! remove this - not needed for V3.2 -! call nl_get_start_hour(1,IHRST) -!emc_2010_bugfix_h50 -#endif - - call check_grid(grid,config_flags,'before RADIATION', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - IF(MOD(NTSD_rad,GRID%NRADS)==0.OR. & - & MOD(NTSD_rad,GRID%NRADL)==0)THEN -! - btimx=now_time() - IF(OPERATIONAL_PHYSICS)THEN - CALL UPDATE_MOIST(MOIST,grid%q,grid%cwm,grid%f_ice,grid%f_rain,N_MOIST & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - ENDIF -! - CALL RADIATION(NTSD_rad,GRID%DT,GRID%JULDAY,GRID%JULYR & - & ,GRID%XTIME,GRID%JULIAN & - & ,IHRST,GRID%NPHS & - & ,grid%glat,grid%glon,GRID%NRADS,GRID%NRADL & - & ,grid%deta1,grid%deta2,grid%aeta1,grid%aeta2,grid%eta1,grid%eta2,grid%pdtop,grid%pt & - & ,grid%pd,grid%res,grid%pint,grid%t,grid%q,MOIST,grid%ths,grid%albedo,grid%epsr & - & ,grid%f_ice,grid%f_rain & - & ,grid%GD_CLOUD,grid%GD_CLOUD2 & - & ,grid%sm,grid%hbm2,grid%cldfra,N_MOIST,RESTRT & - & ,grid%rlwtt,grid%rswtt,grid%rlwin,grid%rswin,grid%rswinc,grid%rswout & - & ,grid%rlwtoa,grid%rswtoa,grid%czmean & - & ,grid%cfracl,grid%cfracm,grid%cfrach,grid%sigt4 & - & ,grid%acfrst,grid%ncfrst,grid%acfrcv,grid%ncfrcv & - & ,grid%cuppt,grid%vegfrc,grid%sno,grid%htop,grid%hbot & - & ,grid%z,grid%sice,NUM_AEROSOLC,NUM_OZMIXM & - & ,OZMIXM,grid%PIN,grid%LEVSIZ & - - & ,GRID,CONFIG_FLAGS & - & ,RTHRATEN & - & ,grid%re_cloud,grid%re_ice,grid%re_snow & ! G. Thompson - & ,grid%has_reqc,grid%has_reqi,grid%has_reqs & ! G. Thompson - & ,grid%SWUPT,grid%SWUPTC,grid%SWDNT,grid%SWDNTC & - & ,grid%SWUPB,grid%SWUPBC,grid%SWDNB,grid%SWDNBC & - & ,grid%LWUPT,grid%LWUPTC,grid%LWDNT,grid%LWDNTC & - & ,grid%LWUPB,grid%LWUPBC,grid%LWDNB,grid%LWDNBC & - & ,grid%ACSWUPT,grid%ACSWUPTC,grid%ACSWDNT,grid%ACSWDNTC & - & ,grid%ACSWUPB,grid%ACSWUPBC,grid%ACSWDNB,grid%ACSWDNBC & - & ,grid%ACLWUPT,grid%ACLWUPTC,grid%ACLWDNT,grid%ACLWDNTC & - & ,grid%ACLWUPB,grid%ACLWUPBC,grid%ACLWDNB,grid%ACLWDNBC & - & ,grid%swvisdir ,grid%swvisdif & !ssib - & ,grid%swnirdir ,grid%swnirdif & !ssib - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - DO J=jts,min(jde-1,jte) - DO I=its,min(ide-1,ite) - grid%gsw(I,J)=grid%rswin(I,J)-grid%rswout(I,J) - ENDDO - ENDDO -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after rad') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_RAD.inc" -#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after rad halo') -#endif - -! -! *** NOTE *** -! grid%rlwin/grid%rswin - downward longwave/shortwave at the surface (formerly TOTLWDN/TOTSWDN) -! grid%rswinc - CLEAR-SKY downward shortwave at the surface (new for AQ) -! *** NOTE *** -! - radiation_tim=radiation_tim+now_time()-btimx - ENDIF -! -!---------------------------------------------------------------------- -!*** APPLY TEMPERATURE TENDENCY DUE TO RADIATION -!---------------------------------------------------------------------- -! - btimx=now_time() -! -! Pass in XTIME (elapsed time from start of parent) to compute -! the time passed into the zenith angle code consistently between -! RDTEMP and RADIATION. - - call check_grid(grid,config_flags,'before RDTEMP', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL RDTEMP(grid%ntsd,GRID%DT,GRID%JULDAY,GRID%JULYR & - & ,GRID%XTIME,IHRST,grid%glat,grid%glon & - & ,grid%czen,grid%czmean,grid%t,grid%rswtt,grid%rlwtt,grid%hbm2 & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - rdtemp_tim=rdtemp_tim+now_time()-btimx -! -! -#if ( HWRF == 1 ) -! -!------------------------------------------------------------------------------------- -!*** GET SSTs FROM DMITRY's COUPLER ON TO THE PARENT AND NESTED GRID -!------------------------------------------------------------------------------------- - CALL nl_get_multi_storm(1,multi_storm) - CALL nl_get_no_ocean(1,no_ocean) - IF ( .NOT. multi_storm .OR. no_ocean ) THEN - write(message,*)' No Ocean Coupling Run' - call wrf_debug(1,trim(message)) - ELSE -! Coupling insertion:-> - btimx=now_time() - CALL ATM_GETSST(grid%sst,grid%sm) - sst_tim=sst_tim+now_time()-btimx - btimx=now_time() - CALL atm_getcur(grid%scurx, grid%scury) !BT - CALL atm_getwstate(grid%charn,grid%msang) !BT - wav_tim=wav_tim+now_time()-btimx -!<-:Coupling insertion - ENDIF -#endif -!---------------------------------------------------------------------- -!*** TURBULENT PROCESSES -!---------------------------------------------------------------------- -! - turbl_time: IF(MOD(grid%ntsd,GRID%NPHS)==0)THEN -! - btimx=now_time() -! - IF(OPERATIONAL_PHYSICS & - & .AND.MOD(NTSD_rad,GRID%NRADS)/=0 & - & .AND.MOD(NTSD_rad,GRID%NRADL)/=0)THEN - CALL UPDATE_MOIST(MOIST,grid%q,grid%cwm,grid%f_ice,grid%f_rain,N_MOIST & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - ENDIF -! - call check_grid(grid,config_flags,'before TURBL', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL TURBL(grid%ntsd,GRID%DT,GRID%NPHS,RESTRT & - & ,N_MOIST,NUM_SCALAR,GRID%NUM_SOIL_LAYERS,grid%sldpth,grid%dzsoil & - & ,grid%deta1,grid%deta2,grid%aeta1,grid%aeta2,grid%eta1,grid%eta2,grid%pdtop,grid%pt & - & ,grid%sm,grid%hbm2,grid%vbm2,grid%dx_nmm,grid%dfrlg & - & ,grid%czen,grid%czmean,grid%sigt4,grid%rlwin,grid%rswin,grid%radot & - & ,grid%pd,grid%res,grid%pint,grid%t,grid%q,grid%cwm,grid%f_ice,grid%f_rain,grid%sr & - & ,grid%q2,grid%u,grid%v,grid%ths,grid%nmm_tsk,grid%sst,grid%prec,grid%sno & - & ,grid%scurx,grid%scury & - & ,grid%fis,grid%z0,grid%mz0,grid%z0base,grid%ustar,grid%mixht,grid%pblh,grid%lpbl,grid%el_pbl & !KWON MZ0 - & ,MOIST,SCALAR,grid%rmol,grid%mol & - & ,grid%exch_h,grid%exch_m,grid%f,grid%akhs,grid%akms,grid%akhs_out,grid%akms_out & - & ,grid%thz0,grid%qz0,grid%uz0,grid%vz0,grid%qsh,grid%mavail & - & ,grid%stc,grid%smc,grid%cmc,grid%smstav,grid%smstot,grid%ssroff,grid%bgroff & - & ,grid%ivgtyp,grid%isltyp,grid%vegfrc,grid%shdmin,grid%shdmax,grid%grnflx & - & ,grid%snotime & - & ,grid%sfcexc,grid%acsnow,grid%acsnom,grid%snopcx,grid%sice,grid%tg,grid%soiltb & - & ,grid%albsi,grid%icedepth,grid%snowsi & - & ,grid%albase,grid%mxsnal,grid%albedo,grid%sh2o,grid%si,grid%epsr,grid%embck & - & ,grid%u10,grid%v10,grid%uoce,grid%voce,grid%th10,grid%q10,grid%tshltr,grid%qshltr,grid%pshltr & - & ,grid%t2,grid%qsg,grid%qvg,grid%qcg,grid%soilt1,grid%tsnav,grid%smfr3d,grid%keepfr3dflag & -#if (NMM_CORE==1) - & ,grid%twbs,grid%qwbs,grid%taux,grid%tauy,grid%sfcshx,grid%sfclhx,grid%sfcevp,RTHRATEN & -#else - & ,grid%twbs,grid%qwbs,grid%sfcshx,grid%sfclhx,grid%sfcevp & -#endif - & ,grid%potevp,grid%potflx,grid%subshx & - & ,grid%aphtim,grid%ardsw,grid%ardlw,grid%asrfc & - & ,grid%rswout,grid%rswtoa,grid%rlwtoa & - & ,grid%aswin,grid%aswout,grid%aswtoa,grid%alwin,grid%alwout,grid%alwtoa & -#if (NMM_CORE==1) - & ,grid%uz0h,grid%vz0h,grid%dudt,grid%dvdt,grid%ugwdsfc,grid%vgwdsfc,grid%sfenth & -#else - & ,grid%uz0h,grid%vz0h,grid%dudt,grid%dvdt & -#endif - & ,RTHBLTEN,RQVBLTEN & - & ,GRID%PCPFLG,grid%ddata & - & ,grid%hstdv,grid%hcnvx,grid%hasyw,grid%hasys,grid%hasysw,grid%hasynw,grid%hlenw,grid%hlens & ! GWD - & ,grid%hlensw,grid%hlennw,grid%hangl,grid%hanis,grid%hslop,grid%hzmax,grid%crot,grid%srot & ! GWD - & ,grid%dew & ! RUC LSM - & ,grid%rc_mf & ! QNSE - & ,GRID,CONFIG_FLAGS & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,GRID%DISHEAT,GRID%DKU3D,GRID%DKT3D & - & ,GRID%HPBL2D, GRID%EVAP2D, GRID%HEAT2D,GRID%RC2D & !S&P Kwon - & ,GRID%SFCHEADRT,GRID%INFXSRT,GRID%SOLDRAIN & !Hydrology, no-op right now - & ,grid%cd_out,grid%ch_out & - & ,grid%ulowl,grid%vlowl & - & ,grid%zsig1,grid%rchno & - & ,grid%charn,grid%msang & - & ,grid%DUBLDT,grid%DVBLDT,grid%DTHBLDT,grid%DQVBLDT &!wang added PBL tendency output - & ,hpbl_hold & !used by new KSAS - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,IPS,IPE,JPS,JPE,KPS,KPE & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! -! *** NOTE *** -! grid%rlwin/grid%rswin - downward longwave/shortwave at the surface -! *** NOTE *** -! - turbl_tim=turbl_tim+now_time()-btimx -#if ( HWRF == 1 ) - btimx=now_time() - call sustained_wind(grid,config_flags,ips,ipe,jps,jpe,.true.) - diag_tim=diag_tim+now_time()-btimx -!------------------------------------------------------------------------------ -!*** ATMOSPHERIC MODEL OUTPUTS FROM PARENT AND NESTED GRID FOR DMITRYs COUPLER -!------------------------------------------------------------------------------ -! -!-- grid%twbs : surface sensible heat flux, positive downward (grid%w/m2) -!-- grid%qwbs : surface latent heat flux, positive downward (grid%w/m2) -!-- grid%rlwin : downward long wave flux at ground surface,positive downward (grid%w/m2) -!-- grid%rswin : downward short wave flux at ground surface, positive downward (grid%w/m2) -!-- grid%radot : outgoing long wave flux at ground surface, positive upward (grid%w/m2) -!-- grid%rswout: outgoing short wave flux at ground surface, positive upward (grid%w/m2) -!-- grid%taux : x component of surface stress, grid%u positive Eastward -!-- grid%tauy : y component of surface stress, grid%v positive Northward -!-- grid%pint : 3d array of interface pressure (pascals) -!-- grid%prec : grid%prec (m/timestep;timestep on grid1=60 sec) - -! -! - CALL nl_get_multi_storm(1,multi_storm) - CALL nl_get_no_ocean(1,no_ocean) - IF ( .NOT. multi_storm .OR. no_ocean ) THEN - write(message,*)' No Ocean Coupling Run' - call wrf_debug(1,trim(message)) - ELSE -! Coupling insertion:-> - btimx=now_time() - call ATM_DOFLUXES(grid%twbs,grid%qwbs,grid%rlwin,grid%rswin,grid%radot,grid%rswout, & - grid%taux,grid%tauy,grid%pint,grid%prec) - CALL atm_prepwindp(grid%ulowl,grid%vlowl,grid%rchno,grid%zsig1) - flux_tim=flux_tim+now_time()-btimx -!<-:Coupling insertion -! - ENDIF - IF(GRID%ID .EQ. 1 .AND. MOD(grid%ntsd,grid%NPHS)==0)THEN - btimx=now_time() - flux_tim=flux_tim+now_time()-btimx - ENDIF -#endif -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after atm_dofluxes') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_TURBL_A.inc" -#endif -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_TURBL_B.inc" -#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo TURBL A & B') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! -!*** INTERPOLATE WINDS FROM H POINTS BACK TO grid%v POINTS. -! - btimx=now_time() - CALL UV_H_TO_V(grid%ntsd,GRID%DT,GRID%NPHS,grid%uz0h,grid%vz0h,grid%uz0,grid%vz0 & - & ,grid%dudt,grid%dvdt,grid%u,grid%v,grid%hbm2,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - uv_htov_tim=uv_htov_tim+now_time()-btimx -! -!---------------------------------------------------------------------- -!*** STORE ORIGINAL TEMPERATURE ARRAY -!---------------------------------------------------------------------- -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after uv_h_to_v') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_J.inc" -#endif -! -#ifdef DM_PARALLEL - IF (.NOT.ETAMP_PHYSICS) THEN -# include "HALO_NMM_J_3.inc" - ENDIF -#endif -! -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo J, J2 & J3') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! - ICLTEND=-1 - btimx=now_time() -! - call check_grid(grid,config_flags,'before CLTEND', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL CLTEND(ICLTEND,GRID%NPHS,grid%t,grid%t_old,grid%t_adj & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - cltend_tim=cltend_tim+now_time()-btimx -#if ( HWRF == 1 ) - ELSE - btimx=now_time() - call sustained_wind(grid,config_flags,ips,ipe,jps,jpe,.false.) - diag_tim=diag_tim+now_time()-btimx -#endif - ENDIF turbl_time -! -!---------------------------------------------------------------------- -!*** CONVECTIVE PRECIPITATION -!---------------------------------------------------------------------- -! - IF(MOD(grid%ntsd,GRID%NCNVC)==0.AND. & - & (CONFIG_FLAGS%CU_PHYSICS.eq.KFETASCHEME .or. & - & CONFIG_FLAGS%CU_PHYSICS.eq.OSASSCHEME .or. & - & CONFIG_FLAGS%CU_PHYSICS.eq.KSASSCHEME .or. & - & CONFIG_FLAGS%CU_PHYSICS.eq.NSASSCHEME .or. & - & CONFIG_FLAGS%CU_PHYSICS.eq.SCALESASSCHEME .or. & - & CONFIG_FLAGS%CU_PHYSICS.eq.SASSCHEME))THEN ! -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after cltend') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_C.inc" -#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo C') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max - ENDIF -! - convection: IF(CONFIG_FLAGS%CU_PHYSICS/=0)THEN - btimx=now_time() -! -!*** GET TENDENCIES FOR GD SCHEME. -! - IF(CONFIG_FLAGS%CU_PHYSICS==GDSCHEME.OR. & - & CONFIG_FLAGS%CU_PHYSICS==TIEDTKESCHEME.OR. & - & CONFIG_FLAGS%CU_PHYSICS==KFETASCHEME)THEN - DT_INV=1./GRID%DT - DO J=JMS,JME - DO K=KMS,KME - DO I=IMS,IME - TTEN(I,K,J)=(grid%t(I,J,K)-TTEN(I,K,J))*DT_INV - QTEN(I,K,J)=(grid%q(I,J,K)-QTEN(I,K,J))*DT_INV - ENDDO - ENDDO - ENDDO - ENDIF -! -!*** UPDATE THE MOIST ARRAY IF NEEDED. -! - IF(OPERATIONAL_PHYSICS & - & .AND.MOD(NTSD_rad,GRID%NRADS)/=0 & - & .AND.MOD(NTSD_rad,GRID%NRADL)/=0 & - & .AND.MOD(grid%ntsd,GRID%NPHS)/=0)THEN - CALL UPDATE_MOIST(MOIST,grid%q,grid%cwm,grid%f_ice,grid%f_rain,N_MOIST & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - ENDIF -! -!---------------------------------------------------------------------- - call check_grid(grid,config_flags,'before CUCNVC', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL CUCNVC(grid%ntsd,GRID%DT,GRID%NCNVC,GRID%NRADS,GRID%NRADL & - & ,GPS,RESTRT,grid%hydro,grid%cldefi,N_MOIST,NUM_SCALAR,GRID%ENSDIM & - & ,MOIST,SCALAR & - & ,grid%deta1,grid%deta2,grid%aeta1,grid%aeta2,grid%eta1,grid%eta2 & - & ,grid%f_ice,grid%f_rain & -!*** Changes for other cu schemes, most for GD scheme - & ,grid%apr_gr,grid%apr_w,grid%apr_mc,TTEN,QTEN & - & ,grid%apr_st,grid%apr_as,grid%apr_capma & - & ,grid%apr_capme,grid%apr_capmi & - & ,grid%mass_flux,grid%xf_ens & - & ,grid%pr_ens,grid%gsw & - & ,grid%GD_CLOUD,grid%GD_CLOUD2,grid%ktop_deep & - & ,grid%pdtop,grid%pt,grid%pd,grid%res,grid%pint,grid%t,grid%q,grid%cwm,grid%tcucn & - & ,grid%omgalf,grid%u,grid%v,grid%w,grid%z,grid%fis,grid%w0avg & - & ,grid%prec,grid%acprec,grid%cuprec,grid%cuppt,grid%cprate & - & ,grid%sm,grid%hbm2,grid%pblh,grid%lpbl,grid%cnvbot,grid%cnvtop & - & ,grid%htop,grid%hbot,grid%htopd,grid%hbotd,grid%htops,grid%hbots & - & ,RTHBLTEN,RQVBLTEN,RTHRATEN & -#if (NMM_CORE==1) - & ,grid%twbs,grid%qwbs & - & ,grid%DUCUDT, grid%DVCUDT, GRID%MOMMIX, grid%random & - & ,grid%DTHCUDT,grid%DQVCUDT,grid%DQRCUDT,grid%DQCCUDT&! wang, output CU tendency - & ,grid%DQICUDT,grid%DQSCUDT & -#endif - & ,grid%hpbl2d,grid%evap2d,grid%heat2d & - & ,grid%dx_nmm,grid%dy_nmm & !wang, dx2d, dy - & ,grid%scalefun, grid%scalefun1 & !wang - & ,grid%sigmu, grid%sigmu1 & !wang - & ,grid%avcnvc,grid%acutim,grid%ihe,grid%ihw & - & ,GRID,CONFIG_FLAGS & - & ,hpbl_hold & !used by new KSAS - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,IPS,IPE,JPS,JPE,KPS,KPE & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - call check_grid(grid,config_flags,'after CUCNVC', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) -!---------------------------------------------------------------------- -! - cucnvc_tim=cucnvc_tim+now_time()-btimx -! - - -#if (NMM_CORE==1) -!#if ( HWRF == 1 ) -!------------------------------------------------------------------------------------- -! This is gopal's doing for HWRFSAS - -! IF(MOD(grid%ntsd,GRID%NCNVC).eq.0.and.(CONFIG_FLAGS%CU_PHYSICS.eq.OSASSCHEME))THEN -! update to match HWRFV2 behaviour - review later (1/15/10) -! -!emc_2010_bugfix_h50 - IF(MOD(grid%ntsd, GRID%NCNVC).eq.0.and. & - & (CONFIG_FLAGS%CU_PHYSICS.eq.OSASSCHEME.or. & - & CONFIG_FLAGS%CU_PHYSICS.eq.KSASSCHEME.or. & - & CONFIG_FLAGS%CU_PHYSICS.eq.NSASSCHEME.or. & - & CONFIG_FLAGS%CU_PHYSICS.eq.SCALESASSCHEME.or. & - & CONFIG_FLAGS%CU_PHYSICS.eq.SASSCHEME))THEN -!emc_2010_bugfix_h50 -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after cucnvc') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_SAS_A.inc" -#endif -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_SAS_B.inc" -#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx - -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo SAS A & B') -#endif -! -!*** INTERPOLATE WINDS FROM H POINTS BACK TO V POINTS AFTER SAS -! - btimx=now_time() - -!emc_2010_bugfix_h50 - CALL UV_H_TO_V(grid%NTSD,GRID%DT,GRID%NCNVC,grid%UZ0H,grid%VZ0H,grid%UZ0,grid%VZ0 & - & ,grid%DUCUDT,grid%DVCUDT,grid%U,grid%V,grid%HBM2,grid%IVE,grid%IVW & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - uv_htov_tim=uv_htov_tim+now_time()-btimx -!emc_2010_bugfix_h50 - - ENDIF ! for SAS only -!#endif -#endif -!-------------------------------------------------------------------------------- -! - ENDIF convection -! -!---------------------------------------------------------------------- -!*** GRIDSCALE MICROPHYSICS (CONDENSATION & PRECIPITATION) -!---------------------------------------------------------------------- -! - IF(MOD(grid%ntsd,GRID%NPHS)==0)THEN - btimx=now_time() -! - call check_grid(grid,config_flags,'before GSMDRIVE', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL GSMDRIVE(grid%ntsd,GRID%DT,GRID%NPHS,N_MOIST & - & ,grid%dx_nmm(ITS,JC),GRID%DY,grid%sm,grid%hbm2,grid%fis & - & ,grid%deta1,grid%deta2,grid%aeta1,grid%aeta2,grid%eta1,grid%eta2 & - & ,grid%pdtop,grid%pt,grid%pd,grid%res,grid%pint,grid%t,grid%q,grid%cwm,grid%train & - & ,MOIST,SCALAR,NUM_SCALAR & - & ,grid%f_ice,grid%f_rain,grid%f_rimef,grid%sr & - & ,grid%prec,grid%acprec,grid%avrain & - & ,grid%mp_restart_state & - & ,grid%tbpvs_state & - & ,grid%tbpvs0_state & - & ,GRID,CONFIG_FLAGS & - & ,grid%re_cloud,grid%re_ice,grid%re_snow & ! G. Thompson - & ,grid%has_reqc,grid%has_reqi,grid%has_reqs & ! G. Thompson - & ,diag_flag & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - call check_grid(grid,config_flags,'after GSMDRIVE', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) -! - gsmdrive_tim=gsmdrive_tim+now_time()-btimx -! -!----------------------------------------------------------------------- -!---------PRECIPITATION ASSIMILATION------------------------------------ -!----------------------------------------------------------------------- -! - IF (GRID%PCPFLG) THEN - btimx=now_time() -! - CALL CHKSNOW(grid%ntsd,GRID%DT,GRID%NPHS,grid%sr,PPTDAT & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - CALL ADJPPT(grid%ntsd,GRID%DT,GRID%NPHS,grid%prec,grid%lspa,PPTDAT,grid%ddata & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - adjppt_tim=adjppt_tim+now_time()-btimx - ENDIF -! -!---------------------------------------------------------------------- -!*** CALCULATE TEMP TENDENCIES AND RESTORE ORIGINAL TEMPS -!---------------------------------------------------------------------- -! - ICLTEND=0 - btimx=now_time() -! - CALL CLTEND(ICLTEND,GRID%NPHS,grid%t,grid%t_old,grid%t_adj & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - cltend_tim=cltend_tim+now_time()-btimx - ENDIF -! -!---------------------------------------------------------------------- -!*** UPDATE TEMP TENDENCIES FROM CLOUD PROCESSES EVERY TIME STEP -!---------------------------------------------------------------------- -! - ICLTEND=1 - btimx=now_time() -! - CALL CLTEND(ICLTEND,GRID%NPHS,grid%t,grid%t_old,grid%t_adj & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - cltend_tim=cltend_tim+now_time()-btimx -! -!---------------------------------------------------------------------- -!*** LATERAL DIFFUSION -!---------------------------------------------------------------------- -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after GSMDRIVE and a few other things') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_K.inc" -#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo K') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! - btimx=now_time() -! - CALL HDIFF(grid%ntsd,GRID%DT,grid%fis,grid%dy_nmm,grid%hdac,grid%hdacv & - & ,grid%hbm2,grid%deta1,GRID%SIGMA & -#if ( HWRF == 1 ) - & ,grid%t,grid%q,grid%u,grid%v,grid%q2,grid%z,grid%w,grid%sm,grid%sice,grid%h_diff & -#else - & ,grid%t,grid%q,grid%u,grid%v,grid%q2,grid%z,grid%w,grid%sm,grid%sice & -#endif - & ,grid%def3d & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,CONFIG_FLAGS & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -! - call check_grid(grid,config_flags,'after HDIFF', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - IF(.NOT.OPERATIONAL_PHYSICS)THEN - DO K=KTS,KTE - DO J=MYJS,MYJE - DO I=MYIS,MYIE -!!! MOIST(I,J,K,P_QV)=MAX(0.,grid%q(I,J,K)/(1.-grid%q(I,J,K))) - MOIST(I,J,K,P_QV)=grid%q(I,J,K)/(1.-grid%q(I,J,K)) !<-- Update mixing ratio - ENDDO - ENDDO - ENDDO - ENDIF -! - hdiff_tim=hdiff_tim+now_time()-btimx -! -!---------------------------------------------------------------------- -!*** UPDATING BOUNDARY VALUES AT HEIGHT POINTS -!---------------------------------------------------------------------- -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after hdiff') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_L.inc" -#endif -! -#ifdef DM_PARALLEL -# include "HALO_NMM_L_3.inc" -#endif -! -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo L, L2 & L3') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! - btimx=now_time() -! - call check_grid(grid,config_flags,'before mass_boundary', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL MASS_BOUNDARY(GRID%ID,grid%ntsd,GRID%DT,NEST,NUNIT_NBC,NBOCO,LAST_TIME,TSPH & - & ,LB,grid%eta1,grid%eta2,grid%pdtop,grid%pt,grid%res & - & ,grid%PD_BXS,grid%PD_BXE,grid%PD_BYS,grid%PD_BYE,grid%T_BXS,grid%T_BXE,grid%T_BYS,grid%T_BYE & - & ,grid%Q_BXS,grid%Q_BXE,grid%Q_BYS,grid%Q_BYE,grid%U_BXS,grid%U_BXE,grid%U_BYS,grid%U_BYE,grid%V_BXS & - & ,grid%V_BXE,grid%V_BYS,grid%V_BYE,grid%Q2_BXS,grid%Q2_BXE,grid%Q2_BYS,grid%Q2_BYE & - & ,grid%PD_BTXS,grid%PD_BTXE,grid%PD_BTYS & - & ,grid%PD_BTYE,grid%T_BTXS,grid%T_BTXE,grid%T_BTYS,grid%T_BTYE,grid%Q_BTXS,grid%Q_BTXE & - & ,grid%Q_BTYS,grid%Q_BTYE,grid%U_BTXS,grid%U_BTXE,grid%U_BTYS,grid%U_BTYE,grid%V_BTXS & - & ,grid%V_BTXE,grid%V_BTYS,grid%V_BTYE,grid%Q2_BTXS,grid%Q2_BTXE,grid%Q2_BTYS,grid%Q2_BTYE & - & ,grid%pd,grid%t,grid%q,grid%q2,grid%pint & -!!BEGIN: LSM changes for LANDFALL: Subashini 7/27/2016 -#ifdef IDEAL_NMM_TC - & ,grid%SM_BXS, grid%SM_BXE, grid%SM_BYS, grid%SM_BYE & ! gopal's doing for land motion - & ,grid%SM_BTXS, grid%SM_BTXE, grid%SM_BTYS, grid%SM_BTYE & - & ,grid%SM & - & ,grid%THS & -#endif -!!END: LSM changes for LANDFALL : Subashini 7/27/2016 - & ,GRID%SPEC_BDY_WIDTH,grid%z & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - call check_grid(grid,config_flags,'after MASS_BOUNDARY', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) -#if (NMM_NEST==1) - if(ETAMP_PHYSICS) then -#endif -! write(0,*) 'MP_BULK_BOUNDARY' - CALL MP_BULK_BOUNDARY(GRID%ID,grid%ntsd,GRID%DT & - & ,LB,grid%eta1,grid%eta2,grid%pdtop,grid%pt & - & ,grid%CWM_BXS,grid%CWM_BXE,grid%CWM_BYS,grid%CWM_BYE & - & ,grid%CWM_BTXS,grid%CWM_BTXE,grid%CWM_BTYS,grid%CWM_BTYE& - & ,grid%q,grid%cwm & - & ,MOIST,N_MOIST,SCALAR,NUM_SCALAR & - & ,GRID%SPEC_BDY_WIDTH & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -#if (NMM_NEST==1) - else - CALL MP_SPECIES_BDY(grid%id,1,grid%dt, & - grid%CWM,grid%Q, & - MOIST,N_MOIST, & - MOIST_bxs,MOIST_bxe,MOIST_bys,MOIST_bye, & - MOIST_btxs,MOIST_btxe,MOIST_btys,MOIST_btye, & - SCALAR,NUM_SCALAR, & - SCALAR_bxs,SCALAR_bxe,SCALAR_bys,SCALAR_bye, & - SCALAR_btxs,SCALAR_btxe,SCALAR_btys,SCALAR_btye,& - ids,idf,jds,jdf,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - endif -#endif - call check_grid(grid,config_flags,'after boundaries', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) -! - bocoh_tim=bocoh_tim+now_time()-btimx -! if(mod(grid%ntsd,n_print_time)==0)then -! call twr(grid%t,0,'grid%t',grid%ntsd,mype,npes,mpi_comm_comp & -! & ,ids,ide,jds,jde,kds,kde & -! & ,ims,ime,jms,jme,kms,kme & -! & ,its,ite,jts,jte,kts,kte) -! endif -! -!---------------------------------------------------------------------- -!*** IS IT TIME FOR A CHECK POINT ON THE MODEL HISTORY FILE? -!---------------------------------------------------------------------- -! - 2003 CONTINUE -! -!---------------------------------------------------------------------- -!*** PRESSURE GRD, CORIOLIS, DIVERGENCE, AND HORIZ PART OF OMEGA-ALPHA -!---------------------------------------------------------------------- -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after h bdy') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_A.inc" -#endif -! -#ifdef DM_PARALLEL - IF (ETAMP_PHYSICS) THEN -# include "HALO_NMM_A_3.inc" - ENDIF -#endif -! -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo A, A2 and A3 after h bdy') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! - btimx=now_time() -! - call check_grid(grid,config_flags,'before PFDHT', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL PFDHT(grid%ntsd,LAST_TIME,grid%pt,grid%deta1,grid%deta2,grid%pdtop,grid%res,grid%fis & - & ,grid%hydro,GRID%SIGMA,FIRST,grid%dx_nmm,grid%dy_nmm & - & ,grid%hbm2,grid%vbm2,grid%vbm3 & - & ,grid%fdiv,grid%fcp,grid%wpdar,grid%dfl,grid%cpgfu,grid%cpgfv & - & ,grid%pd,grid%pdsl,grid%t,grid%q,grid%u,grid%v,grid%cwm,grid%omgalf,grid%pint,grid%dwdt & - & ,grid%rtop,grid%div,grid%few,grid%fns,grid%fne,grid%fse & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - call check_grid(grid,config_flags,'after PFDHT', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - -! - pfdht_tim=pfdht_tim+now_time()-btimx -! -!---------------------------------------------------------------------- -!*** DIVERGENCE DAMPING -!---------------------------------------------------------------------- -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after pfdht') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_B.inc" -#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo B after pfdht') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! - btimx=now_time() -! - call check_grid(grid,config_flags,'before DDAMP', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL DDAMP(grid%ntsd,GRID%DT,grid%deta1,grid%deta2,grid%pdsl & - & ,grid%pdtop,grid%div,grid%hbm2 & - & ,grid%t,grid%u,grid%v,grid%ddmpu,grid%ddmpv & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) - call check_grid(grid,config_flags,'after DDAMP', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) -! - ddamp_tim=ddamp_tim+now_time()-btimx -! -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- -! - IF(FIRST.AND.grid%ntsd==0)THEN - FIRST=.FALSE. -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after ddamp') -#endif - btimx=now_time() -!----------------- -!!#ifdef DM_PARALLEL -!!# include "HALO_NMM_A.inc" -!!#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo A & A2 after ddamp') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! - GO TO 2000 - ENDIF -! -!---------------------------------------------------------------------- -!*** UPDATING BOUNDARY VALUES AT VELOCITY POINTS -!---------------------------------------------------------------------- -! -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after ddamp again') -#endif - btimx=now_time() -!----------------- -#ifdef DM_PARALLEL -# include "HALO_NMM_C.inc" -#endif -!----------------- - exch_tim=exch_tim+now_time()-btimx -#ifdef NMM_FIND_LOAD_IMBALANCE - call blockf(loadimbal_tim,'after halo C after ddamp') -#endif -! this_tim=now_time()-btimx -! call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max & -! & ,mpi_comm_comp,irtn) -! exch_tim_max=exch_tim_max+et_max -! - btimx=now_time() -! - CALL BOCOV(GRID%ID,grid%ntsd,GRID%DT,LB,grid%U_BXS,grid%U_BXE,grid%U_BYS,grid%U_BYE,grid%V_BXS & - & ,grid%V_BXE,grid%V_BYS,grid%V_BYE,grid%U_BTXS,grid%U_BTXE,grid%U_BTYS,grid%U_BTYE,grid%V_BTXS & - & ,grid%V_BTXE,grid%V_BTYS,grid%V_BTYE,grid%u,grid%v & - & ,GRID%SPEC_BDY_WIDTH & - & ,grid%ihe,grid%ihw,grid%ive,grid%ivw & - & ,IDS,IDF,JDS,JDF,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE ) - -! - bocov_tim=bocov_tim+now_time()-btimx -! -!---------------------------------------------------------------------- -!*** COPY THE NMM VARIABLE grid%q2 TO THE WRF VARIABLE grid%tke_pbl -!---------------------------------------------------------------------- -! - DO K=KTS,KTE - DO J=JTS,JTE - DO I=ITS,ITE - grid%tke_pbl(I,J,K)=0.5*grid%q2(I,J,K) !TKE is grid%q squared over 2 - ENDDO - ENDDO - ENDDO - -! calculate some model diagnostics. - - IF ( config_flags%compute_radar_ref .EQ. 1 ) THEN - CALL wrf_debug ( 200 , ' call diagnostic_driver' ) - - call check_grid(grid,config_flags,'before diag o c r', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - CALL diagnostic_output_calc_refl( & - & DIAGFLAG=diag_flag & - & ,REFD_MAX=grid%refd_max & - & ,refl_10cm=grid%refl_10cm & - & ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde & - & ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme & - & ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte & - & ) - call check_grid(grid,config_flags,'after diag o c r', & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte) - END IF - -! -!---------------------------------------------------------------------- -! - IF(LAST_TIME.AND.ALLOCATED(PPTDAT))THEN - DEALLOCATE(PPTDAT,STAT=ISTAT) - ENDIF -! -!---------------------------------------------------------------------- -! - solve_tim=solve_tim+now_time()-ttim - ttim=now_time() -! -!---------------------------------------------------------------------- -!*** PRINT TIMING VARIABLES WHEN DESIRED. -!---------------------------------------------------------------------- -! - sum_tim=pdte_tim+adve_tim+vtoa_tim+vadz_tim+hadz_tim+eps_tim & - & +vad2_tim+had2_tim+radiation_tim+rdtemp_tim+turbl_tim & - & +cltend_tim+cucnvc_tim+gsmdrive_tim+hdiff_tim & - & +bocoh_tim+pfdht_tim+ddamp_tim+bocov_tim+uv_htov_tim & - & +exch_tim+adjppt_tim -#if defined(NMM_FIND_LOAD_IMBALANCE) - sum_tim=sum_tim + loadimbal_tim + previmbal_tim -#endif -! - if(mod(grid%ntsd,n_print_time)==0)then - sum_tim = adjppt_tim + exch_tim + pdte_tim + adve_tim + vtoa_tim + & - vadz_tim + hadz_tim + eps_tim + vad2_tim + had2_tim + & - radiation_tim + rdtemp_tim + turbl_tim + cltend_tim + & - cucnvc_tim + gsmdrive_tim + hdiff_tim + bocoh_tim + & - pfdht_tim + ddamp_tim + bocov_tim + uv_htov_tim + diag_tim + & - tornado_tim -#if ( HWRF == 1 ) - sum_tim = sum_tim + sst_tim + flux_tim + hifreq_tim + wav_tim + cplstep_tim -#endif -#if defined(NMM_FIND_LOAD_IMBALANCE) - sum_tim=sum_tim + loadimbal_tim + previmbal_tim -#endif -! -17 format(A16,F13.6,A5,F7.3,'%') - write(message,*)' grid%ntsd=',grid%ntsd,' solve_tim=',solve_tim & - & ,' sum_tim=',sum_tim - call wrf_message(trim(message)) -#ifdef NMM_FIND_LOAD_IMBALANCE - write(message,*)' running on cpu ',cpu - call wrf_message(trim(message)) -#endif - write(message,17)' pdte_tim=',pdte_tim,' pct=',pdte_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' adve_tim=',adve_tim,' pct=',adve_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' vtoa_tim=',vtoa_tim,' pct=',vtoa_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' vadz_tim=',vadz_tim,' pct=',vadz_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' hadz_tim=',hadz_tim,' pct=',hadz_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' eps_tim=',eps_tim,' pct=',eps_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' vad2_tim=',vad2_tim,' pct=',vad2_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' had2_tim=',had2_tim,' pct=',had2_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' radiation_tim=',radiation_tim,' pct=',radiation_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' rdtemp_tim=',rdtemp_tim,' pct=',rdtemp_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' turbl_tim=',turbl_tim,' pct=',turbl_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' cltend_tim=',cltend_tim,' pct=',cltend_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' cucnvc_tim=',cucnvc_tim,' pct=',cucnvc_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' gsmdrive_tim=',gsmdrive_tim,' pct=',gsmdrive_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' adjppt_tim=',adjppt_tim,' pct=',adjppt_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' hdiff_tim=',hdiff_tim,' pct=',hdiff_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' bocoh_tim=',bocoh_tim,' pct=',bocoh_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' pfdht_tim=',pfdht_tim,' pct=',pfdht_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' ddamp_tim=',ddamp_tim,' pct=',ddamp_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' bocov_tim=',bocov_tim,' pct=',bocov_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' uv_h_to_v_tim=',uv_htov_tim,' pct=',uv_htov_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' exch_tim=',exch_tim,' pct=',exch_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' diag_tim=',diag_tim,' pct=',diag_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' tornado_tim=',tornado_tim,' pct=',tornado_tim/sum_tim*100. - call wrf_message(trim(message)) -#if ( HWRF == 1 ) - write(message,17)' sst_tim=',sst_tim,' pct=',sst_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' cplstep_tim=',cplstep_tim,' pct=',cplstep_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' wav_tim=',wav_tim,' pct=',wav_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' flux_tim=',flux_tim,' pct=',flux_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' hifreq_tim=',hifreq_tim,' pct=',hifreq_tim/sum_tim*100. - call wrf_message(trim(message)) -#endif -#ifdef NMM_FIND_LOAD_IMBALANCE - write(message,17)' loadimbal_tim=',loadimbal_tim,' pct=',loadimbal_tim/sum_tim*100. - call wrf_message(trim(message)) - write(message,17)' previmbal_tim=',previmbal_tim,' pct=',previmbal_tim/sum_tim*100. - call wrf_message(trim(message)) -#endif - -! call time_stats(exch_tim,'exchange',grid%ntsd,mype,npes,mpi_comm_comp) -! write(message,17)' exch_tim_max=',exch_tim_max -! call wrf_message(trim(message)) -! - call field_stats(grid%t,mype,mpi_comm_comp & - & ,ids,ide,jds,jde,kds,kde & - & ,ims,ime,jms,jme,kms,kme & - & ,its,ite,jts,jte,kts,kte) - endif -! -! if(last_time)then - DEALLOCATE(TTEN,STAT=ISTAT) - DEALLOCATE(QTEN,STAT=ISTAT) - DEALLOCATE(RTHRATEN,STAT=ISTAT) - DEALLOCATE(RTHBLTEN,STAT=ISTAT) - DEALLOCATE(RQVBLTEN,STAT=ISTAT) -! -! FOR VORTEX FOLLOWING MOVING NEST -! - - - -!----------------------------------------------------------------------------- -!*** CRITERIA SET FOR GRID MOTION. This is gopal's doing -!----------------------------------------------------------------------------- -! -#ifdef MOVE_NESTS - IF ( grid%num_moves.EQ.-99 ) THEN - btimx=now_time() - call stats_for_move(grid,config_flags & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,IPS,IPE,JPS,JPE,KPS,KPE & - ,ITS,ITE,JTS,JTE,KTS,KTE) - CALL wrf_debug ( 100 , 'nmm stats_for_move: after advection' ) - diag_tim=diag_tim+now_time()-btimx - ENDIF -#endif -#if ( HWRF == 1 ) - hwrfx_mlsp: if(grid%vortex_tracker /= 1) then - btimx=now_time() - -! output MSLP over parent domain for diagonostic purposes. outputs are hourly. -! This is gopal's doing - - IF(grid%id .EQ. 1 .AND. MOD(grid%NTSD,n_print_time)==0)THEN - call wrf_debug(1,'COMPUTING MSLP OVER THE PARENT DOMAIN') - - CALL MSLP_DIAG (grid%MSLP,grid%PINT,grid%T,grid%Q & - ,grid%FIS,grid%PD,grid%DETA1,grid%DETA2,grid%PDTOP & - ,IDS,IDF,JDS,JDF,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE ) - ENDIF - - diag_tim=diag_tim+now_time()-btimx - endif hwrfx_mlsp -#endif -!!BEGIN: LSM changes for LANDFALL: Subashini 7/27/2016 -#ifdef IDEAL_NMM_TC - - IF(grid%NTSD==0 .and. grid%id .gt. 1)THEN ! Initialize some variables - call wrf_debug(1,'NESTS INITIALIZED TO WATER WORLD') - grid%sm=1.0 ! Initialize a water world in the nests - ENDIF -! - move_land_time=nint(1200./30) ! This needs to be changed for different parent domain resolution & dt. Subashini V1.0 7.13.2016 - - IF(MOD(grid%NTSD,move_land_time)==0)THEN ! n_print_time - - call wrf_debug(1,'LAND ADVECTED W2E FOR IDEALIZED LSM') - -#ifdef DM_PARALLEL -# include "HALO_NMM_INIT_3.inc" -#endif -!open ideal_land.nml for namelist values - - open(8,FILE='land.nml') - read(UNIT=8,NML=param_land) - close(UNIT=8) - - CALL MOVE_LAND (grid%SM,grid%nmm_tsk & - ,grid%SST,grid%FIS & - ,grid%PINT,grid%T,grid%Q & - ,grid%NTSD & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE,DIRN) - -!For diurnal temp changes - comment out for constant temperature and -!uncomment temperature fix in module_surface_driver.F and -!module_radiation_driver.F - - IF(DIRN == 1) THEN - DO J = JMS, JME - DO I = IMS,IME - if(grid%SM(I,J) .le. 0.5)then - grid%nmm_tsk(I,J)=grid%nmm_tsk(I-1,J) - grid%albedo(I,J)=land_albedo - grid%epsr(I,J)=land_emiss - grid%isltyp(I,J)=SOIL_ID - grid%ivgtyp(I,J)=VEG_ID - grid%vegfrc(I,J)=land_vgfrac - grid%z0(I,J)=land_z0 - DO K = 1,grid%num_soil_layers - grid%smc(I,K,J)=land_smc - ENDDO - endif - ENDDO - ENDDO - ELSE IF(DIRN == 2) THEN - DO J = JMS, JME - DO I = IME,IMS, -1 - if(grid%SM(I,J) .le. 0.5)then - grid%nmm_tsk(I,J)=grid%nmm_tsk(I+1,J) - grid%albedo(I,J)=land_albedo - grid%epsr(I,J)=land_emiss - grid%isltyp(I,J)=SOIL_ID - grid%ivgtyp(I,J)=VEG_ID - grid%vegfrc(I,J)=land_vgfrac - grid%z0(I,J)=land_z0 - DO K = 1,grid%num_soil_layers - grid%smc(I,K,J)=land_smc - ENDDO - endif - ENDDO - ENDDO - ELSE - CALL wrf_error_fatal ('Choose between 1 or 2 in land.nml') - ENDIF - - ENDIF - -#endif -!!END: LSM changes for LANDFALL : Subashini 7/27/2016 - -!#define COPY_OUT -!#include "scalar_derefs.inc" -#if ( HWRF == 1 ) -!----------------------------------------------------------------------- -!*** ACCUMULATED ATMOSPHERIC MODEL FLUXES FOR DMITRYs COUPLER -!----------------------------------------------------------------------- -! -! -! - CALL nl_get_multi_storm(1,multi_storm) - CALL nl_get_no_ocean(1,no_ocean) - IF ( .NOT. multi_storm .OR. no_ocean ) THEN - write(message,*)' No Ocean Coupling Run' - call wrf_debug(1,trim(message)) - ELSE -! Coupling insertion:-> - btimx=now_time() - call ATM_SENDFLUXES - CALL atm_sendwindp - flux_tim=flux_tim+now_time()-btimx -!<-:Coupling insertion -! -! Kwon's doing to check heat flux -! -! IF(grid%id==2)WRITE(0,*)'AFTER ATM_SENDFLUX grid%qwbs grid%twbs AT 10 10 ',grid%ntsd,grid%qwbs(10,10),grid%twbs(10,10) -! - ENDIF -#endif - -!-------------------------------------------------------------------------------------------------------------- -! -! HIGH FREQUENCY OUTPUT (STORM CENTER, MIN MSLP, MAX WINDS, TG products) -! FOR NEST DOMAIN (9KM) KWON 2011.4, TRAHAN 2011.6, 2014.1 -! -!-------------------------------------------------------------------------------------------------------------- -! - IF(grid%ntornado>0 .and. mod(grid%NTSD,grid%ntornado)==0) then - btimx=now_time() - CALL CALC_TORNADO_GENESIS(GRID,CONFIG_FLAGS) - tornado_tim=tornado_tim+now_time()-btimx - ENDIF - -#if ( HWRF == 1 ) - IF(grid%ntornado==0 .or. mod(grid%NTSD,grid%ntornado)==0) then - have_best: if(size(grid%best_mslp)>1) then - have_membrane: if(size(grid%membrane_mslp)>1) then - call CALC_BEST_MSLP(grid%best_mslp,grid%mslp, & - grid%membrane_mslp,grid%fis, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - else - ! In absence of the Membrane MSLP, the Schuell is all we - ! have, so it is the best by proxy: - do j=jps,min(jde-1,jpe) - do i=ips,min(ide-1,ipe) - grid%best_mslp(i,j)=grid%mslp(i,j) - enddo - enddo - endif have_membrane - endif have_best - ENDIF - - IF(grid%hifreq_lun /= 0) THEN - btimx=now_time() - CALL HIFREQ_WRITE(grid%hifreq_lun,GRID%NTSD,GRID%DT,GRID%HLAT,GRID%HLON & - ,GRID%U10,GRID%V10,grid%pint,grid%t,grid%q & - ,grid%fis,grid%pd,grid%pdtop,grid%deta1,grid%deta2 & - ,IDS,IDF,JDS,JDF,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,ITS,ITE,JTS,JTE,KTS,KTE ) - hifreq_tim=hifreq_tim+now_time()-btimx - ENDIF -#endif -! -!------------------- END OF HIGH FREQUENCY OUTPUT MODULE ---------------------------- - - - solve_tim=solve_tim+now_time()-ttim - Return -!---------------------------------------------------------------------- -!********************************************************************** -!********************************************************************** -!************* EXIT FROM THE TIME LOOP ************************** -!********************************************************************** -!********************************************************************** -!---------------------------------------------------------------------- - CONTAINS - - SUBROUTINE ETAMP_TO_MOIST() - implicit none - INTEGER :: I,J,K - REAL :: QI,QR,QW,WC,FICE,FRAIN - if(size(grid%f_ice,1)*size(grid%f_ice,2) <= 1) then - return - endif - DO K=KTS,KTE - DO J=MYJS,MYJE - DO I=MYIS,MYIE - MOIST(I,J,K,P_QV)=grid%q(I,J,K)/(1.-grid%q(I,J,K)) - WC = grid%cwm(I,J,K) - QI = 0. - QR = 0. - QW = 0. - FICE=grid%f_ice(I,K,J) - FRAIN=grid%f_rain(I,K,J) -! - IF(FICE>=1.)THEN - QI=WC - ELSEIF(FICE<=0.)THEN - QW=WC - ELSE - QI=FICE*WC - QW=WC-QI - ENDIF -! - IF(QW>0..AND.FRAIN>0.)THEN - IF(FRAIN>=1.)THEN - QR=QW - QW=0. - ELSE - QR=FRAIN*QW - QW=QW-QR - ENDIF - ENDIF -! - MOIST(I,J,K,P_QC)=QW - MOIST(I,J,K,P_QR)=QR - - IF (ETAMP_PHYSICS) THEN -#if ( HWRF == 1 ) - MOIST(I,J,K,P_QI)=QI - MOIST(I,J,K,P_QS)=0. -#else - MOIST(I,J,K,P_QI)=0. - MOIST(I,J,K,P_QS)=QI -#endif - endif - MOIST(I,J,K,P_QG)=0. - ENDDO - ENDDO - ENDDO - END SUBROUTINE ETAMP_TO_MOIST - - END SUBROUTINE SOLVE_NMM -!---------------------------------------------------------------------- -!********************************************************************** -!---------------------------------------------------------------------- - SUBROUTINE TWR(ARRAY,KK,FIELD,ntsd,MYPE,NPES,MPI_COMM_COMP & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!---------------------------------------------------------------------- -!********************************************************************** - USE MODULE_EXT_INTERNAL -! - IMPLICIT NONE -#if defined(DM_PARALLEL) && !defined(STUBMPI) - INCLUDE "mpif.h" -#endif -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE & - & ,KK,MPI_COMM_COMP,MYPE,NPES,ntsd -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME+KK),INTENT(IN) :: ARRAY -! - CHARACTER(*),INTENT(IN) :: FIELD -! -!*** LOCAL VARIABLES -! -#if defined(DM_PARALLEL) && !defined(STUBMPI) - INTEGER,DIMENSION(MPI_STATUS_SIZE) :: JSTAT - INTEGER,DIMENSION(MPI_STATUS_SIZE,4) :: STATUS_ARRAY -#endif - INTEGER,DIMENSION(2) :: IM_REM,JM_REM,IT_REM,JT_REM -! - INTEGER :: I,IENDX,IER,IPE,IRECV,IRTN,ISEND,IUNIT & - & ,J,K,N,NLEN,NSIZE - INTEGER :: ITS_REM,ITE_REM,JTS_REM,JTE_REM -! - REAL,DIMENSION(IDS:IDE,JDS:JDE) :: TWRITE - REAL,ALLOCATABLE,DIMENSION(:) :: VALUES - CHARACTER(5) :: TIMESTEP - CHARACTER(6) :: FMT - CHARACTER(12) :: FILENAME -!---------------------------------------------------------------------- -!********************************************************************** -!---------------------------------------------------------------------- -! - IF(ntsd<=9)THEN - FMT='(I1.1)' - NLEN=1 - ELSEIF(ntsd<=99)THEN - FMT='(I2.2)' - NLEN=2 - ELSEIF(ntsd<=999)THEN - FMT='(I3.3)' - NLEN=3 - ELSEIF(ntsd<=9999)THEN - FMT='(I4.4)' - NLEN=4 - ELSEIF(ntsd<=99999)THEN - FMT='(I5.5)' - NLEN=5 - ENDIF - WRITE(TIMESTEP,FMT)ntsd - FILENAME=FIELD//'_'//TIMESTEP(1:NLEN) -! - IF(MYPE==0)THEN - CALL INT_GET_FRESH_HANDLE(IUNIT) - CLOSE(IUNIT) - OPEN(UNIT=IUNIT,FILE=FILENAME,FORM='UNFORMATTED',IOSTAT=IER) - ENDIF -! -!---------------------------------------------------------------------- - write_layers: DO K=KDE-1,KDS,-1 !Write LM layers top down for checking -!---------------------------------------------------------------------- -! -#if defined(DM_PARALLEL) && !defined(STUBMPI) - IF(MYPE==0)THEN - DO J=JTS,JTE - DO I=ITS,ITE - TWRITE(I,J)=ARRAY(I,J,K) - ENDDO - ENDDO -! - DO IPE=1,NPES-1 - CALL MPI_RECV(IT_REM,2,MPI_INTEGER,IPE,IPE & - & ,MPI_COMM_COMP,JSTAT,IRECV) - CALL MPI_RECV(JT_REM,2,MPI_INTEGER,IPE,IPE & - & ,MPI_COMM_COMP,JSTAT,IRECV) -! - ITS_REM=IT_REM(1) - ITE_REM=IT_REM(2) - JTS_REM=JT_REM(1) - JTE_REM=JT_REM(2) -! - NSIZE=(ITE_REM-ITS_REM+1)*(JTE_REM-JTS_REM+1) - ALLOCATE(VALUES(1:NSIZE)) -! - CALL MPI_RECV(VALUES,NSIZE,MPI_REAL,IPE,IPE & - & ,MPI_COMM_COMP,JSTAT,IRECV) - N=0 - DO J=JTS_REM,JTE_REM - DO I=ITS_REM,ITE_REM - N=N+1 - TWRITE(I,J)=VALUES(N) - ENDDO - ENDDO -! - DEALLOCATE(VALUES) -! - ENDDO -! -!---------------------------------------------------------------------- - ELSE - NSIZE=(ITE-ITS+1)*(JTE-JTS+1) - ALLOCATE(VALUES(1:NSIZE)) -! - N=0 - DO J=JTS,JTE - DO I=ITS,ITE - N=N+1 - VALUES(N)=ARRAY(I,J,K) - ENDDO - ENDDO -! - IT_REM(1)=ITS - IT_REM(2)=ITE - JT_REM(1)=JTS - JT_REM(2)=JTE -! - CALL MPI_SEND(IT_REM,2,MPI_INTEGER,0,MYPE & - & ,MPI_COMM_COMP,ISEND) - CALL MPI_SEND(JT_REM,2,MPI_INTEGER,0,MYPE & - & ,MPI_COMM_COMP,ISEND) -! - CALL MPI_SEND(VALUES,NSIZE,MPI_REAL,0,MYPE & - & ,MPI_COMM_COMP,ISEND) -! - DEALLOCATE(VALUES) -! - ENDIF -!---------------------------------------------------------------------- -! - CALL MPI_BARRIER(MPI_COMM_COMP,IRTN) -! - IF(MYPE==0)THEN -! - DO J=JDS,JDE-1 - IENDX=IDE-1 - IF(MOD(J,2)==0)IENDX=IENDX-1 - WRITE(IUNIT)(TWRITE(I,J),I=1,IENDX) - ENDDO -! - ENDIF -#else - - DO J=JDS,JDE-1 - IENDX=IDE-1 - IF(MOD(J,2)==0)IENDX=IENDX-1 - WRITE(IUNIT)(ARRAY(I,K,J),I=1,IENDX) - ENDDO - -#endif - -! -!---------------------------------------------------------------------- - ENDDO write_layers -! - IF(MYPE==0)CLOSE(IUNIT) -!---------------------------------------------------------------------- -! - END SUBROUTINE TWR -!---------------------------------------------------------------------- -!********************************************************************** -!---------------------------------------------------------------------- - SUBROUTINE VWR(ARRAY,KK,FIELD,ntsd,MYPE,NPES,MPI_COMM_COMP & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!---------------------------------------------------------------------- -!********************************************************************** - USE MODULE_EXT_INTERNAL -! - IMPLICIT NONE -#if defined(DM_PARALLEL) && !defined(STUBMPI) - INCLUDE "mpif.h" -#endif -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE & - & ,KK,MPI_COMM_COMP,MYPE,NPES,ntsd -! - REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME+KK),INTENT(IN) :: ARRAY -! - CHARACTER(*),INTENT(IN) :: FIELD -! -!*** LOCAL VARIABLES -! -#if defined(DM_PARALLEL) && !defined(STUBMPI) - INTEGER,DIMENSION(MPI_STATUS_SIZE) :: JSTAT - INTEGER,DIMENSION(MPI_STATUS_SIZE,4) :: STATUS_ARRAY -#endif - INTEGER,DIMENSION(2) :: IM_REM,JM_REM,IT_REM,JT_REM -! - INTEGER :: I,IENDX,IER,IPE,IRECV,IRTN,ISEND,IUNIT & - & ,J,K,L,N,NLEN,NSIZE - INTEGER :: ITS_REM,ITE_REM,JTS_REM,JTE_REM -! - REAL,DIMENSION(IDS:IDE,JDS:JDE) :: TWRITE - REAL,ALLOCATABLE,DIMENSION(:) :: VALUES - CHARACTER(5) :: TIMESTEP - CHARACTER(6) :: FMT - CHARACTER(12) :: FILENAME - LOGICAL :: OPENED -!---------------------------------------------------------------------- -!********************************************************************** -!---------------------------------------------------------------------- -! - IF(ntsd<=9)THEN - FMT='(I1.1)' - NLEN=1 - ELSEIF(ntsd<=99)THEN - FMT='(I2.2)' - NLEN=2 - ELSEIF(ntsd<=999)THEN - FMT='(I3.3)' - NLEN=3 - ELSEIF(ntsd<=9999)THEN - FMT='(I4.4)' - NLEN=4 - ELSEIF(ntsd<=99999)THEN - FMT='(I5.5)' - NLEN=5 - ENDIF - WRITE(TIMESTEP,FMT)ntsd - FILENAME=FIELD//'_'//TIMESTEP(1:NLEN) -! - IF(MYPE==0)THEN - CALL INT_GET_FRESH_HANDLE(IUNIT) - CLOSE(IUNIT) - OPEN(UNIT=IUNIT,FILE=FILENAME,FORM='UNFORMATTED',IOSTAT=IER) - ENDIF -! IF(MYPE==0)THEN -! OPEN_UNIT: DO L=51,99 -! INQUIRE(L,OPENED=OPENED) -! IF(.NOT.OPENED)THEN -! IUNIT=L -! OPEN(UNIT=IUNIT,FILE=FILENAME,STATUS='NEW' & -! ,FORM='UNFORMATTED',IOSTAT=IER) -! IF(IER/=0)THEN -! WRITE(message,*)' Opening file error=',IER -! CALL wrf_message(trim(message)) -! ENDIF -! EXIT OPEN_UNIT -! ENDIF -! ENDDO OPEN_UNIT -! ENDIF -! -!---------------------------------------------------------------------- - write_layers: DO K=KDE-1,KDS,-1 !Write LM layers top down for checking -!---------------------------------------------------------------------- -! -#if defined(DM_PARALLEL) && !defined(STUBMPI) - IF(MYPE==0)THEN - DO J=JTS,JTE - DO I=ITS,ITE - TWRITE(I,J)=ARRAY(I,J,K) - ENDDO - ENDDO -! - DO IPE=1,NPES-1 - CALL MPI_RECV(IT_REM,2,MPI_INTEGER,IPE,IPE & - & ,MPI_COMM_COMP,JSTAT,IRECV) - CALL MPI_RECV(JT_REM,2,MPI_INTEGER,IPE,IPE & - & ,MPI_COMM_COMP,JSTAT,IRECV) -! - ITS_REM=IT_REM(1) - ITE_REM=IT_REM(2) - JTS_REM=JT_REM(1) - JTE_REM=JT_REM(2) -! - NSIZE=(ITE_REM-ITS_REM+1)*(JTE_REM-JTS_REM+1) - ALLOCATE(VALUES(1:NSIZE)) -! - CALL MPI_RECV(VALUES,NSIZE,MPI_REAL,IPE,IPE & - & ,MPI_COMM_COMP,JSTAT,IRECV) - N=0 - DO J=JTS_REM,JTE_REM - DO I=ITS_REM,ITE_REM - N=N+1 - TWRITE(I,J)=VALUES(N) - ENDDO - ENDDO -! - DEALLOCATE(VALUES) -! - ENDDO -! -!---------------------------------------------------------------------- - ELSE - NSIZE=(ITE-ITS+1)*(JTE-JTS+1) - ALLOCATE(VALUES(1:NSIZE)) -! - N=0 - DO J=JTS,JTE - DO I=ITS,ITE - N=N+1 - VALUES(N)=ARRAY(I,J,K) - ENDDO - ENDDO -! - IT_REM(1)=ITS - IT_REM(2)=ITE - JT_REM(1)=JTS - JT_REM(2)=JTE -! - CALL MPI_SEND(IT_REM,2,MPI_INTEGER,0,MYPE & - & ,MPI_COMM_COMP,ISEND) - CALL MPI_SEND(JT_REM,2,MPI_INTEGER,0,MYPE & - & ,MPI_COMM_COMP,ISEND) -! - CALL MPI_SEND(VALUES,NSIZE,MPI_REAL,0,MYPE & - & ,MPI_COMM_COMP,ISEND) -! - DEALLOCATE(VALUES) -! - ENDIF -!---------------------------------------------------------------------- -! - CALL MPI_BARRIER(MPI_COMM_COMP,IRTN) -! - IF(MYPE==0)THEN -! - DO J=JDS,JDE-1 - IENDX=IDE-1 - IF(MOD(J,2)==1)IENDX=IENDX-1 - WRITE(IUNIT)(TWRITE(I,J),I=1,IENDX) - ENDDO -! - ENDIF -#else - - DO J=JDS,JDE-1 - IENDX=IDE-1 - IF(MOD(J,2)==0)IENDX=IENDX-1 - WRITE(IUNIT)(ARRAY(I,K,J),I=1,IENDX) - ENDDO - -#endif -! -!---------------------------------------------------------------------- - ENDDO write_layers -! - IF(MYPE==0)CLOSE(IUNIT) -!---------------------------------------------------------------------- -! - END SUBROUTINE VWR -!---------------------------------------------------------------------- -!********************************************************************** -!---------------------------------------------------------------------- - SUBROUTINE TIME_STATS(TIME_LCL_IN,NAME,ntsd,MYPE,NPES,MPI_COMM_COMP) -!---------------------------------------------------------------------- -!********************************************************************** - USE MODULE_EXT_INTERNAL -! -!---------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- -#if defined(DM_PARALLEL) && !defined(STUBMPI) - INCLUDE "mpif.h" -#endif -!---------------------------------------------------------------------- - INTEGER,INTENT(IN) :: MPI_COMM_COMP,MYPE,NPES,ntsd - REAL,INTENT(IN) :: TIME_LCL_IN -! - CHARACTER(*),INTENT(IN) :: NAME -! -!*** LOCAL VARIABLES -! -#if defined(DM_PARALLEL) && !defined(STUBMPI) - INTEGER,DIMENSION(MPI_STATUS_SIZE) :: JSTAT - INTEGER,DIMENSION(MPI_STATUS_SIZE,4) :: STATUS_ARRAY -#endif - INTEGER,ALLOCATABLE,DIMENSION(:) :: ID_PE,IPE_SORT -! - INTEGER :: IPE,IPE_MAX,IPE_MEDIAN,IPE_MIN,IRECV,IRTN,ISEND & - & ,N,N_MEDIAN,NLEN -! - REAL,ALLOCATABLE,DIMENSION(:) :: TIME,SORT_TIME - REAL,DIMENSION(2) :: REMOTE - REAL :: TIME_MAX,TIME_MEAN,TIME_MEDIAN,TIME_MIN,TIME_LCL -! - CHARACTER(5) :: TIMESTEP - CHARACTER(6) :: FMT - CHARACTER(25) :: TITLE - CHARACTER(LEN=256) :: message -!---------------------------------------------------------------------- -!********************************************************************** -!---------------------------------------------------------------------- -! - TIME_LCL=TIME_LCL_IN*1000. - IF(ntsd<=9)THEN - FMT='(I1.1)' - NLEN=1 - ELSEIF(ntsd<=99)THEN - FMT='(I2.2)' - NLEN=2 - ELSEIF(ntsd<=999)THEN - FMT='(I3.3)' - NLEN=3 - ELSEIF(ntsd<=9999)THEN - FMT='(I4.4)' - NLEN=4 - ELSEIF(ntsd<=99999)THEN - FMT='(I5.5)' - NLEN=5 - ENDIF - WRITE(TIMESTEP,FMT)ntsd - TITLE=NAME//'_'//TIMESTEP(1:NLEN) -! -!---------------------------------------------------------------------- -! -#if defined(DM_PARALLEL) && !defined(STUBMPI) - IF(MYPE==0)THEN - ALLOCATE(TIME(1:NPES)) - ALLOCATE(SORT_TIME(1:NPES)) - ALLOCATE(ID_PE(1:NPES)) - ALLOCATE(IPE_SORT(1:NPES)) -! - TIME(1)=TIME_LCL - ID_PE(1)=MYPE -! -!*** COLLECT TIMES AND PE VALUES FROM OTHER PEs -! - DO IPE=1,NPES-1 - CALL MPI_RECV(REMOTE,2,MPI_REAL,IPE,IPE & - & ,MPI_COMM_COMP,JSTAT,IRECV) -! - TIME(IPE+1)=REMOTE(1) - ID_PE(IPE+1)=NINT(REMOTE(2)) - ENDDO -! -!*** NOW GET STATS. -!*** FIRST THE MAX, MIN, AND MEAN TIMES. -! - TIME_MEAN=0. - TIME_MAX=-1. - TIME_MIN=1.E10 - IPE_MAX=-1 - IPE_MIN=-1 -! - DO N=1,NPES - TIME_MEAN=TIME_MEAN+TIME(N) -! - IF(TIME(N)>TIME_MAX)THEN - TIME_MAX=TIME(N) - IPE_MAX=ID_PE(N) - ENDIF -! - IF(TIME(N)1.0) then -100 format(A,': large load imbalance: ',F0.5) - write(message,100) trim(what),len - call wrf_message(trim(message)) - endif - block_tim=real(block_tim+len) -#else - return -#endif - END SUBROUTINE BLOCKF -#endif diff --git a/dyn_nmm/start_domain_nmm.F b/dyn_nmm/start_domain_nmm.F deleted file mode 100644 index 8d643ae61f..0000000000 --- a/dyn_nmm/start_domain_nmm.F +++ /dev/null @@ -1,2598 +0,0 @@ -!#define NO_RESTRICT_ACCEL -!#define NO_GFDLETAINIT -!#define NO_UPSTREAM_ADVECTION -!---------------------------------------------------------------------- -! -#if ( HWRF == 1 ) - SUBROUTINE GUESS_COUPLING_TIMESTEP(gridid,DTC) - USE module_configure - implicit none - real, intent(out) :: DTC - integer, intent(in) :: gridid - type(grid_config_rec_type) :: config_flags - character*255 :: message - - real :: dt - integer :: nphs,ntrack - if(model_config_rec%max_dom>=2) then - ! Normally, in an HWRF simulation, domain 2 has - ! dt*nphs*ntrack = coupling timestep - ! So if there is a domain 2, we'll use that to - ! guess the coupling timestep. - if(gridid==1) then - ! The first time this routine is called, it is for domain 1, - ! and domain 2 has not been created yet. That means domain - ! 2 still has its dt set to the internal WRF default of 2. - ! To get domain 2's correct dt, we get domain 1's dt and - ! divide by 3 - call wrf_message('Guessing coupling timestep from d01''s dt/3 and d02''s nphs and ntrack...') - call model_to_grid_config_rec(1,model_config_rec,config_flags) - dt=config_flags%dt/3 - call model_to_grid_config_rec(2,model_config_rec,config_flags) - else - call wrf_message('Guessing coupling timestep from d02 settings...') - call model_to_grid_config_rec(2,model_config_rec,config_flags) - dt=config_flags%dt - endif - else - ! Someone is doing a single domain run, so guess the - ! coupling timestep using the - call wrf_message('Guessing coupling timestep from d01 settings because there is no d02...') - call model_to_grid_config_rec(1,model_config_rec,config_flags) - dt=config_flags%dt - endif - nphs=config_flags%nphs - ntrack=config_flags%ntrack - - dtc = dt*nphs*ntrack -388 format("dtc=dt*nphs*ntrack = ",F0.3,"=",F0.3,"*",I0,"*",I0) - write(message,388) dtc,dt,nphs,ntrack - call wrf_message(message) - END SUBROUTINE GUESS_COUPLING_TIMESTEP -#endif -! -!---------------------------------------------------------------------- -! -!---------------------------------------------------------------------- -! - SUBROUTINE START_DOMAIN_NMM(GRID, allowed_to_read & -! -#include "dummy_new_args.inc" -! - & ) -!---------------------------------------------------------------------- -! -#if ( HWRF == 1 ) - USE MODULE_CLEAR_HALOS, only: clear_ij_halos - USE MODULE_STATS_FOR_MOVE, only: vorttrak_init - USE MODULE_SWATH, only: init_swath - USE MODULE_SF_EXCHCOEF, only: znot_wind10m -#endif - USE MODULE_TIMING -#if ( HWRF == 1 ) - USE MODULE_HIFREQ, only : hifreq_open -#endif - USE MODULE_DOMAIN - USE MODULE_STATE_DESCRIPTION - USE MODULE_RANDOM, only : srand_grid, rand_grid_r4 - USE MODULE_DRIVER_CONSTANTS - USE module_model_constants - USE MODULE_CONFIGURE - USE MODULE_WRF_ERROR - USE MODULE_MPP - USE MODULE_CTLBLK -#ifdef DM_PARALLEL - USE MODULE_DM, ONLY : LOCAL_COMMUNICATOR & - ,MYTASK,NTASKS,NTASKS_X & - ,NTASKS_Y - USE MODULE_COMM_DM -#else - USE MODULE_DM -#endif -! - USE MODULE_IGWAVE_ADJUST,ONLY: PDTE, PFDHT, DDAMP - USE MODULE_ADVECTION, ONLY: ADVE, VAD2, HAD2 - USE MODULE_NONHY_DYNAM, ONLY: VADZ, HADZ - USE MODULE_DIFFUSION_NMM,ONLY: HDIFF - USE MODULE_PHYSICS_INIT - USE MODULE_GWD -! USE MODULE_RA_GFDLETA -! - USE MODULE_EXT_INTERNAL -! - USE module_tornado_genesis, only: init_tornado_genesis - -! -!---------------------------------------------------------------------- -! - IMPLICIT NONE -! -!---------------------------------------------------------------------- - INTERFACE - SUBROUTINE med_set_egrid_locs ( parent , nest ) - use module_domain_type, only: domain - type(domain) :: parent,nest - END SUBROUTINE med_set_egrid_locs - END INTERFACE -!*** -!*** Arguments -!*** - TYPE(DOMAIN),INTENT(INOUT) :: GRID - LOGICAL , INTENT(IN) :: allowed_to_read -! -#include "dummy_new_decl.inc" -! - TYPE(GRID_CONFIG_REC_TYPE) :: CONFIG_FLAGS -! -! -!*** -!*** LOCAL DATA -!*** - LOGICAL :: ANAL !added for analysis option - - integer(kind=4) :: random_seed - INTEGER :: parent_id, nestid, max_dom,one - LOGICAL :: grid_allowed, nestless - - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,IPS,IPE,JPS,JPE,KPS,KPE -! - INTEGER :: ERROR,LOOP - - REAL,ALLOCATABLE,DIMENSION(:) :: PHALF -! - REAL :: EPSB=0.1,EPSIN=9.8 -! - INTEGER :: JHL=7 -! - INTEGER :: I,IEND,IER,IFE,IFS,IHH,IHL,IHRSTB,II,IRTN & - & ,ISIZ1,ISIZ2,ISTART,ISTAT,IX,J,J00,JFE,JFS,JHH,JJ & - & ,JM1,JM2,JM3,JP1,JP2,JP3,JX,KK & - & ,K,K400,KBI,KBI2,KCCO2,KNT,KNTI & - & ,LB,LRECBC,L & - & ,N,NMAP,NRADLH,NRADSH,NREC,NS,RECL,STAT & - & ,STEPBL,STEPCU,STEPRA, KFE,KFS -! - INTEGER :: MY_E,MY_N,MY_S,MY_W & - & ,MY_NE,MY_NW,MY_SE,MY_SW,MYI,MYJ,NPE -! - INTEGER :: I_M -! - INTEGER :: ILPAD2,IRPAD2,JBPAD2,JTPAD2 - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE, nhki, nhkj -! - INTEGER,DIMENSION(3) :: LPTOP -! - REAL :: ADDL,APELM,APELMNW,APEM1,CAPA,CLOGES,DPLM,DZLM,EPS,ESE & - & ,FAC1,FAC2,PDIF,PLM,PM1,PSFCK,PSS,PSUM,QLM,RANG & - & ,SLPM,TERM1,THLM,TIME,TLM,TSFCK,ULM,VLM -! -!!! REAL :: BLDT,CWML,EXNSFC,G_INV,PLYR,PSFC,ROG,SFCZ,THSIJ,TL - REAL :: CWML,EXNSFC,G_INV,PLYR,PSURF,ROG,SFCZ,THSIJ,TL - REAL :: TEND, TEMPDX,TEMPDY -#if ( HWRF == 1 ) -! For calculating 10-m wind from lowest model level wind - INTEGER :: ITER - REAL :: windlmtmp,wind10tmp,wind10new,znotmtmp,znotttmp -!zhang's doing - REAL :: TSTART -!zhang's doing ends -#endif -#if ( HWRF == 1 ) -! gopal's doing for the moving nest (MSLP computation) -!----------------------------------------------------------------------------------------------------- - REAL, PARAMETER :: LAPSR=6.5E-3, GI=1./G,D608=0.608 - REAL, PARAMETER :: COEF3=287.05*GI*LAPSR, COEF2=-1./COEF3 - REAL, PARAMETER :: TRG=2.0*R_D*GI,LAPSI=1.0/LAPSR - REAL :: RTOPP,APELP,DZ,SFCT,A -!----------------------------------------------------------------------------------------------------- -#endif - -! -!!! REAL,ALLOCATABLE,DIMENSION(:,:) :: RAINBL,RAINNC,RAINNC & - INTEGER,ALLOCATABLE,DIMENSION(:,:) :: ITEMP,LOWLYR - REAL,ALLOCATABLE,DIMENSION(:) :: SFULL,SMID - REAL,ALLOCATABLE,DIMENSION(:) :: DZS,ZS - REAL,ALLOCATABLE,DIMENSION(:,:,:) :: RQCBLTEN,RQIBLTEN & - & ,RQVBLTEN,RTHBLTEN & - & ,RUBLTEN,RVBLTEN & - & ,RQCCUTEN,RQICUTEN,RQRCUTEN & - & ,RQSCUTEN,RQVCUTEN,RTHCUTEN & - & ,RUSHTEN,RVSHTEN & - & ,RQCSHTEN,RQISHTEN,RQRSHTEN & - & ,RQSSHTEN,RQVSHTEN,RTHSHTEN & - & ,RQGSHTEN & - & ,RTHRATEN & - & ,RTHRATENLW,RTHRATENSW - REAL,ALLOCATABLE,DIMENSION(:,:) :: EMISS,EMTEMP,GLW,HFX & - & ,NCA & - & ,QFX,RAINBL,RAINC,RAINNC & - & ,RAINNCV & - & ,SNOWNC,SNOWNCV & - & ,GRAUPELNC,GRAUPELNCV & - & ,SNOWC,THC,TMN,TSFC - - REAL,ALLOCATABLE,DIMENSION(:,:) :: Z0_DUM, ALBEDO_DUM -! - REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZINT,RRI,CONVFAC,ZMID - REAL,ALLOCATABLE,DIMENSION(:,:,:) :: T_TRANS,PINT_TRANS - REAL,ALLOCATABLE,DIMENSION(:,:,:) :: CLDFRA_TRANS - REAL,DIMENSION(:,:,:,:),ALLOCATABLE :: SCALAR_TRANS - REAL,ALLOCATABLE,DIMENSION(:,:,:) :: CLDFRA_OLD -!..Need to fill special height var for setting up initial condition. G. Thompson - REAL,ALLOCATABLE,DIMENSION(:,:,:) :: z_at_q - -#if 0 - REAL,ALLOCATABLE,DIMENSION(:,:,:) :: w0avg -#endif - LOGICAL :: E_BDY,N_BDY,S_BDY,W_BDY,WARM_RAIN,ADV_MOIST_COND - LOGICAL :: START_OF_SIMULATION - LOGICAL :: LRESTART, nestmove - LOGICAL :: ETAMP_Regional, ICE1_indx, ICE2_indx - LOGICAL :: IS_CAMMGMP_USED=.FALSE. - - - integer :: jam,retval - CHARACTER(LEN=255) :: message - integer myproc - real :: dsig,dsigsum,pdbot,pdtot,rpdtot - real :: fisx,ht,prodx,rg - integer :: i_t=096,j_t=195,n_t=11 - integer :: i_u=49,j_u=475,n_u=07 - integer :: i_v=49,j_v=475,n_v=07 - integer :: num_aerosolc - real :: cen_lat,cen_lon,dtphs ! GWD - integer :: num_urban_hi, & - num_urban_ndm,urban_map_zrd,urban_map_zwd,urban_map_gd, & - urban_map_zd ,urban_map_zdf,urban_map_bd ,urban_map_wd, & - urban_map_gbd,urban_map_fbd,urban_map_zgrd -!Rogers GMT - INTEGER :: hr, mn, sec, ms, rc - TYPE(WRFU_Time) :: currentTime - - INTEGER :: interval_seconds, restart_interval - -#if ( HWRF == 1 ) - REAL :: xshift,xfar,yfar,dfar,close2edge - REAL :: fedge,fmid,fdiff -#endif - -! z0base new - - REAL,DIMENSION(0:30) :: VZ0TBL_24 - VZ0TBL_24= (/0., & - & 1.00, 0.07, 0.07, 0.07, 0.07, 0.15, & - & 0.08, 0.03, 0.05, 0.86, 0.80, 0.85, & - & 2.65, 1.09, 0.80, 0.001, 0.04, 0.05, & - & 0.01, 0.04, 0.06, 0.05, 0.03, 0.001, & - & 0.000, 0.000, 0.000, 0.000, 0.000, 0.000/) - -! end z0base new -! -!---------------------------------------------------------------------- -!#define COPY_IN -!#include "scalar_derefs.inc" -!---------------------------------------------------------------------- -!********************************************************************** -!---------------------------------------------------------------------- -! - - call start_timing - -#if ( HWRF == 1 ) - call clear_ij_halos(grid,config_flags%halo_debug) - if(grid%id==3) then - grid%force_sst=1 - else - grid%force_sst=2 - endif -#endif - - CALL GET_IJK_FROM_GRID(GRID, & - & IDS,IDE,JDS,JDE,KDS,KDE, & - & IMS,IME,JMS,JME,KMS,KME, & - & IPS,IPE,JPS,JPE,KPS,KPE) -! - ITS=IPS - ITE=IPE - JTS=JPS - JTE=JPE - KTS=KPS - KTE=KPE - -#if ( HWRF == 1 ) - call guess_coupling_timestep(grid%id,grid%guessdtc) - grid%dtc=0 -#endif - - CALL model_to_grid_config_rec(grid%id,model_config_rec & - & ,config_flags) -! - RESTRT=config_flags%restart - ANAL=config_flags%analysis - nestmove=RESTRT .and. .not. allowed_to_read - -#if ( HWRF == 1 ) -! Sam's doing for hour 0 & 6 nest movement safeguards - grid%nomove_freq_hr=config_flags%nomove_freq -#endif - - ! Recalculate grid bounds, regardless of reason for - ! start_domain_nmm call, or version of NMM: - has_parent: if(grid%id /= 1) then ! NOTE REQUIREMENT: MOAD IS GRID 1!! - ! Nest gets dx & dy from parent and grid ratio. -3302 format('Grid ',I0,' calculating west/south bounds relative to parent grid ',I0) - write(message,3302) grid%id, grid%parents(1)%ptr%id - call wrf_debug(2,message) - tempdx=grid%parents(1)%ptr%dx/grid%parent_grid_ratio - tempdy=grid%parents(1)%ptr%dy/grid%parent_grid_ratio - grid%wbd0var = grid%parents(1)%ptr%wbd0var + (grid%i_parent_start-1)*2.*grid%parents(1)%ptr%dx + mod(grid%j_parent_start+1,2)*grid%parents(1)%ptr%dx - grid%sbd0var = grid%parents(1)%ptr%sbd0var + (grid%j_parent_start-1)*grid%parents(1)%ptr%dy -3303 format('Parent wbd0=',F0.3,' sbd0=',F0.3,' i_parent_start=',I0,' j_parent_start=',I0) - write(message,3303) grid%parents(1)%ptr%wbd0var, & - grid%parents(1)%ptr%sbd0var, grid%i_parent_start,grid%j_parent_start - call wrf_debug(2,message) - else - ! MOAD gets dx & dy from namelist. -3305 format('Grid ',I0,' calculating west/south bounds as MOAD') - write(message,3305) grid%id - call wrf_debug(2,message) - call nl_get_dx(grid%id,tempdx) - call nl_get_dy(grid%id,tempdy) - grid%wbd0var = -(IDE-2)*tempdx - grid%sbd0var = -((JDE-1)/2)*tempdy -#if ! ( NMM_NEST == 1 ) - ! When NMM is compiled without nesting support, we need to - ! update the bound metadata here: - grid%wbd0 = grid%wbd0var - grid%sbd0 = grid%sbd0var -#endif - endif has_parent - if(tempdx<1e-5 .or. tempdy<1e-5) then - ! Should never reach here unless someone adds a bug to NMM. - ! The meaning of grid%dx varies during nest initialization - ! (sometimes it is MOAD dx, sometimes nest dx), so this check - ! is here just in case someone screws up the code later on. - write(message,1045) tempdx,tempdy - call wrf_message('WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ') - call wrf_message('Warning: dx or dy are invalid after parent calculation or namelist check.') - call wrf_message(message) - call wrf_message('WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ') -1045 format('Must be >1e-5. dx=',F0.7,' dy=',F0.7,'. Grid bounds will be wrong.') - endif - write(message,3011) grid%id,tempdx,tempdy,grid%wbd0var,grid%sbd0var - call wrf_debug(2,message) -3011 format('Grid ',I0,': dx=',F0.3,' dy=',F0.3,' wbd0=',F0.3,' sbd0=',F0.3) -#if 1 - IF(IME>NMM_MAX_DIM )THEN - WRITE(wrf_err_message,*) & - 'start_domain_nmm ime (',ime,') > ',NMM_MAX_DIM, & - '. Increase NMM_MAX_DIM in configure.wrf, clean, and recompile.' - CALL WRF_ERROR_FATAL(wrf_err_message) - ENDIF -! - IF(JME>NMM_MAX_DIM )THEN - WRITE(wrf_err_message,*) & - 'start_domain_nmm jme (',jme,') > ',NMM_MAX_DIM, & - '. Increase NMM_MAX_DIM in configure.wrf, clean, and recompile.' - CALL WRF_ERROR_FATAL(wrf_err_message) - ENDIF -#else - IF(IMS>-2.OR.IME>NMM_MAX_DIM )THEN - WRITE(wrf_err_message,*) & - 'start_domain_nmm ims(',ims,' > -2 or ime (',ime,') > ',NMM_MAX_DIM, & - '. Increase NMM_MAX_DIM in configure.wrf, clean, and recompile.' - CALL WRF_ERROR_FATAL(wrf_err_message) - ENDIF -! - IF(JMS>-2.OR.JME>NMM_MAX_DIM )THEN - WRITE(wrf_err_message,*) & - 'start_domain_nmm jms(',jms,' > -2 or jme (',jme,') > ',NMM_MAX_DIM, & - '. Increase NMM_MAX_DIM in configure.wrf, clean, and recompile.' - CALL WRF_ERROR_FATAL(wrf_err_message) - ENDIF -#endif -! -!---------------------------------------------------------------------- -! - WRITE(message,196)IHRST,IDAT - CALL wrf_message(trim(message)) - 196 FORMAT(' FORECAST BEGINS ',I2,' GMT ',2(I2,'/'),I4) - - -!! Restarts must be made from times for which boundary data is available - - CALL nl_get_interval_seconds(GRID%ID, interval_seconds) - CALL nl_get_restart_interval(GRID%ID, restart_interval) - IF (MOD(restart_interval*60,interval_seconds) /= 0) THEN - WRITE(wrf_err_message,*)' restart_interval is not integer multiplier of interval_seconds' - CALL WRF_ERROR_FATAL(wrf_err_message) - END IF - -!!!!!!tlb -!!!! For now, set NPES to 1 - NPES=1 -!!!!!!tlb - MY_IS_GLB=IPS - MY_IE_GLB=IPE-1 - MY_JS_GLB=JPS - MY_JE_GLB=JPE-1 -! - IM=IPE-1 - JM=JPE-1 -!!!!!!!!! -!! All "my" variables defined below have had the IDE or JDE specification -!! reduced by 1 -!!!!!!!!!!! - - MYIS=MAX(IDS,IPS) - MYIE=MIN(IDE-1,IPE) - MYJS=MAX(JDS,JPS) - MYJE=MIN(JDE-1,JPE) - - MYIS1 =MAX(IDS+1,IPS) - MYIE1 =MIN(IDE-2,IPE) - MYJS2 =MAX(JDS+2,JPS) - MYJE2 =MIN(JDE-3,JPE) -! - MYIS_P1=MAX(IDS,IPS-1) - MYIE_P1=MIN(IDE-1,IPE+1) - MYIS_P2=MAX(IDS,IPS-2) - MYIE_P2=MIN(IDE-1,IPE+2) - MYIS_P3=MAX(IDS,IPS-3) - MYIE_P3=MIN(IDE-1,IPE+3) - MYJS_P3=MAX(JDS,JPS-3) - MYJE_P3=MIN(JDE-1,JPE+3) - MYIS_P4=MAX(IDS,IPS-4) - MYIE_P4=MIN(IDE-1,IPE+4) - MYJS_P4=MAX(JDS,JPS-4) - MYJE_P4=MIN(JDE-1,JPE+4) - MYIS_P5=MAX(IDS,IPS-5) - MYIE_P5=MIN(IDE-1,IPE+5) - MYJS_P5=MAX(JDS,JPS-5) - MYJE_P5=MIN(JDE-1,JPE+5) -! - MYIS1_P1=MAX(IDS+1,IPS-1) - MYIE1_P1=MIN(IDE-2,IPE+1) - MYIS1_P2=MAX(IDS+1,IPS-2) - MYIE1_P2=MIN(IDE-2,IPE+2) -! - MYJS1_P1=MAX(JDS+1,JPS-1) - MYJS2_P1=MAX(JDS+2,JPS-1) - MYJE1_P1=MIN(JDE-2,JPE+1) - MYJE2_P1=MIN(JDE-3,JPE+1) - MYJS1_P2=MAX(JDS+1,JPS-2) - MYJE1_P2=MIN(JDE-2,JPE+2) - MYJS2_P2=MAX(JDS+2,JPS-2) - MYJE2_P2=MIN(JDE-3,JPE+2) - MYJS1_P3=MAX(JDS+1,JPS-3) - MYJE1_P3=MIN(JDE-2,JPE+3) - MYJS2_P3=MAX(JDS+2,JPS-3) - MYJE2_P3=MIN(JDE-3,JPE+3) -!!!!!!!!!!! -! -#ifdef DM_PARALLEL - - CALL WRF_GET_MYPROC(MYPROC) - MYPE=MYPROC - -! -!---------------------------------------------------------------------- -!*** Let each task determine who its eight neighbors are because we -!*** will need to know that for the halo exchanges. The direction -!*** to each neighbor will be designated by the following integers: -! -!*** north: 1 -!*** east: 2 -!*** south: 3 -!*** west: 4 -!*** northeast: 5 -!*** southeast: 6 -!*** southwest: 7 -!*** northwest: 8 -! -!*** If a task has no neighbor in a particular direction because of -!*** the presence of the global domain boundary then that element -!*** of my_neb is set to -1. -!----------------------------------------------------------------------- -! - call wrf_get_nprocx(inpes) - call wrf_get_nprocy(jnpes) -! - allocate(itemp(inpes,jnpes),stat=istat) - npe=0 -! - do j=1,jnpes - do i=1,inpes - itemp(i,j)=npe - if(npe==mype)then - myi=i - myj=j - endif - npe=npe+1 - enddo - enddo -! - my_n=-1 - if(myj+1<=jnpes)my_n=itemp(myi,myj+1) -! - my_e=-1 - if(myi+1<=inpes)my_e=itemp(myi+1,myj) -! - my_s=-1 - if(myj-1>=1)my_s=itemp(myi,myj-1) -! - my_w=-1 - if(myi-1>=1)my_w=itemp(myi-1,myj) -! - my_ne=-1 - if((myi+1<=inpes).and.(myj+1<=jnpes)) & - my_ne=itemp(myi+1,myj+1) -! - my_se=-1 - if((myi+1<=inpes).and.(myj-1>=1)) & - my_se=itemp(myi+1,myj-1) -! - my_sw=-1 - if((myi-1>=1).and.(myj-1>=1)) & - my_sw=itemp(myi-1,myj-1) -! - my_nw=-1 - if((myi-1>=1).and.(myj+1<=jnpes)) & - my_nw=itemp(myi-1,myj+1) -! -! my_neb(1)=my_n -! my_neb(2)=my_e -! my_neb(3)=my_s -! my_neb(4)=my_w -! my_neb(5)=my_ne -! my_neb(6)=my_se -! my_neb(7)=my_sw -! my_neb(8)=my_nw -! - deallocate(itemp) -# include "HALO_NMM_INIT_1.inc" -# include "HALO_NMM_INIT_2.inc" -# include "HALO_NMM_INIT_3.inc" -# include "HALO_NMM_INIT_4.inc" -# include "HALO_NMM_INIT_5.inc" -# include "HALO_NMM_INIT_6.inc" -# include "HALO_NMM_INIT_7.inc" -# include "HALO_NMM_INIT_8.inc" -# include "HALO_NMM_INIT_9.inc" -# include "HALO_NMM_INIT_10.inc" -# include "HALO_NMM_INIT_11.inc" -# include "HALO_NMM_INIT_12.inc" -# include "HALO_NMM_INIT_13.inc" -# include "HALO_NMM_INIT_14.inc" -# include "HALO_NMM_INIT_15.inc" -# include "HALO_NMM_INIT_16.inc" -# include "HALO_NMM_INIT_17.inc" -# include "HALO_NMM_INIT_18.inc" -# include "HALO_NMM_INIT_19.inc" -# include "HALO_NMM_INIT_20.inc" -# include "HALO_NMM_INIT_21.inc" -# include "HALO_NMM_INIT_22.inc" -# include "HALO_NMM_INIT_23.inc" -# include "HALO_NMM_INIT_24.inc" -# include "HALO_NMM_INIT_25.inc" -# include "HALO_NMM_INIT_26.inc" -# include "HALO_NMM_INIT_27.inc" -# include "HALO_NMM_INIT_28.inc" -# include "HALO_NMM_INIT_29.inc" -# include "HALO_NMM_INIT_30.inc" -# include "HALO_NMM_INIT_31.inc" -# include "HALO_NMM_INIT_32.inc" -# include "HALO_NMM_INIT_33.inc" -# include "HALO_NMM_INIT_34.inc" -# include "HALO_NMM_INIT_35.inc" -# include "HALO_NMM_INIT_36.inc" -# include "HALO_NMM_INIT_37.inc" -# include "HALO_NMM_INIT_38.inc" -# include "HALO_NMM_INIT_39.inc" -#endif -! - if((allowed_to_read .and. .not. restrt) .or. anal) then - call wrf_message("Fill REFL_10CM with -35 dBZ") - if(size(grid%refl_10cm,1)*size(grid%refl_10cm,3)>1) then - do J=JPS,JPE - do K=KPS,KPE - do I=IPS,IPE - grid%refl_10cm(i,k,j)=-35.0 - enddo - enddo - do I=IPS,IPE - grid%refd_max(i,j)=-35.0 - enddo - enddo - endif - endif - - DO J=MYJS_P4,MYJE_P4 - grid%iheg(J)=MOD(J+1,2) - grid%ihwg(J)=grid%iheg(J)-1 - grid%iveg(J)=MOD(J,2) - grid%ivwg(J)=grid%iveg(J)-1 - ENDDO -! - DO J=MYJS_P4,MYJE_P4 - grid%ivw(J)=grid%ivwg(J) - grid%ive(J)=grid%iveg(J) - grid%ihe(J)=grid%iheg(J) - grid%ihw(J)=grid%ihwg(J) - ENDDO -! - CAPA=R_D/CP - LM=KPE-KPS+1 -! - IFS=IPS - JFS=JPS - KFS=KPS - JFE=MIN(JPE,JDE-1) - IFE=MIN(IPE,IDE-1) - KFE=MIN(KPE,KDE-1) - - if((allowed_to_read.and..not.(restrt)) .or. .not.allowed_to_read) then - randif: IF(in_use_for_config(grid%id,'random'))THEN - ! Reset random number generator at first initialization, - ! or after a nest move. (Need to reset after a nest move - ! or the leading edge will be filled with 3x3 areas with - ! the same random number generator state.) - random_seed=config_flags%random_seed + grid%ntsd - - write(message,'(A,I0,A,I0)') 'Resetting random number for domain ',grid%id,' with seed ',random_seed - call wrf_message(message) - one=1 - call srand_grid(grid%randstate1,grid%randstate2, & - grid%randstate3,grid%randstate4, & - IDS,IDE,JDS,JDE,one,one, & - IMS,IME,JMS,JME,one,one, & - IPS,IPE,JPS,JPE,one,one,random_seed) - call rand_grid_r4(grid%randstate1,grid%randstate2, & - grid%randstate3,grid%randstate4, & - grid%random, & - IDS,IDE,JDS,JDE,one,one, & - IMS,IME,JMS,JME,one,one, & - IPS,IPE,JPS,JPE,one,one) - else - grid%random = 0.0 - endif randif - endif -! Begin HWRF update for high-frequency output -#if ( HWRF == 1 ) - if(allowed_to_read .and. config_flags%high_freq) then - if(grid%id==config_flags%high_dom) then - ! Open HTCF LUN: - call HIFREQ_OPEN(grid,config_flags) - ! Open per-nest-move ATCF LUN: - call HIFREQ_OPEN(grid,config_flags,atcf=.true.) - elseif(config_flags%high_dom==-99) then - nestless=.true. - CALL nl_get_max_dom( 1, max_dom ) - nestdo: do nestid=2,max_dom - call nl_get_grid_allowed(nestid,grid_allowed) - if(grid_allowed) then - call nl_get_parent_id(nestid,parent_id) - if(parent_id==grid%id) then - write(message,'("Domain ",I0," does not have hifreq out (can have a child).")') grid%id - nestless=.false. - exit nestdo - endif - endif - enddo nestdo - if(nestless) then - ! Open HTCF LUN: - call HIFREQ_OPEN(grid,config_flags) - ! Open per-nest-move ATCF LUN: - call HIFREQ_OPEN(grid,config_flags,atcf=.true.) - endif - else - write(message,'("Domain ",I0," does not have hifreq out.")') grid%id - endif - else - write(message,'("Domain ",I0," is not being initialized.")') grid%id - endif -! end of high-freq output -#endif - -! Begin Sam Trahan's doing for Tornado Genesis (SPC) products - if(anal .or. (allowed_to_read .and. .not. restrt)) then - call init_tornado_genesis(grid,config_flags) - endif -! End Sam Trahan's doing for Tornado Genesis (SPC) products - -#if ( HWRF == 1 ) -! Begin Sam Trahan's doing for vortex tracker initialization - IF ( program_name(1:8) .NE. "REAL_NMM" ) THEN - call VORTTRAK_INIT(grid,config_flags, & - (allowed_to_read .and. .not. restrt), & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - call init_swath(grid, config_flags, & - (allowed_to_read .and. .not. restrt),& - allowed_to_read) - ENDIF - IF(ANAL .or. allowed_to_read) THEN - call wrf_debug(1,'Request update to area of interest in start_domain_nmm.') - grid%update_interest=.true. - ENDIF -! End Sam Trahan's doing for vortex tracker initialization -#endif -#if ( HWRF == 1 ) -! Begin Sam Trahan's change to merge two log messages for WRF_NMM - IF(allowed_to_read .and. .not. restrt) THEN - grid%avgPchg=0 - ENDIF -! End Sam Trahan's change to merge two log messages for WRF_NMM - -!zhang's doing - IF((.NOT.RESTRT .AND. .NOT.ANAL) .OR. .NOT.allowed_to_read)THEN -!end of zhang's doing -#else - IF(.NOT.RESTRT)THEN -#endif - DO J=JFS,JFE - DO I=IFS,IFE - grid%pdsl(I,J) =grid%pd(I,J)*grid%res(I,J) - grid%prec(I,J) =0. - IF(allowed_to_read)grid%acprec(I,J)=0. ! This is gopal's inclusion for moving nest - grid%cuprec(I,J)=0. - rg=1./g - ht=grid%fis(i,j)*rg -!!! fisx=ht*g -! fisx=max(grid%fis(i,j),0.) -! prodx=grid%z0(I,J)*Z0MAX -! grid%z0(I,J) =grid%sm(I,J)*Z0SEA+(1.-grid%sm(I,J))* & -! & (grid%z0(I,J)*Z0MAX+FISx *FCM+Z0LAND) -!!! & (prodx +FISx *FCM+Z0LAND) - grid%qsh(I,J) =0. - grid%akms(I,J) =0. - grid%akhs(I,J) =0. - grid%twbs(I,J) =0. - grid%qwbs(I,J) =0. - IF(allowed_to_read)THEN ! This is gopal's inclusion for moving nest - grid%cldefi(I,J)=1. - grid%htop(I,J) =REAL(KTS) - grid%htopd(I,J) =REAL(KTS) - grid%htops(I,J) =REAL(KTS) - grid%hbot(I,J) =REAL(KTE) - grid%hbotd(I,J) =REAL(KTE) - grid%hbots(I,J) =REAL(KTE) - ENDIF -!*** -!*** AT THIS POINT, WE MUST CALCULATE THE INITIAL POTENTIAL TEMPERATURE -!*** OF THE SURFACE AND OF THE SUBGROUND. -!*** EXTRAPOLATE DOWN FOR INITIAL SURFACE POTENTIAL TEMPERATURE. -!*** ALSO DO THE SHELTER PRESSURE. -!*** -! -!*** BECAUSE WE REINITIALIZE TOPOGRAPHY, LAND SEA MASK AND FIND THE TEMPERATURE -!*** FIELD OVER THE NEW TOPOGRAPHY, AFTER THE MOVE, I THINK IT MORE APPROPRIATE -!*** TO USE grid%nmm_tsk OR grid%sst TO RE-DERIVE grid%ths AND QS (AND CONSEQUENTLY grid%thz0 AND grid%qz0). -!*** THIS MAY BE MORE CONSISTENT WITH THE PSEUDO-HYDROSTATIC BALANCING THAT IS -!*** DONE OVER THE NEW TERRAIN (AND WITH NEW grid%sm). gopal! -!*** -!*** - - IF(allowed_to_read)THEN ! This is gopal's inclusion for moving nest - - PM1=grid%aeta1(KTS)*grid%pdtop+grid%aeta2(KTS)*grid%pdsl(I,J)+grid%pt - APEM1=(1.E5/PM1)**CAPA - - IF(grid%nmm_tsk(I,J)>=200.)THEN ! have a specific skin temp, use it -#if ( HWRF == 1 ) - grid%ths(I,J)=grid%nmm_tsk(I,J)*(1.+P608*grid%q(I,J,KTS+1))*APEM1 - TSFCK=grid%nmm_tsk(I,J)*(1.+P608*grid%q(I,J,KTS+1)) -#else - grid%ths(I,J)=grid%nmm_tsk(I,J)*APEM1 - TSFCK=grid%nmm_tsk(I,J) -#endif - - ELSE ! use lowest layer as a proxy -#if ( HWRF == 1 ) - grid%ths(I,J)=grid%t(I,J,KTS)*(1.+P608*grid%q(I,J,KTS+1))*APEM1 - TSFCK=grid%t(I,J,KTS)*(1.+P608*grid%q(I,J,KTS+1)) -#else - grid%ths(I,J)=grid%t(I,J,KTS)*APEM1 - TSFCK=grid%t(I,J,KTS) -#endif - ENDIF - - PSFCK=grid%pd(I,J)+grid%pdtop+grid%pt -! - IF(grid%sm(I,J)<0.5) THEN - grid%qsh(I,J)=PQ0/PSFCK*EXP(A2*(TSFCK-A3)/(TSFCK-A4)) - ELSEIF(grid%sm(I,J)>0.5) THEN - grid%ths(I,J)=grid%sst(I,J)*(1.E5/(grid%pd(I,J)+grid%pdtop+grid%pt))**CAPA - ENDIF -! - TERM1=-0.068283/grid%t(I,J,KTS) - grid%pshltr(I,J)=(grid%pd(I,J)+grid%pdtop+grid%pt)*EXP(TERM1) -! - grid%ustar(I,J)=0.1 - grid%thz0(I,J)=grid%ths(I,J) - grid%qz0(I,J)=grid%qsh(I,J) - grid%uz0(I,J)=0. - grid%vz0(I,J)=0. - - ENDIF ! endif for allowed to read -! - ENDDO - ENDDO - -!*** -!*** INITIALIZE CLOUD FIELDS -!*** - IF (MAXVAL(grid%cwm(ips:ipe,jps:jpe,:)) .gt. 0. .and. MAXVAL(grid%cwm(ips:ipe,jps:jpe,:)) .lt. 1.) then - CALL wrf_message('appear to have grid%cwm values...do not zero') - ELSE - IF(allowed_to_read)THEN ! This is gopal's inclusion for moving nest - CALL wrf_message('zeroing grid%cwm') - DO K=KPS,KPE - DO J=JFS,JFE - DO I=IFS,IFE - grid%cwm(I,J,K)=0. - ENDDO - ENDDO - ENDDO - ENDIF - ENDIF -!*** -!*** INITIALIZE ACCUMULATOR ARRAYS TO ZERO. -!*** - grid%ardsw=0.0 - grid%ardlw=0.0 - grid%asrfc=0.0 - grid%avrain=0.0 - grid%avcnvc=0.0 -! - DO J=JFS,JFE - DO I=IFS,IFE - grid%acfrcv(I,J)=0. - grid%ncfrcv(I,J)=0 - grid%acfrst(I,J)=0. - grid%ncfrst(I,J)=0 - grid%acsnow(I,J)=0. - grid%acsnom(I,J)=0. - grid%ssroff(I,J)=0. - grid%bgroff(I,J)=0. - grid%alwin(I,J) =0. - grid%alwout(I,J)=0. - grid%alwtoa(I,J)=0. - grid%aswin(I,J) =0. - grid%aswout(I,J)=0. - grid%aswtoa(I,J)=0. - grid%sfcshx(I,J)=0. - grid%sfclhx(I,J)=0. - grid%subshx(I,J)=0. - grid%snopcx(I,J)=0. - grid%sfcuvx(I,J)=0. - grid%sfcevp(I,J)=0. - grid%potevp(I,J)=0. - grid%potflx(I,J)=0. - ENDDO - ENDDO -!*** -!*** INITIALIZE SATURATION SPECIFIC HUMIDITY OVER THE WATER. -!*** - EPS=R_D/R_V -! - IF(allowed_to_read)THEN ! This is gopal's inclusion for moving nest - DO J=JFS,JFE - DO I=IFS,IFE - IF(grid%sm(I,J)>0.5)THEN - CLOGES =-CM1/grid%sst(I,J)-CM2*ALOG10(grid%sst(I,J))+CM3 - ESE = 10.**(CLOGES+2.) - grid%qsh(I,J)= grid%sm(I,J)*EPS*ESE/(grid%pd(I,J)+grid%pdtop+grid%pt-ESE*(1.-EPS)) - ENDIF - ENDDO - ENDDO - ENDIF - if(allowed_to_read .and. (anal .or. .not. restrt)) then - call wrf_debug(1,'Initialize DKU3D and DKT3D to 0.') - do j=jfs,jfe - do i=ifs,ife - grid%dku3d(i,j,:) = 0 - grid%dkt3d(i,j,:) = 0 - enddo - enddo - endif - -!*** -!*** INITIALIZE TURBULENT KINETIC ENERGY (TKE) TO A SMALL -!*** VALUE (EPSQ2) ABOVE GROUND. SET TKE TO ZERO IN THE -!*** THE LOWEST MODEL LAYER. IN THE LOWEST TWO ATMOSPHERIC -!*** ETA LAYERS SET TKE TO A SMALL VALUE (Q2INI). -!*** -!***EROGERS: add check for realistic values of grid%q2 -! - IF (MAXVAL(grid%q2(ips:ipe,jps:jpe,:)) .gt. epsq2 .and. MAXVAL(grid%q2(ips:ipe,jps:jpe,:)) .lt. 200.) then - CALL wrf_message('appear to have grid%q2 values...do not zero') - ELSE - IF(allowed_to_read)THEN ! This is gopal's inclusion for moving nest - CALL wrf_message('zeroing grid%q2') - DO K=KPS,KPE-1 - DO J=JFS,JFE - DO I=IFS,IFE -#if ( HWRF == 1 ) - grid%q2(I,J,K)=0. -#else - grid%q2(I,J,K)=grid%hbm2(I,J)*EPSQ2 -#endif - ENDDO - ENDDO - ENDDO -! - DO J=JFS,JFE - DO I=IFS,IFE - grid%q2(I,J,LM) = 0. -#if ( HWRF == 1 ) - grid%q2(I,J,KTE-2)= 0. - grid%q2(I,J,KTE-1)= 0. -#else - grid%q2(I,J,KTE-2)= grid%hbm2(I,J)*Q2INI - grid%q2(I,J,KTE-1)= grid%hbm2(I,J)*Q2INI -#endif - ENDDO - ENDDO - ENDIF - ENDIF -!*** -!*** PAD ABOVE GROUND SPECIFIC HUMIDITY IF IT IS TOO SMALL. -!*** INITIALIZE LATENT HEATING ACCUMULATION ARRAYS. -!*** - DO K=KPS,KPE - DO J=JFS,JFE - DO I=IFS,IFE - IF(grid%q(I,J,K)=MY_JS_GLB-2.AND.JJ<=MY_JE_GLB+2)THEN - J=JJ ! -MY_JS_GLB+1 -! - DO I=1,4 - grid%iup_h(IMS+I-1,J)=I - grid%iup_v(IMS+I-1,J)=I - ENDDO - grid%n_iup_h(J)=4 - grid%n_iup_v(J)=4 - ENDIF - ENDDO -! - DO JJ=6,JDE-6 ! JM-5 - IF(JJ>=MY_JS_GLB-2.AND.JJ<=MY_JE_GLB+2)THEN - J=JJ ! -MY_JS_GLB+1 - KNTI=0 - IEND=2+MOD(JJ,2) - DO I=2,IEND - grid%iup_adh(IMS+KNTI,J)=I - KNTI=KNTI+1 - ENDDO - grid%n_iup_adh(J)=KNTI -! - KNTI=0 - IEND=2+MOD(JJ+1,2) - DO I=2,IEND - grid%iup_adv(IMS+KNTI,J)=I - KNTI=KNTI+1 - ENDDO - grid%n_iup_adv(J)=KNTI -! - ENDIF - ENDDO - ENDIF -! - CALL WRF_GET_NPROCX(INPES) -! - IF(E_BDY)THEN - grid%upstrm=.TRUE. - IRPAD2=0 - DO JJ=8,JDE-8 ! JM-7 - IF(JJ>=MY_JS_GLB-2.AND.JJ<=MY_JE_GLB+2)THEN - J=JJ ! -MY_JS_GLB+1 - IEND=IM-MOD(JJ+1,2) - ISTART=IEND-3 -! -!*** IN CASE THERE IS ONLY A SINGLE GLOBAL TASK IN THE -!*** I DIRECTION THEN WE MUST ADD THE WESTSIDE UPSTREAM -!*** POINTS TO THE EASTSIDE POINTS IN EACH ROW. -! - KNTI=0 - IF(INPES.EQ.1)KNTI=grid%n_iup_h(J) -! - DO II=ISTART,IEND - I=II ! -MY_IS_GLB+1 - grid%iup_h(IMS+KNTI,J)=I - KNTI=KNTI+1 - ENDDO - grid%n_iup_h(J)=KNTI - ENDIF - ENDDO -! - DO JJ=6,JDE-6 ! JM-5 - IF(JJ>=MY_JS_GLB-2.AND.JJ<=MY_JE_GLB+2)THEN - J=JJ ! -MY_JS_GLB+1 - IEND=IM-1-MOD(JJ+1,2) - ISTART=IEND-MOD(JJ,2) - KNTI=0 - IF(INPES==1)KNTI=grid%n_iup_adh(J) - DO II=ISTART,IEND - I=II ! -MY_IS_GLB+1 - grid%iup_adh(IMS+KNTI,J)=I - KNTI=KNTI+1 - ENDDO - grid%n_iup_adh(J)=KNTI - ENDIF - ENDDO -!*** - DO JJ=8,JDE-8 ! JM-7 - IF(JJ>=MY_JS_GLB-2.AND.JJ<=MY_JE_GLB+2)THEN - J=JJ ! -MY_JS_GLB+1 - IEND=IM-MOD(JJ,2) - ISTART=IEND-3 - KNTI=0 - IF(INPES==1)KNTI=grid%n_iup_v(J) -! - DO II=ISTART,IEND - I=II ! -MY_IS_GLB+1 - grid%iup_v(IMS+KNTI,J)=I - KNTI=KNTI+1 - ENDDO - grid%n_iup_v(J)=KNTI - ENDIF - ENDDO -! - DO JJ=6,JDE-6 ! JM-5 - IF(JJ>=MY_JS_GLB-2.AND.JJ<=MY_JE_GLB+2)THEN - J=JJ ! -MY_JS_GLB+1 - IEND=IM-1-MOD(JJ,2) - ISTART=IEND-MOD(JJ+1,2) - KNTI=0 - IF(INPES==1)KNTI=grid%n_iup_adv(J) - DO II=ISTART,IEND - I=II ! -MY_IS_GLB+1 - grid%iup_adv(IMS+KNTI,J)=I - KNTI=KNTI+1 - ENDDO - grid%n_iup_adv(J)=KNTI - ENDIF - ENDDO - ENDIF -!---------------------------------------------------------------------- - jam=6+2*(JDE-JDS-1-9) -! -!*** EXTRACT em AND emt FOR THE LOCAL SUBDOMAINS -! - DO J=MYJS_P5,MYJE_P5 - grid%em_loc(J)=-9.E9 - grid%emt_loc(J)=-9.E9 - ENDDO -!!! IF(IBROW==1)THEN - IF(S_BDY)THEN - DO J=3,5 - grid%em_loc(J)=grid%em(J-2) - grid%emt_loc(J)=grid%emt(J-2) - ENDDO - ENDIF -!!! IF(ITROW==1)THEN - IF(N_BDY)THEN - KNT=3 - DO JJ=JDE-5,JDE-3 ! JM-4,JM-2 - KNT=KNT+1 - J=JJ ! -MY_JS_GLB+1 - grid%em_loc(J)=grid%em(KNT) - grid%emt_loc(J)=grid%emt(KNT) - ENDDO - ENDIF -!!! IF(ILCOL==1)THEN - IF(W_BDY)THEN - KNT=6 - DO JJ=6,JDE-6 ! JM-5 - KNT=KNT+1 - IF(JJ>=MY_JS_GLB-2.AND.JJ<=MY_JE_GLB+2)THEN - J=JJ ! -MY_JS_GLB+1 - grid%em_loc(J)=grid%em(KNT) - grid%emt_loc(J)=grid%emt(KNT) - ENDIF - ENDDO - ENDIF -!!! IF(IRCOL==1)THEN - IF(E_BDY)THEN - KNT=6+JDE-11 ! JM-10 - DO JJ=6,JDE-6 ! JM-5 - KNT=KNT+1 - IF(JJ>=MY_JS_GLB-2.AND.JJ<=MY_JE_GLB+2)THEN - J=JJ ! -MY_JS_GLB+1 - grid%em_loc(J)=grid%em(KNT) - grid%emt_loc(J)=grid%emt(KNT) - ENDIF - ENDDO - ENDIF -#else - CALL wrf_message( 'start_domain_nmm: upstream advection commented out') -#endif -! -!*** -!*** SET ZERO-VALUE FOR SOME OUTPUT DIAGNOSTIC ARRAYS -!*** -#if ( HWRF == 1 ) -!zhang'sdoing IF(NSTART.EQ.0)THEN - IF(NSTART.EQ.0 .or. .not.allowed_to_read )THEN -!zhang's doing ends -#else - IF(NSTART.EQ.0)THEN -#endif -! - GRID%NSOIL= GRID%NUM_SOIL_LAYERS - DO J=JFS,JFE - DO I=IFS,IFE - grid%pctsno(I,J)=-999.0 - IF(grid%sm(I,J)<0.5)THEN - grid%cmc(I,J)=0.0 -! grid%cmc(I,J)=grid%canwat(i,j) ! tgs - IF(grid%sice(I,J)>0.5)THEN -!*** -!*** SEA-ICE CASE -!*** - grid%smstav(I,J)=1.0 - grid%smstot(I,J)=1.0 - grid%ssroff(I,J)=0.0 - grid%bgroff(I,J)=0.0 - grid%cmc(I,J)=0.0 - DO NS=1,GRID%NSOIL - grid%smc(I,NS,J)=1.0 -! grid%sh2o(I,NS,J)=0.05 - grid%sh2o(I,NS,J)=1.0 - ENDDO - ENDIF - ELSE -!*** -!*** WATER CASE -!*** - grid%smstav(I,J)=1.0 - grid%smstot(I,J)=1.0 - grid%ssroff(I,J)=0.0 - grid%bgroff(I,J)=0.0 - grid%soiltb(I,J)=273.16 - grid%grnflx(I,J)=0. - grid%subshx(I,J)=0.0 - grid%acsnow(I,J)=0.0 - grid%acsnom(I,J)=0.0 - grid%snopcx(I,J)=0.0 - grid%cmc(I,J)=0.0 - grid%sno(I,J)=0.0 - DO NS=1,GRID%NSOIL - grid%smc(I,NS,J)=1.0 - grid%stc(I,NS,J)=273.16 -! grid%sh2o(I,NS,J)=0.05 - grid%sh2o(I,NS,J)=1.0 - ENDDO - ENDIF -! - ENDDO - ENDDO -! - grid%aphtim=0.0 - grid%aratim=0.0 - grid%acutim=0.0 -! - ENDIF -! -!---------------------------------------------------------------------- -!*** INITIALIZE RADTN VARIABLES -!*** CALCULATE THE NUMBER OF STEPS AT EACH POINT. -!*** THE ARRAY 'lvl' WILL COORDINATE VERTICAL LOCATIONS BETWEEN -!*** THE LIFTED WORKING ARRAYS AND THE FUNDAMENTAL MODEL ARRAYS. -!*** lvl HOLDS THE HEIGHT (IN MODEL LAYERS) OF THE TOPOGRAPHY AT -!*** EACH GRID POINT. -!---------------------------------------------------------------------- -! - DO J=JFS,JFE - DO I=IFS,IFE - grid%lvl(I,J)=LM-KTE - ENDDO - ENDDO -!*** -!*** DETERMINE MODEL LAYER LIMITS FOR HIGH(3), MIDDLE(2), -!*** AND LOW(1) CLOUDS. ALSO FIND MODEL LAYER THAT IS JUST BELOW -!*** (HEIGHT-WISE) 400 MB. (K400) -!*** - K400=0 - PSUM=grid%pt - SLPM=101325. - PDIF=SLPM-grid%pt - DO K=1,LM - PSUM=PSUM+grid%deta(K)*PDIF - IF(LPTOP(3)==0)THEN - IF(PSUM>PHITP)LPTOP(3)=K - ELSEIF(LPTOP(2)==0)THEN - IF(PSUM>PMDHI)LPTOP(2)=K - ELSEIF(K400==0)THEN - IF(PSUM>P400)K400=K - ELSEIF(LPTOP(1)==0)THEN - IF(PSUM>PLOMD)LPTOP(1)=K - ENDIF - ENDDO -!*** -!*** CALL GRADFS ONCE TO CALC. CONSTANTS AND GET O3 DATA -!*** - KCCO2=0 -!*** -!*** CALCULATE THE MIDLAYER PRESSURES IN THE STANDARD ATMOSPHERE -!*** - PSS=101325. - PDIF=PSS-grid%pt -! - ALLOCATE(PHALF(LM+1),STAT=I) -! - DO K=KPS,KPE-1 - PHALF(K+1)=grid%aeta(K)*PDIF+grid%pt - ENDDO - -! - PHALF(1)=0. - PHALF(LM+1)=PSS -!*** -!!! CALL GRADFS(PHALF,KCCO2,NUNIT_CO2) -!*** -!*** CALL SOLARD TO CALCULATE NON-DIMENSIONAL SUN-EARTH DISTANCE -!*** -!!! IF(MYPE==0)CALL SOLARD(SUN_DIST) -!!! CALL MPI_BCAST(SUN_DIST,1,MPI_REAL,0,MPI_COMM_COMP,IRTN) - -!*** -!*** CALL ZENITH SIMPLY TO GET THE DAY OF THE YEAR FOR -!*** THE SETUP OF THE OZONE DATA -!*** - TIME=(grid%ntsd-1)*GRID%DT -! -!!! CALL ZENITH(TIME,DAYI,HOUR) -! - ADDL=0. - IF(MOD(IDAT(3),4)==0)ADDL=1. -! -!!! CALL O3CLIM -! -! - DEALLOCATE(PHALF) -!---------------------------------------------------------------------- -!*** SOME INITIAL VALUES RELATED TO TURBULENCE SCHEME -!---------------------------------------------------------------------- -! - IF(allowed_to_read.and.(.NOT.RESTRT))THEN ! This is gopal's inclusion for moving nest - - DO J=JFS,JFE - DO I=IFS,IFE -!*** -!*** TRY A SIMPLE LINEAR INTERP TO GET 2/10 M VALUES -!*** -#if ( HWRF == 1 ) -!zhang's doing - IF(.NOT.RESTRT .OR. .NOT.allowed_to_read) then - grid%PDSL(I,J)=grid%PD(I,J)*grid%RES(I,J) - endif -!end of zhang's doing -#else - grid%PDSL(I,J)=grid%PD(I,J)*grid%RES(I,J) -#endif -! - ULM=grid%u(I,J,KTS) - VLM=grid%v(I,J,KTS) - TLM=grid%t(I,J,KTS) - QLM=grid%q(I,J,KTS) - PLM=grid%aeta1(KTS)*grid%pdtop+grid%aeta2(KTS)*grid%pdsl(I,J)+grid%pt - APELM=(1.0E5/PLM)**CAPA - TERM1=-0.068283/grid%t(I,J,KTS) - grid%pshltr(I,J)=(grid%pd(I,J)+grid%pdtop+grid%pt)*EXP(TERM1) - APELMNW=(1.0E5/grid%pshltr(I,J))**CAPA - THLM=TLM*APELM - DPLM=(grid%deta1(KTS)*grid%pdtop+grid%deta2(KTS)*grid%pdsl(I,J))*0.5 - DZLM=R_D*DPLM*TLM*(1.+P608*QLM)/(G*PLM) - FAC1=10./DZLM - FAC2=(DZLM-10.)/DZLM - IF(DZLM<=10.)THEN - FAC1=1. - FAC2=0. - ENDIF -! -#if ( HWRF == 1 ) -!zhang's doing - IF(.NOT.RESTRT .OR. .NOT.allowed_to_read)THEN -!end of zhang's doing -#else - IF(.NOT.RESTRT)THEN -#endif - grid%th10(I,J)=FAC2*grid%ths(I,J)+FAC1*THLM - grid%q10(I,J)=FAC2*grid%qsh(I,J)+FAC1*QLM -#if (HWRF == 1) - IF(grid%sm(I,J).LT.0.5)THEN - grid%u10(I,J)=ULM*(log(10./grid%z0(I,J))/log(DZLM/grid%z0(I,J))) - grid%v10(I,J)=VLM*(log(10./grid%z0(I,J))/log(DZLM/grid%z0(I,J))) - ELSE - windlmtmp=SQRT(ULM*ULM+VLM*VLM) - wind10tmp=windlmtmp - DO ITER=1,10 - call znot_wind10m(wind10tmp,znotttmp,znotmtmp,config_flags%icoef_sf) - znotmtmp=MAX(znotmtmp,1.e-6) - wind10new=windlmtmp*(log(10./znotmtmp))/log(DZLM/znotmtmp) - IF (ABS(wind10new-wind10tmp) .LE. 1.e-3 ) EXIT - wind10tmp=wind10new - IF ( ITER .GE. 10 ) THEN - write(message,*) 'Warning: reached the 10th iteration step in calculating U10 from ULM' - CALL wrf_message( message ) - ENDIF - ENDDO - grid%u10(I,J)=ULM*(log(10./znotmtmp))/log(DZLM/znotmtmp) - grid%v10(I,J)=VLM*(log(10./znotmtmp))/log(DZLM/znotmtmp) - ENDIF -#else - grid%u10(I,J)=ULM - grid%v10(I,J)=VLM -#endif - ENDIF -! -! FAC1=2./DZLM -! FAC2=(DZLM-2.)/DZLM -! IF(DZLM.LE.2.)THEN -! FAC1=1. -! FAC2=0. -! ENDIF -! - IF(.NOT.RESTRT.OR.NEST)THEN -! - IF ( (THLM-grid%ths(I,J))>2.0) THEN ! weight differently in different scenarios - FAC1=0.3 - FAC2=0.7 - ELSE - FAC1=0.8 - FAC2=0.2 - ENDIF - -#if ( HWRF == 1 ) - grid%tshltr(I,J)=0.2*grid%ths(I,J)+0.8*THLM - grid%qshltr(I,J)=0.2*grid%qsh(I,J)+0.8*QLM -#else - grid%tshltr(I,J)=FAC2*grid%ths(I,J)+FAC1*THLM - grid%qshltr(I,J)=FAC2*grid%qsh(I,J)+FAC1*QLM -#endif - ENDIF -!*** -!*** NEED TO CONVERT TO THETA IF IS THE RESTART CASE -!*** AS CHKOUT.f WILL CONVERT TO TEMPERATURE -!*** -!EROGERS: COMMENT OUT IN WRF-NMM -!*** -! IF(RESTRT)THEN -! grid%tshltr(I,J)=grid%tshltr(I,J)*APELMNW -! ENDIF - ENDDO - ENDDO - - END IF ! IF(allowed_to_read)THEN -! -!---------------------------------------------------------------------- -!*** INITIALIZE TAU-1 VALUES FOR ADAMS-BASHFORTH -!---------------------------------------------------------------------- -! -#if ( HWRF == 1 ) -!zhang's doing - IF(.NOT.RESTRT .OR. .NOT.allowed_to_read)THEN !zhang's doing -#else - IF(.NOT.RESTRT)THEN -#endif - DO K=KPS,KPE - DO J=JFS,JFE - DO I=ifs,ife - grid%told(I,J,K)=grid%t(I,J,K) ! grid%t AT TAU-1 - grid%uold(I,J,K)=grid%u(I,J,K) ! grid%u AT TAU-1 - grid%vold(I,J,K)=grid%v(I,J,K) ! grid%v AT TAU-1 - ENDDO - ENDDO - ENDDO - ENDIF -! -!---------------------------------------------------------------------- -!*** INITIALIZE NONHYDROSTATIC QUANTITIES -!---------------------------------------------------------------------- -! -!!!! SHOULD grid%dwdt BE REDEFINED IF RESTRT? - - if(grid%nhmove<0) then - nhki=1 - nhkj=1 - elseif(grid%nhmove>0) then - nhki=3 - nhkj=6 - endif - - IF((.NOT.RESTRT.OR.NEST).AND. allowed_to_read)THEN ! This is gopal's inclusion for moving nest - DO K=KPS,KPE - DO J=JFS,JFE - if(grid%nhmove==0 .or. .not. nestmove .or. jjfe) then - DO I=IFS,IFE - grid%dwdt(I,J,K)=1. - ENDDO - else - grid%dwdt(1:nhki,j,k)=1. - grid%dwdt(ife-nhki+1:ife,j,k)=1. - endif - ENDDO - ENDDO - ENDIF -!*** -#if ( HWRF == 1 ) - IF(.NOT.RESTRT .OR. .NOT.allowed_to_read) THEN !zhang's doing -#endif - IF(GRID%SIGMA==1)THEN - DO J=JFS,JFE - DO I=IFS,IFE - grid%pdsl(I,J)=grid%pd(I,J) - ENDDO - ENDDO - ELSE - DO J=JFS,JFE - DO I=IFS,IFE - grid%pdsl(I,J)=grid%res(I,J)*grid%pd(I,J) - ENDDO - ENDDO - ENDIF -#if ( HWRF == 1 ) - ENDIF !zhang's doing -#endif -! -!*** -! -! -!!!! SHOULD pint,z,w BE REDEFINED IF RESTRT? - - WRITE( wrf_err_message, * )' restrt=',restrt,' nest=',nest - CALL wrf_debug( 0, TRIM(wrf_err_message) ) - WRITE( wrf_err_message, * )' grid%pdtop=',grid%pdtop,' grid%pt=',grid%pt - CALL wrf_debug( 0, TRIM(wrf_err_message) ) -#if ( HWRF == 1 ) -!zhang's doing - IF(.NOT.RESTRT.OR.NEST .OR. .NOT.allowed_to_read)THEN -!end of zhang's doing -#else - IF(.NOT.RESTRT.OR.NEST)THEN -#endif -#ifdef IDEAL_NMM_TC - do k=kps,kpe - do j=jfs,jfe - do i=ifs,ife - grid%f(I,J)=0.5*GRID%DT*3.15656e-5 ! IDEAL CASE 0.5*DT*f (and not f!) - enddo - enddo - enddo -#endif - if(nestmove) then - if(grid%nhmove==0) then - call wrf_message('Discarding non-hydrostatic state at nest move. Set nhmove=-1 to retain the state everywhere or nhmove=1 to discard only at the boundaries.') - elseif(grid%nhmove>0) then - call wrf_message('Retaining non-hydrostatic state at nest move except at nest boundaries.') - else - call wrf_message('Retaining non-hydrostatic state at nest move.') - endif - endif - - if(grid%nhmove<0) then - nhki=1 - nhkj=1 - elseif(grid%nhmove>0) then - nhki=3 - nhkj=6 - endif - - DO K=KPS,KPE - DO J=JFS,JFE - if(grid%nhmove==0 .or. .not.nestmove .or. j=jfe) then - DO I=IFS,IFE - grid%pint(I,J,K)=grid%eta1(K)*grid%pdtop+grid%eta2(K)*grid%pdsl(I,J)+grid%pt - grid%z(I,J,K)=grid%pint(I,J,K) - grid%w(I,J,K)=0. - ENDDO - else - ! Rotated West boundary: - do I=1,nhki - grid%pint(I,J,K)=grid%eta1(K)*grid%pdtop+grid%eta2(K)*grid%pdsl(I,J)+grid%pt - grid%z(I,J,K)=grid%pint(I,J,K) - grid%w(I,J,K)=0. - enddo - ! Rotated East boundary: - do I=ife-nhki+1,ife - grid%pint(I,J,K)=grid%eta1(K)*grid%pdtop+grid%eta2(K)*grid%pdsl(I,J)+grid%pt - grid%z(I,J,K)=grid%pint(I,J,K) - grid%w(I,J,K)=0. - enddo - endif - ENDDO - ENDDO - ENDIF -#if ( HWRF == 1 ) -!zhang's doing - IF(.NOT.RESTRT.OR.NEST .OR. .NOT.allowed_to_read)THEN -#endif - - DO K=KTS,KTE-1 - DO J=JFS,JFE - DO I=IFS,IFE - grid%rtop(I,J,K)=(grid%q(I,J,K)*P608-grid%cwm(I,J,K)+1.)*grid%t(I,J,K)*R_D/ & - ((grid%pint(I,J,K+1)+grid%pint(I,J,K))*0.5) - ENDDO - ENDDO - ENDDO -#if ( HWRF == 1 ) - ENDIF !zhang -#endif - -#if ( HWRF == 1 ) - hwrfx_mslp: if(grid%vortex_tracker /= 1) then - DO J=JFS,JFE - DO I=IFS,IFE - grid%Z(I,J,KFS)=grid%FIS(I,J)*GI - ENDDO - ENDDO - - ! Z now correctly calculated after nest move. Needed by membrane MSLP. - DO K=KFS,KFE - DO J=JFS,JFE - DO I=IFS,IFE - APELP = (grid%PINT(I,J,K+1)+grid%PINT(I,J,K)) - RTOPP = TRG*grid%T(I,J,K)*(1.0+grid%Q(I,J,K)*P608)/APELP - DZ = RTOPP*(grid%DETA1(K)*grid%PDTOP+grid%DETA2(K)*grid%PD(I,J)) - grid%Z(I,J,K+1) = grid%Z(I,J,K) + DZ - ENDDO - ENDDO - ENDDO - - DO K=KFS,KFE - DO J=JFS,JFE - DO I=IFS,IFE - grid%Z(i,j,k)=(grid%Z(i,j,k)+grid%Z(i,j,k+1))*0.5 - ENDDO - ENDDO - ENDDO - - grid%MSLP=-9999.99 - DO J=JFS,JFE - DO I=IFS,IFE - SFCT = grid%T(I,J,1)*(1.+D608*grid%Q(I,J,1)) + LAPSR*grid%Z(I,J,1) - A = LAPSR*grid%FIS(i,j)*gi/SFCT - grid%MSLP(I,J) = grid%PINT(I,J,1)*(1-A)**COEF2 - ENDDO - ENDDO - - endif hwrfx_mslp -#endif - - -#ifndef NO_RESTRICT_ACCEL -!---------------------------------------------------------------------- -!*** RESTRICTING THE ACCELERATION ALONG THE BOUNDARIES -!---------------------------------------------------------------------- -! - DO J=JFS,JFE - DO I=IFS,IFE - grid%dwdtmn(I,J)=-EPSIN - grid%dwdtmx(I,J)= EPSIN - ENDDO - ENDDO -! -!*** - IF(JHL>1)THEN - JHH=JDE-1-JHL+1 ! JM-JHL+1 - IHL=JHL/2+1 -! - DO J=1,JHL - IF(J>=MY_JS_GLB-JBPAD2.AND.J<=MY_JE_GLB+JTPAD2)THEN - JX=J ! -MY_JS_GLB+1 - DO I=1,IDE-1 ! IM - IF(I>=MY_IS_GLB-ILPAD2.AND.I<=MY_IE_GLB+IRPAD2)THEN - IX=I ! -MY_IS_GLB+1 - grid%dwdtmn(IX,JX)=-EPSB - grid%dwdtmx(IX,JX)= EPSB - ENDIF - ENDDO - ENDIF - ENDDO -! - DO J=JHH,JDE-1 ! JM - IF(J>=MY_JS_GLB-JBPAD2.AND.J<=MY_JE_GLB+JTPAD2)THEN - JX=J ! -MY_JS_GLB+1 - DO I=1,IDE-1 ! IM - IF(I>=MY_IS_GLB-ILPAD2.AND.I<=MY_IE_GLB+IRPAD2)THEN - IX=I ! -MY_IS_GLB+1 - grid%dwdtmn(IX,JX)=-EPSB - grid%dwdtmx(IX,JX)= EPSB - ENDIF - ENDDO - ENDIF - ENDDO -! - DO J=1,JDE-1 ! JM - IF(J>=MY_JS_GLB-JBPAD2.AND.J<=MY_JE_GLB+JTPAD2)THEN - JX=J ! -MY_JS_GLB+1 - DO I=1,IHL - IF(I>=MY_IS_GLB-ILPAD2.AND.I<=MY_IE_GLB+IRPAD2)THEN - IX=I ! -MY_IS_GLB+1 - grid%dwdtmn(IX,JX)=-EPSB - grid%dwdtmx(IX,JX)= EPSB - ENDIF - ENDDO - ENDIF - ENDDO -! - DO J=1,JDE-1 ! JM - IF(J>=MY_JS_GLB-JBPAD2.AND.J<=MY_JE_GLB+JTPAD2)THEN - JX=J ! -MY_JS_GLB+1 - ! moved this line to inside the J-loop, 20030429, jm - IHH=IDE-1-IHL+MOD(J,2) ! IM-IHL+MOD(J,2) - DO I=IHH,IDE-1 ! IM - IF(I>=MY_IS_GLB-ILPAD2.AND.I<=MY_IE_GLB+IRPAD2)THEN - IX=I ! -MY_IS_GLB+1 - grid%dwdtmn(IX,JX)=-EPSB - grid%dwdtmx(IX,JX)= EPSB - ENDIF - ENDDO - ENDIF - ENDDO -! - ENDIF - -#else - CALL wrf_message('start_domain_nmm: NO_RESTRICT_ACCEL') -#endif - -!----------------------------------------------------------------------- -!*** CALL THE GENERAL PHYSICS INITIALIZATION -!----------------------------------------------------------------------- -! - - ALLOCATE(SFULL(KMS:KME),STAT=I) ; SFULL = 0. - ALLOCATE(SMID(KMS:KME),STAT=I) ; SMID = 0. - ALLOCATE(EMISS(IMS:IME,JMS:JME),STAT=I) ; EMISS = 0. - ALLOCATE(EMTEMP(IMS:IME,JMS:JME),STAT=I) ; EMTEMP = 0. - ALLOCATE(GLW(IMS:IME,JMS:JME),STAT=I) ; GLW = 0. - ALLOCATE(HFX(IMS:IME,JMS:JME),STAT=I) ; HFX = 0. - ALLOCATE(LOWLYR(IMS:IME,JMS:JME),STAT=I) ; LOWLYR = 0. -! ALLOCATE(grid%mavail(IMS:IME,JMS:JME),STAT=I) ; grid%mavail = 0. - ALLOCATE(NCA(IMS:IME,JMS:JME),STAT=I) ; NCA = 0. - ALLOCATE(QFX(IMS:IME,JMS:JME),STAT=I) ; QFX = 0. - ALLOCATE(RAINBL(IMS:IME,JMS:JME),STAT=I) ; RAINBL = 0. - ALLOCATE(RAINC(IMS:IME,JMS:JME),STAT=I) ; RAINC = 0. - ALLOCATE(RAINNC(IMS:IME,JMS:JME),STAT=I) ; RAINNC = 0. - ALLOCATE(RAINNCV(IMS:IME,JMS:JME),STAT=I) ; RAINNCV = 0. - ALLOCATE(SNOWNC(IMS:IME,JMS:JME),STAT=I) ; SNOWNC = 0. - ALLOCATE(SNOWNCV(IMS:IME,JMS:JME),STAT=I) ; SNOWNCV = 0. - ALLOCATE(GRAUPELNC(IMS:IME,JMS:JME),STAT=I) ; GRAUPELNC = 0. - ALLOCATE(GRAUPELNCV(IMS:IME,JMS:JME),STAT=I) ; GRAUPELNCV = 0. - - ALLOCATE(ZS(KMS:KME),STAT=I) ; ZS = 0. - ALLOCATE(SNOWC(IMS:IME,JMS:JME),STAT=I) ; SNOWC = 0. - ALLOCATE(THC(IMS:IME,JMS:JME),STAT=I) ; THC = 0. - ALLOCATE(TMN(IMS:IME,JMS:JME),STAT=I) ; TMN = 0. - ALLOCATE(TSFC(IMS:IME,JMS:JME),STAT=I) ; TSFC = 0. - ALLOCATE(Z0_DUM(IMS:IME,JMS:JME),STAT=I) ; Z0_DUM = 0. - ALLOCATE(ALBEDO_DUM(IMS:IME,JMS:JME),STAT=I) ; ALBEDO_DUM = 0. - - ALLOCATE(DZS(KMS:KME),STAT=I) ; DZS = 0. - ALLOCATE(RQCBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQCBLTEN = 0. - ALLOCATE(RQIBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQIBLTEN = 0. - ALLOCATE(RQVBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQVBLTEN = 0. - ALLOCATE(RTHBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RTHBLTEN = 0. - ALLOCATE(RUBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RUBLTEN = 0. - ALLOCATE(RVBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RVBLTEN = 0. - ALLOCATE(RQCCUTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQCCUTEN = 0. - ALLOCATE(RQICUTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQICUTEN = 0. - ALLOCATE(RQRCUTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQRCUTEN = 0. - ALLOCATE(RQSCUTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQSCUTEN = 0. - ALLOCATE(RQVCUTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQVCUTEN = 0. - ALLOCATE(RTHCUTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RTHCUTEN = 0. - ALLOCATE(RUSHTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RUSHTEN = 0. - ALLOCATE(RVSHTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RVSHTEN = 0. - ALLOCATE(RQCSHTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQCSHTEN = 0. - ALLOCATE(RQISHTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQISHTEN = 0. - ALLOCATE(RQRSHTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQRSHTEN = 0. - ALLOCATE(RQSSHTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQSSHTEN = 0. - ALLOCATE(RQGSHTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQGSHTEN = 0. - ALLOCATE(RQVSHTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RQVSHTEN = 0. - ALLOCATE(RTHSHTEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RTHSHTEN = 0. - ALLOCATE(RTHRATEN(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RTHRATEN = 0. - ALLOCATE(RTHRATENLW(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RTHRATENLW = 0. - ALLOCATE(RTHRATENSW(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RTHRATENSW = 0. - ALLOCATE(ZINT(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; ZINT = 0. - ALLOCATE(CONVFAC(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; CONVFAC = 0. - ALLOCATE(PINT_TRANS(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; PINT_TRANS = 0. - ALLOCATE(T_TRANS(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; T_TRANS = 0. - ALLOCATE(RRI(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; RRI = 0. - ALLOCATE(CLDFRA_TRANS(IMS:IME,KMS:KME,JMS:JME),STAT=I); CLDFRA_TRANS = 0. - ALLOCATE(SCALAR_TRANS(IMS:IME,KMS:KME,JMS:JME,NUM_SCALAR),STAT=I) - ALLOCATE(CLDFRA_OLD(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; CLDFRA_OLD = 0. - ALLOCATE(Z_AT_Q(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; z_at_q = 0. -#if 0 - ALLOCATE(w0avg(IMS:IME,KMS:KME,JMS:JME),STAT=I) ; w0avg = 0. -#endif -!----------------------------------------------------------------------- -!jm added set of g_inv - G_INV=1./G - ROG=R_D*G_INV - GRID%RADT=GRID%NRADS*GRID%DT/60. - GRID%BLDT=GRID%NPHS*GRID%DT/60. - GRID%CUDT=GRID%NCNVC*GRID%DT/60. - GRID%GSMDT=GRID%NPHS*GRID%DT/60. -! -! translate scalar(i,j,k,n) to scalar_trans(i,k,j,n) - DO N=1,NUM_SCALAR -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - SCALAR_TRANS(I,K,J,N)=SCALAR(I,J,K,N) - ENDDO - ENDDO - ENDDO - ENDDO -! - DO J=MYJS,MYJE - DO I=MYIS,MYIE - SFCZ=grid%fis(I,J)*G_INV - ZINT(I,KTS,J)=SFCZ -#if ( HWRF == 1 ) -!zhang's doing - IF(.NOT.RESTRT .OR. .NOT.allowed_to_read) then - grid%PDSL(I,J)=grid%PD(I,J)*grid%RES(I,J) - endif -!end of zhang's doing -#else - grid%pdsl(I,J)=grid%pd(I,J)*grid%res(I,J) -#endif - PSURF=grid%pint(I,J,KTS) - EXNSFC=(1.E5/PSURF)**CAPA - grid%xland(I,J)=grid%sm(I,J)+1. - THSIJ=(grid%sst(I,J)*EXNSFC)*(grid%xland(I,J)-1.) & - & +grid%ths(I,J)*(2.-grid%sm(I,J)) - TSFC(I,J)=THSIJ/EXNSFC -! - DO K=KTS,KTE-1 - PLYR=(grid%pint(I,J,K)+grid%pint(I,J,K+1))*0.5 - TL=grid%t(I,J,K) - CWML=grid%cwm(I,J,K) - RRI(I,K,J)=R_D*TL*(1.+P608*grid%q(I,J,K))/PLYR - ZINT(I,K+1,J)=ZINT(I,K,J)+TL/PLYR & - *(grid%deta1(K)*grid%pdtop+grid%deta2(K)*grid%pdsl(I,J))*ROG & - *(grid%q(I,J,K)*P608-CWML+1.) - ENDDO -! -! DO K=KTS,KTE -!!! ZMID(I,K,J)=0.5*(ZINT(I,K,J)+ZINT(I,K+1,J)) -! ENDDO - ENDDO - ENDDO -! -!----------------------------------------------------------------------- -!*** RECREATE SIGMA VALUES AT LAYER INTERFACES FOR THE FULL VERTICAL -!*** DOMAIN FROM THICKNESS VALUES FOR THE TWO SUBDOMAINS. -!*** NOTE: KTE=NUMBER OF LAYERS PLUS ONE -!----------------------------------------------------------------------- -! - PDTOT=101325.-grid%pt - RPDTOT=1./PDTOT - PDBOT=PDTOT-grid%pdtop - SFULL(KTS)=1. - SFULL(KTE)=0. - DSIGSUM = 0. - DO K=KTS+1,KTE - DSIG=(grid%deta1(K-1)*grid%pdtop+grid%deta2(K-1)*PDBOT)*RPDTOT - DSIGSUM=DSIGSUM+DSIG - SFULL(K)=SFULL(K-1)-DSIG - SMID(K-1)=0.5*(SFULL(K-1)+SFULL(K)) - ENDDO - DSIG=(grid%deta1(KTE-1)*grid%pdtop+grid%deta2(KTE-1)*PDBOT)*RPDTOT - DSIGSUM=DSIGSUM+DSIG - SMID(KTE-1)=0.5*(SFULL(KTE-1)+SFULL(KTE)) -! -!----------------------------------------------------------------------- - -#if ( HWRF == 1 ) -!zhang's doing - if(.NOT.RESTRT .OR. .NOT.allowed_to_read)grid%LU_INDEX=grid%IVGTYP -!end of zhang's doing -#else - grid%lu_index=grid%ivgtyp -#endif - - IF(.NOT.RESTRT)THEN - DO J=MYJS,MYJE - DO I=MYIS,MYIE - Z0_DUM(I,J)=grid%z0(I,J) ! hold - ALBEDO_DUM(I,J)=grid%albedo(I,J) ! Save albedos - ENDDO - ENDDO - ENDIF -! -!*** Always define the quantity grid%z0base - -4041 format('Bounds: ip=',I0,',',I0,' jp=',I0,',',I0,' myi=',I0,',',I0,& - ' myj=',I0,',',I0) - write(message,4041) ips,ipe,jps,jpe,myis,myie,myjs,myje - call wrf_message(message) - - IF(.NOT.RESTRT)THEN - DO J=MYJS,MYJE - DO I=MYIS,MYIE -! - IF(grid%sm(I,J)==0)then - grid%z0base(I,J)=VZ0TBL_24(grid%ivgtyp(I,J))+Z0LAND - ELSE - grid%z0base(I,J)=VZ0TBL_24(grid%ivgtyp(I,J))+Z0SEA - ENDIF -! - ENDDO - ENDDO - ENDIF -! -! when allocating CAM radiation 4d arrays (ozmixm, aerosolc) these are not needed - num_aerosolc=1 - -! Set GMT, JULDAY, and JULYR outside of phy_init because it is no longer -! called inside phy_init due to moving nest changes. (When nests move -! phy_init may not be called on a process if, for example, it is a moving -! nest and if this part of the domain is not being initialized (not the -! leading edge).) Calling domain_setgmtetc() here will avoid this problem -! when NMM moves to moving nests. - CALL domain_setgmtetc( GRID, START_OF_SIMULATION ) - - if(restrt) then - CALL domain_clock_get( grid, current_time=currentTime ) - CALL WRFU_TimeGet( currentTime, YY=grid%julyr, dayOfYear=grid%julday, & - H=hr, M=mn, S=sec, MS=ms, rc=rc) - grid%gmt=hr+real(mn)/60.+real(sec)/3600.+real(ms)/(1000*3600) - WRITE( wrf_err_message , * ) 'DEBUG start_domain_nmm(): gmt = ',grid%gmt - CALL wrf_debug( 150, TRIM(wrf_err_message) ) - endif - -! Several arguments are RCONFIG entries in Registry.NMM. Registry no longer -! includes these as dummy arguments or declares them. Access them from -! GRID. JM 20050819 -#ifndef WRF_NMM_NEST - ! NOTE: we always get here for all NMM configurations because the - ! #if condition is wrong. Leaving this as is, just in case - ! there was a good reason for it. - grid%moved = .FALSE. -#endif - - IF (GRID%RESTART) THEN - LRESTART = GRID%RESTART - ELSE - IF (grid%moved) THEN - LRESTART = .TRUE. - ELSE - LRESTART = .FALSE. - ENDIF - END IF - - if(allowed_to_read) then - call wrf_debug(1,'Set E grid locations for PHY_INIT.') - if(grid%id==1) then - call med_set_egrid_locs(grid,grid) - else - call med_set_egrid_locs(grid%parents(1)%ptr,grid) - endif - end if - CALL PHY_INIT(GRID%ID,CONFIG_FLAGS,GRID%DT,LRESTART,SFULL,SMID & - & ,grid%pt,TSFC,GRID%RADT,GRID%BLDT,GRID%CUDT,GRID%GSMDT & - & ,grid%DUCUDT, grid%DVCUDT & - & ,RTHCUTEN, RQVCUTEN, RQRCUTEN & - & ,RQCCUTEN, RQSCUTEN, RQICUTEN & - & ,RUSHTEN, RVSHTEN, RTHSHTEN & - & ,RQVSHTEN, RQRSHTEN, RQCSHTEN & - & ,RQSSHTEN, RQISHTEN, RQGSHTEN & - & ,RUBLTEN,RVBLTEN,RTHBLTEN & - & ,RQVBLTEN,RQCBLTEN,RQIBLTEN & - & ,RTHRATEN,RTHRATENLW,RTHRATENSW & - & ,STEPBL,STEPRA,STEPCU & - & ,grid%w0avg, RAINNC, RAINC, grid%raincv, RAINNCV & - & ,SNOWNC, SNOWNCV, GRAUPELNC, GRAUPELNCV & - & ,z_at_q, rri, grid%qnwfa2d & -! & ,scalar_trans(ims,kms,jms,1),num_scalar & - & ,scalar_trans,num_scalar & - & ,grid%re_cloud, grid%re_ice, grid%re_snow & ! G. Thompson - & ,grid%has_reqc,grid%has_reqi,grid%has_reqs & ! G. Thompson - & ,NCA,GRID%SWRAD_SCAT & - & ,grid%cldefi,LOWLYR & - & ,grid%mass_flux & - & ,grid%rthften, grid%rqvften & - & ,CLDFRA_TRANS,CLDFRA_OLD,GLW,grid%gsw,EMISS,EMTEMP,grid%lu_index& - & ,GRID%LANDUSE_ISICE, GRID%LANDUSE_LUCATS & - & ,GRID%LANDUSE_LUSEAS, GRID%LANDUSE_ISN & - & ,GRID%LU_STATE & - & ,grid%hlat,grid%hlon,grid%glat,grid%glon& - & ,grid%albedo,grid%albbck & - & ,GRID%GMT,GRID%JULYR,GRID%JULDAY & - & ,GRID%LEVSIZ, NUM_OZMIXM, NUM_AEROSOLC, GRID%PAERLEV & - & ,grid%alevsiz, grid%no_src_types & - & ,TMN,grid%xland,grid%znt,grid%z0,grid%ustar,grid%mol,grid%pblh,grid%tke_pbl & - & ,grid%exch_h,THC,SNOWC,grid%mavail,HFX,QFX,RAINBL & - & ,grid%stc,grid%sldpth,grid%DZSoil,GRID%NUM_SOIL_LAYERS,WARM_RAIN & - & ,ADV_MOIST_COND,IS_CAMMGMP_USED & - & ,grid%apr_gr,grid%apr_w,grid%apr_mc,grid%apr_st,grid%apr_as & - & ,grid%apr_capma,grid%apr_capme,grid%apr_capmi & - & ,grid%xice,grid%xice,grid%vegfra,grid%snow,grid%canwat,grid%smstav & - & ,grid%smstot, grid%sfcrunoff,grid%udrunoff,grid%grdflx,grid%acsnow & - & ,grid%acsnom,grid%ivgtyp,grid%isltyp,grid%sfcevp,grid%smc & - & ,grid%sh2o, grid%snowh, grid%smfr3d & ! temporary - & ,grid%SNOALB & - & ,GRID%DX,GRID%DY,GRID%DX_NMM,GRID%AREA_NMM & - & ,grid%f_ice_phy,grid%f_rain_phy,grid%f_rimef_phy & - & ,grid%mp_restart_state,grid%tbpvs_state,grid%tbpvs0_state & - & ,ALLOWED_TO_READ,grid%moved,START_OF_SIMULATION & - & ,1 & ! lagday - & ,grid%U10,grid%V10,grid%U10E,grid%V10E & - & ,IDS, IDE, JDS, JDE, KDS, KDE & - & ,IMS, IME, JMS, JME, KMS, KME & - & ,ITS, ITE, JTS, JTE, KTS, KTE & - & ,num_urban_ndm,urban_map_zrd,urban_map_zwd,urban_map_gd & - & ,urban_map_zd ,urban_map_zdf,urban_map_bd ,urban_map_wd & - & ,urban_map_gbd,urban_map_fbd,urban_map_zgrd & - & ,NUM_URBAN_HI & - & ,GRID%RAINCV_A,GRID%RAINCV_B & - & ,ISNOWXY=grid%ISNOWXY, ZSNSOXY=grid%ZSNSOXY, TSNOXY=grid%TSNOXY, & ! Optional Noah-MP - & SNICEXY=grid%SNICEXY, SNLIQXY=grid%SNLIQXY, TVXY=grid%TVXY, & ! Optional Noah-MP - & TGXY=grid%TGXY, CANICEXY=grid%CANICEXY, & ! Optional Noah-MP - & CANLIQXY=grid%CANLIQXY, EAHXY=grid%EAHXY, & ! Optional Noah-MP - & TAHXY=grid%TAHXY, CMXY=grid%CMXY, & ! Optional Noah-MP - & CHXY=grid%CHXY, FWETXY=grid%FWETXY, SNEQVOXY=grid%SNEQVOXY, & ! Optional Noah-MP - & ALBOLDXY=grid%ALBOLDXY, QSNOWXY=grid%QSNOWXY, QRAINXY=grid%QRAINXY,& ! Optional Noah-MP - & WSLAKEXY=grid%WSLAKEXY, ZWTXY=grid%ZWTXY, WAXY=grid%WAXY, & ! Optional Noah-MP - & WTXY=grid%WTXY, LFMASSXY=grid%LFMASSXY, RTMASSXY=grid%RTMASSXY, & ! Optional Noah-MP - & STMASSXY=grid%STMASSXY, WOODXY=grid%WOODXY, & ! Optional Noah-MP - & GRAINXY=grid%GRAINXY, GDDXY=grid%GDDXY, & ! Optional Noah-MP - & CROPTYPE=grid%CROPTYPE, CROPCAT=grid%CROPCAT, & ! Optional Noah-MP - & STBLCPXY=grid%STBLCPXY, FASTCPXY=grid%FASTCPXY, & ! Optional Noah-MP - & XSAIXY=grid%XSAIXY,LAI=grid%LAI, & ! Optional Noah-MP - & T2MVXY=grid%T2MVXY, T2MBXY=grid%T2MBXY, CHSTARXY=grid%CHSTARXY, & ! Optional Noah-MP - & smoiseq=grid%smoiseq, smcwtdxy=grid%smcwtdxy, rechxy=grid%rechxy, & - & deeprechxy=grid%deeprechxy, & - & iopt_crop=config_flags%opt_crop, & - & iopt_irr=config_flags%opt_irr, & - & iopt_irrm=config_flags%opt_irrm, & - & IRNUMSI=grid%IRNUMSI, IRNUMMI=grid%IRNUMMI, IRNUMFI=grid%IRNUMFI, & - & IRWATSI=grid%IRWATSI, IRWATMI=grid%IRWATMI, IRWATFI=grid%IRWATFI, & - & IRELOSS=grid%IRELOSS, & - & IRSIVOL=grid%IRSIVOL, IRMIVOL=grid%IRMIVOL, IRFIVOL=grid%IRFIVOL, & ! Optional Noah-MP - & IRRSPLH=grid%IRRSPLH, & ! Optional Noah-MP - & gecros_state=grid%gecros_state, & ! Optional gecros crop - & lakedepth2d=grid%lakedepth2d, savedtke12d=grid%savedtke12d, snowdp2d=grid%snowdp2d, h2osno2d=grid%h2osno2d, & !lake - & snl2d= grid%snl2d, t_grnd2d=grid%t_grnd2d, t_lake3d=grid%t_lake3d, lake_icefrac3d=grid%lake_icefrac3d, & !lake - & z_lake3d=grid%z_lake3d, dz_lake3d=grid%dz_lake3d, t_soisno3d=grid%t_soisno3d, h2osoi_ice3d=grid%h2osoi_ice3d, & !lake - & h2osoi_liq3d=grid%h2osoi_liq3d, h2osoi_vol3d=grid%h2osoi_vol3d, z3d=grid%z3d, dz3d=grid%dz3d, & !lake - & zi3d=grid%zi3d, watsat3d=grid%watsat3d, csol3d=grid%csol3d, tkmg3d=grid%tkmg3d, & !lake - & tkdry3d=grid%tkdry3d, tksatu3d=grid%tksatu3d, lake2d=grid%lake2d, & !lake - & lakedepth_default=config_flags%lakedepth_default, lake_min_elev=config_flags%lake_min_elev, lake_depth=grid%lake_depth, & !lake - & lake_depth_flag=grid%LAKE_DEPTH_FLAG, use_lakedepth=grid%use_lakedepth, & !lake - & sf_surface_mosaic=config_flags%sf_surface_mosaic, mosaic_cat=config_flags%mosaic_cat, nlcat=1, & ! Noah tiling - & nssl_cccn=config_flags%nssl_cccn, & - & nssl_alphah=config_flags%nssl_alphah, nssl_alphahl=config_flags%nssl_alphahl, & - & nssl_cnoh=config_flags%nssl_cnoh, nssl_cnohl=config_flags%nssl_cnohl, & - & nssl_cnor=config_flags%nssl_cnor, nssl_cnos=config_flags%nssl_cnos, & - & nssl_rho_qh=config_flags%nssl_rho_qh, nssl_rho_qhl=config_flags%nssl_rho_qhl, & - & nssl_rho_qs=config_flags%nssl_rho_qs, & - & nssl_ipelec=config_flags%nssl_ipelec, & - & nssl_isaund=config_flags%nssl_isaund, & - & MAXPATCH=1,ccn_conc=config_flags%ccn_conc, & ! CLM - & pin=grid%pin,ozmixm=grid%ozmixm & - & ) - -#if ( HWRF == 1 ) -!zhang's doing - grid%julyr_rst=grid%julyr_rst - grid%julday_rst=grid%julday_rst - grid%gmt_rst=grid%gmt_rst -!end of zhang's doing -#endif - -! -! computes ct and ct2 for topo_wind=1 or topo_wind=2 -! NOTE: not yet implemented for NMM: =1.0 will have no effect -! - grid%ctopo=1. - grid%ctopo2=1. -! - -!----------------------------------------------------------------------- -!---- Initialization for gravity wave drag (GWD) & mountain blocking (MB) -! -#if (HWRF == 1) - IF(grid%gwd_opt .eq. 2 .AND. grid%id .eq. 1 .AND. allowed_to_read) THEN -#else - IF(grid%gwd_opt .eq. 2 ) THEN -#endif - CALL nl_get_cen_lat(GRID%ID, CEN_LAT) !-- CEN_LAT in deg - CALL nl_get_cen_lon(GRID%ID, CEN_LON) !-- CEN_LON in deg - DTPHS=grid%dt*grid%nphs - CALL GWD_init(DTPHS,GRID%DX,GRID%DY,CEN_LAT,CEN_LON,RESTRT & - & ,grid%glat,grid%glon,grid%crot,grid%srot,grid%hangl & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE ) - ENDIF - IF(.NOT.RESTRT)THEN - DO J=MYJS,MYJE - DO I=MYIS,MYIE - grid%ugwdsfc(I,J)=0. - grid%vgwdsfc(I,J)=0. - ENDDO - ENDDO - ENDIF - -!----------------------------------------------------------------------- -! -#if ( HWRF == 1 ) - IF(NSTART.EQ.0 .or. .not.allowed_to_read )THEN -#else - IF(NSTART==0)THEN -#endif - - DO J=JMS,JME - DO I=IMS,IME - grid%z0(I,J)=grid%z0base(I,J) - ENDDO - ENDDO - - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - grid%cldfra(I,J,K)=CLDFRA_TRANS(I,K,J) - ENDDO - ENDDO - ENDDO - - ENDIF - -! -! -!mp replace F*_PHY with values defined in module_initialize_real.F? -#if ( HWRF == 1 ) - IF (.NOT. RESTRT .and. ALLOWED_TO_READ) THEN !zhang - moist = 0.0 - if(size(grid%f_ice)>1) grid%f_ice = grid%f_ice_phy - if(size(grid%f_rimef)>1) grid%f_rimef = grid%f_rimef_phy - if(size(grid%f_rain)>1) grid%f_rain = grid%f_rain_phy - ENDIF !zhang -#endif - - IF (.NOT. RESTRT .and. ALLOWED_TO_READ) THEN -! Added by Greg Thompson, NCAR-RAL, for initializing water vapor -! mixing ratio (from NMM's specific humidity var) into moist array. - -!!mp - CALL wrf_message('Initializng moist(:,:,:, Qv) from q') - DO K=KPS,KPE - DO J=JFS,JFE - DO I=IFS,IFE - moist(I,J,K,P_QV) = grid%q(I,J,K) / (1.-grid%q(I,J,K)) - enddo - enddo - enddo - -! Also sum cloud water, ice, rain, snow, graupel into Ferrier cwm -! array (if any hydrometeors found and non-zero from initialization -! package). Then, determine fractions ice and rain from species. - - IF (.not. (MAXVAL(grid%cwm(ips:ipe,jps:jpe,:)).gt.0. .and. MAXVAL(grid%cwm(ips:ipe,jps:jpe,:)).lt.1.) ) then - do i_m = 2, num_moist - if (i_m.ne.p_qv) & - & CALL wrf_message(' summing moist(:,:,:,i_m) into cwm array') - DO K=KPS,KPE - DO J=JFS,JFE - DO I=IFS,IFE - IF ( (moist(I,J,K,i_m).gt.EPSQ) .and. (i_m.ne.p_qv) ) THEN - grid%cwm(I,J,K) = grid%cwm(I,J,K) + moist(I,J,K,i_m) - ENDIF - enddo - enddo - enddo - enddo - - IF (size(grid%f_ice)>1 .and. size(grid%f_rain)>1) then - IF( .not. ( (maxval(grid%f_ice(ips:ipe,:,jps:jpe)) & - +maxval(grid%f_rain(ips:ipe,:,jps:jpe))) .gt. EPSQ) ) THEN - ETAMP_Regional=.FALSE. !-- Regional NAM or HRW (Ferrier) microphysics - if (model_config_rec%mp_physics(grid%id).EQ.FER_MP_HIRES .OR. & - & model_config_rec%mp_physics(grid%id).EQ.ETAMPNEW ) & - & ETAMP_Regional=.TRUE. - CALL wrf_message(' computing grid%f_ice') - do i_m = 2, num_moist - ICE1_indx=.FALSE. - IF (i_m==P_qi .or. i_m==P_qg ) ICE1_indx=.TRUE. - ICE2_indx=ICE1_indx - IF (i_m==P_qs) ICE2_indx=.TRUE. - IF (ETAMP_Regional .AND. ICE1_indx) THEN - DO J=JFS,JFE - DO K=KPS,KPE - DO I=IFS,IFE - moist(I,J,K,p_qs)=moist(I,J,K,p_qs)+moist(I,J,K,i_m) - moist(I,J,K,i_m) =0. - enddo - enddo - enddo - if(size(grid%f_ice)>1) then - DO J=JFS,JFE - DO K=KPS,KPE - DO I=IFS,IFE - grid%f_ice(I,K,J) = grid%f_ice(I,K,J) + moist(I,J,K,i_m) - enddo - enddo - enddo - endif - ENDIF - enddo - CALL wrf_message(' computing f_rain') -! - if(size(grid%f_ice)>1 .and. size(grid%f_rain)>1) then - DO J=JFS,JFE - DO K=KPS,KPE - DO I=IFS,IFE - IF(grid%f_ice(i,k,j)<=EPSQ)THEN - grid%f_ice(I,K,J)=0. - ELSE - grid%f_ice(I,K,J) = grid%f_ice(I,K,J)/grid%cwm(I,J,K) - ENDIF - IF ( (moist(I,J,K,p_qr)+moist(I,J,K,p_qc)).gt.EPSQ) THEN - IF(moist(i,j,k,p_qr)<=EPSQ)THEN - grid%f_rain(I,K,J)=0. - ELSE - grid%f_rain(I,K,J) = moist(i,j,k,p_qr) & - & / (moist(i,j,k,p_qr)+moist(i,j,k,p_qc)) - ENDIF - ENDIF - enddo - enddo - enddo - endif - ENDIF - ENDIF - ENDIF -! End addition by Greg Thompson - - if(size(grid%f_ice)>1) then - IF (maxval(grid%f_ice(ips:ipe,:,jps:jpe)) .gt. 0.) THEN - do J=JMS,JME - do K=KMS,KME - do I=IMS,IME - grid%f_ice_phy(I,K,J)=grid%f_ice(I,K,J) - enddo - enddo - enddo - ENDIF - endif - - if(size(grid%f_rain)>1) then - IF (maxval(grid%f_rain(ips:ipe,:,jps:jpe)) .gt. 0.) THEN - do J=JMS,JME - do K=KMS,KME - do I=IMS,IME - grid%f_rain_phy(I,K,J)=grid%f_rain(I,K,J) - enddo - enddo - enddo - ENDIF - endif - - if(size(grid%f_rimef)>1) then - IF (maxval(grid%f_rimef(ips:ipe,:,jps:jpe)) .gt. 0.) THEN - do J=JMS,JME - do K=KMS,KME - do I=IMS,IME - grid%f_rimef_phy(I,K,J)=grid%f_rimef(I,K,J) - enddo - enddo - enddo - ENDIF - endif - ENDIF -! - IF (.NOT. RESTRT) THEN - !-- Replace albedos if original albedos are nonzero - IF(MAXVAL(ALBEDO_DUM(ips:ipe,jps:jpe))>0.)THEN - DO J=JMS,JME - DO I=IMS,IME - grid%albedo(I,J)=ALBEDO_DUM(I,J) - ENDDO - ENDDO - ENDIF - ENDIF - -#if ( HWRF == 1 ) - if(.NOT. RESTRT .OR. .NOT.allowed_to_read) then !zhang's doing -!zhang's doing -#else - IF(.NOT.RESTRT)THEN -#endif - DO J=jps,min(jpe,jde-1) - DO I=ips,min(ipe,ide-1) - grid%aprec(I,J)=RAINNC(I,J)*1.E-3 - grid%cuprec(I,J)=grid%raincv(I,J)*1.E-3 - ENDDO - ENDDO - ENDIF - - -! -! translate scalar_trans(i,k,j,n) back to scalar(i,j,k,n) - DO N=1,NUM_SCALAR -!$omp parallel do & -!$omp& private(i,j,k) - DO K=KMS,KME - DO J=JMS,JME - DO I=IMS,IME - SCALAR(I,J,K,N)=SCALAR_TRANS(I,K,J,N) - ENDDO - ENDDO - ENDDO - ENDDO -! - DEALLOCATE(SFULL) - DEALLOCATE(SMID) - DEALLOCATE(DZS) - DEALLOCATE(EMISS) - DEALLOCATE(EMTEMP) - DEALLOCATE(GLW) - DEALLOCATE(HFX) - DEALLOCATE(LOWLYR) -! DEALLOCATE(grid%mavail) - DEALLOCATE(NCA) - DEALLOCATE(QFX) - DEALLOCATE(RAINBL) - DEALLOCATE(RAINC) - DEALLOCATE(RAINNC) - DEALLOCATE(RAINNCV) - DEALLOCATE(RQCBLTEN) - DEALLOCATE(RQIBLTEN) - DEALLOCATE(RQVBLTEN) - DEALLOCATE(RTHBLTEN) - DEALLOCATE(RUBLTEN) - DEALLOCATE(RVBLTEN) - DEALLOCATE(RQCCUTEN) - DEALLOCATE(RQICUTEN) - DEALLOCATE(RQRCUTEN) - DEALLOCATE(RQSCUTEN) - DEALLOCATE(RQVCUTEN) - DEALLOCATE(RTHCUTEN) - DEALLOCATE(RUSHTEN) - DEALLOCATE(RVSHTEN) - DEALLOCATE(RQCSHTEN) - DEALLOCATE(RQISHTEN) - DEALLOCATE(RQRSHTEN) - DEALLOCATE(RQSSHTEN) - DEALLOCATE(RQGSHTEN) - DEALLOCATE(RQVSHTEN) - DEALLOCATE(RTHSHTEN) - DEALLOCATE(RTHRATEN) - DEALLOCATE(RTHRATENLW) - DEALLOCATE(RTHRATENSW) - DEALLOCATE(ZINT) - DEALLOCATE(CONVFAC) - DEALLOCATE(RRI) - DEALLOCATE(SNOWC) - DEALLOCATE(THC) - DEALLOCATE(TMN) - DEALLOCATE(TSFC) - DEALLOCATE(ZS) - DEALLOCATE(PINT_TRANS) - DEALLOCATE(T_TRANS) - DEALLOCATE(CLDFRA_TRANS) - DEALLOCATE(CLDFRA_OLD) - DEALLOCATE(Z_AT_Q) - DEALLOCATE(SCALAR_TRANS) -#if 0 - DEALLOCATE(w0avg) -#endif -!----------------------------------------------------------------------- -!---------------------------------------------------------------------- - DO J=jfs,jfe - DO I=ifs,ife - grid%dwdtmn(I,J)=grid%dwdtmn(I,J)*grid%hbm3(I,J) - grid%dwdtmx(I,J)=grid%dwdtmx(I,J)*grid%hbm3(I,J) - ENDDO - ENDDO -!---------------------------------------------------------------------- - -#ifdef DM_PARALLEL -# include "HALO_NMM_INIT_1.inc" -# include "HALO_NMM_INIT_2.inc" -# include "HALO_NMM_INIT_3.inc" -# include "HALO_NMM_INIT_4.inc" -# include "HALO_NMM_INIT_5.inc" -# include "HALO_NMM_INIT_6.inc" -# include "HALO_NMM_INIT_7.inc" -# include "HALO_NMM_INIT_8.inc" -# include "HALO_NMM_INIT_9.inc" -# include "HALO_NMM_INIT_10.inc" -# include "HALO_NMM_INIT_11.inc" -# include "HALO_NMM_INIT_12.inc" -# include "HALO_NMM_INIT_13.inc" -# include "HALO_NMM_INIT_14.inc" -# include "HALO_NMM_INIT_15.inc" -# include "HALO_NMM_INIT_15B.inc" -# include "HALO_NMM_INIT_16.inc" -# include "HALO_NMM_INIT_17.inc" -# include "HALO_NMM_INIT_18.inc" -# include "HALO_NMM_INIT_19.inc" -# include "HALO_NMM_INIT_20.inc" -# include "HALO_NMM_INIT_21.inc" -# include "HALO_NMM_INIT_22.inc" -# include "HALO_NMM_INIT_23.inc" -# include "HALO_NMM_INIT_24.inc" -# include "HALO_NMM_INIT_25.inc" -# include "HALO_NMM_INIT_26.inc" -# include "HALO_NMM_INIT_27.inc" -# include "HALO_NMM_INIT_28.inc" -# include "HALO_NMM_INIT_29.inc" -# include "HALO_NMM_INIT_30.inc" -# include "HALO_NMM_INIT_31.inc" -# include "HALO_NMM_INIT_32.inc" -# include "HALO_NMM_INIT_33.inc" -# include "HALO_NMM_INIT_34.inc" -# include "HALO_NMM_INIT_35.inc" -# include "HALO_NMM_INIT_36.inc" -# include "HALO_NMM_INIT_37.inc" -# include "HALO_NMM_INIT_38.inc" -# include "HALO_NMM_INIT_39.inc" -#endif -!#define COPY_OUT -!#include "scalar_derefs.inc" - - write(message,*) "Timing for start_domain on d",grid%id - call end_timing(message) - - RETURN - - -END SUBROUTINE START_DOMAIN_NMM - diff --git a/external/RSL_LITE/gen_comms.c b/external/RSL_LITE/gen_comms.c index fb6bfc5052..2a6b2ef5bd 100644 --- a/external/RSL_LITE/gen_comms.c +++ b/external/RSL_LITE/gen_comms.c @@ -345,14 +345,6 @@ gen_halos ( char * dirname , char * incname , node_t * halos, int split ) } } -#if (NMM_CORE==1) - if ( !strcmp(commname,"HALO_INTERP_DOWN") - || !strcmp(commname,"HALO_FORCE_DOWN") - || !strcmp(commname,"HALO_INTERP_UP") - || !strcmp(commname,"HALO_INTERP_SMOOTH") ) - always_interp_mp=0; -#endif - ihalo = 0 ; for ( p = halos ; p != NULL ; p = p->next ) { @@ -2723,12 +2715,7 @@ gen_nest_pack ( char * dirname ) d3 = d3_mp = 0 ; node = Domain.fields ; -#if (NMM_CORE==1) - count_fields ( node, &d2, &d3, fourd_names, down_path[ipath], 0, 1); - count_fields ( node, &d2_mp, &d3_mp, fourd_names_mp, down_path[ipath], 1, 0); -#else count_fields ( node , &d2 , &d3 , fourd_names, down_path[ipath] ,0,0) ; -#endif parent= "" ; if ( !strcmp(fn,"nest_feedbackup_pack.inc") ) parent="parent_" ; @@ -2745,12 +2732,6 @@ gen_nest_pack ( char * dirname ) } fprintf(fp,"msize = (%d + %s )* nlev + %d\n", d3, fourd_names, d2 ) ; -#if (NMM_CORE==1) - fprintf(fp,"IF(interp_mp .eqv. .true.) then\n" - " msize=msize + (%d + %s )*nlev+%d\n" - "ENDIF\n", - d3_mp,fourd_names_mp,d2_mp); -#endif /* fprintf(fp,"CALL %s( local_communicator, msize*RWORDSIZE &\n",info_name ) ; */ fprintf(fp,"CALL %s( msize*RWORDSIZE &\n",info_name ) ; @@ -2843,12 +2824,6 @@ gen_nest_unpack ( char * dirname ) fprintf(fp,"CALL %s(pig,pjg,retval)\n", info_name ) ; fprintf(fp,"DO while ( retval .eq. 1 )\n") ; -#if (NMM_CORE == 1) - if(down_path[ipath]==INTERP_UP) { - fprintf(fp,"feedback_flag=cd_feedback_mask( pig, ips_save, ipe_save , pjg, jps_save, jpe_save, .FALSE., .FALSE. )\n"); - fprintf(fp,"feedback_flag_v=cd_feedback_mask_v( pig, ips_save, ipe_save , pjg, jps_save, jpe_save, .FALSE., .FALSE. )\n"); - } -#endif gen_nest_packunpack ( fp , Domain.fields, UNPACKIT, down_path[ipath] ) ; fprintf(fp,"CALL %s(pig,pjg,retval)\n", info_name ) ; fprintf(fp,"ENDDO\n") ; @@ -2985,25 +2960,9 @@ fprintf(fp,"CALL rsl_lite_from_child_msg(((%s)-(%s)+1)*RWORDSIZE,xv) ;\n",ddim[z } else { fprintf(fp,"CALL rsl_lite_from_child_msg(RWORDSIZE,xv)\n" ) ; } -#if (NMM_CORE == 1) - if(p->stag_x || p->stag_y) { -#endif fprintf(fp,"IF ( cd_feedback_mask%s( pig, ips_save, ipe_save , pjg, jps_save, jpe_save, %s, %s ) ) THEN\n", sjl , p->stag_x?".TRUE.":".FALSE." ,p->stag_y?".TRUE.":".FALSE." ) ; -#if ( NMM_CORE == 1) - } else { - fprintf(fp,"IF(feedback_flag%s) THEN\n",sjl); - } -#endif - -#if ( NMM_CORE == 1) - if ( node->full_feedback ) { - feed="NEST_FULL_INFLUENCE"; - } else { - feed="NEST_INFLUENCE"; - } -#endif if ( zdex >= 0 ) { fprintf(fp,"DO k = %s,%s\n%s(%s%s,xv(k))\nENDDO\n", ddim[zdex][0], ddim[zdex][1], feed, grid, vname ) ; } else { diff --git a/external/RSL_LITE/module_dm.F b/external/RSL_LITE/module_dm.F index 6ec8ef4bbf..5c9bb62a67 100644 --- a/external/RSL_LITE/module_dm.F +++ b/external/RSL_LITE/module_dm.F @@ -1,10 +1,3 @@ -#if NMM_CORE==1 -#define copy_fcnm UpNear -#define copy_fcn UpCopy -#define interp_fcn DownCopy -#define copy_fcni UpINear -#endif - #define NEST_FULL_INFLUENCE(A,B) A=B MODULE module_dm @@ -23,11 +16,7 @@ MODULE module_dm INTEGER, PARAMETER :: MPI_UNDEFINED = -1 #endif -#if ( NMM_CORE == 1 ) || ( WRF_CHEM == 1 ) - INTEGER, PARAMETER :: max_halo_width = 6 -#else INTEGER, PARAMETER :: max_halo_width = 6 ! 5 -#endif INTEGER :: ips_save, ipe_save, jps_save, jpe_save, itrace INTEGER :: lats_to_mic, minx, miny @@ -150,9 +139,7 @@ SUBROUTINE compute_mesh( ntasks , ntasks_x, ntasks_y ) INTEGER lats_to_mic CALL nl_get_nproc_x ( 1, ntasks_x ) CALL nl_get_nproc_y ( 1, ntasks_y ) -#ifndef NMM_CORE CALL nl_get_lats_to_mic ( 1, lats_to_mic ) -#endif ! check if user has specified in the namelist IF ( ntasks_x .GT. 0 .OR. ntasks_y .GT. 0 ) THEN ! if only ntasks_x is specified then make it 1-d decomp in i @@ -167,7 +154,6 @@ SUBROUTINE compute_mesh( ntasks , ntasks_x, ntasks_y ) WRITE( wrf_err_message , * )'WRF_DM_INITIALIZE (RSL_LITE): nproc_x * nproc_y in namelist ne ',ntasks CALL wrf_error_fatal ( wrf_err_message ) END IF -#ifndef NMM_CORE ELSE IF ( lats_to_mic .GT. 0 ) THEN ntasks_x = ntasks / 2 ntasks_y = 2 @@ -177,7 +163,6 @@ SUBROUTINE compute_mesh( ntasks , ntasks_x, ntasks_y ) ') in namelist ne ',ntasks CALL wrf_error_fatal ( wrf_err_message ) END IF -#endif ELSE ! When neither is specified, work out mesh with MPASPECT ! Pass nproc_ln and nproc_nt so that number of procs in @@ -317,9 +302,7 @@ SUBROUTINE patch_domain_rsl_lite( id , parent, parent_id, & INTEGER lats_to_mic lats_to_mic=0 -#ifndef NMM_CORE CALL nl_get_lats_to_mic( 1, lats_to_mic ) -#endif IF ( lats_to_mic .GT. 0 ) THEN minx = -99 ! code to task_for_point to do split decomposition over MIC and host miny = lats_to_mic ! number of latitudes that should be assigned to MIC @@ -962,8 +945,6 @@ SUBROUTINE compute_memory_dims_rsl_lite ( & INTEGER Px, Py, P, i, j, k, ierr -#if ( ! NMM_CORE == 1 ) - ! xy decomposition ips = -1 @@ -1145,46 +1126,6 @@ SUBROUTINE compute_memory_dims_rsl_lite ( & END IF -#else - -! In case of NMM CORE, the domain only ever runs from ids..ide-1 and jds..jde-1 so -! adjust decomposition to reflect. 20051020 JM - ips = -1 - j = jds - ierr = 0 - DO i = ids, ide-1 -!jm CALL task_for_point ( i, j, ids, ide-1, jds, jde-1, ntasks_x, ntasks_y, Px, Py, & - CALL task_for_point ( i, j, ids, ide-1, jds, jde-1, nest_pes_x(id), nest_pes_y(id), Px, Py, & - minx, miny, ierr ) - IF ( Px .EQ. mytask_x ) THEN - ipe = i -! IF ( Px .EQ. ntasks_x-1 ) ipe = ipe + 1 - IF ( Px .EQ. nest_pes_x(id)-1 ) ipe = ipe + 1 - IF ( ips .EQ. -1 ) ips = i - END IF - END DO - IF ( ierr .NE. 0 ) THEN - CALL tfp_message("",__LINE__) - END IF - jps = -1 - i = ids ; - ierr = 0 - DO j = jds, jde-1 -!jm CALL task_for_point ( i, j, ids, ide-1, jds, jde-1, ntasks_x, ntasks_y, Px, Py, & - CALL task_for_point ( i, j, ids, ide-1, jds, jde-1, nest_pes_x(id), nest_pes_y(id), Px, Py, & - minx, miny, ierr ) - IF ( Py .EQ. mytask_y ) THEN - jpe = j -! IF ( Py .EQ. ntasks_y-1 ) jpe = jpe + 1 - IF ( Py .EQ. nest_pes_y(id)-1 ) jpe = jpe + 1 - IF ( jps .EQ. -1 ) jps = j - END IF - END DO - IF ( ierr .NE. 0 ) THEN - CALL tfp_message("",__LINE__) - END IF -#endif - ! extend the patch dimensions out shw along edges of domain IF ( ips < ipe .and. jps < jpe ) THEN !wig; 11-Mar-2008 IF ( mytask_x .EQ. 0 ) THEN @@ -1354,8 +1295,6 @@ SUBROUTINE wrf_dm_min_reals ( inval, retval, n ) END SUBROUTINE wrf_dm_min_reals FUNCTION wrf_dm_sum_real8 ( inval ) - ! Forced eight byte real sum needed for calculating an accurate - ! mean motion in HWRF moduel_tracker. IMPLICIT NONE #ifndef STUBMPI REAL*8 inval, retval, wrf_dm_sum_real8 @@ -1423,60 +1362,6 @@ SUBROUTINE wrf_dm_sum_integers (inval, retval) #endif END SUBROUTINE wrf_dm_sum_integers -#if ( HWRF == 1 ) - SUBROUTINE wrf_dm_minloc_real ( val, lat, lon, z, idex, jdex ) -#ifndef STUBMPI - IMPLICIT NONE - REAL val, lat, lon, z - INTEGER idex, jdex, ierr, mrank, comm - REAL inreduce(2), outreduce(2), bcast(5) - - inreduce=(/ val, real(mytask) /) - CALL wrf_get_dm_communicator(comm) - call MPI_Allreduce(inreduce,outreduce,1,MPI_2REAL,MPI_MINLOC,& - comm,ierr) - val=outreduce(1) - mrank=outreduce(2) - bcast=(/ lat,lon,z,real(idex),real(jdex) /) - call MPI_Bcast(bcast,5,MPI_REAL,mrank,comm,ierr) - lat=bcast(1) - lon=bcast(2) - z=bcast(3) - idex=bcast(4) - jdex=bcast(5) -#else - IMPLICIT NONE - REAL val,lat,lon,z - INTEGER idex, jdex -#endif - END SUBROUTINE wrf_dm_minloc_real - SUBROUTINE wrf_dm_maxloc_real ( val, lat, lon, z, idex, jdex ) -#ifndef STUBMPI - IMPLICIT NONE - REAL val, lat, lon, z - INTEGER idex, jdex, ierr, mrank, comm - REAL inreduce(2), outreduce(2), bcast(5) - - inreduce=(/ val, real(mytask) /) - CALL wrf_get_dm_communicator(comm) - call MPI_Allreduce(inreduce,outreduce,1,MPI_2REAL,MPI_MAXLOC,& - comm,ierr) - val=outreduce(1) - mrank=outreduce(2) - bcast=(/ lat,lon,z,real(idex),real(jdex) /) - call MPI_Bcast(bcast,5,MPI_REAL,mrank,comm,ierr) - lat=bcast(1) - lon=bcast(2) - z=bcast(3) - idex=bcast(4) - jdex=bcast(5) -#else - IMPLICIT NONE - REAL val,lat,lon,z - INTEGER idex, jdex -#endif - END SUBROUTINE wrf_dm_maxloc_real -#endif INTEGER FUNCTION wrf_dm_bxor_integer ( inval ) IMPLICIT NONE @@ -1676,26 +1561,6 @@ SUBROUTINE wrf_dm_minval_integer ( val, idex, jdex ) END SUBROUTINE wrf_dm_minval_integer SUBROUTINE hwrf_coupler_init -#if ( HWRF == 1 ) -# ifndef STUBMPI - IMPLICIT NONE - LOGICAL mpi_inited - INTEGER mpi_comm_here,ierr - CALL MPI_INITIALIZED( mpi_inited, ierr ) - IF ( .NOT. mpi_inited ) THEN - IF ( coupler_on ) THEN - CALL cpl_init( mpi_comm_here ) - ELSE - CALL mpi_init ( ierr ) - mpi_comm_here = MPI_COMM_WORLD - END IF - CALL atm_cmp_start( mpi_comm_here ) - CALL wrf_set_dm_communicator( mpi_comm_here ) - CALL wrf_termio_dup( mpi_comm_here ) - END IF - RETURN -# endif -#endif END SUBROUTINE hwrf_coupler_init SUBROUTINE split_communicator @@ -1793,10 +1658,6 @@ SUBROUTINE split_communicator END IF #endif # endif -#if ( HWRF == 1 ) -!!!!! jm 20150807 note that for HWRF, this will not be called here because of the call to hwrf_coupler_init (defined above) in init_modules -!!!! CALL atm_cmp_start( mpi_comm_here ) ! atmospheric side of HWRF coupler will split MPI_COMM_WORLD and return communicator as argument -#endif CALL wrf_set_dm_communicator( mpi_comm_here ) CALL wrf_termio_dup( mpi_comm_here ) #if (WRFPLUS == 1) @@ -1826,23 +1687,6 @@ SUBROUTINE split_communicator CALL mpi_bcast( nio_groups , 1 , MPI_INTEGER , 0 , mpi_comm_here, ierr ) CALL mpi_bcast( max_dom, 1 , MPI_INTEGER , 0 , mpi_comm_here, ierr ) CALL mpi_bcast( parent_id, max_domains , MPI_INTEGER , 0 , mpi_comm_here, ierr ) -#if ( HWRF == 1 ) -! check to make sure that if nio_tasks_per_group is non-zero for any domain it has to be non-zero for all of them - i = MAXVAL(nio_tasks_per_group(1:max_dom)) - IF ( i .GT. 0 .AND. nio_groups .GT. 0 ) THEN - DO id = 1, max_dom - IF ( nio_tasks_per_group(id) .LE. 0 ) THEN - CALL wrf_error_fatal( & -'If nio_tasks_per_group in namelist.input is non-zero for any domain, every active domain must have a non-zero value in nio_tasks_per_group') - END IF - END DO - END IF - - num_io_tasks = 0 - DO id = 1, max_dom - num_io_tasks = num_io_tasks + nio_tasks_per_group(id)*nio_groups - END DO -#else CALL quilting_disabled( quilting_is_turned_off ) IF ( quilting_is_turned_off ) THEN num_io_tasks = 0 @@ -1851,7 +1695,6 @@ SUBROUTINE split_communicator ELSE num_io_tasks = nio_tasks_per_group(1)*nio_groups END IF -#endif CALL nl_set_max_dom(1,max_dom) ! quilting wants to see this too IF ( mytask_local .EQ. 0 ) THEN @@ -1869,11 +1712,7 @@ SUBROUTINE split_communicator nest_pes_x = 0 ! dimensions of communicator in X and y nest_pes_y = 0 IF ( nproc_x .EQ. -1 .OR. nproc_y .EQ. -1 ) THEN -#if ( HWRF == 1 ) - CALL compute_mesh( ntasks_local, n_x, n_y ) -#else CALL compute_mesh( ntasks_local-num_io_tasks, n_x, n_y ) -#endif ELSE n_x = nproc_x n_y = nproc_y @@ -1976,9 +1815,7 @@ SUBROUTINE split_communicator ! assign domains to communicators local_communicator = MPI_UNDEFINED -#if ( HWRF != 1 ) CALL wrf_set_dm_quilt_comm( mpi_comm_here ) ! used by module_io_quilt_old.F -#endif DO i = 1, max_dom local_communicator_store(i) = comms_i_am_in(i) domain_active_this_task(i) = ( local_communicator_store(i) .NE. MPI_UNDEFINED ) @@ -2941,13 +2778,7 @@ LOGICAL FUNCTION rsl_comm_iter ( id , is_intermediate, & COMMON /rcii/ iter, plus_send_start, plus_recv_start, & minus_send_start, minus_recv_start -#if (NMM_CORE == 1 ) -! In case of NMM CORE, the domain only ever runs from ids..ide-1 and jds..jde-1 so -! adjust decomposition to reflect. 20081206 JM - de = de_in - 1 -#else de = de_in -#endif ntx = nest_pes_x(id) nty = nest_pes_y(id) IF ( xy .EQ. 1 ) THEN ! X/I axis @@ -5398,972 +5229,6 @@ SUBROUTINE feedback_domain_em_part2 ( grid, intermediate_grid, ngrid , config_fl END SUBROUTINE feedback_domain_em_part2 #endif -#if ( NMM_CORE == 1 && NMM_NEST == 1 ) -!============================================================================== -! NMM nesting infrastructure extended from EM core. This is gopal's doing. -!============================================================================== - - SUBROUTINE before_interp_halos_nmm(grid,config_flags & -! -#include "dummy_new_args.inc" -! - ) - ! This is called before interp_domain_nmm_part1 to do - ! pre-interpolation halo communication on the nest. - ! Author: Sam Trahan, February 2011 - USE module_state_description - USE module_domain, ONLY : domain, get_ijk_from_grid - USE module_configure, ONLY : grid_config_rec_type - USE module_dm, ONLY : ntasks, ntasks_x, ntasks_y, itrace, local_communicator, mytask, & - ipe_save, jpe_save, ips_save, jps_save, get_dm_max_halo_width, & - nest_pes_x, nest_pes_y !, & - !push_communicators_for_domain, pop_communicators_for_domain - USE module_comm_dm, ONLY : HALO_NMM_WEIGHTS_sub - - IMPLICIT NONE -! - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE (grid_config_rec_type) :: config_flags -#include "dummy_new_decl.inc" - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE - -!#ifdef DEREF_KLUDGE -!! see http://www.mmm.ucar.edu/wrf/WG2/topics/deref_kludge.htm -! INTEGER :: sm31 , em31 , sm32 , em32 , sm33 , em33 -! INTEGER :: sm31x, em31x, sm32x, em32x, sm33x, em33x -! INTEGER :: sm31y, em31y, sm32y, em32y, sm33y, em33y -!#endif -#include "deref_kludge.h" - -!#define COPY_IN - - ! FIXME: Don't initialize these to -1; it is a waste. - ! Initialization is only for debugging purposes. - IDS=-1; IDE=-1; JDS=-1; JDE=-1; KDS=-1; KDE=-1 - IMS=-1; IME=-1; JMS=-1; JME=-1; KMS=-1; KME=-1 - IPS=-1; IPE=-1; JPS=-1; JPE=-1; KPS=-1; KPE=-1 - CALL GET_IJK_FROM_GRID(GRID & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,IPS,IPE,JPS,JPE,KPS,KPE ) - - CALL push_communicators_for_domain(grid%id) -#include "HALO_NMM_WEIGHTS.inc" - CALL pop_communicators_for_domain - - END SUBROUTINE before_interp_halos_nmm - - SUBROUTINE interp_domain_nmm_part1 ( grid, intermediate_grid, ngrid, config_flags & -! -#include "dummy_new_args.inc" -! - ) - USE module_state_description - USE module_domain, ONLY : domain, get_ijk_from_grid - USE module_configure, ONLY : grid_config_rec_type - USE module_dm, ONLY : ntasks, ntasks_x, ntasks_y, itrace, local_communicator, mytask, & - ipe_save, jpe_save, ips_save, jps_save, get_dm_max_halo_width, & - nest_pes_x, nest_pes_y - USE module_dm, ONLY : ntasks, ntasks_x, ntasks_y, local_communicator, mytask, & - nest_pes_x, nest_pes_y, & - intercomm_active, nest_task_offsets, & - mpi_comm_to_mom, mpi_comm_to_kid, which_kid !, & - !push_communicators_for_domain,pop_communicators_for_domain - - USE module_timing - IMPLICIT NONE -! - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: intermediate_grid - TYPE(domain), POINTER :: ngrid -#include "dummy_new_decl.inc" - INTEGER nlev, msize - INTEGER i,j,pig,pjg,cm,cn,nig,njg,retval,k - INTEGER iparstrt,jparstrt,sw - TYPE (grid_config_rec_type) :: config_flags - REAL xv(2000) - INTEGER :: cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe - INTEGER :: iids, iide, ijds, ijde, ikds, ikde, & - iims, iime, ijms, ijme, ikms, ikme, & - iips, iipe, ijps, ijpe, ikps, ikpe - INTEGER :: nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe - - INTEGER idim1,idim2,idim3,idim4,idim5,idim6,idim7 - LOGICAL feedback_flag, feedback_flag_v - INTEGER icoord, jcoord, idim_cd, jdim_cd, pgr - INTEGER local_comm, ioffset, myproc, nproc, ierr - INTEGER thisdomain_max_halo_width - - LOGICAL interp_mp - interp_mp=grid%interp_mp .or. ngrid%interp_mp - - CALL wrf_get_dm_communicator ( local_comm ) - CALL wrf_get_myproc( myproc ) - CALL wrf_get_nproc( nproc ) - - CALL get_ijk_from_grid ( grid , & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe ) - CALL get_ijk_from_grid ( intermediate_grid , & - iids, iide, ijds, ijde, ikds, ikde, & - iims, iime, ijms, ijme, ikms, ikme, & - iips, iipe, ijps, ijpe, ikps, ikpe ) - CALL get_ijk_from_grid ( ngrid , & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe ) - - CALL nl_get_parent_grid_ratio ( ngrid%id, pgr ) - CALL nl_get_i_parent_start ( intermediate_grid%id, iparstrt ) - CALL nl_get_j_parent_start ( intermediate_grid%id, jparstrt ) - CALL nl_get_shw ( intermediate_grid%id, sw ) - icoord = iparstrt - sw - jcoord = jparstrt - sw - idim_cd = iide - iids + 1 - jdim_cd = ijde - ijds + 1 - - nlev = ckde - ckds + 1 - - ! get max_halo_width for parent. It may be smaller if it is moad - CALL get_dm_max_halo_width ( ngrid%id , thisdomain_max_halo_width ) - - IF ( grid%active_this_task ) THEN -#include "nest_interpdown_pack.inc" - END IF - - ! determine which communicator and offset to use - IF ( intercomm_active( grid%id ) ) THEN ! I am parent - local_comm = mpi_comm_to_kid( which_kid(ngrid%id), grid%id ) - ioffset = nest_task_offsets(ngrid%id) - ELSE IF ( intercomm_active( ngrid%id ) ) THEN ! I am nest - local_comm = mpi_comm_to_mom( ngrid%id ) - ioffset = nest_task_offsets(ngrid%id) - END IF - - IF ( grid%active_this_task .OR. ngrid%active_this_task ) THEN -#ifndef STUBMPI - CALL mpi_comm_rank(local_comm,myproc,ierr) - CALL mpi_comm_size(local_comm,nproc,ierr) -#endif -!CALL tracebackqq() - CALL rsl_lite_bcast_msgs( myproc, nest_pes_x(grid%id)*nest_pes_y(grid%id), & - nest_pes_x(ngrid%id)*nest_pes_y(ngrid%id), & - ioffset, local_comm ) - END IF - - RETURN - END SUBROUTINE interp_domain_nmm_part1 - -!------------------------------------------------------------------ - - SUBROUTINE interp_domain_nmm_part2 ( grid, ngrid, config_flags & -! -#include "dummy_new_args.inc" -! - ) - USE module_state_description - USE module_domain, ONLY : domain, get_ijk_from_grid - USE module_configure, ONLY : grid_config_rec_type - USE module_dm, ONLY : ntasks, ntasks_x, ntasks_y, itrace, local_communicator, mytask, & - ipe_save, jpe_save, ips_save, jps_save, get_dm_max_halo_width , & - nest_task_offsets - !push_communicators_for_domain,pop_communicators_for_domain, & - USE module_comm_nesting_dm, ONLY : halo_interp_down_sub - IMPLICIT NONE -! - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: ngrid -#include "dummy_new_decl.inc" - INTEGER nlev, msize - INTEGER i,j,pig,pjg,cm,cn,nig,njg,retval,k - TYPE (grid_config_rec_type) :: config_flags - REAL xv(2000) - INTEGER :: cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe - INTEGER :: nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe - INTEGER :: ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe - - INTEGER idim1,idim2,idim3,idim4,idim5,idim6,idim7 - LOGICAL feedback_flag, feedback_flag_v - INTEGER myproc - INTEGER ierr - - integer, parameter :: EConst=0, ECopy=1, EExtrap=2 ! MUST match module_interp_nmm - LOGICAL interp_mp -#include "deref_kludge.h" - -! interp_mp is set unconditionally in alloc_and_configure_domain (module_domain.F), -! regardless of active_this_task - interp_mp=grid%interp_mp .or. ngrid%interp_mp - - IF ( ngrid%active_this_task ) THEN - - CALL get_ijk_from_grid ( grid , & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe ) - CALL get_ijk_from_grid ( ngrid , & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe ) - - - nlev = ckde - ckds + 1 - -#include "nest_interpdown_unpack.inc" - - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - CALL push_communicators_for_domain( grid%id ) -#include "HALO_INTERP_DOWN.inc" - - ! Generate interpolation information and interpolate Q, T and - ! possibly PD while we're at it: - -! Grid is set to ngrid%intermediate_grid in the call from med_interp_domain -! (share/mediation_interp_domain.F) so if one is active_this_task, so is the other - call store_interp_info(ngrid,grid) - call ext_c2n_fulldom(ngrid%IIH,ngrid%JJH,ngrid%HBWGT1, & - ngrid%HBWGT2,ngrid%HBWGT3,ngrid%HBWGT4, & - ngrid%deta1,ngrid%deta2,ngrid%eta1, & - ngrid%eta2,ngrid%pt,ngrid%pdtop, & - grid%pint,grid%t,grid%pd,grid%q, & - cims, cime, cjms, cjme, ckms, ckme, & - ngrid%pint,ngrid%t,ngrid%pd,ngrid%q,& - ngrid%iinfo,ngrid%winfo,ngrid%imask_nostag, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe) - -#include "nest_interpdown_interp.inc" - - - CALL pop_communicators_for_domain - - END IF - - RETURN - END SUBROUTINE interp_domain_nmm_part2 - -!------------------------------------------------------------------ - - SUBROUTINE force_domain_nmm_part1 ( grid, intermediate_grid, ngrid, config_flags & -! -#include "dummy_new_args.inc" -! - ) - USE module_state_description - USE module_domain, ONLY : domain, get_ijk_from_grid - USE module_configure, ONLY : grid_config_rec_type - USE module_dm, ONLY : ntasks, ntasks_x, ntasks_y, itrace, local_communicator, mytask, & - ipe_save, jpe_save, ips_save, jps_save, get_dm_max_halo_width, & - nest_pes_x, nest_pes_y, & - intercomm_active, nest_task_offsets, & - mpi_comm_to_mom, mpi_comm_to_kid, which_kid !, & - !push_communicators_for_domain,pop_communicators_for_domain - - USE module_timing - IMPLICIT NONE -! - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: intermediate_grid - TYPE(domain), POINTER :: ngrid -#include "dummy_new_decl.inc" - INTEGER nlev, msize - INTEGER i,j,pig,pjg,cm,cn,nig,njg,retval,k - INTEGER iparstrt,jparstrt,sw - TYPE (grid_config_rec_type) :: config_flags - REAL xv(2000) - INTEGER :: cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe - INTEGER :: iids, iide, ijds, ijde, ikds, ikde, & - iims, iime, ijms, ijme, ikms, ikme, & - iips, iipe, ijps, ijpe, ikps, ikpe - INTEGER :: nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe - - INTEGER idim1,idim2,idim3,idim4,idim5,idim6,idim7 - LOGICAL feedback_flag, feedback_flag_v - INTEGER icoord, jcoord, idim_cd, jdim_cd, pgr - INTEGER local_comm, ioffset, myproc, nproc, ierr - INTEGER thisdomain_max_halo_width - LOGICAL interp_mp - - interp_mp=grid%interp_mp .or. ngrid%interp_mp - - CALL wrf_get_dm_communicator ( local_comm ) - CALL wrf_get_myproc( myproc ) - CALL wrf_get_nproc( nproc ) - - CALL get_ijk_from_grid ( grid , & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe ) - CALL get_ijk_from_grid ( intermediate_grid , & - iids, iide, ijds, ijde, ikds, ikde, & - iims, iime, ijms, ijme, ikms, ikme, & - iips, iipe, ijps, ijpe, ikps, ikpe ) - CALL get_ijk_from_grid ( ngrid , & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe ) - - CALL nl_get_parent_grid_ratio ( ngrid%id, pgr ) - CALL nl_get_i_parent_start ( intermediate_grid%id, iparstrt ) - CALL nl_get_j_parent_start ( intermediate_grid%id, jparstrt ) - CALL nl_get_shw ( intermediate_grid%id, sw ) - icoord = iparstrt - sw - jcoord = jparstrt - sw - idim_cd = iide - iids + 1 - jdim_cd = ijde - ijds + 1 - - nlev = ckde - ckds + 1 - - CALL get_dm_max_halo_width ( ngrid%id , thisdomain_max_halo_width ) - - IF ( grid%active_this_task ) THEN -#include "nest_forcedown_pack.inc" - END IF - - ! determine which communicator and offset to use - IF ( intercomm_active( grid%id ) ) THEN ! I am parent - local_comm = mpi_comm_to_kid( which_kid(ngrid%id), grid%id ) - ioffset = nest_task_offsets(ngrid%id) - ELSE IF ( intercomm_active( ngrid%id ) ) THEN ! I am nest - local_comm = mpi_comm_to_mom( ngrid%id ) - ioffset = nest_task_offsets(ngrid%id) - END IF - - IF ( grid%active_this_task .OR. ngrid%active_this_task ) THEN -#ifndef STUBMPI - CALL mpi_comm_rank(local_comm,myproc,ierr) - CALL mpi_comm_size(local_comm,nproc,ierr) -#endif - CALL rsl_lite_bcast_msgs( myproc, nest_pes_x(grid%id)*nest_pes_y(grid%id), & - nest_pes_x(ngrid%id)*nest_pes_y(ngrid%id), & - ioffset, local_comm ) - END IF - - RETURN - END SUBROUTINE force_domain_nmm_part1 - -!============================================================================================== - - SUBROUTINE force_domain_nmm_part2 ( grid, ngrid, config_flags & -! -#include "dummy_new_args.inc" -! - ) - USE module_state_description - USE module_domain, ONLY : domain, get_ijk_from_grid - USE module_configure, ONLY : grid_config_rec_type - USE module_dm, ONLY : ntasks, ntasks_x, ntasks_y, itrace, local_communicator, mytask, & - ipe_save, jpe_save, ips_save, jps_save, get_dm_max_halo_width, & - nest_pes_x, nest_pes_y !, & - !push_communicators_for_domain,pop_communicators_for_domain - -#if (NMM_NEST == 1) - USE module_comm_nesting_dm, ONLY : halo_force_down_sub - use module_comm_dm, only: HALO_NMM_INTERP_INFO_sub -# if ( HWRF == 1 ) - use module_comm_dm, only: HALO_NMM_FORCE_DOWN_SST_sub -# endif -#endif - IMPLICIT NONE -! - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: ngrid,cgrid -#include "dummy_new_decl.inc" - INTEGER nlev, msize - INTEGER i,j,pig,pjg,cm,cn,nig,njg,retval,k - TYPE (grid_config_rec_type) :: config_flags - REAL xv(2000) - INTEGER :: cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe - INTEGER :: nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe - INTEGER :: ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe - - INTEGER idim1,idim2,idim3,idim4,idim5,idim6,idim7 - REAL dummy_xs, dummy_xe, dummy_ys, dummy_ye - LOGICAL feedback_flag, feedback_flag_v - - LOGICAL interp_mp - integer, parameter :: EConst=0, ECopy=1, EExtrap=2 ! MUST match module_interp_nmm - -#include "deref_kludge.h" - interp_mp=grid%interp_mp .or. ngrid%interp_mp - -IF ( ngrid%active_this_task ) THEN - CALL get_ijk_from_grid ( grid , & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe ) - CALL get_ijk_from_grid ( ngrid , & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe ) - -!jm as far as I can tell, grid is ngrid%intermediate_domain, so they -!jm should both have the same id, both be active_this_task (if one is) -!jm and use the same communicator. But just to be safe, some extra -!jm pushes and pops of domain communicators littered here. - - cgrid=>grid - nlev = ckde - ckds + 1 - -#include "nest_forcedown_unpack.inc" - - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - CALL push_communicators_for_domain( grid%id ) - -#if ( HWRF == 1 ) - IF(ngrid%force_sst(1) == 1) then -# include "HALO_NMM_FORCE_DOWN_SST.inc" - END IF -#endif - -#include "HALO_FORCE_DOWN.inc" - CALL pop_communicators_for_domain - - call store_interp_info(ngrid,grid) - - - call ext_c2b_fulldom(ngrid%IIH,ngrid%JJH,ngrid%HBWGT1, & - ngrid%HBWGT2,ngrid%HBWGT3,ngrid%HBWGT4, & - ngrid%deta1,ngrid%deta2,ngrid%eta1, & - ngrid%eta2,ngrid%pt,ngrid%pdtop, & - grid%pint,grid%t,grid%pd,grid%q, & - cims, cime, cjms, cjme, ckms, ckme, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe, & - ngrid%iinfo_bxs, ngrid%iinfo_bxe, & - ngrid%iinfo_bys, ngrid%iinfo_bye, & - ngrid%winfo_bxs, ngrid%winfo_bxe, & - ngrid%winfo_bys, ngrid%winfo_bye, & - ngrid%pd_bxs, ngrid%pd_bxe, & - ngrid%pd_bys, ngrid%pd_bye, & - ngrid%t_bxs, ngrid%t_bxe, & - ngrid%t_bys, ngrid%t_bye, & - ngrid%q_bxs, ngrid%q_bxe, & - ngrid%q_bys, ngrid%q_bye) - - ! Need a halo for interpolation information due to how V grid - ! interpolation works: - grid=>ngrid - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - CALL push_communicators_for_domain( grid%id ) -#include "HALO_NMM_INTERP_INFO.inc" - CALL pop_communicators_for_domain - - grid=>cgrid - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - - ! code here to interpolate the data into the nested domain - CALL push_communicators_for_domain( grid%id ) -#include "nest_forcedown_interp.inc" - CALL pop_communicators_for_domain - -END IF - - RETURN - END SUBROUTINE force_domain_nmm_part2 - -!================================================================================ -! -! This routine exists only to call a halo on a domain (the nest) -! gets called from feedback_domain_em_part1, below. This is needed -! because the halo code expects the fields being exchanged to have -! been dereferenced from the grid data structure, but in feedback_domain_em_part1 -! the grid data structure points to the coarse domain, not the nest. -! And we want the halo exchange on the nest, so that the code in -! em_nest_feedbackup_interp.inc will work correctly on multi-p. JM 20040308 -! - - SUBROUTINE feedback_nest_prep_nmm ( grid, config_flags & -! -#include "dummy_new_args.inc" -! -) - USE module_state_description - USE module_domain, ONLY : domain, get_ijk_from_grid - USE module_configure, ONLY : grid_config_rec_type - USE module_dm, ONLY : ntasks, ntasks_x, ntasks_y, itrace, local_communicator, mytask, & - ipe_save, jpe_save, ips_save, jps_save, get_dm_max_halo_width, & - nest_pes_x, nest_pes_y - !push_communicators_for_domain, pop_communicators_for_domain, & - USE module_comm_dm, ONLY : HALO_NMM_WEIGHTS_sub - USE module_comm_nesting_dm, ONLY : HALO_INTERP_UP_sub - - IMPLICIT NONE -! - TYPE(domain), TARGET :: grid ! name of the grid being dereferenced (must be "grid") - TYPE (grid_config_rec_type) :: config_flags ! configureation flags, has vertical dim of - ! soil temp, moisture, etc., has vertical dim - ! of soil categories -#include "dummy_new_decl.inc" - - INTEGER :: ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe - - INTEGER idim1,idim2,idim3,idim4,idim5,idim6,idim7 - - INTEGER :: idum1, idum2 - LOGICAL :: interp_mp - interp_mp=.true. - -#include "deref_kludge.h" - - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - IF ( grid%active_this_task ) THEN - CALL push_communicators_for_domain( grid%id ) -#ifdef DM_PARALLEL -#include "HALO_INTERP_UP.inc" -#include "HALO_NMM_WEIGHTS.inc" -#endif - CALL pop_communicators_for_domain - END IF - - END SUBROUTINE feedback_nest_prep_nmm - -!------------------------------------------------------------------ - - -!============================================================================================== - - SUBROUTINE force_intermediate_nmm ( grid, ngrid, config_flags & -! -#include "dummy_new_args.inc" -! - ) - USE module_state_description - USE module_domain, ONLY : domain, get_ijk_from_grid - USE module_configure, ONLY : grid_config_rec_type - USE module_dm, ONLY : ntasks, ntasks_x, ntasks_y, itrace, local_communicator, mytask, & - ipe_save, jpe_save, ips_save, jps_save, get_dm_max_halo_width -#if ( NMM_NEST == 1 ) - USE module_comm_nesting_dm, ONLY : halo_force_down_sub -#endif - IMPLICIT NONE -! - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: cgrid - TYPE(domain), POINTER :: ngrid -#include "dummy_new_decl.inc" - INTEGER nlev, msize - INTEGER i,j,pig,pjg,cm,cn,nig,njg,retval,k - TYPE (grid_config_rec_type) :: config_flags - REAL xv(2000) - INTEGER :: cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe - INTEGER :: nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe - INTEGER :: ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe - - INTEGER idim1,idim2,idim3,idim4,idim5,idim6,idim7 - REAL dummy_xs, dummy_xe, dummy_ys, dummy_ye - LOGICAL feedback_flag, feedback_flag_v - -integer myproc - LOGICAL interp_mp - -!#ifdef DEREF_KLUDGE -!! see http://www.mmm.ucar.edu/wrf/WG2/topics/deref_kludge.htm -! INTEGER :: sm31 , em31 , sm32 , em32 , sm33 , em33 -! INTEGER :: sm31x, em31x, sm32x, em32x, sm33x, em33x -! INTEGER :: sm31y, em31y, sm32y, em32y, sm33y, em33y -!#endif -#include "deref_kludge.h" - - interp_mp=grid%interp_mp .or. ngrid%interp_mp - -!#define COPY_IN - CALL get_ijk_from_grid ( grid , & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe ) - CALL get_ijk_from_grid ( ngrid , & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe ) - - cgrid=>grid - nlev = ckde - ckds + 1 - -#include "nest_interpdown_unpack.inc" - - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - -#include "HALO_FORCE_DOWN.inc" - - RETURN - END SUBROUTINE force_intermediate_nmm - -! ---------------------------------------------------------------------- - - SUBROUTINE feedback_domain_nmm_part1 ( grid, ngrid, config_flags & -! -#include "dummy_new_args.inc" -! - ) - USE module_state_description - USE module_domain, ONLY : domain, get_ijk_from_grid - USE module_configure, ONLY : grid_config_rec_type, model_config_rec, model_to_grid_config_rec - USE module_dm, ONLY : ntasks, ntasks_x, ntasks_y, itrace, local_communicator, mytask, & - ipe_save, jpe_save, ips_save, jps_save, get_dm_max_halo_width, & - nest_pes_x, nest_pes_y - IMPLICIT NONE -! - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: ngrid -#include "dummy_new_decl.inc" - INTEGER nlev, msize, i_parent_start, j_parent_start - INTEGER i,j,pig,pjg,cm,cn,nig,njg,retval,k - TYPE(domain), POINTER :: xgrid - TYPE (grid_config_rec_type) :: config_flags, nconfig_flags - REAL xv(2000) - INTEGER :: cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe - INTEGER :: nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe - - INTEGER idim1,idim2,idim3,idim4,idim5,idim6,idim7 - - INTEGER local_comm, myproc, nproc, idum1, idum2 - - integer, parameter :: EConst=0, ECopy=1, EExtrap=2 ! MUST match module_interp_nmm - - LOGICAL interp_mp - - INTERFACE - SUBROUTINE feedback_nest_prep_nmm ( grid, config_flags & -! -#include "dummy_new_args.inc" -! -) - USE module_state_description - USE module_domain, ONLY : domain - USE module_configure, ONLY : grid_config_rec_type -! - TYPE (grid_config_rec_type) :: config_flags - TYPE(domain), TARGET :: grid -#include "dummy_new_decl.inc" - END SUBROUTINE feedback_nest_prep_nmm - END INTERFACE -! - - interp_mp=grid%interp_mp .or. ngrid%interp_mp - CALL wrf_get_dm_communicator ( local_comm ) - CALL wrf_get_myproc( myproc ) - CALL wrf_get_nproc( nproc ) - - -! -! intermediate grid - CALL get_ijk_from_grid ( grid , & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe ) -! nest grid - CALL get_ijk_from_grid ( ngrid , & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe ) - - nlev = ckde - ckds + 1 - - ips_save = ngrid%i_parent_start ! +1 not used in ipe_save & jpe_save - jps_save = ngrid%j_parent_start ! because of one extra namelist point - ipe_save = ngrid%i_parent_start + (nide-nids) / ngrid%parent_grid_ratio - 1 - jpe_save = ngrid%j_parent_start + (njde-njds) / ngrid%parent_grid_ratio - 1 - -! feedback_nest_prep invokes a halo exchange on the ngrid. It is done this way -! in a separate routine because the HALOs need the data to be dereference from the -! grid data structure and, in this routine, the dereferenced fields are related to -! the intermediate domain, not the nest itself. Save the current grid pointer to intermediate -! domain, switch grid to point to ngrid, invoke feedback_nest_prep, then restore grid -! to point to intermediate domain. - - CALL model_to_grid_config_rec ( ngrid%id , model_config_rec , nconfig_flags ) - CALL set_scalar_indices_from_config ( ngrid%id , idum1 , idum2 ) - xgrid => grid - grid => ngrid -#include "deref_kludge.h" - CALL feedback_nest_prep_nmm ( grid, config_flags & -! -#include "actual_new_args.inc" -! -) - -! put things back so grid is intermediate grid - - grid => xgrid - CALL set_scalar_indices_from_config ( grid%id , idum1 , idum2 ) - -! "interp" (basically copy) ngrid onto intermediate grid - - ! Generate interpolation information and interpolate Q, T and - ! possibly PD while we're at it: - - call store_interp_info(ngrid,grid) - call ext_n2c_fulldom(& - ngrid%deta1,ngrid%deta2,ngrid%eta1, & - ngrid%eta2,ngrid%pt,ngrid%pdtop, & - grid%pint,grid%t,grid%pd,grid%q, & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe, & - ngrid%pint,ngrid%t, & - ngrid%pd,ngrid%q, & - ngrid%i_parent_start, ngrid%j_parent_start, & - grid%iinfo,grid%winfo, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe) - - - ! "interp" ngrid onto intermediate grid -#include "nest_feedbackup_interp.inc" - - RETURN - END SUBROUTINE feedback_domain_nmm_part1 - -!------------------------------------------------------------------ - - SUBROUTINE feedback_domain_nmm_part2 ( grid, intermediate_grid, ngrid , config_flags & -! -#include "dummy_new_args.inc" -! - ) - USE module_state_description - USE module_domain, ONLY : domain, domain_clock_get, get_ijk_from_grid - USE module_configure, ONLY : grid_config_rec_type - USE module_dm, ONLY : get_dm_max_halo_width, ips_save, ipe_save, & - jps_save, jpe_save, ntasks, mytask, ntasks_x, ntasks_y, & - local_communicator, itrace, & - nest_pes_x, nest_pes_y, & - intercomm_active, nest_task_offsets, & - mpi_comm_to_mom, mpi_comm_to_kid, which_kid ! , & - ! push_communicators_for_domain, pop_communicators_for_domain - - USE module_comm_nesting_dm, ONLY : halo_interp_up_sub - USE module_utility - IMPLICIT NONE - -! - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: intermediate_grid - TYPE(domain), POINTER :: ngrid - TYPE(domain), POINTER :: parent_grid - -#include "dummy_new_decl.inc" - INTEGER nlev, msize - INTEGER i,j,pig,pjg,cm,cn,nig,njg,retval,k - TYPE (grid_config_rec_type) :: config_flags - REAL xv(2000) - INTEGER :: cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe - INTEGER :: nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe - INTEGER :: xids, xide, xjds, xjde, xkds, xkde, & - xims, xime, xjms, xjme, xkms, xkme, & - xips, xipe, xjps, xjpe, xkps, xkpe - INTEGER :: ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe - - INTEGER idim1,idim2,idim3,idim4,idim5,idim6,idim7 - - INTEGER icoord, jcoord, idim_cd, jdim_cd - INTEGER local_comm, myproc, nproc - INTEGER iparstrt, jparstrt, sw - INTEGER thisdomain_max_halo_width - - character*256 :: timestr - integer ioffset, ierr - - REAL nest_influence - LOGICAL feedback_flag, feedback_flag_v - LOGICAL, EXTERNAL :: cd_feedback_mask - LOGICAL, EXTERNAL :: cd_feedback_mask_v - - LOGICAL interp_mp - -! On entry to this routine, -! "grid" refers to the parent domain -! "intermediate_grid" refers to local copy of parent domain that overlies this patch of nest -! "ngrid" refers to the nest, which is only needed for smoothing on the parent because -! the nest feedback data has already been transferred during em_nest_feedbackup_interp -! in part1, above. -! The way these settings c and n dimensions are set, below, looks backwards but from the point -! of view of the RSL routine rsl_lite_to_parent_info(), call to which is included by -! em_nest_feedbackup_pack, the "n" domain represents the parent domain and the "c" domain -! represents the intermediate domain. The backwards lookingness should be fixed in the gen_comms.c -! registry routine that accompanies RSL_LITE but, just as it's sometimes easier to put up a road -! sign that says "DIP" than fix the dip, at this point it was easier just to write this comment. JM -! - - interp_mp=grid%interp_mp .or. ngrid%interp_mp - nest_influence = 0.5 -#define NEST_INFLUENCE(A,B) A = nest_influence*(B) + (1.0-nest_influence)*(A) - - - CALL domain_clock_get( grid, current_timestr=timestr ) - - CALL get_ijk_from_grid ( intermediate_grid , & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe ) - CALL get_ijk_from_grid ( grid , & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe ) - CALL get_ijk_from_grid ( ngrid , & - xids, xide, xjds, xjde, xkds, xkde, & - xims, xime, xjms, xjme, xkms, xkme, & - xips, xipe, xjps, xjpe, xkps, xkpe ) - - ips_save = ngrid%i_parent_start - jps_save = ngrid%j_parent_start - ipe_save = ngrid%i_parent_start + (xide-xids) / ngrid%parent_grid_ratio - 1 - jpe_save = ngrid%j_parent_start + (xjde-xjds) / ngrid%parent_grid_ratio - 1 - - - nide = nide - 1 !dusan - njde = njde - 1 !dusan - -IF ( ngrid%active_this_task ) THEN - CALL push_communicators_for_domain( ngrid%id ) - CALL nl_get_i_parent_start ( intermediate_grid%id, iparstrt ) - CALL nl_get_j_parent_start ( intermediate_grid%id, jparstrt ) - CALL nl_get_shw ( intermediate_grid%id, sw ) - icoord = iparstrt - sw - jcoord = jparstrt - sw - idim_cd = cide - cids + 1 - jdim_cd = cjde - cjds + 1 - - nlev = ckde - ckds + 1 - - CALL get_dm_max_halo_width ( ngrid%id , thisdomain_max_halo_width ) - parent_grid => grid - grid => ngrid -#include "nest_feedbackup_pack.inc" - grid => parent_grid - CALL pop_communicators_for_domain -END IF - -! CALL wrf_get_dm_communicator ( local_comm ) -! CALL wrf_get_myproc( myproc ) -! CALL wrf_get_nproc( nproc ) - - ! determine which communicator and offset to use - IF ( intercomm_active( grid%id ) ) THEN ! I am parent - local_comm = mpi_comm_to_kid( which_kid(ngrid%id), grid%id ) - ioffset = nest_task_offsets(ngrid%id) - ELSE IF ( intercomm_active( ngrid%id ) ) THEN ! I am nest - local_comm = mpi_comm_to_mom( ngrid%id ) - ioffset = nest_task_offsets(ngrid%id) - END IF - - IF ( grid%active_this_task .OR. ngrid%active_this_task ) THEN -#ifndef STUBMPI - CALL mpi_comm_rank(local_comm,myproc,ierr) - CALL mpi_comm_size(local_comm,nproc,ierr) -#endif - CALL rsl_lite_merge_msgs( myproc, nest_pes_x(grid%id)*nest_pes_y(grid%id), & - nest_pes_x(ngrid%id)*nest_pes_y(ngrid%id), & - ioffset, local_comm ) - END IF - -IF ( grid%active_this_task ) THEN - CALL push_communicators_for_domain( grid%id ) - -#include "nest_feedbackup_unpack.inc" - - - ! smooth coarse grid - - CALL get_ijk_from_grid ( ngrid, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe ) - CALL get_ijk_from_grid ( grid , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - before_smooth_halo: if(config_flags%smooth_option/=0) then -#include "HALO_INTERP_UP.inc" - endif before_smooth_halo - - CALL get_ijk_from_grid ( grid , & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe ) - - smoothr: if(config_flags%smooth_option/=0) then -#include "nest_feedbackup_smooth.inc" - endif smoothr - - CALL pop_communicators_for_domain -END IF - - - RETURN - END SUBROUTINE feedback_domain_nmm_part2 - -!================================================================================= -! End of gopal's doing -!================================================================================= -#endif !------------------------------------------------------------------ diff --git a/external/RSL_LITE/tfp_tester.F b/external/RSL_LITE/tfp_tester.F index 2a9e3f7833..3e6ad3671f 100755 --- a/external/RSL_LITE/tfp_tester.F +++ b/external/RSL_LITE/tfp_tester.F @@ -280,8 +280,6 @@ SUBROUTINE compute_memory_dims_rsl_lite ( & INTEGER Px, Py, P, i, j, k, ierr -#if ( ! NMM_CORE == 1 ) - ! xy decomposition ips = -1 @@ -453,43 +451,6 @@ SUBROUTINE compute_memory_dims_rsl_lite ( & ipsy = 0 ENDIF - -#else - -! In case of NMM CORE, the domain only ever runs from ids..ide-1 and jds..jde-1 so -! adjust decomposition to reflect. 20051020 JM - ips = -1 - j = jds - ierr = 0 - DO i = ids, ide-1 - CALL task_for_point ( i, j, ids, ide-1, jds, jde-1, ntasks_x, ntasks_y, Px, Py, & - maxhalowidth, maxhalowidth , ierr ) - IF ( Px .EQ. mytask_x ) THEN - ipe = i - IF ( Px .EQ. ntasks_x-1 ) ipe = ipe + 1 - IF ( ips .EQ. -1 ) ips = i - ENDIF - ENDDO - IF ( ierr .NE. 0 ) THEN - CALL tfp_message(__FILE__,__LINE__) - ENDIF - jps = -1 - i = ids ; - ierr = 0 - DO j = jds, jde-1 - CALL task_for_point ( i, j, ids, ide-1, jds, jde-1, ntasks_x, ntasks_y, Px, Py, & - maxhalowidth , maxhalowidth , ierr ) - IF ( Py .EQ. mytask_y ) THEN - jpe = j - IF ( Py .EQ. ntasks_y-1 ) jpe = jpe + 1 - IF ( jps .EQ. -1 ) jps = j - ENDIF - ENDDO - IF ( ierr .NE. 0 ) THEN - CALL tfp_message(__FILE__,__LINE__) - ENDIF -#endif - ! extend the patch dimensions out shw along edges of domain IF ( ips < ipe .and. jps < jpe ) THEN !wig; 11-Mar-2008 IF ( mytask_x .EQ. 0 ) THEN diff --git a/frame/Makefile b/frame/Makefile index a4e9153c2f..7fdf0b6552 100644 --- a/frame/Makefile +++ b/frame/Makefile @@ -31,7 +31,6 @@ MODULES = module_driver_constants.o \ module_dm.o \ module_quilt_outbuf_ops.o \ module_io_quilt.o \ - module_intermediate_nmm.o \ module_cpl.o \ module_cpl_oasis3.o \ module_clear_halos.o @@ -166,7 +165,7 @@ clean: module_state_description.F : ../Registry/$(REGISTRY) ( cd .. ; tools/registry $(ARCHFLAGS) $(ENVCOMPDEFS) -DNEW_BDYS Registry/$(REGISTRY) ) ; -module_io_quilt.o : module_io_quilt.F module_io_quilt_new.F module_io_quilt_old.F +module_io_quilt.o : module_io_quilt.F module_io_quilt_old.F md_calls.inc : md_calls.m4 if [ "$(M4)" = NA ] ; then \ diff --git a/frame/module_bdywrite.F b/frame/module_bdywrite.F index e3e8142a24..1027975357 100644 --- a/frame/module_bdywrite.F +++ b/frame/module_bdywrite.F @@ -1,785 +1,3 @@ module module_bdywrite implicit none -#if (NMM_CORE==1 && NMM_NEST==1) -#ifdef EXTRA_HWRF_DEBUG_STUFF - private - public :: bdywrite - -#if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) ) - include 'mpif.h' -#else - integer, parameter :: MPI_UNDEFINED = -1 -#endif - - CHACARCTER (LEN=256) , PRIVATE :: a_message -contains - subroutine bdywrite(grid,filename) - use module_domain_type, only: domain - use module_domain, only: get_ijk_from_grid - use module_state_description, only: & - p_qv, p_qc, p_qs, p_qi, p_qr, p_qg, & - f_qv, f_qc, f_qs, f_qi, f_qr, f_qg, & - p_qnr, p_qni, f_qnr, f_qni, & - PARAM_FIRST_SCALAR,num_moist,num_scalar - implicit none - - type(domain), intent(in) :: grid - character(*), intent(in) :: filename - - include 'netcdf.inc' - - integer :: fid,vid - integer :: dimi,dimj,dimk - integer :: ni,nj,nk - integer :: jk(2),ik(2) - -! Some temporary definitions to reduce code complexity: - -#define paste(x,y) x/**/y - -#define check(ST) call bdy_nf_assert(ST,filename,__FILE__,__LINE__,.false.) -#define assert(ST) call bdy_nf_assert(ST,filename,__FILE__,__LINE__,.true.) - -#define declare_bdy(X) integer :: paste(X,_bxs), paste(X,_bxe), paste(X,_bys), paste(X,_bye) - -! NOTE: we should be able to do #X instead of using an additional "s" -! argument in define_vars2d and define_vars1d, but some GNU cpp bug is -! breaking that (and also breaking ##) - -#define define_vars2d(X,s) \ - assert(nf_def_var(fid, s // '_bxs',NF_FLOAT,2,jk,paste(X,_bxs))) ; \ - assert(nf_def_var(fid, s // '_bxe',NF_FLOAT,2,jk,paste(X,_bxe))) ; \ - assert(nf_def_var(fid, s // '_bys',NF_FLOAT,2,ik,paste(X,_bys))) ; \ - assert(nf_def_var(fid, s // '_bye',NF_FLOAT,2,ik,paste(X,_bye))) - -#define define_vars1d(X,s) \ - assert(nf_def_var(fid, s // '_bxs',NF_FLOAT,1,dimj,paste(X,_bxs))) ; \ - assert(nf_def_var(fid, s // '_bxe',NF_FLOAT,1,dimj,paste(X,_bxe))) ; \ - assert(nf_def_var(fid, s // '_bys',NF_FLOAT,1,dimi,paste(X,_bys))) ; \ - assert(nf_def_var(fid, s // '_bye',NF_FLOAT,1,dimi,paste(X,_bye))) - -#define copy_data2d(to,from,d1s,d1e,d2s,d2e) \ - do i2=d2s,d2e ; \ - do i1=d1s,d1e ; \ - to(i1+i2*(d1e-d1s+1))=from(i1,i2,1) ; \ - end do ; \ - end do - -#define copy_data1d(to,from,d1s,d1e) \ - do i1=d1s,d1e ; \ - to(i1)=from(i1,1,1) ; \ - end do - -#define write_vars3d_part(L,G,type,I) \ - call paste(bdy_write_,type)(fid,filename, \ - paste(L,_bxs),paste(L,_bxe),paste(L,_bys),paste(L,_bye), \ - ids,ide,jds,jde,kds,kde, \ - ims,ime,jms,jme,kms,kme, \ - ips,ipe,jps,jpe,kps,kpe, \ - grid%paste(G,_bxs)(:,:,1,I), grid%paste(G,_bxe)(:,:,1,I), \ - grid%paste(G,_bys)(:,:,1,I), grid%paste(G,_bye)(:,:,1,I)) - -#define write_vars2d(X,type) \ - call paste(bdy_write_,type)(fid,filename, \ - paste(X,_bxs),paste(X,_bxe),paste(X,_bys),paste(X,_bye), \ - ids,ide,jds,jde,kds,kde, \ - ims,ime,jms,jme,kms,kme, \ - ips,ipe,jps,jpe,kps,kpe, \ - grid%paste(X,_bxs), grid%paste(X,_bxe), \ - grid%paste(X,_bys), grid%paste(X,_bye)) - -#define write_vars1d(X,type) \ - call paste(bdy_write_,type)(fid,filename, \ - paste(X,_bxs),paste(X,_bxe),paste(X,_bys),paste(X,_bye), \ - ids,ide,jds,jde, 1 , 1 , \ - ims,ime,jms,jme, 1 , 1 , \ - ips,ipe,jps,jpe, 1 , 1 , \ - grid%paste(X,_bxs), grid%paste(X,_bxe), \ - grid%paste(X,_bys), grid%paste(X,_bye)) - -! End of temporary definitions. - - declare_bdy(u) - declare_bdy(v) - declare_bdy(t) - declare_bdy(q) - declare_bdy(cwm) - declare_bdy(pd) - declare_bdy(winfo) - declare_bdy(iinfo) - declare_bdy(qv) - declare_bdy(qc) - declare_bdy(qr) - declare_bdy(qi) - declare_bdy(qg) - declare_bdy(qs) - declare_bdy(qnr) - declare_bdy(qni) -! declare_bdy(utemp) -! declare_bdy(vtemp) -! declare_bdy(ttemp) -! declare_bdy(qtemp) -! declare_bdy(pdtemp) -! declare_bdy(cwmtemp) - - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE - - ! ---------- end of definitions ---------- - - IDS=-1; IDE=-1; JDS=-1; JDE=-1; KDS=-1; KDE=-1 - IMS=-1; IME=-1; JMS=-1; JME=-1; KMS=-1; KME=-1 - IPS=-1; IPE=-1; JPS=-1; JPE=-1; KPS=-1; KPE=-1 - CALL GET_IJK_FROM_GRID(GRID & - ,IDS,IDE,JDS,JDE,KDS,KDE & - ,IMS,IME,JMS,JME,KMS,KME & - ,IPS,IPE,JPS,JPE,KPS,KPE ) - - write(a_message,*) "Sam's special boundary output (TM) for domain ",grid%id ; CALL wrf_message ( a_message ) - ! call CHECK_MOIST('MOIST',grid%moist,PARAM_FIRST_SCALAR, num_moist, & - ! grid%moist_bxs,grid%moist_bxe, & - ! grid%moist_bys,grid%moist_bye, & - ! ids,ide, jds,jde, kds,kde, & - ! ims,ime, jms,jme, kms,kme, & - ! ips,ipe, jps,jpe, kps,kpe) - ! call CHECK_MOIST('SCALAR',grid%scalar,PARAM_FIRST_SCALAR, num_scalar, & - ! grid%scalar_bxs,grid%scalar_bxe, & - ! grid%scalar_bys,grid%scalar_bye, & - ! ids,ide, jds,jde, kds,kde, & - ! ims,ime, jms,jme, kms,kme, & - ! ips,ipe, jps,jpe, kps,kpe) - - assert(nf_create(trim(filename),NF_64BIT_OFFSET,fid)) - assert(nf_def_dim(fid,'i',ide-ids+1,dimi)) - assert(nf_def_dim(fid,'j',jde-jds+1,dimj)) - assert(nf_def_dim(fid,'k',kde-kds+1,dimk)) - - jk=(/ dimj,dimk /) - ik=(/ dimi,dimk /) - - define_vars2d(u,'u') - define_vars2d(v,'v') - define_vars2d(t,'t') - define_vars2d(q,'q') - define_vars2d(cwm,'cwm') - define_vars1d(pd,'pd') - define_vars2d(winfo,'winfo') - define_vars2d(iinfo,'iinfo') - if(f_qv) define_vars2d(qv,'qv') - if(f_qc) define_vars2d(qc,'qc') - if(f_qr) define_vars2d(qr,'qr') - if(f_qi) define_vars2d(qi,'qi') - if(f_qg) define_vars2d(qg,'qg') - if(f_qs) define_vars2d(qs,'qs') - if(f_qnr) define_vars2d(qnr,'qnr') - if(f_qni) define_vars2d(qni,'qni') -! define_vars2d(utemp,'utemp') -! define_vars2d(vtemp,'vtemp') -! define_vars2d(ttemp,'ttemp') -! define_vars2d(qtemp,'qtemp') -! define_vars1d(pdtemp,'pdtemp') -! define_vars2d(cwmtemp,'cwmtemp') - - assert(nf_enddef(fid)) - - write_vars2d(u,real) - write_vars2d(v,real) - write_vars2d(t,real) - write_vars2d(q,real) - write_vars2d(cwm,real) - write_vars1d(pd,real) - write_vars2d(winfo,real) - write_vars2d(iinfo,int) - if(f_qv) write_vars3d_part(qv,moist,real,p_qv) - if(f_qc) write_vars3d_part(qc,moist,real,p_qc) - if(f_qr) write_vars3d_part(qr,moist,real,p_qr) - if(f_qi) write_vars3d_part(qi,moist,real,p_qi) - if(f_qg) write_vars3d_part(qg,moist,real,p_qg) - if(f_qs) write_vars3d_part(qs,moist,real,p_qs) - if(f_qnr) write_vars3d_part(qnr,scalar,real,p_qnr) - if(f_qni) write_vars3d_part(qni,scalar,real,p_qni) - - if(f_qv) then - write(a_message,*) f_qv,p_qv ; CALL wrf_message ( a_message ) - endif - if(f_qc) then - write(a_message,*) f_qc,p_qc ; CALL wrf_message ( a_message ) - endif - if(f_qr) then - write(a_message,*) f_qr,p_qr ; CALL wrf_message ( a_message ) - endif - if(f_qi) then - write(a_message,*) f_qi,p_qi ; CALL wrf_message ( a_message ) - endif - if(f_qg) then - write(a_message,*) f_qg,p_qg ; CALL wrf_message ( a_message ) - endif - if(f_qs) then - write(a_message,*) f_qs,p_qs ; CALL wrf_message ( a_message ) - endif - if(f_qnr) then - write(a_message,*) f_qnr,p_qnr ; CALL wrf_message ( a_message ) - endif - if(f_qni) then - write(a_message,*) f_qni,p_qni ; CALL wrf_message ( a_message ) - endif -! write_vars2d(utemp,real) -! write_vars2d(vtemp,real) -! write_vars2d(ttemp,real) -! write_vars2d(qtemp,real) -! write_vars1d(pdtemp,real) -! write_vars2d(cwmtemp,real) - - assert(nf_close(fid)) - write(a_message,*) "Finished Sam's special boundary output (TM) for domain ",grid%id ; CALL wrf_message ( a_message ) - - end subroutine bdywrite - - subroutine bdy_write_real(fid,filename, & - xsid,xeid,ysid,yeid, & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - ips,ipe,jps,jpe,kps,kpe, & - bxs,bxe,bys,bye) - use module_dm, only: ntasks, local_communicator - implicit none - logical, external :: wrf_dm_on_monitor - integer, parameter :: bdyw=1 - logical :: monitor - character(*), intent(in) :: filename - integer, intent(in) :: fid,xsid,xeid,ysid,yeid - integer, intent(in) :: ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - ips,ipe,jps,jpe,kps,kpe - real, intent(in) :: bxs(jms:jme,kms:kme,bdyw) - real, intent(in) :: bxe(jms:jme,kms:kme,bdyw) - real, intent(in) :: bys(ims:ime,kms:kme,bdyw) - real, intent(in) :: bye(ims:ime,kms:kme,bdyw) - - integer :: j1,j2,i1,i2,k1,k2, ni,nj,nk - -! write(0,*) 'DUDE, THIS IS LIKE SOOOOOOO REAL' - - monitor=wrf_dm_on_monitor() - - j1=max(jps,jds) - j2=min(jpe,jde) - i1=max(ips,ids) - i2=min(ipe,jde) -30 format('ips=',I0,' ipe=',I0,' jps=',I0,' jpe=',I0,' kps=',I0,' kpe=',I0) -31 format('i1=',I0,' i2=',I0,' j1=',I0,' j2=',I0,' k1=',I0,' k2=',I0) -32 format('ni=',I0,' nj=',I0,' nk=',I0) - k1=kds - k2=kde - ni=ide-ids+1 - nj=jde-jds+1 - nk=kde-kds+1 -! write(0,*) ips,ipe,jps,jpe,kps,kpe -! write(0,*) i1,i2,j1,j2,k1,k2 -! write(0,*) ni,nj,nk - - if(ni<=0) call wrf_error_fatal('ni<=0') - if(nj<=0) call wrf_error_fatal('nj<=0') - if(nk<=0) call wrf_error_fatal('nk<=0') - - if(monitor) then - call bdy_recv() - else - call bdy_send() - endif - -! write(0,*) 'BUT DUDE, NO MORE REAL' - - contains - subroutine bdy_send - implicit none - - integer :: idum1(2),idum2(2),idum3(2),idum4(2), nreceive - real :: rdum(2) - - ! West boundary: - call bdy_send_one(ips==1,j1,j2,idum1,idum2,idum3,idum4,rdum, & - bxs, jms,jme,kms,kme, nreceive,2) - - ! East boundary: - call bdy_send_one(ipe>=ide-1,j1,j2,idum1,idum2,idum3,idum4,rdum, & - bxe, jms,jme,kms,kme, nreceive,2) - - ! South boundary: - call bdy_send_one(jps==1,i1,i2,idum1,idum2,idum3,idum4,rdum, & - bys, ims,ime,kms,kme, nreceive,2) - - ! North boundary: - call bdy_send_one(jpe>=jde-1,i1,i2,idum1,idum2,idum3,idum4,rdum, & - bye, ims,ime,kms,kme, nreceive,2) - end subroutine bdy_send - - subroutine bdy_recv - implicit none - - integer :: istore(ni*nk+ntasks), ikstore(ni*nk+ntasks) - integer :: jstore(nj*nk+ntasks), jkstore(nj*nk+ntasks) - integer :: counts(ntasks), disp(ntasks) - real :: irstore(ni*nk+ntasks), jrstore(nj*nk+ntasks) - integer :: storesize, nreceive - -33 format('ni=',I0,' nj=',I0,' nk=',I0,' ntasks=',I0,' storesize=',I0,' or ',I0) -! write(0,33) ni,nj,nk,ntasks,ni*nk+ntasks,nj*nk+ntasks - - ! West boundary: - call bdy_send_one(ips==1,j1,j2, counts,disp, jstore,jkstore,jrstore, & - bxs, jms,jme,kms,kme, nreceive, nj*nk+ntasks) - call bdy_process_one(jstore,jkstore,jrstore,jds,jde,kds,kde,xsid, nreceive) - - ! East boundary: - call bdy_send_one(ipe>=ide-1,j1,j2, counts,disp, jstore,jkstore,jrstore, & - bxe, jms,jme,kms,kme, nreceive, nj*nk+ntasks) - call bdy_process_one(jstore,jkstore,jrstore,jds,jde,kds,kde,xeid, nreceive) - - ! South boundary: - call bdy_send_one(jps==1,i1,i2, counts,disp, istore,ikstore,irstore, & - bys, ims,ime,kms,kme, nreceive, ni*nk+ntasks) - call bdy_process_one(istore,ikstore,irstore,ids,ide,kds,kde,ysid, nreceive) - - ! North boundary: - call bdy_send_one(jpe>=jde-1,i1,i2, counts,disp, istore,ikstore,irstore, & - bye, ims,ime,kms,kme, nreceive, ni*nk+ntasks) - call bdy_process_one(istore,ikstore,irstore,ids,ide,kds,kde,yeid, nreceive) - - end subroutine bdy_recv - - subroutine bdy_process_one(mstore,kstore,rstore,mds,mde,kds,kde,varid, nreceive) - implicit none - include 'netcdf.inc' - integer :: m,k,n,nm - integer, intent(in) :: mds,mde,kds,kde - integer, intent(inout) :: nreceive - integer, intent(in) :: mstore((mde-mds+1)*nk+ntasks) - integer, intent(in) :: kstore((mde-mds+1)*nk+ntasks), varid - real, intent(in) :: rstore((mde-mds+1)*nk+ntasks) - - real :: writeme(mds:mde,kds:kde) - - writeme=0 - nm=mde-mds+1 - do n=1,nreceive - if(mstore(n)<0) cycle - 23 format('store writeme(',I0,' : ',I0,',',I0,') = ',F0.3) -! write(0,23) n,mstore(n),kstore(n),rstore(n) - writeme(mstore(n),kstore(n))=rstore(n) - enddo - assert(nf_put_var_real(fid,varid,writeme)) - end subroutine bdy_process_one - - subroutine bdy_send_one(bdyactive,m1,m2, & - counts,disp,mstore,kstore,rstore, & - bdy, bm1,bm2, bk1,bk2, nreceive, storesize) - implicit none - integer, intent(in) :: storesize - integer, intent(in) :: bm1,bm2,bk1,bk2 - logical, intent(in) :: bdyactive - integer, intent(inout), dimension(ntasks) :: counts,disp - integer, intent(inout), dimension(storesize) :: mstore,kstore - real, intent(inout), dimension(storesize) :: rstore - integer, intent(in) :: m1,m2 - integer, intent(inout) :: nreceive - real, intent(in) :: bdy(bm1:bm2,bk1:bk2,1) - - real :: values((m2-m1+1)*nk) - integer :: mindex((m2-m1+1)*nk),kindex((m2-m1+1)*nk),csize,crank - integer :: mycount(2),m,k,nm,task,ierr,shift - - nm=m2-m1+1 - - mycount(1)=0 - if(monitor) then - do task=1,ntasks - counts(task)=87654321 - disp(task)=12345678 - enddo - endif - if(bdyactive) then - mycount(1)=(m2-m1+1)*nk - else - mycount(1)=1 - mindex(1)=-99 - kindex(1)=-99 - values(1)=-99. - endif - - call mpi_comm_size(local_communicator,csize,ierr) - call mpi_comm_rank(local_communicator,crank,ierr) -9 format('I am rank ',I0,' of ',I0,' processes in communicator ',I0) -! write(0,9) crank,csize,local_communicator - -! write(0,*) 'ntasks=',ntasks -! write(0,*) 'send count=',mycount(1) - ierr=-999 - call mpi_gather(mycount,1,MPI_INTEGER, counts,1,MPI_INTEGER, & - 0,local_communicator, ierr) -! write(0,*) 'result from mpi_gather is ',ierr - if(monitor) then - disp(1)=0 -12 format(' rank ',I0,': count=',I0,' and disp=',I0) -! write(0,12) 0,counts(1),disp(1) - if(counts(1)<0 .or. counts(1)>storesize) then - call wrf_error_fatal('Invalid count') - endif - do task=2,ntasks - disp(task)=disp(task-1)+counts(task-1) -! write(0,12) task-1,counts(task),disp(task) - if(counts(task)<0 .or. counts(task)>storesize) then - call wrf_error_fatal('Invalid count') - endif - enddo - endif - if(bdyactive) then - do k=k1,k2 - do m=m1,m2 -11 format('copy value(m=',I0,',k=',I0,' : shift=',I0,') = ',F0.3) - shift = (k-k1)*nm + m-m1 + 1 -! write(0,11) m,k,shift,bdy(m,k,1) - values(shift)=bdy(m,k,1) - mindex(shift)=m - kindex(shift)=k -! write(0,*) ' ... copied.' - enddo - enddo - endif - if(monitor) then -! write(0,12) 0,counts(1),disp(1) - if(counts(1)<0 .or. counts(1)>storesize) then - call wrf_error_fatal('Invalid count') - endif - do task=2,ntasks -! write(0,12) task-1,counts(task),disp(task) - if(counts(task)<0 .or. counts(task)>storesize) then - call wrf_error_fatal('Invalid count') - endif - enddo - nreceive=counts(ntasks)+disp(ntasks) -! write(0,*) 'total received: ',nreceive - endif -! write(0,*) 'barrier before gathervs' -! call mpi_barrier(local_communicator,ierr) -20 format('gatherv #',I0,' with mycount=',I0,'...') -! write(0,20) 1,mycount(1) -! flush(0) -! if(monitor) then -! write(0,*) 'counts(1)=',counts(1) -! write(0,*) 'disp(1)=',disp(1) -! endif -! write(0,*) 'mycount(1)=',mycount(1) -! write(0,*) 'mindex(1)=',mindex(1) -! flush(0) - - call mpi_gatherv(values,mycount(1),MPI_REAL, rstore,counts,disp, & - MPI_REAL,0,local_communicator,ierr) - -! write(0,*) 'barrier before gathervs' -! call mpi_barrier(local_communicator,ierr) -! write(0,20) 2,mycount(1) -! flush(0) - - call mpi_gatherv(kindex,mycount(1),MPI_INTEGER, kstore,counts,disp, & - MPI_INTEGER,0,local_communicator,ierr) - -! write(0,*) 'barrier before gathervs' -! call mpi_barrier(local_communicator,ierr) -! write(0,20) 3,mycount(1) -! flush(0) - - call mpi_gatherv(mindex,mycount(1),MPI_INTEGER, mstore,counts,disp, & - MPI_INTEGER,0,local_communicator,ierr) -! write(0,*) 'back.' -! call mpi_barrier(local_communicator,ierr) - end subroutine bdy_send_one - end subroutine bdy_write_real - - subroutine bdy_write_int (fid,filename, & - xsid,xeid,ysid,yeid, & - ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - ips,ipe,jps,jpe,kps,kpe, & - bxs,bxe,bys,bye) - use module_dm, only: ntasks, local_communicator - implicit none - logical, external :: wrf_dm_on_monitor - integer, parameter :: bdyw=1 - logical :: monitor - character(*), intent(in) :: filename - integer, intent(in) :: fid,xsid,xeid,ysid,yeid - integer, intent(in) :: ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - ips,ipe,jps,jpe,kps,kpe - integer, intent(in) :: bxs(jms:jme,kms:kme,bdyw) - integer, intent(in) :: bxe(jms:jme,kms:kme,bdyw) - integer, intent(in) :: bys(ims:ime,kms:kme,bdyw) - integer, intent(in) :: bye(ims:ime,kms:kme,bdyw) - - integer :: j1,j2,i1,i2,k1,k2, ni,nj,nk - -! write(0,*) 'DUDE, THIS IS LIKE SOOOOOOO INTEGER' - - monitor=wrf_dm_on_monitor() - - j1=max(jps,jds) - j2=min(jpe,jde) - i1=max(ips,ids) - i2=min(ipe,jde) -30 format('ips=',I0,' ipe=',I0,' jps=',I0,' jpe=',I0,' kps=',I0,' kpe=',I0) -31 format('i1=',I0,' i2=',I0,' j1=',I0,' j2=',I0,' k1=',I0,' k2=',I0) -32 format('ni=',I0,' nj=',I0,' nk=',I0) - k1=kds - k2=kde - ni=ide-ids+1 - nj=jde-jds+1 - nk=kde-kds+1 -! write(0,*) ips,ipe,jps,jpe,kps,kpe -! write(0,*) i1,i2,j1,j2,k1,k2 -! write(0,*) ni,nj,nk - - if(ni<=0) call wrf_error_fatal('ni<=0') - if(nj<=0) call wrf_error_fatal('nj<=0') - if(nk<=0) call wrf_error_fatal('nk<=0') - - if(monitor) then - call bdy_recv() - else - call bdy_send() - endif - -! write(0,*) 'BUT DUDE, NO MORE INTEGER' - - contains - subroutine bdy_send - implicit none - - integer :: idum1(2),idum2(2),idum3(2),idum4(2), nreceive - integer :: rdum(2) - - ! West boundary: - call bdy_send_one(ips==1,j1,j2,idum1,idum2,idum3,idum4,rdum, & - bxs, jms,jme,kms,kme, nreceive,2) - - ! East boundary: - call bdy_send_one(ipe>=ide-1,j1,j2,idum1,idum2,idum3,idum4,rdum, & - bxe, jms,jme,kms,kme, nreceive,2) - - ! South boundary: - call bdy_send_one(jps==1,i1,i2,idum1,idum2,idum3,idum4,rdum, & - bys, ims,ime,kms,kme, nreceive,2) - - ! North boundary: - call bdy_send_one(jpe>=jde-1,i1,i2,idum1,idum2,idum3,idum4,rdum, & - bye, ims,ime,kms,kme, nreceive,2) - end subroutine bdy_send - - subroutine bdy_recv - implicit none - - integer :: istore(ni*nk+ntasks), ikstore(ni*nk+ntasks) - integer :: jstore(nj*nk+ntasks), jkstore(nj*nk+ntasks) - integer :: counts(ntasks), disp(ntasks) - integer :: irstore(ni*nk+ntasks), jrstore(nj*nk+ntasks) - integer :: storesize, nreceive - -33 format('ni=',I0,' nj=',I0,' nk=',I0,' ntasks=',I0,' storesize=',I0,' or ',I0) -! write(0,33) ni,nj,nk,ntasks,ni*nk+ntasks,nj*nk+ntasks - - ! West boundary: - call bdy_send_one(ips==1,j1,j2, counts,disp, jstore,jkstore,jrstore, & - bxs, jms,jme,kms,kme, nreceive, nj*nk+ntasks) - call bdy_process_one(jstore,jkstore,jrstore,jds,jde,kds,kde,xsid, nreceive) - - ! East boundary: - call bdy_send_one(ipe>=ide-1,j1,j2, counts,disp, jstore,jkstore,jrstore, & - bxe, jms,jme,kms,kme, nreceive, nj*nk+ntasks) - call bdy_process_one(jstore,jkstore,jrstore,jds,jde,kds,kde,xeid, nreceive) - - ! South boundary: - call bdy_send_one(jps==1,i1,i2, counts,disp, istore,ikstore,irstore, & - bys, ims,ime,kms,kme, nreceive, ni*nk+ntasks) - call bdy_process_one(istore,ikstore,irstore,ids,ide,kds,kde,ysid, nreceive) - - ! North boundary: - call bdy_send_one(jpe>=jde-1,i1,i2, counts,disp, istore,ikstore,irstore, & - bye, ims,ime,kms,kme, nreceive, ni*nk+ntasks) - call bdy_process_one(istore,ikstore,irstore,ids,ide,kds,kde,yeid, nreceive) - - end subroutine bdy_recv - - subroutine bdy_process_one(mstore,kstore,rstore,mds,mde,kds,kde,varid, nreceive) - implicit none - include 'netcdf.inc' - integer :: m,k,n,nm - integer, intent(in) :: mds,mde,kds,kde - integer, intent(inout) :: nreceive - integer, intent(in) :: mstore((mde-mds+1)*nk+ntasks) - integer, intent(in) :: kstore((mde-mds+1)*nk+ntasks), varid - integer, intent(in) :: rstore((mde-mds+1)*nk+ntasks) - - integer :: writeme(mds:mde,kds:kde) - - writeme=0 - nm=mde-mds+1 - do n=1,nreceive - if(mstore(n)<0) cycle - 23 format('store writeme(',I0,' : ',I0,',',I0,') = ',I0) -! write(0,23) n,mstore(n),kstore(n),rstore(n) - writeme(mstore(n),kstore(n))=rstore(n) - enddo - assert(nf_put_var_int(fid,varid,writeme)) - end subroutine bdy_process_one - - subroutine bdy_send_one(bdyactive,m1,m2, & - counts,disp,mstore,kstore,rstore, & - bdy, bm1,bm2, bk1,bk2, nreceive, storesize) - implicit none - integer, intent(in) :: storesize - integer, intent(in) :: bm1,bm2,bk1,bk2 - logical, intent(in) :: bdyactive - integer, intent(inout), dimension(ntasks) :: counts,disp - integer, intent(inout), dimension(storesize) :: mstore,kstore - integer, intent(inout), dimension(storesize) :: rstore - integer, intent(in) :: m1,m2 - integer, intent(inout) :: nreceive - integer, intent(in) :: bdy(bm1:bm2,bk1:bk2,1) - - integer :: values((m2-m1+1)*nk) - integer :: mindex((m2-m1+1)*nk),kindex((m2-m1+1)*nk),csize,crank - integer :: mycount(2),m,k,nm,task,ierr,shift - - nm=m2-m1+1 - - mycount(1)=0 - if(monitor) then - do task=1,ntasks - counts(task)=87654321 - disp(task)=12345678 - enddo - endif - if(bdyactive) then - mycount(1)=(m2-m1+1)*nk - else - mycount(1)=1 - mindex(1)=-99 - kindex(1)=-99 - values(1)=-99. - endif - - call mpi_comm_size(local_communicator,csize,ierr) - call mpi_comm_rank(local_communicator,crank,ierr) -9 format('I am rank ',I0,' of ',I0,' processes in communicator ',I0) -! write(0,9) crank,csize,local_communicator - -! write(0,*) 'ntasks=',ntasks -! write(0,*) 'send count=',mycount(1) - ierr=-999 - call mpi_gather(mycount,1,MPI_INTEGER, counts,1,MPI_INTEGER, & - 0,local_communicator, ierr) -! write(0,*) 'result from mpi_gather is ',ierr - if(monitor) then - disp(1)=0 -12 format(' rank ',I0,': count=',I0,' and disp=',I0) -! write(0,12) 0,counts(1),disp(1) - if(counts(1)<0 .or. counts(1)>storesize) then - call wrf_error_fatal('Invalid count') - endif - do task=2,ntasks - disp(task)=disp(task-1)+counts(task-1) -! write(0,12) task-1,counts(task),disp(task) - if(counts(task)<0 .or. counts(task)>storesize) then - call wrf_error_fatal('Invalid count') - endif - enddo - endif - if(bdyactive) then - do k=k1,k2 - do m=m1,m2 -11 format('copy value(m=',I0,',k=',I0,' : shift=',I0,') = ',I0) - shift = (k-k1)*nm + m-m1 + 1 -! write(0,11) m,k,shift,bdy(m,k,1) - values(shift)=bdy(m,k,1) - mindex(shift)=m - kindex(shift)=k -! write(0,*) ' ... copied.' - enddo - enddo - endif - if(monitor) then -! write(0,12) 0,counts(1),disp(1) - if(counts(1)<0 .or. counts(1)>storesize) then - call wrf_error_fatal('Invalid count') - endif - do task=2,ntasks -! write(0,12) task-1,counts(task),disp(task) - if(counts(task)<0 .or. counts(task)>storesize) then - call wrf_error_fatal('Invalid count') - endif - enddo - nreceive=counts(ntasks)+disp(ntasks) -! write(0,*) 'total received: ',nreceive - endif -! write(0,*) 'barrier before gathervs' -! call mpi_barrier(local_communicator,ierr) -20 format('gatherv #',I0,' with mycount=',I0,'...') -! write(0,20) 1,mycount(1) -! flush(0) -! if(monitor) then -! write(0,*) 'counts(1)=',counts(1) -! write(0,*) 'disp(1)=',disp(1) -! endif -! write(0,*) 'mycount(1)=',mycount(1) -! write(0,*) 'mindex(1)=',mindex(1) -! flush(0) - - call mpi_gatherv(values,mycount(1),MPI_INTEGER, rstore,counts,disp, & - MPI_INTEGER,0,local_communicator,ierr) - -! write(0,*) 'barrier before gathervs' -! call mpi_barrier(local_communicator,ierr) -! write(0,20) 2,mycount(1) -! flush(0) - - call mpi_gatherv(kindex,mycount(1),MPI_INTEGER, kstore,counts,disp, & - MPI_INTEGER,0,local_communicator,ierr) - -! write(0,*) 'barrier before gathervs' -! call mpi_barrier(local_communicator,ierr) -! write(0,20) 3,mycount(1) -! flush(0) - - call mpi_gatherv(mindex,mycount(1),MPI_INTEGER, mstore,counts,disp, & - MPI_INTEGER,0,local_communicator,ierr) -! write(0,*) 'back.' -! call mpi_barrier(local_communicator,ierr) - end subroutine bdy_send_one - end subroutine bdy_write_int - - subroutine bdy_nf_assert(status,filename,srcfile,srcline,fatal) - implicit none - character(*),intent(in) :: filename,srcfile - integer, intent(in) :: status,srcline - logical,intent(in), optional :: fatal - character*80 strerr - character*700 message - - include 'netcdf.inc' - - if(status/=NF_NOERR) then - strerr=nf_strerror(status) -450 format(A,':',I0,': netcdf error ',I0,' (',A,') writing to "',A,'".') - write(message,450) trim(srcfile),srcline,status,trim(strerr),trim(filename) - if(present(fatal)) then - if(fatal) then - call wrf_error_fatal3(srcfile,srcline,message) - endif - endif - call wrf_message(message) - endif - end subroutine bdy_nf_assert -#endif -#endif end module module_bdywrite diff --git a/frame/module_dm_stubs.F b/frame/module_dm_stubs.F index 0a2a37daac..d9f0aafff6 100644 --- a/frame/module_dm_stubs.F +++ b/frame/module_dm_stubs.F @@ -359,11 +359,6 @@ SUBROUTINE wrf_global_to_patch_LOGICAL (globbuf,buf,domdesc,ndim,& RETURN END SUBROUTINE wrf_global_to_patch_LOGICAL -#if ( HWRF == 1 ) - SUBROUTINE hwrf_coupler_init - END SUBROUTINE hwrf_coupler_init -#endif - SUBROUTINE push_communicators_for_domain( id ) IMPLICIT NONE INTEGER, OPTIONAL, INTENT(IN) :: id ! if specified also does an instate for grid id diff --git a/frame/module_domain.F b/frame/module_domain.F index a231950f4d..5633d3cca5 100644 --- a/frame/module_domain.F +++ b/frame/module_domain.F @@ -731,14 +731,6 @@ SUBROUTINE alloc_and_configure_domain ( domain_id , active_this_task, grid , par parent%nests(kid)%ptr => new_grid new_grid%child_of_parent(1) = kid ! note assumption that nest can have only 1 parent parent%num_nests = parent%num_nests + 1 -#if ( NMM_CORE == 1 ) -!jm 20150810, this replaces the compile-time logic associated with the CPP constant HRD_MULTIPLE_STORMS -! used in solve_nmm of the HWRF version to decide whether or not to call the coupler. If there is more than -! one nest to a parent then that implies there are multiple storms, so we turn off the coupling. - IF ( parent%num_nests .GT. 1 ) THEN - CALL nl_set_multi_storm(1,.FALSE.) - ENDIF -#endif END IF new_grid%id = domain_id ! this needs to be assigned prior to calling wrf_patch_domain new_grid%active_this_task = active @@ -991,14 +983,7 @@ SUBROUTINE alloc_and_configure_domain ( domain_id , active_this_task, grid , par CALL wrf_dm_define_comms( grid ) #endif -#if ( NMM_CORE==1 ) -! grid%interp_mp = .not. ( size(grid%f_ice)>1 .or. size(grid%f_rain)>1 .or. size(grid%f_rimef)>1 ) - grid%interp_mp = .not. (in_use_for_config(grid%id,'f_ice') .or.& - in_use_for_config(grid%id,'f_rain') .or. & - in_use_for_config(grid%id,'f_rimef') ) -#else grid%interp_mp = .true. -#endif END SUBROUTINE alloc_and_configure_domain @@ -1354,10 +1339,6 @@ SUBROUTINE alloc_space_field ( grid, id, setinitval_in , tl_in , inter_domain IF ( grid%id .EQ. 1 ) CALL wrf_message ( & 'DYNAMICS OPTION: Eulerian Mass Coordinate ') #endif -#if (NMM_CORE == 1) - IF ( grid%id .EQ. 1 ) & - CALL wrf_message ( 'DYNAMICS OPTION: nmm dyncore' ) -#endif CALL set_scalar_indices_from_config( id , idum1 , idum2 ) @@ -2639,63 +2620,6 @@ LOGICAL FUNCTION Is_alarm_tstep( grid_clock, alarm ) END FUNCTION Is_alarm_tstep -#if (NMM_CORE==1) -!****************************************************************************** -! Function to determine if the next NPHS time step is an alarm-timestep for -! a certain grid: -! NMM-only -- modify to check whether the next alarm coincides with the next -! NPHS time step! -!****************************************************************************** - - LOGICAL FUNCTION Is_alarm_tstep_nphs( grid_clock, alarm, nphs ) - - IMPLICIT NONE - - TYPE (WRFU_Clock), INTENT(in) :: grid_clock - TYPE (WRFU_Alarm), INTENT(in) :: alarm - - LOGICAL :: pred1, pred2, pred3 - INTEGER :: nphs - - Is_alarm_tstep_nphs = .FALSE. - - IF ( ASSOCIATED( alarm%alarmint ) ) THEN - IF ( alarm%alarmint%Enabled ) THEN - IF ( alarm%alarmint%RingIntervalSet ) THEN - pred1 = .FALSE. ; pred2 = .FALSE. ; pred3 = .FALSE. - IF ( alarm%alarmint%StopTimeSet ) THEN - PRED1 = ( grid_clock%clockint%CurrTime + grid_clock%clockint%TimeStep*nphs > & - alarm%alarmint%StopTime ) - ENDIF - IF ( alarm%alarmint%RingTimeSet ) THEN - PRED2 = ( ( alarm%alarmint%RingTime - & - grid_clock%clockint%TimeStep <= & - grid_clock%clockint%CurrTime ) & - .AND. ( grid_clock%clockint%CurrTime < alarm%alarmint%RingTime ) ) - ENDIF - IF ( alarm%alarmint%RingIntervalSet ) THEN - PRED3 = ( alarm%alarmint%PrevRingTime + & - alarm%alarmint%RingInterval <= & - grid_clock%clockint%CurrTime + grid_clock%clockint%TimeStep*nphs ) - ENDIF - IF ( ( .NOT. ( pred1 ) ) .AND. & - ( ( pred2 ) .OR. ( pred3 ) ) ) THEN - Is_alarm_tstep_nphs = .TRUE. - ENDIF - ELSE IF ( alarm%alarmint%RingTimeSet ) THEN - IF ( alarm%alarmint%RingTime -& - grid_clock%clockint%TimeStep*nphs <= & - grid_clock%clockint%CurrTime ) THEN - Is_alarm_tstep_nphs = .TRUE. - ENDIF - ENDIF - ENDIF - ENDIF - - END FUNCTION Is_alarm_tstep_nphs -#endif - - !****************************************************************************** ! BEGIN TEST SECTION ! Code in the test section is used to test domain methods. diff --git a/frame/module_integrate.F b/frame/module_integrate.F index bbf597551c..4aec5aae0b 100644 --- a/frame/module_integrate.F +++ b/frame/module_integrate.F @@ -386,9 +386,6 @@ SUBROUTINE dfi_accumulate( grid ) grid_ptr => grid DO WHILE ( ASSOCIATED( grid_ptr ) ) -#if ( NMM_CORE == 1 ) - grid_ptr%mvnest = .FALSE. -#endif IF ( grid_ptr%active_this_task ) THEN CALL set_current_grid_ptr( grid_ptr ) CALL wrf_debug( 100 , 'module_integrate: calling solve interface ' ) diff --git a/frame/module_io_quilt.F b/frame/module_io_quilt.F index b7cc6525c7..3f759967bf 100644 --- a/frame/module_io_quilt.F +++ b/frame/module_io_quilt.F @@ -1,8 +1,4 @@ !WRF:DRIVER_LAYER:IO ! -#if ( HWRF == 1 ) -# include "module_io_quilt_new.F" -#else # include "module_io_quilt_old.F" -#endif diff --git a/frame/module_io_quilt_new.F b/frame/module_io_quilt_new.F deleted file mode 100644 index 481b1573e6..0000000000 --- a/frame/module_io_quilt_new.F +++ /dev/null @@ -1,5335 +0,0 @@ -!WRF:DRIVER_LAYER:IO -! -#define DEBUG_LVL 50 -#define mpi_x_comm_size(i,j,k) Mpi_Comm_Size ( i,j,k ) - -! Workaround for bug in the IBM MPI implementation. Look near the -! bottom of this file for an explanation. -#ifdef IBM_REDUCE_BUG_WORKAROUND -#define mpi_x_reduce(sb,rb,c,dt,op,r,com,ierr) reduce_add_integer(sb,rb,c,r,com) -#else -#define mpi_x_reduce(sb,rb,c,dt,op,r,com,ierr) MPI_Reduce(sb,rb,c,dt,op,r,com,ierr) -#endif - -MODULE module_wrf_quilt -! -!
-! This module contains WRF-specific I/O quilt routines called by both 
-! client (compute) and server (I/O quilt) tasks.  I/O quilt servers are 
-! a run-time optimization that allow I/O operations, executed on the I/O 
-! quilt server tasks, to be overlapped with useful computation, executed on 
-! the compute tasks.  Since I/O operations are often quite slow compared to 
-! computation, this performance optimization can increase parallel 
-! efficiency.  
-!
-! Currently, one group of I/O servers can be specified at run-time.  Namelist 
-! variable "nio_tasks_per_group" is used to specify the number of I/O server 
-! tasks in this group.  In most cases, parallel efficiency is optimized when 
-! the minimum number of I/O server tasks are used.  If memory needed to cache 
-! I/O operations fits on a single processor, then set nio_tasks_per_group=1.  
-! If not, increase the number of I/O server tasks until I/O operations fit in 
-! memory.  In the future, multiple groups of I/O server tasks will be 
-! supported.  The number of groups will be specified by namelist variable 
-! "nio_groups".  For now, nio_groups must be set to 1.  Currently, I/O servers 
-! only support overlap of output operations with computation.  Also, only I/O 
-! packages that do no support native parallel I/O may be used with I/O server 
-! tasks.  This excludes PHDF5 and MCEL.  
-!
-! In this module, the I/O quilt server tasks call package-dependent 
-! WRF-specific I/O interfaces to perform I/O operations requested by the 
-! client (compute) tasks.  All of these calls occur inside subroutine 
-! quilt().  
-! 
-! The client (compute) tasks call package-independent WRF-specific "quilt I/O" 
-! interfaces that send requests to the I/O quilt servers.  All of these calls 
-! are made from module_io.F.  
-!
-! These routines have the same names and (roughly) the same arguments as those 
-! specified in the WRF I/O API except that:
-! - "Quilt I/O" routines defined in this file and called by routines in 
-!   module_io.F have the "wrf_quilt_" prefix.
-! - Package-dependent routines called from routines in this file are defined 
-!   in the external I/O packages and have the "ext_" prefix.
-!
-! Both client (compute) and server tasks call routine init_module_wrf_quilt() 
-! which then calls setup_quilt_servers() determine which tasks are compute 
-! tasks and which are server tasks.  Before the end of init_module_wrf_quilt() 
-! server tasks call routine quilt() and remain there for the rest of the model 
-! run.  Compute tasks return from init_module_wrf_quilt() to perform model 
-! computations.  
-!
-! See http://www.mmm.ucar.edu/wrf/WG2/software_2.0/IOAPI.doc for the latest
-! version of the WRF I/O API.  This document includes detailed descriptions
-! of subroutines and their arguments that are not duplicated here.
-!
-!
- USE module_internal_header_util - USE module_timing - USE module_driver_constants !, ONLY : max_domains - USE module_dm, ONLY : current_id -#if ( DA_CORE != 1 ) - USE module_cpl, ONLY : coupler_on, cpl_set_dm_communicator, cpl_finalize -#endif - - INTEGER, PARAMETER :: int_num_handles = 99 - INTEGER, PARAMETER :: max_servers = int_num_handles+1 ! why +1? - LOGICAL, DIMENSION(0:int_num_handles) :: okay_to_write, int_handle_in_use, okay_to_commit - INTEGER, DIMENSION(0:int_num_handles) :: int_num_bytes_to_write, io_form - INTEGER, DIMENSION(0:int_num_handles) :: which_grid_is_handle - INTEGER, DIMENSION(0:int_num_handles) :: prev_server_for_handle - REAL, POINTER,SAVE :: int_local_output_buffer(:) - INTEGER, SAVE :: int_local_output_cursor - LOGICAL :: quilting_enabled - LOGICAL :: disable_quilt = .FALSE. - INTEGER :: server_for_handle(int_num_handles,max_domains) - INTEGER :: reduced(2), reduced_dummy(2) - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - - INTEGER :: mpi_comm_avail(max_domains),availrank(max_domains) - LOGICAL :: in_avail=.false., poll_servers=.false. - - INTEGER, ALLOCATABLE :: role_for_task(:) - INTEGER nio_groups -#ifdef DM_PARALLEL - INTEGER :: mpi_comm_local, mpi_comm_local_io_server_tmp - LOGICAL :: compute_group_master(max_servers,max_domains) - INTEGER :: mpi_comm_io_groups(max_servers,max_domains) - INTEGER :: nio_tasks_per_group(max_domains) - INTEGER :: ntasks - INTEGER :: mytask - - INTEGER, PARAMETER :: onebyte = 1 - INTEGER comm_io_servers, iserver, hdrbufsize, obufsize - INTEGER, DIMENSION(4096) :: hdrbuf - INTEGER, DIMENSION(int_num_handles) :: handle -#endif - -#ifdef IBM_REDUCE_BUG_WORKAROUND -! Workaround for bug in the IBM MPI implementation. Look near the -! bottom of this file for an explanation. - interface reduce_add_integer - module procedure reduce_add_int_arr - module procedure reduce_add_int_scl - end interface -#endif - - CONTAINS - -#if defined(DM_PARALLEL) && !defined( STUBMPI ) - INTEGER FUNCTION get_server_id ( dhandle ) -! -! Logic in the client side to know which io server -! group to send to. If the unit corresponds to a file that's -! already been opened, then we have no choice but to send the -! data to that group again, regardless of whether there are -! other server-groups. If it's a new file, we can chose a new -! server group. I.e. opening a file locks it onto a server -! group. Closing the file unlocks it. -! - IMPLICIT NONE - INTEGER, INTENT(IN) :: dhandle -! local - INTEGER :: id - - IF ( dhandle .GE. 1 .AND. dhandle .LE. int_num_handles ) THEN - id = which_grid_is_handle(dhandle) - IF ( id .LT. 1 .OR. id .GT. max_domains ) THEN - CALL wrf_error_fatal("module_io_quilt: get_server_id, bad grid id stored with handle") - ENDIF - IF ( server_for_handle ( dhandle, id ) .GE. 1 ) THEN - get_server_id = server_for_handle ( dhandle, id ) - ELSE - IF(poll_servers) THEN - ! Poll server group masters to find an inactive I/O server group: - call wrf_quilt_find_server(server_for_handle(dhandle, id)) - ELSE - ! Server polling is disabled, so cycle through servers: - prev_server_for_handle(id) = mod ( prev_server_for_handle(id) + 1 , nio_groups ) - server_for_handle( dhandle, id ) = prev_server_for_handle(id)+1 - ENDIF - get_server_id=server_for_handle(dhandle, id) - ENDIF - ELSE - CALL wrf_message('module_io_quilt: get_server_id bad dhandle' ) - ENDIF - END FUNCTION get_server_id -#endif - - SUBROUTINE set_server_id ( dhandle, value ) - IMPLICIT NONE - INTEGER, INTENT(IN) :: dhandle, value - INTEGER id - IF ( dhandle .GE. 1 .AND. dhandle .LE. int_num_handles ) THEN - id = which_grid_is_handle(dhandle) - IF ( id .GE. 1 .AND. ID .LE. max_domains ) THEN - server_for_handle(dhandle,id) = value - ELSE - CALL wrf_message('module_io_quilt: set_server_id bad grid id stored with handle' ) - ENDIF - ELSE - CALL wrf_message('module_io_quilt: set_server_id bad dhandle' ) - ENDIF - END SUBROUTINE set_server_id - - LOGICAL FUNCTION get_poll_servers() - implicit none - get_poll_servers=poll_servers - end FUNCTION get_poll_servers - -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - SUBROUTINE int_get_fresh_handle( retval ) -! -! Find an unused "client file handle" and return it in retval. -! The "client file handle" is used to remember how a file was opened -! so clients do not need to ask the I/O quilt servers for this information. -! It is also used as a file identifier in communications with the I/O -! server task. -! -! Note that client tasks know nothing about package-specific handles. -! Only the I/O quilt servers know about them. -! - INTEGER, INTENT(OUT) :: retval - INTEGER i - retval = -1 - DO i = 1, int_num_handles - IF ( .NOT. int_handle_in_use(i) ) THEN - retval = i - GOTO 33 - ENDIF - ENDDO -33 CONTINUE - IF ( retval < 0 ) THEN - CALL wrf_error_fatal("frame/module_io_quilt.F: int_get_fresh_handle() can not") - ENDIF - int_handle_in_use(i) = .TRUE. - NULLIFY ( int_local_output_buffer ) - END SUBROUTINE int_get_fresh_handle - - SUBROUTINE setup_quilt_servers ( id, nio_tasks_per_group, & - role_for_task, & - num_io_tasks, & - ncompute_tasks, & - mytask, & - ntasks, & - n_groups_arg, & - mpi_comm_wrld, & - mpi_comm_local, & - mpi_comm_io_groups, & - compute_node ) -! -! Both client (compute) and server tasks call this routine to -! determine which tasks are compute tasks and which are I/O server tasks. -! -! Module variables MPI_COMM_LOCAL and MPI_COMM_IO_GROUPS(:) are set up to -! contain MPI communicators as follows: -! -! MPI_COMM_LOCAL is the Communicator for the local groups of tasks. For the -! compute tasks it is the group of compute tasks; for a server group it the -! communicator of tasks in the server group. -! -! Elements of MPI_COMM_IO_GROUPS are communicators that each contain one or -! more compute tasks and a single I/O server assigned to those compute tasks. -! The I/O server tasks is always the last task in these communicators. -! On a compute task, which has a single associate in each of the server -! groups, MPI_COMM_IO_GROUPS is treated as an array; each element corresponds -! to a different server group. -! On a server task only the first element of MPI_COMM_IO_GROUPS is used -! because each server task is part of only one io_group. -! -! I/O server tasks in each I/O server group are divided among compute tasks as -! evenly as possible. -! -! When multiple I/O server groups are used, each must have the same number of -! tasks. When the total number of extra I/O tasks does not divide evenly by -! the number of io server groups requested, the remainder tasks are not used -! (wasted). -! -! For example, communicator membership for 18 tasks with nio_groups=2 and -! nio_tasks_per_group=3 is shown below: -! -!
-! Membership for MPI_COMM_LOCAL communicators:
-!   COMPUTE TASKS:          0   1   2   3   4   5   6   7   8   9  10  11
-!   1ST I/O SERVER GROUP:  12  13  14
-!   2ND I/O SERVER GROUP:  15  16  17
-!
-! Membership for MPI_COMM_IO_GROUPS(1):  
-!   COMPUTE TASKS 0, 3, 6, 9:   0   3   6   9  12
-!   COMPUTE TASKS 1, 4, 7,10:   1   4   7  10  13
-!   COMPUTE TASKS 2, 5, 8,11:   2   5   8  11  14
-!   I/O SERVER TASK       12:   0   3   6   9  12
-!   I/O SERVER TASK       13:   1   4   7  10  13
-!   I/O SERVER TASK       14:   2   5   8  11  14
-!   I/O SERVER TASK       15:   0   3   6   9  15
-!   I/O SERVER TASK       16:   1   4   7  10  16
-!   I/O SERVER TASK       17:   2   5   8  11  17
-!
-! Membership for MPI_COMM_IO_GROUPS(2):  
-!   COMPUTE TASKS 0, 3, 6, 9:   0   3   6   9  15
-!   COMPUTE TASKS 1, 4, 7,10:   1   4   7  10  16
-!   COMPUTE TASKS 2, 5, 8,11:   2   5   8  11  17
-!   I/O SERVER TASK       12:  ** not used **
-!   I/O SERVER TASK       13:  ** not used **
-!   I/O SERVER TASK       14:  ** not used **
-!   I/O SERVER TASK       15:  ** not used **
-!   I/O SERVER TASK       16:  ** not used **
-!   I/O SERVER TASK       17:  ** not used **
-!
-!
- USE module_configure -#ifdef DM_PARALLEL - USE module_dm, ONLY : compute_mesh,nest_pes_x,nest_pes_y,domain_active_this_task,& - tasks_per_split,comm_start,dm_task_split -#endif - IMPLICIT NONE - INCLUDE 'mpif.h' - INTEGER, INTENT(IN) :: id, nio_tasks_per_group(:), mytask, ntasks, & - n_groups_arg, mpi_comm_wrld - INTEGER, INTENT(IN) :: role_for_task(:) - INTEGER, INTENT(IN) :: ncompute_tasks, num_io_tasks - INTEGER, INTENT(OUT) :: mpi_comm_local - INTEGER, DIMENSION(100,max_domains), INTENT(OUT) :: mpi_comm_io_groups - LOGICAL, INTENT(OUT) :: compute_node -! Local - INTEGER :: i, j, ii, comdup, ierr, niotasks, n_groups, iisize, itask, nio - INTEGER, DIMENSION(ntasks) :: icolor - CHARACTER*128 mess - INTEGER :: io_form_setting - INTEGER :: me - INTEGER :: k, m, nprocx, nprocy, found, found_io - LOGICAL :: reorder_mesh - CHARACTER*256 message - -#if 0 -! with the changes to quilting and the movement of some init calls around -! this no longer works because the namelist hasn't been read and distributed yet. -! need to move this somewhere where it will work again, maybe into check-a-mundo? -! -!check the namelist and make sure there are no output forms specified -!that cannot be quilted - CALL nl_get_io_form_history(1, io_form_setting) ; call sokay( 'history', io_form_setting ) - CALL nl_get_io_form_restart(1, io_form_setting) ; call sokay( 'restart', io_form_setting ) - CALL nl_get_io_form_auxhist1(1, io_form_setting) ; call sokay( 'auxhist1', io_form_setting ) - CALL nl_get_io_form_auxhist2(1, io_form_setting) ; call sokay( 'auxhist2', io_form_setting ) - CALL nl_get_io_form_auxhist3(1, io_form_setting) ; call sokay( 'auxhist3', io_form_setting ) - CALL nl_get_io_form_auxhist4(1, io_form_setting) ; call sokay( 'auxhist4', io_form_setting ) - CALL nl_get_io_form_auxhist5(1, io_form_setting) ; call sokay( 'auxhist5', io_form_setting ) - CALL nl_get_io_form_auxhist6(1, io_form_setting) ; call sokay( 'auxhist6', io_form_setting ) - CALL nl_get_io_form_auxhist7(1, io_form_setting) ; call sokay( 'auxhist7', io_form_setting ) - CALL nl_get_io_form_auxhist8(1, io_form_setting) ; call sokay( 'auxhist8', io_form_setting ) - CALL nl_get_io_form_auxhist9(1, io_form_setting) ; call sokay( 'auxhist9', io_form_setting ) - CALL nl_get_io_form_auxhist10(1, io_form_setting) ; call sokay( 'auxhist10', io_form_setting ) - CALL nl_get_io_form_auxhist11(1, io_form_setting) ; call sokay( 'auxhist11', io_form_setting ) -#endif - - n_groups = n_groups_arg - IF ( n_groups .LT. 1 ) n_groups = 1 - -! compute_node = .TRUE. - -! -! nio is number of io tasks per group. If there arent enough tasks to satisfy -! the requirement that there be at least as many compute tasks as io tasks in -! each group, then just print a warning and dump out of quilting -! - - nio = nio_tasks_per_group(id) - IF ( nio .LT. 0 ) THEN - nio = 0 - ENDIF - IF ( nio .EQ. 0 ) THEN - quilting_enabled = .FALSE. - compute_node = .TRUE. - mpi_comm_local = mpi_comm_wrld - mpi_comm_io_groups(:,id) = mpi_comm_wrld - RETURN - ENDIF - found = comm_start(id) - found_io = -99 - DO i=1,ntasks - IF ( role_for_task(i) .EQ. id ) THEN - found_io = i-1 ! found_io is the first io task for this domain, used below - exit - ENDIF - ENDDO - IF ( found_io .eq. -99 ) THEN - CALL wrf_error_fatal('setup_quilt_servers: found_io not found, should not happen (but there it is)') - ENDIF - - quilting_enabled = .TRUE. - - icolor = -99 ! not an I/O task - ii = 0 - DO i = 1, ntasks - IF ( role_for_task( i ) .EQ. id ) THEN - icolor(i) = ii / nio - ii = ii + 1 - ENDIF - ENDDO - CALL MPI_Comm_dup(mpi_comm_wrld,comdup,ierr) - CALL MPI_Comm_split(comdup,icolor(mytask+1),mytask,mpi_comm_local,ierr) - IF ( icolor(mytask+1) .NE. -99 ) THEN - mpi_comm_local_io_server_tmp = mpi_comm_local - ENDIF - -! At this point, mpi_comm_local will be the local communicator for the server group associated with this domain -! the mpi_comm_local on the other tasks is a throwaway - -! Now construct the communicators for the io_groups - nprocx = nest_pes_x(id) - nprocy = nest_pes_y(id) - - IF ( nio .GT. nprocy*nprocx ) THEN - CALL wrf_error_fatal( 'more io tasks than compute tasks specified' ) - ENDIF - - m = mod(nprocy*nprocx,nio) ! divide up remainder, 1 row per, until gone - ii = 0 - j = 1 - do while ( j .le. nprocx*nprocy ) - do i = 0, (nprocx*nprocy)/nio+min(m,1)-1 - icolor(j+comm_start(id)) = ii - j = j + 1 - enddo - ii = ii + 1 - m = max(m-1,0) - enddo - -! ... and add the io servers as the last task in each group - DO j = 1, n_groups - DO i = found_io+1,ntasks - icolor(i) = -99 - ENDDO - ii = 0 - DO i = found_io+(j-1)*nio+1,found_io+j*nio - icolor(i) = ii - ii = ii+1 - ENDDO - CALL MPI_Comm_dup(mpi_comm_wrld,comdup,ierr) - CALL MPI_Comm_split(comdup,icolor(mytask+1),mytask, & - mpi_comm_io_groups(j,id),ierr) - ENDDO - -#ifdef PNETCDF_QUILT - if(poll_servers) then - poll_servers=.false. - call wrf_message('Warning: server polling does not work with pnetcdf_quilt. Disabled poll_servers.') - else -#endif - if(n_groups==1) then - poll_servers=.false. - call wrf_message('Server polling is useless with one io group. Disabled poll_servers.') - endif -#ifdef PNETCDF_QUILT - endif -#endif - - - if(poll_servers) then - ! If server polling is enabled, we need to create mpi_comm_avail, - ! which contains the monitor process, and the I/O server master process - ! for each I/O server group. This will be used in the routines - ! wrf_quilt_find_server and wrf_quilt_server_ready to find inactive - ! I/O servers for new data handles in get_server_id. - - ! The "in_avail" is set to true iff I am in the mpi_comm_avail. - - call mpi_comm_rank(mpi_comm_wrld,me,ierr) - - icolor=-99 - in_avail=.false. - - IF ( found .eq. me ) THEN ! found is the first task id for this domain, used below too - in_avail=.true. - ENDIF - icolor(1)=1 - - nio = nio_tasks_per_group(id) - do j=1,n_groups - i=ncompute_tasks+j*nio-1 - if(me+1==i) then - in_avail=.true. ! I/O server masters are in mpi_comm_avail - endif - icolor(i)=1 - enddo - - CALL MPI_Comm_dup(mpi_comm_wrld,comdup,ierr) - CALL MPI_Comm_split(comdup,icolor(me+1),me, & - mpi_comm_avail(id),ierr) - - availrank=MPI_UNDEFINED - IF(in_avail) THEN - call mpi_comm_rank(mpi_comm_avail(id),availrank(id),ierr) - ENDIF - IF ( role_for_task(me+1) .GT. 1000 ) THEN ! one of the server tasks - mpi_comm_avail(1) = mpi_comm_avail(id) - availrank(1) = availrank(id) - ENDIF - - endif - -!jm compute_group_master = .FALSE. -!jm compute_node = .FALSE. - - DO j = 1, n_groups - - IF ((found .LE. mytask .AND. mytask .LT. found +ncompute_tasks ).OR. & ! I am a compute task - (found_io+(j-1)*nio .LE. mytask .AND. mytask .LT. found_io+j*nio) & ! I am the I/O server for this group - ) THEN - - CALL MPI_Comm_Size( mpi_comm_io_groups(j,id) , iisize, ierr ) - ! Get the rank of this compute task in the compute+io - ! communicator to which it belongs - CALL MPI_Comm_Rank( mpi_comm_io_groups(j,id) , me , ierr ) - - ! If I am an I/O server for this group then make that group's - ! communicator the first element in the mpi_comm_io_groups array - ! (I will ignore all of the other elements). - - IF ( (found .LE. mytask .AND. mytask .LT. ncompute_tasks ) ) THEN - compute_node = .TRUE. - ! If I am a compute task, check whether I am the member of my - ! group that will communicate things that should be sent just - ! once (e.g. commands) to the IO server of my group. - compute_group_master(j,id) = (me .EQ. 0) - ELSE - IF (found_io+(j-1)*nio .LE. mytask .AND. mytask .LT. found_io+j*nio) THEN - mpi_comm_io_groups(1,1) = mpi_comm_io_groups(j,id) - ENDIF - ENDIF - ENDIF - - ENDDO - - END SUBROUTINE setup_quilt_servers - - SUBROUTINE sokay ( stream, io_form ) - USE module_state_description - CHARACTER*(*) stream - CHARACTER*256 mess - INTEGER io_form - - SELECT CASE (io_form) -#ifdef NETCDF - CASE ( IO_NETCDF ) - RETURN -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - RETURN -#endif -#ifdef YYY - CASE ( IO_YYY ) - RETURN -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - RETURN -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - RETURN -#endif - CASE (0) - RETURN - CASE DEFAULT - WRITE(mess,*)' An output format has been specified that is incompatible with quilting: io_form: ',io_form,' ',TRIM(stream) - CALL wrf_error_fatal(mess) - END SELECT - END SUBROUTINE sokay - - SUBROUTINE quilt -! -! I/O server tasks call this routine and remain in it for the rest of the -! model run. I/O servers receive I/O requests from compute tasks and -! perform requested I/O operations by calling package-dependent WRF-specific -! I/O interfaces. Requests are sent in the form of "data headers". Each -! request has a unique "header" message associated with it. For requests that -! contain large amounts of data, the data is appended to the header. See -! file module_internal_header_util.F for detailed descriptions of all -! headers. -! -! We wish to be able to link to different packages depending on whether -! the I/O is restart, initial, history, or boundary. -! - USE module_state_description - USE module_quilt_outbuf_ops - USE module_configure, only : grid_config_rec_type, model_config_rec, model_to_grid_config_rec - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "intio_tags.h" -#include "wrf_io_flags.h" - TYPE (grid_config_rec_type) :: config_flags - INTEGER itag, ninbuf, ntasks_io_group, ntasks_local_group, mytask_local, ierr - INTEGER istat - INTEGER mytask_io_group - INTEGER :: nout_set = 0 - INTEGER :: obufsize, bigbufsize, chunksize, sz - REAL, DIMENSION(1) :: dummy - INTEGER, ALLOCATABLE, DIMENSION(:) :: obuf, bigbuf - REAL, ALLOCATABLE, DIMENSION(:) :: RDATA - INTEGER, ALLOCATABLE, DIMENSION(:) :: IDATA - CHARACTER (LEN=512) :: CDATA - CHARACTER (LEN=80) :: fname - INTEGER icurs, hdrbufsize, itypesize, ftypesize, rtypesize, Status, fstat, io_form_arg - INTEGER :: DataHandle, FieldType, Comm, IOComm, DomainDesc, code, Count - INTEGER, DIMENSION(3) :: DomainStart , DomainEnd , MemoryStart , MemoryEnd , PatchStart , PatchEnd - INTEGER :: dummybuf(1) - INTEGER :: num_noops, num_commit_messages, num_field_training_msgs, hdr_tag - CHARACTER (len=256) :: DateStr , Element, VarName, MemoryOrder , Stagger , DimNames(3), FileName, SysDepInfo, mess - INTEGER, EXTERNAL :: use_package - LOGICAL :: stored_write_record, retval - INTEGER iii, jjj, vid, dom_id - LOGICAL :: call_server_ready - -logical okay_to_w -character*120 sysline - - dom_id = 1 ! always a valid assumption for domain id for this netcdf setting - CALL model_to_grid_config_rec ( dom_id , model_config_rec , config_flags ) - -! If we've been built with PNETCDF_QUILT defined then we use parallel I/O -! within the group of I/O servers rather than gathering the data onto the -! root I/O server. Unfortunately, this approach means that we can no-longer -! select different I/O layers for use with quilting at run time. ARPDBG. -! This code is sufficiently different that it is kept in the separate -! quilt_pnc() routine. -#ifdef PNETCDF_QUILT - CALL quilt_pnc() - RETURN -#endif - -! Call ext_pkg_ioinit() routines to initialize I/O packages. - SysDepInfo = " " -#ifdef NETCDF - if ( config_flags%use_netcdf_classic ) SysDepInfo="use_netcdf_classic" - CALL ext_ncd_ioinit( SysDepInfo, ierr ) - SysDepInfo = " " -#endif -#ifdef INTIO - CALL ext_int_ioinit( SysDepInfo, ierr ) -#endif -#ifdef XXX - CALL ext_xxx_ioinit( SysDepInfo, ierr) -#endif -#ifdef YYY - CALL ext_yyy_ioinit( SysDepInfo, ierr) -#endif -#ifdef ZZZ - CALL ext_zzz_ioinit( SysDepInfo, ierr) -#endif -#ifdef GRIB1 - CALL ext_gr1_ioinit( SysDepInfo, ierr) -#endif -#ifdef GRIB2 - CALL ext_gr2_ioinit( SysDepInfo, ierr) -#endif - - call_server_ready = .true. ! = true when the server is ready for a new file - - okay_to_commit = .false. - stored_write_record = .false. - ninbuf = 0 - ! get info. about the I/O server group that this I/O server task - ! belongs to - ! Last task in this I/O server group is the I/O server "root" - ! The I/O server "root" actually writes data to disk - ! TBH: WARNING: This is also implicit in the call to collect_on_comm(). - CALL mpi_x_comm_size( mpi_comm_io_groups(1,1), ntasks_io_group, ierr ) - CALL MPI_COMM_RANK( mpi_comm_io_groups(1,1), mytask_io_group, ierr ) - CALL mpi_x_comm_size( mpi_comm_local, ntasks_local_group, ierr ) - CALL MPI_COMM_RANK( mpi_comm_local, mytask_local, ierr ) - - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - IF ( itypesize <= 0 ) THEN - CALL wrf_error_fatal("external/RSL/module_dm.F: quilt: type size <= 0 invalid") - ENDIF - -! Work out whether this i/o server processor has one fewer associated compute proc than -! the most any processor has. Can happen when number of i/o tasks does not evenly divide -! the number of compute tasks. This is needed to keep the i/o tasks sychronized on the -! same message when they start commmunicating to stitch together an output. -! - -! infinite loop until shutdown message received -! This is the main request-handling loop. I/O quilt servers stay in this loop -! until the model run ends. - okay_to_w = .FALSE. - - DO WHILE (.TRUE.) ! { - -! -! Each I/O server receives requests from its compute tasks. Each request -! is contained in a data header (see module_internal_header_util.F for -! detailed descriptions of data headers). -! Each request is sent in two phases. First, sizes of all messages that -! will be sent from the compute tasks to this I/O server are summed on the -! I/O server via MPI_reduce(). The I/O server then allocates buffer "obuf" -! and receives concatenated messages from the compute tasks in it via the -! call to collect_on_comm(). Note that "sizes" are generally expressed in -! *bytes* in this code so conversion to "count" (number of Fortran words) is -! required for Fortran indexing and MPI calls. -! - - if(poll_servers .and. call_server_ready) then - call_server_ready=.false. - ! Send a message to the monitor telling it we're ready - ! for a new data handle. - call wrf_quilt_server_ready() - endif - - ! wait for info from compute tasks in the I/O group that we're ready to rock - ! obufsize will contain number of *bytes* -!CALL start_timing() - ! first element of reduced is obufsize, second is DataHandle - ! if needed (currently needed only for ioclose). - reduced_dummy = 0 - -!write(0,*)'before mpi_x_reduce on quilt server ' - CALL mpi_x_reduce( reduced_dummy, reduced, 2, MPI_INTEGER, MPI_SUM, mytask_io_group, mpi_comm_io_groups(1,1), ierr ) - obufsize = reduced(1) -!CALL end_timing("MPI_Reduce at top of forever loop") -!JMDEBUGwrite(0,*)'obufsize = ',obufsize -! Negative obufsize will trigger I/O server exit. -!write(0,*)'after mpi_x_reduce on quilt server ',obufsize - IF ( obufsize .LT. 0 ) THEN - IF ( obufsize .EQ. -100 ) THEN ! magic number -#ifdef NETCDF - CALL ext_ncd_ioexit( Status ) -#endif -#ifdef INTIO - CALL ext_int_ioexit( Status ) -#endif -#ifdef XXX - CALL ext_xxx_ioexit( Status ) -#endif -#ifdef YYY - CALL ext_yyy_ioexit( Status ) -#endif -#ifdef ZZZ - CALL ext_zzz_ioexit( Status ) -#endif -#ifdef GRIB1 - CALL ext_gr1_ioexit( Status ) -#endif -#ifdef GRIB2 - CALL ext_gr2_ioexit( Status ) -#endif - CALL wrf_message ( 'I/O QUILT SERVERS DONE' ) -#if ( DA_CORE != 1 ) - IF (coupler_on) THEN - CALL cpl_finalize() - ELSE -#endif - CALL mpi_finalize(ierr) -#if ( DA_CORE != 1 ) - END IF -#endif - STOP - ELSE - WRITE(mess,*)'Possible 32-bit overflow on output server. Try larger nio_tasks_per_group in namelist.' - CALL wrf_error_fatal(mess) - ENDIF - ENDIF - -! CALL start_timing() -! Obufsize of zero signals a close - -! Allocate buffer obuf to be big enough for the data the compute tasks -! will send. Note: obuf is size in *bytes* so we need to pare this -! down, since the buffer is INTEGER. - IF ( obufsize .GT. 0 ) THEN - ALLOCATE( obuf( (obufsize+1)/itypesize ) ) - -! let's roll; get the data from the compute procs and put in obuf - CALL collect_on_comm_debug(__FILE__,__LINE__, mpi_comm_io_groups(1,1), & - onebyte, & - dummy, 0, & - obuf, obufsize ) -! CALL end_timing( "quilt on server: collecting data from compute procs" ) - ELSE - ! Necessarily, the compute processes send the ioclose signal, - ! if there is one, after the iosync, which means they - ! will stall on the ioclose message waiting for the quilt - ! processes if we handle the way other messages are collected, - ! using collect_on_comm. This avoids this, but we need - ! a special signal (obufsize zero) and the DataHandle - ! to be closed. That handle is send as the second - ! word of the io_close message received by the MPI_Reduce above. - ! Then a header representing the ioclose message is constructed - ! here and handled below as if it were received from the - ! compute processes. The clients (compute processes) must be - ! careful to send this correctly (one compule process sends the actual - ! handle and everone else sends a zero, so the result sums to - ! the value of the handle). - ! - ALLOCATE( obuf( 4096 ) ) - ! DataHandle is provided as second element of reduced - CALL int_gen_handle_header( obuf, obufsize, itypesize, & - reduced(2) , int_ioclose ) - - if(poll_servers) then - ! Once we're done closing, we need to tell the master - ! process that we're ready for more data. - call_server_ready=.true. - endif - ENDIF - -!write(0,*)'calling init_store_piece_of_field' -! Now all messages received from the compute clients are stored in -! obuf. Scan through obuf and extract headers and field data and store in -! internal buffers. The scan is done twice, first to determine sizes of -! internal buffers required for storage of headers and fields and second to -! actually store the headers and fields. This bit of code does not do the -! "quilting" (assembly of patches into full domains). For each field, it -! simply concatenates all received patches for the field into a separate -! internal buffer (i.e. one buffer per field). Quilting is done later by -! routine store_patch_in_outbuf(). - CALL init_store_piece_of_field - CALL mpi_type_size ( MPI_INTEGER , itypesize , ierr ) -!write(0,*)'mpi_type_size returns ', itypesize -! Scan obuf the first time to calculate the size of the buffer required for -! each field. Calls to add_to_bufsize_for_field() accumulate sizes. - vid = 0 - icurs = itypesize - num_noops = 0 - num_commit_messages = 0 - num_field_training_msgs = 0 - DO WHILE ( icurs .lt. obufsize ) ! { - hdr_tag = get_hdr_tag( obuf ( icurs / itypesize ) ) - SELECT CASE ( hdr_tag ) - CASE ( int_field ) - CALL int_get_write_field_header ( obuf(icurs/itypesize), hdrbufsize, itypesize, ftypesize, & - DataHandle , DateStr , VarName , Dummy , FieldType , Comm , IOComm, & - DomainDesc , MemoryOrder , Stagger , DimNames , & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd ) - chunksize = (PatchEnd(1)-PatchStart(1)+1)*(PatchEnd(2)-PatchStart(2)+1)* & - (PatchEnd(3)-PatchStart(3)+1)*ftypesize - - IF ( DomainDesc .EQ. 333933 ) THEN ! Training write, only one per group of tasks - IF ( num_field_training_msgs .EQ. 0 ) THEN - call add_to_bufsize_for_field( VarName, hdrbufsize ) -!write(0,*) 'X-1', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - ENDIF - num_field_training_msgs = num_field_training_msgs + 1 - ELSE - call add_to_bufsize_for_field( VarName, hdrbufsize ) -!write(0,*) 'X-2a', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - ENDIF - icurs = icurs + hdrbufsize - -!write(0,*) 'X-1', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - - ! If this is a real write (i.e. not a training write), accumulate - ! buffersize for this field. - IF ( DomainDesc .NE. 333933 ) THEN ! magic number -!write(0,*) 'X-1a', chunksize, TRIM(VarName) - call add_to_bufsize_for_field( VarName, chunksize ) - icurs = icurs + chunksize - ENDIF - CASE ( int_open_for_write_commit ) ! only one per group of tasks - hdrbufsize = obuf(icurs/itypesize) - IF (num_commit_messages.EQ.0) THEN - call add_to_bufsize_for_field( 'COMMIT', hdrbufsize ) - ENDIF - num_commit_messages = num_commit_messages + 1 - icurs = icurs + hdrbufsize - CASE DEFAULT - hdrbufsize = obuf(icurs/itypesize) - -! This logic and the logic in the loop below is used to determine whether -! to send a noop records sent by the compute processes to allow to go -! through. The purpose is to make sure that the communications between this -! server and the other servers in this quilt group stay synchronized in -! the collection loop below, even when the servers are serving different -! numbers of clients. Here are some conditions: -! -! 1. The number of compute clients served will not differ by more than 1 -! 2. The servers with +1 number of compute clients begin with task 0 -! of mpi_comm_local, the commicator shared by this group of servers -! -! 3. For each collective field or metadata output from the compute tasks, -! there will be one record sent to the associated i/o server task. The -! i/o server task collects these records and stores them contiguously -! in a buffer (obuf) using collect_on_comm above. Thus, obuf on this -! server task will contain one record from each associated compute -! task, in order. -! -! 4. In the case of replicated output from the compute tasks -! (e.g. put_dom_ti records and control records like -! open_for_write_commit type records), compute task 0 is the only -! one that sends the record. The other compute tasks send noop -! records. Thus, obuf on server task zero will contain the output -! record from task 0 followed by noop records from the rest of the -! compute tasks associated with task 0. Obuf on the other server -! tasks will contain nothing but noop records. -! -! 5. The logic below will not allow any noop records from server task 0. -! It allows only one noop record from each of the other server tasks -! in the i/o group. This way, for replicated output, when the records -! are collected on one server task below, using collect_on_comm on -! mpi_comm_local, each task will provide exactly one record for each -! call to collect_on_comm: 1 bona fide output record from server task -! 0 and noops from the rest. - - IF ((hdr_tag.EQ.int_noop.AND.mytask_local.NE.0.AND.num_noops.LE.0) & - .OR.hdr_tag.NE.int_noop) THEN - write(VarName,'(I5.5)')vid -!write(0,*) 'X-2', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - call add_to_bufsize_for_field( VarName, hdrbufsize ) - vid = vid+1 - ENDIF - IF ( hdr_tag .EQ. int_noop ) num_noops = num_noops + 1 - icurs = icurs + hdrbufsize - END SELECT - ENDDO ! } -! Store the headers and field data in internal buffers. The first call to -! store_piece_of_field() allocates internal buffers using sizes computed by -! calls to add_to_bufsize_for_field(). - vid = 0 - icurs = itypesize - num_noops = 0 - num_commit_messages = 0 - num_field_training_msgs = 0 - DO WHILE ( icurs .lt. obufsize ) !{ -!write(0,*) 'A icurs ', icurs, ' obufsize ', obufsize - hdr_tag = get_hdr_tag( obuf ( icurs / itypesize ) ) - SELECT CASE ( hdr_tag ) - CASE ( int_field ) - CALL int_get_write_field_header ( obuf(icurs/itypesize), hdrbufsize, itypesize, ftypesize, & - DataHandle , DateStr , VarName , Dummy , FieldType , Comm , IOComm, & - DomainDesc , MemoryOrder , Stagger , DimNames , & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd ) - chunksize = (PatchEnd(1)-PatchStart(1)+1)*(PatchEnd(2)-PatchStart(2)+1)* & - (PatchEnd(3)-PatchStart(3)+1)*ftypesize - - IF ( DomainDesc .EQ. 333933 ) THEN ! Training write, only one per group of tasks - IF ( num_field_training_msgs .EQ. 0 ) THEN - call store_piece_of_field( obuf(icurs/itypesize), VarName, hdrbufsize ) -!write(0,*) 'A-1', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - ENDIF - num_field_training_msgs = num_field_training_msgs + 1 - ELSE - call store_piece_of_field( obuf(icurs/itypesize), VarName, hdrbufsize ) -!write(0,*) 'A-2a', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - ENDIF - icurs = icurs + hdrbufsize - ! If this is a real write (i.e. not a training write), store - ! this piece of this field. - IF ( DomainDesc .NE. 333933 ) THEN ! magic number -!write(0,*) 'A-1a', chunksize, TRIM(VarName),PatchStart(1:3),PatchEnd(1:3) - call store_piece_of_field( obuf(icurs/itypesize), VarName, chunksize ) - icurs = icurs + chunksize - ENDIF - CASE ( int_open_for_write_commit ) ! only one per group of tasks - hdrbufsize = obuf(icurs/itypesize) - IF (num_commit_messages.EQ.0) THEN - call store_piece_of_field( obuf(icurs/itypesize), 'COMMIT', hdrbufsize ) - ENDIF - num_commit_messages = num_commit_messages + 1 - icurs = icurs + hdrbufsize - CASE DEFAULT - hdrbufsize = obuf(icurs/itypesize) - IF ((hdr_tag.EQ.int_noop.AND.mytask_local.NE.0.AND.num_noops.LE.0) & - .OR.hdr_tag.NE.int_noop) THEN - write(VarName,'(I5.5)')vid -!write(0,*) 'A-2b', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - call store_piece_of_field( obuf(icurs/itypesize), VarName, hdrbufsize ) - vid = vid+1 - ENDIF - IF ( hdr_tag .EQ. int_noop ) num_noops = num_noops + 1 - icurs = icurs + hdrbufsize - END SELECT - ENDDO !} - -! Now, for each field, retrieve headers and patches (data) from the internal -! buffers and collect them all on the I/O quilt server "root" task. - CALL init_retrieve_pieces_of_field -! Retrieve header and all patches for the first field from the internal -! buffers. - CALL retrieve_pieces_of_field ( obuf , VarName, obufsize, sz, retval ) -! Sum sizes of all headers and patches (data) for this field from all I/O -! servers in this I/O server group onto the I/O server "root". - CALL mpi_x_reduce( sz, bigbufsize, 1, MPI_INTEGER, MPI_SUM, ntasks_local_group-1, mpi_comm_local, ierr ) -!write(0,*)'seed: sz ',sz,' bigbufsize ',bigbufsize,' VarName ', TRIM(VarName),' retval ',retval - -! Loop until there are no more fields to retrieve from the internal buffers. - DO WHILE ( retval ) !{ -#if 0 -#else - -! I/O server "root" allocates space to collect headers and fields from all -! other servers in this I/O server group. - IF ( mytask_local .EQ. ntasks_local_group-1 ) THEN - ALLOCATE( bigbuf( (bigbufsize+1)/itypesize ) ) - else - ALLOCATE( bigbuf(1) ) - ENDIF - -! Collect buffers and fields from all I/O servers in this I/O server group -! onto the I/O server "root" - CALL collect_on_comm_debug2(__FILE__,__LINE__,Trim(VarName), & - get_hdr_tag(obuf),sz,get_hdr_rec_size(obuf), & - mpi_comm_local, & - onebyte, & - obuf, sz, & - bigbuf, bigbufsize ) -! The I/O server "root" now handles collected requests from all compute -! tasks served by this I/O server group (i.e. all compute tasks). - IF ( mytask_local .EQ. ntasks_local_group-1 ) THEN -!jjj = 4 -!do iii = 1, ntasks_local_group -! write(0,*)'i,j,tag,size ', iii, jjj, get_hdr_tag(bigbuf(jjj/4)),get_hdr_rec_size(bigbuf(jjj/4)) -! jjj = jjj + get_hdr_rec_size(bigbuf(jjj/4)) -!enddo - - icurs = itypesize ! icurs is a byte counter, but buffer is integer - - stored_write_record = .false. - -! The I/O server "root" loops over the collected requests. - DO WHILE ( icurs .lt. bigbufsize ) !{ - CALL mpi_type_size ( MPI_INTEGER , itypesize , ierr ) - -!write(0,*)'B tag,size ',icurs,get_hdr_tag( bigbuf(icurs/itypesize) ),get_hdr_rec_size( bigbuf(icurs/itypesize) ) -! The I/O server "root" gets the request out of the next header and -! handles it by, in most cases, calling the appropriate external I/O package -! interface. - SELECT CASE ( get_hdr_tag( bigbuf(icurs/itypesize) ) ) -! The I/O server "root" handles the "noop" (do nothing) request. This is -! actually quite easy. "Noop" requests exist to help avoid race conditions. -! In some cases, only one compute task will everything about a request so -! other compute tasks send "noop" requests. - CASE ( int_noop ) - CALL int_get_noop_header( bigbuf(icurs/itypesize), hdrbufsize, itypesize ) - icurs = icurs + hdrbufsize - -! The I/O server "root" handles the "put_dom_td_real" request. - CASE ( int_dom_td_real ) - CALL mpi_type_size( MPI_REAL, ftypesize, ierr ) - ALLOCATE( RData( bigbuf(icurs/itypesize + 4 ) ) ) ! 5 is the count of data items for this record ; defined in collect_on_comm.c - CALL int_get_td_header( bigbuf(icurs/itypesize:), hdrbufsize, itypesize, ftypesize, & - DataHandle, DateStr, Element, RData, Count, code ) - icurs = icurs + hdrbufsize - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_dom_td_real( handle(DataHandle),TRIM(Element),TRIM(DateStr),RData, Count, Status ) -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_dom_td_real( handle(DataHandle),TRIM(Element),TRIM(DateStr),RData, Count, Status ) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_dom_td_real( handle(DataHandle),TRIM(Element),TRIM(DateStr),RData, Count, Status ) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_dom_td_real( handle(DataHandle),TRIM(Element),TRIM(DateStr),RData, Count, Status ) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_dom_td_real( handle(DataHandle),TRIM(Element),TRIM(DateStr),RData, Count, Status ) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - DEALLOCATE( RData ) -! The I/O server "root" handles the "put_dom_ti_real" request. - CASE ( int_dom_ti_real ) - CALL mpi_type_size( MPI_REAL, ftypesize, ierr ) - ALLOCATE( RData( bigbuf(icurs/itypesize + 4 ) ) ) ! 5 is the count of data items for this record ; defined in collect_on_comm.c - CALL int_get_ti_header( bigbuf(icurs/itypesize:), hdrbufsize, itypesize, ftypesize, & - DataHandle, Element, RData, Count, code ) -!write(0,*)' int_dom_ti_real ',trim(element),count - icurs = icurs + hdrbufsize - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_dom_ti_real( handle(DataHandle),TRIM(Element), RData, Count, Status ) -!write(0,*)'ext_ncd_put_dom_ti_real ',handle(DataHandle),TRIM(Element),RData,Status -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_dom_ti_real( handle(DataHandle),TRIM(Element), RData, Count, Status ) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_dom_ti_real( handle(DataHandle),TRIM(Element), RData, Count, Status ) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_dom_ti_real( handle(DataHandle),TRIM(Element), RData, Count, Status ) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_dom_ti_real( handle(DataHandle),TRIM(Element), RData, Count, Status ) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - DEALLOCATE( RData ) - -! The I/O server "root" handles the "put_dom_td_integer" request. - CASE ( int_dom_td_integer ) - CALL mpi_type_size( MPI_INTEGER, ftypesize, ierr ) - ALLOCATE( IData( bigbuf(icurs/itypesize + 4 ) ) ) ! 5 is the count of data items for this record ; defined in collect_on_comm.c - CALL int_get_td_header( bigbuf(icurs/itypesize:), hdrbufsize, itypesize, ftypesize, & - DataHandle, DateStr, Element, IData, Count, code ) -!write(0,*)' int_dom_td_integer ',trim(element) - icurs = icurs + hdrbufsize - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_dom_td_integer( handle(DataHandle),TRIM(Element), Trim(DateStr), IData, Count, Status ) -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_dom_td_integer( handle(DataHandle),TRIM(Element), Trim(DateStr), IData, Count, Status ) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_dom_td_integer( handle(DataHandle),TRIM(Element), Trim(DateStr), IData, Count, Status ) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_dom_td_integer( handle(DataHandle),TRIM(Element), Trim(DateStr), IData, Count, Status ) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_dom_td_integer( handle(DataHandle),TRIM(Element), Trim(DateStr), IData, Count, Status ) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - DEALLOCATE( IData ) - -! The I/O server "root" handles the "put_dom_ti_integer" request. - CASE ( int_dom_ti_integer ) - - CALL mpi_type_size( MPI_INTEGER, ftypesize, ierr ) - ALLOCATE( IData( bigbuf(icurs/itypesize + 4 ) ) ) ! 5 is the count of data items for this record ; defined in collect_on_comm.c - CALL int_get_ti_header( bigbuf(icurs/itypesize:), hdrbufsize, itypesize, ftypesize, & - DataHandle, Element, IData, Count, code ) -!write(0,*)' int_dom_ti_integer ',trim(element) - icurs = icurs + hdrbufsize - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_dom_ti_integer( handle(DataHandle),TRIM(Element), IData, Count, Status ) -!!write(0,*)'ext_ncd_put_dom_ti_integer ',handle(DataHandle),TRIM(Element),IData,Status -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_dom_ti_integer( handle(DataHandle),TRIM(Element), IData, Count, Status ) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_dom_ti_integer( handle(DataHandle),TRIM(Element), IData, Count, Status ) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_dom_ti_integer( handle(DataHandle),TRIM(Element), IData, Count, Status ) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_dom_ti_integer( handle(DataHandle),TRIM(Element), IData, Count, Status ) -#endif - - CASE DEFAULT - Status = 0 - END SELECT - - DEALLOCATE( IData) - -! The I/O server "root" handles the "set_time" request. - CASE ( int_set_time ) - CALL int_get_ti_header_char( bigbuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle, Element, VarName, CData, code ) -!write(0,*)' int_set_time ',trim(element) - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_set_time ( handle(DataHandle), TRIM(CData), Status) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - icurs = icurs + hdrbufsize - -! The I/O server "root" handles the "put_dom_ti_char" request. - CASE ( int_dom_ti_char ) - CALL int_get_ti_header_char( bigbuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle, Element, VarName, CData, code ) -!write(0,*)' after int_get_ti_header_char ',trim(VarName),trim(element) - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_dom_ti_char ( handle(DataHandle), TRIM(Element), TRIM(CData), Status) -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_dom_ti_char ( handle(DataHandle), TRIM(Element), TRIM(CData), Status) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_dom_ti_char ( handle(DataHandle), TRIM(Element), TRIM(CData), Status) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_dom_ti_char ( handle(DataHandle), TRIM(Element), TRIM(CData), Status) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_dom_ti_char ( handle(DataHandle), TRIM(Element), TRIM(CData), Status) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - icurs = icurs + hdrbufsize - -! The I/O server "root" handles the "put_var_ti_char" request. - CASE ( int_var_ti_char ) - CALL int_get_ti_header_char( bigbuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle, Element, VarName, CData, code ) -!write(0,*)' int_var_ti_char ',trim(varname),trim(element) - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_var_ti_char ( handle(DataHandle), TRIM(Element), TRIM(VarName), TRIM(CData), Status) -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_var_ti_char ( handle(DataHandle), TRIM(Element), TRIM(VarName), TRIM(CData), Status) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_var_ti_char ( handle(DataHandle), TRIM(Element), TRIM(VarName), TRIM(CData), Status) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_var_ti_char ( handle(DataHandle), TRIM(Element), TRIM(VarName), TRIM(CData), Status) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_var_ti_char ( handle(DataHandle), TRIM(Element), TRIM(VarName), TRIM(CData), Status) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - icurs = icurs + hdrbufsize - - CASE ( int_ioexit ) -! ioexit is now handled by sending negative message length to server - CALL wrf_error_fatal( & - "quilt: should have handled int_ioexit already") -! The I/O server "root" handles the "ioclose" request. - CASE ( int_ioclose ) - CALL int_get_handle_header( bigbuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle , code ) - icurs = icurs + hdrbufsize - - IF ( DataHandle .GE. 1 ) THEN -!JMDEBUGwrite(0,*)'closing DataHandle ',DataHandle,' io_form ',io_form(DataHandle) - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_ncd_ioclose(handle(DataHandle),Status) - ENDIF -#endif -#ifdef PNETCDF - CASE ( IO_PNETCDF ) - CALL ext_pnc_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_pnc_ioclose(handle(DataHandle),Status) - ENDIF -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_int_ioclose(handle(DataHandle),Status) - ENDIF -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_yyy_ioclose(handle(DataHandle),Status) - ENDIF -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_gr1_ioclose(handle(DataHandle),Status) - ENDIF -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_gr2_ioclose(handle(DataHandle),Status) - ENDIF -#endif - CASE DEFAULT - Status = 0 - END SELECT - ENDIF - -! If desired, outputs a ready flag after quilting subroutine closes the data handle for history (wrfout) file. - - IF (fname(1:6) .EQ. 'wrfout' .AND. config_flags%output_ready_flag ) THEN - OPEN (unit=99,file='wrfoutReady' // fname(7:30), status='unknown', access='sequential') - CLOSE (99) - ENDIF - -! The I/O server "root" handles the "open_for_write_begin" request. - CASE ( int_open_for_write_begin ) - - CALL int_get_ofwb_header( bigbuf(icurs/itypesize), hdrbufsize, itypesize, & - FileName,SysDepInfo,io_form_arg,DataHandle ) - -!write(0,*)' int_open_for_write_begin itypesize ',itypesize,' itypesize ',itypesize -!write(0,*)' int_open_for_write_begin icurs ', icurs, hdrbufsize -!write(0,*)' int_open_for_write_begin FileName ',TRIM(FileName) , ' DataHandle ', DataHandle -!write(0,*)' int_open_for_write_begin SysDepInfo ',TRIM(SysDepInfo) - icurs = icurs + hdrbufsize -!write(0,*)' int_open_for_write_begin new icurs,tag,size ', icurs, get_hdr_tag( bigbuf(icurs/itypesize) ),get_hdr_rec_size( bigbuf(icurs/itypesize) ) - - io_form(DataHandle) = io_form_arg -!write(0,*)'io_form(DataHandle) ',io_form(DataHandle) - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_open_for_write_begin(FileName,Comm,IOComm,SysDepInfo,handle(DataHandle),Status) -!write(0,*)'ext_ncd_open_for_write_begin ',Trim(FileName),DataHandle,handle(DataHandle),Status -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_open_for_write_begin(FileName,Comm,IOComm,SysDepInfo,handle(DataHandle),Status) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_open_for_write_begin(FileName,Comm,IOComm,SysDepInfo,handle(DataHandle),Status) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_open_for_write_begin(FileName,Comm,IOComm,SysDepInfo,handle(DataHandle),Status) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_open_for_write_begin(FileName,Comm,IOComm,SysDepInfo,handle(DataHandle),Status) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - okay_to_write(DataHandle) = .false. - -! The I/O server "root" handles the "open_for_write_commit" request. -! In this case, the "okay_to_commit" is simply set to .true. so "write_field" -! requests will initiate writes to disk. Actual commit will be done after -! all requests in this batch have been handled. - CASE ( int_open_for_write_commit ) - - CALL int_get_handle_header( bigbuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle , code ) - icurs = icurs + hdrbufsize - okay_to_commit(DataHandle) = .true. - -! The I/O server "root" handles the "write_field" (int_field) request. -! If okay_to_write(DataHandle) is .true. then the patch in the -! header (bigbuf) is written to a globally-sized internal output buffer via -! the call to store_patch_in_outbuf(). Note that this is where the actual -! "quilting" (reassembly of patches onto a full-size domain) is done. If -! okay_to_write(DataHandle) is .false. then external I/O package interfaces -! are called to write metadata for I/O formats that support native metadata. -! -! NOTE that the I/O server "root" will only see write_field (int_field) -! requests AFTER an "iosync" request. - CASE ( int_field ) - CALL mpi_type_size( MPI_INTEGER, ftypesize, ierr ) - CALL int_get_write_field_header ( bigbuf(icurs/itypesize), hdrbufsize, itypesize, ftypesize, & - DataHandle , DateStr , VarName , Dummy , FieldType , Comm , IOComm, & - DomainDesc , MemoryOrder , Stagger , DimNames , & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd ) -!write(0,*)' int_field ',TRIM(VarName),DataHandle,okay_to_write(DataHandle) - icurs = icurs + hdrbufsize - - IF ( okay_to_write(DataHandle) ) THEN - -! WRITE(0,*)'>>> ',TRIM(DateStr), ' ', TRIM(VarName), ' ', TRIM(MemoryOrder), ' ', & -! (PatchEnd(1)-PatchStart(1)+1)*(PatchEnd(2)-PatchStart(2)+1)*(PatchEnd(3)-PatchStart(3)+1) - - IF ( FieldType .EQ. WRF_FLOAT .OR. FieldType .EQ. WRF_DOUBLE) THEN - ! Note that the WRF_DOUBLE branch of this IF statement must come first since - ! WRF_FLOAT is set equal to WRF_DOUBLE during autopromotion builds. - IF ( FieldType .EQ. WRF_DOUBLE) THEN -! this branch has not been tested TBH: 20050406 - CALL mpi_type_size( MPI_DOUBLE_PRECISION, ftypesize, ierr ) - ELSE - CALL mpi_type_size( MPI_REAL, ftypesize, ierr ) - ENDIF - stored_write_record = .true. - CALL store_patch_in_outbuf ( bigbuf(icurs/itypesize), dummybuf, TRIM(DateStr), TRIM(VarName) , & - FieldType, TRIM(MemoryOrder), TRIM(Stagger), DimNames, & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd ) - - ELSE IF ( FieldType .EQ. WRF_INTEGER ) THEN - CALL mpi_type_size( MPI_INTEGER, ftypesize, ierr ) - stored_write_record = .true. - CALL store_patch_in_outbuf ( dummybuf, bigbuf(icurs/itypesize), TRIM(DateStr), TRIM(VarName) , & - FieldType, TRIM(MemoryOrder), TRIM(Stagger), DimNames, & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd ) - ELSE IF ( FieldType .EQ. WRF_LOGICAL ) THEN - ftypesize = LWORDSIZE - ENDIF - icurs = icurs + (PatchEnd(1)-PatchStart(1)+1)*(PatchEnd(2)-PatchStart(2)+1)* & - (PatchEnd(3)-PatchStart(3)+1)*ftypesize - ELSE - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_write_field ( handle(DataHandle) , TRIM(DateStr) , & - TRIM(VarName) , dummy , FieldType , Comm , IOComm, & - DomainDesc , TRIM(MemoryOrder) , TRIM(Stagger) , DimNames , & - DomainStart , DomainEnd , & - DomainStart , DomainEnd , & - DomainStart , DomainEnd , & - Status ) -#endif - CASE DEFAULT - Status = 0 - END SELECT - ENDIF - CASE ( int_iosync ) - CALL int_get_handle_header( bigbuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle , code ) - icurs = icurs + hdrbufsize - CASE DEFAULT - WRITE(mess,*)' quilt: int_field: bad tag: ',get_hdr_tag( bigbuf(icurs/itypesize) ),' icurs ',icurs/itypesize - CALL wrf_error_fatal( mess ) - END SELECT - - ENDDO !} -! Now, the I/O server "root" has finshed handling all commands from the latest -! call to retrieve_pieces_of_field(). - - IF (stored_write_record) THEN -! If any fields have been stored in a globally-sized internal output buffer -! (via a call to store_patch_in_outbuf()) then call write_outbuf() to write -! them to disk now. -! NOTE that the I/O server "root" will only have called -! store_patch_in_outbuf() when handling write_field (int_field) -! commands which only arrive AFTER an "iosync" command. -! CALL start_timing - CALL write_outbuf ( handle(DataHandle), use_package(io_form(DataHandle))) -! CALL end_timing( "quilt: call to write_outbuf" ) - ENDIF - -! If one or more "open_for_write_commit" commands were encountered from the -! latest call to retrieve_pieces_of_field() then call the package-specific -! routine to do the commit. - IF (okay_to_commit(DataHandle)) THEN - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_ncd_open_for_write_commit(handle(DataHandle),Status) - okay_to_write(DataHandle) = .true. - ENDIF -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_int_open_for_write_commit(handle(DataHandle),Status) - okay_to_write(DataHandle) = .true. - ENDIF -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_yyy_open_for_write_commit(handle(DataHandle),Status) - okay_to_write(DataHandle) = .true. - ENDIF -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_gr1_open_for_write_commit(handle(DataHandle),Status) - okay_to_write(DataHandle) = .true. - ENDIF -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_gr2_open_for_write_commit(handle(DataHandle),Status) - okay_to_write(DataHandle) = .true. - ENDIF -#endif - - CASE DEFAULT - Status = 0 - END SELECT - - okay_to_commit(DataHandle) = .false. - ENDIF - DEALLOCATE( bigbuf ) - ENDIF -#endif - if(allocated(bigbuf)) deallocate(bigbuf) -! Retrieve header and all patches for the next field from the internal -! buffers. - CALL retrieve_pieces_of_field ( obuf , VarName, obufsize, sz, retval ) -! Sum sizes of all headers and patches (data) for this field from all I/O -! servers in this I/O server group onto the I/O server "root". - CALL mpi_x_reduce( sz, bigbufsize, 1, MPI_INTEGER,MPI_SUM, ntasks_local_group-1,mpi_comm_local, ierr ) -! Then, return to the top of the loop to collect headers and data from all -! I/O servers in this I/O server group onto the I/O server "root" and handle -! the next batch of commands. - END DO !} - - DEALLOCATE( obuf ) - - ! flush output files if needed - IF (stored_write_record) THEN -! CALL start_timing() - SELECT CASE ( use_package(io_form) ) -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_iosync( handle(DataHandle), Status ) -#endif -#ifdef XXX - CASE ( IO_XXX ) - CALL ext_xxx_iosync( handle(DataHandle), Status ) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_iosync( handle(DataHandle), Status ) -#endif -#ifdef ZZZ - CASE ( IO_ZZZ ) - CALL ext_zzz_iosync( handle(DataHandle), Status ) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_iosync( handle(DataHandle), Status ) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_iosync( handle(DataHandle), Status ) -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_iosync( handle(DataHandle), Status ) -#endif - CASE DEFAULT - Status = 0 - END SELECT -!CALL end_timing( "quilt: flush" ) - ENDIF - - END DO ! } - - END SUBROUTINE quilt - - SUBROUTINE quilt_pnc -! -! Same as quilt() routine except that _all_ of the IO servers that call it -! actually write data to disk using pNetCDF. This version is only used when -! the code is compiled with PNETCDF_QUILT defined. -! - USE module_state_description - USE module_quilt_outbuf_ops - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "intio_tags.h" -#include "wrf_io_flags.h" - INTEGER itag, ninbuf, ntasks_io_group, ntasks_local_group, mytask_local, ierr - INTEGER istat - INTEGER mytask_io_group - INTEGER :: nout_set = 0 - INTEGER :: obufsize, bigbufsize, chunksize, sz - REAL, DIMENSION(1) :: dummy - INTEGER, ALLOCATABLE, DIMENSION(:) :: obuf, bigbuf - REAL, ALLOCATABLE, DIMENSION(:) :: RDATA - INTEGER, ALLOCATABLE, DIMENSION(:) :: IDATA - CHARACTER (LEN=512) :: CDATA - CHARACTER (LEN=80) :: fname - INTEGER icurs, hdrbufsize, itypesize, ftypesize, rtypesize, Status, fstat, io_form_arg - INTEGER :: DataHandle, FieldType, Comm, IOComm, DomainDesc, code, Count - INTEGER, DIMENSION(3) :: DomainStart , DomainEnd , MemoryStart , MemoryEnd , PatchStart , PatchEnd - INTEGER :: dummybuf(1) - INTEGER :: num_noops, num_commit_messages, num_field_training_msgs, hdr_tag - CHARACTER (len=256) :: DateStr , Element, VarName, MemoryOrder , Stagger , DimNames(3), FileName, SysDepInfo, mess - INTEGER, EXTERNAL :: use_package - LOGICAL :: stored_write_record, retval, written_record - INTEGER iii, jjj, vid - -! logical okay_to_w -! character*120 sysline - -! Call ext_pkg_ioinit() routines to initialize I/O packages. - SysDepInfo = " " -#ifdef NETCDF - CALL ext_ncd_ioinit( SysDepInfo, ierr) -#endif -#ifdef PNETCDF_QUILT - CALL ext_pnc_ioinit( SysDepInfo, ierr) -#endif -#ifdef INTIO - CALL ext_int_ioinit( SysDepInfo, ierr ) -#endif -#ifdef XXX - CALL ext_xxx_ioinit( SysDepInfo, ierr) -#endif -#ifdef YYY - CALL ext_yyy_ioinit( SysDepInfo, ierr) -#endif -#ifdef ZZZ - CALL ext_zzz_ioinit( SysDepInfo, ierr) -#endif -#ifdef GRIB1 - CALL ext_gr1_ioinit( SysDepInfo, ierr) -#endif -#ifdef GRIB2 - CALL ext_gr2_ioinit( SysDepInfo, ierr) -#endif - - okay_to_commit = .false. - stored_write_record = .false. - ninbuf = 0 - ! get info. about the I/O server group that this I/O server task - ! belongs to - CALL mpi_x_comm_size( mpi_comm_io_groups(1,1), ntasks_io_group, ierr ) - CALL MPI_COMM_RANK( mpi_comm_io_groups(1,1), mytask_io_group, ierr ) - CALL mpi_x_comm_size( mpi_comm_local, ntasks_local_group, ierr ) - CALL MPI_COMM_RANK( mpi_comm_local, mytask_local, ierr ) - - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - IF ( itypesize <= 0 ) THEN - CALL wrf_error_fatal("external/RSL/module_dm.F: quilt: type size <= 0 invalid") - ENDIF - -! Work out whether this i/o server processor has one fewer associated compute proc than -! the most any processor has. Can happen when number of i/o tasks does not evenly divide -! the number of compute tasks. This is needed to keep the i/o tasks sychronized on the -! same message when they start commmunicating to stitch together an output. -! - -! infinite loop until shutdown message received -! This is the main request-handling loop. I/O quilt servers stay in this loop -! until the model run ends. -!okay_to_w = .false. - DO WHILE (.TRUE.) ! { - -! -! Each I/O server receives requests from its compute tasks. Each request -! is contained in a data header (see module_internal_header_util.F for -! detailed descriptions of data headers). -! Each request is sent in two phases. First, sizes of all messages that -! will be sent from the compute tasks to this I/O server are summed on the -! I/O server via MPI_reduce(). The I/O server then allocates buffer "obuf" -! and receives concatenated messages from the compute tasks in it via the -! call to collect_on_comm(). Note that "sizes" are generally expressed in -! *bytes* in this code so conversion to "count" (number of Fortran words) is -! required for Fortran indexing and MPI calls. -! - ! wait for info from compute tasks in the I/O group that we're ready to rock - ! obufsize will contain number of *bytes* -!CALL start_timing - ! first element of reduced is obufsize, second is DataHandle - ! if needed (currently needed only for ioclose). - reduced_dummy = 0 - CALL mpi_x_reduce( reduced_dummy, reduced, 2, MPI_INTEGER, MPI_SUM, mytask_io_group, mpi_comm_io_groups(1,1), ierr ) - obufsize = reduced(1) -!CALL end_timing("MPI_Reduce at top of forever loop") -!JMDEBUGwrite(0,*)'obufsize = ',obufsize -! Negative obufsize will trigger I/O server exit. - IF ( obufsize .LT. 0 ) THEN - IF ( obufsize .EQ. -100 ) THEN ! magic number -#ifdef NETCDF - CALL ext_ncd_ioexit( Status ) -#endif -#ifdef PNETCDF_QUILT - CALL ext_pnc_ioexit( Status ) -#endif -#ifdef INTIO - CALL ext_int_ioexit( Status ) -#endif -#ifdef XXX - CALL ext_xxx_ioexit( Status ) -#endif -#ifdef YYY - CALL ext_yyy_ioexit( Status ) -#endif -#ifdef ZZZ - CALL ext_zzz_ioexit( Status ) -#endif -#ifdef GRIB1 - CALL ext_gr1_ioexit( Status ) -#endif -#ifdef GRIB2 - CALL ext_gr2_ioexit( Status ) -#endif - CALL wrf_message ( 'I/O QUILT SERVERS DONE' ) -#if ( DA_CORE != 1 ) - IF (coupler_on) THEN - CALL cpl_finalize() - ELSE -#endif - CALL mpi_finalize(ierr) -#if ( DA_CORE != 1 ) - END IF -#endif - STOP - ELSE - WRITE(mess,*)'Possible 32-bit overflow on output server. Try larger nio_tasks_per_group in namelist.' - CALL wrf_error_fatal(mess) - ENDIF - ENDIF - -! CALL start_timing -! Obufsize of zero signals a close - -! Allocate buffer obuf to be big enough for the data the compute tasks -! will send. Note: obuf is size in *bytes* so we need to pare this -! down, since the buffer is INTEGER. - IF ( obufsize .GT. 0 ) THEN - ALLOCATE( obuf( (obufsize+1)/itypesize ) ) - -! let's roll; get the data from the compute procs and put in obuf - CALL collect_on_comm_debug(__FILE__,__LINE__, mpi_comm_io_groups(1,1), & - onebyte, & - dummy, 0, & - obuf, obufsize ) -! CALL end_timing( "quilt on server: collecting data from compute procs" ) - ELSE - ! Necessarily, the compute processes send the ioclose signal, - ! if there is one, after the iosync, which means they - ! will stall on the ioclose message waiting for the quilt - ! processes if we handle the way other messages are collected, - ! using collect_on_comm. This avoids this, but we need - ! a special signal (obufsize zero) and the DataHandle - ! to be closed. That handle is send as the second - ! word of the io_close message received by the MPI_Reduce above. - ! Then a header representing the ioclose message is constructed - ! here and handled below as if it were received from the - ! compute processes. The clients (compute processes) must be - ! careful to send this correctly (one compule process sends the actual - ! handle and everone else sends a zero, so the result sums to - ! the value of the handle). - ! - ALLOCATE( obuf( 4096 ) ) - ! DataHandle is provided as second element of reduced - CALL int_gen_handle_header( obuf, obufsize, itypesize, & - reduced(2) , int_ioclose ) - ENDIF - -!write(0,*)'calling init_store_piece_of_field' -! Now all messages received from the compute clients are stored in -! obuf. Scan through obuf and extract headers and field data and store in -! internal buffers. The scan is done twice, first to determine sizes of -! internal buffers required for storage of headers and fields and second to -! actually store the headers and fields. This bit of code does not do any -! "quilting" (assembly of patches into full domains). For each field, it -! simply writes all received patches for the field to disk. -! ARPDBG we can vastly reduce the number of writes to disk by stitching -! any contiguous patches together first. Has implications for synchronisation -! of pNetCDF calls though. - CALL init_store_piece_of_field - CALL mpi_type_size ( MPI_INTEGER , itypesize , ierr ) -!write(0,*)'mpi_type_size returns ', itypesize -! Scan obuf the first time to calculate the size of the buffer required for -! each field. Calls to add_to_bufsize_for_field() accumulate sizes. - vid = 0 - icurs = itypesize - num_noops = 0 - num_commit_messages = 0 - num_field_training_msgs = 0 - DO WHILE ( icurs .lt. obufsize ) ! { - hdr_tag = get_hdr_tag( obuf ( icurs / itypesize ) ) - SELECT CASE ( hdr_tag ) - CASE ( int_field ) - CALL int_get_write_field_header ( obuf(icurs/itypesize), hdrbufsize, itypesize, ftypesize, & - DataHandle , DateStr , VarName , Dummy , FieldType , Comm , IOComm, & - DomainDesc , MemoryOrder , Stagger , DimNames , & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd ) - chunksize = (PatchEnd(1)-PatchStart(1)+1)*(PatchEnd(2)-PatchStart(2)+1)* & - (PatchEnd(3)-PatchStart(3)+1)*ftypesize - - IF ( DomainDesc .EQ. 333933 ) THEN ! Training write, only one per group of tasks - IF ( num_field_training_msgs .EQ. 0 ) THEN - call add_to_bufsize_for_field( VarName, hdrbufsize ) -!write(0,*) 'X-1', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - ENDIF - num_field_training_msgs = num_field_training_msgs + 1 - ELSE - call add_to_bufsize_for_field( VarName, hdrbufsize ) -!write(0,*) 'X-2a', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - ENDIF - icurs = icurs + hdrbufsize - -!write(0,*) 'X-1', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - - ! If this is a real write (i.e. not a training write), accumulate - ! buffersize for this field. - IF ( DomainDesc .NE. 333933 ) THEN ! magic number -!write(0,*) 'X-1a', chunksize, TRIM(VarName) - call add_to_bufsize_for_field( VarName, chunksize ) - icurs = icurs + chunksize - ENDIF - CASE ( int_open_for_write_commit ) ! only one per group of tasks - hdrbufsize = obuf(icurs/itypesize) - IF (num_commit_messages.EQ.0) THEN - call add_to_bufsize_for_field( 'COMMIT', hdrbufsize ) - ENDIF - num_commit_messages = num_commit_messages + 1 - icurs = icurs + hdrbufsize - CASE DEFAULT - hdrbufsize = obuf(icurs/itypesize) - -! This logic and the logic in the loop below is used to determine whether -! to send a noop records sent by the compute processes to allow to go -! through. The purpose is to make sure that the communications between this -! server and the other servers in this quilt group stay synchronized in -! the collection loop below, even when the servers are serving different -! numbers of clients. Here are some conditions: -! -! 1. The number of compute clients served will not differ by more than 1 -! 2. The servers with +1 number of compute clients begin with task 0 -! of mpi_comm_local, the commicator shared by this group of servers -! -! 3. For each collective field or metadata output from the compute tasks, -! there will be one record sent to the associated i/o server task. The -! i/o server task collects these records and stores them contiguously -! in a buffer (obuf) using collect_on_comm above. Thus, obuf on this -! server task will contain one record from each associated compute -! task, in order. -! ! -! 4. In the case of replicated output from the compute tasks -! (e.g. put_dom_ti records and control records like -! open_for_write_commit type records), only compute tasks for which -! (compute_group_master == .TRUE) send the record. The other compute -! tasks send noop records. This is done so that each server task -! receives exactly one record plus noops from the other compute tasks. -! -! 5. Logic below does not allow any noop records through since each IO -! server task now receives a valid record (from the 'compute-group master' -! when doing replicated output - IF (hdr_tag.NE.int_noop) THEN - write(VarName,'(I5.5)')vid -!write(0,*) 'X-2', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - call add_to_bufsize_for_field( VarName, hdrbufsize ) - vid = vid+1 - ENDIF - IF ( hdr_tag .EQ. int_noop ) num_noops = num_noops + 1 - icurs = icurs + hdrbufsize - - END SELECT - ENDDO ! } -! Store the headers and field data in internal buffers. The first call to -! store_piece_of_field() allocates internal buffers using sizes computed by -! calls to add_to_bufsize_for_field(). - vid = 0 - icurs = itypesize - num_noops = 0 - num_commit_messages = 0 - num_field_training_msgs = 0 - DO WHILE ( icurs .lt. obufsize ) !{ -!write(0,*) 'A icurs ', icurs, ' obufsize ', obufsize - hdr_tag = get_hdr_tag( obuf ( icurs / itypesize ) ) - SELECT CASE ( hdr_tag ) - CASE ( int_field ) - CALL int_get_write_field_header ( obuf(icurs/itypesize), hdrbufsize, itypesize, ftypesize, & - DataHandle , DateStr , VarName , Dummy , FieldType , Comm , IOComm, & - DomainDesc , MemoryOrder , Stagger , DimNames , & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd ) - chunksize = (PatchEnd(1)-PatchStart(1)+1)*(PatchEnd(2)-PatchStart(2)+1)* & - (PatchEnd(3)-PatchStart(3)+1)*ftypesize - - IF ( DomainDesc .EQ. 333933 ) THEN ! Training write, only one per group of tasks - IF ( num_field_training_msgs .EQ. 0 ) THEN - call store_piece_of_field( obuf(icurs/itypesize), VarName, hdrbufsize ) -!write(0,*) 'A-1', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - ENDIF - num_field_training_msgs = num_field_training_msgs + 1 - ELSE - call store_piece_of_field( obuf(icurs/itypesize), VarName, hdrbufsize ) -!write(0,*) 'A-2a', icurs, hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - ENDIF - icurs = icurs + hdrbufsize - ! If this is a real write (i.e. not a training write), store - ! this piece of this field. - IF ( DomainDesc .NE. 333933 ) THEN ! magic number - call store_piece_of_field( obuf(icurs/itypesize), VarName, chunksize ) - icurs = icurs + chunksize -!write(0,*) 'A-1a',TRIM(VarName),' icurs ',icurs,PatchStart(1:3),PatchEnd(1:3) - ENDIF - CASE ( int_open_for_write_commit ) ! only one per group of tasks - hdrbufsize = obuf(icurs/itypesize) - IF (num_commit_messages.EQ.0) THEN - call store_piece_of_field( obuf(icurs/itypesize), 'COMMIT', hdrbufsize ) - ENDIF - num_commit_messages = num_commit_messages + 1 - icurs = icurs + hdrbufsize - CASE DEFAULT - hdrbufsize = obuf(icurs/itypesize) - IF (hdr_tag.NE.int_noop) THEN - - write(VarName,'(I5.5)')vid -!write(0,*) 'A-2b', hdrbufsize, get_hdr_tag( obuf ( icurs / itypesize ) ) , get_hdr_rec_size( obuf ( icurs / itypesize ) ), TRIM(VarName) - call store_piece_of_field( obuf(icurs/itypesize), VarName, hdrbufsize ) - vid = vid+1 - ENDIF - IF ( hdr_tag .EQ. int_noop ) num_noops = num_noops + 1 - icurs = icurs + hdrbufsize - END SELECT - ENDDO !} while(icurs < obufsize) - -! Now, for each field, retrieve headers and patches (data) from the internal -! buffers - CALL init_retrieve_pieces_of_field -! Retrieve header and all patches for the first field from the internal -! buffers. - CALL retrieve_pieces_of_field ( obuf , VarName, obufsize, sz, retval ) - written_record = .false. - -! Loop until there are no more fields to retrieve from the internal buffers. - DO WHILE ( retval ) !{ - -! This I/O server now handles the collected requests from the compute -! tasks it serves - - icurs = itypesize ! icurs is a byte counter, but buffer is integer - - stored_write_record = .false. - -! ALL I/O servers in this group loop over the collected requests they have -! received. - DO WHILE ( icurs .lt. sz)! bigbufsize ) !{ - -! The I/O server gets the request out of the next header and -! handles it by, in most cases, calling the appropriate external I/O package -! interface. - SELECT CASE ( get_hdr_tag( obuf(icurs/itypesize) ) ) -! The I/O server handles the "noop" (do nothing) request. This is -! actually quite easy. "Noop" requests exist to help avoid race conditions. - CASE ( int_noop ) - CALL int_get_noop_header( obuf(icurs/itypesize), & - hdrbufsize, itypesize ) - icurs = icurs + hdrbufsize - -! The I/O server "root" handles the "put_dom_td_real" request. - CASE ( int_dom_td_real ) - CALL mpi_type_size( MPI_REAL, ftypesize, ierr ) - ALLOCATE( RData( obuf(icurs/itypesize + 4 ) ) ) ! 5 is the count of data items for this record ; defined in collect_on_comm.c - CALL int_get_td_header( obuf(icurs/itypesize:), hdrbufsize, itypesize, ftypesize, & - DataHandle, DateStr, Element, RData, Count, code ) - icurs = icurs + hdrbufsize - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef PNETCDF_QUILT - CASE (IO_PNETCDF ) - CALL ext_pnc_put_dom_td_real( handle(DataHandle),TRIM(Element),TRIM(DateStr),RData, Count, Status ) -#endif -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_dom_td_real( handle(DataHandle),TRIM(Element),TRIM(DateStr),RData, Count, Status ) -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_dom_td_real( handle(DataHandle),TRIM(Element),TRIM(DateStr),RData, Count, Status ) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_dom_td_real( handle(DataHandle),TRIM(Element),TRIM(DateStr),RData, Count, Status ) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_dom_td_real( handle(DataHandle),TRIM(Element),TRIM(DateStr),RData, Count, Status ) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_dom_td_real( handle(DataHandle),TRIM(Element),TRIM(DateStr),RData, Count, Status ) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - DEALLOCATE( RData ) -! Every I/O server handles the "put_dom_ti_real" request. - CASE ( int_dom_ti_real ) - - CALL mpi_type_size( MPI_REAL, ftypesize, ierr ) - ALLOCATE( RData( obuf(icurs/itypesize + 4 ) ) ) ! 5 is the count of data items for this record ; defined in collect_on_comm.c - CALL int_get_ti_header( obuf(icurs/itypesize:), hdrbufsize, itypesize, ftypesize, & - DataHandle, Element, RData, Count, code ) - icurs = icurs + hdrbufsize - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef PNETCDF_QUILT - CASE (IO_PNETCDF ) - CALL ext_pnc_put_dom_ti_real( handle(DataHandle),TRIM(Element), RData, Count, Status ) -#endif -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_dom_ti_real( handle(DataHandle),TRIM(Element), RData, Count, Status ) -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_dom_ti_real( handle(DataHandle),TRIM(Element), RData, Count, Status ) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_dom_ti_real( handle(DataHandle),TRIM(Element), RData, Count, Status ) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_dom_ti_real( handle(DataHandle),TRIM(Element), RData, Count, Status ) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_dom_ti_real( handle(DataHandle),TRIM(Element), RData, Count, Status ) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - DEALLOCATE( RData ) - -! Every I/O server handles the "put_dom_td_integer" request. - CASE ( int_dom_td_integer ) - - CALL mpi_type_size( MPI_INTEGER, ftypesize, ierr ) - ALLOCATE( IData( obuf(icurs/itypesize + 4 ) ) ) ! 5 is the count of data items for this record ; defined in collect_on_comm.c - CALL int_get_td_header( obuf(icurs/itypesize:), hdrbufsize, itypesize, ftypesize, & - DataHandle, DateStr, Element, IData, Count, code ) - icurs = icurs + hdrbufsize - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef PNETCDF_QUILT - CASE (IO_PNETCDF ) - CALL ext_pnc_put_dom_td_integer( handle(DataHandle),TRIM(Element), Trim(DateStr), IData, Count, Status ) -#endif -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_dom_td_integer( handle(DataHandle),TRIM(Element), Trim(DateStr), IData, Count, Status ) -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_dom_td_integer( handle(DataHandle),TRIM(Element), Trim(DateStr), IData, Count, Status ) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_dom_td_integer( handle(DataHandle),TRIM(Element), Trim(DateStr), IData, Count, Status ) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_dom_td_integer( handle(DataHandle),TRIM(Element), Trim(DateStr), IData, Count, Status ) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_dom_td_integer( handle(DataHandle),TRIM(Element), Trim(DateStr), IData, Count, Status ) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - DEALLOCATE( IData ) - -! Every I/O server handles the "put_dom_ti_integer" request. - CASE ( int_dom_ti_integer ) - - CALL mpi_type_size( MPI_INTEGER, ftypesize, ierr ) - ALLOCATE( IData( obuf(icurs/itypesize + 4 ) ) ) ! 5 is the count of data items for this record ; defined in collect_on_comm.c - CALL int_get_ti_header( obuf(icurs/itypesize:), hdrbufsize, itypesize, ftypesize, & - DataHandle, Element, IData, Count, code ) - icurs = icurs + hdrbufsize - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef PNETCDF_QUILT - CASE (IO_PNETCDF ) - CALL ext_pnc_put_dom_ti_integer( handle(DataHandle),TRIM(Element), IData, Count, Status ) -#endif -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_dom_ti_integer( handle(DataHandle),TRIM(Element), IData, Count, Status ) -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_dom_ti_integer( handle(DataHandle),TRIM(Element), IData, Count, Status ) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_dom_ti_integer( handle(DataHandle),TRIM(Element), IData, Count, Status ) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_dom_ti_integer( handle(DataHandle),TRIM(Element), IData, Count, Status ) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_dom_ti_integer( handle(DataHandle),TRIM(Element), IData, Count, Status ) -#endif - - CASE DEFAULT - Status = 0 - END SELECT - - DEALLOCATE( IData) - -! Every I/O server handles the "set_time" request. - CASE ( int_set_time ) - - CALL int_get_ti_header_char( obuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle, Element, VarName, CData, code ) - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_set_time ( handle(DataHandle), TRIM(CData), Status) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - icurs = icurs + hdrbufsize - -! Every I/O server handles the "put_dom_ti_char" request. - CASE ( int_dom_ti_char ) - - CALL int_get_ti_header_char( obuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle, Element, VarName, CData, code ) - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef PNETCDF_QUILT - CASE (IO_PNETCDF ) - CALL ext_pnc_put_dom_ti_char ( handle(DataHandle), TRIM(Element), Trim(CData), Status) -#endif -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_dom_ti_char ( handle(DataHandle), TRIM(Element), TRIM(CData), Status) -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_dom_ti_char ( handle(DataHandle), TRIM(Element), TRIM(CData), Status) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_dom_ti_char ( handle(DataHandle), TRIM(Element), TRIM(CData), Status) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_dom_ti_char ( handle(DataHandle), TRIM(Element), TRIM(CData), Status) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_dom_ti_char ( handle(DataHandle), TRIM(Element), TRIM(CData), Status) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - icurs = icurs + hdrbufsize - -! Every I/O server handles the "put_var_ti_char" request. - CASE ( int_var_ti_char ) - - CALL int_get_ti_header_char( obuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle, Element, VarName, CData, code ) - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef PNETCDF_QUILT - CASE (IO_PNETCDF ) - CALL ext_pnc_put_var_ti_char ( handle(DataHandle), TRIM(Element), TRIM(VarName), TRIM(CData), Status ) -#endif -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_put_var_ti_char ( handle(DataHandle), TRIM(Element), TRIM(VarName), TRIM(CData), Status) -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_put_var_ti_char ( handle(DataHandle), TRIM(Element), TRIM(VarName), TRIM(CData), Status) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_put_var_ti_char ( handle(DataHandle), TRIM(Element), TRIM(VarName), TRIM(CData), Status) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_put_var_ti_char ( handle(DataHandle), TRIM(Element), TRIM(VarName), TRIM(CData), Status) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_put_var_ti_char ( handle(DataHandle), TRIM(Element), TRIM(VarName), TRIM(CData), Status) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - icurs = icurs + hdrbufsize - - CASE ( int_ioexit ) -! ioexit is now handled by sending negative message length to server - CALL wrf_error_fatal( & - "quilt: should have handled int_ioexit already") -! Every I/O server handles the "ioclose" request. - CASE ( int_ioclose ) - CALL int_get_handle_header( obuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle , code ) - icurs = icurs + hdrbufsize - - IF ( DataHandle .GE. 1 ) THEN - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef PNETCDF_QUILT - CASE ( IO_PNETCDF ) - CALL ext_pnc_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_pnc_ioclose(handle(DataHandle),Status) - ENDIF -#endif -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_ncd_ioclose(handle(DataHandle),Status) - ENDIF -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_int_ioclose(handle(DataHandle),Status) - ENDIF -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_yyy_ioclose(handle(DataHandle),Status) - ENDIF -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_gr1_ioclose(handle(DataHandle),Status) - ENDIF -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_FOR_WRITE .OR. fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_gr2_ioclose(handle(DataHandle),Status) - ENDIF -#endif - CASE DEFAULT - Status = 0 - END SELECT - ENDIF - -! Every I/O server handles the "open_for_write_begin" request. - CASE ( int_open_for_write_begin ) - - CALL int_get_ofwb_header( obuf(icurs/itypesize), hdrbufsize, itypesize, & - FileName,SysDepInfo,io_form_arg,DataHandle ) - -!write(0,*)' int_open_for_write_begin itypesize ',itypesize,' itypesize ',itypesize -!write(0,*)' int_open_for_write_begin icurs ', icurs, hdrbufsize -!JMDEBUGwrite(0,*)' int_open_for_write_begin FileName ',TRIM(FileName) , ' DataHandle ', DataHandle -!write(0,*)' int_open_for_write_begin SysDepInfo ',TRIM(SysDepInfo) - icurs = icurs + hdrbufsize -!write(0,*)' int_open_for_write_begin new icurs,tag,size ', icurs, get_hdr_tag( bigbuf(icurs/itypesize) ),get_hdr_rec_size( bigbuf(icurs/itypesize) ) - - io_form(DataHandle) = io_form_arg - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef PNETCDF_QUILT - CASE (IO_PNETCDF ) - CALL ext_pnc_open_for_write_begin(FileName,mpi_comm_local,mpi_comm_local,SysDepInfo,handle(DataHandle),Status ) -#endif -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_open_for_write_begin(FileName,Comm,IOComm,SysDepInfo,handle(DataHandle),Status) -!write(0,*)'ext_ncd_open_for_write_begin ',Trim(FileName),DataHandle,handle(DataHandle),Status -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_open_for_write_begin(FileName,Comm,IOComm,SysDepInfo,handle(DataHandle),Status) -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_open_for_write_begin(FileName,Comm,IOComm,SysDepInfo,handle(DataHandle),Status) -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_open_for_write_begin(FileName,Comm,IOComm,SysDepInfo,handle(DataHandle),Status) -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_open_for_write_begin(FileName,Comm,IOComm,SysDepInfo,handle(DataHandle),Status) -#endif - CASE DEFAULT - Status = 0 - END SELECT - - okay_to_write(DataHandle) = .false. - -! Every I/O server handles the "open_for_write_commit" request. -! In this case, the "okay_to_commit" is simply set to .true. so "write_field" -! (int_field) requests will initiate writes to disk. Actual commit will be done after -! all requests in this batch have been handled. - CASE ( int_open_for_write_commit ) - - CALL int_get_handle_header( obuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle , code ) - icurs = icurs + hdrbufsize - okay_to_commit(DataHandle) = .true. - -! Every I/O server handles the "write_field" (int_field) request. -! If okay_to_write(DataHandle) is .true. then the patch in the -! header (bigbuf) is written to disk using pNetCDF. Note that this is where the actual -! "quilting" (reassembly of patches onto a full-size domain) is done. If -! okay_to_write(DataHandle) is .false. then external I/O package interfaces -! are called to write metadata for I/O formats that support native metadata. -! -! NOTE that the I/O servers will only see write_field (int_field) -! requests AFTER an "iosync" request. - CASE ( int_field ) - CALL mpi_type_size( MPI_INTEGER, ftypesize, ierr ) - CALL int_get_write_field_header ( obuf(icurs/itypesize), hdrbufsize, itypesize, ftypesize, & - DataHandle , DateStr , VarName , Dummy , FieldType , Comm , IOComm, & - DomainDesc , MemoryOrder , Stagger , DimNames , & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd ) -!write(0,*)' int_field ',TRIM(VarName),DataHandle,okay_to_write(DataHandle) - icurs = icurs + hdrbufsize - - IF ( okay_to_write(DataHandle) ) THEN - -!!$ WRITE(0,FMT="('>>> ',(A),1x,(A),1x,A2,I6,1x,3('[',I3,',',I3,'] '))") & -!!$ TRIM(DateStr), TRIM(VarName), TRIM(MemoryOrder), & -!!$ (PatchEnd(1)-PatchStart(1)+1)*(PatchEnd(2)-PatchStart(2)+1)*(PatchEnd(3)-PatchStart(3)+1), & -!!$PatchStart(1),PatchEnd(1),PatchStart(2),PatchEnd(2),PatchStart(3),PatchEnd(3) -!!$ WRITE(0,FMT="('>>> ',(A),1x,(A),1x,I6,1x,3('[',I3,',',I3,'] '))") & -!!$ TRIM(DateStr), TRIM(VarName), DomainDesc, & -!!$ DomainStart(1),DomainEnd(1),DomainStart(2),DomainEnd(2),DomainStart(3),DomainEnd(3) - - IF ( FieldType .EQ. WRF_FLOAT .OR. FieldType .EQ. WRF_DOUBLE) THEN - ! Note that the WRF_DOUBLE branch of this IF statement must come first since - ! WRF_FLOAT is set equal to WRF_DOUBLE during autopromotion builds. - IF ( FieldType .EQ. WRF_DOUBLE) THEN -! this branch has not been tested TBH: 20050406 - CALL mpi_type_size( MPI_DOUBLE_PRECISION, ftypesize, ierr ) - ELSE - CALL mpi_type_size( MPI_REAL, ftypesize, ierr ) - ENDIF - -#ifdef PNETCDF_QUILT -! WRITE(mess,FMT="('>>> ',(A),1x,(A),1x,I6,1x,3('[',I3,',',I3,'] '))") & -! TRIM(DateStr), TRIM(VarName), DomainDesc, & -! DomainStart(1),DomainEnd(1), & -! DomainStart(2),DomainEnd(2),DomainStart(3),DomainEnd(3) -! CALL wrf_message(mess) - - CALL store_patch_in_outbuf_pnc(obuf(icurs/itypesize), & - dummybuf, TRIM(DateStr), & - TRIM(VarName) , & - FieldType, & - TRIM(MemoryOrder), & - TRIM(Stagger), & - DimNames, & - DomainStart , DomainEnd ,& - MemoryStart , MemoryEnd ,& - PatchStart , PatchEnd, & - ntasks_io_group-1 ) - stored_write_record = .true. - -!!$ IF(VarName .eq. "PSFC")THEN -!!$ CALL dump_real_array_c(obuf(icurs/itypesize), DomainStart,& -!!$ DomainEnd, PatchStart, PatchEnd, & -!!$ mytask_local, DomainDesc) -!!$ ENDIF - -#endif - ELSE IF ( FieldType .EQ. WRF_INTEGER ) THEN - CALL mpi_type_size( MPI_INTEGER, ftypesize, ierr ) -#ifdef PNETCDF_QUILT - CALL store_patch_in_outbuf_pnc ( dummybuf, & - obuf(icurs/itypesize) , & - TRIM(DateStr) , & - TRIM(VarName) , & - FieldType, & - TRIM(MemoryOrder) , & - TRIM(Stagger), DimNames, & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd , & - ntasks_io_group-1 ) - stored_write_record = .true. -#endif - ELSE IF ( FieldType .EQ. WRF_LOGICAL ) THEN - ftypesize = LWORDSIZE - ENDIF - - icurs = icurs + (PatchEnd(1)-PatchStart(1)+1)* & - (PatchEnd(2)-PatchStart(2)+1)* & - (PatchEnd(3)-PatchStart(3)+1)*ftypesize - - ELSE ! Write metadata only (or do 'training'?) - - SELECT CASE (use_package(io_form(DataHandle))) - -#ifdef PNETCDF_QUILT - CASE ( IO_PNETCDF ) - CALL ext_pnc_write_field ( handle(DataHandle) , TRIM(DateStr), & - TRIM(VarName) , dummy , FieldType , mpi_comm_local , mpi_comm_local, & - DomainDesc , TRIM(MemoryOrder) , TRIM(Stagger), DimNames , & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd, & - Status ) -#endif -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_write_field ( handle(DataHandle) , TRIM(DateStr) , & - TRIM(VarName) , dummy , FieldType , Comm , IOComm, & - DomainDesc , TRIM(MemoryOrder) , TRIM(Stagger) , DimNames , & - DomainStart , DomainEnd , & - DomainStart , DomainEnd , & - DomainStart , DomainEnd , & - Status ) -#endif - CASE DEFAULT - Status = 0 - END SELECT - ENDIF - CASE ( int_iosync ) - CALL int_get_handle_header( obuf(icurs/itypesize), hdrbufsize, itypesize, & - DataHandle , code ) - icurs = icurs + hdrbufsize - CASE DEFAULT - WRITE(mess,*)__LINE__,' quilt: io_sync: bad tag: ', & - get_hdr_tag( obuf(icurs/itypesize) ),' icurs ',& - icurs/itypesize - CALL wrf_error_fatal( mess ) - END SELECT - - ENDDO !} -! Now, we have finshed handling all commands from the latest -! call to retrieve_pieces_of_field(). - - IF (stored_write_record) THEN -! If any field patches have been stored in internal output buffers -! (via a call to store_patch_in_outbuf_pnc()) then call write_outbuf_pnc() -! to write them to disk now. -! NOTE that the I/O server will only have called -! store_patch_in_outbuf() when handling write_field (int_field) -! commands which only arrive AFTER an "iosync" command. -! CALL start_timing -#ifdef PNETCDF_QUILT - CALL write_outbuf_pnc( handle(DataHandle), & - use_package(io_form(DataHandle)), & - mpi_comm_local, mytask_local, & - ntasks_local_group) -#endif -! CALL end_timing( "quilt_pnc: call to write_outbuf_pnc" ) - stored_write_record = .false. - written_record = .true. - ENDIF - -! If one or more "open_for_write_commit" commands were encountered from the -! latest call to retrieve_pieces_of_field() then call the package-specific -! routine to do the commit. - IF (okay_to_commit(DataHandle)) THEN - - SELECT CASE (use_package(io_form(DataHandle))) -#ifdef PNETCDF_QUILT - CASE ( IO_PNETCDF ) - CALL ext_pnc_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_pnc_open_for_write_commit(handle(DataHandle),Status) - okay_to_write(DataHandle) = .true. - ENDIF -#endif -#ifdef NETCDF - CASE ( IO_NETCDF ) - CALL ext_ncd_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_ncd_open_for_write_commit(handle(DataHandle),Status) - okay_to_write(DataHandle) = .true. - ENDIF -#endif -#ifdef INTIO - CASE ( IO_INTIO ) - CALL ext_int_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_int_open_for_write_commit(handle(DataHandle),Status) - okay_to_write(DataHandle) = .true. - ENDIF -#endif -#ifdef YYY - CASE ( IO_YYY ) - CALL ext_yyy_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_yyy_open_for_write_commit(handle(DataHandle),Status) - okay_to_write(DataHandle) = .true. - ENDIF -#endif -#ifdef GRIB1 - CASE ( IO_GRIB1 ) - CALL ext_gr1_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_gr1_open_for_write_commit(handle(DataHandle),Status) - okay_to_write(DataHandle) = .true. - ENDIF -#endif -#ifdef GRIB2 - CASE ( IO_GRIB2 ) - CALL ext_gr2_inquire_filename( handle(DataHandle), fname, fstat, Status ) - IF ( fstat .EQ. WRF_FILE_OPENED_NOT_COMMITTED ) THEN - CALL ext_gr2_open_for_write_commit(handle(DataHandle),Status) - okay_to_write(DataHandle) = .true. - ENDIF -#endif - - CASE DEFAULT - Status = 0 - END SELECT - - okay_to_commit(DataHandle) = .false. - ENDIF -!!endif - -! Retrieve header and all patches for the next field from the internal -! buffers. - CALL retrieve_pieces_of_field ( obuf , VarName, obufsize, sz, retval ) - END DO !} - - DEALLOCATE( obuf ) - - ! flush output files if needed - IF (written_record) THEN -!CALL start_timing - SELECT CASE ( use_package(io_form) ) -#ifdef PNETCDF_QUILT - CASE ( IO_PNETCDF ) - CALL ext_pnc_iosync( handle(DataHandle), Status ) -#endif - CASE DEFAULT - Status = 0 - END SELECT - written_record = .false. -!CALL end_timing( "quilt_pnc: flush" ) - ENDIF - - END DO ! } - - END SUBROUTINE quilt_pnc - -! end of #endif of DM_PARALLEL -#endif - - SUBROUTINE init_module_wrf_quilt - USE module_wrf_error, only: init_module_wrf_error - USE module_driver_constants - USE module_dm, ONLY : compute_mesh,nest_pes_x, nest_pes_y, domain_active_this_task -! -! Both client (compute) and server tasks call this routine to initialize the -! module. Routine setup_quilt_servers() is called from this routine to -! determine which tasks are compute tasks and which are server tasks. Server -! tasks then call routine quilt() and remain there for the rest of the model -! run. Compute tasks return from init_module_wrf_quilt() to perform model -! computations. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_dm, ONLY : compute_mesh,nest_pes_x,nest_pes_y,domain_active_this_task,& - tasks_per_split,comm_start,dm_task_split - IMPLICIT NONE - INCLUDE 'mpif.h' - INTEGER i,j - NAMELIST /namelist_quilt/ nio_tasks_per_group, nio_groups, poll_servers - INTEGER ntasks, mytask, ierr, io_status, id, itask -# if defined(_OPENMP) && defined(MPI2_THREAD_SUPPORT) - INTEGER thread_support_provided, thread_support_requested -#endif - INTEGER num_io_tasks, ncompute_tasks - INTEGER n_x, n_y - INTEGER mpi_comm_here, temp_poll, comdup - INTEGER, ALLOCATABLE :: icolor(:) - LOGICAL mpi_inited - LOGICAL compute_node - LOGICAL esmf_coupling - CHARACTER*256 message - -!!!!! needed to sneak-peek the namelist to get parent_id -! define as temporaries -#include "namelist_defines.inc" - -! Statements that specify the namelists -#include "namelist_statements.inc" - -!TODO: Change this to run-time switch -#ifdef ESMFIO - esmf_coupling = .TRUE. -#else - esmf_coupling = .FALSE. -#endif - quilting_enabled = .FALSE. - IF ( disable_quilt ) RETURN - - DO i = 1,int_num_handles - okay_to_write(i) = .FALSE. - int_handle_in_use(i) = .FALSE. - which_grid_is_handle(i) = -1 - prev_server_for_handle(i) = -1 - int_num_bytes_to_write(i) = 0 - ENDDO - DO j = 1, max_domains - DO i = 1,int_num_handles - server_for_handle(i,j) = 0 - ENDDO - ENDDO - - CALL MPI_INITIALIZED( mpi_inited, ierr ) - IF ( .NOT. mpi_inited ) THEN -# if defined(_OPENMP) && defined(MPI2_THREAD_SUPPORT) - thread_support_requested = MPI_THREAD_FUNNELED - CALL mpi_init_thread ( thread_support_requested, thread_support_provided, ierr ) - IF ( thread_support_provided .lt. thread_support_requested ) THEN - CALL WRF_ERROR_FATAL( "failed to initialize MPI thread support") - ENDIF -# else - CALL mpi_init ( ierr ) -# endif - CALL wrf_set_dm_communicator( MPI_COMM_WORLD ) - CALL wrf_termio_dup(MPI_COMM_WORLD) - ENDIF - CALL wrf_get_dm_communicator( mpi_comm_here ) ! get global communicator - - CALL MPI_Comm_rank ( mpi_comm_here, mytask, ierr ) ; - CALL MPI_Comm_size ( mpi_comm_here, ntasks, ierr ) ; - - IF ( mytask .EQ. 0 ) THEN - OPEN ( unit=27, file="namelist.input", form="formatted", status="old" ) - tasks_per_split = ntasks -! comm_domain = -1 ! by default, domain is always on communicator 1 -! comm_domain(1) = 1 ! by default, domain is always on communicator 1 - READ ( UNIT = 27 , NML = domains , IOSTAT=io_status ) - REWIND(27) - nio_groups = 1 - nio_tasks_per_group = 0 - poll_servers = .false. - READ ( 27 , NML = namelist_quilt, IOSTAT=io_status ) - IF (io_status .NE. 0) THEN - CALL wrf_error_fatal( "ERROR reading namelist namelist_quilt" ) - ENDIF - REWIND(27) - nproc_x = -1 - nproc_y = -1 - READ ( UNIT = 27 , NML = domains , IOSTAT=io_status ) - IF (io_status .NE. 0) THEN - CALL wrf_error_fatal( "ERROR reading namelist domains" ) - ENDIF - CLOSE ( 27 ) - IF ( esmf_coupling ) THEN - IF ( any ( nio_tasks_per_group > 0 ) ) THEN - CALL wrf_error_fatal("frame/module_io_quilt.F: cannot use "// & - "ESMF coupling with quilt tasks") ; - ENDIF - ENDIF - if(poll_servers) then - temp_poll=1 - else - temp_poll=0 - endif - ENDIF - CALL mpi_bcast( parent_id, max_domains , MPI_INTEGER , 0 , mpi_comm_here, ierr ) - CALL mpi_bcast( max_dom, 1 , MPI_INTEGER , 0 , mpi_comm_here, ierr ) - CALL nl_set_max_dom(1,max_dom) - CALL mpi_bcast( nio_tasks_per_group , max_domains , MPI_INTEGER , 0 , mpi_comm_here, ierr ) - CALL mpi_bcast( nio_groups , 1 , MPI_INTEGER , 0 , mpi_comm_here, ierr ) - CALL mpi_bcast( temp_poll , 1 , MPI_INTEGER , 0 , mpi_comm_here, ierr ) - CALL mpi_bcast( nproc_x , 1 , MPI_INTEGER , 0 , mpi_comm_here, ierr ) - CALL mpi_bcast( nproc_y , 1 , MPI_INTEGER , 0 , mpi_comm_here, ierr ) - -! check to make sure that if nio_tasks_per_group is non-zero for any domain it has to be non-zero for all of them - i = MAXVAL(nio_tasks_per_group(1:max_dom)) - IF ( i .GT. 0 .AND. nio_groups .GT. 0 ) THEN - DO id = 1, max_dom - IF ( nio_tasks_per_group(id) .LE. 0 ) THEN - CALL wrf_error_fatal( & -'If nio_tasks_per_group in namelist.input is non-zero for any domain, every active domain must have a non-zero value in nio_tasks_per_group') - ENDIF - ENDDO - ENDIF - - num_io_tasks = 0 - DO id = 1, max_dom - num_io_tasks = num_io_tasks + nio_tasks_per_group(id)*nio_groups - ENDDO - IF ( ntasks-num_io_tasks .LE. 0 ) THEN - WRITE(message,*)'Initing quilting: not enough compute tasks left over after allocating ',num_io_tasks,' i/o servers' - CALL wrf_error_fatal( TRIM(message) ) - ENDIF - IF ( mytask .EQ. 0 ) THEN - OPEN ( unit=27, file="namelist.input", form="formatted", status="old" ) - comm_start = -1 ! use this to find how many communicators have actually been defined - nest_pes_x = 0 ! dimensions of communicator in X and y - nest_pes_y = 0 - IF ( nproc_x .NE. -1 .AND. nproc_y .NE. -1 ) THEN - n_x=nproc_x - n_y=nproc_y - ELSE - CALL compute_mesh( ntasks-num_io_tasks, n_x, n_y ) - ENDIF - comm_start = 0 ! make it so everyone will use same communicator if the dm_task_split namelist is not specified or is empty - nest_pes_x(1:max_dom) = n_x - nest_pes_y(1:max_dom) = n_y - READ ( 27 , NML = dm_task_split, IOSTAT=io_status ) -! we need to sneak-peek the parent_id namelist setting, ,which is in the "domains" section -! of the namelist. That namelist is registry generated, so the registry-generated information -! is #included above. - CLOSE ( 27 ) - ENDIF -!debug write(0,*)'before mpi_bcast' - CALL mpi_bcast( io_status, 1 , MPI_INTEGER , 0 , mpi_comm_here, ierr ) -!debug write(0,*)'after mpi_bcast',io_status - IF ( io_status .NE. 0 ) THEN - ENDIF - CALL mpi_bcast( tasks_per_split, 1 , MPI_INTEGER , 0 , mpi_comm_here, ierr ) - CALL mpi_bcast( comm_start, max_domains , MPI_INTEGER , 0 , mpi_comm_here, ierr ) - CALL mpi_bcast( nest_pes_x, max_domains , MPI_INTEGER , 0 , mpi_comm_here, ierr ) - CALL mpi_bcast( nest_pes_y, max_domains , MPI_INTEGER , 0 , mpi_comm_here, ierr ) - - CALL MPI_Comm_rank ( mpi_comm_here, mytask, ierr ) ; - CALL mpi_x_comm_size( mpi_comm_here, ntasks, ierr ) ; - - -!!!!! end of needed to sneak-peek the namelist - -! set up the arrays associating quilt tasks to domains and check to make sure it will work -! role_for_task( maxprocs ) = 0 if compute, otherwise id of grid for which's it's a server - ALLOCATE(role_for_task(ntasks)) - ! count up the number of I/O tasks needed, each domain has its own set - ncompute_tasks = 0 - DO id = 1, max_dom - IF ( ncompute_tasks < comm_start(id)+nest_pes_x(id)*nest_pes_y(id) ) THEN - ncompute_tasks = comm_start(id)+nest_pes_x(id)*nest_pes_y(id) - ENDIF - ENDDO - num_io_tasks = 0 - DO id = 1, max_dom - num_io_tasks = num_io_tasks + nio_tasks_per_group(id)*nio_groups - ENDDO -!jm IF ( ncompute_tasks + num_io_tasks .NE. ntasks ) THEN -!jm WRITE(message,"('ncompute_tasks(',i9,')+num_io_tasks(',i9,') .NE. ntasks(',i9,')')")ncompute_tasks,num_io_tasks,ntasks - IF ( ncompute_tasks + num_io_tasks .GT. ntasks ) THEN - WRITE(message,"('ncompute_tasks(',i9,')+num_io_tasks(',i9,') .GT. ntasks(',i9,')')")ncompute_tasks,num_io_tasks,ntasks - CALL wrf_error_fatal(TRIM(message)) - ENDIF - DO itask = 1, ncompute_tasks - role_for_task(itask) = 0 - ENDDO - itask = ncompute_tasks + 1 - DO id = 1, max_dom - DO i = 1, nio_tasks_per_group(id)*nio_groups - role_for_task(itask) = id ! mark as a server - itask = itask + 1 - ENDDO - ENDDO - ntasks = itask - 1 -! end set up of role_for_task array - - poll_servers = (temp_poll == 1) - - compute_group_master = .FALSE. - compute_node = .FALSE. - -DO id = 1, max_dom - -! when this returns, mpi_comm_local will be set for server tasks -! and compute tasks but these may be reset by split communicator -! mpi_comm_io_groups will be set for the grid id -! ntasks will be the number of tasks described in role_for_task -! mpi_comm_here will be passed in as all the tasks described in role_for_task - - CALL setup_quilt_servers( id, nio_tasks_per_group, & - role_for_task, & ! this is the "color" array used to split coms - num_io_tasks, & - ncompute_tasks, & - mytask, & - ntasks, & - nio_groups, & - mpi_comm_here, & - mpi_comm_local, & ! only important on i/o servers - mpi_comm_io_groups, & - compute_node ) - -ENDDO - - call init_module_wrf_error(on_io_server=.true.) - - CALL MPI_Comm_dup( mpi_comm_here, comdup, ierr ) - ! throw away the I/O server tasks; mpi_comm_local will now be only all the compute tasks for all domains - CALL MPI_Comm_split(comdup,role_for_task(mytask+1),mytask,mpi_comm_local, ierr ) - - - CALL wrf_set_dm_communicator( mpi_comm_local ) ! split_communicators will see this -! compute node should be true for any compute node and false for every server node - IF ( compute_node ) THEN -#if ( DA_CORE != 1 ) - IF (coupler_on) CALL cpl_set_dm_communicator( mpi_comm_local ) -#endif -#if ( HWRF == 1 ) - call ATM_SET_COMM(mpi_comm_local) -#endif - ELSE -#if ( HWRF == 1 ) - call ATM_LEAVE_COUPLING() -#endif -#if ( DA_CORE != 1 ) - IF (coupler_on) CALL cpl_set_dm_communicator( MPI_COMM_NULL ) -#endif - mpi_comm_local = mpi_comm_local_io_server_tmp - CALL quilt ! will not return on io server tasks - ENDIF -#endif - - RETURN - END SUBROUTINE init_module_wrf_quilt - - -#ifdef IBM_REDUCE_BUG_WORKAROUND - - ! These three subroutines re-implement MPI_Reduce on MPI_INTEGER - ! with OP=MPI_ADD. - - ! This is a workaround for a bug in the IBM MPI implementation. - ! Some MPI processes will get stuck in MPI_Reduce and not - ! return until the PREVIOUS I/O server group finishes writing. - - ! This workaround replaces the MPI_Reduce call with many - ! MPI_Send and MPI_Recv calls that perform the sum on the - ! root of the communicator. - - ! There are two reduce routines: one for a sum of scalars - ! and one for a sum of arrays. The get_reduce_tag generates - ! MPI tags for the communication. - - integer function get_reduce_tag(root,comm) - implicit none - include 'mpif.h' - integer, intent(in) :: comm,root - integer :: i,j, tag, here - integer :: ierr,me,size - - integer, pointer :: nexttags(:) - integer, target :: dummy(1) - character(255) :: message - integer(kind=4) :: comm4,hashed - - integer, parameter :: hashsize = 113 ! should be prime, >max_servers+1 - integer, parameter :: tagloop = 100000 ! number of tags reserved per communicator - integer, parameter :: origin = 1031102 ! lowest tag number we'll use - integer, save :: nexttag=origin ! next tag to use for a new communicator - integer, save :: comms(hashsize)=-1, firsttag(hashsize)=0, curtag(hashsize)=0 - - ! If integers are not four bytes, this implementation will still - ! work, but it may be inefficient (O(N) lookup instead of O(1)). - ! To fix that, an eight byte hash function would be needed, but - ! integers are four bytes in WRF, so that is not a problem right - ! now. - - comm4=comm - call int_hash(comm4,hashed) - hashed=mod(abs(hashed),hashsize)+1 - if(hashed<0) call wrf_error_fatal('hashed<0') - - do i=0,hashsize-1 - j=1+mod(i+hashed-1,hashsize) - - if(firsttag(j)/=0 .and. comms(j)==comm) then - ! Found the communicator - if(curtag(j)-firsttag(j) >= tagloop) then - ! Hit the max tag number so we need to reset. - ! To make sure >tagloop reduces don't happen - ! before someone finishes an old reduce, we - ! have an MPI_Barrier here. - !call wrf_message('Hit tagloop limit so calling mpi_barrier in get_reduce_tag...') - call mpi_barrier(comm,ierr) - if(ierr/=0) call wrf_error_fatal('cannot call mpi_barrier') - !call wrf_message(' ...back from mpi_barrier in get_reduce_tag.') - - curtag(j)=firsttag(j) - endif - - tag=curtag(j) - curtag(j)=tag+1 - get_reduce_tag=tag - return - endif - enddo - - - ! ==================== HANDLE NEW COMMUNICATORS ==================== - - !write(message,'("Found a new communicator ",I0," in get_reduce_tag, so making a tag range for it")') comm - - ! If we get here, the communicator is new to us, so we need - ! to add it to the hash and give it a new tag. - - ! First, figure out where we'll put the tag in the hashtable - here=-1 - do i=0,hashsize-1 - j=1+mod(i+hashed-1,hashsize) - - if(firsttag(j)==0) then - here=j - exit - endif - enddo - if(here==-1) call wrf_error_fatal('no room in hashtable; increase hashsize in get_reduce_tag (should be >max_servers+1)') - - ! Now, find out the new tag's number. To do this, we need to - ! get the next tag number that is not used by any ranks. - - call mpi_comm_rank(comm,me,ierr) - if(ierr/=0) call wrf_error_fatal('cannot call mpi_comm_rank') - - call mpi_comm_size(comm,size,ierr) - if(ierr/=0) call wrf_error_fatal('cannot call mpi_comm_size') - - if(me==root) then - allocate(nexttags(size)) - else - nexttags=>dummy - endif - - call mpi_gather(nexttag,1,MPI_INTEGER,nexttags,1,MPI_INTEGER,root,comm,ierr) - if(ierr/=0) call wrf_error_fatal('cannot call mpi_gather') - - if(me==root) then - nexttag=max(nexttag,maxval(nexttags)) - deallocate(nexttags) - endif - call mpi_bcast(nexttag,1,MPI_INTEGER,root,comm,ierr) - - comms(here)=comm - firsttag(here)=nexttag - curtag(here)=nexttag - get_reduce_tag=nexttag - - !write(message,'("Stored comm ",I0," with tag ",I0,"=",I0," in hash element ",I0)') & - ! comms(here),firsttag(here),curtag(here),here - !call wrf_message(message) - - nexttag=nexttag+tagloop - - end function get_reduce_tag - subroutine reduce_add_int_scl(send,recv,count,root,comm) - implicit none - include 'mpif.h' - integer, intent(in) :: count,root,comm - integer, intent(inout) :: recv - integer, intent(in) :: send - integer :: me, size, ierr, you, temp, tag - character*255 :: message - if(root<0) call wrf_error_fatal('root is less than 0') - - tag=get_reduce_tag(root,comm) - - !write(message,'("Send/recv to tag ",I0)') tag - !call wrf_message(message) - - call mpi_comm_rank(comm,me,ierr) - if(ierr/=0) call wrf_error_fatal('cannot call mpi_comm_rank') - - call mpi_comm_size(comm,size,ierr) - if(ierr/=0) call wrf_error_fatal('cannot call mpi_comm_size') - - if(root>=size) call wrf_error_fatal('root is beyond highest communicator rank') - - if(me==root) then - recv=send - do you=0,size-2 - call mpi_recv(temp,1,MPI_INTEGER,MPI_ANY_SOURCE,tag,comm,MPI_STATUS_IGNORE,ierr) - if(ierr/=0) call wrf_error_fatal('error calling mpi_recv') - recv=recv+temp - enddo - else - call mpi_send(send,1,MPI_INTEGER,root,tag,comm,ierr) - if(ierr/=0) call wrf_error_fatal('error calling mpi_send') - endif - end subroutine reduce_add_int_scl - subroutine reduce_add_int_arr(sendbuf,recvbuf,count,root,comm) - implicit none - include 'mpif.h' - integer, intent(in) :: count,root,comm - integer, intent(in) :: sendbuf(count) - integer, intent(inout) :: recvbuf(count) - integer :: me, size, ierr, you, tempbuf(count), tag - character*255 :: message - - if(root<0) call wrf_error_fatal('root is less than 0') - - tag=get_reduce_tag(root,comm) - - !write(message,'("Send/recv to tag ",I0)') tag - !call wrf_message(message) - - call mpi_comm_rank(comm,me,ierr) - if(ierr/=0) call wrf_error_fatal('cannot call mpi_comm_rank') - - call mpi_comm_size(comm,size,ierr) - if(ierr/=0) call wrf_error_fatal('cannot call mpi_comm_size') - - if(root>=size) call wrf_error_fatal('root is beyond highest communicator rank') - - if(me==root) then - recvbuf=sendbuf - do you=0,size-2 - call mpi_recv(tempbuf,count,MPI_INTEGER,MPI_ANY_SOURCE,tag,comm,MPI_STATUS_IGNORE,ierr) - if(ierr/=0) call wrf_error_fatal('error calling mpi_recv') - recvbuf=recvbuf+tempbuf - enddo - else - call mpi_send(sendbuf,count,MPI_INTEGER,root,tag,comm,ierr) - if(ierr/=0) call wrf_error_fatal('error calling mpi_send') - endif - end subroutine reduce_add_int_arr -#endif - - -END MODULE module_wrf_quilt - -! -! Remaining routines in this file are defined outside of the module -! either to defeat arg/param type checking or to avoid an explicit use -! dependence. -! - -SUBROUTINE disable_quilting -! -! Call this in programs that you never want to be quilting (e.g. real) -! Must call before call to init_module_wrf_quilt(). -! - USE module_wrf_quilt - disable_quilt = .TRUE. - RETURN -END SUBROUTINE disable_quilting - -LOGICAL FUNCTION use_output_servers_for(ioform) -! -! Returns .TRUE. if I/O quilt servers are in-use for write operations -! AND the output servers can handle the given I/O form. If the I/O -! form is 0, then the io form is not considered and the result is the -! same as calling use_output_servers. -! This routine is called only by client (compute) tasks. -! - USE module_wrf_quilt - integer, intent(in) :: ioform - use_output_servers_for = quilting_enabled - use_output_servers_for = ( use_output_servers_for .and. ioform<100 ) - RETURN -END FUNCTION use_output_servers_for - -LOGICAL FUNCTION use_output_servers() -! -! Returns .TRUE. if I/O quilt servers are in-use for write operations. -! This routine is called only by client (compute) tasks. -! - USE module_wrf_quilt - use_output_servers = quilting_enabled - RETURN -END FUNCTION use_output_servers - -LOGICAL FUNCTION use_input_servers() -! -! Returns .TRUE. if I/O quilt servers are in-use for read operations. -! This routine is called only by client (compute) tasks. -! - USE module_wrf_quilt - use_input_servers = .FALSE. - RETURN -END FUNCTION use_input_servers - -SUBROUTINE wrf_quilt_open_for_write_begin( FileName , gridid, Comm_compute, Comm_io, SysDepInfo, & - DataHandle , io_form_arg, Status ) -! -! Instruct the I/O quilt servers to begin data definition ("training") phase -! for writing to WRF dataset FileName. io_form_arg indicates file format. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_wrf_quilt - USE module_state_description, ONLY: IO_PNETCDF - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "intio_tags.h" - CHARACTER *(*), INTENT(IN) :: FileName - INTEGER , INTENT(IN) :: gridid - INTEGER , INTENT(IN) :: Comm_compute , Comm_io - CHARACTER *(*), INTENT(IN) :: SysDepInfo - INTEGER , INTENT(OUT) :: DataHandle - INTEGER , INTENT(IN) :: io_form_arg - INTEGER , INTENT(OUT) :: Status -! Local - CHARACTER*132 :: locFileName, locSysDepInfo - INTEGER i, itypesize, tasks_in_group, ierr, comm_io_group - REAL dummy - INTEGER, EXTERNAL :: use_package - - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_open_for_write_begin' ) - CALL int_get_fresh_handle(i) - okay_to_write(i) = .false. - DataHandle = i - - locFileName = FileName - locSysDepInfo = SysDepInfo - - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - - SELECT CASE(use_package(io_form_arg)) - -#ifdef PNETCDF_QUILT - CASE(IO_PNETCDF) - IF(compute_group_master(1,current_id)) THEN - CALL int_gen_ofwb_header( hdrbuf, hdrbufsize, itypesize, & - locFileName,locSysDepInfo,io_form_arg,& - DataHandle ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - END IF -#endif - CASE DEFAULT - - IF ( wrf_dm_on_monitor() ) THEN - CALL int_gen_ofwb_header( hdrbuf, hdrbufsize, itypesize, & - locFileName,locSysDepInfo,io_form_arg,DataHandle ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF - - END SELECT - - which_grid_is_handle(DataHandle) = gridid - iserver = get_server_id ( DataHandle ) -!write(0,*)'wrf_quilt_open_for_write_begin DataHandle = ', DataHandle -!write(0,*)'wrf_quilt_open_for_write_begin filename = ', Trim(filename) -!write(0,*)'wrf_quilt_open_for_write_begin sysdepinfo = ', Trim(sysdepinfo) -!write(0,*)'wrf_quilt_open_for_write_begin iserver = ', iserver - CALL get_mpi_comm_io_groups( comm_io_group , iserver ) -!write(0,*)'wrf_quilt_open_for_write_begin comm_io_group = ', comm_io_group - - CALL mpi_x_comm_size( comm_io_group , tasks_in_group , ierr ) -!write(0,*)'mpi_x_comm_size tasks_in_group ',tasks_in_group, ierr - -!!JMTIMING CALL start_timing - ! send the size of my local buffer to the i/o task (reduced_dummy doesnt mean anything on client side) - reduced = 0 - reduced(1) = hdrbufsize -#ifdef PNETCDF_QUILT - IF ( compute_group_master(1,current_id) ) reduced(2) = i -#else - IF ( wrf_dm_on_monitor() ) reduced(2) = i -#endif -!write(0,*)'calling mpi_x_reduce in wrf_quilt_open_for_write_begin ' - CALL mpi_x_reduce( reduced, reduced_dummy, 2, MPI_INTEGER, MPI_SUM, tasks_in_group-1, comm_io_group, ierr ) -!!JMTIMING CALL end_timing("MPI_Reduce in wrf_quilt_open_for_write_begin") - - ! send data to the i/o processor - CALL collect_on_comm_debug(__FILE__,__LINE__, comm_io_group, & - onebyte, & - hdrbuf, hdrbufsize , & - dummy, 0 ) - - Status = 0 - - -#endif - RETURN -END SUBROUTINE wrf_quilt_open_for_write_begin - -SUBROUTINE wrf_quilt_open_for_write_commit( DataHandle , Status ) -! -! Instruct the I/O quilt servers to switch an internal flag to enable output -! for the dataset referenced by DataHandle. The call to -! wrf_quilt_open_for_write_commit() must be paired with a call to -! wrf_quilt_open_for_write_begin(). -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_wrf_quilt - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "intio_tags.h" - INTEGER , INTENT(IN ) :: DataHandle - INTEGER , INTENT(OUT) :: Status - INTEGER i, itypesize, tasks_in_group, ierr, comm_io_group - REAL dummy - - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_open_for_write_commit' ) - IF ( DataHandle .GE. 1 .AND. DataHandle .LE. int_num_handles ) THEN - IF ( int_handle_in_use( DataHandle ) ) THEN - okay_to_write( DataHandle ) = .true. - ENDIF - ENDIF - - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - -#ifdef PNETCDF_QUILT -!ARP Only want one command to be received by each IO server when using -!ARP parallel IO - IF(compute_group_master(1,current_id)) THEN - CALL int_gen_handle_header( hdrbuf, hdrbufsize, itypesize, & - DataHandle, int_open_for_write_commit ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - END IF -#else - - IF ( wrf_dm_on_monitor() ) THEN - CALL int_gen_handle_header( hdrbuf, hdrbufsize, itypesize, & - DataHandle, int_open_for_write_commit ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#endif - - iserver = get_server_id ( DataHandle ) - CALL get_mpi_comm_io_groups( comm_io_group , iserver ) - - CALL mpi_x_comm_size( comm_io_group , tasks_in_group , ierr ) - -!!JMTIMING CALL start_timing - ! send the size of my local buffer to the i/o task (reduced_dummy doesnt mean anything on client side) - reduced = 0 - reduced(1) = hdrbufsize -#ifdef PNETCDF_QUILT - IF ( compute_group_master(1,current_id) ) reduced(2) = DataHandle -#else - IF ( wrf_dm_on_monitor() ) reduced(2) = DataHandle -#endif - CALL mpi_x_reduce( reduced, reduced_dummy, 2, MPI_INTEGER, MPI_SUM, tasks_in_group-1, comm_io_group, ierr ) -!!JMTIMING CALL end_timing("MPI_Reduce in wrf_quilt_open_for_write_commit") - - ! send data to the i/o processor - CALL collect_on_comm_debug(__FILE__,__LINE__, comm_io_group, & - onebyte, & - hdrbuf, hdrbufsize , & - dummy, 0 ) - - Status = 0 - -#endif - RETURN -END SUBROUTINE wrf_quilt_open_for_write_commit - -SUBROUTINE wrf_quilt_open_for_read ( FileName , Comm_compute, Comm_io, SysDepInfo, & - DataHandle , Status ) -! -! Instruct the I/O quilt servers to open WRF dataset FileName for reading. -! This routine is called only by client (compute) tasks. -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - CHARACTER *(*), INTENT(IN) :: FileName - INTEGER , INTENT(IN) :: Comm_compute , Comm_io - CHARACTER *(*), INTENT(IN) :: SysDepInfo - INTEGER , INTENT(OUT) :: DataHandle - INTEGER , INTENT(OUT) :: Status - - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_open_for_read' ) - DataHandle = -1 - Status = -1 - CALL wrf_error_fatal ( "frame/module_io_quilt.F: wrf_quilt_open_for_read not yet supported" ) -#endif - RETURN -END SUBROUTINE wrf_quilt_open_for_read - -SUBROUTINE wrf_quilt_inquire_opened ( DataHandle, FileName , FileStatus, Status ) -! -! Inquire if the dataset referenced by DataHandle is open. -! Does not require communication with I/O servers. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_wrf_quilt - IMPLICIT NONE -#include "wrf_io_flags.h" - INTEGER , INTENT(IN) :: DataHandle - CHARACTER *(*), INTENT(IN) :: FileName - INTEGER , INTENT(OUT) :: FileStatus - INTEGER , INTENT(OUT) :: Status - - Status = 0 - - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_inquire_opened' ) - IF ( DataHandle .GE. 1 .AND. DataHandle .LE. int_num_handles ) THEN - IF ( int_handle_in_use( DataHandle ) ) THEN - IF ( okay_to_write( DataHandle ) ) THEN - FileStatus = WRF_FILE_OPENED_FOR_WRITE - ENDIF - ENDIF - ENDIF - Status = 0 - -#endif - RETURN -END SUBROUTINE wrf_quilt_inquire_opened - -SUBROUTINE wrf_quilt_inquire_filename ( DataHandle, FileName , FileStatus, Status ) -! -! Return the Filename and FileStatus associated with DataHandle. -! Does not require communication with I/O servers. -! -! Note that the current implementation does not actually return FileName. -! Currenlty, WRF does not use this returned value. Fixing this would simply -! require saving the file names on the client tasks in an array similar to -! okay_to_write(). -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_wrf_quilt - IMPLICIT NONE -#include "wrf_io_flags.h" - INTEGER , INTENT(IN) :: DataHandle - CHARACTER *(*), INTENT(OUT) :: FileName - INTEGER , INTENT(OUT) :: FileStatus - INTEGER , INTENT(OUT) :: Status - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_inquire_filename' ) - Status = 0 - IF ( DataHandle .GE. 1 .AND. DataHandle .LE. int_num_handles ) THEN - IF ( int_handle_in_use( DataHandle ) ) THEN - IF ( okay_to_write( DataHandle ) ) THEN - FileStatus = WRF_FILE_OPENED_FOR_WRITE - ELSE - FileStatus = WRF_FILE_OPENED_NOT_COMMITTED - ENDIF - ELSE - FileStatus = WRF_FILE_NOT_OPENED - ENDIF - Status = 0 - FileName = "bogusfornow" - ELSE - Status = -1 - ENDIF -#endif - RETURN -END SUBROUTINE wrf_quilt_inquire_filename - -SUBROUTINE wrf_quilt_iosync ( DataHandle, Status ) -! -! Instruct the I/O quilt servers to synchronize the disk copy of a dataset -! with memory buffers. -! -! After the "iosync" header (request) is sent to the I/O quilt server, -! the compute tasks will then send the entire contents (headers and data) of -! int_local_output_buffer to their I/O quilt server. This communication is -! done in subroutine send_to_io_quilt_servers(). After the I/O quilt servers -! receive this data, they will write all accumulated fields to disk. -! -! Significant time may be required for the I/O quilt servers to organize -! fields and write them to disk. Therefore, the "iosync" request should be -! sent only when the compute tasks are ready to run for a while without -! needing to communicate with the servers. Otherwise, the compute tasks -! will end up waiting for the servers to finish writing to disk, thus wasting -! any performance benefits of having servers at all. -! -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && ! defined (STUBMPI) - USE module_wrf_quilt - IMPLICIT NONE - include "mpif.h" - INTEGER , INTENT(IN) :: DataHandle - INTEGER , INTENT(OUT) :: Status - - INTEGER locsize , itypesize - INTEGER ierr, tasks_in_group, comm_io_group, dummy, i, rank - - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_iosync' ) - -! CALL start_timing - IF ( associated ( int_local_output_buffer ) ) THEN - - iserver = get_server_id ( DataHandle ) - CALL get_mpi_comm_io_groups( comm_io_group , iserver ) - - CALL mpi_x_comm_size( comm_io_group , tasks_in_group , ierr ) - - locsize = int_num_bytes_to_write(DataHandle) - -! CALL start_timing - ! send the size of my local buffer to the i/o task (reduced_dummy doesnt mean anything on client side) - reduced = 0 - reduced(1) = locsize -#ifdef PNETCDF_QUILT -! ARP Only want one command per IOServer if doing parallel IO - IF ( compute_group_master(1,current_id) ) reduced(2) = DataHandle -#else - IF ( wrf_dm_on_monitor() ) reduced(2) = DataHandle -#endif - CALL mpi_x_reduce( reduced, reduced_dummy, 2, MPI_INTEGER, MPI_SUM, tasks_in_group-1, comm_io_group, ierr ) -! CALL end_timing("MPI_Reduce in wrf_quilt_iosync") - - ! send data to the i/o processor -#ifdef DEREF_KLUDGE - CALL collect_on_comm_debug(__FILE__,__LINE__, comm_io_group, & - onebyte, & - int_local_output_buffer(1), locsize , & - dummy, 0 ) -#else - CALL collect_on_comm_debug(__FILE__,__LINE__, comm_io_group, & - onebyte, & - int_local_output_buffer, locsize , & - dummy, 0 ) -#endif - - int_local_output_cursor = 1 -! int_num_bytes_to_write(DataHandle) = 0 - DEALLOCATE ( int_local_output_buffer ) - NULLIFY ( int_local_output_buffer ) - ELSE - CALL wrf_message ("frame/module_io_quilt.F: wrf_quilt_iosync: no buffer allocated") - ENDIF -! CALL end_timing("wrf_quilt_iosync") - Status = 0 -#endif - RETURN -END SUBROUTINE wrf_quilt_iosync - -SUBROUTINE wrf_quilt_ioclose ( DataHandle, Status ) -! -! Instruct the I/O quilt servers to close the dataset referenced by -! DataHandle. -! This routine also clears the client file handle and, if needed, deallocates -! int_local_output_buffer. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && ! defined( STUBMPI) - USE module_wrf_quilt - USE module_timing - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "intio_tags.h" - INTEGER , INTENT(IN) :: DataHandle - INTEGER , INTENT(OUT) :: Status - INTEGER i, itypesize, tasks_in_group, comm_io_group, ierr - REAL dummy - -!!JMTIMING CALL start_timing - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_ioclose' ) - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - -! If we're using pnetcdf then each IO server will need to receive the -! handle just once as there is -! no longer a reduce over the IO servers to get it. -#ifdef PNETCDF_QUILT - IF ( compute_group_master(1,current_id) )THEN - CALL int_gen_handle_header( hdrbuf, hdrbufsize, itypesize, & - DataHandle, int_ioclose ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#else - IF ( wrf_dm_on_monitor() ) THEN - CALL int_gen_handle_header( hdrbuf, hdrbufsize, itypesize, & - DataHandle , int_ioclose ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#endif - - iserver = get_server_id ( DataHandle ) - CALL get_mpi_comm_io_groups( comm_io_group , iserver ) - - CALL mpi_x_comm_size( comm_io_group , tasks_in_group , ierr ) - -!!JMTIMING CALL start_timing - ! send the size of my local buffer to the i/o task (reduced_dummy doesnt mean anything on client side) - reduced = 0 -#ifdef PNETCDF_QUILT -! If we're using pnetcdf then each IO server will need the handle as there is -! no longer a reduce over the IO servers to get it. - IF ( compute_group_master(1,current_id) ) reduced(2) = DataHandle -#else - IF ( wrf_dm_on_monitor() ) reduced(2) = DataHandle -#endif - CALL mpi_x_reduce( reduced, reduced_dummy, 2, MPI_INTEGER, MPI_SUM, tasks_in_group-1, comm_io_group, ierr ) -!!JMTIMING CALL end_timing("MPI_Reduce in ioclose") - -#if 0 - ! send data to the i/o processor -!!JMTIMING CALL start_timing - CALL collect_on_comm_debug(__FILE__,__LINE__, comm_io_group, & - onebyte, & - hdrbuf, hdrbufsize , & - dummy, 0 ) -!!JMTIMING CALL end_timing("collect_on_comm in io_close") -#endif - - int_handle_in_use(DataHandle) = .false. - CALL set_server_id( DataHandle, 0 ) - okay_to_write(DataHandle) = .false. - okay_to_commit(DataHandle) = .false. - int_local_output_cursor = 1 - int_num_bytes_to_write(DataHandle) = 0 - IF ( associated ( int_local_output_buffer ) ) THEN - DEALLOCATE ( int_local_output_buffer ) - NULLIFY ( int_local_output_buffer ) - ENDIF - - Status = 0 -!!JMTIMING CALL end_timing( "wrf_quilt_ioclose" ) - -#endif - RETURN -END SUBROUTINE wrf_quilt_ioclose - -SUBROUTINE wrf_quilt_ioexit( Status ) -! -! Instruct the I/O quilt servers to shut down the WRF I/O system. -! Do not call any wrf_quilt_*() routines after this routine has been called. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && ! defined (STUBMPI ) - USE module_wrf_quilt - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "intio_tags.h" - INTEGER , INTENT(OUT) :: Status - INTEGER :: DataHandle, actual_iserver - INTEGER i, itypesize, tasks_in_group, comm_io_group, me, ierr - REAL dummy - - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_ioexit' ) - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - -!ARPDBG - potential bug. Have no access to what type of IO is being used for -! this data so if PNETCDF_QUILT is defined then we assume that's what's being used. -#ifdef PNETCDF_QUILT -!ARP Send the ioexit message just once to each IOServer when using parallel IO - IF( compute_group_master(1,current_id) ) THEN - CALL int_gen_handle_header( hdrbuf, hdrbufsize, itypesize, & - DataHandle, int_ioexit ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - END IF -#else - - IF ( wrf_dm_on_monitor() ) THEN - CALL int_gen_handle_header( hdrbuf, hdrbufsize, itypesize, & - DataHandle , int_ioexit ) ! Handle is dummy - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#endif - - DO iserver = 1, nio_groups - if(poll_servers) then - ! We're using server polling mode, so we must call - ! *_find_server to receive the mpi_ssend sent by the servers, - ! otherwise WRF will hang at the mpi_x_reduce below. - - call wrf_quilt_find_server(actual_iserver) - - ! The actual_iserver is now set to the next available I/O server. - ! That may not be the same as iserver, but that's okay as long - ! as we run through this loop exactly nio_groups times. - else - ! Not using server polling, so just access servers in numeric order. - actual_iserver=iserver - endif - - CALL get_mpi_comm_io_groups( comm_io_group , actual_iserver ) - - CALL mpi_x_comm_size( comm_io_group , tasks_in_group , ierr ) - CALL mpi_comm_rank( comm_io_group , me , ierr ) - -! BY SENDING A NEGATIVE SIZE WE GET THE SERVERS TO SHUT DOWN - hdrbufsize = -100 - reduced = 0 - IF ( me .eq. 0 ) reduced(1) = hdrbufsize - CALL mpi_x_reduce( reduced, reduced_dummy, 2, MPI_INTEGER, MPI_SUM, tasks_in_group-1, comm_io_group, ierr ) - - ENDDO - Status = 0 - -#endif - RETURN -END SUBROUTINE wrf_quilt_ioexit - -SUBROUTINE wrf_quilt_get_next_time ( DataHandle, DateStr, Status ) -! -! Instruct the I/O quilt servers to return the next time stamp. -! This is not yet supported. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && ! defined (STUBMPI) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) :: DateStr - INTEGER :: Status -#endif - RETURN -END SUBROUTINE wrf_quilt_get_next_time - -SUBROUTINE wrf_quilt_get_previous_time ( DataHandle, DateStr, Status ) -! -! Instruct the I/O quilt servers to return the previous time stamp. -! This is not yet supported. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && ! defined (STUBMPI) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) :: DateStr - INTEGER :: Status -#endif - RETURN -END SUBROUTINE wrf_quilt_get_previous_time - -SUBROUTINE wrf_quilt_set_time ( DataHandle, Data, Status ) -! -! Instruct the I/O quilt servers to set the time stamp in the dataset -! referenced by DataHandle. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_wrf_quilt - USE module_state_description, ONLY: IO_PNETCDF - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "intio_tags.h" - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Data - INTEGER :: Status - INTEGER i, itypesize, tasks_in_group, ierr, comm_io_group - REAL dummy - INTEGER :: Count - INTEGER, EXTERNAL :: use_package -! - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_set_time' ) - - IF ( DataHandle .GE. 1 .AND. DataHandle .LE. int_num_handles ) THEN - IF ( int_handle_in_use( DataHandle ) ) THEN - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - Count = 0 ! there is no count for character strings - -!ARPDBG - potential bug. Have no access to what type of IO is being used for -! this data so if PNETCDF_QUILT is defined then we assume that's what's being used. -#ifdef PNETCDF_QUILT - IF(compute_group_master(1,current_id) )THEN -! Only want to send one time header to each IO server as -! can't tell that's what they are on the IO servers themselves - therefore use -! the compute_group_master process. - CALL int_gen_ti_header_char( hdrbuf, hdrbufsize, itypesize, & - DataHandle, "TIMESTAMP", "", Data, int_set_time ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - END IF -#else - IF ( wrf_dm_on_monitor() ) THEN - CALL int_gen_ti_header_char( hdrbuf, hdrbufsize, itypesize, & - DataHandle, "TIMESTAMP", "", Data, int_set_time ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#endif - - iserver = get_server_id ( DataHandle ) - CALL get_mpi_comm_io_groups( comm_io_group , iserver ) - CALL mpi_x_comm_size( comm_io_group , tasks_in_group , ierr ) - - ! send the size of my local buffer to the i/o task (reduced_dummy doesnt mean anything on client side) - reduced = 0 - reduced(1) = hdrbufsize -#ifdef PNETCDF_QUILT - IF ( compute_group_master(1,current_id) ) reduced(2) = DataHandle -#else - IF ( wrf_dm_on_monitor() ) reduced(2) = DataHandle -#endif - CALL mpi_x_reduce( reduced, reduced_dummy, 2, MPI_INTEGER, MPI_SUM, tasks_in_group-1, comm_io_group, ierr ) - ! send data to the i/o processor - CALL collect_on_comm_debug(__FILE__,__LINE__, comm_io_group, & - onebyte, & - hdrbuf, hdrbufsize , & - dummy, 0 ) - ENDIF - ENDIF - -#endif -RETURN -END SUBROUTINE wrf_quilt_set_time - -SUBROUTINE wrf_quilt_get_next_var ( DataHandle, VarName, Status ) -! -! When reading, instruct the I/O quilt servers to return the name of the next -! variable in the current time frame. -! This is not yet supported. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) :: VarName - INTEGER :: Status -#endif - RETURN -END SUBROUTINE wrf_quilt_get_next_var - -SUBROUTINE wrf_quilt_get_dom_ti_real ( DataHandle,Element, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! independent domain metadata named "Element" -! from the open dataset described by DataHandle. -! Metadata of type real are -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. - -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - REAL, INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Outcount - INTEGER :: Status - CALL wrf_message('wrf_quilt_get_dom_ti_real not supported yet') -#endif -RETURN -END SUBROUTINE wrf_quilt_get_dom_ti_real - -SUBROUTINE wrf_quilt_put_dom_ti_real ( DataHandle,Element, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time independent -! domain metadata named "Element" -! to the open dataset described by DataHandle. -! Metadata of type real are -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_wrf_quilt - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "intio_tags.h" - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - REAL , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -!Local - CHARACTER*132 :: locElement - INTEGER i, typesize, itypesize, tasks_in_group, ierr, comm_io_group - REAL dummy -! -!!JMTIMING CALL start_timing -!write(0,*)__FILE__,__LINE__,trim(element),count - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_put_dom_ti_real' ) - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - locElement = Element - - IF ( DataHandle .GE. 1 .AND. DataHandle .LE. int_num_handles ) THEN - IF ( int_handle_in_use( DataHandle ) ) THEN - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - CALL MPI_TYPE_SIZE( MPI_REAL, typesize, ierr ) - -#ifdef PNETCDF_QUILT - IF ( compute_group_master(1,current_id) ) THEN - CALL int_gen_ti_header( hdrbuf, hdrbufsize, itypesize, typesize, & - DataHandle, locElement, Data, Count, int_dom_ti_real ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#else - IF ( wrf_dm_on_monitor() ) THEN - CALL int_gen_ti_header( hdrbuf, hdrbufsize, itypesize, typesize, & - DataHandle, locElement, Data, Count, int_dom_ti_real ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#endif - - iserver = get_server_id ( DataHandle ) - CALL get_mpi_comm_io_groups( comm_io_group , iserver ) - CALL mpi_x_comm_size( comm_io_group , tasks_in_group , ierr ) - -!!JMTIMING CALL start_timing - ! send the size of my local buffer to the i/o task (reduced_dummy doesnt mean anything on client side) - reduced = 0 - reduced(1) = hdrbufsize -#ifdef PNETCDF_QUILT - IF( compute_group_master(1,current_id) ) reduced(2) = DataHandle -#else - IF ( wrf_dm_on_monitor() ) reduced(2) = DataHandle -#endif - CALL mpi_x_reduce( reduced, reduced_dummy, 2, MPI_INTEGER, MPI_SUM, tasks_in_group-1, comm_io_group, ierr ) -!!JMTIMING CALL end_timing("MPI_Reduce in wrf_quilt_put_dom_ti_real") - ! send data to the i/o processor - CALL collect_on_comm_debug(__FILE__,__LINE__, comm_io_group, & - onebyte, & - hdrbuf, hdrbufsize , & - dummy, 0 ) - ENDIF - ENDIF - - Status = 0 -!!JMTIMING CALL end_timing("wrf_quilt_put_dom_ti_real") -#endif -RETURN -END SUBROUTINE wrf_quilt_put_dom_ti_real - -SUBROUTINE wrf_quilt_get_dom_ti_double ( DataHandle,Element, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! independent domain metadata named "Element" -! from the open dataset described by DataHandle. -! Metadata of type double are -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - real*8 :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status - CALL wrf_error_fatal('wrf_quilt_get_dom_ti_double not supported yet') -#endif -RETURN -END SUBROUTINE wrf_quilt_get_dom_ti_double - -SUBROUTINE wrf_quilt_put_dom_ti_double ( DataHandle,Element, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time independent -! domain metadata named "Element" -! to the open dataset described by DataHandle. -! Metadata of type double are -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - REAL*8 , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status - CALL wrf_error_fatal('wrf_quilt_put_dom_ti_double not supported yet') -#endif -RETURN -END SUBROUTINE wrf_quilt_put_dom_ti_double - -SUBROUTINE wrf_quilt_get_dom_ti_integer ( DataHandle,Element, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! independent domain metadata named "Element" -! from the open dataset described by DataHandle. -! Metadata of type integer are -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - integer :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status - CALL wrf_message('wrf_quilt_get_dom_ti_integer not supported yet') -#endif -RETURN -END SUBROUTINE wrf_quilt_get_dom_ti_integer - -SUBROUTINE wrf_quilt_put_dom_ti_integer ( DataHandle,Element, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time independent -! domain metadata named "Element" -! to the open dataset described by DataHandle. -! Metadata of type integer are -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_wrf_quilt - USE module_state_description, ONLY: IO_PNETCDF - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "intio_tags.h" - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - INTEGER , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -! Local - CHARACTER*132 :: locElement - INTEGER i, typesize, itypesize, tasks_in_group, ierr, comm_io_group - REAL dummy - INTEGER, EXTERNAL :: use_package -! - -!!JMTIMING CALL start_timing - locElement = Element - - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_put_dom_ti_integer' ) -!write(0,*)__FILE__,__LINE__,trim(element),count - - IF ( DataHandle .GE. 1 .AND. DataHandle .LE. int_num_handles ) THEN - IF ( int_handle_in_use( DataHandle ) ) THEN - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - CALL MPI_TYPE_SIZE( MPI_INTEGER, typesize, ierr ) - -!ARPDBG - potential bug. Have no access to what type of IO is being used for -! this data so if PNETCDF_QUILT is defined then we assume that's what's being used. -#ifdef PNETCDF_QUILT - IF ( compute_group_master(1,current_id) )THEN - CALL int_gen_ti_header( hdrbuf, hdrbufsize, itypesize, typesize, & - DataHandle, locElement, Data, Count, & - int_dom_ti_integer ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#else - IF ( wrf_dm_on_monitor() ) THEN - CALL int_gen_ti_header( hdrbuf, hdrbufsize, itypesize, typesize, & - DataHandle, locElement, Data, Count, & - int_dom_ti_integer ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#endif - - iserver = get_server_id ( DataHandle ) - CALL get_mpi_comm_io_groups( comm_io_group , iserver ) - CALL mpi_x_comm_size( comm_io_group , tasks_in_group , ierr ) - -!!JMTIMING CALL start_timing - ! send the size of my local buffer to the i/o task (reduced_dummy doesnt mean anything on client side) - reduced = 0 - reduced(1) = hdrbufsize -#ifdef PNETCDF_QUILT - IF ( compute_group_master(1,current_id) ) reduced(2) = DataHandle -#else - IF ( wrf_dm_on_monitor() ) reduced(2) = DataHandle -#endif - CALL mpi_x_reduce( reduced, reduced_dummy, 2, MPI_INTEGER, MPI_SUM, tasks_in_group-1, comm_io_group, ierr ) - -!!JMTIMING CALL end_timing("MPI_Reduce in wrf_quilt_put_dom_ti_integer") - ! send data to the i/o processor - CALL collect_on_comm_debug(__FILE__,__LINE__, comm_io_group, & - onebyte, & - hdrbuf, hdrbufsize , & - dummy, 0 ) - ENDIF - ENDIF - CALL wrf_debug ( DEBUG_LVL, 'returning from wrf_quilt_put_dom_ti_integer' ) -!!JMTIMING CALL end_timing("wrf_quilt_put_dom_ti_integer" ) - -#endif -RETURN -END SUBROUTINE wrf_quilt_put_dom_ti_integer - -SUBROUTINE wrf_quilt_get_dom_ti_logical ( DataHandle,Element, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! independent domain metadata named "Element" -! from the open dataset described by DataHandle. -! Metadata of type logical are -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - logical :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -! CALL wrf_message('wrf_quilt_get_dom_ti_logical not supported yet') -#endif -RETURN -END SUBROUTINE wrf_quilt_get_dom_ti_logical - -SUBROUTINE wrf_quilt_put_dom_ti_logical ( DataHandle,Element, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time independent -! domain metadata named "Element" -! to the open dataset described by DataHandle. -! Metadata of type logical are -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - logical , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -! Local - INTEGER i - INTEGER one_or_zero(Count) - - DO i = 1, Count - IF ( Data(i) ) THEN - one_or_zero(i) = 1 - ELSE - one_or_zero(i) = 0 - ENDIF - ENDDO - - CALL wrf_quilt_put_dom_ti_integer ( DataHandle,Element, one_or_zero, Count, Status ) -#endif -RETURN -END SUBROUTINE wrf_quilt_put_dom_ti_logical - -SUBROUTINE wrf_quilt_get_dom_ti_char ( DataHandle,Element, Data, Status ) -! -! Instruct the I/O quilt servers to attempt to read time independent -! domain metadata named "Element" -! from the open dataset described by DataHandle. -! Metadata of type char are -! stored in string Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) :: Data - INTEGER :: Status - CALL wrf_message('wrf_quilt_get_dom_ti_char not supported yet') -#endif -RETURN -END SUBROUTINE wrf_quilt_get_dom_ti_char - -SUBROUTINE wrf_quilt_put_dom_ti_char ( DataHandle, Element, Data, Status ) -! -! Instruct the I/O quilt servers to write time independent -! domain metadata named "Element" -! to the open dataset described by DataHandle. -! Metadata of type char are -! copied from string Data. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_wrf_quilt - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "intio_tags.h" - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: Data - INTEGER :: Status - INTEGER i, itypesize, tasks_in_group, ierr, comm_io_group, me - REAL dummy -! -!!JMTIMING CALL start_timing - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_put_dom_ti_char' ) -!write(0,*)__FILE__,__LINE__,trim(element) - - IF ( DataHandle .GE. 1 .AND. DataHandle .LE. int_num_handles ) THEN - IF ( int_handle_in_use( DataHandle ) ) THEN - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - -!ARPDBG - potential bug. Have no access to what type of IO is being used for -! this data so if PNETCDF_QUILT is defined then we assume that's what's being used. -#ifdef PNETCDF_QUILT - IF(compute_group_master(1,current_id))THEN - CALL int_gen_ti_header_char( hdrbuf, hdrbufsize, itypesize, & - DataHandle, Element, "", Data, & - int_dom_ti_char ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - END IF -#else - IF ( wrf_dm_on_monitor() ) THEN - CALL int_gen_ti_header_char( hdrbuf, hdrbufsize, itypesize, & - DataHandle, Element, "", Data, int_dom_ti_char ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#endif - - iserver = get_server_id ( DataHandle ) -! write(0,*)'wrf_quilt_put_dom_ti_char ',iserver - CALL get_mpi_comm_io_groups( comm_io_group , iserver ) - CALL mpi_x_comm_size( comm_io_group , tasks_in_group , ierr ) - ! send the size of my local buffer to the i/o task (obufsize doesnt mean anything here) -!!JMTIMING! CALL start_timing -!write(0,*)'calling MPI_Barrier' -! CALL MPI_Barrier( mpi_comm_local, ierr ) -!write(0,*)'back from MPI_Barrier' -!!JMTIMING! CALL end_timing("MPI_Barrier in wrf_quilt_put_dom_ti_char") - -!!JMTIMING CALL start_timing - ! send the size of my local buffer to the i/o task (reduced_dummy doesnt mean anything on client side) - reduced_dummy = 0 - reduced = 0 - reduced(1) = hdrbufsize -#ifdef PNETCDF_QUILT - IF(compute_group_master(1,current_id)) reduced(2) = DataHandle -#else - IF ( wrf_dm_on_monitor() ) reduced(2) = DataHandle -#endif -!call mpi_comm_rank( comm_io_group , me, ierr ) - - CALL mpi_x_reduce( reduced, reduced_dummy, 2, MPI_INTEGER, MPI_SUM, tasks_in_group-1, comm_io_group, ierr ) - -!!JMTIMING CALL end_timing("MPI_Reduce in wrf_quilt_put_dom_ti_char") - ! send data to the i/o processor -!!JMTIMING CALL start_timing - - CALL collect_on_comm_debug(__FILE__,__LINE__, comm_io_group, & - onebyte, & - hdrbuf, hdrbufsize , & - dummy, 0 ) -!!JMTIMING CALL end_timing("collect_on_comm in wrf_quilt_put_dom_ti_char") - ENDIF - ENDIF -!!JMTIMING CALL end_timing("wrf_quilt_put_dom_ti_char") - -#endif -RETURN -END SUBROUTINE wrf_quilt_put_dom_ti_char - -SUBROUTINE wrf_quilt_get_dom_td_real ( DataHandle,Element, DateStr, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! dependent domain metadata named "Element" valid at time DateStr -! from the open dataset described by DataHandle. -! Metadata of type real are -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - real :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_dom_td_real - -SUBROUTINE wrf_quilt_put_dom_td_real ( DataHandle,Element, DateStr, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time dependent -! domain metadata named "Element" valid at time DateStr -! to the open dataset described by DataHandle. -! Metadata of type real are -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - real , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_put_dom_td_real - -SUBROUTINE wrf_quilt_get_dom_td_double ( DataHandle,Element, DateStr, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! dependent domain metadata named "Element" valid at time DateStr -! from the open dataset described by DataHandle. -! Metadata of type double are -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - real*8 :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif - CALL wrf_error_fatal('wrf_quilt_get_dom_td_double not supported yet') -RETURN -END SUBROUTINE wrf_quilt_get_dom_td_double - -SUBROUTINE wrf_quilt_put_dom_td_double ( DataHandle,Element, DateStr, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time dependent -! domain metadata named "Element" valid at time DateStr -! to the open dataset described by DataHandle. -! Metadata of type double are -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - real*8 , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif - CALL wrf_error_fatal('wrf_quilt_put_dom_td_double not supported yet') -RETURN -END SUBROUTINE wrf_quilt_put_dom_td_double - -SUBROUTINE wrf_quilt_get_dom_td_integer ( DataHandle,Element, DateStr, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! dependent domain metadata named "Element" valid at time DateStr -! from the open dataset described by DataHandle. -! Metadata of type integer are -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - integer :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_dom_td_integer - -SUBROUTINE wrf_quilt_put_dom_td_integer ( DataHandle,Element, DateStr, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time dependent -! domain metadata named "Element" valid at time DateStr -! to the open dataset described by DataHandle. -! Metadata of type integer are -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - integer , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_put_dom_td_integer - -SUBROUTINE wrf_quilt_get_dom_td_logical ( DataHandle,Element, DateStr, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! dependent domain metadata named "Element" valid at time DateStr -! from the open dataset described by DataHandle. -! Metadata of type logical are -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - logical :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_dom_td_logical - -SUBROUTINE wrf_quilt_put_dom_td_logical ( DataHandle,Element, DateStr, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time dependent -! domain metadata named "Element" valid at time DateStr -! to the open dataset described by DataHandle. -! Metadata of type logical are -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - logical , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_put_dom_td_logical - -SUBROUTINE wrf_quilt_get_dom_td_char ( DataHandle,Element, DateStr, Data, Status ) -! -! Instruct the I/O quilt servers to attempt to read time dependent -! domain metadata named "Element" valid at time DateStr -! from the open dataset described by DataHandle. -! Metadata of type char are -! stored in string Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) :: Data - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_dom_td_char - -SUBROUTINE wrf_quilt_put_dom_td_char ( DataHandle,Element, DateStr, Data, Status ) -! -! Instruct $he I/O quilt servers to write time dependent -! domain metadata named "Element" valid at time DateStr -! to the open dataset described by DataHandle. -! Metadata of type char are -! copied from string Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: Data - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_put_dom_td_char - -SUBROUTINE wrf_quilt_get_var_ti_real ( DataHandle,Element, Varname, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! independent attribute "Element" of variable "Varname" -! from the open dataset described by DataHandle. -! Attribute of type real is -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: VarName - real :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_var_ti_real - -SUBROUTINE wrf_quilt_put_var_ti_real ( DataHandle,Element, Varname, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time independent -! attribute "Element" of variable "Varname" -! to the open dataset described by DataHandle. -! Attribute of type real is -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: VarName - real , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_put_var_ti_real - -SUBROUTINE wrf_quilt_get_var_ti_double ( DataHandle,Element, Varname, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! independent attribute "Element" of variable "Varname" -! from the open dataset described by DataHandle. -! Attribute of type double is -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: VarName - real*8 :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif - CALL wrf_error_fatal('wrf_quilt_get_var_ti_double not supported yet') -RETURN -END SUBROUTINE wrf_quilt_get_var_ti_double - -SUBROUTINE wrf_quilt_put_var_ti_double ( DataHandle,Element, Varname, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time independent -! attribute "Element" of variable "Varname" -! to the open dataset described by DataHandle. -! Attribute of type double is -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: VarName - real*8 , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif - CALL wrf_error_fatal('wrf_quilt_put_var_ti_double not supported yet') -RETURN -END SUBROUTINE wrf_quilt_put_var_ti_double - -SUBROUTINE wrf_quilt_get_var_ti_integer ( DataHandle,Element, Varname, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! independent attribute "Element" of variable "Varname" -! from the open dataset described by DataHandle. -! Attribute of type integer is -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: VarName - integer :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_var_ti_integer - -SUBROUTINE wrf_quilt_put_var_ti_integer ( DataHandle,Element, Varname, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time independent -! attribute "Element" of variable "Varname" -! to the open dataset described by DataHandle. -! Attribute of type integer is -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: VarName - integer , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_put_var_ti_integer - -SUBROUTINE wrf_quilt_get_var_ti_logical ( DataHandle,Element, Varname, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! independent attribute "Element" of variable "Varname" -! from the open dataset described by DataHandle. -! Attribute of type logical is -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: VarName - logical :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_var_ti_logical - -SUBROUTINE wrf_quilt_put_var_ti_logical ( DataHandle,Element, Varname, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time independent -! attribute "Element" of variable "Varname" -! to the open dataset described by DataHandle. -! Attribute of type logical is -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: VarName - logical , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_put_var_ti_logical - -SUBROUTINE wrf_quilt_get_var_ti_char ( DataHandle,Element, Varname, Data, Status ) -! -! Instruct the I/O quilt servers to attempt to read time independent -! attribute "Element" of variable "Varname" -! from the open dataset described by DataHandle. -! Attribute of type char is -! stored in string Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: VarName - CHARACTER*(*) :: Data - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_var_ti_char - -SUBROUTINE wrf_quilt_put_var_ti_char ( DataHandle,Element, Varname, Data, Status ) -! -! Instruct the I/O quilt servers to write time independent -! attribute "Element" of variable "Varname" -! to the open dataset described by DataHandle. -! Attribute of type char is -! copied from string Data. -! This routine is called only by client (compute) tasks. -! - -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_wrf_quilt - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "intio_tags.h" - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: VarName - CHARACTER*(*) , INTENT(IN) :: Data - INTEGER :: Status - INTEGER i, itypesize, tasks_in_group, ierr, comm_io_group - REAL dummy -! - -!!JMTIMING CALL start_timing - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_put_var_ti_char' ) -!write(0,*)__FILE__,__LINE__,trim(varname),trim(element) - - IF ( DataHandle .GE. 1 .AND. DataHandle .LE. int_num_handles ) THEN - IF ( int_handle_in_use( DataHandle ) ) THEN - CALL MPI_TYPE_SIZE( MPI_INTEGER, itypesize, ierr ) - -#ifdef PNETCDF_QUILT - IF ( compute_group_master(1,current_id) ) THEN - CALL int_gen_ti_header_char( hdrbuf, hdrbufsize, itypesize, & - DataHandle, TRIM(Element), & - TRIM(VarName), TRIM(Data), int_var_ti_char ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#else - IF ( wrf_dm_on_monitor() ) THEN - CALL int_gen_ti_header_char( hdrbuf, hdrbufsize, itypesize, & - DataHandle, TRIM(Element), & - TRIM(VarName), TRIM(Data), int_var_ti_char ) - ELSE - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#endif - - iserver = get_server_id ( DataHandle ) - CALL get_mpi_comm_io_groups( comm_io_group , iserver ) - CALL mpi_x_comm_size( comm_io_group , tasks_in_group , ierr ) - -!!JMTIMING CALL start_timing - ! send the size of my local buffer to the i/o task (reduced_dummy doesnt mean anything on client side) - reduced = 0 - reduced(1) = hdrbufsize -#ifdef PNETCDF_QUILT - IF ( compute_group_master(1,current_id) ) reduced(2) = DataHandle -#else - IF ( wrf_dm_on_monitor() ) reduced(2) = DataHandle -#endif - CALL mpi_x_reduce( reduced, reduced_dummy, 2, MPI_INTEGER, MPI_SUM, tasks_in_group-1, comm_io_group, ierr ) -!!JMTIMING CALL end_timing("MPI_Reduce in wrf_quilt_put_var_ti_char") - ! send data to the i/o processor - CALL collect_on_comm_debug(__FILE__,__LINE__, comm_io_group, & - onebyte, & - hdrbuf, hdrbufsize , & - dummy, 0 ) - ENDIF - ENDIF -!!JMTIMING CALL end_timing("wrf_quilt_put_dom_ti_char" ) - -#endif -RETURN -END SUBROUTINE wrf_quilt_put_var_ti_char - -SUBROUTINE wrf_quilt_get_var_td_real ( DataHandle,Element, DateStr,Varname, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! dependent attribute "Element" of variable "Varname" valid at time DateStr -! from the open dataset described by DataHandle. -! Attribute of type real is -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: VarName - real :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_var_td_real - -SUBROUTINE wrf_quilt_put_var_td_real ( DataHandle,Element, DateStr,Varname, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time dependent -! attribute "Element" of variable "Varname" valid at time DateStr -! to the open dataset described by DataHandle. -! Attribute of type real is -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: VarName - real , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_put_var_td_real - -SUBROUTINE wrf_quilt_get_var_td_double ( DataHandle,Element, DateStr,Varname, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! dependent attribute "Element" of variable "Varname" valid at time DateStr -! from the open dataset described by DataHandle. -! Attribute of type double is -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: VarName - real*8 :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif - CALL wrf_error_fatal('wrf_quilt_get_var_td_double not supported yet') -RETURN -END SUBROUTINE wrf_quilt_get_var_td_double - -SUBROUTINE wrf_quilt_put_var_td_double ( DataHandle,Element, DateStr,Varname, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time dependent -! attribute "Element" of variable "Varname" valid at time DateStr -! to the open dataset described by DataHandle. -! Attribute of type double is -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: VarName - real*8 , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif - CALL wrf_error_fatal('wrf_quilt_put_var_td_double not supported yet') -RETURN -END SUBROUTINE wrf_quilt_put_var_td_double - -SUBROUTINE wrf_quilt_get_var_td_integer ( DataHandle,Element, DateStr,Varname, Data, Count, Outcount,Status) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! dependent attribute "Element" of variable "Varname" valid at time DateStr -! from the open dataset described by DataHandle. -! Attribute of type integer is -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: VarName - integer :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_var_td_integer - -SUBROUTINE wrf_quilt_put_var_td_integer ( DataHandle,Element, DateStr,Varname, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time dependent -! attribute "Element" of variable "Varname" valid at time DateStr -! to the open dataset described by DataHandle. -! Attribute of type integer is -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: VarName - integer , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_put_var_td_integer - -SUBROUTINE wrf_quilt_get_var_td_logical ( DataHandle,Element, DateStr,Varname, Data, Count, Outcount, Status ) -! -! Instruct the I/O quilt servers to attempt to read Count words of time -! dependent attribute "Element" of variable "Varname" valid at time DateStr -! from the open dataset described by DataHandle. -! Attribute of type logical is -! stored in array Data. -! Actual number of words read is returned in OutCount. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: VarName - logical :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: OutCount - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_var_td_logical - -SUBROUTINE wrf_quilt_put_var_td_logical ( DataHandle,Element, DateStr,Varname, Data, Count, Status ) -! -! Instruct the I/O quilt servers to write Count words of time dependent -! attribute "Element" of variable "Varname" valid at time DateStr -! to the open dataset described by DataHandle. -! Attribute of type logical is -! copied from array Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: VarName - logical , INTENT(IN) :: Data(*) - INTEGER , INTENT(IN) :: Count - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_put_var_td_logical - -SUBROUTINE wrf_quilt_get_var_td_char ( DataHandle,Element, DateStr,Varname, Data, Status ) -! -! Instruct the I/O quilt servers to attempt to read time dependent -! attribute "Element" of variable "Varname" valid at time DateStr -! from the open dataset described by DataHandle. -! Attribute of type char is -! stored in string Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: VarName - CHARACTER*(*) :: Data - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_var_td_char - -SUBROUTINE wrf_quilt_put_var_td_char ( DataHandle,Element, DateStr,Varname, Data, Status ) -! -! Instruct the I/O quilt servers to write time dependent -! attribute "Element" of variable "Varname" valid at time DateStr -! to the open dataset described by DataHandle. -! Attribute of type char is -! copied from string Data. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: Element - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: VarName - CHARACTER*(*) , INTENT(IN) :: Data - INTEGER :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_put_var_td_char - -SUBROUTINE wrf_quilt_read_field ( DataHandle , DateStr , VarName , Field , FieldType , Comm , IOComm, & - DomainDesc , MemoryOrder , Stagger , DimNames , & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd , & - Status ) -! -! Instruct the I/O quilt servers to read the variable named VarName from the -! dataset pointed to by DataHandle. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(INOUT) :: DateStr - CHARACTER*(*) , INTENT(INOUT) :: VarName - INTEGER , INTENT(INOUT) :: Field(*) - integer ,intent(in) :: FieldType - integer ,intent(inout) :: Comm - integer ,intent(inout) :: IOComm - integer ,intent(in) :: DomainDesc - character*(*) ,intent(in) :: MemoryOrder - character*(*) ,intent(in) :: Stagger - character*(*) , dimension (*) ,intent(in) :: DimNames - integer ,dimension(*) ,intent(in) :: DomainStart, DomainEnd - integer ,dimension(*) ,intent(in) :: MemoryStart, MemoryEnd - integer ,dimension(*) ,intent(in) :: PatchStart, PatchEnd - integer ,intent(out) :: Status - Status = 0 -#endif -RETURN -END SUBROUTINE wrf_quilt_read_field - -SUBROUTINE wrf_quilt_write_field ( DataHandle , DateStr , VarName , Field , FieldType , Comm , IOComm, & - DomainDesc , MemoryOrder , Stagger , DimNames , & - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd , & - Status ) -! -! Prepare instructions for the I/O quilt servers to write the variable named -! VarName to the dataset pointed to by DataHandle. -! -! During a "training" write this routine accumulates number and sizes of -! messages that will be sent to the I/O server associated with this compute -! (client) task. -! -! During a "real" write, this routine begins by allocating -! int_local_output_buffer if it has not already been allocated. Sizes -! accumulated during "training" are used to determine how big -! int_local_output_buffer must be. This routine then stores "int_field" -! headers and associated field data in int_local_output_buffer. The contents -! of int_local_output_buffer are actually sent to the I/O quilt server in -! routine wrf_quilt_iosync(). This scheme allows output of multiple variables -! to be aggregated into a single "iosync" operation. -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_state_description - USE module_wrf_quilt - IMPLICIT NONE - INCLUDE 'mpif.h' -#include "wrf_io_flags.h" - INTEGER , INTENT(IN) :: DataHandle - CHARACTER*(*) , INTENT(IN) :: DateStr - CHARACTER*(*) , INTENT(IN) :: VarName -! INTEGER , INTENT(IN) :: Field(*) - integer ,intent(in) :: FieldType - integer ,intent(inout) :: Comm - integer ,intent(inout) :: IOComm - integer ,intent(in) :: DomainDesc - character*(*) ,intent(in) :: MemoryOrder - character*(*) ,intent(in) :: Stagger - character*(*) , dimension (*) ,intent(in) :: DimNames - integer ,dimension(*) ,intent(in) :: DomainStart, DomainEnd - integer ,dimension(*) ,intent(in) :: MemoryStart, MemoryEnd - integer ,dimension(*) ,intent(in) :: PatchStart, PatchEnd - integer ,intent(out) :: Status - - integer ii,jj,kk,myrank - - REAL, DIMENSION( MemoryStart(1):MemoryEnd(1), & - MemoryStart(2):MemoryEnd(2), & - MemoryStart(3):MemoryEnd(3) ) :: Field - INTEGER locsize , typesize, itypesize - INTEGER ierr, tasks_in_group, comm_io_group, dummy, i - INTEGER, EXTERNAL :: use_package - -!!ARPTIMING CALL start_timing - CALL wrf_debug ( DEBUG_LVL, 'in wrf_quilt_write_field' ) - - IF ( .NOT. (DataHandle .GE. 1 .AND. DataHandle .LE. int_num_handles) ) THEN - CALL wrf_error_fatal("frame/module_io_quilt.F: wrf_quilt_write_field: invalid data handle" ) - ENDIF - IF ( .NOT. int_handle_in_use( DataHandle ) ) THEN - CALL wrf_error_fatal("frame/module_io_quilt.F: wrf_quilt_write_field: DataHandle not opened" ) - ENDIF - - locsize = (PatchEnd(1)-PatchStart(1)+1)* & - (PatchEnd(2)-PatchStart(2)+1)* & - (PatchEnd(3)-PatchStart(3)+1) - - CALL mpi_type_size( MPI_INTEGER, itypesize, ierr ) - ! Note that the WRF_DOUBLE branch of this IF statement must come first since - ! WRF_FLOAT is set equal to WRF_DOUBLE during autopromotion builds. - IF ( FieldType .EQ. WRF_DOUBLE ) THEN - CALL mpi_type_size( MPI_DOUBLE_PRECISION, typesize, ierr ) - ELSE IF ( FieldType .EQ. WRF_FLOAT ) THEN - CALL mpi_type_size( MPI_REAL, typesize, ierr ) - ELSE IF ( FieldType .EQ. WRF_INTEGER ) THEN - CALL mpi_type_size( MPI_INTEGER, typesize, ierr ) - ELSE IF ( FieldType .EQ. WRF_LOGICAL ) THEN - CALL mpi_type_size( MPI_LOGICAL, typesize, ierr ) - ENDIF - - IF ( .NOT. okay_to_write( DataHandle ) ) THEN - - ! This is a "training" write. - ! it is not okay to actually write; what we do here is just "bookkeep": count up - ! the number and size of messages that we will output to io server associated with - ! this task - - CALL int_gen_write_field_header ( hdrbuf, hdrbufsize, itypesize, typesize, & - DataHandle , DateStr , VarName , Field , FieldType , Comm , IOComm, & - 333933 , MemoryOrder , Stagger , DimNames , & ! 333933 means training; magic number - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd ) - - int_num_bytes_to_write(DataHandle) = int_num_bytes_to_write(DataHandle) + locsize * typesize + hdrbufsize - - ! Send the hdr for the write in case the interface is calling the I/O API in "learn" mode - - iserver = get_server_id ( DataHandle ) - CALL get_mpi_comm_io_groups( comm_io_group , iserver ) - ! send the size of my local buffer to the i/o task (obufsize doesnt mean anything here) - - CALL mpi_x_comm_size( comm_io_group , tasks_in_group , ierr ) - -#if 0 - IF ( .NOT. wrf_dm_on_monitor() ) THEN ! only one task in compute grid sends this message; send noops on others - CALL int_gen_noop_header( hdrbuf, hdrbufsize, itypesize ) - ENDIF -#endif - - -!!ARPTIMING CALL start_timing - ! send the size of my local buffer to the i/o task (reduced_dummy doesnt mean anything on client side) - reduced = 0 - reduced(1) = hdrbufsize -#ifdef PNETCDF_QUILT - IF ( compute_group_master(1,current_id) ) reduced(2) = DataHandle -#else - IF ( wrf_dm_on_monitor() ) reduced(2) = DataHandle -#endif - CALL mpi_x_reduce( reduced, reduced_dummy, 2, MPI_INTEGER, MPI_SUM, tasks_in_group-1, comm_io_group, ierr ) -!!ARPTIMING CALL end_timing("MPI_Reduce in wrf_quilt_write_field dryrun") - ! send data to the i/o processor - - CALL collect_on_comm_debug(__FILE__,__LINE__, comm_io_group, & - onebyte, & - hdrbuf, hdrbufsize , & - dummy, 0 ) - - ELSE - - IF ( .NOT. associated( int_local_output_buffer ) ) THEN - ALLOCATE ( int_local_output_buffer( (int_num_bytes_to_write( DataHandle )+1)/itypesize ), Stat=ierr ) - IF(ierr /= 0)THEN - CALL wrf_error_fatal("frame/module_io_quilt.F: wrf_quilt_write_field: allocate of int_local_output_buffer failed" ) - END IF - int_local_output_cursor = 1 - ENDIF - iserver = get_server_id ( DataHandle ) - - ! This is NOT a "training" write. It is OK to write now. - CALL int_gen_write_field_header ( hdrbuf, hdrbufsize, itypesize, typesize, & - DataHandle , DateStr , VarName , Field , FieldType , Comm , IOComm, & - 0 , MemoryOrder , Stagger , DimNames , & ! non-333933 means okay to write; magic number - DomainStart , DomainEnd , & - MemoryStart , MemoryEnd , & - PatchStart , PatchEnd ) - - ! Pack header into int_local_output_buffer. It will be sent to the - ! I/O servers during the next "iosync" operation. -#ifdef DEREF_KLUDGE - CALL int_pack_data ( hdrbuf , hdrbufsize , int_local_output_buffer(1), int_local_output_cursor ) -#else - CALL int_pack_data ( hdrbuf , hdrbufsize , int_local_output_buffer, int_local_output_cursor ) -#endif - - ! Pack field data into int_local_output_buffer. It will be sent to the - ! I/O servers during the next "iosync" operation. -#ifdef DEREF_KLUDGE - CALL int_pack_data ( Field(PatchStart(1):PatchEnd(1),PatchStart(2):PatchEnd(2),PatchStart(3):PatchEnd(3) ), & - locsize * typesize , int_local_output_buffer(1), int_local_output_cursor ) -#else - CALL int_pack_data ( Field(PatchStart(1):PatchEnd(1),PatchStart(2):PatchEnd(2),PatchStart(3):PatchEnd(3) ), & - locsize * typesize , int_local_output_buffer, int_local_output_cursor ) -#endif - - ENDIF - Status = 0 -!!ARPTIMING CALL end_timing("wrf_quilt_write_field") - -#endif - RETURN -END SUBROUTINE wrf_quilt_write_field - -SUBROUTINE wrf_quilt_get_var_info ( DataHandle , VarName , NDim , MemoryOrder , Stagger , & - DomainStart , DomainEnd , Status ) -! -! This routine applies only to a dataset that is open for read. It instructs -! the I/O quilt servers to return information about variable VarName. -! This routine is called only by client (compute) tasks. -! -! This is not yet supported. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - IMPLICIT NONE - integer ,intent(in) :: DataHandle - character*(*) ,intent(in) :: VarName - integer :: NDim - character*(*) :: MemoryOrder - character*(*) :: Stagger - integer ,dimension(*) :: DomainStart, DomainEnd - integer :: Status -#endif -RETURN -END SUBROUTINE wrf_quilt_get_var_info - -subroutine wrf_quilt_find_server(iserver) - - ! This routine is called by the compute processes when they need an - ! I/O server to write out a new file. Upon return, this routine will - ! set iserver to the next available I/O server group. - - ! A mpi_recv to all of mpi_comm_avail is used to implement this, and - ! that recv will not return until an I/O server group calls - ! wrf_quilt_server_ready to signal that it is ready for a new file. - -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - use module_wrf_quilt, only : in_avail, mpi_comm_avail, mpi_comm_local - - implicit none - INCLUDE 'mpif.h' - integer, intent(inout) :: iserver - integer :: ierr - character(255) :: message - - call wrf_message('Polling I/O servers...') - - if(in_avail) then - call mpi_recv(iserver,1,MPI_INTEGER,MPI_ANY_SOURCE,0,mpi_comm_avail,MPI_STATUS_IGNORE,ierr) - if(ierr/=0) then - call wrf_error_fatal('mpi_recv failed in wrf_quilt_find_server') - endif - endif - - call mpi_bcast(iserver,1,MPI_INTEGER,0,mpi_comm_local,ierr) - if(ierr/=0) then - call wrf_error_fatal('mpi_bcast failed in wrf_quilt_find_server') - endif - - write(message,'("I/O server ",I0," is ready for operations.")') iserver - call wrf_message(message) - -#endif - -end subroutine wrf_quilt_find_server -subroutine wrf_quilt_server_ready() - - ! This routine is called by the I/O server group's master process once the - ! I/O server group is done writing its current file, and is waiting for - ! a new one. This information is passed to the monitor process by a - ! blocking send from the I/O server master process to the monitor. - - ! All processes in an I/O group must call this routine, and this routine - ! will not return (in any process) until the monitor process signals - ! that it wants the I/O server group to write a file. That signal is - ! sent in a call to wrf_quilt_find_server on the compute processes. - -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - use module_wrf_quilt, only : mpi_comm_local, in_avail, availrank, mpi_comm_avail - - implicit none - INCLUDE 'mpif.h' - integer :: ierr - character*255 :: message - - write(message,*) 'Entering wrf_quilt_server_ready.' - call wrf_debug(1,message) - - call mpi_barrier(mpi_comm_local,ierr) - if(ierr/=0) then - call wrf_error_fatal('mpi_barrier failed in wrf_quilt_server_ready') - endif - - if(in_avail) then - write(message,'("mpi_ssend ioserver=",I0," in wrf_quilt_server_ready")') availrank - call wrf_debug(1,message) - call mpi_ssend(availrank,1,MPI_INTEGER,0,0,mpi_comm_avail,ierr) - if(ierr/=0) then - call wrf_error_fatal('mpi_ssend failed in wrf_quilt_server_ready') - endif - endif - - call mpi_barrier(mpi_comm_local,ierr) - if(ierr/=0) then - call wrf_error_fatal('mpi_barrier failed in wrf_quilt_server_ready') - endif - - write(message,*) 'Leaving wrf_quilt_server_ready.' - call wrf_debug(1,message) -#endif - -end subroutine wrf_quilt_server_ready - -SUBROUTINE get_mpi_comm_io_groups( retval, isrvr ) -! -! This routine returns the compute+io communicator to which this -! compute task belongs for I/O server group "isrvr". -! This routine is called only by client (compute) tasks. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_wrf_quilt - USE module_dm, ONLY : current_id - IMPLICIT NONE - INTEGER, INTENT(IN ) :: isrvr - INTEGER, INTENT(OUT) :: retval - retval = mpi_comm_io_groups(isrvr,current_id) -#endif - RETURN -END SUBROUTINE get_mpi_comm_io_groups - -SUBROUTINE get_nio_tasks_in_group( id, retval ) -! -! This routine returns the number of I/O server tasks in each -! I/O server group. It can be called by both clients and -! servers. -! -#if defined( DM_PARALLEL ) && !defined( STUBMPI ) - USE module_wrf_quilt - IMPLICIT NONE - INTEGER, INTENT(IN) :: id - INTEGER, INTENT(OUT) :: retval - retval = nio_tasks_per_group(id) -#endif - RETURN -END SUBROUTINE get_nio_tasks_in_group - -SUBROUTINE collect_on_comm_debug(file,line, comm_io_group, & - sze, & - hdrbuf, hdrbufsize , & - outbuf, outbufsize ) - IMPLICIT NONE - CHARACTER*(*) file - INTEGER line - INTEGER comm_io_group - INTEGER sze - INTEGER hdrbuf(*), outbuf(*) - INTEGER hdrbufsize, outbufsize - - !write(0,*)'collect_on_comm_debug ',trim(file),line,sze,hdrbufsize,outbufsize - CALL collect_on_comm( comm_io_group, & - sze, & - hdrbuf, hdrbufsize , & - outbuf, outbufsize ) - !write(0,*)trim(file),line,'returning' - RETURN -END - - -SUBROUTINE collect_on_comm_debug2(file,line,var,tag,sz,hdr_rec_size, & - comm_io_group, & - sze, & - hdrbuf, hdrbufsize , & - outbuf, outbufsize ) - IMPLICIT NONE - CHARACTER*(*) file,var - INTEGER line,tag,sz,hdr_rec_size - INTEGER comm_io_group - INTEGER sze - INTEGER hdrbuf(*), outbuf(*) - INTEGER hdrbufsize, outbufsize - -! write(0,*)'collect_on_comm_debug2 ',trim(file),line,trim(var),tag,sz,hdr_rec_size,sze,hdrbufsize,outbufsize - CALL collect_on_comm( comm_io_group, & - sze, & - hdrbuf, hdrbufsize , & - outbuf, outbufsize ) -! write(0,*)'collect_on_comm_debug2 ',trim(file),line,'returning for ',trim(var) - RETURN -END diff --git a/frame/module_nesting.F b/frame/module_nesting.F index d26899d10a..2ba9a61abc 100644 --- a/frame/module_nesting.F +++ b/frame/module_nesting.F @@ -32,13 +32,6 @@ LOGICAL FUNCTION nests_to_open ( parent , nestid_ret , kid_ret ) kid_ret = 0 nests_to_open = .false. CALL nl_get_max_dom( 1, max_dom ) -#if (NMM_CORE == 1) -# if (NMM_NEST == 0) - IF ( max_dom > 1 ) THEN - CALL wrf_error_fatal( 'WRF-NMM compiled without nesting; set max_dom to 1 in namelist.input' ) - END IF -# endif -#endif DO nestid = 2, max_dom CALL nl_get_grid_allowed( nestid, grid_allowed ) IF ( .NOT. active_domain( nestid ) .AND. grid_allowed ) THEN diff --git a/frame/module_wrf_error.F b/frame/module_wrf_error.F index be71ce7af7..073446173d 100644 --- a/frame/module_wrf_error.F +++ b/frame/module_wrf_error.F @@ -37,13 +37,13 @@ MODULE module_wrf_error ! write(0,...). If FALSE, messages are not sent to stderr. ! This is set to FALSE automatically when buffering is enabled. - ! Defaults: Non-MPI configurations and HWRF turn OFF stderr. - ! MPI configurations other than HWRF turn ON stderr. + ! Defaults: Non-MPI configurations turn OFF stderr. + ! MPI configurations turn ON stderr. -#if defined( DM_PARALLEL ) && ! defined( STUBMPI ) && !(HWRF == 1) +#if defined( DM_PARALLEL ) && ! defined( STUBMPI ) integer :: stderrlog=1 ! 1/T = send to write(0,...) if buffered=0 #else - integer :: stderrlog=0! 1/T = send to write(0,...) if buffered=0 + integer :: stderrlog=0 ! 1/T = send to write(0,...) if buffered=0 #endif INTEGER, PARAMETER :: wrf_log_flush=0, wrf_log_set_buffer_size=1, & @@ -95,10 +95,10 @@ SUBROUTINE init_module_wrf_error(on_io_server) io_servers_silent=.false. buffer_size=0 - ! MPI configurations default to stderr logging, except for HWRF. + ! MPI configurations default to stderr logging. ! Non-MPI does not log to stderr. (Note that fatal errors always ! are sent to both stdout and stderr regardless of config.) -#if defined( DM_PARALLEL ) && ! defined( STUBMPI ) && !(HWRF == 1) +#if defined( DM_PARALLEL ) && ! defined( STUBMPI ) stderr_logging=1 #else stderr_logging=0 diff --git a/main/Makefile b/main/Makefile index 718582df15..5e8e1c5cfe 100644 --- a/main/Makefile +++ b/main/Makefile @@ -38,15 +38,6 @@ convert_em : convert_em.o $(RANLIB) $(RLFLAGS) $(LIBWRFLIB) $(LD) -o convert_em.exe $(LDFLAGS) convert_em.o $(LIBWRFLIB) $(LIB) -convert_nmm : convert_nmm.o - $(RANLIB) $(RLFLAGS) $(LIBWRFLIB) - $(FC) -o convert_nmm.exe $(LDFLAGS) convert_nmm.o $(LIBWRFLIB) $(LIB) - -real_nmm : real_nmm.o - ( cd ../dyn_nmm ; $(MAKE) module_initialize_real.o ) - $(RANLIB) $(RLFLAGS) $(LIBWRFLIB) - $(FC) -o real_nmm.exe $(LDFLAGS) real_nmm.o $(LIBWRFLIB) $(LIB) - module_initialize : ../dyn_$(SOLVER)/module_initialize_$(IDEAL_CASE).o # ( cd ../dyn_$(SOLVER) ; $(MAKE) module_initialize_$(IDEAL_CASE).o ) diff --git a/main/depend.common b/main/depend.common index 0b3c4da8a3..84682d8856 100644 --- a/main/depend.common +++ b/main/depend.common @@ -341,8 +341,6 @@ module_cu_ntiedtke.o: ../share/module_model_constants.o module_ra_gfdleta.o: ../frame/module_dm.o \ module_mp_etanew.o -module_ra_HWRF.o: ../frame/module_dm.o module_mp_HWRF.o - module_ra_rrtm.o: ../frame/module_wrf_error.o \ module_ra_clWRF_support.o \ ../frame/module_dm.o @@ -523,7 +521,6 @@ module_physics_init.o : \ module_ra_sw.o \ module_ra_gsfcsw.o \ module_ra_gfdleta.o \ - module_ra_HWRF.o \ module_ra_hs.o \ module_ra_flg.o \ module_sf_sfclay.o \ @@ -582,7 +579,6 @@ module_physics_init.o : \ module_mp_wsm6.o \ module_mp_etanew.o \ module_mp_fer_hires.o \ - module_mp_HWRF.o \ module_mp_fast_sbm.o \ module_fdda_psufddagd.o \ module_fdda_spnudging.o \ @@ -618,7 +614,7 @@ module_microphysics_driver.o: \ $(PHYS_MP) \ module_mp_wsm3.o module_mp_wsm5.o \ module_mp_wsm6.o module_mp_etanew.o \ - module_mp_fer_hires.o module_mp_HWRF.o \ + module_mp_fer_hires.o \ module_mp_thompson.o \ module_mp_gsfcgce.o \ module_mp_gsfcgce_4ice_nuwrf.o \ @@ -716,7 +712,6 @@ module_radiation_driver.o: \ module_ra_cam.o \ module_ra_farms.o \ module_ra_gfdleta.o \ - module_ra_HWRF.o \ module_ra_hs.o \ module_ra_goddard.o \ module_ra_flg.o \ @@ -1213,17 +1208,6 @@ module_random.o: bobrand.o # DEPENDENCIES for main -convert_nmm.o: \ - ../frame/module_machine.o \ - ../frame/module_domain.o \ - ../frame/module_driver_constants.o \ - ../frame/module_configure.o \ - ../frame/module_timing.o \ - ../frame/module_dm.o \ - ../share/module_bc.o \ - ../share/module_io_domain.o \ - $(ESMF_MOD_DEPENDENCE) - convert_em.o: \ ../frame/module_machine.o \ ../frame/module_domain.o \ @@ -1246,12 +1230,6 @@ ideal_em.o: \ ../dyn_$(SOLVER)/$(CASE_MODULE) \ $(ESMF_MOD_DEPENDENCE) -ideal_nmm.o: \ - ../dyn_$(SOLVER)/$(CASE_MODULE) \ - ../share/module_optional_input.o \ - ../share/module_io_domain.o \ - ../share/input_wrf.o - ndown_em.o: \ ../frame/module_machine.o \ ../frame/module_domain.o \ diff --git a/phys/Makefile b/phys/Makefile index 1c3fc064d4..77da6da046 100644 --- a/phys/Makefile +++ b/phys/Makefile @@ -90,7 +90,6 @@ MODULES = \ module_mp_wsm7.o \ module_mp_etanew.o \ module_mp_fer_hires.o \ - module_mp_HWRF.o \ module_mp_thompson.o \ module_mp_SBM_polar_radar.o \ module_mp_full_sbm.o \ @@ -125,7 +124,6 @@ MODULES = \ module_ra_cam.o \ module_ra_gfdleta.o \ module_ra_flg.o \ - module_ra_HWRF.o \ module_ra_hs.o \ module_ra_eclipse.o \ module_ra_aerosol.o \ @@ -224,33 +222,18 @@ DIAGNOSTIC_MODULES_EM = \ module_diag_trad_fields.o \ module_diag_solar.o -DIAGNOSTIC_MODULES_NMM = \ - module_diag_refl.o - OBJS = -NMM_MODULES = - LIBTARGET = physics TARGETDIR = ./ $(LIBTARGET) : - if [ $(WRF_NMM_CORE) -eq 1 ] ; then \ - $(MAKE) $(J) nmm_contrib ; \ - $(AR) $(ARFLAGS) ../main/$(LIBWRFLIB) $(MODULES) $(OBJS) \ - $(NMM_OBJS) $(NMM_MODULES) \ - $(DIAGNOSTIC_MODULES_NMM) ; \ - else \ - $(MAKE) $(J) non_nmm ; \ - $(AR) $(ARFLAGS) ../main/$(LIBWRFLIB) $(MODULES) $(OBJS) \ - $(FIRE_MODULES) \ - $(DIAGNOSTIC_MODULES_EM) ; \ - fi + $(MAKE) $(J) non_nmm ; \ + $(AR) $(ARFLAGS) ../main/$(LIBWRFLIB) $(MODULES) $(OBJS) \ + $(FIRE_MODULES) $(DIAGNOSTIC_MODULES_EM) include ../configure.wrf -nmm_contrib : $(NMM_OBJS) $(NMM_MODULES) $(MODULES) $(OBJS) $(DIAGNOSTIC_MODULES_NMM) - non_nmm : $(MODULES) $(FIRE_MODULES) $(WIND_MODULES) $(OBJS) $(DIAGNOSTIC_MODULES_EM) clean: diff --git a/phys/module_cumulus_driver.F b/phys/module_cumulus_driver.F index f01b44758f..c6d3b1f361 100644 --- a/phys/module_cumulus_driver.F +++ b/phys/module_cumulus_driver.F @@ -1113,13 +1113,8 @@ SUBROUTINE cumulus_driver(grid & ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte & ,PERIODIC_X=periodic_x,PERIODIC_Y=periodic_y & ! optionals -#if (NMM_CORE == 1 ) - ,RTHCUTEN=RTHCUTEN ,RTHFTEN=forcet & - ,RQICUTEN=RQICUTEN ,RQVFTEN=forceq & -#else ,RTHCUTEN=RTHCUTEN ,RTHFTEN=RTHFTEN & ,RQICUTEN=RQICUTEN ,RQVFTEN=RQVFTEN & -#endif ,RTHRATEN=RTHRATEN,RTHBLTEN=RTHBLTEN & ,RQVCUTEN=RQVCUTEN,RQCCUTEN=RQCCUTEN & ,RQVBLTEN=RQVBLTEN & @@ -1180,10 +1175,6 @@ SUBROUTINE cumulus_driver(grid & ,P_QC=p_qc & ,MOMMIX=MOMMIX & ,pgcon=pgcon,sas_mass_flux=sas_mass_flux & -#if (HWRF==1) - ,pert_sas=pert_sas,ens_random_seed=ens_random_seed & - ,ens_sasamp=ens_sasamp & -#endif ,shalconv=shalconv,shal_pgcon=shal_pgcon & ,hpbl2d=hpbl2d,evap2d=evap2d,heat2d=heat2d & ,P_QI=p_qi,P_FIRST_SCALAR=param_first_scalar & @@ -1264,14 +1255,9 @@ SUBROUTINE cumulus_driver(grid & ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte & ,PERIODIC_X=periodic_x,PERIODIC_Y=periodic_y & ! optionals -#if (NMM_CORE == 1 ) - ,RTHCUTEN=RTHCUTEN ,RTHFTEN=forcet & - ,RQICUTEN=RQICUTEN ,RQVFTEN=forceq & -#else ,RTHCUTEN=RTHCUTEN ,RTHFTEN=RTHFTEN & ,RQICUTEN=RQICUTEN ,RQVFTEN=RQVFTEN & ,rqvblten=rqvblten,rthblten=rthblten & -#endif ,RQVCUTEN=RQVCUTEN,RQCCUTEN=RQCCUTEN & ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr & ,F_QI=f_qi,F_QS=f_qs & @@ -1318,16 +1304,10 @@ SUBROUTINE cumulus_driver(grid & ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte & ,PERIODIC_X=periodic_x,PERIODIC_Y=periodic_y & ! optionals -#if (NMM_CORE == 1 ) - ,RTHCUTEN=RTHCUTEN ,RTHFTEN=forcet & - ,RTHRATEN=RTHRATEN & - ,RQICUTEN=RQICUTEN ,RQVFTEN=forceq & -#else ,RTHCUTEN=RTHCUTEN ,RTHFTEN=RTHFTEN & ,RTHRATEN=RTHRATEN & ,RQICUTEN=RQICUTEN ,RQVFTEN=RQVFTEN & ,rqvblten=rqvblten,rthblten=rthblten & -#endif ,RQVCUTEN=RQVCUTEN,RQCCUTEN=RQCCUTEN & ,dudt_phy=rucuten, dvdt_phy=rvcuten & #if ( WRF_DFI_RADAR == 1 ) @@ -1419,11 +1399,7 @@ SUBROUTINE cumulus_driver(grid & ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme & ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte & ! optionals -#if (NMM_CORE == 1 ) - ,QVFTEN=FORCEQ & -#else ,QVFTEN=RQVFTEN & -#endif ,RTHCUTEN=RTHCUTEN,RQVCUTEN=RQVCUTEN & ,RQCCUTEN=RQCCUTEN,RQICUTEN=RQICUTEN & ,RUCUTEN = RUCUTEN,RVCUTEN = RVCUTEN & @@ -1451,11 +1427,7 @@ SUBROUTINE cumulus_driver(grid & ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme & ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte & ! optionals -#if (NMM_CORE == 1 ) - ,QVFTEN=FORCEQ, THFTEN=FORCET & -#else ,QVFTEN=RQVFTEN,THFTEN=RTHFTEN & -#endif ,RTHCUTEN=RTHCUTEN,RQVCUTEN=RQVCUTEN & ,RQCCUTEN=RQCCUTEN,RQICUTEN=RQICUTEN & ,RUCUTEN = RUCUTEN,RVCUTEN = RVCUTEN & diff --git a/phys/module_diagnostics_driver.F b/phys/module_diagnostics_driver.F index 2969b39b30..551deea059 100644 --- a/phys/module_diagnostics_driver.F +++ b/phys/module_diagnostics_driver.F @@ -1,10 +1,3 @@ -#if (NMM_CORE == 1) -MODULE module_diagnostics_driver -CONTAINS - SUBROUTINE diagnostics_driver_stub - END SUBROUTINE diagnostics_driver_stub -END MODULE module_diagnostics_driver -#else !WRF:MODEL_LAYER:PHYSICS MODULE module_diagnostics_driver @@ -1171,4 +1164,3 @@ SUBROUTINE update_phys_fields ( grid, config_flags, moist, & END SUBROUTINE update_phys_fields END MODULE module_diagnostics_driver -#endif diff --git a/phys/module_fddagd_driver.F b/phys/module_fddagd_driver.F index 8ba0e474a0..dd9b8b38e9 100644 --- a/phys/module_fddagd_driver.F +++ b/phys/module_fddagd_driver.F @@ -247,7 +247,6 @@ SUBROUTINE fddagd_driver(itimestep,dt,xtime, & !------------------------------------------------------------------ ! -#if ! ( NMM_CORE == 1 ) if (config_flags%grid_fdda .eq. 0 .AND. config_flags%grid_sfdda .eq. 0) return IF (itimestep == 1) THEN @@ -622,7 +621,6 @@ SUBROUTINE fddagd_driver(itimestep,dt,xtime, & ENDIF -#endif ! END SUBROUTINE fddagd_driver END MODULE module_fddagd_driver diff --git a/phys/module_microphysics_driver.F b/phys/module_microphysics_driver.F index 5e8c1a0589..55a0cfbb1c 100644 --- a/phys/module_microphysics_driver.F +++ b/phys/module_microphysics_driver.F @@ -154,16 +154,6 @@ SUBROUTINE microphysics_driver( & ) ! Framework -#if(NMM_CORE==1) - USE module_state_description, ONLY : & - KESSLERSCHEME, LINSCHEME, SBU_YLINSCHEME, WSM3SCHEME, WSM5SCHEME & - ,WSM6SCHEME, ETAMPNEW, FER_MP_HIRES, etamp_HWRF,THOMPSON, THOMPSONAERO, MORR_TWO_MOMENT & - ,GSFCGCESCHEME, WDM5SCHEME, WDM6SCHEME, NSSL_2MOM, NSSL_2MOMCCN, NSSL_2MOMG, MADWRF_MP & - ,NSSL_1MOM,NSSL_1MOMLFO, FER_MP_HIRES_ADVECT & - ,WSM7SCHEME, WDM7SCHEME & - ,NUWRF4ICESCHEME & - ,MILBRANDT2MOM, P3_1CATEGORY, P3_1CATEGORY_NC, JENSEN_ISHMAEL !, P3_2CATEGORY ,MILBRANDT3MOM -#else USE module_state_description, ONLY : & KESSLERSCHEME, LINSCHEME, SBU_YLINSCHEME, WSM3SCHEME, WSM5SCHEME & ,WSM6SCHEME, ETAMPNEW, FER_MP_HIRES, THOMPSON, THOMPSONAERO, FAST_KHAIN_LYNN_SHPUND, MORR_TWO_MOMENT & @@ -176,7 +166,6 @@ SUBROUTINE microphysics_driver( & #if ( WRFPLUS == 1 ) USE module_state_description, ONLY : LSCONDSCHEME, MKESSLERSCHEME #endif -#endif #if ( WRF_CHEM == 1 ) ! NUWRF USE module_state_description, ONLY : & @@ -243,7 +232,6 @@ SUBROUTINE microphysics_driver( & ! USE module_mp_milbrandt3mom USE module_mp_nssl_2mom - USE module_mp_HWRF USE module_mixactivate, only: prescribe_aerosol_mixactivate ! For checking model timestep is history time (for radar reflectivity) @@ -2642,34 +2630,6 @@ SUBROUTINE microphysics_driver( & CALL wrf_error_fatal ( 'arguments not present for calling wdm7') ENDIF -#if(NMM_CORE==1) - CASE (ETAMP_HWRF) - CALL wrf_debug ( 100 , 'microphysics_driver: calling etampnew_HWRF') - - IF ( PRESENT( qv_curr ) .AND. PRESENT( qt_curr ) .AND. & - PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) .AND. & - PRESENT( mp_restart_state ) .AND. & - PRESENT( tbpvs_state ) .AND. & - PRESENT( tbpvs0_state ) ) THEN - - CALL ETAMP_NEW_HWRF( & - ITIMESTEP=itimestep,DT=dt,DX=dx,DY=dy, GID=id & - ,RAINNC=rainnc,RAINNCV=rainncv & - ,DZ8W=dz8w,RHO_PHY=rho,P_PHY=p,PI_PHY=pi_phy,TH_PHY=th & - ,QV=qv_curr & - ,QT=qt_curr & - ,LOWLYR=LOWLYR,SR=SR & - ,F_ICE_PHY=F_ICE_PHY,F_RAIN_PHY=F_RAIN_PHY & - ,F_RIMEF_PHY=F_RIMEF_PHY & - ,QC=qc_curr,QR=Qr_curr,QI=Qi_curr & - ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde & - ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme & - ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte & - ) - ELSE - CALL wrf_error_fatal ( 'arguments not present for calling etampnew' ) - ENDIF -#endif CASE (ETAMPNEW) !-- Operational 4-km High-Resolution Window (HRW) version CALL wrf_debug ( 100 , 'microphysics_driver: calling etampnew') diff --git a/phys/module_mp_HWRF.F b/phys/module_mp_HWRF.F deleted file mode 100755 index 3574f5c83b..0000000000 --- a/phys/module_mp_HWRF.F +++ /dev/null @@ -1,2709 +0,0 @@ -!WRF:MODEL_MP:PHYSICS -! -MODULE module_mp_HWRF -!----------------------------------------------------------------------- -!-- The following changes were made on 24 July 2006. -! (1) All known version 2.1 dependencies were removed from the -! operational WRF NMM model code (search for "!HWRF") -! (2) Incorporated code changes from the GFDL model (search for "!GFDL") -!----------------------------------------------------------------------- - REAL,PRIVATE,SAVE :: ABFR, CBFR, CIACW, CIACR, C_N0r0, & - & CN0r0, CN0r_DMRmin, CN0r_DMRmax, CRACW, CRAUT, ESW0, & - & RFmax, RQR_DR1, RQR_DR2, RQR_DR3, RQR_DRmin, & - & RQR_DRmax, RR_DRmin, RR_DR1, RR_DR2, RR_DR3, RR_DRmax -! - INTEGER, PRIVATE,PARAMETER :: MY_T1=1, MY_T2=35 - REAL,PRIVATE,DIMENSION(MY_T1:MY_T2),SAVE :: MY_GROWTH -! - REAL, PRIVATE,PARAMETER :: DMImin=.05e-3, DMImax=1.e-3, & - & DelDMI=1.e-6,XMImin=1.e6*DMImin, XMIexp=.0536 - INTEGER, PUBLIC,PARAMETER :: XMImax=1.e6*DMImax, & - & MDImin=XMImin, MDImax=XMImax - REAL, PRIVATE,DIMENSION(MDImin:MDImax) :: & - & ACCRI,SDENS,VSNOWI,VENTI1,VENTI2 -! - REAL, PRIVATE,PARAMETER :: DMRmin=.05e-3, DMRmax=.45e-3, & - & DelDMR=1.e-6,XMRmin=1.e6*DMRmin, XMRmax=1.e6*DMRmax - INTEGER, PRIVATE,PARAMETER :: MDRmin=XMRmin, MDRmax=XMRmax - REAL, PRIVATE,DIMENSION(MDRmin:MDRmax):: & - & ACCRR,MASSR,RRATE,VRAIN,VENTR1,VENTR2 -! - INTEGER, PRIVATE,PARAMETER :: Nrime=40 - REAL, DIMENSION(2:9,0:Nrime),PRIVATE,SAVE :: VEL_RF -! - INTEGER,PARAMETER :: NX=7501 - REAL, PARAMETER :: XMIN=180.0,XMAX=330.0 - REAL, DIMENSION(NX),PRIVATE,SAVE :: TBPVS,TBPVS0 - REAL, PRIVATE,SAVE :: C1XPVS0,C2XPVS0,C1XPVS,C2XPVS -! - REAL, PRIVATE,PARAMETER :: & -!--- Physical constants follow: - & CP=1004.6, EPSQ=1.E-12, GRAV=9.806, RHOL=1000., RD=287.04 & - & ,RV=461.5, T0C=273.15, XLS=2.834E6 & -!--- Derived physical constants follow: - & ,EPS=RD/RV, EPS1=RV/RD-1., EPSQ1=1.001*EPSQ & - & ,RCP=1./CP, RCPRV=RCP/RV, RGRAV=1./GRAV, RRHOL=1./RHOL & - & ,XLS1=XLS*RCP, XLS2=XLS*XLS*RCPRV, XLS3=XLS*XLS/RV & -!--- Constants specific to the parameterization follow: -!--- CLIMIT/CLIMIT1 are lower limits for treating accumulated precipitation - & ,CLIMIT=10.*EPSQ, CLIMIT1=-CLIMIT & - & ,C1=1./3. & - & ,DMR1=.1E-3, DMR2=.2E-3, DMR3=.32E-3 & - & ,XMR1=1.e6*DMR1, XMR2=1.e6*DMR2, XMR3=1.e6*DMR3 - INTEGER, PARAMETER :: MDR1=XMR1, MDR2=XMR2, MDR3=XMR3 - REAL:: WC -! -! ====================================================================== -!--- Important tunable parameters that are exported to other modules -!GFDL * RHgrd - generic reference to the threshold relative humidity for -!GFDL the onset of condensation -!GFDL (new) * RHgrd_in - "RHgrd" for the inner domain -!GFDL (new) * RHgrd_out - "RHgrd" for the outer domain -!HWRF 6/11/2010 mod - use lower RHgrd_out for p < 850 hPa -! * T_ICE - temperature (C) threshold at which all remaining liquid water -! is glaciated to ice -! * T_ICE_init - maximum temperature (C) at which ice nucleation occurs -! * NLImax - maximum number concentrations (m**-3) of large ice (snow/graupel/sleet) -! * NLImin - minimum number concentrations (m**-3) of large ice (snow/graupel/sleet) -! * N0r0 - assumed intercept (m**-4) of rain drops if drop diameters are between 0.2 and 0.45 mm -! * N0rmin - minimum intercept (m**-4) for rain drops -! * NCW - number concentrations of cloud droplets (m**-3) -! * FLARGE1, FLARGE2 - number fraction of large ice to total (large+snow) ice -! at T>0C and in presence of sublimation (FLARGE1), otherwise in -! presence of ice saturated/supersaturated conditions -! * PRINT_diag - for extended model diagnostics (code currently commented out) -! * PRINT_err - for run-time prints when water budgets are not conserved (for debugging) -! ====================================================================== - REAL, PUBLIC,PARAMETER :: & -! & RHgrd=1. & - & RHgrd_in=1. & !GFDL - & ,RHgrd_out=0.975 & !GFDL - & ,P_RHgrd_out=850.E2 & !HWRF 6/11/2010 - & ,T_ICE=-40. & !GFDL -!GFDL & ,T_ICE=-30. & - & ,T_ICEK=T0C+T_ICE & - & ,T_ICE_init=-5. & -!!changed to 20E3 2-09-2012 & ,NLImax=5.E3 & - & ,NLImax=20.E3 & - & ,NLImin=1.E3 & - & ,N0r0=8.E6 & - & ,N0rmin=1.E4 & -!!2-09-2012 & ,NCW=60.E6 & !GFDL -!! based on Aligo's email,NCW is changed to 250E6 - & ,NCW=250.E6 & !GFDL -!HWRF & ,NCW=100.E6 & - & ,FLARGE1=1. & - & ,FLARGE2=.2 -! LOGICAL, PARAMETER :: PRINT_diag=.FALSE. !GFDL - LOGICAL, PARAMETER :: PRINT_err=.TRUE. !GFDL** => eventually set this to .false. -!--- Other public variables passed to other routines: - REAL,PUBLIC,SAVE :: QAUT0 - REAL, PUBLIC,DIMENSION(MDImin:MDImax) :: MASSI -! -! - CONTAINS - -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- - SUBROUTINE ETAMP_NEW_HWRF (itimestep,DT,DX,DY,GID,RAINNC,RAINNCV, & !GID - & dz8w,rho_phy,p_phy,pi_phy,th_phy,qv,qt, & !gopal's doing - & LOWLYR,SR, & - & F_ICE_PHY,F_RAIN_PHY,F_RIMEF_PHY, & - & QC,QR,QI, & - & ids,ide, jds,jde, kds,kde, & - & ims,ime, jms,jme, kms,kme, & - & its,ite, jts,jte, kts,kte ) -!HWRF SUBROUTINE ETAMP_NEW (itimestep,DT,DX,DY, & -!HWRF & dz8w,rho_phy,p_phy,pi_phy,th_phy,qv,qc, & -!HWRF & LOWLYR,SR, & -!HWRF & F_ICE_PHY,F_RAIN_PHY,F_RIMEF_PHY, & -!HWRF & mp_restart_state,tbpvs_state,tbpvs0_state, & -!HWRF & RAINNC,RAINNCV, & -!HWRF & ids,ide, jds,jde, kds,kde, & -!HWRF & ims,ime, jms,jme, kms,kme, & -!HWRF & its,ite, jts,jte, kts,kte ) -!----------------------------------------------------------------------- - IMPLICIT NONE -!----------------------------------------------------------------------- - INTEGER, PARAMETER :: ITLO=-60, ITHI=40 - - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE & - & ,ITIMESTEP,GID ! GID gopal's doing - - REAL, INTENT(IN) :: DT,DX,DY - REAL, INTENT(IN), DIMENSION(ims:ime, kms:kme, jms:jme):: & - & dz8w,p_phy,pi_phy,rho_phy - REAL, INTENT(INOUT), DIMENSION(ims:ime, kms:kme, jms:jme):: & - & th_phy,qv,qt,qc,qr,qi - REAL, INTENT(INOUT), DIMENSION(ims:ime, kms:kme, jms:jme ) :: & - & F_ICE_PHY,F_RAIN_PHY,F_RIMEF_PHY - REAL, INTENT(INOUT), DIMENSION(ims:ime,jms:jme) :: & - & RAINNC,RAINNCV - REAL, INTENT(OUT), DIMENSION(ims:ime,jms:jme):: SR -! -!HWRF REAL,DIMENSION(*),INTENT(INOUT) :: MP_RESTART_STATE -! -!HWRF REAL,DIMENSION(nx),INTENT(INOUT) :: TBPVS_STATE,TBPVS0_STATE -! - INTEGER, DIMENSION( ims:ime, jms:jme ),INTENT(INOUT) :: LOWLYR - -!----------------------------------------------------------------------- -! LOCAL VARS -!----------------------------------------------------------------------- - -! NSTATS,QMAX,QTOT are diagnostic vars - - INTEGER,DIMENSION(ITLO:ITHI,4) :: NSTATS - REAL, DIMENSION(ITLO:ITHI,5) :: QMAX - REAL, DIMENSION(ITLO:ITHI,22):: QTOT - -! SOME VARS WILL BE USED FOR DATA ASSIMILATION (DON'T NEED THEM NOW). -! THEY ARE TREATED AS LOCAL VARS, BUT WILL BECOME STATE VARS IN THE -! FUTURE. SO, WE DECLARED THEM AS MEMORY SIZES FOR THE FUTURE USE - -! TLATGS_PHY,TRAIN_PHY,APREC,PREC,ACPREC,SR are not directly related -! the microphysics scheme. Instead, they will be used by Eta precip -! assimilation. - - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) :: & - & TLATGS_PHY,TRAIN_PHY - REAL, DIMENSION(ims:ime,jms:jme):: APREC,PREC,ACPREC - REAL, DIMENSION(its:ite, kts:kte, jts:jte):: t_phy - -!jm 20150331 -! see comment below - REAL :: PI, DTPH -!jm 20150331 - - INTEGER :: I,J,K,KFLIP -! -!----------------------------------------------------------------------- -!********************************************************************** -!----------------------------------------------------------------------- -! -!HWRF MY_GROWTH(MY_T1:MY_T2)=MP_RESTART_STATE(MY_T1:MY_T2) -!HWRF! -!HWRF C1XPVS0=MP_RESTART_STATE(MY_T2+1) -!HWRF C2XPVS0=MP_RESTART_STATE(MY_T2+2) -!HWRF C1XPVS =MP_RESTART_STATE(MY_T2+3) -!HWRF C2XPVS =MP_RESTART_STATE(MY_T2+4) -!HWRF CIACW =MP_RESTART_STATE(MY_T2+5) -!HWRF CIACR =MP_RESTART_STATE(MY_T2+6) -!HWRF CRACW =MP_RESTART_STATE(MY_T2+7) -!HWRF CRAUT =MP_RESTART_STATE(MY_T2+8) -!HWRF! -!HWRF TBPVS(1:NX) =TBPVS_STATE(1:NX) -!HWRF TBPVS0(1:NX)=TBPVS0_STATE(1:NX) -! -!jm 20150331 -! Temp fix problem with SAVEd variables CIACW, CIACR, CRACW, and CRAUT that -! are inadvertantly recalculated when the etanewinit_HWRF routine, below, -! is called for other domains. Best solution is to move these to state (put -! in registry) so there will be separate copies for each domain. For now, -! just recompute each time this routine is entered. Will be an innocuous -! race condition (many set with same value) with threading so need to fix. -! Temporary fix is idea of Weiguo Wang. - PI=ACOS(-1.) - DTPH=DT - CALL MY_GROWTH_RATES(DT) - CIACW=DTPH*0.25*PI*0.5*(1.E5)**C1 - CIACR=PI*DTPH - CRACW=DTPH*0.25*PI*1.0 - CRAUT=1.-EXP(-1.E-3*DTPH) -!jm 20150331 - - DO j = jts,jte - DO k = kts,kte - DO i = its,ite - t_phy(i,k,j) = th_phy(i,k,j)*pi_phy(i,k,j) - qv(i,k,j)=qv(i,k,j)/(1.+qv(i,k,j)) !Convert to specific humidity - ENDDO - ENDDO - ENDDO - -! initial diagnostic variables and data assimilation vars -! (will need to delete this part in the future) - - DO k = 1,4 - DO i = ITLO,ITHI - NSTATS(i,k)=0. - ENDDO - ENDDO - - DO k = 1,5 - DO i = ITLO,ITHI - QMAX(i,k)=0. - ENDDO - ENDDO - - DO k = 1,22 - DO i = ITLO,ITHI - QTOT(i,k)=0. - ENDDO - ENDDO - -! initial data assimilation vars (will need to delete this part in the future) - - DO j = jts,jte - DO k = kts,kte - DO i = its,ite - TLATGS_PHY (i,k,j)=0. - TRAIN_PHY (i,k,j)=0. - ENDDO - ENDDO - ENDDO - - DO j = jts,jte - DO i = its,ite - ACPREC(i,j)=0. - APREC (i,j)=0. - PREC (i,j)=0. - SR (i,j)=0. - ENDDO - ENDDO - -!-- 6/11/2010: Update QT, F_ice, F_rain arrays - DO j = jts,jte - DO k = kts,kte - DO i = its,ite - QT(I,K,J)=QC(I,K,J)+QR(I,K,J)+QI(I,K,J) - IF (QI(I,K,J) <= EPSQ) THEN - F_ICE_PHY(I,K,J)=0. - IF (T_PHY(I,K,J) < T_ICEK) F_ICE_PHY(I,K,J)=1. - ELSE - F_ICE_PHY(I,K,J)=MAX( 0., MIN(1., QI(I,K,J)/QT(I,K,J) ) ) - ENDIF - IF (QR(I,K,J) <= EPSQ) THEN - F_RAIN_PHY(I,K,J)=0. - ELSE - F_RAIN_PHY(I,K,J)=QR(I,K,J)/(QR(I,K,J)+QC(I,K,J)) - ENDIF - ENDDO - ENDDO - ENDDO - -!----------------------------------------------------------------------- - - CALL EGCP01DRV(GID,DT,LOWLYR, & - & APREC,PREC,ACPREC,SR,NSTATS,QMAX,QTOT, & - & dz8w,rho_phy,qt,t_phy,qv,F_ICE_PHY,P_PHY, & - & F_RAIN_PHY,F_RIMEF_PHY,TLATGS_PHY,TRAIN_PHY, & - & ids,ide, jds,jde, kds,kde, & - & ims,ime, jms,jme, kms,kme, & - & its,ite, jts,jte, kts,kte ) -!----------------------------------------------------------------------- - - DO j = jts,jte - DO k = kts,kte - DO i = its,ite - th_phy(i,k,j) = t_phy(i,k,j)/pi_phy(i,k,j) - qv(i,k,j)=qv(i,k,j)/(1.-qv(i,k,j)) !Convert to mixing ratio - WC=qt(I,K,J) - QI(I,K,J)=0. - QR(I,K,J)=0. - QC(I,K,J)=0. - IF(F_ICE_PHY(I,K,J)>=1.)THEN - QI(I,K,J)=WC - ELSEIF(F_ICE_PHY(I,K,J)<=0.)THEN - QC(I,K,J)=WC - ELSE - QI(I,K,J)=F_ICE_PHY(I,K,J)*WC - QC(I,K,J)=WC-QI(I,K,J) - ENDIF -! - IF(QC(I,K,J)>0..AND.F_RAIN_PHY(I,K,J)>0.)THEN - IF(F_RAIN_PHY(I,K,J).GE.1.)THEN - QR(I,K,J)=QC(I,K,J) - QC(I,K,J)=0. - ELSE - QR(I,K,J)=F_RAIN_PHY(I,K,J)*QC(I,K,J) - QC(I,K,J)=QC(I,K,J)-QR(I,K,J) - ENDIF - endif - ENDDO - ENDDO - ENDDO -! -! update rain (from m to mm) - - DO j=jts,jte - DO i=its,ite - RAINNC(i,j)=APREC(i,j)*1000.+RAINNC(i,j) - RAINNCV(i,j)=APREC(i,j)*1000. - ENDDO - ENDDO -! -!HWRF MP_RESTART_STATE(MY_T1:MY_T2)=MY_GROWTH(MY_T1:MY_T2) -!HWRF MP_RESTART_STATE(MY_T2+1)=C1XPVS0 -!HWRF MP_RESTART_STATE(MY_T2+2)=C2XPVS0 -!HWRF MP_RESTART_STATE(MY_T2+3)=C1XPVS -!HWRF MP_RESTART_STATE(MY_T2+4)=C2XPVS -!HWRF MP_RESTART_STATE(MY_T2+5)=CIACW -!HWRF MP_RESTART_STATE(MY_T2+6)=CIACR -!HWRF MP_RESTART_STATE(MY_T2+7)=CRACW -!HWRF MP_RESTART_STATE(MY_T2+8)=CRAUT -!HWRF! -!HWRF TBPVS_STATE(1:NX) =TBPVS(1:NX) -!HWRF TBPVS0_STATE(1:NX)=TBPVS0(1:NX) - -!----------------------------------------------------------------------- - - END SUBROUTINE ETAMP_NEW_HWRF - -!----------------------------------------------------------------------- - - SUBROUTINE EGCP01DRV(GID, & !GID gopal's doing - & DTPH,LOWLYR,APREC,PREC,ACPREC,SR, & - & NSTATS,QMAX,QTOT, & - & dz8w,RHO_PHY,CWM_PHY,T_PHY,Q_PHY,F_ICE_PHY,P_PHY, & - & F_RAIN_PHY,F_RIMEF_PHY,TLATGS_PHY,TRAIN_PHY, & - & ids,ide, jds,jde, kds,kde, & - & ims,ime, jms,jme, kms,kme, & - & its,ite, jts,jte, kts,kte) -!----------------------------------------------------------------------- -! DTPH Physics time step (s) -! CWM_PHY (qt) Mixing ratio of the total condensate. kg/kg -! Q_PHY Mixing ratio of water vapor. kg/kg -! F_RAIN_PHY Fraction of rain. -! F_ICE_PHY Fraction of ice. -! F_RIMEF_PHY Mass ratio of rimed ice (rime factor). -! -!TLATGS_PHY,TRAIN_PHY,APREC,PREC,ACPREC,SR are not directly related the -!micrphysics sechme. Instead, they will be used by Eta precip assimilation. -! -!NSTATS,QMAX,QTOT are used for diagnosis purposes. -! -!----------------------------------------------------------------------- -!--- Variables APREC,PREC,ACPREC,SR are calculated for precip assimilation -! and/or ZHAO's scheme in Eta and are not required by this microphysics -! scheme itself. -!--- NSTATS,QMAX,QTOT are used for diagnosis purposes only. They will be -! printed out when PRINT_diag is true. -! -!----------------------------------------------------------------------- - IMPLICIT NONE -!----------------------------------------------------------------------- -! - INTEGER, PARAMETER :: ITLO=-60, ITHI=40 -! VARIABLES PASSED IN/OUT - INTEGER,INTENT(IN ) :: ids,ide, jds,jde, kds,kde & - & ,ims,ime, jms,jme, kms,kme & - & ,its,ite, jts,jte, kts,kte - INTEGER,INTENT(IN ) :: GID ! grid%id gopal's doing - REAL,INTENT(IN) :: DTPH - INTEGER, DIMENSION( ims:ime, jms:jme ),INTENT(INOUT) :: LOWLYR - INTEGER,DIMENSION(ITLO:ITHI,4),INTENT(INOUT) :: NSTATS - REAL,DIMENSION(ITLO:ITHI,5),INTENT(INOUT) :: QMAX - REAL,DIMENSION(ITLO:ITHI,22),INTENT(INOUT) :: QTOT - REAL,DIMENSION(ims:ime,jms:jme),INTENT(INOUT) :: & - & APREC,PREC,ACPREC,SR - REAL,DIMENSION( its:ite, kts:kte, jts:jte ),INTENT(INOUT) :: t_phy - REAL,DIMENSION( ims:ime, kms:kme, jms:jme ),INTENT(IN) :: & - & dz8w,P_PHY,RHO_PHY - REAL,DIMENSION( ims:ime, kms:kme, jms:jme ),INTENT(INOUT) :: & - & CWM_PHY, F_ICE_PHY,F_RAIN_PHY,F_RIMEF_PHY,TLATGS_PHY & - & ,Q_PHY,TRAIN_PHY -! -!----------------------------------------------------------------------- -!LOCAL VARIABLES -!----------------------------------------------------------------------- -! -!HWRF - Below are directives in the operational code that have been removed, -! where "TEMP_DEX" has been replaced with "I,J,L" and "TEMP_DIMS" has -! been replaced with "its:ite,jts:jte,kts:kte" -!HWRF#define CACHE_FRIENDLY_MP_ETANEW -!HWRF#ifdef CACHE_FRIENDLY_MP_ETANEW -!HWRF# define TEMP_DIMS kts:kte,its:ite,jts:jte -!HWRF# define TEMP_DEX L,I,J -!HWRF#else -!HWRF# define TEMP_DIMS its:ite,jts:jte,kts:kte -!HWRF# define TEMP_DEX I,J,L -!HWRF#endif -!HWRF! - INTEGER :: LSFC,I,J,I_index,J_index,L,K,KFLIP -!HWRF REAL,DIMENSION(TEMP_DIMS) :: CWM,T,Q,TRAIN,TLATGS,P - REAL,DIMENSION(its:ite,jts:jte,kts:kte) :: & - & CWM,T,Q,TRAIN,TLATGS,P - REAL,DIMENSION(kts:kte,its:ite,jts:jte) :: F_ice,F_rain,F_RimeF - INTEGER,DIMENSION(its:ite,jts:jte) :: LMH - REAL :: TC,WC,QI,QR,QW,Fice,Frain,DUM,ASNOW,ARAIN - REAL,DIMENSION(kts:kte) :: P_col,Q_col,T_col,QV_col,WC_col, & - RimeF_col,QI_col,QR_col,QW_col, THICK_col, RHC_col, DPCOL !GFDL - REAL,DIMENSION(2) :: PRECtot,PRECmax -!----------------------------------------------------------------------- -! - DO J=JTS,JTE - DO I=ITS,ITE - LMH(I,J) = KTE-LOWLYR(I,J)+1 - ENDDO - ENDDO - - - DO 98 J=JTS,JTE - DO 98 I=ITS,ITE - DO L=KTS,KTE - KFLIP=KTE+1-L - CWM(I,J,L)=CWM_PHY(I,KFLIP,J) - T(I,J,L)=T_PHY(I,KFLIP,J) - Q(I,J,L)=Q_PHY(I,KFLIP,J) - P(I,J,L)=P_PHY(I,KFLIP,J) - TLATGS(I,J,L)=TLATGS_PHY(I,KFLIP,J) - TRAIN(I,J,L)=TRAIN_PHY(I,KFLIP,J) - F_ice(L,I,J)=F_ice_PHY(I,KFLIP,J) - F_rain(L,I,J)=F_rain_PHY(I,KFLIP,J) - F_RimeF(L,I,J)=F_RimeF_PHY(I,KFLIP,J) - ENDDO -98 CONTINUE - - DO 100 J=JTS,JTE - DO 100 I=ITS,ITE - LSFC=LMH(I,J) ! "L" of surface -! - DO K=KTS,KTE - KFLIP=KTE+1-K - DPCOL(K)=RHO_PHY(I,KFLIP,J)*GRAV*dz8w(I,KFLIP,J) - ENDDO -! - ! - !--- Initialize column data (1D arrays) - ! - IF (CWM(I,J,1) .LE. EPSQ) CWM(I,J,1)=EPSQ - F_ice(1,I,J)=1. - F_rain(1,I,J)=0. - F_RimeF(1,I,J)=1. - DO L=1,LSFC - ! - !--- Pressure (Pa) = (Psfc-Ptop)*(ETA/ETA_sfc)+Ptop - ! - P_col(L)=P(I,J,L) - ! - !--- Layer thickness = RHO*DZ = -DP/G = (Psfc-Ptop)*D_ETA/(G*ETA_sfc) - ! - THICK_col(L)=DPCOL(L)*RGRAV - T_col(L)=T(I,J,L) - TC=T_col(L)-T0C - QV_col(L)=max(EPSQ, Q(I,J,L)) - IF (CWM(I,J,L) .LE. EPSQ1) THEN - WC_col(L)=0. - IF (TC .LT. T_ICE) THEN - F_ice(L,I,J)=1. - ELSE - F_ice(L,I,J)=0. - ENDIF - F_rain(L,I,J)=0. - F_RimeF(L,I,J)=1. - ELSE - WC_col(L)=CWM(I,J,L) - ENDIF - ! - !--- Determine composition of condensate in terms of - ! cloud water, ice, & rain - ! - WC=WC_col(L) - QI=0. - QR=0. - QW=0. - Fice=F_ice(L,I,J) - Frain=F_rain(L,I,J) - IF (Fice .GE. 1.) THEN - QI=WC - ELSE IF (Fice .LE. 0.) THEN - QW=WC - ELSE - QI=Fice*WC - QW=WC-QI - ENDIF - IF (QW.GT.0. .AND. Frain.GT.0.) THEN - IF (Frain .GE. 1.) THEN - QR=QW - QW=0. - ELSE - QR=Frain*QW - QW=QW-QR - ENDIF - ENDIF - RimeF_col(L)=F_RimeF(L,I,J) - QI_col(L)=QI - QR_col(L)=QR - QW_col(L)=QW -!GFDL => New. Added RHC_col to allow for height- and grid-dependent values for -!GFDL the relative humidity threshold for condensation ("RHgrd") -!6/11/2010 mod - Use lower RHgrd_out threshold for < 850 hPa -!------------------------------------------------------------ - IF(GID .EQ. 1 .AND. P_col(L)0) associated with snow - ! - APREC(I,J)=(ARAIN+ASNOW)*RRHOL ! Accumulated surface precip (depth in m) !<--- Ying - PREC(I,J)=PREC(I,J)+APREC(I,J) - ACPREC(I,J)=ACPREC(I,J)+APREC(I,J) - IF(APREC(I,J) .LT. 1.E-8) THEN - SR(I,J)=0. - ELSE - SR(I,J)=RRHOL*ASNOW/APREC(I,J) - ENDIF -! ! -! !--- Debug statistics -! ! -! IF (PRINT_diag) THEN -! PRECtot(1)=PRECtot(1)+ARAIN -! PRECtot(2)=PRECtot(2)+ASNOW -! PRECmax(1)=MAX(PRECmax(1), ARAIN) -! PRECmax(2)=MAX(PRECmax(2), ASNOW) -! ENDIF - - -!####################################################################### -!####################################################################### -! -100 CONTINUE ! End "I" & "J" loops - DO 101 J=JTS,JTE - DO 101 I=ITS,ITE - DO L=KTS,KTE - KFLIP=KTE+1-L - CWM_PHY(I,KFLIP,J)=CWM(I,J,L) - T_PHY(I,KFLIP,J)=T(I,J,L) - Q_PHY(I,KFLIP,J)=Q(I,J,L) - TLATGS_PHY(I,KFLIP,J)=TLATGS(I,J,L) - TRAIN_PHY(I,KFLIP,J)=TRAIN(I,J,L) - F_ice_PHY(I,KFLIP,J)=F_ice(L,I,J) - F_rain_PHY(I,KFLIP,J)=F_rain(L,I,J) - F_RimeF_PHY(I,KFLIP,J)=F_RimeF(L,I,J) - ENDDO -101 CONTINUE - END SUBROUTINE EGCP01DRV -! -! -!############################################################################### -! ***** VERSION OF MICROPHYSICS DESIGNED FOR HIGHER RESOLUTION MESO ETA MODEL -! (1) Represents sedimentation by preserving a portion of the precipitation -! through top-down integration from cloud-top. Modified procedure to -! Zhao and Carr (1997). -! (2) Microphysical equations are modified to be less sensitive to time -! steps by use of Clausius-Clapeyron equation to account for changes in -! saturation mixing ratios in response to latent heating/cooling. -! (3) Prevent spurious temperature oscillations across 0C due to -! microphysics. -! (4) Uses lookup tables for: calculating two different ventilation -! coefficients in condensation and deposition processes; accretion of -! cloud water by precipitation; precipitation mass; precipitation rate -! (and mass-weighted precipitation fall speeds). -! (5) Assumes temperature-dependent variation in mean diameter of large ice -! (Houze et al., 1979; Ryan et al., 1996). -! -> 8/22/01: This relationship has been extended to colder temperatures -! to parameterize smaller large-ice particles down to mean sizes of MDImin, -! which is 50 microns reached at -55.9C. -! (6) Attempts to differentiate growth of large and small ice, mainly for -! improved transition from thin cirrus to thick, precipitating ice -! anvils. -! -> 8/22/01: This feature has been diminished by effectively adjusting to -! ice saturation during depositional growth at temperatures colder than -! -10C. Ice sublimation is calculated more explicitly. The logic is -! that sources of are either poorly understood (e.g., nucleation for NWP) -! or are not represented in the Eta model (e.g., detrainment of ice from -! convection). Otherwise the model is too wet compared to the radiosonde -! observations based on 1 Feb - 18 March 2001 retrospective runs. -! (7) Top-down integration also attempts to treat mixed-phase processes, -! allowing a mixture of ice and water. Based on numerous observational -! studies, ice growth is based on nucleation at cloud top & -! subsequent growth by vapor deposition and riming as the ice particles -! fall through the cloud. Effective nucleation rates are a function -! of ice supersaturation following Meyers et al. (JAM, 1992). -! -> 8/22/01: The simulated relative humidities were far too moist compared -! to the rawinsonde observations. This feature has been substantially -! diminished, limited to a much narrower temperature range of 0 to -10C. -! (8) Depositional growth of newly nucleated ice is calculated for large time -! steps using Fig. 8 of Miller and Young (JAS, 1979), at 1 deg intervals -! using their ice crystal masses calculated after 600 s of growth in water -! saturated conditions. The growth rates are normalized by time step -! assuming 3D growth with time**1.5 following eq. (6.3) in Young (1993). -! -> 8/22/01: This feature has been effectively limited to 0 to -10C. -! (9) Ice precipitation rates can increase due to increase in response to -! cloud water riming due to (a) increased density & mass of the rimed -! ice, and (b) increased fall speeds of rimed ice. -! -> 8/22/01: This feature has been effectively limited to 0 to -10C. -!############################################################################### -!############################################################################### -! - SUBROUTINE EGCP01COLUMN ( ARAIN, ASNOW, DTPH, I_index, J_index, & - & LSFC, P_col, QI_col, QR_col, QV_col, QW_col, RimeF_col, T_col, & - & THICK_col, WC_col, RHC_col, KTS,KTE,NSTATS,QMAX,QTOT) !GFDL -! -!############################################################################### -!############################################################################### -! -!------------------------------------------------------------------------------- -!----- NOTE: Code is currently set up w/o threading! -!------------------------------------------------------------------------------- -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: Grid-scale microphysical processes - condensation & precipitation -! PRGRMMR: Ferrier ORG: W/NP22 DATE: 08-2001 -! PRGRMMR: Jin (Modification for WRF structure) -!------------------------------------------------------------------------------- -! ABSTRACT: -! * Merges original GSCOND & PRECPD subroutines. -! * Code has been substantially streamlined and restructured. -! * Exchange between water vapor & small cloud condensate is calculated using -! the original Asai (1965, J. Japan) algorithm. See also references to -! Yau and Austin (1979, JAS), Rutledge and Hobbs (1983, JAS), and Tao et al. -! (1989, MWR). This algorithm replaces the Sundqvist et al. (1989, MWR) -! parameterization. -!------------------------------------------------------------------------------- -! -! USAGE: -! * CALL EGCP01COLUMN FROM SUBROUTINE EGCP01DRV -! -! INPUT ARGUMENT LIST: -! DTPH - physics time step (s) -! I_index - I index -! J_index - J index -! LSFC - Eta level of level above surface, ground -! P_col - vertical column of model pressure (Pa) -! QI_col - vertical column of model ice mixing ratio (kg/kg) -! QR_col - vertical column of model rain ratio (kg/kg) -! QV_col - vertical column of model water vapor specific humidity (kg/kg) -! QW_col - vertical column of model cloud water mixing ratio (kg/kg) -! RimeF_col - vertical column of rime factor for ice in model (ratio, defined below) -! T_col - vertical column of model temperature (deg K) -! THICK_col - vertical column of model mass thickness (density*height increment) -! WC_col - vertical column of model mixing ratio of total condensate (kg/kg) -! RHC_col - vertical column of threshold relative humidity for onset of condensation (ratio) !GFDL -! -! -! OUTPUT ARGUMENT LIST: -! ARAIN - accumulated rainfall at the surface (kg) -! ASNOW - accumulated snowfall at the surface (kg) -! QV_col - vertical column of model water vapor specific humidity (kg/kg) -! WC_col - vertical column of model mixing ratio of total condensate (kg/kg) -! QW_col - vertical column of model cloud water mixing ratio (kg/kg) -! QI_col - vertical column of model ice mixing ratio (kg/kg) -! QR_col - vertical column of model rain ratio (kg/kg) -! RimeF_col - vertical column of rime factor for ice in model (ratio, defined below) -! T_col - vertical column of model temperature (deg K) -! -! OUTPUT FILES: -! NONE -! -! Subprograms & Functions called: -! * Real Function CONDENSE - cloud water condensation -! * Real Function DEPOSIT - ice deposition (not sublimation) -! -! UNIQUE: NONE -! -! LIBRARY: NONE -! -! COMMON BLOCKS: -! CMICRO_CONS - key constants initialized in GSMCONST -! CMICRO_STATS - accumulated and maximum statistics -! CMY_GROWTH - lookup table for growth of ice crystals in -! water saturated conditions (Miller & Young, 1979) -! IVENT_TABLES - lookup tables for ventilation effects of ice -! IACCR_TABLES - lookup tables for accretion rates of ice -! IMASS_TABLES - lookup tables for mass content of ice -! IRATE_TABLES - lookup tables for precipitation rates of ice -! IRIME_TABLES - lookup tables for increase in fall speed of rimed ice -! RVENT_TABLES - lookup tables for ventilation effects of rain -! RACCR_TABLES - lookup tables for accretion rates of rain -! RMASS_TABLES - lookup tables for mass content of rain -! RVELR_TABLES - lookup tables for fall speeds of rain -! RRATE_TABLES - lookup tables for precipitation rates of rain -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -! -! -!------------------------------------------------------------------------- -!--------------- Arrays & constants in argument list --------------------- -!------------------------------------------------------------------------- -! - IMPLICIT NONE -! - INTEGER,INTENT(IN) :: KTS,KTE,I_index, J_index, LSFC - REAL,INTENT(INOUT) :: ARAIN, ASNOW - REAL,DIMENSION(KTS:KTE),INTENT(INOUT) :: P_col, QI_col,QR_col & - & ,QV_col ,QW_col, RimeF_col, T_col, THICK_col, WC_col, RHC_col !GFDL -! -!------------------------------------------------------------------------- -!-------------- Common blocks for microphysical statistics --------------- -!------------------------------------------------------------------------- -! -!------------------------------------------------------------------------- -!--------- Common blocks for constants initialized in GSMCONST ---------- -! - INTEGER, PARAMETER :: ITLO=-60, ITHI=40 - INTEGER,INTENT(INOUT) :: NSTATS(ITLO:ITHI,4) - REAL,INTENT(INOUT) :: QMAX(ITLO:ITHI,5),QTOT(ITLO:ITHI,22) -! -!------------------------------------------------------------------------- -!--------------- Common blocks for various lookup tables ----------------- -! -!--- Discretized growth rates of small ice crystals after their nucleation -! at 1 C intervals from -1 C to -35 C, based on calculations by Miller -! and Young (1979, JAS) after 600 s of growth. Resultant growth rates -! are multiplied by physics time step in GSMCONST. -! -!------------------------------------------------------------------------- -! -!--- Mean ice-particle diameters varying from 50 microns to 1000 microns -! (1 mm), assuming an exponential size distribution. -! -!---- Meaning of the following arrays: -! - mdiam - mean diameter (m) -! - VENTI1 - integrated quantity associated w/ ventilation effects -! (capacitance only) for calculating vapor deposition onto ice -! - VENTI2 - integrated quantity associated w/ ventilation effects -! (with fall speed) for calculating vapor deposition onto ice -! - ACCRI - integrated quantity associated w/ cloud water collection by ice -! - MASSI - integrated quantity associated w/ ice mass -! - VSNOWI - mass-weighted fall speed of snow (large ice), used to calculate -! precipitation rates -! -! -!------------------------------------------------------------------------- -! -!--- VEL_RF - velocity increase of rimed particles as functions of crude -! particle size categories (at 0.1 mm intervals of mean ice particle -! sizes) and rime factor (different values of Rime Factor of 1.1**N, -! where N=0 to Nrime). -! -!------------------------------------------------------------------------- -! -!--- Mean rain drop diameters varying from 50 microns (0.05 mm) to 450 microns -! (0.45 mm), assuming an exponential size distribution. -! -!------------------------------------------------------------------------- -!------- Key parameters, local variables, & important comments --------- -!----------------------------------------------------------------------- -! -!--- TOLER => Tolerance or precision for accumulated precipitation -! - REAL, PARAMETER :: TOLER=5.E-7, C2=1./6., RHO0=1.194, Xratio=.025 -! -!--- If BLEND=1: -! precipitation (large) ice amounts are estimated at each level as a -! blend of ice falling from the grid point above and the precip ice -! present at the start of the time step (see TOT_ICE below). -!--- If BLEND=0: -! precipitation (large) ice amounts are estimated to be the precip -! ice present at the start of the time step. -! -!--- Extended to include sedimentation of rain on 2/5/01 -! - REAL, PARAMETER :: BLEND=1. -! -!----------------------------------------------------------------------- -!--- Local variables -!----------------------------------------------------------------------- -! - REAL EMAIRI, N0r, NLICE, NSmICE, RHgrd !GFDL - LOGICAL CLEAR, ICE_logical, DBG_logical, RAIN_logical - INTEGER :: IDR,INDEX_MY,INDEXR,INDEXR1,INDEXS,IPASS,ITDX,IXRF, & - & IXS,LBEF,L -! - REAL :: ABI,ABW,AIEVP,ARAINnew,ASNOWnew,BLDTRH,BUDGET, & - & CREVP,DELI,DELR,DELT,DELV,DELW,DENOMF, & - & DENOMI,DENOMW,DENOMWI,DIDEP, & - & DIEVP,DIFFUS,DLI,DTPH,DTRHO,DUM,DUM1, & - & DUM2,DWV0,DWVI,DWVR,DYNVIS,ESI,ESW,FIR,FLARGE,FLIMASS, & - & FSMALL,FWR,FWS,GAMMAR,GAMMAS, & - & PCOND,PIACR,PIACW,PIACWI,PIACWR,PICND,PIDEP,PIDEP_max, & - & PIEVP,PILOSS,PIMLT,PP,PRACW,PRAUT,PREVP,PRLOSS, & - & QI,QInew,QLICE,QR,QRnew,QSI,QSIgrd,QSInew,QSW,QSW0, & - & QSWgrd,QSWnew,QT,QTICE,QTnew,QTRAIN,QV,QW,QW0,QWnew, & - & RFACTOR,RHO,RIMEF,RIMEF1,RQR,RR,RRHO,SFACTOR, & - & TC,TCC,TFACTOR,THERM_COND,THICK,TK,TK2,TNEW, & - & TOT_ICE,TOT_ICEnew,TOT_RAIN,TOT_RAINnew, & - & VEL_INC,VENTR,VENTIL,VENTIS,VRAIN1,VRAIN2,VRIMEF,VSNOW, & - & WC,WCnew,WSgrd,WS,WSnew,WV,WVnew,WVQW, & -!! & XLF,XLF1,XLI,XLV,XLV1,XLV2,XLIMASS,XRF,XSIMASS - & XLF,XLF1,XLI,XLV,XLV1,XLV2,XLIMASS,XRF,XSIMASS, & - & VRabove !-- new variables -! -!####################################################################### -!########################## Begin Execution ############################ -!####################################################################### -! -! - ARAIN=0. ! Accumulated rainfall into grid box from above (kg/m**2) - ASNOW=0. ! Accumulated snowfall into grid box from above (kg/m**2) -!aligo - VRabove=0. ! Fall speed of rain into grid box from above (m/s) -!aligo -! -!----------------------------------------------------------------------- -!------------ Loop from top (L=1) to surface (L=LSFC) ------------------ -!----------------------------------------------------------------------- -! - - DO 10 L=1,LSFC - -!--- Skip this level and go to the next lower level if no condensate -! and very low specific humidities -! - IF (QV_col(L).LE.EPSQ .AND. WC_col(L).LE.EPSQ) GO TO 10 -! -!----------------------------------------------------------------------- -!------------ Proceed with cloud microphysics calculations ------------- -!----------------------------------------------------------------------- -! - TK=T_col(L) ! Temperature (deg K) - TC=TK-T0C ! Temperature (deg C) - PP=P_col(L) ! Pressure (Pa) - QV=QV_col(L) ! Specific humidity of water vapor (kg/kg) - WV=QV/(1.-QV) ! Water vapor mixing ratio (kg/kg) - WC=WC_col(L) ! Grid-scale mixing ratio of total condensate (water or ice; kg/kg) - RHgrd=RHC_col(L) ! Threshold relative humidity for the onset of condensation -! -!----------------------------------------------------------------------- -!--- Moisture variables below are mixing ratios & not specifc humidities -!----------------------------------------------------------------------- -! - CLEAR=.TRUE. -! -!--- This check is to determine grid-scale saturation when no condensate is present -! - ESW=1000.*FPVS0(TK) ! Saturation vapor pressure w/r/t water - QSW=EPS*ESW/(PP-ESW) ! Saturation mixing ratio w/r/t water - QSI = QSW ! Initialize variable - WS=QSW ! General saturation mixing ratio (water/ice) - IF (TC .LT. 0.) THEN - ESI=1000.*FPVS(TK) ! Saturation vapor pressure w/r/t ice - QSI=EPS*ESI/(PP-ESI) ! Saturation mixing ratio w/r/t water - WS=QSI ! General saturation mixing ratio (water/ice) - ENDIF -! -!--- Effective grid-scale Saturation mixing ratios -! - QSWgrd=RHgrd*QSW - QSIgrd=RHgrd*QSI - WSgrd=RHgrd*WS -! -!--- Check if air is subsaturated and w/o condensate -! - IF (WV.GT.WSgrd .OR. WC.GT.EPSQ) CLEAR=.FALSE. -! -!--- Check if any rain is falling into layer from above -! - IF (ARAIN .GT. CLIMIT) THEN - CLEAR=.FALSE. - ELSE - ARAIN=0. - !aligo - VRabove=0. - !aligo - ENDIF -! -!--- Check if any ice is falling into layer from above -! -!--- NOTE that "SNOW" in variable names is synonomous with -! large, precipitation ice particles -! - IF (ASNOW .GT. CLIMIT) THEN - CLEAR=.FALSE. - ELSE - ASNOW=0. - ENDIF -! -!----------------------------------------------------------------------- -!-- Loop to the end if in clear, subsaturated air free of condensate --- -!----------------------------------------------------------------------- -! - IF (CLEAR) GO TO 10 -! -!----------------------------------------------------------------------- -!--------- Initialize RHO, THICK & microphysical processes ------------- -!----------------------------------------------------------------------- -! -! -!--- Virtual temperature, TV=T*(1./EPS-1)*Q, Q is specific humidity; -! (see pp. 63-65 in Fleagle & Businger, 1963) -! - RHO=PP/(RD*TK*(1.+EPS1*QV)) ! Air density (kg/m**3) - RRHO=1./RHO ! Reciprocal of air density - DTRHO=DTPH*RHO ! Time step * air density - BLDTRH=BLEND*DTRHO ! Blend parameter * time step * air density - THICK=THICK_col(L) ! Layer thickness = RHO*DZ = -DP/G = (Psfc-Ptop)*D_ETA/(G*ETA_sfc) -! - ARAINnew=0. ! Updated accumulated rainfall - ASNOWnew=0. ! Updated accumulated snowfall - QI=QI_col(L) ! Ice mixing ratio - QInew=0. ! Updated ice mixing ratio - QR=QR_col(L) ! Rain mixing ratio - QRnew=0. ! Updated rain ratio - QW=QW_col(L) ! Cloud water mixing ratio - QWnew=0. ! Updated cloud water ratio -! - PCOND=0. ! Condensation (>0) or evaporation (<0) of cloud water (kg/kg) - PIDEP=0. ! Deposition (>0) or sublimation (<0) of ice crystals (kg/kg) - PIACW=0. ! Cloud water collection (riming) by precipitation ice (kg/kg; >0) - PIACWI=0. ! Growth of precip ice by riming (kg/kg; >0) - PIACWR=0. ! Shedding of accreted cloud water to form rain (kg/kg; >0) - PIACR=0. ! Freezing of rain onto large ice at supercooled temps (kg/kg; >0) - PICND=0. ! Condensation (>0) onto wet, melting ice (kg/kg) - PIEVP=0. ! Evaporation (<0) from wet, melting ice (kg/kg) - PIMLT=0. ! Melting ice (kg/kg; >0) - PRAUT=0. ! Cloud water autoconversion to rain (kg/kg; >0) - PRACW=0. ! Cloud water collection (accretion) by rain (kg/kg; >0) - PREVP=0. ! Rain evaporation (kg/kg; <0) -! -!--- Double check input hydrometeor mixing ratios -! -! DUM=WC-(QI+QW+QR) -! DUM1=ABS(DUM) -! DUM2=TOLER*MIN(WC, QI+QW+QR) -! IF (DUM1 .GT. DUM2) THEN -! WRITE(6,"(/2(a,i4),a,i2)") '{@ i=',I_index,' j=',J_index, -! & ' L=',L -! WRITE(6,"(4(a12,g11.4,1x))") -! & '{@ TCold=',TC,'P=',.01*PP,'DIFF=',DUM,'WCold=',WC, -! & '{@ QIold=',QI,'QWold=',QW,'QRold=',QR -! ENDIF -! -!*********************************************************************** -!*********** MAIN MICROPHYSICS CALCULATIONS NOW FOLLOW! **************** -!*********************************************************************** -! -!--- Calculate a few variables, which are used more than once below -! -!--- Latent heat of vaporization as a function of temperature from -! Bolton (1980, JAS) -! - XLV=3.148E6-2370*TK ! Latent heat of vaporization (Lv) - XLF=XLS-XLV ! Latent heat of fusion (Lf) - XLV1=XLV*RCP ! Lv/Cp - XLF1=XLF*RCP ! Lf/Cp - TK2=1./(TK*TK) ! 1./TK**2 -!GFDL XLV2=XLV*XLV*QSW*TK2/RV ! Lv**2*Qsw/(Rv*TK**2) - XLV2=XLV*XLV*QSWgrd*TK2/RV ! Lv**2*QSWgrd/(Rv*TK**2) !GFDL - DENOMW=1.+XLV2*RCP ! Denominator term, Clausius-Clapeyron correction -! -!--- Basic thermodynamic quantities -! * DYNVIS - dynamic viscosity [ kg/(m*s) ] -! * THERM_COND - thermal conductivity [ J/(m*s*K) ] -! * DIFFUS - diffusivity of water vapor [ m**2/s ] -! - TFACTOR=TK**1.5/(TK+120.) - DYNVIS=1.496E-6*TFACTOR - THERM_COND=2.116E-3*TFACTOR - DIFFUS=8.794E-5*TK**1.81/PP -! -!--- Air resistance term for the fall speed of ice following the -! basic research by Heymsfield, Kajikawa, others -! - GAMMAS=(1.E5/PP)**C1 -! -!--- Air resistance for rain fall speed (Beard, 1985, JAS, p.470) -! - GAMMAR=(RHO0/RHO)**.4 -! -!---------------------------------------------------------------------- -!------------- IMPORTANT MICROPHYSICS DECISION TREE ----------------- -!---------------------------------------------------------------------- -! -!--- Determine if conditions supporting ice are present -! - IF (TC.LT.0. .OR. QI.GT.EPSQ .OR. ASNOW.GT.CLIMIT) THEN - ICE_logical=.TRUE. - ELSE - ICE_logical=.FALSE. - QLICE=0. - QTICE=0. - ENDIF -! -!--- Determine if rain is present -! - RAIN_logical=.FALSE. - IF (ARAIN.GT.CLIMIT .OR. QR.GT.EPSQ) RAIN_logical=.TRUE. -! - IF (ICE_logical) THEN -! -!--- IMPORTANT: Estimate time-averaged properties. -! -!--- -! * FLARGE - ratio of number of large ice to total (large & small) ice -! * FSMALL - ratio of number of small ice crystals to large ice particles -! -> Small ice particles are assumed to have a mean diameter of 50 microns. -! * XSIMASS - used for calculating small ice mixing ratio -!--- -! * TOT_ICE - total mass (small & large) ice before microphysics, -! which is the sum of the total mass of large ice in the -! current layer and the input flux of ice from above -! * PILOSS - greatest loss (<0) of total (small & large) ice by -! sublimation, removing all of the ice falling from above -! and the ice within the layer -! * RimeF1 - Rime Factor, which is the mass ratio of total (unrimed & rimed) -! ice mass to the unrimed ice mass (>=1) -! * VrimeF - the velocity increase due to rime factor or melting (ratio, >=1) -! * VSNOW - Fall speed of rimed snow w/ air resistance correction -! * EMAIRI - equivalent mass of air associated layer and with fall of snow into layer -! * XLIMASS - used for calculating large ice mixing ratio -! * FLIMASS - mass fraction of large ice -! * QTICE - time-averaged mixing ratio of total ice -! * QLICE - time-averaged mixing ratio of large ice -! * NLICE - time-averaged number concentration of large ice -! * NSmICE - number concentration of small ice crystals at current level -!--- -!--- Assumed number fraction of large ice particles to total (large & small) -! ice particles, which is based on a general impression of the literature. -! - WVQW=WV+QW ! Water vapor & cloud water -! - - - IF (TC.GE.0. .OR. WVQW.LT.QSIgrd) THEN - ! - !--- Eliminate small ice particle contributions for melting & sublimation - ! - FLARGE=FLARGE1 - ELSE - ! - !--- Enhanced number of small ice particles during depositional growth - ! (effective only when 0C > T >= T_ice [-10C] ) - ! - FLARGE=FLARGE2 - ! - !--- Larger number of small ice particles due to rime splintering - ! - IF (TC.GE.-8. .AND. TC.LE.-3.) FLARGE=.5*FLARGE -! - ENDIF ! End IF (TC.GE.0. .OR. WVQW.LT.QSIgrd) -!GFDL => turned on in GFDL code, but not here => FLARGE=1.0 - FSMALL=(1.-FLARGE)/FLARGE - XSIMASS=RRHO*MASSI(MDImin)*FSMALL - IF (QI.LE.EPSQ .AND. ASNOW.LE.CLIMIT) THEN - INDEXS=MDImin - TOT_ICE=0. - PILOSS=0. - RimeF1=1. - VrimeF=1. - VEL_INC=GAMMAS - VSNOW=0. - EMAIRI=THICK - XLIMASS=RRHO*RimeF1*MASSI(INDEXS) - FLIMASS=XLIMASS/(XLIMASS+XSIMASS) - QLICE=0. - QTICE=0. - NLICE=0. - NSmICE=0. - ELSE - ! - !--- For T<0C mean particle size follows Houze et al. (JAS, 1979, p. 160), - ! converted from Fig. 5 plot of LAMDAs. Similar set of relationships - ! also shown in Fig. 8 of Ryan (BAMS, 1996, p. 66). - ! - DUM=XMImax*EXP(.0536*TC) - INDEXS=MIN(MDImax, MAX(MDImin, INT(DUM) ) ) - TOT_ICE=THICK*QI+BLEND*ASNOW - PILOSS=-TOT_ICE/THICK - LBEF=MAX(1,L-1) - DUM1=RimeF_col(LBEF) - DUM2=RimeF_col(L) - RimeF1=(DUM2*THICK*QI+DUM1*BLEND*ASNOW)/TOT_ICE - RimeF1=MIN(RimeF1, RFmax) - DO IPASS=0,1 - IF (RimeF1 .LE. 1.) THEN - RimeF1=1. - VrimeF=1. - ELSE - IXS=MAX(2, MIN(INDEXS/100, 9)) - XRF=10.492*ALOG(RimeF1) - IXRF=MAX(0, MIN(INT(XRF), Nrime)) - IF (IXRF .GE. Nrime) THEN - VrimeF=VEL_RF(IXS,Nrime) - ELSE - VrimeF=VEL_RF(IXS,IXRF)+(XRF-FLOAT(IXRF))* & - & (VEL_RF(IXS,IXRF+1)-VEL_RF(IXS,IXRF)) - ENDIF - ENDIF ! End IF (RimeF1 .LE. 1.) - VEL_INC=GAMMAS*VrimeF - VSNOW=VEL_INC*VSNOWI(INDEXS) -!! Based on Alig's email, added on 2012-02-09 -!aligo - IF (TC>0.) THEN -!-- Idea provided by Greg Thompson to smoothly increase the fall speed -! of melting snow - DUM=MAX(VSNOW,VRabove) - VEL_INC=DUM/VSNOWI(INDEXS) - VSNOW=DUM - ENDIF -!aligo - -!! - EMAIRI=THICK+BLDTRH*VSNOW - XLIMASS=RRHO*RimeF1*MASSI(INDEXS) - FLIMASS=XLIMASS/(XLIMASS+XSIMASS) - QTICE=TOT_ICE/EMAIRI - QLICE=FLIMASS*QTICE - NLICE=QLICE/XLIMASS - NSmICE=Fsmall*NLICE - ! - IF ( (NLICE.GE.NLImin .AND. NLICE.LE.NLImax) & - & .OR. IPASS.EQ.1) THEN - EXIT - ELSE - ! - !--- Reduce excessive accumulation of ice at upper levels - ! associated with strong grid-resolved ascent - ! - !--- Force NLICE to be between NLImin and NLImax - ! - DUM=MAX(NLImin, MIN(NLImax, NLICE) ) - ! XLI=RHO*(QTICE/DUM-XSIMASS)/RimeF1 -!!! Bug fix -!!! bug fix 2012-02-08, see Aligo's email - XLI=RHO*QLICE/(DUM*RimeF1) !- QLICE is for large ice - IF (XLI .LE. MASSI(MDImin) ) THEN - INDEXS=MDImin - ELSE IF (XLI .LE. MASSI(450) ) THEN - DLI=9.5885E5*XLI**.42066 ! DLI in microns - INDEXS=MIN(MDImax, MAX(MDImin, INT(DLI) ) ) - ELSE IF (XLI .LE. MASSI(MDImax) ) THEN - DLI=3.9751E6*XLI**.49870 ! DLI in microns - INDEXS=MIN(MDImax, MAX(MDImin, INT(DLI) ) ) - ELSE - INDEXS=MDImax - ! - !--- 8/22/01: Increase density of large ice if maximum limits - ! are reached for number concentration (NLImax) and mean size - ! (MDImax). Done to increase fall out of ice. - ! - IF (DUM .GE. NLImax) & -!!! & RimeF1=RHO*(QTICE/NLImax-XSIMASS)/MASSI(INDEXS) -!!! bug fix 2012-02-08, see Aligo's email - & RimeF1=RHO*QLICE/(NLImax*MASSI(INDEXS)) !- QLICE is for large ice - ENDIF ! End IF (XLI .LE. MASSI(MDImin) ) -! WRITE(6,"(4(a12,g11.4,1x))") -! & '{$ TC=',TC,'P=',.01*PP,'NLICE=',NLICE,'DUM=',DUM, -! & '{$ XLI=',XLI,'INDEXS=',FLOAT(INDEXS),'RHO=',RHO,'QTICE=',QTICE, -! & '{$ XSIMASS=',XSIMASS,'RimeF1=',RimeF1 - ENDIF ! End IF ( (NLICE.GE.NLImin .AND. NLICE.LE.NLImax) ... - ENDDO ! End DO IPASS=0,1 - ENDIF ! End IF (QI.LE.EPSQ .AND. ASNOW.LE.CLIMIT) - ENDIF ! End IF (ICE_logical) -! -!---------------------------------------------------------------------- -!--------------- Calculate individual processes ----------------------- -!---------------------------------------------------------------------- -! -!--- Cloud water autoconversion to rain and collection by rain -! - IF (QW.GT.EPSQ .AND. TC.GE.T_ICE) THEN - ! - !--- QW0 could be modified based on land/sea properties, - ! presence of convection, etc. This is why QAUT0 and CRAUT - ! are passed into the subroutine as externally determined - ! parameters. Can be changed in the future if desired. - ! - QW0=QAUT0*RRHO - PRAUT=MAX(0., QW-QW0)*CRAUT - IF (QLICE .GT. EPSQ) THEN - ! - !--- Collection of cloud water by large ice particles ("snow") - ! PIACWI=PIACW for riming, PIACWI=0 for shedding - ! - FWS=MIN(1., CIACW*VEL_INC*NLICE*ACCRI(INDEXS)/PP**C1) - PIACW=FWS*QW - IF (TC .LT. 0.) PIACWI=PIACW ! Large ice riming - ENDIF ! End IF (QLICE .GT. EPSQ) - ENDIF ! End IF (QW.GT.EPSQ .AND. TC.GE.T_ICE) -! -!---------------------------------------------------------------------- -!--- Loop around some of the ice-phase processes if no ice should be present -!---------------------------------------------------------------------- -! - IF (ICE_logical .EQV. .FALSE.) GO TO 20 -! -!--- Now the pretzel logic of calculating ice deposition -! - IF (TC.LT.T_ICE .AND. (WV.GT.QSIgrd .OR. QW.GT.EPSQ)) THEN - ! - !--- Adjust to ice saturation at T0) and evaporation - ! - DUM=PIEVP-PIMLT - IF (DUM .LT. PILOSS) THEN - DUM1=PILOSS/DUM - PIMLT=PIMLT*DUM1 - PIEVP=PIEVP*DUM1 - ENDIF ! End IF (DUM .GT. QTICE) - ENDIF ! End IF (TC.GT.0. .AND. TCC.GT.0. .AND. ICE_logical) -! -!--- IMPORTANT: Estimate time-averaged properties. -! -! * TOT_RAIN - total mass of rain before microphysics, which is the sum of -! the total mass of rain in the current layer and the input -! flux of rain from above -! * VRAIN1 - fall speed of rain into grid from above (with air resistance correction) -! * QTRAIN - time-averaged mixing ratio of rain (kg/kg) -! * PRLOSS - greatest loss (<0) of rain, removing all rain falling from -! above and the rain within the layer -! * RQR - rain content (kg/m**3) -! * INDEXR - mean size of rain drops to the nearest 1 micron in size -! * N0r - intercept of rain size distribution (typically 10**6 m**-4) -! - TOT_RAIN=0. - VRAIN1=0. - QTRAIN=0. - PRLOSS=0. - RQR=0. - N0r=0. - INDEXR=MDRmin - INDEXR1=INDEXR ! For debugging only - IF (RAIN_logical) THEN - IF (ARAIN .LE. 0.) THEN - INDEXR=MDRmin - VRAIN1=0. - ELSE - ! - !--- INDEXR (related to mean diameter) & N0r could be modified - ! by land/sea properties, presence of convection, etc. - ! - !--- Rain rate normalized to a density of 1.194 kg/m**3 - ! - RR=ARAIN/(DTPH*GAMMAR) - ! - IF (RR .LE. RR_DRmin) THEN - ! - !--- Assume fixed mean diameter of rain (0.2 mm) for low rain rates, - ! instead vary N0r with rain rate - ! - INDEXR=MDRmin - ELSE IF (RR .LE. RR_DR1) THEN - ! - !--- Best fit to mass-weighted fall speeds (V) from rain lookup tables - ! for mean diameters (Dr) between 0.05 and 0.10 mm: - ! V(Dr)=5.6023e4*Dr**1.136, V in m/s and Dr in m - ! RR = PI*1000.*N0r0*5.6023e4*Dr**(4+1.136) = 1.408e15*Dr**5.136, - ! RR in kg/(m**2*s) - ! Dr (m) = 1.123e-3*RR**.1947 -> Dr (microns) = 1.123e3*RR**.1947 - ! - INDEXR=INT( 1.123E3*RR**.1947 + .5 ) - INDEXR=MAX( MDRmin, MIN(INDEXR, MDR1) ) - ELSE IF (RR .LE. RR_DR2) THEN - ! - !--- Best fit to mass-weighted fall speeds (V) from rain lookup tables - ! for mean diameters (Dr) between 0.10 and 0.20 mm: - ! V(Dr)=1.0867e4*Dr**.958, V in m/s and Dr in m - ! RR = PI*1000.*N0r0*1.0867e4*Dr**(4+.958) = 2.731e14*Dr**4.958, - ! RR in kg/(m**2*s) - ! Dr (m) = 1.225e-3*RR**.2017 -> Dr (microns) = 1.225e3*RR**.2017 - ! - INDEXR=INT( 1.225E3*RR**.2017 + .5 ) - INDEXR=MAX( MDR1, MIN(INDEXR, MDR2) ) - ELSE IF (RR .LE. RR_DR3) THEN - ! - !--- Best fit to mass-weighted fall speeds (V) from rain lookup tables - ! for mean diameters (Dr) between 0.20 and 0.32 mm: - ! V(Dr)=2831.*Dr**.80, V in m/s and Dr in m - ! RR = PI*1000.*N0r0*2831.*Dr**(4+.80) = 7.115e13*Dr**4.80, - ! RR in kg/(m**2*s) - ! Dr (m) = 1.3006e-3*RR**.2083 -> Dr (microns) = 1.3006e3*RR**.2083 - ! - INDEXR=INT( 1.3006E3*RR**.2083 + .5 ) - INDEXR=MAX( MDR2, MIN(INDEXR, MDR3) ) - ELSE IF (RR .LE. RR_DRmax) THEN - ! - !--- Best fit to mass-weighted fall speeds (V) from rain lookup tables - ! for mean diameters (Dr) between 0.32 and 0.45 mm: - ! V(Dr)=944.8*Dr**.6636, V in m/s and Dr in m - ! RR = PI*1000.*N0r0*944.8*Dr**(4+.6636) = 2.3745e13*Dr**4.6636, - ! RR in kg/(m**2*s) - ! Dr (m) = 1.355e-3*RR**.2144 -> Dr (microns) = 1.355e3*RR**.2144 - ! - INDEXR=INT( 1.355E3*RR**.2144 + .5 ) - INDEXR=MAX( MDR3, MIN(INDEXR, MDRmax) ) - ELSE - ! - !--- Assume fixed mean diameter of rain (0.45 mm) for high rain rates, - ! instead vary N0r with rain rate - ! - INDEXR=MDRmax - ENDIF ! End IF (RR .LE. RR_DRmin) etc. - VRAIN1=GAMMAR*VRAIN(INDEXR) - ENDIF ! End IF (ARAIN .LE. 0.) - INDEXR1=INDEXR ! For debugging only - TOT_RAIN=THICK*QR+BLEND*ARAIN - QTRAIN=TOT_RAIN/(THICK+BLDTRH*VRAIN1) - PRLOSS=-TOT_RAIN/THICK - RQR=RHO*QTRAIN - ! - !--- RQR - time-averaged rain content (kg/m**3) - ! - IF (RQR .LE. RQR_DRmin) THEN - N0r=MAX(N0rmin, CN0r_DMRmin*RQR) - INDEXR=MDRmin - ELSE IF (RQR .GE. RQR_DRmax) THEN - N0r=CN0r_DMRmax*RQR - INDEXR=MDRmax - ELSE - N0r=N0r0 - INDEXR=MAX( XMRmin, MIN(CN0r0*RQR**.25, XMRmax) ) - ENDIF - ! - IF (TC .LT. T_ICE) THEN - PIACR=-PRLOSS - ELSE -!GFDL DWVr=WV-PCOND-QSW - DWVr=WV-PCOND-QSWgrd !GFDL - DUM=QW+PCOND - IF (DWVr.LT.0. .AND. DUM.LE.EPSQ) THEN - ! - !--- Rain evaporation - ! - ! * RFACTOR - [GAMMAR**.5]*[Schmidt**(1./3.)]*[(RHO/DYNVIS)**.5], - ! where Schmidt (Schmidt Number) =DYNVIS/(RHO*DIFFUS) - ! - ! * Units: RFACTOR - s**.5/m ; ABW - m**2/s ; VENTR - m**-2 ; - ! N0r - m**-4 ; VENTR1 - m**2 ; VENTR2 - m**3/s**.5 ; - ! CREVP - unitless - ! - RFACTOR=SQRT(GAMMAR)*(RHO/(DIFFUS*DIFFUS*DYNVIS))**C2 !GFDL - ABW=1./(RHO*XLV2/THERM_COND+1./DIFFUS) - ! - !--- Note that VENTR1, VENTR2 lookup tables do not include the - ! 1/Davg multiplier as in the ice tables - ! - VENTR=N0r*(VENTR1(INDEXR)+RFACTOR*VENTR2(INDEXR)) - CREVP=ABW*VENTR*DTPH - IF (CREVP .LT. Xratio) THEN - DUM=DWVr*CREVP - ELSE - DUM=DWVr*(1.-EXP(-CREVP*DENOMW))/DENOMW - ENDIF - PREVP=MAX(DUM, PRLOSS) - ELSE IF (QW .GT. EPSQ) THEN - FWR=CRACW*GAMMAR*N0r*ACCRR(INDEXR) - PRACW=MIN(1.,FWR)*QW - ENDIF ! End IF (DWVr.LT.0. .AND. DUM.LE.EPSQ) - ! - IF (TC.LT.0. .AND. TCC.LT.0.) THEN - ! - !--- Biggs (1953) heteorogeneous freezing (e.g., Lin et al., 1983) - ! - Rescaled mean drop diameter from microns (INDEXR) to mm (DUM) to prevent underflow - ! - DUM=.001*FLOAT(INDEXR) - DUM=(EXP(ABFR*TC)-1.)*DUM*DUM*DUM*DUM*DUM*DUM*DUM - PIACR=MIN(CBFR*N0r*RRHO*DUM, QTRAIN) - IF (QLICE .GT. EPSQ) THEN - ! - !--- Freezing of rain by collisions w/ large ice - ! - DUM=GAMMAR*VRAIN(INDEXR) - DUM1=DUM-VSNOW - ! - !--- DUM2 - Difference in spectral fall speeds of rain and - ! large ice, parameterized following eq. (48) on p. 112 of - ! Murakami (J. Meteor. Soc. Japan, 1990) - ! - DUM2=SQRT(DUM1*DUM1+.04*DUM*VSNOW) !GFDL - DUM1=5.E-12*INDEXR*INDEXR+2.E-12*INDEXR*INDEXS & - & +.5E-12*INDEXS*INDEXS - FIR=MIN(1., CIACR*NLICE*DUM1*DUM2) - ! - !--- Future? Should COLLECTION BY SMALL ICE SHOULD BE INCLUDED??? - ! - PIACR=MIN(PIACR+FIR*QTRAIN, QTRAIN) - ENDIF ! End IF (QLICE .GT. EPSQ) - DUM=PREVP-PIACR - If (DUM .LT. PRLOSS) THEN - DUM1=PRLOSS/DUM - PREVP=DUM1*PREVP - PIACR=DUM1*PIACR - ENDIF ! End If (DUM .LT. PRLOSS) - ENDIF ! End IF (TC.LT.0. .AND. TCC.LT.0.) - ENDIF ! End IF (TC .LT. T_ICE) - ENDIF ! End IF (RAIN_logical) -! -!---------------------------------------------------------------------- -!---------------------- Main Budget Equations ------------------------- -!---------------------------------------------------------------------- -! -! -!----------------------------------------------------------------------- -!--- Update fields, determine characteristics for next lower layer ---- -!----------------------------------------------------------------------- -! -!--- Carefully limit sinks of cloud water -! - DUM1=PIACW+PRAUT+PRACW-MIN(0.,PCOND) - IF (DUM1 .GT. QW) THEN - DUM=QW/DUM1 - PIACW=DUM*PIACW - PIACWI=DUM*PIACWI - PRAUT=DUM*PRAUT - PRACW=DUM*PRACW - IF (PCOND .LT. 0.) PCOND=DUM*PCOND - ENDIF - PIACWR=PIACW-PIACWI ! TC >= 0C -! -!--- QWnew - updated cloud water mixing ratio -! - DELW=PCOND-PIACW-PRAUT-PRACW - QWnew=QW+DELW - IF (QWnew .LE. EPSQ) QWnew=0. - IF (QW.GT.0. .AND. QWnew.NE.0.) THEN - DUM=QWnew/QW - IF (DUM .LT. TOLER) QWnew=0. - ENDIF -! -!--- Update temperature and water vapor mixing ratios -! - DELT= XLV1*(PCOND+PIEVP+PICND+PREVP) & - & +XLS1*PIDEP+XLF1*(PIACWI+PIACR-PIMLT) - Tnew=TK+DELT -! - DELV=-PCOND-PIDEP-PIEVP-PICND-PREVP - WVnew=WV+DELV -! -!--- Update ice mixing ratios -! -!--- -! * TOT_ICEnew - total mass (small & large) ice after microphysics, -! which is the sum of the total mass of large ice in the -! current layer and the flux of ice out of the grid box below -! * RimeF - Rime Factor, which is the mass ratio of total (unrimed & -! rimed) ice mass to the unrimed ice mass (>=1) -! * QInew - updated mixing ratio of total (large & small) ice in layer -! -> TOT_ICEnew=QInew*THICK+BLDTRH*QLICEnew*VSNOW -! -> But QLICEnew=QInew*FLIMASS, so -! -> TOT_ICEnew=QInew*(THICK+BLDTRH*FLIMASS*VSNOW) -! * ASNOWnew - updated accumulation of snow at bottom of grid cell -!--- -! - DELI=0. - RimeF=1. - IF (ICE_logical) THEN - DELI=PIDEP+PIEVP+PIACWI+PIACR-PIMLT - TOT_ICEnew=TOT_ICE+THICK*DELI - IF (TOT_ICE.GT.0. .AND. TOT_ICEnew.NE.0.) THEN - DUM=TOT_ICEnew/TOT_ICE - IF (DUM .LT. TOLER) TOT_ICEnew=0. - ENDIF - IF (TOT_ICEnew .LE. CLIMIT) THEN - TOT_ICEnew=0. - RimeF=1. - QInew=0. - ASNOWnew=0. - ELSE - ! - !--- Update rime factor if appropriate - ! - DUM=PIACWI+PIACR - IF (DUM.LE.EPSQ .AND. PIDEP.LE.EPSQ) THEN - RimeF=RimeF1 - ELSE - ! - !--- Rime Factor, RimeF = (Total ice mass)/(Total unrimed ice mass) - ! DUM1 - Total ice mass, rimed & unrimed - ! DUM2 - Estimated mass of *unrimed* ice - ! - DUM1=TOT_ICE+THICK*(PIDEP+DUM) - DUM2=TOT_ICE/RimeF1+THICK*PIDEP - IF (DUM2 .LE. 0.) THEN - RimeF=RFmax - ELSE - RimeF=MIN(RFmax, MAX(1., DUM1/DUM2) ) - ENDIF - ENDIF ! End IF (DUM.LE.EPSQ .AND. PIDEP.LE.EPSQ) - QInew=TOT_ICEnew/(THICK+BLDTRH*FLIMASS*VSNOW) - IF (QInew .LE. EPSQ) QInew=0. - IF (QI.GT.0. .AND. QInew.NE.0.) THEN - DUM=QInew/QI - IF (DUM .LT. TOLER) QInew=0. - ENDIF - ASNOWnew=BLDTRH*FLIMASS*VSNOW*QInew - IF (ASNOW.GT.0. .AND. ASNOWnew.NE.0.) THEN - DUM=ASNOWnew/ASNOW - IF (DUM .LT. TOLER) ASNOWnew=0. - ENDIF - ENDIF ! End IF (TOT_ICEnew .LE. CLIMIT) - ENDIF ! End IF (ICE_logical) - - -! -!--- Update rain mixing ratios -! -!--- -! * TOT_RAINnew - total mass of rain after microphysics -! current layer and the input flux of ice from above -! * VRAIN2 - time-averaged fall speed of rain in grid and below -! (with air resistance correction) -! * QRnew - updated rain mixing ratio in layer -! -> TOT_RAINnew=QRnew*(THICK+BLDTRH*VRAIN2) -! * ARAINnew - updated accumulation of rain at bottom of grid cell -!--- -! - DELR=PRAUT+PRACW+PIACWR-PIACR+PIMLT+PREVP+PICND - TOT_RAINnew=TOT_RAIN+THICK*DELR - IF (TOT_RAIN.GT.0. .AND. TOT_RAINnew.NE.0.) THEN - DUM=TOT_RAINnew/TOT_RAIN - IF (DUM .LT. TOLER) TOT_RAINnew=0. - ENDIF - IF (TOT_RAINnew .LE. CLIMIT) THEN - TOT_RAINnew=0. - VRAIN2=0. - QRnew=0. - ARAINnew=0. - ELSE - ! - !--- 1st guess time-averaged rain rate at bottom of grid box - ! - RR=TOT_RAINnew/(DTPH*GAMMAR) - ! - !--- Use same algorithm as above for calculating mean drop diameter - ! (IDR, in microns), which is used to estimate the time-averaged - ! fall speed of rain drops at the bottom of the grid layer. This - ! isn't perfect, but the alternative is solving a transcendental - ! equation that is numerically inefficient and nasty to program - ! (coded in earlier versions of GSMCOLUMN prior to 8-22-01). - ! - IF (RR .LE. RR_DRmin) THEN - IDR=MDRmin - ELSE IF (RR .LE. RR_DR1) THEN - IDR=INT( 1.123E3*RR**.1947 + .5 ) - IDR=MAX( MDRmin, MIN(IDR, MDR1) ) - ELSE IF (RR .LE. RR_DR2) THEN - IDR=INT( 1.225E3*RR**.2017 + .5 ) - IDR=MAX( MDR1, MIN(IDR, MDR2) ) - ELSE IF (RR .LE. RR_DR3) THEN - IDR=INT( 1.3006E3*RR**.2083 + .5 ) - IDR=MAX( MDR2, MIN(IDR, MDR3) ) - ELSE IF (RR .LE. RR_DRmax) THEN - IDR=INT( 1.355E3*RR**.2144 + .5 ) - IDR=MAX( MDR3, MIN(IDR, MDRmax) ) - ELSE - IDR=MDRmax - ENDIF ! End IF (RR .LE. RR_DRmin) - VRAIN2=GAMMAR*VRAIN(IDR) - QRnew=TOT_RAINnew/(THICK+BLDTRH*VRAIN2) - IF (QRnew .LE. EPSQ) QRnew=0. - IF (QR.GT.0. .AND. QRnew.NE.0.) THEN - DUM=QRnew/QR - IF (DUM .LT. TOLER) QRnew=0. - ENDIF - ARAINnew=BLDTRH*VRAIN2*QRnew - IF (ARAIN.GT.0. .AND. ARAINnew.NE.0.) THEN - DUM=ARAINnew/ARAIN - IF (DUM .LT. TOLER) ARAINnew=0. - ENDIF - ENDIF -! - WCnew=QWnew+QRnew+QInew -! -!---------------------------------------------------------------------- -!-------------- Begin debugging & verification ------------------------ -!---------------------------------------------------------------------- -! -!--- QT, QTnew - total water (vapor & condensate) before & after microphysics, resp. -! - - - QT=THICK*(WV+WC)+ARAIN+ASNOW - QTnew=THICK*(WVnew+WCnew)+ARAINnew+ASNOWnew - BUDGET=QT-QTnew -! -!--- Additional check on budget preservation, accounting for truncation effects -! - IF (PRINT_err) THEN - DBG_logical=.FALSE. - DUM=ABS(BUDGET) - IF (DUM .GT. TOLER) THEN - DUM=DUM/MIN(QT, QTnew) - IF (DUM .GT. TOLER) DBG_logical=.TRUE. - ENDIF -! -! DUM=(RHgrd+.001)*QSInew -! IF ( (QWnew.GT.EPSQ) .OR. QRnew.GT.EPSQ .OR. WVnew.GT.DUM) & -! & .AND. TC.LT.T_ICE ) DBG_logical=.TRUE. -! -! IF (TC.GT.5. .AND. QInew.GT.EPSQ) DBG_logical=.TRUE. -! - IF (WVnew.LT.EPSQ .OR. DBG_logical) THEN - ! - WRITE(6,"(/2(a,i4),2(a,i2))") '{} i=',I_index,' j=',J_index, & - & ' L=',L,' LSFC=',LSFC - ! - ESW=1000.*FPVS0(Tnew) - QSWnew=EPS*ESW/(PP-ESW) - IF (TC.LT.0. .OR. Tnew .LT. 0.) THEN - ESI=1000.*FPVS(Tnew) - QSInew=EPS*ESI/(PP-ESI) - ELSE - QSI=QSW - QSInew=QSWnew - ENDIF - WSnew=QSInew - WRITE(6,"(4(a12,g11.4,1x))") & - & '{} TCold=',TC,'TCnew=',Tnew-T0C,'P=',.01*PP,'RHO=',RHO, & - & '{} THICK=',THICK,'RHold=',WV/WS,'RHnew=',WVnew/WSnew, & - & 'RHgrd=',RHgrd, & - & '{} RHWold=',WV/QSW,'RHWnew=',WVnew/QSWnew,'RHIold=',WV/QSI, & - & 'RHInew=',WVnew/QSInew, & - & '{} QSWold=',QSW,'QSWnew=',QSWnew,'QSIold=',QSI,'QSInew=',QSInew, & - & '{} WSold=',WS,'WSnew=',WSnew,'WVold=',WV,'WVnew=',WVnew, & - & '{} WCold=',WC,'WCnew=',WCnew,'QWold=',QW,'QWnew=',QWnew, & - & '{} QIold=',QI,'QInew=',QInew,'QRold=',QR,'QRnew=',QRnew, & - & '{} ARAINold=',ARAIN,'ARAINnew=',ARAINnew,'ASNOWold=',ASNOW, & - & 'ASNOWnew=',ASNOWnew, & - & '{} TOT_RAIN=',TOT_RAIN,'TOT_RAINnew=',TOT_RAINnew, & - & 'TOT_ICE=',TOT_ICE,'TOT_ICEnew=',TOT_ICEnew, & - & '{} BUDGET=',BUDGET,'QTold=',QT,'QTnew=',QTnew - ! - WRITE(6,"(4(a12,g11.4,1x))") & - & '{} DELT=',DELT,'DELV=',DELV,'DELW=',DELW,'DELI=',DELI, & - & '{} DELR=',DELR,'PCOND=',PCOND,'PIDEP=',PIDEP,'PIEVP=',PIEVP, & - & '{} PICND=',PICND,'PREVP=',PREVP,'PRAUT=',PRAUT,'PRACW=',PRACW, & - & '{} PIACW=',PIACW,'PIACWI=',PIACWI,'PIACWR=',PIACWR,'PIMLT=', & - & PIMLT, & - & '{} PIACR=',PIACR - ! - IF (ICE_logical) WRITE(6,"(4(a12,g11.4,1x))") & - & '{} RimeF1=',RimeF1,'GAMMAS=',GAMMAS,'VrimeF=',VrimeF, & - & 'VSNOW=',VSNOW, & - & '{} INDEXS=',FLOAT(INDEXS),'FLARGE=',FLARGE,'FSMALL=',FSMALL, & - & 'FLIMASS=',FLIMASS, & - & '{} XSIMASS=',XSIMASS,'XLIMASS=',XLIMASS,'QLICE=',QLICE, & - & 'QTICE=',QTICE, & - & '{} NLICE=',NLICE,'NSmICE=',NSmICE,'PILOSS=',PILOSS, & - & 'EMAIRI=',EMAIRI, & - & '{} RimeF=',RimeF - ! - IF (TOT_RAIN.GT.0. .OR. TOT_RAINnew.GT.0.) & - & WRITE(6,"(4(a12,g11.4,1x))") & - & '{} INDEXR1=',FLOAT(INDEXR1),'INDEXR=',FLOAT(INDEXR), & - & 'GAMMAR=',GAMMAR,'N0r=',N0r, & - & '{} VRAIN1=',VRAIN1,'VRAIN2=',VRAIN2,'QTRAIN=',QTRAIN,'RQR=',RQR, & - & '{} PRLOSS=',PRLOSS,'VOLR1=',THICK+BLDTRH*VRAIN1, & - & 'VOLR2=',THICK+BLDTRH*VRAIN2 - ! - IF (PRAUT .GT. 0.) WRITE(6,"(a12,g11.4,1x)") '{} QW0=',QW0 - ! - IF (PRACW .GT. 0.) WRITE(6,"(a12,g11.4,1x)") '{} FWR=',FWR - ! - IF (PIACR .GT. 0.) WRITE(6,"(a12,g11.4,1x)") '{} FIR=',FIR - ! - DUM=PIMLT+PICND-PREVP-PIEVP - IF (DUM.GT.0. .or. DWVi.NE.0.) & - & WRITE(6,"(4(a12,g11.4,1x))") & - & '{} TFACTOR=',TFACTOR,'DYNVIS=',DYNVIS, & - & 'THERM_CON=',THERM_COND,'DIFFUS=',DIFFUS - ! - IF (PREVP .LT. 0.) WRITE(6,"(4(a12,g11.4,1x))") & - & '{} RFACTOR=',RFACTOR,'ABW=',ABW,'VENTR=',VENTR,'CREVP=',CREVP, & - & '{} DWVr=',DWVr,'DENOMW=',DENOMW - ! - IF (PIDEP.NE.0. .AND. DWVi.NE.0.) & - & WRITE(6,"(4(a12,g11.4,1x))") & - & '{} DWVi=',DWVi,'DENOMI=',DENOMI,'PIDEP_max=',PIDEP_max, & - & 'SFACTOR=',SFACTOR, & - & '{} ABI=',ABI,'VENTIL=',VENTIL,'VENTIL1=',VENTI1(INDEXS), & - & 'VENTIL2=',SFACTOR*VENTI2(INDEXS), & - & '{} VENTIS=',VENTIS,'DIDEP=',DIDEP - ! -! IF (PIDEP.GT.0. .AND. PCOND.NE.0.) & -! & WRITE(6,"(4(a12,g11.4,1x))") & -! & '{} DENOMW=',DENOMW,'DENOMWI=',DENOMWI,'DENOMF=',DENOMF, & -! & 'DUM2=',PCOND-PIACW - ! -! IF (FWS .GT. 0.) WRITE(6,"(4(a12,g11.4,1x))") & -! & '{} FWS=',FWS - ! - DUM=PIMLT+PICND-PIEVP - IF (DUM.GT. 0.) WRITE(6,"(4(a12,g11.4,1x))") & - & '{} SFACTOR=',SFACTOR,'VENTIL=',VENTIL,'VENTIL1=',VENTI1(INDEXS), & - & 'VENTIL2=',SFACTOR*VENTI2(INDEXS), & - & '{} AIEVP=',AIEVP,'DIEVP=',DIEVP,'QSW0=',QSW0,'DWV0=',DWV0 - ! - ENDIF !-- IF (WVnew.LT.EPSQ .OR. DBG_logical) THEN - ENDIF !-- IF (PRINT_err) THEN - -! -!----------------------------------------------------------------------- -!--------------- Water budget statistics & maximum values -------------- -!----------------------------------------------------------------------- -! -! IF (PRINT_diag) THEN -! ITdx=MAX( ITLO, MIN( INT(Tnew-T0C), ITHI ) ) -! IF (QInew .GT. EPSQ) NSTATS(ITdx,1)=NSTATS(ITdx,1)+1 -! IF (QInew.GT.EPSQ .AND. QRnew+QWnew.GT.EPSQ) & -! & NSTATS(ITdx,2)=NSTATS(ITdx,2)+1 -! IF (QWnew .GT. EPSQ) NSTATS(ITdx,3)=NSTATS(ITdx,3)+1 -! IF (QRnew .GT. EPSQ) NSTATS(ITdx,4)=NSTATS(ITdx,4)+1 -! ! -! QMAX(ITdx,1)=MAX(QMAX(ITdx,1), QInew) -! QMAX(ITdx,2)=MAX(QMAX(ITdx,2), QWnew) -! QMAX(ITdx,3)=MAX(QMAX(ITdx,3), QRnew) -! QMAX(ITdx,4)=MAX(QMAX(ITdx,4), ASNOWnew) -! QMAX(ITdx,5)=MAX(QMAX(ITdx,5), ARAINnew) -! QTOT(ITdx,1)=QTOT(ITdx,1)+QInew*THICK -! QTOT(ITdx,2)=QTOT(ITdx,2)+QWnew*THICK -! QTOT(ITdx,3)=QTOT(ITdx,3)+QRnew*THICK -! ! -! QTOT(ITdx,4)=QTOT(ITdx,4)+PCOND*THICK -! QTOT(ITdx,5)=QTOT(ITdx,5)+PICND*THICK -! QTOT(ITdx,6)=QTOT(ITdx,6)+PIEVP*THICK -! QTOT(ITdx,7)=QTOT(ITdx,7)+PIDEP*THICK -! QTOT(ITdx,8)=QTOT(ITdx,8)+PREVP*THICK -! QTOT(ITdx,9)=QTOT(ITdx,9)+PRAUT*THICK -! QTOT(ITdx,10)=QTOT(ITdx,10)+PRACW*THICK -! QTOT(ITdx,11)=QTOT(ITdx,11)+PIMLT*THICK -! QTOT(ITdx,12)=QTOT(ITdx,12)+PIACW*THICK -! QTOT(ITdx,13)=QTOT(ITdx,13)+PIACWI*THICK -! QTOT(ITdx,14)=QTOT(ITdx,14)+PIACWR*THICK -! QTOT(ITdx,15)=QTOT(ITdx,15)+PIACR*THICK -! ! -! QTOT(ITdx,16)=QTOT(ITdx,16)+(WVnew-WV)*THICK -! QTOT(ITdx,17)=QTOT(ITdx,17)+(QWnew-QW)*THICK -! QTOT(ITdx,18)=QTOT(ITdx,18)+(QInew-QI)*THICK -! QTOT(ITdx,19)=QTOT(ITdx,19)+(QRnew-QR)*THICK -! QTOT(ITdx,20)=QTOT(ITdx,20)+(ARAINnew-ARAIN) -! QTOT(ITdx,21)=QTOT(ITdx,21)+(ASNOWnew-ASNOW) -! IF (QInew .GT. 0.) & -! & QTOT(ITdx,22)=QTOT(ITdx,22)+QInew*THICK/RimeF -! ! -! ENDIF -! -!---------------------------------------------------------------------- -!------------------------- Update arrays ------------------------------ -!---------------------------------------------------------------------- -! - - - T_col(L)=Tnew ! Updated temperature -! - QV_col(L)=max(EPSQ, WVnew/(1.+WVnew)) ! Updated specific humidity - WC_col(L)=max(EPSQ, WCnew) ! Updated total condensate mixing ratio - QI_col(L)=max(EPSQ, QInew) ! Updated ice mixing ratio - QR_col(L)=max(EPSQ, QRnew) ! Updated rain mixing ratio - QW_col(L)=max(EPSQ, QWnew) ! Updated cloud water mixing ratio - RimeF_col(L)=RimeF ! Updated rime factor - ASNOW=ASNOWnew ! Updated accumulated snow - ARAIN=ARAINnew ! Updated accumulated rain -!! 2012-02-09 Based on Aligo's email - !aligo - VRabove=VRAIN2 ! Updated rain fall speed -!aligo - -!! -! -!####################################################################### -! -10 CONTINUE ! ##### End "L" loop through model levels ##### - -!!!!!!!! write(6,*)'2012-02-09,ncw,nlimax,vrabove=',ncw,nlimax,vrabove -! -!####################################################################### -! -!----------------------------------------------------------------------- -!--------------------------- Return to GSMDRIVE ----------------------- -!----------------------------------------------------------------------- -! - CONTAINS -!####################################################################### -!--------- Produces accurate calculation of cloud condensation --------- -!####################################################################### -! - REAL FUNCTION CONDENSE (PP, QW, TK, WV, RHgrd) !GFDL -! -!--------------------------------------------------------------------------------- -!------ The Asai (1965) algorithm takes into consideration the release of ------ -!------ latent heat in increasing the temperature & in increasing the ------ -!------ saturation mixing ratio (following the Clausius-Clapeyron eqn.). ------ -!--------------------------------------------------------------------------------- -! - IMPLICIT NONE -! - INTEGER, PARAMETER :: HIGH_PRES=Selected_Real_Kind(15) - REAL (KIND=HIGH_PRES), PARAMETER :: & - & RHLIMIT=.001, RHLIMIT1=-RHLIMIT - REAL (KIND=HIGH_PRES) :: COND, SSAT, WCdum -! - REAL,INTENT(IN) :: QW,PP,WV,TK,RHgrd !GFDL - REAL WVdum,Tdum,XLV2,DWV,WS,ESW,XLV1,XLV -integer nsteps -! -!----------------------------------------------------------------------- -! -!--- LV (T) is from Bolton (JAS, 1980) -! - XLV=3.148E6-2370.*TK - XLV1=XLV*RCP - XLV2=XLV*XLV*RCPRV - Tdum=TK - WVdum=WV - WCdum=QW - ESW=1000.*FPVS0(Tdum) ! Saturation vapor press w/r/t water - WS=RHgrd*EPS*ESW/(PP-ESW) ! Saturation mixing ratio w/r/t water - DWV=WVdum-WS ! Deficit grid-scale water vapor mixing ratio - SSAT=DWV/WS ! Supersaturation ratio - CONDENSE=0. -nsteps = 0 - DO WHILE ((SSAT.LT.RHLIMIT1 .AND. WCdum.GT.EPSQ) & - & .OR. SSAT.GT.RHLIMIT) - nsteps = nsteps + 1 - COND=DWV/(1.+XLV2*WS/(Tdum*Tdum)) ! Asai (1965, J. Japan) - COND=MAX(COND, -WCdum) ! Limit cloud water evaporation - Tdum=Tdum+XLV1*COND ! Updated temperature - WVdum=WVdum-COND ! Updated water vapor mixing ratio - WCdum=WCdum+COND ! Updated cloud water mixing ratio - CONDENSE=CONDENSE+COND ! Total cloud water condensation - ESW=1000.*FPVS0(Tdum) ! Updated saturation vapor press w/r/t water - WS=RHgrd*EPS*ESW/(PP-ESW) ! Updated saturation mixing ratio w/r/t water - DWV=WVdum-WS ! Deficit grid-scale water vapor mixing ratio - SSAT=DWV/WS ! Grid-scale supersaturation ratio - ENDDO -! - END FUNCTION CONDENSE -! -!####################################################################### -!---------------- Calculate ice deposition at T=PTOP_LO)LTOP(1)=N - IF(PCLD>=PTOP_MID)LTOP(2)=N - IF(PCLD>=PTOP_HI)LTOP(3)=N -! PRINT *,N,PCLD,SHALF(N),PSTAR,PPTOP - ENDDO -! -!*** USE CALL TO CONRAD FOR DIRECT READ OF CO2 FUNCTIONS -!*** OTHERWISE CALL CO2O3. -! - IF(ALLOWED_TO_READ)THEN -#if (EM_CORE==1) - CALL CO2O3(SFULL,SHALF,PPTOP,KME-KMS,KME-KMS+1,KME-KMS+2) -#endif -#if (NMM_CORE==1) - IF(CONFIG_FLAGS%CO2TF==1)THEN - CALL CO2O3(SFULL,SHALF,PPTOP,KME-KMS,KME-KMS+1,KME-KMS+2) - ELSE - CALL CONRAD(KDS,KDE,KMS,KME,KTS,KTE) - ENDIF -#endif -! - CALL O3CLIM - CALL TABLE - IHRST=NINT(GMT) - CALL SOLARD(IHRST,IDAY,MONTH,JULYR) - ENDIF -! -!----------------------------------------------------------------------- - END SUBROUTINE HWRFRAINIT -!----------------------------------------------------------------------- -! -! -!----------------------------------------------------------------------- - SUBROUTINE HWRFRA(explicit_convection, DT,THRATEN,THRATENLW,THRATENSW,PI3D & - & ,XLAND,P8W,DZ8W,RHO_PHY,P_PHY,T & - & ,QV,QW,QI & - & ,TSK2D,GLW,GSW & - & ,TOTSWDN,TOTLWDN,RSWTOA,RLWTOA,CZMEAN & - & ,GLAT,GLON,HTOP,HBOT,htopr,hbotr,ALBEDO,CUPPT & - & ,VEGFRA,SNOW,G,GMT & - & ,NSTEPRA,NPHS,ITIMESTEP & - & ,JULYR,JULDAY,GFDL_LW,GFDL_SW & - & ,CFRACL,CFRACM,CFRACH & - & ,ACFRST,NCFRST,ACFRCV,NCFRCV & - & ,IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE) -!----------------------------------------------------------------------- - IMPLICIT NONE -!----------------------------------------------------------------------- - LOGICAL, INTENT(IN) :: explicit_convection - INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & - & ,IMS,IME,JMS,JME,KMS,KME & - & ,ITS,ITE,JTS,JTE,KTS,KTE,ITIMESTEP & - & ,NPHS,NSTEPRA - - INTEGER,INTENT(IN) :: julyr,julday - INTEGER,INTENT(INOUT),DIMENSION(ims:ime,jms:jme) :: NCFRST & !Added - ,NCFRCV !Added - REAL,INTENT(IN) :: DT,GMT,G - - REAL,INTENT(INOUT),DIMENSION(ims:ime, kms:kme, jms:jme):: & - THRATEN,THRATENLW,THRATENSW - REAL,INTENT(IN),DIMENSION(ims:ime, kms:kme, jms:jme)::p8w,dz8w, & - & rho_phy, & - & p_phy, & - & PI3D - REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme):: ALBEDO,SNOW, & - & TSK2D,VEGFRA, & - & XLAND - REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme):: GLAT,GLON - REAL, INTENT(INOUT), DIMENSION(ims:ime, jms:jme):: HTOP,HBOT,htopr,hbotr,cuppt - REAL, INTENT(INOUT), DIMENSION(ims:ime, jms:jme):: RSWTOA, & !Added - & RLWTOA, & !Added - & ACFRST, & !Added - & ACFRCV - REAL,INTENT(INOUT),DIMENSION(ims:ime, jms:jme):: GLW,GSW - REAL,INTENT(OUT),DIMENSION(ims:ime, jms:jme):: CZMEAN, & - & TOTLWDN,TOTSWDN - REAL,INTENT(OUT),DIMENSION(ims:ime, jms:jme):: CFRACL,CFRACM, & !Added - & CFRACH !Added - REAL, INTENT(IN), DIMENSION(ims:ime, kms:kme, jms:jme):: QI,QV, & - & QW,T -! REAL, INTENT(IN), DIMENSION(37*kte) :: RAD1,RAD2,RAD3,RAD4 - LOGICAL, INTENT(IN) :: gfdl_lw,gfdl_sw - - REAL, DIMENSION(its:ite, kms:kme, jts:jte):: PFLIP,QIFLIP,QFLIP, & - & QWFLIP,TFLIP - REAL, DIMENSION(its:ite, kms:kme, jts:jte)::P8WFLIP,PHYD - REAL, DIMENSION(its:ite, kts:kte, jts:jte)::TENDS,TENDL - - INTEGER :: IDAT(3),Jmonth,Jday - INTEGER :: I,J,K,KFLIP,IHRST -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- - IF(GFDL_LW.AND.GFDL_SW )GO TO 100 - -! -! NEED HYDROSTATIC PRESSURE HERE (MONOTONIC CHANGE WITH HEIGHT) - DO J=JTS,JTE - DO I=ITS,ITE - PHYD(I,KTS,J)=P8W(I,KTS,J) - ENDDO - ENDDO -! - DO J=JTS,JTE - DO K=KTS,KTE - DO I=ITS,ITE - PHYD(I,K+1,J)=PHYD(I,K,J)-G*RHO_PHY(I,K,J)*DZ8W(I,K,J) - ENDDO - ENDDO - ENDDO -! - DO K=KMS,KME - KFLIP=KME+1-K - DO J=JTS,JTE - DO I=ITS,ITE - P8WFLIP(I,K,J)=PHYD(I,KFLIP,J) - ENDDO - ENDDO - ENDDO -! -!- Note that the effects of rain are ignored in this radiation package (BSF 2005-01-25) -! - DO K=KTS,KTE - KFLIP=KTE+1-K - DO J=JTS,JTE - DO I=ITS,ITE - TFLIP (I,K,J)=T(I,KFLIP,J) - QFLIP (I,K,J)=MAX(0.,QV(I,KFLIP,J)/(1.+QV(I,KFLIP,J))) - QWFLIP(I,K,J)=QW(I,KFLIP,J) !Modified - QIFLIP(I,K,J)=QI(I,KFLIP,J) !Added QI -! PFLIP (I,K,J)=P_PHY(I,KFLIP,J) -! -!*** USE MONOTONIC HYDROSTATIC PRESSURE INTERPOLATED TO MID-LEVEL -! - PFLIP(I,K,J)=0.5*(P8WFLIP(I,K,J)+P8WFLIP(I,K+1,J)) - ENDDO - ENDDO - ENDDO -! - DO J=JTS,JTE - DO I=ITS,ITE - HBOTR(I,J)=HBOT(I,J) - HTOPR(I,J)=HTOP(I,J) - ENDDO - ENDDO - - DO J=JTS,JTE - DO I=ITS,ITE - HBOT(I,J)=KTE+1-HBOT(I,J) - HTOP(I,J)=KTE+1-HTOP(I,J) - ENDDO - ENDDO -! - CALL CAL_MON_DAY(JULDAY,JULYR,JMONTH,JDAY) -! - IDAT(1)=JMONTH - IDAT(2)=JDAY - IDAT(3)=JULYR - IHRST =NINT(GMT) - -! CALL SOLARD(R1,IHRST,IDAT) -! CALL SOLARD(R1,IHRST,JULDAY) -!----------------------------------------------------------------------- - CALL RADTN (DT,TFLIP,QFLIP,QWFLIP,QIFLIP, & - & PFLIP,P8WFLIP,XLAND,TSK2D, & - & GLAT,GLON,HTOP,HBOT,ALBEDO,cuppt, & - & .not.explicit_convection, & - & ACFRCV,NCFRCV,ACFRST,NCFRST, & - & VEGFRA,SNOW,GLW,GSW, & - & TOTSWDN,TOTLWDN, & - & IDAT,IHRST, & - & NSTEPRA,NSTEPRA,NPHS,ITIMESTEP, & - & TENDS,TENDL,RSWTOA,RLWTOA,CZMEAN, & - & CFRACL,CFRACM,CFRACH, & - & IDS,IDE,JDS,JDE,KDS,KDE, & - & IMS,IME,JMS,JME,KMS,KME, & - & ITS,ITE,JTS,JTE,KTS,KTE ) -!----------------------------------------------------------------------- -! - IF(GFDL_LW)THEN - DO J=JTS,JTE - DO K = KTS,KTE - KFLIP=KTE+1-K - DO I=ITS,ITE - THRATENLW(I,K,J)=TENDL(I,KFLIP,J)/PI3D(I,K,J) - THRATENSW(I,K,J)=TENDS(I,KFLIP,J)/PI3D(I,K,J) !Put in SW section - THRATEN(I,K,J) =THRATEN(I,K,J) + THRATENLW(I,K,J) - ENDDO - ENDDO - ENDDO - ENDIF -! -!*** THIS ASSUMES THAT LONGWAVE IS CALLED FIRST IN THE RADIATION_DRIVER. -! - IF(GFDL_SW)THEN - DO J=JTS,JTE - DO K=KTS,KTE - KFLIP=KTE+1-K - DO I=ITS,ITE - THRATENSW(I,K,J)=TENDS(I,KFLIP,J)/PI3D(I,K,J) -!!! THRATEN(I,K,J)=THRATEN(I,K,J)+THRATENSW(I,K,J) !Added - ENDDO - ENDDO - ENDDO - ENDIF - -! -!*** RESET ACCUMULATED CONVECTIVE CLOUD TOP/BOT AND CONVECTIVE PRECIP -!*** FOR NEXT INTERVAL BETWEEN RADIATION CALLS -! - DO J=JTS,JTE - DO I=ITS,ITE -!!!! HBOT(I,J)=KTE+1-HBOT(I,J) -!!!! HTOP(I,J)=KTE+1-HTOP(I,J) - HBOT(I,J)=REAL(KTE+1) - HTOP(I,J)=0. - CUPPT(I,J)=0. - ENDDO - ENDDO - ! - 100 IF(GFDL_SW)THEN - DO J=JTS,JTE - DO K=KTS,KTE - KFLIP=KTE+1-K - DO I=ITS,ITE - THRATEN(I,K,J)=THRATEN(I,K,J)+THRATENSW(I,K,J) - ENDDO - ENDDO - ENDDO - ENDIF -! - END SUBROUTINE HWRFRA -! -!----------------------------------------------------------------------- - SUBROUTINE RADTN(DT,T,Q,QCW,QICE, & - & PFLIP,P8WFLIP,XLAND,TSK2D, & - & GLAT,GLON,HTOP,HBOT,ALB,CUPPT,CNCLD, & -! & RAD1,RAD2,RAD3,RAD4, & -! & TABLE1,TABLE2,TABLE3,EM1,EM1WDE,EM3, & - & ACFRCV,NCFRCV,ACFRST,NCFRST, & - & VEGFRC,SNO,GLW,GSW, & - & RSWIN,RLWIN, & !Added -! & IDAT,LTOP,IHRST,PRGFDL, & - & IDAT,IHRST, & - & NRADS,NRADL,NPHS,NTSD, & -! & SKO3R,AB15WD,SKC1R,SKO2D, & -!#$ & TENDS,TENDL, & - & TENDS,TENDL,RSWTOA,RLWTOA,CZMEAN, & - & CFRACL,CFRACM,CFRACH, & !Added - & ids,ide, jds,jde, kds,kde, & - & ims,ime, jms,jme, kms,kme, & - & its,ite, jts,jte, kts,kte ) -!----------------------------------------------------------------------- - IMPLICIT NONE -!----------------------------------------------------------------------- -! GLAT : geodetic latitude in radians of the mass points on the computational grid. - -! CZEN : instantaneous cosine of the solar zenith angle. - -! HTOP : (REAL) model layer number that is highest in the atmosphere -! in which convective cloud occurred since the previous call to the -! radiation driver. - -! HBOT : (REAL) model layer number that is lowest in the atmosphere -! in which convective cloud occurred since the previous call to the -! radiation driver. - -! ALB : is no longer used in the operational radiation. Prior to 24 July 2001 -! ALB was the climatological albedo that was modified within RADTN to -! account for vegetation fraction and snow. -! -! ALB : reintroduced as the dynamic albedo from LSM - -! CUPPT: accumulated convective precipitation (meters) since the -! last call to the radiation. - -! THS : potential temperature of the ground surface. - -! IHE and IHW are relative location indices needed to locate neighboring -! points on the Eta's Arakawa E grid since arrays are indexed locally on -! each MPI task rather than globally. IHE refers to the adjacent grid -! point (a V point) to the east of the mass point being considered. IHW -! is the adjacent grid point to the west of the given mass point. - -! IRAD is a relic from older code that is no longer needed. - -! ACFRCV : sum of the convective cloud fractions that were computed -! during each call to the radiation between calls to the subroutines that -! do the forecast output. - -! NCFRCV : the total number of times in which the convective cloud -! fraction was computed to be greater than zero in the radiation between -! calls to the output routines. In the post-processor, ACFRCV is divided -! by NCFRCV to yield an average convective cloud fraction. - -! ACFRST and NCFRST are the analogs for stratiform cloud cover. - -! VEGFRC is the fraction of the gridbox with vegetation. - -! LVL holds the number of model layers that lie below the ground surface -! at each point. Clearly for sigma coordinates LVL is zero everywhere. - -! CTHK : an assumed maximum thickness of stratiform clouds currently set -! to 20000 Pascals. I think this is relevant for computing "low", -! "middle", and "high" cloud fractions which are post-processed but which -! do not feed back into the integration. - -! IDAT : a 3-element integer array holding the month, day, and year, -! respectively, of the date for the start time of the free forecast. - -! ABCFF : holds coefficients for various absorption bands. You can see -! where they are set in GFDLRD.F. - -! LTOP : a 3-element integer array holding the model layer that is at or -! immediately below the specified pressure levels for the tops -! of "high" (15000 Pa), "middle" (35000 Pa), and "low" (64200 Pa) -! stratiform clouds. These are for the diagnostic cloud layers -! needed in the output but not in the integration. - -! R1 : earth-sun distance in astronomical units. - -! NRADS : integer number of fundamental timesteps (our smallest -! timestep, i.e., the one for inertial gravity wave adjustment) -! between updates of the shortwave tendencies. Currently we -! update the shortwave every hour. - -! NRADL : integer number of fundamental timesteps between updates of -! the longwave tendencies. Currently we update the longwave -! every two hours. - -! NTSD : integer counter of the fundamental timesteps that have -! elapsed since the start of the forecast. -! -!********************************************************************** -!****************************** NOTE ********************************** -!********************************************************************** -!*** DUE TO THE RESETTING OF CONVECTIVE PRECIP AND CONVECTIVE CLOUD -!*** TOPS AND BOTTOMS, SHORTWAVE MUST NOT BE CALLED LESS FREQUENTLY -!*** THAN LONGWAVE. -!********************************************************************** -!****************************** NOTE ********************************** -!********************************************************************** -!----------------------------------------------------------------------- -! INTEGER, PARAMETER :: NL=81 - LOGICAL, INTENT(IN) :: cncld - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - & ims,ime, jms,jme, kms,kme , & - & its,ite, jts,jte, kts,kte - INTEGER, INTENT(IN) :: NRADS,NRADL,NTSD,NPHS -! LOGICAL, INTENT(IN) :: RESTRT - REAL , INTENT(IN) :: DT -! REAL , INTENT(IN), DIMENSION(37,NL) :: XDUO3N,XDO3N2,XDO3N3,XDO3N4 - INTEGER, INTENT(IN), DIMENSION(3) :: IDAT -!----------------------------------------------------------------------- - REAL, PARAMETER :: CAPA=R_D/CP,DTR=3.1415926/180. - INTEGER :: LM1,LP1,LM - INTEGER, INTENT(IN) :: IHRST -! REAL, INTENT(IN), DIMENSION(NL) :: PRGFDL -! - REAL, PARAMETER :: ALPHA0=100.,CLFRMIN=0.1,CUPRATE=24.*1000., & - & EPS=R_D/R_V,EPSO3=1.E-10, & - & EPSQ=1.E-12,EPSQ1=1.E-5, & - & GAMMA=0.49,H0=0.,H1=1.,H69=-6.9,HPINC=1.E1, & - & PBOT=10000.0,PEXP=0.25, & - & QCLDMIN=EPSQ,RLAG=14.8125, & - & STBOL=STBOLT,T_ICE=-10. -! - INTEGER, PARAMETER :: NB=12,KSMUD=0 - INTEGER,PARAMETER :: K15=SELECTED_REAL_KIND(15) - REAL (KIND=K15) :: DDX,EEX,PROD -! REAL, INTENT(IN) :: SKO3R,AB15WD,SKC1R,SKO2D -!----------------------------------------------------------------------- - LOGICAL :: SHORT,LONG - LOGICAL :: BITX,BITY,BITZ,BITW,BIT1,BIT2,BITC,BITS,BITCP1,BITSP1 - LOGICAL :: NEW_CLOUD -!----------------------------------------------------------------------- - REAL, INTENT(IN), DIMENSION(ims:ime,jms:jme) :: XLAND,TSK2D - REAL, INTENT(IN), DIMENSION(its:ite, kms:kme, jts:jte):: Q,QCW, & - & QICE,T - REAL, INTENT(IN), DIMENSION(its:ite, kms:kme, jts:jte):: PFLIP, & - & P8WFLIP - -! REAL, INTENT(IN), DIMENSION(28,180) :: TABLE1,TABLE2,TABLE3,EM3,EM1,EM1WDE - REAL, INTENT(OUT), DIMENSION(ims:ime, jms:jme):: GLW,GSW,CZMEAN & - & ,RSWIN,RLWIN & !Added - & ,CFRACL,CFRACM & - & ,CFRACH - -! REAL, INTENT(IN), DIMENSION(kms:kme) :: ETAD -! REAL, INTENT(IN), DIMENSION(kms:kme) :: AETA -!----------------------------------------------------------------------- - REAL, INTENT(INOUT), DIMENSION(ims:ime,jms:jme) :: HTOP,HBOT - REAL, INTENT(IN ), DIMENSION(ims:ime,jms:jme) :: ALB,SNO - REAL, INTENT(IN ), DIMENSION(ims:ime,jms:jme) :: GLAT,GLON -!----------------------------------------------------------------------- - REAL, DIMENSION(ims:ime,jms:jme) :: CZEN -!#$ REAL, DIMENSION(its:ite,jts:jte) :: CZMEAN,SIGT4 - REAL, DIMENSION(its:ite,jts:jte) :: SIGT4 - INTEGER, DIMENSION(its:ite, jts:jte):: LMH -!----------------------------------------------------------------------- - REAL, INTENT(INOUT), DIMENSION(ims:ime,jms:jme) :: CUPPT -! REAL, DIMENSION(37*kte) :: RAD1,RAD2,RAD3,RAD4 -!----------------------------------------------------------------------- -! INTEGER,INTENT(IN), DIMENSION(jms:jme) :: IHE,IHW -!----------------------------------------------------------------------- - REAL, INTENT(INOUT), DIMENSION(ims:ime,jms:jme) :: ACFRCV,ACFRST & - ,RSWTOA,RLWTOA - INTEGER,INTENT(INOUT), DIMENSION(ims:ime,jms:jme) :: NCFRCV,NCFRST -!----------------------------------------------------------------------- -!#$ REAL, DIMENSION(its:ite,jts:jte) :: RLWIN,RLWOUT - REAL, DIMENSION(its:ite,jts:jte) :: RLWOUT -!----------------------------------------------------------------------- - REAL, INTENT(IN), DIMENSION(ims:ime,jms:jme) :: VEGFRC - REAL, INTENT(INOUT),DIMENSION(its:ite,kts:kte,jts:jte) :: TENDL,& - & TENDS -!#$ REAL, DIMENSION(its:ite,jts:jte) :: RSWIN,RSWOUT,RSWTOA -!#$ REAL, DIMENSION(its:ite,jts:jte) :: RSWIN,RSWOUT - REAL, DIMENSION(its:ite,jts:jte) :: RSWOUT - REAL, DIMENSION(its:ite,kts:kte,jts:jte):: RSWTT,RLWTT -!----------------------------------------------------------------------- - REAL :: CTHK(3) - DATA CTHK/20000.0,20000.0,20000.0/ - - REAL :: PTOPC(4) - REAL,DIMENSION(10),SAVE :: CC,PPT -!----------------------------------------------------------------------- - REAL,SAVE :: ABCFF(NB) - INTEGER,DIMENSION(its:ite,jts:jte) :: LVL - REAL, DIMENSION(its:ite, jts:jte):: PDSL,FNE,FSE,TL - REAL, DIMENSION( 0:kte) :: CLDAMT - REAL, DIMENSION(its:ite,3):: CLDCFR - INTEGER, DIMENSION(its:ite,3):: MBOT,MTOP - REAL, DIMENSION(its:ite) :: PSFC,TSKN,ALBEDO,XLAT,COSZ, & - & SLMSK,FLWUP, & - & FSWDN,FSWUP,FSWDNS,FSWUPS,FLWDNS, & - & FLWUPS - - REAL, DIMENSION(its:ite,kts:kte) :: PMID,TMID - REAL, DIMENSION(its:ite,kts:kte) :: QMID,THMID,OZN,POZN - REAL, DIMENSION(its:ite,jts:jte) :: TOT - - REAL, DIMENSION(its:ite,kts:kte+1) :: PINT,EMIS,CAMT - INTEGER,DIMENSION(its:ite,kts:kte+1) :: KBTM,KTOP - INTEGER,DIMENSION(its:ite) :: NCLDS,KCLD - REAL, DIMENSION(its:ite) :: TAUDAR - REAL, DIMENSION(its:ite,NB,kts:kte+1) ::RRCL,TTCL - - REAL, DIMENSION(its:ite,kts:kte):: CSMID,CCMID,QWMID,QIMID - REAL,SAVE :: PLOMD,PMDHI,PHITP,P400,PLBTM - INTEGER,SAVE :: NFILE - -!----------------------------------------------------------------------- - REAL :: CLSTP,TIME,DAYI,HOUR,ADDL,RANG,RSIN1,RCOS1,RCOS2 - REAL :: TIMES,EXNER,APES,SNOFAC,CCLIMIT,CLIMIT,P1,P2,CC1,CC2 - REAL :: PMOD,CLFR1,CTAU,WV,ARG,CLDMAX - REAL :: CL1,CL2,CR1,DPCL,QSUM,PRS1,PRS2,DELP,TCLD,DD,EE,AA,FF - REAL :: BB,GG,DENOM,FCTRA,FCTRB,PDSLIJ,CFRAVG,SNOMM - REAL :: TAUC,THICK,CONVPRATE,CLFR,ESAT,QSAT,RHUM,QCLD,RHGRID - INTEGER :: I,J,MYJS,MYJE,MYIS,MYIE,NTSPH,NRADPP,ITIMSW,ITIMLW, & - & JD,II - INTEGER :: L,N,LML,LVLIJ,IR,KNTLYR,LL,NC,L400,NMOD,LTROP,IWKL - INTEGER :: LCNVB,LCNVT - INTEGER :: NLVL,MALVL,LLTOP,LLBOT,KBT2,KTH1,KBT1,KTH2,KTOP1,KFLIP - INTEGER :: NBAND,NCLD,LBASE,NKTP,NBTM,KS,MYJS1,MYJS2,MYJE2,MYJE1 - -! REAL,DIMENSION(5040):: T1,T2,T4,EM1V,EM1VW,EM3V - -! EQUIVALENCE (EM1V(1),EM1(1,1)),(EM1VW(1),EM1WDE(1,1)) -! EQUIVALENCE (EM3V(1),EM3(1,1)) -! EQUIVALENCE (T1(1),TABLE1(1,1)),(T2(1),TABLE2(1,1)), & -! (T4(1),TABLE3(1,1)) - - DATA PLOMD/64200./,PMDHI/35000./,PHITP/15000./,P400/40000./, & - PLBTM/105000./ - DATA NFILE/14/ - DATA CC/0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0/ - DATA PPT/0.,.14,.31,.70,1.6,3.4,7.7,17.,38.,85./ - DATA ABCFF/2*4.0E-5,.002,.035,.377,1.95,9.40,44.6,190.,989., & - & 2706.,39011./ - -!----------------------------------------------------------------------- -!*********************************************************************** -!----------------------------------------------------------------------- - MYJS=jts - MYJE=jte - MYIS=its - MYIE=ite - MYJS1=jts !???? - MYJE1=jte - MYJS2=jts - MYJE2=jte - LM=kte - LM1=LM-1 - LP1=LM+1 -! CNCLD=.TRUE. -! - DO J=JTS,JTE - DO I=ITS,ITE - LMH(I,J)=KME-1 - LVL(I,J)=0 - ENDDO - ENDDO -!*** -!*** ASSIGN THE PRESSURES FOR CLOUD DOMAIN BOUNDARIES -!*** - PTOPC(1)=PLBTM - PTOPC(2)=PLOMD - PTOPC(3)=PMDHI - PTOPC(4)=PHITP -!********************************************************************** -!*** THE FOLLOWING CODE IS EXECUTED EACH TIME THE RADIATION IS CALLED. -!********************************************************************** -!----------------------CONVECTION-------------------------------------- -! NRADPP IS THE NUMBER OF TIME STEPS TO ACCUMULATE CONVECTIVE PRECIP -! FOR RADIATION -! NOTE: THIS WILL NOT WORK IF NRADS AND NRADL ARE DIFFERENT UNLESS -! THEY ARE INTEGER MULTIPLES OF EACH OTHER -! CLSTP IS THE NUMBER OF HOURS OF THE ACCUMULATION PERIOD -! - NTSPH=NINT(3600./DT) - NRADPP=MIN(NRADS,NRADL) - CLSTP=1.0*NRADPP/NTSPH - CONVPRATE=CUPRATE/CLSTP -!GFDL RHGRID=RHGRD - RHGRID=RHgrd_in !GFDL => simple right now w/o height-dependencies -!----------------------CONVECTION-------------------------------------- -!*** -!*** STATE WHETHER THE SHORT OR LONGWAVE COMPUTATIONS ARE TO BE DONE. -!*** - SHORT=.TRUE. - LONG=.TRUE. - ITIMSW=0 - ITIMLW=0 - IF(SHORT)ITIMSW=1 - IF(LONG) ITIMLW=1 -!*** -!*** FIND THE MEAN COSINE OF THE SOLAR ZENITH ANGLE -!*** BETWEEN THE CURRENT TIME AND THE NEXT TIME RADIATION IS -!*** CALLED. ONLY AVERAGE IF THE SUN IS ABOVE THE HORIZON. -!*** - TIME=NTSD*DT -! CALL ZENITH(TIME,DAYI,HOUR) -!----------------------------------------------------------------------- - CALL ZENITH(TIME,DAYI,HOUR,IDAT,IHRST,GLON,GLAT,CZEN, & - & MYIS,MYIE,MYJS,MYJE, & - & ids,ide, jds,jde, kds,kde, & - & ims,ime, jms,jme, kms,kme, & - & its,ite, jts,jte, kts,kte ) -!----------------------------------------------------------------------- - - JD=INT(DAYI+0.50) - ADDL=0. - IF(MOD(IDAT(3),4).EQ.0)ADDL=1. - RANG=PI2*(DAYI-RLAG)/(365.25+ADDL) - RSIN1=SIN(RANG) - RCOS1=COS(RANG) - RCOS2=COS(2.*RANG) -! -!----------------------------------------------------------------------- - IF(SHORT)THEN - DO J=MYJS,MYJE - DO I=MYIS,MYIE - CZMEAN(I,J)=0. - TOT(I,J)=0. - ENDDO - ENDDO -! - DO II=0,NRADS,NPHS - TIMES=NTSD*DT+II*DT - CALL ZENITH(TIMES,DAYI,HOUR,IDAT,IHRST,GLON,GLAT,CZEN, & - & MYIS,MYIE,MYJS,MYJE, & - & ids,ide, jds,jde, kds,kde, & - & ims,ime, jms,jme, kms,kme, & - & its,ite, jts,jte, kts,kte ) - DO J=MYJS,MYJE - DO I=MYIS,MYIE - IF(CZEN(I,J).GT.0.)THEN - CZMEAN(I,J)=CZMEAN(I,J)+CZEN(I,J) - TOT(I,J)=TOT(I,J)+1. - ENDIF -! - ENDDO - ENDDO - ENDDO - DO J=MYJS,MYJE - DO I=MYIS,MYIE - IF(TOT(I,J).GT.0.)CZMEAN(I,J)=CZMEAN(I,J)/TOT(I,J) -! - ENDDO - ENDDO -! -!*** MODIFY CZEN TO BE AT THE TOP OF THE HOUR. -! -! TIMES=NTSD*DT -! CALL ZENITH(TIMES,DAYI,HOUR,IDAT,IHRST,GLON,GLAT,CZEN, & -! & MYIS,MYIE,MYJS,MYJE, & -! & ids,ide, jds,jde, kds,kde, & -! & ims,ime, jms,jme, kms,kme, & -! & its,ite, jts,jte, kts,kte ) - ENDIF -!----------------------------------------------------------------------- -! -!*********************************************************************** -!*** THIS IS THE BEGINNING OF THE PRIMARY LOOP THROUGH THE DOMAIN -!*********************************************************************** -! ********************* - DO 700 J = MYJS, MYJE -! ********************* -! - DO 125 L=1,LM - DO I=MYIS,MYIE -! IR=IRAD(I) - TMID(I,L)=T(I,1,J) - QMID(I,L)=EPSQ - QWMID(I,L)=0. - QIMID(I,L)=0. - CSMID(I,L)=0. - CCMID(I,L)=0. - OZN(I,L)=EPSO3 - TENDS(I,L,J)=0. - TENDL(I,L,J)=0. - ENDDO - 125 CONTINUE -! - DO 140 N=1,3 - DO I=MYIS,MYIE - CLDCFR(I,N)=0. - MTOP(I,N)=0 - MBOT(I,N)=0 - ENDDO - 140 CONTINUE -!*** -!*** FILL IN WORKING ARRAYS WHERE VALUES AT L=LM ARE THOSE THAT -!*** ARE ACTUALLY AT ETA LEVEL L=LMH. -!*** - DO 200 I=MYIS,MYIE -! IR=IRAD(I) - LML=LMH(I,J) - LVLIJ=LVL(I,J) -! - DO L=1,LML - PMID(I,L+LVLIJ)=PFLIP(I,L,J) - PINT(I,L+LVLIJ+1)=P8WFLIP(I,L+1,J) - EXNER=(1.E5/PMID(I,L+LVLIJ))**CAPA - TMID(I,L+LVLIJ)=T(I,L,J) - THMID(I,L+LVLIJ)=T(I,L,J)*EXNER - QMID(I,L+LVLIJ)=Q(I,L,J) -!--- Note that rain is ignored, only effects from cloud water and ice are considered - QWMID(I,L+LVLIJ)=QCW(I,L,J) - QIMID(I,L+LVLIJ)=QICE(I,L,J) - ENDDO -!*** -!*** FILL IN ARTIFICIAL VALUES ABOVE THE TOP OF THE DOMAIN. -!*** PRESSURE DEPTHS OF THESE LAYERS IS 1 HPA. -!*** TEMPERATURES ABOVE ARE ALREADY ISOTHERMAL WITH (TRUE) LAYER 1. -!*** - IF(LVLIJ.GT.0)THEN - KNTLYR=0 -! - DO L=LVLIJ,1,-1 - KNTLYR=KNTLYR+1 - PMID(I,L)=P8WFLIP(I,1,J)-REAL(2*KNTLYR-1)*0.5*HPINC - PINT(I,L+1)=PMID(I,L)+0.5*HPINC - EXNER=(1.E5/PMID(I,L))**CAPA - THMID(I,L)=TMID(I,L)*EXNER - ENDDO - ENDIF -! - IF(LVLIJ.EQ.0) THEN - PINT(I,1)=P8WFLIP(I,1,J) - ELSE - PINT(I,1)=PMID(I,1)-0.5*HPINC - ENDIF - 200 CONTINUE -!*** -!*** FILL IN THE SURFACE PRESSURE, SKIN TEMPERATURE, GEODETIC LATITUDE, -!*** ZENITH ANGLE, SEA MASK, AND ALBEDO. THE SKIN TEMPERATURE IS -!*** NEGATIVE OVER WATER. -!*** - DO 250 I=MYIS,MYIE - PSFC(I)=P8WFLIP(I,KME,J) - APES=(PSFC(I)*1.E-5)**CAPA -! TSKN(I)=THS(I,J)*APES*(1.-2.*SM(I,J)) - IF((XLAND(I,J)-1.5).GT.0.)THEN - TSKN(I)=-TSK2D(I,J) - ELSE - TSKN(I)=TSK2D(I,J) - ENDIF - -! TSKN(I)=THS(I,J)*APES*(1.-2.*(XLAND(I,J)-1.)) -! SLMSK(I)=SM(I,J) - SLMSK(I)=XLAND(I,J)-1. -! -! SNO(I,J)=AMAX1(SNO(I,J),0.) - SNOMM=AMAX1(SNO(I,J),0.) - SNOFAC=AMIN1(SNOMM/0.02, 1.0) -!!!! ALBEDO(I)=ALB(I,J)+(1.0-0.01*VEGFRC(I,J))*SNOFAC*(SNOALB-ALB(I,J)) - ALBEDO(I)=ALB(I,J) -! - XLAT(I)=GLAT(I,J)/DTR - COSZ(I)=CZMEAN(I,J) - 250 CONTINUE -!----------------------------------------------------------------------- -!--- COMPUTE GRID-SCALE CLOUD COVER FOR RADIATION -! (modified by Ferrier, Feb '02) -! -!--- Cloud fraction parameterization follows Randall, 1994 -! (see Hong et al., 1998) -!----------------------------------------------------------------------- -! - DO I=MYIS,MYIE - LML=LMH(I,J) - LVLIJ=LVL(I,J) - DO L=1,LML - LL=L+LVLIJ -! -!--- Water vapor mixing ratio -! - WV=QMID(I,LL)/(1.-QMID(I,LL)) -! -!--- Saturation vapor pressure w/r/t water ( >=0C ) or ice ( <0C ) -! - ESAT=1000.*FPVS(TMID(I,LL)) !--- Saturation vapor pressure (Pa) - QSAT=EPS*ESAT/(PMID(I,LL)-ESAT) !--- Saturation mixing ratio - RHUM=WV/QSAT !--- Relative humidity -! -!--- Total "cloud" mixing ratio, QCLD. Rain is not part of cloud, -! only cloud water + cloud ice + snow -! - QCLD=QWMID(I,LL)+QIMID(I,LL) -! -!--- Determine cloud fraction (modified from original algorithm) -! - IF (QCLD .LT. QCLDMIN) THEN -! -!--- Assume zero cloud fraction if there is no cloud mixing ratio -! - CLFR=H0 - ELSEIF(RHUM.GE.RHGRID)THEN -! -!--- Assume cloud fraction of unity if near saturation and the cloud -! mixing ratio is at or above the minimum threshold -! - CLFR=H1 - ELSE -! -!--- Adaptation of original algorithm (Randall, 1994; Zhao, 1995) -! modified based on assumed grid-scale saturation at RH=RHgrid. -! - DENOM=(RHGRID*QSAT-WV)**GAMMA - ARG=MAX(H69, -ALPHA0*QCLD/DENOM) ! <-- EXP(-6.9)=.001 - CLFR=(RHUM/RHGRID)**PEXP*(1.-EXP(ARG)) -!! ARG=-1000*QCLD/(RHUM-RHGRID) -!! ARG=MAX(ARG, ARGMIN) -!! CLFR=(RHUM/RHGRID)*(1.-EXP(ARG)) - IF (CLFR .LT. .01) CLFR=0. - ENDIF !--- End IF (QCLD .LT. QCLDmin) ... - CSMID(I,LL)=MIN(H1,CLFR) - ENDDO !--- End DO L ... - ENDDO !--- End DO I ... -!*********************************************************************** -!********************END OF STRATIFORM CLOUD SECTION******************** -!*********************************************************************** -! -!----------------------------------------------------------------------- -!--- COMPUTE CONVECTIVE CLOUD COVER FOR RADIATION -! -!--- The parameterization of Slingo (1987, QJRMS, Table 1, p. 904) is -! used for convective cloud fraction as a function of precipitation -! rate. Cloud fractions have been increased by 20% for each rainrate -! interval so that shallow, nonprecipitating convection is ascribed a -! constant cloud fraction of 0.1 (Ferrier, Feb '02). -!----------------------------------------------------------------- -! - IF (CNCLD) THEN - DO I=MYIS,MYIE -! -!*** CLOUD TOPS AND BOTTOMS COME FROM CUCNVC. -!*** CONVECTIVE CLOUDS NEED TO BE AT LEAST 2 MODEL LAYERS THICK. -! - IF (HBOT(I,J)-HTOP(I,J) .GT. 1.0) THEN -!--- Compute convective cloud fractions if appropriate (Ferrier, Feb '02) - CLFR=CC(1) - PMOD=CUPPT(I,J)*CONVPRATE - IF (PMOD .GT. PPT(1)) THEN - DO NC=1,10 - IF(PMOD.GT.PPT(NC)) NMOD=NC - ENDDO - IF (NMOD .GE. 10) THEN - CLFR=CC(10) - ELSE - CC1=CC(NMOD) - CC2=CC(NMOD+1) - P1=PPT(NMOD) - P2=PPT(NMOD+1) - CLFR=CC1+(CC2-CC1)*(PMOD-P1)/(P2-P1) - ENDIF !--- End IF (NMOD .GE. 10) ... - CLFR=MIN(H1, CLFR) - ENDIF !--- End IF (PMOD .GT. PPT(1)) ... -! -!*** ADD LVL TO BE CONSISTENT WITH OTHER WORKING ARRAYS -! - LVLIJ=LVL(I,J) - LCNVT=NINT(HTOP(I,J))+LVLIJ - LCNVT=MIN(LM,LCNVT) - LCNVB=NINT(HBOT(I,J))+LVLIJ - LCNVB=MIN(LM,LCNVB) -! - DO LL=LCNVT,LCNVB - CCMID(I,LL)=CLFR - ENDDO - ENDIF !--- IF (HBOT(I,J)-HTOP(I,J) .GT. 1.0) ... - ENDDO !--- End DO I loop - ENDIF !--- End IF (CNCLD) ... -!********************************************************************* -!*****************END OF CONVECTIVE CLOUD SECTION***************** -!********************************************************************* -!*** -!*** DETERMINE THE FRACTIONAL CLOUD COVERAGE FOR HIGH, MID -!*** AND LOW OF CLOUDS FROM THE CLOUD COVERAGE AT EACH LEVEL -!*** -!*** NOTE: THIS IS FOR DIAGNOSTICS ONLY!!! -!*** -!*** - DO 500 I=MYIS,MYIE -!! - DO L=0,LM - CLDAMT(L)=0. - ENDDO -!! -!!*** NOW GOES LOW, MIDDLE, HIGH -!! - DO 480 NLVL=1,3 - CLDMAX=0. - MALVL=LM - LLTOP=LM+1-LTOP(NLVL)+LVL(I,J) -!!*** -!!*** GO TO THE NEXT CLOUD LAYER IF THE TOP OF THE CLOUD-TYPE IN -!!*** QUESTION IS BELOW GROUND OR IS IN THE LOWEST LAYER ABOVE GROUND. -!!*** - IF(LLTOP.GE.LM)GO TO 480 -!! - IF(NLVL.GT.1)THEN - LLBOT=LM+1-LTOP(NLVL-1)-1+LVL(I,J) - LLBOT=MIN(LLBOT,LM1) - ELSE - LLBOT=LM1 - ENDIF -!! - DO 435 L=LLTOP,LLBOT - CLDAMT(L)=AMAX1(CSMID(I,L),CCMID(I,L)) - IF(CLDAMT(L).GT.CLDMAX)THEN - MALVL=L - CLDMAX=CLDAMT(L) - ENDIF - 435 CONTINUE -!!********************************************************************* -!! NOW, CALCULATE THE TOTAL CLOUD FRACTION IN THIS PRESSURE DOMAIN -!! USING THE METHOD DEVELOPED BY Y.H., K.A.C. AND A.K. (NOV., 1992). -!! IN THIS METHOD, IT IS ASSUMED THAT SEPERATED CLOUD LAYERS ARE -!! RADOMLY OVERLAPPED AND ADJACENT CLOUD LAYERS ARE MAXIMUM OVERLAPPED. -!! VERTICAL LOCATION OF EACH TYPE OF CLOUD IS DETERMINED BY THE THICKEST -!! CONTINUING CLOUD LAYERS IN THE DOMAIN. -!!********************************************************************* - CL1=0.0 - CL2=0.0 - KBT1=LLBOT - KBT2=LLBOT - KTH1=0 - KTH2=0 -!! - DO 450 LL=LLTOP,LLBOT - L=LLBOT-LL+LLTOP - BIT1=.FALSE. - CR1=CLDAMT(L) - BITX=(PINT(I,L).GE.PTOPC(NLVL+1)).AND. & - & (PINT(I,L).LT.PTOPC(NLVL)).AND. & - & (CLDAMT(L).GT.0.0) - BIT1=BIT1.OR.BITX - IF(.NOT.BIT1)GO TO 450 -!!*** -!!*** BITY=T: FIRST CLOUD LAYER; BITZ=T:CONSECUTIVE CLOUD LAYER -!!*** NOTE: WE ASSUME THAT THE THICKNESS OF EACH CLOUD LAYER IN THE -!!*** DOMAIN IS LESS THAN 200 MB TO AVOID TOO MUCH COOLING OR -!!*** HEATING. SO WE SET CTHK(NLVL)=200*E2. BUT THIS LIMIT MAY -!!*** WORK WELL FOR CONVECTIVE CLOUDS. MODIFICATION MAY BE -!!*** NEEDED IN THE FUTURE. -!!*** - BITY=BITX.AND.(KTH2.LE.0) - BITZ=BITX.AND.(KTH2.GT.0) -!! - IF(BITY)THEN - KBT2=L - KTH2=1 - ENDIF -!! - IF(BITZ)THEN - KTOP1=KBT2-KTH2+1 - DPCL=PMID(I,KBT2)-PMID(I,KTOP1) - IF(DPCL.LT.CTHK(NLVL))THEN - KTH2=KTH2+1 - ELSE - KBT2=KBT2-1 - ENDIF - ENDIF - IF(BITX)CL2=AMAX1(CL2,CR1) -!!*** -!!*** AT THE DOMAIN BOUNDARY OR SEPARATED CLD LAYERS, RANDOM OVERLAP. -!!*** CHOOSE THE THICKEST OR THE LARGEST FRACTION AMT AS THE CLD -!!*** LAYER IN THAT DOMAIN. -!!*** - BIT2=.FALSE. - BITY=BITX.AND.(CLDAMT(L-1).LE.0.0.OR. & - PINT(I,L-1).LT.PTOPC(NLVL+1)) - BITZ=BITY.AND.CL1.GT.0.0 - BITW=BITY.AND.CL1.LE.0.0 - BIT2=BIT2.OR.BITY - IF(.NOT.BIT2)GO TO 450 -!! - IF(BITZ)THEN - KBT1=INT((CL1*KBT1+CL2*KBT2)/(CL1+CL2)) - KTH1=INT((CL1*KTH1+CL2*KTH2)/(CL1+CL2))+1 - CL1=CL1+CL2-CL1*CL2 - ENDIF -!! - IF(BITW)THEN - KBT1=KBT2 - KTH1=KTH2 - CL1=CL2 - ENDIF -!! - IF(BITY)THEN - KBT2=LLBOT - KTH2=0 - CL2=0.0 - ENDIF - 450 CONTINUE -! - CLDCFR(I,NLVL)=AMIN1(1.0,CL1) - MTOP(I,NLVL)=MIN(KBT1,KBT1-KTH1+1) - MBOT(I,NLVL)=KBT1 - 480 CONTINUE - 500 CONTINUE - -!*** -!*** SET THE UN-NEEDED TAUDAR TO ONE -!*** - DO I=MYIS,MYIE - TAUDAR(I)=1.0 - ENDDO -!---------------------------------------------------------------------- -! NOW, CALCULATE THE CLOUD RADIATIVE PROPERTIES AFTER DAVIS (1982), -! HARSHVARDHAN ET AL (1987) AND Y.H., K.A.C. AND A.K. (1993). -! -! UPDATE: THE FOLLOWING PARTS ARE MODIFIED, AFTER Y.T.H. (1994), TO -! CALCULATE THE RADIATIVE PROPERTIES OF CLOUDS ON EACH MODEL -! LAYER. BOTH CONVECTIVE AND STRATIFORM CLOUDS ARE USED -! IN THIS CALCULATIONS. -! -! QINGYUN ZHAO 95-3-22 -! -!---------------------------------------------------------------------- -! -!*** -!*** INITIALIZE ARRAYS FOR USES LATER -!*** - - DO 600 I=MYIS,MYIE - LML=LMH(I,J) - LVLIJ=LVL(I,J) -! -!*** -!*** NOTE: LAYER=1 IS THE SURFACE, AND LAYER=2 IS THE FIRST CLOUD -!*** LAYER ABOVE THE SURFACE AND SO ON. -!*** - EMIS(I,1)=1.0 - KTOP(I,1)=LP1 - KBTM(I,1)=LP1 - CAMT(I,1)=1.0 - KCLD(I)=2 -! - DO NBAND=1,NB - RRCL(I,NBAND,1)=0.0 - TTCL(I,NBAND,1)=1.0 - ENDDO -! - DO 510 L=2,LP1 - CAMT(I,L)=0.0 - KTOP(I,L)=1 - KBTM(I,L)=1 - EMIS(I,L)=0.0 -! - DO NBAND=1,NB - RRCL(I,NBAND,L)=0.0 - TTCL(I,NBAND,L)=1.0 - ENDDO - 510 CONTINUE -!*** -!*** NOW CALCULATE THE AMOUNT, TOP, BOTTOM AND TYPE OF EACH CLOUD LAYER -!*** CLOUD TYPE=1: STRATIFORM CLOUD -!*** TYPE=2: CONVECTIVE CLOUD -!*** WHEN BOTH CONVECTIVE AND STRATIFORM CLOUDS EXIST AT THE SAME POINT, -!*** SELECT CONVECTIVE CLOUD WITH THE HIGHER CLOUD FRACTION. -!*** CLOUD LAYERS ARE SEPARATED BY TOTAL ABSENCE OF CLOUDINESS. -!*** NOTE: THERE IS ONLY ONE CONVECTIVE CLOUD LAYER IN ONE COLUMN. -!*** KTOP AND KBTM ARE THE TOP AND BOTTOM OF EACH CLOUD LAYER IN TERMS -!*** OF MODEL LEVEL. -!*** - NEW_CLOUD=.TRUE. -! - DO L=2,LML - LL=LML-L+1+LVLIJ !-- Model layer - CLFR=MAX(CCMID(I,LL),CSMID(I,LL)) !-- Cloud fraction in layer - CLFR1=MAX(CCMID(I,LL+1),CSMID(I,LL+1)) !-- Cloud fraction in lower layer -!------------------- - IF (CLFR .GE. CLFRMIN) THEN -!--- Cloud present at level - IF (NEW_CLOUD) THEN -!--- New cloud layer - IF(L==2.AND.CLFR1>=CLFRmin)THEN - KBTM(I,KCLD(I))=LL+1 - CAMT(I,KCLD(I))=CLFR1 - ELSE - KBTM(I,KCLD(I))=LL - CAMT(I,KCLD(I))=CLFR - ENDIF - NEW_CLOUD=.FALSE. - ELSE -!--- Existing cloud layer - CAMT(I,KCLD(I))=AMAX1(CAMT(I,KCLD(I)), CLFR) - ENDIF ! End IF (NEW_CLOUD .EQ. 0) ... - ELSE IF (CLFR1 .GE. CLFRMIN) THEN -!--- Cloud is not present at level but did exist at lower level, then ... - IF (L .EQ. 2) THEN -!--- For the case of ground fog - KBTM(I,KCLD(I))=LL+1 - CAMT(I,KCLD(I))=CLFR1 - ENDIF - KTOP(I,KCLD(I))=LL+1 - NEW_CLOUD=.TRUE. - KCLD(I)=KCLD(I)+1 - CAMT(I,KCLD(I))=0.0 - ENDIF -!------------------- - ENDDO !--- End DO L loop -!*** -!*** THE REAL NUMBER OF CLOUD LAYERS IS (THE FIRST IS THE GROUND; -!*** THE LAST IS THE SKY): -!*** - NCLDS(I)=KCLD(I)-2 - NCLD=NCLDS(I) -!*** -!*** NOW CALCULATE CLOUD RADIATIVE PROPERTIES -!*** - IF(NCLD.GE.1)THEN -!*** -!*** NOTE: THE FOLLOWING CALCULATIONS, THE UNIT FOR PRESSURE IS MB!!! -!*** - DO 580 NC=2,NCLD+1 -! - TAUC=0.0 ! Total optical depth for each cloud layer - QSUM=0.0 - NKTP=LP1 - NBTM=0 - BITX=CAMT(I,NC).GE.CLFRMIN - NKTP=MIN(NKTP,KTOP(I,NC)) - NBTM=MAX(NBTM,KBTM(I,NC)) -! - DO LL=NKTP,NBTM - IF(LL.GE.KTOP(I,NC).AND.LL.LE.KBTM(I,NC).AND.BITX)THEN - PRS1=PINT(I,LL)*0.01 - PRS2=PINT(I,LL+1)*0.01 - DELP=PRS2-PRS1 - TCLD=TMID(I,LL)-273.16 - QSUM=QSUM+QMID(I,LL)*DELP*(PRS1+PRS2) & - & /(120.1612*SQRT(TMID(I,LL))) -! -!--- The simple optical depth parameterization from eq. (1) of Harshvardhan -! et al. (1989, JAS, p. 1924; hereafter referred to as HRCD by authorship) -! is used for convective cloud properties with some simple changes. -! -!--- The optical depth Tau is Tau=CTau*DELP, where values of CTau are -! described below. -! -!--- For convection, assume simple optical depth coefficients of -! 1) CTau=0.16 for ice, assumed to be for T<=T_ICE (=-10C in GSMCOLUMN) -! This was referenced as "optically thick anvil associated with -! convection in -! 2) CTau=0.08 for water, assumed to be present for T>T_ICE -! -!--- For grid-scale processes in the absence of convection: -! 1) CTau=0.08*min(1., Qc/Q0) for cloud water, where -! Q0 is assumed to be the threshold mixing ratio for "thick anvils", -! as noted in the 2nd paragraph after eq. (1) in Harshvardhan et al. -! (1989). A value of Q0=0.1 g/kg is assumed based on experience w/ -! cloud observations, and it is intended only to be a crude scaling -! factor for "order of magnitude" effects. The functional dependence -! on mixing ratio is based on Stephens (1978, JAS, p. 2124, eq. 7). -! 2) CTau=500*Qi for ice particles. This is based on the optical depth -! of snow. Prof. Q. Fu (U. Washington) provided the following eq.: -! Tau-1.5*SWP/(Res*RHOs) -! SWP is snow water path, Res is the snow effective radius, RHOs is -! the snow density. Based on derivations using Petch (1998, JAS, 1846- -! 1858) as a starting point, Res=1.5*Ds with Ds being the mean diameter -! of an exponential distribution of ice particles ("snow"). After some -! manipulation, -! Tau=CTau*DELP => CTau=CSTau*Qice, where -! CSTau=100./(G*Ds*RHOs) ~ 500 based on values of Ds and RHOs in the -! ice lookup tables (actually varies from 920 for Ds=.1 mm to ~520 for -! Ds>0.5 mm), and units of DELP in mb (must convert from Pascals). -! "Snow" (precipitating ice) is assumed because of it dominates over -! cloud ice in the scheme. -! - CTAU=0. - IF (CCMID(I,LL) .GE. CLFRMIN) THEN -!-- Crude convective cloud properties - IF (TCLD .GT. T_ICE) THEN - CTAU=0.08 !--- Cloud water - ELSE - CTAU=0.16 !--- Ice - ENDIF - ENDIF -!-- Crude grid-scale cloud properties - IF (CSMID(I,LL) .GE. CLFRMIN) & - & CTAU=CTAU+800.*QWMID(I,LL)+500.*QIMID(I,LL) - TAUC=TAUC+DELP*CTAU - ENDIF !--- End IF(LL.GE.KTOP(I,NC) .... - ENDDO !--- End DO LL -! - IF(BITX)EMIS(I,NC)=1.0-EXP(-0.75*TAUC) -!GFDL => should consider using this => IF(BITX)EMIS(I,NC)=1.0-EXP(-1.66*TAUC) - IF(QSUM.GE.EPSQ1)THEN -! - DO 570 NBAND=1,NB - IF(BITX)THEN - PROD=ABCFF(NBAND)*QSUM - DDX=TAUC/(TAUC+PROD) - EEX=1.0-DDX - IF(ABS(EEX).GE.1.E-8)THEN - DD=DDX - EE=EEX - FF=1.0-DD*0.85 - AA=MIN(50.0,SQRT(3.0*EE*FF)*TAUC) - AA=EXP(-AA) - BB=FF/EE - GG=SQRT(BB) - DD=(GG+1.0)*(GG+1.0)-(GG-1.0)*(GG-1.0)*AA*AA - RRCL(I,NBAND,NC)=MAX(0.1E-5,(BB-1.0)*(1.0-AA*AA)/DD) - TTCL(I,NBAND,NC)=AMAX1(0.1E-5,4.0*GG*AA/DD) - ENDIF - ENDIF - 570 CONTINUE - ENDIF - 580 CONTINUE -! - ENDIF -! - 600 CONTINUE -!********************************************************************* -!****************** COMPUTE OZONE AT MIDLAYERS ********************* -!********************************************************************* -! -!*** MODIFY PRESSURES SO THAT THE ENTIRE COLUMN OF OZONE (TO 0 MB) -!*** IS INCLUDED IN THE MODEL COLUMN EVEN WHEN PT > 0 MB -!*** - DO L=1,LM - DO I=MYIS,MYIE - DENOM=1./(PINT(I,LP1)-PINT(I,1)) - FCTRA=PINT(I,LP1)*DENOM - FCTRB=-PINT(I,1)*PINT(I,LP1)*DENOM - POZN(I,L)=PMID(I,L)*FCTRA+FCTRB - ENDDO - ENDDO -! - CALL OZON2D(LM,POZN,XLAT,RSIN1,RCOS1,RCOS2,OZN, & -! XDUO3N,XDO3N4,XDO3N2,XDO3N3, & -! PRGFDL,MYIS,MYIE, & - MYIS,MYIE, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -! -!*** -!*** NOW THE VARIABLES REQUIRED BY RADFS HAVE BEEN CALCULATED. -!*** -!---------------------------------------------------------------------- -!*** -!*** CALL THE GFDL RADIATION DRIVER -!*** -!*** - CALL RADFS & - & (PSFC,PMID,PINT,QMID,TMID,OZN,TSKN,SLMSK,ALBEDO,XLAT & - &, CAMT,KTOP,KBTM,NCLDS,EMIS,RRCL,TTCL & - &, COSZ,TAUDAR,1 & - &, 1,0 & - &, ITIMSW,ITIMLW,JD,HOUR & - &, TENDS(ITS,KTS,J),TENDL(ITS,KTS,J) & - &, FLWUP,FSWUP,FSWDN,FSWDNS,FSWUPS,FLWDNS,FLWUPS & - &, ids,ide, jds,jde, kds,kde & - &, ims,ime, jms,jme, kms,kme & - &, its,ite, jts,jte, kts,kte ) -!---------------------------------------------------------------------- - IF(LONG)THEN - DO I=MYIS,MYIE - GLW(I,J)=FLWDNS(I) - ENDDO - ENDIF -! - IF(SHORT)THEN - DO I=MYIS,MYIE - GSW(I,J)=FSWDNS(I)-FSWUPS(I) - ENDDO - ENDIF -! - DO 650 I=MYIS,MYIE - CFRACL(I,J)=CLDCFR(I,1) - CFRACM(I,J)=CLDCFR(I,2) - CFRACH(I,J)=CLDCFR(I,3) -! -!*** ARRAYS ACFRST AND ACFRCV ACCUMULATE AVERAGE STRATIFORM AND -!*** CONVECTIVE CLOUD FRACTIONS, RESPECTIVELY. -!*** ACCUMLATE THESE VARIABLES ONLY ONCE PER RADIATION CALL. -! -!*** ASSUME RANDOM OVERLAP BETWEEN LOW, MIDDLE, & HIGH LAYERS. -! - CFRAVG=1.-(1.-CFRACL(I,J))*(1.-CFRACM(I,J))*(1.-CFRACH(I,J)) -! - IF(CNCLD)THEN - IF(HBOT(I,J)-HTOP(I,J).GT.1.)THEN -!--- Count locations with convective cloudiness - ACFRST(I,J)=ACFRST(I,J)+CFRAVG - NCFRST(I,J)=NCFRST(I,J)+1 - ENDIF - BITS=.FALSE. - DO LL=1,LM - BITS=CSMID(I,LL).GE.CLFRMIN !--- Existence of grid-scale cloud in layer - IF(BITS)EXIT - ENDDO - IF(BITS)THEN -!--- Count locations with grid-scale cloudiness - ACFRST(I,J)=ACFRST(I,J)+CFRAVG - NCFRST(I,J)=NCFRST(I,J)+1 - ENDIF - ELSE -!--- Count only locations with grid-scale cloudiness - ACFRCV(I,J)=ACFRCV(I,J)+CFRAVG - NCFRCV(I,J)=NCFRCV(I,J)+1 - ENDIF - 650 CONTINUE -!*** -!*** COLLECT ATMOSPHERIC TEMPERATURE TENDENCIES DUE TO RADIATION. -!*** ALSO COLLECT THE TOTAL SW AND INCOMING LW RADIATION (W/M**2) -!*** AND CONVERT TO FORM NEEDED FOR PREDICTION OF THS IN SURFCE. -!*** - DO 660 I=MYIS,MYIE - DO L=1,LM - LL=LVL(I,J)+L - IF(SHORT)RSWTT(I,L,J)=TENDS(I,LL,J) - IF(LONG) RLWTT(I,L,J)=TENDL(I,LL,J) - IF(LL.EQ.LM)GO TO 660 - ENDDO - 660 CONTINUE -!*** -!*** SUM THE LW INCOMING AND SW RADIATION (W/M**2) FOR RADIN. -!*** - DO 675 I=MYIS,MYIE - IF(LONG)THEN - SIGT4(I,J)=STBOL*TMID(I,LM)*TMID(I,LM)* & - TMID(I,LM)*TMID(I,LM) - ENDIF -! -!*** ACCUMULATE VARIOUS LW AND SW RADIATIVE FLUXES FOR POST -!*** PROCESSOR. PASSED VIA COMMON ACMRDL AND ACMRDS. -! - IF(LONG)THEN - RLWIN(I,J) =FLWDNS(I) - RLWOUT(I,J)=FLWUPS(I) - RLWTOA(I,J)=FLWUP(I) - ENDIF - IF(SHORT)THEN - RSWIN(I,J) =FSWDNS(I) - RSWOUT(I,J)=FSWUPS(I) - RSWTOA(I,J)=FSWUP(I) - ENDIF - 675 CONTINUE -!*** -!*** THIS ROW IS FINISHED. GO TO NEXT -!*** -! ********************* - 700 CONTINUE -! ********************* -!---------------------------------------------------------------------- -!*** -!*** CALLS TO RADIATION THIS TIME STEP ARE COMPLETE. -!*** -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- -!*** -!*** HORIZONTAL SMOOTHING OF TEMPERATURE TENDENCIES -!*** -!---------------------------------------------------------------------- - IF(SHORT) THEN - DO 800 L=1,LM -! CALL ZERO2(TL, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) -! CALL ZERO2(FNE, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) -! CALL ZERO2(FSE, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) -! -! IF(KSMUD.GE.1)THEN -! DO 750 KS=1,KSMUD -!! -! DO J=MYJS,MYJE -! DO I=MYIS,MYIE -! TL(I,J)=RSWTT(I,L,J) -!! TL(I,J)=RSWTT(I,L,J)*HTM(I,L,J) -! ENDDO -! ENDDO -!! -! DO J=MYJS,MYJE -! DO I=MYIS,MYIE -! FNE(I,J)=(TL(I+IHE(J),J+1)-TL(I,J)) -!! *HTM(I,L,J)*HTM(I+IHE(J),J+1,L) -! ENDDO -! ENDDO -!! -! DO J=MYJS1,MYJE -! DO I=MYIS,MYIE -! FSE(I,J)=(TL(I+IHE(J),J-1)-TL(I,J)) -!! *HTM(I+IHE(J),J-1,L)*HTM(I,L,J) -! ENDDO -! ENDDO -!! -! DO J=MYJS2,MYJE2 -! DO I=MYIS,MYIE -! TL(I,J)=(FNE(I,J)-FNE(I+IHW(J),J-1) & -! +FSE(I,J)-FSE(I+IHW(J),J+1)) & -! *0.125+TL(I,J) -!! *HBM2(I,J)*0.125+TL(I,J) -! ENDDO -! ENDDO -!! -! DO J=MYJS,MYJE -! DO I=MYIS,MYIE -! RSWTT(I,L,J)=TL(I,J) -! ENDDO -! ENDDO -!! -! 750 CONTINUE -! ENDIF -! - 800 CONTINUE - ENDIF -!---------------------------------------------------------------------- -! - IF(LONG)THEN -! - DO 900 L=1,LM -! CALL ZERO2(TL, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) -! CALL ZERO2(FNE, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) -! CALL ZERO2(FSE, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) -! -! IF(KSMUD.GE.1)THEN -! DO 850 KS=1,KSMUD -!! -! DO J=MYJS,MYJE -! DO I=MYIS,MYIE -! TL(I,J)=RLWTT(I,L,J) -!! TL(I,J)=RLWTT(I,L,J)*HTM(I,L,J) -! ENDDO -! ENDDO -!! -! DO J=MYJS,MYJE1 -! DO I=MYIS,MYIE -! FNE(I,J)=(TL(I+IHE(J),J+1)-TL(I,J)) -!! *HTM(I,L,J)*HTM(I+IHE(J),J+1,L) -! ENDDO -! ENDDO -!! -! DO J=MYJS1,MYJE -! DO I=MYIS,MYIE -! FSE(I,J)=(TL(I+IHE(J),J-1)-TL(I,J)) -!! *HTM(I+IHE(J),J-1,L)*HTM(I,L,J) -! ENDDO -! ENDDO -!! -! DO J=MYJS2,MYJE2 -! DO I=MYIS,MYIE -! TL(I,J)=(FNE(I,J)-FNE(I+IHW(J),J-1) & -! +FSE(I,J)-FSE(I+IHW(J),J+1)) & -! *0.125+TL(I,J) -!! *HBM2(I,J)*0.125+TL(I,J) -! ENDDO -! ENDDO -!! -! DO J=MYJS,MYJE -! DO I=MYIS,MYIE -! RLWTT(I,L,J)=TL(I,J) -! ENDDO -! ENDDO -!! -! 850 CONTINUE -! ENDIF - 900 CONTINUE - ENDIF -!---------------------------------------------------------------------- - - END SUBROUTINE RADTN - -!---------------------------------------------------------------------- - - SUBROUTINE ZENITH(TIMES,DAYI,HOUR,IDAT,IHRST,GLON,GLAT,CZEN, & - MYIS,MYIE,MYJS,MYJE, & - IDS,IDE, JDS,JDE, KDS,KDE, & - IMS,IME, JMS,JME, KMS,KME, & - ITS,ITE, JTS,JTE, KTS,KTE) -!---------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER, INTENT(IN) :: IDS,IDE, JDS,JDE, KDS,KDE , & - IMS,IME, JMS,JME, KMS,KME , & - ITS,ITE, JTS,JTE, KTS,KTE - INTEGER, INTENT(IN) :: MYJS,MYJE,MYIS,MYIE - - REAL, INTENT(IN) :: TIMES - REAL, INTENT(OUT) :: HOUR,DAYI - INTEGER, INTENT(IN) :: IHRST - - INTEGER, INTENT(IN), DIMENSION(3) :: IDAT - REAL, INTENT(IN), DIMENSION(IMS:IME,JMS:JME) :: GLAT,GLON - REAL, INTENT(OUT), DIMENSION(IMS:IME,JMS:JME) :: CZEN - - REAL, PARAMETER :: GSTC1=24110.54841,GSTC2=8640184.812866, & - GSTC3=9.3104E-2,GSTC4=-6.2E-6, & - PI=3.1415926,PI2=2.*PI,PIH=0.5*PI, & -!#$ DEG2RD=1.745329E-2,OBLIQ=23.440*DEG2RD, & - DEG2RD=3.1415926/180.,OBLIQ=23.440*DEG2RD, & - ZEROJD=2451545.0 - - REAL :: DAY,YFCTR,ADDDAY,STARTYR,DATJUL,DIFJD,SLONM, & - ANOM,SLON,DEC,RA,DATJ0,TU,STIM0,SIDTIM,HRANG - REAL :: HRLCL,SINALT - INTEGER :: KMNTH,KNT,IDIFYR,J,I - LOGICAL :: LEAP -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- - INTEGER :: MONTH (12) -!----------------------------------------------------------------------- - DATA MONTH/31,28,31,30,31,30,31,31,30,31,30,31/ -!*********************************************************************** -! SAVE MONTH - DAY=0. - LEAP=.FALSE. - IF(MOD(IDAT(3),4).EQ.0)THEN - MONTH(2)=29 - LEAP=.TRUE. - ENDIF - IF(IDAT(1).GT.1)THEN - KMNTH=IDAT(1)-1 - DO 10 KNT=1,KMNTH - DAY=DAY+REAL(MONTH(KNT)) - 10 CONTINUE - ENDIF -!*** -!*** CALCULATE EXACT NUMBER OF DAYS FROM BEGINNING OF YEAR TO -!*** FORECAST TIME OF INTEREST -!*** - DAY=DAY+REAL(IDAT(2)-1)+(REAL(IHRST)+TIMES/3600.)/24. - DAYI=REAL(INT(DAY)+1) - HOUR=(DAY-DAYI+1.)*24. - YFCTR=2000.-IDAT(3) -!----------------------------------------------------------------------- -!*** -!*** FIND CELESTIAL LONGITUDE OF THE SUN THEN THE SOLAR DECLINATION AND -!*** RIGHT ASCENSION. -!*** -!----------------------------------------------------------------------- - IDIFYR=IDAT(3)-2000 -!*** -!*** FIND JULIAN DATE OF START OF THE RELEVANT YEAR -!*** ADDING IN LEAP DAYS AS NEEDED -!*** - IF(IDIFYR.LT.0)THEN - ADDDAY=REAL(IDIFYR/4) - ELSE - ADDDAY=REAL((IDIFYR+3)/4) - ENDIF - STARTYR=ZEROJD+IDIFYR*365.+ADDDAY-0.5 -!*** -!*** THE JULIAN DATE OF THE TIME IN QUESTION -!*** - DATJUL=STARTYR+DAY -! -!*** DIFFERENCE OF ACTUAL JULIAN DATE FROM JULIAN DATE -!*** AT 00H 1 January 2000 -! - DIFJD=DATJUL-ZEROJD -! -!*** MEAN GEOMETRIC LONGITUDE OF THE SUN -! - SLONM=(280.460+0.9856474*DIFJD)*DEG2RD+YFCTR*PI2 -! -!*** THE MEAN ANOMOLY -! - ANOM=(357.528+0.9856003*DIFJD)*DEG2RD -! -!*** APPARENT GEOMETRIC LONGITUDE OF THE SUN -! - SLON=SLONM+(1.915*SIN(ANOM)+0.020*SIN(2.*ANOM))*DEG2RD - IF(SLON.GT.PI2)SLON=SLON-PI2 -! -!*** DECLINATION AND RIGHT ASCENSION -! - DEC=ASIN(SIN(SLON)*SIN(OBLIQ)) - RA=ACOS(COS(SLON)/COS(DEC)) - IF(SLON.GT.PI)RA=PI2-RA -!*** -!*** FIND THE GREENWICH SIDEREAL TIME THEN THE LOCAL SOLAR -!*** HOUR ANGLE. -!*** - DATJ0=STARTYR+DAYI-1. - TU=(DATJ0-2451545.)/36525. - STIM0=GSTC1+GSTC2*TU+GSTC3*TU**2+GSTC4*TU**3 - SIDTIM=STIM0/3600.+YFCTR*24.+1.00273791*HOUR - SIDTIM=SIDTIM*15.*DEG2RD - IF(SIDTIM.LT.0.)SIDTIM=SIDTIM+PI2 - IF(SIDTIM.GT.PI2)SIDTIM=SIDTIM-PI2 - HRANG=SIDTIM-RA -! - DO 100 J=MYJS,MYJE - DO 100 I=MYIS,MYIE -! HRLCL=HRANG-GLON(I,J) - HRLCL=HRANG+GLON(I,J)+PI2 -!*** -!*** THE ZENITH ANGLE IS THE COMPLEMENT OF THE ALTITUDE THUS THE -!*** COSINE OF THE ZENITH ANGLE EQUALS THE SINE OF THE ALTITUDE. -!*** - SINALT=SIN(DEC)*SIN(GLAT(I,J))+COS(DEC)*COS(HRLCL)* & - COS(GLAT(I,J)) - IF(SINALT.LT.0.)SINALT=0. - CZEN(I,J)=SINALT - 100 CONTINUE -!*** -!*** IF THE FORECAST IS IN A DIFFERENT YEAR THAN THE START TIME, -!*** RESET DAYI TO THE PROPER DAY OF THE NEW YEAR (IT MUST NOT BE -!*** RESET BEFORE THE SOLAR ZENITH ANGLE IS COMPUTED). -!*** - IF(DAYI.GT.365.)THEN - IF(.NOT.LEAP)THEN - DAYI=DAYI-365. - ELSEIF(LEAP.AND.DAYI.GT.366.)THEN - DAYI=DAYI-366. - ENDIF - ENDIF -! - END SUBROUTINE ZENITH -!----------------------------------------------------------------------- - - SUBROUTINE OZON2D (LK,POZN,XLAT,RSIN1,RCOS1,RCOS2,QO3, & -! XDUO3N,XDO3N4,XDO3N2,XDO3N3, & -! PRGFDL,MYIS,MYIE, & - MYIS,MYIE, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -!---------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte - INTEGER, INTENT(IN) :: LK,MYIS,MYIE - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte) :: POZN - REAL, INTENT(IN), DIMENSION(its:ite) :: XLAT - REAL, INTENT(INOUT), DIMENSION(its:ite,kts:kte) :: QO3 - REAL, INTENT(IN) :: RSIN1,RCOS1,RCOS2 -!---------------------------------------------------------------------- - INTEGER, PARAMETER :: NL=81,NLP1=NL+1,LNGTH=37*NL - REAL, PARAMETER :: RTD=57.2957795 - -! REAL, INTENT(IN), DIMENSION(37,NL) :: XDUO3N,XDO3N4,XDO3N2,XDO3N3 -! REAL, INTENT(IN), DIMENSION(NL) :: PRGFDL -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- - INTEGER,DIMENSION(its:ite) :: JJROW - REAL, DIMENSION(its:ite) :: TTHAN - REAL, DIMENSION(its:ite,NL) :: QO3O3 - - INTEGER :: I,K,NUMITR,ILOG,IT,NHALF - REAL :: TH2,DO3V,DO3VP,APHI,APLO -!---------------------------------------------------------------------- - DO I=MYIS,MYIE - TH2=0.2*XLAT(I) - JJROW(I)=19.001-TH2 - TTHAN(I)=(19-JJROW(I))-TH2 - ENDDO -! -!*** SEASONAL AND SPATIAL INTERPOLATION DONE BELOW. -! - DO K=1,NL - DO I=MYIS,MYIE - DO3V=XDUO3N(JJROW(I),K)+RSIN1*XDO3N2(JJROW(I),K) & - +RCOS1*XDO3N3(JJROW(I),K) & - +RCOS2*XDO3N4(JJROW(I),K) - DO3VP=XDUO3N(JJROW(I)+1,K)+RSIN1*XDO3N2(JJROW(I)+1,K) & - +RCOS1*XDO3N3(JJROW(I)+1,K) & - +RCOS2*XDO3N4(JJROW(I)+1,K) -! -!*** NOW LATITUDINAL INTERPOLATION -!*** AND CONVERT O3 INTO MASS MIXING RATIO (ORIG DATA MPY BY 1.E4) -! - QO3O3(I,K)=1.E-4*(DO3V+TTHAN(I)*(DO3VP-DO3V)) - ENDDO - ENDDO -!*** -!*** VERTICAL INTERPOLATION FOR EACH GRIDPOINT (LINEAR IN LN P) -!*** - NUMITR=0 - ILOG=NL - 20 CONTINUE - ILOG=(ILOG+1)/2 - IF(ILOG.EQ.1)GO TO 25 - NUMITR=NUMITR+1 - GO TO 20 - 25 CONTINUE -! - DO 60 K=1,LK -! - NHALF=(NL+1)/2 - DO I=MYIS,MYIE - JJROW(I)=NHALF - ENDDO -! - DO 40 IT=1,NUMITR - NHALF=(NHALF+1)/2 - DO I=MYIS,MYIE - IF(POZN(I,K).LT.PRGFDL(JJROW(I)-1))THEN - JJROW(I)=JJROW(I)-NHALF - ELSEIF(POZN(I,K).GE.PRGFDL(JJROW(I)))THEN - JJROW(I)=JJROW(I)+NHALF - ENDIF - JJROW(I)=MIN(JJROW(I),NL) - JJROW(I)=MAX(JJROW(I),2) - ENDDO - 40 CONTINUE -! - DO 50 I=MYIS,MYIE - IF(POZN(I,K).LT.PRGFDL(1))THEN - QO3(I,K)=QO3O3(I,1) - ELSE IF(POZN(I,K).GT.PRGFDL(NL))THEN - QO3(I,K)=QO3O3(I,NL) - ELSE - APLO=ALOG(PRGFDL(JJROW(I)-1)) - APHI=ALOG(PRGFDL(JJROW(I))) - QO3(I,K)=QO3O3(I,JJROW(I))+(ALOG(POZN(I,K))-APHI)/ & - (APLO-APHI)* & - (QO3O3(I,JJROW(I)-1)-QO3O3(I,JJROW(I))) - ENDIF - 50 CONTINUE -! - 60 CONTINUE - - END SUBROUTINE OZON2D -!----------------------------------------------------------------------- - -! SUBROUTINE ZERO2(ARRAY, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) -!---------------------------------------------------------------------- -!IMPLICIT NONE -!---------------------------------------------------------------------- -! INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & -! ims,ime, jms,jme, kms,kme , & -! its,ite, jts,jte, kts,kte -! REAL, INTENT(INOUT), DIMENSION(its:ite,jts:jte) :: ARRAY -! INTEGER :: I,J -!---------------------------------------------------------------------- -! DO J=jts,jte -! DO I=its,ite -! ARRAY(I,J)=0. -! ENDDO -! ENDDO - -! END SUBROUTINE ZERO2 - -!---------------------------------------------------------------- - - SUBROUTINE O3INT(PHALF,DDUO3N,DDO3N2,DDO3N3,DDO3N4, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -!---------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte - -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . . -! SUBPROGRAM: O3INT COMPUTE ZONAL MEAN OZONE FOR ETA LYRS -! PRGMMR: KENNETH CAMPANA ORG: W/NMC23 DATE: 89-07-07 -! MICHAEL BALDWIN ORG: W/NMC22 DATE: 92-06-08 -! -! ABSTRACT: THIS CODE WRITTEN AT GFDL... -! CALCULATES SEASONAL ZONAL MEAN OZONE,EVERY 5 DEG OF LATITUDE, -! FOR CURRENT MODEL VERTICAL COORDINATE. OUTPUT DATA IN G/G * 1.E4 -! CODE IS CALLED ONLY ONCE. -! -! PROGRAM HISTORY LOG: -! 84-01-01 FELS AND SCHWARZKOPF,GFDL. -! 89-07-07 K. CAMPANA - ADAPTED STAND-ALONE CODE FOR IN-LINE USE. -! 92-06-08 M. BALDWIN - UPDATE TO RUN IN ETA MODEL -! -! USAGE: CALL O3INT(O3,SIGL) OLD -! INPUT ARGUMENT LIST: -! PHALF - MID LAYER PRESSURE (K=LM+1 IS MODEL SURFACE) -! OUTPUT ARGUMENT LIST: -! DDUO3N - ZONAL MEAN OZONE DATA IN ALL MODEL LAYERS (G/G*1.E4) -! DDO3N2 DIMENSIONED(L,N),WHERE L(=37) IS LATITUDE BETWEEN -! DDO3N3 N AND S POLES,N=NUM OF VERTICAL LYRS(K=1 IS TOP LYR) -! DDO3N4 AND SEASON-WIN,SPR,SUM,FALL. -! IN COMMON -! -! OUTPUT FILES: -! OUTPUT - PRINT FILE. -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 200. -! -!$$$ -!.... PROGRAM O3INT FROM DAN SCHWARZKOPF-GETS ZONAL MEAN O3 -!.. OUTPUT O3 IS WINTER,SPRING,SUMMER,FALL (NORTHERN HEMISPHERE) -!----------------------------------------------------------------------- -! INCLUDE "parmeta" -!----------------------------------------------------------------------- -! ********************************************************* - - INTEGER :: N,NP,NP2,NM1 - -! PARAMETER (N=LM,NP=N+1,NP2=N+2,NM1=N-1) -! ********************************************************* -!----------------------------------------------------------------------- -!*** -!*** SEASONAL CLIMATOLOGIES OF O3 (OBTAINED FROM A PREVIOUSLY RUN -!*** CODE WHICH INTERPOLATES O3 TO USER VERTICAL COORDINATE). -!*** DEFINED AS 5 DEG LAT MEANS N.P.->S.P. -!*** - REAL, INTENT(OUT), DIMENSION(37,kte):: DDUO3N,DDO3N2,DDO3N3,DDO3N4 - -! C O M M O N /SAVMEM/ -! ...WINTER.... ...SPRING.... ...SUMMER.... ....FALL..... -! 1 DDUO3N(37,LM), DDO3N2(37,LM), DDO3N3(37,LM), DDO3N4(37,LM) -! ..... K.CAMPANA OCTOBER 1988 -!CCC DIMENSION T41(NP2,2),O3O3(37,N,4) -! DIMENSION SIGL(N) -! ********************************************************* - REAL :: QI(82) - REAL :: DDUO3(19,kts:kte),RO31(10,41),RO32(10,41),DUO3N(19,41) - REAL :: TEMPN(19) - REAL :: O3HI(10,25),O3LO1(10,16),O3LO2(10,16),O3LO3(10,16), & - O3LO4(10,16) - REAL :: O3HI1(10,16),O3HI2(10,9),PH1(45),PH2(37),P1(48),P2(33) - REAL :: O35DEG(37,kts:kte) - REAL :: RSTD(81),RO3(10,41),RO3M(10,40),RBAR(kts:kte),RDATA(81), & - PHALF(kts:kte+1),P(81),PH(82) - - INTEGER :: NKK,NK,NKP,K,L,NCASE,ITAPE,IPLACE,NKMM,NKM,KI,KK,KQ,JJ,KEN - REAL :: O3RD,O3TOT,O3DU - - EQUIVALENCE (O3HI1(1,1),O3HI(1,1)),(O3HI2(1,1),O3HI(1,17)) - EQUIVALENCE (PH1(1),PH(1)),(PH2(1),PH(46)) - EQUIVALENCE (P1(1),P(1)),(P2(1),P(49)) - DATA PH1/ 0., & - 0.1027246E-04, 0.1239831E-04, 0.1491845E-04, 0.1788053E-04, & - 0.2135032E-04, 0.2540162E-04, 0.3011718E-04, 0.3558949E-04, & - 0.4192172E-04, 0.4922875E-04, 0.5763817E-04, 0.6729146E-04, & - 0.7834518E-04, 0.9097232E-04, 0.1053635E-03, 0.1217288E-03, & - 0.1402989E-03, 0.1613270E-03, 0.1850904E-03, 0.2119495E-03, & - 0.2423836E-03, 0.2768980E-03, 0.3160017E-03, 0.3602623E-03, & - 0.4103126E-03, 0.4668569E-03, 0.5306792E-03, 0.6026516E-03, & - 0.6839018E-03, 0.7759249E-03, 0.8803303E-03, 0.9987843E-03, & - 0.1133178E-02, 0.1285955E-02, 0.1460360E-02, 0.1660001E-02, & - 0.1888764E-02, 0.2151165E-02, 0.2452466E-02, 0.2798806E-02, & - 0.3197345E-02, 0.3656456E-02, 0.4185934E-02, 0.4797257E-02/ - DATA PH2/ & - 0.5503893E-02, 0.6321654E-02, 0.7269144E-02, 0.8368272E-02, & - 0.9644873E-02, 0.1112946E-01, 0.1285810E-01, 0.1487354E-01, & - 0.1722643E-01, 0.1997696E-01, 0.2319670E-01, 0.2697093E-01, & - 0.3140135E-01, 0.3660952E-01, 0.4274090E-01, 0.4996992E-01, & - 0.5848471E-01, 0.6847525E-01, 0.8017242E-01, 0.9386772E-01, & - 0.1099026E+00, 0.1286765E+00, 0.1506574E+00, 0.1763932E+00, & - 0.2065253E+00, 0.2415209E+00, 0.2814823E+00, 0.3266369E+00, & - 0.3774861E+00, 0.4345638E+00, 0.4984375E+00, 0.5697097E+00, & - 0.6490189E+00, 0.7370409E+00, 0.8344896E+00, 0.9421190E+00, & - 0.1000000E+01/ - DATA P1/ & - 0.9300000E-05, 0.1129521E-04, 0.1360915E-04, 0.1635370E-04, & - 0.1954990E-04, 0.2331653E-04, 0.2767314E-04, 0.3277707E-04, & - 0.3864321E-04, 0.4547839E-04, 0.5328839E-04, 0.6234301E-04, & - 0.7263268E-04, 0.8450696E-04, 0.9793231E-04, 0.1133587E-03, & - 0.1307170E-03, 0.1505832E-03, 0.1728373E-03, 0.1982122E-03, & - 0.2266389E-03, 0.2592220E-03, 0.2957792E-03, 0.3376068E-03, & - 0.3844381E-03, 0.4379281E-03, 0.4976965E-03, 0.5658476E-03, & - 0.6418494E-03, 0.7287094E-03, 0.8261995E-03, 0.9380076E-03, & - 0.1063498E-02, 0.1207423E-02, 0.1369594E-02, 0.1557141E-02, & - 0.1769657E-02, 0.2015887E-02, 0.2295520E-02, 0.2620143E-02, & - 0.2989651E-02, 0.3419469E-02, 0.3909867E-02, 0.4481491E-02, & - 0.5135272E-02, 0.5898971E-02, 0.6774619E-02, 0.7799763E-02/ - DATA P2/ & - 0.8978218E-02, 0.1036103E-01, 0.1195488E-01, 0.1382957E-01, & - 0.1599631E-01, 0.1855114E-01, 0.2151235E-01, 0.2501293E-01, & - 0.2908220E-01, 0.3390544E-01, 0.3952926E-01, 0.4621349E-01, & - 0.5403168E-01, 0.6330472E-01, 0.7406807E-01, 0.8677983E-01, & - 0.1015345E+00, 0.1189603E+00, 0.1391863E+00, 0.1630739E+00, & - 0.1908004E+00, 0.2235461E+00, 0.2609410E+00, 0.3036404E+00, & - 0.3513750E+00, 0.4055375E+00, 0.4656677E+00, 0.5335132E+00, & - 0.6083618E+00, 0.6923932E+00, 0.7845676E+00, 0.8875882E+00, & - 0.1000000E+01/ - DATA O3HI1/ & - .55,.50,.45,.45,.40,.35,.35,.30,.30,.30, & - .55,.51,.46,.47,.42,.38,.37,.36,.35,.35, & - .55,.53,.48,.49,.44,.42,.41,.40,.38,.38, & - .60,.55,.52,.52,.50,.47,.46,.44,.42,.41, & - .65,.60,.55,.56,.53,.52,.50,.48,.45,.45, & - .75,.65,.60,.60,.55,.55,.55,.50,.48,.47, & - .80,.75,.75,.75,.70,.70,.65,.63,.60,.60, & - .90,.85,.85,.80,.80,.75,.75,.74,.72,.71, & - 1.10,1.05,1.00,.90,.90,.90,.85,.83,.80,.80, & - 1.40,1.30,1.25,1.25,1.25,1.20,1.15,1.10,1.05,1.00, & - 1.7,1.7,1.6,1.6,1.6,1.6,1.6,1.6,1.5,1.5, & - 2.1,2.0,1.9,1.9,1.9,1.8,1.8,1.8,1.7,1.7, & - 2.4,2.3,2.2,2.2,2.2,2.1,2.1,2.1,2.0,2.0, & - 2.7,2.5,2.5,2.5,2.5,2.5,2.4,2.4,2.3,2.3, & - 2.9,2.8,2.7,2.7,2.7,2.7,2.7,2.7,2.6,2.6, & - 3.1,3.1,3.0,3.0,3.0,3.0,3.0,3.0,2.9,2.8/ - DATA O3HI2/ & - 3.3,3.4,3.4,3.6,3.7,3.9,4.0,4.1,4.0,3.8, & - 3.6,3.8,3.9,4.2,4.7,5.3,5.6,5.7,5.5,5.2, & - 4.1,4.3,4.7,5.2,6.0,6.7,7.0,6.8,6.4,6.2, & - 5.4,5.7,6.0,6.6,7.3,8.0,8.4,7.7,7.1,6.7, & - 6.7,6.8,7.0,7.6,8.3,10.0,9.6,8.2,7.5,7.2, & - 9.2,9.3,9.4,9.6,10.3,10.6,10.0,8.5,7.7,7.3, & - 12.6,12.1,12.0,12.1,11.7,11.0,10.0,8.6,7.8,7.4, & - 14.2,13.5,13.1,12.8,11.9,10.9,9.8,8.5,7.8,7.5, & - 14.3,14.0,13.4,12.7,11.6,10.6,9.3,8.4,7.6,7.3/ - DATA O3LO1/ & - 14.9,14.2,13.3,12.5,11.2,10.3,9.5,8.6,7.5,7.4, & - 14.5,14.1,13.0,11.8,10.5,9.8,9.2,7.9,7.4,7.4, & - 11.8,11.5,10.9,10.5,9.9,9.6,8.9,7.5,7.2,7.2, & - 7.3,7.7,7.8,8.4,8.4,8.5,7.9,7.4,7.1,7.1, & - 4.1,4.4,5.3,6.6,6.9,7.5,7.4,7.2,7.0,6.9, & - 1.8,1.9,2.5,3.3,4.5,5.8,6.3,6.3,6.4,6.1, & - 0.4,0.5,0.8,1.2,2.7,3.6,4.6,4.7,5.0,5.2, & - .10,.15,.20,.50,1.4,2.1,3.0,3.2,3.5,3.9, & - .07,.10,.12,.30,1.0,1.4,1.8,1.9,2.3,2.5, & - .06,.08,.10,.15,.60,.80,1.4,1.5,1.5,1.6, & - .05,.05,.06,.09,.20,.40,.70,.80,.90,.90, & - .05,.05,.06,.08,.10,.13,.20,.25,.30,.40, & - .05,.05,.05,.06,.07,.07,.08,.09,.10,.13, & - .05,.05,.05,.05,.06,.06,.06,.06,.07,.07, & - .05,.05,.05,.05,.05,.05,.05,.06,.06,.06, & - .04,.04,.04,.04,.04,.04,.04,.05,.05,.05/ - DATA O3LO2/ & - 14.8,14.2,13.8,12.2,11.0,9.8,8.5,7.8,7.4,6.9, & - 13.2,13.0,12.5,11.3,10.4,9.0,7.8,7.5,7.0,6.6, & - 10.6,10.6,10.7,10.1,9.4,8.6,7.5,7.0,6.5,6.1, & - 7.0,7.3,7.5,7.5,7.5,7.3,6.7,6.4,6.0,5.8, & - 3.8,4.0,4.7,5.0,5.2,5.9,5.8,5.6,5.5,5.5, & - 1.4,1.6,2.4,3.0,3.7,4.1,4.6,4.8,5.1,5.0, & - .40,.50,.90,1.2,2.0,2.7,3.2,3.6,4.3,4.1, & - .07,.10,.20,.30,.80,1.4,2.1,2.4,2.7,3.0, & - .06,.07,.09,.15,.30,.70,1.2,1.4,1.6,2.0, & - .05,.05,.06,.12,.15,.30,.60,.70,.80,.80, & - .04,.05,.06,.08,.09,.15,.30,.40,.40,.40, & - .04,.04,.05,.055,.06,.09,.12,.13,.15,.15, & - .03,.03,.045,.052,.055,.06,.07,.07,.06,.07, & - .03,.03,.04,.051,.052,.052,.06,.06,.05,.05, & - .02,.02,.03,.05,.05,.05,.04,.04,.04,.04, & - .02,.02,.02,.04,.04,.04,.03,.03,.03,.03/ - DATA O3LO3/ & - 14.5,14.0,13.5,11.3,11.0,10.0,9.0,8.3,7.5,7.3, & - 13.5,13.2,12.5,11.1,10.4,9.7,8.2,7.8,7.4,6.8, & - 10.8,10.9,11.0,10.4,10.0,9.6,7.9,7.5,7.0,6.7, & - 7.3,7.5,7.8,8.5,9.0,8.5,7.7,7.4,6.9,6.5, & - 4.1,4.5,5.3,6.2,7.3,7.7,7.3,7.0,6.6,6.4, & - 1.8,2.0,2.2,3.8,4.3,5.6,6.2,6.2,6.4,6.2, & - .30,.50,.60,1.5,2.8,3.7,4.5,4.7,5.5,5.6, & - .09,.10,.15,.60,1.2,2.1,3.0,3.5,4.0,4.3, & - .06,.08,.10,.30,.60,1.1,1.9,2.2,2.9,3.0, & - .04,.05,.06,.15,.45,.60,1.1,1.3,1.6,1.8, & - .04,.04,.04,.08,.20,.30,.55,.60,.75,.90, & - .04,.04,.04,.05,.06,.10,.12,.15,.20,.25, & - .04,.04,.03,.04,.05,.06,.07,.07,.07,.08, & - .03,.03,.04,.05,.05,.05,.05,.05,.05,.05, & - .03,.03,.03,.04,.04,.04,.05,.05,.04,.04, & - .02,.02,.02,.04,.04,.04,.04,.04,.03,.03/ - DATA O3LO4/ & - 14.2,13.8,13.2,12.5,11.7,10.5,8.6,7.8,7.5,6.6, & - 12.5,12.4,12.2,11.7,10.8,9.8,7.8,7.2,6.5,6.1, & - 10.6,10.5,10.4,10.1,9.6,9.0,7.1,6.8,6.1,5.9, & - 7.0,7.4,7.9,7.8,7.6,7.3,6.2,6.1,5.8,5.6, & - 4.2,4.6,5.1,5.6,5.9,5.9,5.9,5.8,5.6,5.3, & - 2.1,2.3,2.6,2.9,3.5,4.3,4.8,4.9,5.1,5.1, & - 0.7,0.8,1.0,1.5,2.0,2.8,3.5,3.6,3.7,4.0, & - .15,.20,.40,.50,.60,1.4,2.1,2.2,2.3,2.5, & - .08,.10,.15,.25,.30,.90,1.2,1.3,1.4,1.6, & - .07,.08,.10,.14,.20,.50,.70,.90,.90,.80, & - .05,.06,.08,.12,.14,.20,.35,.40,.60,.50, & - .05,.05,.08,.09,.09,.09,.11,.12,.15,.18, & - .04,.05,.06,.07,.07,.08,.08,.08,.08,.08, & - .04,.04,.05,.07,.07,.07,.07,.07,.06,.05, & - .02,.02,.04,.05,.05,.05,.05,.05,.04,.04, & - .02,.02,.03,.04,.04,.04,.04,.04,.03,.03/ - -!!!!! -! PSS=101325. -! PDIF=PSS-PT -! -! DO L=1,LM1 -! PHALF(L+1)=AETA(L)*PDIF+PT -! ENDDO -! -! PHALF(1)=0. -! PHALF(LP1)=PSS -!!!! - N=kte;NP=N+1;NP2=N+2;NM1=N-1 - - NKK=41 - NK=81 - NKP=NK+1 - DO 24 K=1,NP -! 24 PHALF(K)=PHALF(K)*1.0E 03 - 24 PHALF(K)=PHALF(K)*0.01*1.0E+03 -! 24 PSTD(K)=PSTD(K+1)*1.0E 03 - DO 25 K=1,NK - PH(K)=PH(K)*1013250. - 25 P(K)=P(K)*1013250. - PH(NKP)=PH(NKP)*1013250. -!KAC WRITE (6,3) PH -!KAC WRITE (6,3) P -! WRITE (6,3) (PHALF(K),K=1,NP) -! WRITE (6,3) (PSTD(K),K=1,NP) -!***LOAD ARRAYS RO31,RO32,AS IN DICKS PGM. - DO 1010 K=1,25 - DO 1010 L=1,10 - RO31(L,K)=O3HI(L,K) - RO32(L,K)=O3HI(L,K) -1010 CONTINUE -! - DO 3000 NCASE=1,4 - ITAPE=NCASE+50 - IPLACE=2 - IF (NCASE.EQ.2) IPLACE=4 - IF (NCASE.EQ.3) IPLACE=1 - IF (NCASE.EQ.4) IPLACE=3 -!***NCASE=1: SPRING (IN N.H.) -!***NCASE=2: FALL (IN N.H.) -!***NCASE=3: WINTER (IN N.H.) -!***NCASE=4: SUMMER (IN N.H.) - IF (NCASE.EQ.1.OR.NCASE.EQ.2) THEN - DO 1011 K=26,41 - DO 1011 L=1,10 - RO31(L,K)=O3LO1(L,K-25) - RO32(L,K)=O3LO2(L,K-25) -1011 CONTINUE - ENDIF - IF (NCASE.EQ.3.OR.NCASE.EQ.4) THEN - DO 1031 K=26,41 - DO 1031 L=1,10 - RO31(L,K)=O3LO3(L,K-25) - RO32(L,K)=O3LO4(L,K-25) -1031 CONTINUE - ENDIF - DO 30 KK=1,NKK - DO 31 L=1,10 - DUO3N(L,KK)=RO31(11-L,KK) - 31 DUO3N(L+9,KK)=RO32(L,KK) - DUO3N(10,KK)=.5*(RO31(1,KK)+RO32(1,KK)) - 30 CONTINUE -!***FOR NCASE=2 OR NCASE=4,REVERSE LATITUDE ARRANGEMENT OF CORR. SEASON - IF (NCASE.EQ.2.OR.NCASE.EQ.4) THEN - DO 1024 KK=1,NKK - DO 1025 L=1,19 - TEMPN(L)=DUO3N(20-L,KK) -1025 CONTINUE - DO 1026 L=1,19 - DUO3N(L,KK)=TEMPN(L) -1026 CONTINUE -1024 CONTINUE - ENDIF -!***DUO3N NOW IS O3 PROFILE FOR APPROPRIATE SEASON,AT STD. PRESSURE -! LEVELS -!KAC WRITE (6,800) DUO3N -!***BEGIN LATITUDE (10 DEG) LOOP - DO 33 L=1,19 - DO 22 KK=1,NKK - 22 RSTD(KK)=DUO3N(L,KK) - NKM=NK-1 - NKMM=NK-3 -! BESSELS HALF-POINT INTERPOLATION FORMULA - DO 60 K=4,NKMM,2 - KI=K/2 - 60 RDATA(K)=.5*(RSTD(KI)+RSTD(KI+1))-(RSTD(KI+2)-RSTD(KI+1)-RSTD(KI)+ & - RSTD(KI-1))/16. - RDATA(2)=.5*(RSTD(2)+RSTD(1)) - RDATA(NKM)=.5*(RSTD(NKK)+RSTD(NKK-1)) -! PUT UNCHANGED DATA INTO NEW ARRAY - DO 61 K=1,NK,2 - KQ=(K+1)/2 - 61 RDATA(K)=RSTD(KQ) -!---NOTE TO NMC: THIS WRITE IS COMMENTED OUT TO REDUCE PRINTOUT -! WRITE (6,798) RDATA -! CALCULATE LAYER-MEAN OZONE MIXING RATIO FOR EACH MODEL LEVEL - DO 99 KK=1,N - RBAR(KK)=0. -! LOOP TO CALCULATE SUMS TO GET LAYER OZONE MEAN - DO 98 K=1,NK - IF(PH(K+1).LT.PHALF(KK)) GO TO 98 - IF(PH(K).GT.PHALF(KK+1)) GO TO 98 - IF(PH(K+1).LT.PHALF(KK+1).AND.PH(K).LT.PHALF(KK)) RBAR(KK)=RBAR(KK & - )+RDATA(K)*(PH(K+1)-PHALF(KK)) - IF(PH(K+1).LT.PHALF(KK+1).AND.PH(K).GE.PHALF(KK)) RBAR(KK)=RBAR(KK & - )+RDATA(K)*(PH(K+1)-PH(K)) - IF(PH(K+1).GT.PHALF(KK+1).AND.PH(K).GT.PHALF(KK)) RBAR(KK)=RBAR(KK & - )+RDATA(K)*(PHALF(KK+1)-PH(K)) - 98 CONTINUE - RBAR(KK)=RBAR(KK)/(PHALF(KK+1)-PHALF(KK)) - IF(RBAR(KK).GT..0000) GO TO 99 -! CODE TO COVER CASE WHEN MODEL RESOLUTION IS SO FINE THAT NO VALUE -! OF P(K) IN THE OZONE DATA ARRAY FALLS BETWEEN PHALF(KK+1) AND -! PHALF(KK). PROCEDURE IS TO SIMPLY GRAB THE NEAREST VALUE FROM -! RDATA - DO 29 K=1,NK - IF(PH(K).LT.PHALF(KK).AND.PH(K+1).GE.PHALF(KK+1)) RBAR(KK)=RDATA(K) - 29 CONTINUE - 99 CONTINUE -! CALCULATE TOTAL OZONE - O3RD=0. - DO 89 KK=1,80 - 89 O3RD=O3RD+RDATA(KK)*(PH(KK+1)-PH(KK)) - O3RD=O3RD+RDATA(81)*(P(81)-PH(81)) - O3RD=O3RD/980. - O3TOT=0. - DO 88 KK=1,N - 88 O3TOT=O3TOT+RBAR(KK)*(PHALF(KK+1)-PHALF(KK)) - O3TOT=O3TOT/980. -! UNITS ARE MICROGRAMS/CM**2 - O3DU=O3TOT/2.144 -! O3DU UNITS ARE DOBSON UNITS (10**-3 ATM-CM) -!--NOTE TO NMC: THIS IS COMMENTED OUT TO SAVE PRINTOUT -! WRITE (6,796) O3RD,O3TOT,O3DU - DO 23 KK=1,N - 23 DDUO3(L,KK)=RBAR(KK)*.01 - 33 CONTINUE -!***END OF LATITUDE LOOP -! -!***CREATE 5 DEG OZONE QUANTITIES BY LINEAR INTERPOLATION OF -! 10 DEG VALUES - DO 1060 KK=1,N - DO 1061 L=1,19 - O35DEG(2*L-1,KK)=DDUO3(L,KK) -1061 CONTINUE - DO 1062 L=1,18 - O35DEG(2*L,KK)=0.5*(DDUO3(L,KK)+DDUO3(L+1,KK)) -1062 CONTINUE -1060 CONTINUE -!***OUTPUT TO UNIT (ITAPE) THE OZONE VALUES FOR LATER USE -!O222 *************************************************** -!C WRITE (66) O35DEG - IF (IPLACE.EQ.1) THEN - DO 302 JJ=1,37 - DO 302 KEN=1,N - DDUO3N(JJ,KEN) = O35DEG(JJ,KEN) - 302 CONTINUE - ELSE IF (IPLACE.EQ.2) THEN - DO 312 JJ=1,37 - DO 312 KEN=1,N - DDO3N2(JJ,KEN) = O35DEG(JJ,KEN) - 312 CONTINUE - ELSE IF (IPLACE.EQ.3) THEN - DO 322 JJ=1,37 - DO 322 KEN=1,N - DDO3N3(JJ,KEN) = O35DEG(JJ,KEN) - 322 CONTINUE - ELSE IF (IPLACE.EQ.4) THEN - DO 332 JJ=1,37 - DO 332 KEN=1,N - DDO3N4(JJ,KEN) = O35DEG(JJ,KEN) - 332 CONTINUE - END IF -!O222 *************************************************** -3000 CONTINUE -!***END OF LOOP OVER CASES - RETURN - 1 FORMAT(10F4.2) - 2 FORMAT(10X,E14.7,1X,E14.7,1X,E14.7,1X,E14.7,1X) - 3 FORMAT(10E12.5) - 797 FORMAT(10F7.2) - 799 FORMAT(19F6.4) - 800 FORMAT(19F6.2) - 102 FORMAT(' O3 IPLACE=',I4) - 1033 FORMAT(19F6.5) - 101 FORMAT(5X,1H*,F6.5,1H,,F6.5,1H,,F6.5,1H,,F6.5,1H,,F6.5,1H,,F6.5, & - 1H,,F6.5,1H,,F6.5,1H,,F6.5,1H,) - - END SUBROUTINE O3INT -!---------------------------------------------------------------- - - SUBROUTINE CLO89(CLDFAC,CAMT,NCLDS,KBTM,KTOP & - , ids,ide, jds,jde, kds,kde & - , ims,ime, jms,jme, kms,kme & - , its,ite, jts,jte, kts,kte ) -!---------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte -!---------------------------------------------------------------------- - -! ************************************************************ -! * * -! * THIS SUBROUTINE WAS MODIFIED TO BE USED IN THE ETA MODEL * -! * * -! * Q. ZHAO 95-3-22 * -! * * -! ************************************************************ - - REAL, INTENT(OUT),DIMENSION(its:ite,kts:kte+1,kts:kte+1) :: CLDFAC - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: CAMT - INTEGER, INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: KBTM,KTOP - INTEGER, INTENT(IN), DIMENSION(its:ite) :: NCLDS - - REAL, DIMENSION(kts:kte+1,kts:kte+1,64) :: CLDIPT - REAL, DIMENSION(kts:kte+1) :: CLDROW - INTEGER:: IQ,ITOP,I,J,JTOP,IR,IP,K1,K2,KB,K,KP,KT,NC - REAL :: XCLD - - INTEGER :: L,LP1,LP2,LP3,LM1,LM2,LM3,MYIS,MYIE - - ! DIMENSION CLDIPT(LP1,LP1, 64 ) - ! DIMENSION NCLDS(IDIM1:IDIM2),KTOP(IDIM1:IDIM2,LP1), & - ! KBTM(IDIM1:IDIM2,LP1) - ! DIMENSION CLDROW(LP1) - ! DIMENSION CAMT(IDIM1:IDIM2,LP1),CLDFAC(IDIM1:IDIM2,LP1,LP1) - - L=kte - LP1=L+1; LP2=L+2; LP3=L+3 - LM1=L-1; LM2=L-2; LM3=L-3 - MYIS=its; MYIE=ite - -! - DO 1 IQ=MYIS,MYIE,64 - ITOP=IQ+63 - IF(ITOP.GT.MYIE) ITOP=MYIE - JTOP=ITOP-IQ+1 - DO 11 IP=1,JTOP - IR=IQ+IP-1 - IF (NCLDS(IR).EQ.0) THEN - DO 25 J=1,LP1 - DO 25 I=1,LP1 - CLDIPT(I,J,IP)=1. -25 CONTINUE - ENDIF - IF (NCLDS(IR).GE.1) THEN - XCLD=1.-CAMT(IR,2) - K1=KTOP(IR,2)+1 - K2=KBTM(IR,2) - DO 27 J=1,LP1 - CLDROW(J)=1. -27 CONTINUE - DO 29 J=1,K2 - CLDROW(J)=XCLD -29 CONTINUE - KB=MAX(K1,K2+1) - DO 33 K=KB,LP1 - DO 33 KP=1,LP1 - CLDIPT(KP,K,IP)=CLDROW(KP) -33 CONTINUE - DO 37 J=1,LP1 - CLDROW(J)=1. -37 CONTINUE - DO 39 J=K1,LP1 - CLDROW(J)=XCLD -39 CONTINUE - KT=MIN(K1-1,K2) - DO 43 K=1,KT - DO 43 KP=1,LP1 - CLDIPT(KP,K,IP)=CLDROW(KP) -43 CONTINUE - IF(K2+1.LE.K1-1) THEN - DO 31 J=K2+1,K1-1 - DO 31 I=1,LP1 - CLDIPT(I,J,IP)=1. -31 CONTINUE - ELSE IF(K1.LE.K2) THEN - DO 32 J=K1,K2 - DO 32 I=1,LP1 - CLDIPT(I,J,IP)=XCLD -32 CONTINUE - ENDIF - ENDIF - - IF (NCLDS(IR).GE.2) THEN - DO 21 NC=2,NCLDS(IR) - XCLD=1.-CAMT(IR,NC+1) - K1=KTOP(IR,NC+1)+1 - K2=KBTM(IR,NC+1) - DO 47 J=1,LP1 - CLDROW(J)=1. -47 CONTINUE - DO 49 J=1,K2 - CLDROW(J)=XCLD -49 CONTINUE - KB=MAX(K1,K2+1) - DO 53 K=KB,LP1 - DO 53 KP=1,LP1 - CLDIPT(KP,K,IP)=CLDIPT(KP,K,IP)*CLDROW(KP) -53 CONTINUE - DO 57 J=1,LP1 - CLDROW(J)=1. -57 CONTINUE - DO 59 J=K1,LP1 - CLDROW(J)=XCLD -59 CONTINUE - KT=MIN(K1-1,K2) - DO 63 K=1,KT - DO 63 KP=1,LP1 - CLDIPT(KP,K,IP)=CLDIPT(KP,K,IP)*CLDROW(KP) -63 CONTINUE - IF(K1.LE.K2) THEN - DO 52 J=K1,K2 - DO 52 I=1,LP1 - CLDIPT(I,J,IP)=CLDIPT(I,J,IP)*XCLD -52 CONTINUE - ENDIF -21 CONTINUE - ENDIF -11 CONTINUE - DO 71 J=1,LP1 - DO 71 I=1,LP1 - DO 71 IP=1,JTOP - IR=IQ+IP-1 - CLDFAC(IR,I,J)=CLDIPT(I,J,IP) -71 CONTINUE -1 CONTINUE - - END SUBROUTINE CLO89 -!---------------------------------------------------------------- -! SUBROUTINE LWR88(HEATRA,GRNFLX,TOPFLX, & -! PRESS,TEMP,RH2O,QO3,CLDFAC, & -! CAMT,NCLDS,KTOP,KBTM, & -!! BO3RND,AO3RND,T1,T2,T4,EM1V,EM1VW,EM3V, & -! BO3RND,AO3RND, & -! APCM,BPCM,ATPCM,BTPCM,ACOMB,BCOMB,BETACM, & -! ZERO,ONE,H18E3,P0INV,H6P08108,DIFFCTR, & -! GINV,H3M4,BETINW,RATH2OMW,GP0INV,P0,P0XZP8, & -! P0XZP2,H3M3,H1M3,H1M2,H25E2,B0,B2,B1,B3,HAF, & -! TEN,HP1,FOUR,HM1EZ,SKO3R, & -! AB15WD,SKC1R,RADCON,QUARTR,TWO, & -! HM6666M2,HMP66667,HMP5, HP166666,H41666M2, & -! RADCON1,H16E1, H28E1,H44194M2,H1P41819,SKO2D, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) - - SUBROUTINE LWR88(HEATRA,GRNFLX,TOPFLX, & - PRESS,TEMP,RH2O,QO3,CLDFAC, & - CAMT,NCLDS,KTOP,KBTM, & -! BO3RND,AO3RND,T1,T2,T4,EM1V,EM1VW,EM3V, & - BO3RND,AO3RND, & - APCM,BPCM,ATPCM,BTPCM,ACOMB,BCOMB,BETACM, & - ZERO,ONE,H18E3,P0INV,H6P08108,DIFFCTR, & - GINV,H3M4,BETINW,RATH2OMW,GP0INV,P0,P0XZP8, & - P0XZP2,H3M3,H1M3,H1M2,H25E2,B0,B2,B1,B3,HAF, & - TEN,HP1,FOUR,HM1EZ, & - RADCON,QUARTR,TWO, & - HM6666M2,HMP66667,HMP5, HP166666,H41666M2, & - RADCON1,H16E1, H28E1,H44194M2,H1P41819, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -!--------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- -! INTEGER, PARAMETER :: NBLY=15 - - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte - REAL, INTENT(IN) :: ZERO,ONE,H18E3,P0INV,H6P08108,DIFFCTR - REAL, INTENT(IN) :: GINV,H3M4,BETINW,RATH2OMW,GP0INV - REAL, INTENT(IN) :: P0XZP8,P0XZP2,H3M3,P0,H1M3 - REAL, INTENT(IN) :: H1M2,H25E2,B0,B1,B2,B3,HAF -! REAL, INTENT(IN) :: TEN,HP1,FOUR,HM1EZ,SKO3R - REAL, INTENT(IN) :: TEN,HP1,FOUR,HM1EZ -! REAL, INTENT(IN) :: AB15WD,SKC1R,RADCON,QUARTR,TWO - REAL, INTENT(IN) :: RADCON,QUARTR,TWO - REAL, INTENT(IN) :: HM6666M2,HMP66667,HMP5, HP166666,H41666M2 -! REAL, INTENT(IN) :: RADCON1,H16E1, H28E1,H44194M2,H1P41819,SKO2D - REAL, INTENT(IN) :: RADCON1,H16E1, H28E1,H44194M2,H1P41819 -!---------------------------------------------------------------------- - REAL, INTENT(IN), DIMENSION(3) :: BO3RND,AO3RND -! REAL,INTENT(IN),DIMENSION(5040):: T1,T2,T4,EM1V,EM1VW -! REAL, INTENT(IN), DIMENSION(5040) :: EM3V - REAL,INTENT(IN),DIMENSION(NBLY) :: APCM,BPCM,ATPCM,BTPCM,ACOMB, & - BCOMB,BETACM - - REAL, INTENT(IN),DIMENSION(its:ite,kts:kte+1,kts:kte+1) :: CLDFAC - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: CAMT - INTEGER, INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: KBTM,KTOP - INTEGER, INTENT(IN), DIMENSION(its:ite) :: NCLDS - - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: PRESS,TEMP - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte) :: RH2O,QO3 - REAL, INTENT(OUT), DIMENSION(its:ite,kts:kte) :: HEATRA - REAL, INTENT(OUT), DIMENSION(its:ite) :: GRNFLX,TOPFLX - -! REAL, DIMENSION(kts:kte+1,kts:kte+1,64) :: CLDIPT - -! Include co2 data from a file, which needs to have exactly vertical -! dimension of the model. - - -!!! ??? co2 table -! REAL, DIMENSION(kts:kte+1,kts:kte+1) :: CO251,CDT51,CDT58,C2D51,& -! C2D58,CO258 -! REAL, DIMENSION(kts:kte+1) :: STEMP,GTEMP,CO231,CO238, & -! C2D31,C2D38,CDT31,CDT38, & -! CO271,CO278,C2D71,C2D78, & -! CDT71,CDT78 -! REAL, DIMENSION(kts:kte) :: CO2M51,CO2M58,CDTM51,CDTM58, & -! C2DM51,C2DM58 -!!! end co2 table - -! REAL, DIMENSION(kts:kte+1) :: CLDROW - - REAL, DIMENSION(its:ite,kts:kte+1) :: TEXPSL,TOTPHI,TOTO3,CNTVAL,& - TPHIO3,TOTVO2,TSTDAV,TDAV, & - VSUM3,CO2R1,D2CD21,DCO2D1, & - CO2R2,D2CD22,DCO2D2,CO2SP1,& - CO2SP2,CO2R,DCO2DT,D2CDT2, & - TLSQU,DIFT - REAL, DIMENSION(its:ite,kts:kte) :: DELP2,DELP,CO2NBL,& - QH2O,VV,VAR1,VAR2,VAR3,VAR4 - REAL, DIMENSION(its:ite,kts:kte+1) :: P,T - REAL, DIMENSION(its:ite,kts:kte) :: CO2MR,CO2MD,CO2M2D - REAL, DIMENSION(its:ite,kts:kte*2+1):: EMPL - - REAL, DIMENSION(its:ite) :: EMX1,EMX2,VSUM1,VSUM2,A1,A2 - REAL, DIMENSION(its:ite,kts:kte+1,kts:kte+1) :: CO21 - - ! COMMON/CO2BD3/CO251(LP1,LP1),CO258(LP1,LP1),CDT51(LP1,LP1), - ! DIMENSION CO21(IDIM1:IDIM2,LP1,LP1),CO2NBL(IDIM1:IDIM2,L) - ! DIMENSION CO2R(IDIM1:IDIM2,LP1),DIFT(IDIM1:IDIM2,LP1) - ! 1 CO2M2D(IDIM1:IDIM2,L) - ! DIMENSION CO2MR(IDIM1:IDIM2,L),CO2MD(IDIM1:IDIM2,L), - ! 2 CO2M58(L),CDTM51(L),CDTM58(L),C2DM51(L),C2DM58(L), - ! 1 CDT58(LP1,LP1),C2D51(LP1,LP1),C2D58(LP1,LP1),CO2M51(L), - ! COMMON / CO2BD2 / CO231(LP1),CO238(LP1),CDT31(LP1), - ! 1 CDT38(LP1),C2D31(LP1),C2D38(LP1) - ! DIMENSION CO2R1(IDIM1:IDIM2,LP1),DCO2D1(IDIM1:IDIM2,LP1) - ! DIMENSION D2CD21(IDIM1:IDIM2,LP1),D2CD22(IDIM1:IDIM2,LP1) - ! 3 STEMP(LP1),GTEMP(LP1),B0,B1,B2,B3 - ! 1 VV(IDIM1:IDIM2,L),VSUM3(IDIM1:IDIM2,LP1),VSUM1(IDIM1:IDIM2), - ! 2 VSUM2(IDIM1:IDIM2) - ! DIMENSION TDAV(IDIM1:IDIM2,LP1),TSTDAV(IDIM1:IDIM2,LP1), - ! LLP1=LL+1, LL = 2L - ! EMX2(IDIM1:IDIM2),EMPL(IDIM1:IDIM2,LLP1) - ! DIMENSION TPHIO3(IDIM1:IDIM2,LP1), - ! DIMENSION TEXPSL(IDIM1:IDIM2,LP1) - ! DIMENSION QH2O(IDIM1:IDIM2,L) - ! DIMENSION DELP2(IDIM1:IDIM2,L) - ! DIMENSION VAR1(IDIM1:IDIM2,L),VAR2(IDIM1:IDIM2,L), - ! 1 VAR3(IDIM1:IDIM2,L),VAR4(IDIM1:IDIM2,L) - ! 1 VV(IDIM1:IDIM2,L) - ! DIMENSION CNTVAL(IDIM1:IDIM2,LP1) - ! DIMENSION TOTO3(IDIM1:IDIM2,LP1) - ! DIMENSION EMX1(IDIM1:IDIM2), - - ! DIMENSION PRESS(IDIM1:IDIM2,LP1),TEMP(IDIM1:IDIM2,LP1), & - ! RH2O(IDIM1:IDIM2,L),QO3(IDIM1:IDIM2,L) - ! DIMENSION HEATRA(IDIM1:IDIM2,L),GRNFLX(IDIM1:IDIM2), & - ! TOPFLX(IDIM1:IDIM2) - -! -! -!****COMPUTE FLUX PRESSURES (P) AND DIFFERENCES (DELP2,DELP) -!****COMPUTE FLUX LEVEL TEMPERATURES (T) AND CONTINUUM TEMPERATURE -! CORRECTIONS (TEXPSL) - - INTEGER :: K, I,KP - INTEGER :: L,LP1,LP2,LP3,LM1,LM2,LM3,MYIS,MYIE,LLP1,LL - - L=kte - LP1=L+1; LP2=L+2; LP3=L+3; LLP1 = 2*L + 1 - LM1=L-1; LM2=L-2; LM3=L-3; LL = 2*L - MYIS=its; MYIE=ite - - - DO 103 K=2,L - DO 103 I=MYIS,MYIE - P(I,K)=HAF*(PRESS(I,K-1)+PRESS(I,K)) - T(I,K)=HAF*(TEMP(I,K-1)+TEMP(I,K)) -103 CONTINUE - DO 105 I=MYIS,MYIE - P(I,1)=ZERO - P(I,LP1)=PRESS(I,LP1) - T(I,1)=TEMP(I,1) - T(I,LP1)=TEMP(I,LP1) -105 CONTINUE - DO 107 K=1,L - DO 107 I=MYIS,MYIE - DELP2(I,K)=P(I,K+1)-P(I,K) - DELP(I,K)=ONE/DELP2(I,K) -107 CONTINUE -!****COMPUTE ARGUMENT FOR CONT.TEMP.COEFF. -! (THIS IS 1800.(1./TEMP-1./296.)) - DO 125 K=1,LP1 - DO 125 I=MYIS,MYIE - TEXPSL(I,K)=H18E3/TEMP(I,K)-H6P08108 -!...THEN TAKE EXPONENTIAL - TEXPSL(I,K)=EXP(TEXPSL(I,K)) -125 CONTINUE -!***COMPUTE OPTICAL PATHS FOR H2O AND O3, USING THE DIFFUSIVITY -! APPROXIMATION FOR THE ANGULAR INTEGRATION (1.66). OBTAIN THE -! UNWEIGHTED VALUES(VAR1,VAR3) AND THE WEIGHTED VALUES(VAR2,VAR4). -! THE QUANTITIES H3M4(.0003) AND H3M3(.003) APPEARING IN THE VAR2 AND -! VAR4 EXPRESSIONS ARE THE APPROXIMATE VOIGT CORRECTIONS FOR H2O AND -! O3,RESPECTIVELY. -! - DO 131 K=1,L - DO 131 I=MYIS,MYIE - QH2O(I,K)=RH2O(I,K)*DIFFCTR -!---VV IS THE LAYER-MEAN PRESSURE (IN ATM),WHICH IS NOT THE SAME AS -! THE LEVEL PRESSURE (PRESS) - VV(I,K)=HAF*(P(I,K+1)+P(I,K))*P0INV - VAR1(I,K)=DELP2(I,K)*QH2O(I,K)*GINV - VAR3(I,K)=DELP2(I,K)*QO3(I,K)*DIFFCTR*GINV - VAR2(I,K)=VAR1(I,K)*(VV(I,K)+H3M4) - VAR4(I,K)=VAR3(I,K)*(VV(I,K)+H3M3) -! COMPUTE OPTICAL PATH FOR THE H2O CONTINUUM, USING ROBERTS COEFFS. -! (BETINW),AND TEMP. CORRECTION (TEXPSL). THE DIFFUSIVITY FACTOR -! (WHICH CANCELS OUT IN THIS EXPRESSION) IS ASSUMED TO BE 1.66. THE -! USE OF THE DIFFUSIVITY FACTOR HAS BEEN SHOWN TO BE A SIGNIFICANT -! SOURCE OF ERROR IN THE CONTINUUM CALCS.,BUT THE TIME PENALTY OF -! AN ANGULAR INTEGRATION IS SEVERE. -! - CNTVAL(I,K)=TEXPSL(I,K)*RH2O(I,K)*VAR2(I,K)*BETINW/ & - (RH2O(I,K)+RATH2OMW) -131 CONTINUE -! COMPUTE SUMMED OPTICAL PATHS FOR H2O,O3 AND CONTINUUM - DO 201 I=MYIS,MYIE - TOTPHI(I,1)=ZERO - TOTO3(I,1)=ZERO - TPHIO3(I,1)=ZERO - TOTVO2(I,1)=ZERO -201 CONTINUE - DO 203 K=2,LP1 - DO 203 I=MYIS,MYIE - TOTPHI(I,K)=TOTPHI(I,K-1)+VAR2(I,K-1) - TOTO3(I,K)=TOTO3(I,K-1)+VAR3(I,K-1) - TPHIO3(I,K)=TPHIO3(I,K-1)+VAR4(I,K-1) - TOTVO2(I,K)=TOTVO2(I,K-1)+CNTVAL(I,K-1) -203 CONTINUE -!---EMX1 IS THE ADDITIONAL PRESSURE-SCALED MASS FROM PRESS(L) TO -! P(L). IT IS USED IN NEARBY LAYER AND EMISS CALCULATIONS. -!---EMX2 IS THE ADDITIONAL PRESSURE-SCALED MASS FROM PRESS(L) TO -! P(LP1). IT IS USED IN CALCULATIONS BETWEEN FLUX LEVELS L AND LP1. -! - DO 801 I=MYIS,MYIE - EMX1(I)=QH2O(I,L)*PRESS(I,L)*(PRESS(I,L)-P(I,L))*GP0INV - EMX2(I)=QH2O(I,L)*PRESS(I,L)*(P(I,LP1)-PRESS(I,L))*GP0INV -801 CONTINUE -!---EMPL IS THE PRESSURE SCALED MASS FROM P(K) TO PRESS(K) (INDEX 2-LP1) -! OR TO PRESS(K+1) (INDEX LP2-LL) - DO 811 K=1,L - DO 811 I=MYIS,MYIE - EMPL(I,K+1)=QH2O(I,K)*P(I,K+1)*(P(I,K+1)-PRESS(I,K))*GP0INV -811 CONTINUE - DO 812 K=1,LM1 - DO 812 I=MYIS,MYIE - EMPL(I,LP2+K-1)=QH2O(I,K+1)*P(I,K+1)*(PRESS(I,K+1)-P(I,K+1)) & - *GP0INV -812 CONTINUE - DO 821 I=MYIS,MYIE - EMPL(I,1)=VAR2(I,L) - EMPL(I,LLP1)=EMPL(I,LL) -821 CONTINUE -!***COMPUTE WEIGHTED TEMPERATURE (TDAV) AND PRESSURE (TSTDAV) INTEGRALS -! FOR USE IN OBTAINING TEMP. DIFFERENCE BET. SOUNDING AND STD. -! TEMP. SOUNDING (DIFT) - DO 161 I=MYIS,MYIE - TSTDAV(I,1)=ZERO - TDAV(I,1)=ZERO -161 CONTINUE - DO 162 K=1,LP1 - DO 162 I=MYIS,MYIE - VSUM3(I,K)=TEMP(I,K)-STEMP(K) -162 CONTINUE - DO 163 K=1,L - DO 165 I=MYIS,MYIE - VSUM2(I)=GTEMP(K)*DELP2(I,K) - VSUM1(I)=VSUM2(I)*VSUM3(I,K) - TSTDAV(I,K+1)=TSTDAV(I,K)+VSUM2(I) - TDAV(I,K+1)=TDAV(I,K)+VSUM1(I) -165 CONTINUE -163 CONTINUE -! -!****EVALUATE COEFFICIENTS FOR CO2 PRESSURE INTERPOLATION (A1,A2) - DO 171 I=MYIS,MYIE - A1(I)=(PRESS(I,LP1)-P0XZP8)/P0XZP2 - A2(I)=(P0-PRESS(I,LP1))/P0XZP2 -171 CONTINUE -!***PERFORM CO2 PRESSURE INTERPOLATION ON ALL INPUTTED TRANSMISSION -! FUNCTIONS AND TEMP. DERIVATIVES -!---SUCCESSIVELY COMPUTING CO2R,DCO2DT AND D2CDT2 IS DONE TO SAVE -! STORAGE (AT A SLIGHT LOSS IN COMPUTATION TIME) - DO 184 K=1,LP1 - DO 184 I=MYIS,MYIE - CO2R1(I,K)=A1(I)*CO231(K)+A2(I)*CO238(K) - D2CD21(I,K)=H1M3*(A1(I)*C2D31(K)+A2(I)*C2D38(K)) - DCO2D1(I,K)=H1M2*(A1(I)*CDT31(K)+A2(I)*CDT38(K)) - CO2R2(I,K)=A1(I)*CO271(K)+A2(I)*CO278(K) - D2CD22(I,K)=H1M3*(A1(I)*C2D71(K)+A2(I)*C2D78(K)) - DCO2D2(I,K)=H1M2*(A1(I)*CDT71(K)+A2(I)*CDT78(K)) -184 CONTINUE - DO 190 K=1,L - DO 190 I=MYIS,MYIE - CO2MR(I,K)=A1(I)*CO2M51(K)+A2(I)*CO2M58(K) - CO2MD(I,K)=H1M2*(A1(I)*CDTM51(K)+A2(I)*CDTM58(K)) - CO2M2D(I,K)=H1M3*(A1(I)*C2DM51(K)+A2(I)*C2DM58(K)) -190 CONTINUE -!***COMPUTE CO2 TEMPERATURE INTERPOLATIONS FOR ALL BANDS,USING DIFT -! -! THE CASE WHERE K=1 IS HANDLED FIRST. WE ARE NOW REPLACING -! 3-DIMENSIONAL ARRAYS BY 2-D ARRAYS, TO SAVE SPACE. THUS THIS -! CALCULATION IS FOR (I,KP,1) - DO 211 KP=2,LP1 - DO 211 I=MYIS,MYIE - DIFT(I,KP)=TDAV(I,KP)/TSTDAV(I,KP) -211 CONTINUE - DO 212 I=MYIS,MYIE - CO21(I,1,1)=1.0 - CO2SP1(I,1)=1.0 - CO2SP2(I,1)=1.0 -212 CONTINUE - DO 215 KP=2,LP1 - DO 215 I=MYIS,MYIE -!---CALCULATIONS FOR KP>1 FOR K=1 - CO2R(I,KP)=A1(I)*CO251(KP,1)+A2(I)*CO258(KP,1) - DCO2DT(I,KP)=H1M2*(A1(I)*CDT51(KP,1)+A2(I)*CDT58(KP,1)) - D2CDT2(I,KP)=H1M3*(A1(I)*C2D51(KP,1)+A2(I)*C2D58(KP,1)) - CO21(I,KP,1)=CO2R(I,KP)+DIFT(I,KP)*(DCO2DT(I,KP)+ & - HAF*DIFT(I,KP)*D2CDT2(I,KP)) -!---CALCULATIONS FOR (EFFECTIVELY) KP=1,K>KP. THESE USE THE -! SAME VALUE OF DIFT DUE TO SYMMETRY - CO2R(I,KP)=A1(I)*CO251(1,KP)+A2(I)*CO258(1,KP) - DCO2DT(I,KP)=H1M2*(A1(I)*CDT51(1,KP)+A2(I)*CDT58(1,KP)) - D2CDT2(I,KP)=H1M3*(A1(I)*C2D51(1,KP)+A2(I)*C2D58(1,KP)) - CO21(I,1,KP)=CO2R(I,KP)+DIFT(I,KP)*(DCO2DT(I,KP)+ & - HAF*DIFT(I,KP)*D2CDT2(I,KP)) -215 CONTINUE -! THE TRANSMISSION FUNCTIONS USED IN SPA88 MAY BE COMPUTED NOW. -!---(IN THE 250 LOOP,DIFT REALLY SHOULD BE (I,1,K), BUT DIFT IS -! INVARIANT WITH RESPECT TO K,KP,AND SO (I,1,K)=(I,K,1)) - DO 250 K=2,LP1 - DO 250 I=MYIS,MYIE - CO2SP1(I,K)=CO2R1(I,K)+DIFT(I,K)*(DCO2D1(I,K)+HAF*DIFT(I,K)* & - D2CD21(I,K)) - CO2SP2(I,K)=CO2R2(I,K)+DIFT(I,K)*(DCO2D2(I,K)+HAF*DIFT(I,K)* & - D2CD22(I,K)) -250 CONTINUE -! -! NEXT THE CASE WHEN K=2...L - DO 220 K=2,L - DO 222 KP=K+1,LP1 - DO 222 I=MYIS,MYIE - DIFT(I,KP)=(TDAV(I,KP)-TDAV(I,K))/ & - (TSTDAV(I,KP)-TSTDAV(I,K)) - CO2R(I,KP)=A1(I)*CO251(KP,K)+A2(I)*CO258(KP,K) - DCO2DT(I,KP)=H1M2*(A1(I)*CDT51(KP,K)+A2(I)*CDT58(KP,K)) - D2CDT2(I,KP)=H1M3*(A1(I)*C2D51(KP,K)+A2(I)*C2D58(KP,K)) - CO21(I,KP,K)=CO2R(I,KP)+DIFT(I,KP)*(DCO2DT(I,KP)+ & - HAF*DIFT(I,KP)*D2CDT2(I,KP)) - CO2R(I,KP)=A1(I)*CO251(K,KP)+A2(I)*CO258(K,KP) - DCO2DT(I,KP)=H1M2*(A1(I)*CDT51(K,KP)+A2(I)*CDT58(K,KP)) - D2CDT2(I,KP)=H1M3*(A1(I)*C2D51(K,KP)+A2(I)*C2D58(K,KP)) - CO21(I,K,KP)=CO2R(I,KP)+DIFT(I,KP)*(DCO2DT(I,KP)+ & - HAF*DIFT(I,KP)*D2CDT2(I,KP)) -222 CONTINUE -220 CONTINUE -! FINALLY THE CASE WHEN K=KP,K=2..LP1 - DO 206 K=2,LP1 - DO 206 I=MYIS,MYIE - DIFT(I,K)=HAF*(VSUM3(I,K)+VSUM3(I,K-1)) - CO2R(I,K)=A1(I)*CO251(K,K)+A2(I)*CO258(K,K) - DCO2DT(I,K)=H1M2*(A1(I)*CDT51(K,K)+A2(I)*CDT58(K,K)) - D2CDT2(I,K)=H1M3*(A1(I)*C2D51(K,K)+A2(I)*C2D58(K,K)) - CO21(I,K,K)=CO2R(I,K)+DIFT(I,K)*(DCO2DT(I,K)+ & - HAF*DIFT(I,K)*D2CDT2(I,K)) -206 CONTINUE -!--- WE AREN'T DOING NBL TFS ON THE 100 CM-1 BANDS . - DO 260 K=1,L - DO 260 I=MYIS,MYIE - CO2NBL(I,K)=CO2MR(I,K)+VSUM3(I,K)*(CO2MD(I,K)+HAF* & - VSUM3(I,K)*CO2M2D(I,K)) -260 CONTINUE -!***COMPUTE TEMP. COEFFICIENT BASED ON T(K) (SEE REF.2) - DO 264 K=1,LP1 - DO 264 I=MYIS,MYIE - IF (T(I,K).LE.H25E2) THEN - TLSQU(I,K)=B0+(T(I,K)-H25E2)* & - (B1+(T(I,K)-H25E2)* & - (B2+B3*(T(I,K)-H25E2))) - ELSE - TLSQU(I,K)=B0 - ENDIF -264 CONTINUE -!***APPLY TO ALL CO2 TFS - DO 280 K=1,LP1 - DO 282 KP=1,LP1 - DO 282 I=MYIS,MYIE - CO21(I,KP,K)=CO21(I,KP,K)*(ONE-TLSQU(I,KP))+TLSQU(I,KP) -282 CONTINUE -280 CONTINUE - DO 284 K=1,LP1 - DO 286 I=MYIS,MYIE - CO2SP1(I,K)=CO2SP1(I,K)*(ONE-TLSQU(I,1))+TLSQU(I,1) - CO2SP2(I,K)=CO2SP2(I,K)*(ONE-TLSQU(I,1))+TLSQU(I,1) -286 CONTINUE -284 CONTINUE - DO 288 K=1,L - DO 290 I=MYIS,MYIE - CO2NBL(I,K)=CO2NBL(I,K)*(ONE-TLSQU(I,K))+TLSQU(I,K) -290 CONTINUE -288 CONTINUE -! CALL FST88(HEATRA,GRNFLX,TOPFLX, & -! QH2O,PRESS,P,DELP,DELP2,TEMP,T, & -! CLDFAC,NCLDS,KTOP,KBTM,CAMT, & -! CO21,CO2NBL,CO2SP1,CO2SP2, & -! VAR1,VAR2,VAR3,VAR4,CNTVAL, & -! TOTO3,TPHIO3,TOTPHI,TOTVO2, & -! EMX1,EMX2,EMPL, & -! -! BO3RND,AO3RND, & -!! T1,T2,T4 , EM1V,EM1VW, EM3V, & -! APCM,BPCM,ATPCM,BTPCM,ACOMB,BCOMB,BETACM, & -! TEN,HP1,HAF,ONE,FOUR,HM1EZ,SKO3R, & -! AB15WD,SKC1R,RADCON,QUARTR,TWO, & -! HM6666M2,HMP66667,HMP5, & -! HP166666,H41666M2,RADCON1, & -! H16E1, H28E1, H25E2, H44194M2,H1P41819, & -! SKO2D, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) - - CALL FST88(HEATRA,GRNFLX,TOPFLX, & - QH2O,PRESS,P,DELP,DELP2,TEMP,T, & - CLDFAC,NCLDS,KTOP,KBTM,CAMT, & - CO21,CO2NBL,CO2SP1,CO2SP2, & - VAR1,VAR2,VAR3,VAR4,CNTVAL, & - TOTO3,TPHIO3,TOTPHI,TOTVO2, & - EMX1,EMX2,EMPL, & -! - BO3RND,AO3RND, & -! T1,T2,T4 , EM1V,EM1VW, EM3V, & - APCM,BPCM,ATPCM,BTPCM,ACOMB,BCOMB,BETACM, & - TEN,HP1,HAF,ONE,FOUR,HM1EZ, & - RADCON,QUARTR,TWO, & - HM6666M2,HMP66667,HMP5, & - HP166666,H41666M2,RADCON1, & - H16E1, H28E1, H25E2, H44194M2,H1P41819, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - - END SUBROUTINE LWR88 -!--------------------------------------------------------------------- -! SUBROUTINE FST88(HEATRA,GRNFLX,TOPFLX, & -! QH2O,PRESS,P,DELP,DELP2,TEMP,T, & -! CLDFAC,NCLDS,KTOP,KBTM,CAMT, & -! CO21,CO2NBL,CO2SP1,CO2SP2, & -! VAR1,VAR2,VAR3,VAR4,CNTVAL, & -! TOTO3,TPHIO3,TOTPHI,TOTVO2, & -! EMX1,EMX2,EMPL, & -! BO3RND,AO3RND, & -!! T1,T2,T4 , EM1V,EM1VW, EM3V, & -! APCM,BPCM,ATPCM,BTPCM,ACOMB,BCOMB,BETACM, & -! TEN,HP1,HAF,ONE,FOUR,HM1EZ,SKO3R, & -! AB15WD,SKC1R,RADCON,QUARTR,TWO, & -! HM6666M2,HMP66667,HMP5, & -! HP166666,H41666M2,RADCON1, & -! H16E1, H28E1, H25E2, H44194M2,H1P41819, & -! SKO2D, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) - - SUBROUTINE FST88(HEATRA,GRNFLX,TOPFLX, & - QH2O,PRESS,P,DELP,DELP2,TEMP,T, & - CLDFAC,NCLDS,KTOP,KBTM,CAMT, & - CO21,CO2NBL,CO2SP1,CO2SP2, & - VAR1,VAR2,VAR3,VAR4,CNTVAL, & - TOTO3,TPHIO3,TOTPHI,TOTVO2, & - EMX1,EMX2,EMPL, & - BO3RND,AO3RND, & -! T1,T2,T4 , EM1V,EM1VW, EM3V, & - APCM,BPCM,ATPCM,BTPCM,ACOMB,BCOMB,BETACM, & - TEN,HP1,HAF,ONE,FOUR,HM1EZ, & - RADCON,QUARTR,TWO, & - HM6666M2,HMP66667,HMP5, & - HP166666,H41666M2,RADCON1, & - H16E1, H28E1, H25E2, H44194M2,H1P41819, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -!--------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- -! INTEGER, PARAMETER :: NBLY=15 - - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte - -! REAL, INTENT(IN) :: TEN,HP1,HAF,ONE,FOUR,HM1EZ,SKO3R - REAL, INTENT(IN) :: TEN,HP1,HAF,ONE,FOUR,HM1EZ -! REAL, INTENT(IN) :: AB15WD,SKC1R,RADCON,QUARTR,TWO - REAL, INTENT(IN) :: RADCON,QUARTR,TWO - REAL, INTENT(IN) :: HM6666M2,HMP66667,HMP5 - REAL, INTENT(IN) :: HP166666,H41666M2,RADCON1,H16E1, H28E1 -! REAL, INTENT(IN) :: H25E2,H44194M2,H1P41819,SKO2D - REAL, INTENT(IN) :: H25E2,H44194M2,H1P41819 - - REAL,INTENT(IN),DIMENSION(NBLY) :: APCM,BPCM,ATPCM,BTPCM,ACOMB, & - BCOMB,BETACM - -! REAL, INTENT(IN), DIMENSION(5040) :: T1,T2,T4,EM1V,EM1VW -! REAL, INTENT(IN), DIMENSION(5040) :: EM3V - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte*2+1) :: EMPL - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: TOTO3,TPHIO3,TOTPHI,CNTVAL,& - CO2SP1,CO2SP2 - - REAL, INTENT(IN),DIMENSION(its:ite,kts:kte+1,kts:kte+1) :: CLDFAC - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: CAMT,TOTVO2 - INTEGER, INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: KBTM,KTOP - INTEGER, INTENT(IN), DIMENSION(its:ite) :: NCLDS - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte) :: QH2O - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: PRESS,TEMP - REAL, INTENT(OUT), DIMENSION(its:ite,kts:kte) :: HEATRA - REAL, INTENT(OUT), DIMENSION(its:ite) :: GRNFLX,TOPFLX - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: P,T - REAL, INTENT(INOUT), DIMENSION(its:ite,kts:kte+1,kts:kte+1) :: CO21 - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte) :: CO2NBL,DELP2, & - DELP,& - VAR1,VAR2,VAR3,VAR4 - REAL, INTENT(IN), DIMENSION(3) :: BO3RND,AO3RND - REAL, INTENT(IN), DIMENSION(its:ite) :: EMX1,EMX2 - - REAL, DIMENSION(its:ite,kts:kte*2+1) :: TPL,EMD,ALP,C,CSUB,CSUB2 - REAL, DIMENSION(its:ite,kts:kte*2+1) :: C2 - INTEGER, DIMENSION(its:ite,kts:kte+1) :: IXO - REAL, DIMENSION(its:ite,kts:kte+1) :: VTMP3,FXO,DT,FXOE2,DTE2, & - SS1,CSOUR,TC,OSS,CSS,DTC,SS2,& - AVEPHI,E1CTS1,E1FLX, & - E1CTW1,DSORC,EMISS,FAC1,& - TO3SP,OVER1D,CNTTAU,TOTEVV,& - CO2SP,FLX,AVMO3, & - AVPHO3,AVVO2,CONT1D,TO31D,EMISDG,& - DELPR1 - REAL, DIMENSION(its:ite,kts:kte+1) :: EMISSB,DELPR2,CONTDG,TO3DG,HEATEM,& - VSUM1,FLXNET,Z1 - - REAL, DIMENSION(its:ite,kts:kte+1,NBLY) :: SORC - REAL, DIMENSION(its:ite,kts:kte) :: E1CTS2,E1CTW2,TO3SPC,RLOG,EXCTS,& - CTSO3,CTS - REAL, DIMENSION(its:ite) :: GXCTS,FLX1E1 - REAL, DIMENSION(its:ite) :: PTOP,PBOT,FTOP,FBOT,DELPTC - REAL, DIMENSION(its:ite,2) :: FXOSP,DTSP,EMSPEC -! REAL, DIMENSION(28,NBLY) :: SOURCE,DSRCE - INTEGER :: K, I,KP,LLM2,J1,J3,KMAX,KMIN,KCLDS,ICNT,LLM1 - INTEGER :: L,LP1,LP2,LP3,LM1,LM2,LM3,MYIS,MYIE,LLP1,LL,KK,KLEN - - L=kte - LP1=L+1; LP2=L+2; LP3=L+3; LLP1 = 2*L + 1 - LM1=L-1; LM2=L-2; LM3=L-3; LL = 2*L - LLM2 = LL-2; LLM1=LL-1 - MYIS=its; MYIE=ite - -! - DO 101 K=1,LP1 - DO 101 I=MYIS,MYIE -!---TEMP. INDICES FOR E1,SOURCE - VTMP3(I,K)=AINT(TEMP(I,K)*HP1) - FXO(I,K)=VTMP3(I,K)-9. - DT(I,K)=TEMP(I,K)-TEN*VTMP3(I,K) -!---INTEGER INDEX FOR SOURCE (USED IMMEDIATELY) - IXO(I,K)=FXO(I,K) -101 CONTINUE - DO 103 k=1,L - DO 103 I=MYIS,MYIE -!---TEMP. INDICES FOR E2 (KP=1 LAYER NOT USED IN FLUX CALCULATIONS) - VTMP3(I,K)=AINT(T(I,K+1)*HP1) - FXOE2(I,K)=VTMP3(I,K)-9. - DTE2(I,K)=T(I,K+1)-TEN*VTMP3(I,K) -103 CONTINUE -!---SPECIAL CASE TO HANDLE KP=LP1 LAYER AND SPECIAL E2 CALCS. - DO 105 I=MYIS,MYIE - FXOE2(I,LP1)=FXO(I,L) - DTE2(I,LP1)=DT(I,L) - FXOSP(I,1)=FXOE2(I,LM1) - FXOSP(I,2)=FXO(I,LM1) - DTSP(I,1)=DTE2(I,LM1) - DTSP(I,2)=DT(I,LM1) -105 CONTINUE -! -!---SOURCE FUNCTION FOR COMBINED BAND 1 - DO 4114 I=MYIS,MYIE - DO 4114 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),1) - DSORC(I,K)=DSRCE(IXO(I,K),1) -4114 CONTINUE - DO 4112 K=1,LP1 - DO 4112 I=MYIS,MYIE - SORC(I,K,1)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -4112 CONTINUE -!---SOURCE FUNCTION FOR COMBINED BAND 2 - DO 4214 I=MYIS,MYIE - DO 4214 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),2) - DSORC(I,K)=DSRCE(IXO(I,K),2) -4214 CONTINUE - DO 4212 K=1,LP1 - DO 4212 I=MYIS,MYIE - SORC(I,K,2)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -4212 CONTINUE -!---SOURCE FUNCTION FOR COMBINED BAND 3 - DO 4314 I=MYIS,MYIE - DO 4314 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),3) - DSORC(I,K)=DSRCE(IXO(I,K),3) -4314 CONTINUE - DO 4312 K=1,LP1 - DO 4312 I=MYIS,MYIE - SORC(I,K,3)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -4312 CONTINUE -!---SOURCE FUNCTION FOR COMBINED BAND 4 - DO 4414 I=MYIS,MYIE - DO 4414 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),4) - DSORC(I,K)=DSRCE(IXO(I,K),4) -4414 CONTINUE - DO 4412 K=1,LP1 - DO 4412 I=MYIS,MYIE - SORC(I,K,4)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -4412 CONTINUE -!---SOURCE FUNCTION FOR COMBINED BAND 5 - DO 4514 I=MYIS,MYIE - DO 4514 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),5) - DSORC(I,K)=DSRCE(IXO(I,K),5) -4514 CONTINUE - DO 4512 K=1,LP1 - DO 4512 I=MYIS,MYIE - SORC(I,K,5)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -4512 CONTINUE -!---SOURCE FUNCTION FOR COMBINED BAND 6 - DO 4614 I=MYIS,MYIE - DO 4614 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),6) - DSORC(I,K)=DSRCE(IXO(I,K),6) -4614 CONTINUE - DO 4612 K=1,LP1 - DO 4612 I=MYIS,MYIE - SORC(I,K,6)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -4612 CONTINUE -!---SOURCE FUNCTION FOR COMBINED BAND 7 - DO 4714 I=MYIS,MYIE - DO 4714 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),7) - DSORC(I,K)=DSRCE(IXO(I,K),7) -4714 CONTINUE - DO 4712 K=1,LP1 - DO 4712 I=MYIS,MYIE - SORC(I,K,7)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -4712 CONTINUE -!---SOURCE FUNCTION FOR COMBINED BAND 8 - DO 4814 I=MYIS,MYIE - DO 4814 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),8) - DSORC(I,K)=DSRCE(IXO(I,K),8) -4814 CONTINUE - DO 4812 K=1,LP1 - DO 4812 I=MYIS,MYIE - SORC(I,K,8)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -4812 CONTINUE -!---SOURCE FUNCTION FOR BAND 9 (560-670 CM-1) - DO 4914 I=MYIS,MYIE - DO 4914 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),9) - DSORC(I,K)=DSRCE(IXO(I,K),9) -4914 CONTINUE - DO 4912 K=1,LP1 - DO 4912 I=MYIS,MYIE - SORC(I,K,9)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -4912 CONTINUE -!---SOURCE FUNCTION FOR BAND 10 (670-800 CM-1) - DO 5014 I=MYIS,MYIE - DO 5014 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),10) - DSORC(I,K)=DSRCE(IXO(I,K),10) -5014 CONTINUE - DO 5012 K=1,LP1 - DO 5012 I=MYIS,MYIE - SORC(I,K,10)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -5012 CONTINUE -!---SOURCE FUNCTION FOR BAND 11 (800-900 CM-1) - DO 5114 I=MYIS,MYIE - DO 5114 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),11) - DSORC(I,K)=DSRCE(IXO(I,K),11) -5114 CONTINUE - DO 5112 K=1,LP1 - DO 5112 I=MYIS,MYIE - SORC(I,K,11)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -5112 CONTINUE -!---SOURCE FUNCTION FOR BAND 12 (900-990 CM-1) - DO 5214 I=MYIS,MYIE - DO 5214 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),12) - DSORC(I,K)=DSRCE(IXO(I,K),12) -5214 CONTINUE - DO 5212 K=1,LP1 - DO 5212 I=MYIS,MYIE - SORC(I,K,12)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -5212 CONTINUE -!---SOURCE FUNCTION FOR BAND 13 (990-1070 CM-1) - DO 5314 I=MYIS,MYIE - DO 5314 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),13) - DSORC(I,K)=DSRCE(IXO(I,K),13) -5314 CONTINUE - DO 5312 K=1,LP1 - DO 5312 I=MYIS,MYIE - SORC(I,K,13)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -5312 CONTINUE -!---SOURCE FUNCTION FOR BAND 14 (1070-1200 CM-1) - DO 5414 I=MYIS,MYIE - DO 5414 K=1,LP1 - VTMP3(I,K)=SOURCE(IXO(I,K),14) - DSORC(I,K)=DSRCE(IXO(I,K),14) -5414 CONTINUE - DO 5412 K=1,LP1 - DO 5412 I=MYIS,MYIE - SORC(I,K,14)=VTMP3(I,K)+DT(I,K)*DSORC(I,K) -5412 CONTINUE -! -! THE FOLLOWING SUBROUTINE OBTAINS NLTE SOURCE FUNCTION FOR CO2 -! -! -! CALL NLTE -! -! -!---OBTAIN SPECIAL SOURCE FUNCTIONS FOR THE 15 UM BAND (CSOUR) -! AND THE WINDOW REGION (SS1) - DO 131 K=1,LP1 - DO 131 I=MYIS,MYIE - SS1(I,K)=SORC(I,K,11)+SORC(I,K,12)+SORC(I,K,14) -131 CONTINUE - DO 143 K=1,LP1 - DO 143 I=MYIS,MYIE - CSOUR(I,K)=SORC(I,K,9)+SORC(I,K,10) -143 CONTINUE -! -!---COMPUTE TEMP**4 (TC) AND VERTICAL TEMPERATURE DIFFERENCES -! (OSS,CSS,SS2,DTC). ALL THESE WILL BE USED LATER IN FLUX COMPUTA- -! TIONS. -! - DO 901 K=1,LP1 - DO 901 I=MYIS,MYIE - TC(I,K)=(TEMP(I,K)*TEMP(I,K))**2 -901 CONTINUE - DO 903 K=1,L - DO 903 I=MYIS,MYIE - OSS(I,K+1)=SORC(I,K+1,13)-SORC(I,K,13) - CSS(I,K+1)=CSOUR(I,K+1)-CSOUR(I,K) - DTC(I,K+1)=TC(I,K+1)-TC(I,K) - SS2(I,K+1)=SS1(I,K+1)-SS1(I,K) -903 CONTINUE -! -! -!---THE FOLLOWIMG IS A DRASTIC REWRITE OF THE RADIATION CODE TO -! (LARGELY) ELIMINATE THREE-DIMENSIONAL ARRAYS. THE CODE WORKS -! ON THE FOLLOWING PRINCIPLES: -! -! LET K = FIXED FLUX LEVEL, KP = VARYING FLUX LEVEL -! THEN FLUX(K)=SUM OVER KP : (DELTAB(KP)*TAU(KP,K)) -! OVER ALL KP'S, FROM 1 TO LP1. -! -! WE CAN BREAK DOWN THE CALCULATIONS FOR ALL K'S AS FOLLOWS: -! -! FOR ALL K'S K=1 TO LP1: -! FLUX(K)=SUM OVER KP : (DELTAB(KP)*TAU(KP,K)) (1) -! OVER ALL KP'S, FROM K+1 TO LP1 -! AND -! FOR KP FROM K+1 TO LP1: -! FLUX(KP) = DELTAB(K)*TAU(K,KP) (2) -! -! NOW IF TAU(K,KP)=TAU(KP,K) (SYMMETRICAL ARRAYS) -! WE CAN COMPUTE A 1-DIMENSIONAL ARRAY TAU1D(KP) FROM -! K+1 TO LP1, EACH TIME K IS INCREMENTED. -! EQUATIONS (1) AND (2) THEN BECOME: -! -! TAU1D(KP) = (VALUES FOR TAU(KP,K) AT THE PARTICULAR K) -! FLUX(K) = SUM OVER KP : (DELTAB(KP)*TAU1D(KP)) (3) -! FLUX(KP) = DELTAB(K)*TAU1D(KP) (4) -! -! THE TERMS FOR TAU (K,K) AND OTHER SPECIAL TERMS (FOR -! NEARBY LAYERS) MUST, OF COURSE, BE HANDLED SEPARATELY, AND -! WITH CARE. -! -! COMPUTE "UPPER TRIANGLE" TRANSMISSION FUNCTIONS FOR -! THE 9.6 UM BAND (TO3SP) AND THE 15 UM BAND (OVER1D). ALSO, -! THE -! STAGE 1...COMPUTE O3 ,OVER TRANSMISSION FCTNS AND AVEPHI -!---DO K=1 CALCULATION (FROM FLUX LAYER KK TO THE TOP) SEPARATELY -! AS VECTORIZATION IS IMPROVED,AND OZONE CTS TRANSMISSIVITY -! MAY BE EXTRACTED HERE. - DO 3021 K=1,L - DO 3021 I=MYIS,MYIE - AVEPHI(I,K)=TOTPHI(I,K+1) -3021 CONTINUE -!---IN ORDER TO PROPERLY EVALUATE EMISS INTEGRATED OVER THE (LP1) -! LAYER, A SPECIAL EVALUATION OF EMISS IS DONE. THIS REQUIRES -! A SPECIAL COMPUTATION OF AVEPHI, AND IT IS STORED IN THE -! (OTHERWISE VACANT) LP1'TH POSITION -! - DO 803 I=MYIS,MYIE - AVEPHI(I,LP1)=AVEPHI(I,LM1)+EMX1(I) -803 CONTINUE -! COMPUTE FLUXES FOR K=1 - CALL E1E290(E1CTS1,E1CTS2,E1FLX,E1CTW1,E1CTW2,EMISS, & - FXO,DT,FXOE2,DTE2,AVEPHI,TEMP,T, & -! T1,T2,T4 ,EM1V,EM1VW, & - H16E1,TEN,HP1,H28E1,HAF, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - - DO 302 K=1,L - DO 302 I=MYIS,MYIE - FAC1(I,K)=BO3RND(2)*TPHIO3(I,K+1)/TOTO3(I,K+1) - TO3SPC(I,K)=HAF*(FAC1(I,K)* & - (SQRT(ONE+(FOUR*AO3RND(2)*TOTO3(I,K+1))/FAC1(I,K))-ONE)) -! FOR K=1, TO3SP IS USED INSTEAD OF TO31D (THEY ARE EQUAL IN THIS -! CASE); TO3SP IS PASSED TO SPA90, WHILE TO31D IS A WORK-ARRAY. - TO3SP(I,K)=EXP(HM1EZ*(TO3SPC(I,K)+SKO3R*TOTVO2(I,K+1))) - OVER1D(I,K)=EXP(HM1EZ*(SQRT(AB15WD*TOTPHI(I,K+1))+ & - SKC1R*TOTVO2(I,K+1))) -!---BECAUSE ALL CONTINUUM TRANSMISSIVITIES ARE OBTAINED FROM THE -! 2-D QUANTITY CNTTAU (AND ITS RECIPROCAL TOTEVV) WE STORE BOTH -! OF THESE HERE. FOR K=1, CONT1D EQUALS CNTTAU - CNTTAU(I,K)=EXP(HM1EZ*TOTVO2(I,K+1)) - TOTEVV(I,K)=1./CNTTAU(I,K) -302 CONTINUE - DO 3022 K=1,L - DO 3022 I=MYIS,MYIE - CO2SP(I,K+1)=OVER1D(I,K)*CO21(I,1,K+1) -3022 CONTINUE - DO 3023 K=1,L - DO 3023 I=MYIS,MYIE - CO21(I,K+1,1)=CO21(I,K+1,1)*OVER1D(I,K) -3023 CONTINUE -!---RLOG IS THE NBL AMOUNT FOR THE 15 UM BAND CALCULATION - DO 1808 I=MYIS,MYIE - RLOG(I,1)=OVER1D(I,1)*CO2NBL(I,1) -1808 CONTINUE -!---THE TERMS WHEN KP=1 FOR ALL K ARE THE PHOTON EXCHANGE WITH -! THE TOP OF THE ATMOSPHERE, AND ARE OBTAINED DIFFERENTLY THAN -! THE OTHER CALCULATIONS - DO 305 K=2,LP1 - DO 305 I=MYIS,MYIE - FLX(I,K)= (TC(I,1)*E1FLX(I,K) & - +SS1(I,1)*CNTTAU(I,K-1) & - +SORC(I,1,13)*TO3SP(I,K-1) & - +CSOUR(I,1)*CO2SP(I,K)) & - *CLDFAC(I,1,K) -305 CONTINUE - DO 307 I=MYIS,MYIE - FLX(I,1)= TC(I,1)*E1FLX(I,1)+SS1(I,1)+SORC(I,1,13) & - +CSOUR(I,1) -307 CONTINUE -!---THE KP TERMS FOR K=1... - DO 303 KP=2,LP1 - DO 303 I=MYIS,MYIE - FLX(I,1)=FLX(I,1)+(OSS(I,KP)*TO3SP(I,KP-1) & - +SS2(I,KP)*CNTTAU(I,KP-1) & - +CSS(I,KP)*CO21(I,KP,1) & - +DTC(I,KP)*EMISS(I,KP-1))*CLDFAC(I,KP,1) -303 CONTINUE -! SUBROUTINE SPA88 IS CALLED TO OBTAIN EXACT CTS FOR WATER -! CO2 AND O3, AND APPROXIMATE CTS CO2 AND O3 CALCULATIONS. -! - CALL SPA88(EXCTS,CTSO3,GXCTS,SORC,CSOUR, & - CLDFAC,TEMP,PRESS,VAR1,VAR2, & - P,DELP,DELP2,TOTVO2,TO3SP,TO3SPC, & - CO2SP1,CO2SP2,CO2SP, & - APCM,BPCM,ATPCM,BTPCM,ACOMB,BCOMB,BETACM, & - H25E2,ONE,H44194M2,H1P41819,HAF,HM1EZ,TWO, & -! SKO2D,RADCON, & - RADCON, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - -! -! THIS SECTION COMPUTES THE EMISSIVITY CTS HEATING RATES FOR 2 -! EMISSIVITY BANDS: THE 0-160,1200-2200 CM-1 BAND AND THE 800- -! 990,1070-1200 CM-1 BAND. THE REMAINING CTS COMTRIBUTIONS ARE -! CONTAINED IN CTSO3, COMPUTED IN SPA88. -! - DO 998 I=MYIS,MYIE - VTMP3(I,1)=1. -998 CONTINUE - DO 999 K=1,L - DO 999 I=MYIS,MYIE - VTMP3(I,K+1)=CNTTAU(I,K)*CLDFAC(I,K+1,1) -999 CONTINUE - DO 1001 K=1,L - DO 1001 I=MYIS,MYIE - CTS(I,K)=RADCON*DELP(I,K)*(TC(I,K)* & - (E1CTW2(I,K)*CLDFAC(I,K+1,1)-E1CTW1(I,K)*CLDFAC(I,K,1)) + & - SS1(I,K)*(VTMP3(I,K+1)-VTMP3(I,K))) -1001 CONTINUE -! - DO 1011 K=1,L - DO 1011 I=MYIS,MYIE - VTMP3(I,K)=TC(I,K)*(CLDFAC(I,K,1)*(E1CTS1(I,K)-E1CTW1(I,K)) - & - CLDFAC(I,K+1,1)*(E1CTS2(I,K)-E1CTW2(I,K))) -1011 CONTINUE - DO 1012 I=MYIS,MYIE - FLX1E1(I)=TC(I,LP1)*CLDFAC(I,LP1,1)* & - (E1CTS1(I,LP1)-E1CTW1(I,LP1)) -1012 CONTINUE - DO 1014 K=1,L - DO 1013 I=MYIS,MYIE - FLX1E1(I)=FLX1E1(I)+VTMP3(I,K) -1013 CONTINUE -1014 CONTINUE -! -!---NOW REPEAT FLUX CALCULATIONS FOR THE K=2..LM1 CASES. -! CALCULATIONS FOR FLUX LEVEL L AND LP1 ARE DONE SEPARATELY, AS ALL -! EMISSIVITY AND CO2 CALCULATIONS ARE SPECIAL CASES OR NEARBY LAYERS. -! - DO 321 K=2,LM1 - KLEN=K -! - DO 3218 KK=1,LP1-K - DO 3218 I=MYIS,MYIE - AVEPHI(I,KK+K-1)=TOTPHI(I,KK+K)-TOTPHI(I,K) -3218 CONTINUE - DO 1803 I=MYIS,MYIE - AVEPHI(I,LP1)=AVEPHI(I,LM1)+EMX1(I) -1803 CONTINUE -!---COMPUTE EMISSIVITY FLUXES (E2) FOR THIS CASE. NOTE THAT -! WE HAVE OMITTED THE NEARBY LATER CASE (EMISS(I,K,K)) AS WELL -! AS ALL CASES WITH K=L OR LP1. BUT THESE CASES HAVE ALWAYS -! BEEN HANDLED AS SPECIAL CASES, SO WE MAY AS WELL COMPUTE -! THEIR FLUXES SEPARASTELY. -! - CALL E290(EMISSB,EMISS,AVEPHI,KLEN,FXOE2,DTE2, & -! T1,T2,T4, & - H16E1,HP1,H28E1,HAF,TEN, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - - DO 322 KK=1,LP1-K - DO 322 I=MYIS,MYIE - AVMO3(I,KK+K-1)=TOTO3(I,KK+K)-TOTO3(I,K) - AVPHO3(I,KK+K-1)=TPHIO3(I,KK+K)-TPHIO3(I,K) - AVVO2(I,KK+K-1)=TOTVO2(I,KK+K)-TOTVO2(I,K) - CONT1D(I,KK+K-1)=CNTTAU(I,KK+K-1)*TOTEVV(I,K-1) -322 CONTINUE -! - DO 3221 KK=1,LP1-K - DO 3221 I=MYIS,MYIE - FAC1(I,K+KK-1)=BO3RND(2)*AVPHO3(I,K+KK-1)/AVMO3(I,K+KK-1) - VTMP3(I,K+KK-1)=HAF*(FAC1(I,K+KK-1)* & - (SQRT(ONE+(FOUR*AO3RND(2)*AVMO3(I,K+KK-1))/ & - FAC1(I,K+KK-1))-ONE)) - TO31D(I,K+KK-1)=EXP(HM1EZ*(VTMP3(I,K+KK-1) & - +SKO3R*AVVO2(I,K+KK-1))) - OVER1D(I,K+KK-1)=EXP(HM1EZ*(SQRT(AB15WD*AVEPHI(I,K+KK-1))+ & - SKC1R*AVVO2(I,K+KK-1))) - CO21(I,K+KK,K)=OVER1D(I,K+KK-1)*CO21(I,K+KK,K) -3221 CONTINUE - DO 3223 KP=K+1,LP1 - DO 3223 I=MYIS,MYIE - CO21(I,K,KP)=OVER1D(I,KP-1)*CO21(I,K,KP) -3223 CONTINUE -!---RLOG IS THE NBL AMOUNT FOR THE 15 UM BAND CALCULATION - DO 1804 I=MYIS,MYIE - RLOG(I,K)=OVER1D(I,K)*CO2NBL(I,K) -1804 CONTINUE -!---THE KP TERMS FOR ARBIRRARY K.. - DO 3423 KP=K+1,LP1 - DO 3423 I=MYIS,MYIE - FLX(I,K)=FLX(I,K)+(OSS(I,KP)*TO31D(I,KP-1) & - +SS2(I,KP)*CONT1D(I,KP-1) & - +CSS(I,KP)*CO21(I,KP,K) & - +DTC(I,KP)*EMISS(I,KP-1))*CLDFAC(I,KP,K) -3423 CONTINUE - DO 3425 KP=K+1,LP1 - DO 3425 I=MYIS,MYIE - FLX(I,KP)=FLX(I,KP)+(OSS(I,K)*TO31D(I,KP-1) & - +SS2(I,K)*CONT1D(I,KP-1) & - +CSS(I,K)*CO21(I,K,KP) & - +DTC(I,K)*EMISSB(I,KP-1))*CLDFAC(I,K,KP) -3425 CONTINUE -321 CONTINUE -! - DO 821 I=MYIS,MYIE - TPL(I,1)=TEMP(I,L) - TPL(I,LP1)=HAF*(T(I,LP1)+TEMP(I,L)) - TPL(I,LLP1)=HAF*(T(I,L)+TEMP(I,L)) -821 CONTINUE - DO 823 K=2,L - DO 823 I=MYIS,MYIE - TPL(I,K)=T(I,K) - TPL(I,K+L)=T(I,K) -823 CONTINUE -! -!---E2 FUNCTIONS ARE REQUIRED IN THE NBL CALCULATIONS FOR 2 CASES, -! DENOTED (IN OLD CODE) AS (L,LP1) AND (LP1,LP1) - DO 833 I=MYIS,MYIE - AVEPHI(I,1)=VAR2(I,L) - AVEPHI(I,2)=VAR2(I,L)+EMPL(I,L) -833 CONTINUE - CALL E2SPEC(EMISS,AVEPHI,FXOSP,DTSP, & -! T1,T2,T4, & - H16E1,TEN,H28E1,HP1, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - -! -! CALL E3V88 FOR NBL H2O TRANSMISSIVITIES -! CALL E3V88(EMD,TPL,EMPL,EM3V, & - CALL E3V88(EMD,TPL,EMPL, & - TEN,HP1,H28E1,H16E1, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -! -! COMPUTE NEARBY LAYER AND SPECIAL-CASE TRANSMISSIVITIES FOR EMISS -! USING METHODS FOR H2O GIVEN IN REF. (4) - DO 851 K=2,L - DO 851 I=MYIS,MYIE - EMISDG(I,K)=EMD(I,K+L)+EMD(I,K) -851 CONTINUE -! -! NOTE THAT EMX1/2 (PRESSURE SCALED PATHS) ARE NOW COMPUTED IN -! LWR88 - DO 861 I=MYIS,MYIE - EMSPEC(I,1)=(EMD(I,1)*EMPL(I,1)-EMD(I,LP1)*EMPL(I,LP1))/ & - EMX1(I) + QUARTR*(EMISS(I,1)+EMISS(I,2)) - EMISDG(I,LP1)=TWO*EMD(I,LP1) - EMSPEC(I,2)=TWO*(EMD(I,1)*EMPL(I,1)-EMD(I,LLP1)*EMPL(I,LLP1))/ & - EMX2(I) -861 CONTINUE - DO 331 I=MYIS,MYIE - FAC1(I,L)=BO3RND(2)*VAR4(I,L)/VAR3(I,L) - VTMP3(I,L)=HAF*(FAC1(I,L)* & - (SQRT(ONE+(FOUR*AO3RND(2)*VAR3(I,L))/FAC1(I,L))-ONE)) - TO31D(I,L)=EXP(HM1EZ*(VTMP3(I,L)+SKO3R*CNTVAL(I,L))) - OVER1D(I,L)=EXP(HM1EZ*(SQRT(AB15WD*VAR2(I,L))+ & - SKC1R*CNTVAL(I,L))) - CONT1D(I,L)=CNTTAU(I,L)*TOTEVV(I,LM1) - RLOG(I,L)=OVER1D(I,L)*CO2NBL(I,L) -331 CONTINUE - DO 618 K=1,L - DO 618 I=MYIS,MYIE - RLOG(I,K)=LOG(RLOG(I,K)) -618 CONTINUE - DO 601 K=1,LM1 - DO 601 I=MYIS,MYIE - DELPR1(I,K+1)=DELP(I,K+1)*(PRESS(I,K+1)-P(I,K+1)) - ALP(I,LP1+K-1)=-SQRT(DELPR1(I,K+1))*RLOG(I,K+1) -601 CONTINUE - DO 603 K=1,L - DO 603 I=MYIS,MYIE - DELPR2(I,K+1)=DELP(I,K)*(P(I,K+1)-PRESS(I,K)) - ALP(I,K)=-SQRT(DELPR2(I,K+1))*RLOG(I,K) -603 CONTINUE - DO 625 I=MYIS,MYIE - ALP(I,LL)=-RLOG(I,L) - ALP(I,LLP1)=-RLOG(I,L)*SQRT(DELP(I,L)*(P(I,LP1)-PRESS(I,LM1))) -625 CONTINUE -! THE FIRST COMPUTATION IS FOR THE 15 UM BAND,WITH THE -! FOR THE COMBINED H2O AND CO2 TRANSMISSION FUNCTION. -! -! PERFORM NBL COMPUTATIONS FOR THE 15 UM BAND -!***THE STATEMENT FUNCTION SF IN PREV. VERSIONS IS NOW EXPLICITLY -! EVALUATED. - DO 631 K=1,LLP1 - DO 631 I=MYIS,MYIE - C(I,K)=ALP(I,K)*(HMP66667+ALP(I,K)*(QUARTR+ALP(I,K)*HM6666M2)) -631 CONTINUE - DO 641 I=MYIS,MYIE - CO21(I,LP1,LP1)=ONE+C(I,L) - CO21(I,LP1,L)=ONE+(DELP2(I,L)*C(I,LL)-(PRESS(I,L)-P(I,L))* & - C(I,LLM1))/(P(I,LP1)-PRESS(I,L)) - CO21(I,L,LP1)=ONE+((P(I,LP1)-PRESS(I,LM1))*C(I,LLP1)- & - (P(I,LP1)-PRESS(I,L))*C(I,L))/(PRESS(I,L)-PRESS(I,LM1)) -641 CONTINUE - DO 643 K=2,L - DO 643 I=MYIS,MYIE - CO21(I,K,K)=ONE+HAF*(C(I,LM1+K)+C(I,K-1)) -643 CONTINUE -! -! COMPUTE NEARBY-LAYER TRANSMISSIVITIES FOR THE O3 BAND AND FOR THE -! ONE-BAND CONTINUUM BAND (TO3 AND EMISS2). THE SF2 FUNCTION IS -! USED. THE METHOD IS THE SAME AS DESCRIBED FOR CO2 IN REF (4). - DO 651 K=1,LM1 - DO 651 I=MYIS,MYIE - CSUB(I,K+1)=CNTVAL(I,K+1)*DELPR1(I,K+1) - CSUB(I,LP1+K-1)=CNTVAL(I,K)*DELPR2(I,K+1) -651 CONTINUE -!---THE SF2 FUNCTION IN PREV. VERSIONS IS NOW EXPLICITLY EVALUATED - DO 655 K=1,LLM2 - DO 655 I=MYIS,MYIE - CSUB2(I,K+1)=SKO3R*CSUB(I,K+1) - C(I,K+1)=CSUB(I,K+1)*(HMP5+CSUB(I,K+1)* & - (HP166666-CSUB(I,K+1)*H41666M2)) - C2(I,K+1)=CSUB2(I,K+1)*(HMP5+CSUB2(I,K+1)* & - (HP166666-CSUB2(I,K+1)*H41666M2)) -655 CONTINUE - DO 661 I=MYIS,MYIE - CONTDG(I,LP1)=1.+C(I,LLM1) - TO3DG(I,LP1)=1.+C2(I,LLM1) -661 CONTINUE - DO 663 K=2,L - DO 663 I=MYIS,MYIE - CONTDG(I,K)=ONE+HAF*(C(I,K)+C(I,LM1+K)) - TO3DG(I,K)=ONE+HAF*(C2(I,K)+C2(I,LM1+K)) -663 CONTINUE -!---NOW OBTAIN FLUXES -! -! FOR THE DIAGONAL TERMS... - DO 871 K=2,LP1 - DO 871 I=MYIS,MYIE - FLX(I,K)=FLX(I,K)+(DTC(I,K)*EMISDG(I,K) & - +SS2(I,K)*CONTDG(I,K) & - +OSS(I,K)*TO3DG(I,K) & - +CSS(I,K)*CO21(I,K,K))*CLDFAC(I,K,K) -871 CONTINUE -! FOR THE TWO OFF-DIAGONAL TERMS... - DO 873 I=MYIS,MYIE - FLX(I,L)=FLX(I,L)+(CSS(I,LP1)*CO21(I,LP1,L) & - +DTC(I,LP1)*EMSPEC(I,2) & - +OSS(I,LP1)*TO31D(I,L) & - +SS2(I,LP1)*CONT1D(I,L))*CLDFAC(I,LP1,L) - FLX(I,LP1)=FLX(I,LP1)+(CSS(I,L)*CO21(I,L,LP1) & - +OSS(I,L)*TO31D(I,L) & - +SS2(I,L)*CONT1D(I,L) & - +DTC(I,L)*EMSPEC(I,1))*CLDFAC(I,L,LP1) -873 CONTINUE -! -! FINAL SECTION OBTAINS EMISSIVITY HEATING RATES, -! TOTAL HEATING RATES AND THE FLUX AT THE GROUND -! -! .....CALCULATE THE EMISSIVITY HEATING RATES - DO 1101 K=1,L - DO 1101 I=MYIS,MYIE - HEATEM(I,K)=RADCON*(FLX(I,K+1)-FLX(I,K))*DELP(I,K) -1101 CONTINUE -! .....CALCULATE THE TOTAL HEATING RATES - DO 1103 K=1,L - DO 1103 I=MYIS,MYIE - HEATRA(I,K)=HEATEM(I,K)-CTS(I,K)-CTSO3(I,K)+EXCTS(I,K) -1103 CONTINUE -! .....CALCULATE THE FLUX AT EACH FLUX LEVEL USING THE FLUX AT THE -! TOP (FLX1E1+GXCTS) AND THE INTEGRAL OF THE HEATING RATES (VSUM1) - DO 1111 K=1,L - DO 1111 I=MYIS,MYIE - VSUM1(I,K)=HEATRA(I,K)*DELP2(I,K)*RADCON1 -1111 CONTINUE - DO 1115 I=MYIS,MYIE - TOPFLX(I)=FLX1E1(I)+GXCTS(I) - FLXNET(I,1)=TOPFLX(I) -1115 CONTINUE -!---ONLY THE SURFACE VALUE OF FLUX (GRNFLX) IS NEEDED UNLESS -! THE THICK CLOUD SECTION IS INVOKED. - DO 1123 K=2,LP1 - DO 1123 I=MYIS,MYIE - FLXNET(I,K)=FLXNET(I,K-1)+VSUM1(I,K-1) -1123 CONTINUE - DO 1125 I=MYIS,MYIE - GRNFLX(I)=FLXNET(I,LP1) -1125 CONTINUE -! -! THIS IS THE THICK CLOUD SECTION.OPTIONALLY,IF THICK CLOUD -! FLUXES ARE TO BE "CONVECTIVELY ADJUSTED",IE,DF/DP IS CONSTANT, -! FOR CLOUDY PART OF GRID POINT, THE FOLLOWING CODE IS EXECUTED. -!***FIRST,COUNT THE NUMBER OF CLOUDS ALONG THE LAT. ROW. SKIP THE -! ENTIRE THICK CLOUD COMPUTATION OF THERE ARE NO CLOUDS. - ICNT=0 - DO 1301 I=MYIS,MYIE - ICNT=ICNT+NCLDS(I) -1301 CONTINUE - IF (ICNT.EQ.0) GO TO 6999 -!---FIND THE MAXIMUM NUMBER OF CLOUDS IN THE LATITUDE ROW - KCLDS=NCLDS(MYIS) - DO 2106 I=MYIS,MYIE - KCLDS=MAX(NCLDS(I),KCLDS) -2106 CONTINUE -! -! -!***OBTAIN THE PRESSURES AND FLUXES OF THE TOP AND BOTTOM OF -! THE NC'TH CLOUD (IT IS ASSUMED THAT ALL KTOP AND KBTM'S HAVE -! BEEN DEFINED!). - DO 1361 KK=1,KCLDS - KMIN=LP1 - KMAX=0 - DO 1362 I=MYIS,MYIE - J1=KTOP(I,KK+1) -! IF (J1.EQ.1) GO TO 1362 - J3=KBTM(I,KK+1) - IF (J3.GT.J1) THEN - PTOP(I)=P(I,J1) - PBOT(I)=P(I,J3+1) - FTOP(I)=FLXNET(I,J1) - FBOT(I)=FLXNET(I,J3+1) -!***OBTAIN THE "FLUX DERIVATIVE" DF/DP (DELPTC) - DELPTC(I)=(FTOP(I)-FBOT(I))/(PTOP(I)-PBOT(I)) - KMIN=MIN(KMIN,J1) - KMAX=MAX(KMAX,J3) - ENDIF -1362 CONTINUE - KMIN=KMIN+1 -!***CALCULATE THE TOT. FLUX CHG. FROM THE TOP OF THE CLOUD, FOR -! ALL LEVELS. - DO 1365 K=KMIN,KMAX - DO 1363 I=MYIS,MYIE -! IF (KTOP(I,KK+1).EQ.1) GO TO 1363 - IF(KTOP(I,KK+1).LT.K .AND. K.LE.KBTM(I,KK+1)) THEN - Z1(I,K)=(P(I,K)-PTOP(I))*DELPTC(I)+FTOP(I) -!ORIGINAL FLXNET(I,K)=FLXNET(I,K)*(ONE-CAMT(I,KK+1)) + -!ORIGINAL1 Z1(I,K)*CAMT(I,KK+1) - FLXNET(I,K)=Z1(I,K) - ENDIF -1363 CONTINUE -1365 CONTINUE -1361 CONTINUE -!***USING THIS FLUX CHG. IN THE CLOUDY PART OF THE GRID BOX, OBTAIN -! THE NEW FLUXES, WEIGHTING THE CLEAR AND CLOUDY FLUXES:AGAIN, ONLY -! THE FLUXES IN THICK-CLOUD LEVELS WILL EVENTUALLY BE USED. -! DO 6051 K=1,LP1 -! DO 6051 I=MYIS,MYIE -! FLXNET(I,K)=FLXNET(I,K)*(ONE-CAMT(I,NC)) + -! 1 Z1(I,K)*CAMT(I,NC) -!051 CONTINUE -!***MERGE FLXTHK INTO FLXNET FOR APPROPRIATE LEVELS. -! DO 1401 K=1,LP1 -! DO 1401 I=MYIS,MYIE -! IF (K.GT.ITOP(I) .AND. K.LE.IBOT(I) -! 1 .AND. (NC-1).LE.NCLDS(I)) THEN -! FLXNET(I,K)=FLXTHK(I,K) -! ENDIF -!401 CONTINUE -! -!******END OF CLOUD LOOP***** -6001 CONTINUE -6999 CONTINUE -!***THE FINAL STEP IS TO RECOMPUTE THE HEATING RATES BASED ON THE -! REVISED FLUXES: - DO 6101 K=1,L - DO 6101 I=MYIS,MYIE - HEATRA(I,K)=RADCON*(FLXNET(I,K+1)-FLXNET(I,K))*DELP(I,K) -6101 CONTINUE -! THE THICK CLOUD SECTION ENDS HERE. - - END SUBROUTINE FST88 - -!---------------------------------------------------------------------- - - SUBROUTINE E1E290(G1,G2,G3,G4,G5,EMISS,FXOE1,DTE1,FXOE2,DTE2, & - AVEPHI,TEMP,T, & -! T1,T2,T4,EM1V,EM1VW, & - H16E1,TEN,HP1,H28E1,HAF, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -!--------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte - REAL,INTENT(IN) :: H16E1,TEN,HP1,H28E1,HAF - - REAL,INTENT(OUT),DIMENSION(its:ite,kts:kte+1) :: G1,G4,G3,EMISS - REAL,INTENT(IN),DIMENSION(its:ite,kts:kte+1) :: FXOE1,DTE1,FXOE2,DTE2 - REAL,INTENT(IN),DIMENSION(its:ite,kts:kte+1) :: AVEPHI,TEMP,T - REAL,INTENT(OUT),DIMENSION(its:ite,kts:kte) :: G2,G5 -! REAL,INTENT(IN),DIMENSION(5040):: T1,T2,T4 ,EM1V,EM1VW - - REAL,DIMENSION(its:ite,kts:kte+1) :: TMP3,DU,FYO,WW1,WW2 - INTEGER,DIMENSION(its:ite,kts:kte*3+2) :: IT1 - INTEGER,DIMENSION(its:ite,kts:kte+1) :: IVAL - -! REAL,DIMENSION(28,180):: EM1,EM1WDE,TABLE1,TABLE2, & -! TABLE3 -! EQUIVALENCE (EM1V(1),EM1(1,1)),(EM1VW(1),EM1WDE(1,1)) -! EQUIVALENCE (T1(1),TABLE1(1,1)),(T2(1),TABLE2(1,1)), & -! (T4(1),TABLE3(1,1)) - - INTEGER :: K, I,KP,LLM2,J1,J3,KMAX,KMIN,KCLDS,ICNT,LLM1 - INTEGER :: L,LP1,LP2,LP3,LM1,LM2,LM3,MYIS,MYIE,LLP1,LL,KK,KLEN - - L=kte - LP1=L+1; LP2=L+2; LP3=L+3; LLP1 = 2*L + 1 - LM1=L-1; LM2=L-2; LM3=L-3; LL = 2*L - LLM2 = LL-2; LLM1=LL-1 - MYIS=its; MYIE=ite - -!---FIRST WE OBTAIN THE EMISSIVITIES AS A FUNCTION OF TEMPERATURE -! (INDEX FXO) AND WATER AMOUNT (INDEX FYO). THIS PART OF THE CODE -! THUS GENERATES THE E2 FUNCTION. THE FXO INDICES HAVE BEEN -! OBTAINED IN FST88, FOR CONVENIENCE. -! -!---THIS SUBROUTINE EVALUATES THE K=1 CASE ONLY-- -! -!---THIS LOOP REPLACES LOOPS GOING FROMI=1,IMAX AND KP=2,LP1 PLUS -! THE SPECIAL CASE FOR THE LP1TH LAYER. - - DO 1322 K=1,LP1 - DO 1322 I=MYIS,MYIE - TMP3(I,K)=LOG10(AVEPHI(I,K))+H16E1 - FYO(I,K)=AINT(TMP3(I,K)*TEN) - DU(I,K)=TMP3(I,K)-HP1*FYO(I,K) - FYO(I,K)=H28E1*FYO(I,K) - IVAL(I,K)=FYO(I,K)+FXOE2(I,K) - EMISS(I,K)=T1(IVAL(I,K))+DU(I,K)*T2(IVAL(I,K)) & - +DTE2(I,K)*T4(IVAL(I,K)) -1322 CONTINUE -! -!---THE SPECIAL CASE EMISS(I,L) (LAYER KP) IS OBTAINED NOW -! BY AVERAGING THE VALUES FOR L AND LP1: - DO 1344 I=MYIS,MYIE - EMISS(I,L)=HAF*(EMISS(I,L)+EMISS(I,LP1)) -1344 CONTINUE -! -! CALCULATIONS FOR THE KP=1 LAYER ARE NOT PERFORMED, AS -! THE RADIATION CODE ASSUMES THAT THE TOP FLUX LAYER (ABOVE THE -! TOP DATA LEVEL) IS ISOTHERMAL, AND HENCE CONTRIBUTES NOTHING -! TO THE FLUXES AT OTHER LEVELS. -! -!***THE FOLLOWING IS THE CALCULATION FOR THE E1 FUNCTION, FORMERLY -! DONE IN SUBROUTINE E1V88. THE MOVE TO E1E288 IS DUE TO THE -! SAVINGS IN OBTAINING INDEX VALUES (THE TEMP. INDICES HAVE -! BEEN OBTAINED IN FST88, WHILE THE U-INDICES ARE OBTAINED -! IN THE E2 CALCS.,WITH K=1). -! -! -! FOR TERMS INVOLVING TOP LAYER, DU IS NOT KNOWN; IN FACT, WE -! USE INDEX 2 TO REPERSENT INDEX 1 IN PREV. CODE. THIS MEANS THAT -! THE IT1 INDEX 1 AND LLP1 HAS TO BE CALCULATED SEPARATELY. THE -! INDEX LLP2 GIVES THE SAME VALUE AS 1; IT CAN BE OMITTED. - DO 208 I=MYIS,MYIE - IT1(I,1)=FXOE1(I,1) - WW1(I,1)=TEN-DTE1(I,1) - WW2(I,1)=HP1 -208 CONTINUE - DO 209 K=1,L - DO 209 I=MYIS,MYIE - IT1(I,K+1)=FYO(I,K)+FXOE1(I,K+1) - IT1(I,LP2+K-1)=FYO(I,K)+FXOE1(I,K) - WW1(I,K+1)=TEN-DTE1(I,K+1) - WW2(I,K+1)=HP1-DU(I,K) -209 CONTINUE - DO 211 KP=1,L - DO 211 I=MYIS,MYIE - IT1(I,KP+LLP1)=FYO(I,KP)+FXOE1(I,1) -211 CONTINUE -! -! -! G3(I,1) HAS THE SAME VALUES AS G1 (AND DID ALL ALONG) - DO 230 I=MYIS,MYIE - G1(I,1)=WW1(I,1)*WW2(I,1)*EM1V(IT1(I,1))+ & - WW2(I,1)*DTE1(I,1)*EM1V(IT1(I,1)+1) - G3(I,1)=G1(I,1) -230 CONTINUE - DO 240 K=1,L - DO 240 I=MYIS,MYIE - G1(I,K+1)=WW1(I,K+1)*WW2(I,K+1)*EM1V(IT1(I,K+1))+ & - WW2(I,K+1)*DTE1(I,K+1)*EM1V(IT1(I,K+1)+1)+ & - WW1(I,K+1)*DU(I,K)*EM1V(IT1(I,K+1)+28)+ & - DTE1(I,K+1)*DU(I,K)*EM1V(IT1(I,K+1)+29) - G2(I,K)=WW1(I,K)*WW2(I,K+1)*EM1V(IT1(I,K+LP2-1))+ & - WW2(I,K+1)*DTE1(I,K)*EM1V(IT1(I,K+LP2-1)+1)+ & - WW1(I,K)*DU(I,K)*EM1V(IT1(I,K+LP2-1)+28)+ & - DTE1(I,K)*DU(I,K)*EM1V(IT1(I,K+LP2-1)+29) -240 CONTINUE - DO 241 KP=2,LP1 - DO 241 I=MYIS,MYIE - G3(I,KP)=WW1(I,1)*WW2(I,KP)*EM1V(IT1(I,LL+KP))+ & - WW2(I,KP)*DTE1(I,1)*EM1V(IT1(I,LL+KP)+1)+ & - WW1(I,1)*DU(I,KP-1)*EM1V(IT1(I,LL+KP)+28)+ & - DTE1(I,1)*DU(I,KP-1)*EM1V(IT1(I,LL+KP)+29) -241 CONTINUE -! - DO 244 I=MYIS,MYIE - G4(I,1)=WW1(I,1)*WW2(I,1)*EM1VW(IT1(I,1))+ & - WW2(I,1)*DTE1(I,1)*EM1VW(IT1(I,1)+1) -244 CONTINUE - DO 242 K=1,L - DO 242 I=MYIS,MYIE - G4(I,K+1)=WW1(I,K+1)*WW2(I,K+1)*EM1VW(IT1(I,K+1))+ & - WW2(I,K+1)*DTE1(I,K+1)*EM1VW(IT1(I,K+1)+1)+ & - WW1(I,K+1)*DU(I,K)*EM1VW(IT1(I,K+1)+28)+ & - DTE1(I,K+1)*DU(I,K)*EM1VW(IT1(I,K+1)+29) - G5(I,K)=WW1(I,K)*WW2(I,K+1)*EM1VW(IT1(I,K+LP2-1))+ & - WW2(I,K+1)*DTE1(I,K)*EM1VW(IT1(I,K+LP2-1)+1)+ & - WW1(I,K)*DU(I,K)*EM1VW(IT1(I,K+LP2-1)+28)+ & - DTE1(I,K)*DU(I,K)*EM1VW(IT1(I,K+LP2-1)+29) -242 CONTINUE -! - END SUBROUTINE E1E290 - -!---------------------------------------------------------------------- - - SUBROUTINE SPA88(EXCTS,CTSO3,GXCTS,SORC,CSOUR, & - CLDFAC,TEMP,PRESS,VAR1,VAR2, & - P,DELP,DELP2,TOTVO2,TO3SP,TO3SPC, & - CO2SP1,CO2SP2,CO2SP, & - APCM,BPCM,ATPCM,BTPCM,ACOMB,BCOMB,BETACM, & - H25E2,ONE,H44194M2,H1P41819,HAF,HM1EZ,TWO, & -! SKO2D,RADCON, & - RADCON, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -!--------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- -! INTEGER, PARAMETER :: NBLY=15 - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte - - REAL,INTENT(IN) :: H25E2,ONE,H44194M2,H1P41819,HAF,HM1EZ,TWO, & - RADCON -! SKO2D,RADCON - - REAL,INTENT(IN),DIMENSION(its:ite,kts:kte+1) :: CSOUR - REAL,INTENT(OUT),DIMENSION(its:ite,kts:kte) :: CTSO3 - REAL,INTENT(OUT),DIMENSION(its:ite,kts:kte) :: EXCTS - REAL,INTENT(OUT),DIMENSION(its:ite) :: GXCTS - REAL,INTENT(IN),DIMENSION(its:ite,kts:kte+1,NBLY) :: SORC - REAL,INTENT(IN),DIMENSION(its:ite,kts:kte+1,kts:kte+1) :: CLDFAC - REAL,INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: PRESS,TEMP - - REAL,INTENT(IN),DIMENSION(its:ite,kts:kte) :: VAR1,VAR2 - REAL,INTENT(IN),DIMENSION(its:ite,kts:kte+1) :: P - REAL,INTENT(IN),DIMENSION(its:ite,kts:kte) :: DELP,DELP2,TO3SPC - REAL,INTENT(IN),DIMENSION(its:ite,kts:kte+1) ::TOTVO2,TO3SP,CO2SP1,& - CO2SP2,CO2SP - REAL,INTENT(IN),DIMENSION(NBLY) :: APCM,BPCM,ATPCM,BTPCM,ACOMB, & - BCOMB,BETACM - - REAL,DIMENSION(its:ite,kts:kte+1) ::CTMP,CTMP2,CTMP3 - REAL,DIMENSION(its:ite,kts:kte) ::X,Y,FAC1,FAC2,F,FF,AG,AGG, & - PHITMP,PSITMP,TOPM,TOPPHI,TT - - INTEGER :: K, I,KP,LLM2,J1,J3,KMAX,KMIN,KCLDS,ICNT,LLM1 - INTEGER :: L,LP1,LP2,LP3,LM1,LM2,LM3,MYIS,MYIE,LLP1,LL,KK,KLEN - - L=kte - LP1=L+1; LP2=L+2; LP3=L+3; LLP1 = 2*L + 1 - LM1=L-1; LM2=L-2; LM3=L-3; LL = 2*L - LLM2 = LL-2; LLM1=LL-1 - MYIS=its; MYIE=ite - -!--!COMPUTE TEMPERATURE QUANTITIES FOR USE IN PROGRAM - - DO 101 K=1,L - DO 101 I=MYIS,MYIE - X(I,K)=TEMP(I,K)-H25E2 - Y(I,K)=X(I,K)*X(I,K) -101 CONTINUE -!---INITIALIZE CTMP(I,1),CTMP2(I,1),CTMP3(I,1) TO UNITY; THESE ARE -! TRANSMISSION FCTNS AT THE TOP. - DO 345 I=MYIS,MYIE - CTMP(I,1)=ONE - CTMP2(I,1)=1. - CTMP3(I,1)=1. -345 CONTINUE -!***BEGIN LOOP ON FREQUENCY BANDS (1)*** -! -!---CALCULATION FOR BAND 1 (COMBINED BAND 1) -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 301 K=1,L - DO 301 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(1)*X(I,K)+BPCM(1)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(1)*X(I,K)+BTPCM(1)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -301 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 315 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -315 CONTINUE - DO 319 K=2,L - DO 317 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -317 CONTINUE -319 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 321 K=1,L - DO 321 I=MYIS,MYIE - FAC1(I,K)=ACOMB(1)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(1)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*FAC1(I,K)/SQRT(1.+FAC2(I,K))) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -321 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 353 K=1,L - DO 353 I=MYIS,MYIE - EXCTS(I,K)=SORC(I,K,1)*(CTMP(I,K+1)-CTMP(I,K)) -353 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 361 I=MYIS,MYIE - GXCTS(I)=CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,1)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,1)-SORC(I,L,1))) -361 CONTINUE -! -! -!-----CALCULATION FOR BAND 2 (COMBINED BAND 2) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 401 K=1,L - DO 401 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(2)*X(I,K)+BPCM(2)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(2)*X(I,K)+BTPCM(2)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -401 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 415 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -415 CONTINUE - DO 419 K=2,L - DO 417 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -417 CONTINUE -419 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 421 K=1,L - DO 421 I=MYIS,MYIE - FAC1(I,K)=ACOMB(2)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(2)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*FAC1(I,K)/SQRT(1.+FAC2(I,K))) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -421 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 453 K=1,L - DO 453 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,2)* & - (CTMP(I,K+1)-CTMP(I,K)) -453 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 461 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,2)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,2)-SORC(I,L,2))) -461 CONTINUE -! -!-----CALCULATION FOR BAND 3 (COMBINED BAND 3) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 501 K=1,L - DO 501 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(3)*X(I,K)+BPCM(3)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(3)*X(I,K)+BTPCM(3)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -501 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 515 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -515 CONTINUE - DO 519 K=2,L - DO 517 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -517 CONTINUE -519 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 521 K=1,L - DO 521 I=MYIS,MYIE - FAC1(I,K)=ACOMB(3)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(3)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*FAC1(I,K)/SQRT(1.+FAC2(I,K))) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -521 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 553 K=1,L - DO 553 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,3)* & - (CTMP(I,K+1)-CTMP(I,K)) -553 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 561 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,3)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,3)-SORC(I,L,3))) -561 CONTINUE -! -!-----CALCULATION FOR BAND 4 (COMBINED BAND 4) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 601 K=1,L - DO 601 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(4)*X(I,K)+BPCM(4)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(4)*X(I,K)+BTPCM(4)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -601 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 615 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -615 CONTINUE - DO 619 K=2,L - DO 617 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -617 CONTINUE -619 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 621 K=1,L - DO 621 I=MYIS,MYIE - FAC1(I,K)=ACOMB(4)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(4)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*FAC1(I,K)/SQRT(1.+FAC2(I,K))) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -621 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 653 K=1,L - DO 653 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,4)* & - (CTMP(I,K+1)-CTMP(I,K)) -653 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 661 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,4)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,4)-SORC(I,L,4))) -661 CONTINUE -! -!-----CALCULATION FOR BAND 5 (COMBINED BAND 5) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 701 K=1,L - DO 701 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(5)*X(I,K)+BPCM(5)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(5)*X(I,K)+BTPCM(5)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -701 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 715 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -715 CONTINUE - DO 719 K=2,L - DO 717 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -717 CONTINUE -719 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 721 K=1,L - DO 721 I=MYIS,MYIE - FAC1(I,K)=ACOMB(5)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(5)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*(FAC1(I,K)/SQRT(ONE+FAC2(I,K))+ & - BETACM(5)*TOTVO2(I,K+1)*SKO2D)) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -721 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 753 K=1,L - DO 753 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,5)* & - (CTMP(I,K+1)-CTMP(I,K)) -753 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 761 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,5)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,5)-SORC(I,L,5))) -761 CONTINUE -! -!-----CALCULATION FOR BAND 6 (COMBINED BAND 6) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 801 K=1,L - DO 801 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(6)*X(I,K)+BPCM(6)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(6)*X(I,K)+BTPCM(6)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -801 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 815 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -815 CONTINUE - DO 819 K=2,L - DO 817 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -817 CONTINUE -819 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 821 K=1,L - DO 821 I=MYIS,MYIE - FAC1(I,K)=ACOMB(6)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(6)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*(FAC1(I,K)/SQRT(ONE+FAC2(I,K))+ & - BETACM(6)*TOTVO2(I,K+1)*SKO2D)) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -821 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 853 K=1,L - DO 853 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,6)* & - (CTMP(I,K+1)-CTMP(I,K)) -853 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 861 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,6)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,6)-SORC(I,L,6))) -861 CONTINUE -! -!-----CALCULATION FOR BAND 7 (COMBINED BAND 7) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 901 K=1,L - DO 901 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(7)*X(I,K)+BPCM(7)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(7)*X(I,K)+BTPCM(7)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -901 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 915 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -915 CONTINUE - DO 919 K=2,L - DO 917 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -917 CONTINUE -919 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 921 K=1,L - DO 921 I=MYIS,MYIE - FAC1(I,K)=ACOMB(7)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(7)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*(FAC1(I,K)/SQRT(ONE+FAC2(I,K))+ & - BETACM(7)*TOTVO2(I,K+1)*SKO2D)) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -921 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 953 K=1,L - DO 953 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,k,7)* & - (CTMP(I,K+1)-CTMP(I,K)) -953 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 961 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,7)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,7)-SORC(I,L,7))) -961 CONTINUE -! -!-----CALCULATION FOR BAND 8 (COMBINED BAND 8) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 1001 K=1,L - DO 1001 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(8)*X(I,K)+BPCM(8)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(8)*X(I,K)+BTPCM(8)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -1001 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 1015 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -1015 CONTINUE - DO 1019 K=2,L - DO 1017 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -1017 CONTINUE -1019 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 1021 K=1,L - DO 1021 I=MYIS,MYIE - FAC1(I,K)=ACOMB(8)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(8)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*(FAC1(I,K)/SQRT(ONE+FAC2(I,K))+ & - BETACM(8)*TOTVO2(I,K+1)*SKO2D)) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -1021 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 1053 K=1,L - DO 1053 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,8)* & - (CTMP(I,K+1)-CTMP(I,K)) -1053 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 1061 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,8)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,8)-SORC(I,L,8))) -1061 CONTINUE -! -!-----CALCULATION FOR BAND 9 ( 560-670 CM-1; INCLUDES CO2) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 1101 K=1,L - DO 1101 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(9)*X(I,K)+BPCM(9)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(9)*X(I,K)+BTPCM(9)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -1101 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 1115 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -1115 CONTINUE - DO 1119 K=2,L - DO 1117 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -1117 CONTINUE -1119 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 1121 K=1,L - DO 1121 I=MYIS,MYIE - FAC1(I,K)=ACOMB(9)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(9)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*(FAC1(I,K)/SQRT(ONE+FAC2(I,K))+ & - BETACM(9)*TOTVO2(I,K+1)*SKO2D))*CO2SP1(I,K+1) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -1121 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 1153 K=1,L - DO 1153 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,9)* & - (CTMP(I,K+1)-CTMP(I,K)) -1153 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 1161 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,9)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,9)-SORC(I,L,9))) -1161 CONTINUE -! -!-----CALCULATION FOR BAND 10 (670-800 CM-1; INCLUDES CO2) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 1201 K=1,L - DO 1201 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(10)*X(I,K)+BPCM(10)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(10)*X(I,K)+BTPCM(10)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -1201 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 1215 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -1215 CONTINUE - DO 1219 K=2,L - DO 1217 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -1217 CONTINUE -1219 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 1221 K=1,L - DO 1221 I=MYIS,MYIE - FAC1(I,K)=ACOMB(10)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(10)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*(FAC1(I,K)/SQRT(ONE+FAC2(I,K))+ & - BETACM(10)*TOTVO2(I,K+1)*SKO2D))*CO2SP2(I,K+1) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -1221 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 1253 K=1,L - DO 1253 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,10)* & - (CTMP(I,K+1)-CTMP(I,K)) -1253 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 1261 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,10)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,10)-SORC(I,L,10))) -1261 CONTINUE -! -!-----CALCULATION FOR BAND 11 (800-900 CM-1) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 1301 K=1,L - DO 1301 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(11)*X(I,K)+BPCM(11)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(11)*X(I,K)+BTPCM(11)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -1301 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 1315 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -1315 CONTINUE - DO 1319 K=2,L - DO 1317 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -1317 CONTINUE -1319 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 1321 K=1,L - DO 1321 I=MYIS,MYIE - FAC1(I,K)=ACOMB(11)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(11)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*(FAC1(I,K)/SQRT(ONE+FAC2(I,K))+ & - BETACM(11)*TOTVO2(I,K+1)*SKO2D)) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -1321 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 1353 K=1,L - DO 1353 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,11)* & - (CTMP(I,K+1)-CTMP(I,K)) -1353 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 1361 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,11)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,11)-SORC(I,L,11))) -1361 CONTINUE -! -!-----CALCULATION FOR BAND 12 (900-990 CM-1) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 1401 K=1,L - DO 1401 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(12)*X(I,K)+BPCM(12)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(12)*X(I,K)+BTPCM(12)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -1401 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 1415 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -1415 CONTINUE - DO 1419 K=2,L - DO 1417 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -1417 CONTINUE -1419 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 1421 K=1,L - DO 1421 I=MYIS,MYIE - FAC1(I,K)=ACOMB(12)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(12)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*(FAC1(I,K)/SQRT(ONE+FAC2(I,K))+ & - BETACM(12)*TOTVO2(I,K+1)*SKO2D)) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -1421 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 1453 K=1,L - DO 1453 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,12)* & - (CTMP(I,K+1)-CTMP(I,K)) -1453 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 1461 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,12)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,12)-SORC(I,L,12))) -1461 CONTINUE -! -!-----CALCULATION FOR BAND 13 (990-1070 CM-1; INCLUDES O3)) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 1501 K=1,L - DO 1501 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(13)*X(I,K)+BPCM(13)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(13)*X(I,K)+BTPCM(13)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -1501 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 1515 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -1515 CONTINUE - DO 1519 K=2,L - DO 1517 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -1517 CONTINUE -1519 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 1521 K=1,L - DO 1521 I=MYIS,MYIE - FAC1(I,K)=ACOMB(13)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(13)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*(FAC1(I,K)/SQRT(ONE+FAC2(I,K))+ & - BETACM(13)*TOTVO2(I,K+1)*SKO2D+TO3SPC(I,K))) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -1521 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 1553 K=1,L - DO 1553 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,13)* & - (CTMP(I,K+1)-CTMP(I,K)) -1553 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 1561 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,13)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,13)-SORC(I,L,13))) -1561 CONTINUE -! -!-----CALCULATION FOR BAND 14 (1070-1200 CM-1) -! -! -!---OBTAIN TEMPERATURE CORRECTION (CAPPHI,CAPPSI),THEN MULTIPLY -! BY OPTICAL PATH (VAR1,VAR2) TO COMPUTE TEMPERATURE-CORRECTED -! OPTICAL PATH AND MEAN PRESSURE FOR A LAYER (PHITMP,PSITMP) - DO 1601 K=1,L - DO 1601 I=MYIS,MYIE - F(I,K)=H44194M2*(APCM(14)*X(I,K)+BPCM(14)*Y(I,K)) - FF(I,K)=H44194M2*(ATPCM(14)*X(I,K)+BTPCM(14)*Y(I,K)) - AG(I,K)=(H1P41819+F(I,K))*F(I,K)+ONE - AGG(I,K)=(H1P41819+FF(I,K))*FF(I,K)+ONE - PHITMP(I,K)=VAR1(I,K)*(((( AG(I,K)*AG(I,K))**2)**2)**2) - PSITMP(I,K)=VAR2(I,K)*(((( AGG(I,K)*AGG(I,K))**2)**2)**2) -1601 CONTINUE -!---OBTAIN OPTICAL PATH,MEAN PRESSURE FROM THE TOP TO THE PRESSURE -! P(K) (TOPM,TOPPHI) - DO 1615 I=MYIS,MYIE - TOPM(I,1)=PHITMP(I,1) - TOPPHI(I,1)=PSITMP(I,1) -1615 CONTINUE - DO 1619 K=2,L - DO 1617 I=MYIS,MYIE - TOPM(I,K)=TOPM(I,K-1)+PHITMP(I,K) - TOPPHI(I,K)=TOPPHI(I,K-1)+PSITMP(I,K) -1617 CONTINUE -1619 CONTINUE -!---TT IS THE CLOUD-FREE CTS TRANSMISSION FUNCTION - DO 1621 K=1,L - DO 1621 I=MYIS,MYIE - FAC1(I,K)=ACOMB(14)*TOPM(I,K) - FAC2(I,K)=FAC1(I,K)*TOPM(I,K)/(BCOMB(14)*TOPPHI(I,K)) - TT(I,K)=EXP(HM1EZ*(FAC1(I,K)/SQRT(ONE+FAC2(I,K))+ & - BETACM(14)*TOTVO2(I,K+1)*SKO2D)) - CTMP(I,K+1)=TT(I,K)*CLDFAC(I,K+1,1) -1621 CONTINUE -!---EXCTS IS THE CTS COOLING RATE ACCUMULATED OVER FREQUENCY BANDS - DO 1653 K=1,L - DO 1653 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)+SORC(I,K,14)* & - (CTMP(I,K+1)-CTMP(I,K)) -1653 CONTINUE -!---GXCTS IS THE EXACT CTS TOP FLUX ACCUMULATED OVER FREQUENCY BANDS - DO 1661 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)+CLDFAC(I,LP1,1)*(TT(I,L)*SORC(I,L,14)+ & - (HAF*DELP(I,L)*(TT(I,LM1)*(P(I,LP1)-PRESS(I,L)) + & - TT(I,L)*(P(I,LP1)+PRESS(I,L)-TWO*P(I,L)))) * & - (SORC(I,LP1,14)-SORC(I,L,14))) -1661 CONTINUE -! -! -! OBTAIN CTS FLUX AT THE TOP BY INTEGRATION OF HEATING RATES AND -! USING CTS FLUX AT THE BOTTOM (CURRENT VALUE OF GXCTS). NOTE -! THAT THE PRESSURE QUANTITIES AND CONVERSION FACTORS HAVE NOT -! BEEN INCLUDED EITHER IN EXCTS OR IN GXCTS. THESE CANCEL OUT, THUS -! REDUCING COMPUTATIONS! - DO 1731 K=1,L - DO 1731 I=MYIS,MYIE - GXCTS(I)=GXCTS(I)-EXCTS(I,K) -1731 CONTINUE -! -! NOW SCALE THE COOLING RATE (EXCTS) BY INCLUDING THE PRESSURE -! FACTOR (DELP) AND THE CONVERSION FACTOR (RADCON) - DO 1741 K=1,L - DO 1741 I=MYIS,MYIE - EXCTS(I,K)=EXCTS(I,K)*RADCON*DELP(I,K) -1741 CONTINUE -!---THIS IS THE END OF THE EXACT CTS COMPUTATIONS; AT THIS POINT -! EXCTS HAS ITS APPROPRIATE VALUE. -! -!*** COMPUTE APPROXIMATE CTS HEATING RATES FOR 15UM AND 9.6 UM BANDS -! (CTSO3) - DO 1711 K=1,L - DO 1711 I=MYIS,MYIE - CTMP2(I,K+1)=CO2SP(I,K+1)*CLDFAC(I,K+1,1) - CTMP3(I,K+1)=TO3SP(I,K)*CLDFAC(I,K+1,1) -1711 CONTINUE - DO 1701 K=1,L - DO 1701 I=MYIS,MYIE - CTSO3(I,K)=RADCON*DELP(I,K)* & - (CSOUR(I,K)*(CTMP2(I,K+1)-CTMP2(I,K)) + & - SORC(I,K,13)*(CTMP3(I,K+1)-CTMP3(I,K))) -1701 CONTINUE - - END SUBROUTINE SPA88 -!---------------------------------------------------------------------- - - SUBROUTINE E290(EMISSB,EMISS,AVEPHI,KLEN,FXOE2,DTE2, & -! T1,T2,T4, & - H16E1,HP1,H28E1,HAF,TEN, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -!--------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte - INTEGER, INTENT(IN) :: KLEN - REAL, INTENT(IN) :: H16E1,HP1,H28E1,HAF ,TEN - REAL, INTENT(OUT),DIMENSION(its:ite,kts:kte+1) :: EMISSB - REAL, INTENT(IN ),DIMENSION(its:ite,kts:kte+1) :: AVEPHI,FXOE2,DTE2 - -! REAL, INTENT(IN ), DIMENSION(5040) :: T1,T2,T4 - - REAL, INTENT(INOUT), DIMENSION(its:ite,kts:kte+1) :: EMISS - - REAL, DIMENSION(its:ite,kts:kte+1) :: TMP3,DT,FYO,DU - INTEGER, DIMENSION(its:ite,kts:kte+1) :: IVAL - -! REAL, DIMENSION(28,180) :: TABLE1,TABLE2,TABLE3 -! EQUIVALENCE (T1(1),TABLE1(1,1)),(T2(1),TABLE2(1,1)), & -! (T4(1),TABLE3(1,1)) -! EQUIVALENCE (TMP3,DT) - - INTEGER :: K, I,KP,LLM2,J1,J3,KMAX,KMIN,KCLDS,ICNT,LLM1 - INTEGER :: L,LP1,LP2,LP3,LM1,LM2,LM3,MYIS,MYIE,LLP1,LL,KK - - L=kte - LP1=L+1; LP2=L+2; LP3=L+3; LLP1 = 2*L + 1 - LM1=L-1; LM2=L-2; LM3=L-3; LL = 2*L - LLM2 = LL-2; LLM1=LL-1 - MYIS=its; MYIE=ite - - -!---FIRST WE OBTAIN THE EMISSIVITIES AS A FUNCTION OF TEMPERATURE -! (INDEX FXO) AND WATER AMOUNT (INDEX FYO). THIS PART OF THE CODE -! THUS GENERATES THE E2 FUNCTION. -! -!---CALCULATIONS FOR VARYING KP (FROM KP=K+1 TO LP1, INCLUDING SPECIAL -! CASE: RESULTS ARE IN EMISS - - - - DO 132 K=1,LP2-KLEN - DO 132 I=MYIS,MYIE - TMP3(I,K)=LOG10(AVEPHI(I,KLEN+K-1))+H16E1 - FYO(I,K)=AINT(TMP3(I,K)*TEN) - DU(I,K)=TMP3(I,K)-HP1*FYO(I,K) - FYO(I,K)=H28E1*FYO(I,K) - IVAL(I,K)=FYO(I,K)+FXOE2(I,KLEN+K-1) - EMISS(I,KLEN+K-1)=T1(IVAL(I,K))+DU(I,K)*T2(IVAL(I,K)) & - +DTE2(I,KLEN+K-1)*T4(IVAL(I,K)) -132 CONTINUE -!---THE SPECIAL CASE EMISS(I,L) (LAYER KP) IS OBTAINED NOW -! BY AVERAGING THE VALUES FOR L AND LP1: - DO 1344 I=MYIS,MYIE - EMISS(I,L)=HAF*(EMISS(I,L)+EMISS(I,LP1)) -1344 CONTINUE -!---NOTE THAT EMISS(I,LP1) IS NOT USEFUL AFTER THIS POINT. -! -!---CALCULATIONS FOR KP=KLEN AND VARYING K; RESULTS ARE IN EMISSB. -! IN THIS CASE, THE TEMPERATURE INDEX IS UNCHANGED, ALWAYS BEING -! FXO(I,KLEN-1); THE WATER INDEX CHANGES, BUT IS SYMMETRICAL WITH -! THAT FOR THE VARYING KP CASE.NOTE THAT THE SPECIAL CASE IS NOT -! INVOLVED HERE. -! (FIXED LEVEL) K VARIES FROM (KLEN+1) TO LP1; RESULTS ARE IN -! EMISSB(I,(KLEN) TO L) - DO 142 K=1,LP1-KLEN - DO 142 I=MYIS,MYIE - DT(I,K)=DTE2(I,KLEN-1) - IVAL(I,K)=FYO(I,K)+FXOE2(I,KLEN-1) -142 CONTINUE -! - DO 234 K=1,LP1-KLEN - DO 234 I=MYIS,MYIE - EMISSB(I,KLEN+K-1)=T1(IVAL(I,K))+DU(I,K)*T2(IVAL(I,K)) & - +DT(I,K)*T4(IVAL(I,K)) -234 CONTINUE - - END SUBROUTINE E290 - -!--------------------------------------------------------------------- - - SUBROUTINE E2SPEC(EMISS,AVEPHI,FXOSP,DTSP, & -! T1,T2,T4, & - H16E1,TEN,H28E1,HP1, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -!--------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte - REAL,INTENT(IN ) :: H16E1,TEN,H28E1,HP1 - REAL,INTENT(INOUT),DIMENSION(its:ite,kts:kte+1) :: EMISS - REAL,INTENT(IN ),DIMENSION(its:ite,kts:kte+1) :: AVEPHI - REAL,INTENT(IN ),DIMENSION(its:ite,2) :: FXOSP,DTSP - -! REAL, INTENT(IN ),DIMENSION(5040) :: T1,T2,T4 - -! REAL, DIMENSION(28,180) :: TABLE1,TABLE2,TABLE3 -! EQUIVALENCE (T1(1),TABLE1(1,1)),(T2(1),TABLE2(1,1)), & -! (T4(1),TABLE3(1,1)) - - INTEGER :: K,I,MYIS,MYIE - - REAL, DIMENSION(its:ite,kts:kte+1) :: TMP3,FYO,DU - INTEGER, DIMENSION(its:ite,kts:kte+1) :: IVAL - - MYIS=its - MYIE=ite - - DO 132 K=1,2 - DO 132 I=MYIS,MYIE - TMP3(I,K)=LOG10(AVEPHI(I,K))+H16E1 - FYO(I,K)=AINT(TMP3(I,K)*TEN) - DU(I,K)=TMP3(I,K)-HP1*FYO(I,K) - IVAL(I,K)=H28E1*FYO(I,K)+FXOSP(I,K) - EMISS(I,K)=T1(IVAL(I,K))+DU(I,K)*T2(IVAL(I,K))+ & - DTSP(I,K)*T4(IVAL(I,K)) -132 CONTINUE - - END SUBROUTINE E2SPEC - -!--------------------------------------------------------------------- - -! SUBROUTINE E3V88(EMV,TV,AV,EM3V, & - SUBROUTINE E3V88(EMV,TV,AV, & - TEN,HP1,H28E1,H16E1, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -!--------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte - REAL, INTENT(IN) :: TEN,HP1,H28E1,H16E1 -!----------------------------------------------------------------------- - REAL, INTENT(OUT), DIMENSION(its:ite,kts:kte*2+1) :: EMV - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte*2+1) :: TV,AV -! REAL, INTENT(IN), DIMENSION(5040) :: EM3V - - REAL,DIMENSION(its:ite,kts:kte*2+1) ::FXO,TMP3,DT,WW1,WW2,DU,& - FYO -! REAL, DIMENSION(5040) :: EM3V - -! EQUIVALENCE (EM3V(1),EM3(1,1)) - - INTEGER,DIMENSION(its:ite,kts:kte*2+1) ::IT - - INTEGER :: LLP1,I,K,MYIS,MYIE ,L - L = kte - LLP1 = 2*L + 1 - MYIS=its; MYIE=ite - -!---THE FOLLOWING LOOP REPLACES A DOUBLE LOOP OVER I (1-IMAX) AND -! K (1-LLP1) - - DO 203 K=1,LLP1 - DO 203 I=MYIS,MYIE - FXO(I,K)=AINT(TV(I,K)*HP1) - TMP3(I,K)=LOG10(AV(I,K))+H16E1 - DT(I,K)=TV(I,K)-TEN*FXO(I,K) - FYO(I,K)=AINT(TMP3(I,K)*TEN) - DU(I,K)=TMP3(I,K)-HP1*FYO(I,K) -!---OBTAIN INDEX FOR TABLE LOOKUP; THIS VALUE WILL HAVE TO BE -! DECREMENTED BY 9 TO ACCOUNT FOR TABLE TEMPS STARTING AT 100K. - IT(I,K)=FXO(I,K)+FYO(I,K)*H28E1 - WW1(I,K)=TEN-DT(I,K) - WW2(I,K)=HP1-DU(I,K) - EMV(I,K)=WW1(I,K)*WW2(I,K)*EM3V(IT(I,K)-9)+ & - WW2(I,K)*DT(I,K)*EM3V(IT(I,K)-8)+ & - WW1(I,K)*DU(I,K)*EM3V(IT(I,K)+19)+ & - DT(I,K)*DU(I,K)*EM3V(IT(I,K)+20) -203 CONTINUE - - END SUBROUTINE E3V88 -!----------------------------------------------------------------------- - - SUBROUTINE SWR93(FSWC,HSWC,UFSWC,DFSWC,FSWL,HSWL,UFSWL, & - DFSWL, & - PRESS,COSZRO,TAUDAR,RH2O,RRCO2,SSOLAR,QO3, & - NCLDS,KTOPSW,KBTMSW,CAMT,CRR,CTT, & - ALVB,ALNB,ALVD,ALND,GDFVB,GDFNB,GDFVD,GDFND, & -! UCO2,UO3,TUCO2,TUO3,TDO3,TDCO2, & - ABCFF,PWTS, & - H35E1,H1224E3,ONE,ZERO,HAF,H69766E5,HP219, & - HP816,RRAYAV,GINV,CFCO2,CFO3, & - TWO,H235M3,HP26,H129M2,H75826M4,H1036E2, & - H1P082,HMP805,H1386E2,H658M2,H2118M2,H42M2, & - H323M4,HM1EZ,DIFFCTR,O3DIFCTR,FIFTY,RADCON, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) -!---------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte - REAL,INTENT(IN) :: RRCO2,SSOLAR - REAL,INTENT(IN) :: H35E1,H1224E3,ONE,ZERO,HAF,H69766E5,HP219,HP816,RRAYAV,& - GINV,CFCO2,CFO3 - REAL,INTENT(IN) :: TWO,H235M3,HP26,H129M2,H75826M4,H1036E2 - REAL,INTENT(IN) :: H1P082,HMP805,H1386E2,H658M2,H2118M2,H42M2,H323M4,HM1EZ - REAL,INTENT(IN) :: DIFFCTR,O3DIFCTR,FIFTY,RADCON -!---------------------------------------------------------------------- - INTEGER, PARAMETER :: NB=12 - REAL, INTENT(IN ),DIMENSION(its:ite,kts:kte+1) :: PRESS,CAMT - REAL, INTENT(IN ),DIMENSION(its:ite,kts:kte) :: RH2O,QO3 - REAL, INTENT(IN ),DIMENSION(its:ite) :: COSZRO,TAUDAR,ALVB,ALVD,ALNB,ALND - INTEGER, INTENT(IN ),DIMENSION(its:ite) :: NCLDS - INTEGER, INTENT(IN ),DIMENSION(its:ite,kts:kte+1) ::KTOPSW,KBTMSW - REAL, INTENT(IN ),DIMENSION(its:ite,NB,kts:kte+1) ::CRR,CTT - - REAL, INTENT(OUT),DIMENSION(its:ite,kts:kte+1) :: & - FSWC,HSWC,UFSWC,DFSWC,FSWL,HSWL,UFSWL,DFSWL - REAL, INTENT(OUT),DIMENSION(its:ite) :: GDFVB,GDFVD,GDFNB,GDFND - REAL, INTENT(IN), DIMENSION(NB) :: ABCFF,PWTS - -! REAL, INTENT(IN), DIMENSION(its:ite,kts:kte*2+2) :: UCO2,UO3 -! REAL, INTENT(IN), DIMENSION(its:ite,kts:kte+1) :: TUCO2,TUO3,TDO3,TDCO2 - - REAL, DIMENSION(its:ite,kts:kte*2+2) :: UCO2,UO3 - REAL, DIMENSION(its:ite,kts:kte+1) :: TUCO2,TUO3,TDO3,TDCO2 - - REAL, DIMENSION(its:ite,kts:kte*2+2) :: TCO2,TO3 - REAL, DIMENSION(its:ite,kts:kte+1) :: PP,DP,PR2,DU,DUCO2,DUO3,UD,TTD - REAL, DIMENSION(its:ite,kts:kte+1) :: UDCO2,UDO3,UR,URCO2,URO3,TTU - REAL, DIMENSION(its:ite,kts:kte+1) :: DFN,UFN - REAL, DIMENSION(its:ite,kts:kte+1) :: XAMT,FF,FFCO2,FFO3,CR,CT - REAL, DIMENSION(its:ite,kts:kte+1) :: PPTOP,DPCLD,TTDB1,TTUB1 - REAL, DIMENSION(its:ite,kts:kte+1) :: TDCL1,TUCL1,TDCL2,DFNTRN, & - UFNTRN,TCLU,TCLD,ALFA,ALFAU, & - UFNCLU,DFNCLU - - REAL, DIMENSION(its:ite,NB) :: DFNTOP - REAL, DIMENSION(its:ite) :: SECZ,TMP1,RRAY,REFL,REFL2,CCMAX - -! EQUIVALENCE & -! (UDO3,UO3(its,1),DFNCLU), (URO3,UO3(its,kte+2), UFNCLU) & -! , (UDCO2,UCO2(its,1),TCLD), (URCO2,UCO2(its,kte+2), TCLU) & -! , (TDO3 ,TO3(its,1),DFNTRN),(TUO3,TO3(its,kte+2), UFNTRN) & -! , (TDCO2,TCO2(its,1) ),(TUCO2,TCO2(its,kte+2) ) & -! , (FF , ALFA ), (FFCO2 , ALFAU ), (FFO3 , TTDB1 ) & -! , (DU , TTUB1), (DUCO2 , TUCL1 ), (DUO3 , TDCL1 ) & -! , (PR2 , TDCL2) - -! EQUIVALENCE & -! (UDO3,DFNCLU), (URO3,UFNCLU) & -! , (UDCO2,TCLD ), (URCO2,TCLU) & -! , (TDO3 ,DFNTRN),(TUO3,UFNTRN) & -!! , (TDCO2,TCO2(its,1) ),(TUCO2,TCO2(its,kte+2) ) & -! , (FF , ALFA ), (FFCO2 , ALFAU ), (FFO3 , TTDB1 ) & -! , (DU , TTUB1), (DUCO2 , TUCL1 ), (DUO3 , TDCL1 ) & -! , (PR2 , TDCL2) - - INTEGER :: K,I,KP,N,IP,MYIS1,KCLDS,NNCLDS,JTOP,KK,J2,J3,J1 - INTEGER :: L,LP1,LP2,LP3,LM1,LM2,LM3,MYIS,MYIE,LLP1,LL - REAL :: DENOM,HTEMP,TEMPF,TEMPG - - L=kte - LP1=L+1; LP2=L+2; LP3=L+3; LLP1 = 2*L + 1 - LM1=L-1; LM2=L-2; LM3=L-3; LL = 2*L - MYIS=its; MYIE=ite - MYIS1=MYIS+1 ! ?? - - DO 100 I=MYIS,MYIE - SECZ(I) = H35E1/SQRT(H1224E3*COSZRO(I)*COSZRO(I)+ONE) - PP(I,1) = ZERO - PP(I,LP1) = PRESS(I,LP1) - TMP1(I) = ONE/PRESS(I,LP1) -100 CONTINUE - DO 110 K=1,LM1 - DO 110 I=MYIS,MYIE - PP(I,K+1) = HAF*(PRESS(I,K+1)+PRESS(I,K)) -110 CONTINUE - DO 120 K=1,L - DO 120 I=MYIS,MYIE - DP (I,K) = PP(I,K+1)-PP(I,K) - PR2(I,K) = HAF*(PP(I,K)+PP(I,K+1)) -120 CONTINUE - DO 130 K=1,L - DO 130 I=MYIS,MYIE - PR2(I,K) = PR2(I,K)*TMP1(I) -130 CONTINUE -! CALCULATE ENTERING FLUX AT THE TOP FOR EACH BAND(IN CGS UNITS) - DO 140 N=1,NB - DO 140 IP=MYIS,MYIE - DFNTOP(IP,N) = SSOLAR*H69766E5*COSZRO(IP)*TAUDAR(IP)*PWTS(N) -140 CONTINUE -! EXECUTE THE LACIS-HANSEN REFLECTIVITY PARAMETERIZATION -! FOR THE VISIBLE BAND - DO 150 I=MYIS,MYIE - RRAY(I) = HP219/(ONE+HP816*COSZRO(I)) - REFL(I) = RRAY(I) + (ONE-RRAY(I))*(ONE-RRAYAV)*ALVB(I)/ & - (ONE-ALVD(I)*RRAYAV) -150 CONTINUE - DO 155 I=MYIS,MYIE - RRAY(I) = 0.104/(ONE+4.8*COSZRO(I)) - REFL2(I)= RRAY(I) + (ONE-RRAY(I))*(ONE-0.093)*ALVB(I)/ & - (ONE-ALVD(I)*0.093) -155 CONTINUE -! CALCULATE PRESSURE-WEIGHTED OPTICAL PATHS FOR EACH LAYER -! IN UNITS OF CM-ATM. PRESSURE WEIGHTING IS USING PR2. -! DU= VALUE FOR H2O;DUCO2 FOR CO2;DUO3 FOR O3. - DO 160 K=1,L - DO 160 I=MYIS,MYIE - DU (I,K) = GINV*RH2O(I,K)*DP(I,K)*PR2(I,K) - DUCO2(I,K) = (RRCO2*GINV*CFCO2)*DP(I,K)*PR2(I,K) - DUO3 (I,K) = (GINV*CFO3)*QO3(I,K)*DP(I,K) -160 CONTINUE -! -! CALCULATE CLEAR SKY SW FLUX -! -! OBTAIN THE OPTICAL PATH FROM THE TOP OF THE ATMOSPHERE TO THE -! FLUX PRESSURE. ANGULAR FACTORS ARE NOW INCLUDED. UD=DOWNWARD -! PATH FOR H2O,WIGTH UR THE UPWARD PATH FOR H2O. CORRESPONDING -! QUANTITIES FOR CO2,O3 ARE UDCO2/URCO2 AND UDO3/URO3. - DO 200 IP=MYIS,MYIE - UD (IP,1) = ZERO - UDCO2(IP,1) = ZERO - UDO3 (IP,1) = ZERO -! SH - UO3 (IP,1) = UDO3 (IP,1) - UCO2 (IP,1) = UDCO2(IP,1) - -200 CONTINUE - DO 210 K=2,LP1 - DO 210 I=MYIS,MYIE - UD (I,K) = UD (I,K-1)+DU (I,K-1)*SECZ(I) - UDCO2(I,K) = UDCO2(I,K-1)+DUCO2(I,K-1)*SECZ(I) - UDO3 (I,K) = UDO3 (I,K-1)+DUO3 (I,K-1)*SECZ(I) -! SH - UO3 (I,K) = UDO3 (I,K) - UCO2 (I,K) = UDCO2(I,K) - -210 CONTINUE - DO 220 IP=MYIS,MYIE - UR (IP,LP1) = UD (IP,LP1) - URCO2(IP,LP1) = UDCO2(IP,LP1) - URO3 (IP,LP1) = UDO3 (IP,LP1) -! SH - UO3 (IP,LP1+LP1) = URO3 (IP,LP1) - UCO2 (IP,LP1+LP1) = URCO2(IP,LP1) - -220 CONTINUE - DO 230 K=L,1,-1 - DO 230 IP=MYIS,MYIE - UR (IP,K) = UR (IP,K+1)+DU (IP,K)*DIFFCTR - URCO2(IP,K) = URCO2(IP,K+1)+DUCO2(IP,K)*DIFFCTR - URO3 (IP,K) = URO3 (IP,K+1)+DUO3 (IP,K)*O3DIFCTR -! SH - UO3 (IP,LP1+K) = URO3 (IP,K) - UCO2(IP,LP1+K) = URCO2(IP,K) - -230 CONTINUE -! CALCULATE CO2 ABSORPTIONS . THEY WILL BE USED IN NEAR INFRARED -! BANDS.SINCE THE ABSORPTION AMOUNT IS GIVEN (IN THE FORMULA USED -! BELOW, DERIVED FROM SASAMORI) IN TERMS OF THE TOTAL SOLAR FLUX, -! AND THE ABSORPTION IS ONLY INCLUDED IN THE NEAR IR (50 PERCENT -! OF THE SOLAR SPECTRUM), THE ABSORPTIONS ARE MULTIPLIED BY 2. -! SINCE CODE ACTUALLY REQUIRES TRANSMISSIONS, THESE ARE THE -! VALUES ACTUALLY STORED IN TCO2. - DO 240 K=1,LL - DO 240 I=MYIS,MYIE - TCO2(I,K+1)=ONE-TWO*(H235M3*EXP(HP26*LOG(UCO2(I,K+1)+H129M2)) & - -H75826M4) -240 CONTINUE - -! SH - DO 241 K=1,L - DO 241 I=MYIS,MYIE - TDCO2(I,K+1)=TCO2(I,K+1) -241 CONTINUE - DO 242 K=1,L - DO 242 I=MYIS,MYIE - TUCO2(I,K)=TCO2(I,LP1+K) -242 CONTINUE - -! NOW CALCULATE OZONE ABSORPTIONS. THESE WILL BE USED IN -! THE VISIBLE BAND.JUST AS IN THE CO2 CASE, SINCE THIS BAND IS -! 50 PERCENT OF THE SOLAR SPECTRUM,THE ABSORPTIONS ARE MULTIPLIED -! BY 2. THE TRANSMISSIONS ARE STORED IN TO3. - HTEMP = H1036E2*H1036E2*H1036E2 - DO 250 K=1,LL - DO 250 I=MYIS,MYIE - TO3(I,K+1)=ONE-TWO*UO3(I,K+1)* & - (H1P082*EXP(HMP805*LOG(ONE+H1386E2*UO3(I,K+1)))+ & - H658M2/(ONE+HTEMP*UO3(I,K+1)*UO3(I,K+1)*UO3(I,K+1))+ & - H2118M2/(ONE+UO3(I,K+1)*(H42M2+H323M4*UO3(I,K+1)))) -250 CONTINUE - -! SH - DO 251 K=1,L - DO 251 I=MYIS,MYIE - TDO3(I,K+1)=TO3(I,K+1) -251 CONTINUE - DO 252 K=1,L - DO 252 I=MYIS,MYIE - TUO3(I,K)=TO3(I,LP1+K) -252 CONTINUE - - -! START FREQUENCY LOOP (ON N) HERE -! -!--- BAND 1 (VISIBLE) INCLUDES O3 AND H2O ABSORPTION - DO 260 K=1,L - DO 260 I=MYIS,MYIE - TTD(I,K+1) = EXP(HM1EZ*MIN(FIFTY,ABCFF(1)*UD(I,K+1))) - TTU(I,K) = EXP(HM1EZ*MIN(FIFTY,ABCFF(1)*UR(I,K))) - DFN(I,K+1) = TTD(I,K+1)*TDO3(I,K+1) - UFN(I,K) = TTU(I,K)*TUO3(I,K) -260 CONTINUE - DO 270 I=MYIS,MYIE - DFN(I,1) = ONE - UFN(I,LP1) = DFN(I,LP1) -270 CONTINUE -! SCALE VISIBLE BAND FLUXES BY SOLAR FLUX AT THE TOP OF THE -! ATMOSPHERE (DFNTOP(I,1)) -! DFSW/UFSW WILL BE THE FLUXES, SUMMED OVER ALL BANDS - DO 280 K=1,LP1 - DO 280 I=MYIS,MYIE - DFSWL(I,K) = DFN(I,K)*DFNTOP(I,1) - UFSWL(I,K) = REFL(I)*UFN(I,K)*DFNTOP(I,1) -280 CONTINUE - DO 285 I=MYIS,MYIE - GDFVB(I) = DFSWL(I,LP1)*EXP(-0.15746*SECZ(I)) - GDFVD(I) = ((ONE-REFL2(I))*DFSWL(I,LP1) - & - (ONE-ALVB(I)) *GDFVB(I)) / (ONE-ALVD(I)) - GDFNB(I) = ZERO - GDFND(I) = ZERO -285 CONTINUE -!---NOW OBTAIN FLUXES FOR THE NEAR IR BANDS. THE METHODS ARE THE SAME -! AS FOR THE VISIBLE BAND, EXCEPT THAT THE REFLECTION AND -! TRANSMISSION COEFFICIENTS (OBTAINED BELOW) ARE DIFFERENT, AS -! RAYLEIGH SCATTERING NEED NOT BE CONSIDERED. - DO 350 N=2,NB - IF (N.EQ.2) THEN -! THE WATER VAPOR TRANSMISSION FUNCTION FOR BAND 2 IS EQUAL TO -! THAT OF BAND 1 (SAVED AS TTD,TTU) -!--- BAND 2-9 (NEAR-IR) INCLUDES O3, CO2 AND H2O ABSORPTION - DO 290 K=1,L - DO 290 I=MYIS,MYIE - DFN(I,K+1) = TTD(I,K+1)*TDCO2(I,K+1) - UFN(I,K) = TTU(I,K)*TUCO2(I,K) -290 CONTINUE - ELSE -! CALCULATE WATER VAPOR TRANSMISSION FUNCTIONS FOR NEAR INFRARED -! BANDS. INCLUDE CO2 TRANSMISSION (TDCO2/TUCO2), WHICH -! IS THE SAME FOR ALL INFRARED BANDS. - DO 300 K=1,L - DO 300 I=MYIS,MYIE - DFN(I,K+1)=EXP(HM1EZ*MIN(FIFTY,ABCFF(N)*UD(I,K+1))) & - *TDCO2(I,K+1) - UFN(I,K)=EXP(HM1EZ*MIN(FIFTY,ABCFF(N)*UR(I,K))) & - *TUCO2(I,K) -300 CONTINUE - ENDIF -!---AT THIS POINT,INCLUDE DFN(1),UFN(LP1), NOTING THAT DFN(1)=1 FOR -! ALL BANDS, AND THAT UFN(LP1)=DFN(LP1) FOR ALL BANDS. - DO 310 I=MYIS,MYIE - DFN(I,1) = ONE - UFN(I,LP1) = DFN(I,LP1) -310 CONTINUE -! SCALE THE PREVIOUSLY COMPUTED FLUXES BY THE FLUX AT THE TOP -! AND SUM OVER BANDS - DO 320 K=1,LP1 - DO 320 I=MYIS,MYIE - DFSWL(I,K) = DFSWL(I,K) + DFN(I,K)*DFNTOP(I,N) - UFSWL(I,K) = UFSWL(I,K) + ALNB(I)*UFN(I,K)*DFNTOP(I,N) -320 CONTINUE - DO 330 I=MYIS,MYIE - GDFNB(I) = GDFNB(I) + DFN(I,LP1)*DFNTOP(I,N) -330 CONTINUE -350 CONTINUE - DO 360 K=1,LP1 - DO 360 I=MYIS,MYIE - FSWL(I,K) = UFSWL(I,K)-DFSWL(I,K) -360 CONTINUE - DO 370 K=1,L - DO 370 I=MYIS,MYIE - HSWL(I,K)=RADCON*(FSWL(I,K+1)-FSWL(I,K))/DP(I,K) -370 CONTINUE -! -!---END OF FREQUENCY LOOP (OVER N) -! -! CALCULATE CLOUDY SKY SW FLUX -! - KCLDS=NCLDS(MYIS) - DO 400 I=MYIS1,MYIE - KCLDS=MAX(NCLDS(I),KCLDS) -400 CONTINUE - DO 410 K=1,LP1 - DO 410 I=MYIS,MYIE - DFSWC(I,K) = DFSWL(I,K) - UFSWC(I,K) = UFSWL(I,K) - FSWC (I,K) = FSWL (I,K) -410 CONTINUE - DO 420 K=1,L - DO 420 I=MYIS,MYIE - HSWC(I,K) = HSWL(I,K) -420 CONTINUE -!******************************************************************* - IF (KCLDS .EQ. 0) RETURN -!******************************************************************* - DO 430 K=1,LP1 - DO 430 I=MYIS,MYIE - XAMT(I,K) = CAMT(I,K) -430 CONTINUE - DO 470 I=MYIS,MYIE - NNCLDS = NCLDS(I) - CCMAX(I) = ZERO - IF (NNCLDS .LE. 0) GO TO 470 - CCMAX(I) = ONE - DO 450 K=1,NNCLDS - CCMAX(I) = CCMAX(I) * (ONE - CAMT(I,K+1)) -450 CONTINUE - CCMAX(I) = ONE - CCMAX(I) - IF (CCMAX(I) .GT. ZERO) THEN - DO 460 K=1,NNCLDS - XAMT(I,K+1) = CAMT(I,K+1)/CCMAX(I) -460 CONTINUE - END IF -470 CONTINUE - DO 480 K=1,LP1 - DO 480 I=MYIS,MYIE - FF (I,K) = DIFFCTR - FFCO2(I,K) = DIFFCTR - FFO3 (I,K) = O3DIFCTR -480 CONTINUE - DO 490 IP=MYIS,MYIE - JTOP = KTOPSW(IP,NCLDS(IP)+1) - DO 490 K=1,JTOP - FF (IP,K) = SECZ(IP) - FFCO2(IP,K) = SECZ(IP) - FFO3 (IP,K) = SECZ(IP) -490 CONTINUE - DO 500 I=MYIS,MYIE - RRAY(I) = HP219/(ONE+HP816*COSZRO(I)) - REFL(I) = RRAY(I) + (ONE-RRAY(I))*(ONE-RRAYAV)*ALVD(I)/ & - (ONE-ALVD(I)*RRAYAV) -500 CONTINUE - DO 510 IP=MYIS,MYIE - UD (IP,1) = ZERO - UDCO2(IP,1) = ZERO - UDO3 (IP,1) = ZERO -! SH - UO3 (IP,1) = UDO3 (IP,1) - UCO2 (IP,1) = UDCO2(IP,1) - -510 CONTINUE - DO 520 K=2,LP1 - DO 520 I=MYIS,MYIE - UD (I,K) = UD (I,K-1)+DU (I,K-1)*FF (I,K) - UDCO2(I,K) = UDCO2(I,K-1)+DUCO2(I,K-1)*FFCO2(I,K) - UDO3 (I,K) = UDO3 (I,K-1)+DUO3 (I,K-1)*FFO3 (I,K) -! SH - UO3 (I,K) = UDO3 (I,K) - UCO2(I,K) = UDCO2(I,K) - -520 CONTINUE - DO 530 IP=MYIS,MYIE - UR (IP,LP1) = UD (IP,LP1) - URCO2(IP,LP1) = UDCO2(IP,LP1) - URO3 (IP,LP1) = UDO3 (IP,LP1) -! SH - UO3 (IP,LP1+LP1) = URO3 (IP,LP1) - UCO2 (IP,LP1+LP1) = URCO2(IP,LP1) - -530 CONTINUE - DO 540 K=L,1,-1 - DO 540 IP=MYIS,MYIE - UR (IP,K) = UR (IP,K+1)+DU (IP,K)*DIFFCTR - URCO2(IP,K) = URCO2(IP,K+1)+DUCO2(IP,K)*DIFFCTR - URO3 (IP,K) = URO3 (IP,K+1)+DUO3 (IP,K)*O3DIFCTR -! SH - UO3 (IP,LP1+K) = URO3 (IP,K) - UCO2(IP,LP1+K) = URCO2(IP,K) - -540 CONTINUE - DO 550 K=1,LL - DO 550 I=MYIS,MYIE - TCO2(I,K+1)=ONE-TWO*(H235M3*EXP(HP26*LOG(UCO2(I,K+1)+H129M2)) & - -H75826M4) -550 CONTINUE -! SH - DO 551 K=1,L - DO 551 I=MYIS,MYIE - TDCO2(I,K+1)=TCO2(I,K+1) -551 CONTINUE - DO 552 K=1,L - DO 552 I=MYIS,MYIE - TUCO2(I,K)=TCO2(I,LP1+K) -552 CONTINUE - - DO 560 K=1,LL - DO 560 I=MYIS,MYIE - TO3(I,K+1)=ONE-TWO*UO3(I,K+1)* & - (H1P082*EXP(HMP805*LOG(ONE+H1386E2*UO3(I,K+1)))+ & - H658M2/(ONE+HTEMP*UO3(I,K+1)*UO3(I,K+1)*UO3(I,K+1))+ & - H2118M2/(ONE+UO3(I,K+1)*(H42M2+H323M4*UO3(I,K+1)))) -560 CONTINUE -! SH - DO 561 K=1,L - DO 561 I=MYIS,MYIE - TDO3(I,K+1)=TO3(I,K+1) -561 CONTINUE - DO 562 K=1,L - DO 562 I=MYIS,MYIE - TUO3(I,K)=TO3(I,LP1+K) -562 CONTINUE - -!******************************************************************** -!---THE FIRST CLOUD IS THE GROUND; ITS PROPERTIES ARE GIVEN -! BY REFL (THE TRANSMISSION (0) IS IRRELEVANT FOR NOW!). -!******************************************************************** - DO 570 I=MYIS,MYIE - CR(I,1) = REFL(I) -570 CONTINUE -!***OBTAIN CLOUD REFLECTION AND TRANSMISSION COEFFICIENTS FOR -! REMAINING CLOUDS (IF ANY) IN THE VISIBLE BAND -!---THE MAXIMUM NO OF CLOUDS IN THE ROW (KCLDS) IS USED. THIS CREATES -! EXTRA WORK (MAY BE REMOVED IN A SUBSEQUENT UPDATE). - DO 581 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 581 - DO 580 KK=2,KCLDS+1 - CR(I,KK) = CRR(I,1,KK)*XAMT(I,KK) - CT(I,KK) = ONE - (ONE-CTT(I,1,KK))*XAMT(I,KK) -580 CONTINUE -581 CONTINUE -!---OBTAIN THE PRESSURE AT THE TOP,BOTTOM AND THE THICKNESS OF -! "THICK" CLOUDS (THOSE AT LEAST 2 LAYERS THICK). THIS IS USED -! LATER IS OBTAINING FLUXES INSIDE THE THICK CLOUDS, FOR ALL -! FREQUENCY BANDS. - DO 591 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 591 - DO 590 KK=1,KCLDS - IF ((KBTMSW(I,KK+1)-1).GT.KTOPSW(I,KK+1)) THEN - PPTOP(I,KK)=PP(I,KTOPSW(I,KK+1)) - DPCLD(I,KK)=ONE/(PPTOP(I,KK)-PP(I,KBTMSW(I,KK+1))) - ENDIF -590 CONTINUE -591 CONTINUE - DO 600 K=1,L - DO 600 I=MYIS,MYIE - TTDB1(I,K+1) = EXP(HM1EZ*MIN(FIFTY,ABCFF(1)*UD(I,K+1))) - TTUB1(I,K) = EXP(HM1EZ*MIN(FIFTY,ABCFF(1)*UR(I,K))) - TTD (I,K+1) = TTDB1(I,K+1)*TDO3(I,K+1) - TTU (I,K) = TTUB1(I,K)*TUO3(I,K) -600 CONTINUE - DO 610 I=MYIS,MYIE - TTD(I,1) = ONE - TTU(I,LP1) = TTD(I,LP1) -610 CONTINUE -!***FOR EXECUTION OF THE CLOUD LOOP, IT IS NECESSARY TO SEPARATE OUT -! TRANSMISSION FCTNS AT THE TOP AND BOTTOM OF THE CLOUDS, FOR -! EACH BAND N. THE REQUIRED QUANTITIES ARE: -! TTD(I,KTOPSW(I,K),N) K RUNS FROM 1 TO NCLDS(I)+1: -! TTU(I,KTOPSW(I,K),N) K RUNS FROM 1 TO NCLDS(I)+1: -! TTD(I,KBTMSW(I,K),N) K RUNS FROM 1 TO NCLDS(I)+1: -! AND INVERSES OF THE FIRST TWO. THE ABOVE QUANTITIES ARE -! STORED IN TDCL1,TUCL1,TDCL2, AND DFNTRN,UFNTRN, RESPECTIVELY, -! AS THEY HAVE MULTIPLE USE IN THE PGM. -!---FOR FIRST CLOUD LAYER (GROUND) TDCL1,TUCL1 ARE KNOWN: - DO 620 I=MYIS,MYIE - TDCL1 (I,1) = TTD(I,LP1) - TUCL1 (I,1) = TTU(I,LP1) - TDCL2 (I,1) = TDCL1(I,1) - DFNTRN(I,1) = ONE/TDCL1(I,1) - UFNTRN(I,1) = DFNTRN(I,1) -620 CONTINUE - DO 631 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 631 - DO 630 KK=2,KCLDS+1 - TDCL1(I,KK) = TTD(I,KTOPSW(I,KK)) - TUCL1(I,KK) = TTU(I,KTOPSW(I,KK)) - TDCL2(I,KK) = TTD(I,KBTMSW(I,KK)) -630 CONTINUE -631 CONTINUE -!---COMPUTE INVERSES - DO 641 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 641 -! SH - DO 640 KK=2,KCLDS+1 - DFNTRN(I,KK) = ONE/TDCL1(I,KK) - UFNTRN(I,KK) = ONE/TUCL1(I,KK) -640 CONTINUE -641 CONTINUE -!---COMPUTE THE TRANSMISSIVITY FROM THE TOP OF CLOUD (K+1) TO THE -! TOP OF CLOUD (K). THE CLOUD TRANSMISSION (CT) IS INCLUDED. THIS -! QUANTITY IS CALLED TCLU (INDEX K). ALSO, OBTAIN THE TRANSMISSIVITY -! FROM THE BOTTOM OF CLOUD (K+1) TO THE TOP OF CLOUD (K)(A PATH -! ENTIRELY OUTSIDE CLOUDS). THIS QUANTITY IS CALLED TCLD (INDEX K). - DO 651 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 651 - DO 650 KK=1,KCLDS - TCLU(I,KK) = TDCL1(I,KK)*DFNTRN(I,KK+1)*CT(I,KK+1) - TCLD(I,KK) = TDCL1(I,KK)/TDCL2(I,KK+1) -650 CONTINUE -651 CONTINUE -!***THE FOLLOWING IS THE RECURSION RELATION FOR ALFA: THE REFLECTION -! COEFFICIENT FOR A SYSTEM INCLUDING THE CLOUD IN QUESTION AND THE -! FLUX COMING OUT OF THE CLOUD SYSTEM INCLUDING ALL CLOUDS BELOW -! THE CLOUD IN QUESTION. -!---ALFAU IS ALFA WITHOUT THE REFLECTION OF THE CLOUD IN QUESTION - DO 660 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 660 - ALFA (I,1)=CR(I,1) - ALFAU(I,1)=ZERO -660 CONTINUE -!---AGAIN,EXCESSIVE CALCULATIONS-MAY BE CHANGED LATER! - DO 671 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 671 - DO 670 KK=2,KCLDS+1 - ALFAU(I,KK)= TCLU(I,KK-1)*TCLU(I,KK-1)*ALFA(I,KK-1)/ & - (ONE - TCLD(I,KK-1)*TCLD(I,KK-1)*ALFA(I,KK-1)*CR(I,KK)) - ALFA (I,KK)= ALFAU(I,KK)+CR(I,KK) -670 CONTINUE -671 CONTINUE -! CALCULATE UFN AT CLOUD TOPS AND DFN AT CLOUD BOTTOMS -!---NOTE THAT UFNCLU(I,KCLDS+1) GIVES THE UPWARD FLUX AT THE TOP -! OF THE HIGHEST REAL CLOUD (IF NCLDS(I)=KCLDS). IT GIVES THE FLUX -! AT THE TOP OF THE ATMOSPHERE IF NCLDS(I) < KCLDS. IN THE FIRST -! CASE, TDCL1 EQUALS THE TRANSMISSION FCTN TO THE TOP OF THE -! HIGHEST CLOUD, AS WE WANT. IN THE SECOND CASE, TDCL1=1, SO UFNCLU -! EQUALS ALFA. THIS IS ALSO CORRECT. - DO 680 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 680 - UFNCLU(I,KCLDS+1) = ALFA(I,KCLDS+1)*TDCL1(I,KCLDS+1) - DFNCLU(I,KCLDS+1) = TDCL1(I,KCLDS+1) -680 CONTINUE -!---THIS CALCULATION IS THE REVERSE OF THE RECURSION RELATION USED -! ABOVE - DO 691 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 691 - DO 690 KK=KCLDS,1,-1 - UFNCLU(I,KK) = UFNCLU(I,KK+1)*ALFAU(I,KK+1)/(ALFA(I,KK+1)* & - TCLU(I,KK)) - DFNCLU(I,KK) = UFNCLU(I,KK)/ALFA(I,KK) -690 CONTINUE -691 CONTINUE - DO 701 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 701 - DO 700 KK=1,KCLDS+1 - UFNTRN(I,KK) = UFNCLU(I,KK)*UFNTRN(I,KK) - DFNTRN(I,KK) = DFNCLU(I,KK)*DFNTRN(I,KK) -700 CONTINUE -701 CONTINUE -!---CASE OF KK=1( FROM THE GROUND TO THE BOTTOM OF THE LOWEST CLOUD) - DO 720 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 720 - J2=KBTMSW(I,2) - DO 710 K=J2,LP1 - UFN(I,K) = UFNTRN(I,1)*TTU(I,K) - DFN(I,K) = DFNTRN(I,1)*TTD(I,K) -710 CONTINUE -720 CONTINUE -!---REMAINING LEVELS (IF ANY!) - DO 760 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 760 - DO 755 KK=2,KCLDS+1 - J1=KTOPSW(I,KK) - J2=KBTMSW(I,KK+1) - IF (J1.EQ.1) GO TO 755 - DO 730 K=J2,J1 - UFN(I,K) = UFNTRN(I,KK)*TTU(I,K) - DFN(I,K) = DFNTRN(I,KK)*TTD(I,K) -730 CONTINUE -!---FOR THE THICK CLOUDS, THE FLUX DIVERGENCE THROUGH THE CLOUD -! LAYER IS ASSUMED TO BE CONSTANT. THE FLUX DERIVATIVE IS GIVEN BY -! TEMPF (FOR THE UPWARD FLUX) AND TEMPG (FOR THE DOWNWARD FLUX). - J3=KBTMSW(I,KK) - IF ((J3-J1).GT.1) THEN - TEMPF = (UFNCLU(I,KK)-UFN(I,J3))*DPCLD(I,KK-1) - TEMPG = (DFNCLU(I,KK)-DFN(I,J3))*DPCLD(I,KK-1) - DO 740 K=J1+1,J3-1 - UFN(I,K) = UFNCLU(I,KK)+TEMPF*(PP(I,K)-PPTOP(I,KK-1)) - DFN(I,K) = DFNCLU(I,KK)+TEMPG*(PP(I,K)-PPTOP(I,KK-1)) -740 CONTINUE - ENDIF -755 CONTINUE -760 CONTINUE - DO 770 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 770 - DO 771 K=1,LP1 - DFSWC(I,K) = DFN(I,K)*DFNTOP(I,1) - UFSWC(I,K) = UFN(I,K)*DFNTOP(I,1) -771 CONTINUE -770 CONTINUE - DO 780 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 780 - TMP1(I) = ONE - CCMAX(I) - GDFVB(I) = TMP1(I)*GDFVB(I) - GDFNB(I) = TMP1(I)*GDFNB(I) - GDFVD(I) = TMP1(I)*GDFVD(I) + CCMAX(I)*DFSWC(I,LP1) -780 CONTINUE -!---NOW OBTAIN FLUXES FOR THE NEAR IR BANDS. THE METHODS ARE THE SAME -! AS FOR THE VISIBLE BAND, EXCEPT THAT THE REFLECTION AND -! TRANSMISSION COEFFICIENTS ARE DIFFERENT, AS -! RAYLEIGH SCATTERING NEED NOT BE CONSIDERED. -! - DO 1000 N=2,NB -!YH93 - DO 791 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 791 - DO 790 K=1,KCLDS+1 - CR(I,K) = CRR(I,N,K)*XAMT(I,K) - CT(I,K) = ONE - (ONE-CTT(I,N,K))*XAMT(I,K) -790 CONTINUE -791 CONTINUE -!YH93 - IF (N.EQ.2) THEN -! THE WATER VAPOR TRANSMISSION FUNCTION FOR BAND 2 IS EQUAL TO -! THAT OF BAND 1 (SAVED AS TTDB1,TTUB1) - DO 800 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 800 - DO 801 KK=2,LP1 - TTD(I,KK) = TTDB1(I,KK)*TDCO2(I,KK) -801 CONTINUE - DO 802 KK=1,L - TTU(I,KK) = TTUB1(I,KK)*TUCO2(I,KK) -802 CONTINUE -800 CONTINUE - ELSE - DO 810 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 810 - DO 811 KK=2,LP1 - TTD(I,KK) = EXP(HM1EZ*MIN(FIFTY,ABCFF(N)*UD(I,KK))) & - * TDCO2(I,KK) -811 CONTINUE - DO 812 KK=1,L - TTU(I,KK) = EXP(HM1EZ*MIN(FIFTY,ABCFF(N)*UR(I,KK))) & - * TUCO2(I,KK) -812 CONTINUE -810 CONTINUE - ENDIF -!---AT THIS POINT,INCLUDE TTD(1),TTU(LP1), NOTING THAT TTD(1)=1 FOR -! ALL BANDS, AND THAT TTU(LP1)=TTD(LP1) FOR ALL BANDS. - DO 820 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 820 - TTU(I,LP1) = TTD(I,LP1) - TTD(I,1) = ONE -820 CONTINUE -!***FOR EXECUTION OF THE CLOUD LOOP, IT IS NECESSARY TO SEPARATE OUT -! TRANSMISSION FCTNS AT THE TOP AND BOTTOM OF THE CLOUDS, FOR -! EACH BAND N. THE REQUIRED QUANTITIES ARE: -! TTD(I,KTOPSW(I,K),N) K RUNS FROM 1 TO NCLDS(I)+1: -! TTD(I,KBTMSW(I,K),N) K RUNS FROM 2 TO NCLDS(I)+1: -! TTU(I,KTOPSW(I,K),N) K RUNS FROM 1 TO NCLDS(I)+1: -! AND INVERSES OF THE ABOVE. THE ABOVE QUANTITIES ARE STORED -! IN TDCL1,TDCL2,TUCL1,AND DFNTRN,UFNTRN,RESPECTIVELY, AS -! THEY HAVE MULTIPLE USE IN THE PGM. -!---FOR FIRST CLOUD LAYER (GROUND) TDCL1,TUCL1 ARE KNOWN: - DO 830 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 830 - TDCL1 (I,1) = TTD(I,LP1) - TUCL1 (I,1) = TTU(I,LP1) - TDCL2 (I,1) = TDCL1(I,1) - DFNTRN(I,1) = ONE/TDCL1(I,1) - UFNTRN(I,1) = DFNTRN(I,1) -830 CONTINUE - DO 841 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 841 - DO 840 KK=2,KCLDS+1 - TDCL1(I,KK) = TTD(I,KTOPSW(I,KK)) - TUCL1(I,KK) = TTU(I,KTOPSW(I,KK)) - TDCL2(I,KK) = TTD(I,KBTMSW(I,KK)) -840 CONTINUE -841 CONTINUE - DO 851 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 851 - DO 850 KK=2,KCLDS+1 - DFNTRN(I,KK) = ONE/TDCL1(I,KK) - UFNTRN(I,KK) = ONE/TUCL1(I,KK) -850 CONTINUE -851 CONTINUE - DO 861 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 861 - DO 860 KK=1,KCLDS - TCLU(I,KK) = TDCL1(I,KK)*DFNTRN(I,KK+1)*CT(I,KK+1) - TCLD(I,KK) = TDCL1(I,KK)/TDCL2(I,KK+1) -860 CONTINUE -861 CONTINUE -!***THE FOLLOWING IS THE RECURSION RELATION FOR ALFA: THE REFLECTION -! COEFFICIENT FOR A SYSTEM INCLUDING THE CLOUD IN QUESTION AND THE -! FLUX COMING OUT OF THE CLOUD SYSTEM INCLUDING ALL CLOUDS BELOW -! THE CLOUD IN QUESTION. - DO 870 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 870 - ALFA (I,1) = CR(I,1) - ALFAU(I,1) = ZERO -870 CONTINUE -!---AGAIN,EXCESSIVE CALCULATIONS-MAY BE CHANGED LATER! - DO 881 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 881 - DO 880 KK=2,KCLDS+1 - ALFAU(I,KK) = TCLU(I,KK-1)*TCLU(I,KK-1)*ALFA(I,KK-1)/(ONE - & - TCLD(I,KK-1)*TCLD(I,KK-1)*ALFA(I,KK-1)*CR(I,KK)) - ALFA (I,KK) = ALFAU(I,KK)+CR(I,KK) -880 CONTINUE -881 CONTINUE -! CALCULATE UFN AT CLOUD TOPS AND DFN AT CLOUD BOTTOMS -!---NOTE THAT UFNCLU(I,KCLDS+1) GIVES THE UPWARD FLUX AT THE TOP -! OF THE HIGHEST REAL CLOUD (IF NCLDS(I)=KCLDS). IT GIVES THE FLUX -! AT THE TOP OF THE ATMOSPHERE IF NCLDS(I) < KCLDS. IT THE FIRST -! CASE, TDCL1 EQUALS THE TRANSMISSION FCTN TO THE TOP OF THE -! HIGHEST CLOUD, AS WE WANT. IN THE SECOND CASE, TDCL1=1, SO UFNCLU -! EQUALS ALFA. THIS IS ALSO CORRECT. - DO 890 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 890 - UFNCLU(I,KCLDS+1) = ALFA(I,KCLDS+1)*TDCL1(I,KCLDS+1) - DFNCLU(I,KCLDS+1) = TDCL1(I,KCLDS+1) -890 CONTINUE - DO 901 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 901 - DO 900 KK=KCLDS,1,-1 -! -!*** ACCOUNT FOR UNREALISTICALLY SMALL CLOUD AMOUNT -! - DENOM=ALFA(I,KK+1)*TCLU(I,KK) - IF(DENOM.GT.RTHRESH)THEN - UFNCLU(I,KK)=UFNCLU(I,KK+1)*ALFAU(I,KK+1)/DENOM - ELSE - UFNCLU(I,KK)=0. - ENDIF - IF(ALFA(I,KK).GT.RTHRESH)THEN - DFNCLU(I,KK)=UFNCLU(I,KK)/ALFA(I,KK) - ELSE - DFNCLU(I,KK)=0. - ENDIF -900 CONTINUE -901 CONTINUE -! NOW OBTAIN DFN AND UFN FOR LEVELS BETWEEN THE CLOUDS - DO 911 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 911 - DO 910 KK=1,KCLDS+1 - UFNTRN(I,KK) = UFNCLU(I,KK)*UFNTRN(I,KK) - DFNTRN(I,KK) = DFNCLU(I,KK)*DFNTRN(I,KK) -910 CONTINUE -911 CONTINUE - DO 930 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 930 - J2=KBTMSW(I,2) - DO 920 K=J2,LP1 - UFN(I,K) = UFNTRN(I,1)*TTU(I,K) - DFN(I,K) = DFNTRN(I,1)*TTD(I,K) -920 CONTINUE -930 CONTINUE - DO 970 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 970 - DO 965 KK=2,KCLDS+1 - J1 = KTOPSW(I,KK) - J2 = KBTMSW(I,KK+1) - IF (J1.EQ.1) GO TO 965 - DO 940 K=J2,J1 - UFN(I,K) = UFNTRN(I,KK)*TTU(I,K) - DFN(I,K) = DFNTRN(I,KK)*TTD(I,K) -940 CONTINUE - J3 = KBTMSW(I,KK) - IF ((J3-J1).GT.1) THEN - TEMPF = (UFNCLU(I,KK)-UFN(I,J3))*DPCLD(I,KK-1) - TEMPG = (DFNCLU(I,KK)-DFN(I,J3))*DPCLD(I,KK-1) - DO 950 K=J1+1,J3-1 - UFN(I,K) = UFNCLU(I,KK)+TEMPF*(PP(I,K)-PPTOP(I,KK-1)) - DFN(I,K) = DFNCLU(I,KK)+TEMPG*(PP(I,K)-PPTOP(I,KK-1)) -950 CONTINUE - ENDIF -965 CONTINUE -970 CONTINUE - DO 980 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 980 - DO 981 K=1,LP1 - DFSWC(I,K) = DFSWC(I,K) + DFN(I,K)*DFNTOP(I,N) - UFSWC(I,K) = UFSWC(I,K) + UFN(I,K)*DFNTOP(I,N) -981 CONTINUE -980 CONTINUE - DO 990 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 990 - GDFND(I) = GDFND(I) + CCMAX(I)*DFN(I,LP1)*DFNTOP(I,N) -990 CONTINUE -1000 CONTINUE - DO 1100 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 1100 - DO 1101 K=1,LP1 - DFSWC(I,K) = TMP1(I)*DFSWL(I,K) + CCMAX(I)*DFSWC(I,K) - UFSWC(I,K) = TMP1(I)*UFSWL(I,K) + CCMAX(I)*UFSWC(I,K) -1101 CONTINUE -1100 CONTINUE - DO 1200 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 1200 - DO 1201 KK=1,LP1 - FSWC(I,KK) = UFSWC(I,KK)-DFSWC(I,KK) -1201 CONTINUE -1200 CONTINUE - DO 1250 I=MYIS,MYIE - KCLDS=NCLDS(I) - IF(KCLDS.EQ.0) GO TO 1250 - DO 1251 KK=1, L - HSWC(I,KK) = RADCON*(FSWC(I,KK+1)-FSWC(I,KK))/DP(I,KK) -1251 CONTINUE -1250 CONTINUE - - END SUBROUTINE SWR93 -!----------------------------------------------------------------------- - - SUBROUTINE RADFS & - -! ***************************************************************** -! * * -! * THE INTERNAL DRIVE FOR GFDL RADIATION * -! * THIS SUBROUTINE WAS FROM Y.H AND K.A.C (1993) * -! * AND MODIFIED BY Q. ZHAO FOR USE IN THE ETA MODEL * -! * NOV. 18, 1993 * -! * * -! * UPDATE: THIS SUBROUTINE WAS MODIFIED TO USE CLOUD FRACTION * -! * ON EACH MODEL LAYER. * -! * QINGYUN ZHAO 95-3-22 * -! * * -! * UPDATE: R1 HAS BEEN ADDED TO THE INPUTS FROM RADTN TO * -! * COMPUTE THE VARIATION OF SOLAR CONSTANT AT THE TOP * -! * OF ATMOSPHERE WITH JULIAN DAY IN A YEAR. * -! * QINGYUN ZHAO 96-7-23 * -! ***************************************************************** -!*** -!*** REQUIRED INPUT: -!*** - (QS,PP,PPI,QQH2O,TT,O3QO3,TSFC,SLMSK,ALBEDO,XLAT & - , CAMT,KTOP,KBTM,NCLDS,EMCLD,RRCL,TTCL & - , COSZRO,TAUDAR,IBEG & - , KO3,KALB & - , ITIMSW,ITIMLW & -!*************************************************************************** -!* IX IS THE LENGTH OF A ROW IN THE DOMAIN -! -!* QS(IX): THE SURFACE PRESSURE (PA) -!* PP(IX,L): THE MIDLAYER PRESSURES (PA) (L IS THE VERT. DIMEN.) -!* PPI(IX,LP1) THE INTERFACE PRESSURES (PA) -!* QQH2O(IX,L): THE MIDLAYER WATER VAPOR MIXING RATIO (KG/KG) -!* TT(IX,L): THE MIDLAYER TEMPERATURE (K) -!* O3QO3(IX,L): THE MIDLAYER OZONE MIXING RATIO -!* TSFC(IX): THE SKIN TEMP. (K); NEGATIVE OVER WATER -!* SLMSK(IX): THE SEA MASK (LAND=0,SEA=1) -!* ALBEDO(IX): THE SURFACE ALBEDO (EXPRESSED AS A FRACTION) -!* XLAT(IX): THE GEODETIC LATITUDES OF EACH COLUMN IN DEGREES -!* (N.H.> 0) -!* THE FOLLOWING ARE CLOUD INFORMATION FOR EACH CLOUD LAYER -!* LAYER=1:SURFACE -!* LAYER=2:FIRST LAYER ABOVE GROUND, AND SO ON -!* CAMT(IX,LP1): CLOUD FRACTION OF EACH CLOUD LAYER -!* ITYP(IX,LP1): CLOUD TYPE(=1: STRATIFORM, =2:CONVECTIVE) -!* KTOP(IX,LP1): HEIGHT OF CLOUD TOP OF EACH CLOUD LAYER (IN ETA LEVEL) -!* KBTM(IX,LP1): BOTTOM OF EACH CLOUD LAYER -!* NCLDS(IX): NUMBER OF CLOUD LAYERS -!* EMCLD(IX,LP1): CLOUD EMISSIVITY -!* RRCL(IX,NB,LP1) CLOUD REFLECTTANCES FOR SW SPECTRAL BANDS -!* TTCL(IX,NB,LP1) CLOUD TRANSMITANCES FOR SW SPECTRAL BANDS -!* THE ABOVE ARE CLOUD INFORMATION FOR EACH CLOUD LAYER -!* -!* COSZRO(IX): THE COSINE OF THE SOLAR ZENITH ANGLE -!* TAUDAR: =1.0 -!* IBEG: =1 -!* KO3: =1 ( READ IN THE QZONE DATA) -!* KALB: =0 -!* SLMRF(LP1): THE INTERFACE'S ETA (LP1=L+1) -!* SLYMRF(L): THE MIDLAYER ETA -!* ITIMSW: =1/0 (SHORTWAVE CALC. ARE DESIRED/NOT DESIRED) -!* ITIMLW: =1/0 (LONGWAVE CALC. ARE DESIRED/NOT DESIRED) -!************************************************************************ -!*** -!*** THE FOLLOWING ARE ADDITIONAL FOR ETA MODEL -!*** - , JD,GMT & -!************************************************************************** -!* JD: JULIAN DAY IN A YEAR -!* R1: THE NON-DIMENSIONAL SUN-EARTH DISTANCE -!* GMT:HOUR -!************************************************************************** -!*** -!*** GENERATED OUTPUT REQUIRED BY THE ETA MODEL -!*** - , SWH,HLW & -! , T1,T2,T4,EM1V,EM1VW,EM3V & - , FLWUP,FSWUP,FSWDN,FSWDNS,FSWUPS,FLWDNS,FLWUPS & -! , DDUO3N,DDO3N2,DDO3N3,DDO3N4 & -! , SKO3R,AB15WD,SKC1R,SKO2D & - , ids,ide, jds,jde, kds,kde & - , ims,ime, jms,jme, kms,kme & - , its,ite, jts,jte, kts,kte ) -!************************************************************************ -!* SWH: ATMOSPHERIC SHORTWAVE HEATING RATES IN K/S. -!* SWH IS A REAL ARRAY DIMENSIONED (NCOL X LM). -!* HLW: ATMOSPHERIC LONGWAVE HEATING RATES IN K/S. -!* HLW IS A REAL ARRAY DIMENSIONED (NCOL X LM). -!* FLWUP: UPWARD LONGWAVE FLUX AT TOP OF THE ATMOSPHERE IN W/M**2. -!* FLWUP IS A REAL ARRAY DIMENSIONED (NCOL). -!* FSWUP: UPWARD SHORTWAVE FLUX AT TOP OF THE ATMOSPHERE IN W/M**2. -!* FSWUP IS A REAL ARRAY DIMENSIONED (NCOL). -!* FSWDN: DOWNWARD SHORTWAVE FLUX AT TOP OF THE ATMOSPHERE IN W/M**2. -!* FSWDN IS A REAL ARRAY DIMENSIONED (NCOL). -!* FSWDNS: DOWNWARD SHORTWAVE FLUX AT THE SURFACE IN W/M**2. -!* FSWDNS IS A REAL ARRAY DIMENSIONED (NCOL). -!* FSWUPS: UPWARD SHORTWAVE FLUX AT THE SURFACE IN W/M**2. -!* FSWUPS IS A REAL ARRAY DIMENSIONED (NCOL). -!* FLWDNS: DOWNWARD LONGWAVE FLUX AT THE SURFACE IN W/M**2. -!* FLWDNS IS A REAL ARRAY DIMENSIONED (NCOL). -!* FLWUPS: UPWARD LONGWAVE FLUX AT THE SURFACE IN W/M**2. -!* FLWUPS IS A REAL ARRAY DIMENSIONED (NCOL). -!************************************************************************ -!*** -!*** THE FOLLOWING OUTPUTS ARE NOT REQUIRED BY THE ETA MODEL -!*** -!---------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- -!INTEGER, PARAMETER :: NBLY=15 - INTEGER, PARAMETER :: NB=12 - INTEGER, PARAMETER :: NBLX=47 - INTEGER , PARAMETER:: NBLW = 163 - - REAL,PARAMETER :: AMOLWT=28.9644 - REAL,PARAMETER :: CSUBP=1.00484E7 - REAL,PARAMETER :: DIFFCTR=1.66 - REAL,PARAMETER :: G=980.665 - REAL,PARAMETER :: GINV=1./G - REAL,PARAMETER :: GRAVDR=980.0 - REAL,PARAMETER :: O3DIFCTR=1.90 - REAL,PARAMETER :: P0=1013250. - REAL,PARAMETER :: P0INV=1./P0 - REAL,PARAMETER :: GP0INV=GINV*P0INV - REAL,PARAMETER :: P0XZP2=202649.902 - REAL,PARAMETER :: P0XZP8=810600.098 - REAL,PARAMETER :: P0X2=2.*1013250. - REAL,PARAMETER :: RADCON=8.427 - REAL,PARAMETER :: RADCON1=1./8.427 - REAL,PARAMETER :: RATCO2MW=1.519449738 - REAL,PARAMETER :: RATH2OMW=.622 - REAL,PARAMETER :: RGAS=8.3142E7 - REAL,PARAMETER :: RGASSP=8.31432E7 - REAL,PARAMETER :: SECPDA=8.64E4 -! -!******THE FOLLOWING ARE MATHEMATICAL CONSTANTS******* -! ARRANGED IN DECREASING ORDER - REAL,PARAMETER :: HUNDRED=100. - REAL,PARAMETER :: HNINETY=90. - REAL,PARAMETER :: HNINE=9.0 - REAL,PARAMETER :: SIXTY=60. - REAL,PARAMETER :: FIFTY=50. - REAL,PARAMETER :: TEN=10. - REAL,PARAMETER :: EIGHT=8. - REAL,PARAMETER :: FIVE=5. - REAL,PARAMETER :: FOUR=4. - REAL,PARAMETER :: THREE=3. - REAL,PARAMETER :: TWO=2. - REAL,PARAMETER :: ONE=1. - REAL,PARAMETER :: HAF=0.5 - REAL,PARAMETER :: QUARTR=0.25 - REAL,PARAMETER :: ZERO=0. -! -!******FOLLOWING ARE POSITIVE FLOATING POINT CONSTANTS(H'S) -! ARRANGED IN DECREASING ORDER - REAL,PARAMETER :: H83E26=8.3E26 - REAL,PARAMETER :: H71E26=7.1E26 - REAL,PARAMETER :: H1E15=1.E15 - REAL,PARAMETER :: H1E13=1.E13 - REAL,PARAMETER :: H1E11=1.E11 - REAL,PARAMETER :: H1E8=1.E8 - REAL,PARAMETER :: H2E6=2.0E6 - REAL,PARAMETER :: H1E6=1.0E6 - REAL,PARAMETER :: H69766E5=6.97667E5 - REAL,PARAMETER :: H4E5=4.E5 - REAL,PARAMETER :: H165E5=1.65E5 - REAL,PARAMETER :: H5725E4=57250. - REAL,PARAMETER :: H488E4=48800. - REAL,PARAMETER :: H1E4=1.E4 - REAL,PARAMETER :: H24E3=2400. - REAL,PARAMETER :: H20788E3=2078.8 - REAL,PARAMETER :: H2075E3=2075. - REAL,PARAMETER :: H18E3=1800. - REAL,PARAMETER :: H1224E3=1224. - REAL,PARAMETER :: H67390E2=673.9057 - REAL,PARAMETER :: H5E2=500. - REAL,PARAMETER :: H3082E2=308.2 - REAL,PARAMETER :: H3E2=300. - REAL,PARAMETER :: H2945E2=294.5 - REAL,PARAMETER :: H29316E2=293.16 - REAL,PARAMETER :: H26E2=260.0 - REAL,PARAMETER :: H25E2=250. - REAL,PARAMETER :: H23E2=230. - REAL,PARAMETER :: H2E2=200.0 - REAL,PARAMETER :: H15E2=150. - REAL,PARAMETER :: H1386E2=138.6 - REAL,PARAMETER :: H1036E2=103.6 - REAL,PARAMETER :: H8121E1=81.21 - REAL,PARAMETER :: H35E1=35. - REAL,PARAMETER :: H3116E1=31.16 - REAL,PARAMETER :: H28E1=28. - REAL,PARAMETER :: H181E1=18.1 - REAL,PARAMETER :: H18E1=18. - REAL,PARAMETER :: H161E1=16.1 - REAL,PARAMETER :: H16E1=16. - REAL,PARAMETER :: H1226E1=12.26 - REAL,PARAMETER :: H9P94=9.94 - REAL,PARAMETER :: H6P08108=6.081081081 - REAL,PARAMETER :: H3P6=3.6 - REAL,PARAMETER :: H3P5=3.5 - REAL,PARAMETER :: H2P9=2.9 - REAL,PARAMETER :: H2P8=2.8 - REAL,PARAMETER :: H2P5=2.5 - REAL,PARAMETER :: H1P8=1.8 - REAL,PARAMETER :: H1P4387=1.4387 - REAL,PARAMETER :: H1P41819=1.418191 - REAL,PARAMETER :: H1P4=1.4 - REAL,PARAMETER :: H1P25892=1.258925411 - REAL,PARAMETER :: H1P082=1.082 - REAL,PARAMETER :: HP816=0.816 - REAL,PARAMETER :: HP805=0.805 - REAL,PARAMETER :: HP8=0.8 - REAL,PARAMETER :: HP60241=0.60241 - REAL,PARAMETER :: HP602409=0.60240964 - REAL,PARAMETER :: HP6=0.6 - REAL,PARAMETER :: HP526315=0.52631579 - REAL,PARAMETER :: HP518=0.518 - REAL,PARAMETER :: HP5048=0.5048 - REAL,PARAMETER :: HP3795=0.3795 - REAL,PARAMETER :: HP369=0.369 - REAL,PARAMETER :: HP26=0.26 - REAL,PARAMETER :: HP228=0.228 - REAL,PARAMETER :: HP219=0.219 - REAL,PARAMETER :: HP166666=.166666 - REAL,PARAMETER :: HP144=0.144 - REAL,PARAMETER :: HP118666=0.118666192 - REAL,PARAMETER :: HP1=0.1 -! (NEGATIVE EXPONENTIALS BEGIN HERE) - REAL,PARAMETER :: H658M2=0.0658 - REAL,PARAMETER :: H625M2=0.0625 - REAL,PARAMETER :: H44871M2=4.4871E-2 - REAL,PARAMETER :: H44194M2=.044194 - REAL,PARAMETER :: H42M2=0.042 - REAL,PARAMETER :: H41666M2=0.0416666 - REAL,PARAMETER :: H28571M2=.02857142857 - REAL,PARAMETER :: H2118M2=0.02118 - REAL,PARAMETER :: H129M2=0.0129 - REAL,PARAMETER :: H1M2=.01 - REAL,PARAMETER :: H559M3=5.59E-3 - REAL,PARAMETER :: H3M3=0.003 - REAL,PARAMETER :: H235M3=2.35E-3 - REAL,PARAMETER :: H1M3=1.0E-3 - REAL,PARAMETER :: H987M4=9.87E-4 - REAL,PARAMETER :: H323M4=0.000323 - REAL,PARAMETER :: H3M4=0.0003 - REAL,PARAMETER :: H285M4=2.85E-4 - REAL,PARAMETER :: H1M4=0.0001 - REAL,PARAMETER :: H75826M4=7.58265E-4 - REAL,PARAMETER :: H6938M5=6.938E-5 - REAL,PARAMETER :: H394M5=3.94E-5 - REAL,PARAMETER :: H37412M5=3.7412E-5 - REAL,PARAMETER :: H15M5=1.5E-5 - REAL,PARAMETER :: H1439M5=1.439E-5 - REAL,PARAMETER :: H128M5=1.28E-5 - REAL,PARAMETER :: H102M5=1.02E-5 - REAL,PARAMETER :: H1M5=1.0E-5 - REAL,PARAMETER :: H7M6=7.E-6 - REAL,PARAMETER :: H4999M6=4.999E-6 - REAL,PARAMETER :: H451M6=4.51E-6 - REAL,PARAMETER :: H25452M6=2.5452E-6 - REAL,PARAMETER :: H1M6=1.E-6 - REAL,PARAMETER :: H391M7=3.91E-7 - REAL,PARAMETER :: H1174M7=1.174E-7 - REAL,PARAMETER :: H8725M8=8.725E-8 - REAL,PARAMETER :: H327M8=3.27E-8 - REAL,PARAMETER :: H257M8=2.57E-8 - REAL,PARAMETER :: H1M8=1.0E-8 - REAL,PARAMETER :: H23M10=2.3E-10 - REAL,PARAMETER :: H14M10=1.4E-10 - REAL,PARAMETER :: H11M10=1.1E-10 - REAL,PARAMETER :: H1M10=1.E-10 - REAL,PARAMETER :: H83M11=8.3E-11 - REAL,PARAMETER :: H82M11=8.2E-11 - REAL,PARAMETER :: H8M11=8.E-11 - REAL,PARAMETER :: H77M11=7.7E-11 - REAL,PARAMETER :: H72M11=7.2E-11 - REAL,PARAMETER :: H53M11=5.3E-11 - REAL,PARAMETER :: H48M11=4.8E-11 - REAL,PARAMETER :: H44M11=4.4E-11 - REAL,PARAMETER :: H42M11=4.2E-11 - REAL,PARAMETER :: H37M11=3.7E-11 - REAL,PARAMETER :: H35M11=3.5E-11 - REAL,PARAMETER :: H32M11=3.2E-11 - REAL,PARAMETER :: H3M11=3.0E-11 - REAL,PARAMETER :: H28M11=2.8E-11 - REAL,PARAMETER :: H24M11=2.4E-11 - REAL,PARAMETER :: H23M11=2.3E-11 - REAL,PARAMETER :: H2M11=2.E-11 - REAL,PARAMETER :: H18M11=1.8E-11 - REAL,PARAMETER :: H15M11=1.5E-11 - REAL,PARAMETER :: H14M11=1.4E-11 - REAL,PARAMETER :: H114M11=1.14E-11 - REAL,PARAMETER :: H11M11=1.1E-11 - REAL,PARAMETER :: H1M11=1.E-11 - REAL,PARAMETER :: H96M12=9.6E-12 - REAL,PARAMETER :: H93M12=9.3E-12 - REAL,PARAMETER :: H77M12=7.7E-12 - REAL,PARAMETER :: H74M12=7.4E-12 - REAL,PARAMETER :: H65M12=6.5E-12 - REAL,PARAMETER :: H62M12=6.2E-12 - REAL,PARAMETER :: H6M12=6.E-12 - REAL,PARAMETER :: H45M12=4.5E-12 - REAL,PARAMETER :: H44M12=4.4E-12 - REAL,PARAMETER :: H4M12=4.E-12 - REAL,PARAMETER :: H38M12=3.8E-12 - REAL,PARAMETER :: H37M12=3.7E-12 - REAL,PARAMETER :: H3M12=3.E-12 - REAL,PARAMETER :: H29M12=2.9E-12 - REAL,PARAMETER :: H28M12=2.8E-12 - REAL,PARAMETER :: H24M12=2.4E-12 - REAL,PARAMETER :: H21M12=2.1E-12 - REAL,PARAMETER :: H16M12=1.6E-12 - REAL,PARAMETER :: H14M12=1.4E-12 - REAL,PARAMETER :: H12M12=1.2E-12 - REAL,PARAMETER :: H8M13=8.E-13 - REAL,PARAMETER :: H46M13=4.6E-13 - REAL,PARAMETER :: H36M13=3.6E-13 - REAL,PARAMETER :: H135M13=1.35E-13 - REAL,PARAMETER :: H12M13=1.2E-13 - REAL,PARAMETER :: H1M13=1.E-13 - REAL,PARAMETER :: H3M14=3.E-14 - REAL,PARAMETER :: H15M14=1.5E-14 - REAL,PARAMETER :: H14M14=1.4E-14 -! -!******FOLLOWING ARE NEGATIVE FLOATING POINT CONSTANTS (HM'S) -! ARRANGED IN DESCENDING ORDER - REAL,PARAMETER :: HM2M2=-.02 - REAL,PARAMETER :: HM6666M2=-.066667 - REAL,PARAMETER :: HMP5=-0.5 - REAL,PARAMETER :: HMP575=-0.575 - REAL,PARAMETER :: HMP66667=-.66667 - REAL,PARAMETER :: HMP805=-0.805 - REAL,PARAMETER :: HM1EZ=-1. - REAL,PARAMETER :: HM13EZ=-1.3 - REAL,PARAMETER :: HM19EZ=-1.9 - REAL,PARAMETER :: HM1E1=-10. - REAL,PARAMETER :: HM1597E1=-15.97469413 - REAL,PARAMETER :: HM161E1=-16.1 - REAL,PARAMETER :: HM1797E1=-17.97469413 - REAL,PARAMETER :: HM181E1=-18.1 - REAL,PARAMETER :: HM8E1=-80. - REAL,PARAMETER :: HM1E2=-100. -! - REAL,PARAMETER :: H1M16=1.0E-16 - REAL,PARAMETER :: H1M20=1.E-20 - REAL,PARAMETER :: HP98=0.98 - REAL,PARAMETER :: Q19001=19.001 - REAL,PARAMETER :: DAYSEC=1.1574E-5 - REAL,PARAMETER :: HSIGMA=5.673E-5 - REAL,PARAMETER :: TWENTY=20.0 - REAL,PARAMETER :: HP537=0.537 - REAL,PARAMETER :: HP2=0.2 - REAL,PARAMETER :: RCO2=3.3E-4 - REAL,PARAMETER :: Q14330=1.43306E-6 - REAL,PARAMETER :: H3M6=3.0E-6 - REAL,PARAMETER :: PI=3.1415927 - REAL,PARAMETER :: DEGRAD=180.0/PI - REAL,PARAMETER :: H74E1=74.0 - REAL,PARAMETER :: H15E1=15.0 - - REAL, PARAMETER:: B0 = -.51926410E-4 - REAL, PARAMETER:: B1 = -.18113332E-3 - REAL, PARAMETER:: B2 = -.10680132E-5 - REAL, PARAMETER:: B3 = -.67303519E-7 - REAL, PARAMETER:: AWIDE = 0.309801E+01 - REAL, PARAMETER:: BWIDE = 0.495357E-01 - REAL, PARAMETER:: BETAWD = 0.347839E+02 - REAL, PARAMETER:: BETINW = 0.766811E+01 - - - INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & - ims,ime, jms,jme, kms,kme , & - its,ite, jts,jte, kts,kte - INTEGER, INTENT(IN) :: IBEG,KO3,KALB,ITIMSW,ITIMLW,JD - REAL, INTENT(IN) :: GMT -!---------------------------------------------------------------------- -! **************************************************************** -! * GENERALIZED FOR PLUG-COMPATIBILITY - * -! * ORIGINAL CODE WAS CLEANED-UP GFDL CODE...K.CAMPANA MAR89..* -!......* EXAMPLE FOR MRF: * -! * KO3 =0 AND O3QO3=DUMMY ARRAY. (GFDL CLIMO O3 USED) * -! * KEMIS=0 AND HI CLD EMIS COMPUTED HERE (CEMIS=DUMMY INPUT)* -! * KALB =0 AND SFC ALBEDO OVER OPEN WATER COMPUTED BELOW... * -! * KCCO2=0,CO2 OBTAINED FROM BLOCK DATA * -! * =1,CO2 COMPUTED IN HERE --- NOT AVAILABLE YET... * -! * SLMRF = INTERFACE (LEVELS) SIGMA * -! * SLYMRF= LAYER SIGMA * -! * UPDATED FOR YUTAI HOU SIB SW RADIATION....KAC 6 MAR 92 * -! * OCEAN ALBEDO FOR BEAM SET TO BULK SFCALB, SINCE * -! * COSINE ZENITH ANGLE EFFECTS ALREADY THERE(REF:PAYNE) * -! * SLMSK = 0. * -! * SNOW ICE ALBEDO FOR BEAM NOT ENHANCED VIA COSINE ZENITH * -! * ANGLE EITHER CAUSE VALU ALREADY HIGH (WE SEE POLAR * -! * COOLING IF WE DO BEAM CALCULATION)....KAC 17MAR92 * -! * ALBEDO GE .5 * -! * UPDATED TO OBTAIN CLEAR SKY FLUXES "ON THE FLY" FOR * -! * CLOUD FORCING DIAGNOSTICS ELSEWHERE...KAC 7AUG92 * -! * SEE ##CLR LINES...RADFS,LWR88,FST88,SPA88 ....... * -! * UPDATED FOR USE NEW CLD SCHEME ......YH DEC 92 * -! * INPUT CLD MAY BE AS ORIGINAL IN 3 DOMAIN (CLD,MTOP,MBOT) * -! * OR IN A VERTICAL ARRAY OF 18 MDL LAYERS (CLDARY) * -! * IEMIS=0 USE THE ORG. CLD EMIS SCHEME * -! * =1 USE TEMP DEP. CLD EMIS SCHEME * -! * UPDATED TO COMPUTE CLD LAYER REFLECTTANCE AND TRANSMITTANCE * -! * INPUT CLD EMISSIVITY AND OPTICAL THICKNESS 'EMIS0,TAUC0' * -! * ......YH FEB 93 * -! **************************************************************** -!-------------------------------- -! INTEGER, PARAMETER:: LNGTH=37*kte -!-------------------------------- - -! REAL, INTENT(IN) :: SKO3R,AB15WD,SKC1R,SKO2D - - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte):: PP,TT - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte):: QQH2O - REAL, INTENT(IN), DIMENSION(its:ite,kts:kte+1):: PPI,CAMT,EMCLD - REAL, INTENT(IN), DIMENSION(its:ite):: QS,TSFC,SLMSK,ALBEDO,XLAT - REAL, INTENT(IN), DIMENSION(its:ite):: COSZRO,TAUDAR - REAL, INTENT(OUT), DIMENSION(its:ite):: FLWUPS - INTEGER, INTENT(IN), DIMENSION(its:ite):: NCLDS - INTEGER, INTENT(IN), DIMENSION(its:ite,kts:kte+1):: KTOP,KBTM - REAL, INTENT(INOUT), DIMENSION(its:ite,NB,kts:kte+1):: TTCL,RRCL - REAL, intent(IN), DIMENSION(its:ite,kts:kte):: O3QO3 -! REAL, INTENT(IN), DIMENSION(5040):: T1,T2,T4,EM1V,EM1VW -! REAL, INTENT(IN), DIMENSION(5040) :: EM3V - -! REAL, DIMENSION(its:ite)::ALVBR,ALNBR, ALVDR,ALNDR - -! TABLE ??? - - REAL, DIMENSION(3) :: BO3RND,AO3RND - REAL, DIMENSION(NBLY) :: APCM,BPCM,ATPCM,BTPCM,ACOMB, & - BCOMB,BETACM - - DATA AO3RND / 0.543368E+02, 0.234676E+04, 0.384881E+02/ - DATA BO3RND / 0.526064E+01, 0.922424E+01, 0.496515E+01/ - - DATA ACOMB / & - 0.152070E+05, 0.332194E+04, 0.527177E+03, 0.163124E+03, & - 0.268808E+03, 0.534591E+02, 0.268071E+02, 0.123133E+02, & - 0.600199E+01, 0.640803E+00, 0.501549E-01, 0.167961E-01, & - 0.178110E-01, 0.170166E+00, 0.537083E-02/ - DATA BCOMB / & - 0.152538E+00, 0.118677E+00, 0.103660E+00, 0.100119E+00, & - 0.127518E+00, 0.118409E+00, 0.904061E-01, 0.642011E-01, & - 0.629660E-01, 0.643346E-01, 0.717082E-01, 0.629730E-01, & - 0.875182E-01, 0.857907E-01, 0.214005E+00/ - DATA APCM / & - -0.671879E-03, 0.654345E-02, 0.143657E-01, 0.923593E-02, & - 0.117022E-01, 0.159596E-01, 0.181600E-01, 0.145013E-01, & - 0.170062E-01, 0.233303E-01, 0.256735E-01, 0.274745E-01, & - 0.279259E-01, 0.197002E-01, 0.349782E-01/ - DATA BPCM / & - -0.113520E-04, -0.323965E-04, -0.448417E-04, -0.230779E-04, & - -0.361981E-04, -0.145117E-04, 0.198349E-04, -0.486529E-04, & - -0.550050E-04, -0.684057E-04, -0.447093E-04, -0.778390E-04, & - -0.982953E-04, -0.772497E-04, -0.748263E-04/ - DATA ATPCM / & - -0.106346E-02, 0.641531E-02, 0.137362E-01, 0.922513E-02, & - 0.136162E-01, 0.169791E-01, 0.206959E-01, 0.166223E-01, & - 0.171776E-01, 0.229724E-01, 0.275530E-01, 0.302731E-01, & - 0.281662E-01, 0.199525E-01, 0.370962E-01/ - DATA BTPCM / & - -0.735731E-05, -0.294149E-04, -0.505592E-04, -0.280894E-04, & - -0.492972E-04, -0.341508E-04, -0.362947E-04, -0.250487E-04, & - -0.521369E-04, -0.746260E-04, -0.744124E-04, -0.881905E-04, & - -0.933645E-04, -0.664045E-04, -0.115290E-03/ - DATA BETACM / & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.188625E+03, 0.144293E+03, 0.174098E+03, 0.909366E+02, & - 0.497489E+02, 0.221212E+02, 0.113124E+02, 0.754174E+01, & - 0.589554E+01, 0.495227E+01, 0.000000E+00/ - - -! ********************************************* -!====> * OUTPUT TO CALLING PROGRAM * -! ********************************************* - - REAL, INTENT(INOUT),DIMENSION(its:ite,kts:kte)::SWH,HLW - REAL, INTENT(OUT), DIMENSION(its:ite):: FSWUP,FSWUPS,FSWDN, & - FSWDNS,FLWUP,FLWDNS - -! ********************************************* -!====> * POSSIBLE OUTPUT TO CALLING PROGRAM * -! ********************************************* - - REAL, DIMENSION(its:ite):: GDFVBR,GDFNBR,GDFVDR,GDFNDR - -! ************************************************************ -!====> * ARRAYS NEEDED BY SWR91SIB..FOR CLEAR SKY DATA(EG.FSWL) * -! ************************************************************ - - REAL, DIMENSION(its:ite,kts:kte+1)::FSWL,HSWL,UFL,DFL - -! ****************************************************** -!====> * ARRAYS NEEDED BY CLO88, LWR88, SWR89 OR SWR91SIB * -! ****************************************************** - - REAL, DIMENSION(its:ite,kts:kte+1,kts:kte+1)::CLDFAC - REAL, DIMENSION(its:ite,kts:kte+1)::EQCMT,PRESS,TEMP,FSW,HSW,UF,DF - REAL, DIMENSION(its:ite,kts:kte)::RH2O,QO3,HEATRA - REAL, DIMENSION(its:ite):: COSZEN,TAUDA,GRNFLX,TOPFLX,GRDFLX - REAL, DIMENSION(kts:kte+1)::PHALF -!..... ADD PRESSURE INTERFACE - - REAL, DIMENSION(NB) :: ABCFF,PWTS - - DATA ABCFF/2*4.0E-5,.002,.035,.377,1.95,9.40,44.6,190., & - 989.,2706.,39011./ - DATA PWTS/.5000,.121416,.0698,.1558,.0631,.0362,.0243,.0158,.0087, & - .001467,.002342,.001075/ - - REAL :: CFCO2,CFO3,REFLO3,RRAYAV - - DATA CFCO2,CFO3/508.96,466.64/ - DATA REFLO3/1.9/ - DATA RRAYAV/0.144/ - -! ********************************************* -!====> * VECTOR TEMPORARIES FOR CLOUD CALC. * -! ********************************************* - - REAL, DIMENSION(its:ite):: TTHAN - REAL, DIMENSION(its:ite,kts:kte):: DO3V,DO3VP - INTEGER, DIMENSION(its:ite):: JJROW - -!====> ************************************************************** -!-- SEASONAL CLIMATOLOGIES OF O3 (OBTAINED FROM A PREVIOUSLY RUN -! CODE WHICH INTERPOLATES O3 TO USER VERTICAL COORDINATE). -! DEFINED AS 5 DEG LAT MEANS N.P.->S.P. -! COMMON /SAVMEM/ & -!- ...WINTER.... ...SPRING.... ...SUMMER.... ....FALL..... -! DDUO3N(37,L), DDO3N2(37,L), DDO3N3(37,L), DDO3N4(37,L) - - REAL, DIMENSION(37,kte) :: DDUO3N,DDO3N2,DDO3N3,DDO3N4 - -! DIMENSION RAD1(37*kte), RAD2(37*kte), RAD3(37*kte), RAD4(37*kte) -! EQUIVALENCE (RAD1(1),DDUO3N(1,1)),(RAD2(1),DDO3N2(1,1)) -! EQUIVALENCE (RAD3(1),DDO3N3(1,1)),(RAD4(1),DDO3N4(1,1)) -!====> ************************************************************** -! - REAL, DIMENSION(21,20) :: ALBD - REAL, DIMENSION(20) :: ZA - REAL, DIMENSION(21) :: TRN - REAL, DIMENSION(19) :: DZA - - REAL :: YEAR,RLAG,TPI,SC,SSOLAR,DATE,RANG,TH2,ZEN,DZEN,ALB1,ALB2 - INTEGER :: IR,IQ,JX - DATA TRN/.00,.05,.10,.15,.20,.25,.30,.35,.40,.45,.50,.55,.60,.65, & - .70,.75,.80,.85,.90,.95,1.00/ - - REAL :: ALB11(21,7),ALB22(21,7),ALB33(21,6) - - EQUIVALENCE (ALB11(1,1),ALBD(1,1)),(ALB22(1,1),ALBD(1,8)), & - (ALB33(1,1),ALBD(1,15)) - DATA ALB11/ .061,.062,.072,.087,.115,.163,.235,.318,.395,.472,.542, & - .604,.655,.693,.719,.732,.730,.681,.581,.453,.425,.061,.062,.070, & - .083,.108,.145,.198,.263,.336,.415,.487,.547,.595,.631,.656,.670, & - .652,.602,.494,.398,.370,.061,.061,.068,.079,.098,.130,.174,.228, & - .290,.357,.424,.498,.556,.588,.603,.592,.556,.488,.393,.342,.325, & - .061,.061,.065,.073,.086,.110,.150,.192,.248,.306,.360,.407,.444, & - .469,.480,.474,.444,.386,.333,.301,.290,.061,.061,.065,.070,.082, & - .101,.131,.168,.208,.252,.295,.331,.358,.375,.385,.377,.356,.320, & - .288,.266,.255,.061,.061,.063,.068,.077,.092,.114,.143,.176,.210, & - .242,.272,.288,.296,.300,.291,.273,.252,.237,.266,.220,.061,.061, & - .062,.066,.072,.084,.103,.127,.151,.176,.198,.219,.236,.245,.250, & - .246,.235,.222,.211,.205,.200/ - DATA ALB22/ .061,.061,.061,.065,.071,.079,.094,.113,.134,.154,.173, & - .185,.190,.193,.193,.190,.188,.185,.182,.180,.178,.061,.061,.061, & - .064,.067,.072,.083,.099,.117,.135,.150,.160,.164,.165,.164,.162, & - .160,.159,.158,.157,.157,.061,.061,.061,.062,.065,.068,.074,.084, & - .097,.111,.121,.127,.130,.131,.131,.130,.129,.127,.126,.125,.122, & - .061,.061,.061,.061,.062,.064,.070,.076,.085,.094,.101,.105,.107, & - .106,.103,.100,.097,.096,.095,.095,.095,.061,.061,.061,.060,.061, & - .062,.065,.070,.075,.081,.086,.089,.090,.088,.084,.080,.077,.075, & - .074,.074,.074,.061,.061,.060,.060,.060,.061,.063,.065,.068,.072, & - .076,.077,.076,.074,.071,.067,.064,.062,.061,.061,.061,.061,.061, & - .060,.060,.060,.060,.061,.062,.065,.068,.069,.069,.068,.065,.061, & - .058,.055,.054,.053,.052,.052/ - DATA ALB33/ .061,.061,.060,.060,.060,.060,.060,.060,.062,.065,.065, & - .063,.060,.057,.054,.050,.047,.046,.045,.044,.044,.061,.061,.060, & - .060,.060,.059,.059,.059,.059,.059,.058,.055,.051,.047,.043,.039, & - .035,.033,.032,.031,.031,.061,.061,.060,.060,.060,.059,.059,.058, & - .057,.056,.054,.051,.047,.043,.039,.036,.033,.030,.028,.027,.026, & - .061,.061,.060,.060,.060,.059,.059,.058,.057,.055,.052,.049,.045, & - .040,.036,.032,.029,.027,.026,.025,.025,.061,.061,.060,.060,.060, & - .059,.059,.058,.056,.053,.050,.046,.042,.038,.034,.031,.028,.026, & - .025,.025,.025,.061,.061,.060,.060,.059,.058,.058,.057,.055,.053, & - .050,.046,.042,.038,.034,.030,.028,.029,.025,.025,.025/ - DATA ZA/90.,88.,86.,84.,82.,80.,78.,76.,74.,70.,66.,62.,58.,54., & - 50.,40.,30.,20.,10.,0.0/ - DATA DZA/8*2.0,6*4.0,5*10.0/ - -! *********************************************************** -! - - REAL, DIMENSION(its:ite) :: ALVB,ALNB,ALVD,ALND, & - GDFVB, & - GDFNB,GDFVD,GDFND, & - SFCALB - REAL :: SOLC,RSIN1,RCOS1,RCOS2 - - REAL :: ALBD0,ALVD1,ALND1,RRVCO2,RRCO2 - INTEGER :: N - -!====> BEGIN HERE ....................... -! -! SOLC,THE SOLAR CONSTANT IS SCALED TO A MORE CURRENT VALUE. -! I.E. IF SOLC=2.0 LY/MIN THEN SSOLAR=1.96 LY/MIN. -!.. RE-COMPUTED CAUSE SSOLAR OVERWRITTEN AS PART OF SCRATCH COMMON -! - - - INTEGER :: K, I,KP,LLM2,J1,J3,KMAX,KMIN,KCLDS,ICNT,LLM1 - INTEGER :: L,LP1,LP2,LP3,LM1,LM2,LM3,MYIS,MYIE,LLP1,LL,KK,KLEN - - L=kte - LP1=L+1; LP2=L+2; LP3=L+3; LLP1 = 2*L + 1 - LM1=L-1; LM2=L-2; LM3=L-3; LL = 2*L - LLM2 = LL-2; LLM1=LL-1 - MYIS=its; MYIE=ite - -!******ZHAO -! NOTE: XLAT IS IN DEGREE HERE -!*****ZHAO - YEAR=365.25 - RLAG=14.8125 - TPI=6.283185308 - SC=2. - SOLC=SC/(R1*R1) -!***************************** -! Special note: The solar constant is reduced extra 3 percent to account -! for the lack of aerosols in the shortwave radiation -! parameterization. Q. Zhao 96-7-23 -!**************************** - SSOLAR=SOLC*HP98 - SSOLAR=SSOLAR*0.97 - DATE=JD+GMT/24.0 - RANG=TPI*(DATE-RLAG)/YEAR - RSIN1=SIN(RANG) - RCOS1=COS(RANG) - RCOS2=COS(2.0*RANG) - DO 40 I=MYIS,MYIE - IR = I + IBEG - 1 - TH2=HP2*XLAT(IR) - JJROW(I)=Q19001-TH2 - TTHAN(I)=(19-JJROW(I))-TH2 -!..... NOTE THAT THE NMC VARIABLES ARE IN MKS (THUS PRESSURE IS IN -! CENTIBARS)WHILE ALL GFDL VARIABLES ARE IN CGS UNITS - SFCALB(I) = ALBEDO(IR) -!..... NOW PUT SFC TEMP,PRESSURES, ZENITH ANGLE INTO SW COMMON BLOCK... -!***ZHAO -! NOTE: ALL PRESSURES INPUT FROM THE ETA MODEL ARE IN PA -! THE UNIT FOR PRESS IS MICRO BAR -! SURFACE TEMPERATURE ARE NEGATIVE OVER OCEANS IN THE ETA MODEL -!***ZHAO - PRESS(I,LP1)=QS(IR)*10.0 - TEMP(I,LP1)=ABS(TSFC(IR)) - COSZEN(I) = COSZRO(IR) - TAUDA(I) = TAUDAR(IR) - 40 CONTINUE -!***ZHAO -!..... ALL GFDL VARIABLES HAVE K=1 AT THE TOP OF THE ATMOSPHERE.NMC -! ETA MODEL HAS THE SAME STRUCTURE -!***ZHAO - DO 50 K=1,L - DO 50 I=MYIS,MYIE - IR = I + IBEG - 1 -!..... NOW PUT TEMP,PRESSURES, INTO SW COMMON BLOCK.......... - TEMP(I,K) = TT(IR,K) - PRESS(I,K) = 10.0 * PP(IR,K) -!.... STORE LYR MOISTURE AND ADD TO SW COMMON BLOCK - RH2O(I,K)=QQH2O(IR,K) - IF(RH2O(I,K).LT.H3M6) RH2O(I,K)=H3M6 - 50 CONTINUE -!... ************************* - IF (KO3.EQ.0) GO TO 65 -!... ************************* - DO 60 K=1,L - DO 60 I=MYIS,MYIE - QO3(I,K) = O3QO3(I+IBEG-1,K) - 60 CONTINUE - 65 CONTINUE -!... ************************************ - IF (KALB.GT.0) GO TO 110 -!... ************************************ -!..... THE FOLLOWING CODE GETS ALBEDO FROM PAYNE,1972 TABLES IF -! 1) OPEN SEA POINT (SLMSK=1);2) KALB=0 - IQ=INT(TWENTY*HP537+ONE) - DO 105 I=MYIS,MYIE - IF(COSZEN(I).GT.0.0 .AND. SLMSK(I+IBEG-1).GT.0.5) THEN - ZEN=DEGRAD*ACOS(MAX(COSZEN(I),0.0)) - IF(ZEN.GE.H74E1) JX=INT(HAF*(HNINETY-ZEN)+ONE) - IF(ZEN.LT.H74E1.AND.ZEN.GE.FIFTY) & - JX=INT(QUARTR*(H74E1-ZEN)+HNINE) - IF(ZEN.LT.FIFTY) JX=INT(HP1*(FIFTY-ZEN)+H15E1) - DZEN=-(ZEN-ZA(JX))/DZA(JX) - ALB1=ALBD(IQ,JX)+DZEN*(ALBD(IQ,JX+1)-ALBD(IQ,JX)) - ALB2=ALBD(IQ+1,JX)+DZEN*(ALBD(IQ+1,JX+1)-ALBD(IQ+1,JX)) - SFCALB(I)=ALB1+TWENTY*(ALB2-ALB1)*(HP537-TRN(IQ)) - ENDIF - 105 CONTINUE - 110 CONTINUE -! ********************************** - IF (KO3.GT.0) GO TO 135 -! ********************************** -!.... COMPUTE CLIMATOLOGICAL ZONAL MEAN OZONE, -!.... SEASONAL AND SPATIAL INTERPOLATION DONE BELOW. - DO 125 I=MYIS,MYIE - - PHALF(1)=0. - PHALF(LP1)=PPI(I,kme) - DO L=1,LM1 - PHALF(L+1)=PP(I,L) ! AETA(L)*PDIF+PT - ENDDO - - CALL O3INT(PHALF,DDUO3N,DDO3N2,DDO3N3,DDO3N4, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - - DO 130 K=1,L - DO3V(I,K) = DDUO3N(JJROW(I),K) + RSIN1*DDO3N2(JJROW(I),K) & - +RCOS1*DDO3N3(JJROW(I),K) & - +RCOS2*DDO3N4(JJROW(I),K) - DO3VP(I,K) = DDUO3N(JJROW(I)+1,K) + RSIN1*DDO3N2(JJROW(I)+1,K) & - +RCOS1*DDO3N3(JJROW(I)+1,K) & - +RCOS2*DDO3N4(JJROW(I)+1,K) -!... NOW LATITUDINAL INTERPOLATION, AND -! CONVERT O3 INTO MASS MIXING RATIO(ORIGINAL DATA MPY BY 1.E4) - QO3(I,K) = H1M4 * (DO3V(I,K)+TTHAN(I)*(DO3VP(I,K)-DO3V(I,K))) - 130 CONTINUE - 125 CONTINUE - 135 CONTINUE -!............. - DO 195 I=MYIS,MYIE -!..... VISIBLE AND NEAR IR DIFFUSE ALBEDO - ALVD(I) = SFCALB(I) - ALND(I) = SFCALB(I) -!..... VISIBLE AND NEAR IR DIRECT BEAM ALBEDO - ALVB(I) = SFCALB(I) - ALNB(I) = SFCALB(I) -!..... VISIBLE AND NEAR IR DIRECT BEAM ALBEDO,IF NOT OCEAN NOR SNOW -! ..FUNCTION OF COSINE SOLAR ZENITH ANGLE.. - IF (SLMSK(I+IBEG-1).LT.0.5) THEN - IF (SFCALB(I).LE.0.5) THEN - ALBD0 = -18.0 * (0.5 - ACOS(COSZEN(I))/PI) - ALBD0 = EXP (ALBD0) - ALVD1 = (ALVD(I) - 0.054313) / 0.945687 - ALND1 = (ALND(I) - 0.054313) / 0.945687 - ALVB(I) = ALVD1 + (1.0 - ALVD1) * ALBD0 - ALNB(I) = ALND1 + (1.0 - ALND1) * ALBD0 - END IF - END IF - 195 CONTINUE -!.....SURFACE VALUES OF RRCL AND TTCL - DO 200 N=1,2 - DO 200 I=MYIS,MYIE - RRCL(I,N,1)=ALVD(I) - TTCL(I,N,1)=ZERO - 200 CONTINUE - DO 220 N=3,NB - DO 220 I=MYIS,MYIE - RRCL(I,N,1)=ALND(I) - TTCL(I,N,1)=ZERO - 220 CONTINUE -!... ************************** -!... * END OF CLOUD SECTION * -!... ************************** -!... THE FOLLOWING CODE CONVERTS RRVCO2,THE VOLUME MIXING RATIO OF CO2 -! INTO RRCO2,THE MASS MIXING RATIO. - RRVCO2=RCO2 - RRCO2=RRVCO2*RATCO2MW - 250 IF(ITIMLW .EQ. 0) GO TO 300 -! -! *********************** -!====> * LONG WAVE RADIATION * -! *********************** -! -!.... ACCOUNT FOR REDUCED EMISSIVITY OF ANY CLDS - DO 240 K=1,LP1 - DO 240 I=MYIS,MYIE - EQCMT(I,K)=CAMT(I,K)*EMCLD(I,K) - 240 CONTINUE -!.... GET CLD FACTOR FOR LW CALCULATIONS -!.... - -! shuhua - - CALL CLO89(CLDFAC,EQCMT,NCLDS,KBTM,KTOP, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - -! shuhua -!===> LONG WAVE RADIATION -! CALL LWR88(HEATRA,GRNFLX,TOPFLX, & -! PRESS,TEMP,RH2O,QO3,CLDFAC, & -! EQCMT,NCLDS,KTOP,KBTM, & -! -!! BO3RND,AO3RND,T1,T2,T4,EM1V,EM1VW,EM3V, & -! BO3RND,AO3RND, & -! APCM,BPCM,ATPCM,BTPCM,ACOMB,BCOMB,BETACM, & -! ZERO,ONE,H18E3,P0INV,H6P08108,DIFFCTR, & -! GINV,H3M4,BETINW,RATH2OMW,GP0INV,P0,P0XZP8, & -! P0XZP2,H3M3,H1M3,H1M2,H25E2,B0,B2,B1,B3,HAF, & -! TEN,HP1,FOUR,HM1EZ,SKO3R, & -! AB15WD,SKC1R,RADCON,QUARTR,TWO, & -! HM6666M2,HMP66667,HMP5, HP166666,H41666M2, & -! RADCON1,H16E1, H28E1,H44194M2,H1P41819,SKO2D, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) - - CALL LWR88(HEATRA,GRNFLX,TOPFLX, & - PRESS,TEMP,RH2O,QO3,CLDFAC, & - EQCMT,NCLDS,KTOP,KBTM, & -! -! BO3RND,AO3RND,T1,T2,T4,EM1V,EM1VW,EM3V, & - BO3RND,AO3RND, & - APCM,BPCM,ATPCM,BTPCM,ACOMB,BCOMB,BETACM, & - ZERO,ONE,H18E3,P0INV,H6P08108,DIFFCTR, & - GINV,H3M4,BETINW,RATH2OMW,GP0INV,P0,P0XZP8, & - P0XZP2,H3M3,H1M3,H1M2,H25E2,B0,B2,B1,B3,HAF, & - TEN,HP1,FOUR,HM1EZ, & - RADCON,QUARTR,TWO, & - HM6666M2,HMP66667,HMP5, HP166666,H41666M2, & - RADCON1,H16E1, H28E1,H44194M2,H1P41819, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - -!.... - DO 280 I=MYIS,MYIE - IR = I + IBEG - 1 - FLWUP(IR) = TOPFLX(I) * .001E0 - GRNFLX(I)=Q14330*(HSIGMA*TEMP(I,LP1)**4-GRNFLX(I)) -!.... GET LW FLUX DOWN AND UP AT GROUND(WATTS/M**2) - GRNFLX=LW DOWN. - FLWDNS(IR)=GRNFLX(I)/(1.43306E-06*1000.E0) - FLWUPS(IR)=HSIGMA*.001E0 * TEMP(I,LP1)**4 - 280 CONTINUE -!.... CONVERT HEATING RATES TO DEG/SEC - DO 290 K=1,L - DO 290 I=MYIS,MYIE - HLW(I+IBEG-1,K)=HEATRA(I,K)*DAYSEC - 290 CONTINUE - 300 CONTINUE - IF(ITIMSW .EQ. 0) GO TO 350 -!SW - CALL SWR93(FSW,HSW,UF,DF,FSWL,HSWL,UFL,DFL, & - PRESS,COSZEN,TAUDA,RH2O,RRCO2,SSOLAR,QO3, & - NCLDS,KTOP,KBTM,CAMT,RRCL,TTCL, & - ALVB,ALNB,ALVD,ALND,GDFVB,GDFNB,GDFVD,GDFND, & -! -! UCO2,UO3,TUCO2,TUO3,TDO3,TDCO2, & - ABCFF,PWTS, & - H35E1,H1224E3,ONE,ZERO,HAF,H69766E5,HP219, & - HP816,RRAYAV,GINV,CFCO2,CFO3, & - TWO,H235M3,HP26,H129M2,H75826M4,H1036E2, & - H1P082,HMP805,H1386E2,H658M2,H2118M2,H42M2, & - H323M4,HM1EZ,DIFFCTR,O3DIFCTR,FIFTY,RADCON, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - -!SW -! -!..... GET SW FLUXES IN WATTS/M**2 - DO 320 I=MYIS,MYIE - IR = I + IBEG - 1 - FSWUP(IR) = UF(I,1) * 1.E-3 - FSWDN(IR) = DF(I,1) * 1.E-3 - FSWUPS(IR) = UF(I,LP1) * 1.E-3 -!C..COUPLE W/M2 DIFF, IF FSWDNS(IR)=DF(I,LP1)*1.#E-3 - FSWDNS(IR) = (GDFVB(I)+GDFNB(I)+GDFVD(I)+GDFND(I)) * 1.E-3 -!... DOWNWARD SFC FLUX FOR THE SIB PARAMETERATION -!..... VISIBLE AND NEAR IR DIFFUSE - GDFVDR(IR) = GDFVD(I) * 1.E-3 - GDFNDR(IR) = GDFND(I) * 1.E-3 -!..... VISIBLE AND NEAR IR DIRECT BEAM - GDFVBR(IR) = GDFVB(I) * 1.E-3 - GDFNBR(IR) = GDFNB(I) * 1.E-3 - 320 CONTINUE -!.... CONVERT HEATING RATES TO DEG/SEC - DO 330 K=1,L - DO 330 I=MYIS,MYIE - SWH(I+IBEG-1,K)=HSW(I,K)*DAYSEC - 330 CONTINUE - 350 CONTINUE - RETURN - 1000 FORMAT(1H ,' YOU ARE CALLING GFDL RADIATION CODE FOR',I5,' PTS', & - 'AND',I4,' LYRS,WITH KDAPRX,KO3,KCZ,KEMIS,KALB = ',5I2) - - END SUBROUTINE RADFS - -!----------------------------------------------------------------------- - SUBROUTINE O3CLIM -! (XDUO3N,XDO3N2,XDO3N3,XDO3N4,PRGFDL, & -! ids,ide, jds,jde, kds,kde, & -! ims,ime, jms,jme, kms,kme, & -! its,ite, jts,jte, kts,kte ) -!---------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- -! INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , & -! ims,ime, jms,jme, kms,kme , & -! its,ite, jts,jte, kts,kte - -! ****************************************************************** -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . -! SUBPROGRAM: O3CLIM GENERATE SEASONAL OZONE DISTRIBUTION -! PRGRMMR: GFDL/CAMPANA ORG: W/NP22 DATE: ??-??-?? -! -! ABSTRACT: -! O3CLIM COMPUTES THE SEASONAL CLIMATOLOGY OF OZONE USING -! 81-LAYER DATA FROM GFDL. -! -! PROGRAM HISTORY LOG: -! ??-??-?? GFDL/KC - ORIGINATOR -! 96-07-26 BLACK - MODIFIED FOR ETA MODEL -! -! USAGE: CALL O3CLIM FROM SUBROUTINE RADTN -! INPUT ARGUMENT LIST: -! NONE -! -! OUTPUT ARGUMENT LIST: -! NONE -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: -! NONE -! -! LIBRARY: -! NONE -! -! COMMON BLOCKS: SEASO3 -! O3DATA -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!$$$ -!---------------------------------------------------------------------- -! INTEGER :: NL,NLP1,NLGTH,NKK,NK,NKP - INTEGER, PARAMETER :: NL=81,NLP1=NL+1,NLGTH=37*NL,NKK=41,NK=81,NKP=NK+1 -!---------------------------------------------------------------------- -! INCLUDE "SEASO3.comm" -!--------------------------------------------------------------------- -! REAL, INTENT(OUT), DIMENSION(37,NL) :: XDUO3N,XDO3N2,XDO3N3,XDO3N4 -! REAL, INTENT(OUT), DIMENSION(NL) :: PRGFDL - -! COMMON /SEASO3/ -! ...WINTER.... ...SPRING.... ...SUMMER.... ....FALL..... -! & XDUO3N(37,NL), XDO3N2(37,NL), XDO3N3(37,NL), XDO3N4(37,NL) -! -! &,PRGFDL(NL) -!--------------------------------------------------------------------- - REAL :: PH1(45),PH2(37),P1(48),P2(33),O3HI1(10,16),O3HI2(10,9) & - ,O3LO1(10,16),O3LO2(10,16),O3LO3(10,16),O3LO4(10,16) -!---------------------------------------------------------------------- - REAL :: AVG,A1,B1,B2 - INTEGER :: K,N,NCASE,IPLACE,KK,NKM,NKMM,KI,KQ,JJ,KEN,I,iindex,jindex -!---------------------------------------------------------------------- - REAL :: PSTD(NL),TEMPN(19),O3O3(37,NL,4),O35DEG(37,NL) & - ,XRAD1(NLGTH),XRAD2(NLGTH),XRAD3(NLGTH),XRAD4(NLGTH) & - ,DDUO3N(19,NL),DUO3N(19,41) & - ,RO3(10,41),RO3M(10,40),RO31(10,41),RO32(10,41) & - ,O3HI(10,25) & - ,RSTD(81),RBAR(NL),RDATA(81) & - ,PHALF(NL),P(81),PH(82) - - REAL :: PXX(81),PYY(82) ! fix for nesting: gopal's doing - -!---------------------------------------------------------------------- -! EQUIVALENCE & -! (O3HI1(1,1),O3HI(1,1)),(O3HI2(1,1),O3HI(1,17)) & -! ,(PH1(1),PH(1)),(PH2(1),PH(46)) & -! ,(P1(1),P(1)),(P2(1),P(49)) - - EQUIVALENCE & - (O3HI1(1,1),O3HI(1,1)),(O3HI2(1,1),O3HI(1,17)) & - ,(PH1(1),PYY(1)),(PH2(1),PYY(46)) & ! fix for nesting: gopal's doing - ,(P1(1),PXX(1)),(P2(1),PXX(49)) ! fix for nesting: gopal's doing - - -!---------------------------------------------------------------------- -! EQUIVALENCE & -! (XRAD1(1),XDUO3N(1,1),O3O3(1,1,1)) & -! ,(XRAD2(1),XDO3N2(1,1)) & -! ,(XRAD3(1),XDO3N3(1,1)),(XRAD4(1),XDO3N4(1,1),) - EQUIVALENCE & - (XRAD1(1),O3O3(1,1,1)) & - ,(XRAD2(1),O3O3(1,1,2)) & - ,(XRAD3(1),O3O3(1,1,3)),(XRAD4(1),O3O3(1,1,4)) -!---------------------------------------------------------------------- -!--------------------------------------------------------------------- - DATA PH1/ 0., & - 0.1027246E-04, 0.1239831E-04, 0.1491845E-04, 0.1788053E-04, & - 0.2135032E-04, 0.2540162E-04, 0.3011718E-04, 0.3558949E-04, & - 0.4192172E-04, 0.4922875E-04, 0.5763817E-04, 0.6729146E-04, & - 0.7834518E-04, 0.9097232E-04, 0.1053635E-03, 0.1217288E-03, & - 0.1402989E-03, 0.1613270E-03, 0.1850904E-03, 0.2119495E-03, & - 0.2423836E-03, 0.2768980E-03, 0.3160017E-03, 0.3602623E-03, & - 0.4103126E-03, 0.4668569E-03, 0.5306792E-03, 0.6026516E-03, & - 0.6839018E-03, 0.7759249E-03, 0.8803303E-03, 0.9987843E-03, & - 0.1133178E-02, 0.1285955E-02, 0.1460360E-02, 0.1660001E-02, & - 0.1888764E-02, 0.2151165E-02, 0.2452466E-02, 0.2798806E-02, & - 0.3197345E-02, 0.3656456E-02, 0.4185934E-02, 0.4797257E-02/ - DATA PH2/ & - 0.5503893E-02, 0.6321654E-02, 0.7269144E-02, 0.8368272E-02, & - 0.9644873E-02, 0.1112946E-01, 0.1285810E-01, 0.1487354E-01, & - 0.1722643E-01, 0.1997696E-01, 0.2319670E-01, 0.2697093E-01, & - 0.3140135E-01, 0.3660952E-01, 0.4274090E-01, 0.4996992E-01, & - 0.5848471E-01, 0.6847525E-01, 0.8017242E-01, 0.9386772E-01, & - 0.1099026E+00, 0.1286765E+00, 0.1506574E+00, 0.1763932E+00, & - 0.2065253E+00, 0.2415209E+00, 0.2814823E+00, 0.3266369E+00, & - 0.3774861E+00, 0.4345638E+00, 0.4984375E+00, 0.5697097E+00, & - 0.6490189E+00, 0.7370409E+00, 0.8344896E+00, 0.9421190E+00, & - 0.1000000E+01/ - DATA P1/ & - 0.9300000E-05, 0.1129521E-04, 0.1360915E-04, 0.1635370E-04, & - 0.1954990E-04, 0.2331653E-04, 0.2767314E-04, 0.3277707E-04, & - 0.3864321E-04, 0.4547839E-04, 0.5328839E-04, 0.6234301E-04, & - 0.7263268E-04, 0.8450696E-04, 0.9793231E-04, 0.1133587E-03, & - 0.1307170E-03, 0.1505832E-03, 0.1728373E-03, 0.1982122E-03, & - 0.2266389E-03, 0.2592220E-03, 0.2957792E-03, 0.3376068E-03, & - 0.3844381E-03, 0.4379281E-03, 0.4976965E-03, 0.5658476E-03, & - 0.6418494E-03, 0.7287094E-03, 0.8261995E-03, 0.9380076E-03, & - 0.1063498E-02, 0.1207423E-02, 0.1369594E-02, 0.1557141E-02, & - 0.1769657E-02, 0.2015887E-02, 0.2295520E-02, 0.2620143E-02, & - 0.2989651E-02, 0.3419469E-02, 0.3909867E-02, 0.4481491E-02, & - 0.5135272E-02, 0.5898971E-02, 0.6774619E-02, 0.7799763E-02/ - DATA P2/ & - 0.8978218E-02, 0.1036103E-01, 0.1195488E-01, 0.1382957E-01, & - 0.1599631E-01, 0.1855114E-01, 0.2151235E-01, 0.2501293E-01, & - 0.2908220E-01, 0.3390544E-01, 0.3952926E-01, 0.4621349E-01, & - 0.5403168E-01, 0.6330472E-01, 0.7406807E-01, 0.8677983E-01, & - 0.1015345E+00, 0.1189603E+00, 0.1391863E+00, 0.1630739E+00, & - 0.1908004E+00, 0.2235461E+00, 0.2609410E+00, 0.3036404E+00, & - 0.3513750E+00, 0.4055375E+00, 0.4656677E+00, 0.5335132E+00, & - 0.6083618E+00, 0.6923932E+00, 0.7845676E+00, 0.8875882E+00, & - 0.1000000E+01/ - DATA O3HI1/ & - .55,.50,.45,.45,.40,.35,.35,.30,.30,.30, & - .55,.51,.46,.47,.42,.38,.37,.36,.35,.35, & - .55,.53,.48,.49,.44,.42,.41,.40,.38,.38, & - .60,.55,.52,.52,.50,.47,.46,.44,.42,.41, & - .65,.60,.55,.56,.53,.52,.50,.48,.45,.45, & - .75,.65,.60,.60,.55,.55,.55,.50,.48,.47, & - .80,.75,.75,.75,.70,.70,.65,.63,.60,.60, & - .90,.85,.85,.80,.80,.75,.75,.74,.72,.71, & - 1.10,1.05,1.00,.90,.90,.90,.85,.83,.80,.80, & - 1.40,1.30,1.25,1.25,1.25,1.20,1.15,1.10,1.05,1.00, & - 1.7,1.7,1.6,1.6,1.6,1.6,1.6,1.6,1.5,1.5, & - 2.1,2.0,1.9,1.9,1.9,1.8,1.8,1.8,1.7,1.7, & - 2.4,2.3,2.2,2.2,2.2,2.1,2.1,2.1,2.0,2.0, & - 2.7,2.5,2.5,2.5,2.5,2.5,2.4,2.4,2.3,2.3, & - 2.9,2.8,2.7,2.7,2.7,2.7,2.7,2.7,2.6,2.6, & - 3.1,3.1,3.0,3.0,3.0,3.0,3.0,3.0,2.9,2.8/ - DATA O3HI2/ & - 3.3,3.4,3.4,3.6,3.7,3.9,4.0,4.1,4.0,3.8, & - 3.6,3.8,3.9,4.2,4.7,5.3,5.6,5.7,5.5,5.2, & - 4.1,4.3,4.7,5.2,6.0,6.7,7.0,6.8,6.4,6.2, & - 5.4,5.7,6.0,6.6,7.3,8.0,8.4,7.7,7.1,6.7, & - 6.7,6.8,7.0,7.6,8.3,10.0,9.6,8.2,7.5,7.2, & - 9.2,9.3,9.4,9.6,10.3,10.6,10.0,8.5,7.7,7.3, & - 12.6,12.1,12.0,12.1,11.7,11.0,10.0,8.6,7.8,7.4, & - 14.2,13.5,13.1,12.8,11.9,10.9,9.8,8.5,7.8,7.5, & - 14.3,14.0,13.4,12.7,11.6,10.6,9.3,8.4,7.6,7.3/ - DATA O3LO1/ & - 14.9,14.2,13.3,12.5,11.2,10.3,9.5,8.6,7.5,7.4, & - 14.5,14.1,13.0,11.8,10.5,9.8,9.2,7.9,7.4,7.4, & - 11.8,11.5,10.9,10.5,9.9,9.6,8.9,7.5,7.2,7.2, & - 7.3,7.7,7.8,8.4,8.4,8.5,7.9,7.4,7.1,7.1, & - 4.1,4.4,5.3,6.6,6.9,7.5,7.4,7.2,7.0,6.9, & - 1.8,1.9,2.5,3.3,4.5,5.8,6.3,6.3,6.4,6.1, & - 0.4,0.5,0.8,1.2,2.7,3.6,4.6,4.7,5.0,5.2, & - .10,.15,.20,.50,1.4,2.1,3.0,3.2,3.5,3.9, & - .07,.10,.12,.30,1.0,1.4,1.8,1.9,2.3,2.5, & - .06,.08,.10,.15,.60,.80,1.4,1.5,1.5,1.6, & - .05,.05,.06,.09,.20,.40,.70,.80,.90,.90, & - .05,.05,.06,.08,.10,.13,.20,.25,.30,.40, & - .05,.05,.05,.06,.07,.07,.08,.09,.10,.13, & - .05,.05,.05,.05,.06,.06,.06,.06,.07,.07, & - .05,.05,.05,.05,.05,.05,.05,.06,.06,.06, & - .04,.04,.04,.04,.04,.04,.04,.05,.05,.05/ - DATA O3LO2/ & - 14.8,14.2,13.8,12.2,11.0,9.8,8.5,7.8,7.4,6.9, & - 13.2,13.0,12.5,11.3,10.4,9.0,7.8,7.5,7.0,6.6, & - 10.6,10.6,10.7,10.1,9.4,8.6,7.5,7.0,6.5,6.1, & - 7.0,7.3,7.5,7.5,7.5,7.3,6.7,6.4,6.0,5.8, & - 3.8,4.0,4.7,5.0,5.2,5.9,5.8,5.6,5.5,5.5, & - 1.4,1.6,2.4,3.0,3.7,4.1,4.6,4.8,5.1,5.0, & - .40,.50,.90,1.2,2.0,2.7,3.2,3.6,4.3,4.1, & - .07,.10,.20,.30,.80,1.4,2.1,2.4,2.7,3.0, & - .06,.07,.09,.15,.30,.70,1.2,1.4,1.6,2.0, & - .05,.05,.06,.12,.15,.30,.60,.70,.80,.80, & - .04,.05,.06,.08,.09,.15,.30,.40,.40,.40, & - .04,.04,.05,.055,.06,.09,.12,.13,.15,.15, & - .03,.03,.045,.052,.055,.06,.07,.07,.06,.07, & - .03,.03,.04,.051,.052,.052,.06,.06,.05,.05, & - .02,.02,.03,.05,.05,.05,.04,.04,.04,.04, & - .02,.02,.02,.04,.04,.04,.03,.03,.03,.03/ - DATA O3LO3/ & - 14.5,14.0,13.5,11.3,11.0,10.0,9.0,8.3,7.5,7.3, & - 13.5,13.2,12.5,11.1,10.4,9.7,8.2,7.8,7.4,6.8, & - 10.8,10.9,11.0,10.4,10.0,9.6,7.9,7.5,7.0,6.7, & - 7.3,7.5,7.8,8.5,9.0,8.5,7.7,7.4,6.9,6.5, & - 4.1,4.5,5.3,6.2,7.3,7.7,7.3,7.0,6.6,6.4, & - 1.8,2.0,2.2,3.8,4.3,5.6,6.2,6.2,6.4,6.2, & - .30,.50,.60,1.5,2.8,3.7,4.5,4.7,5.5,5.6, & - .09,.10,.15,.60,1.2,2.1,3.0,3.5,4.0,4.3, & - .06,.08,.10,.30,.60,1.1,1.9,2.2,2.9,3.0, & - .04,.05,.06,.15,.45,.60,1.1,1.3,1.6,1.8, & - .04,.04,.04,.08,.20,.30,.55,.60,.75,.90, & - .04,.04,.04,.05,.06,.10,.12,.15,.20,.25, & - .04,.04,.03,.04,.05,.06,.07,.07,.07,.08, & - .03,.03,.04,.05,.05,.05,.05,.05,.05,.05, & - .03,.03,.03,.04,.04,.04,.05,.05,.04,.04, & - .02,.02,.02,.04,.04,.04,.04,.04,.03,.03/ - DATA O3LO4/ & - 14.2,13.8,13.2,12.5,11.7,10.5,8.6,7.8,7.5,6.6, & - 12.5,12.4,12.2,11.7,10.8,9.8,7.8,7.2,6.5,6.1, & - 10.6,10.5,10.4,10.1,9.6,9.0,7.1,6.8,6.1,5.9, & - 7.0,7.4,7.9,7.8,7.6,7.3,6.2,6.1,5.8,5.6, & - 4.2,4.6,5.1,5.6,5.9,5.9,5.9,5.8,5.6,5.3, & - 2.1,2.3,2.6,2.9,3.5,4.3,4.8,4.9,5.1,5.1, & - 0.7,0.8,1.0,1.5,2.0,2.8,3.5,3.6,3.7,4.0, & - .15,.20,.40,.50,.60,1.4,2.1,2.2,2.3,2.5, & - .08,.10,.15,.25,.30,.90,1.2,1.3,1.4,1.6, & - .07,.08,.10,.14,.20,.50,.70,.90,.90,.80, & - .05,.06,.08,.12,.14,.20,.35,.40,.60,.50, & - .05,.05,.08,.09,.09,.09,.11,.12,.15,.18, & - .04,.05,.06,.07,.07,.08,.08,.08,.08,.08, & - .04,.04,.05,.07,.07,.07,.07,.07,.06,.05, & - .02,.02,.04,.05,.05,.05,.05,.05,.04,.04, & - .02,.02,.03,.04,.04,.04,.04,.04,.03,.03/ -!---------------------------------------------------------------------- -!*** -!*** COMPUTE DETAILED O3 PROFILE FROM THE ORIGINAL GFDL PRESSURES -!*** WHERE OUTPUT FROM O3INT (PSTD) IS TOP DOWN IN MB*1.E3 -!*** AND PSFC=1013.25 MB ......K.A.C. DEC94 -!*** - - DO K=1,NK - PH(K)=PYY(K)*1013250. ! fix for nesting: gopal's doing - P(K)=PXX(K)*1013250. - ENDDO -! - PH(NKP)=PYY(NKP)*1013250. ! fixed; dusan -! - DO K=1,NL - PSTD(K)=P(K) - ENDDO -! - DO K=1,25 - DO N=1,10 - RO31(N,K)=O3HI(N,K) - RO32(N,K)=O3HI(N,K) - ENDDO - ENDDO -!---------------------------------------------------------------------- - DO 100 NCASE=1,4 -! -!*** NCASE=1: SPRING (IN N.H.) -!*** NCASE=2: FALL (IN N.H.) -!*** NCASE=3: WINTER (IN N.H.) -!*** NCASE=4: SUMMER (IN N.H.) -! - IPLACE=2 - IF(NCASE.EQ.2)IPLACE=4 - IF(NCASE.EQ.3)IPLACE=1 - IF(NCASE.EQ.4)IPLACE=3 -! - IF(NCASE.EQ.1.OR.NCASE.EQ.2)THEN - DO K=26,41 - DO N=1,10 - RO31(N,K)=O3LO1(N,K-25) - RO32(N,K)=O3LO2(N,K-25) - ENDDO - ENDDO - ENDIF -! - IF(NCASE.EQ.3.OR.NCASE.EQ.4)THEN - DO K=26,41 - DO N=1,10 - RO31(N,K)=O3LO3(N,K-25) - RO32(N,K)=O3LO4(N,K-25) - ENDDO - ENDDO - ENDIF -! - DO 25 KK=1,NKK - DO N=1,10 - DUO3N(N,KK)=RO31(11-N,KK) - DUO3N(N+9,KK)=RO32(N,KK) - ENDDO - DUO3N(10,KK)=0.5*(RO31(1,KK)+RO32(1,KK)) - 25 CONTINUE -! -!***FOR NCASE=2 OR NCASE=4,REVERSE LATITUDE ARRANGEMENT OF CORR. SEASON -! - IF(NCASE.EQ.2.OR.NCASE.EQ.4)THEN - DO 50 KK=1,NKK - DO N=1,19 - TEMPN(N)=DUO3N(20-N,KK) - ENDDO - DO N=1,19 - DUO3N(N,KK)=TEMPN(N) - ENDDO - 50 CONTINUE - ENDIF -! -!*** DUO3N NOW IS O3 PROFILE FOR APPROPRIATE SEASON AT STD PRESSURE -!*** LEVELS -! -!*** BEGIN LATITUDE (10 DEG) LOOP -! - DO 75 N=1,19 -! - DO KK=1,NKK - RSTD(KK)=DUO3N(N,KK) - ENDDO -! - NKM=NK-1 - NKMM=NK-3 -!*** -!*** BESSELS HALF-POINT INTERPOLATION FORMULA -!*** - DO K=4,NKMM,2 - KI=K/2 - RDATA(K)=0.5*(RSTD(KI)+RSTD(KI+1))-(RSTD(KI+2)-RSTD(KI+1) & - -RSTD(KI)+RSTD(KI-1))/16. - ENDDO -! - RDATA(2)=0.5*(RSTD(2)+RSTD(1)) - RDATA(NKM)=0.5*(RSTD(NKK)+RSTD(NKK-1)) -! -!*** PUT UNCHANGED DATA INTO NEW ARRAY -! - DO K=1,NK,2 - KQ=(K+1)/2 - RDATA(K)=RSTD(KQ) - ENDDO -! - DO KK=1,NL - DDUO3N(N,KK)=RDATA(KK)*.01 - ENDDO -! - 75 CONTINUE -! -!*** END OF LATITUDE LOOP -! -!---------------------------------------------------------------------- -!*** -!*** CREATE 5 DEG OZONE QUANTITIES BY LINEAR INTERPOLATION OF -!*** 10 DEG VALUES -!*** - DO 90 KK=1,NL -! - DO N=1,19 - O35DEG(2*N-1,KK)=DDUO3N(N,KK) - ENDDO -! - DO N=1,18 - O35DEG(2*N,KK)=0.5*(DDUO3N(N,KK)+DDUO3N(N+1,KK)) - ENDDO -! - 90 CONTINUE -! - DO JJ=1,37 - DO KEN=1,NL - O3O3(JJ,KEN,IPLACE)=O35DEG(JJ,KEN) - ENDDO - ENDDO -! - 100 CONTINUE -!---------------------------------------------------------------------- -!*** END OF LOOP OVER CASES -!---------------------------------------------------------------------- -!*** -!*** AVERAGE CLIMATOLOGICAL VALUS OF O3 FROM 5 DEG LAT MEANS, SO THAT -!*** TIME AND SPACE INTERPOLATION WILL WORK (SEE SUBR OZON2D) -!*** - DO I=1,NLGTH - AVG=0.25*(XRAD1(I)+XRAD2(I)+XRAD3(I)+XRAD4(I)) - A1=0.5*(XRAD2(I)-XRAD4(I)) - B1=0.5*(XRAD1(I)-XRAD3(I)) - B2=0.25*((XRAD1(I)+XRAD3(I))-(XRAD2(I)+XRAD4(I))) - -! XRAD1(I)=AVG -! XRAD2(I)=A1 -! XRAD3(I)=B1 -! XRAD4(I)=B2 - - iindex = 1+mod((I-1),37) - jindex = 1+(I-1)/37 - XDUO3N(iindex,jindex)=AVG - XDO3N2(iindex,jindex)=A1 - XDO3N3(iindex,jindex)=B1 - XDO3N4(iindex,jindex)=B2 - ENDDO -!*** -!*** CONVERT GFDL PRESSURE (MICROBARS) TO PA -!*** - DO N=1,NL - PRGFDL(N)=PSTD(N)*1.E-1 - ENDDO -! - END SUBROUTINE O3CLIM - -!--------------------------------------------------------------------- - SUBROUTINE TABLE -! (TABLE1,TABLE2,TABLE3,EM1,EM1WDE,EM3, & -! SOURCE,DSRCE ) -!--------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - -!INTEGER, PARAMETER :: NBLY=15 - INTEGER, PARAMETER :: NB=12 - INTEGER, PARAMETER :: NBLX=47 - INTEGER , PARAMETER:: NBLW = 163 - - REAL,PARAMETER :: AMOLWT=28.9644 - REAL,PARAMETER :: CSUBP=1.00484E7 - REAL,PARAMETER :: DIFFCTR=1.66 - REAL,PARAMETER :: G=980.665 - REAL,PARAMETER :: GINV=1./G - REAL,PARAMETER :: GRAVDR=980.0 - REAL,PARAMETER :: O3DIFCTR=1.90 - REAL,PARAMETER :: P0=1013250. - REAL,PARAMETER :: P0INV=1./P0 - REAL,PARAMETER :: GP0INV=GINV*P0INV - REAL,PARAMETER :: P0XZP2=202649.902 - REAL,PARAMETER :: P0XZP8=810600.098 - REAL,PARAMETER :: P0X2=2.*1013250. - REAL,PARAMETER :: RADCON=8.427 - REAL,PARAMETER :: RADCON1=1./8.427 - REAL,PARAMETER :: RATCO2MW=1.519449738 - REAL,PARAMETER :: RATH2OMW=.622 - REAL,PARAMETER :: RGAS=8.3142E7 - REAL,PARAMETER :: RGASSP=8.31432E7 - REAL,PARAMETER :: SECPDA=8.64E4 -! -!******THE FOLLOWING ARE MATHEMATICAL CONSTANTS******* -! ARRANGED IN DECREASING ORDER - REAL,PARAMETER :: HUNDRED=100. - REAL,PARAMETER :: HNINETY=90. - REAL,PARAMETER :: HNINE=9.0 - REAL,PARAMETER :: SIXTY=60. - REAL,PARAMETER :: FIFTY=50. - REAL,PARAMETER :: TEN=10. - REAL,PARAMETER :: EIGHT=8. - REAL,PARAMETER :: FIVE=5. - REAL,PARAMETER :: FOUR=4. - REAL,PARAMETER :: THREE=3. - REAL,PARAMETER :: TWO=2. - REAL,PARAMETER :: ONE=1. - REAL,PARAMETER :: HAF=0.5 - REAL,PARAMETER :: QUARTR=0.25 - REAL,PARAMETER :: ZERO=0. -! -!******FOLLOWING ARE POSITIVE FLOATING POINT CONSTANTS(H'S) -! ARRANGED IN DECREASING ORDER - REAL,PARAMETER :: H83E26=8.3E26 - REAL,PARAMETER :: H71E26=7.1E26 - REAL,PARAMETER :: H1E15=1.E15 - REAL,PARAMETER :: H1E13=1.E13 - REAL,PARAMETER :: H1E11=1.E11 - REAL,PARAMETER :: H1E8=1.E8 - REAL,PARAMETER :: H2E6=2.0E6 - REAL,PARAMETER :: H1E6=1.0E6 - REAL,PARAMETER :: H69766E5=6.97667E5 - REAL,PARAMETER :: H4E5=4.E5 - REAL,PARAMETER :: H165E5=1.65E5 - REAL,PARAMETER :: H5725E4=57250. - REAL,PARAMETER :: H488E4=48800. - REAL,PARAMETER :: H1E4=1.E4 - REAL,PARAMETER :: H24E3=2400. - REAL,PARAMETER :: H20788E3=2078.8 - REAL,PARAMETER :: H2075E3=2075. - REAL,PARAMETER :: H18E3=1800. - REAL,PARAMETER :: H1224E3=1224. - REAL,PARAMETER :: H67390E2=673.9057 - REAL,PARAMETER :: H5E2=500. - REAL,PARAMETER :: H3082E2=308.2 - REAL,PARAMETER :: H3E2=300. - REAL,PARAMETER :: H2945E2=294.5 - REAL,PARAMETER :: H29316E2=293.16 - REAL,PARAMETER :: H26E2=260.0 - REAL,PARAMETER :: H25E2=250. - REAL,PARAMETER :: H23E2=230. - REAL,PARAMETER :: H2E2=200.0 - REAL,PARAMETER :: H15E2=150. - REAL,PARAMETER :: H1386E2=138.6 - REAL,PARAMETER :: H1036E2=103.6 - REAL,PARAMETER :: H8121E1=81.21 - REAL,PARAMETER :: H35E1=35. - REAL,PARAMETER :: H3116E1=31.16 - REAL,PARAMETER :: H28E1=28. - REAL,PARAMETER :: H181E1=18.1 - REAL,PARAMETER :: H18E1=18. - REAL,PARAMETER :: H161E1=16.1 - REAL,PARAMETER :: H16E1=16. - REAL,PARAMETER :: H1226E1=12.26 - REAL,PARAMETER :: H9P94=9.94 - REAL,PARAMETER :: H6P08108=6.081081081 - REAL,PARAMETER :: H3P6=3.6 - REAL,PARAMETER :: H3P5=3.5 - REAL,PARAMETER :: H2P9=2.9 - REAL,PARAMETER :: H2P8=2.8 - REAL,PARAMETER :: H2P5=2.5 - REAL,PARAMETER :: H1P8=1.8 - REAL,PARAMETER :: H1P4387=1.4387 - REAL,PARAMETER :: H1P41819=1.418191 - REAL,PARAMETER :: H1P4=1.4 - REAL,PARAMETER :: H1P25892=1.258925411 - REAL,PARAMETER :: H1P082=1.082 - REAL,PARAMETER :: HP816=0.816 - REAL,PARAMETER :: HP805=0.805 - REAL,PARAMETER :: HP8=0.8 - REAL,PARAMETER :: HP60241=0.60241 - REAL,PARAMETER :: HP602409=0.60240964 - REAL,PARAMETER :: HP6=0.6 - REAL,PARAMETER :: HP526315=0.52631579 - REAL,PARAMETER :: HP518=0.518 - REAL,PARAMETER :: HP5048=0.5048 - REAL,PARAMETER :: HP3795=0.3795 - REAL,PARAMETER :: HP369=0.369 - REAL,PARAMETER :: HP26=0.26 - REAL,PARAMETER :: HP228=0.228 - REAL,PARAMETER :: HP219=0.219 - REAL,PARAMETER :: HP166666=.166666 - REAL,PARAMETER :: HP144=0.144 - REAL,PARAMETER :: HP118666=0.118666192 - REAL,PARAMETER :: HP1=0.1 -! (NEGATIVE EXPONENTIALS BEGIN HERE) - REAL,PARAMETER :: H658M2=0.0658 - REAL,PARAMETER :: H625M2=0.0625 - REAL,PARAMETER :: H44871M2=4.4871E-2 - REAL,PARAMETER :: H44194M2=.044194 - REAL,PARAMETER :: H42M2=0.042 - REAL,PARAMETER :: H41666M2=0.0416666 - REAL,PARAMETER :: H28571M2=.02857142857 - REAL,PARAMETER :: H2118M2=0.02118 - REAL,PARAMETER :: H129M2=0.0129 - REAL,PARAMETER :: H1M2=.01 - REAL,PARAMETER :: H559M3=5.59E-3 - REAL,PARAMETER :: H3M3=0.003 - REAL,PARAMETER :: H235M3=2.35E-3 - REAL,PARAMETER :: H1M3=1.0E-3 - REAL,PARAMETER :: H987M4=9.87E-4 - REAL,PARAMETER :: H323M4=0.000323 - REAL,PARAMETER :: H3M4=0.0003 - REAL,PARAMETER :: H285M4=2.85E-4 - REAL,PARAMETER :: H1M4=0.0001 - REAL,PARAMETER :: H75826M4=7.58265E-4 - REAL,PARAMETER :: H6938M5=6.938E-5 - REAL,PARAMETER :: H394M5=3.94E-5 - REAL,PARAMETER :: H37412M5=3.7412E-5 - REAL,PARAMETER :: H15M5=1.5E-5 - REAL,PARAMETER :: H1439M5=1.439E-5 - REAL,PARAMETER :: H128M5=1.28E-5 - REAL,PARAMETER :: H102M5=1.02E-5 - REAL,PARAMETER :: H1M5=1.0E-5 - REAL,PARAMETER :: H7M6=7.E-6 - REAL,PARAMETER :: H4999M6=4.999E-6 - REAL,PARAMETER :: H451M6=4.51E-6 - REAL,PARAMETER :: H25452M6=2.5452E-6 - REAL,PARAMETER :: H1M6=1.E-6 - REAL,PARAMETER :: H391M7=3.91E-7 - REAL,PARAMETER :: H1174M7=1.174E-7 - REAL,PARAMETER :: H8725M8=8.725E-8 - REAL,PARAMETER :: H327M8=3.27E-8 - REAL,PARAMETER :: H257M8=2.57E-8 - REAL,PARAMETER :: H1M8=1.0E-8 - REAL,PARAMETER :: H23M10=2.3E-10 - REAL,PARAMETER :: H14M10=1.4E-10 - REAL,PARAMETER :: H11M10=1.1E-10 - REAL,PARAMETER :: H1M10=1.E-10 - REAL,PARAMETER :: H83M11=8.3E-11 - REAL,PARAMETER :: H82M11=8.2E-11 - REAL,PARAMETER :: H8M11=8.E-11 - REAL,PARAMETER :: H77M11=7.7E-11 - REAL,PARAMETER :: H72M11=7.2E-11 - REAL,PARAMETER :: H53M11=5.3E-11 - REAL,PARAMETER :: H48M11=4.8E-11 - REAL,PARAMETER :: H44M11=4.4E-11 - REAL,PARAMETER :: H42M11=4.2E-11 - REAL,PARAMETER :: H37M11=3.7E-11 - REAL,PARAMETER :: H35M11=3.5E-11 - REAL,PARAMETER :: H32M11=3.2E-11 - REAL,PARAMETER :: H3M11=3.0E-11 - REAL,PARAMETER :: H28M11=2.8E-11 - REAL,PARAMETER :: H24M11=2.4E-11 - REAL,PARAMETER :: H23M11=2.3E-11 - REAL,PARAMETER :: H2M11=2.E-11 - REAL,PARAMETER :: H18M11=1.8E-11 - REAL,PARAMETER :: H15M11=1.5E-11 - REAL,PARAMETER :: H14M11=1.4E-11 - REAL,PARAMETER :: H114M11=1.14E-11 - REAL,PARAMETER :: H11M11=1.1E-11 - REAL,PARAMETER :: H1M11=1.E-11 - REAL,PARAMETER :: H96M12=9.6E-12 - REAL,PARAMETER :: H93M12=9.3E-12 - REAL,PARAMETER :: H77M12=7.7E-12 - REAL,PARAMETER :: H74M12=7.4E-12 - REAL,PARAMETER :: H65M12=6.5E-12 - REAL,PARAMETER :: H62M12=6.2E-12 - REAL,PARAMETER :: H6M12=6.E-12 - REAL,PARAMETER :: H45M12=4.5E-12 - REAL,PARAMETER :: H44M12=4.4E-12 - REAL,PARAMETER :: H4M12=4.E-12 - REAL,PARAMETER :: H38M12=3.8E-12 - REAL,PARAMETER :: H37M12=3.7E-12 - REAL,PARAMETER :: H3M12=3.E-12 - REAL,PARAMETER :: H29M12=2.9E-12 - REAL,PARAMETER :: H28M12=2.8E-12 - REAL,PARAMETER :: H24M12=2.4E-12 - REAL,PARAMETER :: H21M12=2.1E-12 - REAL,PARAMETER :: H16M12=1.6E-12 - REAL,PARAMETER :: H14M12=1.4E-12 - REAL,PARAMETER :: H12M12=1.2E-12 - REAL,PARAMETER :: H8M13=8.E-13 - REAL,PARAMETER :: H46M13=4.6E-13 - REAL,PARAMETER :: H36M13=3.6E-13 - REAL,PARAMETER :: H135M13=1.35E-13 - REAL,PARAMETER :: H12M13=1.2E-13 - REAL,PARAMETER :: H1M13=1.E-13 - REAL,PARAMETER :: H3M14=3.E-14 - REAL,PARAMETER :: H15M14=1.5E-14 - REAL,PARAMETER :: H14M14=1.4E-14 -! -!******FOLLOWING ARE NEGATIVE FLOATING POINT CONSTANTS (HM'S) -! ARRANGED IN DESCENDING ORDER - REAL,PARAMETER :: HM2M2=-.02 - REAL,PARAMETER :: HM6666M2=-.066667 - REAL,PARAMETER :: HMP5=-0.5 - REAL,PARAMETER :: HMP575=-0.575 - REAL,PARAMETER :: HMP66667=-.66667 - REAL,PARAMETER :: HMP805=-0.805 - REAL,PARAMETER :: HM1EZ=-1. - REAL,PARAMETER :: HM13EZ=-1.3 - REAL,PARAMETER :: HM19EZ=-1.9 - REAL,PARAMETER :: HM1E1=-10. - REAL,PARAMETER :: HM1597E1=-15.97469413 - REAL,PARAMETER :: HM161E1=-16.1 - REAL,PARAMETER :: HM1797E1=-17.97469413 - REAL,PARAMETER :: HM181E1=-18.1 - REAL,PARAMETER :: HM8E1=-80. - REAL,PARAMETER :: HM1E2=-100. -! - REAL,PARAMETER :: H1M16=1.0E-16 - REAL,PARAMETER :: H1M20=1.E-20 - REAL,PARAMETER :: HP98=0.98 - REAL,PARAMETER :: Q19001=19.001 - REAL,PARAMETER :: DAYSEC=1.1574E-5 - REAL,PARAMETER :: HSIGMA=5.673E-5 - REAL,PARAMETER :: TWENTY=20.0 - REAL,PARAMETER :: HP537=0.537 - REAL,PARAMETER :: HP2=0.2 - REAL,PARAMETER :: RCO2=3.3E-4 - REAL,PARAMETER :: Q14330=1.43306E-6 - REAL,PARAMETER :: H3M6=3.0E-6 - REAL,PARAMETER :: PI=3.1415927 - REAL,PARAMETER :: DEGRAD=180.0/PI - REAL,PARAMETER :: H74E1=74.0 - REAL,PARAMETER :: H15E1=15.0 - - REAL, PARAMETER:: B0 = -.51926410E-4 - REAL, PARAMETER:: B1 = -.18113332E-3 - REAL, PARAMETER:: B2 = -.10680132E-5 - REAL, PARAMETER:: B3 = -.67303519E-7 - REAL, PARAMETER:: AWIDE = 0.309801E+01 - REAL, PARAMETER:: BWIDE = 0.495357E-01 - REAL, PARAMETER:: BETAWD = 0.347839E+02 - REAL, PARAMETER:: BETINW = 0.766811E+01 - - -! REAL, INTENT(OUT) :: EM1(28,180),EM1WDE(28,180),TABLE1(28,180), & -! TABLE2(28,180),TABLE3(28,180),EM3(28,180), & -! SOURCE(28,NBLY), DSRCE(28,NBLY) - -! - REAL :: ARNDM(NBLW),BRNDM(NBLW),BETAD(NBLW) - REAL :: BANDLO(NBLW),BANDHI(NBLW) - - INTEGER :: IBAND(40) - - REAL :: BANDL1(64),BANDL2(64),BANDL3(35) - REAL :: BANDH1(64),BANDH2(64),BANDH3(35) -! REAL :: AB15WD,SKO2D,SKC1R,SKO3R - -! REAL :: AWIDE,BWIDE,BETAWD,BETINW - -! DATA AWIDE / 0.309801E+01/ -! DATA BWIDE / 0.495357E-01/ -! DATA BETAWD / 0.347839E+02/ -! DATA BETINW / 0.766811E+01/ - -! -!% #NPADL = #PAGE*#NPAGE - 4*28*180 - 2*181 - 7*28 - 180 ; -!% #NPADL = #NPADL - 11*28 - 2*180 - 2*30 ; - -! PARAMETER (NPADL = #NPADL - 28*NBLX - 2*28*NBLW - 7*NBLW) - - REAL :: & - SUM(28,180),PERTSM(28,180),SUM3(28,180), & - SUMWDE(28,180),SRCWD(28,NBLX),SRC1NB(28,NBLW), & - DBDTNB(28,NBLW) - REAL :: & - ZMASS(181),ZROOT(181),SC(28),DSC(28),XTEMV(28), & - TFOUR(28),FORTCU(28),X(28),X1(28),X2(180),SRCS(28), & - SUM4(28),SUM6(28),SUM7(28),SUM8(28),SUM4WD(28), & - R1T(28),R2(28),S2(28),T3(28),R1WD(28) - REAL :: EXPO(180),FAC(180) - REAL :: CNUSB(30),DNUSB(30) - REAL :: ALFANB(NBLW),AROTNB(NBLW) - REAL :: ANB(NBLW),BNB(NBLW),CENTNB(NBLW),DELNB(NBLW), & - BETANB(NBLW) - - REAL :: AB15(2) - - REAL :: ARNDM1(64),ARNDM2(64),ARNDM3(35) - REAL :: BRNDM1(64),BRNDM2(64),BRNDM3(35) - REAL :: BETAD1(64),BETAD2(64),BETAD3(35) - - EQUIVALENCE (ARNDM1(1),ARNDM(1)),(ARNDM2(1),ARNDM(65)), & - (ARNDM3(1),ARNDM(129)) - EQUIVALENCE (BRNDM1(1),BRNDM(1)),(BRNDM2(1),BRNDM(65)), & - (BRNDM3(1),BRNDM(129)) - EQUIVALENCE (BETAD1(1),BETAD(1)),(BETAD2(1),BETAD(65)), & - (BETAD3(1),BETAD(129)) - -!--------------------------------------------------------------- - REAL :: CENT,DEL,BDLO,BDHI,C1,ANU,tmp - INTEGER :: N,I,ICNT,I1,I2E,I2 - INTEGER :: J,JP,NSUBDS,NSB,IA - -!--------------------------------------------------------------- - - DATA IBAND / & - 2, 1, 2, 2, 1, 2, 1, 3, 2, 2, & - 3, 2, 2, 4, 2, 4, 2, 3, 3, 2, & - 4, 3, 4, 3, 7, 5, 6, 7, 6, 5, & - 7, 6, 7, 8, 6, 6, 8, 8, 8, 8/ - - DATA BANDL1 / & - 0.000000E+00, 0.100000E+02, 0.200000E+02, 0.300000E+02, & - 0.400000E+02, 0.500000E+02, 0.600000E+02, 0.700000E+02, & - 0.800000E+02, 0.900000E+02, 0.100000E+03, 0.110000E+03, & - 0.120000E+03, 0.130000E+03, 0.140000E+03, 0.150000E+03, & - 0.160000E+03, 0.170000E+03, 0.180000E+03, 0.190000E+03, & - 0.200000E+03, 0.210000E+03, 0.220000E+03, 0.230000E+03, & - 0.240000E+03, 0.250000E+03, 0.260000E+03, 0.270000E+03, & - 0.280000E+03, 0.290000E+03, 0.300000E+03, 0.310000E+03, & - 0.320000E+03, 0.330000E+03, 0.340000E+03, 0.350000E+03, & - 0.360000E+03, 0.370000E+03, 0.380000E+03, 0.390000E+03, & - 0.400000E+03, 0.410000E+03, 0.420000E+03, 0.430000E+03, & - 0.440000E+03, 0.450000E+03, 0.460000E+03, 0.470000E+03, & - 0.480000E+03, 0.490000E+03, 0.500000E+03, 0.510000E+03, & - 0.520000E+03, 0.530000E+03, 0.540000E+03, 0.550000E+03, & - 0.560000E+03, 0.670000E+03, 0.800000E+03, 0.900000E+03, & - 0.990000E+03, 0.107000E+04, 0.120000E+04, 0.121000E+04/ - DATA BANDL2 / & - 0.122000E+04, 0.123000E+04, 0.124000E+04, 0.125000E+04, & - 0.126000E+04, 0.127000E+04, 0.128000E+04, 0.129000E+04, & - 0.130000E+04, 0.131000E+04, 0.132000E+04, 0.133000E+04, & - 0.134000E+04, 0.135000E+04, 0.136000E+04, 0.137000E+04, & - 0.138000E+04, 0.139000E+04, 0.140000E+04, 0.141000E+04, & - 0.142000E+04, 0.143000E+04, 0.144000E+04, 0.145000E+04, & - 0.146000E+04, 0.147000E+04, 0.148000E+04, 0.149000E+04, & - 0.150000E+04, 0.151000E+04, 0.152000E+04, 0.153000E+04, & - 0.154000E+04, 0.155000E+04, 0.156000E+04, 0.157000E+04, & - 0.158000E+04, 0.159000E+04, 0.160000E+04, 0.161000E+04, & - 0.162000E+04, 0.163000E+04, 0.164000E+04, 0.165000E+04, & - 0.166000E+04, 0.167000E+04, 0.168000E+04, 0.169000E+04, & - 0.170000E+04, 0.171000E+04, 0.172000E+04, 0.173000E+04, & - 0.174000E+04, 0.175000E+04, 0.176000E+04, 0.177000E+04, & - 0.178000E+04, 0.179000E+04, 0.180000E+04, 0.181000E+04, & - 0.182000E+04, 0.183000E+04, 0.184000E+04, 0.185000E+04/ - DATA BANDL3 / & - 0.186000E+04, 0.187000E+04, 0.188000E+04, 0.189000E+04, & - 0.190000E+04, 0.191000E+04, 0.192000E+04, 0.193000E+04, & - 0.194000E+04, 0.195000E+04, 0.196000E+04, 0.197000E+04, & - 0.198000E+04, 0.199000E+04, 0.200000E+04, 0.201000E+04, & - 0.202000E+04, 0.203000E+04, 0.204000E+04, 0.205000E+04, & - 0.206000E+04, 0.207000E+04, 0.208000E+04, 0.209000E+04, & - 0.210000E+04, 0.211000E+04, 0.212000E+04, 0.213000E+04, & - 0.214000E+04, 0.215000E+04, 0.216000E+04, 0.217000E+04, & - 0.218000E+04, 0.219000E+04, 0.227000E+04/ - - DATA BANDH1 / & - 0.100000E+02, 0.200000E+02, 0.300000E+02, 0.400000E+02, & - 0.500000E+02, 0.600000E+02, 0.700000E+02, 0.800000E+02, & - 0.900000E+02, 0.100000E+03, 0.110000E+03, 0.120000E+03, & - 0.130000E+03, 0.140000E+03, 0.150000E+03, 0.160000E+03, & - 0.170000E+03, 0.180000E+03, 0.190000E+03, 0.200000E+03, & - 0.210000E+03, 0.220000E+03, 0.230000E+03, 0.240000E+03, & - 0.250000E+03, 0.260000E+03, 0.270000E+03, 0.280000E+03, & - 0.290000E+03, 0.300000E+03, 0.310000E+03, 0.320000E+03, & - 0.330000E+03, 0.340000E+03, 0.350000E+03, 0.360000E+03, & - 0.370000E+03, 0.380000E+03, 0.390000E+03, 0.400000E+03, & - 0.410000E+03, 0.420000E+03, 0.430000E+03, 0.440000E+03, & - 0.450000E+03, 0.460000E+03, 0.470000E+03, 0.480000E+03, & - 0.490000E+03, 0.500000E+03, 0.510000E+03, 0.520000E+03, & - 0.530000E+03, 0.540000E+03, 0.550000E+03, 0.560000E+03, & - 0.670000E+03, 0.800000E+03, 0.900000E+03, 0.990000E+03, & - 0.107000E+04, 0.120000E+04, 0.121000E+04, 0.122000E+04/ - DATA BANDH2 / & - 0.123000E+04, 0.124000E+04, 0.125000E+04, 0.126000E+04, & - 0.127000E+04, 0.128000E+04, 0.129000E+04, 0.130000E+04, & - 0.131000E+04, 0.132000E+04, 0.133000E+04, 0.134000E+04, & - 0.135000E+04, 0.136000E+04, 0.137000E+04, 0.138000E+04, & - 0.139000E+04, 0.140000E+04, 0.141000E+04, 0.142000E+04, & - 0.143000E+04, 0.144000E+04, 0.145000E+04, 0.146000E+04, & - 0.147000E+04, 0.148000E+04, 0.149000E+04, 0.150000E+04, & - 0.151000E+04, 0.152000E+04, 0.153000E+04, 0.154000E+04, & - 0.155000E+04, 0.156000E+04, 0.157000E+04, 0.158000E+04, & - 0.159000E+04, 0.160000E+04, 0.161000E+04, 0.162000E+04, & - 0.163000E+04, 0.164000E+04, 0.165000E+04, 0.166000E+04, & - 0.167000E+04, 0.168000E+04, 0.169000E+04, 0.170000E+04, & - 0.171000E+04, 0.172000E+04, 0.173000E+04, 0.174000E+04, & - 0.175000E+04, 0.176000E+04, 0.177000E+04, 0.178000E+04, & - 0.179000E+04, 0.180000E+04, 0.181000E+04, 0.182000E+04, & - 0.183000E+04, 0.184000E+04, 0.185000E+04, 0.186000E+04/ - DATA BANDH3 / & - 0.187000E+04, 0.188000E+04, 0.189000E+04, 0.190000E+04, & - 0.191000E+04, 0.192000E+04, 0.193000E+04, 0.194000E+04, & - 0.195000E+04, 0.196000E+04, 0.197000E+04, 0.198000E+04, & - 0.199000E+04, 0.200000E+04, 0.201000E+04, 0.202000E+04, & - 0.203000E+04, 0.204000E+04, 0.205000E+04, 0.206000E+04, & - 0.207000E+04, 0.208000E+04, 0.209000E+04, 0.210000E+04, & - 0.211000E+04, 0.212000E+04, 0.213000E+04, 0.214000E+04, & - 0.215000E+04, 0.216000E+04, 0.217000E+04, 0.218000E+04, & - 0.219000E+04, 0.220000E+04, 0.238000E+04/ - -! -!***THE FOLLOWING DATA STATEMENTS ARE BAND PARAMETERS OBTAINED USING -! THE 1982 AFGL CATALOG ON THE SPECIFIED BANDS - DATA ARNDM1 / & - 0.354693E+00, 0.269857E+03, 0.167062E+03, 0.201314E+04, & - 0.964533E+03, 0.547971E+04, 0.152933E+04, 0.599429E+04, & - 0.699329E+04, 0.856721E+04, 0.962489E+04, 0.233348E+04, & - 0.127091E+05, 0.104383E+05, 0.504249E+04, 0.181227E+05, & - 0.856480E+03, 0.136354E+05, 0.288635E+04, 0.170200E+04, & - 0.209761E+05, 0.126797E+04, 0.110096E+05, 0.336436E+03, & - 0.491663E+04, 0.863701E+04, 0.540389E+03, 0.439786E+04, & - 0.347836E+04, 0.130557E+03, 0.465332E+04, 0.253086E+03, & - 0.257387E+04, 0.488041E+03, 0.892991E+03, 0.117148E+04, & - 0.125880E+03, 0.458852E+03, 0.142975E+03, 0.446355E+03, & - 0.302887E+02, 0.394451E+03, 0.438112E+02, 0.348811E+02, & - 0.615503E+02, 0.143165E+03, 0.103958E+02, 0.725108E+02, & - 0.316628E+02, 0.946456E+01, 0.542675E+02, 0.351557E+02, & - 0.301797E+02, 0.381010E+01, 0.126319E+02, 0.548010E+01, & - 0.600199E+01, 0.640803E+00, 0.501549E-01, 0.167961E-01, & - 0.178110E-01, 0.170166E+00, 0.273514E-01, 0.983767E+00/ - DATA ARNDM2 / & - 0.753946E+00, 0.941763E-01, 0.970547E+00, 0.268862E+00, & - 0.564373E+01, 0.389794E+01, 0.310955E+01, 0.128235E+01, & - 0.196414E+01, 0.247113E+02, 0.593435E+01, 0.377552E+02, & - 0.305173E+02, 0.852479E+01, 0.116780E+03, 0.101490E+03, & - 0.138939E+03, 0.324228E+03, 0.683729E+02, 0.471304E+03, & - 0.159684E+03, 0.427101E+03, 0.114716E+03, 0.106190E+04, & - 0.294607E+03, 0.762948E+03, 0.333199E+03, 0.830645E+03, & - 0.162512E+04, 0.525676E+03, 0.137739E+04, 0.136252E+04, & - 0.147164E+04, 0.187196E+04, 0.131118E+04, 0.103975E+04, & - 0.621637E+01, 0.399459E+02, 0.950648E+02, 0.943161E+03, & - 0.526821E+03, 0.104150E+04, 0.905610E+03, 0.228142E+04, & - 0.806270E+03, 0.691845E+03, 0.155237E+04, 0.192241E+04, & - 0.991871E+03, 0.123907E+04, 0.457289E+02, 0.146146E+04, & - 0.319382E+03, 0.436074E+03, 0.374214E+03, 0.778217E+03, & - 0.140227E+03, 0.562540E+03, 0.682685E+02, 0.820292E+02, & - 0.178779E+03, 0.186150E+03, 0.383864E+03, 0.567416E+01/ - DATA ARNDM3 / & - 0.225129E+03, 0.473099E+01, 0.753149E+02, 0.233689E+02, & - 0.339802E+02, 0.108855E+03, 0.380016E+02, 0.151039E+01, & - 0.660346E+02, 0.370165E+01, 0.234169E+02, 0.440206E+00, & - 0.615283E+01, 0.304077E+02, 0.117769E+01, 0.125248E+02, & - 0.142652E+01, 0.241831E+00, 0.483721E+01, 0.226357E-01, & - 0.549835E+01, 0.597067E+00, 0.404553E+00, 0.143584E+01, & - 0.294291E+00, 0.466273E+00, 0.156048E+00, 0.656185E+00, & - 0.172727E+00, 0.118349E+00, 0.141598E+00, 0.588581E-01, & - 0.919409E-01, 0.155521E-01, 0.537083E-02/ - DATA BRNDM1 / & - 0.789571E-01, 0.920256E-01, 0.696960E-01, 0.245544E+00, & - 0.188503E+00, 0.266127E+00, 0.271371E+00, 0.330917E+00, & - 0.190424E+00, 0.224498E+00, 0.282517E+00, 0.130675E+00, & - 0.212579E+00, 0.227298E+00, 0.138585E+00, 0.187106E+00, & - 0.194527E+00, 0.177034E+00, 0.115902E+00, 0.118499E+00, & - 0.142848E+00, 0.216869E+00, 0.149848E+00, 0.971585E-01, & - 0.151532E+00, 0.865628E-01, 0.764246E-01, 0.100035E+00, & - 0.171133E+00, 0.134737E+00, 0.105173E+00, 0.860832E-01, & - 0.148921E+00, 0.869234E-01, 0.106018E+00, 0.184865E+00, & - 0.767454E-01, 0.108981E+00, 0.123094E+00, 0.177287E+00, & - 0.848146E-01, 0.119356E+00, 0.133829E+00, 0.954505E-01, & - 0.155405E+00, 0.164167E+00, 0.161390E+00, 0.113287E+00, & - 0.714720E-01, 0.741598E-01, 0.719590E-01, 0.140616E+00, & - 0.355356E-01, 0.832779E-01, 0.128680E+00, 0.983013E-01, & - 0.629660E-01, 0.643346E-01, 0.717082E-01, 0.629730E-01, & - 0.875182E-01, 0.857907E-01, 0.358808E+00, 0.178840E+00/ - DATA BRNDM2 / & - 0.254265E+00, 0.297901E+00, 0.153916E+00, 0.537774E+00, & - 0.267906E+00, 0.104254E+00, 0.400723E+00, 0.389670E+00, & - 0.263701E+00, 0.338116E+00, 0.351528E+00, 0.267764E+00, & - 0.186419E+00, 0.238237E+00, 0.210408E+00, 0.176869E+00, & - 0.114715E+00, 0.173299E+00, 0.967770E-01, 0.172565E+00, & - 0.162085E+00, 0.157782E+00, 0.886832E-01, 0.242999E+00, & - 0.760298E-01, 0.164248E+00, 0.221428E+00, 0.166799E+00, & - 0.312514E+00, 0.380600E+00, 0.353828E+00, 0.269500E+00, & - 0.254759E+00, 0.285408E+00, 0.159764E+00, 0.721058E-01, & - 0.170528E+00, 0.231595E+00, 0.307184E+00, 0.564136E-01, & - 0.159884E+00, 0.147907E+00, 0.185666E+00, 0.183567E+00, & - 0.182482E+00, 0.230650E+00, 0.175348E+00, 0.195978E+00, & - 0.255323E+00, 0.198517E+00, 0.195500E+00, 0.208356E+00, & - 0.309603E+00, 0.112011E+00, 0.102570E+00, 0.128276E+00, & - 0.168100E+00, 0.177836E+00, 0.105533E+00, 0.903330E-01, & - 0.126036E+00, 0.101430E+00, 0.124546E+00, 0.221406E+00/ - DATA BRNDM3 / & - 0.137509E+00, 0.911365E-01, 0.724508E-01, 0.795788E-01, & - 0.137411E+00, 0.549175E-01, 0.787714E-01, 0.165544E+00, & - 0.136484E+00, 0.146729E+00, 0.820496E-01, 0.846211E-01, & - 0.785821E-01, 0.122527E+00, 0.125359E+00, 0.101589E+00, & - 0.155756E+00, 0.189239E+00, 0.999086E-01, 0.480993E+00, & - 0.100233E+00, 0.153754E+00, 0.130780E+00, 0.136136E+00, & - 0.159353E+00, 0.156634E+00, 0.272265E+00, 0.186874E+00, & - 0.192090E+00, 0.135397E+00, 0.131497E+00, 0.127463E+00, & - 0.227233E+00, 0.190562E+00, 0.214005E+00/ - DATA BETAD1 / & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.234879E+03, 0.217419E+03, 0.201281E+03, 0.186364E+03, & - 0.172576E+03, 0.159831E+03, 0.148051E+03, 0.137163E+03, & - 0.127099E+03, 0.117796E+03, 0.109197E+03, 0.101249E+03, & - 0.939031E+02, 0.871127E+02, 0.808363E+02, 0.750349E+02, & - 0.497489E+02, 0.221212E+02, 0.113124E+02, 0.754174E+01, & - 0.589554E+01, 0.495227E+01, 0.000000E+00, 0.000000E+00/ - DATA BETAD2 / & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00/ - DATA BETAD3 / & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00, 0.000000E+00, & - 0.000000E+00, 0.000000E+00, 0.000000E+00/ -!--------------------------------------------------------------- -! EQUIVALENCE (BANDL1(1),BANDLO(1)),(BANDL2(1),BANDLO(65)), & -! (BANDL3(1),BANDLO(129)) - -! L = kme-1 -! LP1 = L+1 -! LP1V = LP1*(1+2*L/2) -! IMAX = ite -! LP2 = L + 2 - - DO I = 1,64 - BANDLO(I)=BANDL1(I) - ENDDO - - DO I = 65,128 - BANDLO(I)=BANDL2(I-64) - ENDDO - - DO I = 129,163 - BANDLO(I)=BANDL3(I-128) - ENDDO - - DO I = 1,64 - BANDHI(I)=BANDH1(I) - ENDDO - - DO I = 65,128 - BANDHI(I)=BANDH2(I-64) - ENDDO - - DO I = 129,163 - BANDHI(I)=BANDH3(I-128) - ENDDO - -!**************************************** -!***COMPUTE LOCAL QUANTITIES AND AO3,BO3,AB15 -!....FOR NARROW-BANDS... - DO 101 N=1,NBLW - ANB(N)=ARNDM(N) - BNB(N)=BRNDM(N) - CENTNB(N)=HAF*(BANDLO(N)+BANDHI(N)) - DELNB(N)=BANDHI(N)-BANDLO(N) - BETANB(N)=BETAD(N) -101 CONTINUE - AB15(1)=ANB(57)*BNB(57) - AB15(2)=ANB(58)*BNB(58) -!....FOR WIDE BANDS... - AB15WD=AWIDE*BWIDE -! -!***COMPUTE INDICES: IND,INDX2,KMAXV -!SH ICNT=0 -!SH DO 113 I1=1,L -!SH I2E=LP1-I1 -!SH DO 115 I2=1,I2E -!SH ICNT=ICNT+1 -!SH INDX2(ICNT)=LP1*(I2-1)+LP2*I1 -!SH115 CONTINUE -!SH113 CONTINUE -!SH KMAXV(1)=1 -!SH DO 117 I=2,L -!SH KMAXV(I)=KMAXV(I-1)+(LP2-I) -117 CONTINUE -!SH KMAXVM=KMAXV(L) -!***COMPUTE RATIOS OF CONT. COEFFS - SKC1R=BETAWD/BETINW - SKO3R=BETAD(61)/BETINW - SKO2D=ONE/BETINW -! -!****BEGIN TABLE COMPUTATIONS HERE*** -!***COMPUTE TEMPS, MASSES FOR TABLE ENTRIES -!---NOTE: THE DIMENSIONING AND INITIALIZATION OF XTEMV AND OTHER ARRAYS -! WITH DIMENSION OF 28 IMPLY A RESTRICTION OF MODEL TEMPERATURES FROM -! 100K TO 370K. -!---THE DIMENSIONING OF ZMASS,ZROOT AND OTHER ARRAYS WITH DIMENSION OF -! 180 IMPLY A RESTRICTION OF MODEL H2O AMOUNTS SUCH THAT OPTICAL PATHS -! ARE BETWEEN 10**-16 AND 10**2, IN CGS UNITS. - ZMASS(1)=H1M16 - DO 201 J=1,180 - JP=J+1 - ZROOT(J)=SQRT(ZMASS(J)) - ZMASS(JP)=ZMASS(J)*H1P25892 -201 CONTINUE - DO 203 I=1,28 - XTEMV(I)=HNINETY+TEN*I - TFOUR(I)=XTEMV(I)*XTEMV(I)*XTEMV(I)*XTEMV(I) - FORTCU(I)=FOUR*XTEMV(I)*XTEMV(I)*XTEMV(I) -203 CONTINUE -!******THE COMPUTATION OF SOURCE,DSRCE IS NEEDED ONLY -! FOR THE COMBINED WIDE-BAND CASE.TO OBTAIN THEM,THE SOURCE -! MUST BE COMPUTED FOR EACH OF THE (NBLX) WIDE BANDS(=SRCWD) -! THEN COMBINED (USING IBAND) INTO SOURCE. - DO 205 N=1,NBLY - DO 205 I=1,28 - SOURCE(I,N)=ZERO -205 CONTINUE - DO 207 N=1,NBLX - DO 207 I=1,28 - SRCWD(I,N)=ZERO -207 CONTINUE -!---BEGIN FREQ. LOOP (ON N) - DO 211 N=1,NBLX - IF (N.LE.46) THEN -!***THE 160-1200 BAND CASES - CENT=CENTNB(N+16) - DEL=DELNB(N+16) - BDLO=BANDLO(N+16) - BDHI=BANDHI(N+16) - ENDIF - IF (N.EQ.NBLX) THEN -!***THE 2270-2380 BAND CASE - CENT=CENTNB(NBLW) - DEL=DELNB(NBLW) - BDLO=BANDLO(NBLW) - BDHI=BANDHI(NBLW) - ENDIF -!***FOR PURPOSES OF ACCURACY, ALL EVALUATIONS OF PLANCK FCTNS ARE MADE -! ON 10 CM-1 INTERVALS, THEN SUMMED INTO THE (NBLX) WIDE BANDS. - NSUBDS=(DEL-H1M3)/10+1 - DO 213 NSB=1,NSUBDS - IF (NSB.NE.NSUBDS) THEN - CNUSB(NSB)=TEN*(NSB-1)+BDLO+FIVE - DNUSB(NSB)=TEN - ELSE - CNUSB(NSB)=HAF*(TEN*(NSB-1)+BDLO+BDHI) - DNUSB(NSB)=BDHI-(TEN*(NSB-1)+BDLO) - ENDIF - C1=(H37412M5)*CNUSB(NSB)**3 -!---BEGIN TEMP. LOOP (ON I) - DO 215 I=1,28 - X(I)=H1P4387*CNUSB(NSB)/XTEMV(I) - X1(I)=EXP(X(I)) - SRCS(I)=C1/(X1(I)-ONE) - SRCWD(I,N)=SRCWD(I,N)+SRCS(I)*DNUSB(NSB) -215 CONTINUE -213 CONTINUE -211 CONTINUE -!***THE FOLLOWING LOOPS CREATE THE COMBINED WIDE BAND QUANTITIES SOURCE -! AND DSRCE - DO 221 N=1,40 - DO 221 I=1,28 - SOURCE(I,IBAND(N))=SOURCE(I,IBAND(N))+SRCWD(I,N) -221 CONTINUE - DO 223 N=9,NBLY - DO 223 I=1,28 - SOURCE(I,N)=SRCWD(I,N+32) -223 CONTINUE - DO 225 N=1,NBLY - DO 225 I=1,27 - DSRCE(I,N)=(SOURCE(I+1,N)-SOURCE(I,N))*HP1 -225 CONTINUE - DO 231 N=1,NBLW - ALFANB(N)=BNB(N)*ANB(N) - AROTNB(N)=SQRT(ALFANB(N)) -231 CONTINUE -!***FIRST COMPUTE PLANCK FCTNS (SRC1NB) AND DERIVATIVES (DBDTNB) FOR -! USE IN TABLE EVALUATIONS. THESE ARE DIFFERENT FROM SOURCE,DSRCE -! BECAUSE DIFFERENT FREQUENCY PTS ARE USED IN EVALUATION, THE FREQ. -! RANGES ARE DIFFERENT, AND THE DERIVATIVE ALGORITHM IS DIFFERENT. -! - DO 301 N=1,NBLW - CENT=CENTNB(N) - DEL=DELNB(N) -!---NOTE: AT PRESENT, THE IA LOOP IS ONLY USED FOR IA=2. THE LOOP STRUCT -! IS KEPT SO THAT IN THE FUTURE, WE MAY USE A QUADRATURE SCHEME FOR -! THE PLANCK FCTN EVALUATION, RATHER THAN USE THE MID-BAND FREQUENCY. -#if 0 - DO 303 IA=1,3 -#else -!jm -- getting floating point exceptions for IA=1, since 2 is only -! used anyway, I disabled the looping. - DO 303 IA=2,2 -#endif - ANU=CENT+HAF*(IA-2)*DEL - C1=(H37412M5)*ANU*ANU*ANU+H1M20 -!---TEMPERATURE LOOP--- - DO 305 I=1,28 - X(I)=H1P4387*ANU/XTEMV(I) - X1(I)=EXP(X(I)) -!#$ tmp=max((X1(I)-ONE),H1M20) -!#$ SC(I)=C1/tmp - SC(I)=C1/((X1(I)-ONE)+H1M20) -!#$ DSC(I)=X(I)*SC(I)*SC(I)*X1(I)/(XTEMV(I)*C1) - DSC(I)=SC(I)*SC(I)*X(I)*X1(I)/(XTEMV(I)*C1) -305 CONTINUE - IF (IA.EQ.2) THEN - DO 307 I=1,28 - SRC1NB(I,N)=DEL*SC(I) - DBDTNB(I,N)=DEL*DSC(I) -307 CONTINUE - ENDIF -303 CONTINUE -301 CONTINUE -!***NEXT COMPUTE R1T,R2,S2,AND T3- COEFFICIENTS USED FOR E3 FUNCTION -! WHEN THE OPTICAL PATH IS LESS THAN 10-4. IN THIS CASE, WE ASSUME A -! DIFFERENT DEPENDENCE ON (ZMASS). -!---ALSO OBTAIN R1WD, WHICH IS R1T SUMMED OVER THE 160-560 CM-1 RANGE - DO 311 I=1,28 - SUM4(I)=ZERO - SUM6(I)=ZERO - SUM7(I)=ZERO - SUM8(I)=ZERO - SUM4WD(I)=ZERO -311 CONTINUE - DO 313 N=1,NBLW - CENT=CENTNB(N) -!***PERFORM SUMMATIONS FOR FREQ. RANGES OF 0-560,1200-2200 CM-1 FOR SUM4 -! SUM6,SUM7,SUM8 - IF (CENT.LT.560. .OR. CENT.GT.1200..AND.CENT.LE.2200.) THEN - DO 315 I=1,28 - SUM4(I)=SUM4(I)+SRC1NB(I,N) - SUM6(I)=SUM6(I)+DBDTNB(I,N) - SUM7(I)=SUM7(I)+DBDTNB(I,N)*AROTNB(N) - SUM8(I)=SUM8(I)+DBDTNB(I,N)*ALFANB(N) -315 CONTINUE - ENDIF -!***PERFORM SUMMATIONS OVER 160-560 CM-1 FREQ RANGE FOR E1 CALCS (SUM4WD - IF (CENT.GT.160. .AND. CENT.LT.560.) THEN - DO 316 I=1,28 - SUM4WD(I)=SUM4WD(I)+SRC1NB(I,N) -316 CONTINUE - ENDIF -313 CONTINUE - DO 317 I=1,28 - R1T(I)=SUM4(I)/TFOUR(I) - R2(I)=SUM6(I)/FORTCU(I) - S2(I)=SUM7(I)/FORTCU(I) - T3(I)=SUM8(I)/FORTCU(I) - R1WD(I)=SUM4WD(I)/TFOUR(I) -317 CONTINUE - DO 401 J=1,180 - DO 401 I=1,28 - SUM(I,J)=ZERO - PERTSM(I,J)=ZERO - SUM3(I,J)=ZERO - SUMWDE(I,J)=ZERO -401 CONTINUE -!---FREQUENCY LOOP BEGINS--- - DO 411 N=1,NBLW - CENT=CENTNB(N) -!***PERFORM CALCULATIONS FOR FREQ. RANGES OF 0-560,1200-2200 CM-1 - IF (CENT.LT.560. .OR. CENT.GT.1200..AND.CENT.LE.2200.) THEN - DO 413 J=1,180 - X2(J)=AROTNB(N)*ZROOT(J) - EXPO(J)=EXP(-X2(J)) -413 CONTINUE - DO 415 J=1,180 - IF (X2(J).GE.HUNDRED) THEN - EXPO(J)=ZERO - ENDIF -415 CONTINUE - DO 417 J=121,180 - FAC(J)=ZMASS(J)*(ONE-(ONE+X2(J))*EXPO(J))/(X2(J)*X2(J)) -417 CONTINUE - DO 419 J=1,180 - DO 419 I=1,28 - SUM(I,J)=SUM(I,J)+SRC1NB(I,N)*EXPO(J) - PERTSM(I,J)=PERTSM(I,J)+DBDTNB(I,N)*EXPO(J) -419 CONTINUE - DO 421 J=121,180 - DO 421 I=1,28 - SUM3(I,J)=SUM3(I,J)+DBDTNB(I,N)*FAC(J) -421 CONTINUE - ENDIF -!---COMPUTE SUM OVER 160-560 CM-1 RANGE FOR USE IN E1 CALCS (SUMWDE) - IF (CENT.GT.160. .AND. CENT.LT.560.) THEN - DO 420 J=1,180 - DO 420 I=1,28 - SUMWDE(I,J)=SUMWDE(I,J)+SRC1NB(I,N)*EXPO(J) -420 CONTINUE - ENDIF -411 CONTINUE - DO 431 J=1,180 - DO 431 I=1,28 - EM1(I,J)=SUM(I,J)/TFOUR(I) - TABLE1(I,J)=PERTSM(I,J)/FORTCU(I) -431 CONTINUE - DO 433 J=121,180 - DO 433 I=1,28 - EM3(I,J)=SUM3(I,J)/FORTCU(I) -433 CONTINUE - DO 441 J=1,179 - DO 441 I=1,28 - TABLE2(I,J)=(TABLE1(I,J+1)-TABLE1(I,J))*TEN -441 CONTINUE - DO 443 J=1,180 - DO 443 I=1,27 - TABLE3(I,J)=(TABLE1(I+1,J)-TABLE1(I,J))*HP1 -443 CONTINUE - DO 445 I=1,28 - TABLE2(I,180)=ZERO -445 CONTINUE - DO 447 J=1,180 - TABLE3(28,J)=ZERO -447 CONTINUE - DO 449 J=1,2 - DO 449 I=1,28 - EM1(I,J)=R1T(I) -449 CONTINUE - DO 451 J=1,120 - DO 451 I=1,28 - EM3(I,J)=R2(I)/TWO-S2(I)*SQRT(ZMASS(J))/THREE+T3(I)*ZMASS(J)/EIGHT -451 CONTINUE - DO 453 J=121,180 - DO 453 I=1,28 - EM3(I,J)=EM3(I,J)/ZMASS(J) -453 CONTINUE -!***NOW COMPUTE E1 TABLES FOR 160-560 CM-1 BANDS ONLY. -! WE USE R1WD AND SUMWDE OBTAINED ABOVE. - DO 501 J=1,180 - DO 501 I=1,28 - EM1WDE(I,J)=SUMWDE(I,J)/TFOUR(I) -501 CONTINUE - DO 503 J=1,2 - DO 503 I=1,28 - EM1WDE(I,J)=R1WD(I) -503 CONTINUE - - END SUBROUTINE TABLE - -!--------------------------------------------------------------------- - SUBROUTINE SOLARD(IHRST,IDAY,MONTH,JULYR) -!--------------------------------------------------------------------- - IMPLICIT NONE -!--------------------------------------------------------------------- -!$$$ SUBPROGRAM DOCUMENTATION BLOCK -! . . . . -! SUBPROGRAM: SOLARD COMPUTE THE SOLAR-EARTH DISTANCE -! PRGRMMR: Q.ZHAO ORG: W/NMC2 DATE: 96-7-23 -! -! ABSTRACT: -! SOLARD CALCULATES THE SOLAR-EARTH DISTANCE ON EACH DAY -! FOR USE IN SHORT-WAVE RADIATION. -! -! PROGRAM HISTORY LOG: -! 96-07-23 Q.ZHAO - ORIGINATOR -! 98-10-09 Q.ZHAO - CHANGED TO USE IW3JDN IN W3LIB TO -! CALCULATE JD. -! -! USAGE: CALL SOLARD FROM SUBROUTINE INIT -! -! INPUT ARGUMENT LIST: -! NONE -! -! OUTPUT ARGUMENT LIST: -! R1 - THE NON-DIMENSIONAL DISTANCE BETWEEN SUN AND THE EARTH -! (LESS THAN 1.0 IN SUMMER AND LARGER THAN 1.0 IN WINTER). -! -! INPUT FILES: -! NONE -! -! OUTPUT FILES: -! NONE -! -! SUBPROGRAMS CALLED: -! -! UNIQUE: NONE -! -! LIBRARY: IW3JDN -! -! COMMON BLOCKS: CTLBLK -! -! ATTRIBUTES: -! LANGUAGE: FORTRAN 90 -! MACHINE : IBM SP -!*********************************************************************** - REAL, PARAMETER :: PI=3.1415926,PI2=2.*PI -!----------------------------------------------------------------------- -! INTEGER, INTENT(IN ) :: IHRST,IDAT(3) - INTEGER, INTENT(IN ) :: IHRST,IDAY,MONTH,JULYR -! REAL , INTENT(OUT) :: R1 -!----------------------------------------------------------------------- - INTEGER :: NDM(12),JYR19,JMN - REAL :: CCR - - DATA JYR19/1900/, JMN/0/, CCR/1.3E-6/ - DATA NDM/0,31,59,90,120,151,181,212,243,273,304,334/ - -!.....TPP = DAYS BETWEEN EPOCH AND PERIHELION PASSAGE OF 1900 -!.....JDOR1 = JD OF DECEMBER 30, 1899 AT 12 HOURS UT -!.....JDOR2 = JD OF EPOCH WHICH IS JANUARY 0, 1990 AT 12 HOURS UT -! - REAL :: TPP - DATA TPP/1.55/ - - INTEGER :: JDOR2,JDOR1 - DATA JDOR2/2415020/, JDOR1/2415019/ - - REAL :: DAYINC,DAT,T,YEAR,DATE,EM,E,EC,EP,CR,FJD,FJD1 - INTEGER :: JYR,JMNTH,JDAY,JHRJD,JHR,JD,ITER -! -! LIBRARY: IW3JDN -! -! -------------------------------------------------------------------- -! COMPUTES JULIAN DAY AND FRACTION FROM YEAR, MONTH, DAY AND TIME UT -! ACCURATE ONLY BETWEEN MARCH 1, 1900 AND FEBRUARY 28, 2100 -! BASED ON JULIAN CALENDAR CORRECTED TO CORRESPOND TO GREGORIAN -! CALENDAR DURING THIS PERIOD -! -------------------------------------------------------------------- - -! JYR=IDAT(3) -! JMNTH=IDAT(1) -! JDAY=IDAT(2) - JHR=IHRST -! - JD=IDAY-32075 & - +1461*(JULYR+4800+(MONTH-14)/12)/4 & - +367*(MONTH-2-(MONTH-14)/12*12)/12 & - -3*((JULYR+4900+(MONTH-14)/12)/100)/4 - IF(JHR.LT.12)THEN - JD=JD-1 - FJD=.5+.041666667*REAL(JHR)+.00069444444*REAL(JMN) - ELSE - 7 FJD=.041666667E0*FLOAT(JHR-12)+.00069444444E0*FLOAT(JMN) - END IF - DAYINC=JHR/24.0 - FJD1=JD+FJD+DAYINC - JD=FJD1 - FJD=FJD1-JD -!*** -!*** CALCULATE THE SOLAR-EARTH DISTANCE -!*** - DAT=REAL(JD-JDOR2)-TPP+FJD -!*** -! COMPUTES TIME IN JULIAN CENTURIES AFTER EPOCH -!*** - T=FLOAT(JD-JDOR2)/36525.E0 -!*** -! COMPUTES LENGTH OF ANOMALISTIC AND TROPICAL YEARS (MINUS 365 DAYS) -!*** - YEAR=.25964134E0+.304E-5*T -!*** -! COMPUTES ORBIT ECCENTRICITY FROM T -!*** - EC=.01675104E0-(.418E-4+.126E-6*T)*T - YEAR=YEAR+365.E0 -!*** -! DATE=DAYS SINCE LAST PERIHELION PASSAGE -!*** - DATE = MOD(DAT,YEAR) -!*** -! SOLVE ORBIT EQUATIONS BY NEWTON'S METHOD -!*** - EM=PI2*DATE/YEAR - E=1.E0 - ITER = 0 - 31 EP=E-(E-EC*SIN(E)-EM)/(1.E0-EC*COS(E)) - CR=ABS(E-EP) - E=EP - ITER = ITER + 1 - IF(ITER.GT.10) GOTO 1031 - IF(CR.GT.CCR) GO TO 31 - 1031 CONTINUE - R1=1.E0-EC*COS(E) -! -! WRITE(6,1000)JYR,JMNTH,JDAY,JHR,R1 -! WRITE(6,*)JHR,R1 - 1000 FORMAT('SUN-EARTH DISTANCE CALCULATION FINISHED IN SOLARD'/ & - 'YEAR=',I5,' MONTH=',I3,' DAY=',I3,' HOUR=' & - , I3,' R1=',F9.4) -!*** -! RETURN TO RADTN -!*** - END SUBROUTINE SOLARD -!--------------------------------------------------------------------- - SUBROUTINE CAL_MON_DAY(JULDAY,julyr,Jmonth,Jday) -!--------------------------------------------------------------------- - IMPLICIT NONE -!----------------------------------------------------------------------- - INTEGER, INTENT(IN) :: JULDAY,julyr - INTEGER, INTENT(OUT) :: Jmonth,Jday - LOGICAL :: LEAP,NOT_FIND_DATE - INTEGER :: MONTH (12),itmpday,itmpmon,i -!----------------------------------------------------------------------- - DATA MONTH/31,28,31,30,31,30,31,31,30,31,30,31/ -!*********************************************************************** - NOT_FIND_DATE = .true. - - itmpday = JULDAY - itmpmon = 1 - LEAP=.FALSE. - IF(MOD(julyr,4).EQ.0)THEN - MONTH(2)=29 - LEAP=.TRUE. - ENDIF - - i = 1 - DO WHILE (NOT_FIND_DATE) - IF(itmpday.GT.MONTH(i))THEN - itmpday=itmpday-MONTH(i) - ELSE - Jday=itmpday - Jmonth=i - NOT_FIND_DATE = .false. - ENDIF - i = i+1 - END DO - - END SUBROUTINE CAL_MON_DAY -!!================================================================================ -! CO2 initialization code - - FUNCTION ANTEMP(L,Z) - REAL :: ZB(10,7),C(11,7),DELTA(10,7),TSTAR(7) -! ************** TROPICAL SOUNDING ************************** - DATA (ZB(N,1),N=1,10)/ 2.0, 3.0, 16.5, 21.5, 45.0, & - 51.0, 70.0, 100., 200., 300./ - DATA (C(N,1),N=1,11)/ -6.0, -4.0, -6.7, 4.0, 2.2, & - 1.0, -2.8, -.27, 0.0, 0.0, 0.0/ - DATA (DELTA(N,1),N=1,10)/.5, .5, .3, .5, 1.0, & - 1.0, 1.0, 1.0, 1.0, 1.0/ -! ************** SUB-TROPICAL SUMMER ************************ - DATA (ZB(N,2),N=1,10)/ 1.5, 6.5, 13.0, 18.0, 26.0, & - 36.0, 48.0, 50.0, 70.0, 100./ - DATA (C(N,2),N=1,11)/ -4.0, -6.0, -6.5, 0.0, 1.2, & - 2.2, 2.5, 0.0, -3.0, -0.25, 0.0/ - DATA (DELTA(N,2),N=1,10)/ .5, 1.0, .5, .5, 1.0, & - 1.0, 2.5, .5, 1.0, 1.0/ -! ************** SUB-TROPICAL WINTER ************************ - DATA (ZB(N,3),N=1,10)/ 3.0, 10.0, 19.0, 25.0, 32.0, & - 44.5, 50.0, 71.0, 98.0, 200.0/ - DATA (C(N,3),N=1,11)/ -3.5, -6.0, -0.5, 0.0, 0.4, & - 3.2, 1.6, -1.8, -0.7, 0.0, 0.0/ - DATA (DELTA(N,3),N=1,10)/ .5, .5, 1.0, 1.0, 1.0, & - 1.0, 1.0, 1.0, 1.0, 1.0/ -! ************* SUB-ARCTIC SUMMER ************************* - DATA (ZB(N,4),N=1,10)/ 4.7, 10.0, 23.0, 31.8, 44.0, & - 50.2, 69.2, 100.0, 102.0, 103.0/ - DATA (C(N,4),N=1,11)/ -5.3, -7.0, 0.0, 1.4, 3.0, & - 0.7, -3.3, -0.2, 0.0, 0.0, 0.0/ - DATA (DELTA(N,4),N=1,10)/ .5, .3, 1.0, 1.0, 2.0, & - 1.0, 1.5, 1.0, 1.0, 1.0/ -! ************ SUB-ARCTIC WINTER ***************************** - DATA (ZB(N,5),N=1,10)/ 1.0, 3.2, 8.5, 15.5, 25.0, & - 30.0, 35.0, 50.0, 70.0, 100.0/ - DATA (C(N,5),N=1,11)/ 3.0, -3.2, -6.8, 0.0, -0.6, & - 1.0, 1.2, 2.5, -0.7, -1.2, 0.0/ - DATA (DELTA(N,5),N=1,10)/ .4, 1.5, .3 , .5, 1.0, & - 1.0, 1.0, 1.0, 1.0, 1.0/ -! ************ US STANDARD 1976 ****************************** - DATA (ZB(N,6),N=1,10)/ 11.0, 20.0, 32.0, 47.0, 51.0, & - 71.0, 84.8520, 90.0, 91.0, 92.0/ - DATA (C(N,6),N=1,11)/ -6.5, 0.0, 1.0, 2.80, 0.0, & - -2.80, -2.00, 0.0, 0.0, 0.0, 0.0/ - DATA (DELTA(N,6),N=1,10)/ 0.3, 1.0, 1.0, 1.0, 1.0, & - 1.0, 1.0, 1.0, 1.0, 1.0/ -! -! ************ ENLARGED US STANDARD 1976 ********************** - DATA (ZB(N,7),N=1,10)/ 11.0, 20.0, 32.0, 47.0, 51.0, & - 71.0, 84.8520, 90.0, 91.0, 92.0/ - DATA (C(N,7),N=1,11)/ -6.5, 0.0, 1.0, 2.80, 0.0, & - -2.80, -2.00, 0.0, 0.0, 0.0, 0.0/ - DATA (DELTA(N,7),N=1,10)/ 0.3, 1.0, 1.0, 1.0, 1.0, & - 1.0, 1.0, 1.0, 1.0, 1.0/ -! - DATA TSTAR/ 300.0, 294.0, 272.2, 287.0, 257.1, 2*288.15/ -! - NLAST=10 - TEMP=TSTAR(L)+C(1,L)*Z - DO 20 N=1,NLAST - EXPO=(Z-ZB(N,L))/DELTA(N,L) - EXPP=ZB(N,L)/DELTA(N,L) -!JD single-precision change -! FAC=EXP(EXPP)+EXP(-EXPP) -!mp write(6,*) '.........................................' -!mp what in the hell does the next line do? -!mp -!mp apparently if statement <0 or =0 then 23, else 24 -!mp IF(ABS(EXPO)-100.0) 23,23,24 -! -! changed to a more reasonable value for the workstation -! - IF(ABS(EXPO)-50.0) 23,23,24 - 23 X=EXP(EXPO) - Y=X+1.0/X - ZLOG=ALOG(Y) - GO TO 25 - 24 ZLOG=ABS(EXPO) -!mp 25 IF(EXPP-100.0) 27,27,28 - 25 IF(EXPP-50.0) 27,27,28 -!JD single-precision change - 27 FAC=EXP(EXPP)+EXP(-EXPP) - FACLOG=ALOG(FAC) - GO TO 29 - 28 FACLOG=EXPP -! TEMP=TEMP+(C(N+1,L)-C(N,L))*0.5*(Z+DELTA(N,L)* -! 1 ALOG((EXP(EXPO)+EXP(-EXPO))/FAC)) - 29 TEMP=TEMP+(C(N+1,L)-C(N,L))*0.5*(Z+DELTA(N,L)* & - (ZLOG-FACLOG)) -!mp write(6,*) 'ANTEMP pieces (C,C,ZLOG,FACLOG)', C(N+1,L),C(N,L), -!mp + ZLOG,FACLOG - 20 CONTINUE - ANTEMP=TEMP - - END FUNCTION ANTEMP - -!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCc - - SUBROUTINE COEINT(RAT,IR) -! ********************************************************************** -! -! -! THE TRANSMISSION FUNCTION BETWEEN P1 AND P2 IS ASSUMED TO -! THE FUNCTIONAL FORM -! TAU(P1,P2)= 1.0-SQRT(C*LOG(1.0+X*PATH)), -! WHERE -! PATH(P1,P2)=((P1-P2)**2)*(P1+P2+CORE)/ -! (ETA*(P1+P2+CORE)+(P1-P2)) -! -! -! THE PARAMETERS C AND X ARE FUNCTIONS OF P2, AND ARE TO BE DETER -! WHILE CORE IS A PRESPECIFIED NUMBER.ETA IS A FUNCTION OF THE TH -! PRODUCT (CX);IT IS OBTAITED ITERATIVELY. THE DERIVATION OF ALL -! VALUES WILL BE EXPLAINED IN A FORTHCOMING PAPER. -! SUBROUTINE COEINT DETERMINES C(I) AND X(I) BY USING THE ACT -! VALUES OF TAU(P(I-2),P(I)) AND TAU(P(I-1),P(I)) AND THE PREVIOU -! ITERATION VALUE OF ETA. -! DEFINE: -! PATHA=PATH(P(I),P(I-2),CORE,ETA) -! PATHB=PATH(P(I),P(I-1),CORE,ETA); -! THEN -! R=(1-TAU(P(I),P(I-2)))/(1-TAU(P(I),P(I-1))) -! = SQRT(LOG(1+X*PATHA)/LOG(1+X*PATHB)), -! SO THAT -! R**2= LOG(1+X*PATHA)/LOG(1+X*PATHB). -! THIS EQUATION CAN BE SOLVED BY NEWTON S METHOD FOR X AND THEN T -! RESULT USED TO FIND C. THIS IS REPEATED FOR EACH VALUE OF I GRE -! THAN 2 TO GIVE THE ARRAYS X(I) AND C(I). -! NEWTON S METHOD FOR SOLVING THE EQUATION -! F(X)=0 -! MAKES USE OF THE LOOP XNEW= XOLD-F(XOLD)/FPRIME(XOLD). -! THIS IS ITERATED 20 TIMES, WHICH IS PROBABLY EXCESSIVE. -! THE FIRST GUESS FOR ETA IS 3.2E-4*EXP(-P(I)/1000),WHICH HAS -! BEEN FOUND TO BE FAIRLY REALISTIC BY EXPERIMENT; WE ITERATE 5 T -! (AGAIN,PROBABLY EXCESSIVELY) TO OBTAIN THE VALUES FOR C,X,ETA T -! USED FOR INTERPOLATION. -! THERE ARE SEVERAL POSSIBLE PITFALLS: -! 1) IN THE COURSE OF ITERATION, X MAY REACH A VALUE WHICH -! 1+X*PATHA NEGATIVE; IN THIS CASE THE ITERATION IS STOP -! AND AN ERROR MESSAGE IS PRINTED OUT. -! 2) EVEN IF (1) DOES NOT OCCUR, IT IS STILL POSSIBLE THAT -! BE NEGATIVE AND LARGE ENOUGH TO MAKE 1+X*PATH(P(I),0,C -! NEGATIVE. THIS IS CHECKED FOR IN A FINAL LOOP, AND IF -! A WARNING IS PRINTED OUT. -! -! ********************************************************************* -!.... -! IMPLICIT DOUBLE PRECISION (A-H,O-Z) -! COMMON/PRESS/PA(109) - REAL RAT,SINV -! REAL PA,CORE,TRANSA,PATH,UEXP,SEXP,ETA,SEXPV - REAL PA2 -! COMMON/TRAN/ TRANSA(109,109) -! COMMON/COEFS/XA(109),CA(109),ETA(109),SEXPV(109),CORE,UEXP,SEXP - DIMENSION PATH0(109),ETAP(109),XAP(109),CAP(109) - DIMENSION SINV(4) - INTEGER :: IERR - DATA SINV/2.74992,2.12731,4.38111,0.0832926/ -!NOV89 DIMENSION SINV(3) -!NOV89 DATA SINV/2.74992,2.12731,4.38111/ -!O222 OLD CODE USED 2.7528 RATHER THAN 2.74992 ---K.A.C. OCTOBER 1988 -!O222 WHEN 2.7528 WAS USED,WE EXACTLY REPRODUCED THE MRF CO2 ARRAYS - CORE=5.000 - UEXP=0.90 -! P0=0.7 - DO 902 I=1,109 - PA2=PA(I)*PA(I) - SEXPV(I)=.505+2.0E-5*PA(I)+.035*(PA2-.25)/(PA2+.25) -902 CONTINUE - DO 900 I=1,109 - ETA(I)=3.2E-4*EXP(-PA(I)/500.) - ETAP(I)=ETA(I) -900 CONTINUE - DO 1200 NP=1,10 - DO 1000 I=3,109 - SEXP=SEXPV(I) - R=(1.0D0-TRANSA(I,I-2))/(1.0D0-TRANSA(I,I-1)) - REXP=R**(UEXP/SEXP) - arg1=path(pa(i),pa(i-2),core,eta(i)) - arg2=path(pa(i),pa(i-1),core,eta(i)) - PATHA=(PATH(PA(I),PA(I-2),CORE,ETA(I)))**UEXP - PATHB=(PATH(PA(I),PA(I-1),CORE,ETA(I)))**UEXP - XX=2.0D0*(PATHB*REXP-PATHA)/(PATHB*PATHB*REXP-PATHA*PATHA) - DO 1010 LL=1,20 - F1=DLOG(1.0D0+XX*PATHA) - F2=DLOG(1.0D0+XX*PATHB) - F=F1/F2-REXP - FPRIME=(F2*PATHA/(1.0D0+XX*PATHA)-F1*PATHB/(1.0D0+XX*PATHB))/ & - (F2*F2) - XX=XX-F/FPRIME - CHECK=1.0D0+XX*PATHA -!!!! IF (CHECK) 1020,1020,1025 - IF(CHECK.LE.0.)THEN - WRITE(errmess,360)I,LL,CHECK - WRITE(errmess,*)' xx=',xx,' patha=',patha - 360 FORMAT(' ERROR,I=',I3,'LL=',I3,'CHECK=',F20.10) - CALL wrf_error_fatal ( errmess ) - ENDIF - 1010 CONTINUE - CA(I)=(1.0D0-TRANSA(I,I-2))**(UEXP/SEXP)/ & - (DLOG(1.0D0+XX*PATHA)+1.0D-20) - XA(I)=XX -1000 CONTINUE - XA(2)=XA(3) - XA(1)=XA(3) - CA(2)=CA(3) - CA(1)=CA(3) - DO 1100 I=3,109 - PATH0(I)=(PATH(PA(I),0.,CORE,ETA(I)))**UEXP - PATH0(I)=1.0D0+XA(I)*PATH0(I) -!+++ IF (PATH0(I).LT.0.) WRITE (6,361) I,PATH0(I),XA(I) -1100 CONTINUE - DO 1035 I=1,109 - SEXP=SEXPV(I) - ETAP(I)=ETA(I) - ETA(I)=(SINV(IR)/RAT)**(1./SEXP)* & - (CA(I)*XA(I))**(1./UEXP) -1035 CONTINUE -! -! THE ETA FORMULATION IS DETAILED IN SCHWARZKOPF AND FELS(1985). -! THE QUANTITY SINV=(G*DELTANU)/(RCO2*D*S) -! IN CGS UNITS,WITH D,THE DIFFUSICITY FACTOR=2, AND -! S,THE SUM OF CO2 LINE STRENGTHS OVER THE 15UM CO2 BAND -! ALSO,THE DENOMINATOR IS MULTIPLIED BY -! 1000 TO PERMIT USE OF MB UNITS FOR PRESSURE. -! S IS ACTUALLY WEIGHTED BY B(250) AT 10 CM-1 WIDE INTERVALS,IN -! ORDER TO BE CONSISTENT WITH THE METHODS USED TO OBTAIN THE LBL -! 1-BAND CONSOLIDATED TRANCMISSION FUNCTIONS. -! FOR THE 490-850 INTERVAL (DELTANU=360,IR=1) SINV=2.74992. -! (SLIGHTLY DIFFERENT FROM 2.7528 USED IN EARLIER VERSIONS) -! FOR THE 490-670 INTERVAL (IR=2) SINV=2.12731 -! FOR THE 670-850 INTERVAL (IR=3) SINV=4.38111 -! FOR THE 2270-2380 INTERVAL (IR=4) SINV=0.0832926 -! SINV HAS BEEN OBTAINED USING THE 1982 AFGL CATALOG FOR CO2 -! RAT IS THE ACTUAL CO2 MIXING RATIO IN UNITS OF 330 PPMV, -! LETTING USE OF THIS FORMULATION FOR ANY CO2 CONCENTRATION. -! -! WRITE (6,366) (NP,I,CA(I),XA(I),ETA(I),SEXPV(I),I=1,109) -!366 FORMAT (2I4,4E20.12) -1200 CONTINUE - 361 FORMAT (' **WARNING:** 1+XA*PATH(PA(I),0) IS NEGATIVE,I= ',I3,/ & - 20X,'PATH0(I)=',F16.6,' XA(I)=',F16.6) - RETURN - END SUBROUTINE COEINT - -!-------------- - - -!CCC PROGRAM CO2INS - SUBROUTINE CO2INS(T22,T23,T66,IQ,L,LP1,iflag) -! ********************************************************* -! SAVE DATA ON PERMANENT DATA SET DENOTED BY CO222 ****** -! ..... K.CAMPANA MARCH 1988,OCTOBER 1988... -! ..... K.CAMPANA DECEMBER 1988-CLEANED UP FOR LAUNCHER -! ..... K.CAMPANA NOVEMBER 1989-ALTERED FOR NEW RADIATION -! ********************************************************* - DIMENSION T22(LP1,LP1,3),T23(LP1,LP1,3),T66(LP1,LP1,6) - DIMENSION DCDT8(LP1,LP1),DCDT10(LP1,LP1),CO2PO(LP1,LP1), & - CO2800(LP1,LP1),CO2PO1(LP1,LP1),CO2801(LP1,LP1),CO2PO2(LP1,LP1), & - CO2802(LP1,LP1),N(LP1),D2CT8(LP1,LP1),D2CT10(LP1,LP1) -!CC ITIN=22 -!CC ITIN1=23 -!O222 LATEST CODE HAD IQ=1 -!CC IQ=4 -1011 FORMAT (4F20.14) -!CC READ (ITIN,1011) ((CO2PO(I,J),I=1,LP1),J=1,LP1) -!CC READ (ITIN1,1011) ((CO2800(I,J),I=1,LP1),J=1,LP1) -!CC READ (ITIN,1011) ((CO2PO1(I,J),I=1,LP1),J=1,LP1) -!CC READ (ITIN1,1011) ((CO2801(I,J),I=1,LP1),J=1,LP1) -!CC READ (ITIN,1011) ((CO2PO2(I,J),I=1,LP1),J=1,LP1) -!CC READ (ITIN1,1011) ((CO2802(I,J),I=1,LP1),J=1,LP1) - DO 300 J=1,LP1 - DO 300 I=1,LP1 - CO2PO(I,J) = T22(I,J,1) -!NOV89 - IF (IQ.EQ.5) GO TO 300 -!NOV89 - CO2PO1(I,J) = T22(I,J,2) - CO2PO2(I,J) = T22(I,J,3) - 300 CONTINUE - DO 301 J=1,LP1 - DO 301 I=1,LP1 - CO2800(I,J) = T23(I,J,1) -!NOV89 - IF (IQ.EQ.5) GO TO 301 -!NOV89 - CO2801(I,J) = T23(I,J,2) - CO2802(I,J) = T23(I,J,3) - 301 CONTINUE -!***THE FOLLOWING CODE IS REWRITTEN SO THAT THE RADIATIVE BANDS -! ARE: -! IQ=1 560-800 (CONSOL.=490-850) -! IQ=2 560-670 (CONSOL.=490-670) -! IQ=3 670-800 (CONSOL.=670-850) -! IQ=4 560-760 (ORIGINAL CODE) (CONSOL.=490-850) -!NOV89 -! IQ=5 2270-2380 (CONSOL.=2270-2380) -!NOV89 -! THE FOLLOWING LOOP OBTAINS TRANSMISSION FUNCTIONS FOR BANDS -! USED IN RADIATIVE MODEL CALCULATIONS,WITH THE EQUIVALENT -! WIDTHS KEPT FROM THE ORIGINAL CONSOLIDATED CO2 TF S. -!NOV89 -! NOTE: ALTHOUGH THE BAND TRANSMISSION FUNCTIONS ARE -! COMPUTED FOR ALL RADIATIVE BANDS, AS OF 9/28/88, THEY -! ARE WRITTEN OUT IN FULL ONLY FOR THE FULL 15 UM BAND CASES -! (IQ=1,4). IN OTHER CASES, THE TRANSMISSIVITIES (1,K) ARE -! WRITTEN OUT, AS THESE ARE THE ONLY ONES NEEDED FOR CTS -! CALCULATIONS. ALSO, FOR THE 4.3 UM BAND (IQ=5) THE TEMP. -! DERIVATIVE TERMS ARE NOT WRITTEN OUT, AS THEY ARE UNUSED. -!NOV89 - IF (IQ.EQ.1) THEN - C1=1.5 - C2x=0.5 - ENDIF - IF (IQ.EQ.2) THEN - C1=18./11. - C2x=7./11. - ENDIF - IF (IQ.EQ.3) THEN - C1=18./13. - C2x=5./13. - ENDIF - IF (IQ.EQ.4) THEN - C1=1.8 - C2x=0.8 - ENDIF -!NOV89 - IF (IQ.EQ.5) THEN - C1=1.0 - C2x=0.0 - ENDIF -!NOV89 - DO 1021 I=1,LP1 - DO 1021 J=1,LP1 - CO2PO(J,I)=C1*CO2PO(J,I)-C2x - CO2800(J,I)=C1*CO2800(J,I)-C2x -!NOV89 - IF (IQ.EQ.5) GO TO 1021 -!NOV89 - CO2PO1(J,I)=C1*CO2PO1(J,I)-C2x - CO2801(J,I)=C1*CO2801(J,I)-C2x - CO2PO2(J,I)=C1*CO2PO2(J,I)-C2x - CO2802(J,I)=C1*CO2802(J,I)-C2x -1021 CONTINUE -!NOV89 - IF (IQ.GE.1.AND.IQ.LE.4) THEN -!NOV89 - DO 1 J=1,LP1 - DO 1 I=1,LP1 - DCDT8(I,J)=.02*(CO2801(I,J)-CO2802(I,J))*100. - DCDT10(I,J)=.02*(CO2PO1(I,J)-CO2PO2(I,J))*100. - D2CT8(I,J)=.0016*(CO2801(I,J)+CO2802(I,J)-2.*CO2800(I,J))*1000. - D2CT10(I,J)=.0016*(CO2PO1(I,J)+CO2PO2(I,J)-2.*CO2PO(I,J))*1000. -1 CONTINUE -!NOV89 - ENDIF -!NOV89 -!O222 ********************************************************* -!CC REWIND 66 -! SAVE CDT51,CO251,C2D51,CDT58,CO258,C2D58..ON TEMPO FILE -!CC WRITE (66) DCDT10 -!CC WRITE (66) CO2PO -!CC WRITE (66) D2CT10 -!CC WRITE (66) DCDT8 -!CC WRITE (66) CO2800 -!CC WRITE (66) D2CT8 -!CC REWIND 66 -!NOV89 - IF (IQ.EQ.1.OR.IQ.EQ.4) THEN -!NOV89 - DO 400 J=1,LP1 - DO 400 I=1,LP1 - T66(I,J,1) = DCDT10(I,J) - T66(I,J,2) = CO2PO(I,J) - T66(I,J,3) = D2CT10(I,J) - T66(I,J,4) = DCDT8(I,J) - T66(I,J,5) = CO2800(I,J) - T66(I,J,6) = D2CT8(I,J) - 400 CONTINUE -!NOV89 - ELSE - DO 409 I=1,LP1 - T66(I,1,2) = CO2PO(1,I) - T66(I,1,5) = CO2800(1,I) - IF (IQ.EQ.5) GO TO 409 - T66(I,1,1) = DCDT10(1,I) - T66(I,1,3) = D2CT10(1,I) - T66(I,1,4) = DCDT8(1,I) - T66(I,1,6) = D2CT8(1,I) - 409 CONTINUE - ENDIF -!NOV89 -!O222 ********************************************************* - RETURN - END SUBROUTINE CO2INS -!O222 PROGRAM CO2INT(INPUT,TAPE5=INPUT) -!NOV89 - SUBROUTINE CO2INT(ITAPE,T15A,T15B,T22,RATIO,IR,NMETHD,NLEVLS,NLP1,NLP2) -!NOV89 -! ********************************************************* -! CHANGES TO DATA READ AND FORMAT SEE CO222 *** -! ..... K.CAMPANA MARCH 1988,OCTOBER 1988 -! CHANGES TO PASS ITAPE,AND IF IR=4,READ 1 CO2 REC..KAC NOV89 -! ********************************************************* -! CO2INT INTERPOLATES CARBON DIOXIDE TRANSMISSION FUNCTIONS -! FROM THE 109 LEVEL GRID,FOR WHICH THE TRANSMISSION FUNCTIONS -! HAVE BEEN PRE-CALCULATED, TO THE GRID STRUCTURE SPECIFIED BY THE -! USER. -! -! METHOD: -! -! CO2INT IS EMPLOYABLE FOR TWO PURPOSES: 1) TO OBTAIN TRANSMIS- -! SIVITIES BETWEEN ANY 2 OF AN ARRAY OF USER-DEFINED PRESSURES; AND -! 2) TO OBTAIN LAYER-MEAN TRANSMISSIVITIES BETWEEN ANY 2 OF AN ARRAY -! OF USER-DEFINED PRESSURE LAYERS.TO CLARIFY THESE TWO PURPOSES,SEE -! THE DIAGRAM AND DISCUSSION BELOW. -! CO2INT MAY BE USED TO EXECUTE ONLY ONE PURPOSE AT ONE TIME. -! -! LET P BE AN ARRAY OF USER-DEFINED PRESSURES -! AND PD BE USER-DEFINED PRESSURE LAYERS. -! -! - - - - - - - - - PD(I-1) --- -! ^ -! ----------------- P(I) ^ PRESSURE LAYER I (PLM(I)) -! ^ -! - - - - - - - - - PD(I) --- -! ^ -! ----------------- P(I+1) ^ PRESSURE LAYER I+1 (PLM(I+1)) -! ^ -! - - - - - - - - - PD(I+1)--- -! ... (THE NOTATION USED IS -! ... CONSISTENT WITH THE CODE) -! ... -! - - - - - - - - - PD(J-1) -! -! ----------------- P(J) -! -! - - - - - - - - - PD(J) -! -! PURPOSE 1: THE TRANSMISSIVITY BETWEEN SPECIFIC PRESSURES -! P(I) AND P(J) ,TAU(P(I),P(J)) IS COMPUTED BY THIS PROGRAM. -! IN THIS MODE,THERE IS NO REFERENCE TO LAYER PRESSURES PD -! (PD,PLM ARE NOT INPUTTED). -! -! PURPOSE 2: THE LAYER-MEAN TRANSMISSIVITY BETWEEN A LAYER- -! MEAN PRESSURE PLM(J) AND PRESSURE LAYER I IS GIVEN BY -! TAULM(PLM(I),PLM(J)). IT IS COMPUTED BY THE INTEGRAL -! -! PD(I) -! ---- -! 1 ^ -! ------------- * ^ TAU ( P',PLM(J) ) DP' -! PD(I)-PD(I-1) ^ -! ---- -! PD(I-1) -! -! THE LAYER-MEAN PRESSURE PLM(I) IS SPECIFIED BY THE USER. -! FOR MANY PURPOSES,PLM WILL BE CHOSEN TO BE THE AVERAGE -! PRESSURE IN THE LAYER-IE,PLM(I)=0.5*(PD(I-1)+PD(I)). -! FOR LAYER-MEAN TRANSMISSIVITIES,THE USER THUS INPUTS -! A PRESSURE ARRAY (PD) DEFINING THE PRESSURE LAYERS AND AN -! ARRAY (PLM) DEFINING THE LAYER-MEAN PRESSURES.THE CALCULATION -! DOES NOT DEPEND ON THE P ARRAY USED FOR PURPOSE 1 (P IS NOT -! INPUTTED). -! -! THE FOLLOWING PARAGRAPHS DEPICT THE UTILIZATION OF THIS -! CODE WHEN USED TO COMPUTE TRANSMISSIVITIES BETWEEN SPECIFIC -! PRESSURES. LATER PARAGRAPHS DESCRIBE ADDITIONAL FEATURES NEEDED -! FOR LAYER-MEAN TRANSMISSIVITIES. -! -! FOR A GIVEN CO2 MIXING RATIO AND STANDARD TEMPERATURE -! PROFILE,A TABLE OF TRANSMISSION FUNCTIONS FOR A FIXED GRID -! OF ATMOSPHERIC PRESSURES HAS BEEN PRE-CALCULATED. -! THE STANDARD TEMPERATURE PROFILE IS COMPUTED FROM THE US -! STANDARD ATMOSPHERE (1977) TABLE.ADDITIONALLY, THE -! SAME TRANSMISSION FUNCTIONS HAVE BEEN PRE-CALCULATED FOR A -! TEMPERATURE PROFILE INCREASED AND DECREASED (AT ALL LEVELS) -! BY 25 DEGREES. -! THIS PROGRAM READS IN THE PRESPECIFIED TRANSMISSION FUNCTIONS -! AND A USER-SUPPLIED PRESSURE GRID (P(I)) AND CALCULATES TRANS- -! MISSION FUNCTIONS ,TAU(P(I),P(J)), FOR ALL P(I) S AND P(J) S. -! A LOGARITHMIC INTERPOLATION SCHEME IS USED. -! THIS METHOD IS REPEATED FOR THE THREE TEMPERATURE PROFILES -! GIVEN ABOVE .THEREFORE OUTPUTS FROM THE PROGRAM ARE THREE TABLES -! OF TRANSMISSION FUNCTIONS FOR THE USER-SUPPLIED PRESSURE GRID. -! THE EXISTENCE OF THE THREE TABLES PERMITS SUBSEQUENT INTERPO- -! LATION TO A USER-SUPPLIED TEMPERATURE PROFILE USING THE METHOD -! DESCRIBED IN THE REFERENCE.SEE LIMITATIONS SECTION IF THE -! USER DESIRES TO OBTAIN ONLY 1 TABLE OF TRANSMISSIVITIES. -! -! MODIFICATIONS FOR LAYER-MEAN TRANSMISSIVITIES: -! THE PRESSURES INPUTTED ARE THE LAYER-MEAN PRESSURES,PD, -! AND THE LAYER-MEAN PRESSURES ,PLM. A SERIES OF TRANSMISSIVITIES -! (TAU(P'',PLM(J)) ARE COMPUTED AND THE INTEGRAL GIVEN IN THE -! DISCUSSION OF PURPOSE 2 IS COMPUTED.FOR PLM(I) NOT EQUAL TO -! PLM(J) SIMPSON S RULE IS USED WITH 5 POINTS. IF PLM(I)=PLM(J) -! (THE -NEARBY LAYER- CASE) A 49-POINT QUADRATURE IS USED FOR -! GREATER ACCURACY.THE OUTPUT IS IN TAULM(PLM(I),PLM(J)). -! NOTE: -! TAULM IS NOT A SYMMETRICAL MATRIX. FOR THE ARRAY ELEMENT -! TAULM(PLM(I),PLM(J)),THE INNER(FIRST,MOST RAPIDLY VARYING) -! DIMENSION IS THE VARYING LAYER-MEAN PRESSURE,PLM(I);THE OUTER -! (SECOND) DIMENSION IS THE FIXED LAYER-MEAN PRESSURE PLM(J). -! THUS THE ELEMENT TAULM(2,3) IS THE TRANSMISSION FUNCTION BETWEEN -! THE FIXED PRESSURE PLM(3) AND THE PRESSURE LAYER HAVING AN AVERAG -! PRESSURE OF PLM(2). -! ALSO NOTE THAT NO QUADRATURE IS PERFORMED OVER THE LAYER -! BETWEEN THE SMALLEST NONZERO PRESSURE AND ZERO PRESSURE; -! TAULM IS TAULM(0,PLM(J)) IN THIS CASE,AND TAULM(0,0)=1. -! -! -! REFERENCE: -! S.B.FELS AND M.D.SCHWARZKOPF,-AN EFFICIENT ACCURATE -! ALGORITHM FOR CALCULATING CO2 15 UM BAND COOLING RATES-,JOURNAL -! OF GEOPHYSICAL RESEARCH,VOL.86,NO. C2, PP.1205-1232,1981. -! MODIFICATIONS TO THE ALGORITHM HAVE BEEN MADE BY THE AUTHORS; -! CONTACT S.B.F.OR M.D.S. FOR FURTHER DETAILS.A NOTE TO J.G.R. -! IS PLANNED TO DOCUMENT THESE CHANGES. -! -! AUTHOR: M.DANIEL SCHWARZKOPF -! -! DATE: 14 JULY 1983 -! -! ADDRESS: -! -! G.F.D.L. -! P.O.BOX 308 -! PRINCETON,N.J.08540 -! U.S.A. -! TELEPHONE: (609) 452-6521 -! -! INFORMATION ON TAPE: THIS SOURCE IS THE FIRST FILE -! ON THIS TAPE.THE SIX FILES THAT FOLLOW ARE CO2 TRANS- -! MISSIVITIES FOR THE 500-850 CM-1 INTERVAL FOR CO2 -! CONCENTRATIONS OF 330 PPMV (1X) ,660 PPMV (2X), AND -! 1320 PPMV (4X). THE FILES ARE ARRANGED AS FOLLOWS: -! FILE 2 1X,CONSOLIDATED USING B(250) WEIGHTING FCTN. -! FILE 3 1X,CONSOLIDATED WITH NO WEIGHTING FCTN. -! FILE 4 2X,CONSOLIDATED USING B(250) WEIGHTING FCTN. -! FILE 5 2X,CONSOLIDATED WITH NO WEIGHTING FCTN. -! FILE 6 4X,CONSOLIDATED USING B(250) WEIGHTING FCTN. -! FILE 7 4X,CONSOLIDATED WITH NO WEIGHTING FCTN. -! FILES 2,4,6 ARE RECOMMENDED FOR USE IN OBTAINING -! TRANSMISSION FUNCTIONS FOR USE IN HEATING RATE -! COMPUTATIONS;THEY CORRESPOND TO THE TRANSMISSIVITIES -! DISCUSSED IN THE 1980 PAPER.FILES 3,5,7 ARE PROVIDED -! TO FACILITATE COMPARISON WITH OBSERVATION AND WITH OTHER -! CALCULATIONS. -! -! PROGRAM LANGUAGE: FORTRAN 1977,INCLUDING PARAMETER -! AND PROGRAM STATEMENTS.THE PROGRAM IS WRITTEN ON A -! CYBER 170-730.SEE THE SECTION ON LIMITATIONS FOR -! ADAPTATIONS TO OTHER MACHINES. -! -! INPUT UNITS,FORMATS AND FORMAT STATEMENT NOS: -! -! UNIT NO VARIABLES FORMAT STATEMENT NO. TYPE -! 5 P (PURPOSE 1) (5E16.9) 201 CARDS -! 5 PD (PURPOSE 2) (5E16.9) 201 CARDS -! 5 PLM(PURPOSE 2) (5E16.9) 201 CARDS -! 5 NMETHD (I3) 202 CARDS -! 20 TRANSA (4F20.14) 102 TAPE -!NOV89 -! ITAPE TRANSA (4F20.14) 102 TAPE -!NOV89 -! -! OUTPUT UNITS,FORMATS AND FORMAT STATEMENT NOS: -! -! UNIT NO VARIABLES FORMAT STATEMENT NO. -! 6 TRNFCT (1X,8F15.8) 301 PRINT -! 22 TRNFCT (4F20.14) 102 TAPE -! -! PARAMETER INPUTS: -! A) NLEVLS : NLEVLS IS AN (INTEGER) PARAMETER DENOTING -! THE NUMBER OF NONZERO PRESSURE LEVELS FOR PURPOSE 1 -! OR THE NUMBER OF NONZERO LAYER PRESSURES NEEDED TO -! SPECIFY THE PRESSURE LAYERS(PURPOSE 2) IN THE OUTPUT -! GRID. FOR EXAMPLE,IN PURPOSE 1,IF P=0,100,1000,NLEVLS=2. -! IF,IN PURPOSE 2,PD=0,100,500,1000,THE NUMBER OF NONZERO -! PRESSURE LAYERS=2,SO NLEVLS=2 -! IN THE CODE AS WRITTEN,NLEVLS=40; THE USER SHOULD -! CHANGE THIS VALUE TO A USER-SPECIFIED VALUE. -! B) NLP1,NLP2 : INTEGER PARAMETERS DEFINED AS: NLP1=NLEVLS+1; -! NLP2=NLEVLS+2. -! SEE LIMITATIONS FOR CODE MODIFICATIONS IF PARAMETER -! STATEMENTS ARE NOT ALLOWED ON YOUR MACHINE. -! -! INPUTS: -! -! A) TRANSA : THE 109X109 GRID OF TRANSMISSION FUNCTIONS -! TRANSA IS A DOUBLE PRECISION REAL ARRAY. -! -! TRANSA IS READ FROM FILE 20. THIS FILE CONTAINS 3 -! RECORDS,AS FOLLOWS: -! 1) TRANSA, STANDARD TEMPERATURE PROFILE -! 3) TRANSA, STANDARD TEMPERATURES + 25 DEG -! 5) TRANSA, STANDARD TEMPERATURES - 25 DEG -! -! B) NMETHD: AN INTEGER WHOSE VALUE IS EITHER 1 (IF CO2INT IS -! TO BE USED FOR PURPOSE 1) OR 2 (IF CO2INT IS TO BE USED FOR -! PURPOSE 2). -! -! C) P,PD,PLM : -! P IS A REAL ARRAY (LENGTH NLP1) SPECIFYING THE PRESSURE -! GRID AT WHICH TRANSMISSION FUNCTIONS ARE TO BE COMPUTED FOR -! PURPOSE 1.THE DIMENSION OF P IS IN MILLIBARS.THE -! FOLLOWING LIMITATIONS WILL BE EXPLAINED MORE -! IN THE SECTION ON LIMITATIONS: P(1) MUST BE ZERO; P(NLP1),THE -! LARGEST PRESSURE, MUST NOT EXCEED 1165 MILLIBARS. -! PD IS A REAL ARRAY (LENGTH NLP2) SPECIFYING THE PRESSURE -! LAYERS FOR WHICH LAYER-AVERAGED TRANSMISSION FUNCTIONS ARE -! TO BE COMPUTED.THE DIMENSION OF PD IS MILLIBARS.THE LIMITATIONS -! FOR PD ARE THE SAME AS FOR P,AND ARE GIVEN IN THE SECTION ON -! LIMITATIONS. -! PLM IS A REAL ARRAY (LENGTH NLP2) SPECIFYING THE LAYER-MEAN -! PRESSURES. THE DIMENSION OF PLM IS MILLIBARS. THE LIMITATIONS -! FOR PLM ARE THE SAME AS FOR P,AND ARE GIVEN IN THE SECTION ON -! LIMITATIONS.PD IS READ IN BEFORE PLM. -! -! NOTE: AGAIN,WE NOTE THAT THE USER WILL INPUT EITHER P (FOR -! PURPOSE 1) OR PD AND PLM(FOR PURPOSE 2) BUT NOT BOTH. -! -! -! -! -! LIMITATIONS: -! 1) P(1)=0.,PD(1)=0.,PLM(1)=0. THE TOP PRESSURE LEVEL -! MUST BE ZERO,OR THE TOP PRESSURE LAYER MUST BE BOUNDED BY ZERO. -! THE TOP LAYER-MEAN PRESSURE (PLM(1)) MUST BE ZERO; NO -! QUADRATURE IS DONE ON THE TOP PRESSURE LAYER.EVEN IF ONE IS -! NOT INTERESTED IN THE TRANSMISSION FUNCTION BETWEEN 0 AND P(J), -! ONE MUST INCLUDE SUCH A LEVEL. -! 2) PD(NLP2)=P(NLP1) IS LESS THAN OR EQUAL TO 1165 MB. -! EXTRAPOLATION TO HIGHER PRESSURES IS NOT POSSIBLE. -! 3) IF PROGRAM IS NOT PERMITTED ON YOUR COMPILER, -! SIMPLY DELETE THE LINE. -! 4) IF PARAMETER IS NOT PERMITTED,DO THE FOLLOWING: -! 1) DELETE ALL PARAMETER STATEMENTS IN CO2INT -! 2) AT THE POINT WHERE NMETHOD IS READ IN,ADD: -! READ (5,202) NLEVLS -! NLP1=NLEVLS+1 -! NLP2=NLEVLS+2 -! 3) CHANGE DIMENSION AND/OR COMMON STATEMENTS DEFINING -! ARRAYS TRNS,DELTA,P,PD,TRNFCT,PS,PDS,PLM IN CO2INT. -! THE NUMERICAL VALUE OF (NLEVLS+1) SHOULD BE INSERTED -! IN DIMENSION OR COMMON STATEMENTS FOR TRNS,DELTA, -! P,TRNFCT,PS,PLM; THE NUMERICAL VALUE OF (NLEVLS+2) -! IN DIMENSION OR COMMON STATEMENTS FOR PD,PDS. -! 5) PARAMETER (NLEVLS=40) AND THE OTHER PARAMETER -! STATEMENTS ARE WRITTEN IN CDC FORTRAN; ON OTHER MACHINES THE -! SAME STATEMENT MAY BE WRITTEN DIFFERENTLY,FOR EXAMPLE AS -! PARAMETER NLEVLS=40 -! 6) -DOUBLE PRECISION- IS USED INSTEAD OF -REAL*8- ,DUE TO -! REQUIREMENTS OF CDC FORTAN. -! 7) THE STATEMENT -DO 400 KKK=1,3- CONTROLS THE NUMBER OF -! TRANSMISSIVITY OUTPUT MATRICES PORDUCED BY THE PROGRAM.TO -! PRODUCE 1 OUTPUT MATRIX,DELETE THIS STATEMENT. -! -! OUTPUT: -! A) TRNFCT IS AN (NLP1,NLP1) REAL ARRAY OF THE TRANSMISSION -! FUNCTIONS APPROPRIATE TO YOUR ARRAY. IT IS TO BE SAVED ON FILE 22. -! THE PROCEDURE FOR SAVING MAY BE MODIFIED; AS GIVEN HERE,THE -! OUTPUT IS IN CARD IMAGE FORM WITH A FORMAT OF (4F20.14). -! -! B) PRINTED OUTPUT IS A LISTING OF TRNFCT ON UNIT 6, IN -! THE FORMAT (1X,8F15.8) (FORMAT STATEMENT 301). THE USER MAY -! MODIFY OR ELIMINATE THIS AT WILL. -! -! ************ FUNCTION INTERPOLATER ROUTINE ***************** -! -! -! ****** THE FOLLOWING PARAMETER GIVES THE NUMBER OF ******* -! ****** DATA LEVELS IN THE MODEL ******* -! **************************************************************** -! **************************************************************** - COMMON/INPUT/P1,P2,TRNSLO,IA,JA,N -! COMMON/PRESS/PA(109) -! COMMON/TRAN/ TRANSA(109,109) -! COMMON / OUTPUT / TRNS(NLP1,NLP1) -! COMMON/INPUTP/P(NLP1),PD(NLP2) - DIMENSION TRNS(NLP1,NLP1) - DIMENSION P(NLP1),PD(NLP2) - DIMENSION PS(NLP1),PDS(NLP2),PLM(NLP1) - DIMENSION NRTAB(3) - DIMENSION T15A(NLP2,2),T15B(NLP1) - DIMENSION T22(NLP1,NLP1,3) - LOGICAL , EXTERNAL :: wrf_dm_on_monitor - DATA NRTAB/1,2,4/ -!*********************************** -! THE FOLLOWING ARE THE INPUT FORMATS -100 FORMAT (4F20.14) -743 FORMAT (F20.14) -201 FORMAT (5E16.9) -202 FORMAT (I3) -!O222 203 FORMAT (F12.6,I2) -203 FORMAT (F12.6) -! THE FOLLOWING ARE THE OUTPUT FORMATS -102 FORMAT (4F20.14) -301 FORMAT (1X,8F15.8) -! -!CC REWIND 15 -!CC REWIND 20 -!NOV89 - REWIND ITAPE -!NOV89 -!CC REWIND 22 -! -! CALCULATION OF PA -THE -TABLE- OF 109 GRID PRESSURES -! NOTE-THIS CODE MUST NOT BE CHANGED BY THE USER^^^^^^^^^ - PA(1)=0. - FACT15=10.**(1./15.) - FACT30=10.**(1./30.) - PA(2)=1.0E-3 - DO 231 I=2,76 - PA(I+1)=PA(I)*FACT15 -231 CONTINUE - DO 232 I=77,108 - PA(I+1)=PA(I)*FACT30 -232 CONTINUE -! - N=25 - NLV=NLEVLS - NLP1V=NLP1 - NLP2V=NLP2 -! READ IN THE CO2 MIXING RATIO(IN UNITS OF 330 PPMV),AND AN INDEX -! GIVING THE FREQUENCY RANGE OF THE LBL DATA -!O222 READ (5,203) RATIO,IR -!CC IR = 1 -!CC READ (5,203) RATIO -!O222 *********************************** -!***VALUES FOR IR***** -! IR=1 CONSOL. LBL TRANS. =490-850 -! IR=2 CONSOL. LBL TRANS. =490-670 -! IR=3 CONSOL. LBL TRANS. =670-850 -! IR=4 CONSOL. LBL TRANS. =2270-2380 -!*** IR MUST BE 1,2,3 OR 4 FOR THE PGM. TO WORK -! ALSO READ IN THE METHOD NO.(1 OR 2) -!CC READ (5,202) NMETHD - IF (RATIO.EQ.1.0) GO TO 621 - CALL wrf_error_fatal( 'SUBROUTINE CO2INT: 8746' ) -!NOV89 621 ITAP1=20 -621 ITAP1=ITAPE -!NOV89 - NTAP=1 - IF (NMETHD.EQ.2) GO TO 502 -! *****CARDS FOR PURPOSE 1(NMETHD=1) -!CC READ (15,201) (P(I),I=1,NLP1) - DO 300 I=1,NLP1 - P(I)=T15B(I) - 300 CONTINUE - DO 801 I=1,NLP1 - PS(I)=P(I) -801 CONTINUE - GO TO 503 -502 CONTINUE -! *****CARDS FOR PURPOSE 2(NMETHD=2) -!CC READ (15,201) (PD(I),I=1,NLP2) -!CC READ (15,201) (PLM(I),I=1,NLP1) - DO 303 I=1,NLP2 - PD(I)=T15A(I,1) - 303 CONTINUE - DO 302 I=1,NLP1 - PLM(I)=T15A(I,2) - 302 CONTINUE - DO 802 I=1,NLP1 - PDS(I)=PD(I+1) - PS(I)=PLM(I) -802 CONTINUE -! -503 CONTINUE -! *****DO LOOP CONTROLLING NUMBER OF OUTPUT MATRICES -!NOV89 -!NOV89 DO 400 KKK=1,3 - ICLOOP = 3 - IF (IR.EQ.4) ICLOOP = 1 - DO 400 KKK=1,ICLOOP -!NOV89 -! ********************** - IF (NMETHD.EQ.2) GO TO 505 -! *****CARDS FOR PURPOSE 1(NMETHD=1) - DO 803 I=1,NLP1 - P(I)=PS(I) -803 CONTINUE - GO TO 506 -505 CONTINUE -! *****CARDS FOR PURPOSE 2(NMETHD=2) - DO 804 I=1,NLP1 - PD(I)=PDS(I) - P(I)=PS(I) -804 CONTINUE -! -506 CONTINUE - IA=108 - IAP=IA+1 -!NOV89 IF (NTAP.EQ.1) READ (20,100) ((TRANSA(I,J),I=1,109),J=1,109) -!mp IF (NTAP.EQ.1) READ (ITAPE,100) ((TRANSA(I,J),I=1,109),J=1,109) - IF (NTAP.EQ.1) THEN - IF ( wrf_dm_on_monitor() ) READ (ITAPE,743) ((TRANSA(I,J),I=1,109),J=1,109) - CALL wrf_dm_bcast_bytes ( TRANSA , size ( TRANSA ) * RWORDSIZE ) - ENDIF -!mp IF (NTAP.EQ.1) READ (ITAPE,100) (tmp(I),I=1,11881 -!mp - do J=109,1,-6 -!mp write(6,697)(TRANSA(I,J),I=5,105,10) - enddo - 697 format(11(f5.3,1x)) -!mp -!NOV89 - DO 4 I=1,IAP - TRANSA(I,I)=1.0 - 4 CONTINUE - CALL COEINT(RATIO,IR) - DO 805 I=1,NLP1 - DO 805 J=1,NLP1 - TRNS(J,I)=1.00 -805 CONTINUE - DO 10 I=1,NLP1 - DO 20 J=1,I - IF (I.EQ.J) GO TO 20 - P1=P(J) - P2=P(I) - CALL SINTR2 - TRNS(J,I)=TRNSLO -20 CONTINUE -10 CONTINUE - DO 47 I=1,NLP1 - DO 47 J=I,NLP1 - TRNS(J,I)=TRNS(I,J) -47 CONTINUE -! *****THIS IS THE END OF PURPOSE 1 CALCULATIONS - IF (NMETHD.EQ.1) GO TO 2872 -! - DO 51 J=1,NLP1 - DO 52 I=2,NLP1 - IA=I - JA=J - N=25 - IF (I.NE.J) N=3 - CALL QUADSR(NLV,NLP1V,NLP2V,P,PD,TRNS) -52 CONTINUE -51 CONTINUE -! *****THIS IS THE END OF PURPOSE 2 CALCULATIONS -2872 CONTINUE -! -!+++ WRITE (6,301) ((TRNS(I,J),I=1,NLP1),J=1,NLP1) -!CC WRITE (22,102) ((TRNS(I,J),I=1,NLP1),J=1,NLP1) - DO 304 J=1,NLP1 - DO 304 I=1,NLP1 - T22(I,J,KKK) = TRNS(I,J) - 304 CONTINUE -400 CONTINUE - RETURN - END SUBROUTINE CO2INT -!CCC PROGRAM CO2IN1 - SUBROUTINE CO2IN1(T20,T21,T66,IQ,L,LP1) -! CO2IN1=CO2INS FOR METHOD 1 -! ********************************************************* -! SAVE DATA ON PERMANENT DATA SET DENOTED BY CO222 *** -! ..... K.CAMPANA MARCH 1988,OCTOBER 1988 -! ..... K.CAMPANA DECEMBER 88 CLEANED UP FOR LAUNCHER -! ********************************************************* - DIMENSION T20(LP1,LP1,3),T21(LP1,LP1,3),T66(L,6) - DIMENSION DCDT8(LP1,LP1),DCDT10(LP1,LP1),CO2PO(LP1,LP1), & - CO2800(LP1,LP1),CO2PO1(LP1,LP1),CO2801(LP1,LP1),CO2PO2(LP1,LP1), & - CO2802(LP1,LP1),N(LP1),D2CT8(LP1,LP1),D2CT10(LP1,LP1) - ITIN=20 - ITIN1=21 -!O222 LATEST CODE HAS IQ=1 -!CC IQ=4 -1011 FORMAT (4F20.14) -!CC READ (ITIN,1011) ((CO2PO(I,J),I=1,LP1),J=1,LP1) -!CC READ (ITIN1,1011) ((CO2800(I,J),I=1,LP1),J=1,LP1) -!CC READ (ITIN,1011) ((CO2PO1(I,J),I=1,LP1),J=1,LP1) -!CC READ (ITIN1,1011) ((CO2801(I,J),I=1,LP1),J=1,LP1) -!CC READ (ITIN,1011) ((CO2PO2(I,J),I=1,LP1),J=1,LP1) -!CC READ (ITIN1,1011) ((CO2802(I,J),I=1,LP1),J=1,LP1) - DO 300 J=1,LP1 - DO 300 I=1,LP1 - CO2PO(I,J) = T20(I,J,1) -!NOV89 - IF (IQ.EQ.5) GO TO 300 -!NOV89 - CO2PO1(I,J) = T20(I,J,2) - CO2PO2(I,J) = T20(I,J,3) - 300 CONTINUE - DO 301 J=1,LP1 - DO 301 I=1,LP1 - CO2800(I,J) = T21(I,J,1) -!NOV89 - IF (IQ.EQ.5) GO TO 301 -!NOV89 - CO2801(I,J) = T21(I,J,2) - CO2802(I,J) = T21(I,J,3) - 301 CONTINUE -!***THE FOLLOWING CODE IS REWRITTEN SO THAT THE RADIATIVE BANDS -! ARE: -! IQ=1 560-800 (CONSOL.=490-850) -! IQ=2 560-670 (CONSOL.=490-670) -! IQ=3 670-800 (CONSOL.=670-850) -! IQ=4 560-760 (ORIGINAL CODE) (CONSOL.=490-850) -!NOV89 -! IQ=5 2270-2380 (CONSOL.=2270-2380) -!NOV89 -! THE FOLLOWING LOOP OBTAINS TRANSMISSION FUNCTIONS FOR BANDS -! USED IN RADIATIVE MODEL CALCULATIONS,WITH THE EQUIVALENT -! WIDTHS KEPT FROM THE ORIGINAL CONSOLIDATED CO2 TF S. - IF (IQ.EQ.1) THEN - C1=1.5 - C2x=0.5 - ENDIF - IF (IQ.EQ.2) THEN - C1=18./11. - C2x=7./11. - ENDIF - IF (IQ.EQ.3) THEN - C1=18./13. - C2x=5./13. - ENDIF - IF (IQ.EQ.4) THEN - C1=1.8 - C2x=0.8 - ENDIF -!NOV89 - IF (IQ.EQ.5) THEN - C1=1.0 - C2x=0.0 - ENDIF -!NOV89 - DO 1021 I=1,LP1 - DO 1021 J=1,LP1 - CO2PO(J,I)=C1*CO2PO(J,I)-C2x - CO2800(J,I)=C1*CO2800(J,I)-C2x -!NOV89 - IF (IQ.EQ.5) GO TO 1021 -!NOV89 - CO2PO1(J,I)=C1*CO2PO1(J,I)-C2x - CO2801(J,I)=C1*CO2801(J,I)-C2x - CO2PO2(J,I)=C1*CO2PO2(J,I)-C2x - CO2802(J,I)=C1*CO2802(J,I)-C2x -1021 CONTINUE -!NOV89 - IF (IQ.GE.1.AND.IQ.LE.4) THEN -!NOV89 - DO 1 J=1,LP1 - DO 1 I=1,LP1 - DCDT8(I,J)=.02*(CO2801(I,J)-CO2802(I,J))*100. - DCDT10(I,J)=.02*(CO2PO1(I,J)-CO2PO2(I,J))*100. - D2CT8(I,J)=.0016*(CO2801(I,J)+CO2802(I,J)-2.*CO2800(I,J))*1000. - D2CT10(I,J)=.0016*(CO2PO1(I,J)+CO2PO2(I,J)-2.*CO2PO(I,J))*1000. -1 CONTINUE -!NOV89 - ENDIF -!NOV89 -!O222 ********************************************************* -!CC REWIND 66 -! SAVE CDTM51,CO2M51,C2DM51,CDTM58,CO2M58,C2DM58..ON TEMPO FILE -!CC WRITE (66) (DCDT10(I,I+1),I=1,L) -!CC WRITE (66) (CO2PO(I,I+1),I=1,L) -!CC WRITE (66) (D2CT10(I,I+1),I=1,L) -!CC WRITE (66) (DCDT8(I,I+1),I=1,L) -!CC WRITE (66) (CO2800(I,I+1),I=1,L) -!CC WRITE (66) (D2CT8(I,I+1),I=1,L) -!CC REWIND 66 -!O222 ********************************************************* - DO 400 I=1,L - T66(I,2) = CO2PO(I,I+1) - T66(I,5) = CO2800(I,I+1) -!NOV89 - IF (IQ.EQ.5) GO TO 400 -!NOV89 - T66(I,1) = DCDT10(I,I+1) - T66(I,3) = D2CT10(I,I+1) - T66(I,4) = DCDT8(I,I+1) - T66(I,6) = D2CT8(I,I+1) - 400 CONTINUE - RETURN - END SUBROUTINE CO2IN1 -!CCC PROGRAM PTZ - COURTESY OF DAN SCHWARZKOPF,GFDL DEC 1987.... - SUBROUTINE CO2PTZ(SGTEMP,T41,T42,T43,T44,SGLVNU,SIGLNU, & - SFULL,SHALF,PPTOP,LREAD,NL,NLP,NLP2) -! -! ** THIS PROGRAM CALCULATES TEMPERATURES ,H2O MIXING RATIOS -! ** AND O3 MIXING RATIOS BY USING AN ANALYTICAL -! ** FUNCTION WHICH APPROXIMATES -! ** THE US STANDARD (1976). THIS IS -! ** CALCULATED IN FUNCTION 'ANTEMP', WHICH IS CALLED BY THE -! ** MAIN PROGRAM. THE FORM OF THE ANALYTICAL FUNCTION WAS -! ** SUGGESTED TO ME IN 1971 BY RICHARD S. LINDZEN. -! ****************************************************************** -! CODE TO SAVE STEMP,GTEMP ON DATA SET,BRACKETED BY CO222 ** -! ....K. CAMPANA MARCH 88,OCTOBER 88 - DIMENSION SGTEMP(NLP,2),T41(NLP2,2),T42(NLP), & - T43(NLP2,2),T44(NLP) - DIMENSION SGLVNU(NLP),SIGLNU(NL) - DIMENSION SFULL(NLP),SHALF(NL) -! ****************************************************************** -! -!*****THIS VERSION IS ONLY USABLE FOR 1976 US STD ATM AND OBTAINS -! QUANTITIES FOR CO2 INTERPOLATION AND INSERTION INTO OPERA- -! TIONAL RADIATION CODES -! - CHARACTER*20 PROFIL - DIMENSION PRESS(NLP),TEMP(NLP),ALT(NLP),WMIX(NLP),O3MIX(NLP) - DIMENSION WMXINT(NLP,4),WMXOUT(NLP2),OMXINT(NLP,4),OMXOUT(NLP2) - DIMENSION PD(NLP2),GTEMP(NLP) - DIMENSION PRS(NLP),TEMPS(NLP),PRSINT(NLP),TMPINT(NLP,4),A(NLP,4) - DIMENSION PROUT(NLP2),TMPOUT(NLP2),TMPFLX(NLP2),TMPMID(NLP2) -! -! - DATA PROFIL/ & - 'US STANDARD 1976'/ - DATA PSMAX/1013.250/ -! -! ** NTYPE IS AN INTEGER VARIABLE WHICH HAS THE FOLLOWING -! ** VALUES: 0 =SIGMA LEVELS ARE USED; 1= SKYHI L40 LEVELS -! ** ARE USED; 2 = SKYHI L80 LEVELS ARE USED. DEFAULT: 0 -! - NTYPE=0 -!O222 READ (*,*) NTYPE - 5 NLEV=NL - DELZAP=0.5 - R=8.31432 - G0=9.80665 - ZMASS=28.9644 - AA=6356.766 - ALT(1)=0.0 - TEMP(1)=ANTEMP(6,0.0) -!*******DETERMINE THE PRESSURES (PRESS) - PSTAR=PSMAX -! -!*** LTOP COMPUTATION MOVED FROM MODEL INITIALIZATION -! - LTOP(1)=0 - LTOP(2)=0 - LTOP(3)=0 - DO 30 N=1,NL - PCLD=(PSTAR-PPTOP*10.)*SHALF(N)+PPTOP*10. - IF(PCLD.GE.642.)LTOP(1)=N - IF(PCLD.GE.350.)LTOP(2)=N - IF(PCLD.GE.150.)LTOP(3)=N -! PRINT *,N,PCLD,SHALF(N),PSTAR,PPTOP - 30 CONTINUE -! -!O222 IF (NTYPE.EQ.1) CALL SKYP(PSTAR,PD,GTEMP) -!O222 IF (NTYPE.EQ.2) CALL SKY80P(PSTAR,PD,GTEMP) -!O222 IF (NTYPE.EQ.0) CALL SIGP(PSTAR,PD,GTEMP) -!CC---- CALL SIGP(PSTAR,PD,GTEMP) - NLM=NL-1 - CALL SIGP(PSTAR,PD,GTEMP,T41,T42,T43,T44,SGLVNU,SIGLNU, & - SFULL,SHALF,PPTOP,LREAD,NL,NLP,NLM,NLP2) - PD(NLP2)=PSTAR - DO 40 N=1,NLP - PRSINT(N)=PD(NLP2+1-N) - 40 CONTINUE -! *** CALCULATE TEMPS FOR SEVERAL PRESSURES TO DO QUADRATURE - DO 504 NQ=1,4 - DO 505 N=2,NLP - 505 PRESS(N)=PRSINT(N)+0.25*(NQ-1)*(PRSINT(N-1)-PRSINT(N)) - PRESS(1)=PRSINT(1) -!********************* - DO 100 N=1,NLEV -! -! ** ESTABLISH COMPUTATATIONAL LEVELS BETWEEN USER LEVELS AT -! ** INTERVALS OF APPROXIMATELY 'DELZAP' KM. -! - DLOGP=7.0*ALOG(PRESS(N)/PRESS(N+1)) - NINT=DLOGP/DELZAP - NINT=NINT+1 - ZNINT=NINT -! G=G0 - DZ=R*DLOGP/(7.0*ZMASS*G0*ZNINT) - HT=ALT(N) -! -! ** CALCULATE HEIGHT AT NEXT USER LEVEL BY MEANS OF -! ** RUNGE-KUTTA INTEGRATION. -! - DO 200 M=1,NINT - RK1=ANTEMP(6,HT)*DZ - RK2=ANTEMP(6,HT+0.5*RK1)*DZ - RK3=ANTEMP(6,HT+0.5*RK2)*DZ - RK4=ANTEMP(6,HT+RK3)*DZ -!mp write(6,*) 'RK values,DZ ', RK1,RK2,RK3,RK4,DZ - HT=HT+0.16666667*(RK1+RK2+RK2+RK3+RK3+RK4) - 200 CONTINUE - ALT(N+1)=HT - TEMP(N+1)=ANTEMP(6,HT) - 100 CONTINUE - DO 506 N=1,NLP - TMPINT(N,NQ)=TEMP(N) - A(N,NQ)=ALT(N) -506 CONTINUE -504 CONTINUE -!O222 ***************************************************** -!***OUTPUT TEMPERATURES -!O222 ***************************************************** - DO 901 N=1,NLP - SGTEMP(N,1) = TMPINT(NLP2-N,1) - 901 CONTINUE -!O222 ***************************************************** -!***OUTPUT GTEMP -!O222 ***************************************************** - DO 902 N=1,NLP - SGTEMP(N,2) = GTEMP(N) - 902 CONTINUE -!O222 ***************************************************** - RETURN - END SUBROUTINE CO2PTZ - FUNCTION PATH(A,B,C,E) -!.... -! DOUBLE PRECISION XA,CA -! COMMON/COEFS/XA(109),CA(109),ETA(109),SEXPV(109),CORE,UEXP,SEXP - PEXP=1./SEXP - PATH=((A-B)**PEXP*(A+B+C))/(E*(A+B+C)+(A-B)**(PEXP-1.)) - RETURN - END FUNCTION PATH -!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - SUBROUTINE QINTRP(XM,X0,XP,FM,F0,FP,X,F) -!.... -! DOUBLE PRECISION FM,F0,FP,F,D1,D2,B,A,DEL - D1=(FP-F0)/(XP-X0) - D2=(FM-F0)/(XM-X0) - B=(D1-D2)/(XP-XM) - A=D1-B*(XP-X0) - DEL=(X-X0) - F=F0+DEL*(A+DEL*B) - RETURN - END SUBROUTINE QINTRP - SUBROUTINE QUADSR(NLV,NLP1V,NLP2V,P,PD,TRNS) - COMMON/INPUT/P1,P2,TRNSLO,IA,JA,N - DIMENSION P(NLP1V),PD(NLP2V),TRNS(NLP1V,NLP1V) - DIMENSION WT(101) - N2=2*N - N2P=2*N+1 -! *****WEIGHTS ARE CALCULATED - WT(1)=1. - DO 21 I=1,N - WT(2*I)=4. - WT(2*I+1)=1. -21 CONTINUE - IF (N.EQ.1) GO TO 25 - DO 22 I=2,N - WT(2*I-1)=2. -22 CONTINUE -25 CONTINUE - TRNSNB=0. - DP=(PD(IA)-PD(IA-1))/N2 - PFIX=P(JA) - DO 1 KK=1,N2P - PVARY=PD(IA-1)+(KK-1)*DP - IF (PVARY.GE.PFIX) P2=PVARY - IF (PVARY.GE.PFIX) P1=PFIX - IF (PVARY.LT.PFIX) P1=PVARY - IF (PVARY.LT.PFIX) P2=PFIX - CALL SINTR2 - TRNSNB=TRNSNB+TRNSLO*WT(KK) -1 CONTINUE - TRNS(IA,JA)=TRNSNB*DP/(3.*(PD(IA)-PD(IA-1))) - RETURN - END SUBROUTINE QUADSR -!--------------------------------------------------------------------- - SUBROUTINE SIGP(PSTAR,PD,GTEMP,T41,T42,T43,T44,SGLVNU,SIGLNU, & - SIGLV,SIGLY,PPTOP,LREAD,KD,KP,KM,KP2) - DIMENSION Q(KD),QMH(KP),PD(KP2),PLM(KP),GTEMP(KP),PDT(KP2) - DIMENSION SIGLY(KD),SIGLV(KP) - DIMENSION CI(KP),SGLVNU(KP),DEL(KD),SIGLNU(KD),CL(KD),RPI(KM) - DIMENSION IDATE(4) - DIMENSION T41(KP2,2),T42(KP), & - T43(KP2,2),T44(KP) -! integer :: retval -! character(50) :: prsmid='prsmid' -!CC 18 LEVEL SIGMAS FOR NMC MRF(NEW) MODEL -!CC DATA Q/.021,.074,.124,.175,.225,.275,.325,.375,.425,.497, & -!CC .594,.688,.777,.856,.920,.960,.981,.995/ -! FOR SIGMA MODELS,Q=SIGMA,QMH=0.5(Q(I)+Q(I+1), -! PD=Q*PSS,PLM=QMH*PSS.PSS=SURFACE PRESSURE(SPEC.) -! -!..... GET NMC SIGMA STRUCTURE -!CC IF (LREAD.GT.0) GO TO 914 -!--- PPTOP IS MODEL TOP PRESSURE IN CB.... -! SIGMA DATA IS BOTTOM OF ATMOSPHERE TO T.O.A..... -!cccc PPTOP=5.0 -! READ(11,PPTOP,END=12321) -12321 CONTINUE -! WRITE(6,88221)PPTOP,KD,KP -!88221 FORMAT(' ENTER SIGP PPTOP=',E12.5,' KD=',I2,' KP=',I2) -! open(unit=23,file='fort.23',form='unformatted' & -! , access='sequential') -! REWIND 23 -! READ(23)SIGLY -! DO KKK=1,KD -! SIGLY(KKK)=1.-(FLOAT(KKK)-0.5)/KD -! END DO -! WRITE(6,88222) -!88222 FORMAT(' READ AETA') -! DO 37821 LLL=1,KD -! WRITE(6,37820)LLL,SIGLY(LLL) -!37820 FORMAT(' L=',I2,' AETA=',E12.5) -!37821 CONTINUE -! READ(23)SIGLV -! DO KKK=1,KP -! SIGLV(KKK)=1.-(FLOAT(KKK-1))/KD -! END DO -! WRITE(6,88223) -!88223 FORMAT(' READ ETA') -! PRINT 704,(SIGLY(K),K=1,KD) -! PRINT 704,(SIGLV(K),K=1,KP) -! DO 37823 LLL=1,KP -! WRITE(6,37822)LLL,SIGLV(LLL) -!37822 FORMAT(' L=',I2,' ETA=',E12.5) -!37823 CONTINUE - 701 FORMAT(F6.2) - 702 FORMAT(7F10.6) - IF (PPTOP.LE.0.) GO TO 708 - PSFC=100. -!--- IF PTOP NOT EQUAL TO ZERO ADJUST SIGMA SO AS TO GET PROPER STD ATM -! VERTICAL LOCATION - DO 706 K=1,KD - SIGLY(K) = (SIGLY(K)*(PSFC-PPTOP)+PPTOP)/PSFC - 706 CONTINUE - DO 707 K=1,KP - SIGLV(K) = (SIGLV(K)*(PSFC-PPTOP)+PPTOP)/PSFC - 707 CONTINUE - 708 CONTINUE -! PRINT 703,PPTOP -! PRINT 704,(SIGLY(K),K=1,KD) -! PRINT 704,(SIGLV(K),K=1,KP) - 703 FORMAT(1H ,'PTOP =',F6.2) - 704 FORMAT(1H ,7F10.6) - DO 913 K=1,KP - SGLVNU(K) = SIGLV(K) - IF (K.LE.KD) SIGLNU(K) = SIGLY(K) - 913 CONTINUE - DO 77 K=1,KD - Q(K) = SIGLNU(KD+1-K) - 77 CONTINUE - PSS= 1013250. - QMH(1)=0. - QMH(KP)=1. - DO 1 K=2,KD - QMH(K)=0.5*(Q(K-1)+Q(K)) -1 CONTINUE - PD(1)=0. - PD(KP2)=PSS - DO 2 K=2,KP - PD(K)=Q(K-1)*PSS -2 CONTINUE -! call int_get_fresh_handle(retval) -! close(retval) -! write(0,*)' before open in CO2O3' -! open(unit=retval,file=prsmid,form='UNFORMATTED',iostat=ier) -! write(0,*)' after open1' -! do k=1,62 -! write(retval)pd(k) -! enddo -! close(retval) - PLM(1)=0. - DO 3 K=1,KM - PLM(K+1)=0.5*(PD(K+1)+PD(K+2)) -3 CONTINUE - PLM(KP)=PSS - DO 4 K=1,KD - GTEMP(K)=PD(K+1)**0.2*(1.+PD(K+1)/30000.)**0.8/1013250. -4 CONTINUE - GTEMP(KP)=0. -!+++ WRITE (6,100) (GTEMP(K),K=1,KD) -!+++ WRITE (6,100) (PD(K),K=1,KP2) -!+++ WRITE (6,100) (PLM(K),K=1,KP) -!***TAPES 41,42 ARE OUTPUT TO THE CO2 INTERPOLATION PROGRAM (PS=1013MB) -! THE FOLLOWING PUTS P-DATA INTO MB - DO 11 I=1,KP - PD(I)=PD(I)*1.0E-3 - PLM(I)=PLM(I)*1.0E-3 -11 CONTINUE - PD(KP2)=PD(KP2)*1.0E-3 -!CC WRITE (41,101) (PD(K),K=1,KP2) -!CC WRITE (41,101) (PLM(K),K=1,KP) -!CC WRITE (42,101) (PLM(K),K=1,KP) - DO 300 K=1,KP2 - T41(K,1) = PD(K) - 300 CONTINUE - DO 301 K=1,KP - T41(K,2) = PLM(K) - T42(K) = PLM(K) - 301 CONTINUE -!***STORE AS PDT,SO THAT RIGHT PD IS RETURNED TO PTZ - DO 12 I=1,KP2 - PDT(I)=PD(I) -12 CONTINUE -!***SECOND PASS: PSS=810MB,GTEMP NOT COMPUTED - PSS=0.8*1013250. - QMH(1)=0. - QMH(KP)=1. - DO 201 K=2,KD - QMH(K)=0.5*(Q(K-1)+Q(K)) -201 CONTINUE - PD(1)=0. - PD(KP2)=PSS - DO 202 K=2,KP - PD(K)=Q(K-1)*PSS -202 CONTINUE - PLM(1)=0. - DO 203 K=1,KM - PLM(K+1)=0.5*(PD(K+1)+PD(K+2)) -203 CONTINUE - PLM(KP)=PSS -!+++ WRITE (6,100) (PD(K),K=1,KP2) -!+++ WRITE (6,100) (PLM(K),K=1,KP) -!***TAPES 43,44 ARE OUTPUT TO THE CO2 INTERPOLATION PROGRAM(PS=810 MB) -! THE FOLLOWING PUTS P-DATA INTO MB - DO 211 I=1,KP - PD(I)=PD(I)*1.0E-3 - PLM(I)=PLM(I)*1.0E-3 -211 CONTINUE - PD(KP2)=PD(KP2)*1.0E-3 -!CC WRITE (43,101) (PD(K),K=1,KP2) -!CC WRITE (43,101) (PLM(K),K=1,KP) -!CC WRITE (44,101) (PLM(K),K=1,KP) - DO 302 K=1,KP2 - T43(K,1) = PD(K) - 302 CONTINUE - DO 303 K=1,KP - T43(K,2) = PLM(K) - T44(K) = PLM(K) - 303 CONTINUE -!***RESTORE PD - DO 212 I=1,KP2 - PD(I)=PDT(I) -212 CONTINUE -100 FORMAT (1X,5E20.13) -101 FORMAT (5E16.9) - RETURN - END SUBROUTINE SIGP -!--------------------------------------------------------------------- - SUBROUTINE SINTR2 -!.... -! IMPLICIT DOUBLE PRECISION (A-H,O-Z) -! REAL P1,P2,PA,TRNSLO,CORE,TRANSA,PATH,UEXP,SEXP,ETA,SEXPV - COMMON/INPUT/P1,P2,TRNSLO,IA,JA,N -! COMMON/PRESS/ PA(109) -! COMMON/TRAN/ TRANSA(109,109) -! COMMON/COEFS/XA(109),CA(109),ETA(109),SEXPV(109),CORE,UEXP,SEXP - DO 70 L=1,109 - IP1=L - IF (P2-PA(L)) 65,65,70 - 70 CONTINUE - 65 I=IP1-1 - IF (IP1.EQ.1) IP1=2 - IF (I.EQ.0) I=1 - DO 80 L=1,109 - JP1=L - IF (P1-PA(L)) 75,75,80 - 80 CONTINUE - 75 J=JP1-1 - IF (JP1.EQ.1) JP1=2 - IF (J.EQ.0) J=1 - JJJ=J - III=I - J=JJJ - JP1=J+1 - I=III - IP1=I+1 -! DETERMINE ETAP,THE VALUE OF ETA TO USE BY LINEAR INTERPOLATION -! FOR PETA(=0.5*(P1+P2)) - PETA=P2 - DO 90 L=1,109 - IETAP1=L - IF (PETA-PA(L)) 85,85,90 -90 CONTINUE -85 IETA=IETAP1-1 - IF (IETAP1.EQ.1) IETAP1=2 - IF (IETA.EQ.0) IETA=1 - ETAP=ETA(IETA)+(PETA-PA(IETA))*(ETA(IETAP1)-ETA(IETA))/ & - (PA(IETAP1)-PA(IETA)) - SEXP=SEXPV(IETA)+(PETA-PA(IETA))*(SEXPV(IETAP1)- & - SEXPV(IETA))/ (PA(IETAP1)-PA(IETA)) - PIPMPI=PA(IP1)-PA(I) - UP2P1=(PATH(P2,P1,CORE,ETAP))**UEXP - IF (I-J) 126,126,127 - 126 CONTINUE - TRIP=(CA(IP1)*DLOG(1.0D0+XA(IP1)*UP2P1))**(SEXP/UEXP) - TRI=(CA(I)*DLOG(1.0D0+XA(I)*UP2P1))**(SEXP/UEXP) - TRNSLO=1.0D0-((PA(IP1)-P2)*TRI+(P2-PA(I))*TRIP)/PIPMPI - GO TO 128 - 127 TIJ=TRANSA(I,J) - TIPJ=TRANSA(I+1,J) - TIJP=TRANSA(I,J+1) - TIPJP=TRANSA(I+1,J+1) - UIJ=(PATH(PA(I),PA(J),CORE,ETAP))**UEXP - UIPJ=(PATH(PA(I+1),PA(J),CORE,ETAP))**UEXP - UIJP=(PATH(PA(I),PA(J+1),CORE,ETAP))**UEXP - UIPJP=(PATH(PA(I+1),PA(J+1),CORE,ETAP))**UEXP - PRODI=CA(I)*XA(I) - PRODIP=CA(I+1)*XA(I+1) - PROD=((PA(I+1)-P2)*PRODI+(P2-PA(I))*PRODIP)/PIPMPI - XINT=((PA(I+1)-P2)*XA(I)+(P2-PA(I))*XA(I+1))/PIPMPI - CINT=PROD/XINT - AIJ=(CINT*DLOG(1.0D0+XINT*UIJ))**(SEXP/UEXP) - AIJP=(CINT*DLOG(1.0D0+XINT*UIJP))**(SEXP/UEXP) - AIPJ=(CINT*DLOG(1.0D0+XINT*UIPJ))**(SEXP/UEXP) - AIPJP=(CINT*DLOG(1.0D0+XINT*UIPJP))**(SEXP/UEXP) - EIJ=TIJ+AIJ - EIPJ=TIPJ+AIPJ - EIJP=TIJP+AIJP - EIPJP=TIPJP+AIPJP - DTDJ=(EIJP-EIJ)/(PA(J+1)-PA(J)) - DTDPJ=(EIPJP-EIPJ)/(PA(J+1)-PA(J)) - EPIP1=EIJ+DTDJ*(P1-PA(J)) - EPIPP1=EIPJ+DTDPJ*(P1-PA(J)) - EPP2P1=((PA(I+1)-P2)*EPIP1+(P2-PA(I))*EPIPP1)/PIPMPI - TRNSLO=EPP2P1-(CINT*DLOG(1.0D0+XINT*UP2P1))**(SEXP/UEXP) - IF (I.GE.108.OR.J.GE.108) GO TO 350 - IF (I-J-2) 350,350,355 -355 CONTINUE - TIP2J=TRANSA(I+2,J) - TIP2JP=TRANSA(I+2,J+1) - TI2J2=TRANSA(I+2,J+2) - TIJP2=TRANSA(I,J+2) - TIPJP2=TRANSA(I+1,J+2) - UIP2J=(PATH(PA(I+2),PA(J),CORE,ETAP))**UEXP - UIJP2=(PATH(PA(I),PA(J+2),CORE,ETAP))**UEXP - UIPJP2=(PATH(PA(I+1),PA(J+2),CORE,ETAP))**UEXP - UI2J2=(PATH(PA(I+2),PA(J+2),CORE,ETAP))**UEXP - UIP2JP=(PATH(PA(I+2),PA(J+1),CORE,ETAP))**UEXP - AIJP2=(CINT*DLOG(1.0D0+XINT*UIJP2))**(SEXP/UEXP) - AIPJP2=(CINT*DLOG(1.0D0+XINT*UIPJP2))**(SEXP/UEXP) - AIP2J=(CINT*DLOG(1.0D0+XINT*UIP2J))**(SEXP/UEXP) - AIP2JP=(CINT*DLOG(1.0D0+XINT*UIP2JP))**(SEXP/UEXP) - AI2J2=(CINT*DLOG(1.0D0+XINT*UI2J2))**(SEXP/UEXP) - EIP2J=TIP2J+AIP2J - EIP2JP=TIP2JP+AIP2JP - EIJP2=TIJP2+AIJP2 - EIPJP2=TIPJP2+AIPJP2 - EI2J2=TI2J2+AI2J2 - CALL QINTRP(PA(J),PA(J+1),PA(J+2),EIJ,EIJP,EIJP2,P1,EI) - CALL QINTRP(PA(J),PA(J+1),PA(J+2),EIPJ,EIPJP,EIPJP2,P1,EP) - CALL QINTRP(PA(J),PA(J+1),PA(J+2),EIP2J,EIP2JP,EI2J2,P1,EP2) - CALL QINTRP(PA(I),PA(I+1),PA(I+2),EI,EP,EP2,P2,EPSIL) - TRNSLO=EPSIL-(CINT*DLOG(1.0D0+XINT*UP2P1))**(SEXP/UEXP) - 350 CONTINUE - 128 CONTINUE - 205 CONTINUE - RETURN - END SUBROUTINE SINTR2 - SUBROUTINE CO2O3(SFULL,SHALF,PPTOP,L,LP1,LP2) -!CCC PROGRAM CO2O3 = CONSOLIDATION OF A NUMBER OF DAN SCHWARZKOPF,GFDL -! CODES TO PRODUCE A FILE OF CO2 HGT DATA -! FOR ANY VERTICAL COORDINATE (READ BY SUBROUTINE -! CONRAD IN THE GFDL RADIATION CODES)-K.A.C. JUN89. -!NOV89--UPDATED (NOV 89) FOR LATEST GFDL LW RADIATION.....K.A.C. - LOGICAL :: opened - LOGICAL , EXTERNAL :: wrf_dm_on_monitor - CHARACTER*80 errmess -! integer :: retval,kk,ka,kb -! character(50) :: co2='co2' - INTEGER etarad_unit61, etarad_unit62, etarad_unit63,IERROR - DIMENSION SGTEMP(LP1,2),CO2D1D(L,6),CO2D2D(LP1,LP1,6) -!NOV89 - DIMENSION CO2IQ2(LP1,LP1,6),CO2IQ3(LP1,LP1,6),CO2IQ5(LP1,LP1,6) -!NOV89 - DIMENSION T41(LP2,2),T42(LP1), & - T43(LP2,2),T44(LP1) - DIMENSION T20(LP1,LP1,3),T21(LP1,LP1,3) - DIMENSION T22(LP1,LP1,3),T23(LP1,LP1,3) - DIMENSION SGLVNU(LP1),SIGLNU(L) - DIMENSION SFULL(LP1),SHALF(L) -! DIMENSION STEMP(LP1),GTEMP(LP1) -! DIMENSION CDTM51(L),CO2M51(L),C2DM51(L) -! DIMENSION CDTM58(L),CO2M58(L),C2DM58(L) -! DIMENSION CDT51(LP1,LP1),CO251(LP1,LP1),C2D51(LP1,LP1) -! DIMENSION CDT58(LP1,LP1),CO258(LP1,LP1),C2D58(LP1,LP1) -!NOV89 -! DIMENSION CDT31(LP1),CO231(LP1),C2D31(LP1) -! DIMENSION CDT38(LP1),CO238(LP1),C2D38(LP1) -! DIMENSION CDT71(LP1),CO271(LP1),C2D71(LP1) -! DIMENSION CDT78(LP1),CO278(LP1),C2D78(LP1) -! DIMENSION CO211(LP1),CO218(LP1) -! EQUIVALENCE (CDT31(1),CO2IQ2(1,1,1)),(CO231(1),CO2IQ2(1,1,2)) -! EQUIVALENCE (C2D31(1),CO2IQ2(1,1,3)),(CDT38(1),CO2IQ2(1,1,4)) -! EQUIVALENCE (CO238(1),CO2IQ2(1,1,5)),(C2D38(1),CO2IQ2(1,1,6)) -! EQUIVALENCE (CDT71(1),CO2IQ3(1,1,1)),(CO271(1),CO2IQ3(1,1,2)) -! EQUIVALENCE (C2D71(1),CO2IQ3(1,1,3)),(CDT78(1),CO2IQ3(1,1,4)) -! EQUIVALENCE (CO278(1),CO2IQ3(1,1,5)),(C2D78(1),CO2IQ3(1,1,6)) -! EQUIVALENCE (CO211(1),CO2IQ5(1,1,2)),(CO218(1),CO2IQ5(1,1,5)) -!NOV89 -! EQUIVALENCE (STEMP(1),SGTEMP(1,1)),(GTEMP(1),SGTEMP(1,2)) -! EQUIVALENCE (CDTM51(1),CO2D1D(1,1)),(CO2M51(1),CO2D1D(1,2)) -! EQUIVALENCE (C2DM51(1),CO2D1D(1,3)),(CDTM58(1),CO2D1D(1,4)) -! EQUIVALENCE (CO2M58(1),CO2D1D(1,5)),(C2DM58(1),CO2D1D(1,6)) -! EQUIVALENCE (CDT51(1,1),CO2D2D(1,1,1)),(CO251(1,1),CO2D2D(1,1,2)) -! EQUIVALENCE (C2D51(1,1),CO2D2D(1,1,3)),(CDT58(1,1),CO2D2D(1,1,4)) -! EQUIVALENCE (CO258(1,1),CO2D2D(1,1,5)),(C2D58(1,1),CO2D2D(1,1,6)) - -! Deallocate before reading. This is required for nested domain init. -! - IF(ALLOCATED (CO251))DEALLOCATE(CO251) - IF(ALLOCATED (CDT51))DEALLOCATE(CDT51) - IF(ALLOCATED (C2D51))DEALLOCATE(C2D51) - IF(ALLOCATED (CO258))DEALLOCATE(CO258) - IF(ALLOCATED (CDT58))DEALLOCATE(CDT58) - IF(ALLOCATED (C2D58))DEALLOCATE(C2D58) - IF(ALLOCATED (STEMP))DEALLOCATE(STEMP) - IF(ALLOCATED (GTEMP))DEALLOCATE(GTEMP) - IF(ALLOCATED (CO231))DEALLOCATE(CO231) - IF(ALLOCATED (CDT31))DEALLOCATE(CDT31) - IF(ALLOCATED (C2D31))DEALLOCATE(C2D31) - IF(ALLOCATED (CO238))DEALLOCATE(CO238) - IF(ALLOCATED (CDT38))DEALLOCATE(CDT38) - IF(ALLOCATED (C2D38))DEALLOCATE(C2D38) - IF(ALLOCATED (CO271))DEALLOCATE(CO271) - IF(ALLOCATED (CDT71))DEALLOCATE(CDT71) - IF(ALLOCATED (C2D71))DEALLOCATE(C2D71) - IF(ALLOCATED (CO278))DEALLOCATE(CO278) - IF(ALLOCATED (CDT78))DEALLOCATE(CDT78) - IF(ALLOCATED (C2D78))DEALLOCATE(C2D78) - IF(ALLOCATED (CO2M51))DEALLOCATE(CO2M51) - IF(ALLOCATED (CDTM51))DEALLOCATE(CDTM51) - IF(ALLOCATED (C2DM51))DEALLOCATE(C2DM51) - IF(ALLOCATED (CO2M58))DEALLOCATE(CO2M58) - IF(ALLOCATED (CDTM58))DEALLOCATE(CDTM58) - IF(ALLOCATED (C2DM58))DEALLOCATE(C2DM58) - - ALLOCATE(CO251(LP1,LP1)) - ALLOCATE(CDT51(LP1,LP1)) - ALLOCATE(C2D51(LP1,LP1)) - ALLOCATE(CO258(LP1,LP1)) - ALLOCATE(CDT58(LP1,LP1)) - ALLOCATE(C2D58(LP1,LP1)) - ALLOCATE(STEMP(LP1)) - ALLOCATE(GTEMP(LP1)) - ALLOCATE(CO231(LP1)) - ALLOCATE(CDT31(LP1)) - ALLOCATE(C2D31(LP1)) - ALLOCATE(CO238(LP1)) - ALLOCATE(CDT38(LP1)) - ALLOCATE(C2D38(LP1)) - ALLOCATE(CO271(LP1)) - ALLOCATE(CDT71(LP1)) - ALLOCATE(C2D71(LP1)) - ALLOCATE(CO278(LP1)) - ALLOCATE(CDT78(LP1)) - ALLOCATE(C2D78(LP1)) - ALLOCATE(CO2M51(L)) - ALLOCATE(CDTM51(L)) - ALLOCATE(C2DM51(L)) - ALLOCATE(CO2M58(L)) - ALLOCATE(CDTM58(L)) - ALLOCATE(C2DM58(L)) - IF ( wrf_dm_on_monitor() ) THEN - DO i = 61,99 - INQUIRE ( i , OPENED = opened ) - IF ( .NOT. opened ) THEN - etarad_unit61 = i - GOTO 2061 - ENDIF - ENDDO - etarad_unit61 = -1 - 2061 CONTINUE - DO i = 62,99 - INQUIRE ( i , OPENED = opened ) - IF ( .NOT. opened ) THEN - etarad_unit62 = i - GOTO 2062 - ENDIF - ENDDO - etarad_unit62 = -1 - 2062 CONTINUE - DO i = 63,99 - INQUIRE ( i , OPENED = opened ) - IF ( .NOT. opened ) THEN - etarad_unit63 = i - GOTO 2063 - ENDIF - ENDDO - etarad_unit63 = -1 - 2063 CONTINUE - ENDIF - CALL wrf_dm_bcast_bytes ( etarad_unit61 , IWORDSIZE ) - IF ( etarad_unit61 < 0 ) THEN - CALL wrf_error_fatal ( 'module_ra_hwrf: co2o3: Can not find unused fortran unit to read in lookup table.' ) - ENDIF - CALL wrf_dm_bcast_bytes ( etarad_unit62 , IWORDSIZE ) - IF ( etarad_unit62 < 0 ) THEN - CALL wrf_error_fatal ( 'module_ra_hwrf: co2o3: Can not find unused fortran unit to read in lookup table.' ) - ENDIF - CALL wrf_dm_bcast_bytes ( etarad_unit63 , IWORDSIZE ) - IF ( etarad_unit63 < 0 ) THEN - CALL wrf_error_fatal ( 'module_ra_hwrf: co2o3: Can not find unused fortran unit to read in lookup table.' ) - ENDIF - IF ( wrf_dm_on_monitor() ) THEN - OPEN(etarad_unit61,FILE='tr49t85', & - FORM='FORMATTED',STATUS='OLD',ERR=9061,IOSTAT=IERROR) - ENDIF - IF ( wrf_dm_on_monitor() ) THEN - OPEN(etarad_unit62,FILE='tr49t67', & - FORM='FORMATTED',STATUS='OLD',ERR=9062,IOSTAT=IERROR) - ENDIF - IF ( wrf_dm_on_monitor() ) THEN - OPEN(etarad_unit63,FILE='tr67t85', & - FORM='FORMATTED',STATUS='OLD',ERR=9063,IOSTAT=IERROR) - ENDIF - -!===> GET SGTEMP AND OUTPUT WHICH USED TO BE ON UNITS 41,42,43,44.... - LREAD = 0 -! DO KKK=1,L -!JD READ(23)SIGLNU(KKK) -! SIGLNU(KKK)=1.-FLOAT(KKK)/LP1 -! END DO - CALL CO2PTZ(SGTEMP,T41,T42,T43,T44,SGLVNU,SIGLNU, & - SFULL,SHALF,PPTOP,LREAD,L,LP1,LP2) -! call int_get_fresh_handle(retval) -! close(retval) -! open(unit=retval,file=co2,form='UNFORMATTED',iostat=ier) -! do kk=1,2 -! write(retval)(sgtemp(k,kk),k=1,61) -! enddo - DO K=1,LP1 - STEMP(K)=SGTEMP(K,1) - GTEMP(K)=SGTEMP(K,2) - ENDDO -!===> INTERPOLATE DESIRED CO2 DATA FROM THE DETAILED(109,109) GRID.. -! IR=1,IQ=1 IS FOR COMMON /CO2BD3/ IN RADIATION CODE... -! FOR THE CONSOLIDATED 490-850 CM-1 BAND... -!NOV89 -! ICO2TP=61 - ICO2TP=etarad_unit61 -!NOV89 - IR = 1 - RATIO = 1.0 - NMETHD = 2 - CALL CO2INT(ICO2TP,T41,T42,T22,RATIO,IR,NMETHD,L,LP1,LP2) - IR = 1 - RATIO = 1.0 - NMETHD = 1 - CALL CO2INT(ICO2TP,T41,T42,T20,RATIO,IR,NMETHD,L,LP1,LP2) - IR = 1 - RATIO = 1.0 - NMETHD = 2 - CALL CO2INT(ICO2TP,T43,T44,T23,RATIO,IR,NMETHD,L,LP1,LP2) - IR = 1 - RATIO = 1.0 - NMETHD = 1 - CALL CO2INT(ICO2TP,T43,T44,T21,RATIO,IR,NMETHD,L,LP1,LP2) -!===> FILL UP THE CO2D1D ARRAY -! THE FOLLOWING GETS CO2 TRANSMISSION FUNCTIONS AND -! THEIR DERIVATIVES FOR TAU(I,I+1),I=1,LEVS, -! WHERE THE VALUES ARE NOT OBTAINED BY QUADRATURE BUT ARE THE -! ACTUAL TRANSMISSIVITIES,ETC,BETWEEN A PAIR OF PRESSURES. THESE -! ARE USED ONLY FOR NEARBY LAYER CALCULATIONS INCLUDING H2O.. -! - IQ = 1 - CALL CO2IN1(T20,T21,CO2D1D,IQ,L,LP1) -! do kk=1,6 -! write(retval)(co2d1d(k,kk),k=1,60) -! enddo - DO K=1,L - CDTM51(K)=CO2D1D(K,1) - CO2M51(K)=CO2D1D(K,2) - C2DM51(K)=CO2D1D(K,3) - CDTM58(K)=CO2D1D(K,4) - CO2M58(K)=CO2D1D(K,5) - C2DM58(K)=CO2D1D(K,6) - ENDDO -! -!===> FILL UP THE CO2D2D ARRAY -! THE FOLLOWING GETS CO2 TRANSMISSION FUNCTIONS AND THEIR DERIVATIVES -! FROM 109-LEVEL LINE-BY-LINE CALCULATIONS MADE USING THE 1982 -! MCCLATCHY TAPE (12511 LINES),CONSOLIDATED,INTERPOLATED -! TO THE MRF VERTICAL COORDINATE,AND RE-CONSOLIDATED TO A -! 200 CM-1 BANDWIDTH. THE INTERPOLATION METHOD IS DESCRIBED IN -! SCHWARZKOPF AND FELS (J.G.R.,1985). -! - CALL CO2INS(T22,T23,CO2D2D,IQ,L,LP1,1) -! do kk=1,6 -! write(retval)((co2d2d(ka,kb,kk),ka=1,61),kb=1,61) -! enddo - DO K1=1,LP1 - DO K2=1,LP1 - CDT51(K1,K2)=CO2D2D(K1,K2,1) - CO251(K1,K2)=CO2D2D(K1,K2,2) - C2D51(K1,K2)=CO2D2D(K1,K2,3) - CDT58(K1,K2)=CO2D2D(K1,K2,4) - CO258(K1,K2)=CO2D2D(K1,K2,5) - C2D58(K1,K2)=CO2D2D(K1,K2,6) - ENDDO - ENDDO -! -!NOV89 -!===> INTERPOLATE DESIRED CO2 DATA FROM THE DETAILED(109,109) GRID.. -! IR=2,IQ=2 IS FOR COMMON /CO2BD2/ IN RADIATION CODE... -! FOR THE CONSOLIDATED 490-670 CM-1 BAND... -! ICO2TP=62 - ICO2TP=etarad_unit62 - IR = 2 - RATIO = 1.0 - NMETHD = 2 - CALL CO2INT(ICO2TP,T41,T42,T22,RATIO,IR,NMETHD,L,LP1,LP2) - CALL CO2INT(ICO2TP,T43,T44,T23,RATIO,IR,NMETHD,L,LP1,LP2) - IQ = 2 - CALL CO2INS(T22,T23,CO2IQ2,IQ,L,LP1,2) -! do kk=1,6 -! write(retval)(co2iq2(k,1,kk),k=1,61) -! enddo - DO K=1,LP1 - CDT31(K)=CO2IQ2(K,1,1) - CO231(K)=CO2IQ2(K,1,2) - C2D31(K)=CO2IQ2(K,1,3) - CDT38(K)=CO2IQ2(K,1,4) - CO238(K)=CO2IQ2(K,1,5) - C2D38(K)=CO2IQ2(K,1,6) - ENDDO -!===> INTERPOLATE DESIRED CO2 DATA FROM THE DETAILED(109,109) GRID.. -! IR=3,IQ=3 IS FOR COMMON /CO2BD4/ IN RADIATION CODE... -! FOR THE CONSOLIDATED 670-850 CM-1 BAND... -! ICO2TP=63 - ICO2TP=etarad_unit63 - IR = 3 - RATIO = 1.0 - NMETHD = 2 - CALL CO2INT(ICO2TP,T41,T42,T22,RATIO,IR,NMETHD,L,LP1,LP2) - CALL CO2INT(ICO2TP,T43,T44,T23,RATIO,IR,NMETHD,L,LP1,LP2) - IQ = 3 - CALL CO2INS(T22,T23,CO2IQ3,IQ,L,LP1,3) -! do kk=1,6 -! write(retval)(co2iq3(k,1,kk),k=1,61) -! enddo -! close(retval) - DO K=1,LP1 - CDT71(K)=CO2IQ3(K,1,1) - CO271(K)=CO2IQ3(K,1,2) - C2D71(K)=CO2IQ3(K,1,3) - CDT78(K)=CO2IQ3(K,1,4) - CO278(K)=CO2IQ3(K,1,5) - C2D78(K)=CO2IQ3(K,1,6) - ENDDO -!--- FOLLOWING CODE NOT WORKING AND NOT NEEDED YET -!===> INTERPOLATE DESIRED CO2 DATA FROM THE DETAILED(109,109) GRID.. -! IR=4,IQ=5 IS FOR COMMON /CO2BD5/ IN RADIATION CODE... -! FOR THE 4.3 MICRON BAND... -! NOT USED YET ICO2TP=65 -! NOT USED YET IR = 4 -! NOT USED YET RATIO = 1.0 -! DAN SCHWARZ --- USE 300PPMV RATIO = 0.9091 (NOT TESTED YET)..... -! NOT USED YET NMETHD = 2 -! NOT USED YET CALL CO2INT(ICO2TP,T41,T42,T22,RATIO,IR,NMETHD) -! NOT USED YET CALL CO2INT(ICO2TP,T43,T44,T23,RATIO,IR,NMETHD) -! NOT USED YET IQ = 5 -! NOT USED YET CALL CO2INS(T22,T23,CO2IQ5,IQ) -!NOV89 -!... WRITE DATA TO DISK.. -! ...SINCE THESE CODES ARE COMPILED WITH AUTODBL,THE CO2 DATA -! IS CONVERTED TO SINGLE PRECISION IN A LATER JOB STEP.. - -! NOT USED YET WRITE(66) CO211 -! NOT USED YET WRITE(66) CO218 -!NOV89 - IF ( wrf_dm_on_monitor() ) THEN - CLOSE (etarad_unit61) - CLOSE (etarad_unit62) - CLOSE (etarad_unit63) - ENDIF - - RETURN -9061 CONTINUE - WRITE( errmess , '(A49,I4)' ) 'module_ra_hwrf: error reading tr49t85 on unit ',etarad_unit61 - write(0,*)' IERROR=',IERROR - CALL wrf_error_fatal(errmess) -9062 CONTINUE - WRITE( errmess , '(A49,I4)' ) 'module_ra_hwrf: error reading tr49t67 on unit ',etarad_unit62 - write(0,*)' IERROR=',IERROR - CALL wrf_error_fatal(errmess) -9063 CONTINUE - WRITE( errmess , '(A49,I4)' ) 'module_ra_hwrf: error reading tr67t85 on unit ',etarad_unit63 - write(0,*)' IERROR=',IERROR - CALL wrf_error_fatal(errmess) - END SUBROUTINE CO2O3 - - -!!================================================================================ -!---------------------------------------------------------------------- -!---------------------------------------------------------------------- - SUBROUTINE CONRAD(KDS,KDE,KMS,KME,KTS,KTE) -!---------------------------------------------------------------------- -! ******************************************************************* -! * C O N R A D * -! * READ CO2 TRANSMISSION DATA FROM UNIT(NFILE)FOR NEW VERTICAL * -! * COORDINATE TESTS ... * -! * THESE ARRAYS USED TO BE IN BLOCK DATA ...K.CAMPANA-MAR 90 * -! ******************************************************************* -! -!---------------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------------- - INTEGER,INTENT(IN) :: KDS,KDE,KMS,KME,KTS,KTE -!---------------------------------------------------------------------- -! - INTEGER :: I,I1,I2,IERROR,IRTN,J,K,KK,L,LP1,N,NUNIT_CO2,RSIZE - INTEGER,DIMENSION(3) :: RSZE -! - REAL,DIMENSION(KMS:KME-1,6) :: CO21D - REAL,DIMENSION(KMS:KME,2) :: SGTMP - REAL,DIMENSION(KMS:KME,6) :: CO21D3,CO21D7 - REAL,DIMENSION(KMS:KME,KMS:KME,6) :: CO22D - REAL,DIMENSION((KME-KMS+1)*(KME-KMS+1)) :: DATA2 - LOGICAL :: OPENED - LOGICAL,EXTERNAL :: wrf_dm_on_monitor - CHARACTER*80 errmess -! -!---------------------------------------------------------------------- -! -! CO2 DATA TABLES FOR USER'S VERTICAL COORDINATE -! -! THE FOLLOWING COMMON BLOCKS CONTAIN PRETABULATED CO2 TRANSMISSION -! FUNCTIONS, EVALUATED USING THE METHODS OF FELS AND -! SCHWARZKOPF (1981) AND SCHWARZKOPF AND FELS (1985), -!----- THE 2-DIMENSIONAL ARRAYS ARE -! CO2 TRANSMISSION FUNCTIONS AND THEIR DERIVATIVES -! FROM 109-LEVEL LINE-BY-LINE CALCULATIONS MADE USING THE 1982 -! MCCLATCHY TAPE (12511 LINES),CONSOLIDATED,INTERPOLATED -! TO THE NMC MRF VERTICAL COORDINATTE,AND RE-CONSOLIDATED TO A -! 200 CM-1 BANDWIDTH. THE INTERPOLATION METHOD IS DESCRIBED IN -! SCHWARZKOPF AND FELS (J.G.R.,1985). -!----- THE 1-DIM ARRAYS ARE -! CO2 TRANSMISSION FUNCTIONS AND THEIR DERIVATIVES -! FOR TAU(I,I+1),I=1,L, -! WHERE THE VALUES ARE NOT OBTAINED BY QUADRATURE,BUT ARE THE -! ACTUAL TRANSMISSIVITIES,ETC,BETWEEN A PAIR OF PRESSURES. -! THESE USED ONLY FOR NEARBY LAYER CALCULATIONS INCLUDING QH2O. -!----- THE WEIGHTING FUNCTION GTEMP=P(K)**0.2*(1.+P(K)/30000.)**0.8/ -! 1013250.,WHERE P(K)=PRESSURE,NMC MRF(NEW) L18 DATA LEVELS FOR -! PSTAR=1013250. -!----- STEMP IS US STANDARD ATMOSPHERES,1976,AT DATA PRESSURE LEVELS -! USING NMC MRF SIGMAS,WHERE PSTAR=1013.25 MB (PTZ PROGRAM) -! -!***CO2 TRANSMISSION FUNCTIONS AND TEMPERATURE -! AND PRESSURE DERIVATIVES FOR THE 560-800 CM-1 BAND. ALSO INCLUDED -! ARE THE STANDARD TEMPERATURES AND THE WEIGHTING FUNCTION. THESE -! DATA ARE IN BLOCK DATA BD3: -! CO251 = TRANSMISSION FCTNS FOR T0 (STD. PROFILE) -! WITH P(SFC)=1013.25 MB -! CO258 = TRANSMISSION FCTNS. FOR T0 (STD. PROFILE) -! WITH P(SFC)= 810 MB -! CDT51 = FIRST TEMPERATURE DERIVATIVE OF CO251 -! CDT58 = FIRST TEMPERATURE DERIVATIVE OF CO258 -! C2D51 = SECOND TEMPERATURE DERIVATIVE OF CO251 -! C2D58 = SECOND TEMPERATURE DERIVATIVE OF CO251 -! CO2M51 = TRANSMISSION FCTNS FOR T0 FOR ADJACENT PRESSURE -! LEVELS, WITH NO PRESSURE QUADRATURE. USED FOR -! NEARBY LAYER COMPUTATIONS. P(SFC)=1013.25 MB -! CO2M58 = SAME AS CO2M51,WITH P(SFC)= 810 MB -! CDTM51 = FIRST TEMPERATURE DERIVATIVE OF CO2M51 -! CDTM58 = FIRST TEMPERATURE DERIVATIVE OF CO2M58 -! C2DM51 = SECOND TEMPERATURE DERIVATIVE OF CO2M51 -! C2DM58 = SECOND TEMPERATURE DERIVATIVE OF CO2M58 -! STEMP = STANDARD TEMPERATURES FOR MODEL PRESSURE LEVEL -! STRUCTURE WITH P(SFC)=1013.25 MB -! GTEMP = WEIGHTING FUNCTION FOR MODEL PRESSURE LEVEL -! STRUCTURE WITH P(SFC)=1013.25 MB. -!----- THE FOLLOWING ARE STILL IN BLOCK DATA -! B0 = TEMP. COEFFICIENT USED FOR CO2 TRANS. FCTN. -! CORRECTION FOR T(K). (SEE REF. 4 AND BD3) -! B1 = TEMP. COEFFICIENT, USED ALONG WITH B0 -! B2 = TEMP. COEFFICIENT, USED ALONG WITH B0 -! B3 = TEMP. COEFFICIENT, USED ALONG WITH B0 -! -!***CO2 TRANSMISSION FUNCTIONS AND TEMPERATURE -! AND PRESSURE DERIVATIVES FOR THE 560-670 CM-1 PART OF THE 15 UM -! CO2 BAND. THESE DATA ARE IN BLOCK DATA BD2. -! FOR THE 560-670 CM-1 BAND,ONLY THE (1,I) VALUES ARE USED , SINCE -! THESE ARE USED FOR CTS COMPUTATIONS. -! CO231 = TRANSMISSION FCTNS FOR T0 (STD. PROFILE) -! WITH P(SFC)=1013.25 MB -! CO238 = TRANSMISSION FCTNS. FOR T0 (STD. PROFILE) -! WITH P(SFC)= 810 MB -! CDT31 = FIRST TEMPERATURE DERIVATIVE OF CO231 -! CDT38 = FIRST TEMPERATURE DERIVATIVE OF CO238 -! C2D31 = SECOND TEMPERATURE DERIVATIVE OF CO231 -! C2D38 = SECOND TEMPERATURE DERIVATIVE OF CO231 -! -!***CO2 TRANSMISSION FUNCTIONS AND TEMPERATURE -! AND PRESSURE DERIVATIVES FOR THE 670-800 CM-1 PART OF THE 15 UM -! CO2 BAND. THESE DATA ARE IN BLOCK DATA BD4. -! CO271 = TRANSMISSION FCTNS FOR T0 (STD. PROFILE) -! WITH P(SFC)=1013.25 MB -! CO278 = TRANSMISSION FCTNS. FOR T0 (STD. PROFILE) -! WITH P(SFC)= 810 MB -! CDT71 = FIRST TEMPERATURE DERIVATIVE OF CO271 -! CDT78 = FIRST TEMPERATURE DERIVATIVE OF CO278 -! C2D71 = SECOND TEMPERATURE DERIVATIVE OF CO271 -! C2D78 = SECOND TEMPERATURE DERIVATIVE OF CO271 -! -! *****THE FOLLOWING NOT USED IN CURRENT VERSION OF RADIATION ******* -! -! --CO2 TRANSMISSION FUNCTIONS FOR THE 2270- -! 2380 PART OF THE 4.3 UM CO2 BAND. -! THESE DATA ARE IN BLOCK DATA BD5. -! CO211 = TRANSMISSION FCTNS FOR T0 (STD. PROFILE) -! WITH P(SFC)=1013.25 MB -! CO218 = TRANSMISSION FCTNS. FOR T0 (STD. PROFILE) -! WITH P(SFC)= 810 MB -! -! *****THE ABOVE NOT USED IN CURRENT VERSION OF RADIATION *********** -!---------------------------------------------------------------------- -! - L=KME-KMS - LP1=KME-KMS+1 -! -!---------------------------------------------------------------------- - IF ( wrf_dm_on_monitor() ) THEN - DO i = 14,99 - INQUIRE ( i , OPENED = opened ) - IF ( .NOT. opened ) THEN - nunit_co2 = i - GOTO 2014 - ENDIF - ENDDO - nunit_co2 = -1 - 2014 CONTINUE - ENDIF - IF ( wrf_dm_on_monitor() ) THEN - OPEN(nunit_co2,FILE='co2_trans', & - FORM='UNFORMATTED',STATUS='OLD',ERR=9014,IOSTAT=IERROR) - REWIND NUNIT_CO2 - ENDIF - - -!---------------------------------------------------------------------- -! -!*** READ IN PRE-COMPUTED CO2 TRANSMISSION DATA. -! - RSZE(1) = LP1 - RSZE(2) = L - RSZE(3) = LP1*LP1 -!---------------------------------------------------------------------- -! - RSIZE = RSZE(1) -! - DO KK=1,2 - IF( wrf_dm_on_monitor() )READ(NUNIT_CO2)(SGTMP(I,KK),I=1,RSIZE) - CALL wrf_dm_bcast_real( SGTMP(1,KK), RSIZE ) - ENDDO -! -!---------------------------------------------------------------------- -! - RSIZE = RSZE(2) -! - DO KK=1,6 - IF( wrf_dm_on_monitor() )READ(NUNIT_CO2)(CO21D(I,KK),I=1,RSIZE) - CALL wrf_dm_bcast_real( CO21D(1,KK), RSIZE ) - ENDDO -! -!---------------------------------------------------------------------- -! - RSIZE = RSZE(3) -! - DO KK=1,6 - IF( wrf_dm_on_monitor() )READ(NUNIT_CO2)(DATA2(I),I=1,RSIZE) - CALL wrf_dm_bcast_real( DATA2(1), RSIZE ) - N=0 -! - DO I1=1,LP1 - DO I2=1,LP1 - N=N+1 - CO22D(I1,I2,KK)=DATA2(N) - ENDDO - ENDDO -! - ENDDO - -! -! Deallocate before reading. This is required for nested domain init. -! This is gopal's doing -! - IF(ALLOCATED (CO251))DEALLOCATE(CO251) - IF(ALLOCATED (CDT51))DEALLOCATE(CDT51) - IF(ALLOCATED (C2D51))DEALLOCATE(C2D51) - IF(ALLOCATED (CO258))DEALLOCATE(CO258) - IF(ALLOCATED (CDT58))DEALLOCATE(CDT58) - IF(ALLOCATED (C2D58))DEALLOCATE(C2D58) - IF(ALLOCATED (STEMP))DEALLOCATE(STEMP) - IF(ALLOCATED (GTEMP))DEALLOCATE(GTEMP) - IF(ALLOCATED (CO231))DEALLOCATE(CO231) - IF(ALLOCATED (CDT31))DEALLOCATE(CDT31) - IF(ALLOCATED (C2D31))DEALLOCATE(C2D31) - IF(ALLOCATED (CO238))DEALLOCATE(CO238) - IF(ALLOCATED (CDT38))DEALLOCATE(CDT38) - IF(ALLOCATED (C2D38))DEALLOCATE(C2D38) - IF(ALLOCATED (CO271))DEALLOCATE(CO271) - IF(ALLOCATED (CDT71))DEALLOCATE(CDT71) - IF(ALLOCATED (C2D71))DEALLOCATE(C2D71) - IF(ALLOCATED (CO278))DEALLOCATE(CO278) - IF(ALLOCATED (CDT78))DEALLOCATE(CDT78) - IF(ALLOCATED (C2D78))DEALLOCATE(C2D78) - IF(ALLOCATED (CO2M51))DEALLOCATE(CO2M51) - IF(ALLOCATED (CDTM51))DEALLOCATE(CDTM51) - IF(ALLOCATED (C2DM51))DEALLOCATE(C2DM51) - IF(ALLOCATED (CO2M58))DEALLOCATE(CO2M58) - IF(ALLOCATED (CDTM58))DEALLOCATE(CDTM58) - IF(ALLOCATED (C2DM58))DEALLOCATE(C2DM58) -! -!---------------------------------------------------------------------- -! - RSIZE = RSZE(1) -! - DO KK=1,6 - IF( wrf_dm_on_monitor() )READ(NUNIT_CO2)(CO21D3(I,KK),I=1,RSIZE) - CALL wrf_dm_bcast_real( CO21D3(1,KK), RSIZE ) - ENDDO -! -!---------------------------------------------------------------------- -! - DO KK=1,6 - IF( wrf_dm_on_monitor() )READ(NUNIT_CO2)(CO21D7(I,KK),I=1,RSIZE) - CALL wrf_dm_bcast_real ( CO21D7(1,KK), RSIZE ) - ENDDO -! -!---------------------------------------------------------------------- - ALLOCATE(CO251(LP1,LP1)) - ALLOCATE(CDT51(LP1,LP1)) - ALLOCATE(C2D51(LP1,LP1)) - ALLOCATE(CO258(LP1,LP1)) - ALLOCATE(CDT58(LP1,LP1)) - ALLOCATE(C2D58(LP1,LP1)) - ALLOCATE(STEMP(LP1)) - ALLOCATE(GTEMP(LP1)) - ALLOCATE(CO231(LP1)) - ALLOCATE(CDT31(LP1)) - ALLOCATE(C2D31(LP1)) - ALLOCATE(CO238(LP1)) - ALLOCATE(CDT38(LP1)) - ALLOCATE(C2D38(LP1)) - ALLOCATE(CO271(LP1)) - ALLOCATE(CDT71(LP1)) - ALLOCATE(C2D71(LP1)) - ALLOCATE(CO278(LP1)) - ALLOCATE(CDT78(LP1)) - ALLOCATE(C2D78(LP1)) - ALLOCATE(CO2M51(L)) - ALLOCATE(CDTM51(L)) - ALLOCATE(C2DM51(L)) - ALLOCATE(CO2M58(L)) - ALLOCATE(CDTM58(L)) - ALLOCATE(C2DM58(L)) -!---------------------------------------------------------------------- -! - DO K=1,LP1 - STEMP(K) = SGTMP(K,1) - GTEMP(K) = SGTMP(K,2) - ENDDO -! - DO K=1,L - CDTM51(K) = CO21D(K,1) - CO2M51(K) = CO21D(K,2) - C2DM51(K) = CO21D(K,3) - CDTM58(K) = CO21D(K,4) - CO2M58(K) = CO21D(K,5) - C2DM58(K) = CO21D(K,6) - ENDDO -! - DO J=1,LP1 - DO I=1,LP1 - CDT51(I,J) = CO22D(I,J,1) - CO251(I,J) = CO22D(I,J,2) - C2D51(I,J) = CO22D(I,J,3) - CDT58(I,J) = CO22D(I,J,4) - CO258(I,J) = CO22D(I,J,5) - C2D58(I,J) = CO22D(I,J,6) - ENDDO - ENDDO -! - DO K=1,LP1 - CDT31(K) = CO21D3(K,1) - CO231(K) = CO21D3(K,2) - C2D31(K) = CO21D3(K,3) - CDT38(K) = CO21D3(K,4) - CO238(K) = CO21D3(K,5) - C2D38(K) = CO21D3(K,6) - ENDDO -! - DO K=1,LP1 - CDT71(K) = CO21D7(K,1) - CO271(K) = CO21D7(K,2) - C2D71(K) = CO21D7(K,3) - CDT78(K) = CO21D7(K,4) - CO278(K) = CO21D7(K,5) - C2D78(K) = CO21D7(K,6) - ENDDO -! -!---------------------------------------------------------------------- - IF(wrf_dm_on_monitor())WRITE(0,66)NUNIT_CO2 - 66 FORMAT('----READ CO2 TRANSMISSION FUNCTIONS FROM UNIT ',I2) -!---------------------------------------------------------------------- - IF( wrf_dm_on_monitor() )THEN - CLOSE(nunit_co2) - ENDIF - RETURN -! -9014 CONTINUE - WRITE(errmess,'(A51,I4)')'module_ra_hwrf: error reading co2_trans on unit ',nunit_co2 - CALL wrf_error_fatal(errmess) -!---------------------------------------------------------------------- - END SUBROUTINE CONRAD -!---------------------------------------------------------------------- -! - END MODULE module_RA_HWRF -! -!---------------------------------------------------------------------- - diff --git a/phys/module_radiation_driver.F b/phys/module_radiation_driver.F index a4ff071b1e..6215d79b26 100644 --- a/phys/module_radiation_driver.F +++ b/phys/module_radiation_driver.F @@ -198,9 +198,6 @@ SUBROUTINE radiation_driver ( & ,SWRADSCHEME, GSFCSWSCHEME & ,GFDLSWSCHEME, CAMLWSCHEME, CAMSWSCHEME & ,HELDSUAREZ & -#if ( HWRF == 1 ) - ,HWRFSWSCHEME, HWRFLWSCHEME & -#endif ,goddardswscheme & !NUWRF ,goddardlwscheme & !NUWRF # if (EM_CORE == 1) @@ -220,9 +217,7 @@ SUBROUTINE radiation_driver ( & ,ECLIPSESCHEME USE module_model_constants -#ifndef HWRF USE module_wrf_error , ONLY : wrf_err_message -#endif USE module_state_description, ONLY : nuwrf4icescheme ! *** add new modules of schemes here @@ -241,9 +236,6 @@ SUBROUTINE radiation_driver ( & #endif USE module_ra_cam , ONLY : camrad USE module_ra_gfdleta , ONLY : etara -#if ( HWRF == 1 ) - USE module_ra_hwrf -#endif USE module_ra_hs , ONLY : hsrad USE module_ra_goddard , ONLY : goddardrad @@ -908,14 +900,10 @@ SUBROUTINE radiation_driver ( & INTEGER, PARAMETER:: taer_asy_opt = 3 ! input option for aerosol asy -#if ( HWRF == 1 ) - CHARACTER(len=255) :: wrf_err_message -#endif - !---------- local test vars ! real, dimension(ims:ime, kms:kme, jms:jme) :: hlw, hsw - ! This allows radiation schemes (mainly HWRF) to correctly + ! This allows radiation schemes to correctly ! interface with the convection scheme when convection is only ! enabled in some domains: if(present(explicit_convection)) then @@ -1133,16 +1121,6 @@ SUBROUTINE radiation_driver ( & ENDDO ENDDO endif -! Remove this - to match NAM operational (affects GFDL and HWRF schemes) -! if( F_QR ) then -! DO j=jts,jte -! DO k=kts,kte -! DO i=its,ite -! qc_temp(I,K,J) = qc_temp(I,K,J) + qr(I,K,J) -! ENDDO -! ENDDO -! ENDDO -! endif ! ! temporarily modify hydrometeors (this is for GD scheme and WRF-Chem) ! @@ -1723,8 +1701,6 @@ SUBROUTINE radiation_driver ( & IF ( PRESENT(p_top) ) THEN p_top_dummy = p_top - ELSE - p_top_dummy = -1. ! not used by NMM END IF CALL RRTMLWRAD( & @@ -1846,32 +1822,6 @@ SUBROUTINE radiation_driver ( & CALL wrf_error_fatal('Can not call ETARA (1b). Missing moisture fields.') ENDIF -#if ( HWRF == 1 ) - CASE (HWRFLWSCHEME) - - CALL wrf_debug (100, 'CALL hwrflw') - - gfdl_lw = .true. - - CALL HWRFRA(explicit_convection=expl_conv, & - DT=dt,thraten=RTHRATEN,thratenlw=RTHRATENLW,thratensw=RTHRATENSW,pi3d=pi, & - XLAND=xland,P8w=p8w,DZ8w=dz8w,RHO_PHY=rho,P_PHY=p,T=t, & - QV=qv,QW=qc_temp,QI=Qi, & - TSK2D=tsk,GLW=GLW,GSW=GSW, & - TOTSWDN=swdown,TOTLWDN=glw,RSWTOA=rswtoa,RLWTOA=rlwtoa,CZMEAN=czmean, & !Added - GLAT=glat,GLON=glon,HTOP=htop,HBOT=hbot,htopr=htopr,hbotr=hbotr,ALBEDO=albedo,CUPPT=cuppt,& - VEGFRA=vegfra,SNOW=snow,G=g,GMT=gmt, & !Modified - NSTEPRA=stepra,NPHS=nphs,itimestep=itimestep, & !Modified - julyr=julyr,julday=julday,gfdl_lw=gfdl_lw,gfdl_sw=gfdl_sw, & - CFRACL=cfracl,CFRACM=cfracm,CFRACH=cfrach, & !Added - ACFRST=acfrst,NCFRST=ncfrst,ACFRCV=acfrcv,NCFRCV=ncfrcv, & !Added - ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, & - ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, & - its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte ) - - -#endif - CASE (CAMLWSCHEME) CALL wrf_debug(100, 'CALL camrad lw') @@ -1940,10 +1890,8 @@ SUBROUTINE radiation_driver ( & !subroutine RRTMLWRAD. IF ( PRESENT(p_top) ) THEN p_top_dummy = p_top - ELSE - p_top_dummy = -1. ! not used by NMM END IF - IF ( p_top_dummy .GT. 0 ) THEN ! flag value for NMM = -1 + IF ( p_top_dummy .GT. 0 ) THEN ! !NLAYERS is recalculated !every time the radiation scheme is called. This is !necessary if e_vert parent .NE. e_vert nest since @@ -2164,7 +2112,7 @@ SUBROUTINE radiation_driver ( & DO k=kts,kte DO i=its,ite RTHRATENLW(I,K,J)=RTHRATEN(I,K,J) -! OLR ALSO WILL CONTAIN OUTGOING LONGWAVE FOR RRTM (NMM HAS NO OLR ARRAY) +! OLR ALSO WILL CONTAIN OUTGOING LONGWAVE FOR RRTM IF(PRESENT(OLR) .AND. K .EQ. 1)OLR(I,J)=RLWTOA(I,J) ENDDO ENDDO @@ -2640,30 +2588,6 @@ SUBROUTINE radiation_driver ( & CALL wrf_error_fatal('Can not call ETARA (2b). Missing moisture fields.') ENDIF -#if ( HWRF == 1 ) - - CASE (HWRFSWSCHEME) - - CALL wrf_debug (100, 'CALL hwrfsw') - - gfdl_sw = .true. - CALL HWRFRA(explicit_convection=expl_conv, & - DT=dt,thraten=RTHRATEN,thratenlw=RTHRATENLW,thratensw=RTHRATENSW,pi3d=pi, & - XLAND=xland,P8w=p8w,DZ8w=dz8w,RHO_PHY=rho,P_PHY=p,T=t, & - QV=qv,QW=qc_temp,QI=Qi, & - TSK2D=tsk,GLW=GLW,GSW=GSW, & - TOTSWDN=swdown,TOTLWDN=glw,RSWTOA=rswtoa,RLWTOA=rlwtoa,CZMEAN=czmean, & !Added - GLAT=glat,GLON=glon,HTOP=htop,HBOT=hbot,htopr=htopr,hbotr=hbotr,ALBEDO=albedo,CUPPT=cuppt, & - VEGFRA=vegfra,SNOW=snow,G=g,GMT=gmt, & !Modified - NSTEPRA=stepra,NPHS=nphs,itimestep=itimestep, & !Modified - julyr=julyr,julday=julday,gfdl_lw=gfdl_lw,gfdl_sw=gfdl_sw, & - CFRACL=cfracl,CFRACM=cfracm,CFRACH=cfrach, & !Added - ACFRST=acfrst,NCFRST=ncfrst,ACFRCV=acfrcv,NCFRCV=ncfrcv, & !Added - ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, & - ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, & - its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte ) -#endif - CASE (0) ! Here in case we don't want to call a sw radiation scheme @@ -2935,12 +2859,8 @@ SUBROUTINE radiation_driver ( & #endif ) IF(PRESENT(LWUPTC))THEN -! NMM calls the driver every RADT time steps, EM calls every DT -#if (EM_CORE == 1) +! EM calls every DT DTaccum = DT -#else - DTaccum = RADT*60 -#endif !$OMP PARALLEL DO & !$OMP PRIVATE ( ij ,i,j,k,its,ite,jts,jte) @@ -2980,12 +2900,8 @@ SUBROUTINE radiation_driver ( & #endif ) IF(PRESENT(SWUPTC))THEN -! NMM calls the driver every RADT time steps, EM calls every DT -#if (EM_CORE == 1) +! EM calls the driver every DT DTaccum = DT -#else - DTaccum = RADT*60 -#endif !$OMP PARALLEL DO & !$OMP PRIVATE ( ij ,i,j,k,its,ite,jts,jte) @@ -3531,11 +3447,7 @@ SUBROUTINE cal_cldfra1(CLDFRA, QV, QC, QI, QS, & its,ite, jts,jte, kts,kte ) USE module_state_description, ONLY : KFCUPSCHEME, KFETASCHEME !wig, CuP 4-Fb-2008 !BSINGH - For WRFCuP scheme -#if (HWRF == 1) - USE module_state_description, ONLY : FER_MP_HIRES, FER_MP_HIRES_ADVECT, ETAMP_HWRF -#else USE module_state_description, ONLY : FER_MP_HIRES, FER_MP_HIRES_ADVECT -#endif !--------------------------------------------------------------------- IMPLICIT NONE !--------------------------------------------------------------------- @@ -3690,16 +3602,9 @@ SUBROUTINE cal_cldfra1(CLDFRA, QV, QC, QI, QS, & weight = F_ICE_PHY(i,k,j) ENDIF ENDIF -!BSF - For HWRF MP option; (qc = liquid, qi = cloud ice+snow) ! IF ( F_QC .and. F_QI .and. .not. F_QS ) THEN -#if (HWRF == 1) - IF ( mp_physics .eq. FER_MP_HIRES .or. & - mp_physics .eq. FER_MP_HIRES_ADVECT .or. & - mp_physics .eq. ETAMP_HWRF) THEN -#else IF ( mp_physics .eq. FER_MP_HIRES .or. & mp_physics==fer_mp_hires_advect) THEN -#endif QIMID = QI(i,k,j) !- total ice (cloud ice + snow) QWMID = QC(i,k,j) !- cloud water QCLD=QWMID+QIMID !- cloud water + total ice diff --git a/phys/module_surface_driver.F b/phys/module_surface_driver.F index a3398152f2..d111719002 100644 --- a/phys/module_surface_driver.F +++ b/phys/module_surface_driver.F @@ -17,14 +17,7 @@ SUBROUTINE surface_driver( & & ,ifndalbsi, ifndicedepth, ifndsnowsi & & ,isltyp,itimestep,julian_in,ivgtyp,lowlyr,mavail,rmol & & ,num_soil_layers,p8w,pblh,pi_phy,pshltr,fm,fhh,psih & -#if (NMM_CORE==1) - & ,psim,p_phy,q10,q2,qfx,taux,tauy,qsfc,qshltr,qz0 & - & ,zkmax,ribn,charn,msang,scurx,scury,icoef_sf,iwavecpl,lcurr_sf & !for gfdl-sf drag - & ,pert_Cd, ens_random_seed, ens_Cdamp & - & ,cd_out,ch_out & -#else & ,psim,p_phy,q10,q2,qfx,qsfc,qshltr,qz0 & -#endif & ,raincv,rho,sfcevp,sfcexc,sfcrunoff ,acrunoff & & ,smois,smstav,smstot,snoalb,snow,snowc,snowh,stepbl & & ,smcrel & @@ -34,16 +27,9 @@ SUBROUTINE surface_driver( & & ,u_frame,u_phy,v10,vegfra,u10e,v10e,uoce,voce & & ,vz0,v_frame,v_phy,warm_rain,wspd,xice,xland,z,znt & & ,max_edom,cplmask & -#if (HWRF==1) - & ,mznt & -#endif & ,zs & & ,albsi, icedepth,snowsi & -#if (NMM_CORE==1) - & ,xicem,isice,iswater,ct,tke_pbl,sfenth & -#else & ,xicem,isice,iswater,ct,tke_pbl & -#endif & ,albbck,embck,lh,sh2o,shdmax,shdmin,z0 & & ,flqc,flhc,psfc,sst,sst_input,sstsk,dtw,sst_update,sst_skin & & ,scm_force_skintemp,scm_force_flux,t2,emiss & @@ -319,7 +305,6 @@ SUBROUTINE surface_driver( & & ,irr_end_julianday,irr_freq,irr_ph,irr_rand_field & & ) -#if ( ! NMM_CORE == 1 ) USE module_state_description, ONLY : SFCLAYSCHEME & ,SFCLAYREVSCHEME & ,MYJSFCSCHEME & @@ -343,29 +328,9 @@ SUBROUTINE surface_driver( & ,PWP3DSCHEME & ,DRIP & ,CHANNEL -#else - USE module_state_description, ONLY : SFCLAYSCHEME & - ,SFCLAYREVSCHEME & - ,MYJSFCSCHEME & - ,QNSESFCSCHEME & - ,MYJPBLSCHEME & - ,QNSEPBLSCHEME & - ,GFSSFCSCHEME & - ,PXSFCSCHEME & - ,NOAHMPSCHEME & - ,SLABSCHEME & - ,LSMSCHEME & - ,RUCLSMSCHEME & - ,CLMSCHEME & - ,PXLSMSCHEME & - ,TEMFSFCSCHEME & - ,GFDLSFCSCHEME & - ,SSIBSCHEME & ! ssib - ,GFDLSLAB -#endif USE module_model_constants ! *** add new modules of schemes here USE module_irrigation @@ -400,10 +365,6 @@ SUBROUTINE surface_driver( & USE module_sf_scmflux USE module_sf_scmskintemp -#if ( NMM_CORE == 1 ) - USE module_sf_gfdl -#endif - USE module_sf_slab ! USE module_sf_sfcdiags @@ -671,15 +632,6 @@ SUBROUTINE surface_driver( & real :: HYDRO_dt REAL, DIMENSION( ims:ime , jms:jme ):: sfcheadrt,INFXSRT, soldrain -#if (NMM_CORE==1) - real , intent(IN ):: SFENTH - INTEGER, INTENT(IN):: ICOEF_SF - INTEGER, INTENT(IN):: IWAVECPL - LOGICAL, INTENT(IN):: LCURR_SF - logical,intent(in),optional :: pert_Cd - integer,intent(in),optional :: ens_random_seed - real,intent(in),optional :: ens_Cdamp -#endif REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), INTENT(INOUT):: SMOIS REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), INTENT(INOUT):: TSLB REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), INTENT(OUT) :: SMCREL @@ -722,12 +674,6 @@ SUBROUTINE surface_driver( & REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: PBLH REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: Q2 REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: QFX -#if (NMM_CORE==1) - REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: TAUX - REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: TAUY - REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: cd_out - REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: ch_out -#endif REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: QSFC REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: QZ0 REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SFCRUNOFF @@ -746,9 +692,6 @@ SUBROUTINE surface_driver( & REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: VZ0 REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: WSPD REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: ZNT -#if (HWRF==1) - REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: MZNT -#endif !-----fds (06/2010)--------------------------------------------- REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_LHF ! SSiB output REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_SHF ! SSiB output @@ -835,10 +778,6 @@ SUBROUTINE surface_driver( & REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BIO4 ! ssib-snow REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BLO4 ! ssib-snow REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: HO4 ! ssib-snow -#if (NMM_CORE==1) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN):: CHARN, MSANG, SCURX, SCURY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: RIBN, ZKMAX -#endif !---------------------------------------------------------- REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: BR REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: CHKLOWQ @@ -1551,10 +1490,6 @@ SUBROUTINE surface_driver( & CHS(i,j) = 0. CPM(i,j) = 0. CHS2(i,j) = 0. -#if (NMM_CORE==1) - Cd_out(i,j) = 0. - Ch_out(i,j) = 0. -#endif ENDDO ENDDO ENDDO @@ -2143,7 +2078,6 @@ SUBROUTINE surface_driver( & ENDIF CASE (PXSFCSCHEME) -#if (NMM_CORE != 1) IF (PRESENT(qv_curr) .AND. & PRESENT(mol) .AND. PRESENT(regime) .AND. & .TRUE. ) THEN @@ -2177,9 +2111,6 @@ SUBROUTINE surface_driver( & ELSE CALL wrf_error_fatal('Lacking arguments for PX Surface Layer in surface driver') ENDIF -#else - CALL wrf_error_fatal('PX Surface Layer scheme cannot be used with NMM') -#endif CASE (MYJSFCSCHEME) IF (PRESENT(qv_curr) .AND. PRESENT(qc_curr) .AND. & @@ -2228,8 +2159,6 @@ SUBROUTINE surface_driver( & ims,ime, jms,jme, kms,kme, & i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) ENDIF -#if ( EM_CORE==1) -! ustm is not available in NMM ! ustm is needed for LES tke calculation (ustm is ust used in friction) DO j = j_start(ij),j_end(ij) DO i = i_start(ij),i_end(ij) @@ -2238,7 +2167,6 @@ SUBROUTINE surface_driver( & ch(i,j) = chs (i,j) END DO END DO -#endif ELSE CALL wrf_error_fatal('Lacking arguments for MYJSFC in surface driver') ENDIF @@ -2468,42 +2396,6 @@ SUBROUTINE surface_driver( & ENDIF #endif -#if (NMM_CORE==1) - - CASE (GFDLSFCSCHEME) - CALL wrf_debug( 100, 'in GFDLSFC' ) - - IF(sf_surface_physics .eq. 88)THEN - GFDL_NTSFLG=1 - ELSE - GFDL_NTSFLG=0 - ENDIF - - CALL SF_GFDL(u_phytmp,v_phytmp,t_phy,qv_curr,p_phy, & - CP,RCP,R_d,XLV,PSFC,CHS,CHS2,CQS2,CPM, & - DTBL, SMOIS,num_soil_layers,ISLTYP,ZNT, & -#if (HWRF==1) - MZNT, & -#endif - UST,PSIM,PSIH, & - XLAND,HFX,QFX,TAUX,TAUY,LH,GSW,GLW,TSK,FLHC,FLQC, & ! gopal's doing for Ocean coupling - QGH,QSFC,U10,V10, & - ICOEF_SF,IWAVECPL,LCURR_SF,CHARN, MSANG, SCURX, SCURY, & - pert_Cd, ens_random_seed, ens_Cdamp, & - GZ1OZ0,WSPD,BR,ZKMAX, ISFFLX, & - EP_1,EP_2,KARMAN,GFDL_NTSFLG,SFENTH, & - cd_out, ch_out, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - i_start(ij),i_end(ij),j_start(ij),j_end(ij),kts,kte ) - RIBN = BR - DO j=j_start(ij),j_end(ij) - DO i=i_start(ij),i_end(ij) - CHKLOWQ(I,J)= 1.0 - ENDDO - ENDDO - -#endif CASE DEFAULT WRITE( message , * ) & diff --git a/share/dfi.F b/share/dfi.F index 5c6ace8eea..0077d9b00a 100644 --- a/share/dfi.F +++ b/share/dfi.F @@ -51,7 +51,6 @@ SUBROUTINE dfi_accumulate( grid ) grid%dfi_re_cloud(:,:,:) = grid%dfi_re_cloud(:,:,:) + grid%re_cloud(:,:,:) * hn grid%dfi_re_ice(:,:,:) = grid%dfi_re_ice(:,:,:) + grid%re_ice(:,:,:) * hn grid%dfi_re_snow(:,:,:) = grid%dfi_re_snow(:,:,:) + grid%re_snow(:,:,:) * hn -#if (EM_CORE == 1) ELSE IF ( grid%mp_physics_dfi .EQ. NUWRF4ICESCHEME_DFI ) THEN grid%dfi_re_cloud_gsfc(:,:,:) = grid%dfi_re_cloud_gsfc(:,:,:) + grid%re_cloud_gsfc(:,:,:) * hn grid%dfi_re_rain_gsfc(:,:,:) = grid%dfi_re_rain_gsfc(:,:,:) + grid%re_rain_gsfc(:,:,:) * hn @@ -59,7 +58,6 @@ SUBROUTINE dfi_accumulate( grid ) grid%dfi_re_snow_gsfc(:,:,:) = grid%dfi_re_snow_gsfc(:,:,:) + grid%re_snow_gsfc(:,:,:) * hn grid%dfi_re_graupel_gsfc(:,:,:) = grid%dfi_re_graupel_gsfc(:,:,:) + grid%re_graupel_gsfc(:,:,:) * hn grid%dfi_re_hail_gsfc(:,:,:) = grid%dfi_re_hail_gsfc(:,:,:) + grid%re_hail_gsfc(:,:,:) * hn -#endif ENDIF ELSE grid%dfi_moist(:,:,:,P_QV) = grid%dfi_moist(:,:,:,P_QV) + grid%moist(:,:,:,P_QV) * hn @@ -72,25 +70,6 @@ SUBROUTINE dfi_accumulate( grid ) grid%hcoeff_tot = grid%hcoeff_tot + hn #endif -#if (NMM_CORE == 1) - hn = grid%hcoeff(grid%ntsd+1) - grid%dfi_pd(:,:) = grid%dfi_pd(:,:) + grid%pd(:,:) * hn - grid%dfi_pint(:,:,:) = grid%dfi_pint(:,:,:) + grid%pint(:,:,:) * hn - grid%dfi_dwdt(:,:,:) = grid%dfi_dwdt(:,:,:) + grid%dwdt(:,:,:) * hn - grid%dfi_t(:,:,:) = grid%dfi_t(:,:,:) + grid%t(:,:,:) * hn - grid%dfi_q(:,:,:) = grid%dfi_q(:,:,:) + grid%q(:,:,:) * hn - grid%dfi_q2(:,:,:) = grid%dfi_q2(:,:,:) + grid%q2(:,:,:) * hn - grid%dfi_cwm(:,:,:) = grid%dfi_cwm(:,:,:) + grid%cwm(:,:,:) * hn - grid%dfi_u(:,:,:) = grid%dfi_u(:,:,:) + grid%u(:,:,:) * hn - grid%dfi_v(:,:,:) = grid%dfi_v(:,:,:) + grid%v(:,:,:) * hn - grid%dfi_moist(:,:,:,:) = grid%dfi_moist(:,:,:,:) + grid%moist(:,:,:,:) * hn - grid%dfi_scalar(:,:,:,:) = grid%dfi_scalar(:,:,:,:) + grid%scalar(:,:,:,:) * hn - ! accumulate DFI coefficient - grid%hcoeff_tot = grid%hcoeff_tot + hn - write(mess,*) 'grid%hcoeff_tot: ', grid%hcoeff_tot - call wrf_message(mess) -#endif - END SUBROUTINE dfi_accumulate SUBROUTINE dfi_bck_init ( grid ) @@ -222,37 +201,6 @@ END SUBROUTINE rebalance_driver_dfi CALL nl_set_p_lev_diags( grid%id, grid%p_lev_diags_dfi) #endif -#if (NMM_CORE == 1) - -! -! CHANGE (SIGN ONLY OF) IMPORTANT TIME CONSTANTS -! - CALL nl_get_time_step( grid%id, grid%time_step ) - if (grid%time_step .lt. 0) then -! DT =-DT - - write(mess,*) 'changing signs for backward integration' - call wrf_message(mess) - grid%CPGFV = -grid%CPGFV - grid%EN = -grid%EN - grid%ENT = -grid%ENT - grid%F4D = -grid%F4D - grid%F4Q = -grid%F4Q - grid%EF4T = -grid%EF4T - - grid%EM(:) = -grid%EM(:) - grid%EMT(:) = -grid%EMT(:) - grid%F4Q2(:) = -grid%F4Q2(:) - - grid%WPDAR(:,:)= -grid%WPDAR(:,:) - grid%CPGFU(:,:)= -grid%CPGFU(:,:) - grid%CURV(:,:)= -grid%CURV(:,:) - grid%FCP(:,:)= -grid%FCP(:,:) - grid%FAD(:,:)= -grid%FAD(:,:) - grid%F(:,:)= -grid%F(:,:) - endif -#endif - grid%start_subtime = domain_get_start_time ( grid ) grid%stop_subtime = domain_get_stop_time ( grid ) @@ -364,37 +312,6 @@ END SUBROUTINE start_domain CALL nl_set_constant_bc(grid%id, grid%constant_bc) #endif -#if (NMM_CORE == 1) -! -! CHANGE (SIGN ONLY OF) IMPORTANT TIME CONSTANTS -! -!mptest CALL nl_get_time_step( grid%id, grid%time_step ) - -!!! here need to key off something else being the "wrong" sign - if (grid%cpgfv .gt. 0) then - - write(mess,*) 'changing signs for forward integration' - call wrf_message(mess) - grid%CPGFV = -grid%CPGFV - grid%EN = -grid%EN - grid%ENT = -grid%ENT - grid%F4D = -grid%F4D - grid%F4Q = -grid%F4Q - grid%EF4T = -grid%EF4T - - grid%EM(:) = -grid%EM(:) - grid%EMT(:) = -grid%EMT(:) - grid%F4Q2(:) = -grid%F4Q2(:) - - grid%WPDAR(:,:)= -grid%WPDAR(:,:) - grid%CPGFU(:,:)= -grid%CPGFU(:,:) - grid%CURV(:,:)= -grid%CURV(:,:) - grid%FCP(:,:)= -grid%FCP(:,:) - grid%FAD(:,:)= -grid%FAD(:,:) - grid%F(:,:)= -grid%F(:,:) - endif -#endif - !#if ( WRF_CHEM == 1 ) ! ! reset chem option to normal @@ -852,36 +769,6 @@ SUBROUTINE dfi_array_reset( grid ) #endif -#if (NMM_CORE == 1) - write(mess,*) ' divide by grid%hcoeff_tot: ', grid%hcoeff_tot - call wrf_message(mess) - if (grid%hcoeff_tot .lt. 0.0001) then - call wrf_error_fatal("bad grid%hcoeff_tot") - endif - grid%pd(:,:) = grid%dfi_pd(:,:) / grid%hcoeff_tot - grid%pint(:,:,:) = grid%dfi_pint(:,:,:) / grid%hcoeff_tot -! grid%dwdt(:,:,:) = grid%dfi_dwdt(:,:,:) / grid%hcoeff_tot - grid%t(:,:,:) = grid%dfi_t(:,:,:) / grid%hcoeff_tot - grid%q(:,:,:) = grid%dfi_q(:,:,:) / grid%hcoeff_tot - grid%q2(:,:,:) = grid%dfi_q2(:,:,:) / grid%hcoeff_tot - grid%cwm(:,:,:) = grid%dfi_cwm(:,:,:) / grid%hcoeff_tot - grid%u(:,:,:) = grid%dfi_u(:,:,:) / grid%hcoeff_tot - grid%v(:,:,:) = grid%dfi_v(:,:,:) / grid%hcoeff_tot - grid%moist(:,:,:,:) = grid%dfi_moist(:,:,:,:) / grid%hcoeff_tot - grid%scalar(:,:,:,:) = grid%dfi_scalar(:,:,:,:) / grid%hcoeff_tot - - ! restore initial fields - grid%SNOW(:,:) = grid%dfi_SNOW(:,:) - grid%SNOWH(:,:) = grid%dfi_SNOWH(:,:) -! grid%SNOWC(:,:) = grid%dfi_SNOWC(:,:) - grid%CANWAT(:,:) = grid%dfi_CANWAT(:,:) - grid%NMM_TSK(:,:) = grid%dfi_NMM_TSK(:,:) - ! save soil fields - grid%STC(:,:,:) = grid%dfi_STC(:,:,:) - grid%SMC(:,:,:) = grid%dfi_SMC(:,:,:) - grid%SH2O(:,:,:) = grid%dfi_SH2O(:,:,:) -#endif - END SUBROUTINE dfi_array_reset @@ -1002,19 +889,6 @@ SUBROUTINE dfi_clear_accumulation( grid ) endif #endif -#if (NMM_CORE == 1) - grid%dfi_pd(:,:) = 0. - grid%dfi_pint(:,:,:) = 0. - grid%dfi_dwdt(:,:,:) = 0. - grid%dfi_t(:,:,:) = 0. - grid%dfi_q(:,:,:) = 0. - grid%dfi_q2(:,:,:) = 0. - grid%dfi_cwm(:,:,:) = 0. - grid%dfi_u(:,:,:) = 0. - grid%dfi_v(:,:,:) = 0. - grid%dfi_moist(:,:,:,:) = 0. - grid%dfi_scalar(:,:,:,:) = 0. -#endif grid%hcoeff_tot = 0.0 @@ -1065,19 +939,6 @@ SUBROUTINE dfi_save_arrays( grid ) ENDIF #endif -#if (NMM_CORE == 1) - ! save surface 2-D fields - grid%dfi_SNOW(:,:) = grid%SNOW(:,:) - grid%dfi_SNOWH(:,:) = grid%SNOWH(:,:) -! grid%dfi_SNOWC(:,:) = grid%SNOWC(:,:) - grid%dfi_CANWAT(:,:) = grid%CANWAT(:,:) - grid%dfi_NMM_TSK(:,:) = grid%NMM_TSK(:,:) - ! save soil fields - grid%dfi_STC(:,:,:) = grid%STC(:,:,:) - grid%dfi_SMC(:,:,:) = grid%SMC(:,:,:) - grid%dfi_SH2O(:,:,:) = grid%SH2O(:,:,:) -#endif - #if (EM_CORE == 1) ! save hydrometeor and scalar fields IF ( grid%dfi_savehydmeteors .EQ. 1 ) then !tgs diff --git a/share/init_modules.F b/share/init_modules.F index d355598760..9c0336ac9c 100644 --- a/share/init_modules.F +++ b/share/init_modules.F @@ -70,22 +70,9 @@ SUBROUTINE init_modules( phase ) CALL init_module_ext_internal !! must be called before quilt #endif #ifdef DM_PARALLEL -# if ( HWRF == 1 ) -! jm 20150807 -! jm this was moved to here so that the coupler can divide up the tasks before the model starts doing it for quilting, nesting etc. -! jm the idea is that the atmosphere will see only the communicator with the tasks it is supposed to use for that stuff -! jm hwrf_coupler_init is defined in external/RSL_LITE/module_dm.F - CALL hwrf_coupler_init -# endif -# if ( HWRF == 1 ) - CALL init_module_wrf_quilt !! this *must* be called before init_module_dm - ! We must never reach this line or phase 2 in an I/O server. - CALL split_communicator -# else CALL split_communicator CALL init_module_wrf_quilt !! this *must* be called before init_module_dm -# endif #endif CALL init_module_dm @@ -104,9 +91,6 @@ SUBROUTINE init_modules( phase ) CALL init_modules_em # endif #endif -#if (NMM_CORE == 1) - CALL init_modules_nmm -#endif ENDIF END SUBROUTINE init_modules diff --git a/share/input_wrf.F b/share/input_wrf.F index c32b3004a3..ae1aff98c6 100644 --- a/share/input_wrf.F +++ b/share/input_wrf.F @@ -159,7 +159,6 @@ SUBROUTINE input_wrf ( fid , grid , config_flags , switch , ierr ) END IF #endif -#if ( NMM_CORE != 1 ) IF ( .NOT. dryrun ) THEN ! Does this file exist? @@ -188,9 +187,7 @@ SUBROUTINE input_wrf ( fid , grid , config_flags , switch , ierr ) CALL wrf_error_fatal( wrf_err_message ) END IF END IF -#endif -#if ( NMM_CORE != 1 ) ! Verify feature consistency between model input and model nml settings IF ( .NOT. dryrun ) THEN @@ -231,7 +228,6 @@ SUBROUTINE input_wrf ( fid , grid , config_flags , switch , ierr ) END IF END IF END IF -#endif ! INPUT ONLY (KK) @@ -551,8 +547,6 @@ SUBROUTINE input_wrf ( fid , grid , config_flags , switch , ierr ) CALL wrf_debug ( 300 , wrf_err_message ) CALL nl_set_stand_lon ( grid%id , config_flags%stand_lon ) -#if ( NMM_CORE != 1 ) - CALL wrf_get_dom_ti_real ( fid , 'POLE_LAT' , config_flags%pole_lat , 1 , icnt , ierr ) WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for POLE_LAT returns ',config_flags%pole_lat CALL wrf_debug ( 300 , wrf_err_message ) @@ -568,15 +562,12 @@ SUBROUTINE input_wrf ( fid , grid , config_flags , switch , ierr ) ! written by SI have P_TOP as a metadata item; the real program and wrf model have it as a ! state variable. This test is to supress non-fatal but confusing messages from the model complaining ! that P_TOP cannot be read from the metadata for this dataset. JM 20040905 -! -! Note, P_TOP is not defined in the NMM core. IF ( program_name(1:7) .EQ. "REAL_EM" ) THEN CALL wrf_get_dom_ti_real ( fid , 'P_TOP' , grid%p_top , 1 , icnt , ierr ) WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for P_TOP returns ',grid%p_top CALL wrf_debug ( 300 , wrf_err_message ) ENDIF -#endif IF ( switch .NE. boundary_only ) THEN CALL wrf_get_dom_ti_real ( fid , 'GMT' , config_flags%gmt , 1 , icnt , ierr ) @@ -740,10 +731,8 @@ SUBROUTINE input_wrf ( fid , grid , config_flags , switch , ierr ) ! All is well. Noah-MP and Noah have compatible wrfinput files. ELSE IF ( ( config_flags%sf_surface_physics == NOAHMPSCHEME ) .and. ( itmp == LSMSCHEME ) ) then ! All is well. Noah-MP and Noah have compatible wrfinput files. -#if ( NMM_CORE != 1 ) ELSE IF ( ( config_flags%sf_surface_physics == CTSMSCHEME ) ) then ! All is well. CTSM doesn't care about the wrfinput file. -#endif ELSE call wrf_message("----------------- ERROR -------------------") WRITE(wrf_err_message,'("namelist : sf_surface_physics = ",I10)') config_flags%sf_surface_physics @@ -982,44 +971,6 @@ SUBROUTINE input_wrf ( fid , grid , config_flags , switch , ierr ) #endif -#if (NMM_CORE == 1) - - IF ( ( switch .EQ. auxinput1_only ) .AND. & - ( config_flags%auxinput1_inname(1:8) .EQ. 'wrf_real' ) ) THEN - - CALL wrf_get_dom_ti_integer ( fid , 'BOTTOM-TOP_GRID_DIMENSION' , kde_compare , 1 , icnt , ierr3 ) - - ! Test to make sure that the input data is the right size. - - IF ( ( ide-1 .NE. ide_compare ) .OR. & - ( kde .NE. kde_compare ) .OR. & - ( jde-1 .NE. jde_compare ) .AND. ierr3 .EQ. 0 ) THEN - WRITE(wrf_err_message,*)'input_wrf.F: SIZE MISMATCH: namelist ide-1,jde-1,kde=',ide-1,jde-1,kde,& - '; input data ide,jde,kde=',ide_compare , jde_compare , kde_compare - CALL wrf_debug( 100, wrf_err_message ) - ENDIF - - ELSEIF ( switch .EQ. auxinput1_only ) THEN ! assume just WPS in this branch - IF ( ( ide-1 .NE. ide_compare ) .OR. & - ( config_flags%num_metgrid_levels .NE. kde_compare ) .OR. & - ( jde-1 .NE. jde_compare ) .AND. ierr3 .EQ. 0 ) THEN - WRITE(wrf_err_message,*)'input_wrf.F: SIZE MISMATCH: ',& - 'namelist ide-1,jde-1,num_metgrid_levels=',ide-1,jde-1,config_flags%num_metgrid_levels,& - '; input data ide,jde,num_metgrid_levels=',ide_compare , jde_compare , kde_compare - IF (ide-1 .eq. ide_compare .AND. jde-1 .EQ. jde_compare) THEN - CALL wrf_message(wrf_err_message) - CALL wrf_debug ( 0, "---- ERROR: appears that the vertical dimension is wrong - quitting" ) - count_fatal_error = count_fatal_error + 1 - ELSE - CALL wrf_message(wrf_err_message) - CALL wrf_debug ( 0, "---- ERROR: appears that I or J dimensions are wrong - quitting" ) - count_fatal_error = count_fatal_error + 1 - ENDIF - ENDIF - ENDIF - -#endif - #if (DA_CORE == 1) ! Test here to check that config_flags%hypsometric_opt in namelist ! is equal to what is in the global attributes of the wrfinput files @@ -1160,11 +1111,9 @@ SUBROUTINE input_wrf ( fid , grid , config_flags , switch , ierr ) WRITE(wrf_err_message,*) '---- ERROR: Ran out of valid boundary conditions in file ',TRIM(fname) CALL wrf_error_fatal ( TRIM( wrf_err_message ) ) ELSE -#if ( NMM_CORE != 1 ) WRITE(wrf_err_message,*) '---- ERROR: Could not find matching time in input file ',TRIM(fname) CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 -#endif ENDIF ELSE IF ( ierr .NE. WRF_WARN_NOTSUPPORTED .AND. ierr .NE. WRF_WARN_DRYRUN_READ) THEN ! @@ -1888,7 +1837,6 @@ SUBROUTINE input_wrf ( fid , grid , config_flags , switch , ierr ) RETURN END SUBROUTINE input_wrf -#if ( NMM_CORE != 1 ) SUBROUTINE is_this_data_ok_to_use ( fid , yes_use_this_data ) USE module_io @@ -1979,5 +1927,3 @@ FUNCTION check_which_switch (switch) RESULT (aux_thing) count = count +1 END DO END FUNCTION check_which_switch - -#endif diff --git a/share/interp_fcn.F b/share/interp_fcn.F index 0f0f699d5c..89abd8eb04 100644 --- a/share/interp_fcn.F +++ b/share/interp_fcn.F @@ -31,7 +31,6 @@ END SUBROUTINE interp_init !========================================================================= -#if ! defined(NMM_CORE) || NMM_CORE!=1 SUBROUTINE interp_fcn ( cfld, & ! CD field cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & @@ -3129,12 +3128,8 @@ SUBROUTINE interp_fcnm_imask( cfld, & ! CD field RETURN END SUBROUTINE interp_fcnm_imask -#endif ! end of first block of ARW-only routines -! NMM: We still allow interp_mask_land_field because it is needed, but no -! equivalent exists. Use of this in WRF-NMM is an error and will have -! unintended consequences. SUBROUTINE interp_mask_land_field ( enable, & ! says whether to allow interpolation or just the bcasts cfld, & ! CD field cids, cide, ckds, ckde, cjds, cjde, & @@ -3627,8 +3622,6 @@ SUBROUTINE interp_mask_water_field ( enable, & ! says whether END SUBROUTINE interp_mask_water_field -! Begin second block of ARW-only routines -#if ! defined(NMM_CORE) || NMM_CORE!=1 SUBROUTINE p2c_mask ( cfld, & ! CD field cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & @@ -4078,1564 +4071,6 @@ SUBROUTINE mark_domain ( cfld, & ! CD field ENDDO END SUBROUTINE mark_domain -#endif -! end of second block of WRF-ARW-specific interpolation schemes - -#if ( NMM_CORE == 1 ) -!======================================================================================= -! Old circa 2007 interpolation schemes that are still in use -! This is gopal's doing -!======================================================================================= - SUBROUTINE force_sst_nmm (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & ! nest ratios - CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights - CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are - CBWGT4, HBWGT4, CCSST, CSST ) ! just dummys - USE module_timing - IMPLICIT NONE - - INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & - ipos, jpos, & - nri, nrj - LOGICAL, INTENT(IN) :: xstag, ystag - - REAL, DIMENSION ( cims:cime, cjms:cjme ) :: cfld - REAL, DIMENSION ( nims:nime, njms:njme ) :: nfld - REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy - REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy - INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH - INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask - INTEGER , INTENT(IN) :: csst(*), ccsst(*) -! local - - LOGICAL FLIP - INTEGER i,j,k,n - REAL SUM,AMAXVAL - REAL, DIMENSION (4, nims:nime, njms:njme ) :: NBWGT - - if(csst(1) /= 1) return - -! -!*** INDEX CONVENTIONS -!*** NBWGT4=0 -!*** 4 -!*** -!*** -!*** -!*** h -!*** 1 2 -!*** NBWGT1=1 NBWGT2=0 -!*** -!*** -!*** 3 -!*** NBWGT3=0 - - DO J=NJTS,MIN(NJTE,NJDE-1) - DO I=NITS,MIN(NITE,NIDE-1) - NBWGT(1,I,J)=HBWGT1(I,J) - NBWGT(2,I,J)=HBWGT2(I,J) - NBWGT(3,I,J)=HBWGT3(I,J) - NBWGT(4,I,J)=HBWGT4(I,J) - ENDDO - ENDDO - - DO J=NJTS,MIN(NJTE,NJDE-1) - DO I=NITS,MIN(NITE,NIDE-1) - AMAXVAL=0. - DO N=1,4 - AMAXVAL=amax1(NBWGT(N,I,J),AMAXVAL) - ENDDO - - FLIP=.TRUE. - SUM=0.0 - DO N=1,4 - IF(AMAXVAL .EQ. NBWGT(N,I,J) .AND. FLIP)THEN - NBWGT(N,I,J)=1.0 - FLIP=.FALSE. - ELSE - NBWGT(N,I,J)=0.0 - ENDIF - SUM=SUM+NBWGT(N,I,J) - IF(SUM .GT. 1.0)CALL wrf_error_fatal ( "horizontal interp error - interp_hnear_nmm" ) - ENDDO - ENDDO - ENDDO - - DO J=NJTS,MIN(NJTE,NJDE-1) - DO I=NITS,MIN(NITE,NIDE-1) - IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 - NFLD(I,J) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ) & - + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ) & - + NBWGT(3,I,J)*CFLD(IIH(I,J), JJH(I,J)-1) & - + NBWGT(4,I,J)*CFLD(IIH(I,J), JJH(I,J)+1) - ELSE - NFLD(I,J) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ) & - + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ) & - + NBWGT(3,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1) & - + NBWGT(4,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1) - ENDIF - ENDDO - ENDDO - - - END SUBROUTINE force_sst_nmm - - SUBROUTINE nmm_smoother_ikj ( cfld , & - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - xstag, ystag, & - ipos, jpos, & - nri, nrj & - ) - - USE module_configure - IMPLICIT NONE - - INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - nri, nrj, & - ipos, jpos - REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(INOUT) :: cfld - LOGICAL, INTENT(IN) :: xstag, ystag - - - ! Local - - INTEGER :: feedback - INTEGER, PARAMETER :: smooth_passes = 5 - - REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfldnew - INTEGER :: ci, cj, ck - INTEGER :: is, npass - REAL :: AVGH - CHARACTER (LEN=256) :: a_message - - RETURN - ! If there is no feedback, there can be no smoothing. - - CALL nl_get_feedback ( 1, feedback ) - IF ( feedback == 0 ) RETURN - - WRITE(a_message,*)'SIMPLE SMOOTHER IS SWITCHED ON FOR HEIGHT' - CALL wrf_message ( a_message ) - - DO npass = 1, smooth_passes - - DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs - if(mod(cj,2) .eq. 0)THEN - is=0 ! even rows for mass points (2,4,6,8) - else - is=1 ! odd rows for mass points (1,3,5,7) - endif - DO ck = ckts, ckte - DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs - IF(IS==0)THEN ! (2,4,6,8) - AVGH = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI+1,CK,CJ+1) + CFLD(CI+1,CK,CJ-1) - ELSE - AVGH = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI-1,CK,CJ+1) + CFLD(CI-1,CK,CJ-1) - ENDIF - CFLDNEW(CI,CK,CJ) = (AVGH + 4*CFLD(CI,CK,CJ)) / 8.0 - ENDDO - ENDDO - ENDDO - - DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs - if(mod(cj,2) .eq. 0)THEN - is=0 ! even rows for mass points (2,4,6,8) - else - is=1 ! odd rows for mass points (1,3,5,7) - endif - DO ck = ckts, ckte - DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs - CFLD(CI,CK,CJ) = CFLDNEW(CI,CK,CJ) - ENDDO - ENDDO - ENDDO - - ENDDO ! do npass - - END SUBROUTINE nmm_smoother_ikj - - - SUBROUTINE nmm_smoother_ijk ( cfld , & - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - xstag, ystag, & - ipos, jpos, & - nri, nrj & - ) - - USE module_configure - IMPLICIT NONE - - INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - nri, nrj, & - ipos, jpos - REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ), INTENT(INOUT) :: cfld - LOGICAL, INTENT(IN) :: xstag, ystag - - - ! Local - - INTEGER :: feedback - INTEGER, PARAMETER :: smooth_passes = 5 - - REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfldnew - INTEGER :: ci, cj, ck - INTEGER :: is, npass - REAL :: AVGH - CHARACTER (LEN=256) :: a_message - - RETURN - ! If there is no feedback, there can be no smoothing. - - CALL nl_get_feedback ( 1, feedback ) - IF ( feedback == 0 ) RETURN - - WRITE(a_message,*)'SIMPLE SMOOTHER IS SWITCHED ON FOR HEIGHT' - CALL wrf_message ( a_message ) - - DO npass = 1, smooth_passes - - DO ck = ckts, ckte - DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs - if(mod(cj,2) .eq. 0)THEN - is=0 ! even rows for mass points (2,4,6,8) - else - is=1 ! odd rows for mass points (1,3,5,7) - endif - DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs - IF(IS==0)THEN ! (2,4,6,8) - AVGH = CFLD(CI,CJ+1,CK) + CFLD(CI,CJ-1,CK) + CFLD(CI+1,CJ+1,CK) + CFLD(CI+1,CJ-1,CK) - ELSE - AVGH = CFLD(CI,CJ+1,CK) + CFLD(CI,CJ-1,CK) + CFLD(CI-1,CJ+1,CK) + CFLD(CI-1,CJ-1,CK) - ENDIF - CFLDNEW(CI,CJ,CK) = (AVGH + 4*CFLD(CI,CJ,CK)) / 8.0 - ENDDO - ENDDO - ENDDO - - DO ck = ckts, ckte - DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs - if(mod(cj,2) .eq. 0)THEN - is=0 ! even rows for mass points (2,4,6,8) - else - is=1 ! odd rows for mass points (1,3,5,7) - endif - DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs - CFLD(CI,CJ,CK) = CFLDNEW(CI,CJ,CK) - ENDDO - ENDDO - ENDDO - - ENDDO ! do npass - - END SUBROUTINE nmm_smoother_ijk - - - SUBROUTINE nmm_vsmoother_ikj ( cfld , & - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - xstag, ystag, & - ipos, jpos, & - nri, nrj & - ) - - USE module_configure - IMPLICIT NONE - - INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - nri, nrj, & - ipos, jpos - REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(INOUT) :: cfld - LOGICAL, INTENT(IN) :: xstag, ystag - - - ! Local - - INTEGER :: feedback - INTEGER, PARAMETER :: smooth_passes = 5 - - REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfldnew - INTEGER :: ci, cj, ck - INTEGER :: is, npass - REAL :: AVGV - CHARACTER (LEN=256) :: a_message - - RETURN - ! If there is no feedback, there can be no smoothing. - - CALL nl_get_feedback ( 1, feedback ) - IF ( feedback == 0 ) RETURN - - WRITE(a_message,*)'SIMPLE SMOOTHER IS SWITCHED ON FOR VELOCITY' - CALL wrf_message ( a_message ) - - DO npass = 1, smooth_passes - - DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs - if(mod(cj,2) .eq. 0)THEN - is=1 ! even rows for mass points (2,4,6,8) - else - is=0 ! odd rows for mass points (1,3,5,7) - endif - DO ck = ckts, ckte - DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs - IF(IS==0)THEN ! (2,4,6,8) - AVGV = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI+1,CK,CJ+1) + CFLD(CI+1,CK,CJ-1) - ELSE - AVGV = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI-1,CK,CJ+1) + CFLD(CI-1,CK,CJ-1) - ENDIF - CFLDNEW(CI,CK,CJ) = (AVGV + 4*CFLD(CI,CK,CJ)) / 8.0 - ENDDO - ENDDO - ENDDO - - DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs - if(mod(cj,2) .eq. 0)THEN - is=1 ! even rows for mass points (2,4,6,8) - else - is=0 ! odd rows for mass points (1,3,5,7) - endif - DO ck = ckts, ckte - DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs - CFLD(CI,CK,CJ) = CFLDNEW(CI,CK,CJ) - ENDDO - ENDDO - ENDDO - - ENDDO - - END SUBROUTINE nmm_vsmoother_ikj -!====================================================================================== -! End of gopal's doing -!====================================================================================== -!====================================================================================== -! New NMM Interpolation Routines; wrappers around module_interp_nmm (Sam's doing) -!====================================================================================== - -!-------------------------------------------------------------------------------------- - - subroutine NoInterpMany(cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & ! nest ratios - cpint,npint, cpd,npd, cq,nq, ct,nt, & - cfis,nfis) - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - - ! parent domain - - REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD,cpint,ct,cq - REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: cpd,cfis - - ! nested domain - - REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: nFIS,npd - REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(IN) :: NFLD,npint,nt,nq - - end subroutine NoInterpMany - - subroutine DownAged2D(junk, & - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & - c_age,n_age, cfld) - - use module_interp_nmm, only: c2n_copy2d_nomask - use module_interp_store - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - integer, intent(in) :: c_age - integer, intent(inout) :: n_age - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CFLD,junk - REAL,DIMENSION(nims:nime,njms:njme), INTENT(INOUT) :: nfld - - logical bad - integer i,j - ! Skip if the nest is up-to-date with the parent. Special age - ! of 0 means the values are invalid (parent just moved, nest - ! just moved or one was initialized). - if(n_age==c_age .and. n_age/=0 .and. c_age/=0) then - !write(0,*) 'Grid ',grid_id,' not storing pdyn in DownAged2D' - !write(0,*) ' reason: n_age=',n_age,' c_age=',c_age - return - end if - n_age=c_age - !write(0,*) 'Storing grid ',parent_grid_id,' pdyn_smooth in grid ',grid_id,' pdyn_parent' - - call c2n_copy2d_nomask(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - cfld,nfld, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, .true.) - - end subroutine DownAged2D - - subroutine ForceNearSST (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & - cactivate, nactivate) - use module_interp_nmm, only: c2n_sst - use module_interp_store - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - integer, intent(In), dimension(*) :: cactivate, nactivate - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CFLD - REAL,DIMENSION(nims:nime,njms:njme), INTENT(INOUT) :: nfld - - if(nactivate(1)/=1) return - - call c2n_sst(hnear_i,hnear_j, & - cfld,nfld, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte) - end subroutine ForceNearSST - - subroutine DownNear (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj) ! nest ratios - use module_interp_nmm, only: c2n_near2d, c2n_near3d - use module_interp_store - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CFLD - REAL,DIMENSION(nims:nime,njms:njme), INTENT(INOUT) :: nfld - - if(nkts==nkte) then - call c2n_near2d(hnear_i,hnear_j, & - cfld,nfld,imask, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte) - else - call c2n_near3d(hnear_i,hnear_j, & - cfld,nfld,imask, & - cims, cime, cjms, cjme, ckms, ckme, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte) - endif - end subroutine DownNear - - subroutine DownNearIKJ (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj) ! nest ratios - use module_interp_nmm, only: c2n_near3dikj - use module_interp_store - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,ckms:ckme,cjms:cjme), INTENT(IN) :: CFLD - REAL,DIMENSION(nims:nime,nkms:nkme,njms:njme), INTENT(INOUT) :: nfld - - if(nkts==nkte) & - call wrf_error_fatal('IJ interpolation of an IKJ variable is not supported and makes no sense anyway. Use DownNear instead.') - - call c2n_near3dikj(hnear_i,hnear_j, & - cfld,nfld,imask, & - cims, cime, cjms, cjme, ckms, ckme, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte) - end subroutine DownNearIKJ - - subroutine UpNear(cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj) ! nest ratios - use module_interp_store - use module_interp_nmm, only: n2c_near2d - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(OUT) :: CFLD - REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: nfld - - if(nkts/=nkte) & - call wrf_error_fatal('Up nearest neighbor interpolation is not implemented.') - - call n2c_near2d( cfld,nfld,ipos,jpos, & - cids, cide, cjds, cjde, & - cims, cime, cjms, cjme, & - cits, cite, cjts, cjte, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte) - end subroutine UpNear - - subroutine DownINear (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj) ! nest ratios - use module_interp_nmm, only: c2n_inear2d - use module_interp_store - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CFLD - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(INOUT) :: nfld - - if(nkts/=nkte) & - call wrf_error_fatal('3D integer nearest neighbor interpolation is not implemented.') - - call c2n_inear2d(hnear_i,hnear_j, & - cfld,nfld,imask, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte) - end subroutine DownINear - - subroutine UpINear (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj) ! nest ratios - use module_interp_store - use module_interp_nmm, only: n2c_inear2d - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(OUT) :: CFLD - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: nfld - - if(nkts/=nkte) & - call wrf_error_fatal('3D integer nearest neighbor interpolation is not implemented.') - - call n2c_inear2d( cfld,nfld,ipos,jpos, & - cids, cide, cjds, cjde, & - cims, cime, cjms, cjme, & - cits, cite, cjts, cjte, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte) - end subroutine UpINear - - subroutine DownMass (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & ! nest ratios - emethod, evalue) ! extrapolation method - use module_interp_nmm, only: c2n_mass, c2n_copy2d - use module_interp_store - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj, emethod - real, intent(in) :: evalue - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD - REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(INOUT) :: nfld - - if(nkts==nkte) then - call c2n_copy2d(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - cfld,nfld,imask, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, .true.) - else - call c2n_mass(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - cfld,nfld,iinfo,winfo,imask, & - emethod,evalue, & - cims, cime, cjms, cjme, ckms, ckme, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte) - endif - end subroutine DownMass - - subroutine DownMassIKJ (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & ! nest ratios - emethod, evalue) ! extrapolation method - use module_interp_nmm, only: c2n_massikj - use module_interp_store - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj,emethod - real, intent(in) :: evalue - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,ckms:ckme,cjms:cjme), INTENT(IN) :: CFLD - REAL,DIMENSION(nims:nime,nkms:nkme,njms:njme), INTENT(INOUT) :: nfld - - if(nkts==nkte) & - call wrf_error_fatal('IKJ 2D interpolation of an IJ array is not implemented (and makes no sense anyway). Use DownCopy instead.') - call c2n_massikj(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - cfld,nfld,iinfo,winfo,imask, & - emethod, evalue, & - cims, cime, cjms, cjme, ckms, ckme, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte) - end subroutine DownMassIKJ - - subroutine UpMassIKJ (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & ! nest ratios - emethod, evalue) ! extrapolation method - use module_interp_store - use module_interp_nmm, only: n2c_massikj, n2c_copy2d - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj, emethod - real, intent(in) :: evalue - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,ckms:ckme,cjms:cjme), INTENT(OUT) :: CFLD - REAL,DIMENSION(nims:nime,nkms:nkme,njms:njme), INTENT(IN) :: nfld - - if(nkts==nkte) then - call n2c_copy2d(& - cfld,nfld,ipos,jpos, & - cids, cide, cjds, cjde, & - cims, cime, cjms, cjme, & - cits, cite, cjts, cjte, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, .true.) - else - call n2c_massikj(& - cfld,nfld,parent_iinfo,parent_winfo, & - ipos,jpos,emethod, evalue, & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cits, cite, cjts, cjte, ckts, ckte, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte) - endif - end subroutine UpMassIKJ - - subroutine UpMass (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & ! nest ratios - emethod, evalue) ! extrapolation method - use module_interp_store - use module_interp_nmm, only: n2c_mass, n2c_copy2d - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj, emethod - real, intent(in) :: evalue - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(OUT) :: CFLD - REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(IN) :: nfld - - if(nkts==nkte) then - call n2c_copy2d(& - cfld,nfld,ipos,jpos, & - cids, cide, cjds, cjde, & - cims, cime, cjms, cjme, & - cits, cite, cjts, cjte, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, .true.) - else - call n2c_mass(& - cfld,nfld,parent_iinfo,parent_winfo, & - ipos,jpos,emethod, evalue, & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cits, cite, cjts, cjte, ckts, ckte, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte) - endif - end subroutine UpMass - - subroutine UpCopy (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj) ! nest ratios - - use module_interp_nmm, only: n2c_copy3d, n2c_copy2d - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(OUT) :: CFLD - REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(IN) :: nfld - - if(nkts==nkte) then - call n2c_copy2d(& - cfld,nfld,ipos,jpos, & - cids, cide, cjds, cjde, & - cims, cime, cjms, cjme, & - cits, cite, cjts, cjte, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, .true.) - else - call n2c_copy3d(& - cfld,nfld,ipos,jpos, & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cits, cite, cjts, cjte, ckts, ckte, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte, .true.) - endif - end subroutine UpCopy - - subroutine UpMax (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj) ! nest ratios - - use module_interp_nmm, only: n2c_max3d, n2c_max2d - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(OUT) :: CFLD - REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(IN) :: nfld - - if(nkts==nkte) then - call n2c_max2d(& - cfld,nfld,ipos,jpos, & - cids, cide, cjds, cjde, & - cims, cime, cjms, cjme, & - cits, cite, cjts, cjte, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, .true.) - else - call n2c_max3d(& - cfld,nfld,ipos,jpos, & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cits, cite, cjts, cjte, ckts, ckte, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte, .true.) - endif - end subroutine UpMax - - subroutine DownCopy (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj) ! nest ratios - use module_interp_store - use module_interp_nmm, only: c2n_copy3d, c2n_copy2d - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD - REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(INOUT) :: nfld - - if(nkts==nkte) then - call c2n_copy2d(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - cfld,nfld,imask, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, .true.) - else - call c2n_copy3d(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & - cfld,nfld,imask, & - cims, cime, cjms, cjme, ckms, ckme, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte, .true.) - endif - end subroutine DownCopy - - subroutine UpVel (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj) ! nest ratios - - use module_interp_nmm, only: n2c_copy3d, n2c_copy2d - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(OUT) :: CFLD - REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(IN) :: nfld - - if(nkts==nkte) then - call n2c_copy2d( cfld,nfld,ipos,jpos, & - cids, cide, cjds, cjde, & - cims, cime, cjms, cjme, & - cits, cite, cjts, cjte, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, .false.) - else - call n2c_copy3d(& - cfld,nfld,ipos,jpos, & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cits, cite, cjts, cjte, ckts, ckte, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte, .false.) - endif - end subroutine UpVel - - subroutine DownVel (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width for interp - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj) ! nest ratios - use module_interp_store - use module_interp_nmm, only: c2n_copy3d, c2n_copy2d - implicit none - LOGICAL,INTENT(IN) :: xstag, ystag - INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw,ipos,jpos,nri,nrj - - INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK - REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD - REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(INOUT) :: nfld - - if(nkts==nkte) then - call c2n_copy2d(IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - cfld,nfld,imask, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, .false.) - else - call c2n_copy3d(IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & - cfld,nfld,imask, & - cims, cime, cjms, cjme, ckms, ckme, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte, .false.) - endif - end subroutine DownVel - - SUBROUTINE BdyMass (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & ! nest ratios - c_bxs,n_bxs, & - c_bxe,n_bxe, & - c_bys,n_bys, & - c_bye,n_bye, & - c_btxs,n_btxs, & - c_btxe,n_btxe, & - c_btys,n_btys, & - c_btye,n_btye, & - emethod,evalue) ! Extrapolation information - - ! use module_state_description - USE module_configure - USE module_wrf_error - use module_interp_store - use module_interp_nmm, only: c2b_mass, c2b_copy2d - - IMPLICIT NONE - integer, parameter :: bdyw = 1 - - INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & - ipos, jpos, & - nri, nrj, emethod - real, intent(in) :: evalue - - LOGICAL, INTENT(IN) :: xstag, ystag - - REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld,ccwm - REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld,ncwm - ! - INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask - - ! Output field boundary info: - real,dimension(nims:nime,nkms:nkme,bdyw) :: n_bys,n_bye - real,dimension(njms:njme,nkms:nkme,bdyw) :: n_bxs,n_bxe - - ! Unused parameters: - REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,c_bxe,c_bys,c_bye - REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye - - if(nkts==nkte) then - call c2b_copy2d(iih,jjh, & - hbwgt1,hbwgt2,hbwgt3,hbwgt4, & - cfld, & - n_bxs, n_bxe, n_bys, n_bye, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, & - .true.) - else - call c2b_mass(iih,jjh, & - hbwgt1,hbwgt2,hbwgt3,hbwgt4, & - cfld, & - iinfo_bxs,iinfo_bxe,iinfo_bys,iinfo_bye, & - winfo_bxs,winfo_bxe,winfo_bys,winfo_bye, & - n_bxs, n_bxe, n_bys, n_bye, & - emethod, evalue, & - cims, cime, cjms, cjme, ckms, ckme, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte) - endif - END SUBROUTINE BdyMass - - ! - !-------------------------------------------------------------------------------------- - ! - SUBROUTINE BdyCopy (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & ! nest ratios - c_bxs,n_bxs, & - c_bxe,n_bxe, & - c_bys,n_bys, & - c_bye,n_bye, & - c_btxs,n_btxs, & - c_btxe,n_btxe, & - c_btys,n_btys, & - c_btye,n_btye) - - ! use module_state_description - USE module_configure - USE module_wrf_error - use module_interp_nmm, only: c2b_copy3d, c2b_copy2d - use module_interp_store - - IMPLICIT NONE - integer, parameter :: bdyw = 1 - - INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & - ipos, jpos, & - nri, nrj - - LOGICAL, INTENT(IN) :: xstag, ystag - - REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld - REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld - ! - INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask - - ! Output field boundary info: - real,dimension(nims:nime,nkms:nkme,bdyw) :: n_bys,n_bye - real,dimension(njms:njme,nkms:nkme,bdyw) :: n_bxs,n_bxe - - ! Nest-parent horizontal interpolation information: - ! Unused parameters: - REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,c_bxe,c_bys,c_bye - REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye - - if(nkts==nkte) then - call c2b_copy2d(iiv,jjv, & - vbwgt1,vbwgt2,vbwgt3,vbwgt4, & - cfld, & - n_bxs, n_bxe, n_bys, n_bye, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, .false.) - else - call c2b_copy3d(iih,jjh, & - hbwgt1,hbwgt2,hbwgt3,hbwgt4, & - cfld, & - n_bxs, n_bxe, n_bys, n_bye, & - cims, cime, cjms, cjme, ckms, ckme, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte, .false.) - endif - - END SUBROUTINE BdyCopy - ! - !-------------------------------------------------------------------------------------- - ! - subroutine NoInterp() - end subroutine NoInterp - ! - !-------------------------------------------------------------------------------------- - ! - SUBROUTINE BdyVel (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & ! nest ratios - c_bxs,n_bxs, & - c_bxe,n_bxe, & - c_bys,n_bys, & - c_bye,n_bye, & - c_btxs,n_btxs, & - c_btxe,n_btxe, & - c_btys,n_btys, & - c_btye,n_btye) - - ! use module_state_description - USE module_configure - USE module_wrf_error - use module_interp_nmm, only: c2b_copy3d, c2b_copy2d - use module_interp_store - - IMPLICIT NONE - integer, parameter :: bdyw = 1 - - INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & - ipos, jpos, & - nri, nrj - - LOGICAL, INTENT(IN) :: xstag, ystag - - REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld - REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld - ! - INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask - - ! Output field boundary info: - real,dimension(nims:nime,nkms:nkme,bdyw) :: n_bys,n_bye - real,dimension(njms:njme,nkms:nkme,bdyw) :: n_bxs,n_bxe - - ! Nest-parent horizontal interpolation information: - ! Unused parameters: - REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,c_bxe,c_bys,c_bye - REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye - - if(nkts==nkte) then - call c2b_copy2d(iiv,jjv, & - vbwgt1,vbwgt2,vbwgt3,vbwgt4, & - cfld, & - n_bxs, n_bxe, n_bys, n_bye, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte, .false.) - else - call c2b_copy3d(iiv,jjv, & - vbwgt1,vbwgt2,vbwgt3,vbwgt4, & - cfld, & - n_bxs, n_bxe, n_bys, n_bye, & - cims, cime, cjms, cjme, ckms, ckme, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nits, nite, njts, njte, nkts, nkte, .false.) - endif - END SUBROUTINE BdyVel - ! - !-------------------------------------------------------------------------------------- - ! - SUBROUTINE BdyNear (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & ! nest ratios - c_bxs,n_bxs, & - c_bxe,n_bxe, & - c_bys,n_bys, & - c_bye,n_bye, & - c_btxs,n_btxs, & - c_btxe,n_btxe, & - c_btys,n_btys, & - c_btye,n_btye) - - ! use module_state_description - USE module_configure - USE module_wrf_error - use module_interp_nmm, only: c2b_near2d - use module_interp_store - - IMPLICIT NONE - integer, parameter :: bdyw = 1 - - INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & - ipos, jpos, & - nri, nrj - - LOGICAL, INTENT(IN) :: xstag, ystag - - REAL, DIMENSION ( cims:cime, cjms:cjme ) :: cfld - REAL, DIMENSION ( nims:nime, njms:njme ) :: nfld - - INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask - - ! Output field boundary info: - real,dimension(nims:nime,1,bdyw) :: n_bys,n_bye - real,dimension(njms:njme,1,bdyw) :: n_bxs,n_bxe - - ! Unused parameters: - REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,c_bxe,c_bys,c_bye - REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye - - if(nkts/=nkte) & - call wrf_error_fatal('3D boundary nearest neighbor interpolation is not implemented.') - call c2b_near2d(hnear_i,hnear_j,cfld, & - n_bxs, n_bxe, n_bys, n_bye, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte) - - END SUBROUTINE BdyNear - - SUBROUTINE BdyINear (cfld, & ! CD field - cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nfld, & ! ND field - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & ! stencil half width - imask, & ! interpolation mask - xstag, ystag, & ! staggering of field - ipos, jpos, & ! Position of lower left of nest in CD - nri, nrj, & ! nest ratios - c_bxs,n_bxs, & - c_bxe,n_bxe, & - c_bys,n_bys, & - c_bye,n_bye, & - c_btxs,n_btxs, & - c_btxe,n_btxe, & - c_btys,n_btys, & - c_btye,n_btye) - - ! use module_state_description - USE module_configure - USE module_wrf_error - use module_interp_nmm, only: c2b_inear2d - use module_interp_store - - IMPLICIT NONE - integer, parameter :: bdyw = 1 - - INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & - cims, cime, ckms, ckme, cjms, cjme, & - cits, cite, ckts, ckte, cjts, cjte, & - nids, nide, nkds, nkde, njds, njde, & - nims, nime, nkms, nkme, njms, njme, & - nits, nite, nkts, nkte, njts, njte, & - shw, & - ipos, jpos, & - nri, nrj - - LOGICAL, INTENT(IN) :: xstag, ystag - - INTEGER, DIMENSION ( cims:cime, cjms:cjme ) :: cfld - INTEGER, DIMENSION ( nims:nime, njms:njme ) :: nfld - - INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask - - ! Output field boundary info: - integer,dimension(nims:nime,1,bdyw) :: n_bys,n_bye - integer,dimension(njms:njme,1,bdyw) :: n_bxs,n_bxe - - ! Unused parameters: - integer, DIMENSION( * ), INTENT(INOUT) :: c_bxs,c_bxe,c_bys,c_bye - integer, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye - - if(nkts/=nkte) & - call wrf_error_fatal('3D boundary nearest neighbor interpolation is not implemented.') - call c2b_inear2d(hnear_i,hnear_j,cfld, & - n_bxs, n_bxe, n_bys, n_bye, & - cims, cime, cjms, cjme, & - nids, nide, njds, njde, & - nims, nime, njms, njme, & - nits, nite, njts, njte) - - END SUBROUTINE BdyINear - -!-------------------------------------------------------------------------------------- -! End of Sam's doing -!-------------------------------------------------------------------------------------- - -#endif - -! Third block of ARW-specific routines -#if ! defined(NMM_CORE) || NMM_CORE!=1 SUBROUTINE interp_mask_field ( enable, & ! says whether to allow interpolation or just the bcasts cfld, & ! CD field @@ -6386,7 +4821,5 @@ SUBROUTINE interp_fcn_lagr_ll ( cfld_inp, & ! CD field END DO END SUBROUTINE interp_fcn_lagr_ll -#endif -! End of third block of ARW-only routines diff --git a/share/mediation_feedback_domain.F b/share/mediation_feedback_domain.F index c108fb86ab..23717d9bc4 100644 --- a/share/mediation_feedback_domain.F +++ b/share/mediation_feedback_domain.F @@ -5,7 +5,7 @@ SUBROUTINE med_feedback_domain ( parent_grid , nested_grid ) USE module_timing, only: now_time USE module_domain USE module_configure - USE module_intermediate_nmm +! USE module_intermediate_nmm #ifdef DM_PARALLEL USE module_dm, ONLY: local_communicator, intercomm_active #else @@ -22,18 +22,6 @@ SUBROUTINE med_feedback_domain ( parent_grid , nested_grid ) INTEGER :: sm31 , em31 , sm32 , em32 , sm33 , em33 INTEGER :: sm31x, em31x, sm32x, em32x, sm33x, em33x INTEGER :: sm31y, em31y, sm32y, em32y, sm33y, em33y -#ifdef NMM_FIND_LOAD_IMBALANCE - REAL(kind=8), save :: total_time(40)=0. -#if(NMM_NEST==1) - REAL(kind=8), save :: p2i_1_time(40)=0. - REAL(kind=8), save :: p2i_2_time(40)=0. - REAL(kind=8) :: p2i_1_now, p2i_2_now -#endif - REAL(kind=8), save :: feed1_time(40)=0. - REAL(kind=8), save :: feed2_time(40)=0. - REAL(kind=8) :: this_time,ttime, feed1_now, feed2_now - integer :: ierr -#endif character*255 :: message ! ---------------------------------------------------------- ! ------------------------------------------------------ @@ -85,44 +73,6 @@ SUBROUTINE update_after_feedback_em ( grid & # include "dummy_new_decl.inc" END SUBROUTINE update_after_feedback_em #endif -#endif -! ---------------------------------------------------------- -! Interface definitions for NMM (placeholder) -! ---------------------------------------------------------- -#if (NMM_CORE == 1 && NMM_NEST == 1) -! ------------------------------------------------------ -! These routines are supplied by module_dm.F from the -! external communication package (e.g. external/RSL) -! This is gopal's extension for the NMM core -! ------------------------------------------------------ - SUBROUTINE feedback_domain_nmm_part1 ( grid, nested_grid, config_flags & -! -# include "dummy_new_args.inc" -! - ) - USE module_domain - USE module_configure - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: nested_grid - TYPE (grid_config_rec_type) :: config_flags -# include "dummy_new_decl.inc" - END SUBROUTINE feedback_domain_nmm_part1 -! - SUBROUTINE feedback_domain_nmm_part2 ( grid, intermediate_grid , nested_grid, config_flags & -! -# include "dummy_new_args.inc" -! - ) - USE module_domain - USE module_configure - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: intermediate_grid - TYPE(domain), POINTER :: nested_grid - TYPE (grid_config_rec_type) :: config_flags -# include "dummy_new_decl.inc" - - END SUBROUTINE feedback_domain_nmm_part2 - #endif END INTERFACE ! ---------------------------------------------------------- @@ -189,75 +139,6 @@ END SUBROUTINE feedback_domain_nmm_part2 #endif ! ------------------------------------------------------ ! End of Feedback calls for EM CORE. -! ------------------------------------------------------ -! ------------------------------------------------------ -! ------------------------------------------------------ -! Feedback calls for NMM. (Placeholder) -! ------------------------------------------------------ -#if (NMM_CORE == 1 && NMM_NEST == 1) -! ------------------------------------------------------ -! This is gopal's extension for the NMM core -! ------------------------------------------------------ - - CALL model_to_grid_config_rec ( nested_grid%id , model_config_rec , config_flags ) - grid => nested_grid%intermediate_grid -!dusan orig CALL alloc_space_field ( grid, grid%id , 1 , 2 , .TRUE. , & -# if (defined(MOVE_NESTS) || ((!defined(KEEP_INT_AROUND)) && (!defined(SGIALTIX)) && (!defined(FUJITSU_FX10)))) -! IF ( grid%active_this_task ) THEN - CALL ensure_space_field & - ( grid, grid%id , 1 , 3 , .FALSE. , grid%active_this_task , & - grid%sd31, grid%ed31, grid%sd32, grid%ed32, grid%sd33, grid%ed33, & - grid%sm31, grid%em31, grid%sm32, grid%em32, grid%sm33, grid%em33, & - grid%sp31, grid%ep31, grid%sp32, grid%ep32, grid%sp33, grid%ep33, & - grid%sp31x, grid%ep31x, grid%sp32x, grid%ep32x, grid%sp33x, grid%ep33x,& - grid%sp31y, grid%ep31y, grid%sp32y, grid%ep32y, grid%sp33y, grid%ep33y,& - grid%sm31x, grid%em31x, grid%sm32x, grid%em32x, grid%sm33x, grid%em33x, & ! x-xpose - grid%sm31y, grid%em31y, grid%sm32y, grid%em32y, grid%sm33y, grid%em33y & ! y-xpose - ) -! ENDIF -# endif - nested_grid%intermediate_grid%interp_mp=parent_grid%interp_mp .or. nested_grid%interp_mp -#if (HWRF == 1) - nested_grid%intermediate_grid%pdyn_parent_age=parent_grid%pdyn_parent_age - nested_grid%intermediate_grid%pdyn_smooth_age=parent_grid%pdyn_smooth_age -#endif - - ! NOTE: the intermediate grid is a grid with the spatial extent and - ! processor decomposition of the nest, at the resolution of the - ! parent. It is stored as nested_grid%intermediate_grid. - - ! STEP 1: Copy from parent grid to intermediate grid: - grid => parent_grid -#if (NMM_NEST==1) - call parent_to_inter_part1(parent_grid, nested_grid%intermediate_grid, & - nested_grid, config_flags) - - grid => nested_grid%intermediate_grid - call parent_to_inter_part2(nested_grid%intermediate_grid, nested_grid, config_flags) - -#endif - IF ( nested_grid%active_this_task ) THEN - ! STEP 2: Interpolate from nest grid to intermediate grid - grid => nested_grid%intermediate_grid -!# include "deref_kludge.h" - CALL feedback_domain_nmm_part1 ( grid, nested_grid, config_flags & -! -# include "actual_new_args.inc" -! - ) - ENDIF - - grid => parent_grid -! - CALL feedback_domain_nmm_part2 ( grid , nested_grid%intermediate_grid, nested_grid , config_flags & -! -# include "actual_new_args.inc" -! - ) - -#endif -! ------------------------------------------------------ -! End of Feedback calls for NMM. ! ------------------------------------------------------ RETURN END SUBROUTINE med_feedback_domain diff --git a/share/mediation_force_domain.F b/share/mediation_force_domain.F index 0950728498..bdf652e584 100644 --- a/share/mediation_force_domain.F +++ b/share/mediation_force_domain.F @@ -2,12 +2,8 @@ !WRF:MEDIATION_LAYER:NESTING ! SUBROUTINE med_force_domain ( parent_grid , nested_grid ) -#ifdef NMM_FIND_LOAD_IMBALANCE - USE module_timing, only: now_time -#endif USE module_domain USE module_configure - USE module_intermediate_nmm #ifdef DM_PARALLEL USE module_dm, ONLY : intercomm_active, & mpi_comm_to_kid, mpi_comm_to_mom, which_kid @@ -19,11 +15,6 @@ SUBROUTINE med_force_domain ( parent_grid , nested_grid ) TYPE(domain), POINTER :: parent_grid , nested_grid TYPE(domain), POINTER :: grid INTEGER nlev, msize -#ifdef NMM_FIND_LOAD_IMBALANCE - REAL(kind=8), save :: total_time(40)=0 - REAL(kind=8) :: this_time - character*255 :: message -#endif #if !defined(MAC_KLUDGE) TYPE (grid_config_rec_type) :: config_flags #endif @@ -86,57 +77,6 @@ SUBROUTINE couple_or_uncouple_em ( grid, config_flags , couple & # include "dummy_new_decl.inc" END SUBROUTINE couple_or_uncouple_em #endif -#endif -! ---------------------------------------------------------- -! Interface definitions for NMM (placeholder) -! ---------------------------------------------------------- -#if (NMM_CORE == 1 && NMM_NEST ==1) -!======================================================================= -! Added for the NMM core. This is gopal's doing. -!======================================================================= - - SUBROUTINE force_domain_nmm_part1 ( grid, intermediate_grid, ngrid, config_flags & -! -# include "dummy_new_args.inc" -! - ) - USE module_domain - USE module_configure - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: intermediate_grid - TYPE(domain), POINTER :: ngrid - TYPE (grid_config_rec_type) :: config_flags -# include "dummy_new_decl.inc" - END SUBROUTINE force_domain_nmm_part1 - - SUBROUTINE before_interp_halos_nmm(grid,config_flags & -! -#include "dummy_new_args.inc" -! - ) - USE module_domain - USE MODULE_CONFIGURE - TYPE(domain), POINTER :: grid - TYPE (grid_config_rec_type) :: config_flags -# include "dummy_new_decl.inc" - END SUBROUTINE before_interp_halos_nmm - - SUBROUTINE force_domain_nmm_part2 ( grid, nested_grid, config_flags & -! -# include "dummy_new_args.inc" -! - ) - USE module_domain - USE module_configure - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: nested_grid - TYPE (grid_config_rec_type) :: config_flags - -# include "dummy_new_decl.inc" - END SUBROUTINE force_domain_nmm_part2 -!======================================================================= -! End of gopal's doing. -!======================================================================= #endif END INTERFACE ! ---------------------------------------------------------- @@ -275,105 +215,6 @@ END SUBROUTINE force_domain_nmm_part2 #endif ! ------------------------------------------------------ ! End of Forcing calls for EM CORE. -! ------------------------------------------------------ -! ------------------------------------------------------ -! ------------------------------------------------------ -! Forcing calls for NMM. (Placeholder) -! ------------------------------------------------------ -# if (NMM_CORE == 1 && NMM_NEST == 1) -!======================================================================= -! Added for the NMM core. This is gopal's doing. -!======================================================================= - - CALL model_to_grid_config_rec ( nested_grid%id , model_config_rec , config_flags ) - - grid => nested_grid%intermediate_grid -!dusan orig CALL alloc_space_field ( grid, grid%id , 1 , 2 , .TRUE. , & -# if (defined(MOVE_NESTS) || ((!defined(KEEP_INT_AROUND)) && (!defined(SGIALTIX)) && (!defined(FUJITSU_FX10)))) - CALL ensure_space_field & - ( grid, grid%id , 1 , 3 , .FALSE. , intercomm_active(grid%id), & - grid%sd31, grid%ed31, grid%sd32, grid%ed32, grid%sd33, grid%ed33, & - grid%sm31, grid%em31, grid%sm32, grid%em32, grid%sm33, grid%em33, & - grid%sp31, grid%ep31, grid%sp32, grid%ep32, grid%sp33, grid%ep33, & - grid%sp31x, grid%ep31x, grid%sp32x, grid%ep32x, grid%sp33x, grid%ep33x,& - grid%sp31y, grid%ep31y, grid%sp32y, grid%ep32y, grid%sp33y, grid%ep33y,& - grid%sm31x, grid%em31x, grid%sm32x, grid%em32x, grid%sm33x, grid%em33x, & ! x-xpose - grid%sm31y, grid%em31y, grid%sm32y, grid%em32y, grid%sm33y, grid%em33y & ! y-xpose - ) -#endif - nested_grid%intermediate_grid%interp_mp=parent_grid%interp_mp .or. nested_grid%interp_mp -#if (HWRF == 1) - nested_grid%intermediate_grid%pdyn_parent_age=parent_grid%pdyn_parent_age - nested_grid%intermediate_grid%pdyn_smooth_age=parent_grid%pdyn_smooth_age -#endif - - - ! couple parent domain - ! grid => parent_grid - ! swich config_flags to point to parent rconfig info - ! CALL model_to_grid_config_rec ( grid%id , model_config_rec , config_flags ) - - ! on restart do not force the nest the first time since it has already been forced - ! prior to the writing of the restart file -! IF ( .NOT. ( config_flags%restart .AND. nested_grid%first_force ) ) THEN - ! couple nested domain - grid => nested_grid -IF ( grid%active_this_task ) THEN - CALL model_to_grid_config_rec ( grid%id , model_config_rec , config_flags ) - ! Apply halos on weights and indices: - call before_interp_halos_nmm(grid,config_flags & -! -# include "actual_new_args.inc" -! - ) -ENDIF - - ! Copy interpolation information from parent grid to intermediate grid: - ! grid => parent_grid - ! call parent_to_inter_part1(parent_grid, nested_grid%intermediate_grid, & - ! nested_grid, config_flags) - - ! grid => nested_grid%intermediate_grid - ! call parent_to_inter_part2(nested_grid%intermediate_grid, config_flags) - - ! Transfer remaining information from parent to intermediate grid: - grid => parent_grid -IF ( grid%active_this_task .OR. nested_grid%active_this_task ) THEN - CALL wrf_dm_nestexchange_init - CALL model_to_grid_config_rec ( grid%id , model_config_rec , config_flags ) - CALL force_domain_nmm_part1 ( grid , nested_grid%intermediate_grid, & - nested_grid, config_flags & -! -# include "actual_new_args.inc" -! - ) -ENDIF -IF ( nested_grid%active_this_task ) THEN - grid => nested_grid%intermediate_grid - ! Finish transfering information from parent to intermediate - ! grid, then run interpolation on the intermediate domain and - ! compute the values for the nest boundaries. - CALL model_to_grid_config_rec ( nested_grid%id , model_config_rec , config_flags ) - CALL force_domain_nmm_part2 ( grid, nested_grid, config_flags & -! -# include "actual_new_args.inc" -! -) -ENDIF - - IF ( nested_grid%first_force ) THEN - nested_grid%first_force = .FALSE. - ENDIF - nested_grid%dtbc = 0. -! - grid => nested_grid%intermediate_grid -!======================================================================= -! End of gopal's doing. -!======================================================================= -# endif -! ------------------------------------------------------ -! End of Forcing calls for NMM. -! ------------------------------------------------------ ! ------------------------------------------------------ RETURN END SUBROUTINE med_force_domain diff --git a/share/mediation_integrate.F b/share/mediation_integrate.F index 4ad05543ce..971af8cd0e 100644 --- a/share/mediation_integrate.F +++ b/share/mediation_integrate.F @@ -57,10 +57,6 @@ SUBROUTINE med_before_solve_io ( grid , config_flags ) INTEGER :: ialarm INTEGER :: rc TYPE(WRFU_Time) :: currTime, startTime -#if ( HWRF == 1 ) - INTEGER :: hr, min, sec, ms,julyr,julday - REAL :: GMT -#endif CHARACTER*256 :: message #if (WRFPLUS == 1) @@ -97,12 +93,6 @@ SUBROUTINE med_before_solve_io ( grid , config_flags ) IF ( ( config_flags%restart ) .AND. & ( config_flags%write_hist_at_0h_rst ) .AND. & ( currTime .EQ. startTime ) ) THEN -#if ( NMM_CORE == 1 ) -! NMM-only: outputs boundary arrays of certain variables: -! call med_boundary_out(grid,config_flags) -#endif - - ! output history at beginning of restart if alarm is ringing CALL med_hist_out ( grid , HISTORY_ALARM, config_flags ) @@ -343,14 +333,6 @@ SUBROUTINE med_before_solve_io ( grid , config_flags ) CALL WRFU_ClockGet( grid%domain_clock, CurrTime=currTime, StartTime=startTime ) IF ( ( WRFU_AlarmIsRinging( grid%alarms( RESTART_ALARM ), rc=rc ) ) .AND. & ( currTime .NE. startTime ) ) THEN -#if ( HWRF == 1 ) -!zhang's doing - CALL domain_clock_get( grid, current_time=CurrTime ) - CALL WRFU_TimeGet( CurrTime, YY=julyr, dayOfYear=julday, H=hr, M=min, S=sec, MS=ms, rc=rc) - gmt=hr+real(min)/60.+real(sec)/3600.+real(ms)/(1000*3600) - if (grid%id .eq. 2) call med_namelist_out ( grid , config_flags ) -!end of zhang's doing -#endif IF ( grid%id .EQ. 1 ) THEN ! Only the parent initiates the restart writing. Otherwise, different ! domains may be written out at different times and with different @@ -952,341 +934,6 @@ END SUBROUTINE wrf_tsin #endif -#if (NMM_CORE == 1 && NMM_NEST == 1) -!=================================================================================== -! Added for the NMM core. This is gopal's doing. -!=================================================================================== - - INTERFACE - - SUBROUTINE med_nest_egrid_configure ( parent , nest ) - USE module_domain , ONLY : domain - TYPE(domain) , POINTER :: parent , nest - END SUBROUTINE med_nest_egrid_configure - - SUBROUTINE med_construct_egrid_weights ( parent , nest ) - USE module_domain , ONLY : domain - TYPE(domain) , POINTER :: parent , nest - END SUBROUTINE med_construct_egrid_weights - - SUBROUTINE BASE_STATE_PARENT ( Z3d,Q3d,T3d,PSTD, & - PINT,T,Q,CWM, & - FIS,QSH,PD,PDTOP,PTOP, & - ETA1,ETA2, & - DETA1,DETA2, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE ) -! - - USE MODULE_MODEL_CONSTANTS - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: IPS,IPE,JPS,JPE,KPS,KPE - REAL, INTENT(IN ) :: PDTOP,PTOP - REAL, DIMENSION(KMS:KME), INTENT(IN) :: ETA1,ETA2,DETA1,DETA2 - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD,QSH - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q,CWM - REAL, DIMENSION(KMS:KME) , INTENT(OUT):: PSTD - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(OUT):: Z3d,Q3d,T3d - - END SUBROUTINE BASE_STATE_PARENT - - SUBROUTINE NEST_TERRAIN ( nest, config_flags ) - USE module_domain , ONLY : domain - USE module_configure , ONLY : grid_config_rec_type - TYPE(domain) , POINTER :: nest - TYPE(grid_config_rec_type) , INTENT(IN) :: config_flags - END SUBROUTINE NEST_TERRAIN - - SUBROUTINE med_interp_domain ( parent , nest ) - USE module_domain , ONLY : domain - TYPE(domain) , POINTER :: parent , nest - END SUBROUTINE med_interp_domain - - SUBROUTINE med_init_domain_constants_nmm ( parent, nest ) - USE module_domain , ONLY : domain - TYPE(domain) , POINTER :: parent , nest - END SUBROUTINE med_init_domain_constants_nmm - - SUBROUTINE start_domain ( grid , allowed_to_move ) - USE module_domain , ONLY : domain - TYPE(domain) :: grid - LOGICAL, INTENT(IN) :: allowed_to_move - END SUBROUTINE start_domain - - END INTERFACE - -#if ( HWRF == 1 ) -!zhang's doing test - if (config_flags%restart .or. nest%analysis) then - nest%first_force = .true. - else - nest%first_force = .false. - endif -!end of zhang's doing - - ! Do we run the MOIST and SCALAR interp/smooth functions? (u=(), d=(), f=() and s=()) - - ! Only run it if a non-bulk scheme is in use, since bulk schemes do - ! not use MOIST and SCALAR as prognostic variables (they are - ! recalculated on the fly every timestep): -!zhang's doing for analysis option - IF(.not. nest%analysis .and. .not. config_flags%restart)THEN ! initialize for cold-start -#endif - -!---------------------------------------------------------------------------- -! initialize nested domain configurations including setting up wbd,sbd, etc -!---------------------------------------------------------------------------- - - CALL med_nest_egrid_configure ( parent , nest ) - -!------------------------------------------------------------------------- -! initialize lat-lons and determine weights -!------------------------------------------------------------------------- - - CALL med_construct_egrid_weights ( parent, nest ) -! -! -! De-reference dimension information stored in the grid data structure. -! -! From the hybrid, construct the GPMs on isobaric surfaces and then interpolate those -! values on to the nested domain. 23 standard prssure levels are assumed here. For -! levels below ground, lapse rate atmosphere is assumed before the use of vertical -! spline interpolation -! - - - IDS = parent%sd31 - IDE = parent%ed31 - JDS = parent%sd32 - JDE = parent%ed32 - KDS = parent%sd33 - KDE = parent%ed33 - - IMS = parent%sm31 - IME = parent%em31 - JMS = parent%sm32 - JME = parent%em32 - KMS = parent%sm33 - KME = parent%em33 - - IPS = parent%sp31 - IPE = parent%ep31 - JPS = parent%sp32 - JPE = parent%ep32 - KPS = parent%sp33 - KPE = parent%ep33 - - ! CALL BASE_STATE_PARENT ( parent%Z3d,parent%Q3d,parent%T3d,parent%PSTD, & - ! parent%PINT,parent%T,parent%Q,parent%CWM, & - ! parent%FIS,parent%QSH,parent%PD,parent%pdtop,parent%pt, & - ! parent%ETA1,parent%ETA2, & - ! parent%DETA1,parent%DETA2, & - ! IDS,IDE,JDS,JDE,KDS,KDE, & - ! IMS,IME,JMS,JME,KMS,KME, & - ! IPS,IPE,JPS,JPE,KPS,KPE ) - -! -! Set new terrain. Since some terrain adjustment is done within the interpolation calls -! at the next step, the new terrain over the nested domain has to be called here. -! - IDS = nest%sd31 - IDE = nest%ed31 - JDS = nest%sd32 - JDE = nest%ed32 - KDS = nest%sd33 - KDE = nest%ed33 - - IMS = nest%sm31 - IME = nest%em31 - JMS = nest%sm32 - JME = nest%em32 - KMS = nest%sm33 - KME = nest%em33 - - IPS = nest%sp31 - IPE = nest%ep31 - JPS = nest%sp32 - JPE = nest%ep32 - KPS = nest%sp33 - KPE = nest%ep33 - - - IF ( nest%active_this_task ) THEN - CALL NEST_TERRAIN ( nest, config_flags ) - ENDIF - -! Initialize some more constants required especially for terrain adjustment processes - - IF ( nest%active_this_task .AND. parent%active_this_task ) THEN - nest%PSTD=parent%PSTD - ENDIF -#ifdef DM_PARALLEL - IF ( nest%active_this_task .OR. parent%active_this_task ) THEN - IF ( parent%active_this_task ) THEN - CALL BYTE_BCAST( parent%PSTD, KME*RWORDSIZE, mpi_comm_to_kid( which_kid( nest%id ) , parent%id ) ) - ELSE - CALL BYTE_BCAST( nest%PSTD, KME*RWORDSIZE, mpi_comm_to_mom( nest%id ) ) - ENDIF - ENDIF -#endif - - IF ( nest%active_this_task ) THEN - nest%KZMAX=KME - parent%KZMAX=KME ! just for safety - - DO J = JPS, MIN(JPE,JDE-1) - DO I = IPS, MIN(IPE,IDE-1) - nest%fis(I,J)=nest%hres_fis(I,J) - ENDDO - ENDDO - -!-------------------------------------------------------------------------- -! interpolation call -!-------------------------------------------------------------------------- - -! initialize nest with interpolated data from the parent - - nest%imask_nostag = 0 - nest%imask_xstag = 0 - nest%imask_ystag = 0 - nest%imask_xystag = 0 - ENDIF - -#if ( HWRF == 1 ) - CALL med_interp_domain( parent, nest ) -#else - CALL domain_clock_get( parent, start_time=strt_time, current_time=cur_time ) - - IF ( .not. ( config_flags%restart .AND. strt_time .EQ. cur_time ) ) THEN - -write(0,*)__FILE__,__LINE__,parent%id,nest%id - CALL med_interp_domain( parent, nest ) -write(0,*)__FILE__,__LINE__ - - ELSE - - CALL domain_clock_get( nest, current_timestr=timestr ) - CALL construct_filename2a ( rstname , config_flags%rst_inname , nest%id , 2 , timestr ) - - WRITE(message,*)'RESTART: nest, opening ',TRIM(rstname),' for reading' - CALL wrf_message ( message ) - CALL model_to_grid_config_rec ( nest%id , model_config_rec , nest_config_flags ) - CALL open_r_dataset ( fid , TRIM(rstname) , nest , nest_config_flags , "DATASET=RESTART", ierr ) - IF ( ierr .NE. 0 ) THEN - WRITE( message , '("program wrf: error opening ",A32," for reading")') TRIM(rstname) - CALL WRF_ERROR_FATAL ( message ) - ENDIF - CALL input_restart ( fid, nest , nest_config_flags , ierr ) - CALL close_dataset ( fid , nest_config_flags , "DATASET=RESTART" ) - - END IF - -#endif -!------------------------------------------------------------------------------ -! set up constants (module_initialize_real.F for nested nmm domain) -!----------------------------------------------------------------------------- - - CALL med_init_domain_constants_nmm ( parent, nest ) - -!-------------------------------------------------------------------------------------- -! set some other initial fields, fill out halos, etc. -!-------------------------------------------------------------------------------------- - - IF ( nest%active_this_task) THEN - CALL push_communicators_for_domain( nest%id ) - CALL start_domain ( nest, .TRUE.) - CALL pop_communicators_for_domain - ENDIF - - -#if ( HWRF == 1 ) -!zhang's doing: else for analysis or restart option - -!zhang test - CALL nl_set_isice ( nest%id , config_flags%isice ) - CALL nl_set_isoilwater ( nest%id , config_flags%isoilwater ) - CALL nl_set_isurban ( nest%id , config_flags%isurban ) - CALL nl_set_gmt ( nest%id , config_flags%gmt ) - CALL nl_set_julyr (nest%id, config_flags%julyr) - CALL nl_set_julday ( nest%id , config_flags%julday ) -!zhang test ends - IF ( nest%active_this_task) THEN - CALL model_to_grid_config_rec ( nest%id , model_config_rec , nest_config_flags ) - CALL push_communicators_for_domain( nest%id ) - CALL med_analysis_out ( nest, nest_config_flags ) - CALL pop_communicators_for_domain - ENDIF - - ELSE - -!------------------------------------------------------------------------------------ -! read in analysis (equivalent of restart for the nested domains) -!------------------------------------------------------------------------------------ - -!zhang's doing - IF ( nest%active_this_task) THEN - IF( nest%analysis .and. .not. config_flags%restart)THEN - CALL push_communicators_for_domain( nest%id ) - CALL med_analysis_in ( nest, config_flags ) - CALL pop_communicators_for_domain - ELSE IF (config_flags%restart)THEN - CALL push_communicators_for_domain( nest%id ) - CALL med_restart_in ( nest, config_flags ) - CALL pop_communicators_for_domain - ENDIF - ENDIF -!end of zhang's doing - -!---------------------------------------------------------------------------- -! initialize nested domain configurations including setting up wbd,sbd, etc -!---------------------------------------------------------------------------- - - CALL med_nest_egrid_configure ( parent , nest ) - -!------------------------------------------------------------------------- -! initialize lat-lons and determine weights (overwrite for safety) -!------------------------------------------------------------------------- - - CALL med_construct_egrid_weights ( parent, nest ) - - nest%imask_nostag = 0 - nest%imask_xstag = 0 - nest%imask_ystag = 0 - nest%imask_xystag = 0 - -!------------------------------------------------------------------------------ -! set up constants (module_initialize_real.F for nested nmm domain) -!----------------------------------------------------------------------------- - - CALL med_init_domain_constants_nmm ( parent, nest ) - -!-------------------------------------------------------------------------------------- -! set some other initial fields, fill out halos, etc. (again, safety sake only) -! Also, in order to accomodate some physics initialization after nest move, set -! analysis back to false for future use -!-------------------------------------------------------------------------------------- - - - IF ( nest%active_this_task) THEN - CALL push_communicators_for_domain( nest%id ) - CALL start_domain ( nest, .TRUE.) - CALL pop_communicators_for_domain - ENDIF - - nest%analysis=.FALSE. - CALL nl_set_analysis( nest%id, nest%analysis) - - ENDIF - -#endif - -!=================================================================================== -! Added for the NMM core. End of gopal's doing. -!=================================================================================== -#endif RETURN END SUBROUTINE med_nest_initial @@ -1316,12 +963,6 @@ SUBROUTINE med_nest_force ( parent , nest ) ! Local INTEGER :: idum1 , idum2 , fid, rc -#if (NMM_CORE == 1 && NMM_NEST == 1) - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE ! gopal - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE -#endif - INTERFACE SUBROUTINE med_force_domain ( parent , nest ) USE module_domain , ONLY : domain @@ -1331,75 +972,8 @@ SUBROUTINE med_interp_domain ( parent , nest ) USE module_domain , ONLY : domain TYPE(domain) , POINTER :: parent , nest END SUBROUTINE med_interp_domain -#if (NMM_CORE == 1 && NMM_NEST == 1) -!=================================================================================== -! Added for the NMM core. This is gopal's doing. -!=================================================================================== - - SUBROUTINE BASE_STATE_PARENT ( Z3d,Q3d,T3d,PSTD, & - PINT,T,Q,CWM, & - FIS,QSH,PD,PDTOP,PTOP, & - ETA1,ETA2, & - DETA1,DETA2, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) -! - - USE MODULE_MODEL_CONSTANTS - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - REAL, INTENT(IN ) :: PDTOP,PTOP - REAL, DIMENSION(KMS:KME), INTENT(IN) :: ETA1,ETA2,DETA1,DETA2 - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD,QSH - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q,CWM - REAL, DIMENSION(KMS:KME) , INTENT(OUT):: PSTD - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(OUT):: Z3d,Q3d,T3d - - END SUBROUTINE BASE_STATE_PARENT - -#endif END INTERFACE -#if (NMM_CORE == 1 && NMM_NEST == 1) - -! De-reference dimension information stored in the grid data structure. - - IDS = parent%sd31 - IDE = parent%ed31 - JDS = parent%sd32 - JDE = parent%ed32 - KDS = parent%sd33 - KDE = parent%ed33 - - IMS = parent%sm31 - IME = parent%em31 - JMS = parent%sm32 - JME = parent%em32 - KMS = parent%sm33 - KME = parent%em33 - - ITS = parent%sp31 - ITE = parent%ep31 - JTS = parent%sp32 - JTE = parent%ep32 - KTS = parent%sp33 - KTE = parent%ep33 - - - ! CALL BASE_STATE_PARENT ( parent%Z3d,parent%Q3d,parent%T3d,parent%PSTD, & - ! parent%PINT,parent%T,parent%Q,parent%CWM, & - ! parent%FIS,parent%QSH,parent%PD,parent%pdtop,parent%pt, & - ! parent%ETA1,parent%ETA2, & - ! parent%DETA1,parent%DETA2, & - ! IDS,IDE,JDS,JDE,KDS,KDE, & - ! IMS,IME,JMS,JME,KMS,KME, & - ! ITS,ITE,JTS,JTE,KTS,KTE ) - -#endif - IF ( .NOT. WRFU_ClockIsStopTime(nest%domain_clock ,rc=rc) ) THEN ! initialize nest with interpolated data from the parent IF ( nest%active_this_task ) THEN @@ -1494,13 +1068,6 @@ SUBROUTINE med_last_solve_io ( grid , config_flags ) ! Local INTEGER :: rc CHARACTER*256 :: message -#if ( HWRF == 1 ) -!zhang's doing - TYPE(WRFU_Time) :: CurrTime !zhang new - INTEGER :: hr, min, sec, ms,julyr,julday - REAL :: GMT -!end of zhang's doing -#endif ! #if (EM_CORE == 1) IF( WRFU_AlarmIsRinging( grid%alarms( HISTORY_ALARM ), rc=rc ) .AND. & @@ -1525,15 +1092,6 @@ SUBROUTINE med_last_solve_io ( grid , config_flags ) ! - RESTART OUTPUT IF( WRFU_AlarmIsRinging( grid%alarms( RESTART_ALARM ), rc=rc ) ) THEN -#if ( HWRF == 1 ) -!zhang's doing -!zhang new CALL ESMF_TimeGet( grid%current_time, YY=julyr, dayOfYear=julday, H=hr, M=min, S=sec, MS=ms, rc=rc) - CALL domain_clock_get( grid, current_time=CurrTime ) - CALL WRFU_TimeGet( CurrTime, YY=julyr, dayOfYear=julday, H=hr, M=min, S=sec, MS=ms, rc=rc) - gmt=hr+real(min)/60.+real(sec)/3600.+real(ms)/(1000*3600) - if (grid%id .eq. 2) call med_namelist_out ( grid , config_flags ) -!end of zhang's doing -#endif IF ( grid%id .EQ. 1 ) THEN CALL med_restart_out ( grid , config_flags ) ENDIF @@ -1549,155 +1107,6 @@ END SUBROUTINE med_last_solve_io !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -#if ( HWRF == 1 ) -!================================================================================== -! Added for the NMM 3d var. This is simply an extension of med_restart_out. -! The file is simply called wrfanal***. This is gopal's doing -!=================================================================================== -! -SUBROUTINE med_analysis_in ( grid , config_flags ) - ! Driver layer - USE module_domain , ONLY : domain, domain_clock_get - USE module_io_domain - USE module_timing - ! Model layer - USE module_configure , ONLY : grid_config_rec_type - USE module_bc_time_utilities -!zhang USE WRF_ESMF_MOD - - IMPLICIT NONE - - ! Arguments - TYPE(domain) :: grid - TYPE (grid_config_rec_type) , INTENT(IN) :: config_flags - - ! Local - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - CHARACTER*256 :: rstname , outname - INTEGER :: fid , rid - CHARACTER (LEN=256) :: message - INTEGER :: ierr - INTEGER :: myproc -!zhang old TYPE(ESMF_Time) :: CurrTime - TYPE(WRFU_Time) :: CurrTime - CHARACTER*80 :: timestr - - IF ( wrf_dm_on_monitor() ) THEN - CALL start_timing - END IF - - rid=grid%id - -!zhang's doing CALL ESMF_ClockGet( grid%domain_clock, CurrTime=CurrTime, rc=ierr ) -!zhang's doing CALL wrf_timetoa ( CurrTime, timestr ) - CALL domain_clock_get( grid, current_timestr=timestr ) - CALL construct_filename2a ( rstname ,config_flags%anl_outname, grid%id , 2 , timestr ) - - WRITE( message , '("med_analysis_in: opening ",A," for reading")' ) TRIM ( rstname ) - CALL wrf_debug( 1 , message ) - CALL open_r_dataset ( rid, TRIM(rstname), grid , & - config_flags , "DATASET=RESTART", ierr ) - - IF ( ierr .NE. 0 ) THEN - ! Could not open the analysis file, so notify user and abort. - - write(message,'(A,I0,A,A,A)') 'ERROR: Domain ',grid%id,' analysis file ',trim(rstname),' is missing.' - call wrf_error_fatal(message) - - ! It is unsafe to continue with a cold start when the analysis - ! file is missing because the model expects that it is being - ! restart if an analysis=T. Hence, some variables will not be - ! correctly initialized. - - ! Thus, we never reach this line: - write(message,'(A,I0,A)') '-------> Domain ',grid%id,' running as a cold start (interp from parent).' - call wrf_message(message) - - if(wrf_dm_on_monitor()) then - WRITE ( message , FMT = '("Failing to read restart for domain ",I8)' ) grid%id - CALL end_timing ( TRIM(message) ) - endif - - return - ELSE - ! Was able to open the analysis file. Read it as a restart file. - - CALL input_restart ( rid, grid , config_flags , ierr ) - IF ( wrf_dm_on_monitor() ) THEN - WRITE ( message , FMT = '("Reading restart for domain ",I8)' ) grid%id - CALL end_timing ( TRIM(message) ) - END IF - CALL close_dataset ( rid , config_flags , "DATASET=RESTART" ) - ENDIF - - RETURN - -END SUBROUTINE med_analysis_in -!========================================================================================================= -!========================================================================================================= -SUBROUTINE med_analysis_out ( grid , config_flags ) - ! Driver layer - USE module_domain , ONLY : domain, domain_clock_get - USE module_io_domain - USE module_timing - ! Model layer - USE module_configure , ONLY : grid_config_rec_type - USE module_bc_time_utilities -!zhang USE WRF_ESMF_MOD - - IMPLICIT NONE - - ! Arguments - TYPE(domain) :: grid - TYPE (grid_config_rec_type) , INTENT(IN) :: config_flags - - ! Local - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - CHARACTER*256 :: rstname , outname - INTEGER :: fid , rid - CHARACTER (LEN=256) :: message - INTEGER :: ierr - INTEGER :: myproc -!zhang TYPE(ESMF_Time) :: CurrTime - TYPE(WRFU_Time) :: CurrTime - CHARACTER*80 :: timestr - - if(.not. config_flags%write_analysis) then - write(message,'("Writing of an analysis file is disabled for domain ",I0," because write_analysis=F")') grid%id - call wrf_debug(1,message) - return - endif - - IF ( wrf_dm_on_monitor() ) THEN - CALL start_timing - END IF - - rid=grid%id - -!zhang's doing CALL ESMF_ClockGet( grid%domain_clock, CurrTime=CurrTime, rc=ierr ) -!zhang's doing CALL wrf_timetoa ( CurrTime, timestr ) - CALL domain_clock_get( grid, current_timestr=timestr ) - CALL construct_filename2a ( rstname ,config_flags%anl_outname, grid%id , 2 , timestr ) - - WRITE( message , '("med_analysis_out: opening ",A," for writing")' ) TRIM ( rstname ) - CALL wrf_debug( 1 , message ) - CALL open_w_dataset ( rid, TRIM(rstname), grid , & - config_flags , output_restart , "DATASET=RESTART", ierr ) - - IF ( ierr .NE. 0 ) THEN - CALL WRF_message( message ) - ENDIF - CALL output_restart ( rid, grid , config_flags , ierr ) - IF ( wrf_dm_on_monitor() ) THEN - WRITE ( message , FMT = '("Writing restart for domain ",I8)' ) grid%id - CALL end_timing ( TRIM(message) ) - END IF - CALL close_dataset ( rid , config_flags , "DATASET=RESTART" ) - RETURN -END SUBROUTINE med_analysis_out - -#endif - RECURSIVE SUBROUTINE med_restart_out ( grid , config_flags ) ! Driver layer USE module_domain , ONLY : domain , domain_clock_get @@ -1762,119 +1171,8 @@ RECURSIVE SUBROUTINE med_restart_out ( grid , config_flags ) RETURN END SUBROUTINE med_restart_out -#if ( NMM_CORE == 1 && NMM_NEST == 1) -#ifdef EXTRA_HWRF_DEBUG_STUFF -SUBROUTINE med_boundary_out ( grid , config_flags ) - ! Driver layer - USE module_domain , ONLY : domain , domain_clock_get - USE module_io_domain - USE module_timing - USE module_configure , ONLY : grid_config_rec_type - ! Model layer -! USE module_bc_time_utilities - USE module_utility - use module_bdywrite - - IMPLICIT NONE - - ! Arguments - TYPE(domain) :: grid - TYPE (grid_config_rec_type) , INTENT(IN) :: config_flags - - ! Local - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - CHARACTER*256 :: rstname , outname - INTEGER :: fid , rid, kid - CHARACTER (LEN=256) :: message - INTEGER :: ierr - INTEGER :: myproc - CHARACTER*80 :: timestr - TYPE (grid_config_rec_type) :: kid_config_flags - - IF ( wrf_dm_on_monitor() ) THEN - CALL start_timing - END IF - -! take this out - no effect - LPC -! rid=grid%id !zhang's doing - - ! write out this domains boundary file first - - CALL domain_clock_get( grid, current_timestr=timestr ) - CALL construct_filename2a ( rstname , 'sambdyout_d_' , grid%id , 2 , timestr ) - - call bdywrite(grid,rstname) - - IF ( wrf_dm_on_monitor() ) THEN - CALL end_timing('Sam''s Special Boundary Output (TM)') - END IF - RETURN -END SUBROUTINE med_boundary_out -#endif -#endif !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -#if ( HWRF == 1 ) -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!zhang's doing -SUBROUTINE med_restart_in ( grid , config_flags ) - ! Driver layer - USE module_domain , ONLY : domain, domain_clock_get - USE module_io_domain - USE module_timing - ! Model layer - USE module_configure , ONLY : grid_config_rec_type - USE module_bc_time_utilities - - IMPLICIT NONE - - ! Arguments - TYPE(domain) :: grid - TYPE (grid_config_rec_type) , INTENT(IN) :: config_flags - - ! Local - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - CHARACTER*256 :: rstname , outname - INTEGER :: fid , rid - CHARACTER (LEN=256) :: message - INTEGER :: ierr - INTEGER :: myproc -!zhang old TYPE(ESMF_Time) :: CurrTime - TYPE(WRFU_Time) :: CurrTime - CHARACTER*80 :: timestr - - IF ( wrf_dm_on_monitor() ) THEN - CALL start_timing - END IF - - rid=grid%id - -!zhang's doing CALL ESMF_ClockGet( grid%domain_clock, CurrTime=CurrTime, rc=ierr ) -!zhang's doing CALL wrf_timetoa ( CurrTime, timestr ) - CALL domain_clock_get( grid, current_timestr=timestr ) - CALL construct_filename2a ( rstname ,config_flags%rst_outname, grid%id , 2 , timestr ) - - WRITE( message , '("med_restart_in: opening ",A," for reading")' ) TRIM ( rstname ) - CALL wrf_debug( 1 , message ) - CALL open_r_dataset ( rid, TRIM(rstname), grid , & - config_flags , "DATASET=RESTART", ierr ) - - IF ( ierr .NE. 0 ) THEN -! CALL WRF_message( message ) - CALL WRF_ERROR_FATAL('NESTED DOMAIN ERROR: FOR ANALYSIS SET TO TRUE, YOU NEED wrfanal FILE') - ENDIF - CALL input_restart ( rid, grid , config_flags , ierr ) - IF ( wrf_dm_on_monitor() ) THEN - WRITE ( message , FMT = '("Reading restart for domain ",I8)' ) grid%id - CALL end_timing ( TRIM(message) ) - END IF - CALL close_dataset ( rid , config_flags , "DATASET=RESTART" ) - RETURN - -END SUBROUTINE med_restart_in -!end of zhang's doing -#endif - SUBROUTINE med_hist_out ( grid , stream, config_flags ) ! Driver layer USE module_domain , ONLY : domain @@ -1907,20 +1205,6 @@ SUBROUTINE med_hist_out ( grid , stream, config_flags ) CALL wrf_error_fatal( message ) ENDIF -#if ( HWRF == 1 ) - ! HWRF special: auxhist2 and auxhist3 are duplicates of - ! history (0), so there is no point in outputting more than one of - ! them at the same time. Prefer 0 over 2, and 2 over 3: - if ( (stream==HISTORY_ALARM .or. stream==AUXHIST2_ALARM) .and. & - WRFU_AlarmIsRinging( grid%alarms(AUXHIST3_ALARM) ) ) then - CALL WRFU_AlarmRingerOff(grid%alarms(AUXHIST3_ALARM)) - endif - if ( stream==HISTORY_ALARM .and. & - WRFU_AlarmIsRinging( grid%alarms(AUXHIST2_ALARM) ) ) then - CALL WRFU_AlarmRingerOff(grid%alarms(AUXHIST2_ALARM)) - endif -#endif - SELECT CASE( stream ) CASE ( HISTORY_ALARM ) CALL open_hist_w( grid, config_flags, stream, HISTORY_ALARM, & @@ -1956,11 +1240,6 @@ SUBROUTINE med_hist_out ( grid , stream, config_flags ) CALL end_timing ( TRIM(message) ) END IF -#if (NMM_CORE == 1) - ! Reset tornado genesis fields after output: - call nmm_request_tg_reset(grid,config_flags,stream) -#endif - RETURN END SUBROUTINE med_hist_out @@ -2417,7 +1696,7 @@ SUBROUTINE open_hist_w ( grid , config_flags, stream, alarm_id, & IF ( adjust ) THEN CALL adjust_io_timestr( grid%io_intervals( alarm_id ), CT, ST, timestr ) ENDIF -#if (DA_CORE != 1 && NMM_CORE != 1) +#if (DA_CORE != 1 ) !---------------------------------------------------------------------- ! RASM Climate Diagnostics - JR, AS, MS - October 2016 !---------------------------------------------------------------------- @@ -3154,76 +2433,3 @@ END SUBROUTINE med_read_wrf_chem_emissopt3 #endif !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -#if ( HWRF == 1 ) -!zhang's doing for outputing restart namelist parameters -RECURSIVE SUBROUTINE med_namelist_out ( grid , config_flags ) - ! Driver layer - USE module_domain , ONLY : domain, domain_clock_get - USE module_io_domain - USE module_timing - ! Model layer - USE module_configure , ONLY : grid_config_rec_type - USE module_bc_time_utilities -!zhang new USE WRF_ESMF_MOD - USE module_utility -!zhang new ends - - IMPLICIT NONE - - ! Arguments - TYPE(domain), INTENT(IN) :: grid - TYPE (grid_config_rec_type) , INTENT(IN) :: config_flags - - ! Local -!zhang new TYPE(ESMF_Time) :: CurrTime - TYPE(WRFU_Time) :: CurrTime - INTEGER :: nout,rc,kid - INTEGER :: hr, min, sec, ms,julyr,julday - REAL :: GMT - CHARACTER*256 :: prefix, outname - CHARACTER*80 :: timestr - LOGICAL :: exist - LOGICAL,EXTERNAL :: wrf_dm_on_monitor - - TYPE (grid_config_rec_type) :: kid_config_flags - - prefix = "wrfnamelist_d_" - nout = 99 - -!zhang new CALL ESMF_ClockGet( grid%domain_clock, CurrTime=CurrTime, rc=rc ) -!zhang new CALL wrf_timetoa ( CurrTime, timestr ) - CALL domain_clock_get( grid, current_timestr=timestr ) -!zhang new ends - CALL construct_filename2a ( outname , prefix, grid%id , 2 , timestr ) - - IF ( wrf_dm_on_monitor() ) THEN - - CLOSE (NOUT) - OPEN ( FILE = trim(outname) , UNIT = nout, STATUS = 'UNKNOWN', FORM = 'FORMATTED') -!zhang new CALL ESMF_TimeGet( grid%current_time, YY=julyr, dayOfYear=julday, H=hr, M=min, S=sec, MS=ms, rc=rc) - CALL domain_clock_get( grid, current_time=CurrTime ) - CALL WRFU_TimeGet( CurrTime, YY=julyr, dayOfYear=julday, H=hr, M=min, S=sec, MS=ms, rc=rc) -!zhang new ends - gmt=hr+real(min)/60.+real(sec)/3600.+real(ms)/(1000*3600) - WRITE(NOUT,*) grid%i_parent_start - WRITE(NOUT,*) grid%j_parent_start - WRITE(NOUT,*) julyr - WRITE(NOUT,*) julday - WRITE(NOUT,*) gmt - - CLOSE (NOUT) - ENDIF - - ! call recursively for children, (if any) - DO kid = 1, max_nests - IF ( ASSOCIATED( grid%nests(kid)%ptr ) ) THEN - CALL model_to_grid_config_rec ( grid%nests(kid)%ptr%id , model_config_rec , kid_config_flags ) - CALL med_namelist_out ( grid%nests(kid)%ptr , kid_config_flags ) - ENDIF - ENDDO - - RETURN -END SUBROUTINE med_namelist_out -!end of zhang's doing -#endif diff --git a/share/mediation_interp_domain.F b/share/mediation_interp_domain.F index 300aa0f56d..57abe41cdd 100644 --- a/share/mediation_interp_domain.F +++ b/share/mediation_interp_domain.F @@ -11,11 +11,6 @@ SUBROUTINE med_interp_domain ( parent_grid , nested_grid ) TYPE(domain), POINTER :: grid INTEGER nlev, msize TYPE (grid_config_rec_type) :: config_flags -#ifdef NMM_FIND_LOAD_IMBALANCE - REAL(kind=8), save :: total_time(40)=0 - REAL(kind=8) :: this_time - character*255 :: message -#endif ! ---------------------------------------------------------- ! ---------------------------------------------------------- ! Interface blocks @@ -56,45 +51,6 @@ SUBROUTINE interp_domain_em_part2 ( grid, nested_grid, parent_grid, config_flags TYPE (grid_config_rec_type) :: config_flags # include "dummy_new_decl.inc" END SUBROUTINE interp_domain_em_part2 -#endif -! ---------------------------------------------------------- -! Interface definitions for NMM (placeholder) -! ---------------------------------------------------------- -#if (NMM_CORE == 1 && NMM_NEST == 1) -!======================================================================= -! Added for the NMM core. This is gopal's doing. -!======================================================================= - - SUBROUTINE interp_domain_nmm_part1 ( grid, intermediate_grid, ngrid, config_flags & -! -# include "dummy_new_args.inc" -! - ) - USE module_domain - USE module_configure - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: intermediate_grid - TYPE(domain), POINTER :: ngrid - TYPE (grid_config_rec_type) :: config_flags -# include "dummy_new_decl.inc" - END SUBROUTINE interp_domain_nmm_part1 - - SUBROUTINE interp_domain_nmm_part2 ( grid, nested_grid, config_flags & -! -# include "dummy_new_args.inc" -! - ) - USE module_domain - USE module_configure - TYPE(domain), POINTER :: grid ! name of the grid being dereferenced (must be "grid") - TYPE(domain), POINTER :: nested_grid - TYPE (grid_config_rec_type) :: config_flags -# include "dummy_new_decl.inc" - END SUBROUTINE interp_domain_nmm_part2 - -!======================================================================= -! End of gopal's doing. -!======================================================================= #endif END INTERFACE ! ---------------------------------------------------------- @@ -104,9 +60,6 @@ END SUBROUTINE interp_domain_nmm_part2 ! ---------------------------------------------------------- ! Executable code ! ---------------------------------------------------------- -#ifdef NMM_FIND_LOAD_IMBALANCE - this_time=now_time() -#endif ! ---------------------------------------------------------- ! Interpolation calls for EM CORE. The called ! routines below are supplied by module_dm.F @@ -160,65 +113,6 @@ END SUBROUTINE interp_domain_nmm_part2 #endif ! ------------------------------------------------------ ! End of Interpolation calls for EM CORE. -! ------------------------------------------------------ -! ------------------------------------------------------ -! ------------------------------------------------------ -! Interpolation calls for NMM. (Placeholder) -! ------------------------------------------------------ -#if (NMM_CORE == 1 && NMM_NEST == 1) -!======================================================================= -! Added for the NMM core. This is gopal's doing. -!======================================================================= -! - CALL wrf_dm_nestexchange_init - CALL model_to_grid_config_rec ( nested_grid%id , model_config_rec , config_flags ) - grid => nested_grid%intermediate_grid -# if (defined(MOVE_NESTS) || ((!defined(KEEP_INT_AROUND)) && (!defined(SGIALTIX)) && (!defined(FUJITSU_FX10)))) - CALL ensure_space_field & - ( grid, grid%id , 1 , 2 , .TRUE. , nested_grid%active_this_task, & - grid%sd31, grid%ed31, grid%sd32, grid%ed32, grid%sd33, grid%ed33, & - grid%sm31, grid%em31, grid%sm32, grid%em32, grid%sm33, grid%em33, & - grid%sp31, grid%ep31, grid%sp32, grid%ep32, grid%sp33, grid%ep33, & - grid%sp31x, grid%ep31x, grid%sp32x, grid%ep32x, grid%sp33x, grid%ep33x,& - grid%sp31y, grid%ep31y, grid%sp32y, grid%ep32y, grid%sp33y, grid%ep33y,& - grid%sm31x, grid%em31x, grid%sm32x, grid%em32x, grid%sm33x, grid%em33x, & ! x-xpose - grid%sm31y, grid%em31y, grid%sm32y, grid%em32y, grid%sm33y, grid%em33y & ! y-xpose - ) -#endif - nested_grid%intermediate_grid%interp_mp=parent_grid%interp_mp .or. nested_grid%interp_mp -#if (HWRF == 1) - nested_grid%intermediate_grid%pdyn_parent_age=parent_grid%pdyn_parent_age - nested_grid%intermediate_grid%pdyn_smooth_age=parent_grid%pdyn_smooth_age -#endif - - grid => parent_grid - - CALL model_to_grid_config_rec ( grid%id , model_config_rec , config_flags ) - - CALL interp_domain_nmm_part1 ( grid , nested_grid%intermediate_grid, nested_grid, config_flags & -! -# include "actual_new_args.inc" -! - ) - grid => nested_grid%intermediate_grid - CALL model_to_grid_config_rec ( grid%id , model_config_rec , config_flags ) - IF ( nested_grid%active_this_task ) THEN - - CALL interp_domain_nmm_part2 ( grid, nested_grid, config_flags & -! -# include "actual_new_args.inc" -! - ) - - grid => nested_grid%intermediate_grid - CALL model_to_grid_config_rec ( grid%id , model_config_rec , config_flags ) - ENDIF -! ------------------------------------------------------------ -! End of gopal's doing -! ------------------------------------------------------------ -#endif -! ------------------------------------------------------ -! End of Interpolation calls for NMM. ! ------------------------------------------------------ RETURN END SUBROUTINE med_interp_domain diff --git a/share/mediation_nest_move.F b/share/mediation_nest_move.F index d324ab7bc8..4dafbb2c14 100644 --- a/share/mediation_nest_move.F +++ b/share/mediation_nest_move.F @@ -23,23 +23,11 @@ SUBROUTINE med_nest_move ( parent, nest ) ims , ime , jms , jme , kms , kme , & ips , ipe , jps , jpe , kps , kpe INTEGER ierr, fid, comzilla, kid -#if ( HWRF == 1 ) - REAL,PARAMETER :: con_g =9.80665e+0! gravity (m/s2) - REAL,PARAMETER :: con_rd =2.8705e+2 ! gas constant air (J/kg/K) - REAL :: TLAP,TBAR,EPSI -#endif LOGICAL input_from_hires LOGICAL saved_restart_value TYPE (grid_config_rec_type) :: config_flags LOGICAL, EXTERNAL :: wrf_dm_on_monitor LOGICAL, EXTERNAL :: should_not_move -#if ( HWRF == 1 ) -!XUEJIN added for HWRFx - INTEGER :: idum1,idum2 - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE -#else -! -#endif INTERFACE SUBROUTINE med_interp_domain ( parent , nest ) @@ -47,16 +35,12 @@ SUBROUTINE med_interp_domain ( parent , nest ) IMPLICIT NONE TYPE(domain) , POINTER :: parent , nest END SUBROUTINE med_interp_domain -!#if ( HWRF == 1 )X -! XUEJIN added this directive here to exclude the ARW code -!#else SUBROUTINE start_domain ( grid , allowed_to_move ) USE module_domain, ONLY : domain IMPLICIT NONE TYPE(domain) :: grid LOGICAL, INTENT(IN) :: allowed_to_move END SUBROUTINE start_domain -!#endif #if ( EM_CORE == 1 ) SUBROUTINE shift_domain_em ( grid, disp_x, disp_y & ! @@ -71,102 +55,13 @@ SUBROUTINE shift_domain_em ( grid, disp_x, disp_y & # include "dummy_new_decl.inc" END SUBROUTINE shift_domain_em #endif -#if ( NMM_CORE == 1 ) - SUBROUTINE med_nest_egrid_configure ( parent , nest ) - USE module_domain - IMPLICIT NONE - TYPE(domain) , POINTER :: parent , nest - END SUBROUTINE med_nest_egrid_configure - - SUBROUTINE med_construct_egrid_weights ( parent , nest ) - USE module_domain - IMPLICIT NONE - TYPE(domain) , POINTER :: parent , nest - END SUBROUTINE med_construct_egrid_weights - - SUBROUTINE BASE_STATE_PARENT ( Z3d,Q3d,T3d,PSTD, & - PINT,T,Q,CWM, & - FIS,QSH,PD,PDTOP,PTOP, & - ETA1,ETA2, & - DETA1,DETA2, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - IPS,IPE,JPS,JPE,KPS,KPE ) -! -#if ( HWRF == 1 ) -!XUEJIN added for HWRFx - USE MODULE_MODEL_CONSTANTS -#else -! -#endif - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: IPS,IPE,JPS,JPE,KPS,KPE - REAL, INTENT(IN ) :: PDTOP,PTOP - REAL, DIMENSION(KMS:KME), INTENT(IN) :: ETA1,ETA2,DETA1,DETA2 - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD,QSH - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q,CWM - REAL, DIMENSION(KMS:KME) , INTENT(OUT):: PSTD - REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(OUT):: Z3d,Q3d,T3d - - END SUBROUTINE BASE_STATE_PARENT - - SUBROUTINE NEST_TERRAIN ( nest, config_flags ) - USE module_domain, ONLY : domain - USE module_configure, ONLY : grid_config_rec_type - IMPLICIT NONE - TYPE(domain) , POINTER :: nest - TYPE(grid_config_rec_type) , INTENT(IN) :: config_flags - END SUBROUTINE NEST_TERRAIN - - SUBROUTINE med_init_domain_constants_nmm ( parent, nest ) - USE module_domain, ONLY : domain - IMPLICIT NONE - TYPE(domain) , POINTER :: parent , nest - END SUBROUTINE med_init_domain_constants_nmm - - SUBROUTINE shift_domain_nmm ( grid, disp_x, disp_y & -! -# include "dummy_new_args.inc" -! - ) - USE module_domain - IMPLICIT NONE - INTEGER disp_x, disp_y - TYPE(domain) , POINTER :: grid -#include "dummy_new_decl.inc" - END SUBROUTINE shift_domain_nmm -#endif -#if ( HWRF == 1 ) -! XUEJIN added this directive here to exclude the ARW code -#else LOGICAL FUNCTION time_for_move ( parent , nest , dx , dy ) USE module_domain, ONLY : domain IMPLICIT NONE TYPE(domain) , POINTER :: parent , nest INTEGER, INTENT(OUT) :: dx , dy END FUNCTION time_for_move -#endif -#if ( HWRF == 1 ) -#if (NMM_CORE == 1 && NMM_NEST == 1) -! LOGICAL FUNCTION nest_roam ( parent , nest , dx , dy ) !REPLACED BY KWON -! - LOGICAL FUNCTION direction_of_move ( parent , nest , dx , dy ) - USE module_domain, ONLY : domain - IMPLICIT NONE - TYPE(domain) , POINTER :: parent , nest - INTEGER, INTENT(OUT) :: dx , dy - END FUNCTION direction_of_move -! -! END FUNCTION nest_roam !REPLACED BY KWON -#endif -#endif - -#if ( HWRF == 1 ) -! XUEJIN added this directive here to exclude the ARW code -#else SUBROUTINE input_terrain_rsmas ( grid , & ids , ide , jds , jde , kds , kde , & ims , ime , jms , jme , kms , kme , & @@ -207,7 +102,6 @@ SUBROUTINE copy_3d_field ( ter_interpolated , ter_input , & REAL , DIMENSION(ims:ime,jms:jme) :: ter_interpolated REAL , DIMENSION(ims:ime,jms:jme) :: ter_input END SUBROUTINE copy_3d_field -#endif END INTERFACE ! set grid pointer for code in deref_kludge (if used) @@ -223,11 +117,7 @@ END SUBROUTINE copy_3d_field ! mask should be defined in nest domain -#if ( HWRF == 1 ) - check_direction_of_move: IF ( direction_of_move ( parent , nest , dx, dy ) ) THEN -#else check_for_move: IF ( time_for_move ( parent , nest , dx, dy ) ) THEN -#endif #if ( EM_CORE == 1 ) IF ( (dx .gt. 1 .or. dx .lt. -1 ) .or. & @@ -236,20 +126,6 @@ END SUBROUTINE copy_3d_field CALL wrf_error_fatal( mess ) ENDIF #endif -#if (NMM_CORE == 1 && NMM_NEST == 1) - IF(MOD(dy,2) .NE. 0)THEN - origdy = dy - dy=dy+sign(1,dy) - WRITE(mess,*)'WARNING: DY REDEFINED FOR THE NMM CORE AND RE-SET FROM ',origdy,' TO MASS POINT dy=',dy - call wrf_debug(1,mess) - ENDIF - - IF ( dx .gt. 1 .or. dx .lt. -1 .or. dy .gt. 2 .or. dy .lt. -2 ) THEN -3038 format("med_nest_move: TRIED TO SHIFT TOO FAR: dx must be in [-1,1] and dy in [-2,2] but dx=",I0," and dy=",I0) - WRITE(mess,3038) dx,dy - CALL wrf_error_fatal( mess ) - ENDIF -#endif IF ( wrf_dm_on_monitor() ) THEN WRITE(mess,*)' moving ',grid%id,dx,dy @@ -279,13 +155,6 @@ END SUBROUTINE copy_3d_field ! ) #endif -#if (NMM_CORE == 1 && NMM_NEST == 1) - CALL shift_domain_nmm( grid, dx, dy & -! -# include "actual_new_args.inc" -! - ) -#endif px = grid%parent_grid_ratio*dx py = grid%parent_grid_ratio*dy @@ -316,105 +185,6 @@ END SUBROUTINE copy_3d_field CALL pop_communicators_for_domain(grid%id) #endif -#if (NMM_CORE == 1 && NMM_NEST == 1) - -!---------------------------------------------------------------------------- -! initialize shifted domain configurations including setting up wbd,sbd, etc -!---------------------------------------------------------------------------- - - CALL med_nest_egrid_configure ( parent , nest ) - -!------------------------------------------------------------------------- -! initialize shifted domain lat-lons and determine weights -!------------------------------------------------------------------------- - - CALL med_construct_egrid_weights ( parent, nest ) - -! -! Set new terrain. Since some terrain adjustment is done within the interpolation calls -! at the next step, the new terrain over the nested domain has to be called here. -! - - CALL model_to_grid_config_rec ( nest%id , model_config_rec , config_flags ) - - CALL NEST_TERRAIN ( nest, config_flags ) - - CALL get_ijk_from_grid ( nest , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - IF ( nest%active_this_task ) THEN -#if ( HWRF == 1 ) -! adjust pint & pressure depth due to height change in nest_terrain -! assume lapse rate of 6.1K/1km - TLAP=6.1/(con_g*1000.) - DO J = MAX(JPS,JDS-PY), MIN(JPE,JDE-1-PY) - DO I = MAX(IPS,IDS-PX), MIN(IPE,IDE-1-PX) - if( nest%fis(I,J).ne.nest%hres_fis(I,J) ) then - if( nest%T(I,J,1).gt.150. .and. nest%T(I,J,1).lt.400.) then - TBAR=ALOG(1.0+TLAP*(nest%fis(I,J)-nest%hres_fis(I,J)) /nest%T(I,J,1)) - EPSI=TBAR/(con_rd*TLAP) -! recover pint from pressure depth after move, then adjust for diff topo - nest%PINT(I,J,1)=nest%PD(I,J)+nest%pdtop+nest%pt - nest%PINT(I,J,1)=nest%PINT(I,J,1)*EXP(EPSI) - nest%PD(I,J)=nest%PINT(I,J,1)-nest%pdtop-nest%pt -! WRITE(0,*)I,J,nest%nmm_PD(I,J),nest%nmm_PINT(I,1,J),nest%nmm_FIS(I,J),nest%nmm_hres_fis(I,J),nest%nmm_pdtop,nest%nmm_pt, & -! 'change pd,ptint' - endif - endif - ENDDO - ENDDO -#endif - - DO J = JPS, MIN(JPE,JDE-1) - DO I = IPS, MIN(IPE,IDE-1) - nest%fis(I,J)=nest%hres_fis(I,J) - ENDDO - ENDDO - ENDIF - -! -! De-reference dimension information stored in the grid data structure. -! -! From the hybrid, construct the GPMs on isobaric surfaces and then interpolate those -! values on to the nested domain. 23 standard prssure levels are assumed here. For -! levels below ground, lapse rate atmosphere is assumed before the use of vertical -! spline interpolation -! - - CALL get_ijk_from_grid ( parent , & - ids, ide, jds, jde, kds, kde, & - ims, ime, jms, jme, kms, kme, & - ips, ipe, jps, jpe, kps, kpe ) - - ! CALL BASE_STATE_PARENT ( parent%Z3d,parent%Q3d,parent%T3d,parent%PSTD, & - ! parent%PINT,parent%T,parent%Q,parent%CWM, & - ! parent%FIS,parent%QSH,parent%PD,parent%pdtop,parent%pt, & - ! parent%ETA1,parent%ETA2, & - ! parent%DETA1,parent%DETA2, & - ! IDS,IDE,JDS,JDE,KDS,KDE, & - ! IMS,IME,JMS,JME,KMS,KME, & - ! IPS,IPE,JPS,JPE,KPS,KPE ) - -! Initialize some more constants required especially for terrain adjustment processes - - nest%PSTD=parent%PSTD - nest%KZMAX=KME - parent%KZMAX=KME ! just for safety - -! write(0,*) " nest%imask_nostag " -! write(0,"(3X,1X,1000(I3))") (I, I = IPS, MIN(IPE,IDE-1) ) - DO J = MIN(JPE,JDE-1), JPS, -1 - IF ( MOD(J,2) /= 0 ) THEN -! write(0,"(I3,1X,1000(I3))") J, (nest%imask_nostag(I,J), I = IPS, MIN(IPE,IDE-1) ) - ELSE -! write(0,"(I3,3X,1000(I3))") J, (nest%imask_nostag(I,J), I = IPS, MIN(IPE,IDE-1) ) - END IF - ENDDO - -#endif - CALL med_interp_domain( parent, nest ) #if ( EM_CORE == 1 ) @@ -478,15 +248,6 @@ END SUBROUTINE copy_3d_field ENDIF #endif -#if (NMM_CORE == 1 && NMM_NEST == 1) -!------------------------------------------------------------------------------ -! set up constants (module_initialize_real.F for the shifted nmm domain) -!----------------------------------------------------------------------------- - - CALL med_init_domain_constants_nmm ( parent, nest ) - -#endif - ! ! masks associated with nest will have been set by shift_domain_em above nest%moved = .true. @@ -531,11 +292,7 @@ END SUBROUTINE copy_3d_field ENDIF #endif ! -#if ( HWRF == 1 ) - ENDIF check_direction_of_move -#else ENDIF check_for_move -#endif #endif END SUBROUTINE med_nest_move @@ -671,16 +428,6 @@ LOGICAL FUNCTION time_for_move2 ( parent , grid , move_cd_x, move_cd_y ) ids, ide-1 , jds , jde-1 , 1 , 1 , & ims, ime , jms , jme , 1 , 1 , & ips, ipe , jps , jpe , 1 , 1 ) -#if(NMM_CORE==1) - CALL wrf_patch_to_global_real ( grid%hlat , xlat , grid%domdesc, "z", "xy", & - ids, ide-1 , jds , jde-1 , 1 , 1 , & - ims, ime , jms , jme , 1 , 1 , & - ips, ipe , jps , jpe , 1 , 1 ) - CALL wrf_patch_to_global_real ( grid%hlon , xlong , grid%domdesc, "z", "xy", & - ids, ide-1 , jds , jde-1 , 1 , 1 , & - ims, ime , jms , jme , 1 , 1 , & - ips, ipe , jps , jpe , 1 , 1 ) -#else CALL wrf_patch_to_global_real ( grid%xlat , xlat , grid%domdesc, "z", "xy", & ids, ide-1 , jds , jde-1 , 1 , 1 , & ims, ime , jms , jme , 1 , 1 , & @@ -689,7 +436,6 @@ LOGICAL FUNCTION time_for_move2 ( parent , grid , move_cd_x, move_cd_y ) ids, ide-1 , jds , jde-1 , 1 , 1 , & ims, ime , jms , jme , 1 , 1 , & ips, ipe , jps , jpe , 1 , 1 ) -#endif CALL wrf_patch_to_global_real ( grid%ht , terrain , grid%domdesc, "z", "xy", & ids, ide-1 , jds , jde-1 , 1 , 1 , & ims, ime , jms , jme , 1 , 1 , & @@ -1236,628 +982,6 @@ LOGICAL FUNCTION should_not_move ( id ) should_not_move = retval END FUNCTION -#if ( HWRF == 1 ) -LOGICAL FUNCTION direction_of_move2 ( parent , grid , move_cd_x, move_cd_y ) - USE module_domain - USE module_configure - USE module_dm - IMPLICIT NONE -! arguments - TYPE(domain) , POINTER :: parent, grid, kid - LOGICAL, EXTERNAL :: wrf_dm_on_monitor - INTEGER, INTENT(OUT) :: move_cd_x , move_cd_y - CHARACTER*256 mess -! local - INTEGER :: corral_dist, ikid - INTEGER :: dw, de, ds, dn, idum, jdum - INTEGER :: cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe - real :: dx,dy,kid_ic,kid_jc,my_ic,my_jc,pgr,pgrn,hr,two_dt,when,before,after - real, parameter :: pmult=1.35 - integer :: inew,jnew,ierr,comzilla,itmp_pos,itmp_neg - integer :: corral_x, corral_y, min_corral_x, min_corral_y - logical :: abort,mvnest_l - -! PURPOSE: DECIDE THE DIRECTION OF MOVE -! Three modes: -! vortex_tracker=3 -- use results of STATS_FOR_MOVE to follow -! the vortex center. If the vortex is more than 3 X -! gridpoints or 6 Y gridpoints from the center, then -! move to follow it. This is the HWRF-X algorithm. -! vortex_tracker=2 -- follow this domain's nest. Only works -! if this domain has a nest, otherwise this domain is -! stationary. If the nest domain is more than 3 X -! gridpoints or 6 Y gridpoints from the center, then move -! to follow it. (Added by Sam Trahan, April 1, 2011) -! vortex_tracker=4 -- more advanced tracker that is less likely -! to jump to other low pressure systems, and less confused -! by MSLP noise. (Added by Sam Trahan, September, 2011.) -! RETURN VALUE: TRUE if domain should move, FALSE otherwise. -! OUTPUTS: -! move_cd_x = number of parent gridpoints to move in X -! move_cd_y = number of parent gridpoints to move in Y -! grid%moved = TRUE if domain should move, FALSE otherwise. -! AUTHOR: XUEJIN ZHANG, October 12, 2009 -! MODIFIED: XUEJIN ZHANG, February 28, 2010 -! MODIFIED: SAM TRAHAN, April 1, 2011 to add vortex_tracker, and the -! nest-following vortex tracker (option 2) - - if(grid%id==1) then - min_corral_x=7 - min_corral_y=12 - else - min_corral_x=5 - min_corral_y=5 - endif - - abort=.false. ! will be set to .true. if any safety checks fail - ! INITIALIZE NEST MOTION TO DISABLED - move_cd_x=0 - move_cd_y=0 - direction_of_move2 = .false. - grid%moved = .false. - - ! Simplifying assumption: domains in moving nest simulations have - ! only one parent and only one child. - if(grid%num_nests .gt. 1) then - write(mess,'("d",I0,": not moving because it has more than one nest")') grid%id - call WRF_MESSAGE(trim(mess)) - abort=.true. - endif - - ! Switch off nest motion if we're at the analysis time or 6hr forecast - if(grid%nomove_freq_hr>0) then - hr=(grid%ntsd*grid%dt)/3600.0 - when=anint(hr/grid%nomove_freq_hr)*grid%nomove_freq_hr - - before=when-3.0/60.0-grid%dt*2.0/3600.0 - after=when+grid%dt*2.0/3600.0 - - if(hr>before.and.hrgrid%nests(1)%ptr ! find my kid - - ! find my center location - my_ic = grid%ed31/2.0 - my_jc = grid%ed32/2.0 - - ! find my kid's center location in my grid - kid_ic = kid%i_parent_start + kid%ed31/2.0/kid%parent_grid_ratio - 1 - kid_jc = kid%j_parent_start + kid%ed32/2.0/kid%parent_grid_ratio - 1 - - ! How far is the kid's center from my center? - dx=kid_ic-my_ic - dy=kid_jc-my_jc - - if(wrf_dm_on_monitor()) then - write(mess,'("d",I0," following nest d",I0,": parent ",F0.1,"x",F0.1," nest ",F0.1,"x",F0.1," move ",F0.1,"x",F0.1)') & - grid%id,kid%id,my_ic,my_jc,kid_ic,kid_jc,dx,dy - call wrf_debug(1,trim(mess)) - endif - - ! Now decide where to move based on relative center locations. - if(dx<-pgr) then - move_cd_x=-1 - elseif(dx>pgr) then - move_cd_x=1 - endif - - if(dy>2.*pgr) then - move_cd_y=2 - elseif(dy<-2.*pgr) then - move_cd_y=-2 - endif - - ! REDUCE EXTRANEOUS MOTION - - ! If we're only moving in the X direction, or only in the Y - ! direction, then require that the difference in center - ! locations be slightly more than one parent gridpoint before - ! moving. - - ! This prevents the situation where d03 is moving diagonally, - ! and d02 will move once the X direction and then later on in - ! the Y direction. Instead, it will perform a single move in - ! the X&Y direction. - if(move_cd_x==0 .and. move_cd_y/=0) then - ! Only moving in Y direction. - if(dy>-2.*pmult*pgrn .and. dy<2.*pmult*pgrn) then - ! Child has not moved 2*pmult parent points yet. - move_cd_y=0 - endif - endif - if(move_cd_x/=0 .and. move_cd_y==0) then - ! Only moving in X direction. - if(dx>-pmult*pgrn .and. dx3) then - if((grid%XLOC_1-grid%XLOC_2) .GE. 3) then - move_cd_x=-1 - elseif((grid%XLOC_2-grid%XLOC_1) .GE. 3) then - move_cd_x=1 - else - move_cd_x=0 - endif - if((grid%YLOC_2-grid%YLOC_1) .GE. 6) then - move_cd_y=2 - elseif((grid%YLOC_1-grid%YLOC_2) .GE. 6) then - move_cd_y=-2 - else - move_cd_y=0 - endif - if(wrf_dm_on_monitor()) then - if(move_cd_x/=0 .or. move_cd_y/=0) then - write(mess,'("d",I0," moving x",SP,I0," y",I0,SS," to follow vortex")') & - grid%id,move_cd_x,move_cd_y - call wrf_debug(1,trim(mess)) - endif - endif - endif revised_nest_motion - vortex_following: IF(grid%vortex_tracker==3 .or. grid%vortex_tracker==1)THEN - IF((grid%XLOC_1-grid%XLOC_2) .GE. 3)THEN - move_cd_x = -1 - IF((grid%YLOC_2-grid%YLOC_1) .GE. 3)THEN - move_cd_y = +1 ! will be changed to 2 automatically by caller - ENDIF - ELSE IF((grid%XLOC_2-grid%XLOC_1) .GE. 3)THEN - move_cd_x = +1 - IF((grid%YLOC_2-grid%YLOC_1) .GE. 3)THEN - move_cd_y = -1 ! will be changed to -2 automatically by caller - ENDIF - ELSE IF ((grid%YLOC_2-grid%YLOC_1) .GE. 3 .and. grid%vortex_tracker==1) THEN - ! Original HWRF tracker had a less sensitive north motion test. - ! Only one parent gridpoint of north distance is required. The - ! nest will actually move two parent gridpoints though. - move_cd_y = 2 - ELSE IF ((grid%YLOC_2-grid%YLOC_1) .GE. 6)THEN - move_cd_y = 2 - ELSE IF ((grid%YLOC_1-grid%YLOC_2) .GE. 6)THEN ! wait for the move - move_cd_y = -2 - ENDIF - - if(wrf_dm_on_monitor()) then - if(move_cd_x/=0 .or. move_cd_y/=0) then - write(mess,'("d",I0," moving x",SP,I0," y",I0,SS," to follow vortex")') & - grid%id,move_cd_x,move_cd_y - call wrf_debug(1,trim(mess)) - endif - endif - ENDIF vortex_following - endif can_move - - ! Abort motion if any child domain would end up within this - ! domain's corral distance or outside of this domain. - nest_safety: IF ( grid%num_nests .GT. 0 .and. ( move_cd_x/=0 .or. move_cd_y/=0 ) ) THEN - abort=.false. - nest_loop: do ikid=1,grid%num_nests - kid=>grid%nests(ikid)%ptr - inew=kid%i_parent_start-move_cd_x*kid%parent_grid_ratio - jnew=kid%j_parent_start-move_cd_y*kid%parent_grid_ratio - - corral_dist=(kid%ed31+kid%parent_grid_ratio-1)/kid%parent_grid_ratio - corral_x = max(min_corral_x,grid%corral_x) - corral_y = max(min_corral_y,grid%corral_y) - IF(inew <= corral_x)THEN - abort=.true. - write(mess,'("d",I0,": cannot move: nest d",I0," would be too close to -X bdy")') grid%id,kid%id - call wrf_message(mess) - ELSEIF((inew+corral_dist) >= grid%ed31 - corral_x) THEN - abort=.true. - write(mess,'("d",I0,": cannot move: nest d",I0," would be too close to +X bdy")') grid%id,kid%id - call wrf_message(mess) - ENDIF - - corral_dist=(kid%ed32+kid%parent_grid_ratio-1)/kid%parent_grid_ratio - IF(jnew .le. corral_y)THEN - abort=.true. - write(mess,'("d",I0,": cannot move: nest d",I0," would be too close to -Y bdy")') grid%id,kid%id - call wrf_message(mess) - ELSEIF((jnew+corral_dist) .ge. grid%ed32 - corral_y) THEN - abort=.true. - write(mess,'("d",I0,": cannot move: nest d",I0," would be too close to +Y bdy")') grid%id,kid%id - call wrf_message(mess) - ENDIF - enddo nest_loop - ENDIF nest_safety - - if(abort) then - grid%mvnest=.false. - move_cd_x=0 - move_cd_y=0 - grid%moved=.false. - direction_of_move2=.false. - grid%mvnest=.false. - write(mess,'("d",I0,"; motion has been aborted.")') grid%id - call wrf_message(mess) - endif - - IF ( .NOT. grid%active_this_task ) THEN - grid%mvnest = .FALSE. ! prevent inactive grids from turning on movement - grid%move_cd_x = 0 - grid%move_cd_y = 0 - ENDIF - - IF ( (parent%active_this_task .OR. grid%active_this_task) ) THEN - CALL MPI_Allreduce( grid%mvnest , mvnest_l, 1, MPI_LOGICAL, MPI_LOR, comzilla, ierr ) - grid%mvnest = mvnest_l - CALL MPI_Allreduce( move_cd_x , itmp_pos, 1, MPI_INTEGER, MPI_MAX, comzilla, ierr ) - CALL MPI_Allreduce( move_cd_x , itmp_neg, 1, MPI_INTEGER, MPI_MIN, comzilla, ierr ) - IF ( itmp_pos .NE. 0 ) THEN - move_cd_x = itmp_pos - ELSE - move_cd_x = itmp_neg - ENDIF - CALL MPI_Allreduce( move_cd_y , itmp_pos, 1, MPI_INTEGER, MPI_MAX, comzilla, ierr ) - CALL MPI_Allreduce( move_cd_y , itmp_neg, 1, MPI_INTEGER, MPI_MIN, comzilla, ierr ) - IF ( itmp_pos .NE. 0 ) THEN - move_cd_y = itmp_pos - ELSE - move_cd_y = itmp_neg - ENDIF - ENDIF - - if(move_cd_x/=0 .or. move_cd_y/=0) then - direction_of_move2 = .true. - grid%moved = .true. - if(grid%vortex_tracker==2) then - grid%ntime0 = grid%ntsd - else - ! other vortex trackers set NTIME0 in STATS_FOR_MOVE - endif - endif - - CALL pop_communicators_for_domain(grid%id) - - RETURN - -END FUNCTION direction_of_move2 - - -LOGICAL FUNCTION direction_of_move ( parent , grid , move_cd_x, move_cd_y ) - -! AUTHOR: XUEJIN ZHANG -! ORIGINAL DATE: 10/12/2009 -! Modified: 2/28/2010 -! PURPOSE: DEICDE THE DIRECTION OF MOVE - USE module_domain - USE module_configure - USE module_dm - IMPLICIT NONE -! arguments - TYPE(domain) , POINTER :: parent, grid, par, nst - INTEGER, INTENT(OUT) :: move_cd_x , move_cd_y -! local - INTEGER :: corral_dist, kid - INTEGER :: dw, de, ds, dn, pgr - INTEGER :: would_move_x, would_move_y - INTEGER :: cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe, & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe - INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER :: IMS,IME,JMS,JME,KMS,KME - INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER :: IpS,IpE,JpS,JpE,KpS,KpE - INTEGER comzilla - character*255 :: message -! interface - INTERFACE - LOGICAL FUNCTION direction_of_move2 ( parent , nest , dx , dy ) - USE module_domain - USE module_utility - TYPE(domain) , POINTER :: parent , nest - INTEGER, INTENT(OUT) :: dx , dy - END FUNCTION direction_of_move2 - SUBROUTINE G2T2H_new( IIH,JJH, & ! output grid index and weights - HBWGT1,HBWGT2, & ! output weights in terms of parent grid - HBWGT3,HBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH - END SUBROUTINE G2T2H_new - SUBROUTINE G2T2V_new( IIV,JJV, & ! output grid index and weights - VBWGT1,VBWGT2, & ! output weights in terms of parent grid - VBWGT3,VBWGT4, & - I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain - RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - IMPLICIT NONE - INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE - INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME - INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE - INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START - INTEGER, INTENT(IN ) :: RATIO - REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 - INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV - END SUBROUTINE G2T2V_new - subroutine init_hnear(iih,jjh,hbwgt1,hbwgt2,hbwgt3,hbwgt4, & - hnear_i,hnear_j, & - IDS,IDE,JDS,JDE,KDS,KDE, & - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE) - implicit none - integer, intent(in) :: ids,ide,jds,jde,kds,kde, & - ims,ime,jms,jme,kms,kme, & - its,ite,jts,jte,kts,kte, & - iih(ims:ime,jms:jme), jjh(ims:ime,jms:jme) - integer, intent(out), dimension(ims:ime,jms:jme) :: hnear_i,hnear_j - real, dimension(ims:ime,jms:jme), intent(in) :: hbwgt1, hbwgt2, hbwgt3, hbwgt4 - end subroutine init_hnear - END INTERFACE -! executable -! -! Simplifying assumption: moving domains in moving nest simulations have only -! one parent and only one child. - - IF ( grid%num_nests .GT. 1 ) THEN - CALL wrf_error_fatal ( 'domains in moving nest simulations can have only 1 nest' ) - ENDIF - kid = 1 - write(message,*) 'grid%num_nests=',grid%num_nests - call wrf_debug(5,message) - - direction_of_move = direction_of_move2 ( parent , grid , move_cd_x, move_cd_y ) - -! any nest grid needs to know if grid is moving - IF ( grid%id .GT. 1 .AND. grid%num_nests .GT. 0 ) THEN - IF ( (.NOT. (grid%active_this_task .AND. grid%nests(kid)%ptr%active_this_task) ) .AND. & - (grid%active_this_task .OR. grid%nests(kid)%ptr%active_this_task) ) THEN - IF ( grid%active_this_task ) THEN - comzilla = mpi_comm_to_kid( kid , grid%id ) - ELSE - comzilla = mpi_comm_to_mom( grid%nests(kid)%ptr%id ) - ENDIF - CALL BYTE_BCAST( move_cd_x, IWORDSIZE, comzilla ) ! - CALL BYTE_BCAST( move_cd_y, IWORDSIZE, comzilla ) ! - ENDIF - direction_of_move = ( move_cd_x .NE. 0 ) .OR. ( move_cd_y .NE. 0 ) - ENDIF - - if(grid%vortex_tracker == 1) then - return ! Old HWRF tracker has nothing more to do. - endif - -! -! find out if this is the innermost nest (will not have kids) - IF ( grid%num_nests .EQ. 0 ) THEN - ! code that executes on innermost nest - - direction_of_move = ( move_cd_x .NE. 0 ) .OR. ( move_cd_y .NE. 0 ) - - ELSE - ! move this domain (the parent containing the moving nest) - ! in a direction that reestablishes the distance from - ! the boundary. - move_domain: IF ( direction_of_move ) THEN - no_nests: IF ( grid%id .EQ. 1 ) THEN - - CALL wrf_message( 'DANGER: Nest has moved too close to boundary of outermost domain.' ) - move_cd_x = 0 - move_cd_y = 0 - direction_of_move = .FALSE. - - ELSE - - CALL get_ijk_from_grid ( grid%nests(kid)%ptr , & - nids, nide, njds, njde, nkds, nkde, & - nims, nime, njms, njme, nkms, nkme, & - nips, nipe, njps, njpe, nkps, nkpe ) - CALL get_ijk_from_grid ( grid , & - cids, cide, cjds, cjde, ckds, ckde, & - cims, cime, cjms, cjme, ckms, ckme, & - cips, cipe, cjps, cjpe, ckps, ckpe ) - CALL nl_get_parent_grid_ratio ( grid%nests(kid)%ptr%id , pgr ) - ! need to adjust the intermediate domain of the nest in relation to this - ! domain since we're moving - IF(MOD(move_cd_y,2) .NE. 0)THEN - move_cd_y=move_cd_y+sign(1,move_cd_y) - WRITE(message,*)'WARNING: move_cd_y REDEFINED FOR THE NMM CORE AND RE-SET TO MASS POINT move_cd_y=',move_cd_y - call wrf_debug(1,message) - ENDIF - - IF (grid%active_this_task .OR. grid%nests(kid)%ptr%active_this_task ) THEN - IF ( grid%active_this_task ) THEN - comzilla = mpi_comm_to_kid( kid , grid%id ) - ELSE - comzilla = mpi_comm_to_mom( grid%nests(kid)%ptr%id ) - ENDIF - - CALL BYTE_BCAST( grid%nests(kid)%ptr%i_parent_start, IWORDSIZE, comzilla ) ! - CALL BYTE_BCAST( grid%nests(kid)%ptr%j_parent_start, IWORDSIZE, comzilla ) ! - CALL BYTE_BCAST( move_cd_x, IWORDSIZE, comzilla ) ! - CALL BYTE_BCAST( move_cd_y, IWORDSIZE, comzilla ) ! - - ENDIF - - CALL wrf_dm_move_nest ( grid , grid%nests(kid)%ptr%intermediate_grid , -move_cd_x*pgr, -move_cd_y*pgr ) - CALL adjust_domain_dims_for_move( grid%nests(kid)%ptr%intermediate_grid , -move_cd_x*pgr, -move_cd_y*pgr ) - grid%nests(kid)%ptr%i_parent_start = grid%nests(kid)%ptr%i_parent_start - move_cd_x*pgr - write(message,*)'grid%nests(kid)%ptr%i_parent_start =',grid%nests(kid)%ptr%i_parent_start,grid%nests(kid)%ptr%id - call wrf_debug(1,message) - - grid%nests(kid)%ptr%j_parent_start = grid%nests(kid)%ptr%j_parent_start - move_cd_y*pgr - write(message,*)'grid%nests(kid)%ptr%j_parent_start =',grid%nests(kid)%ptr%j_parent_start,grid%nests(kid)%ptr%id - call wrf_debug(1,message) - - CALL nl_set_i_parent_start( grid%nests(kid)%ptr%id, grid%nests(kid)%ptr%i_parent_start ) - CALL nl_set_j_parent_start( grid%nests(kid)%ptr%id, grid%nests(kid)%ptr%j_parent_start ) - - IF ( grid%nests(kid)%ptr%active_this_task ) THEN - IDS = grid%nests(kid)%ptr%sd31 - IDE = grid%nests(kid)%ptr%ed31 - JDS = grid%nests(kid)%ptr%sd32 - JDE = grid%nests(kid)%ptr%ed32 - KDS = grid%nests(kid)%ptr%sd33 - KDE = grid%nests(kid)%ptr%ed33 - - IMS = grid%nests(kid)%ptr%sm31 - IME = grid%nests(kid)%ptr%em31 - JMS = grid%nests(kid)%ptr%sm32 - JME = grid%nests(kid)%ptr%em32 - KMS = grid%nests(kid)%ptr%sm33 - KME = grid%nests(kid)%ptr%em33 - - ITS = grid%nests(kid)%ptr%sp31 - ITE = grid%nests(kid)%ptr%ep31 - JTS = grid%nests(kid)%ptr%sp32 - JTE = grid%nests(kid)%ptr%ep32 - KTS = grid%nests(kid)%ptr%sp33 - KTE = grid%nests(kid)%ptr%ep33 - - CALL G2T2H_new( grid%nests(kid)%ptr%IIH,grid%nests(kid)%ptr%JJH, & ! output grid index in parent grid - grid%nests(kid)%ptr%HBWGT1,grid%nests(kid)%ptr%HBWGT2, & ! output weights in terms of parent grid - grid%nests(kid)%ptr%HBWGT3,grid%nests(kid)%ptr%HBWGT4, & - grid%nests(kid)%ptr%I_PARENT_START,grid%nests(kid)%ptr%J_PARENT_START, & ! nest start I, J in parent domain - 3, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CALL G2T2V_new( grid%nests(kid)%ptr%IIV,grid%nests(kid)%ptr%JJV, & ! output grid index in parent grid - grid%nests(kid)%ptr%VBWGT1,grid%nests(kid)%ptr%VBWGT2, & ! output weights in terms of parent grid - grid%nests(kid)%ptr%VBWGT3,grid%nests(kid)%ptr%VBWGT4, & - grid%nests(kid)%ptr%I_PARENT_START,grid%nests(kid)%ptr%J_PARENT_START, & ! nest start I, J in parent domain - 3, & ! Ratio of parent and child grid ( always = 3 for NMM) - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - CALL init_hnear( grid%nests(kid)%ptr%IIH,grid%nests(kid)%ptr%JJH, & ! output grid index in parent grid - grid%nests(kid)%ptr%HBWGT1,grid%nests(kid)%ptr%HBWGT2, & ! output weights in terms of parent grid - grid%nests(kid)%ptr%HBWGT3,grid%nests(kid)%ptr%HBWGT4, & - grid%nests(kid)%ptr%hnear_i,grid%nests(kid)%ptr%hnear_j, & - IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions - IMS,IME,JMS,JME,KMS,KME, & - ITS,ITE,JTS,JTE,KTS,KTE ) - ENDIF - - ENDIF no_nests - if(grid%vortex_tracker == 6 .or. grid%vortex_tracker == 7) then - ! Update storm center gridpoint location, radius from - ! storm center and angle to storm center: - call nmm_med_tracker_post_move(grid) - endif - - if(grid%swath_mode==1) then - ! Will need to update area of interest after domain shift: - grid%update_interest=.true. - - ! Parent must also update area of interest after its nest - ! moves if the parent has interest_kids set: - if(parent%interest_kids/=0) then -38 format('grid ',I2,' updating grid ',I2,' area of interest due to nest motion') - write(message,38) grid%id,parent%id - call wrf_debug(1,trim(message)) - parent%update_interest=.true. - else -39 format('grid ',I2,' not updating grid ',I2,' area of interest because interest_kids is 0') - write(message,39) grid%id,parent%id - call wrf_debug(1,trim(message)) - endif - endif - ENDIF move_domain - - ENDIF - - RETURN -END FUNCTION direction_of_move -#endif - - SUBROUTINE reconcile_nest_positions_over_tasks ( grid ) USE module_driver_constants, ONLY : max_nests, max_domains USE module_domain, ONLY : domain, find_grid_by_id diff --git a/share/mediation_wrfmain.F b/share/mediation_wrfmain.F index 467d1d9494..2f32e261ba 100644 --- a/share/mediation_wrfmain.F +++ b/share/mediation_wrfmain.F @@ -200,17 +200,7 @@ END SUBROUTINE med_shutdown_io_recurse grid_ptr => grid CALL med_shutdown_io_recurse ( grid_ptr , config_flags ) -#if ( HWRF == 1 ) - DO id = 1, max_domains - IF( domain_active_this_task(id) ) THEN - CALL push_communicators_for_domain(id) - CALL wrf_ioexit( ierr ) ! shut down the quilt I/O - CALL pop_communicators_for_domain - ENDIF - ENDDO -#else CALL wrf_ioexit( ierr ) ! shut down the quilt I/O -#endif RETURN diff --git a/share/module_check_a_mundo.F b/share/module_check_a_mundo.F index 8acdd95e8f..0d7317ac72 100644 --- a/share/module_check_a_mundo.F +++ b/share/module_check_a_mundo.F @@ -124,22 +124,6 @@ END FUNCTION bep_bem_ngr_u model_config_rec % wrf_hydro = 0 #endif -#if (NMM_CORE == 1) && (NMM_NEST == 1) -!----------------------------------------------------------------------- -! Ensure that minimum NMM corral distances are supplied for all domains. -!----------------------------------------------------------------------- - do i=1,model_config_rec%max_dom - if(model_config_rec%corral_x(i)<5) then - call wrf_message("Corral X distance must be at least 5 due to intermediate domain halos.") - model_config_rec%corral_x(i)=5 - endif - if(model_config_rec%corral_y(i)<5) then - call wrf_message("Corral Y distance must be at least 5 due to intermediate domain halos.") - model_config_rec%corral_y(i)=5 - endif - enddo -#endif - #if (EM_CORE == 1) !----------------------------------------------------------------------- ! AFWA diagnostics require each domain is treated the same. If @@ -575,7 +559,7 @@ END FUNCTION bep_bem_ngr_u !----------------------------------------------------------------------- ! For ARW users, a request for CU=4 (SAS) should be switched to option -! CU = 95. The option CU = 4 is a scaleaware scheme used by NMM. +! CU = 95. !----------------------------------------------------------------------- oops = 0 DO i = 1, model_config_rec % max_dom @@ -632,27 +616,6 @@ END FUNCTION bep_bem_ngr_u #endif -!----------------------------------------------------------------------- -! Check that some microphysics is not allowed for WRF-NMM run -!----------------------------------------------------------------------- -#if (NMM_CORE == 1) || (HWRF == 1) - DO i = 1, model_config_rec % max_dom - IF ( .NOT. model_config_rec % grid_allowed(i) ) CYCLE - IF ( model_config_rec % mp_physics(i) == nuwrf4icescheme .OR. & - model_config_rec % mp_physics(i) == nssl_2mom .OR. & - model_config_rec % mp_physics(i) == nssl_2momccn .OR. & - model_config_rec % mp_physics(i) == nssl_1mom .OR. & - model_config_rec % mp_physics(i) == nssl_1momlfo .OR. & - model_config_rec % mp_physics(i) == nssl_2momg ) THEN - wrf_err_message = '--- ERROR: Chosen microphysics scheme cannot run with WRF-NMM ' - CALL wrf_message ( wrf_err_message ) - wrf_err_message = '--- Fix mp_physics in namelist.input ' - CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) - count_fatal_error = count_fatal_error + 1 - END IF - ENDDO -#endif - !----------------------------------------------------------------------- ! Check that all values of sf_surface_physics are the same for all domains !----------------------------------------------------------------------- @@ -964,24 +927,6 @@ END FUNCTION bep_bem_ngr_u #endif -#if (NMM_CORE == 1) || (HWRF == 1) -!----------------------------------------------------------------------- -! Check that NOAH-MP LSM is not allowed for WRF-NMM run -!----------------------------------------------------------------------- - DO i = 1, model_config_rec % max_dom - IF ( .NOT. model_config_rec % grid_allowed(i) ) CYCLE - IF ( model_config_rec%sf_surface_physics(i) == NOAHMPSCHEME ) THEN - WRITE(wrf_err_message, '(" --- ERROR: Noah-MP LSM scheme (sf_surface_physics==", I2, ")")') NOAHMPSCHEME - CALL wrf_message ( TRIM ( wrf_err_message ) ) - WRITE(wrf_err_message, '(" does not work with NMM ")') - CALL wrf_message ( TRIM ( wrf_err_message ) ) - WRITE(wrf_err_message, '("Select a different LSM scheme ")') - CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) - count_fatal_error = count_fatal_error + 1 - END IF - END DO -#endif - !----------------------------------------------------------------------- ! Check that NSAS shallow convection is not allowed to turn on simultaneously with NSAS !----------------------------------------------------------------------- @@ -1228,15 +1173,6 @@ END FUNCTION bep_bem_ngr_u END IF END IF -#elif( NMM_CORE == 1 ) -!---------------------------------------------------------------------------- -! If NMM core and trajectories are on then halt. -!---------------------------------------------------------------------------- - IF ( model_config_rec%traj_opt /= 0 ) THEN - wrf_err_message = 'Trajectories not supported in NMM core ' - CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) - count_fatal_error = count_fatal_error + 1 - END IF #endif #if (EM_CORE == 1) @@ -3054,7 +2990,7 @@ SUBROUTINE set_physics_rconfigs END IF -#if ( (NMM_CORE != 1) && (DA_CORE != 1) ) +#if (DA_CORE != 1) !----------------------------------------------------------------------- ! How big to allocate random seed arrays. !----------------------------------------------------------------------- @@ -3207,7 +3143,7 @@ SUBROUTINE set_physics_rconfigs ! sf_surface_physics !----------------------------------------------------------------------- -#if ((EM_CORE == 1) || (NMM_CORE == 1)) +#if (EM_CORE == 1) IF ( model_config_rec % sf_surface_physics(1) .EQ. NOLSMSCHEME ) THEN model_config_rec % num_soil_layers = 5 ELSE IF ( model_config_rec % sf_surface_physics(1) .EQ. SLABSCHEME ) THEN @@ -3228,17 +3164,11 @@ SUBROUTINE set_physics_rconfigs model_config_rec % num_soil_layers = 2 ELSE IF ( model_config_rec % sf_surface_physics(1) .EQ. CLMSCHEME ) THEN model_config_rec % num_soil_layers = 10 -#if (EM_CORE == 1) ELSE IF ( model_config_rec % sf_surface_physics(1) .EQ. CTSMSCHEME ) THEN ! Using 4 for the sake of the sea ice scheme model_config_rec % num_soil_layers = 4 -#endif ELSE IF ( model_config_rec % sf_surface_physics(1) .EQ. SSIBSCHEME ) THEN model_config_rec % num_soil_layers = 3 -#if (NMM_CORE == 1) - ELSE IF ( model_config_rec % sf_surface_physics(1) .EQ. GFDLSLAB ) THEN - model_config_rec % num_soil_layers = 4 -#endif ELSE CALL wrf_debug ( 0 , '--- ERROR: Unknown sf_surface_physics has no associated number of soil levels' ) WRITE (wrf_err_message, FMT='(A,I6)') '--- ERROR: sf_surface_physics = ' , model_config_rec % sf_surface_physics(1) diff --git a/share/module_interp_store.F b/share/module_interp_store.F index d246c7c3e4..8a7b8c7c41 100644 --- a/share/module_interp_store.F +++ b/share/module_interp_store.F @@ -38,44 +38,5 @@ subroutine store_interp_info(grid, parent_grid) implicit none type(domain), intent(in) :: grid, parent_grid -#if (NMM_CORE == 1 && NMM_NEST == 1) - kpres=-99999 - grid_id=grid%id - parent_grid_id=parent_grid%id - - parent_fis=>parent_grid%fis - nest_fis=>grid%fis - - hnear_i=>grid%hnear_i - hnear_j=>grid%hnear_j - - parent_iinfo=>parent_grid%iinfo - iinfo=>grid%iinfo - iinfo_bxs=>grid%iinfo_bxs - iinfo_bxe=>grid%iinfo_bxe - iinfo_bys=>grid%iinfo_bys - iinfo_bye=>grid%iinfo_bye - - parent_winfo=>parent_grid%winfo - winfo=>grid%winfo - winfo_bxs=>grid%winfo_bxs - winfo_bxe=>grid%winfo_bxe - winfo_bys=>grid%winfo_bys - winfo_bye=>grid%winfo_bye - - IIV=>grid%IIV - JJV=>grid%JJV - VBWGT1=>grid%VBWGT1 - VBWGT2=>grid%VBWGT2 - VBWGT3=>grid%VBWGT3 - VBWGT4=>grid%VBWGT4 - - IIH=>grid%IIH - JJH=>grid%JJH - HBWGT1=>grid%HBWGT1 - HBWGT2=>grid%HBWGT2 - HBWGT3=>grid%HBWGT3 - HBWGT4=>grid%HBWGT4 -#endif end subroutine store_interp_info diff --git a/share/module_model_constants.F b/share/module_model_constants.F index e4a7b9eb77..ebb2425ddf 100644 --- a/share/module_model_constants.F +++ b/share/module_model_constants.F @@ -16,13 +16,8 @@ MODULE module_model_constants ! JM NOTE -- can we name this grav instead? REAL , PARAMETER :: g = 9.81 ! acceleration due to gravity (m {s}^-2) -#if ( NMM_CORE == 1 ) - REAL , PARAMETER :: r_d = 287.04 ! gas constant for dry air (J deg^-1 kg^-1) - REAL , PARAMETER :: cp = 1004.6 ! Specific heat of dry air at constant pressure (J deg^-1 kg^-1) -#else REAL , PARAMETER :: r_d = 287. ! gas constant of dry air (J deg^-1 kg^-1) REAL , PARAMETER :: cp = 7.*r_d/2. ! -#endif REAL , PARAMETER :: r_v = 461.6 ! gas constant for water vapor (J deg^-1 kg^-1) REAL , PARAMETER :: cv = cp-r_d ! Specific heat of air at contant volume (J deg^-1 kg^-1) @@ -97,7 +92,6 @@ MODULE module_model_constants REAL , PARAMETER :: a4=35.86 REAL , PARAMETER :: epsq=1.e-12 ! threshold specified for SPECIFIC HUMIDITY calculation in BMJ cumulus scheme (kg kg^-1) REAL , PARAMETER :: p608=rvovrd-1. -!#if ( NMM_CORE == 1 ) REAL , PARAMETER :: climit=1.e-20 REAL , PARAMETER :: cm1=2937.4 REAL , PARAMETER :: cm2=4.9283 @@ -109,11 +103,7 @@ MODULE module_model_constants REAL , PARAMETER :: epsfc=1./1.05 REAL , PARAMETER :: epswet=0.0 REAL , PARAMETER :: fcdif=1./3. -#if ( HWRF == 1 ) - REAL , PARAMETER :: fcm=0.0 -#else REAL , PARAMETER :: fcm=0.00003 -#endif REAL , PARAMETER :: gma=-r_d*(1.-rcp)*0.5 REAL , PARAMETER :: p400=40000.0 REAL , PARAMETER :: phitp=15000.0 @@ -134,13 +124,8 @@ MODULE module_model_constants REAL , PARAMETER :: wght=0.35 REAL , PARAMETER :: wpc=0.075 REAL , PARAMETER :: z0land=0.10 ! surface roughness length over land (m) -#if ( HWRF == 1 ) - REAL , PARAMETER :: z0max=0.01 ! maximum roughness length (m) -#else REAL , PARAMETER :: z0max=0.008 ! maximum roughness length (m) -#endif REAL , PARAMETER :: z0sea=0.001 ! roughness length over ocean (m) -!#endif ! Earth diff --git a/share/module_optional_input.F b/share/module_optional_input.F index d71cc93920..3d116a2b9d 100644 --- a/share/module_optional_input.F +++ b/share/module_optional_input.F @@ -73,19 +73,6 @@ SUBROUTINE init_module_optional_input ( grid , config_flags ) its, ite, jts, jte, kts, kte ! Get the various indices, assume XYZ & XZY ordering. -#if (NMM_CORE==1) - ids = grid%sd31 ; ide = grid%ed31 ; - jds = grid%sd32 ; jde = grid%ed32 ; - kds = grid%sd33 ; kde = grid%ed33 ; - - ims = grid%sm31 ; ime = grid%em31 ; - jms = grid%sm32 ; jme = grid%em32 ; - kms = grid%sm33 ; kme = grid%em33 ; - - its = grid%sp31 ; ite = grid%ep31 ; ! note that tile is entire patch - jts = grid%sp32 ; jte = grid%ep32 ; ! note that tile is entire patch - kts = grid%sp33 ; kte = grid%ep33 ; ! note that tile is entire patch -#endif #if (EM_CORE==1) ids = grid%sd31 ; ide = grid%ed31 ; kds = grid%sd32 ; kde = grid%ed32 ; @@ -142,19 +129,6 @@ SUBROUTINE optional_input ( grid , fid, config_flags ) CHARACTER (LEN=132) :: message ! Get the various indices, assume XYZ & XZY ordering. -#if (NMM_CORE==1) - ids = grid%sd31 ; ide = grid%ed31 ; - jds = grid%sd32 ; jde = grid%ed32 ; - kds = grid%sd33 ; kde = grid%ed33 ; - - ims = grid%sm31 ; ime = grid%em31 ; - jms = grid%sm32 ; jme = grid%em32 ; - kms = grid%sm33 ; kme = grid%em33 ; - - its = grid%sp31 ; ite = grid%ep31 ; ! note that tile is entire patch - jts = grid%sp32 ; jte = grid%ep32 ; ! note that tile is entire patch - kts = grid%sp33 ; kte = grid%ep33 ; ! note that tile is entire patch -#endif #if (EM_CORE==1) ids = grid%sd31 ; ide = grid%ed31 ; kds = grid%sd32 ; kde = grid%ed32 ; diff --git a/share/module_soil_pre.F b/share/module_soil_pre.F index 2f7921b40a..3132b4678f 100644 --- a/share/module_soil_pre.F +++ b/share/module_soil_pre.F @@ -1,5 +1,3 @@ -#if ( ! NMM_CORE == 1 ) - MODULE module_soil_pre USE module_date_time @@ -3110,2112 +3108,3 @@ FUNCTION skip_middle_points_t ( ids , ide , jds , jde , & END IF END FUNCTION skip_middle_points_t - -#else - -MODULE module_soil_pre - - USE module_date_time - USE module_state_description - -CONTAINS - - SUBROUTINE adjust_for_seaice_pre ( xice , landmask , tsk , ivgtyp , vegcat , lu_index , & - xland , landusef , isltyp , soilcat , soilctop , & - soilcbot , tmn , & - seaice_threshold , & - fractional_seaice, & - num_veg_cat , num_soil_top_cat , num_soil_bot_cat , & - iswater , isice , & - scheme , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte , & - iswater , isice - INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat , scheme - - REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landusef - REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(INOUT):: soilctop - REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(INOUT):: soilcbot - INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask , xice , tsk , lu_index , & - vegcat, xland , soilcat , tmn - REAL , INTENT(IN) :: seaice_threshold - - INTEGER :: i , j , num_seaice_changes , loop - CHARACTER (LEN=132) :: message - - - integer, intent(in) :: fractional_seaice - real :: xice_threshold - - IF ( FRACTIONAL_SEAICE == 0 ) THEN - xice_threshold = 0.5 - ELSEIF ( FRACTIONAL_SEAICE == 1 ) THEN - CALL WRF_ERROR_FATAL("NMM cannot use FRACTIONAL_SEAICE = 1") - xice_threshold = 0.02 - ENDIF - - fix_seaice : SELECT CASE ( scheme ) - - CASE ( SLABSCHEME ) - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( xice(i,j) .GT. 200.0 ) THEN - xice(i,j) = 0. - num_seaice_changes = num_seaice_changes + 1 - END IF - END DO - END DO - IF ( num_seaice_changes .GT. 0 ) THEN - WRITE ( message , FMT='(A,I6)' ) & - 'Total pre number of sea ice locations removed (due to FLAG values) = ', & - num_seaice_changes - CALL wrf_debug ( 0 , message ) - END IF - num_seaice_changes = 0 - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( ( xice(i,j) .GE. xice_threshold ) .OR. & - ( ( landmask(i,j) .LT. 0.5 ) .AND. ( tsk(i,j) .LT. seaice_threshold ) ) ) THEN - IF ( FRACTIONAL_SEAICE == 0 ) THEN - xice(i,j) = 1.0 - ENDIF - num_seaice_changes = num_seaice_changes + 1 - tmn(i,j) = 271.4 - vegcat(i,j)=isice - lu_index(i,j)=ivgtyp(i,j) - landmask(i,j)=1. - xland(i,j)=1. - DO loop=1,num_veg_cat - landusef(i,loop,j)=0. - END DO - landusef(i,ivgtyp(i,j),j)=1. - - isltyp(i,j) = 16 - soilcat(i,j)=isltyp(i,j) - DO loop=1,num_soil_top_cat - soilctop(i,loop,j)=0 - END DO - DO loop=1,num_soil_bot_cat - soilcbot(i,loop,j)=0 - END DO - soilctop(i,isltyp(i,j),j)=1. - soilcbot(i,isltyp(i,j),j)=1. - ELSE - xice(i,j) = 0.0 - END IF - END DO - END DO - IF ( num_seaice_changes .GT. 0 ) THEN - WRITE ( message , FMT='(A,I6)' ) & - 'Total pre number of sea ice location changes (water to land) = ', num_seaice_changes - CALL wrf_debug ( 0 , message ) - END IF - - CASE ( LSMSCHEME ) - CASE ( RUCLSMSCHEME ) - - END SELECT fix_seaice - - END SUBROUTINE adjust_for_seaice_pre - - SUBROUTINE adjust_for_seaice_post ( xice , landmask , tsk , ivgtyp , vegcat , lu_index , & - xland , landusef , isltyp , soilcat , soilctop , & - soilcbot , tmn , & - tslb , smois , sh2o , & - seaice_threshold , & - fractional_seaice, & - num_veg_cat , num_soil_top_cat , num_soil_bot_cat , & - num_soil_layers , & - iswater , isice , & - scheme , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte , & - iswater , isice - INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat , scheme - INTEGER , INTENT(IN) :: num_soil_layers - - REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landusef - REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(INOUT):: soilctop - REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(INOUT):: soilcbot - REAL , DIMENSION(ims:ime,1:num_soil_layers,jms:jme) , INTENT(INOUT):: tslb , smois , sh2o - INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask , xice , tsk , lu_index , & - vegcat, xland , soilcat , tmn - REAL , INTENT(IN) :: seaice_threshold - REAL :: total_depth , mid_point_depth - - INTEGER :: i , j , num_seaice_changes , loop - CHARACTER (LEN=132) :: message - - integer, intent(in) :: fractional_seaice - real :: xice_threshold - IF ( FRACTIONAL_SEAICE == 0 ) THEN - xice_threshold = 0.5 - ELSEIF ( FRACTIONAL_SEAICE == 1 ) THEN - CALL WRF_ERROR_FATAL("NMM cannot use FRACTIONAL_SEAICE = 1") - xice_threshold = 0.02 - ENDIF - fix_seaice : SELECT CASE ( scheme ) - - CASE ( SLABSCHEME ) - -!SBAO - CASE ( LSMSCHEME, GFDLSLAB ) - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( xice(i,j) .GT. 200.0 ) THEN - xice(i,j) = 0. - num_seaice_changes = num_seaice_changes + 1 - END IF - END DO - END DO - IF ( num_seaice_changes .GT. 0 ) THEN - WRITE ( message , FMT='(A,I6)' ) & - 'Total post number of sea ice locations removed (due to FLAG values) = ', & - num_seaice_changes - CALL wrf_debug ( 0 , message ) - END IF - num_seaice_changes = 0 - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( ( xice(i,j) .GE. xice_threshold ) .OR. & - ( ( landmask(i,j) .LT. 0.5 ) .AND. ( tsk(i,j) .LT. seaice_threshold ) ) ) THEN - IF ( FRACTIONAL_SEAICE == 0 ) THEN - xice(i,j) = 1.0 - ENDIF - num_seaice_changes = num_seaice_changes + 1 - tmn(i,j) = 271.16 - vegcat(i,j)=isice - lu_index(i,j)=ivgtyp(i,j) - landmask(i,j)=1. - xland(i,j)=1. - DO loop=1,num_veg_cat - landusef(i,loop,j)=0. - END DO - landusef(i,ivgtyp(i,j),j)=1. - - isltyp(i,j) = 16 - soilcat(i,j)=isltyp(i,j) - DO loop=1,num_soil_top_cat - soilctop(i,loop,j)=0 - END DO - DO loop=1,num_soil_bot_cat - soilcbot(i,loop,j)=0 - END DO - soilctop(i,isltyp(i,j),j)=1. - soilcbot(i,isltyp(i,j),j)=1. - - total_depth = 3. ! ice is 3 m deep, num_soil_layers equispaced layers - DO loop = 1,num_soil_layers - mid_point_depth=(total_depth/num_soil_layers)/2. + & - (loop-1)*(total_depth/num_soil_layers) - tslb(i,loop,j) = ( (total_depth-mid_point_depth)*tsk(i,j) + & - mid_point_depth*tmn(i,j) ) / total_depth - END DO - - DO loop=1,num_soil_layers - smois(i,loop,j) = 1.0 - sh2o(i,loop,j) = 0.0 - END DO - ELSE - xice(i,j) = 0.0 - END IF - END DO - END DO - IF ( num_seaice_changes .GT. 0 ) THEN - WRITE ( message , FMT='(A,I6)' ) & - 'Total post number of sea ice location changes (water to land) = ', num_seaice_changes - CALL wrf_debug ( 0 , message ) - END IF - - CASE ( RUCLSMSCHEME ) - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( xice(i,j) .GT. 200.0 ) THEN - xice(i,j) = 0. - num_seaice_changes = num_seaice_changes + 1 - END IF - END DO - END DO - IF ( num_seaice_changes .GT. 0 ) THEN - WRITE ( message , FMT='(A,I6)' ) & - 'Total post number of sea ice locations removed (due to FLAG values) = ', & - num_seaice_changes - CALL wrf_debug ( 0 , message ) - END IF - num_seaice_changes = 0 - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( ( xice(i,j) .GE. xice_threshold ) .OR. & - ( ( landmask(i,j) .LT. 0.5 ) .AND. ( tsk(i,j) .LT. seaice_threshold ) ) ) THEN - - IF ( FRACTIONAL_SEAICE == 0 ) THEN - xice(i,j) = 1.0 - ELSE - xice(i,j)=max(0.25,xice(i,j)) - ENDIF - num_seaice_changes = num_seaice_changes + 1 - if(landmask(i,j) .LT. 0.5 )tmn(i,j) = 271.4 - vegcat(i,j)=isice - ivgtyp(i,j)=isice - lu_index(i,j)=isice - landmask(i,j)=1. - xland(i,j)=1. - DO loop=1,num_veg_cat - landusef(i,loop,j)=0. - END DO - landusef(i,ivgtyp(i,j),j)=1. - - isltyp(i,j) = 16 - soilcat(i,j)=isltyp(i,j) - DO loop=1,num_soil_top_cat - soilctop(i,loop,j)=0 - END DO - DO loop=1,num_soil_bot_cat - soilcbot(i,loop,j)=0 - END DO - soilctop(i,isltyp(i,j),j)=1. - soilcbot(i,isltyp(i,j),j)=1. - - total_depth = 3. ! ice is 3 m deep, num_soil_layers equispaced layers - tslb(i,1,j) = tsk(i,j) - tslb(i,num_soil_layers,j) = tmn(i,j) - DO loop = 2,num_soil_layers-1 - mid_point_depth=(total_depth/num_soil_layers)/4. + & - (loop-2)*(total_depth/num_soil_layers) - tslb(i,loop,j) = ( (total_depth-mid_point_depth)*tsk(i,j) + & - mid_point_depth*tmn(i,j) ) / total_depth - END DO - - DO loop=1,num_soil_layers - smois(i,loop,j) = 1.0 - sh2o(i,loop,j) = 0.0 - END DO - ELSE IF ( xice(i,j) .LT. xice_threshold ) THEN - xice(i,j) = 0. - END IF - END DO - END DO - IF ( num_seaice_changes .GT. 0 ) THEN - WRITE ( message , FMT='(A,I6)' ) & - 'Total post number of sea ice location changes (water to land) = ', num_seaice_changes - CALL wrf_debug ( 0 , message ) - END IF - - END SELECT fix_seaice - - END SUBROUTINE adjust_for_seaice_post - - SUBROUTINE process_percent_cat_new ( landmask , & - landuse_frac , soil_top_cat , soil_bot_cat , & - isltyp , ivgtyp , & - num_veg_cat , num_soil_top_cat , num_soil_bot_cat , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte , & - iswater ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte , & - iswater - INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat - REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landuse_frac - REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(IN):: soil_top_cat - REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(IN):: soil_bot_cat - INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask - - INTEGER :: i , j , l , ll, dominant_index - REAL :: dominant_value - -#if ( WRF_CHEM == 1 ) -! REAL :: lwthresh = .99 - REAL :: lwthresh = .50 -#else - REAL :: lwthresh = .50 -#endif - - INTEGER , PARAMETER :: iswater_soil = 14 - INTEGER :: iforce - CHARACTER (LEN=1024) :: message - - ! Sanity check on the 50/50 points - - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - dominant_value = landuse_frac(i,iswater,j) - IF ( dominant_value .EQ. lwthresh ) THEN - DO l = 1 , num_veg_cat - IF ( l .EQ. iswater ) CYCLE - IF ( landuse_frac(i,l,j) .EQ. lwthresh ) THEN - write(message, FMT='(I4,I4,A,I4,A,F12.4)') i,j,' water and category ',l,' both at 50%, landmask is ',landmask(i,j) - call wrf_message ( message ) - landuse_frac(i,l,j) = lwthresh - .01 - landuse_frac(i,iswater,j) = 1. - (lwthresh + 0.01) - END IF - END DO - END IF - END DO - END DO - - ! Compute the dominant VEGETATION INDEX. - - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - dominant_value = landuse_frac(i,1,j) - dominant_index = 1 - DO l = 2 , num_veg_cat - IF ( l .EQ. iswater ) THEN - ! wait a bit - ELSE IF ( ( l .NE. iswater ) .AND. ( landuse_frac(i,l,j) .GT. dominant_value ) ) THEN - dominant_value = landuse_frac(i,l,j) - dominant_index = l - END IF - END DO - IF ( landuse_frac(i,iswater,j) .GT. lwthresh ) THEN - dominant_value = landuse_frac(i,iswater,j) - dominant_index = iswater -#if 0 -si needs to beef up consistency checks before we can use this part - ELSE IF ( ( landuse_frac(i,iswater,j) .EQ. lwthresh) .AND. & - ( dominant_value .EQ. lwthresh) ) THEN - ! no op -#else -ELSEIF((landuse_frac(i,iswater,j).EQ.lwthresh).AND.(dominant_value.EQ.lwthresh).and.(dominant_index.LT.iswater))THEN -write(message,*)'temporary SI landmask fix' -call wrf_message(trim(message)) -! no op -ELSEIF((landuse_frac(i,iswater,j).EQ.lwthresh).AND.(dominant_value.EQ.lwthresh).and.(dominant_index.GT.iswater))THEN -write(message,*)'temporary SI landmask fix' -call wrf_message(trim(message)) -dominant_value = landuse_frac(i,iswater,j) -dominant_index = iswater -#endif - ELSE IF ( ( landuse_frac(i,iswater,j) .EQ. lwthresh ) .AND. & - ( dominant_value .LT. lwthresh ) ) THEN - dominant_value = landuse_frac(i,iswater,j) - dominant_index = iswater - END IF - IF ( dominant_index .EQ. iswater ) THEN -if(landmask(i,j).gt.lwthresh) then -write(message,*) 'changing to water at point ',i,j -call wrf_message(trim(message)) -write(message,*) nint(landuse_frac(i,:,j)*100) -call wrf_message(trim(message)) -endif - landmask(i,j) = 0 - ELSE IF ( dominant_index .NE. iswater ) THEN -if(landmask(i,j).lt.lwthresh) then -write(message,*) 'changing to land at point ',i,j -call wrf_message(trim(message)) -write(message,*) nint(landuse_frac(i,:,j)*100) -call wrf_message(trim(message)) -endif - landmask(i,j) = 1 - END IF - ivgtyp(i,j) = dominant_index - END DO - END DO - - ! Compute the dominant SOIL TEXTURE INDEX, TOP. - - iforce = 0 - DO i = its , MIN(ide-1,ite) - DO j = jts , MIN(jde-1,jte) - dominant_value = soil_top_cat(i,1,j) - dominant_index = 1 - IF ( landmask(i,j) .GT. lwthresh ) THEN - DO l = 2 , num_soil_top_cat - IF ( ( l .NE. iswater_soil ) .AND. ( soil_top_cat(i,l,j) .GT. dominant_value ) ) THEN - dominant_value = soil_top_cat(i,l,j) - dominant_index = l - END IF - END DO - IF ( dominant_value .LT. 0.01 ) THEN - iforce = iforce + 1 - WRITE ( message , FMT = '(A,I4,I4)' ) & - 'based on landuse, changing soil to land at point ',i,j - CALL wrf_debug(1,message) -!atec WRITE ( message , FMT = '(16(i3,1x))' ) & -!atec 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12, 13, 14, 15, 16 -!atec CALL wrf_debug(1,message) -!atec WRITE ( message , FMT = '(16(i3,1x))' ) & -!atec nint(soil_top_cat(i,:,j)*100) -!atec CALL wrf_debug(1,message) - dominant_index = 8 - END IF - ELSE - dominant_index = iswater_soil - END IF - isltyp(i,j) = dominant_index - END DO - END DO - -if(iforce.ne.0)then -WRITE(message,FMT='(A,I4,A,I6)' ) & -'forcing artificial silty clay loam at ',iforce,' points, out of ',& -(MIN(ide-1,ite)-its+1)*(MIN(jde-1,jte)-jts+1) -CALL wrf_debug(0,message) -endif - - END SUBROUTINE process_percent_cat_new - - SUBROUTINE process_soil_real ( tsk , tmn , & - landmask , sst , & - st_input , sm_input , sw_input , st_levels_input , sm_levels_input , sw_levels_input , & - zs , dzs , tslb , smois , sh2o , & - flag_sst , flag_soilt000, flag_soilm000, & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte , & - sf_surface_physics , num_soil_layers , real_data_init_type , & - num_st_levels_input , num_sm_levels_input , num_sw_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte , & - sf_surface_physics , num_soil_layers , real_data_init_type , & - num_st_levels_input , num_sm_levels_input , num_sw_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc - - INTEGER , INTENT(IN) :: flag_sst, flag_soilt000, flag_soilm000 - - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst - - INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input - INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input - INTEGER , DIMENSION(1:num_sw_levels_input) , INTENT(INOUT) :: sw_levels_input - REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input - REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input - REAL , DIMENSION(ims:ime,1:num_sw_levels_alloc,jms:jme) , INTENT(INOUT) :: sw_input - - REAL, DIMENSION(1:num_soil_layers), INTENT(OUT) :: zs,dzs - REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois , sh2o - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tmn - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk - - INTEGER :: i , j , l , dominant_index , num_soil_cat , num_veg_cat - REAL :: dominant_value - - ! Initialize the soil depth, and the soil temperature and moisture. - - IF ( ( sf_surface_physics .EQ. SLABSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN - CALL init_soil_depth_1 ( zs , dzs , num_soil_layers ) - CALL init_soil_1_real ( tsk , tmn , tslb , zs , dzs , num_soil_layers , real_data_init_type , & - landmask , sst , flag_sst , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - ELSE IF ( ( sf_surface_physics .EQ. LSMSCHEME .or. sf_surface_physics .eq. 88 ) .AND. & - ( num_soil_layers .GT. 1 ) ) THEN - CALL init_soil_depth_2 ( zs , dzs , num_soil_layers ) - CALL init_soil_2_real ( tsk , tmn , smois , sh2o , tslb , & - st_input , sm_input , sw_input , landmask , sst , & - zs , dzs , & - st_levels_input , sm_levels_input , sw_levels_input ,& - num_soil_layers , num_st_levels_input , num_sm_levels_input , num_sw_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , & - flag_sst , flag_soilt000 , flag_soilm000, & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) -! CALL init_soil_old ( tsk , tmn , & -! smois , tslb , zs , dzs , num_soil_layers , & -! st000010_input , st010040_input , st040100_input , st100200_input , & -! st010200_input , & -! sm000010_input , sm010040_input , sm040100_input , sm100200_input , & -! sm010200_input , & -! landmask_input , sst_input , & -! ids , ide , jds , jde , kds , kde , & -! ims , ime , jms , jme , kms , kme , & -! its , ite , jts , jte , kts , kte ) - ELSE IF ( ( sf_surface_physics .EQ. NOAHMPSCHEME .or. sf_surface_physics .eq. 88 ) .AND. & - ( num_soil_layers .GT. 1 ) ) THEN - CALL init_soil_depth_2 ( zs , dzs , num_soil_layers ) - CALL init_soil_2_real ( tsk , tmn , smois , sh2o , tslb , & - st_input , sm_input , sw_input , landmask , sst , & - zs , dzs , & - st_levels_input , sm_levels_input , sw_levels_input ,& - num_soil_layers , num_st_levels_input , num_sm_levels_input , num_sw_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , & - flag_sst , flag_soilt000 , flag_soilm000 , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) -#if 0 -!CLM - ELSE IF ( ( sf_surface_physics .EQ. CLMSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN - CALL init_soil_depth_4 ( zs , dzs , num_soil_layers ) - CALL init_soil_4_real ( tsk , tmn , smois , sh2o , tslb , & - st_input , sm_input , sw_input , landmask , sst , & - zs , dzs , & - st_levels_input , sm_levels_input , sw_levels_input , & - num_soil_layers , num_st_levels_input , num_sm_levels_input , num_sw_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , & - flag_sst , flag_soil_layers , flag_soil_levels , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) -! CALL init_soil_old ( tsk , tmn , & -! smois , tslb , zs , dzs , num_soil_layers , & -! st000010_input , st010040_input , st040100_input , st100200_input , & -! st010200_input , & -! sm000010_input , sm010040_input , sm040100_input , sm100200_input , & -! sm010200_input , & -! landmask_input , sst_input , & -! ids , ide , jds , jde , kds , kde , & -! ims , ime , jms , jme , kms , kme , & -! its , ite , jts , jte , kts , kte ) -#endif - ELSE IF ( ( sf_surface_physics .EQ. RUCLSMSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN - CALL init_soil_depth_3 ( zs , dzs , num_soil_layers ) - CALL init_soil_3_real ( tsk , tmn , smois , tslb , & - st_input , sm_input , landmask , sst , & - zs , dzs , & - st_levels_input , sm_levels_input , & - num_soil_layers , num_st_levels_input , num_sm_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , & - flag_sst , flag_soilt000 , flag_soilm000 , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - END IF - - END SUBROUTINE process_soil_real - - SUBROUTINE process_soil_ideal ( xland,xice,vegfra,snow,canwat, & - ivgtyp,isltyp,tslb,smois, & - tsk,tmn,zs,dzs, & - num_soil_layers, & - sf_surface_physics , & - ids,ide, jds,jde, kds,kde,& - ims,ime, jms,jme, kms,kme,& - its,ite, jts,jte, kts,kte ) - - IMPLICIT NONE - - INTEGER, INTENT(IN) ::ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte - - INTEGER, INTENT(IN) :: num_soil_layers , sf_surface_physics - - REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , INTENT(INOUT) :: smois, tslb - - REAL, DIMENSION(num_soil_layers), INTENT(OUT) :: dzs,zs - - REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT) :: tsk, tmn - REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: xland, snow, canwat, xice, vegfra - INTEGER, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: ivgtyp, isltyp - - ! Local variables. - - INTEGER :: itf,jtf - - itf=MIN(ite,ide-1) - jtf=MIN(jte,jde-1) - - IF ( ( sf_surface_physics .EQ. SLABSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN - CALL init_soil_depth_1 ( zs , dzs , num_soil_layers ) - CALL init_soil_1_ideal(tsk,tmn,tslb,xland, & - ivgtyp,zs,dzs,num_soil_layers, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - ELSE IF ( ( sf_surface_physics .EQ. LSMSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN - CALL init_soil_depth_2 ( zs , dzs , num_soil_layers ) - CALL init_soil_2_ideal ( xland,xice,vegfra,snow,canwat, & - ivgtyp,isltyp,tslb,smois,tmn, & - num_soil_layers, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - ELSE IF ( ( sf_surface_physics .EQ. NOAHMPSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN - CALL init_soil_depth_2 ( zs , dzs , num_soil_layers ) - CALL init_soil_2_ideal ( xland,xice,vegfra,snow,canwat, & - ivgtyp,isltyp,tslb,smois,tmn, & - num_soil_layers, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - ELSE IF ( ( sf_surface_physics .EQ. RUCLSMSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN - CALL init_soil_depth_3 ( zs , dzs , num_soil_layers ) - - END IF - - END SUBROUTINE process_soil_ideal - - SUBROUTINE adjust_soil_temp_new ( tmn , sf_surface_physics , & - tsk , ter , toposoil , landmask , flag_toposoil , & - st000010 , st010040 , st040100 , st100200 , st010200 , & - flag_st000010 , flag_st010040 , flag_st040100 , flag_st100200 , flag_st010200 , & - soilt000 , soilt005 , soilt020 , soilt040 , soilt160 , soilt300 , & - flag_soilt000 , flag_soilt005 , flag_soilt020 , flag_soilt040 , flag_soilt160 , flag_soilt300 , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte - - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: ter , toposoil , landmask - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tmn , tsk - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: st000010 , st010040 , st040100 , st100200 , st010200 - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: soilt000 , soilt005 , soilt020 , soilt040 , soilt160 , soilt300 - - INTEGER , INTENT(IN) :: flag_st000010 , flag_st010040 , flag_st040100 , flag_st100200 , flag_st010200 - INTEGER , INTENT(IN) :: flag_soilt000 , flag_soilt005 , flag_soilt020 , flag_soilt040 , flag_soilt160 , flag_soilt300 - INTEGER , INTENT(IN) :: sf_surface_physics , flag_toposoil - - INTEGER :: i , j - - REAL :: soil_elev_min_val , soil_elev_max_val , soil_elev_min_dif , soil_elev_max_dif - - ! Do we have a soil field with which to modify soil temperatures? - - IF ( flag_toposoil .EQ. 1 ) THEN - - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - - ! Is the toposoil field OK, or is it a subversive soil elevation field. We can tell - ! usually by looking at values. Anything less than -1000 m (lower than the Dead Sea) is - ! bad. Anything larger than 10 km (taller than Everest) is toast. Also, anything where - ! the difference between the soil elevation and the terrain is greater than 3 km means - ! that the soil data is either all zeros or that the data are inconsistent. Any of these - ! three conditions is grievous enough to induce a WRF fatality. However, if they are at - ! a water point, then we can safely ignore them. - - soil_elev_min_val = toposoil(i,j) - soil_elev_max_val = toposoil(i,j) - soil_elev_min_dif = ter(i,j) - toposoil(i,j) - soil_elev_max_dif = ter(i,j) - toposoil(i,j) - - IF ( ( soil_elev_min_val .LT. -1000 ) .AND. ( landmask(i,j) .LT. 0.5 ) ) THEN - CYCLE - ELSE IF ( ( soil_elev_min_val .LT. -1000 ) .AND. ( landmask(i,j) .GT. 0.5 ) ) THEN -!print *,'no soil temperature elevation adjustment, soil height too small = ',toposoil(i,j) -cycle -! CALL wrf_error_fatal ( 'TOPOSOIL values have large negative values < -1000 m, unrealistic.' ) - ENDIF - - IF ( ( soil_elev_max_val .GT. 10000 ) .AND. ( landmask(i,j) .LT. 0.5 ) ) THEN - CYCLE - ELSE IF ( ( soil_elev_max_val .GT. 10000 ) .AND. ( landmask(i,j) .GT. 0.5 ) ) THEN -print *,'no soil temperature elevation adjustment, soil height too high = ',toposoil(i,j) -cycle - CALL wrf_error_fatal ( 'TOPOSOIL values have large positive values > 10,000 m , unrealistic.' ) - ENDIF - - IF ( ( ( soil_elev_min_dif .LT. -3000 ) .OR. ( soil_elev_max_dif .GT. 3000 ) ) .AND. & - ( landmask(i,j) .LT. 0.5 ) ) THEN - CYCLE - ELSE IF ( ( ( soil_elev_min_dif .LT. -3000 ) .OR. ( soil_elev_max_dif .GT. 3000 ) ) .AND. & - ( landmask(i,j) .GT. 0.5 ) ) THEN -print *,'no soil temperature elevation adjustment, diff of soil height and terrain = ',ter(i,j) - toposoil(i,j) -cycle - CALL wrf_error_fatal ( 'TOPOSOIL difference with terrain elevation differs by more than 3000 m, unrealistic' ) - ENDIF - - ! For each of the fields that we would like to modify, check to see if it came in from the SI. - ! If so, then use a -6.5 K/km lapse rate (based on the elevation diffs). We only adjust when we - ! are not at a water point. - - IF (landmask(i,j) .GT. 0.5 ) THEN - - IF ( sf_surface_physics .EQ. SLABSCHEME .OR. sf_surface_physics .EQ. PXLSMSCHEME ) THEN - tmn(i,j) = tmn(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - - tsk(i,j) = tsk(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - - IF ( flag_st000010 .EQ. 1 ) THEN - st000010(i,j) = st000010(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - IF ( flag_st010040 .EQ. 1 ) THEN - st010040(i,j) = st010040(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - IF ( flag_st040100 .EQ. 1 ) THEN - st040100(i,j) = st040100(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - IF ( flag_st100200 .EQ. 1 ) THEN - st100200(i,j) = st100200(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - IF ( flag_st010200 .EQ. 1 ) THEN - st010200(i,j) = st010200(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - - IF ( flag_soilt000 .EQ. 1 ) THEN - soilt000(i,j) = soilt000(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - IF ( flag_soilt005 .EQ. 1 ) THEN - soilt005(i,j) = soilt005(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - IF ( flag_soilt020 .EQ. 1 ) THEN - soilt020(i,j) = soilt020(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - IF ( flag_soilt040 .EQ. 1 ) THEN - soilt040(i,j) = soilt040(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - IF ( flag_soilt160 .EQ. 1 ) THEN - soilt160(i,j) = soilt160(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - IF ( flag_soilt300 .EQ. 1 ) THEN - soilt300(i,j) = soilt300(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) ) - END IF - - END IF - END DO - END DO - - END IF - - END SUBROUTINE adjust_soil_temp_new - - - SUBROUTINE init_soil_depth_1 ( zs , dzs , num_soil_layers ) - - IMPLICIT NONE - - INTEGER, INTENT(IN) :: num_soil_layers - - REAL, DIMENSION(1:num_soil_layers), INTENT(OUT) :: zs,dzs - - INTEGER :: l - - CHARACTER (LEN=132) :: message - - ! Define layers (top layer = 0.01 m). Double the thicknesses at each step (dzs values). - ! The distance from the ground level to the midpoint of the layer is given by zs. - - ! ------- Ground Level ---------- || || || || - ! || || || || zs(1) = 0.005 m - ! -- -- -- -- -- -- -- -- -- || || || \/ - ! || || || - ! ----------------------------------- || || || \/ dzs(1) = 0.01 m - ! || || || - ! || || || zs(2) = 0.02 - ! -- -- -- -- -- -- -- -- -- || || \/ - ! || || - ! || || - ! ----------------------------------- || || \/ dzs(2) = 0.02 m - ! || || - ! || || - ! || || - ! || || zs(3) = 0.05 - ! -- -- -- -- -- -- -- -- -- || \/ - ! || - ! || - ! || - ! || - ! ----------------------------------- \/ dzs(3) = 0.04 m - - IF ( num_soil_layers .NE. 5 ) THEN - write(message,FMT= '(A)') 'The SLAB thermal diffusion PBL uses 5 layers. Set num_soil_layers=5 in the namelist (&physics).' - CALL wrf_error_fatal ( message ) - END IF - - dzs(1)=.01 - zs(1)=.5*dzs(1) - - DO l=2,num_soil_layers - dzs(l)=2*dzs(l-1) - zs(l)=zs(l-1)+.5*dzs(l-1)+.5*dzs(l) - ENDDO - - END SUBROUTINE init_soil_depth_1 - - SUBROUTINE init_soil_depth_2 ( zs , dzs , num_soil_layers ) - - IMPLICIT NONE - - INTEGER, INTENT(IN) :: num_soil_layers - - REAL, DIMENSION(1:num_soil_layers), INTENT(OUT) :: zs,dzs - - INTEGER :: l - - CHARACTER (LEN=132) :: message - - dzs = (/ 0.1 , 0.3 , 0.6 , 1.0 /) - - IF ( num_soil_layers .NE. 4 ) THEN - write(message,FMT='(A)') 'The Noah and NoahMP LSMs use 4 layers. Set num_soil_layers=4 in the namelist (&physics).' - CALL wrf_error_fatal ( message ) - END IF - - zs(1)=.5*dzs(1) - - DO l=2,num_soil_layers - zs(l)=zs(l-1)+.5*dzs(l-1)+.5*dzs(l) - ENDDO - - END SUBROUTINE init_soil_depth_2 - - SUBROUTINE init_soil_depth_3 ( zs , dzs , num_soil_layers ) - - IMPLICIT NONE - - INTEGER, INTENT(IN) :: num_soil_layers - - REAL, DIMENSION(1:num_soil_layers), INTENT(OUT) :: zs,dzs - - INTEGER :: l - - CHARACTER (LEN=132) :: message - -! in RUC LSM ZS - soil levels, and DZS - soil layer thicknesses, not used -! ZS is specified in the namelist: num_soil_layers = 6 or 9. -! Other options with number of levels are possible, but -! WRF users should change consistently the namelist entry with the -! ZS array in this subroutine. - - IF ( num_soil_layers .EQ. 6) THEN - zs = (/ 0.00 , 0.05 , 0.20 , 0.40 , 1.60 , 3.00 /) -! dzs = (/ 0.00 , 0.125, 0.175 , 0.70 , 1.30 , 1.40 /) - ELSEIF ( num_soil_layers .EQ. 9) THEN - zs = (/ 0.00 , 0.01 , 0.04 , 0.10 , 0.30, 0.60, 1.00 , 1.60, 3.00 /) -! zs = (/ 0.00 , 0.05 , 0.20 , 0.40 , 0.60, 1.00, 1.60 , 2.20, 3.00 /) -! dzs = (/ 0.00 , 0.125, 0.175 , 0.70 , 1.30 , 1.40 /) - ENDIF - - IF ( num_soil_layers .EQ. 4 .OR. num_soil_layers .EQ. 5 ) THEN - WRITE(message,FMT= '(A)')'The RUC LSM uses 6, 9 or more levels. Set num_soil_layers appropriately in the namelist (&physics).' - CALL wrf_error_fatal ( message ) - END IF - - END SUBROUTINE init_soil_depth_3 - -#if 0 -!CLM added by Jiming Jin for NMM - SUBROUTINE init_soil_depth_4 ( zs , dzs , num_soil_layers ) - - IMPLICIT NONE - - INTEGER, INTENT(IN) :: num_soil_layers - - REAL, DIMENSION(1:num_soil_layers), INTENT(OUT) :: zs,dzs - REAL, PARAMETER :: scalez = 0.025 - - INTEGER :: l - - ! Define layers (top layer = 0.01 m). Double the thicknesses at each - ! step (dzs values). - ! The distance from the ground level to the midpoint of the layer is - ! given by zs. - - ! ------- Ground Level ---------- || || || || - ! || || || || zs(1) = - ! 0.005 m - ! -- -- -- -- -- -- -- -- -- || || || \/ - ! || || || - ! ----------------------------------- || || || \/ dzs(1) = - ! 0.01 m - ! || || || - ! || || || zs(2) = 0.02 - ! -- -- -- -- -- -- -- -- -- || || \/ - ! || || - ! || || - ! ----------------------------------- || || \/ dzs(2) = 0.02 m - ! || || - ! || || - ! || || - ! || || zs(3) = 0.05 - ! -- -- -- -- -- -- -- -- -- || \/ - ! || - ! || - ! || - ! || - ! ----------------------------------- \/ dzs(3) = 0.04 m - - do l = 1, num_soil_layers - zs(l) = scalez*(exp(0.5*(l-0.5))-1.) !node depths - enddo - dzs(1) = 0.5*(zs(1)+zs(2)) !thickness b/n two interfaces - do l = 2,num_soil_layers-1 - dzs(l)= 0.5*(zs(l+1)-zs(l-1)) - enddo - dzs(num_soil_layers) = zs(num_soil_layers)-zs(num_soil_layers-1) - - END SUBROUTINE init_soil_depth_4 -#endif - - SUBROUTINE init_soil_1_real ( tsk , tmn , tslb , zs , dzs , & - num_soil_layers , real_data_init_type , & - landmask , sst , flag_sst , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: num_soil_layers , real_data_init_type , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte - - INTEGER , INTENT(IN) :: flag_sst - - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tsk , tmn - - REAL , DIMENSION(num_soil_layers) :: zs , dzs - - REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb - - INTEGER :: i , j , l - - ! Soil temperature is linearly interpolated between the skin temperature (taken to be at a - ! depth of 0.5 cm) and the deep soil, annual temperature (taken to be at a depth of 23 cm). - ! The tslb(i,1,j) is the skin temperature, and the tslb(i,num_soil_layers,j) level is the - ! annual mean temperature. - - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( landmask(i,j) .GT. 0.5 ) THEN - DO l = 1 , num_soil_layers - tslb(i,l,j)= ( tsk(i,j) * ( zs(num_soil_layers) - zs(l) ) + & - tmn(i,j) * ( zs( l) - zs(1) ) ) / & - ( zs(num_soil_layers) - zs(1) ) - END DO - ELSE - IF ( ( real_data_init_type .EQ. 1 ) .AND. ( flag_sst .EQ. 1 ) ) THEN - DO l = 1 , num_soil_layers - tslb(i,l,j)= sst(i,j) - END DO - ELSE - DO l = 1 , num_soil_layers - tslb(i,l,j)= tsk(i,j) - END DO - END IF - END IF - END DO - END DO - - END SUBROUTINE init_soil_1_real - - SUBROUTINE init_soil_1_ideal(tsk,tmn,tslb,xland, & - ivgtyp,ZS,DZS,num_soil_layers, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - - IMPLICIT NONE - - INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte - - INTEGER, INTENT(IN ) :: num_soil_layers - - REAL, DIMENSION( ims:ime , 1 , jms:jme ), INTENT(OUT) :: tslb - REAL, DIMENSION( ims:ime , jms:jme ), INTENT(OUT) :: xland - INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(OUT) :: ivgtyp - - REAL, DIMENSION(1:), INTENT(IN) :: dzs,zs - - REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(IN) :: tsk, tmn - - ! Lcal variables. - - INTEGER :: l,j,i,itf,jtf - - itf=MIN(ite,ide-1) - jtf=MIN(jte,jde-1) - - IF (num_soil_layers.NE.1)THEN - DO j=jts,jtf - DO l=1,num_soil_layers - DO i=its,itf - tslb(i,l,j)=( tsk(i,j)*(zs(num_soil_layers)-zs(l)) + tmn(i,j)*(zs(l)-zs(1)) ) / & - ( zs(num_soil_layers)-zs(1) ) - ENDDO - ENDDO - ENDDO - ENDIF - DO j=jts,jtf - DO i=its,itf - xland(i,j) = 2 - ivgtyp(i,j) = 7 - ENDDO - ENDDO - - END SUBROUTINE init_soil_1_ideal - - SUBROUTINE init_soil_2_real ( tsk , tmn , smois , sh2o , tslb , & - st_input , sm_input , sw_input , landmask , sst , & - zs , dzs , & - st_levels_input , sm_levels_input ,sw_levels_input , & - num_soil_layers , num_st_levels_input , num_sm_levels_input , num_sw_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , & - flag_sst , flag_soilt000 , flag_soilm000 , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: num_soil_layers , & - num_st_levels_input , num_sm_levels_input , num_sw_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte - - INTEGER , INTENT(IN) :: flag_sst, flag_soilt000, flag_soilm000 - - INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input - INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input - INTEGER , DIMENSION(1:num_sw_levels_input) , INTENT(INOUT) :: sw_levels_input - - REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input - REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input - REAL , DIMENSION(ims:ime,1:num_sw_levels_alloc,jms:jme) , INTENT(INOUT) :: sw_input - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst - - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tmn - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk - REAL , DIMENSION(num_soil_layers) :: zs , dzs - - REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois , sh2o - - REAL , ALLOCATABLE , DIMENSION(:) :: zhave - - INTEGER :: i , j , l , lout , lin , lwant , lhave , num - REAL :: temp - LOGICAL :: found_levels - - CHARACTER (LEN=132) :: message - - ! Are there any soil temp and moisture levels - ya know, they are mandatory. - - num = num_st_levels_input * num_sm_levels_input - - IF ( num .GE. 1 ) THEN - - ! Ordered levels that we have data for. - IF ( flag_soilt000 .eq. 1 ) THEN - write(message, FMT='(A)') ' Assume RUC LSM 6-level input' - CALL wrf_message ( message ) - ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input,num_sw_levels_input) ) ) - ELSE - write(message, FMT='(A)') ' Assume Noah LSM input' - CALL wrf_message ( message ) - ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input,num_sw_levels_input) +2) ) - END IF - - - ! Sort the levels for temperature. -!print*,'num_st_levels_input, st_levels_input', num_st_levels_input, st_levels_input -!print*,'num_sm_levels_input,num_sw_levels_input',num_sm_levels_input,num_sw_levels_input - - outert : DO lout = 1 , num_st_levels_input-1 - innert : DO lin = lout+1 , num_st_levels_input - IF ( st_levels_input(lout) .GT. st_levels_input(lin) ) THEN - temp = st_levels_input(lout) - st_levels_input(lout) = st_levels_input(lin) - st_levels_input(lin) = NINT(temp) - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - temp = st_input(i,lout+1,j) - st_input(i,lout+1,j) = st_input(i,lin+1,j) - st_input(i,lin+1,j) = temp - END DO - END DO - END IF - END DO innert - END DO outert -!tgs add IF - IF ( flag_soilt000 .NE. 1 ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - st_input(i,1,j) = tsk(i,j) - st_input(i,num_st_levels_input+2,j) = tmn(i,j) - END DO - END DO - ENDIF - - -#if ( NMM_CORE == 1 ) -!new -! write(0,*) 'st_input(1) in init_soil_2_real' -! DO J=MIN(jde-1,jte),JTS, -MIN(jde-1,jte)/15 -! write(0,616) (st_input(I,1,J),I=its , MIN(ide-1,ite),MIN(ide-1,ite)/10) -! ENDDO - -! write(0,*) 'st_input(2) in init_soil_2_real' -! DO J=MIN(jde-1,jte),JTS, -MIN(jde-1,jte)/15 -! write(0,616) (st_input(I,2,J),I=its , MIN(ide-1,ite),MIN(ide-1,ite)/10) -! ENDDO - - 616 format(20(f4.0,1x)) -#endif - - ! Sort the levels for moisture. - - outerm: DO lout = 1 , num_sm_levels_input-1 - innerm : DO lin = lout+1 , num_sm_levels_input - IF ( sm_levels_input(lout) .GT. sm_levels_input(lin) ) THEN - temp = sm_levels_input(lout) - sm_levels_input(lout) = sm_levels_input(lin) - sm_levels_input(lin) = NINT(temp) - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - temp = sm_input(i,lout+1,j) - sm_input(i,lout+1,j) = sm_input(i,lin+1,j) - sm_input(i,lin+1,j) = temp - END DO - END DO - END IF - END DO innerm - END DO outerm -!tgs add IF - IF ( flag_soilm000 .NE. 1 ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - sm_input(i,1,j) = sm_input(i,2,j) - sm_input(i,num_sm_levels_input+2,j) = sm_input(i,num_sm_levels_input+1,j) - END DO - END DO - ENDIF - - ! Sort the levels for liquid moisture. - - outerw: DO lout = 1 , num_sw_levels_input-1 - innerw : DO lin = lout+1 , num_sw_levels_input - IF ( sw_levels_input(lout) .GT. sw_levels_input(lin) ) THEN - temp = sw_levels_input(lout) - sw_levels_input(lout) = sw_levels_input(lin) - sw_levels_input(lin) = NINT(temp) - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - temp = sw_input(i,lout+1,j) - sw_input(i,lout+1,j) = sw_input(i,lin+1,j) - sw_input(i,lin+1,j) = temp - END DO - END DO - END IF - END DO innerw - END DO outerw - IF ( num_sw_levels_input .GT. 1 ) THEN - IF ( flag_soilm000 .NE. 1 ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - sw_input(i,1,j) = sw_input(i,2,j) - sw_input(i,num_sw_levels_input+2,j) = sw_input(i,num_sw_levels_input+1,j) - END DO - END DO - ENDIF - END IF - - found_levels = .TRUE. - - ELSE IF ( ( num .LE. 0 ) .AND. ( start_date .NE. current_date ) ) THEN - - found_levels = .FALSE. - - ELSE - CALL wrf_error_fatal ( & - 'No input soil level data (temperature, moisture or liquid, or all are missing). Required for LSM.' ) - END IF - - ! Is it OK to continue? - - IF ( found_levels ) THEN - -!tgs add IF - IF ( flag_soilt000 .NE.1) THEN -!tgs initialize from Noah data - ! Here are the levels that we have from the input for temperature. The input levels plus - ! two more: the skin temperature at 0 cm, and the annual mean temperature at 300 cm. - - zhave(1) = 0. - DO l = 1 , num_st_levels_input - zhave(l+1) = st_levels_input(l) / 100. - END DO - zhave(num_st_levels_input+2) = 300. / 100. - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantt : DO lwant = 1 , num_soil_layers - z_havet : DO lhave = 1 , num_st_levels_input +2 -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - tslb(i,lwant,j)= ( st_input(i,lhave ,j) * ( zhave(lhave+1) - zs (lwant) ) + & - st_input(i,lhave+1,j) * ( zs (lwant ) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havet - END IF - END DO z_havet - END DO z_wantt - - ELSE - -!tgs initialize from RUCLSM data - DO l = 1 , num_st_levels_input - zhave(l) = st_levels_input(l) / 100. - END DO - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - - z_wantt_2 : DO lwant = 1 , num_soil_layers - z_havet_2 : DO lhave = 1 , num_st_levels_input -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - tslb(i,lwant,j)= ( st_input(i,lhave,j ) * ( zhave(lhave+1) - zs (lwant) ) + & - st_input(i,lhave+1,j) * ( zs (lwant ) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havet_2 - END IF - END DO z_havet_2 - END DO z_wantt_2 - - ENDIF - - - IF ( flag_soilm000 .NE. 1 ) THEN -!tgs initialize from Noah - ! Here are the levels that we have from the input for moisture. The input levels plus - ! two more: a value at 0 cm and one at 300 cm. The 0 cm value is taken to be identical - ! to the most shallow layer's value. Similarly, the 300 cm value is taken to be the same - ! as the most deep layer's value. - - zhave(1) = 0. - DO l = 1 , num_sm_levels_input - zhave(l+1) = sm_levels_input(l) / 100. - END DO - zhave(num_sm_levels_input+2) = 300. / 100. - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantm : DO lwant = 1 , num_soil_layers - z_havem : DO lhave = 1 , num_sm_levels_input +2 -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - smois(i,lwant,j)= ( sm_input(i,lhave ,j) * ( zhave(lhave+1) - zs (lwant) ) + & - sm_input(i,lhave+1,j) * ( zs (lwant ) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havem - END IF - END DO z_havem - END DO z_wantm - - ELSE - -!tgs initialize from RUCLSM data - DO l = 1 , num_sm_levels_input - zhave(l) = sm_levels_input(l) / 100. - END DO - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantm_2 : DO lwant = 1 , num_soil_layers - z_havem_2 : DO lhave = 1 , num_sm_levels_input -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - smois(i,lwant,j)= ( sm_input(i,lhave,j ) * ( zhave(lhave+1) - zs (lwant) ) + & - sm_input(i,lhave+1,j) * ( zs (lwant ) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havem_2 - END IF - END DO z_havem_2 - END DO z_wantm_2 - - ENDIF - ! Any liquid soil moisture to worry about? - - IF ( num_sw_levels_input .GT. 1 ) THEN - - IF ( flag_soilm000 .NE. 1 ) THEN - zhave(1) = 0. - DO l = 1 , num_sw_levels_input - zhave(l+1) = sw_levels_input(l) / 100. - END DO - zhave(num_sw_levels_input+2) = 300. / 100. - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantw : DO lwant = 1 , num_soil_layers - z_havew : DO lhave = 1 , num_sw_levels_input +2 -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - sh2o(i,lwant,j)= ( sw_input(i,lhave ,j) * ( zhave(lhave+1) - zs (lwant) ) + & - sw_input(i,lhave+1,j) * ( zs (lwant ) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havew - END IF - END DO z_havew - END DO z_wantw - ELSE - -!tgs initialize from RUCLSM data - DO l = 1 , num_sw_levels_input - zhave(l) = sw_levels_input(l) / 100. - END DO - - ! Interpolate between the layers we have (zhave) and those that we want - ! (zs). - - z_wantw_2 : DO lwant = 1 , num_soil_layers - z_havew_2 : DO lhave = 1 , num_sw_levels_input -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - sh2o(i,lwant,j)= ( sw_input(i,lhave,j ) * ( zhave(lhave+1) - zs (lwant) ) + & - sw_input(i,lhave+1,j) * ( zs (lwant) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havew_2 - END IF - END DO z_havew_2 - END DO z_wantw_2 - - ENDIF - END IF - - - ! Over water, put in reasonable values for soil temperature and moisture. These won't be - ! used, but they will make a more continuous plot. - - IF ( flag_sst .EQ. 1 ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( landmask(i,j) .LT. 0.5 ) THEN - DO l = 1 , num_soil_layers - tslb(i,l,j)= sst(i,j) -!tgs add line for tsk - tsk(i,j) = sst(i,j) - smois(i,l,j)= 1.0 - sh2o (i,l,j)= 1.0 - END DO - END IF - END DO - END DO - ELSE - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( landmask(i,j) .LT. 0.5 ) THEN - DO l = 1 , num_soil_layers - tslb(i,l,j)= tsk(i,j) - smois(i,l,j)= 1.0 - sh2o (i,l,j)= 1.0 - END DO - END IF - END DO - END DO - END IF - - DEALLOCATE (zhave) - - END IF - - END SUBROUTINE init_soil_2_real - - SUBROUTINE init_soil_2_ideal ( xland,xice,vegfra,snow,canwat, & - ivgtyp,isltyp,tslb,smois,tmn, & - num_soil_layers, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - - IMPLICIT NONE - - INTEGER, INTENT(IN) ::ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte - - INTEGER, INTENT(IN) ::num_soil_layers - - REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , INTENT(OUT) :: smois, tslb - - REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: xland, snow, canwat, xice, vegfra, tmn - - INTEGER, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: ivgtyp, isltyp - - INTEGER :: icm,jcm,itf,jtf - INTEGER :: i,j,l - - itf=min0(ite,ide-1) - jtf=min0(jte,jde-1) - - icm = ide/2 - jcm = jde/2 - - DO j=jts,jtf - DO l=1,num_soil_layers - DO i=its,itf - - smois(i,1,j)=0.10 - smois(i,2,j)=0.10 - smois(i,3,j)=0.10 - smois(i,4,j)=0.10 - - tslb(i,1,j)=295. - tslb(i,2,j)=297. - tslb(i,3,j)=293. - tslb(i,4,j)=293. - - ENDDO - ENDDO - ENDDO - - DO j=jts,jtf - DO i=its,itf - xland(i,j) = 2 - tmn(i,j) = 294. - xice(i,j) = 0. - vegfra(i,j) = 0. - snow(i,j) = 0. - canwat(i,j) = 0. - ivgtyp(i,j) = 7 - isltyp(i,j) = 8 - ENDDO - ENDDO - - END SUBROUTINE init_soil_2_ideal - - SUBROUTINE init_soil_3_real ( tsk , tmn , smois , tslb , & - st_input , sm_input , landmask, sst, & - zs , dzs , & - st_levels_input , sm_levels_input , & - num_soil_layers , num_st_levels_input , num_sm_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , & - flag_sst , flag_soilt000 , flag_soilm000 , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: num_soil_layers , & - num_st_levels_input , num_sm_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte - - INTEGER , INTENT(IN) :: flag_sst, flag_soilt000, flag_soilm000 - - INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input - INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input - - REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input - REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst - - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tmn - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk - REAL , DIMENSION(num_soil_layers) :: zs , dzs - - REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois - - REAL , ALLOCATABLE , DIMENSION(:) :: zhave - - INTEGER :: i , j , l , lout , lin , lwant , lhave - REAL :: temp - - ! Allocate the soil layer array used for interpolating. - - IF ( ( num_st_levels_input .LE. 0 ) .OR. & - ( num_sm_levels_input .LE. 0 ) ) THEN - PRINT '(A)','No input soil level data (either temperature or moisture, or both are missing). Required for RUC LSM.' - CALL wrf_error_fatal ( 'no soil data' ) - ELSE - IF ( flag_soilt000 .eq. 1 ) THEN - PRINT '(A)',' Assume RUC LSM 6-level input' - ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input) ) ) - ELSE - PRINT '(A)',' Assume non-RUC LSM input' - ALLOCATE ( zhave( MAX(num_st_levels_input,num_soil_layers) ) ) - END IF - END IF - - ! Sort the levels for temperature. - - outert : DO lout = 1 , num_st_levels_input-1 - innert : DO lin = lout+1 , num_st_levels_input - IF ( st_levels_input(lout) .GT. st_levels_input(lin) ) THEN - temp = st_levels_input(lout) - st_levels_input(lout) = st_levels_input(lin) - st_levels_input(lin) = NINT(temp) - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - temp = st_input(i,lout,j) - st_input(i,lout,j) = st_input(i,lin,j) - st_input(i,lin,j) = temp - END DO - END DO - END IF - END DO innert - END DO outert - - IF ( flag_soilt000 .NE. 1 ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - st_input(i,1,j) = tsk(i,j) - st_input(i,num_st_levels_input+2,j) = tmn(i,j) - END DO - END DO - END IF - - ! Sort the levels for moisture. - - outerm: DO lout = 1 , num_sm_levels_input-1 - innerm : DO lin = lout+1 , num_sm_levels_input - IF ( sm_levels_input(lout) .GT. sm_levels_input(lin) ) THEN - temp = sm_levels_input(lout) - sm_levels_input(lout) = sm_levels_input(lin) - sm_levels_input(lin) = NINT(temp) - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - temp = sm_input(i,lout,j) - sm_input(i,lout,j) = sm_input(i,lin,j) - sm_input(i,lin,j) = temp - END DO - END DO - END IF - END DO innerm - END DO outerm - - IF ( flag_soilm000 .NE. 1 ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - sm_input(i,1,j) = sm_input(i,2,j) - sm_input(i,num_sm_levels_input+2,j) = sm_input(i,num_sm_levels_input+1,j) - END DO - END DO - END IF - - ! Here are the levels that we have from the input for temperature. - - IF ( flag_soilt000 .EQ. 1 ) THEN - DO l = 1 , num_st_levels_input - zhave(l) = st_levels_input(l) / 100. - END DO - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantt : DO lwant = 1 , num_soil_layers - z_havet : DO lhave = 1 , num_st_levels_input -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - tslb(i,lwant,j)= ( st_input(i,lhave,j ) * ( zhave(lhave+1) - zs (lwant) ) + & - st_input(i,lhave+1,j) * ( zs (lwant ) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havet - END IF - END DO z_havet - END DO z_wantt - - ELSE - - zhave(1) = 0. - DO l = 1 , num_st_levels_input - zhave(l+1) = st_levels_input(l) / 100. - END DO - zhave(num_st_levels_input+2) = 300. / 100. - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantt_2 : DO lwant = 1 , num_soil_layers - z_havet_2 : DO lhave = 1 , num_st_levels_input +2 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - tslb(i,lwant,j)= ( st_input(i,lhave,j ) * ( zhave(lhave+1) - zs (lwant) ) + & - st_input(i,lhave+1,j) * ( zs (lwant ) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havet_2 - END IF - END DO z_havet_2 - END DO z_wantt_2 - - END IF - - ! Here are the levels that we have from the input for moisture. - - IF ( flag_soilm000 .EQ. 1 ) THEN - DO l = 1 , num_sm_levels_input - zhave(l) = sm_levels_input(l) / 100. - END DO - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantm : DO lwant = 1 , num_soil_layers - z_havem : DO lhave = 1 , num_sm_levels_input -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - smois(i,lwant,j)= ( sm_input(i,lhave,j ) * ( zhave(lhave+1) - zs (lwant) ) + & - sm_input(i,lhave+1,j) * ( zs (lwant ) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havem - END IF - END DO z_havem - END DO z_wantm - - ELSE - - zhave(1) = 0. - DO l = 1 , num_sm_levels_input - zhave(l+1) = sm_levels_input(l) / 100. - END DO - zhave(num_sm_levels_input+2) = 300. / 100. - - z_wantm_2 : DO lwant = 1 , num_soil_layers - z_havem_2 : DO lhave = 1 , num_sm_levels_input +2 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - smois(i,lwant,j)= ( sm_input(i,lhave,j ) * ( zhave(lhave+1) - zs (lwant) ) + & - sm_input(i,lhave+1,j) * ( zs (lwant ) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havem_2 - END IF - END DO z_havem_2 - END DO z_wantm_2 - - END IF - ! Over water, put in reasonable values for soil temperature and moisture. These won't be - ! used, but they will make a more continuous plot. - - IF ( flag_sst .EQ. 1 ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( landmask(i,j) .LT. 0.5 ) THEN - DO l = 1 , num_soil_layers - tslb(i,l,j) = sst(i,j) - tsk(i,j) = sst(i,j) - smois(i,l,j)= 1.0 - END DO - END IF - END DO - END DO - ELSE - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( landmask(i,j) .LT. 0.5 ) THEN - DO l = 1 , num_soil_layers - tslb(i,l,j)= tsk(i,j) - smois(i,l,j)= 1.0 - END DO - END IF - END DO - END DO - END IF - - DEALLOCATE (zhave) - - END SUBROUTINE init_soil_3_real - -#if 0 -! CLM added by Jiming Jin - - SUBROUTINE init_soil_4_real ( tsk , tmn , smois , sh2o , tslb , & - st_input , sm_input , sw_input , landmask , sst , & - zs , dzs , & - st_levels_input , sm_levels_input , sw_levels_input , & - num_soil_layers , num_st_levels_input , num_sm_levels_input , num_sw_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , & - flag_sst , flag_soil_layers , flag_soil_levels , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - - IMPLICIT NONE - - INTEGER , INTENT(IN) :: num_soil_layers , & - num_st_levels_input , num_sm_levels_input , num_sw_levels_input , & - num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte - - INTEGER , INTENT(IN) :: flag_sst, flag_soil_layers, flag_soil_levels - - INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input - INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input - INTEGER , DIMENSION(1:num_sw_levels_input) , INTENT(INOUT) :: sw_levels_input - - REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input - REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input - REAL , DIMENSION(ims:ime,1:num_sw_levels_alloc,jms:jme) , INTENT(INOUT) :: sw_input - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst - - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tmn - REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk - REAL , DIMENSION(num_soil_layers) :: zs , dzs - - REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois , sh2o - - REAL , ALLOCATABLE , DIMENSION(:) :: zhave - - INTEGER :: i , j , l , lout , lin , lwant , lhave , num - REAL :: temp - LOGICAL :: found_levels - - CHARACTER (LEN=132) :: message - - ! Are there any soil temp and moisture levels - ya know, they are - ! mandatory. - - num = num_st_levels_input * num_sm_levels_input - - IF ( num .GE. 1 ) THEN - - ! Ordered levels that we have data for. - -!tgs add option to initialize from RUCLSM - IF ( flag_soil_levels == 1 ) THEN - write(message, FMT='(A)') ' Assume CLM input' - CALL wrf_message ( message ) - ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input,num_sw_levels_input) ) ) - ELSE - write(message, FMT='(A)') ' Assume non-CLM input' - CALL wrf_message ( message ) - ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input,num_sw_levels_input) +2) ) - ! ALLOCATE ( zhave( MAX(num_st_levels_input,num_soil_layers) ) ) - END IF - - - ! Sort the levels for temperature. - - outert : DO lout = 1 , num_st_levels_input-1 - innert : DO lin = lout+1 , num_st_levels_input - IF ( st_levels_input(lout) .GT. st_levels_input(lin) ) THEN - temp = st_levels_input(lout) - st_levels_input(lout) = st_levels_input(lin) - st_levels_input(lin) = NINT(temp) - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - temp = st_input(i,lout+1,j) - st_input(i,lout+1,j) = st_input(i,lin+1,j) - st_input(i,lin+1,j) = temp - END DO - END DO - END IF - END DO innert - END DO outert -!tgs add IF - IF ( flag_soil_layers == 1 ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - st_input(i,1,j) = tsk(i,j) - st_input(i,num_st_levels_input+2,j) = tmn(i,j) - END DO - END DO - ENDIF - ! Sort the levels for moisture. - - outerm: DO lout = 1 , num_sm_levels_input-1 - innerm : DO lin = lout+1 , num_sm_levels_input - IF ( sm_levels_input(lout) .GT. sm_levels_input(lin) ) THEN - temp = sm_levels_input(lout) - sm_levels_input(lout) = sm_levels_input(lin) - sm_levels_input(lin) = NINT(temp) - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - temp = sm_input(i,lout+1,j) - sm_input(i,lout+1,j) = sm_input(i,lin+1,j) - sm_input(i,lin+1,j) = temp - END DO - END DO - END IF - END DO innerm - END DO outerm -!tgs add IF - IF ( flag_soil_layers == 1 ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - sm_input(i,1,j) = sm_input(i,2,j) - sm_input(i,num_sm_levels_input+2,j) = sm_input(i,num_sm_levels_input+1,j) - END DO - END DO - ENDIF - - ! Sort the levels for liquid moisture. - - outerw: DO lout = 1 , num_sw_levels_input-1 - innerw : DO lin = lout+1 , num_sw_levels_input - IF ( sw_levels_input(lout) .GT. sw_levels_input(lin) ) THEN - temp = sw_levels_input(lout) - sw_levels_input(lout) = sw_levels_input(lin) - sw_levels_input(lin) = NINT(temp) - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - temp = sw_input(i,lout+1,j) - sw_input(i,lout+1,j) = sw_input(i,lin+1,j) - sw_input(i,lin+1,j) = temp - END DO - END DO - END IF - END DO innerw - END DO outerw - IF ( num_sw_levels_input .GT. 1 ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - sw_input(i,1,j) = sw_input(i,2,j) - sw_input(i,num_sw_levels_input+2,j) = sw_input(i,num_sw_levels_input+1,j) - END DO - END DO - END IF - - found_levels = .TRUE. - - ELSE IF ( ( num .LE. 0 ) .AND. ( start_date .NE. current_date ) ) THEN - - found_levels = .FALSE. - - ELSE - CALL wrf_error_fatal ( & - 'No input soil level data (temperature, moisture or liquid, or all are missing). Required for LSM.' ) - END IF - - ! Is it OK to continue? - - IF ( found_levels ) THEN - - !tgs: Here are the levels that we have from the input for temperature. - - IF ( flag_soil_levels == 1 ) THEN - DO l = 1 , num_st_levels_input - zhave(l) = st_levels_input(l) / 100. - END DO - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantt : DO lwant = 1 , num_soil_layers - z_havet : DO lhave = 1 , num_st_levels_input -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - tslb(i,lwant,j)= ( st_input(i,lhave,j ) * ( zhave(lhave+1) - zs (lwant) ) + & - st_input(i,lhave+1,j) * ( zs (lwant) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havet - END IF - END DO z_havet - END DO z_wantt - - ELSE - - ! Here are the levels that we have from the input for temperature. The input levels plus - ! two more: the skin temperature at 0 cm, and the annual mean temperature at 300 cm. - - zhave(1) = 0. - DO l = 1 , num_st_levels_input - zhave(l+1) = st_levels_input(l) / 100. - END DO - zhave(num_st_levels_input+2) = 300. / 100. - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantt_2: DO lwant = 1 , num_soil_layers - z_havet_2 : DO lhave = 1 , num_st_levels_input +2 -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - tslb(i,lwant,j)= ( st_input(i,lhave ,j) * ( zhave(lhave+1) - zs (lwant) ) + & - st_input(i,lhave+1,j) * ( zs (lwant) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havet_2 - END IF - END DO z_havet_2 - END DO z_wantt_2 - - END IF - -!tgs: - IF ( flag_soil_levels == 1 ) THEN - DO l = 1 , num_sm_levels_input - zhave(l) = sm_levels_input(l) / 100. - END DO - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantm : DO lwant = 1 , num_soil_layers - z_havem : DO lhave = 1 , num_sm_levels_input -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - smois(i,lwant,j)= ( sm_input(i,lhave,j ) * ( zhave(lhave+1) - zs (lwant) ) + & - sm_input(i,lhave+1,j) * ( zs (lwant) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - if(smois(i,lwant,j)<=0.0) smois(i,lwant,j) = 0.005 - END DO - END DO - EXIT z_havem - END IF - END DO z_havem - END DO z_wantm - - ELSE - ! Here are the levels that we have from the input for moisture. The input levels plus - ! two more: a value at 0 cm and one at 300 cm. The 0 cm value is taken to be identical - ! to the most shallow layer's value. Similarly, the 300 cm value is taken to be the same - ! as the most deep layer's value. - - zhave(1) = 0. - DO l = 1 , num_sm_levels_input - zhave(l+1) = sm_levels_input(l) / 100. - END DO - zhave(num_sm_levels_input+2) = 300. / 100. - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantm_2 : DO lwant = 1 , num_soil_layers - z_havem_2 : DO lhave = 1 , num_sm_levels_input +2 -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - smois(i,lwant,j)= ( sm_input(i,lhave ,j) * ( zhave(lhave+1) - zs (lwant) ) + & - sm_input(i,lhave+1,j) * ( zs (lwant ) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - if(smois(i,lwant,j)<=0.0) smois(i,lwant,j) = 0.005 - END DO - END DO - EXIT z_havem_2 - END IF - END DO z_havem_2 - END DO z_wantm_2 - ENDIF - - ! Any liquid soil moisture to worry about? - - IF ( num_sw_levels_input .GT. 1 ) THEN - - zhave(1) = 0. - DO l = 1 , num_sw_levels_input - zhave(l+1) = sw_levels_input(l) / 100. - END DO - zhave(num_sw_levels_input+2) = 300. / 100. - - ! Interpolate between the layers we have (zhave) and those that we want (zs). - - z_wantw : DO lwant = 1 , num_soil_layers - z_havew : DO lhave = 1 , num_sw_levels_input +2 -1 - IF ( ( zs(lwant) .GE. zhave(lhave ) ) .AND. & - ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - sh2o(i,lwant,j)= ( sw_input(i,lhave ,j) * ( zhave(lhave+1) - zs (lwant) ) + & - sw_input(i,lhave+1,j) * ( zs (lwant ) - zhave(lhave) ) ) / & - ( zhave(lhave+1) - zhave(lhave) ) - END DO - END DO - EXIT z_havew - END IF - END DO z_havew - END DO z_wantw - - END IF - - - ! Over water, put in reasonable values for soil temperature and moisture. These won't be - ! used, but they will make a more continuous plot. - - IF ( flag_sst .EQ. 1 ) THEN - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( landmask(i,j) .LT. 0.5 ) THEN - DO l = 1 , num_soil_layers - tslb(i,l,j)= sst(i,j) - smois(i,l,j)= 1.0 - sh2o (i,l,j)= 1.0 - END DO - END IF - END DO - END DO - ELSE - DO j = jts , MIN(jde-1,jte) - DO i = its , MIN(ide-1,ite) - IF ( landmask(i,j) .LT. 0.5 ) THEN - DO l = 1 , num_soil_layers - tslb(i,l,j)= tsk(i,j) - smois(i,l,j)= 1.0 - sh2o (i,l,j)= 1.0 - END DO - END IF - END DO - END DO - END IF - - DEALLOCATE (zhave) - - END IF - - END SUBROUTINE init_soil_4_real -#endif - -END MODULE module_soil_pre - -#endif diff --git a/share/module_trajectory.F b/share/module_trajectory.F index 38f07d625a..8553203be0 100644 --- a/share/module_trajectory.F +++ b/share/module_trajectory.F @@ -5,36 +5,6 @@ module module_trajectory #if( EM_CORE == 1 ) use module_state_description, only : num_chem #endif -#if( NMM_CORE == 1 ) - CONTAINS - - subroutine trajectory_init( grid, config_flags, & - ims,ime, jms,jme, kms,kme ) - - use module_domain - use module_configure, only : grid_config_rec_type - -!----------------------------------------------------------------------------- -! dummy arguments -!----------------------------------------------------------------------------- - integer, intent(in) :: ims,ime, jms,jme, kms,kme - type(domain), intent(inout) :: grid - type(grid_config_rec_type), intent(in) :: config_flags - - end subroutine trajectory_init - - subroutine trajectory_driver( grid ) - - use module_domain - -!----------------------------------------------------------------------------- -! dummy arguments -!----------------------------------------------------------------------------- - type(domain), intent(in) :: grid - - end subroutine trajectory_driver - -#elif( EM_CORE == 1 ) implicit none @@ -3053,6 +3023,4 @@ subroutine UPCASE( lstring ) end subroutine UPCASE -#endif - end module module_trajectory diff --git a/share/output_wrf.F b/share/output_wrf.F index bb8da08d8e..b28eb042aa 100644 --- a/share/output_wrf.F +++ b/share/output_wrf.F @@ -345,11 +345,7 @@ SUBROUTINE output_wrf ( fid , grid , config_flags, switch , ierr ) CALL wrf_put_dom_ti_char ( fid , 'START_DATE', TRIM(start_date) , ierr ) IF ( switch .EQ. input_only) THEN CALL wrf_put_dom_ti_char ( fid , 'SIMULATION_START_DATE', TRIM(start_date) , ierr ) -#if ( HWRF == 1 ) - ELSE -#else ELSE IF ( ( switch .EQ. restart_only ) .OR. ( switch .EQ. history_only ) ) THEN -#endif CALL nl_get_simulation_start_year ( 1, simulation_start_year ) CALL nl_get_simulation_start_month ( 1, simulation_start_month ) CALL nl_get_simulation_start_day ( 1, simulation_start_day ) @@ -471,11 +467,6 @@ SUBROUTINE output_wrf ( fid , grid , config_flags, switch , ierr ) END IF #endif -#if (NMM_CORE == 1) - CALL wrf_put_dom_ti_real ( fid , 'WBD0' , grid%wbd0 , 1 , ierr ) - CALL wrf_put_dom_ti_real ( fid , 'SBD0' , grid%sbd0 , 1 , ierr ) -#endif - CALL wrf_put_dom_ti_integer( fid, 'AERCU_OPT' , config_flags%aercu_opt , 1, ierr ) CALL wrf_put_dom_ti_real ( fid, 'AERCU_FCT' , config_flags%aercu_fct , 1, ierr ) #if (EM_CORE == 1) @@ -613,9 +604,6 @@ SUBROUTINE output_wrf ( fid , grid , config_flags, switch , ierr ) #endif ! added this metadatum for H. Chuan, NCEP, 030417, JM -#if (NMM_CORE == 1) - CALL wrf_put_dom_ti_char ( fid , 'GRIDTYPE', 'E' , ierr ) -#endif #if (EM_CORE == 1) CALL wrf_put_dom_ti_char ( fid , 'GRIDTYPE', 'C' , ierr ) #endif @@ -955,11 +943,7 @@ SUBROUTINE output_wrf ( fid , grid , config_flags, switch , ierr ) CALL wrf_put_dom_ti_integer ( fid , 'ISURBAN' , config_flags%isurban , 1 , ierr ) CALL wrf_put_dom_ti_integer ( fid , 'ISOILWATER' , config_flags%isoilwater , 1 , ierr ) ! added these fields for restarting of moving nests, JM -!For HWRF: zhang -#if ( HWRF == 1 ) - CALL wrf_put_dom_ti_integer ( fid , 'I_PARENT_START' , grid%i_parent_start , 1 , ierr ) - CALL wrf_put_dom_ti_integer ( fid , 'J_PARENT_START' , grid%j_parent_start , 1 , ierr ) -#elif ! defined(EM_CORE) +#if ! defined(EM_CORE) CALL wrf_put_dom_ti_integer ( fid , 'I_PARENT_START' , config_flags%i_parent_start , 1 , ierr ) CALL wrf_put_dom_ti_integer ( fid , 'J_PARENT_START' , config_flags%j_parent_start , 1 , ierr ) #endif diff --git a/share/set_timekeeping.F b/share/set_timekeeping.F index 4aa2e64f1a..bd52b7184e 100644 --- a/share/set_timekeeping.F +++ b/share/set_timekeeping.F @@ -13,12 +13,6 @@ SUBROUTINE Setup_Timekeeping ( grid ) INTEGER :: start_year,start_month,start_day,start_hour,start_minute,start_second INTEGER :: end_year,end_month,end_day,end_hour,end_minute,end_second INTEGER :: vortex_interval -#if ( HWRF == 1 ) -!zhang's doing - real (kind=8) :: day_in_sec - REAL :: tstart -!end of zhang's doing -#endif ! #if (EM_CORE == 1) INTEGER :: dfi_fwdstop_year,dfi_fwdstop_month,dfi_fwdstop_day,dfi_fwdstop_hour,dfi_fwdstop_minute,dfi_fwdstop_second @@ -85,14 +79,6 @@ SUBROUTINE Setup_Timekeeping ( grid ) CALL nl_get_start_hour(grid%id,start_hour) CALL nl_get_start_minute(grid%id,start_minute) CALL nl_get_start_second(grid%id,start_second) -#if ( HWRF == 1 ) -!zhang's doing - check with zhan before adding this bit -! CALL nl_get_tstart ( grid%id , tstart ) -! CALL jdn_sec(day_in_sec,start_year,start_month,start_day,start_hour,start_minute,start_second) -! day_in_sec = day_in_sec + tstart*3600. -! CALL jdn_ymd_hms(day_in_sec,start_year,start_month,start_day,start_hour,start_minute,start_second) -!end of zhang's doing -#endif CALL WRFU_TimeSet(startTime, YY=start_year, MM=start_month, DD=start_day, & H=start_hour, M=start_minute, S=start_second,& rc=rc) diff --git a/share/solve_interface.F b/share/solve_interface.F index 963be141d4..e07d613f9e 100644 --- a/share/solve_interface.F +++ b/share/solve_interface.F @@ -17,9 +17,6 @@ SUBROUTINE solve_interface ( grid ) INTERFACE #if (EM_CORE == 1 && DA_CORE != 1) # include "solve_em.int" -#endif -#if (NMM_CORE == 1) -# include "solve_nmm.int" #endif END INTERFACE @@ -80,23 +77,5 @@ SUBROUTINE solve_interface ( grid ) endif # endif -#if (NMM_CORE == 1) - CALL solve_nmm ( grid , config_flags & -! -# include "actual_new_args.inc" -! - ) -# if ( WRF_CHEM == 1 ) - IF ( config_flags%chem_opt > 0 ) THEN - - CALL chem_driver ( grid , config_flags & -! -# include "actual_new_args.inc" -! - ) - ENDIF -# endif -#endif - END SUBROUTINE solve_interface diff --git a/share/start_domain.F b/share/start_domain.F index 53eb09fe5c..4a187be059 100644 --- a/share/start_domain.F +++ b/share/start_domain.F @@ -22,9 +22,6 @@ SUBROUTINE start_domain ( grid , allowed_to_read ) # include "../wrftladj/start_domain_em_tl.int" # include "../wrftladj/start_domain_em_ad.int" #endif -#if (NMM_CORE == 1) -# include "start_domain_nmm.int" -#endif #if (DA_CORE != 1) SUBROUTINE calc_ts_locations( grid ) USE module_domain @@ -69,13 +66,6 @@ END SUBROUTINE calc_track_locations #endif #endif -#if (NMM_CORE == 1) - CALL start_domain_nmm( grid, allowed_to_read & -! -# include "actual_new_args.inc" -! - ) -#endif #if (DA_CORE != 1) CALL calc_ts_locations( grid ) diff --git a/share/wrf_ext_write_field.F b/share/wrf_ext_write_field.F index eaf44bf76f..9db4f3403e 100644 --- a/share/wrf_ext_write_field.F +++ b/share/wrf_ext_write_field.F @@ -221,8 +221,7 @@ SUBROUTINE wrf_ext_write_field(DataHandle,DateStr,Var,Field,FieldType,grid, & ! TBH: "XLAT_V" for EM_CORE. We need a more general way to handle ! TBH: this, possibly via the Registry. ! TBH: TODO: Use dimnames(*) == south_north || west_east instead of -! TBH: MemoryOrder and Stagger? It would also work for both ARW -! TBH: and NMM and be easier to handle via Registry... +! TBH: MemoryOrder and Stagger? IF ( ( TRIM(MemoryOrder) == 'XY' ) .AND. & ( ( TRIM(Var) == 'XLONG' ) .OR. & diff --git a/share/wrf_timeseries.F b/share/wrf_timeseries.F index 226a070284..5021154b59 100644 --- a/share/wrf_timeseries.F +++ b/share/wrf_timeseries.F @@ -85,13 +85,8 @@ SUBROUTINE calc_ts_locations( grid ) IF (ips <= 1 .AND. 1 <= ipe .AND. & jps <= 1 .AND. 1 <= jpe) THEN -#if(NMM_CORE==1) - known_lat = grid%hlat(1,1) - known_lon = grid%hlon(1,1) -#else known_lat = grid%xlat(1,1) known_lon = grid%xlong(1,1) -#endif ELSE known_lat = 9999. known_lon = 9999. @@ -225,13 +220,8 @@ SUBROUTINE calc_ts_locations( grid ) ts_xlong = 1.E30 ts_hgt = 1.E30 ELSE -#if(NMM_CORE==1) - ts_xlat = grid%hlat(grid%itsloc(k),grid%jtsloc(k)) - ts_xlong = grid%hlon(grid%itsloc(k),grid%jtsloc(k)) -#else ts_xlat = grid%xlat(grid%itsloc(k),grid%jtsloc(k)) ts_xlong = grid%xlong(grid%itsloc(k),grid%jtsloc(k)) -#endif #if (EM_CORE == 1) ts_hgt = grid%ht(grid%itsloc(k),grid%jtsloc(k)) #endif diff --git a/test/nmm_real/namelist.input b/test/nmm_real/namelist.input deleted file mode 100644 index 34805886c8..0000000000 --- a/test/nmm_real/namelist.input +++ /dev/null @@ -1,103 +0,0 @@ - &time_control - run_days = 1, - run_hours = 0, - run_minutes = 0, - run_seconds = 0, - start_year = 2005, 2005, - start_month = 01, 01, - start_day = 23, 23, - start_hour = 00, 00, - start_minute = 00, 00, - start_second = 00, 00, - tstart = 00, - end_year = 2005, 2005, - end_month = 01, 01, - end_day = 24, 24, - end_hour = 00, 00, - end_minute = 00, 00, - end_second = 00, 00, - interval_seconds = 10800, - history_interval = 60, 60, - frames_per_outfile = 1, 1, - restart = .false., - restart_interval = 5400, - reset_simulation_start = F, - io_form_input = 2 - io_form_history = 2 - io_form_restart = 2 - io_form_boundary = 2 - io_form_auxinput1 = 2 - debug_level = 1 - / - - &domains - time_step = 34, - time_step_fract_num = 2, - time_step_fract_den = 7, - max_dom = 1, - e_we = 56, 58, - e_sn = 92, 100, - e_vert = 38, 38, - num_metgrid_levels = 40, - dx = .096, .032, - dy = .095, .031667, - p_top_requested = 5000. - ptsgm = 42000., - grid_id = 1, 2, - parent_id = 0, 1, - i_parent_start = 1, 17, - j_parent_start = 1, 31, - parent_grid_ratio = 1, 3, - parent_time_step_ratio = 1, 3, - / - - &physics - mp_physics = 5, 5, - ra_lw_physics = 99, 99, - ra_sw_physics = 99, 99, - nrads = 105, 315, - nradl = 105, 315, - co2tf = 1, - sf_sfclay_physics = 2, 2, - sf_surface_physics = 2, 2, - bl_pbl_physics = 2, 2, - nphs = 6, 18, - cu_physics = 2, 2, - ncnvc = 6, 18, - tprec = 3, 3, - theat = 6, 6, - tclod = 6, 6, - trdsw = 6, 6, - trdlw = 6, 6, - tsrfc = 6, 6, - pcpflg = .false., .false., - num_soil_layers = 4, - mp_zero_out = 0 - gwd_opt = 0 - / - - &dynamics - coac = 1.6, - codamp = 6.4, - slophc = 0.0064, - euler_adv = .true., - idtadt = 2, - idtadc = 1 - / - - &bdy_control - spec_bdy_width = 1, - specified = .true., - nested = .false. - / - - &fdda - / - - &grib2 - / - - &namelist_quilt - nio_tasks_per_group = 0, - nio_groups = 1 - / diff --git a/test/nmm_real/namelist.input.HWRF b/test/nmm_real/namelist.input.HWRF deleted file mode 100644 index 202d2b7026..0000000000 --- a/test/nmm_real/namelist.input.HWRF +++ /dev/null @@ -1,152 +0,0 @@ -! This is the new unified namelist, which includes settings for all -! wrf.exe and real_nmm.exe invocations, including 27:9, 27:9:3, ghost, -! analysis, 12hr, and 126hr. This is accomplished by using the -! HWRF stream parser to insert environment variables into the namelist. - -! Some of these settings require that the HWRF preprocessing -! system is used to generate additional input files (D2/D3 analysis) -! Please refer to the HWRF users guide at: -! -! http://www.dtcenter.org/HurrWRF/users/overview/hwrf_overview.php -! -!27:9:3non-ghostconfig - - - - &time_control - start_year = 2012, 2012, 2012, - start_month = 10, 10, 10, - start_day = 28, 28, 28, - start_hour = 06, 06, 06, - start_minute = 00, 00, 00, - start_second = 00, 00, 00, - end_year = 2012, 2012, 2012, - end_month = 10, 10, 10, - end_day = 28, 28, 28, - end_hour = 12, 12, 12, - end_minute = 00, 00, 00, - end_second = 00, 00, 00, - interval_seconds = 21600, - history_interval = 360, 360, 360, - auxhist1_interval = 360, 360, 360 - frames_per_outfile = 2,2,2 - frames_per_auxhist1 = 1,1,1 - analysis = F, T,T, - - restart = .false., - restart_interval = 36000, - reset_simulation_start = F, - io_form_input = 2 - io_form_history = 2 - io_form_restart = 2 - io_form_boundary = 2 - io_form_auxinput1 = 2 - io_form_auxhist1 = 2 - auxinput1_inname = "met_nmm.d." - debug_level = 1 - override_restart_timers = T - - / - - &fdda - / - - &domains - time_step = 45, - time_step_fract_num = 0, - time_step_fract_den = 1, - max_dom = 3, - s_we = 1, 1, 1, - e_we = 216, 88, 180, - s_sn = 1, 1, 1, - e_sn = 432, 170, 324, - s_vert = 1, 1, 1, - e_vert = 43, 43, 43, - dx = 0.18, 0.06, 0.02, - dy = 0.18, 0.06, 0.02, - grid_id = 1, 2, 3, - - tile_sz_x = 0, - tile_sz_y = 0, - numtiles = 1, - nproc_x = -1, ! must be on its own line - nproc_y = -1, ! must be on its own line - parent_id = 0, 1, 2, - parent_grid_ratio = 1, 3, 3, - parent_time_step_ratio = 1, 3, 3, - i_parent_start = 0, 00099, 14, - j_parent_start = 0, 00225, 33, - feedback = 1, - num_moves = -99 - num_metgrid_levels = 27, - num_metgrid_soil_levels = 4, - p_top_requested = 5000, - ptsgm = 42000 -eta_levels=1.0,.9919699,.9827400,.9710800,.9600599,.9462600,.9306099,.9129300,.8930600,.8708600,.8462000,.8190300,.7893100,.7570800,.7224600,.6856500,.6469100,.6066099,.5651600,.5230500,.4807700,.4388600,.3978000,.3580500,.3200099,.2840100,.2502900,.2190100,.1902600,.1640600,.1403600,.1190600,.1000500,.0831600,.0682400,.0551200,.0436200,.0335700,.0248200,.0172200,.0106300,.0049200,.0000000, - -/ - &physics - num_soil_layers = 4, - mp_physics = 85, 85, 85, - ra_lw_physics = 98, 98, 98, - ra_sw_physics = 98, 98, 98, - sf_sfclay_physics = 88, 88, 88, - sf_surface_physics = 88, 88, 88, - bl_pbl_physics = 3, 3, 3, - cu_physics = 84, 84, 0, - mommix = 1.0, 1.0, 1.0, - var_ric = 1.0, - coef_ric_l = 0.16, - coef_ric_s = 0.25, - h_diff = 1.0, 1.0, 1.0, - gwd_opt = 2, 0, 0, - sfenth = 0.0, 0.0, 0.0, - nrads = 80,240,720, - nradl = 80,240,720, - nphs = 2,6,6, - ncnvc = 2,6,6, - - ntrack = 3,6,18, - -! IMPORTANT: dt*nphs*ntrack for domain 2 and 3 must be 540 and 180, respectively -! AND the history output times (10800, 10800, 3600) must be -! divisible by dt*nphs*ntrack for domains 1, 2 and 3 - - gfs_alpha = 0.7,0.7,0.7, - sas_pgcon = 0.55,0.2,0.2, -sas_mass_flux=0.5,0.5,0.5, - co2tf = 1, -vortex_tracker=2,6,6, - -! Disable nest movement at certain intervals to prevent junk in the output files: - nomove_freq = 0.0, 6.0, 6.0, ! hours -/ - - &dynamics - non_hydrostatic = .true., .true, .true, - euler_adv = .false. - wp = 0, 0, 0, - coac = 0.75,3.0,4.0, - codamp = 6.4, 6.4, 6.4, - terrain_smoothing = 2, -/ - - &bdy_control - spec_bdy_width = 1, - specified = .true. / - - &namelist_quilt -poll_servers=.true. - nio_tasks_per_group = 4, - nio_groups = 4 / - - &logging - compute_tasks_silent=.true. - io_servers_silent=.true. - stderr_logging=1 - / - -LSF_TIME=1:30 -NQS_TIME=0:10:00 -NUM_PROCESSORS=16 - diff --git a/test/nmm_real/tomorrow b/test/nmm_real/tomorrow deleted file mode 100755 index 552acb36c8..0000000000 --- a/test/nmm_real/tomorrow +++ /dev/null @@ -1,121 +0,0 @@ -#!/bin/ksh -f - -yy=`expr $1 / 10000` -mm=`expr $1 - $yy * 10000` -mm=`expr $mm / 100` -dd=`expr $1 % 100` - - -yy=`expr $yy + 0` -mm=`expr $mm + 0` -dd=`expr $dd + 0` - -if [ $yy -lt 10 ] ; then -yy=0$yy -fi - -if [ $mm -lt 10 ] ; then -mm=0$mm -fi - -if [ $dd -lt 10 ] ; then -dd=0$dd -fi - -# exit - -if [ $mm -eq 1 -or $mm -eq 01 ] -then -mxd=31 -fi - -if [ $mm -eq 2 -o $mm -eq 02 ] -then - leap=`expr $yy % 4` - if [ $leap -eq 0 ] - then - mxd=29 - fi - if [ $leap -ne 0 ] - then - mxd=28 - fi -fi - - -if [ $mm -eq 3 -o $mm -eq 03 ] ; then -mxd=31 -fi - -if [ $mm -eq 4 -o $mm -eq 04 ] ; then -mxd=30 -fi - -if [ $mm -eq 5 -o $mm -eq 05 ] ; then -mxd=31 -fi - -if [ $mm -eq 6 -o $mm -eq 06 ] ; then -mxd=30 -fi - -if [ $mm -eq 7 -o $mm -eq 07 ] ; then -mxd=31 -fi - -if [ $mm -eq 8 -o $mm -eq 08 ] ; then -mxd=31 -fi - -if [ $mm -eq 9 -o $mm -eq 09 ] ; then -mxd=30 -fi - -if [ $mm -eq 10 ] ; then -mxd=31 -fi - -if [ $mm -eq 11 ] ; then -mxd=30 -fi - -if [ $mm -eq 12 ] ; then -mxd=31 -fi -# echo "max days in month: " $mxd -dd=`expr $dd + 1` - -# echo "new dd: " $dd - -if [ $dd -gt $mxd ] -then - mm=`expr $mm + 1` - if [ $mm -eq 13 ] - then - yy=`expr $yy + 1` - mm=1 - fi - dd=1 -fi -yy=`expr $yy + 0` -mm=`expr $mm + 0` -dd=`expr $dd + 0` - -if [ $yy -lt 10 ] ; then -yy=0$yy -fi - -if [ $mm -lt 10 ] ; then -mm=0$mm -fi - -if [ $dd -lt 10 ] ; then -dd=0$dd -fi - -# echo "now have yy mm dd: " $yy $mm $dd - -ymd=${yy}${mm}${dd} - -echo $ymd - diff --git a/test/nmm_tropical_cyclone/README.NMM.TROPICAL_CYCLONE b/test/nmm_tropical_cyclone/README.NMM.TROPICAL_CYCLONE deleted file mode 100644 index 177cb8a7d0..0000000000 --- a/test/nmm_tropical_cyclone/README.NMM.TROPICAL_CYCLONE +++ /dev/null @@ -1,37 +0,0 @@ -README.Idealized_HWRF -Last updated: Nov 2016 - -This README file provides a short overview of the HWRF idealized tropical cyclone test case. For details, please refer to the HWRF user’s guide and scientific documentation at http://www.dtcenter.org/HurrWRF/users/docs/index.php. - - -Initial conditions are specified using an idealized vortex superposed on a base state quiescent sounding. The initial base state temperature and humidity profile is prescribed in file sound.d, while the vortex properties are specified in input.d. - - -The default initial vortex has an intensity of 20 m/s and a radius of maximum wind of 90 km. To initialize the idealized vortex, the nonlinear balance equation in the pressure-based sigma coordinate system described in Wang (1995), and reported in Bao et al. (2012) and Gopalakrishnan et al. (2011 and 2013), is solved within the rotated latitude–longitude E-grid framework. - - -The default initial ambient base state assumes a f-plane at the latitude of 12.5 deg. Options for f-plane and beta-plane can be found in namelist file input.d. The sea surface temperature is time-invariant and horizontally homogeneous, with the default set to 302K. No land is used in the simulation domain. - - -The lateral boundary conditions used in the HWRF idealized simulation are the same as used in real data cases. This inevitably leads to some reflection when gravity waves emanating from the vortex reach the outer domain lateral boundaries. - -The landfalling option is selected in the namelist file land.nml. The default is to NOT include landfall. The land strip can be configured to move underneath of the idealized storm (which remains centered), either east-to-west or west-to-east. The landfall option must be used with the GFDL slab land surface model. - -The idealized simulation is configured for the operational HWRF triple nested domain configuration with grid spacing at 18-, 6-, and 2-km. All the operational atmospheric physics, as well as the supported experimental physics options in HWRF, can be used in the idealized HWRF framework. - - - - -References - - -J.-W. Bao, S. G. Gopalakrishnan, S. A. Michelson, F. D. Marks, and M. T. Montgomery,2012:Impact of physics representations in the HWRFX on simulated hurricane structure and pressure–wind relationships. Mon. Wea. Rev., 140, 3278-3299 - - -Gopalakrishnan, S. G., F. Marks, X. Zhang, J.-W. Bao, K.-S. Yeh, and R. Atlas, 2011: The experimental HWRF System: a study on the influence of horizontal resolution on the structure and intensity changes in tropical cyclones using an idealized framework. Mon. Wea. Rev., 139, 1762–1784. - - -Gopalakrishnan, S. G., F. Marks, J. A. Zhang, X. Zhang, J.-W. Bao, and V. Tallapragada, 2013: A study of the impacts of vertical diffusion on the structure and intensity of the tropical Cyclones using the high-resolution HWRF system. J. Atmos. Sci., 70, 524–541. - - -Wang, Y., 1995: An inverse balance equation in sigma coordinates for model initialization. Mon. Wea. Rev., 123, 482–488. diff --git a/test/nmm_tropical_cyclone/input.d b/test/nmm_tropical_cyclone/input.d deleted file mode 100644 index 09bcfe04db..0000000000 --- a/test/nmm_tropical_cyclone/input.d +++ /dev/null @@ -1,4 +0,0 @@ -0------------indx=0 on f-plane, 1 on beta-plane - 0-----------nenv: index for environ. - 20.0--------vm0: maximum tangential wind of the initial vortex (m/s) - 90.0--------rm0: radius of maximum wind of the initial vortex (km) diff --git a/test/nmm_tropical_cyclone/land.nml b/test/nmm_tropical_cyclone/land.nml deleted file mode 100644 index 81193c80d8..0000000000 --- a/test/nmm_tropical_cyclone/land.nml +++ /dev/null @@ -1,22 +0,0 @@ -&init_land -mvland = .false. !true=land or false=only ocean -imin = 260 !setup the land strip for motion -imax = 288 -jmin = 0 -jmax = 576 -logic_temp = .false. !true=initial surface temperature thru s_temp. false=default (first level tmp) -s_temp = 308.0 !initial surface temperature for the land strip -VEG_ID = 19 !land surface vegetaion parameter ID. refer VEGPARM.TBL -SOIL_ID = 1 !land surface soil parameter ID. refer SOILPARM.TBL -/ - -¶m_land -DIRN = 1 !1=W-E direction, 2=E-W direction -VEG_ID = 19 !same as above. Has to be set. Do not leave it blank -SOIL_ID = 1 !same as above. Has to be set. Do not leave it blank -land_emiss = 0.90 !emissivity for radiation phys. Refer VEGPARM.TBL for indicative values (0-1) -land_albedo = 0.25 !albedo for radiation physics. Refer VEGPARM.TBL for indicative values (0-1) -land_vgfrac = 0.20 !vegetation fraction (0-0.99) -land_z0 = 0.01 !surface roughness. Refer VEGPARM.TBL -land_smc = 0.02 !soil moisture. Refer SOILPARM.TBL -/ diff --git a/test/nmm_tropical_cyclone/namelist.input b/test/nmm_tropical_cyclone/namelist.input deleted file mode 100644 index 8e0e547260..0000000000 --- a/test/nmm_tropical_cyclone/namelist.input +++ /dev/null @@ -1,143 +0,0 @@ -&time_control - start_year = 2012, 2012, 2012, - start_month = 10, 10, 10, - start_day = 26, 26, 26, - start_hour = 12, 12, 12, - start_minute = 00, 00, 00, - start_second = 00, 00, 00, - end_year = 2012, 2012, 2012, - end_month = 10, 10, 10, - end_day = 31, 31, 31, - end_hour = 12, 12, 12, - end_minute = 00, 00, 00, - end_second = 00, 00, 00, - interval_seconds = 432000, - history_interval = 180, 180, 180, - auxhist1_interval = 600000, 600000, 600000 - frames_per_outfile = 1,1,1 - frames_per_auxhist1 = 1,1,1 - analysis = F, F,F , - restart = .false., - restart_interval = 36000, - reset_simulation_start = F, - io_form_input = 2 - io_form_history = 2 - io_form_restart = 2 - io_form_boundary = 2 - io_form_auxinput1 = 2 - io_form_auxhist1 = 2 - auxinput1_inname = "met_nmm.d.", - debug_level = 1, - nocolons = T, -/ - -&fdda - -/ - -&domains - time_step = 30, - time_step_fract_num = 0, - time_step_fract_den = 1, - max_dom = 3, - s_we = 1, 1, 1, - e_we = 288, 265, 235, - s_sn = 1, 1, 1, - e_sn = 576, 532, 472, - s_vert = 1, 1, 1, - e_vert = 75, 75, 75, - dx = 0.135, 0.045, 0.015, - dy = 0.135, 0.045, 0.015, - grid_id = 1, 2, 3, - tile_sz_x = 0, - tile_sz_y = 0, - numtiles = 1, - nproc_x = -1, - nproc_y = -1, - parent_id = 0, 1, 2, - parent_grid_ratio = 1, 3, 3, - parent_time_step_ratio = 1, 3, 3, - i_parent_start = 0, 99, 93, - j_parent_start = 0, 195, 187, - feedback = 1, - num_moves = -99, - num_metgrid_levels = 22, - p_top_requested = 1000.0, - ptsgm = 15000.0, - eta_levels = 1.0, 0.997622, 0.995078, 0.99224, 0.989036, 0.98544, 0.981451, 0.977061, 0.972249, 0.966994, 0.96128, 0.955106, 0.948462, 0.941306, 0.933562, 0.925134, 0.915937, 0.90589, 0.894913, 0.882926, 0.869842, 0.855646, 0.840183, 0.823383, 0.805217, 0.785767, 0.7651, 0.7432, 0.720133, 0.695967, 0.670867, 0.645033, 0.6187, 0.592067, 0.565333, 0.538733, 0.5125, 0.4868, 0.461767, 0.437533, 0.4142, 0.391767, 0.370233, 0.3496, 0.329867, 0.310967, 0.292867, 0.275533, 0.258933, 0.243, 0.2277, 0.213, 0.198867, 0.1853, 0.172267, 0.159733, 0.147633, 0.135967, 0.124767, 0.114033, 0.103733, 0.093867, 0.0844, 0.075333, 0.0666, 0.058267, 0.050333, 0.042833, 0.035733, 0.029, 0.0226, 0.0165, 0.010733, 0.005267, 0.0, - use_prep_hybrid = F, - num_metgrid_soil_levels = 4, - corral_x = 9, 9, 9, - corral_y = 18, 18, 18, - smooth_option = 0, -/ - -&physics - num_soil_layers = 4, - mp_physics = 5, 5, 5, - ra_lw_physics = 4, 4, 4, - ra_sw_physics = 4, 4, 4, - sf_sfclay_physics = 88, 88, 88, - sf_surface_physics = 2, 2, 2, - bl_pbl_physics = 3, 3, 3, - cu_physics = 4, 4, 4, - mommix = 1.0, 1.0, 1.0, - var_ric = 1.0, - coef_ric_l = 0.16, - coef_ric_s = 0.25, - h_diff = 1.0, 1.0, 1.0, - gwd_opt = 2, 0, 0, - sfenth = 0.0, 0.0, 0.0, - nrads = 30, 90, 270, - nradl = 30, 90, 270, - nphs = 2, 6, 6, - ncnvc = 2, 6, 6, - ntrack = 6, 6, 18, - gfs_alpha = -1.0, -1.0, -1.0, - sas_pgcon = 0.55, 0.2, 0.2, - sas_mass_flux = 0.5, 0.5, 0.5, - co2tf = 1, - vortex_tracker = 2, 2, 7, - nomove_freq = 0, 6, 6, - tg_option = 1, - ntornado = 2, 6, 18, - ens_cdamp = 0.2, - ens_pblamp = 0.2, - ens_random_seed = 99, - ens_sasamp = 50.0, - icloud = 3, - icoef_sf = 6, 6, 6, - iwavecpl = 0, 0, 0, - lcurr_sf = F, F, F, - pert_cd = F, - pert_pbl = F, - pert_sas = F, -/ - -&dynamics - non_hydrostatic = T, T, T, - euler_adv = F, - wp = 0, 0, 0, - coac = 0.75, 1.0, 1.2, - codamp = 6.4, 6.4, 6.4, - terrain_smoothing = 2, - dwdt_damping_lev = 2000.0, 2000.0, 2000.0, -/ - -&bdy_control - spec_bdy_width = 1, - specified = T, -/ - -&namelist_quilt - poll_servers = T, - nio_tasks_per_group = 4, 4, 4, - nio_groups = 1, -/ - -&logging - compute_tasks_silent = T, - io_servers_silent = T, - stderr_logging = 0, -/ - diff --git a/test/nmm_tropical_cyclone/namelist.wps b/test/nmm_tropical_cyclone/namelist.wps deleted file mode 100644 index e200bd6bfe..0000000000 --- a/test/nmm_tropical_cyclone/namelist.wps +++ /dev/null @@ -1,53 +0,0 @@ -&share - wrf_core = 'NMM', - max_dom = 3, - start_date = '2012-10-26_12:00:00', - end_date = '2012-10-31_12:00:00', - interval_seconds = 432000 - io_form_geogrid = 2, - nocolons = T, -/ - -&geogrid - parent_id = 1, 1, 2, - parent_grid_ratio = 1, 3, 3, - i_parent_start = 1, 10, 10, - j_parent_start = 1, 10, 10, - e_we = 288, 265, 235, - e_sn = 576, 532, 472, - geog_data_res = "2m", "2m", "2m", - dx = 0.135, - dy = 0.135, - map_proj = "rotated_ll", - ref_lat = 21.0, - ref_lon = 287.250, - stand_lon = 287.250, - geog_data_path = '/glade/p/ral/jnt/tools/geog/' - opt_geogrid_tbl_path = "./", -/ - -&ungrib - out_format = 'WPS', - prefix = 'GFS', -/ - -&metgrid - fg_name = 'new_GFS', - io_form_metgrid = 2, - opt_metgrid_tbl_path = "./", -/ - -&mod_levs - press_pa = 201300 , 200100 , 100000 , - 95000 , 90000 , - 85000 , 80000 , - 75000 , 70000 , - 65000 , 60000 , - 55000 , 50000 , - 45000 , 40000 , - 35000 , 30000 , - 25000 , 20000 , - 15000 , 10000 , - 5000 , 1000 -/ - diff --git a/test/nmm_tropical_cyclone/sigma.d b/test/nmm_tropical_cyclone/sigma.d deleted file mode 100644 index e23d671b6d..0000000000 --- a/test/nmm_tropical_cyclone/sigma.d +++ /dev/null @@ -1,23 +0,0 @@ - 1 0.000000 - 2 8.9188218E-03 - 3 4.8558116E-02 - 4 9.8107219E-02 - 5 0.1476563 - 6 0.1972054 - 7 0.2467545 - 8 0.2963036 - 9 0.3458527 - 10 0.3954018 - 11 0.4449509 - 12 0.4945000 - 13 0.5440491 - 14 0.5935982 - 15 0.6431473 - 16 0.6926965 - 17 0.7422456 - 18 0.7917947 - 19 0.8413438 - 20 0.8908929 - 21 0.9404420 - 22 0.9899911 - 23 1.000000 diff --git a/test/nmm_tropical_cyclone/sound.d b/test/nmm_tropical_cyclone/sound.d deleted file mode 100644 index 71ca69a0aa..0000000000 --- a/test/nmm_tropical_cyclone/sound.d +++ /dev/null @@ -1,30 +0,0 @@ - 01.0 -30.00 00.0 - 10.0 -30.00 00.0 - 30.0 -40.00 00.0 - 40.0 -46.00 00.0 - 50.0 -52.00 00.0 - 60.0 -58.00 02.0 - 70.0 -64.00 05.0 - 80.0 -69.40 10.0 - 100.0 -72.70 15.0 - 125.0 -71.90 20.0 - 150.0 -67.60 25.0 - 175.0 -61.20 28.0 - 200.0 -55.40 32.0 - 250.0 -43.40 34.0 - 300.0 -33.40 36.0 - 350.0 -24.90 40.0 - 400.0 -17.80 45.0 - 450.0 -12.00 50.0 - 500.0 -7.10 55.0 - 550.0 -2.70 60.0 - 600.0 1.30 65.0 - 650.0 5.00 70.0 - 700.0 8.60 73.0 - 750.0 11.80 76.0 - 800.0 14.70 79.0 - 850.0 17.40 82.0 - 900.0 20.20 85.0 - 950.0 23.10 85.0 - 1000.0 26.10 86.0 - 1010.1 27.00 86.0 diff --git a/test/nmm_tropical_cyclone/sound_gfdl.d b/test/nmm_tropical_cyclone/sound_gfdl.d deleted file mode 100644 index 361f449712..0000000000 --- a/test/nmm_tropical_cyclone/sound_gfdl.d +++ /dev/null @@ -1,30 +0,0 @@ - 01.0 -30.00 00.0 - 10.0 -33.24 00.0 - 30.0 -40.00 00.0 - 40.0 -46.00 00.0 - 50.0 -63.75 00.0 - 60.0 -58.00 02.0 - 70.0 -64.00 05.0 - 80.0 -70.00 10.0 - 100.0 -69.15 15.0 - 125.0 -75.10 20.0 - 150.0 -62.95 25.0 - 175.0 -60.40 28.0 - 200.0 -54.35 32.0 - 250.0 -45.05 34.0 - 300.0 -36.35 36.0 - 350.0 -28.25 40.0 - 400.0 -21.45 45.0 - 450.0 -15.14 50.0 - 500.0 -10.15 55.0 - 550.0 -5.45 60.0 - 600.0 -1.45 65.0 - 650.0 1.93 70.0 - 700.0 4.95 73.0 - 750.0 7.65 76.0 - 800.0 10.35 79.0 - 850.0 13.25 82.0 - 900.0 16.45 85.0 - 950.0 20.25 85.0 - 1000.0 24.45 86.0 - 1010.1 27.85 86.0 diff --git a/test/nmm_tropical_cyclone/sound_jordan.d b/test/nmm_tropical_cyclone/sound_jordan.d deleted file mode 100644 index 2dd584a510..0000000000 --- a/test/nmm_tropical_cyclone/sound_jordan.d +++ /dev/null @@ -1,30 +0,0 @@ - 01.0 -30.00 00.0 - 10.0 -30.00 00.0 - 30.0 -40.00 00.0 - 40.0 -46.00 00.0 - 50.0 -52.00 00.0 - 60.0 -58.00 02.0 - 70.0 -64.00 05.0 - 80.0 -70.00 10.0 - 100.0 -78.80 15.0 - 125.0 -75.10 20.0 - 150.0 -67.80 25.0 - 175.0 -60.40 28.0 - 200.0 -53.50 32.0 - 250.0 -41.40 34.0 - 300.0 -31.30 36.0 - 350.0 -22.90 40.0 - 400.0 -16.00 45.0 - 450.0 -10.50 50.0 - 500.0 -5.80 55.0 - 550.0 -1.60 60.0 - 600.0 2.30 65.0 - 650.0 6.20 70.0 - 700.0 9.90 73.0 - 750.0 12.90 76.0 - 800.0 15.40 79.0 - 850.0 18.10 82.0 - 900.0 20.70 85.0 - 950.0 23.70 85.0 - 1000.0 26.50 86.0 - 1010.1 27.00 86.0 diff --git a/test/nmm_tropical_cyclone/sound_wet.d b/test/nmm_tropical_cyclone/sound_wet.d deleted file mode 100644 index 8ecbdb7f5d..0000000000 --- a/test/nmm_tropical_cyclone/sound_wet.d +++ /dev/null @@ -1,30 +0,0 @@ - 01.0 -30.00 00.0 - 10.0 -30.00 00.0 - 30.0 -40.00 00.0 - 40.0 -46.00 00.0 - 50.0 -52.00 00.0 - 60.0 -58.00 02.0 - 70.0 -64.00 05.0 - 80.0 -69.40 20.0 - 100.0 -72.70 25.0 - 125.0 -71.90 30.0 - 150.0 -67.60 35.0 - 175.0 -61.20 38.0 - 200.0 -55.40 42.0 - 250.0 -43.40 44.0 - 300.0 -33.40 46.0 - 350.0 -24.90 50.0 - 400.0 -17.80 55.0 - 450.0 -12.00 60.0 - 500.0 -7.10 65.0 - 550.0 -2.70 70.0 - 600.0 1.30 75.0 - 650.0 5.00 80.0 - 700.0 8.60 83.0 - 750.0 11.80 86.0 - 800.0 14.70 89.0 - 850.0 17.40 92.0 - 900.0 20.20 95.0 - 950.0 23.10 95.0 - 1000.0 26.10 96.0 - 1010.1 27.00 96.0 diff --git a/test/nmm_tropical_cyclone/storm.center b/test/nmm_tropical_cyclone/storm.center deleted file mode 100644 index c4745469f8..0000000000 --- a/test/nmm_tropical_cyclone/storm.center +++ /dev/null @@ -1,2 +0,0 @@ -14.32 --67.82 diff --git a/var/build/depend.txt b/var/build/depend.txt index a5a400575e..19d298b7e9 100644 --- a/var/build/depend.txt +++ b/var/build/depend.txt @@ -46,7 +46,7 @@ module_internal_header_util.o : module_internal_header_util.F module_interp_fcn.o : module_interp_fcn.F module_io.o : module_io.F md_calls.inc module_driver_constants.o module_dm.o module_streams.o module_state_description.o module_configure.o module_io_domain.o : module_io_domain.F module_utility.o module_state_description.o module_domain.o module_configure.o module_io_wrf.o module_io.o -module_io_quilt.o : module_io_quilt.F module_io_quilt_new.F module_io_quilt_old.F module_quilt_outbuf_ops.o module_state_description.o module_dm.o module_configure.o module_timing.o module_internal_header_util.o +module_io_quilt.o : module_io_quilt.F module_io_quilt_old.F module_quilt_outbuf_ops.o module_state_description.o module_dm.o module_configure.o module_timing.o module_internal_header_util.o module_io_wrf.o : module_io_wrf.F module_streams.o module_date_time.o module_wrf_error.o module_llxy.o : module_llxy.F module_wrf_error.o module_machine.o : module_machine.F module_driver_constants.o