Derived type objects used by GEOS-Chem
On this page we shall describe the new derived-type objects that were added to GEOS-Chem as part of our GEOS-Chem HP developement effort.
Contents
Overview
To facilitate connecting GEOS-Chem with the NASA GEOS-5 GCM (as well as creating a standalone HPC-enabled version of GEOS-Chem), we (the GEOS-Chem Support Team) have restructured how data flows between GEOS-Chem's modules and routines.
Previous programming practice in GEOS-Chem
In the past, we relied on USE
statements to import variables declared in other modules into GEOS-Chem subroutines and functions. You will typically see several USE
statements at the top of most GEOS-Chem subroutines and functions, such as:
USE TRACER_MOD, ONLY : STT USE DAO_MOD, ONLY : UWND, VWND USE LOGICAL_MOD, ONLY : LCHEM
Although this is perfectly allowable Fortran-90 syntax, this is not a good example of top-down programming. In top-down programming, all variables and input data are passed in and out of each routine via the argument list. This allows you to see precisely which variables are entering and leaving each routine. In addition, you have the option of protecting each argument by assigning it an INTENT
acoderibute. For example, you will see arguments to many GEOS-Chem subroutines declared like this:
SUBROUTINE MYSUB( X, Y, Z ) INTEGER, INTENT(IN) :: X ! Read-only : X will not be modified within the subroutine INTEGER, INTENT(INOUT) :: Y ! Read-write : Y will enter with a value, and leave w/ a new value INTEGER, INTENT(OUT) :: Z ! Write-only : Z will leave with a new value (overwriting any previous value)
The INTENT
statements will alert the compiler if you are trying to modify an argument that was not meant to be modified. For example, if you try to change the value of X
within the subroutine MYSUB
, then you will compile-time error stating that X
cannot be modified, because it is declared with INTENT(IN)
.
We often need to pass many (i.e. tens or hundreds) of variables and arrays between GEOS-Chem's moduleRs and subroutines. In practice, it is cumbersome to work with subroutines and/or function having more than 20 individual arguments. In order to facilitate passing a large number of variables between subroutines, we have started to implement derived-type objects into GEOS-Chem.
Using derived-type objects to replace USE statements
You already know about Fortran's basic data types:
- CHARACTER
- LOGICAL
- INTEGER
- REAL*4 (aka REAL)
- REAL*8 (aka DOUBLE PRECISION)
- COMPLEX
With these types you can create variables to hold alphabetical data of different lengths and numerical data with different precision. Fortran-90 adds the ability to create your own derived data types. A derived type functions similarly to an IDL structure, in that you can bundle several different fields (arrays or scalars) together into a single package.
Just as you create variables from the basic Fortran types, you can create objects from Fortran derived types. Think of the derived type as being the blueprint that you want the object to follow. Objects based on derived types offer you a convenient method of passing several individual variables between subroutines and functions. You simply create the object at the highest level of your code (i.e. your "main" program) and fill it with data. Then you pass the object as an argument to each lower-level subroutine.
For example, this statement creates the Fortran derived type MyType:
TYPE :: MyType INTEGER :: var_1 ! This is a scalar REAL*8 :: A ! This is another scalar field REAL*8 :: B ! Yet another scalar field REAL*8 :: C ! Yet another scalar field INTEGER, :: array_fixed(3) ! This is a fixed array field REAL*8, POINTER :: array_1d(:) ! This is a dynamic 1-D array field REAL*8, POINTER :: array_2d(:,:) ! This is a dynamic 2-D array field END TYPE My Type
And this statement creates an object based on derived type MyType:
TYPE(MyType) :: MyObject
You can refer to fields of a derived type object with the % operator. For example:
MyObject%array_1d = 0d0 MyObject%A = 25.47d0 MyObject%B = SQRT( MyObject%A ) print*, MyObject%C
Things to note:
- The individual fields of a derived type object may be of any basic data type (i.e. CHARACTER, INTEGER, REAL*4, REAL*8, COMPLEX, etc.) or may be of another derived type.
- Individual fields in a derived-type object may be either scalars or arrays.
- The dimensions of array fields in derived type objects may be:
- Fixed (i.e. set with a constant value), such as: MyObject%array_fixed, or
- Dynamic (i.e. assigned at run time), such as: MyObject%array_1d, My_Object%array_2d
- The Fortran-90 standard states dynamically-allocated array fields of a derived-type object have to be declared with the POINTER attribute instead of the ALLOCATABLE attribute.
- You can allocate memory to dynamic array fields of a derived-type object in the same manner as you would for an ALLOCATABLE module array:
IF ( .not. ASSOCIATED( MyObject%array_2d ) ) THEN ALLOCATE( MyObject%array_2d( 100, 500 ), STAT=AS ) ENDIF
- You can deallocate a dynamic array field of a derived-type object like this:
IF ( ASSOCIATED( MyObject%array_2d ) ) DEALLOCATE( MyObject%array_2d )
- Note that when inquiring about whether any memory has been given to an array with the POINTER attribute, you must use the ASSOCIATED() function instead of the ALLOCATED() function, as you would for allocatable arrays.
For better compatibility with the Earth System Model Framework (ESMF) interface used by the GEOS-5 GCM, we have started to replace many of the USE statements—our time-honored method of referring to global variables contained within GEOS-Chem's modules—with objects created from derived types. As you peruse the GEOS-Chem source code, you will see the derived types and objects listed below. In GEOS-Chem v9-02, we now pass these derived type objects to many GEOS-Chem subroutines. As testing continues, you may see some of these derived type objects segregated from the existing code with #if defined( DEVEL ) blocks. These objects will be added to the standard code once we have validated these source code modifications. We will eventually remove all USE statements referring to variables.
IMPORTANT NOTE: It is still permissible to utilize USE statements in order to reference the following program elements:
- Subroutines or functions belonging to other modules, e.g.:
- USE CHEMISTRY_MOD, ONLY : DO_CHEMISTRY
- Derived type declarations belonnging to other modules, e.g.:
- USE Input_Opt_Mod, ONLY : OptInput
- Defined PARAMETER constants belonging to other modules, e.g.:
- USE PhysConstants, ONLY : PI
But we are seeking to replace importing variables (arrays & scalars) from other GEOS-Chem modules via USE statements with derived types.
New derived types used by GEOS-Chem
We are introducing three new derived type objects into GEOS-Chem v9-02 and higher versions. These are:
- The Input Options object (aka (Input_Opt)
- The Chemistry State object (aka State_Chm)
- The Meteorology State object (aka State_Met)
These are passed via the argument list to the various GEOS-Chem subroutines and functions. A typical GEOS-Chem subroutine header that has been modified for grid-independent functionality will now look like this:
! ! !INTERFACE: ! SUBROUTINE MY_GEOS_CHEM_SUB( am_I_Root, Input_Opt, State_Met, State_Chm, RC ) ! ! !USES: ! USE ErrCode_Mod USE Input_Opt_Mod, ONLY : OptInput USE State_Chm_Mod, ONLY : ChmState USE State_Met_Mod, ONLY : MetState ! ! !INPUT PARAMETERS: ! LOGICAL, INTENT(IN) :: am_I_Root ! Are we on the root CPU? TYPE(OptInput), INTENT(IN) :: Input_Opt ! Input Options object TYPE(MetState), INTENT(IN) :: State_Met ! Meteorology State object ! ! !INPUT/OUTPUT PARAMETERS: ! TYPE(ChmState), INTENT(INOUT) :: State_Chm ! Chemistry State object ! ! !OUTPUT PARAMETERS: ! INTEGER, INTENT(OUT) :: RC ! Success or failure?
In addition to the Input Options, Meteorology State, and Chemistry State objects, we also pass two additional arguments:
Variable | Description |
---|---|
am_I_Root | Logical flag to denote if we are on the root CPU. In the ESMF environment, we need to restrict file I/O and screen output to the root CPU, so that we do not swamp the system. This flag does not apply when using the traditional GEOS-Chem without ESMF. |
RC | Error return code: This variable will return a value denoting success or failure (values for success or failure are contained in module Headers/errcode_mod.F90). A successful return will have a zero value; a non-successful return will have a non-zero value (like -1). When we connect GEOS-Chem to the ESMF environment, if the code dies with an error, we will need to return the error code all the way up to the top level of the code (the driver routine) and then handle the error there. We are working on implementing this feature in the code, but it will be some time before it is completely ready. |
More information on the derived-type objects may be found in the following sections.
--Bob Yantosca (talk) 19:33, 17 March 2017 (UTC)
The Input Options object
The Input Options object (Input_Opt) holds settings such as logical flags, directory paths, and other input options that are read in from ASCII input files such as input.geos. This derived-type object has now made several previous GEOS-Chem modules obsolete:
- GeosCore/logical_mod.F
- GeosCore/diag_mod.F
- GeosCore/tracer_mod.F
- GeosUtil/directory_mod.F
- GeosUtil/unix_cmds_mod.F
Declaration
The Input Options object is passed as a read-only argument to GEOS-Chem subroutines and functions. It is declared as follows:
! ! !USES: ! USE Input_Opt_Mod, ONLY : OptInput ! Derived type declaration ! ! !INPUT PARAMETERS: ! TYPE(OptInput), INTENT(IN) :: Input_Opt ! Input Options object (read-only)
NOTE: The module containing the OptInput derived type was renamed from gigc_input_opt_mod.F90 to input_opt_mod.F90 in GEOS-Chem v11-01.
Values read in from the master input file input.geos are copied to the Input Options object in module GeosCore/input_mod.F.
At present, the Input Options object only holds information from the input.geos file. We plan on extending it to hold information from other ASCII input files in the near future.
--Bob Yantosca (talk) 21:12, 17 March 2017 (UTC)
Derived type OptInput
The derived type OptInput
is defined in Headers/input_opt_mod.F90. Right now, this derived type contains all of the fields that are read in from the input.geos file. We may add other fields to this derived type in the near future.
- Fields in RED were removed from v11-02a and higher versions.
- Fields in GREEN were added to v11-02a and higher versions.
TYPE, PUBLIC :: OptInput !---------------------------------------- ! General Runtime & Distributed Comp Info !---------------------------------------- INTEGER :: NPES ! Number of MPI procs INTEGER :: myCpu ! Local MPI process handle INTEGER :: MPICOMM ! MPI Communicator Handle LOGICAL :: HPC ! Is this an HPC (ESMF or otherwise) sim? LOGICAL :: RootCPU ! Is this the root cpu? !---------------------------------------- ! SIZE PARAMETER fields !---------------------------------------- INTEGER :: MAX_DIAG INTEGER :: MAX_TRCS INTEGER :: MAX_MEMB INTEGER :: MAX_FAMS INTEGER :: MAX_DEP INTEGER :: MAX_FAM INTEGER :: MAX_SPC !---------------------------------------- ! SIMULATION MENU fields !---------------------------------------- INTEGER :: NYMDb INTEGER :: NHMSb INTEGER :: NYMDe INTEGER :: NHMSe CHARACTER(LEN=255) :: RUN_DIR CHARACTER(LEN=255) :: IN_RST_FILE CHARACTER(LEN=255) :: DATA_DIR CHARACTER(LEN=255) :: CHEM_INPUTS_DIR CHARACTER(LEN=255) :: RES_DIR CHARACTER(LEN=255) :: GCAP_DIR CHARACTER(LEN=255) :: GEOS_4_DIR CHARACTER(LEN=255) :: GEOS_5_DIR CHARACTER(LEN=255) :: GEOS_FP_DIR CHARACTER(LEN=255) :: MERRA_DIR CHARACTER(LEN=255) :: MERRA2_DIR CHARACTER(LEN=255) :: DATA_DIR_1x1 CHARACTER(LEN=255) :: TEMP_DIR LOGICAL :: LUNZIP LOGICAL :: LWAIT LOGICAL :: LVARTROP LOGICAL :: LCAPTROP REAL(fp) :: OZONOPAUSE INTEGER :: NESTED_I0 INTEGER :: NESTED_J0 CHARACTER(LEN=255) :: HcoConfigFile !---------------------------------------- ! ADVECTED SPECIES MENU fields !---------------------------------------- INTEGER :: N_ADVECT CHARACTER(LEN=255), POINTER :: AdvectSpc_Name(:) INTEGER :: SIM_TYPE CHARACTER(LEN=255) :: SIM_NAME LOGICAL :: LSPLIT LOGICAL :: ITS_A_RnPbBe_SIM LOGICAL :: ITS_A_CH3I_SIM LOGICAL :: ITS_A_FULLCHEM_SIM LOGICAL :: ITS_A_HCN_SIM LOGICAL :: ITS_A_TAGO3_SIM LOGICAL :: ITS_A_TAGCO_SIM LOGICAL :: ITS_A_C2H6_SIM LOGICAL :: ITS_A_CH4_SIM LOGICAL :: ITS_AN_AEROSOL_SIM LOGICAL :: ITS_A_MERCURY_SIM LOGICAL :: ITS_A_CO2_SIM LOGICAL :: ITS_A_H2HD_SIM LOGICAL :: ITS_A_POPS_SIM LOGICAL :: ITS_A_SPECIALTY_SIM LOGICAL :: ITS_NOT_COPARAM_OR_CH4 !---------------------------------------- ! AEROSOL MENU fields !---------------------------------------- LOGICAL :: LSULF LOGICAL :: LCRYST LOGICAL :: LCARB LOGICAL :: LBRC LOGICAL :: LSOA LOGICAL :: LMPOA LOGICAL :: LSVPOA LOGICAL :: LDUST LOGICAL :: LDEAD LOGICAL :: LSSALT LOGICAL :: LDSTUP LOGICAL :: LDICARB REAL(fp), POINTER :: SALA_REDGE_um(:) REAL(fp), POINTER :: SALC_REDGE_um(:) LOGICAL :: LGRAVSTRAT LOGICAL :: LSOLIDPSC LOGICAL :: LHOMNUCNAT REAL(fp) :: T_NAT_SUPERCOOL REAL(fp) :: P_ICE_SUPERSAT LOGICAL :: LPSCCHEM LOGICAL :: LSTRATOD !---------------------------------------- ! EMISSIONS MENU fields !---------------------------------------- LOGICAL :: LEMIS INTEGER :: TS_EMIS INTEGER :: LBIOFUEL LOGICAL :: LOTDLOC LOGICAL :: LSOILNOX LOGICAL :: LWARWICK_VSLS LOGICAL :: LSSABr2 LOGICAL :: LFIX_PBL_BRO LOGICAL :: LCH4EMIS LOGICAL :: LCH4SBC LOGICAL :: LOCSEMIS LOGICAL :: LCFCEMIS LOGICAL :: LCLEMIS LOGICAL :: LBREMIS LOGICAL :: LN2OEMIS LOGICAL :: LBASICEMIS LOGICAL :: LSETH2O LOGICAL :: LSETCH4 LOGICAL :: LSETOCS LOGICAL :: LSETCFC LOGICAL :: LSETCL LOGICAL :: LBRGCCM LOGICAL :: LSETBR LOGICAL :: LSETBRSTRAT LOGICAL :: LSETNOYSTRAT LOGICAL :: LSETN2O LOGICAL :: LSETH2SO4 INTEGER :: CFCYEAR LOGICAL :: LFUTURECFC !---------------------------------------- ! CO2 MENU fields !---------------------------------------- LOGICAL :: LFOSSIL LOGICAL :: LCHEMCO2 LOGICAL :: LBIODIURNAL LOGICAL :: LBIONETCLIM LOGICAL :: LOCEAN LOGICAL :: LSHIP LOGICAL :: LPLANE LOGICAL :: LFFBKGRD LOGICAL :: LBIOSPHTAG LOGICAL :: LFOSSILTAG LOGICAL :: LSHIPTAG LOGICAL :: LPLANETAG !---------------------------------------- ! FUTURE MENU fields !---------------------------------------- LOGICAL :: LFUTURE INTEGER :: FUTURE_YEAR CHARACTER(LEN=255) :: FUTURE_SCEN !---------------------------------------- ! CHEMISTRY MENU fields !---------------------------------------- LOGICAL :: LCHEM LOGICAL :: LSCHEM LOGICAL :: LLINOZ LOGICAL :: LSYNOZ INTEGER :: TS_CHEM REAL(fp) :: GAMMA_HO2 LOGICAL :: LUCX LOGICAL :: LCH4CHEM LOGICAL :: LACTIVEH2O LOGICAL :: LO3FJX LOGICAL :: LINITSPEC INTEGER, POINTER :: NTLOOPNCS(:) !---------------------------------------- ! RADIATION MENU fields !---------------------------------------- LOGICAL :: LRAD LOGICAL :: LLWRAD LOGICAL :: LSWRAD LOGICAL, POINTER :: LSKYRAD(:) INTEGER :: TS_RAD !---------------------------------------- ! TRANSPORT MENU fields !---------------------------------------- LOGICAL :: LTRAN LOGICAL :: LFILL LOGICAL :: TPCORE_IORD LOGICAL :: TPCORE_JORD LOGICAL :: TPCORE_KORD INTEGER :: TS_DYN !---------------------------------------- ! CONVECTION MENU fields !---------------------------------------- LOGICAL :: LCONV LOGICAL :: LTURB LOGICAL :: LNLPBL INTEGER :: TS_CONV !---------------------------------------- ! DEPOSITION MENU fields !---------------------------------------- LOGICAL :: LDRYD LOGICAL :: LWETD REAL(fp) :: WETD_CONV_SCAL LOGICAL :: USE_OLSON_2001 LOGICAL :: PBL_DRYDEP !---------------------------------------- ! GAMAP MENU fields !---------------------------------------- CHARACTER(LEN=255) :: GAMAP_DIAGINFO CHARACTER(LEN=255) :: GAMAP_TRACERINFO !---------------------------------------- ! OUTPUT MENU fields !---------------------------------------- INTEGER, POINTER :: NJDAY(:) !---------------------------------------- ! DIAGNOSTIC MENU fields !---------------------------------------- INTEGER :: ND01, LD01 INTEGER :: ND02, LD02 INTEGER :: ND03, LD03 INTEGER :: ND04, LD04 INTEGER :: ND05, LD05 INTEGER :: ND06, LD06 INTEGER :: ND07, LD07 INTEGER :: ND08, LD08 INTEGER :: ND09, LD09 INTEGER :: ND10, LD10 INTEGER :: ND11, LD11 INTEGER :: ND12, LD12 INTEGER :: ND13, LD13 INTEGER :: ND14, LD14 INTEGER :: ND15, LD15 INTEGER :: ND16, LD16 INTEGER :: ND17, LD17 INTEGER :: ND18, LD18 INTEGER :: ND19, LD19 INTEGER :: ND20, LD20 INTEGER :: ND21, LD21 INTEGER :: ND22, LD22 INTEGER :: ND23, LD23 INTEGER :: ND24, LD24 INTEGER :: ND25, LD25 INTEGER :: ND26, LD26 INTEGER :: ND27, LD27 INTEGER :: ND28, LD28 INTEGER :: ND29, LD29 INTEGER :: ND30, LD30 INTEGER :: ND31, LD31 INTEGER :: ND32, LD32 INTEGER :: ND33, LD33 INTEGER :: ND34, LD34 INTEGER :: ND35, LD35 INTEGER :: ND36, LD36 INTEGER :: ND37, LD37 INTEGER :: ND38, LD38 INTEGER :: ND39, LD39 INTEGER :: ND40, LD40 INTEGER :: ND41, LD41 INTEGER :: ND42, LD42 INTEGER :: ND43, LD43 INTEGER :: ND44, LD44 INTEGER :: ND45, LD45 INTEGER :: ND46, LD46 INTEGER :: ND47, LD47 INTEGER :: ND48, LD48 INTEGER :: ND49, LD49 INTEGER :: ND50, LD50 INTEGER :: ND51, LD51 INTEGER :: ND52, LD52 INTEGER :: ND53, LD53 INTEGER :: ND54, LD54 INTEGER :: ND55, LD55 INTEGER :: ND56, LD56 INTEGER :: ND57, LD57 INTEGER :: ND58, LD58 INTEGER :: ND59, LD59 INTEGER :: ND60, LD60 INTEGER :: ND61, LD61 INTEGER :: ND62, LD62 INTEGER :: ND63, LD63 INTEGER :: ND64, LD64 INTEGER :: ND66, LD66 INTEGER :: ND67, LD67 INTEGER :: ND68, LD68 INTEGER :: ND69, LD69 INTEGER :: ND70, LD70 INTEGER :: ND71, LD71 INTEGER :: ND72, LD72 INTEGER :: TS_DIAG LOGICAL :: LPRT INTEGER, POINTER :: TINDEX(:,:) INTEGER, POINTER :: TCOUNT(:) INTEGER, POINTER :: TMAX(:) LOGICAL :: DO_DIAG_WRITE ! Collection ids INTEGER :: DIAG_COLLECTION INTEGER :: GC_RST_COLLECTION ! Used only for NetCDF #if defined( NC_DIAG ) ! New diagnostic group output types (e.g. 'mean') CHARACTER(LEN=15) :: TRANSPORT_OUTPUT_TYPE CHARACTER(LEN=15) :: WETSCAV_OUTPUT_TYPE CHARACTER(LEN=15) :: DRYDEP_OUTPUT_TYPE CHARACTER(LEN=15) :: SPECIES_CONC_OUTPUT_TYPE CHARACTER(LEN=15) :: SPECIES_EMIS_OUTPUT_TYPE CHARACTER(LEN=15) :: MET_OUTPUT_TYPE ! Placeholders pending grouping of diagnostics CHARACTER(LEN=15) :: ND01_OUTPUT_TYPE CHARACTER(LEN=15) :: ND02_OUTPUT_TYPE CHARACTER(LEN=15) :: ND12_OUTPUT_TYPE CHARACTER(LEN=15) :: ND14_OUTPUT_TYPE CHARACTER(LEN=15) :: ND15_OUTPUT_TYPE CHARACTER(LEN=15) :: ND16_OUTPUT_TYPE CHARACTER(LEN=15) :: ND17_OUTPUT_TYPE CHARACTER(LEN=15) :: ND18_OUTPUT_TYPE CHARACTER(LEN=15) :: ND19_OUTPUT_TYPE CHARACTER(LEN=15) :: ND30_OUTPUT_TYPE #endif !---------------------------------------- ! PLANEFLIGHT MENU fields !---------------------------------------- LOGICAL :: DO_PF CHARACTER(LEN=255) :: PF_IFILE CHARACTER(LEN=255) :: PF_OFILE !---------------------------------------- ! ND48 MENU fields !---------------------------------------- LOGICAL :: DO_ND48 CHARACTER(LEN=255) :: ND48_FILE INTEGER :: ND48_FREQ INTEGER :: ND48_N_STA INTEGER, POINTER :: ND48_IARR(:) INTEGER, POINTER :: ND48_JARR(:) INTEGER, POINTER :: ND48_LARR(:) INTEGER, POINTER :: ND48_NARR(:) !---------------------------------------- ! ND49 MENU fields !---------------------------------------- LOGICAL :: DO_ND49 CHARACTER(LEN=255) :: ND49_FILE INTEGER, POINTER :: ND49_TRACERS(:) INTEGER :: ND49_FREQ INTEGER :: ND49_IMIN INTEGER :: ND49_IMAX INTEGER :: ND49_JMIN INTEGER :: ND49_JMAX INTEGER :: ND49_LMIN INTEGER :: ND49_LMAX !---------------------------------------- ! ND50 MENU fields !---------------------------------------- LOGICAL :: DO_ND50 CHARACTER(LEN=255) :: ND50_FILE LOGICAL :: LND50_HDF INTEGER, POINTER :: ND50_TRACERS(:) INTEGER :: ND50_IMIN INTEGER :: ND50_IMAX INTEGER :: ND50_JMIN INTEGER :: ND50_JMAX INTEGER :: ND50_LMIN INTEGER :: ND50_LMAX !---------------------------------------- ! ND51 MENU fields !---------------------------------------- LOGICAL :: DO_ND51 CHARACTER(LEN=255) :: ND51_FILE LOGICAL :: LND51_HDF INTEGER, POINTER :: ND51_TRACERS(:) REAL(fp) :: ND51_HR_WRITE REAL(fp) :: ND51_HR1 REAL(fp) :: ND51_HR2 INTEGER :: ND51_IMIN INTEGER :: ND51_IMAX INTEGER :: ND51_JMIN INTEGER :: ND51_JMAX INTEGER :: ND51_LMIN INTEGER :: ND51_LMAX !---------------------------------------- ! ND51b MENU fields !---------------------------------------- LOGICAL :: DO_ND51b CHARACTER(LEN=255) :: ND51b_FILE LOGICAL :: LND51b_HDF INTEGER, POINTER :: ND51b_TRACERS(:) REAL(fp) :: ND51b_HR_WRITE REAL(fp) :: ND51b_HR1 REAL(fp) :: ND51b_HR2 INTEGER :: ND51b_IMIN INTEGER :: ND51b_IMAX INTEGER :: ND51b_JMIN INTEGER :: ND51b_JMAX INTEGER :: ND51b_LMIN INTEGER :: ND51b_LMAX !---------------------------------------- ! ND63 MENU fields !---------------------------------------- LOGICAL :: DO_ND63 CHARACTER(LEN=255) :: ND63_FILE INTEGER, POINTER :: ND63_TRACERS(:) INTEGER :: ND63_FREQ INTEGER :: ND63_IMIN INTEGER :: ND63_IMAX INTEGER :: ND63_JMIN INTEGER :: ND63_JMAX !---------------------------------------- ! PROD LOSS MENU fields !---------------------------------------- LOGICAL :: DO_SAVE_PL LOGICAL :: LFAMILY INTEGER :: ND65, LD65 LOGICAL :: DO_SAVE_O3 INTEGER :: NFAM REAL(fp), POINTER :: FAM_COEF(:,:) CHARACTER(LEN=255), POINTER :: FAM_MEMB(:,:) CHARACTER(LEN=255), POINTER :: FAM_NAME(: ) INTEGER, POINTER :: FAM_NMEM(: ) CHARACTER(LEN=255), POINTER :: FAM_TYPE(: ) !---------------------------------------- ! UNIX CMDS fields !---------------------------------------- CHARACTER(LEN=255) :: BACKGROUND CHARACTER(LEN=255) :: REDIRECT CHARACTER(LEN=255) :: REMOVE_CMD CHARACTER(LEN=255) :: SEPARATOR CHARACTER(LEN=255) :: WILD_CARD CHARACTER(LEN=255) :: UNZIP_CMD CHARACTER(LEN=255) :: ZIP_SUFFIX CHARACTER(LEN=1) :: SPACE !---------------------------------------- ! NESTED GRID MENU fields !---------------------------------------- LOGICAL :: ITS_A_NESTED_GRID LOGICAL :: LWINDO LOGICAL :: LWINDO2x25 LOGICAL :: LWINDO_NA CHARACTER(LEN=255) :: TPBC_DIR_NA LOGICAL :: LWINDO_EU CHARACTER(LEN=255) :: TPBC_DIR_EU LOGICAL :: LWINDO_CH CHARACTER(LEN=255) :: TPBC_DIR_CH LOGICAL :: LWINDO_AS CHARACTER(LEN=255) :: TPBC_DIR_AS LOGICAL :: LWINDO_CU CHARACTER(LEN=255) :: TPBC_DIR INTEGER :: NESTED_TS INTEGER :: NESTED_I1 INTEGER :: NESTED_J1 INTEGER :: NESTED_I2 INTEGER :: NESTED_J2 INTEGER :: NESTED_I0W INTEGER :: NESTED_J0W INTEGER :: NESTED_I0E INTEGER :: NESTED_J0E !---------------------------------------- ! BENCHMARK MENU fields !---------------------------------------- LOGICAL :: LSTDRUN CHARACTER(LEN=255) :: STDRUN_INIT_FILE CHARACTER(LEN=255) :: STDRUN_FINAL_FILE !---------------------------------------- ! MERCURY MENU fields !---------------------------------------- INTEGER :: ANTHRO_Hg_YEAR CHARACTER(LEN=255) :: HG_SCENARIO LOGICAL :: USE_CHECKS LOGICAL :: LDYNOCEAN LOGICAL :: LPREINDHG LOGICAL :: LGTMM CHARACTER(LEN=255) :: GTMM_RST_FILE LOGICAL :: LARCTICRIV LOGICAL :: LKRedUV !---------------------------------------- ! CH4 MENU fields !---------------------------------------- LOGICAL :: LCH4BUD LOGICAL :: LGAO LOGICAL :: LCOL LOGICAL :: LLIV LOGICAL :: LWAST LOGICAL :: LBFCH4 LOGICAL :: LRICE LOGICAL :: LOTANT LOGICAL :: LBMCH4 LOGICAL :: LWETL LOGICAL :: LSOABS LOGICAL :: LOTNAT !---------------------------------------- ! POPS MENU fields !---------------------------------------- CHARACTER(LEN=3) :: POP_TYPE LOGICAL :: CHEM_PROCESS REAL(fp) :: POP_XMW REAL(fp) :: POP_KOA REAL(fp) :: POP_KBC REAL(fp) :: POP_K_POPG_OH REAL(fp) :: POP_K_POPP_O3A REAL(fp) :: POP_K_POPP_O3B REAL(fp) :: POP_HSTAR REAL(fp) :: POP_DEL_H REAL(fp) :: POP_DEL_Hw !---------------------------------------- ! Fields for drydep and dust. These get ! set in the init stage based on info ! from file "input.geos". (mlong, 1/5/13) !---------------------------------------- INTEGER :: N_DUST_BINS INTEGER, POINTER :: NTRAIND(:) INTEGER, POINTER :: IDDEP(:) INTEGER, POINTER :: IDEP(:) REAL(fp), POINTER :: DUSTREFF(:) REAL(fp), POINTER :: DUSTDEN(:) CHARACTER(LEN=14), POINTER :: DEPNAME(:) !---------------------------------------- ! Fields for interface to GEOS-5 GCM !---------------------------------------- LOGICAL :: haveImpRst !---------------------------------------- ! Fields for LINOZ strat chem !---------------------------------------- INTEGER :: LINOZ_NLEVELS INTEGER :: LINOZ_NLAT INTEGER :: LINOZ_NMONTHS INTEGER :: LINOZ_NFIELDS REAL(fp), POINTER :: LINOZ_TPARM(:,:,:,:) !---------------------------------------- ! Fields for overhead O3 ! This gets set in main.F based on met ! field and year (mpayer, 12/13/13) !---------------------------------------- LOGICAL :: USE_O3_FROM_MET END TYPE OptInput
--Bob Yantosca (talk) 18:38, 16 March 2017 (UTC)
Summary of fields removed from Input_Opt
The following fields were removed (or renamed) in v11-02a:
Old field | New field | Why changed? |
---|---|---|
MAX_TRCS | MAX_SPC | Since v11-01, everything in GEOS-Chem is now considered a species. We changed the TRCS to SPC to be consistent with that usage. What used to be "tracers" are now referred to as "advected species". |
MAX_FAMS | MAX_FAM | Renamed to use 3 letters (like MAX_SPC). This also denotes that it is not tied to the old SMVGEAR prod/loss arrays, which have since been removed. |
MAX_MEMB | none | This array dimension was used for the old SMVGEAR prod/loss species arrays, which have since been removed. Prod/Loss is now computed via FlexChem. |
MAX_DEP | none | Dry deposition quantities are now provided via the GEOS-Chem species database. We have removed all of the arrays in Input_Opt that were dimensioned with this field, making it redundant. |
LFAMILY | none | This logical field was used in a single IF statement. We rewrote the code with equivalent logic to remove the dependence on this field. |
FAM_COEF | none | This array was used with the SMVGEAR prod/loss code, which has been rendered obsolete by FlexChem. |
FAM_MEMB | none | " " |
FAM_NMEM | none | " " |
NTRAIND | none | This field maps drydep index to species index. It is now replaced by State_Chem%Map_Drydep. |
IDDEP | none | This field held dry deposition indices, which now can be obtained directly from the GEOS-Chem species database. |
IDEP | none | This has now been turned into a local variable in GeosCore/drydep_mod.F. It is initialized from the GEOS-Chem species database. |
DUSTREFF | none | This is now replaced by the Radius field of the GEOS-Chem species database. |
DUSTDEN | none | This is now replaced by the Density field of the GEOS-Chem species database. |
DEPNAME | none | This has now been turned into a local variable in GeosCore/drydep_mod.F. It is initialized from the GEOS-Chem species database. |
This update passed the following difference tests on 16 Mar 2017:
- geosfp_4x5_tropchem
- geosfp_4x5_standard
- geosfp_4x5_aciduptake
--Bob Yantosca (talk) 19:32, 17 March 2017 (UTC)
Using the Input Options object to replace existing variables
This discussion has been moved to our our Removal of obsolete modules from GEOS-Chem wiki page.
--Bob Yantosca (talk) 22:34, 1 December 2016 (UTC)
The Grid State object
The State_Grid object will be introduced in GEOS-Chem 12.
The Grid State object (State_Grid
) holds the GEOS-Chem user-defined grid parameters, plus grid fields computed by GEOS-Chem.
Declaration
We typically declare the Grid State object with statements like this:
! ! !USES: ! USE State_Grid_Mod, ONLY : GrdState ! Derived type declaration ! ! !INPUT/OUTPUT PARAMETERS: ! TYPE(GrdState), INTENT(IN) :: State_Grid ! Grid State objec
In the standard GEOS-Chem, the Grid State object is populated in driver routine main.F, and then passed down to the lower-level routines from there.
When connecting GEOS-Chem to the NASA GEOS-5 GCM via the ESMF environment, the Grid State object is populated in include file Includes_Before_Run.H
, which is part of the Gridded Component module GEOSCHEMchem_GridCompMod.F90.
Derived type GrdState
The Grid State object is defined with the GrdState
derived type, located in module file Headers/state_grid_mod.F90.
TYPE, PUBLIC :: GrdState !---------------------------------------- ! User-defined grid fields !---------------------------------------- CHARACTER(LEN=255) :: GridRes ! Grid resolution REAL(fp) :: DX ! Delta X [degrees longitude] REAL(fp) :: DY ! Delta Y [degrees latitude] REAL(fp) :: XMin ! Minimum X value [degrees longitude] REAL(fp) :: XMax ! Maximum X value [degrees longitude] REAL(fp) :: YMin ! Minimum Y value [degrees latitude] REAL(fp) :: YMax ! Maximum Y value [degrees latitude] INTEGER :: NX ! # of grid boxes in X-direction INTEGER :: NY ! # of grid boxes in Y-direction INTEGER :: NZ ! # of grid boxes in Z-direction LOGICAL :: HalfPolar ! Use half-sized polar boxes? LOGICAL :: NestedGrid ! Is it a nested grid sim? INTEGER :: NorthBuffer ! # buffer grid boxes on North edge INTEGER :: SouthBuffer ! # buffer grid boxes on South edge INTEGER :: EastBuffer ! # buffer grid boxes on East edge INTEGER :: WestBuffer ! # buffer grid boxes on West edge !---------------------------------------- ! Grid fields computed in gc_grid_mod.F90 !---------------------------------------- INTEGER :: GlobalNX ! NX on the global grid INTEGER :: GlobalNY ! NY on the global grid INTEGER :: NativeNZ ! NZ on the native-resolution grid INTEGER :: MaxChemLev ! Max # levels in chemistry grid INTEGER :: MaxStratLev ! Max # levels below strat INTEGER :: MaxTropLev ! Max # levels below trop INTEGER :: XMinOffset ! X offset from global grid INTEGER :: XMaxOffset ! X offset from global grid INTEGER :: YMinOffset ! Y offset from global grid INTEGER :: YMaxOffset ! Y offset from global grid ! Arrays REAL(fp), POINTER :: GlobalXMid(:,:) ! Lon centers on global grid [deg] REAL(fp), POINTER :: GlobalYMid(:,:) ! Lat centers on global grid [deg] REAL(fp), POINTER :: XMid (:,:) ! Lon centers [degrees] REAL(fp), POINTER :: XEdge (:,:) ! Lon edges [degrees] REAL(fp), POINTER :: YMid (:,:) ! Lat centers [degrees] REAL(fp), POINTER :: YEdge (:,:) ! Lat edges [degrees] REAL(fp), POINTER :: YMid_R (:,:) ! Lat centers [radians] REAL(fp), POINTER :: YEdge_R (:,:) ! Lat edges [radians] REAL(fp), POINTER :: YSIN (:,:) ! SIN( lat edges ) REAL(fp), POINTER :: Area_M2 (:,:) ! Grid box area [m2] END TYPE GrdState
--Melissa Sulprizio (talk) 21:56, 27 April 2019 (UTC)
The Chemistry State object
The Chemistry State object (State_Chm
) holds the GEOS-Chem species concentrations, plus related quantities (i.e. a list of tracer and species names, etc.). The GEOS-Chem species database is contained as a sub-object of State_Chm
.
Declaration
The Chemistry State object is meant to be passed to the various GEOS-Chem subrotuines as a a read-write argument. We typically declare the Chemistry State object with statements like this:
! ! !USES: ! USE State_Chm_Mod, ONLY : ChmState ! Derived type declaration ! ! !INPUT/OUTPUT PARAMETERS: ! TYPE(ChmState), INTENT(INOUT) :: State_Chm ! Chemistry State object (read-write)
NOTE: The module containing the ChmState derived type was renamed from gigc_state_chm_mod.F90 to state_chm_mod.F90 in GEOS-Chem v11-01.
In the standard GEOS-Chem, the Chemistry State object is populated in driver routine main.F, and then passed down to the lower-level routines from there.
When connecting GEOS-Chem to the NASA GEOS-5 GCM via the ESMF environment, the Chemistry State object is populated in include file Includes_Before_Run.H
, which is part of the Gridded Component module GEOSCHEMchem_GridCompMod.F90.
--Bob Yantosca (talk) 21:13, 17 March 2017 (UTC)
Derived type ChmState
The Chemistry State object is defined with the ChmState
derived type, located in module file Headers/state_chm_mod.F90.
TYPE, PUBLIC :: ChmState ! Count of each type of species INTEGER :: nSpecies ! # of species INTEGER :: nAdvect ! # of advected species INTEGER :: nDryDep ! # of drydep species INTEGER :: nKppSpc ! # of KPP chem species INTEGER :: nWetDep ! # of wetdep species ! Mapping vectors to subset types of species INTEGER, POINTER :: Map_Advect (: ) ! Advected species ID's INTEGER, POINTER :: Map_DryDep (: ) ! Drydep species ID's INTEGER, POINTER :: Map_KppSpc (: ) ! KPP chem species ID's INTEGER, POINTER :: Map_WetDep (: ) ! Wetdep species IDs' ! Physical properties & indices for each species TYPE(SpcPtr), POINTER :: SpcData (: ) ! GC Species database ! Chemical species INTEGER, POINTER :: Spec_Id (: ) ! Species ID # CHARACTER(LEN=14), POINTER :: Spec_Name (: ) ! Species names REAL(fp), POINTER :: Species (:,:,:,:) ! Species [molec/cm3] CHARACTER(LEN=20) :: Spc_Units ! Species units ! Aerosol quantities INTEGER :: nAero ! # of Aerosol Types REAL(fp), POINTER :: AeroArea (:,:,:,:) ! Aerosol Area [cm2/cm3] REAL(fp), POINTER :: AeroRadi (:,:,:,:) ! Aerosol Radius [cm] REAL(fp), POINTER :: WetAeroArea(:,:,:,:) ! Aerosol Area [cm2/cm3] REAL(fp), POINTER :: WetAeroRadi(:,:,:,:) ! Aerosol Radius [cm] ! Fields for UCX mechanism REAL(f4), POINTER :: STATE_PSC (:,:,: ) ! PSC type (see Kirner ! et al. 2011, GMD) REAL(fp), POINTER :: KHETI_SLA (:,:,:,:) ! Strat. liquid aerosol ! reaction cofactors ! For the tagged Hg simulation INTEGER :: N_HG_CATS ! # of Hg categories INTEGER, POINTER :: Hg0_Id_List(: ) ! Hg0 cat <-> tracer # INTEGER, POINTER :: Hg2_Id_List(: ) ! Hg2 cat <-> tracer # INTEGER, POINTER :: HgP_Id_List(: ) ! HgP cat <-> tracer # CHARACTER(LEN=4), POINTER :: Hg_Cat_Name(: ) ! Category names END TYPE ChmState
--Bob Yantosca (talk) 21:15, 17 March 2017 (UTC)
The Meteorology State object
The Meteorology State object (aka State_Met
) contains the meteorological fields and some other related inputs (i.e. for dry deposition) that need to be passed to lower-level GEOS-Chem subroutines. Most subroutines will accept the Meteorology State object as a read-only argument; however, a few routines will need to accept it as a read-write argument.
Declaration
We typically declare the Meteorology State object with statements like this:
! ! !USES: ! USE State_Met_Mod, ONLY : MetState ! Derived type declaration ! ! !INPUT PARAMETERS: ! TYPE(MetState), INTENT(IN) :: State_Met ! Meteorology State object (read-only)
NOTE: The module containing the MetState derived type was renamed from gigc_state_met_mod.F90 to state_met_mod.F90 in GEOS-Chem v11-01.
In the standard GEOS-Chem, the Meteorology State object is populated by the various modules that read in met field data. These are:
Met field product | Modules |
---|---|
GEOS-FP |
|
MERRA-2 |
|
When connecting GEOS-Chem to the NASA GEOS-5 GCM via the ESMF environment, the Meteorology State object is populated in include file Includes_Before_Run.H, which is part of the Gridded Component module GEOSCHEMchem_GridCompMod.F90.
Derived type MetState
The Meteorology State object is defined with the MetState
derived type, located in module file Headers/state_met_mod.F90.
NOTE: The MetState
derived type contains arrays to hold the complete set of met fields used in GEOS-Chem, including fields for GEOS-FP and MERRA-2 met data products.
TYPE, PUBLIC :: MetState !---------------------------------------------------------------------- ! Surface fields !---------------------------------------------------------------------- REAL(fp), POINTER :: ALBD (:,: ) ! Visible surface albedo [1] INTEGER, POINTER :: ChemGridLev (:,: ) ! Chemistry grid level REAL(fp), POINTER :: CLDFRC (:,: ) ! Column cloud fraction [1] INTEGER, POINTER :: CLDTOPS (:,: ) ! Max cloud top height [levels] REAL(fp), POINTER :: EFLUX (:,: ) ! Latent heat flux [W/m2] REAL(fp), POINTER :: FRCLND (:,: ) ! Olson land fraction [1] REAL(fp), POINTER :: FRLAKE (:,: ) ! Fraction of lake [1] REAL(fp), POINTER :: FRLAND (:,: ) ! Fraction of land [1] REAL(fp), POINTER :: FRLANDIC (:,: ) ! Fraction of land ice [1] REAL(fp), POINTER :: FROCEAN (:,: ) ! Fraction of ocean [1] REAL(fp), POINTER :: FRSEAICE (:,: ) ! Sfc sea ice fraction REAL(fp), POINTER :: FRSNO (:,: ) ! Sfc snow fraction REAL(fp), POINTER :: GWETROOT (:,: ) ! Root soil wetness [1] REAL(fp), POINTER :: GWETTOP (:,: ) ! Top soil moisture [1] REAL(fp), POINTER :: HFLUX (:,: ) ! Sensible heat flux [W/m2] REAL(fp), POINTER :: LAI (:,: ) ! Leaf area index [m2/m2] (online) REAL(fp), POINTER :: LWI (:,: ) ! Land/water indices [1] REAL(fp), POINTER :: PARDR (:,: ) ! Direct photsynthetically active radiation [W/m2] REAL(fp), POINTER :: PARDF (:,: ) ! Diffuse photsynthetically active radiation [W/m2] REAL(fp), POINTER :: PBLH (:,: ) ! PBL height [m] INTEGER, POINTER :: PBL_TOP_L (:,: ) ! PBL top layer [1] REAL(fp), POINTER :: PHIS (:,: ) ! Surface geopotential height [m2/s2] REAL(fp), POINTER :: PRECANV (:,: ) ! Anvil previp @ ground [kg/m2/s] REAL(fp), POINTER :: PRECCON (:,: ) ! Conv precip @ ground [kg/m2/s] REAL(fp), POINTER :: PRECTOT (:,: ) ! Total precip @ ground [kg/m2/s] REAL(fp), POINTER :: PRECLSC (:,: ) ! LS precip @ ground [kg/m2/s] REAL(fp), POINTER :: PS1_WET (:,: ) ! Wet surface pressure at start of timestep [hPa] REAL(fp), POINTER :: PS2_WET (:,: ) ! Wet surface pressure at end of timestep [hPa] REAL(fp), POINTER :: PSC2_WET (:,: ) ! Wet interpolated surface pressure [hPa] REAL(fp), POINTER :: PS1_DRY (:,: ) ! Dry surface pressure at start of timestep [hPa] REAL(fp), POINTER :: PS2_DRY (:,: ) ! Dry surface pressure at end of timestep [hPa] REAL(fp), POINTER :: PSC2_DRY (:,: ) ! Dry interpolated surface pressure [hPa] REAL(fp), POINTER :: SEAICE00 (:,: ) ! Sea ice coverage 00-10% REAL(fp), POINTER :: SEAICE10 (:,: ) ! Sea ice coverage 10-20% REAL(fp), POINTER :: SEAICE20 (:,: ) ! Sea ice coverage 20-30% REAL(fp), POINTER :: SEAICE30 (:,: ) ! Sea ice coverage 30-40% REAL(fp), POINTER :: SEAICE40 (:,: ) ! Sea ice coverage 40-50% REAL(fp), POINTER :: SEAICE50 (:,: ) ! Sea ice coverage 50-60% REAL(fp), POINTER :: SEAICE60 (:,: ) ! Sea ice coverage 60-70% REAL(fp), POINTER :: SEAICE70 (:,: ) ! Sea ice coverage 70-80% REAL(fp), POINTER :: SEAICE80 (:,: ) ! Sea ice coverage 80-90% REAL(fp), POINTER :: SEAICE90 (:,: ) ! Sea ice coverage 90-100% REAL(fp), POINTER :: SLP (:,: ) ! Sea level pressure [hPa] REAL(fp), POINTER :: SNODP (:,: ) ! Snow depth [m] REAL(fp), POINTER :: SNOMAS (:,: ) ! Snow mass [kg/m2] REAL(fp), POINTER :: SUNCOS (:,: ) ! COS(solar zenith angle) at current time REAL(fp), POINTER :: SUNCOSmid (:,: ) ! COS(solar zenith angle) at midpoint of chem timestep REAL(fp), POINTER :: SWGDN (:,: ) ! Incident radiation @ ground [W/m2] REAL(fp), POINTER :: TO3 (:,: ) ! Total overhead O3 column [DU] REAL(fp), POINTER :: TROPP (:,: ) ! Tropopause pressure [hPa] INTEGER, POINTER :: TropLev (:,: ) ! Tropopause level [1] REAL(fp), POINTER :: TropHt (:,: ) ! Tropopause height [km] REAL(fp), POINTER :: TS (:,: ) ! Surface temperature [K] REAL(fp), POINTER :: TSKIN (:,: ) ! Surface skin temperature [K] REAL(fp), POINTER :: U10M (:,: ) ! E/W wind speed @ 10m ht [m/s] REAL(fp), POINTER :: USTAR (:,: ) ! Friction velocity [m/s] REAL(fp), POINTER :: UVALBEDO (:,: ) ! UV surface albedo [1] REAL(fp), POINTER :: V10M (:,: ) ! N/S wind speed @ 10m ht [m/s] REAL(fp), POINTER :: Z0 (:,: ) ! Surface roughness height [m] REAL(fp), POINTER :: CNV_FRC (:,: ) ! Convective fraction [1] !---------------------------------------------------------------------- ! 3-D Fields !---------------------------------------------------------------------- REAL(fp), POINTER :: CLDF (:,:,:) ! 3-D cloud fraction [1] REAL(fp), POINTER :: CMFMC (:,:,:) ! Cloud mass flux [kg/m2/s] REAL(fp), POINTER :: DQRCU (:,:,:) ! Conv precip production rate [kg/kg/s] (assume per dry air) REAL(fp), POINTER :: DQRLSAN (:,:,:) ! LS precip prod rate [kg/kg/s] (assume per dry air) REAL(fp), POINTER :: DTRAIN (:,:,:) ! Detrainment flux [kg/m2/s] REAL(fp), POINTER :: OMEGA (:,:,:) ! Updraft velocity [Pa/s] REAL(fp), POINTER :: OPTD (:,:,:) ! Visible optical depth [1] REAL(fp), POINTER :: PEDGE (:,:,:) ! Wet air press @ level edges [hPa] REAL(fp), POINTER :: PFICU (:,:,:) ! Dwn flux ice prec:conv [kg/m2/s] REAL(fp), POINTER :: PFILSAN (:,:,:) ! Dwn flux ice prec:LS+anv [kg/m2/s] REAL(fp), POINTER :: PFLCU (:,:,:) ! Dwn flux liq prec:conv [kg/m2/s] REAL(fp), POINTER :: PFLLSAN (:,:,:) ! Dwn flux ice prec:LS+anv [kg/m2/s] REAL(fp), POINTER :: QI (:,:,:) ! Ice mixing ratio [kg/kg dry air] REAL(fp), POINTER :: QL (:,:,:) ! Water mixing ratio [kg/kg dry air] REAL(fp), POINTER :: REEVAPCN (:,:,:) ! Evap of precip conv [kg/kg/s] (assume per dry air) REAL(fp), POINTER :: REEVAPLS (:,:,:) ! Evap of precip LS+anvil [kg/kg/s] (assume per dry air) REAL(fp), POINTER :: RH (:,:,:) ! Relative humidity [%] REAL(fp), POINTER :: SPHU (:,:,:) ! Specific humidity [g H2O/kg tot air] REAL(fp), POINTER :: SPHU1 (:,:,:) ! Specific humidity at start of timestep [g/kg] REAL(fp), POINTER :: SPHU2 (:,:,:) ! Specific humidity at end of timestep [g/kg] REAL(fp), POINTER :: T (:,:,:) ! Temperature [K] REAL(fp), POINTER :: TAUCLI (:,:,:) ! Opt depth of ice clouds [1] REAL(fp), POINTER :: TAUCLW (:,:,:) ! Opt depth of H2O clouds [1] REAL(fp), POINTER :: TMPU1 (:,:,:) ! Temperature at start of timestep [K] REAL(fp), POINTER :: TMPU2 (:,:,:) ! Temperature at end of timestep [K] REAL(fp), POINTER :: U (:,:,:) ! E/W component of wind [m s-1] REAL(fp), POINTER :: UPDVVEL (:,:,:) ! Updraft vertical velocity [hPa/s] REAL(fp), POINTER :: V (:,:,:) ! N/S component of wind [m s-1] !---------------------------------------------------------------------- ! Air quantities assigned in AIRQNT !---------------------------------------------------------------------- ! Note on pressures: PMID is calculated from PEDGE, ! and dry air pressures assume constant RH and T across grid box REAL(fp), POINTER :: PEDGE_DRY (:,:,:) ! Dry air partial pressure @ level edges [hPa] REAL(fp), POINTER :: PMID (:,:,:) ! Average wet air pressure [hPa] defined as arithmetic average of edge pressures REAL(fp), POINTER :: PMID_DRY (:,:,:) ! Dry air partial pressure [hPa] defined as arithmetic avg of edge pressures REAL(fp), POINTER :: THETA (:,:,:) ! Potential temperature [K] REAL(fp), POINTER :: TV (:,:,:) ! Virtual temperature [K] REAL(fp), POINTER :: MAIRDEN (:,:,:) ! Moist air density [kg/m3] REAL(fp), POINTER :: AIRDEN (:,:,:) ! Dry air density [kg/m3] REAL(fp), POINTER :: AIRNUMDEN (:,:,:) ! Dry air density [molec/cm3] REAL(fp), POINTER :: AVGW (:,:,:) ! Water vapor volume mixing ratio [vol H2O/vol dry air] REAL(fp), POINTER :: BXHEIGHT (:,:,:) ! Grid box height [m] (dry air) REAL(fp), POINTER :: DELP (:,:,:) ! Delta-P (wet) across box [hPa] REAL(fp), POINTER :: DELP_DRY (:,:,:) ! Delta-P (dry) across box [hPa] REAL(fp), POINTER :: AD (:,:,:) ! Dry air mass [kg] in grid box REAL(fp), POINTER :: AIRVOL (:,:,:) ! Grid box volume [m3] (dry air) REAL(fp), POINTER :: DP_DRY_PREV (:,:,:) ! Previous State_Met%DELP_DRY REAL(fp), POINTER :: SPHU_PREV (:,:,:) ! Previous State_Met%SPHU !---------------------------------------------------------------------- ! Age of air for diagnosing transport !---------------------------------------------------------------------- INTEGER, POINTER :: AgeOfAir (:,:,:) ! Age of air [s] !---------------------------------------------------------------------- ! Offline land type, leaf area index, and chlorophyll fields !---------------------------------------------------------------------- INTEGER, POINTER :: IREG (:,: ) ! # of landtypes in box (I,J) INTEGER, POINTER :: ILAND (:,:,:) ! Land type at (I,J); 1..IREG(I,J) INTEGER, POINTER :: IUSE (:,:,:) ! Fraction (per mil) of box (I,J) occupied by each land type REAL(fp), POINTER :: MODISLAI (:,: ) ! Daily LAI computed from monthly offline MODIS [m2/m2] REAL(fp), POINTER :: MODISCHLR (:,: ) ! Daily chlorophyll-a computed from offline monthly MODIS REAL(fp), POINTER :: XLAI (:,:,:) ! MODIS LAI per land type, for this month REAL(fp), POINTER :: XCHLR (:,:,:) ! MODIS CHLR per land type for this month REAL(fp), POINTER :: LandTypeFrac (:,:,:) ! Olson frac per type (I,J,type) REAL(fp), POINTER :: XLAI_NATIVE (:,:,:) ! avg LAI per type (I,J,type) REAL(fp), POINTER :: XCHLR_NATIVE (:,:,:) ! avg CHLR per type (I,J,type) REAL(fp), POINTER :: XLAI2 (:,:,:) ! MODIS LAI per land type, for next month REAL(fp), POINTER :: XCHLR2 (:,:,:) ! MODIS CHLR per land type, for next month !---------------------------------------------------------------------- ! Fields for querying in which vertical regime a grid box is in ! or if a grid box is near local noon solar time !---------------------------------------------------------------------- LOGICAL, POINTER :: InChemGrid (:,:,:) ! Are we in the chemistry grid? LOGICAL, POINTER :: InPbl (:,:,:) ! Are we in the PBL? LOGICAL, POINTER :: InStratMeso (:,:,:) ! Are we in the stratosphere or mesosphere? LOGICAL, POINTER :: InStratosphere(:,:,:) ! Are we in the stratosphere? LOGICAL, POINTER :: InTroposphere (:,:,:) ! Are we in the troposphere? REAL(fp), POINTER :: LocalSolarTime(:,: ) ! Local solar time LOGICAL, POINTER :: IsLocalNoon (:,: ) ! Is it local noon (between 11 and 13 local solar time? !---------------------------------------------------------------------- ! Registry of variables contained within State_Met !---------------------------------------------------------------------- CHARACTER(LEN=3) :: State = 'MET' ! Name of this state TYPE(MetaRegItem), POINTER :: Registry => NULL() ! Registry object END TYPE MetState
--Melissa Sulprizio (talk) 21:49, 27 April 2019 (UTC)
Removal of obsolete modules and files
This discussion has been moved to our Removal of obsolete modules from GEOS-Chem wiki page.
--Bob Yantosca (talk) 22:38, 1 December 2016 (UTC)
Information pertaining to older GEOS-Chem versions
The following information was relevant for GEOS-Chem versions prior to GEOS-Chem v11-01, in which the SMVGEAR solver was removed and the GEOS-Chem species database was introduced.
--Bob Yantosca (talk) 21:23, 17 March 2017 (UTC)
Clean up several modules that use the Meteorology State object
NOTE: The GEOS-Chem species database has rendered the code described below obsolete. We will rewrite this section in the near future.
Prior to the official release of GEOS-Chem v9-02, we cleaned up several modules that use the State_Met
derived type object. For routines that use the same met fields several times, we now use a pointer at the top of the routine to point to the field in State_Met. For example, in COMPUTE_F (in module GeosCore/wetscav_mod.F), we had several blocks of code that resembled the following:
! Compute the rate constant K. The retention factor for ! liquid H2O2 is 0.05 for 248 K < T < 268 K and 1.0 for ! T >= 268 K. (Eq. 1, Jacob et al, 2000) IF ( State_Met%T(I,J,L) >= 268d0 ) THEN K = KC * ( F_L + F_I ) ELSE IF ( State_Met%T(I,J,L) > 248d0 .and. & State_Met%T(I,J,L) < 268d0 ) THEN K = KC * ( ( 5d-2 * F_L ) + F_I ) ELSE K = KC * F_I ENDIF ! Distance between grid box centers [m] TMP = 0.5d0 * ( State_Met%BXHEIGHT(I,J,L-1) + & State_Met%BXHEIGHT(I,J,L) )
In this update, we created pointers at the top of the routine to point to State_Met%T and State_Met%BXHEIGHT
:
! Pointers REAL*8, POINTER :: BXHEIGHT(:,:,:) REAL*8, POINTER :: T(:,:,:) ! Initialize pointers BXHEIGHT => State_Met%BXHEIGHT T => State_Met%T
so that the aforementioned sections of the code could be restored to:
! Compute the rate constant K. The retention factor for ! liquid H2O2 is 0.05 for 248 K < T < 268 K and 1.0 for ! T >= 268 K. (Eq. 1, Jacob et al, 2000) IF ( T(I,J,L) >= 268d0 ) THEN K = KC * ( F_L + F_I ) ELSE IF ( T(I,J,L) > 248d0 .and. T(I,J,L) < 268d0 ) THEN K = KC * ( ( 5d-2 * F_L ) + F_I ) ELSE K = KC * F_I ENDIF ! Distance between grid box centers [m] TMP = 0.5d0 * ( BXHEIGHT(I,J,L-1) + BXHEIGHT(I,J,L) )
This update has made the code more readable and will help to reduce the number of conflicts that arise when bringing in new features that are based on older versions of GEOS-Chem.
--Melissa Sulprizio 17:53, 27 February 2014 (EST)
Removal of STT and CSPEC_FULL arrays
NOTE: In v11-01 and higher versions, the STT, CSPEC_FULL, and TRACER fields were removed from State_Chm. The information below is now obsolete. We shall keep it here for reference.
In GEOS-Chem v9-02, we have removed all references to the following arrays:
STT
: tracer array inGeosCore/tracer_mod.F
CSPEC_FULL
: chemical species array inGeosCore/comode_mod.F
However, to avoid having to rewrite entire sections of legacy code, we have converted the STT
and CSPEC_FULL
arrays to local pointer arrays. Local copies of STT
now point to State_Chm%TRACERS
and local copies of CSPEC_FULL
now point to State_Chm%SPECIES
, as shown in the example below.
! ! !LOCAL VARIABLES: ! ! Pointers ! We need to define local arrays to hold corresponding values ! from the Chemistry State (State_Chm) object. (mpayer, 12/6/12) REAL*8, POINTER :: STT(:,:,:,:) REAL*8, POINTER :: CSPEC_FULL(:,:,:,:) !================== ! TOP OF ROUTINE !================== ! Initialize GEOS-Chem tracer array [kg] from Chemistry State object STT => State_Chm%Tracers ! Initialize GEOS-Chem species array CSPEC_FULL => State_Chm%Species !================== ! BODY OF ROUTINE !================== ... USE EXISTING CODE THAT REFERS TO STT AND CSPEC_FULL ... ... TO AVOID HAVING TO REWRITE ENTIRE SECTIONS OF CODE ... !=================== ! END OF ROUTINE !=================== ! Free pointer memory NULLIFY( STT, CSPEC_FULL )
--Bob Y. 14:16, 30 April 2013 (EDT)