From 0eca9b525487b5363df155e5a326de826d6e4274 Mon Sep 17 00:00:00 2001 From: Raffaele Montuoro Date: Fri, 9 Sep 2022 11:25:50 -0400 Subject: [PATCH 1/2] Restore link to CMAQ authoritative repository (#8) * Handle conflict with FMS mosaic_mod module. * Remove unnecessary ESMF linking dependencies. --- .gitmodules | 4 ++-- CMakeLists.txt | 12 ++++++++++-- src/model/CMAQ | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.gitmodules b/.gitmodules index 44875080..b13c4868 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "src/model/CMAQ"] path = src/model/CMAQ - url = https://github.com/NOAA-EMC/CMAQ - branch = dev/emc + url = https://github.com/USEPA/CMAQ + branch = 5.2.1 diff --git a/CMakeLists.txt b/CMakeLists.txt index 35b9e6f7..5fe78d86 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,8 @@ target_include_directories(drv PRIVATE $ $) target_compile_definitions(drv PUBLIC verbose_driver) -target_link_libraries(drv PRIVATE shr CCTM esmf) +#target_link_libraries(drv PRIVATE shr CCTM esmf) +target_link_libraries(drv PRIVATE shr CCTM) # src/io/aqmio add_library(aqmio OBJECT ${aqm_aqmio_files}) @@ -86,6 +87,8 @@ target_compile_definitions(CCTM PUBLIC SUBST_FILES_ID="FILES_CTM.EXT" SUBST_BARRIER=NOOP_BARRIER SUBST_SUBGRID_INDEX=NOOP_SUBGRID_INDEX EDDYX=DUMMY_EDDYX + MOSAIC_MOD=MOSAIC_MODULE + Mosaic_Mod=Mosaic_Module OPCONC=DUMMY_OPCONC OPACONC=DUMMY_OPACONC OPWDEP=DUMMY_OPWDEP @@ -94,7 +97,6 @@ target_compile_definitions(CCTM PUBLIC SUBST_FILES_ID="FILES_CTM.EXT" verbose_gas mpas _AQM_) -target_link_libraries(CCTM PRIVATE esmf) # AQM add_library(aqm STATIC ${aqm_files} $ @@ -103,6 +105,12 @@ add_library(aqm STATIC ${aqm_files} $ $ $) set_target_properties(aqm PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod) +add_custom_target(aqm_mosaic + COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_BINARY_DIR}/mod/mosaic_module.mod + ${CMAKE_CURRENT_BINARY_DIR}/mod/mosaic_mod.mod + ) +add_dependencies(aqm aqm_mosaic) add_library(aqm::aqm ALIAS aqm) target_include_directories(aqm PUBLIC $ $) diff --git a/src/model/CMAQ b/src/model/CMAQ index b82dc06e..be5d28fd 160000 --- a/src/model/CMAQ +++ b/src/model/CMAQ @@ -1 +1 @@ -Subproject commit b82dc06e573efabb67f6d7938c20adfb9b45d3d2 +Subproject commit be5d28fd1b60522e6fc98aefeead20e6aac3530b From d7916abff01fe44859c6ec307bafb2426ca3f632 Mon Sep 17 00:00:00 2001 From: Barry Baker Date: Thu, 15 Sep 2022 21:44:20 -0400 Subject: [PATCH 2/2] Adding Fengsha dust emission scheme (#6) * adding ASX data module --- aqm_files.cmake | 4 +- examples/aqm.rc | 16 + src/model/Makefile.am | 63 +- src/model/Makefile.in | 96 +-- src/model/src/ASX_DATA_MOD.F | 1464 ++++++++++++++++++++++++++++++++ src/model/src/DUST_EMIS.F | 1527 ++++++++++++++++++++++++++++++++++ src/shr/aqm_config_mod.F90 | 19 +- src/shr/aqm_emis_mod.F90 | 7 + src/shr/aqm_methods.F90 | 62 +- 9 files changed, 3172 insertions(+), 86 deletions(-) create mode 100755 src/model/src/ASX_DATA_MOD.F create mode 100644 src/model/src/DUST_EMIS.F diff --git a/aqm_files.cmake b/aqm_files.cmake index c3f7420c..bba274bc 100644 --- a/aqm_files.cmake +++ b/aqm_files.cmake @@ -130,7 +130,6 @@ list(APPEND aqm_CCTM_files ${EMIS}/BEIS_DEFN.F ${EMIS}/BIOG_EMIS.F ${EMIS}/cropcal.F - ${EMIS}/DUST_EMIS.F ${EMIS}/EMIS_DEFN.F ${EMIS}/LTNG_DEFN.F ${EMIS}/LUS_DEFN.F @@ -215,7 +214,6 @@ list(APPEND aqm_CCTM_files ${UTIL}/subhdomain.F ${UTIL}/UTILIO_DEFN.F ${VDIFF}/aero_sedv.F - ${VDIFF}/ASX_DATA_MOD.F ${VDIFF}/conv_cgrid.F ${VDIFF}/matrix1.F ${VDIFF}/opddep.F @@ -231,4 +229,6 @@ list(APPEND aqm_CCTM_files ${localCCTM}/vdiffacmx.F ${localCCTM}/PTMAP.F ${localCCTM}/PT3D_DEFN.F + ${localCCTM}/ASX_DATA_MOD.F + ${localCCTM}/DUST_EMIS.F ) diff --git a/examples/aqm.rc b/examples/aqm.rc index e7e018c7..b09c9e5f 100644 --- a/examples/aqm.rc +++ b/examples/aqm.rc @@ -55,6 +55,20 @@ ctm_aod: true # Compute and export PM2.5 mode fractions as diagnostic tracers ctm_pmdiag: true +# +# Fengsha Dust Emission Option +# +fengsha_yn: true + +fengsha_format: netcdf + +fengsha_file: /scratch1/RDARCH/rda-arl-gpu/Barry.Baker/emissions/nexus/FENGSHA/FENGSHA_FILES.nc + +fengsha_species:: + clayf 1.00000 clayf 1 + sandf 1.00000 sandf 1 + drag 1.00000 drag 1 + uthr 1.00000 uthr 1 # # Input emissions @@ -194,3 +208,5 @@ myemis_species:: SESQ TOLU :: + + diff --git a/src/model/Makefile.am b/src/model/Makefile.am index 61c4887b..280d509c 100644 --- a/src/model/Makefile.am +++ b/src/model/Makefile.am @@ -79,7 +79,6 @@ libCCTM_a_SOURCES += \ $(EMIS)/BEIS_DEFN.F \ $(EMIS)/BIOG_EMIS.F \ $(EMIS)/cropcal.F \ - $(EMIS)/DUST_EMIS.F \ $(EMIS)/EMIS_DEFN.F \ $(EMIS)/LTNG_DEFN.F \ $(EMIS)/LUS_DEFN.F \ @@ -223,7 +222,6 @@ VDIFF = $(CCTM)/vdiff/acm2 libVDIFF = $(VDIFF)/$(libCCTM)- libCCTM_a_SOURCES += \ $(VDIFF)/aero_sedv.F \ - $(VDIFF)/ASX_DATA_MOD.F \ $(VDIFF)/conv_cgrid.F \ $(VDIFF)/matrix1.F \ $(VDIFF)/opddep.F \ @@ -242,7 +240,10 @@ libCCTM_a_SOURCES += \ $(localCCTM)/o3totcol.f \ $(localCCTM)/vdiffacmx.F \ $(localCCTM)/PTMAP.F \ - $(localCCTM)/PT3D_DEFN.F + $(localCCTM)/PT3D_DEFN.F \ + $(localCCTM)/ASX_DATA_MOD.F \ + $(localCCTM)/DUST_EMIS.F + libCCTM_a_CPPFLAGS = -DSUBST_FILES_ID=\"FILES_CTM.EXT\" @@ -289,7 +290,7 @@ $(libAERO)AERO_DATA.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libAERO)aero_depv.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libAERO)AERO_DATA.$(OBJEXT) $(libAERO)AEROMET_DATA.$(OBJEXT) \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) \ $(libDEPV)MOSAIC_MOD.$(OBJEXT) $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) @@ -301,8 +302,8 @@ $(libAERO)aero_driver.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) $(libAERO)SOA_DEFN.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libAERO)AERO_EMIS.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libAERO)AERO_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ - $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libEMIS)DUST_EMIS.$(OBJEXT) \ + $(libAERO)AERO_DATA.$(OBJEXT) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ + $(libSPCS)CGRID_SPCS.$(OBJEXT) $(liblocalCCTM)DUST_EMIS.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libAERO)PRECURSOR_DATA.$(OBJEXT) \ $(liblocalCCTM)PT3D_DEFN.$(OBJEXT) $(liblocalCCTM)PTMAP.$(OBJEXT) \ $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) $(libEMIS)SSEMIS.$(OBJEXT) \ @@ -318,7 +319,7 @@ $(libAERO)aero_subs.$(OBJEXT) : $(ICL)/const/CONST.EXT $(AERO)/isrpia.inc \ $(libAERO)AOD_DEFN.$(OBJEXT) $(libAERO)PRECURSOR_DATA.$(OBJEXT) \ $(libAERO)SOA_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libAERO)AOD_DEFN.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(libAERO)AERO_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ + $(libAERO)AERO_DATA.$(OBJEXT) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libAERO)getpar.$(OBJEXT) : \ @@ -347,11 +348,11 @@ $(libAERO)SOA_DEFN.$(OBJEXT) : \ # biog $(libBIOG)beis3.$(OBJEXT) : \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) $(libBIOG)czangle.$(OBJEXT) : $(ICL)/const/CONST.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libBIOG)hrno.$(OBJEXT) : \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) \ $(libSTENEX)noop_modules.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libBIOG)parsline.$(OBJEXT) : \ @@ -368,7 +369,7 @@ $(libCLOUD)hlconst.$(OBJEXT) : \ # depv $(libDEPV)ABFLUX_MOD.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) \ $(libDEPV)MOSAIC_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ @@ -378,7 +379,7 @@ $(libDEPV)cgrid_depv.$(OBJEXT) : \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)DEPV_DEFN.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libDEPV)DEPVVARS.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) \ $(libDEPV)MOSAIC_MOD.$(OBJEXT) $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) \ @@ -387,13 +388,13 @@ $(libDEPV)gas_depv_map.$(OBJEXT) : \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libDEPV)DEPVVARS.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)HGSIM.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ $(libDEPV)DEPVVARS.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libDEPV)LSM_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)MOSAIC_MOD.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libDEPV)LSM_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)opdepv_diag.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libDEPV)DEPVVARS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ @@ -405,7 +406,7 @@ $(libDEPV)opdepv_fst.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libDEPV)DEPVVARS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libDEPV)LSM_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)m3dry.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(libDEPV)ABFLUX_MOD.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ + $(libDEPV)ABFLUX_MOD.$(OBJEXT) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ $(libDEPV)BIDI_MOD.$(OBJEXT) $(libDEPV)DEPVVARS.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libDEPV)HGSIM.$(OBJEXT) \ $(libDEPV)LSM_MOD.$(OBJEXT) $(libDEPV)MOSAIC_MOD.$(OBJEXT) \ @@ -420,13 +421,9 @@ $(libEMIS)BIOG_EMIS.$(OBJEXT) : \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)cropcal.$(OBJEXT) : \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) -$(libEMIS)DUST_EMIS.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libAERO)AERO_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ - $(libGRID)GRID_CONF.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ - $(libEMIS)LUS_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)EMIS_DEFN.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ $(libAERO)AERO_DATA.$(OBJEXT) $(libAERO)AERO_EMIS.$(OBJEXT) \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BEIS_DEFN.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BEIS_DEFN.$(OBJEXT) \ $(libEMIS)BIOG_EMIS.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libDEPV)DEPV_DEFN.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libEMIS)LTNG_DEFN.$(OBJEXT) $(libEMIS)MGEMIS.$(OBJEXT) \ @@ -439,7 +436,7 @@ $(libEMIS)LTNG_DEFN.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libEMIS)LUS_DEFN.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)MGEMIS.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libAERO)AEROMET_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ + $(libAERO)AEROMET_DATA.$(OBJEXT) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libGRID)PCGRID_DEFN.$(OBJEXT) \ $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) @@ -452,7 +449,7 @@ $(libEMIS)PTBILIN.$(OBJEXT) : \ $(libEMIS)UDTYPES.$(OBJEXT) $(libGRID)VGRD_DEFN.$(OBJEXT) $(libEMIS)SSEMIS.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libAERO)AERO_DATA.$(OBJEXT) $(libAERO)AEROMET_DATA.$(OBJEXT) \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libSTENEX)noop_modules.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)STK_EMIS.$(OBJEXT) : \ @@ -461,7 +458,7 @@ $(libEMIS)STK_PRMS.$(OBJEXT) : \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libEMIS)UDTYPES.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)tfabove.$(OBJEXT) : \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libEMIS)LUS_DEFN.$(OBJEXT) $(libEMIS)tfbelow.$(OBJEXT) : \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libEMIS)LUS_DEFN.$(OBJEXT) \ @@ -620,12 +617,8 @@ $(libUTIL)subhdomain.$(OBJEXT) : \ # vdiff $(libVDIFF)aero_sedv.$(OBJEXT) : \ $(libAERO)AERO_DATA.$(OBJEXT) $(libAERO)AEROMET_DATA.$(OBJEXT) \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) -$(libVDIFF)ASX_DATA_MOD.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT $(ICL)/mpi/PE_COMM.EXT \ - $(libDEPV)DEPVVARS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ - $(libDEPV)LSM_MOD.$(OBJEXT) $(libSTENEX)noop_modules.$(OBJEXT) \ - $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libVDIFF)conv_cgrid.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) @@ -645,7 +638,7 @@ $(libVDIFF)rddepv.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libVDIFF)SEDIMENTATION.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) \ $(libVDIFF)VDIFF_DIAG.$(OBJEXT) $(libVDIFF)VDIFF_MAP.$(OBJEXT) $(libVDIFF)tri.$(OBJEXT) : \ @@ -657,7 +650,7 @@ $(libVDIFF)VDIFF_MAP.$(OBJEXT) : $(ICL)/emctrl/EMISPRM.EXT \ $(libAERO)AERO_EMIS.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libVDIFF)vdiffproc.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libDEPV)DEPV_DEFN.$(OBJEXT) \ $(libEMIS)EMIS_DEFN.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libDEPV)HGSIM.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) \ @@ -669,7 +662,7 @@ $(libVDIFF)vdiffproc.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(liblocalCCTM)o3totcol.$(OBJEXT) : \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(liblocalCCTM)vdiffacmx.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libDEPV)DEPV_DEFN.$(OBJEXT) $(libEMIS)EMIS_DEFN.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) \ $(libVDIFF)VDIFF_MAP.$(OBJEXT) @@ -679,3 +672,11 @@ $(liblocalCCTM)PT3D_DEFN.$(OBJEXT) : $(libAERO)AERO_DATA.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(liblocalCCTM)PTMAP.$(OBJEXT) $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) \ $(libEMIS)STK_EMIS.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) +$(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT $(ICL)/mpi/PE_COMM.EXT \ + $(libDEPV)DEPVVARS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ + $(libDEPV)LSM_MOD.$(OBJEXT) $(libSTENEX)noop_modules.$(OBJEXT) \ + $(libUTIL)UTILIO_DEFN.$(OBJEXT) +$(liblocalCCTM)DUST_EMIS.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ + $(libAERO)AERO_DATA.$(OBJEXT) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ + $(libGRID)GRID_CONF.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ + $(libEMIS)LUS_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) diff --git a/src/model/Makefile.in b/src/model/Makefile.in index 0c12a885..42b6fd24 100644 --- a/src/model/Makefile.in +++ b/src/model/Makefile.in @@ -143,7 +143,6 @@ am_libCCTM_a_OBJECTS = $(AERO)/libCCTM_a-AERO_DATA.$(OBJEXT) \ $(EMIS)/libCCTM_a-BEIS_DEFN.$(OBJEXT) \ $(EMIS)/libCCTM_a-BIOG_EMIS.$(OBJEXT) \ $(EMIS)/libCCTM_a-cropcal.$(OBJEXT) \ - $(EMIS)/libCCTM_a-DUST_EMIS.$(OBJEXT) \ $(EMIS)/libCCTM_a-EMIS_DEFN.$(OBJEXT) \ $(EMIS)/libCCTM_a-LTNG_DEFN.$(OBJEXT) \ $(EMIS)/libCCTM_a-LUS_DEFN.$(OBJEXT) \ @@ -222,7 +221,6 @@ am_libCCTM_a_OBJECTS = $(AERO)/libCCTM_a-AERO_DATA.$(OBJEXT) \ $(UTIL)/libCCTM_a-subhdomain.$(OBJEXT) \ $(UTIL)/libCCTM_a-UTILIO_DEFN.$(OBJEXT) \ $(VDIFF)/libCCTM_a-aero_sedv.$(OBJEXT) \ - $(VDIFF)/libCCTM_a-ASX_DATA_MOD.$(OBJEXT) \ $(VDIFF)/libCCTM_a-conv_cgrid.$(OBJEXT) \ $(VDIFF)/libCCTM_a-matrix1.$(OBJEXT) \ $(VDIFF)/libCCTM_a-opddep.$(OBJEXT) \ @@ -237,7 +235,9 @@ am_libCCTM_a_OBJECTS = $(AERO)/libCCTM_a-AERO_DATA.$(OBJEXT) \ $(localCCTM)/libCCTM_a-o3totcol.$(OBJEXT) \ $(localCCTM)/libCCTM_a-vdiffacmx.$(OBJEXT) \ $(localCCTM)/libCCTM_a-PTMAP.$(OBJEXT) \ - $(localCCTM)/libCCTM_a-PT3D_DEFN.$(OBJEXT) + $(localCCTM)/libCCTM_a-PT3D_DEFN.$(OBJEXT) \ + $(localCCTM)/libCCTM_a-ASX_DATA_MOD.$(OBJEXT) \ + $(localCCTM)/libCCTM_a-DUST_EMIS.$(OBJEXT) libCCTM_a_OBJECTS = $(am_libCCTM_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) @@ -468,7 +468,7 @@ libCCTM_a_SOURCES = $(AERO)/AERO_DATA.F $(AERO)/aero_depv.F \ $(DEPV)/MOSAIC_MOD.F $(DEPV)/opdepv_diag.F \ $(DEPV)/opdepv_mos.F $(DEPV)/opdepv_fst.F $(DEPV)/m3dry.F \ $(EMIS)/BEIS_DEFN.F $(EMIS)/BIOG_EMIS.F $(EMIS)/cropcal.F \ - $(EMIS)/DUST_EMIS.F $(EMIS)/EMIS_DEFN.F $(EMIS)/LTNG_DEFN.F \ + $(EMIS)/EMIS_DEFN.F $(EMIS)/LTNG_DEFN.F \ $(EMIS)/LUS_DEFN.F $(EMIS)/MGEMIS.F $(EMIS)/opemis.F \ $(EMIS)/PTBILIN.F $(EMIS)/SSEMIS.F $(EMIS)/STK_EMIS.F \ $(EMIS)/STK_PRMS.F $(EMIS)/tfabove.F $(EMIS)/tfbelow.F \ @@ -504,13 +504,14 @@ libCCTM_a_SOURCES = $(AERO)/AERO_DATA.F $(AERO)/aero_depv.F \ $(STENEX)/noop_util_module.f $(UTIL)/bmatvec.F \ $(UTIL)/findex.f $(UTIL)/get_envlist.f $(UTIL)/setup_logdev.F \ $(UTIL)/subhdomain.F $(UTIL)/UTILIO_DEFN.F \ - $(VDIFF)/aero_sedv.F $(VDIFF)/ASX_DATA_MOD.F \ + $(VDIFF)/aero_sedv.F \ $(VDIFF)/conv_cgrid.F $(VDIFF)/matrix1.F $(VDIFF)/opddep.F \ $(VDIFF)/opddep_fst.F $(VDIFF)/opddep_mos.F $(VDIFF)/rddepv.F \ $(VDIFF)/SEDIMENTATION.F $(VDIFF)/tri.F $(VDIFF)/VDIFF_DIAG.F \ $(VDIFF)/VDIFF_MAP.F $(VDIFF)/vdiffproc.F \ $(localCCTM)/o3totcol.f $(localCCTM)/vdiffacmx.F \ - $(localCCTM)/PTMAP.F $(localCCTM)/PT3D_DEFN.F + $(localCCTM)/PTMAP.F $(localCCTM)/PT3D_DEFN.F \ + $(localCCTM)/ASX_DATA_MOD.F $(localCCTM)/DUST_EMIS.F # local version of CCTM source files localCCTM = $(builddir)/src @@ -757,8 +758,6 @@ $(EMIS)/libCCTM_a-BIOG_EMIS.$(OBJEXT): $(EMIS)/$(am__dirstamp) \ $(EMIS)/$(DEPDIR)/$(am__dirstamp) $(EMIS)/libCCTM_a-cropcal.$(OBJEXT): $(EMIS)/$(am__dirstamp) \ $(EMIS)/$(DEPDIR)/$(am__dirstamp) -$(EMIS)/libCCTM_a-DUST_EMIS.$(OBJEXT): $(EMIS)/$(am__dirstamp) \ - $(EMIS)/$(DEPDIR)/$(am__dirstamp) $(EMIS)/libCCTM_a-EMIS_DEFN.$(OBJEXT): $(EMIS)/$(am__dirstamp) \ $(EMIS)/$(DEPDIR)/$(am__dirstamp) $(EMIS)/libCCTM_a-LTNG_DEFN.$(OBJEXT): $(EMIS)/$(am__dirstamp) \ @@ -981,8 +980,6 @@ $(VDIFF)/$(DEPDIR)/$(am__dirstamp): @: > $(VDIFF)/$(DEPDIR)/$(am__dirstamp) $(VDIFF)/libCCTM_a-aero_sedv.$(OBJEXT): $(VDIFF)/$(am__dirstamp) \ $(VDIFF)/$(DEPDIR)/$(am__dirstamp) -$(VDIFF)/libCCTM_a-ASX_DATA_MOD.$(OBJEXT): $(VDIFF)/$(am__dirstamp) \ - $(VDIFF)/$(DEPDIR)/$(am__dirstamp) $(VDIFF)/libCCTM_a-conv_cgrid.$(OBJEXT): $(VDIFF)/$(am__dirstamp) \ $(VDIFF)/$(DEPDIR)/$(am__dirstamp) $(VDIFF)/libCCTM_a-matrix1.$(OBJEXT): $(VDIFF)/$(am__dirstamp) \ @@ -1022,6 +1019,10 @@ $(localCCTM)/libCCTM_a-PTMAP.$(OBJEXT): $(localCCTM)/$(am__dirstamp) \ $(localCCTM)/libCCTM_a-PT3D_DEFN.$(OBJEXT): \ $(localCCTM)/$(am__dirstamp) \ $(localCCTM)/$(DEPDIR)/$(am__dirstamp) +$(localCCTM)/libCCTM_a-ASX_DATA_MOD.$(OBJEXT): $(localCCTM)/$(am__dirstamp) \ + $(localCCTM)/$(DEPDIR)/$(am__dirstamp) +$(localCCTM)/libCCTM_a-DUST_EMIS.$(OBJEXT): $(localCCTM)/$(am__dirstamp) \ + $(localCCTM)/$(DEPDIR)/$(am__dirstamp) libCCTM.a: $(libCCTM_a_OBJECTS) $(libCCTM_a_DEPENDENCIES) $(EXTRA_libCCTM_a_DEPENDENCIES) $(AM_V_at)-rm -f libCCTM.a @@ -1273,11 +1274,13 @@ $(EMIS)/libCCTM_a-cropcal.o: $(EMIS)/cropcal.F $(EMIS)/libCCTM_a-cropcal.obj: $(EMIS)/cropcal.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(EMIS)/libCCTM_a-cropcal.obj `if test -f '$(EMIS)/cropcal.F'; then $(CYGPATH_W) '$(EMIS)/cropcal.F'; else $(CYGPATH_W) '$(srcdir)/$(EMIS)/cropcal.F'; fi` -$(EMIS)/libCCTM_a-DUST_EMIS.o: $(EMIS)/DUST_EMIS.F - $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(EMIS)/libCCTM_a-DUST_EMIS.o `test -f '$(EMIS)/DUST_EMIS.F' || echo '$(srcdir)/'`$(EMIS)/DUST_EMIS.F +$(localCCTM)/libCCTM_a-DUST_EMIS.o: $(localCCTM)/DUST_EMIS.F + $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(localCCTM)/libCCTM_a-DUST_EMIS.o `test -f '$(local +CCTM)/DUST_EMIS.F' || echo '$(srcdir)/'`$(localCCTM)/DUST_EMIS.F -$(EMIS)/libCCTM_a-DUST_EMIS.obj: $(EMIS)/DUST_EMIS.F - $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(EMIS)/libCCTM_a-DUST_EMIS.obj `if test -f '$(EMIS)/DUST_EMIS.F'; then $(CYGPATH_W) '$(EMIS)/DUST_EMIS.F'; else $(CYGPATH_W) '$(srcdir)/$(EMIS)/DUST_EMIS.F'; fi` +$(localCCTM)/libCCTM_a-DUST_EMIS.obj: $(localCCTM)/DUST_EMIS.F + $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(localCCTM)/libCCTM_a-DUST_EMIS.obj `if test -f '$( +localCCTM)/DUST_EMIS.F'; then $(CYGPATH_W) '$(localCCTM)/DUST_EMIS.F'; else $(CYGPATH_W) '$(srcdir)/$(localCCTM)/DUST_EMIS.F'; fi` $(EMIS)/libCCTM_a-EMIS_DEFN.o: $(EMIS)/EMIS_DEFN.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(EMIS)/libCCTM_a-EMIS_DEFN.o `test -f '$(EMIS)/EMIS_DEFN.F' || echo '$(srcdir)/'`$(EMIS)/EMIS_DEFN.F @@ -1615,11 +1618,11 @@ $(VDIFF)/libCCTM_a-aero_sedv.o: $(VDIFF)/aero_sedv.F $(VDIFF)/libCCTM_a-aero_sedv.obj: $(VDIFF)/aero_sedv.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(VDIFF)/libCCTM_a-aero_sedv.obj `if test -f '$(VDIFF)/aero_sedv.F'; then $(CYGPATH_W) '$(VDIFF)/aero_sedv.F'; else $(CYGPATH_W) '$(srcdir)/$(VDIFF)/aero_sedv.F'; fi` -$(VDIFF)/libCCTM_a-ASX_DATA_MOD.o: $(VDIFF)/ASX_DATA_MOD.F - $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(VDIFF)/libCCTM_a-ASX_DATA_MOD.o `test -f '$(VDIFF)/ASX_DATA_MOD.F' || echo '$(srcdir)/'`$(VDIFF)/ASX_DATA_MOD.F +$(liblocalCCTM)/libCCTM_a-ASX_DATA_MOD.o: $(liblocalCCTM)/ASX_DATA_MOD.F + $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(liblocalCCTM)/libCCTM_a-ASX_DATA_MOD.o `test -f '$(liblocalCCTM)/ASX_DATA_MOD.F' || echo '$(srcdir)/'`$(liblocalCCTM)/ASX_DATA_MOD.F -$(VDIFF)/libCCTM_a-ASX_DATA_MOD.obj: $(VDIFF)/ASX_DATA_MOD.F - $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(VDIFF)/libCCTM_a-ASX_DATA_MOD.obj `if test -f '$(VDIFF)/ASX_DATA_MOD.F'; then $(CYGPATH_W) '$(VDIFF)/ASX_DATA_MOD.F'; else $(CYGPATH_W) '$(srcdir)/$(VDIFF)/ASX_DATA_MOD.F'; fi` +$(liblocalCCTM)/libCCTM_a-ASX_DATA_MOD.obj: $(liblocalCCTM)/ASX_DATA_MOD.F + $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(liblocalCCTM)/libCCTM_a-ASX_DATA_MOD.obj `if test -f '$(liblocalCCTM)/ASX_DATA_MOD.F'; then $(CYGPATH_W) '$(liblocalCCTM)/ASX_DATA_MOD.F'; else $(CYGPATH_W) '$(srcdir)/$(liblocalCCTM)/ASX_DATA_MOD.F'; fi` $(VDIFF)/libCCTM_a-conv_cgrid.o: $(VDIFF)/conv_cgrid.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(VDIFF)/libCCTM_a-conv_cgrid.o `test -f '$(VDIFF)/conv_cgrid.F' || echo '$(srcdir)/'`$(VDIFF)/conv_cgrid.F @@ -2164,7 +2167,7 @@ $(libAERO)AERO_DATA.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libAERO)aero_depv.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libAERO)AERO_DATA.$(OBJEXT) $(libAERO)AEROMET_DATA.$(OBJEXT) \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) \ $(libDEPV)MOSAIC_MOD.$(OBJEXT) $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) @@ -2176,8 +2179,8 @@ $(libAERO)aero_driver.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) $(libAERO)SOA_DEFN.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libAERO)AERO_EMIS.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libAERO)AERO_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ - $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libEMIS)DUST_EMIS.$(OBJEXT) \ + $(libAERO)AERO_DATA.$(OBJEXT) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ + $(libSPCS)CGRID_SPCS.$(OBJEXT) $(liblocalCCTM)DUST_EMIS.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libAERO)PRECURSOR_DATA.$(OBJEXT) \ $(liblocalCCTM)PT3D_DEFN.$(OBJEXT) $(liblocalCCTM)PTMAP.$(OBJEXT) \ $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) $(libEMIS)SSEMIS.$(OBJEXT) \ @@ -2193,7 +2196,7 @@ $(libAERO)aero_subs.$(OBJEXT) : $(ICL)/const/CONST.EXT $(AERO)/isrpia.inc \ $(libAERO)AOD_DEFN.$(OBJEXT) $(libAERO)PRECURSOR_DATA.$(OBJEXT) \ $(libAERO)SOA_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libAERO)AOD_DEFN.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(libAERO)AERO_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ + $(libAERO)AERO_DATA.$(OBJEXT) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libAERO)getpar.$(OBJEXT) : \ @@ -2222,11 +2225,11 @@ $(libAERO)SOA_DEFN.$(OBJEXT) : \ # biog $(libBIOG)beis3.$(OBJEXT) : \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) $(libBIOG)czangle.$(OBJEXT) : $(ICL)/const/CONST.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libBIOG)hrno.$(OBJEXT) : \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) \ $(libSTENEX)noop_modules.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libBIOG)parsline.$(OBJEXT) : \ @@ -2243,7 +2246,7 @@ $(libCLOUD)hlconst.$(OBJEXT) : \ # depv $(libDEPV)ABFLUX_MOD.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) \ $(libDEPV)MOSAIC_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ @@ -2253,7 +2256,7 @@ $(libDEPV)cgrid_depv.$(OBJEXT) : \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)DEPV_DEFN.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libDEPV)DEPVVARS.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) \ $(libDEPV)MOSAIC_MOD.$(OBJEXT) $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) \ @@ -2262,13 +2265,13 @@ $(libDEPV)gas_depv_map.$(OBJEXT) : \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libDEPV)DEPVVARS.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)HGSIM.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ $(libDEPV)DEPVVARS.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libDEPV)LSM_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)MOSAIC_MOD.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libDEPV)LSM_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)opdepv_diag.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libDEPV)DEPVVARS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ @@ -2280,7 +2283,7 @@ $(libDEPV)opdepv_fst.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libDEPV)DEPVVARS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libDEPV)LSM_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libDEPV)m3dry.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(libDEPV)ABFLUX_MOD.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ + $(libDEPV)ABFLUX_MOD.$(OBJEXT) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ $(libDEPV)BIDI_MOD.$(OBJEXT) $(libDEPV)DEPVVARS.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libDEPV)HGSIM.$(OBJEXT) \ $(libDEPV)LSM_MOD.$(OBJEXT) $(libDEPV)MOSAIC_MOD.$(OBJEXT) \ @@ -2295,13 +2298,9 @@ $(libEMIS)BIOG_EMIS.$(OBJEXT) : \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)cropcal.$(OBJEXT) : \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) -$(libEMIS)DUST_EMIS.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libAERO)AERO_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ - $(libGRID)GRID_CONF.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ - $(libEMIS)LUS_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)EMIS_DEFN.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ $(libAERO)AERO_DATA.$(OBJEXT) $(libAERO)AERO_EMIS.$(OBJEXT) \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BEIS_DEFN.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BEIS_DEFN.$(OBJEXT) \ $(libEMIS)BIOG_EMIS.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libDEPV)DEPV_DEFN.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libEMIS)LTNG_DEFN.$(OBJEXT) $(libEMIS)MGEMIS.$(OBJEXT) \ @@ -2314,7 +2313,7 @@ $(libEMIS)LTNG_DEFN.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libEMIS)LUS_DEFN.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)MGEMIS.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libAERO)AEROMET_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ + $(libAERO)AEROMET_DATA.$(OBJEXT) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libGRID)PCGRID_DEFN.$(OBJEXT) \ $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) @@ -2327,7 +2326,7 @@ $(libEMIS)PTBILIN.$(OBJEXT) : \ $(libEMIS)UDTYPES.$(OBJEXT) $(libGRID)VGRD_DEFN.$(OBJEXT) $(libEMIS)SSEMIS.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libAERO)AERO_DATA.$(OBJEXT) $(libAERO)AEROMET_DATA.$(OBJEXT) \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libSTENEX)noop_modules.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)STK_EMIS.$(OBJEXT) : \ @@ -2336,7 +2335,7 @@ $(libEMIS)STK_PRMS.$(OBJEXT) : \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libEMIS)UDTYPES.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)tfabove.$(OBJEXT) : \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libEMIS)LUS_DEFN.$(OBJEXT) $(libEMIS)tfbelow.$(OBJEXT) : \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libEMIS)LUS_DEFN.$(OBJEXT) \ @@ -2495,12 +2494,8 @@ $(libUTIL)subhdomain.$(OBJEXT) : \ # vdiff $(libVDIFF)aero_sedv.$(OBJEXT) : \ $(libAERO)AERO_DATA.$(OBJEXT) $(libAERO)AEROMET_DATA.$(OBJEXT) \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) -$(libVDIFF)ASX_DATA_MOD.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT $(ICL)/mpi/PE_COMM.EXT \ - $(libDEPV)DEPVVARS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ - $(libDEPV)LSM_MOD.$(OBJEXT) $(libSTENEX)noop_modules.$(OBJEXT) \ - $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libVDIFF)conv_cgrid.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) @@ -2520,7 +2515,7 @@ $(libVDIFF)rddepv.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libVDIFF)SEDIMENTATION.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) \ $(libVDIFF)VDIFF_DIAG.$(OBJEXT) $(libVDIFF)VDIFF_MAP.$(OBJEXT) $(libVDIFF)tri.$(OBJEXT) : \ @@ -2532,7 +2527,7 @@ $(libVDIFF)VDIFF_MAP.$(OBJEXT) : $(ICL)/emctrl/EMISPRM.EXT \ $(libAERO)AERO_EMIS.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libVDIFF)vdiffproc.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libDEPV)DEPV_DEFN.$(OBJEXT) \ $(libEMIS)EMIS_DEFN.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libDEPV)HGSIM.$(OBJEXT) $(libDEPV)LSM_MOD.$(OBJEXT) \ @@ -2544,7 +2539,7 @@ $(libVDIFF)vdiffproc.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(liblocalCCTM)o3totcol.$(OBJEXT) : \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(liblocalCCTM)vdiffacmx.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libDEPV)DEPV_DEFN.$(OBJEXT) $(libEMIS)EMIS_DEFN.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) \ $(libVDIFF)VDIFF_MAP.$(OBJEXT) @@ -2554,7 +2549,14 @@ $(liblocalCCTM)PT3D_DEFN.$(OBJEXT) : $(libAERO)AERO_DATA.$(OBJEXT) \ $(libGRID)GRID_CONF.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ $(liblocalCCTM)PTMAP.$(OBJEXT) $(libMECHS)RXNS_DATA_MODULE.$(OBJEXT) \ $(libEMIS)STK_EMIS.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) - +$(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT $(ICL)/mpi/PE_COMM.EXT \ + $(libDEPV)DEPVVARS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ + $(libDEPV)LSM_MOD.$(OBJEXT) $(libSTENEX)noop_modules.$(OBJEXT) \ + $(libUTIL)UTILIO_DEFN.$(OBJEXT) +$(liblocalCCTM)DUST_EMIS.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ + $(libAERO)AERO_DATA.$(OBJEXT) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ + $(libGRID)GRID_CONF.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ + $(libEMIS)LUS_DEFN.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/src/model/src/ASX_DATA_MOD.F b/src/model/src/ASX_DATA_MOD.F new file mode 100755 index 00000000..d616c347 --- /dev/null +++ b/src/model/src/ASX_DATA_MOD.F @@ -0,0 +1,1464 @@ +!------------------------------------------------------------------------! +! The Community Multiscale Air Quality (CMAQ) system software is in ! +! continuous development by various groups and is based on information ! +! from these groups: Federal Government employees, contractors working ! +! within a United States Government contract, and non-Federal sources ! +! including research institutions. These groups give the Government ! +! permission to use, prepare derivative works of, and distribute copies ! +! of their work in the CMAQ system to the public and to permit others ! +! to do so. The United States Environmental Protection Agency ! +! therefore grants similar permission to use the CMAQ system software, ! +! but users are requested to provide copies of derivative works or ! +! products designed to operate in the CMAQ system to the United States ! +! Government without restrictions as to use by others. Software ! +! that is used with the CMAQ system but distributed under the GNU ! +! General Public License or the GNU Lesser General Public License is ! +! subject to their copyright restrictions. ! +!------------------------------------------------------------------------! + +C::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + Module ASX_DATA_MOD + +C----------------------------------------------------------------------- +C Function: User-defined types + +C Revision History: +C 19 Aug 2014 J.Bash: initial implementation +C 17 July 2015 H.Foroutan: Updated the calculation of MOL, MOLI, HOL, and WSTAR +C 25 Aug 2015 H. Pye: Added IEPOX, HACET surrogates +C modified PROPNN and H2O2 +C Increased ar for ozone from 8 to 12. +C Change meso from 0.1 to 0 for some org. nitrates +C Changes based on Nguyen et al. 2015 PNAS and SOAS +C +C---------Notes +C * Updates based on literature review 7/96 JEP +C # Diff and H based on Wesely (1988) same as RADM +C + Estimated by JEP 2/97 +C @ Updated by JEP 9/01 +C ~ Added by YW 1/02. Dif0 based on Massman (1998). Henry's Law constant +C is defined here as: h=cg/ca, where cg is the concentration of a species +C in gas-phase, and ca is its aqueous-phase concentration. The smaller h, +C the larger solubility. Henry's Law constant in another definition (KH): +C KH = ca/pg [M/atm], KH = KH0 * exp(-DKH/R(1/T-1/T0)), where KH0 and -DKH +C values are from Rolf Sander (1999). h=1/(KH*R*T). +C ** Update by DBS based on estimates by JEP 1/03 +C ^^ From Bill Massman, personal communication 4/03 +C ## Diffusivity calculated by SPARC, reactivity = other aldehydes +C ++ Dif0 in Massman is diffusivity at temperature 0C and 1 atm (101.325kPa), so +C chemicals that were not in Massman's paper need to be adjusted. We assume +C JEP's original values were for 25C and 1 atm. +C % Added by G. Sarwar (10/04) +C $ Added by R. Bullock (02/05) HG diffusivity is from Massman (1999). +C HGIIGAS diffusivity calculated from the HG value and a mol. wt. scaling +C factor of MW**(-2/3) from EPA/600/3-87/015. ORD, Athens, GA. HGIIGAS +C mol.wt. used is that of HgCl2. Reactivity of HG is 1/20th of NO and NO2 +C values based on general atmospheric lifetimes of each species. Reactivity +C of HGIIGAS is based on HNO3 surrogate. +C @@ Mesophyll resistances for NO, NO2, and CO added by J. Pleim (07/07) based +C on values in Pleim, Venkatram, and Yamartino, 1984: ADOM/TADAP Model +C Development Program, Volume 4, The Dry Deposition Module. ERT, Inc., +C Concord, MA (peer reviewed). +C ~~ Reactivity for PAN changed from 4.0 to 16.0 by J. Pleim (07/07) based on +C comparisons with Turnipseed et al., JGR, 2006. +C %% Species ICL1 and ICL2 are removed, not used in CB05. G. Sarwar (07/07) +C <> Hazardous Air Pollutants that are believed to undergo significant dry +C deposition. Hydrazine and triethylamine reactivities are based on analogies +C to NH3. Maleic anhydride reactivity is assumed similar to aldehydes. +C Toluene diisocyanate and hexamethylene diisocyanate reactivities are +C assumed to be similar to SO2. Diffusivities are calculated with standard +C formulas. W. Hutzell (04/08) +C %% G. Sarwar: added data for iodine and bromine species (03/2016) +C %% B. Hutzell: added dry deposition data for methane, acrylic acid, methyl chloride, +C and acetonitrile (09/2016) +C------------------------------------------------------------------------------- + + Use GRID_CONF ! horizontal & vertical domain specifications + Use LSM_MOD ! Land surface data + Use DEPVVARS, Only: ltotg + + Implicit None + + Include SUBST_CONST ! constants + + Type :: MET_Type +!> 2-D meteorological fields: + Real, Allocatable :: RDEPVHT ( :,: ) ! air dens / dep vel ht + Real, Allocatable :: DENS1 ( :,: ) ! layer 1 air density + Real, Allocatable :: PRSFC ( :,: ) ! surface pressure [Pa] + Real, Allocatable :: Q2 ( :,: ) ! 2 meter water vapor mixing ratio [kg/kg] + Real, Allocatable :: QSS_GRND ( :,: ) ! ground saturation water vapor mixing ratio [kg/kg] + Real, Allocatable :: RH ( :,: ) ! relative humidity [ratio] + Real, Allocatable :: RA ( :,: ) ! aerodynamic resistnace [s/m] + Real, Allocatable :: RS ( :,: ) ! stomatal resistnace [s/m] + Real, Allocatable :: RC ( :,: ) ! convective precipitation [cm] + Real, Allocatable :: RN ( :,: ) ! non-convective precipitation [mc] + Real, Allocatable :: RGRND ( :,: ) ! Solar radiation at the ground [W/m**2] + Real, Allocatable :: HFX ( :,: ) ! Sensible heat flux [W/m**2] + Real, Allocatable :: LH ( :,: ) ! Latent heat flux [W/m**2] + Real, Allocatable :: SNOCOV ( :,: ) ! Snow cover [1=yes, 0=no] + Real, Allocatable :: TEMP2 ( :,: ) ! two meter temperature [K] + Real, Allocatable :: TEMPG ( :,: ) ! skin temperature [K] + Real, Allocatable :: TSEASFC ( :,: ) ! SST [K] + Real, Allocatable :: USTAR ( :,: ) ! surface friction velocity [m/s] + Real, Allocatable :: VEG ( :,: ) ! fractional vegetation coverage [ratio] + Real, Allocatable :: LAI ( :,: ) ! grid cell leaf area index [m**2/m**2] + Real, Allocatable :: WR ( :,: ) ! precip intercepted by canopy [m] + Real, Allocatable :: WSPD10 ( :,: ) ! 10-m wind speed [m/s] + Real, Allocatable :: WSTAR ( :,: ) ! convective velocity scale [m/s] + Real, Allocatable :: Z0 ( :,: ) ! roughness length [m] + Real, Allocatable :: SOIM1 ( :,: ) ! 1 cm soil moisture [m**3/m**3] + Real, Allocatable :: SOIM2 ( :,: ) ! 1 m soil moisture [m**3/m**3] + Real, Allocatable :: SOIT1 ( :,: ) ! 1 cm soil temperature [K] + Real, Allocatable :: SOIT2 ( :,: ) ! 1 m soil temperature [K] + Real, Allocatable :: SEAICE ( :,: ) ! Sea ice coverage [%] + Real, Allocatable :: MOL ( :,: ) ! Monin-Obukhov length [m] + Real, Allocatable :: MOLI ( :,: ) ! inverse of Monin-Obukhov length [m] + Real, Allocatable :: HOL ( :,: ) ! PBL over Obukhov length + Real, Allocatable :: XPBL ( :,: ) ! PBL sigma height + Integer, Allocatable :: LPBL ( :,: ) ! PBL layer + Logical, Allocatable :: CONVCT ( :,: ) ! convection flag + Real, Allocatable :: PBL ( :,: ) ! pbl height (m) + Real, Allocatable :: NACL_EMIS( :,: ) ! NACL mass emission rate of particles with d <10 um (g/m2/s) + +!> FENGSHA option + Real, Allocatable :: CLAYF ( :,: ) ! Fractional Clay Content + Real, Allocatable :: SANDF ( :,: ) ! Fractional Sand Content + Real, Allocatable :: DRAG ( :,: ) ! Drag Partion + Real, Allocatable :: UTHR ( :,: ) ! Dry Threshold Friction Velocity + +!> U and V wind components on the cross grid points + Real, Allocatable :: UWIND ( :,:,: ) ! [m/s] + Real, Allocatable :: VWIND ( :,:,: ) ! [m/s] +!> 3-D meteorological fields: + Real, Allocatable :: KZMIN ( :,:,: ) ! minimum Kz [m**2/s] + Real, Allocatable :: PRES ( :,:,: ) ! layer 1 pressure [Pa] + Real, Allocatable :: QV ( :,:,: ) ! water vapor mixing ratio + Real, Allocatable :: QC ( :,:,: ) ! cloud water mixing ratio + Real, Allocatable :: THETAV ( :,:,: ) ! potential temp + Real, Allocatable :: TA ( :,:,: ) ! temperature (K) + Real, Allocatable :: ZH ( :,:,: ) ! mid-layer height above ground [m] + Real, Allocatable :: ZF ( :,:,: ) ! layer height [m] + Real, Allocatable :: DZF ( :,:,: ) ! layer surface thickness + Real, Allocatable :: DENS ( :,:,: ) ! air density + Real, Allocatable :: RJACM ( :,:,: ) ! reciprocal mid-layer Jacobian + Real, Allocatable :: RJACF ( :,:,: ) ! reciprocal full-layer Jacobian + Real, Allocatable :: RRHOJ ( :,:,: ) ! reciprocal density X Jacobian + End Type MET_Type + + Type :: GRID_Type +!> Grid infomation: +!> Vertical information + Real, Allocatable :: DX3F ( : ) ! sigma layer surface thickness ! vdiffacmx.F + Real, Allocatable :: RDX3F ( : ) ! reciprocal sigma layer thickness ! EMIS_DEFN.F, sedi.F, vdiffacmx.F, vdiffproc.F + Real, Allocatable :: RDX3M ( : ) ! reciprocal sigma midlayer thickness ! vdiffproc.F +!> Horizontal Information: + Real, Allocatable :: RMSFX4 ( :,: ) ! inverse map scale factor ** 4 + Real, Allocatable :: LON ( :,: ) ! longitude + Real, Allocatable :: LAT ( :,: ) ! latitude + Real, Allocatable :: LWMASK ( :,: ) ! land water mask + Real, Allocatable :: OCEAN ( :,: ) ! Open ocean + Real, Allocatable :: SZONE ( :,: ) ! Surf zone + Real, Allocatable :: PURB ( :,: ) ! percent urban [%] + Integer, Allocatable :: SLTYP ( :,: ) ! soil type [category] + Real, Allocatable :: WSAT ( :,: ) ! soil wilting point + Real, Allocatable :: WWLT ( :,: ) ! soil wilting point + Real, Allocatable :: BSLP ( :,: ) ! B Slope + Real, Allocatable :: WRES ( :,: ) ! Soil residual moisture point + Real, Allocatable :: WFC ( :,: ) ! soil field capacity +! Real, Allocatable :: RHOB ( :,: ) ! soil bulk density + Real, Allocatable :: LUFRAC ( :,:,: ) ! land use fraction (col,row,lu_type)[ratio] +C Land use information: + Character( 16 ), Allocatable :: NAME ( : ) ! LU name + Character( 16 ), Allocatable :: LU_Type ( : ) ! general land use type e.g. water, forest, etc. + End Type GRID_Type + + Type :: MOSAIC_Type ! (col,row,lu) + Character( 16 ), Allocatable :: NAME ( : ) ! LU name + Character( 16 ), Allocatable :: LU_Type ( : ) ! general land use type e.g. water, forest, etc. +!> Sub grid cell meteorological variables: + Real, Allocatable :: USTAR ( :,:,: ) ! surface friction velocity [m/s] + Real, Allocatable :: LAI ( :,:,: ) ! leaf area index [m**2/m**2] + Real, Allocatable :: VEG ( :,:,: ) ! vegetation fraction [ratio] + Real, Allocatable :: Z0 ( :,:,: ) ! vegetation fraction [ratio] + Real, Allocatable :: DELTA ( :,:,: ) ! Surface wetness [ratio] +!> Sub grid cell resistances + Real, Allocatable :: RA ( :,:,: ) ! aerodynamic resistance [s/m] + Real, Allocatable :: RSTW ( :,:,: ) ! Stomatal Resistance of water [s/m] + Real, Allocatable :: RINC ( :,:,: ) ! In-canopy resistance [s/m] + End Type MOSAIC_Type + + Type :: ChemMos_Type ! (col,row,lu,spc) + Character( 16 ), Allocatable :: NAME ( : ) ! LU name + Character( 16 ), Allocatable :: Lu_Type ( : ) ! general land use type e.g. water, forest, etc. + Character( 16 ), Allocatable :: SubName ( : ) ! Deposition species name +!> Sub grid cell chemically dependent resistances + Real, Allocatable :: Rb ( :,:,:,: ) ! quasi-laminar boundary layer resistance [s/m] + Real, Allocatable :: Rst ( :,:,:,: ) ! stomatal resistance [s/m] + Real, Allocatable :: Rgc ( :,:,:,: ) ! Canopy covered soil resistance [s/m] + Real, Allocatable :: Rgb ( :,:,:,: ) ! Barron soil resistance [s/m] + Real, Allocatable :: Rcut ( :,:,:,: ) ! soil resistance [s/m] + Real, Allocatable :: Rwat ( :,:,:,: ) ! surface water resistance [s/m] +!> Sub grid cell compensation point + Real, Allocatable :: Catm ( :,:,:,: ) ! Atmospheric [ppm] + Real, Allocatable :: CZ0 ( :,:,:,: ) ! compensation point at Z0 [ppm] + Real, Allocatable :: Cleaf( :,:,:,: ) ! Leaf compensation point [ppm] + Real, Allocatable :: Cstom( :,:,:,: ) ! Stomatal compensation point [ppm] + Real, Allocatable :: Ccut ( :,:,:,: ) ! Cuticular compensation point [ppm] + Real, Allocatable :: Csoil( :,:,:,: ) ! Soil compensation point [ppm] + End Type ChemMos_Type + + Type( MET_Type ), Save :: Met_Data + Type( GRID_Type ), Save :: Grid_Data + Type( MOSAIC_Type ), Save :: Mosaic_Data + Type( ChemMos_Type ), Save :: ChemMos_Data + + Integer, Save :: n_spc_m3dry = ltotg ! from DEPVVARS module +!> M3 asx constants + Real, Parameter :: a0 = 8.0 ! [dim'less] + Real, Parameter :: d3 = 1.38564e-2 ! [dim'less] + Real, Parameter :: dwat = 0.2178 ! [cm^2/s] at 273.15K + Real, Parameter :: hplus_ap = 1.0e-6 ! pH=6.0 leaf apoplast solution Ph (Massad et al 2008) + Real, Parameter :: hplus_def = 1.0e-5 ! pH=5.0 + Real, Parameter :: hplus_east = 1.0e-5 ! pH=5.0 + Real, Parameter :: hplus_h2o = 7.94328e-9 ! 10.0**(-8.1) + Real, Parameter :: hplus_west = 3.16228e-6 ! 10.0**(-5.5) + Real, Parameter :: kvis = 0.132 ! [cm^2 / s] at 273.15K + Real, Parameter :: pr = 0.709 ! [dim'less] + Real, Parameter :: rcut0 = 3000.0 ! [s/m] + Real, Parameter :: rcw0 = 125000.0 ! acc'd'g to Padro and + Real, Parameter :: resist_max = 1.0e30 ! maximum resistance + Real, Parameter :: rg0 = 1000.0 ! [s/m] + Real, Parameter :: rgwet0 = 25000.0 ! [s/m] + Real, Parameter :: rsndiff = 10.0 ! snow diffusivity fac + Real, Parameter :: rsnow0 = 1000.0 + Real, Parameter :: svp2 = 17.67 ! from MM5 and WRF + Real, Parameter :: svp3 = 29.65 ! from MM5 and WRF + Real, Parameter :: rt25inK = 1.0/(stdtemp + 25.0) ! 298.15K = 25C + Real, Parameter :: twothirds = 2.0 / 3.0 + Real, Parameter :: betah = 5.0 ! WRF 3.6 px uses Dyer + Real, Parameter :: gamah = 16.0 + Real, Parameter :: pr0 = 0.95 + Real, Parameter :: karman = 0.40 + Real, Parameter :: f3min = 0.25 + Real, Parameter :: ftmin = 0.0000001 ! m/s + Real, Parameter :: nscat = 16.0 + Real, Parameter :: rsmax = 5000.0 ! s/m + + Real :: ar ( ltotg ) ! reactivity relative to HNO3 + Real :: dif0 ( ltotg ) ! molecular diffusivity [cm2/s] + Real :: lebas ( ltotg ) ! Le Bas molar volume [cm3/mol ] + Real :: meso ( ltotg ) ! Exception for species that + ! react with cell walls. fo in + ! Wesely 1989 eq 6. + Character( 16 ) :: subname ( ltotg ) ! for subroutine HLCONST + + Logical, Save :: MET_INITIALIZED = .false. + Real, Save :: CONVPA ! Pressure conversion factor file units to Pa + Logical, Save :: MINKZ + Logical, Save :: CSTAGUV ! Winds are available with C stagger? + Logical, Save :: ifwr = .false. + + Public :: INIT_MET + + Logical, Private, Save :: ifsst = .false. + Logical, Private, Save :: ifq2 = .false. + Logical, Private, Save :: rinv = .True. + Logical, Private, Save :: iflh = .false. + + Integer, Private :: C, R, L, S ! loop induction variables + Integer, Private :: SPC + Character( 16 ), Private, Save :: vname_rc, vname_rn, vname_uc, vname_vc + Real, Private, Save :: P0 ! reference pressure (100000.0 Pa) for Potential Temperature, note that in meteorology they do not use the SI 1 ATM. + + Integer, Private, Save :: LOGDEV + Integer, Private, Save :: GXOFF, GYOFF ! global origin offset from file + Integer, Private, Save :: STRTCOLMC3, ENDCOLMC3, STRTROWMC3, ENDROWMC3 ! MET_CRO_3D + Integer, Private, Save :: STRTCOLMD3, ENDCOLMD3, STRTROWMD3, ENDROWMD3 ! MET_DOT_3D + Integer, Private, Save :: STRTCOLMC2, ENDCOLMC2, STRTROWMC2, ENDROWMC2 ! MET_CRO_2D + Integer, Private, Save :: STRTCOL_O1, ENDCOL_O1, STRTROW_O1, ENDROW_O1 ! OCEAN_1 + + Real, Pointer, Private :: BUFF1D( : ) ! 1D temp var number of layers + Real, Pointer, Private :: BUFF2D( :,: ) ! 2D temp var + Real, Pointer, Private :: BUFF3D( :,:,: ) ! 3D temp var + +! FENGSHA option control + CHARACTER( 20 ), SAVE :: CTM_FENGSHA = 'CTM_FENGSHA '! env var for in-line + LOGICAL, PUBLIC, SAVE :: FENGSHA ! flag for fengsha option + + INTEGER IOSX ! i/o and allocate memory status + + DATA subname( 1), dif0( 1), ar( 1), meso( 1), lebas( 1) / 'SO2 ', 0.1089, 10.0, 0.0, 35.0/ + DATA subname( 2), dif0( 2), ar( 2), meso( 2), lebas( 2) / 'H2SO4 ', 0.1091, 8000.0, 0.0, 49.0/ + DATA subname( 3), dif0( 3), ar( 3), meso( 3), lebas( 3) / 'NO2 ', 0.1361, 2.0, 0.1, 21.0/ + DATA subname( 4), dif0( 4), ar( 4), meso( 4), lebas( 4) / 'NO ', 0.1802, 2.0, 0.0, 14.0/ + DATA subname( 5), dif0( 5), ar( 5), meso( 5), lebas( 5) / 'O3 ', 0.1444, 12.0, 1.0, 21.0/ + DATA subname( 6), dif0( 6), ar( 6), meso( 6), lebas( 6) / 'HNO3 ', 0.1067, 8000.0, 0.0, 35.0/ + DATA subname( 7), dif0( 7), ar( 7), meso( 7), lebas( 7) / 'H2O2 ', 0.1300,34000.0, 1.0, 28.0/ !ar=34,000 such that r_cut=0.7 s/m as in Nguyen et al. 2015 + DATA subname( 8), dif0( 8), ar( 8), meso( 8), lebas( 8) / 'ACETALDEHYDE ', 0.1111, 10.0, 0.0, 56.0/ + DATA subname( 9), dif0( 9), ar( 9), meso( 9), lebas( 9) / 'FORMALDEHYDE ', 0.1554, 10.0, 0.0, 35.0/ + DATA subname( 10), dif0( 10), ar( 10), meso( 10), lebas( 10) / 'METHYLHYDROPEROX', 0.1179, 10.0, 0.3, 49.0/ !meso change from 0.1 to 0.3, Wolfe and Thornton 2011 ACP per J. Bash + DATA subname( 11), dif0( 11), ar( 11), meso( 11), lebas( 11) / 'PEROXYACETIC_ACI', 0.0868, 20.0, 0.1, 70.0/ + DATA subname( 12), dif0( 12), ar( 12), meso( 12), lebas( 12) / 'ACETIC_ACID ', 0.0944, 20.0, 0.0, 63.0/ + DATA subname( 13), dif0( 13), ar( 13), meso( 13), lebas( 13) / 'NH3 ', 0.1978, 20.0, 0.0, 28.0/ + DATA subname( 14), dif0( 14), ar( 14), meso( 14), lebas( 14) / 'PAN ', 0.0687, 16.0, 0.1, 91.0/ + DATA subname( 15), dif0( 15), ar( 15), meso( 15), lebas( 15) / 'HNO2 ', 0.1349, 20.0, 0.1, 28.0/ + DATA subname( 16), dif0( 16), ar( 16), meso( 16), lebas( 16) / 'CO ', 0.1807, 5.0, 0.0, 14.0/ + DATA subname( 17), dif0( 17), ar( 17), meso( 17), lebas( 17) / 'METHANOL ', 0.1329, 2.0, 0.0, 42.0/ + DATA subname( 18), dif0( 18), ar( 18), meso( 18), lebas( 18) / 'N2O5 ', 0.0808, 5000.0, 0.0, 49.0/ + DATA subname( 19), dif0( 19), ar( 19), meso( 19), lebas( 19) / 'NO3 ', 0.1153, 5000.0, 0.0, 28.0/ + DATA subname( 20), dif0( 20), ar( 20), meso( 20), lebas( 20) / 'GENERIC_ALDEHYDE', 0.0916, 10.0, 0.0, 56.0/ + DATA subname( 21), dif0( 21), ar( 21), meso( 21), lebas( 21) / 'CL2 ', 0.1080, 10.0, 0.0, 49.0/ + DATA subname( 22), dif0( 22), ar( 22), meso( 22), lebas( 22) / 'HOCL ', 0.1300, 10.0, 0.0, 38.5/ + DATA subname( 23), dif0( 23), ar( 23), meso( 23), lebas( 23) / 'HCL ', 0.1510, 8000.0, 0.0, 31.5/ + DATA subname( 24), dif0( 24), ar( 24), meso( 24), lebas( 24) / 'FMCL ', 0.1094, 10.0, 0.0, 45.5/ + DATA subname( 25), dif0( 25), ar( 25), meso( 25), lebas( 25) / 'HG ', 0.1194, 0.1, 0.0, 14.8/ ! lebas not used + DATA subname( 26), dif0( 26), ar( 26), meso( 26), lebas( 26) / 'HGIIGAS ', 0.0976, 8000.0, 0.0, 95.0/ ! estimation from back calculating to get dw25 = 1.04e-5 (Garland et al, 1965) + DATA subname( 27), dif0( 27), ar( 27), meso( 27), lebas( 27) / 'TECDD_2378 ', 0.0525, 2.0, 0.0, 217.0/ + DATA subname( 28), dif0( 28), ar( 28), meso( 28), lebas( 28) / 'PECDD_12378 ', 0.0508, 2.0, 0.0, 234.5/ + DATA subname( 29), dif0( 29), ar( 29), meso( 29), lebas( 29) / 'HXCDD_123478 ', 0.0494, 2.0, 0.0, 252.0/ + DATA subname( 30), dif0( 30), ar( 30), meso( 30), lebas( 30) / 'HXCDD_123678 ', 0.0494, 2.0, 0.0, 252.0/ + DATA subname( 31), dif0( 31), ar( 31), meso( 31), lebas( 31) / 'HXCDD_123478 ', 0.0494, 2.0, 0.0, 252.0/ + DATA subname( 32), dif0( 32), ar( 32), meso( 32), lebas( 32) / 'HPCDD_1234678 ', 0.0480, 2.0, 0.0, 269.5/ + DATA subname( 33), dif0( 33), ar( 33), meso( 33), lebas( 33) / 'OTCDD ', 0.0474, 2.0, 0.0, 287.0/ + DATA subname( 34), dif0( 34), ar( 34), meso( 34), lebas( 34) / 'TECDF_2378 ', 0.0534, 2.0, 0.0, 210.0/ + DATA subname( 35), dif0( 35), ar( 35), meso( 35), lebas( 35) / 'PECDF_12378 ', 0.0517, 2.0, 0.0, 227.5/ + DATA subname( 36), dif0( 36), ar( 36), meso( 36), lebas( 36) / 'PECDF_23478 ', 0.0517, 2.0, 0.0, 227.5/ + DATA subname( 37), dif0( 37), ar( 37), meso( 37), lebas( 37) / 'HXCDF_123478 ', 0.0512, 2.0, 0.0, 245.0/ + DATA subname( 38), dif0( 38), ar( 38), meso( 38), lebas( 38) / 'HXCDF_123678 ', 0.0512, 2.0, 0.0, 245.0/ + DATA subname( 39), dif0( 39), ar( 39), meso( 39), lebas( 39) / 'HXCDF_234678 ', 0.0512, 2.0, 0.0, 245.0/ + DATA subname( 40), dif0( 40), ar( 40), meso( 40), lebas( 40) / 'HXCDF_123789 ', 0.0512, 2.0, 0.0, 245.0/ + DATA subname( 41), dif0( 41), ar( 41), meso( 41), lebas( 41) / 'HPCDF_1234678 ', 0.0487, 2.0, 0.0, 262.5/ + DATA subname( 42), dif0( 42), ar( 42), meso( 42), lebas( 42) / 'HPCDF_1234789 ', 0.0487, 2.0, 0.0, 262.5/ + DATA subname( 43), dif0( 43), ar( 43), meso( 43), lebas( 43) / 'OTCDF ', 0.0474, 2.0, 0.0, 280.0/ + DATA subname( 44), dif0( 44), ar( 44), meso( 44), lebas( 44) / 'NAPHTHALENE ', 0.0778, 4.0, 0.0, 119.0/ + DATA subname( 45), dif0( 45), ar( 45), meso( 45), lebas( 45) / '1NITRONAPHTHALEN', 0.0692, 4.0, 0.0, 133.0/ + DATA subname( 46), dif0( 46), ar( 46), meso( 46), lebas( 46) / '2NITRONAPHTHALEN', 0.0692, 4.0, 0.0, 133.0/ + DATA subname( 47), dif0( 47), ar( 47), meso( 47), lebas( 47) / '14NAPHTHOQUINONE', 0.0780, 4.0, 0.0, 119.0/ + DATA subname( 48), dif0( 48), ar( 48), meso( 48), lebas( 48) / 'HEXAMETHYLE_DIIS', 0.0380, 10.0, 0.0, 196.0/ + DATA subname( 49), dif0( 49), ar( 49), meso( 49), lebas( 49) / 'HYDRAZINE ', 0.4164, 20.0, 0.0, 42.0/ + DATA subname( 50), dif0( 50), ar( 50), meso( 50), lebas( 50) / 'MALEIC_ANHYDRIDE', 0.0950, 10.0, 0.0, 70.0/ + DATA subname( 51), dif0( 51), ar( 51), meso( 51), lebas( 51) / '24-TOLUENE_DIIS ', 0.0610, 10.0, 0.0, 154.0/ + DATA subname( 52), dif0( 52), ar( 52), meso( 52), lebas( 52) / 'TRIETHYLAMINE ', 0.0881, 20.0, 0.0, 154.0/ + DATA subname( 53), dif0( 53), ar( 53), meso( 53), lebas( 53) / 'ORG_NTR ', 0.0607, 16.0, 0.0, 160.0/ ! assumes 58.2% C5H11O4N and 41.8% C5H11O3N + DATA subname( 54), dif0( 54), ar( 54), meso( 54), lebas( 54) / 'HYDROXY_NITRATES', 0.0609, 16.0, 0.0, 156.1/ + DATA subname( 55), dif0( 55), ar( 55), meso( 55), lebas( 55) / 'MPAN ', 0.0580, 16.0, 0.1, 133.0/ + DATA subname( 56), dif0( 56), ar( 56), meso( 56), lebas( 56) / 'PPN ', 0.0631, 16.0, 0.1, 118.2/ + DATA subname( 57), dif0( 57), ar( 57), meso( 57), lebas( 57) / 'MVK ', 0.0810, 8.0, 1.0, 88.8/ + DATA subname( 58), dif0( 58), ar( 58), meso( 58), lebas( 58) / 'DINTR ', 0.0617, 16.0, 0.1, 169.8/ + DATA subname( 59), dif0( 59), ar( 59), meso( 59), lebas( 59) / 'NTR_ALK ', 0.0688, 16.0, 0.1, 133.0/ + DATA subname( 60), dif0( 60), ar( 60), meso( 60), lebas( 60) / 'NTR_OH ', 0.0665, 16.0, 0.1, 140.4/ + DATA subname( 61), dif0( 61), ar( 61), meso( 61), lebas( 61) / 'HYDROXY_NITRATES', 0.0646, 16.0, 0.0, 147.8/ + DATA subname( 62), dif0( 62), ar( 62), meso( 62), lebas( 62) / 'PROPNN ', 0.0677, 16.0, 0.0, 133.0/ + DATA subname( 63), dif0( 63), ar( 63), meso( 63), lebas( 63) / 'NITRYL_CHLORIDE ', 0.0888, 8.0, 0.0, 45.5/ ! dif0 estimated following Erickson III et al., JGR, 104, D7, 8347-8372, 1999 + DATA subname( 64), dif0( 64), ar( 64), meso( 64), lebas( 64) / 'ISOPNN ',0.0457, 8.0, 0.0, 206.8/ + DATA subname( 65), dif0( 65), ar( 65), meso( 65), lebas( 65) / 'MTNO3 ',0.0453, 8.0, 0.0, 251.2/ + DATA subname( 66), dif0( 66), ar( 66), meso( 66), lebas( 66) / 'IEPOX ',0.0579, 8.0, 0.0, 110.8/ + DATA subname( 67), dif0( 67), ar( 67), meso( 67), lebas( 67) / 'HACET ',0.1060, 8.0, 0.0, 72.6/ ! dif0 from Nguyen 2015 PNAS + DATA subname( 68), dif0( 68), ar( 68), meso( 68), lebas( 68) / 'SVALK1 ',0.0514, 20.0, 0.0, 280.5/ + DATA subname( 69), dif0( 69), ar( 69), meso( 69), lebas( 69) / 'SVALK2 ',0.0546, 20.0, 0.0, 275.6/ + DATA subname( 70), dif0( 70), ar( 70), meso( 70), lebas( 70) / 'SVBNZ1 ',0.0642, 20.0, 0.0, 134.1/ + DATA subname( 71), dif0( 71), ar( 71), meso( 71), lebas( 71) / 'SVBNZ2 ',0.0726, 20.0, 0.0, 127.5/ + DATA subname( 72), dif0( 72), ar( 72), meso( 72), lebas( 72) / 'SVISO1 ',0.0733, 20.0, 0.0, 126.3/ + DATA subname( 73), dif0( 73), ar( 73), meso( 73), lebas( 73) / 'SVISO2 ',0.0729, 20.0, 0.0, 123.8/ + DATA subname( 74), dif0( 74), ar( 74), meso( 74), lebas( 74) / 'SVPAH1 ',0.0564, 20.0, 0.0, 235.7/ + DATA subname( 75), dif0( 75), ar( 75), meso( 75), lebas( 75) / 'SVPAH2 ',0.0599, 20.0, 0.0, 231.5/ + DATA subname( 76), dif0( 76), ar( 76), meso( 76), lebas( 76) / 'SVSQT ',0.0451, 20.0, 0.0, 346.5/ + DATA subname( 77), dif0( 77), ar( 77), meso( 77), lebas( 77) / 'SVTOL1 ',0.0637, 20.0, 0.0, 153.7/ + DATA subname( 78), dif0( 78), ar( 78), meso( 78), lebas( 78) / 'SVTOL2 ',0.0607, 20.0, 0.0, 194.1/ + DATA subname( 79), dif0( 79), ar( 79), meso( 79), lebas( 79) / 'SVTRP1 ',0.0603, 20.0, 0.0, 194.9/ + DATA subname( 80), dif0( 80), ar( 80), meso( 80), lebas( 80) / 'SVTRP2 ',0.0559, 20.0, 0.0, 218.8/ + DATA subname( 81), dif0( 81), ar( 81), meso( 81), lebas( 81) / 'SVXYL1 ',0.0610, 20.0, 0.0, 154.6/ + DATA subname( 82), dif0( 82), ar( 82), meso( 82), lebas( 82) / 'SVXYL2 ',0.0585, 20.0, 0.0, 194.6/ + DATA subname( 83), dif0( 83), ar( 83), meso( 83), lebas( 83) / 'IO ',0.1002, 8.0, 0.0, 44.4/ + DATA subname( 84), dif0( 84), ar( 84), meso( 84), lebas( 84) / 'OIO ',0.0938, 8.0, 0.0, 51.8/ + DATA subname( 85), dif0( 85), ar( 85), meso( 85), lebas( 85) / 'I2O2 ',0.0732, 8.0, 0.0, 88.8/ + DATA subname( 86), dif0( 86), ar( 86), meso( 86), lebas( 86) / 'I2O3 ',0.0707, 8.0, 0.0, 96.2/ + DATA subname( 87), dif0( 87), ar( 87), meso( 87), lebas( 87) / 'I2O4 ',0.0684, 8.0, 0.0, 103.6/ + DATA subname( 88), dif0( 88), ar( 88), meso( 88), lebas( 88) / 'HI ',0.1045, 8.0, 0.0, 40.7/ + DATA subname( 89), dif0( 89), ar( 89), meso( 89), lebas( 89) / 'HOI ',0.0972, 8.0, 0.0, 48.1/ + DATA subname( 90), dif0( 90), ar( 90), meso( 90), lebas( 90) / 'INO ',0.0882, 8.0, 0.0, 60.9/ + DATA subname( 91), dif0( 91), ar( 91), meso( 91), lebas( 91) / 'INO2 ',0.0883, 20.0, 0.0, 69.2/ + DATA subname( 92), dif0( 92), ar( 92), meso( 92), lebas( 92) / 'IONO2 ',0.0792, 8.0, 0.0, 77.5/ + DATA subname( 93), dif0( 93), ar( 93), meso( 93), lebas( 93) / 'BRO ',0.1144, 1.0, 0.0, 34.4/ + DATA subname( 94), dif0( 94), ar( 94), meso( 94), lebas( 94) / 'HOBR ',0.1101, 1.0, 0.0, 38.1/ + DATA subname( 95), dif0( 95), ar( 95), meso( 95), lebas( 95) / 'HBR ',0.1216, 2.0, 0.0, 30.7/ + DATA subname( 96), dif0( 96), ar( 96), meso( 96), lebas( 96) / 'BRONO2 ',0.0855, 1.0, 0.0, 67.5/ + DATA subname( 97), dif0( 97), ar( 97), meso( 97), lebas( 97) / 'BRNO2 ',0.0909, 1.0, 0.0, 59.2/ + DATA subname( 98), dif0( 98), ar( 98), meso( 98), lebas( 98) / 'BRCL ',0.0966, 1.0, 0.0, 51.6/ + DATA subname( 99), dif0( 99), ar( 99), meso( 99), lebas( 99) / 'DMS ',0.0926, 2.0, 0.0, 77.4/ + DATA subname(100), dif0(100), ar(100), meso(100), lebas(100) / 'MSA ',0.0896, 2.0, 0.0, 77.4/ + DATA subname(101), dif0(101), ar(101), meso(101), lebas(101) / 'METHANE ',0.2107, 2.0, 0.0, 29.6/ ! dif0, equation 9-22. Scwarzenbach et. (1993) Env. Org. Chem. + DATA subname(102), dif0(102), ar(102), meso(102), lebas(102) / 'ACRYACID ',0.0908, 2.0, 0.0, 63.2/ + DATA subname(103), dif0(103), ar(103), meso(103), lebas(103) / 'CARBSULFIDE ',0.1240, 5.0, 0.0, 51.5/ + DATA subname(104), dif0(104), ar(104), meso(104), lebas(104) / 'ACETONITRILE ',0.1280, 5.0, 0.0, 52.3/ + DATA subname(105), dif0(105), ar(105), meso(105), lebas(105) / '6_NITRO_O_CRESOL',0.0664, 16.0, 0.0, 155.0/ ! dif0, equation 9-22. Scwarzenbach et. (1993) Env. Org. Chem. + + CONTAINS + +C======================================================================= + Subroutine INIT_MET ( JDATE, JTIME, MOSAIC, ABFLUX, HGBIDI ) + +C----------------------------------------------------------------------- +C 30 Mar 01 J.Young: dyn alloc - Use HGRD_DEFN; replace INTERP3 with INTERPX; +C allocatable RDEPVHT, RJACM, RRHOJ +C 14 Nov 03 J.Young: add reciprocal vertical Jacobian product for full and +C mid-layer +C Tanya took JACOBF out of METCRO3D! Improvise +C 31 Jan 05 J.Young: dyn alloc - establish both horizontal & vertical +C domain specifications in one module +C 16 Feb 11 S.Roselle: replaced I/O API include files with UTILIO_DEFN +C----------------------------------------------------------------------- + + Use UTILIO_DEFN + + Implicit None + + Include SUBST_FILES_ID ! file name parameters + Include SUBST_CONST ! constants + +C Arguments: + Integer, Intent( IN ) :: JDATE, JTIME ! internal simulation date&time + Logical, Intent( IN ) :: MOSAIC + Logical, Intent( IN ) :: ABFLUX + Logical, Intent( IN ) :: HGBIDI + +C File variables: + Real, Pointer :: MSFX2 ( :,: ) + Real, Pointer :: SOILCAT ( :,: ) + Real, Pointer :: X3M ( : ) + +C Local variables: + Character( 16 ) :: PNAME = 'INIT_MET' + Character( 16 ) :: VNAME + CHARACTER( 16 ) :: UNITSCK + CHARACTER( 30 ) :: MSG1 = ' Error interpolating variable ' + Character( 96 ) :: XMSG = ' ' + +C for INTERPX + Integer STRTCOLGC2, ENDCOLGC2, STRTROWGC2, ENDROWGC2 + Integer V + Integer ALLOCSTAT + +C----------------------------------------------------------------------- + + LOGDEV = INIT3() + + If( MET_INITIALIZED )Return + +!> Allocate buffers + ALLOCATE ( BUFF1D( NLAYS ), + & BUFF2D( NCOLS,NROWS ), + & BUFF3D( NCOLS,NROWS,NLAYS ), STAT = ALLOCSTAT ) + If ( ALLOCSTAT .Ne. 0 ) Then + XMSG = 'Failure allocating Buffers' + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + BUFF1D = 0.0 + BUFF2D = 0.0 + BUFF3D = 0.0 + +!> Allocate shared arrays +!> Met_Data + ALLOCATE( Met_Data%RDEPVHT ( NCOLS,NROWS ), + & Met_Data%DENS1 ( NCOLS,NROWS ), + & Met_Data%PRSFC ( NCOLS,NROWS ), + & Met_Data%Q2 ( NCOLS,NROWS ), + & Met_Data%QSS_GRND ( NCOLS,NROWS ), + & Met_Data%RH ( NCOLS,NROWS ), + & Met_Data%RA ( NCOLS,NROWS ), + & Met_Data%RS ( NCOLS,NROWS ), + & Met_Data%RC ( NCOLS,NROWS ), + & Met_Data%RN ( NCOLS,NROWS ), + & Met_Data%RGRND ( NCOLS,NROWS ), + & Met_Data%HFX ( NCOLS,NROWS ), + & Met_Data%LH ( NCOLS,NROWS ), + & Met_Data%SNOCOV ( NCOLS,NROWS ), + & Met_Data%TEMP2 ( NCOLS,NROWS ), + & Met_Data%TEMPG ( NCOLS,NROWS ), + & Met_Data%TSEASFC ( NCOLS,NROWS ), + & Met_Data%USTAR ( NCOLS,NROWS ), + & Met_Data%VEG ( NCOLS,NROWS ), + & Met_Data%LAI ( NCOLS,NROWS ), + & Met_Data%WR ( NCOLS,NROWS ), + & Met_Data%WSPD10 ( NCOLS,NROWS ), + & Met_Data%WSTAR ( NCOLS,NROWS ), + & Met_Data%Z0 ( NCOLS,NROWS ), + & Met_Data%SOIM1 ( NCOLS,NROWS ), + & Met_Data%SOIT1 ( NCOLS,NROWS ), + & Met_Data%SEAICE ( NCOLS,NROWS ), + & Met_Data%MOL ( NCOLS,NROWS ), + & Met_Data%MOLI ( NCOLS,NROWS ), + & Met_Data%HOL ( NCOLS,NROWS ), + & Met_Data%XPBL ( NCOLS,NROWS ), + & Met_Data%LPBL ( NCOLS,NROWS ), + & Met_Data%CONVCT ( NCOLS,NROWS ), + & Met_Data%PBL ( NCOLS,NROWS ), + & Met_Data%NACL_EMIS( NCOLS,NROWS ), + & Met_Data%UWIND ( NCOLS+1,NROWS+1,NLAYS ), + & Met_Data%VWIND ( NCOLS+1,NROWS+1,NLAYS ), + & Met_Data%KZMIN ( NCOLS,NROWS,NLAYS ), + & Met_Data%PRES ( NCOLS,NROWS,NLAYS ), + & Met_Data%QV ( NCOLS,NROWS,NLAYS ), + & Met_Data%QC ( NCOLS,NROWS,NLAYS ), + & Met_Data%THETAV ( NCOLS,NROWS,NLAYS ), + & Met_Data%TA ( NCOLS,NROWS,NLAYS ), + & Met_Data%ZH ( NCOLS,NROWS,NLAYS ), + & Met_Data%ZF ( NCOLS,NROWS,NLAYS ), + & Met_Data%DZF ( NCOLS,NROWS,NLAYS ), + & Met_Data%DENS ( NCOLS,NROWS,NLAYS ), + & Met_Data%RJACM ( NCOLS,NROWS,NLAYS ), + & Met_Data%RJACF ( NCOLS,NROWS,NLAYS ), + & Met_Data%RRHOJ ( NCOLS,NROWS,NLAYS ), + & STAT = ALLOCSTAT ) + If ( ALLOCSTAT .Ne. 0 ) Then + XMSG = 'Failure allocating met vars' + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + ALLOCATE( Grid_Data%DX3F ( NLAYS ), + & Grid_Data%RDX3F ( NLAYS ), + & Grid_Data%RDX3M ( NLAYS ), + & Grid_Data%RMSFX4 ( NCOLS,NROWS ), + & Grid_Data%LON ( NCOLS,NROWS ), + & Grid_Data%LAT ( NCOLS,NROWS ), + & Grid_Data%LWMASK ( NCOLS,NROWS ), + & Grid_Data%OCEAN ( NCOLS,NROWS ), + & Grid_Data%SZONE ( NCOLS,NROWS ), + & Grid_Data%PURB ( NCOLS,NROWS ), + & Grid_Data%SLTYP ( NCOLS,NROWS ), + & Grid_Data%NAME ( n_lufrac ), + & Grid_Data%LU_Type ( n_lufrac ), + & STAT = ALLOCSTAT ) + If ( ALLOCSTAT .Ne. 0 ) Then + XMSG = 'Failure allocating grid vars' + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + Grid_Data%NAME = name_lu + Grid_Data%LU_Type = cat_lu + + If ( ABFLUX .Or. HGBIDI .Or. MOSAIC ) Then + ALLOCATE( Met_Data%SOIM2 ( NCOLS,NROWS ), + & Met_Data%SOIT2 ( NCOLS,NROWS ), + & STAT = ALLOCSTAT ) + If ( ALLOCSTAT .Ne. 0 ) Then + XMSG = 'Failure allocating mosaic met vars' + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + ALLOCATE( Grid_Data%WSAT ( NCOLS,NROWS ), + & Grid_Data%WWLT ( NCOLS,NROWS ), + & Grid_Data%BSLP ( NCOLS,NROWS ), + & Grid_Data%WRES ( NCOLS,NROWS ), + & Grid_Data%WFC ( NCOLS,NROWS ), + & Grid_Data%LUFRAC ( NCOLS,NROWS,n_lufrac ), + & STAT = ALLOCSTAT ) + If ( ALLOCSTAT .Ne. 0 ) Then + XMSG = 'Failure allocating mosaic grid vars' + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + Grid_Data%WSAT = 0.0 + Grid_Data%WWLT = 0.0 + Grid_Data%WFC = 0.0 + Grid_Data%WRES = 0.0 + Grid_Data%BSLP = 0.0 + + ALLOCATE( Mosaic_Data%USTAR ( NCOLS,NROWS,n_lufrac ), + & Mosaic_Data%LAI ( NCOLS,NROWS,n_lufrac ), + & Mosaic_Data%DELTA ( NCOLS,NROWS,n_lufrac ), + & Mosaic_Data%VEG ( NCOLS,NROWS,n_lufrac ), + & Mosaic_Data%Z0 ( NCOLS,NROWS,n_lufrac ), + & Mosaic_Data%RA ( NCOLS,NROWS,n_lufrac ), + & Mosaic_Data%RSTW ( NCOLS,NROWS,n_lufrac ), + & Mosaic_Data%RINC ( NCOLS,NROWS,n_lufrac ), + & Mosaic_Data%NAME ( n_lufrac ), + & Mosaic_Data%LU_Type ( n_lufrac ), + & STAT = ALLOCSTAT ) + If ( ALLOCSTAT .Ne. 0 ) Then + XMSG = 'Failure allocating mosaic vars' + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + Mosaic_Data%USTAR = 0.0 + Mosaic_Data%LAI = 0.0 + Mosaic_Data%DELTA = 0.0 + Mosaic_Data%VEG = 0.0 + Mosaic_Data%Z0 = 0.000001 + Mosaic_Data%RSTW = 0.0 + Mosaic_Data%RINC = 0.0 + Mosaic_Data%NAME = name_lu + Mosaic_Data%LU_Type = cat_lu + + ALLOCATE( ChemMos_Data%Rb ( NCOLS,NROWS,n_lufrac,ltotg ), + & ChemMos_Data%Rst ( NCOLS,NROWS,n_lufrac,ltotg ), + & ChemMos_Data%Rcut ( NCOLS,NROWS,n_lufrac,ltotg ), + & ChemMos_Data%Rgc ( NCOLS,NROWS,n_lufrac,ltotg ), + & ChemMos_Data%Rgb ( NCOLS,NROWS,n_lufrac,ltotg ), + & ChemMos_Data%Rwat ( NCOLS,NROWS,n_lufrac,ltotg ), + & ChemMos_Data%CZ0 ( NCOLS,NROWS,n_lufrac,ltotg ), + & ChemMos_Data%Cleaf ( NCOLS,NROWS,n_lufrac,ltotg ), + & ChemMos_Data%Cstom ( NCOLS,NROWS,n_lufrac,ltotg ), + & ChemMos_Data%Ccut ( NCOLS,NROWS,n_lufrac,ltotg ), + & ChemMos_Data%Csoil ( NCOLS,NROWS,n_lufrac,ltotg ), + & ChemMos_Data%NAME ( n_lufrac ), + & ChemMos_Data%LU_Type ( n_lufrac ), + & ChemMos_Data%Subname ( n_lufrac ), + & STAT = ALLOCSTAT ) + If ( ALLOCSTAT .Ne. 0 ) Then + XMSG = 'Failure allocating chemistry dependent mosaic vars' + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + ChemMos_Data%Rb = resist_max + ChemMos_Data%Rst = resist_max + ChemMos_Data%Rcut = resist_max + ChemMos_Data%Rgc = resist_max + ChemMos_Data%Rgb = resist_max + ChemMos_Data%Rwat = resist_max + ChemMos_Data%CZ0 = 0.0 + ChemMos_Data%Cleaf = 0.0 + ChemMos_Data%Cstom = 0.0 + ChemMos_Data%Ccut = 0.0 + ChemMos_Data%Csoil = 0.0 + ChemMos_Data%NAME = name_lu + ChemMos_Data%LU_Type = cat_lu + ChemMos_Data%SubName = subname + End If + +!> ccccccccccccccccccccc Fengsha option!ccccccccccccccccccccc + FENGSHA = ENVYN( 'CTM_FENGSHA', + & 'Flag for in-line fengsha ', + & .FALSE., IOSX ) + + ! write(*,*) 'FENGSHA IS = ', FENGSHA + IF ( FENGSHA ) THEN + XMSG = 'Using the Fengsha Wind-Blown dust emission model...' + CALL M3MSG2( XMSG ) + END IF + + If ( FENGSHA ) Then + ALLOCATE( Met_Data%CLAYF ( NCOLS,NROWS ), + & Met_Data%SANDF ( NCOLS,NROWS ), + & Met_Data%DRAG ( NCOLS,NROWS ), + & Met_Data%UTHR ( NCOLS,NROWS ), + & STAT = ALLOCSTAT ) + If ( ALLOCSTAT .Ne. 0 ) Then + XMSG = 'Failure allocating Fengsha variables' + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + End If + +!> ccccccccccccccccccccc enable backward compatiblity ccccccccccccccccccccc + + If ( .Not. desc3( met_cro_2d ) ) Then + xmsg = 'Could not get ' // MET_CRO_2D // ' file description' + Call m3exit( pname, JDATE, JTIME, xmsg, xstat2 ) + End If + + SPC = INDEX1( 'RA', NVARS3D, VNAME3D ) + If (SPC .Gt. 0) rinv = .FALSE. ! Ra and Rst are in units s/m + + SPC = INDEX1( 'WR', NVARS3D, VNAME3D ) + If (SPC .Gt. 0) ifwr = .True. ! canopy wetness is in METCRO2D + + SPC = INDEX1( 'Q2', NVARS3D, VNAME3D ) + If (SPC .Gt. 0) ifq2 = .True. ! two meter mixing ratio in METCRO2D + + SPC = INDEX1( 'TSEASFC', NVARS3D, VNAME3D ) + If (SPC .Gt. 0) ifsst = .True. ! two meter SST in METCRO2D + + SPC = INDEX1( 'LH', NVARS3D, VNAME3D ) + If (SPC .Gt. 0) iflh = .True. ! LH in METCRO2D + + SPC = INDEX1( 'RCA', NVARS3D, VNAME3D ) + If (SPC .Gt. 0) Then + vname_rc = 'RCA' + Else + vname_rc = 'RC' + End If + + SPC = INDEX1( 'RNA', NVARS3D, VNAME3D ) + If (SPC .Gt. 0) Then + vname_rn = 'RNA' + Else + vname_rn = 'RN' + End If + + If ( .Not. desc3( met_dot_3d ) ) Then + xmsg = 'Could not get ' // MET_DOT_3D // ' file description' + Call m3exit( pname, JDATE, JTIME, xmsg, xstat2 ) + End If + + SPC = INDEX1( 'UWINDC', NVARS3D, VNAME3D ) + If (SPC .Gt. 0) Then + vname_uc = 'UWINDC' + CSTAGUV = .TRUE. + Else + vname_uc = 'UWIND' + CSTAGUV = .FALSE. + End If + + SPC = INDEX1( 'VWINDC', NVARS3D, VNAME3D ) + If (SPC .Gt. 0) Then + vname_vc = 'VWINDC' + Else + vname_vc = 'VWIND' + End If + + If ( .Not. desc3( met_cro_3d ) ) Then + xmsg = 'Could not get ' // MET_CRO_3D // ' file description' + Call m3exit( pname, JDATE, JTIME, xmsg, xstat2 ) + End If + + V = INDEX1( 'PRES', NVARS3D, VNAME3D ) + If ( V .Ne. 0 ) Then + UNITSCK = UNITS3D( V ) + Else + XMSG = 'Could not get variable PRES from ' // MET_CRO_3D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + Select Case (UNITSCK) + Case ( 'PASCAL','pascal','Pascal','PA','pa','Pa' ) + CONVPA = 1.0 + P0 = 100000.0 + Case ( 'MILLIBAR','millibar','Millibar','MB','mb','Mb' ) + CONVPA = 1.0E-02 + P0 = 100000.0 * CONVPA + Case ( 'CENTIBAR','centibar','Centibar','CB','cb','Cb' ) + CONVPA = 1.0E-03 + P0 = 100000.0 * CONVPA + Case Default + XMSG = 'Units incorrect on ' // MET_CRO_3D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End Select + + MINKZ = .True. ! default + MINKZ = ENVYN( 'KZMIN', 'Kz min on flag', MINKZ, ALLOCSTAT ) + If ( ALLOCSTAT .Ne. 0 ) Write( LOGDEV,'(5X, A)' ) 'Kz min on flag' + Select Case( ALLOCSTAT ) + Case ( 1 ) + XMSG = 'Environment variable improperly formatted' + Call M3WARN( PNAME, JDATE, JTIME, XMSG ) + Case ( -1 ) + XMSG = 'Environment variable set, but empty ... Using default:' + Write( LOGDEV,'(5X, A)' ) XMSG + Case ( -2 ) + XMSG = 'Environment variable not set ... Using default:' + Write( LOGDEV,'(5X, A)' ) XMSG + End Select + + If ( .Not. MINKZ ) Then + XMSG = 'This run uses Kz0UT, *NOT* KZMIN in subroutine edyintb.' + Write( LOGDEV,'(/5X, A, /)' ) XMSG + End If + +!> Open the met files + + Call SUBHFILE ( GRID_CRO_2D, GXOFF, GYOFF, + & STRTCOLGC2, ENDCOLGC2, STRTROWGC2, ENDROWGC2 ) + Call SUBHFILE ( MET_CRO_2D, GXOFF, GYOFF, + & STRTCOLMC2, ENDCOLMC2, STRTROWMC2, ENDROWMC2 ) + Call SUBHFILE ( MET_CRO_3D, GXOFF, GYOFF, + & STRTCOLMC3, ENDCOLMC3, STRTROWMC3, ENDROWMC3 ) + Call SUBHFILE ( MET_DOT_3D, GXOFF, GYOFF, + & STRTCOLMD3, ENDCOLMD3, STRTROWMD3, ENDROWMD3 ) + CALL SUBHFILE ( OCEAN_1, GXOFF, GYOFF, + & STRTCOL_O1, ENDCOL_O1, STRTROW_O1, ENDROW_O1 ) +!> Get sigma coordinate variables + X3M => BUFF1D + Do L = 1, NLAYS + Grid_Data%DX3F( L ) = X3FACE_GD( L ) - X3FACE_GD( L-1 ) + Grid_Data%RDX3F( L ) = 1.0 / Grid_Data%DX3F( L ) + X3M( L ) = 0.5 * ( X3FACE_GD( L ) + X3FACE_GD( L-1 ) ) + End Do + Do L = 1, NLAYS - 1 + Grid_Data%RDX3M( L ) = 1.0 / ( X3M( L+1 ) - X3M( L ) ) + End Do + Grid_Data%RDX3M( NLAYS ) = 0.0 +!> nullify pointer + Nullify( X3M ) + +!> reciprical of msfx2**2 +!> assign MSFX2 + MSFX2 => BUFF2D + VNAME = 'MSFX2' + If ( .Not. INTERPX( GRID_CRO_2D, VNAME, PNAME, + & STRTCOLGC2,ENDCOLGC2, STRTROWGC2,ENDROWGC2, 1,1, + & JDATE, JTIME, MSFX2 ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // GRID_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + Grid_Data%RMSFX4 = 1.0 / ( MSFX2**2 ) +!> nullify pointer + Nullify( MSFX2 ) + + VNAME = 'LON' + If ( .Not. INTERPX( GRID_CRO_2D, VNAME, PNAME, + & STRTCOLGC2,ENDCOLGC2, STRTROWGC2,ENDROWGC2, 1,1, + & JDATE, JTIME, Grid_Data%LON ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // GRID_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'LAT' + If ( .Not. INTERPX( GRID_CRO_2D, VNAME, PNAME, + & STRTCOLGC2,ENDCOLGC2, STRTROWGC2,ENDROWGC2, 1,1, + & JDATE, JTIME, Grid_Data%LAT ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // GRID_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'LWMASK' + If ( .Not. INTERPX( GRID_CRO_2D, VNAME, PNAME, + & STRTCOLGC2,ENDCOLGC2, STRTROWGC2,ENDROWGC2, 1,1, + & JDATE, JTIME, Grid_Data%LWMASK ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // GRID_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'PURB' + If ( .Not. INTERPX( GRID_CRO_2D, VNAME, PNAME, + & STRTCOLGC2,ENDCOLGC2, STRTROWGC2,ENDROWGC2, 1,1, + & JDATE, JTIME, Grid_Data%PURB ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // GRID_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + SOILCAT => BUFF2D + VNAME = 'SLTYP' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, SOILCAT ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + Grid_Data%SLTYP = NINT( SOILCAT ) + Nullify( SOILCAT ) + + If ( ABFLUX .Or. MOSAIC ) Then + Do l = 1, n_lufrac + Write( vname,'( "LUFRAC_",I2.2 )' ) l + If ( .Not. INTERPX( GRID_CRO_2D, VNAME, PNAME, + & STRTCOLGC2,ENDCOLGC2, STRTROWGC2,ENDROWGC2, 1,1, + & JDATE, JTIME, Grid_Data%LUFRAC( :,:,l ) ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // GRID_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + End Do + + Forall( C = 1:MY_NCOLS, R = 1:MY_NROWS, Grid_Data%SLTYP(C,R) .Le. 11 ) + Grid_Data%WSAT( C,R ) = WSAT( Grid_Data%SLTYP( C,R ) ) + Grid_Data%WWLT( C,R ) = WWLT( Grid_Data%SLTYP( C,R ) ) + Grid_Data%WFC ( C,R ) = WFC ( Grid_Data%SLTYP( C,R ) ) + Grid_Data%WRES( C,R ) = WRES( Grid_Data%SLTYP( C,R ) ) + Grid_Data%BSLP( C,R ) = BSLP( Grid_Data%SLTYP( C,R ) ) + End Forall + End If + +!> Read fractional seawater and surf-zone coverage from the OCEAN file. +!> Store results in the OCEAN and SZONE arrays. + IF ( .NOT. OPEN3( OCEAN_1, FSREAD3, PNAME ) ) THEN + XMSG = 'Open failure for ' // OCEAN_1 + CALL M3WARN( PNAME, JDATE, JTIME, XMSG ) + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + END IF + + VNAME = 'OPEN' + If ( .Not. INTERPX( OCEAN_1, VNAME, PNAME, + & STRTCOL_O1,ENDCOL_O1, STRTROW_O1,ENDROW_O1, + & 1,1,JDATE, JTIME, Grid_Data%OCEAN ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // OCEAN_1 + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'SURF' + If ( .Not. INTERPX( OCEAN_1, VNAME, PNAME, + & STRTCOL_O1,ENDCOL_O1, STRTROW_O1,ENDROW_O1, + & 1,1,JDATE, JTIME, Grid_Data%SZONE ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // OCEAN_1 + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + MET_INITIALIZED = .true. + + Return + End Subroutine INIT_MET + +C======================================================================= + Subroutine GET_MET ( JDATE, JTIME, TSTEP, MOSAIC, ABFLUX, HGBIDI ) + +C----------------------------------------------------------------------- +C 30 Mar 01 J.Young: dyn alloc - Use HGRD_DEFN; replace INTERP3 with INTERPX; +C allocatable RDEPVHT, RJACM, RRHOJ +C 14 Nov 03 J.Young: add reciprocal vertical Jacobian product for full and +C mid-layer +C Tanya took JACOBF out of METCRO3D! Improvise +C 31 Jan 05 J.Young: dyn alloc - establish both horizontal & vertical +C domain specifications in one module +C 16 Feb 11 S.Roselle: replaced I/O API include files with UTILIO_DEFN +C----------------------------------------------------------------------- + + USE GRID_CONF ! horizontal & vertical domain specifications + Use UTILIO_DEFN +#ifdef parallel + USE SE_MODULES ! stenex (using SE_COMM_MODULE) +#else + USE NOOP_MODULES ! stenex (using NOOP_COMM_MODULE) +#endif + + Implicit None + + Include SUBST_FILES_ID ! file name parameters + Include SUBST_PE_COMM ! PE communication displacement and direction + Include SUBST_CONST ! constants + +C Arguments: + + Integer, Intent( IN ) :: JDATE, JTIME, TSTEP ! internal simulation date&time + Logical, Intent( IN ) :: MOSAIC + Logical, Intent( IN ) :: ABFLUX + Logical, Intent( IN ) :: HGBIDI + +C Parameters: + Real, Parameter :: cond_min = 1.0 / resist_max ! minimum conductance [m/s] + Real, Parameter :: KZMAXL = 500.0 ! upper limit for min Kz [m] + Real, Parameter :: KZ0UT = 1.0 ! minimum eddy diffusivity [m**2/sec] KZ0 + Real, Parameter :: KZL = 0.01 ! lowest KZ + Real, Parameter :: KZU = 1.0 ! 2.0 ! highest KZ + Real, Parameter :: EPS = 1.0E-08 ! small number for temperature difference + +C Local variables: + Real FINT + Real CPAIR, LV, QST + Real TMPFX, TMPVTCON, TST, TSTV + Real, Pointer :: Es_Grnd ( :,: ) + Real, Pointer :: Es_Air ( :,: ) + Real, Pointer :: TV ( :,:,: ) + Integer LP + Integer C, R, L ! loop induction variables + + Character( 16 ) :: PNAME = 'GET_MET' + Character( 16 ) :: VNAME + CharactER( 30 ) :: MSG1 = ' Error interpolating variable ' + Character( 96 ) :: XMSG = ' ' + +C----------------------------------------------------------------------- +C Interpolate file input variables and format for output +C-------------------------------- MET_CRO_3D -------------------------------- + + VNAME = 'ZH' + If ( .Not. INTERPX( MET_CRO_3D, VNAME, PNAME, + & STRTCOLMC3,ENDCOLMC3, STRTROWMC3,ENDROWMC3, 1,NLAYS, + & JDATE, JTIME, Met_Data%ZH ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_3D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'PRES' + If ( .Not. INTERPX( MET_CRO_3D, VNAME, PNAME, + & STRTCOLMC3,ENDCOLMC3, STRTROWMC3,ENDROWMC3, 1,NLAYS, + & JDATE, JTIME, Met_Data%PRES ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_3D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'ZF' + If ( .Not. INTERPX( MET_CRO_3D, VNAME, PNAME, + & STRTCOLMC3,ENDCOLMC3, STRTROWMC3,ENDROWMC3, 1,NLAYS, + & JDATE, JTIME, Met_Data%ZF ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_3D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'DENS' + If ( .Not. INTERPX( MET_CRO_3D, VNAME, PNAME, + & STRTCOLMC3,ENDCOLMC3, STRTROWMC3,ENDROWMC3, 1,NLAYS, + & JDATE, JTIME, Met_Data%DENS ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_3D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT 1 ) + End If + + Met_Data%DENS1 = Met_Data%DENS( :,:,1 ) + + VNAME = 'JACOBM' + If ( .Not. INTERPX( MET_CRO_3D, VNAME, PNAME, + & STRTCOLMC3,ENDCOLMC3, STRTROWMC3,ENDROWMC3, 1,NLAYS, + & JDATE, JTIME, Met_Data%RJACM ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_3D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + Met_Data%RJACM = 1.0 / Met_Data%RJACM + + VNAME = 'JACOBF' + If ( .Not. INTERPX( MET_CRO_3D, VNAME, PNAME, + & STRTCOLMC3,ENDCOLMC3, STRTROWMC3,ENDROWMC3, 1,NLAYS, + & JDATE, JTIME, Met_Data%RJACF ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_3D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + Met_Data%RJACF = 1.0 / Met_Data%RJACF + + VNAME = 'DENSA_J' + If ( .Not. INTERPX( MET_CRO_3D, VNAME, PNAME, + & STRTCOLMC3,ENDCOLMC3, STRTROWMC3,ENDROWMC3, 1,NLAYS, + & JDATE, JTIME, Met_Data%RRHOJ ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_3D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + Met_Data%RRHOJ = 1.0 / Met_Data%RRHOJ + + VNAME = 'TA' + IF ( .NOT. INTERPX( MET_CRO_3D, VNAME, PNAME, + & STRTCOLMC3,ENDCOLMC3, STRTROWMC3,ENDROWMC3, 1,NLAYS, + & JDATE, JTIME, Met_Data%TA ) ) THEN + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_3D + CALL M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + END IF + + VNAME = 'QV' + IF ( .NOT. INTERPX( MET_CRO_3D, VNAME, PNAME, + & STRTCOLMC3,ENDCOLMC3, STRTROWMC3,ENDROWMC3, 1,NLAYS, + & JDATE, JTIME, Met_Data%QV ) ) THEN + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_3D + CALL M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + END IF + + VNAME = 'QC' + IF ( .NOT. INTERPX( MET_CRO_3D, VNAME, PNAME, + & STRTCOLMC3,ENDCOLMC3, STRTROWMC3,ENDROWMC3, 1,NLAYS, + & JDATE, JTIME, Met_Data%QC ) ) THEN + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_3D + CALL M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + END IF + +C-------------------------------- MET_CRO_2D -------------------------------- +C Vegetation and surface vars + VNAME = 'LAI' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%LAI ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'VEG' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%VEG ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'ZRUF' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%Z0 ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If +C FENGSHA vars + If ( FENGSHA ) Then + VNAME = 'CLAYF' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2,1,1, + & JDATE, JTIME, Met_Data%CLAYF ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'SANDF' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2,1,1, + & JDATE, JTIME, Met_Data%SANDF ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'DRAG' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2,1,1, + & JDATE, JTIME, Met_Data%DRAG ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'UTHR' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2,1,1, + & JDATE, JTIME, Met_Data%UTHR ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + End If +C Soil vars + VNAME = 'SOIM1' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%SOIM1 ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + If ( ABFLUX .Or. HGBIDI .Or. MOSAIC ) Then + VNAME = 'SOIM2' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%SOIM2 ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'SOIT2' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%SOIT2 ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + End If + + VNAME = 'SOIT1' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%SOIT1 ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'SEAICE' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%SEAICE ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + +C met vars + + VNAME = 'PRSFC' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%PRSFC ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'RGRND' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%RGRND ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'SNOCOV' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%SNOCOV ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + Where( Met_Data%SNOCOV .Lt. 0.0 ) + Met_Data%SNOCOV = 0.0 + End Where + + VNAME = 'TEMP2' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%TEMP2 ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'TEMPG' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%TEMPG ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'USTAR' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%USTAR ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'WSPD10' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%WSPD10 ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'HFX' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%HFX ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + If ( iflh ) Then + VNAME = 'LH' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%LH ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + Else ! for backward compatibility + VNAME = 'QFX' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%LH ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + End If + + VNAME = 'PBL' + IF ( .NOT. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%PBL ) ) THEN + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + CALL M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + END IF + +C Met_cro_2D variables that have recently changed due to MCIP or WRF/CMAQ + + If ( .Not. INTERPX( MET_CRO_2D, vname_rn, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%RN ) ) Then + XMSG = MSG1 // TRIM( vname_rn ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + If ( .Not. INTERPX( MET_CRO_2D, vname_rc, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%RC ) ) Then + XMSG = MSG1 // TRIM( vname_rc ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + If ( ifwr ) Then + VNAME = 'WR' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%WR ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + End If + + If ( ifsst ) Then + VNAME = 'TSEASFC' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%TSEASFC ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + Else + Met_Data%TSEASFC = Met_Data%TEMPG + End If + + If ( rinv ) Then + VNAME = 'RADYNI' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%RA ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + Where( Met_Data%RA .Gt. cond_min ) + Met_Data%RA = 1.0/Met_Data%RA + Elsewhere + Met_Data%RA = resist_max + End Where + + VNAME = 'RSTOMI' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%RS ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + Where( Met_Data%RS .Gt. cond_min ) + Met_Data%RS = 1.0 / Met_Data%RS + Elsewhere + Met_Data%RS = resist_max + End Where + + Else + + VNAME = 'RA' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%RA ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + VNAME = 'RS' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%RS ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + + End If + + If ( ifq2 ) Then ! Q2 in METCRO2D + VNAME = 'Q2' + If ( .Not. INTERPX( MET_CRO_2D, VNAME, PNAME, + & STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2, 1,1, + & JDATE, JTIME, Met_Data%Q2 ) ) Then + XMSG = MSG1 // TRIM( VNAME ) // ' from ' // MET_CRO_2D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT1 ) + End If + Else + Met_Data%Q2 = Met_Data%QV( :,:,1 ) + End If + + Es_Grnd => BUFF2D + Where( Met_Data%TEMPG .Lt. stdtemp ) + Es_Grnd = vp0 *Exp( 22.514 - ( 6.15e3 / Met_Data%TEMPG ) ) + Elsewhere + Es_Grnd = vp0 *Exp( svp2 * ( Met_Data%TEMPG -stdtemp ) / ( Met_Data%TEMPG -svp3 ) ) + End Where + Met_Data%QSS_GRND = Es_Grnd * 0.622 / ( Met_Data%PRSFC - Es_Grnd ) + Nullify( Es_Grnd ) + + Es_Air => BUFF2D + Where( Met_Data%TEMP2 .Lt. stdtemp ) + Es_Air = vp0 *Exp( 22.514 - ( 6.15e3 / Met_Data%TEMP2 ) ) + Elsewhere + Es_Air = vp0 *Exp( svp2 * ( Met_Data%TEMP2 -stdtemp ) / ( Met_Data%TEMP2 -svp3 ) ) + End Where + Met_Data%RH = Met_Data%Q2 / ( Es_Air * 0.622 / ( Met_Data%PRSFC - Es_Air ) ) * 100.0 + Where( Met_Data%RH .Gt. 100.0 ) + Met_Data%RH = 100.0 + Elsewhere( Met_Data%RH .lt. 0.0 ) + Met_Data%RH = 0.0 + End Where + Nullify( Es_Air ) + +C-------------------------------- MET_DOT_3D -------------------------------- + If ( .Not. INTERPX( MET_DOT_3D, vname_uc, PNAME, + & STRTCOLMD3,ENDCOLMD3, STRTROWMD3,ENDROWMD3, 1,NLAYS, + & JDATE, JTIME, Met_Data%UWIND ) ) Then + XMSG = MSG1 // TRIM( vname_uc ) // ' from ' // MET_DOT_3D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT 1 ) + End If + + If ( .Not. INTERPX( MET_DOT_3D, vname_vc, PNAME, + & STRTCOLMD3,ENDCOLMD3, STRTROWMD3,ENDROWMD3, 1,NLAYS, + & JDATE, JTIME, Met_Data%VWIND ) ) Then + XMSG = MSG1 // TRIM( vname_vc ) // ' from ' // MET_DOT_3D + Call M3EXIT( PNAME, JDATE, JTIME, XMSG, XSTAT 1 ) + End If + +C get ghost values for wind fields in case of free trop. + CALL SUBST_COMM ( Met_Data%UWIND, DSPL_N0_E1_S0_W0, DRCN_E ) + CALL SUBST_COMM ( Met_Data%VWIND, DSPL_N1_E0_S0_W0, DRCN_N ) + +C-------------------------------- Calculated Variables -------------------------------- + Met_Data%DZF = Met_Data%ZF - EOSHIFT(Met_Data%ZF, Shift = -1, Boundary = 0.0, Dim = 3) + + Met_Data%RDEPVHT = 1.0 / Met_Data%ZF( :,:,1 ) + + IF ( MINKZ ) THEN + Met_Data%KZMIN = KZL + DO L = 1, NLAYS + Where( Met_Data%ZF( :,:,L ) .LE. KZMAXL ) + Met_Data%KZMIN( :,:,L ) = KZL + ( KZU - KZL ) * 0.01 * Grid_data%PURB + End Where + End Do + ELSE + Met_Data%KZMIN = KZ0UT + END IF + + TV => BUFF3D + TV = Met_Data%TA * ( 1.0 + 0.608 * Met_Data%QV ) + Met_Data%THETAV = TV * ( P0 / Met_Data%PRES ) ** 0.286 + Nullify( TV ) + +C------ Updating MOL, then WSTAR, MOLI, HOL + DO R = 1, MY_NROWS + DO C = 1, MY_NCOLS + ! CPAIR = 1004.67 * ( 1.0 + 0.84 * Met_Data%QV( C,R,1 ) ) ! J/(K KG) + CPAIR = CPD * ( 1.0 + 0.84 * Met_Data%QV( C,R,1 ) ) ! J/(K KG) + TMPFX = Met_Data%HFX( C,R ) / ( CPAIR * Met_Data%DENS( C,R,1 ) ) + TMPVTCON = 1.0 + 0.608 * Met_Data%QV( C,R,1 ) ! Conversion factor for virtual temperature + TST = -TMPFX / Met_Data%USTAR( C,R ) + IF ( Met_Data%TA( C,R,1 ) .GT. STDTEMP ) THEN + LV = LV0 - ( 0.00237 * ( Met_Data%TA( C,R,1 ) - STDTEMP ) ) * 1.0E6 + ELSE + LV = 2.83E6 ! Latent heat of sublimation at 0C from Stull (1988) (J/KG) + END IF + QST = -( Met_Data%LH( C,R ) / LV ) + & / ( Met_Data%USTAR( C,R ) * Met_Data%DENS( C,R,1 ) ) + TSTV = TST * TMPVTCON + Met_Data%THETAV( C,R,1 ) * 0.608 * QST + IF ( ABS( TSTV ) .LT. 1.0E-6 ) THEN + TSTV = SIGN( 1.0E-6, TSTV ) + END IF + Met_Data%MOL( C,R ) = Met_Data%THETAV( C,R,1 ) + & * Met_Data%USTAR( C,R ) ** 2 / ( karman * GRAV * TSTV ) + IF ( Met_Data%MOL( C,R ) .LT. 0.0 ) THEN + Met_Data%WSTAR( C,R ) = Met_Data%USTAR( C,R ) * ( Met_Data%PBL( C,R ) + & / ( karman * ABS( Met_Data%MOL( C,R ) ) ) ) ** 0.333333 + ELSE + Met_Data%WSTAR( C,R ) = 0.0 + END IF + + END DO + END DO + + Met_Data%MOLI = 1.0 / Met_Data%MOL + Met_Data%HOL = Met_Data%PBL / Met_Data%MOL +C------ + + Met_Data%CONVCT = .FALSE. + DO R = 1, MY_NROWS + DO C = 1, MY_NCOLS + DO L = 1, NLAYS + IF ( Met_Data%PBL( C,R ) .LT. Met_Data%ZF( C,R,L ) ) THEN + LP = L; EXIT + END IF + END DO + + Met_Data%LPBL( C,R ) = LP + If ( LP .Eq. 1 ) Then + FINT = ( Met_Data%PBL( C,R ) ) + & / ( Met_Data%ZF( C,R,LP ) ) + Met_Data%XPBL( C,R ) = FINT * ( X3FACE_GD( LP ) - X3FACE_GD( LP-1 ) ) + & + X3FACE_GD( LP-1 ) + Else + FINT = ( Met_Data%PBL( C,R ) - Met_Data%ZF( C,R,LP-1 ) ) + & / ( Met_Data%ZF( C,R,LP ) - Met_Data%ZF( C,R,LP-1 ) ) + Met_Data%XPBL( C,R ) = FINT * ( X3FACE_GD( LP ) - X3FACE_GD( LP-1 ) ) + & + X3FACE_GD( LP-1 ) + End If + END DO + END DO + Where( Met_Data%THETAV( :,:,1 ) - Met_Data%THETAV( :,:,2 ) .Gt. EPS .And. + & Met_Data%HOL .Lt. -0.02 .And. Met_Data%LPBL .Gt. 3 ) + Met_Data%CONVCT = .True. + End Where + + Return + End Subroutine GET_MET + + End Module ASX_DATA_MOD diff --git a/src/model/src/DUST_EMIS.F b/src/model/src/DUST_EMIS.F new file mode 100644 index 00000000..bd1a8125 --- /dev/null +++ b/src/model/src/DUST_EMIS.F @@ -0,0 +1,1527 @@ + +!------------------------------------------------------------------------! +! The Community Multiscale Air Quality (CMAQ) system software is in ! +! continuous development by various groups and is based on information ! +! from these groups: Federal Government employees, contractors working ! +! within a United States Government contract, and non-Federal sources ! +! including research institutions. These groups give the Government ! +! permission to use, prepare derivative works of, and distribute copies ! +! of their work in the CMAQ system to the public and to permit others ! +! to do so. The United States Environmental Protection Agency ! +! therefore grants similar permission to use the CMAQ system software, ! +! but users are requested to provide copies of derivative works or ! +! products designed to operate in the CMAQ system to the United States ! +! Government without restrictions as to use by others. Software ! +! that is used with the CMAQ system but distributed under the GNU ! +! General Public License or the GNU Lesser General Public License is ! +! subject to their copyright restrictions. ! +!------------------------------------------------------------------------! + + +C RCS file, release, date & time of last delta, author, state, [and locker] +C $Header: /project/work/rep/arc/CCTM/src/emis/emis/DUST_EMIS.F,v 1.6 2011/10/21 16:10:45 yoj Exp $ + +C::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + module dust_emis + +C----------------------------------------------------------------------- +C Description: +C * Extracts selected landuse categories from BELD01 and BELD03 and merges +C * the selections into a dust-related landuse array (ULAND). + +C Optionally, reads 3 gridded crop calendar file and calculates an +C erodible agriculture land fraction. (cropcal) + +C * Applies a predetermined removal fraction in and below canopy to +C * ULAND and determines a transport factor (TFB) for this regime. +C * = applies to tfbelow + +C Function: 3d point source emissions interface to the chemistry-transport model + +C Revision History: +C 16 Dec 10 J.Young: Adapting Daniel Tong`s work on windblown dust +C 21 Apr 11 S.Roselle: replaced I/O API include files with UTILIO_DEFN +C 11 May 11 D.Wong: incorporated twoway model implementation +C 8 Jul 11 J.Young: unified string lengths in character lists for compiler compatibility +C 11 Nov 11 J.Young: generalizing land use/cover +C 8 Jun 12 J.Young: remove full character blank padding for GNU Fortran (GCC) 4.1.2 +C 13 Jul 12 J.Young: following Daniel Tong: changed clayc, siltc, sandc units from mass +C fraction to %; adjusted F/G (vertical to horizontal flux) ratio +C to be continuous for clay content > 20% +C 30 Sep 13 J.Young: corrected diag file units description; added snow cover adjustment; +C adjusted F/G (vertical to horizontal flux) ratio to be continuous +C for clay content > 0.2; convert volumetric soil moisture to +C gravimetric water content; corrected soil moisture factor (fmoit); +C use lwmask>0 rather than sltyp>0 (non-existent) for over water test +C 15 Sep 15 H.Foroutan: revised threshold friction velocity parameterization +C 20 Oct 15 H.Foroutan: Updated the calculation of the threshold velocity(U*t), which is +C now based on dust particle size, following Shao and Lu [JGR,2000]. +C Implemented a dynamic vegetation fraction based on the MODIS FPAR. +C Introduced a new parametrization for surface roughness (z0) +C applicable to dust emission schemes, and accordingly calculated +C the friction velocity (U*) at the surface using 10m wind speed +C and the new (microspcopic) surface roughness. +C Surface roughness adjusted for estimated annual vegetation height. +C Included drag partitioning coefficient. Updated the calculation of +C the vertical-to-horizontal flux based on Lu and Shao [JGR,1999]. +C Updated the dust diag output file accordingly. +C 8 Jan 16 J.Young: Changes for computational efficiency +C 2 Feb 16 J.Young: move dust aero speciation table to AERO_DATA +C----------------------------------------------------------------------- + use lus_defn + use aero_data + USE ASX_DATA_MOD, ONLY : MET_DATA !uses met data + + implicit none + +C windblown dust emissions rates + real, allocatable, save :: dustoutm( :,:,:,: ) ! mass emission rates [g/m**3/s] + real, allocatable, save :: dustoutn( :,:,: ) ! number emission rates [1/m**3/s] + real, allocatable, save :: dustouts( :,:,: ) ! surface-area emisrates [m2/m**3/s] + + public ndust_spc, dustoutm, dustoutn, dustouts, dust_spc, + & dust_emis_init, get_dust_emis + private + + real, allocatable, save :: dust_em( :,: ) ! total dust emissions [g/m**3/s] + +C updated values of mass fraction for "freshly emitted dust" +C based on Kok [PNAS, 2011] and Nabat et al. [ACP, 2012] + real, parameter :: fracmj = 0.07 ! mass fraction assigned to accum mode + real, parameter :: fracmk = 0.93 ! mass fraction assigned to coarse mode + +C diam`s from fracmj,fracmk-weighted 2 2-bin averages of geom means +C 2 J-mode bins: 0.1-1.0, 1.0-2.5 um +C 2 K-mode bins: 2.5-5.0, 5.0-10.0 um + real, parameter :: dgvj = 1.3914 ! geom mean diam of accum mode [um] + real, parameter :: dgvk = 5.2590 ! geom mean diam of coarse mode [um] + real, parameter :: sigj = 2.0000 ! geom std deviation of accum mode flux + real, parameter :: sigk = 2.0000 ! geom std deviation of coarse mode flux + +C Local Variables: + +C Factors for converting 3rd moment emission rates into number and 2nd moment +C emission rates. (Diameters in [um] changed to [m] ) See Equations 7b and 7c +C of Binkowski & Roselle (2003) + real :: l2sgj ! [ln( sigj )] ** 2 + real :: l2sgk ! [ln( sigk )] ** 2 + real, save :: factnumj ! = exp( 4.5 * l2sgj ) / dgvj ** 3 * 1.0e18 + real, save :: factnumk ! = exp( 4.5 * l2sgk ) / dgvk ** 3 * 1.0e18 + real, save :: factm2j ! = exp( 0.5 * l2sgj ) / dgvj * 1.0e6 + real, save :: factm2k ! = exp( 0.5 * l2sgk ) / dgvk * 1.0e6 + real, save :: factsrfj ! = pi * factm2j + real, save :: factsrfk ! = pi * factm2k + + real, save :: dustmode_dens( n_mode ) ! average modal density [kg/m**3] + real :: sumsplit, sumfrac + integer :: n, idx + +C Number of soil types: For both WRF and MM5-PX met models, there are 16 types; +C the first 12 soil types are used and the rest lumped into Other. + integer, parameter :: nsltyp = 13 + +C Variables for the windblown dust diagnostic file: + logical, save :: dustem_diag ! flag for dustemis diagnostic file + integer, parameter :: fndust_diag = 19 ! number of fixed diagnostic output vars + integer, save :: ndust_diag ! number of diagnostic output vars + real, allocatable, save :: diagv( : ) ! diagnostic output variables + real, allocatable, save :: dustbf( :,:,: ) ! diagnostic accumulate buffer + +#ifdef verbose_wbdust + real, allocatable, save :: sdiagv( : ) ! global sum of each diag output var +#endif + + type diag_type + character( 16 ) :: var + character( 16 ) :: units + character( 80 ) :: desc + end type diag_type + + type( diag_type ), allocatable, save :: diagnm( : ) + type( diag_type ), allocatable, save :: vdiagnm_emis( : ) + type( diag_type ), allocatable, save :: vdiagnm_frac( : ) + type( diag_type ), allocatable, save :: vdiagnm_ustar( : ) + type( diag_type ), allocatable, save :: vdiagnm_kvh( : ) + type( diag_type ), allocatable, save :: vdiagnm_rough( : ) + + character( 10 ) :: truncnm + character( 16 ) :: vnm + + type( diag_type ), parameter :: fdiagnm( fndust_diag ) = (/ +C var units desc +C ---------------- -------- ------------------------------------------- + & diag_type( 'Cropland_Emis ', 'g/m**3/s', 'emissions for cropland landuse type '), + & diag_type( 'Desertland_Emis ', 'g/m**3/s', 'total emis for desert types and cropland '), + & diag_type( 'Cropland_Frac ', 'percent ', 'cropland erodible landuse fraction (%) '), + & diag_type( 'Desertland_Frac ', 'percent ', 'total desert fraction (%) '), + & diag_type( 'Cropland_Ustar ', 'm/s ', 'u* for cropland '), + & diag_type( 'Cropland_kvh ', '1/m ', 'cropland vert to horiz flux ratio '), + & diag_type( 'Cropland_Rough ', ' ', 'cropland surface roughness factor '), + & diag_type( 'Soil_Moist_Fac ', ' ', 'soil moisture factor for threshold u* '), + & diag_type( 'Soil_Erode_Pot ', ' ', 'soil -> dust erodiblity potential '), + & diag_type( 'Mx_Adsrb_H2O_Frc', ' ', 'max adsorbed water fraction '), + & diag_type( 'Vegetation_Frac ', ' ', 'vegetation land coverage '), + & diag_type( 'Urban_Cover ', 'percent ', 'urban land coverage '), + & diag_type( 'Forest_Cover ', 'percent ', 'forest land coverage '), + & diag_type( 'Trfac_Above_Can ', ' ', 'transport factor above canopy '), + & diag_type( 'Trfac_Inside_Can', ' ', 'transport factor in and below canopy '), + & diag_type( 'ANUMJ ', '#/s ', 'accumulation mode number '), + & diag_type( 'ANUMK ', '#/s ', 'coarse mode number '), + & diag_type( 'ASRFJ ', 'm**2/s ', 'accumulation mode surface area '), + & diag_type( 'ASRFK ', 'm**2/s ', 'coarse mode surface area ')/) + +C Module shared variables: + real, allocatable, save :: agland( :,: ) ! agriculture land fraction + real, allocatable, save :: wmax ( :,: ) ! max adsorb water percent + real, allocatable, save :: kvh ( :,:,: ) ! ratio of vertical flux / horizontal (k factor) + real, allocatable, save :: sd_ep ( :,: ) ! soil->dust erodiblity potential + real, allocatable, save :: tfb ( :,: ) ! transport fraction in and below canopy + real, allocatable, save :: fpar ( :,: ) ! modis fpar + + integer, save :: sdate, stime ! scenario start date & time + + real :: eropot( 3 ) = ! erodible potential of soil components + & (/ 0.08, ! clay + & 1.00, ! silt + & 0.12 /) ! sand + + integer, save :: logdev + + CONTAINS + +C======================================================================= + function dust_emis_init( jdate, jtime, tstep ) result( success ) + +C Revision History. +C Aug 12, 15 D. Wong: Replaced MYPE with IO_PE_INCLUSIVE for parallel I/O +C implementation + + use hgrd_defn ! horizontal domain specifications + use aero_data ! aerosol species definitions + use asx_data_mod ! meteorology data + use utilio_defn + +C Arguments: + integer, intent( in ) :: jdate ! current model date, coded YYYYDDD + integer, intent( in ) :: jtime ! current model time, coded HHMMSS + integer, intent( in ) :: tstep ! output time step + logical success + +C Includes: + include SUBST_FILES_ID ! file name parameters + +C External Functions: + integer, external :: setup_logdev + +C Local variables: + character( 16 ) :: ctm_dustem_diag = 'CTM_DUSTEM_DIAG' ! env var for + ! diagnostic file + character( 16 ) :: ctm_erode_agland = 'CTM_ERODE_AGLAND' ! env var to + ! use erodible cropland + character( 16 ) :: pname = 'DUST_EMIS_INIT' + character( 16 ) :: vname + character( 80 ) :: vardesc + character( 120 ) :: xmsg = ' ' + character( 16 ) :: modis_fpar_1 = 'MODIS_FPAR' + ! Fraction of Absorbed Photosynthetically Active Radiation + + logical :: erode_agland = .true. ! default + integer status + integer c, r, i, j, k, l, n + integer idiag + integer n_mass_emissions + + integer gxoff, gyoff ! global origin offset from file + integer, save :: strtcol, endcol, strtrow, endrow + integer jdatemod + + type( diag_type ), allocatable :: diagnm_swap( : ) + + interface + subroutine cropcal ( jdate, jtime, agland ) + integer, intent( in ) :: jdate, jtime + real, intent( out ) :: agland( :,: ) + end subroutine cropcal + subroutine tfbelow ( jdate, jtime, tfb ) + integer, intent( in ) :: jdate, jtime + real, intent( out ) :: tfb( :,: ) + end subroutine tfbelow + end interface + +C----------------------------------------------------------------------- + + logdev = setup_logdev() + success = .true. + + + allocate ( dustoutm( ndust_spc,n_mode,ncols,nrows ), + & dustoutn( n_mode,ncols,nrows ), + & dustouts( n_mode,ncols,nrows ), stat = status ) + if ( status .ne. 0 ) then + xmsg = '*** Failure allocating DUSTOUTM, DUSTOUTN, or DUSTOUTS' + call m3warn ( pname, jdate, jtime, xmsg ) + success = .false.; return + end if + +C Allocate emissions array + allocate( dust_em( ncols,nrows ), stat = status ) + if ( status .ne. 0 ) then + xmsg = '*** Failure allocating DUST_EM' + call m3warn( pname, jdate, jtime, xmsg ) + success = .false.; return + end if + +C Allocate private arrays + allocate( agland( ncols,nrows ), + & wmax ( ncols,nrows ), + & sd_ep ( ncols,nrows ), + & fpar ( ncols,nrows ), + & tfb ( ncols,nrows ), stat = status ) + if ( status .ne. 0 ) then + xmsg = '*** Failure allocating AGLAND, WMAX, FPAR, SD_EP, or TFB' + call m3warn( pname, jdate, jtime, xmsg ) + success = .false.; return + end if + agland = 0.0 ! array assignment + wmax = 0.0 ! array assignment + sd_ep = 0.0 ! array assignment + fpar = 0.0 ! array assignment + +C Open MODIS file to get vegetation fraction + if ( .not. open3( modis_fpar_1, fsread3, pname ) ) then + xmsg = 'Could not open ' // modis_fpar_1 + call m3exit( pname, jdate, jtime, xmsg, xstat1 ) + end if + +C Get the file description + if ( .not. desc3( modis_fpar_1 ) ) then + xmsg = 'Could not get ' + & // trim( modis_fpar_1 ) + & // ' file description' + call m3exit( pname, jdate, jtime, xmsg, xstat1 ) + end if + +C To be able to use either climatological (2001-2010 averaged) or +C current fpar value. The year for the climatological fpar is 2005 in +C the input file. + if ( sdate3d .eq. 2005001 ) then ! climatological + jdatemod = 2005000 + mod( jdate,1000 ) + else ! current + jdatemod = jdate + end if + +C Get domain decomp info + call subhfile ( modis_fpar_1, gxoff, gyoff, + & strtcol, endcol, strtrow, endrow ) + +C Read in FPAR from MODIS file + xmsg = 'Could not read FPAR from ' // trim( modis_fpar_1 ) + if ( .not. xtract3( modis_fpar_1, 'MODIS_FPAR_T', 1,1, + & strtrow,endrow,strtcol,endcol, + & jdatemod, jtime, fpar( 1,1 ) ) ) + & call m3exit ( pname, jdate, jtime, xmsg, xstat1 ) + +C Initialize land use/cover variables + if ( .not. lus_init( jdate, jtime ) ) then + xmsg = 'Failure initializing land use module' + call m3exit( pname, jdate, jtime, xmsg, xstat2 ) + end if + +C Get env var for diagnostic output + dustem_diag = .false. ! default + vardesc = 'Flag for writing the windblown dust emission diagnostic file' + dustem_diag = envyn( ctm_dustem_diag, vardesc, dustem_diag, status ) + if ( status .ne. 0 ) write( logdev,'( 5x, a )' ) vardesc + if ( status .eq. 1 ) then + xmsg = 'Environment variable improperly formatted' + call m3warn( pname, jdate, jtime, xmsg ) + success = .false.; return + else if ( status .eq. -1 ) then + xmsg = 'Environment variable set, but empty ... Using default:' + write( logdev,'( 5x, a, i9 )' ) xmsg, jtime + else if ( status .eq. -2 ) then + xmsg = 'Environment variable not set ... Using default:' + write( logdev,'( 5x, a, i9 )' ) xmsg, jtime + end if + + if ( dustem_diag ) then ! Open the emissions diagnostic file + +C Set up variable diagnostic names (from LUS_DEFN) + allocate( vdiagnm_emis ( n_dlcat ), + & vdiagnm_frac ( n_dlcat ), + & vdiagnm_kvh ( n_dlcat ), + & vdiagnm_rough( n_dlcat ), + & vdiagnm_ustar( n_dlcat ), stat = status ) + if ( status .ne. 0 ) then + xmsg = '*** Failure allocating VDIAGNM_*' + call m3warn( pname, jdate, jtime, xmsg ) + success = .false.; return + end if + vdiagnm_emis = diag_type( ' ', ' ', ' ' ) ! array assignment + vdiagnm_frac = diag_type( ' ', ' ', ' ' ) ! array assignment + vdiagnm_ustar = diag_type( ' ', ' ', ' ' ) ! array assignment + vdiagnm_kvh = diag_type( ' ', ' ', ' ' ) ! array assignment + vdiagnm_rough = diag_type( ' ', ' ', ' ' ) ! array assignment + +C...Count the number of mass emissions species + n_mass_emissions = 0 + do i = 1, ndust_spc + do j = 1, n_mode + if( len_trim( dust_spc( i )%name( j ) ) .lt. 1 )cycle + n_mass_emissions = n_mass_emissions + 1 + end do + end do + + ndust_diag = fndust_diag + 5 * n_dlcat + n_mass_emissions + + do i = 1, n_dlcat + truncnm = vnmld( i )%desc ! char( 10 ) +C... replace embedded spaces (within 16 chars) with "_" +C... replace embedded dashes (within 16 chars) with "_" + l = len_trim( truncnm ) + do k = 1, l + if ( truncnm( k:k ) .eq. " " .or. + & truncnm( k:k ) .eq. "-" ) truncnm( k:k ) = "_" + end do + vnm = trim( truncnm ) // '_Emis' ! char( 16 ) + vdiagnm_emis( i ) = diag_type( vnm, 'g/m**2/s', vnmld( i )%desc ) + vnm = trim( truncnm ) // '_Frac' ! char( 16 ) + vdiagnm_frac( i ) = diag_type( vnm, 'percent', vnmld( i )%desc ) + vnm = trim( truncnm ) // '_Ustr' ! char( 16 ) + vdiagnm_ustar( i ) = diag_type( vnm, 'm/s', vnmld( i )%desc ) + vnm = trim( truncnm ) // '_Kvh' ! char( 16 ) + vdiagnm_kvh( i ) = diag_type( vnm, '1/m', vnmld( i )%desc ) + vnm = trim( truncnm ) // '_Rough' ! char( 16 ) + vdiagnm_rough( i ) = diag_type( vnm, ' ', vnmld( i )%desc ) + end do + +C Allocate diagnostic emissions arrays + allocate( diagnm( ndust_diag ), ! diag_type + & diagv ( ndust_diag ), + & dustbf( ndust_diag,ncols,nrows ), stat = status ) + if ( status .ne. 0 ) then + xmsg = '*** Failure allocating DIAGNM, DIAGV or DUSTBF' + call m3warn( pname, jdate, jtime, xmsg ) + success = .false.; return + end if + +#ifdef verbose_wbdust + allocate( sdiagv( ndust_diag ), stat = status ) + if ( status .ne. 0 ) then + xmsg = '*** Failure allocating SDIAGV' + call m3warn( pname, jdate, jtime, xmsg ) + success = .false.; return + end if +#endif + +C Build the complete diagnostic name array n for MODIS NOAH + do i = 1, n_dlcat ! 4 + diagnm( i ) = vdiagnm_emis( i ) + end do + n = n_dlcat + 1 + diagnm( n ) = fdiagnm( 1 ) ! Cropland_Emis + n = n + 1 + diagnm( n ) = fdiagnm( 2 ) ! Desertland_Emis + + do i = 1, n_dlcat + diagnm( i+n ) = vdiagnm_frac( i ) + end do + n = n + n_dlcat + 1 + diagnm( n ) = fdiagnm( 3 ) ! Cropland_Frac + n = n + 1 + diagnm( n ) = fdiagnm( 4 ) ! Desertland_Frac + + do i = 1, n_dlcat + diagnm( i+n ) = vdiagnm_ustar( i ) + end do + n = n + n_dlcat + 1 + diagnm( n ) = fdiagnm( 5 ) ! Cropland_Ustar + + do i = 1, n_dlcat + diagnm( i+n ) = vdiagnm_kvh( i ) + end do + n = n + n_dlcat + 1 + diagnm( n ) = fdiagnm( 6 ) ! Cropland_Kvh + + do i = 1, n_dlcat + diagnm( i+n ) = vdiagnm_rough( i ) + end do + n = n + n_dlcat + 1 + diagnm( n ) = fdiagnm( 7 ) ! Cropland_Rough + + n = n - 7 ! add remaining variables in fdiagnm + do i = 8, fndust_diag + idiag = i+n + diagnm( idiag ) = fdiagnm( i ) + end do + +C...append diagnostic variables with mass emissions species + do j = 2, n_mode + do i = 1, ndust_spc + n = len_trim( dust_spc( i )%name( j ) ) + if( n .lt. 1 )cycle ! assumes cmaq species names atleast one character long + n = 0 + do k = 1, idiag ! determine if dust emissions is already added to diagnostic output + if( dust_spc( i )%name( j ) .Eq. diagnm( k )%var )Then + n = k + exit + end if + end do + if( n .gt. 0 )then ! skip already added + cycle + else + idiag = idiag + 1 + diagnm( idiag )%var = dust_spc( i )%name( j ) + end if + diagnm( idiag )%units = 'g/m**3/s' + Select Case( j ) ! assumes only two aerosol modes dust emissions +! Case( 1 ) +! diagnm( idiag )%desc = 'aitken mode' + Case( 2 ) + diagnm( idiag )%desc = 'accumulation mode' + Case( 3 ) + diagnm( idiag )%desc = 'coarse mode' +! Case Default +! diagnm( idiag )%des = 'Undefined mode ' + end Select + diagnm( idiag )%desc = Trim( diagnm( idiag )%desc ) + & // ' emissions for ' + & // Trim( dust_spc( i )%description ) + end do + end do + +! remove unused space in diagnm by deallocated and reallocating to idiag value + allocate( diagnm_swap( ndust_diag ), stat = status ) + if ( status .ne. 0 ) then + xmsg = '*** Failure allocating DIAGNM_SWAP' + call m3warn( pname, jdate, jtime, xmsg ) + success = .false.; return + end if + diagnm_swap = diagnm + + deallocate( diagnm ) + + ndust_diag = idiag + allocate( diagnm( ndust_diag ), stat = status ) + if ( status .ne. 0 ) then + xmsg = '*** Failure reallocating DIAGNM' + call m3warn( pname, jdate, jtime, xmsg ) + success = .false.; return + end if + diagnm( 1:ndust_diag ) = diagnm_swap( 1:ndust_diag ) + deallocate( diagnm_swap ) + + sdate = envint( 'CTM_STDATE', 'Scenario Start (YYYYJJJ)', 0, status ) + stime = envint( 'CTM_STTIME', 'Scenario Start (HHMMSS)', 0, status ) + + if ( io_pe_inclusive ) + & call opdust_emis ( sdate, stime, tstep, ndust_diag, diagnm ) + + end if ! dustem_diag + +C Get env var for erodible agriculture land fraction + erode_agland = .false. ! default + vardesc = 'Flag for calculating erodible agriculture land fraction' + erode_agland = envyn( ctm_erode_agland, vardesc, erode_agland, status ) + if ( status .ne. 0 ) write( logdev,'( 5x, a )' ) vardesc + if ( status .eq. 1 ) then + xmsg = 'Environment variable improperly formatted' + call m3warn( pname, jdate, jtime, xmsg ) + success = .false.; return + else if ( status .eq. -1 ) then + xmsg = 'Environment variable set, but empty ... Using default:' + write( logdev,'( 5x, a, i9 )' ) xmsg, jtime + else if ( status .eq. -2 ) then + xmsg = 'Environment variable not set ... Using default:' + write( logdev,'( 5x, a, i9 )' ) xmsg, jtime + end if + + if ( erode_agland ) then + call cropcal ( sdate, stime, agland ) + do r = 1, my_nrows + do c = 1, my_ncols + if ( agland( c,r ) .lt. 0.0 .or. agland( c,r ) .gt. 100.0 ) then + xmsg = '*** ERROR in AGLAND' + call m3exit( pname, jdate, jtime, xmsg, xstat1 ) + end if + end do + end do + end if + +C Get transport factor within canopy and 4 land use type percents + call tfbelow ( jdate, jtime, tfb ) + + l2sgj = log( sigj ) * log( sigj ) + l2sgk = log( sigk ) * log( sigk ) + +C Factors for converting 3rd moment emission rates into number and 2nd moment +C emission rates. (Diameters in [um] changed to [m] ) See Equations 7b and 7c +C of Binkowski & Roselle (2003) + factnumj = 1.0e18 * exp( 4.5 * l2sgj ) / dgvj ** 3 + factnumk = 1.0e18 * exp( 4.5 * l2sgk ) / dgvk ** 3 + factm2j = 1.0e06 * exp( 0.5 * l2sgj ) / dgvj + factm2k = 1.0e06 * exp( 0.5 * l2sgk ) / dgvk + factsrfj = pi * factm2j + factsrfk = pi * factm2k + +C Calculate modal average dust particle densities (accum and coarse modes) [ kg/m**3 ] +C The following works because the dust_spc`s are a fixed split of the total emitted +C mass. + dustmode_dens( 1 ) = 0.0 + do n = 2, n_mode + sumsplit = 0.0; sumfrac = 0.0 + do i = 1, ndust_spc + idx = findAero( dust_spc( i )%name( n ), .true. ) + if( aerospc( idx )%tracer )cycle + if( dust_spc( i )%spcfac( n ) .lt. 1.0e-30 )cycle + sumsplit = sumsplit + dust_spc( i )%spcfac( n ) ! should = 1.0 + sumfrac = sumfrac + dust_spc( i )%spcfac( n ) / aerospc( idx )%density + end do + dustmode_dens( n ) = sumsplit / sumfrac + end do + +#ifdef verbose_wbdust + write( logdev,* ) ' ' + write( logdev,* ) ' l2sgj,l2sgk: ', l2sgj, l2sgk + write( logdev,* ) ' factnumj,factnumk: ', factnumj, factnumk + write( logdev,* ) ' factm2j,factm2k: ', factm2j, factm2k + write( logdev,* ) ' factsrfj,factsrfk: ', factsrfj, factsrfk + write( logdev,* ) ' modal avg dens(j/k): ', dustmode_dens( 2 ), dustmode_dens( 3 ) + write( logdev,* ) ' ' +#endif + + end function dust_emis_init + +C======================================================================= + subroutine opdust_emis ( jdate, jtime, tstep, ndust_var, dust_var ) + +C 27 Dec 10 J.Young: initial + + use grid_conf ! horizontal & vertical domain specifications + use utilio_defn + + implicit none + + include SUBST_FILES_ID ! file name parameters + +C Arguments: + integer, intent( in ) :: jdate ! current model date, coded YYYYDDD + integer, intent( in ) :: jtime ! current model time, coded HHMMSS + integer, intent( in ) :: tstep ! output time step + integer, intent( in ) :: ndust_var + type( diag_type ), intent( in ) :: dust_var( : ) + +C Local variables: + character( 16 ) :: pname = 'OPDUST_EMIS' + character( 96 ) :: xmsg = ' ' + + integer v, l ! loop induction variables + +C----------------------------------------------------------------------- + +C Try to open existing file for update + if ( .not. open3( ctm_dust_emis_1, fsrdwr3, pname ) ) then + xmsg = 'Could not open CTM_DUST_EMIS_1 for update - ' + & // 'try to open new' + call m3mesg( xmsg ) + +C Set output file characteristics based on COORD.EXT and open diagnostic file + ftype3d = grdded3 + sdate3d = jdate + stime3d = jtime + tstep3d = tstep + call nextime( sdate3d, stime3d, tstep3d ) ! start the next hour + + nvars3d = ndust_var + ncols3d = gl_ncols + nrows3d = gl_nrows + nlays3d = 1 + nthik3d = 1 + gdtyp3d = gdtyp_gd + p_alp3d = p_alp_gd + p_bet3d = p_bet_gd + p_gam3d = p_gam_gd + xorig3d = xorig_gd + yorig3d = yorig_gd + xcent3d = xcent_gd + ycent3d = ycent_gd + xcell3d = xcell_gd + ycell3d = ycell_gd + vgtyp3d = vgtyp_gd + vgtop3d = vgtop_gd +! vgtpun3d = vgtpun_gd ! currently, not defined + do l = 1, nlays3d + 1 + vglvs3d( l ) = vglvs_gd( l ) + end do + gdnam3d = grid_name ! from HGRD_DEFN + + do v = 1, nvars3d + vtype3d( v ) = m3real + vname3d( v ) = dust_var( v )%var + units3d( v ) = dust_var( v )%units + vdesc3d( v ) = dust_var( v )%desc + end do + + fdesc3d( 1 ) = 'windblown dust parameters, variables, and' + fdesc3d( 2 ) = 'hourly layer-1 windblown dust emission rates' + do l = 3, mxdesc3 + fdesc3d( l ) = ' ' + end do + +C Open windblown dust emissions diagnostic file + if ( .not. open3( ctm_dust_emis_1, fsnew3, pname ) ) then + xmsg = 'Could not create the CTM_DUST_EMIS_1 file' + call m3exit( pname, sdate3d, stime3d, xmsg, xstat1 ) + end if + + end if + + return + + end subroutine opdust_emis + +C======================================================================= + subroutine get_dust_emis( jdate, jtime, tstep, rjacm, cellhgt ) + + use grid_conf ! horizontal & vertical domain specifications + use asx_data_mod ! meteorology data + use aero_data + use utilio_defn + +C 8/18/11 D.Wong: incorporated twoway model implementation and change +C RC -> RCA and RN -> RNA and made it backward compatible +C 8/12/15 D.Wong: added code to handle parallel I/O implementation + +C Arguments: + integer, intent( in ) :: jdate ! current model date, coded YYYYDDD + integer, intent( in ) :: jtime ! current model time, coded HHMMSS + integer, intent( in ) :: tstep( 3 ) ! output time step, sync step, 2way step + real, intent( in ) :: rjacm( ncols,nrows ) ! reciprocal Jacobian [1/m] + real, intent( in ) :: cellhgt ! grid-cell height [sigma] + +C Includes: + include SUBST_FILES_ID ! file name parameters + +C External Functions: + +C Parameters: + integer, parameter :: ndp = 4 ! number of soil texture type particle sizes: + ! 1 Coarse sand + ! 2 Fine-medium sand + ! 3 Silt + ! 4 Clay + + real, parameter :: f6dpi = 6.0 / pi + real, parameter :: gpkg = 1.0e03 ! g/kg + + real, parameter :: mv = 0.16 + real, parameter :: sigv = 1.45 + real, parameter :: betav = 202.0 + real, parameter :: sigv_mv = sigv * mv ! = 0.232 + real, parameter :: betav_mv = betav * mv ! = 32.32 + real, parameter :: mb = 0.5 + real, parameter :: sigb = 1.0 + real, parameter :: betab = 90.0 + real, parameter :: sigb_mb = sigb * mb ! = 0.5 + real, parameter :: betab_mb = betab * mb ! = 45.0 + + real, parameter :: alpha = 0.7 + + character( 16 ) :: pname = 'GET_DUST_EMIS' + character( 16 ) :: vname + character( 96 ) :: xmsg + integer status + integer c, r, j, m, n, v + + integer, save :: wstep = 0 ! local write counter + integer :: mdate, mtime ! diagnostic file write date&time + + ! automatic arrays + real :: fmoit ( ncols,nrows ) ! factor of soil moisture on u*t + real :: soimt ( ncols,nrows ) ! gravimetric soil moisture (Kg/Kg) + real :: tfa ( ncols,nrows ) ! transport fraction above canopy + real :: wrbuf ( ncols,nrows ) ! diagnositc write buffer + real :: vegfrac( ncols,nrows ) ! vegetation fraction + real :: vegfree ! 1.0 - vegfrac for this col, row + real :: lai ( ncols,nrows ) ! leaf area index + + real, allocatable, save :: ustr ( :,:,: ) ! U* [m/s] + real, allocatable, save :: qam ( :,:,: ) ! emis for landuse type [g/m**2/s] + real, allocatable, save :: elus ( :,:,: ) ! erodible landuse percent (0~100) + real, allocatable, save :: fruf ( :,:,: ) ! surface roughness factor + + real :: edust( n_mode ) ! mass emis rate [g/s] per mode (only accum & coarse) + real :: sumdfr ! sum var for desert fraction + real :: rlay1hgt ! reciprocal of layer-1 height [1/m] + real :: m3j ! 3rd moment accumulation (J) mode emis rates [m3/m3/s] + real :: m3k ! 3rd moment coarse mode (K) emis rates [m3/m3/s] + real :: fruf2 ! surface roughness factor squared + + character( 16 ), save :: rc_name, rn_name ! new names: RC -> RCA, RN -> RNA + logical, save :: firstime = .true. + + real :: lambda, vegheight + real :: z0 + real :: lambdav ! vegetation roughness density - Shao et. al [Aus. J. Soil Res., 1996] + real :: flxfac1, flxfac2 ! combined soli type mapping factors + real :: hflux, vflux ! horizontal and vertical dust flux + real :: jday + integer :: emap( n_dlcat+1 ) + +C---FENGSHA FLAG + +C CHARACTER( 20 ), SAVE :: CTM_FENGHSA = 'CTM_FENGSHA ' ! env var for in-line +C LOGICAL, SAVE :: FENGSHA ! flag in-lining canopy shading + +C---Height for veg elements + real :: hv( 4 ) + +C---Roughness density for solid elements +C from Darmenova et al. [JGR,2009] and Xi and Sokolik [JGR,2015] + real :: lambdab( 4 ) = + & (/ 0.03, ! shrubland + & 0.04, ! shrubgrass + & 0.0001, ! barrenland + & 0.15 /) ! cropland + +C---Compound for computational efficiency + real :: hb_lambdab( 4 ) = + & (/ 6.0e-04, ! shrubland + & 8.0e-04, ! shrubgrass + & 2.0e-06, ! barrenland + & 3.0e-03 /) ! cropland + +C Soil moisture limit: 13 types and 3 variables, which are: +C 1 - saturation moisture limit, (gravimetric units assumed, Kg/Kg) +C 2 - fill capacity, and <- not used +C 3 - wilting point <- not used +C Modified values compatiable with both MM5 & NAM. +C Silt values are based on NAM documentation on soil types. +C Other includes all types higher than 12. The values of Other, serving as +C placeholders, are randomly chosen. Values of Other, however, have no effect +C on dust emissions as the threshold velocity of Other will be high. +C real :: soilml( nsltyp,3 ) = reshape ( +C & (/ 0.395, 0.135, 0.068, ! Sand +C & 0.410, 0.150, 0.075, ! Loamy Sand +C & 0.435, 0.195, 0.114, ! Sandy Loam +C & 0.485, 0.255, 0.179, ! Silt Loam +C & 0.476, 0.361, 0.084, ! Silt +C & 0.451, 0.240, 0.155, ! Loam +C & 0.420, 0.255, 0.175, ! Sandy Clay Loam +C & 0.477, 0.322, 0.218, ! Silty Clay Loam +C & 0.476, 0.325, 0.250, ! Clay Loam +C & 0.426, 0.310, 0.219, ! Sandy Clay +C & 0.482, 0.370, 0.283, ! Silty Clay +C & 0.482, 0.367, 0.286, ! Clay +C & 0.482, 0.367, 0.286 /), ! Other +C & (/ nsltyp,3 /), order = (/ 2,1 /) ) ! fill columns first + +C converted to gravimetric [kg/kg] + real :: soilml1( nsltyp ) = + & (/ 0.242, ! Sand + & 0.257, ! Loamy Sand + & 0.286, ! Sandy Loam + & 0.350, ! Silt Loam + & 0.350, ! Silt + & 0.307, ! Loam + & 0.277, ! Sandy Clay Loam + & 0.350, ! Silty Clay Loam + & 0.332, ! Clay Loam + & 0.284, ! Sandy Clay + & 0.357, ! Silty Clay + & 0.344, ! Clay + & 0.363 /) ! Other + +C---Soil texture: the amount of +C 1: Coarse sand, 2: Fine-medium sand, 3: Silt, 4: Clay +C in each soil type [Kg/Kg]. from Menut et al. [JGR,2013] + real :: soiltxt( nsltyp,ndp ) = reshape ( + & (/ 0.46, 0.46, 0.05, 0.03, ! Sand + & 0.41, 0.41, 0.18, 0.00, ! Loamy Sand + & 0.29, 0.29, 0.32, 0.10, ! Sandy Loam + & 0.00, 0.17, 0.70, 0.13, ! Silt Loam + & 0.00, 0.10, 0.85, 0.05, ! Silt + & 0.00, 0.43, 0.39, 0.18, ! Loam + & 0.29, 0.29, 0.15, 0.27, ! Sandy Clay Loam + & 0.00, 0.10, 0.56, 0.34, ! Silty Clay Loam + & 0.00, 0.32, 0.34, 0.34, ! Clay Loam + & 0.00, 0.52, 0.06, 0.42, ! Sandy Clay + & 0.00, 0.06, 0.47, 0.47, ! Silty Clay + & 0.00, 0.22, 0.20, 0.58, ! Clay + & 0.00, 0.00, 0.00, 0.00 /), ! Other + & (/ nsltyp,4 /), order = (/ 2,1 /) ) ! fill columns first + +C---Mean mass median particle diameter (m) for each soil texture type +C Chatenet et al. [Sedimentology,1996] and Menut et al. [JGR,2013] + real :: dp( ndp ) = + & (/ 690.0E-6, ! Coarse sand + & 210.0E-6, ! Fine-medium sand + & 125.0E-6, ! Silt + & 2.0E-6 /) ! Clay + + + interface + subroutine tfabove ( tfa ) + real, intent( out ) :: tfa( :,: ) + end subroutine tfabove + end interface + +#ifdef verbose_wbdust + integer dryhit + integer dusthit +#endif + +C----------------------------------------------------------------------- + + if ( firstime ) then + +! FENGHSA = ENVYN( 'CTM_FENGSHA', +! & 'Flag for fengsha dust emission module', +! & .FALSE., IOSX ) +! print *,'Hello From Dust Module' + IF ( FENGSHA ) THEN + XMSG = 'Using Fengsha dust emission module ' + CALL M3MSG2( XMSG ) + END IF + + firstime = .false. + allocate ( ustr( ncols,nrows,n_dlcat+1 ), + & qam( ncols,nrows,n_dlcat+1 ), + & fruf( ncols,nrows,n_dlcat+1 ), + & kvh( ncols,nrows,n_dlcat+1 ), + & elus( ncols,nrows,n_dlcat+1 ), stat = status ) + if ( status .ne. 0 ) then + xmsg = '*** Failure allocating USTR, QAM, FRUF, KVH, or ELUS' + call m3exit( pname, jdate, jtime, xmsg, xstat1 ) + end if + end if + +C---Calculate transport factor above the canopy + call tfabove ( tfa ) + +C---Get Julian day number in year + jday = float( mod( jdate,1000 ) ) + +C---Vegetation height dynamically changed based on the month of the year +C Veg. heights in [m] for 1: Shrubland 2: shrubgrass 3: barrenland 4: Cropland +C following the idea of Xi and Sokolik [JGR,2015] + if ( jday .gt. 59 .and. jday .le. 90 ) then ! Mar + hv = (/ 0.15 , 0.05 , 0.10 , 0.05 /) + else if ( jday .gt. 90 .and. jday .le. 120 ) then ! Apr + hv = (/ 0.15 , 0.10 , 0.10 , 0.05 /) + else if ( jday .gt. 120 .and. jday .le. 151 ) then ! May + hv = (/ 0.12 , 0.20 , 0.10 , 0.10 /) + else if ( jday .gt. 151 .and. jday .le. 181 ) then ! Jun + hv = (/ 0.12 , 0.15 , 0.10 , 0.30 /) + else if ( jday .gt. 181 .and. jday .le. 212 ) then ! Jul + hv = (/ 0.10 , 0.12 , 0.10 , 0.50 /) + else if ( jday .gt. 212 .and. jday .le. 243 ) then ! Aug + hv = (/ 0.10 , 0.12 , 0.10 , 0.50 /) + else if ( jday .gt. 243 .and. jday .le. 273 ) then ! Sep + hv = (/ 0.10 , 0.10 , 0.10 , 0.30 /) + else if ( jday .gt. 273 .and. jday .le. 304 ) then ! Oct + hv = (/ 0.05 , 0.08 , 0.10 , 0.10 /) + else ! Nov-Feb + hv = (/ 0.05 , 0.05 , 0.05 , 0.05 /) + end if + +#ifdef verbose_wbdust + dryhit = 0 + dusthit = 0 +#endif + +C Initialize windblown dust diagnostics output buffer + if ( dustem_diag .and. wstep .eq. 0 ) then + dustbf = 0.0 ! array assignment +#ifdef verbose_wbdust + sdiagv = 0.0 ! array assignment +#endif + end if + +C set erodible landuse map + do m = 1, n_dlcat + emap( m ) = dmap( m ) ! dmap maps to one of the 3 BELD3 desert types + end do + emap( n_dlcat+1 ) = 4 + +C --------- ###### Start Main Loop ###### --------- + + do r = 1, my_nrows + do c = 1, my_ncols + dust_em( c,r ) = 0.0 + soimt( c,r ) = 0.0 + fmoit( c,r ) = 0.0 ! for diagnostic output visualization + vegfrac( c,r ) = 0.0 + do m = 1, n_dlcat+1 + ustr( c,r,m ) = 0.0 ! for diagnostic output visualization + qam ( c,r,m ) = 0.0 + elus( c,r,m ) = 0.0 + fruf( c,r,m ) = 0.0 + kvh ( c,r,m ) = 0.0 + end do + + rlay1hgt = rjacm ( c,r ) / cellhgt + +C---Vegetation fraction based on the MODIS FPAR + vegfrac( c,r ) = max( min( fpar( c,r ), 0.95 ), 0.005 ) + vegfree = 1.0 - vegfrac( c,r ) + lambdav = -0.35 * log( vegfree ) ! Shao et al. [Aus. J. Soil Res.,1996] + +C---Dust possiblity only if 1. not over water +C 2. rain < 1/100 in. (1 in. = 2.540 cm) +C 3. not snow-covered +C 4. if soimt <= limit +C 5. desert type or ag landuse +C 6. erodible landuse +C 7. friction velocity > threshold + +!----------------------------------------------------------- +!---------------------- FENGSHA Option --------------------- +!----------------------------------------------------------- + + if ( ( FENGSHA.eq. .true.) .and. ( Grid_Data%lwmask( c,r ) .gt. 0.0 ) .and. + & ( Met_Data%rn( c,r ) + Met_Data%rc( c,r ) .le. 0.0254 ) .and. ! rn, rc = [cm] + & ( Met_Data%snocov( c,r ) .lt. 0.001 ) .and. + & ( Met_Data%drag(c,r) .gt. 0.0 ) ) then ! less than 0.1% snow coverage +! print *,' Hello from Fengsha' +C Calculate maximum amount of the water absorbed +C w` = 0.0014(%clay)**2 + 0.17(%clay) - w` in % +C Fecan et al. [1999,Annales Geophys.,17,144-157] + wmax ( c,r ) = (100.*Met_Data%clayf( c,r )) * + & (100.*Met_Data%clayf( c,r )) * + & .0014d0 + 0.17d0 * (100.*Met_Data%clayf( c,r )) + + soimt( c,r ) = dust_volumetric_to_gravimetric( Met_Data%soim1( c,r ), Met_Data%clayf( c,r ), Met_Data%sandf( c,r )) + +C---Soil moisture effect on U*t + if ( soimt( c,r ) .le. 0.01 * wmax( c,r ) ) then ! wmax in [%] + fmoit( c,r ) = 1.0 + else + fmoit( c,r ) = sqrt( 1.0 + 1.2 * ( 100.0 * soimt( c,r ) - wmax( c,r ) ) ** 0.68 ) + end if + +C Calculate Vertical to Horizontal Mass Flux Ratio +C -- This is based on MB95 + if ( Met_Data%clayf(c,r) < 0.2) then + kvh( c,r,1 ) = 10. ** (0.134 * (Met_Data%clayf( c,r )*100.) - 6.0) + else + kvh(c,r,1) = 4.0e-4 + endif +C Horizontal Flux + hflux = dust_hflux_fengsha( Met_Data%USTAR( c,r ), + & fmoit( c,r), + & Met_Data%drag( c,r ), + & Met_Data%uthr( c,r ), + & 1.0, ! ssm = 1 + & Met_Data%dens1( c,r ) ) + vflux = hflux * kvh( c,r,1 ) ! [g/m**2/s] + + qam (c,r,1) = qam(c,r,1) + vflux * rlay1hgt * alpha + + dust_em( c,r ) = dust_em( c,r ) + qam(c,r,1) * tfa(c,r) * tfb(c,r) + + +!-------------------------------------------------------------------- +!--------------------- END OF FENGSHA ------------------------------- +!-------------------------------------------------------------------- + + else if ( ( Grid_Data%lwmask( c,r ) .gt. 0.0 ) .and. + & ( Met_Data%rn( c,r ) + Met_Data%rc( c,r ) .le. 0.0254 ) .and. ! rn, rc = [cm] + & ( Met_Data%snocov( c,r ) .lt. 0.001 ) ) then ! less than 0.1% snow coverage + +C---Dust possiblity 1,2,3 + + j = Grid_Data%sltyp( c,r ) + +C kludge (fixed in wrf-px after 4 Mar 11) + if ( j .gt. 4 ) j = j + 1 ! PX combines "silt" with "silt loam" + if ( j .gt. 13 ) j = 13 ! = ? + +C Calculate maximum amount of the adsorbed water +C w` = 0.0014(%clay)**2 + 0.17(%clay) - w` in % +C Fecan et al. [1999,Annales Geophys.,17,144-157] + wmax( c,r ) = ( 14.0 * soiltxt( j,4 ) + 17.0 ) * soiltxt( j,4 ) ! [%] + +! write( logdev,'( 2x, a, i8.6, f12.5 )' ) 'max wmax:', jtime, maxval( wmax ) + +C Change soil moisture units from volumetric (m**3/m**3) to gravimetric (Kg/Kg) + soimt( c,r ) = Met_Data%soim1( c,r ) ! <- [m**3/m**3] + & * 1000.0 / ( 2650.0 * ( 0.511 + 0.126 + & * ( soiltxt( j,1 ) + soiltxt( j,2 ) ) ) ) + + if ( soimt( c,r ) .le. soilml1( j ) ) then +C---Dust possiblity 4 + +#ifdef verbose_wbdust + dryhit = dryhit + 1 +#endif + +C---Soil moisture effect on U*t + if ( soimt( c,r ) .le. 0.01 * wmax( c,r ) ) then ! wmax in [%] + fmoit( c,r ) = 1.0 + else + fmoit( c,r ) = sqrt( 1.0 + 1.21 + & * ( 100.0 * soimt( c,r ) - wmax( c,r ) ) ** 0.68 ) + end if + +C---Erodibility potential of soil component + sd_ep( c,r ) = soiltxt( j,4 ) * eropot( 1 ) + & + soiltxt( j,3 ) * eropot( 2 ) + & + ( soiltxt( j,1 ) + soiltxt( j,2 ) ) * eropot( 3 ) + +C---Lu and Shao [JGR,1999] and Kang et al. [JGR,2011] +C First, mapping soil types into 4 main soil types following Kang et al. [JGR,2011] + select case ( j ) + case( 1, 2 ) ! sand + ! pp = 5000.0 + ! calpha = 0.001 + ! pfrac = 0.06 + ! flxfac1 = calpha * 9.81 * pfrac * 500.0 / pp + flxfac1 = 5.886e-05 + ! flxfac2 = 2.09 * sqrt( 2650.0 / pp ) + flxfac2 = 1.5215430 + case( 3, 4, 6, 8, 9 ) ! loam + ! pp = 10000.0 + ! calpha = 0.0006 + ! pfrac = 0.18 + ! flxfac1 = calpha * 9.81 * pfrac * 500.0 / pp + flxfac1 = 5.2974e-05 + ! flxfac2 = 2.09 * sqrt( 2650.0 / pp ) + flxfac2 = 1.0758933 + case( 7 ) ! sandy clay loam + ! pp = 10000.0 + ! calpha = 0.0006 + ! pfrac = 0.32 + ! flxfac1 = calpha * 9.81 * pfrac * 500.0 / pp + flxfac1 = 9.4176e-05 + ! flxfac2 = 2.09 * sqrt( 2650.0 / pp ) + flxfac2 = 1.0758933 + case( 5, 10, 11, 12 ) ! clay + ! pp = 30000.0 + ! calpha = 0.0002 + ! pfrac = 0.72 + ! flxfac1 = calpha * 9.81 * pfrac * 500.0 / pp + flxfac1 = 2.3544e-05 + ! flxfac2 = 2.09 * sqrt( 2650.0 / pp ) + flxfac2 = 0.1964303 + case default ! others -- no dust + ! pp = 100000.0 + ! calpha = 1.0 + ! pfrac = 0.0 + ! flxfac1 = calpha * 9.81 * pfrac * 500.0 / pp + flxfac1 = 0.0 + ! flxfac2 = 2.09 * sqrt( 2650.0 / pp ) + flxfac2 = 0.3402273 + end select + + do m = 1, n_dlcat ! desert type landuse category + elus( c,r,m ) = ladut( c,r,m ) * vegfree ! desert land [%] + end do + elus( c,r,n_dlcat+1 ) = agland( c,r ) * vegfree ! crop land [%] + +C ------- Start Loop Over Erodible Landuse ---- + + do m = 1, n_dlcat+1 ! desert type & crop landuse categories + + if ( elus( c,r,m ) .gt. 100.0 .or. elus( c,r,m ) .lt. 0.0 ) then + write( xmsg,2009 ) elus( c,r,m ), c, r, m + call m3exit( pname, jdate, jtime, xmsg, xstat1 ) + end if + + if ( elus( c,r,m ) .gt. 0.0 ) then + + n = emap( m ) + lambda = lambdab( n ) + lambdav + vegheight = ( hb_lambdab( n ) + hv( n ) * lambdav ) / lambda + +C---New parametrization for surface roughness by H. Foroutan - Oct. 2015 + if ( lambda .le. 0.2 ) then + z0 = 0.96 * ( lambda ** 1.07 ) * vegheight + else + z0 = 0.083 * ( lambda ** ( -0.46 ) ) * vegheight + end if + +C---Calculate friction velocity (U*) at the surafce applicable to dust emission + ustr( c,r,m ) = karman * Met_Data%WSPD10( c,r ) / log ( 10.0 / z0 ) + +C---Roughness effect on U*t (Drag partitioning) +C Xi and Sokolik [JGR,2015] + fruf2 = ( 1.0 - sigv_mv * lambdav ) + & * ( 1.0 + betav_mv * lambdav ) + & * ( 1.0 - sigb_mb * lambdab( n ) / vegfree ) + & * ( 1.0 + betab_mb * lambdab( n ) / vegfree ) + + if( fruf2 .gt. 1.0 ) then + + fruf( c,r,m ) = sqrt( fruf2 ) + else + fruf( c,r,m ) = 10.0 + end if + +C---Vert-to-Horiz dust flux ratio : Kang et al. [JGR, 2011] : Eq. (12) +! kvh( c,r,m ) = ( calpha * 9.81 * pfrac * 1000.0 / 2.0 / pp ) +! & * ( 0.24 + 2.09 * ustr( c,r,m ) * sqrt( 2650.0 / pp ) ) + kvh( c,r,m ) = flxfac1 * ( 0.24 + flxfac2 * ustr( c,r,m ) ) + hflux = dust_hflux( ndp, dp, + & soiltxt( j,: ), + & fmoit( c,r ), + & fruf( c,r,m ), + & ustr( c,r,m ), + & sd_ep( c,r ), + & Met_Data%dens1( c,r ) ) + vflux = hflux * kvh( c,r,m ) ! [g/m**2/s] + qam( c,r,m ) = qam( c,r,m ) + vflux * rlay1hgt + & * ( elus( c,r,m ) * 0.01 ) ! [g/m**3/s] + end if ! if erodible land + + if ( elus( c,r,m ) .eq. 0.0 .and. qam( c,r,m ) .ne. 0.0 ) then + xmsg = 'Erodible land use = 0, but emissions .ne. 0' + call m3exit( pname, jdate, jtime, xmsg, xstat1 ) + end if + + dust_em( c,r ) = dust_em( c,r ) + qam( c,r,m ) + + end do ! m landuse + +C ------- End Loop Over Erodible Landuse ---- + +C Dust removal by surrounding vegetation <-??? +C Adjust dust emissions for transport factors + + dust_em( c,r ) = dust_em( c,r ) * tfa( c,r ) * tfb( c,r ) + + end if ! if soil moisture + end if ! if rain & land & snow + + end do ! c + end do ! r + +C --------- ###### End Main Loop ##### --------- + +#ifdef verbose_wbdust + write( logdev,'( /5x, a, 1x, 2i8 )' ) 'dry hit count, + & out of total cells:', + & dryhit, (c-1)*(r-1) +#endif + + do r = 1, my_nrows + do c = 1, my_ncols + +C J/K mass emis rate [g/s] (edust( 1 ) not used) + edust( 2 ) = fracmj * dust_em( c,r ) + edust( 3 ) = fracmk * dust_em( c,r ) + + do v = 1, ndust_spc + dustoutm( v,1,c,r ) = 0.0 + end do + + do n = 2, n_mode + do v = 1, ndust_spc + dustoutm( v,n,c,r ) = edust( n ) * dust_spc( v )%spcfac( n ) + end do + end do + +C J/K 3rd moment emis rate [m3/s] (needed for number and surface) + m3j = edust( 2 ) * f6dpi / ( gpkg * dustmode_dens( 2 ) ) + m3k = edust( 3 ) * f6dpi / ( gpkg * dustmode_dens( 3 ) ) + +C Mode-specific emission rates of particle number [1/s] + dustoutn( 1,c,r ) = 0.0 + dustoutn( 2,c,r ) = m3j * factnumj + dustoutn( 3,c,r ) = m3k * factnumk + +C Mode-specific dry surface area emission rates [m**2/s]. +C 2nd moment multiplied by PI to obtain the surface area emissions rate. + dustouts( 1,c,r ) = 0.0 + dustouts( 2,c,r ) = m3j * factsrfj + dustouts( 3,c,r ) = m3k * factsrfk + +#ifdef verbose_wbdust + if ( m3j .ne. 0.0 ) dusthit = dusthit + 1 +#endif + + if ( dustem_diag ) then + do m = 1, n_dlcat+1 + diagv( m ) = qam( c,r,m ) ! g/m**3/s + end do + n = n_dlcat + 2 + diagv( n ) = dust_em( c,r ) ! g/m**3/s + + sumdfr = 0.0 + do m = 1, n_dlcat+1 + diagv( m+n ) = elus( c,r,m ) + sumdfr = sumdfr + elus( c,r,m ) + end do + n = n + n_dlcat + 2 + diagv( n ) = sumdfr + + do m = 1, n_dlcat+1 + diagv( m+n ) = ustr( c,r,m ) + end do + n = n + n_dlcat + 1 + + do m = 1, n_dlcat+1 + diagv( m+n ) = kvh( c,r,m ) + end do + n = n + n_dlcat + 1 + + do m = 1, n_dlcat+1 + diagv( m+n ) = fruf( c,r,m ) + end do + n = n + n_dlcat + 1 + + diagv( n+1 ) = fmoit( c,r ) ! 'Soil_Moist_Fac ' + diagv( n+2 ) = sd_ep( c,r ) ! 'Soil_Erode_Pot ' + diagv( n+3 ) = wmax ( c,r ) ! 'Mx_Adsrb_H2O_Frc' + diagv( n+4 ) = vegfrac( c,r ) ! 'Vegetation_Frac ' + diagv( n+5 ) = uland( c,r,3 ) ! 'Urban_Cover ' + diagv( n+6 ) = uland( c,r,4 ) ! 'Forest_Cover ' + diagv( n+7 ) = tfa ( c,r ) ! 'Trfac_Above_Can ' + diagv( n+8 ) = tfb ( c,r ) ! 'Trfac_Inside_Can' + + n = n + 8 + +! accum and coarse mode number density emissions + diagv( n+1 ) = dustoutn( 2,c,r ) + diagv( n+2 ) = dustoutn( 3,c,r ) +! accum and coarse mode surface area density emissions + diagv( n+3 ) = dustouts( 2,c,r ) + diagv( n+4 ) = dustouts( 3,c,r ) + + n = n + 4 + m = 0 + do v = 1, ndust_spc + if ( trim( dust_spc( v )%name( 2 ) ) .ne. ' ' ) then ! accum. mode mass emissions + m = m + 1 + diagv( m+n ) = dustoutm( v,2,c,r ) + end if + end do + + do v = 1, ndust_spc + if ( trim( dust_spc( v )%name( 3 ) ) .ne. ' ' ) then ! coarse mode mass emissions + m = m + 1 + diagv( m+n ) = dustoutm( v,3,c,r ) + end if + end do + + n = n + m + + +C Multiply by sync step because when write to output we divide by the output step +C to get a timestep average. + do v = 1, ndust_diag + dustbf( v,c,r ) = dustbf( v,c,r ) + diagv( v ) + & * float( time2sec( tstep( 2 ) ) ) +#ifdef verbose_wbdust + sdiagv( v ) = sdiagv( v ) + diagv( v ) + & * float( time2sec( tstep( 2 ) ) ) +#endif + end do + end if ! dustem_diag + end do ! col + end do ! row + +#ifdef verbose_wbdust + write( logdev,'( 5x, a, 2i8 / )' ) 'dust hit count, out of total cells:', + & dusthit, (c-1)*(r-1) +#endif + + if ( dustem_diag ) then + +C If last call this hour, write out the windblown dust emissions dignostics. +C Then reset the emissions array and local write counter. + + wstep = wstep + time2sec( tstep( 2 ) ) + + if ( wstep .ge. time2sec( tstep( 1 ) ) ) then + if ( .not. currstep( jdate, jtime, sdate, stime, tstep( 1 ), + & mdate, mtime ) ) then + xmsg = 'Cannot get step date and time' + call m3exit( pname, jdate, jtime, xmsg, xstat3 ) + end if + call nextime( mdate, mtime, tstep( 1 ) ) + +#ifdef verbose_wbdust + sdiagv = sdiagv / float( wstep ) ! array assignment + write( logdev,2015 ) jdate, jtime + do v = 1, ndust_diag + if ( diagnm( v )%var(1:4) .ne. 'ANUM' ) then + write( logdev,2019 ) v, diagnm( v )%var, sdiagv( v ) + else + write( logdev,2023 ) v, diagnm( v )%var, sdiagv( v ) + end if + end do + sdiagv = 0.0 ! array assignment +#endif + do v = 1, ndust_diag + do r = 1, my_nrows + do c = 1, my_ncols + wrbuf( c,r ) = dustbf( v,c,r ) / float( wstep ) + end do + end do + + if ( .not. WRITE3( ctm_dust_emis_1, diagnm( v )%var, + & mdate, mtime, wrbuf ) ) then + xmsg = 'Could not write ' // trim( diagnm( v )%var ) + & // ' to CTM_DUST_EMIS_1' + call m3exit( pname, mdate, mtime, xmsg, xstat1 ) + end if + end do + write( logdev,'( /5x, 2( a, 1x ), i8, ":", i6.6 )' ) + & 'Timestep written to CTM_DUST_EMIS_1', + & 'for date and time', mdate, mtime + wstep = 0 + dustbf = 0.0 ! array assignment + end if ! time to write + end if ! dustem_diag + +2009 Format( '*** Erodible landuse incorrect ', 1pe13.5, 1x, 'at: ', 3i4 ) +2015 format( /5x, 'Total grid time-avg sum of dust emis variables at:', + & 1x, i8, ":", I6.6 ) +2019 format( i10, 1x, a, f20.5 ) +2023 format( i10, 1x, a, e20.3 ) + + end subroutine get_dust_emis + +C======================================================================= + function dust_hflux( ndp, dp, soiltxt, fmoit, fruf, ustr, sd_ep, dens ) + & result( hflux ) + +C usage: hflux = dust_flux( ndp, dp, +C soiltxt( j,: ), +C fmoit( c,r ), +C fruf( c,r,m ), +C ustr( c,r,m ), +C sd_ep( c,r ), +C dens( c,r ) ) + + implicit none + + include SUBST_CONST ! for grav + + integer, intent( in ) :: ndp + real, intent( in ) :: dp( ndp ) + real, intent( in ) :: soiltxt( ndp ) + real, intent( in ) :: fmoit, fruf, ustr, sd_ep, dens + real hflux + + real, parameter :: amen = 1.0 ! Marticorena and Bergametti [JGR,1997] + real, parameter :: cfac = 1000.0 * amen / grav + real, parameter :: A = 260.60061 ! 0.0123 * 2650.0 * 9.81 / 1.227 + real, parameter :: B = 1.6540342e-06 ! 0.0123 * 0.000165 / 1.227 + real utstar ! threshold U* [m/s] + real utem ! U term [(m/s)**3] + real fac + integer n + +! I can't initialize dp this way - it has to be passed in since ndp is variable + +C---Mean mass median diameter (m) for each soil texture +C [Chatenet et al., Sedimentology 1996 and Menut et al., JGR 2013] +! real :: dp( ndp ) = +! & (/ 690.0E-6, ! Coarse sand +! & 210.0E-6, ! Fine-medium sand +! & 125.0E-6, ! Silt +! & 2.0E-6 /) ! Clay + + fac = cfac * dens * sd_ep + utem = 0.0 + utstar = 0.0 + hflux = 0.0 + do n = 1, ndp ! loop over dust particle size +! utstar = sqrt( 0.0123 * ( 2650.0 * 9.81 * dp( n ) / 1.227 + 0.000165 +! / 1.227 / dp( n ) ) ) ! X roughness & moisture effects + utstar = sqrt( A * dp( n ) + B / dp( n ) ) * fmoit * fruf !Shao and Lu [JGR,2000] + if ( ustr .gt. utstar ) then ! wind erosion occurs only if U* > U*t +C---Horiz. Flux from White (1979) + utem = ( ustr + utstar ) * ( ustr * ustr - utstar * utstar ) +C---Horiz. Flux from Owen (1964) +! utem = ustr * ( ustr * ustr - utstar * utstar ) + hflux = hflux + & + fac * utem * soiltxt( n ) ! [g/m/s] + end if + end do ! dust particle size + + end function dust_hflux + +C============================================================================== + function dust_volumetric_to_gravimetric(vsoilm,clay,sand) + & result ( gwc ) +C usage: H = dust_volumetric_to_gravimetric(vsoilm(c,r), +C clay(c,r), +C sand(c,r)) + + implicit none + ! INPUTS + real, intent(in) :: vsoilm ! volumetric soil moisture + real, intent(in) :: clay ! clay fraction (0 -> 1) + real, intent(in) :: sand ! sand fraction (0 -> 1) + ! OUTPUTS + real :: H + ! LOCAL + real :: gwc ! gravimetric soil moisture + real :: bulk_dens_dry ! bulk density + real :: limit ! fecan soil moisture limit + real :: wsat ! saturated volumentric water content + real :: mpot ! saturated soil matric potential + + ! parameters + real*8, parameter :: bulk_dens = 2650.0d0 + real*8, parameter :: h20_dens = 1000.0d0 + + ! saturated soil matric potential [ mm H2O ] + mpot = 10.d0 * (10.0d0 ** (1.88d0 - 0.0131d0 * sand )) + + ! saturated volumentric water content [ m3 m-3 ] + wsat = 0.489d0 - 0.00126d0 * sand + + ! Bulk density of dry surface soil [kg m-3] + bulk_dens_dry = bulk_dens * ( 1.0d0 - wsat) + + ! Gravimetric water content [ kg kg-1] + gwc = VSOILM * h20_dens / bulk_dens_dry + if (gwc.ge.1.0e10) then + gwc = 0.d0 + endif + + end function dust_volumetric_to_gravimetric + +C======================================================================= + function dust_hflux_fengsha( ustar, fmoit, drag, uthr, ssm, dens ) + & result( hflux ) + +C hflux = dust_hflux( Met_Data%ustar( c,r), +C & fmoit( c,r ), +C & drag( c,r ), +C & uthr( c,r ), +C & ssm( c,r ), +C & Met_Data%dens1( c,r ) ) + + implicit none + + include SUBST_CONST ! for grav + + real, intent( in ) :: ustar, fmoit, drag, uthr, ssm, dens + real hflux + real rustar + real u_sum + real u_thresh + real fac + + real, parameter :: amen = 1.0 ! Marticorena and Bergametti [JGR,1997] + real, parameter :: cfac = 1000.0 * amen / grav + + fac = cfac * dens + hflux = 0.0 + + rustar = ustar * drag + u_thresh = uthr * fmoit + u_sum = rustar * u_thresh + + + hflux = max(0., rustar - u_thresh) * u_sum * u_sum * fac * ssm + + end function dust_hflux_fengsha + + end module dust_emis + diff --git a/src/shr/aqm_config_mod.F90 b/src/shr/aqm_config_mod.F90 index c9ddc1a4..971f8b20 100644 --- a/src/shr/aqm_config_mod.F90 +++ b/src/shr/aqm_config_mod.F90 @@ -35,6 +35,7 @@ module aqm_config_mod logical :: ctm_wb_dust = .false. logical :: init_conc = .false. logical :: run_aero = .false. + logical :: fengsha_yn = .true. logical :: verbose = .false. type(aqm_species_type), pointer :: species => null() end type aqm_config_type @@ -174,7 +175,16 @@ subroutine aqm_config_read(model, config, rc) file=__FILE__, & rcToReturn=rc)) & return ! bail out - + + ! FENGSHA Options + call ESMF_ConfigGetAttribute(cf, config % fengsha_yn, & + label="fengsha_yn:", default=.true., rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__, & + rcToReturn=rc)) & + return ! bail out + ! -- microphysics tracer map call ESMF_ConfigGetAttribute(cf, config % mp_map, & label="mp_tracer_map:", rc=localrc) @@ -503,6 +513,13 @@ subroutine aqm_config_log(config, name, rc) call ESMF_LogWrite(trim(name) // ": config: read: run_aerosol: false", & ESMF_LOGMSG_INFO, rc=localrc) end if + if (config % fengsha_yn) then + call ESMF_LogWrite(trim(name) // ": config: read: fengsha_yn: true", & + ESMF_LOGMSG_INFO, rc=localrc) + else + call ESMF_LogWrite(trim(name) // ": config: read: fengsha_yn: false", & + ESMF_LOGMSG_INFO, rc=localrc) + end if if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__, & diff --git a/src/shr/aqm_emis_mod.F90 b/src/shr/aqm_emis_mod.F90 index 5590ef1d..12cf8171 100644 --- a/src/shr/aqm_emis_mod.F90 +++ b/src/shr/aqm_emis_mod.F90 @@ -1160,6 +1160,13 @@ subroutine aqm_emis_read(etype, spcname, buffer, localDe, rc) if (present(rc)) rc = AQM_RC_FAILURE return ! bail out end if + + if (trim(em % type) == "fengsha") then + ! -- ensure fengsha input variables are not normalized by area like + ! -- emissions conversions below + em % dens_flag(item) = 1 + end if + select case (em % dens_flag(item)) case (:-1) ! -- this case indicates that input emissions are provided as totals/cell diff --git a/src/shr/aqm_methods.F90 b/src/shr/aqm_methods.F90 index f4c4a8ff..b7a45d21 100644 --- a/src/shr/aqm_methods.F90 +++ b/src/shr/aqm_methods.F90 @@ -148,11 +148,11 @@ LOGICAL FUNCTION DESC3( FNAME ) ELSE IF ( TRIM( FNAME ) .EQ. TRIM( MET_CRO_2D ) ) THEN - NVARS3D = 31 + NVARS3D = 35 VNAME3D( 1:NVARS3D ) = & (/ 'PRSFC ', 'USTAR ', & 'WSTAR ', 'PBL ', & - 'ZRUF ', & + 'ZRUF ', & 'HFX ', 'WSPD10 ', & 'GSW ', 'RGRND ', & 'RNA ', 'RCA ', & @@ -165,11 +165,13 @@ LOGICAL FUNCTION DESC3( FNAME ) 'SLTYP ', 'Q2 ', & 'SEAICE ', 'SOIM1 ', & 'SOIM2 ', 'SOIT1 ', & - 'SOIT2 ', 'LH ' /) + 'SOIT2 ', 'LH ', & + 'CLAYF ', 'SANDF ', & + 'DRAG ', 'UTHR ' /) UNITS3D( 1:NVARS3D ) = & (/ 'Pascal ', 'M/S ', & 'M/S ', 'M ', & - 'M ', & + 'M ', & 'WATTS/M**2 ', 'M/S ', & 'WATTS/M**2 ', 'WATTS/M**2 ', & 'CM ', 'CM ', & @@ -182,7 +184,9 @@ LOGICAL FUNCTION DESC3( FNAME ) '- ', 'KG/KG ', & 'FRACTION ', 'M**3/M**3 ', & 'M**3/M**3 ', 'K ', & - 'K ', 'WATTS/M**2 ' /) + 'K ', 'WATTS/M**2 ', & + '1 ', '1 ', & + '1 ', 'M/S ' /) ELSE IF ( TRIM( FNAME ) .EQ. TRIM( MET_CRO_3D ) ) THEN @@ -330,6 +334,8 @@ logical function envyn(name, description, defaultval, status) envyn = associated(em) case ('CTM_GRAV_SETL') envyn = .false. + case ('CTM_FENGSHA') + envyn = config % fengsha_yn case ('INITIAL_RUN') envyn = .true. case default @@ -640,6 +646,10 @@ logical function interpx( fname, vname, pname, & call aqm_model_get(stateIn=stateIn, rc=localrc) if (aqm_rc_check(localrc, msg="Failure to retrieve model input state", & file=__FILE__, line=__LINE__)) return + + call aqm_model_get(config=config, stateIn=stateIn, rc=localrc) + if (aqm_rc_check(localrc, msg="Failure to retrieve model input state", & + file=__FILE__, line=__LINE__)) return select case (trim(vname)) case ("HFX") @@ -736,6 +746,48 @@ logical function interpx( fname, vname, pname, & buffer(k) = 0.01 * stateIn % zorl(c,r) end do end do + + ! fengsha variables + case ("CLAYF") + ! p2d => stateIn % cclayf + if (config % fengsha_yn) then + call aqm_emis_read("fengsha", vname, buffer, rc=localrc) + if (aqm_rc_test((localrc /= 0), & + msg="Failure to read fengsha for " // vname, & + file=__FILE__, line=__LINE__)) return + else + buffer(1:lbuf) = 0. + end if + case ("SANDF") + ! p2d => stateIn % csandf + if (config % fengsha_yn) then + call aqm_emis_read("fengsha", vname, buffer, rc=localrc) + if (aqm_rc_test((localrc /= 0), & + msg="Failure to read fengsha for " // vname, & + file=__FILE__, line=__LINE__)) return + else + buffer(1:lbuf) = 0. + end if + case ("DRAG") + ! p2d => stateIn % cdrag + if (config % fengsha_yn) then + call aqm_emis_read("fengsha", vname, buffer, rc=localrc) + if (aqm_rc_test((localrc /= 0), & + msg="Failure to read fengsha for " // vname, & + file=__FILE__, line=__LINE__)) return + else + buffer(1:lbuf) = 0. + end if + case ("UTHR") + ! p2d => stateIn % cuthr + if (config % fengsha_yn) then + call aqm_emis_read("fengsha", vname, buffer, rc=localrc) + if (aqm_rc_test((localrc /= 0), & + msg="Failure to read fengsha for " // vname, & + file=__FILE__, line=__LINE__)) return + else + buffer(1:lbuf) = 0. + end if case default ! return end select