geoschem / geos-chem

GEOS-Chem "Science Codebase" repository. Contains GEOS-Chem science routines, run directory generation scripts, and interface code. This repository is used as a submodule within the GCClassic and GCHP wrappers, as well as in other modeling contexts (external ESMs).
http://geos-chem.org
Other
164 stars 156 forks source link

[QUESTION] Prod_Ox and Loss_Ox UNIT #573

Closed sharonshen-wq closed 3 years ago

sharonshen-wq commented 3 years ago

Hi, everyone, I use the 12.9.3 geoschem model to tag O3, the Prod_Ox and Loss_Ox generated by the standard simulation have units of molec cm-3 s-1, however, this version cannot convert the "molec cm-3 s-1" to the standard HEMCO units, as described in the hcoio_read_std_mod.F90 HEMCO UNITS , so the tagged O3 simulation failed with the results in the output files showing -Infinityf; But, if I use the old O3 prod_loss rate file with the units of "kg/m3/s" and "1/m3/s", respectively, the simulation and the results were OK. So is there any code describe the relating unit conversion of molec cm-3 s-1 that I missed? Or I must calculate them myself?

yantosca commented 3 years ago

Thanks for writing @sharonshen-wq. The O3_PROD_LOSS data in the HEMCO/TAGGED_O3/v2014-09 folder is not the most recent P/L data, but is there to allow us to test the tagged O3 simulation.

It might be easiest to change the units of the O3_PROD and O3_LOSS to match what they are in the data files that you have prepared:

(((CHEMISTRY_INPUT
(((O3_PROD_LOSS
* O3_PROD $ROOT/TAGGED_O3/v2014-09/O3_PRODLOSS.$met.4x5.nc POX 2004/1-12/1-31/0 C xyz molec/cm3/s * - 1 1
* O3_LOSS $ROOT/TAGGED_O3/v2014-09/O3_PRODLOSS.$met.4x5.nc LOX 2004/1-12/1-31/0 C xyz  molec/cm3/s * - 1 1
)))O3_PROD_LOSS
)))CHEMISTRY_INPUT

and then just convert units in the the tagged O3 module after these get read in:

    ! Evalulate O3 production from HEMCO
    ALLOCATE( P24H(State_Grid%NX, State_Grid%NY, State_Grid%NZ), STAT=RC )
    CALL GC_CheckVar( 'tagged_o3_mod.F: P24H', 0, RC )
    IF ( RC /= GC_SUCCESS ) RETURN
    P24H = 0.0_fp
    CALL HCO_EvalFld( HcoState, 'O3_PROD', P24H, RC )
    IF ( RC /= GC_SUCCESS ) THEN
       ErrMsg = 'Cannot get pointer to O3_PROD!'
       CALL GC_Error( ErrMsg, RC, ThisLoc )
       RETURN
    ENDIF

    ! Set pointer to O3 production
    P24Hptr => P24H

    ! Evaluate O3 loss from HEMCO
    ALLOCATE( L24H(State_Grid%NX, State_Grid%NY, State_Grid%NZ), STAT=RC )
    CALL GC_CheckVar( 'tagged_o3_mod.F: L24H', 0, RC )
    IF ( RC /= GC_SUCCESS ) RETURN
    L24H = 0.0_fp
    CALL HCO_EvalFld( HcoState, 'O3_LOSS', L24H, RC )
    IF ( RC /= GC_SUCCESS ) THEN
       ErrMsg = 'Cannot get pointer to O3_LOSS!'
       CALL GC_Error( ErrMsg, RC, ThisLoc )
       RETURN
    ENDIF

   ! Change units here
yantosca commented 3 years ago

We will try to update the units of the tagged O3 to be consistent with P/L rates that are saved from HISTORY. This will likely go into a 13.y.z release.

yantosca commented 3 years ago

I will close out this issue for now. If you are still having problems, let me know and I can reopen this issue.