From 43588af77cf86ee9f24cc67437d625d0ebede984 Mon Sep 17 00:00:00 2001 From: bbakernoaa Date: Wed, 3 Aug 2022 14:09:23 +0000 Subject: [PATCH 1/8] updates --- aqm_files.cmake | 6 +- src/model/Makefile.am | 64 +- src/model/Makefile.in | 109 +- src/model/src/ASX_DATA_MOD.F | 1463 +++++++++++++++++++ src/model/src/ASX_DATA_MOD.F~ | 1459 +++++++++++++++++++ src/model/src/DUST_EMIS.F | 1525 ++++++++++++++++++++ src/model/src/centralized_io_util_module.F | 282 ++++ 7 files changed, 4828 insertions(+), 80 deletions(-) create mode 100755 src/model/src/ASX_DATA_MOD.F create mode 100755 src/model/src/ASX_DATA_MOD.F~ create mode 100644 src/model/src/DUST_EMIS.F create mode 100644 src/model/src/centralized_io_util_module.F diff --git a/aqm_files.cmake b/aqm_files.cmake index c3f7420c..22bd6af5 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,8 @@ list(APPEND aqm_CCTM_files ${localCCTM}/vdiffacmx.F ${localCCTM}/PTMAP.F ${localCCTM}/PT3D_DEFN.F + ${localCCTM}/ASX_DATA_MOD.F + ${localCCTM}/centralized_io_util_module.F + ${localCCTM}/DUST_EMIS.F ) + diff --git a/src/model/Makefile.am b/src/model/Makefile.am index 61c4887b..909b66ee 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,11 @@ 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)/centralized_io_util_module.F \ + $(localCCTM)/DUST_EMIS.F + libCCTM_a_CPPFLAGS = -DSUBST_FILES_ID=\"FILES_CTM.EXT\" @@ -289,7 +291,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 +303,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 +320,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 +349,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 +370,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 +380,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 +389,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 +407,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 +422,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 +437,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 +450,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 +459,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 +618,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 +639,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 +651,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 +663,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 +673,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..e6ef50a2 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,10 @@ 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-centralized_io_util_module.$(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 +469,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 +505,15 @@ 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)/centralized_io_util_module.F $(localCCTM)/DUST_EMIS.F # local version of CCTM source files localCCTM = $(builddir)/src @@ -757,8 +760,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 +982,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 +1021,12 @@ $(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-centralized_io_util_module.$(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 +1278,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 +1622,20 @@ $(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 ++$(localCCTM)/libCCTM_a-centralized_io_util_module.o: $(localCCTM)/centralized_io_util_module.F ++ $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(localCCTM)/libCCTM_a-centralized_io_util_module.o +`test -f '$(localCCTM)/centralized_io_util_module.F' || echo '$(srcdir)/'`$(localCCTM)/centralized_io_util_module.F ++ ++$(localCCTM)/libCCTM_a-centralized_io_util_module.obj: $(localCCTM)/centralized_io_util_module.F ++ $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(localCCTM)/libCCTM_a-centralized_io_util_module.ob +j `if test -f '$(localCCTM)/centralized_io_util_module.F'; then $(CYGPATH_W) '$(localCCTM)/centralized_io_util_module.F'; else $(CYGPATH_W) '$(srcdir)/$(localCCTM)/centralized_io_util_module +.F'; fi` -$(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.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 + +$(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 +2180,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 +2192,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 +2209,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 +2238,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 +2259,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 +2269,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 +2278,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 +2296,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 +2311,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 +2326,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 +2339,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 +2348,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 +2507,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 +2528,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 +2540,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 +2552,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 +2562,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..160183f0 --- /dev/null +++ b/src/model/src/ASX_DATA_MOD.F @@ -0,0 +1,1463 @@ +!------------------------------------------------------------------------! +! 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 ) + + 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 + If ( FENGSHA ) Then + write(*,*) 'Read clayfrac' + VNAME = 'CLAYF' + write(*,*) VNAME, PNAME + write(*,*) JDATE, JTIME + write(*,*) STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2 + 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 + write(*,*) 'read sandfrac' + 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 + + write(*,*) 'read drag' + 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 + write(*,*) 'Read uthr' + 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/ASX_DATA_MOD.F~ b/src/model/src/ASX_DATA_MOD.F~ new file mode 100755 index 00000000..0e7b79e7 --- /dev/null +++ b/src/model/src/ASX_DATA_MOD.F~ @@ -0,0 +1,1459 @@ +!------------------------------------------------------------------------! +! 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 ) + + 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 + write(*,*) 'Read clayfrac' + 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 + write(*,*) 'read sandfrac' + 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..3fb64c8d --- /dev/null +++ b/src/model/src/DUST_EMIS.F @@ -0,0 +1,1525 @@ + +!------------------------------------------------------------------------! +! 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 + + 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 ) + 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 + +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/model/src/centralized_io_util_module.F b/src/model/src/centralized_io_util_module.F new file mode 100644 index 00000000..f5b06531 --- /dev/null +++ b/src/model/src/centralized_io_util_module.F @@ -0,0 +1,282 @@ + +!------------------------------------------------------------------------! +! 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. ! +!------------------------------------------------------------------------! + +!------------------------------------------------------------------------! +! This module contains utility functions to support centralized I/O +! implementation + +! Revision History: +! 02/01/19, D. Wong: initial implementation +! 08/01/19, D. Wong: modified code to work with two-way model +! 11/20/19, F. Sidi: Modified time to sec to handle negative numbers +!------------------------------------------------------------------------! + + module centralized_io_util_module + + implicit none + + interface quicksort + module procedure quicksort1d, + & quicksort2d + end interface + + contains + +! ------------------------------------------------------------------------- + recursive subroutine quicksort1d (name, begin, end) + + character (*), intent(out) :: name(:) + integer, intent(in) :: begin, end + + integer :: i, j + character (50) :: str1, str2 + logical :: done + + str1 = name( (begin + end) / 2 ) + i = begin + j = end + done = .false. + do while (.not. done) + do while (name(i) < str1) + i = i + 1 + end do + do while (str1 < name(j)) + j = j - 1 + end do + if (i .ge. j) then + done = .true. + else + str2 = name(i) + name(i) = name(j) + name(j) = str2 + i = i + 1 + j = j - 1 + end if + end do + if (begin < i-1) call quicksort(name, begin, i-1) + if (j+1 < end) call quicksort(name, j+1, end) + + end subroutine quicksort1d + +! ------------------------------------------------------------------------- + recursive subroutine quicksort2d (name, begin, end) + + character (*), intent(out) :: name(:,:) + integer, intent(in) :: begin, end + + integer :: i, j, dsize + character (50) :: str1, str2(3) + logical :: done + + dsize = size(name,2) + str1 = name( (begin + end) / 2, 1 ) + i = begin + j = end + done = .false. + do while (.not. done) + do while (name(i,1) < str1) + i = i + 1 + end do + do while (str1 < name(j, 1)) + j = j - 1 + end do + if (i .ge. j) then + done = .true. + else + str2(1:dsize) = name(i,:) + name(i,:) = name(j,:) + name(j,:) = str2(1:dsize) + i = i + 1 + j = j - 1 + end if + end do + if (begin < i-1) call quicksort(name, begin, i-1) + if (j+1 < end) call quicksort(name, j+1, end) + + end subroutine quicksort2d + +! ------------------------------------------------------------------------- + function binary_search (name, list, n) result (loc) + + character (*), intent(in) :: name, list(:) + integer, intent(in) :: n + integer :: loc + + logical :: found + integer :: mid_loc, start_loc, end_loc + + start_loc = 1 + end_loc = n + found = .false. + do while ((start_loc .le. end_loc) .and. (.not. found)) + mid_loc = start_loc + (end_loc - start_loc) / 2 + if (name .lt. list(mid_loc)) then + end_loc = mid_loc - 1 + else if (name .gt. list(mid_loc)) then + start_loc = mid_loc + 1 + else + found = .true. + end if + end do + + if (found) then + loc = mid_loc + else + loc = -1 + end if + + end function binary_search + +! ------------------------------------------------------------------------- + function search (name, list, n) result (loc) + + character (*), intent(in) :: name, list(:) + integer, intent(in) :: n + integer :: loc + + logical :: found + integer :: lloc + + lloc = 0 + found = .false. + do while ((lloc .le. n) .and. (.not. found)) + lloc = lloc + 1 + if (name .eq. list(lloc)) then + found = .true. + end if + end do + + if (found) then + loc = lloc + else + loc = -1 + end if + + end function search + +! ------------------------------------------------------------------------- + integer function time_to_sec (time) + + integer, intent(in) :: time + integer :: neg_time + integer :: time_in_sec, hr, min, sec + + if (time .gt. 0) then + hr = time / 10000 + min = mod(time/100, 100) + sec = mod(time, 100) + time_to_sec = hr * 3600 + min * 60 + sec + else + neg_time = abs(time) + hr = neg_time / 10000 + min = mod(neg_time/100, 100) + sec = mod(neg_time, 100) + time_to_sec = -1*(hr * 3600 + min * 60 + sec) + end if + + end function time_to_sec + +! ------------------------------------------------------------------------- + integer function time_diff (time1, time2) + + integer, intent(in) :: time1, time2 + + time_diff = time_to_sec(time1) - time_to_sec(time2) + + end function time_diff + +!-------------------------------------------------------------------------- + integer function next_day (jday) + +! This function determermins the next day for time interpolation + implicit none + + integer, intent(in) :: jday + integer year, day + + day = MOD(jday,1000) + year = INT(jday/1000) + + If( day .LT. 365 ) Then + next_day = jday+1 + Else + If( MOD(year,4) .Eq. 0 .And. MOD(year,100) .Ne. 0 ) Then +! Leap Year + If( day .Eq. 365 ) Then + next_day = jday + 1 + Else + next_day = (INT(jday/1000)+1)*1000+1 + End If + Else If(MOD(year,400) .Eq. 0 ) Then +! also a leap year, e.g. 2000 but not 2100 + If( day .Eq. 365 ) Then + next_day = jday + 1 + Else + next_day = (INT(jday/1000)+1)*1000+1 + End If + Else +! not a leap year + next_day = (INT(jday/1000)+1)*1000+1 + End If + End If + + end function next_day + +!-------------------------------------------------------------------------- + + function IntegrateTrapezoid(x, y) + !! Calculates the integral of an array y with respect to x using the trapezoid + !! approximation. Note that the mesh spacing of x does not have to be uniform. + real, intent(in) :: x(:) !! Variable x + real, intent(in) :: y(size(x)) !! Function y(x) + real :: IntegrateTrapezoid !! Integral ∫y(x)·dx + ! Integrate using the trapezoidal rule + associate(n => size(x)) + IntegrateTrapezoid = sum((y(1+1:n-0) + y(1+0:n-1))*(x(1+1:n-0) - x(1+0:n-1)))/2 + end associate + end function + +! --------------------------------------------------------------------------- + + function interp_linear1_internal(x,y,xout) result(yout) + !! Interpolates for the y value at the desired x value, + !! given x and y values around the desired point. + + implicit none + + real, intent(IN) :: x(2), y(2), xout + real :: yout + real :: alph + + if ( xout .lt. x(1) .or. xout .gt. x(2) ) then + write(*,*) "interp1: xout < x0 or xout > x1 !" + write(*,*) "xout = ",xout + write(*,*) "x0 = ",x(1) + write(*,*) "x1 = ",x(2) + stop + end if + + alph = (xout - x(1)) / (x(2) - x(1)) + yout = y(1) + alph*(y(2) - y(1)) + + return + + end function interp_linear1_internal + + end module centralized_io_util_module From 1abdda056abb38083f9425d4ed38a88b37af3aea Mon Sep 17 00:00:00 2001 From: bbakernoaa Date: Wed, 3 Aug 2022 14:09:57 +0000 Subject: [PATCH 2/8] updates --- src/shr/aqm_config_mod.F90 | 16 +++++++++++ src/shr/aqm_emis_mod.F90 | 7 +++++ src/shr/aqm_methods.F90 | 57 +++++++++++++++++++++++++++++++++++--- 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/src/shr/aqm_config_mod.F90 b/src/shr/aqm_config_mod.F90 index c9ddc1a4..9f753402 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 = .false. logical :: verbose = .false. type(aqm_species_type), pointer :: species => null() end type aqm_config_type @@ -193,6 +194,14 @@ subroutine aqm_config_read(model, config, rc) rcToReturn=rc)) & return ! bail out + call ESMF_ConfigGetAttribute(cf, config % fengsha_yn, & + label="fengsha_yn:", default=.false., rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__, & + rcToReturn=rc)) & + return ! bail out + ! -- set other default values config % ctm_depvfile = .false. config % ctm_photodiag = .false. @@ -496,6 +505,13 @@ subroutine aqm_config_log(config, name, rc) call ESMF_LogWrite(trim(name) // ": config: read: ctm_wb_dust: 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 (config % run_aero) then call ESMF_LogWrite(trim(name) // ": config: read: run_aerosol: true", & ESMF_LOGMSG_INFO, rc=localrc) diff --git a/src/shr/aqm_emis_mod.F90 b/src/shr/aqm_emis_mod.F90 index 5590ef1d..a8dbceed 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 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..f82fc4f8 100644 --- a/src/shr/aqm_methods.F90 +++ b/src/shr/aqm_methods.F90 @@ -148,7 +148,7 @@ 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 ', & @@ -165,7 +165,9 @@ 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 ', & @@ -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 ', & + '- ', '- ', & + '- ', 'M/S ' /) ELSE IF ( TRIM( FNAME ) .EQ. TRIM( MET_CRO_3D ) ) THEN @@ -330,6 +334,10 @@ logical function envyn(name, description, defaultval, status) envyn = associated(em) case ('CTM_GRAV_SETL') envyn = .false. + case ('CTM_FENGSHA') + write(*,*) 'CTM_FENGSHA CONFIG SET' + envyn = config % fengsha_yn ! Default: False + envyn = .true. case ('INITIAL_RUN') envyn = .true. case default @@ -736,7 +744,48 @@ logical function interpx( fname, vname, pname, & buffer(k) = 0.01 * stateIn % zorl(c,r) end do end do - case default + case ("CLAYF") + ! p2d -> stateIn % clayf + if (config % fengsha_yn) then + write(*,*) 'FENGSHA CONFIG READ' + 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 + endif + case ("SANDF") + ! p2d -> stateIn % clayf + 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 + endif + case ("DRAG") + ! p2d -> stateIn % clayf + 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 + endif + case ("UTHR") + ! p2d -> stateIn % clayf + 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 + endif + case default ! return end select From 11c22626d5da6655be3b0f403e8dcae3511353c2 Mon Sep 17 00:00:00 2001 From: bbakernoaa Date: Wed, 3 Aug 2022 14:30:50 +0000 Subject: [PATCH 3/8] Revert "updates" This reverts commit 1abdda056abb38083f9425d4ed38a88b37af3aea. --- src/shr/aqm_config_mod.F90 | 16 ----------- src/shr/aqm_emis_mod.F90 | 7 ----- src/shr/aqm_methods.F90 | 57 +++----------------------------------- 3 files changed, 4 insertions(+), 76 deletions(-) diff --git a/src/shr/aqm_config_mod.F90 b/src/shr/aqm_config_mod.F90 index 9f753402..c9ddc1a4 100644 --- a/src/shr/aqm_config_mod.F90 +++ b/src/shr/aqm_config_mod.F90 @@ -35,7 +35,6 @@ module aqm_config_mod logical :: ctm_wb_dust = .false. logical :: init_conc = .false. logical :: run_aero = .false. - logical :: fengsha_yn = .false. logical :: verbose = .false. type(aqm_species_type), pointer :: species => null() end type aqm_config_type @@ -194,14 +193,6 @@ subroutine aqm_config_read(model, config, rc) rcToReturn=rc)) & return ! bail out - call ESMF_ConfigGetAttribute(cf, config % fengsha_yn, & - label="fengsha_yn:", default=.false., rc=localrc) - if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, & - file=__FILE__, & - rcToReturn=rc)) & - return ! bail out - ! -- set other default values config % ctm_depvfile = .false. config % ctm_photodiag = .false. @@ -505,13 +496,6 @@ subroutine aqm_config_log(config, name, rc) call ESMF_LogWrite(trim(name) // ": config: read: ctm_wb_dust: 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 (config % run_aero) then call ESMF_LogWrite(trim(name) // ": config: read: run_aerosol: true", & ESMF_LOGMSG_INFO, rc=localrc) diff --git a/src/shr/aqm_emis_mod.F90 b/src/shr/aqm_emis_mod.F90 index a8dbceed..5590ef1d 100644 --- a/src/shr/aqm_emis_mod.F90 +++ b/src/shr/aqm_emis_mod.F90 @@ -1160,13 +1160,6 @@ 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 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 f82fc4f8..f4c4a8ff 100644 --- a/src/shr/aqm_methods.F90 +++ b/src/shr/aqm_methods.F90 @@ -148,7 +148,7 @@ LOGICAL FUNCTION DESC3( FNAME ) ELSE IF ( TRIM( FNAME ) .EQ. TRIM( MET_CRO_2D ) ) THEN - NVARS3D = 35 + NVARS3D = 31 VNAME3D( 1:NVARS3D ) = & (/ 'PRSFC ', 'USTAR ', & 'WSTAR ', 'PBL ', & @@ -165,9 +165,7 @@ LOGICAL FUNCTION DESC3( FNAME ) 'SLTYP ', 'Q2 ', & 'SEAICE ', 'SOIM1 ', & 'SOIM2 ', 'SOIT1 ', & - 'SOIT2 ', 'LH ', & - 'CLAYF ', 'SANDF ', & - 'DRAG ', 'UTHR ' /) + 'SOIT2 ', 'LH ' /) UNITS3D( 1:NVARS3D ) = & (/ 'Pascal ', 'M/S ', & 'M/S ', 'M ', & @@ -184,9 +182,7 @@ LOGICAL FUNCTION DESC3( FNAME ) '- ', 'KG/KG ', & 'FRACTION ', 'M**3/M**3 ', & 'M**3/M**3 ', 'K ', & - 'K ', 'WATTS/M**2 ', & - '- ', '- ', & - '- ', 'M/S ' /) + 'K ', 'WATTS/M**2 ' /) ELSE IF ( TRIM( FNAME ) .EQ. TRIM( MET_CRO_3D ) ) THEN @@ -334,10 +330,6 @@ logical function envyn(name, description, defaultval, status) envyn = associated(em) case ('CTM_GRAV_SETL') envyn = .false. - case ('CTM_FENGSHA') - write(*,*) 'CTM_FENGSHA CONFIG SET' - envyn = config % fengsha_yn ! Default: False - envyn = .true. case ('INITIAL_RUN') envyn = .true. case default @@ -744,48 +736,7 @@ logical function interpx( fname, vname, pname, & buffer(k) = 0.01 * stateIn % zorl(c,r) end do end do - case ("CLAYF") - ! p2d -> stateIn % clayf - if (config % fengsha_yn) then - write(*,*) 'FENGSHA CONFIG READ' - 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 - endif - case ("SANDF") - ! p2d -> stateIn % clayf - 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 - endif - case ("DRAG") - ! p2d -> stateIn % clayf - 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 - endif - case ("UTHR") - ! p2d -> stateIn % clayf - 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 - endif - case default + case default ! return end select From 9b8d2e07af34fe5c7edf50276da808d583c6c82b Mon Sep 17 00:00:00 2001 From: bbakernoaa Date: Wed, 3 Aug 2022 14:31:04 +0000 Subject: [PATCH 4/8] Revert "updates" This reverts commit 43588af77cf86ee9f24cc67437d625d0ebede984. --- aqm_files.cmake | 6 +- src/model/Makefile.am | 64 +- src/model/Makefile.in | 109 +- src/model/src/ASX_DATA_MOD.F | 1463 ------------------- src/model/src/ASX_DATA_MOD.F~ | 1459 ------------------- src/model/src/DUST_EMIS.F | 1525 -------------------- src/model/src/centralized_io_util_module.F | 282 ---- 7 files changed, 80 insertions(+), 4828 deletions(-) delete mode 100755 src/model/src/ASX_DATA_MOD.F delete mode 100755 src/model/src/ASX_DATA_MOD.F~ delete mode 100644 src/model/src/DUST_EMIS.F delete mode 100644 src/model/src/centralized_io_util_module.F diff --git a/aqm_files.cmake b/aqm_files.cmake index 22bd6af5..c3f7420c 100644 --- a/aqm_files.cmake +++ b/aqm_files.cmake @@ -130,6 +130,7 @@ 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 @@ -214,6 +215,7 @@ 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 @@ -229,8 +231,4 @@ list(APPEND aqm_CCTM_files ${localCCTM}/vdiffacmx.F ${localCCTM}/PTMAP.F ${localCCTM}/PT3D_DEFN.F - ${localCCTM}/ASX_DATA_MOD.F - ${localCCTM}/centralized_io_util_module.F - ${localCCTM}/DUST_EMIS.F ) - diff --git a/src/model/Makefile.am b/src/model/Makefile.am index 909b66ee..61c4887b 100644 --- a/src/model/Makefile.am +++ b/src/model/Makefile.am @@ -79,6 +79,7 @@ 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 \ @@ -222,6 +223,7 @@ 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 \ @@ -240,11 +242,7 @@ libCCTM_a_SOURCES += \ $(localCCTM)/o3totcol.f \ $(localCCTM)/vdiffacmx.F \ $(localCCTM)/PTMAP.F \ - $(localCCTM)/PT3D_DEFN.F \ - $(localCCTM)/ASX_DATA_MOD.F \ - $(localCCTM)/centralized_io_util_module.F \ - $(localCCTM)/DUST_EMIS.F - + $(localCCTM)/PT3D_DEFN.F libCCTM_a_CPPFLAGS = -DSUBST_FILES_ID=\"FILES_CTM.EXT\" @@ -291,7 +289,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) \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(libVDIFF)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) @@ -303,8 +301,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) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ - $(libSPCS)CGRID_SPCS.$(OBJEXT) $(liblocalCCTM)DUST_EMIS.$(OBJEXT) \ + $(libAERO)AERO_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ + $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libEMIS)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) \ @@ -320,7 +318,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) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ + $(libAERO)AERO_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libAERO)getpar.$(OBJEXT) : \ @@ -349,11 +347,11 @@ $(libAERO)SOA_DEFN.$(OBJEXT) : \ # biog $(libBIOG)beis3.$(OBJEXT) : \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) + $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) $(libBIOG)czangle.$(OBJEXT) : $(ICL)/const/CONST.EXT \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) + $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libBIOG)hrno.$(OBJEXT) : \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) \ + $(libVDIFF)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) : \ @@ -370,7 +368,7 @@ $(libCLOUD)hlconst.$(OBJEXT) : \ # depv $(libDEPV)ABFLUX_MOD.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(libVDIFF)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 \ @@ -380,7 +378,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 \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(libVDIFF)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) \ @@ -389,13 +387,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 \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(libVDIFF)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 \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ + $(libVDIFF)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) \ @@ -407,7 +405,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) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ + $(libDEPV)ABFLUX_MOD.$(OBJEXT) $(libVDIFF)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) \ @@ -422,9 +420,13 @@ $(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) \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BEIS_DEFN.$(OBJEXT) \ + $(libVDIFF)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) \ @@ -437,7 +439,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) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ + $(libAERO)AEROMET_DATA.$(OBJEXT) $(libVDIFF)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) @@ -450,7 +452,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) \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ + $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libSTENEX)noop_modules.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)STK_EMIS.$(OBJEXT) : \ @@ -459,7 +461,7 @@ $(libEMIS)STK_PRMS.$(OBJEXT) : \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libEMIS)UDTYPES.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)tfabove.$(OBJEXT) : \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ + $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libEMIS)LUS_DEFN.$(OBJEXT) $(libEMIS)tfbelow.$(OBJEXT) : \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libEMIS)LUS_DEFN.$(OBJEXT) \ @@ -618,8 +620,12 @@ $(libUTIL)subhdomain.$(OBJEXT) : \ # vdiff $(libVDIFF)aero_sedv.$(OBJEXT) : \ $(libAERO)AERO_DATA.$(OBJEXT) $(libAERO)AEROMET_DATA.$(OBJEXT) \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(libVDIFF)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) @@ -639,7 +645,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 \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(libVDIFF)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) : \ @@ -651,7 +657,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 \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(libVDIFF)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) \ @@ -663,7 +669,7 @@ $(libVDIFF)vdiffproc.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(liblocalCCTM)o3totcol.$(OBJEXT) : \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(liblocalCCTM)vdiffacmx.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(libVDIFF)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) @@ -673,11 +679,3 @@ $(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 e6ef50a2..0c12a885 100644 --- a/src/model/Makefile.in +++ b/src/model/Makefile.in @@ -143,6 +143,7 @@ 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) \ @@ -221,6 +222,7 @@ 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) \ @@ -235,10 +237,7 @@ 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-ASX_DATA_MOD.$(OBJEXT) \ - $(localCCTM)/libCCTM_a-centralized_io_util_module.$(OBJEXT) \ - $(localCCTM)/libCCTM_a-DUST_EMIS.$(OBJEXT) + $(localCCTM)/libCCTM_a-PT3D_DEFN.$(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@) @@ -469,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)/EMIS_DEFN.F $(EMIS)/LTNG_DEFN.F \ + $(EMIS)/DUST_EMIS.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 \ @@ -505,15 +504,13 @@ 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)/aero_sedv.F $(VDIFF)/ASX_DATA_MOD.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)/ASX_DATA_MOD.F \ - $(localCCTM)/centralized_io_util_module.F $(localCCTM)/DUST_EMIS.F + $(localCCTM)/PTMAP.F $(localCCTM)/PT3D_DEFN.F # local version of CCTM source files localCCTM = $(builddir)/src @@ -760,6 +757,8 @@ $(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) \ @@ -982,6 +981,8 @@ $(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) \ @@ -1021,12 +1022,6 @@ $(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-centralized_io_util_module.$(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 @@ -1278,13 +1273,11 @@ $(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` -$(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.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.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-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` $(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 @@ -1622,20 +1615,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` -+$(localCCTM)/libCCTM_a-centralized_io_util_module.o: $(localCCTM)/centralized_io_util_module.F -+ $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(localCCTM)/libCCTM_a-centralized_io_util_module.o -`test -f '$(localCCTM)/centralized_io_util_module.F' || echo '$(srcdir)/'`$(localCCTM)/centralized_io_util_module.F -+ -+$(localCCTM)/libCCTM_a-centralized_io_util_module.obj: $(localCCTM)/centralized_io_util_module.F -+ $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCCTM_a_CPPFLAGS) $(CPPFLAGS) $(libCCTM_a_FFLAGS) $(FFLAGS) -c -o $(localCCTM)/libCCTM_a-centralized_io_util_module.ob -j `if test -f '$(localCCTM)/centralized_io_util_module.F'; then $(CYGPATH_W) '$(localCCTM)/centralized_io_util_module.F'; else $(CYGPATH_W) '$(srcdir)/$(localCCTM)/centralized_io_util_module -.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 - -$(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-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` $(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 @@ -2180,7 +2164,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) \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(libVDIFF)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) @@ -2192,8 +2176,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) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ - $(libSPCS)CGRID_SPCS.$(OBJEXT) $(liblocalCCTM)DUST_EMIS.$(OBJEXT) \ + $(libAERO)AERO_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ + $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libEMIS)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) \ @@ -2209,7 +2193,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) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ + $(libAERO)AERO_DATA.$(OBJEXT) $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) \ $(libSPCS)CGRID_SPCS.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libAERO)getpar.$(OBJEXT) : \ @@ -2238,11 +2222,11 @@ $(libAERO)SOA_DEFN.$(OBJEXT) : \ # biog $(libBIOG)beis3.$(OBJEXT) : \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) + $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) $(libBIOG)czangle.$(OBJEXT) : $(ICL)/const/CONST.EXT \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) + $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libBIOG)hrno.$(OBJEXT) : \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BIOG_EMIS.$(OBJEXT) \ + $(libVDIFF)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) : \ @@ -2259,7 +2243,7 @@ $(libCLOUD)hlconst.$(OBJEXT) : \ # depv $(libDEPV)ABFLUX_MOD.$(OBJEXT) : $(ICL)/const/CONST.EXT $(ICL)/filenames/FILES_CTM.EXT \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(libVDIFF)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 \ @@ -2269,7 +2253,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 \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(libVDIFF)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) \ @@ -2278,13 +2262,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 \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(libVDIFF)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 \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ + $(libVDIFF)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) \ @@ -2296,7 +2280,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) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ + $(libDEPV)ABFLUX_MOD.$(OBJEXT) $(libVDIFF)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) \ @@ -2311,9 +2295,13 @@ $(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) \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libEMIS)BEIS_DEFN.$(OBJEXT) \ + $(libVDIFF)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) \ @@ -2326,7 +2314,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) $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) \ + $(libAERO)AEROMET_DATA.$(OBJEXT) $(libVDIFF)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) @@ -2339,7 +2327,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) \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ + $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libGRID)GRID_CONF.$(OBJEXT) \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libSTENEX)noop_modules.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)STK_EMIS.$(OBJEXT) : \ @@ -2348,7 +2336,7 @@ $(libEMIS)STK_PRMS.$(OBJEXT) : \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libEMIS)UDTYPES.$(OBJEXT) \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(libEMIS)tfabove.$(OBJEXT) : \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ + $(libVDIFF)ASX_DATA_MOD.$(OBJEXT) $(libGRID)HGRD_DEFN.$(OBJEXT) \ $(libEMIS)LUS_DEFN.$(OBJEXT) $(libEMIS)tfbelow.$(OBJEXT) : \ $(libGRID)HGRD_DEFN.$(OBJEXT) $(libEMIS)LUS_DEFN.$(OBJEXT) \ @@ -2507,8 +2495,12 @@ $(libUTIL)subhdomain.$(OBJEXT) : \ # vdiff $(libVDIFF)aero_sedv.$(OBJEXT) : \ $(libAERO)AERO_DATA.$(OBJEXT) $(libAERO)AEROMET_DATA.$(OBJEXT) \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(libVDIFF)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) @@ -2528,7 +2520,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 \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(libVDIFF)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) : \ @@ -2540,7 +2532,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 \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) \ + $(libVDIFF)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) \ @@ -2552,7 +2544,7 @@ $(libVDIFF)vdiffproc.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ $(liblocalCCTM)o3totcol.$(OBJEXT) : \ $(libUTIL)UTILIO_DEFN.$(OBJEXT) $(liblocalCCTM)vdiffacmx.$(OBJEXT) : $(ICL)/filenames/FILES_CTM.EXT \ - $(liblocalCCTM)ASX_DATA_MOD.$(OBJEXT) $(libDEPV)BIDI_MOD.$(OBJEXT) $(libSPCS)CGRID_SPCS.$(OBJEXT) \ + $(libVDIFF)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) @@ -2562,14 +2554,7 @@ $(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 deleted file mode 100755 index 160183f0..00000000 --- a/src/model/src/ASX_DATA_MOD.F +++ /dev/null @@ -1,1463 +0,0 @@ -!------------------------------------------------------------------------! -! 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 ) - - 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 - If ( FENGSHA ) Then - write(*,*) 'Read clayfrac' - VNAME = 'CLAYF' - write(*,*) VNAME, PNAME - write(*,*) JDATE, JTIME - write(*,*) STRTCOLMC2,ENDCOLMC2, STRTROWMC2,ENDROWMC2 - 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 - write(*,*) 'read sandfrac' - 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 - - write(*,*) 'read drag' - 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 - write(*,*) 'Read uthr' - 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/ASX_DATA_MOD.F~ b/src/model/src/ASX_DATA_MOD.F~ deleted file mode 100755 index 0e7b79e7..00000000 --- a/src/model/src/ASX_DATA_MOD.F~ +++ /dev/null @@ -1,1459 +0,0 @@ -!------------------------------------------------------------------------! -! 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 ) - - 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 - write(*,*) 'Read clayfrac' - 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 - write(*,*) 'read sandfrac' - 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 deleted file mode 100644 index 3fb64c8d..00000000 --- a/src/model/src/DUST_EMIS.F +++ /dev/null @@ -1,1525 +0,0 @@ - -!------------------------------------------------------------------------! -! 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 - - 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 ) - 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 - -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/model/src/centralized_io_util_module.F b/src/model/src/centralized_io_util_module.F deleted file mode 100644 index f5b06531..00000000 --- a/src/model/src/centralized_io_util_module.F +++ /dev/null @@ -1,282 +0,0 @@ - -!------------------------------------------------------------------------! -! 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. ! -!------------------------------------------------------------------------! - -!------------------------------------------------------------------------! -! This module contains utility functions to support centralized I/O -! implementation - -! Revision History: -! 02/01/19, D. Wong: initial implementation -! 08/01/19, D. Wong: modified code to work with two-way model -! 11/20/19, F. Sidi: Modified time to sec to handle negative numbers -!------------------------------------------------------------------------! - - module centralized_io_util_module - - implicit none - - interface quicksort - module procedure quicksort1d, - & quicksort2d - end interface - - contains - -! ------------------------------------------------------------------------- - recursive subroutine quicksort1d (name, begin, end) - - character (*), intent(out) :: name(:) - integer, intent(in) :: begin, end - - integer :: i, j - character (50) :: str1, str2 - logical :: done - - str1 = name( (begin + end) / 2 ) - i = begin - j = end - done = .false. - do while (.not. done) - do while (name(i) < str1) - i = i + 1 - end do - do while (str1 < name(j)) - j = j - 1 - end do - if (i .ge. j) then - done = .true. - else - str2 = name(i) - name(i) = name(j) - name(j) = str2 - i = i + 1 - j = j - 1 - end if - end do - if (begin < i-1) call quicksort(name, begin, i-1) - if (j+1 < end) call quicksort(name, j+1, end) - - end subroutine quicksort1d - -! ------------------------------------------------------------------------- - recursive subroutine quicksort2d (name, begin, end) - - character (*), intent(out) :: name(:,:) - integer, intent(in) :: begin, end - - integer :: i, j, dsize - character (50) :: str1, str2(3) - logical :: done - - dsize = size(name,2) - str1 = name( (begin + end) / 2, 1 ) - i = begin - j = end - done = .false. - do while (.not. done) - do while (name(i,1) < str1) - i = i + 1 - end do - do while (str1 < name(j, 1)) - j = j - 1 - end do - if (i .ge. j) then - done = .true. - else - str2(1:dsize) = name(i,:) - name(i,:) = name(j,:) - name(j,:) = str2(1:dsize) - i = i + 1 - j = j - 1 - end if - end do - if (begin < i-1) call quicksort(name, begin, i-1) - if (j+1 < end) call quicksort(name, j+1, end) - - end subroutine quicksort2d - -! ------------------------------------------------------------------------- - function binary_search (name, list, n) result (loc) - - character (*), intent(in) :: name, list(:) - integer, intent(in) :: n - integer :: loc - - logical :: found - integer :: mid_loc, start_loc, end_loc - - start_loc = 1 - end_loc = n - found = .false. - do while ((start_loc .le. end_loc) .and. (.not. found)) - mid_loc = start_loc + (end_loc - start_loc) / 2 - if (name .lt. list(mid_loc)) then - end_loc = mid_loc - 1 - else if (name .gt. list(mid_loc)) then - start_loc = mid_loc + 1 - else - found = .true. - end if - end do - - if (found) then - loc = mid_loc - else - loc = -1 - end if - - end function binary_search - -! ------------------------------------------------------------------------- - function search (name, list, n) result (loc) - - character (*), intent(in) :: name, list(:) - integer, intent(in) :: n - integer :: loc - - logical :: found - integer :: lloc - - lloc = 0 - found = .false. - do while ((lloc .le. n) .and. (.not. found)) - lloc = lloc + 1 - if (name .eq. list(lloc)) then - found = .true. - end if - end do - - if (found) then - loc = lloc - else - loc = -1 - end if - - end function search - -! ------------------------------------------------------------------------- - integer function time_to_sec (time) - - integer, intent(in) :: time - integer :: neg_time - integer :: time_in_sec, hr, min, sec - - if (time .gt. 0) then - hr = time / 10000 - min = mod(time/100, 100) - sec = mod(time, 100) - time_to_sec = hr * 3600 + min * 60 + sec - else - neg_time = abs(time) - hr = neg_time / 10000 - min = mod(neg_time/100, 100) - sec = mod(neg_time, 100) - time_to_sec = -1*(hr * 3600 + min * 60 + sec) - end if - - end function time_to_sec - -! ------------------------------------------------------------------------- - integer function time_diff (time1, time2) - - integer, intent(in) :: time1, time2 - - time_diff = time_to_sec(time1) - time_to_sec(time2) - - end function time_diff - -!-------------------------------------------------------------------------- - integer function next_day (jday) - -! This function determermins the next day for time interpolation - implicit none - - integer, intent(in) :: jday - integer year, day - - day = MOD(jday,1000) - year = INT(jday/1000) - - If( day .LT. 365 ) Then - next_day = jday+1 - Else - If( MOD(year,4) .Eq. 0 .And. MOD(year,100) .Ne. 0 ) Then -! Leap Year - If( day .Eq. 365 ) Then - next_day = jday + 1 - Else - next_day = (INT(jday/1000)+1)*1000+1 - End If - Else If(MOD(year,400) .Eq. 0 ) Then -! also a leap year, e.g. 2000 but not 2100 - If( day .Eq. 365 ) Then - next_day = jday + 1 - Else - next_day = (INT(jday/1000)+1)*1000+1 - End If - Else -! not a leap year - next_day = (INT(jday/1000)+1)*1000+1 - End If - End If - - end function next_day - -!-------------------------------------------------------------------------- - - function IntegrateTrapezoid(x, y) - !! Calculates the integral of an array y with respect to x using the trapezoid - !! approximation. Note that the mesh spacing of x does not have to be uniform. - real, intent(in) :: x(:) !! Variable x - real, intent(in) :: y(size(x)) !! Function y(x) - real :: IntegrateTrapezoid !! Integral ∫y(x)·dx - ! Integrate using the trapezoidal rule - associate(n => size(x)) - IntegrateTrapezoid = sum((y(1+1:n-0) + y(1+0:n-1))*(x(1+1:n-0) - x(1+0:n-1)))/2 - end associate - end function - -! --------------------------------------------------------------------------- - - function interp_linear1_internal(x,y,xout) result(yout) - !! Interpolates for the y value at the desired x value, - !! given x and y values around the desired point. - - implicit none - - real, intent(IN) :: x(2), y(2), xout - real :: yout - real :: alph - - if ( xout .lt. x(1) .or. xout .gt. x(2) ) then - write(*,*) "interp1: xout < x0 or xout > x1 !" - write(*,*) "xout = ",xout - write(*,*) "x0 = ",x(1) - write(*,*) "x1 = ",x(2) - stop - end if - - alph = (xout - x(1)) / (x(2) - x(1)) - yout = y(1) + alph*(y(2) - y(1)) - - return - - end function interp_linear1_internal - - end module centralized_io_util_module From 36d4c0a272c04f91cfbbb034bab18cfca4984b75 Mon Sep 17 00:00:00 2001 From: bbakernoaa Date: Wed, 3 Aug 2022 19:09:57 +0000 Subject: [PATCH 5/8] initial commit adding the fengsha dust emission model --- 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 | 1462 ++++++++++++++++++++++++++++++++ src/model/src/DUST_EMIS.F | 1527 ++++++++++++++++++++++++++++++++++ src/shr/aqm_config_mod.F90 | 16 + src/shr/aqm_emis_mod.F90 | 7 + src/shr/aqm_methods.F90 | 62 +- 9 files changed, 3168 insertions(+), 85 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..64c368f1 --- /dev/null +++ b/src/model/src/ASX_DATA_MOD.F @@ -0,0 +1,1462 @@ +!------------------------------------------------------------------------! +! 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 ) + IF ( FENGSHA ) THEN + XMSG = 'Using in-line canopy shading option' + CALL M3MSG2( XMSG ) + END IF + FENGSHA=.true. + 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..49b6068a 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 @@ -175,6 +176,14 @@ subroutine aqm_config_read(model, config, rc) rcToReturn=rc)) & return ! bail out + 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 +512,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 From bbafa3472d5756c16b379d82cba2266fc33b1836 Mon Sep 17 00:00:00 2001 From: bbakernoaa Date: Mon, 15 Aug 2022 17:36:39 +0000 Subject: [PATCH 6/8] updates Please enter the commit message for your changes. Lines starting --- src/shr/aqm_config_mod.F90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/shr/aqm_config_mod.F90 b/src/shr/aqm_config_mod.F90 index 49b6068a..971f8b20 100644 --- a/src/shr/aqm_config_mod.F90 +++ b/src/shr/aqm_config_mod.F90 @@ -175,7 +175,8 @@ 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, & @@ -183,7 +184,7 @@ subroutine aqm_config_read(model, config, rc) file=__FILE__, & rcToReturn=rc)) & return ! bail out - + ! -- microphysics tracer map call ESMF_ConfigGetAttribute(cf, config % mp_map, & label="mp_tracer_map:", rc=localrc) From 5bc3a5bd22bb7bcea2ffd1525d651788c7080d82 Mon Sep 17 00:00:00 2001 From: bbakernoaa Date: Mon, 15 Aug 2022 17:37:16 +0000 Subject: [PATCH 7/8] adding ASX data module --- src/model/src/ASX_DATA_MOD.F | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/model/src/ASX_DATA_MOD.F b/src/model/src/ASX_DATA_MOD.F index 64c368f1..44b2c717 100755 --- a/src/model/src/ASX_DATA_MOD.F +++ b/src/model/src/ASX_DATA_MOD.F @@ -629,10 +629,10 @@ Subroutine INIT_MET ( JDATE, JTIME, MOSAIC, ABFLUX, HGBIDI ) & 'Flag for in-line fengsha ', & .FALSE., IOSX ) IF ( FENGSHA ) THEN - XMSG = 'Using in-line canopy shading option' + XMSG = 'Using the Fengsha Wind-Blown dust emission model...' CALL M3MSG2( XMSG ) END IF - FENGSHA=.true. + If ( FENGSHA ) Then ALLOCATE( Met_Data%CLAYF ( NCOLS,NROWS ), & Met_Data%SANDF ( NCOLS,NROWS ), From 058973cd327e680c2333e4acae7e30dd85a21de0 Mon Sep 17 00:00:00 2001 From: bbakernoaa Date: Tue, 16 Aug 2022 13:18:44 +0000 Subject: [PATCH 8/8] remove print statements for diagnostics during development --- src/model/src/ASX_DATA_MOD.F | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/model/src/ASX_DATA_MOD.F b/src/model/src/ASX_DATA_MOD.F index 44b2c717..d616c347 100755 --- a/src/model/src/ASX_DATA_MOD.F +++ b/src/model/src/ASX_DATA_MOD.F @@ -628,6 +628,8 @@ Subroutine INIT_MET ( JDATE, JTIME, MOSAIC, ABFLUX, HGBIDI ) 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 )