eagles-project / mam4xx

A C++ implementation of MAM4
https://eagles-project.github.io/mam4xx/
Other
6 stars 6 forks source link

Working notes: EAMxx aerosol microphysics AtmosphereProcess #231

Open jeff-cohere opened 1 year ago

jeff-cohere commented 1 year ago

This issue is my scratch space for bringing all of the mam4xx aerosol microphysics parameterizations into their corresponding EAMxx AtmosphereProcess subclass. This code is not part of mam4xx's parameterizations, so I'm taking the liberty of eliminating unneeded code and changing its structure as needed.

I'm working in this branch.

Code Inventory

The code to be transplanted to EAMxx is in mam4_amicphys_1gridcell.cpp, a test suite assembled by @overfelt

Functions (subroutines)

Constants

Many of these seem related to history data that we may dispose of, since legacy MAM's I/O model ("write anything out whenever you want") won't work with GPUs. Also, there are some weird-looking "conversion factors" that might not actually be used.

Indexing Shenanigans

I'm not sure any of this stuff will survive the integration process. :-)

static constexpr int lmapcc_val_nul = 0; static constexpr int lmapcc_val_gas = 1; static constexpr int lmapcc_val_aer = 2; static constexpr int lmapcc_val_num = 3; static constexpr int gas_pcnst = 30; const int lmapcc_all[gas_pcnst] = { lmapcc_val_nul, lmapcc_val_gas, lmapcc_val_nul, lmapcc_val_nul, lmapcc_val_gas, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_num, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_num, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_num, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_aer, lmapcc_val_num};

// Where lmapcc_val_num are defined in lmapcc_all const int numptr_amode[AeroConfig::num_modes()] = {12, 17, 25, 29}; // Where lmapcc_val_gas are defined in lmapcc_all const int lmap_gas[AeroConfig::num_modes()] = {4, 1};

Notes

Aerosol Microphysics Configuration

These parameters can be set to allow specific test/diagnostic setups for analyzing the effects of aerosol microphysics in EAMxx simulations.

mjs271 commented 1 year ago

Here's the notes about indexing etc., that I mentioned.

Mike Trying to Figure Out Indexing Scheme

/// mam4 aerosol hygroscopicities static constexpr Real mam4_hyg_soa = 0.1; static constexpr Real mam4_hyg_so4 = 0.507; static constexpr Real mam4_hyg_pom = 1e-10; static constexpr Real mam4_hyg_bc = 1e-10; static constexpr Real mam4_hyg_nacl = 1.16; static constexpr Real mam4_hyg_dst = 0.14; static constexpr Real mam4_hyg_mom = 0.1;

- `specdens_amode` appears to have the entries:
    ```fortran
    [so4, garbage, garbage, soa/pom, soa/pom, bc, nacl, dust, mom, <zeros>]

Other Useful Information (Ordering, etc.)

[...]

elif ( defined MODAL_AERO_4MODE_MOM )

if (defined RAIN_EVAP_TO_COARSE_AERO)

integer, parameter :: nspec_amode(ntot_amode) = (/ 7, 4, 7, 3 /)

else

integer, parameter :: nspec_amode(ntot_amode) = (/ 7, 4, 3, 3 /)

endif

elif

[...]

elif ( defined MODAL_AERO_4MODE_MOM )

integer, parameter :: ntot_aspectype = 9 character(len=*),parameter :: specname_amode(ntot_aspectype) = (/ 'sulfate', 'ammonium', 'nitrate', 'p-organic', 's-organic', 'black-c', 'seasalt', 'dust', 'm-organic' /)

else

[...]

elif ( defined MODAL_AERO_4MODE_MOM )

real(r8), parameter :: specmw_amode(ntot_aspectype)   = (/ 
    115.0_r8, 115.0_r8,  62.0_r8, 12.0_r8,   12.0_r8,   12.0_r8,  
    58.5_r8, 135.0_r8, 250092.0_r8 /)

elif

[...]

elif ( (defined MODAL_AERO_4MODE) || (defined MODAL_AERO_4MODE_MOM) )

character(len=*), parameter :: modename_amode(ntot_amode) = (/   
    'accum', 'aitken', 'coarse', 'primary_carbon  '/)

elif

[...]

elif ( (defined MODAL_AERO_4MODE) || (defined MODAL_AERO_4MODE_MOM) )

integer, parameter :: mprognum_amode(ntot_amode)   = (/ 1, 1, 1, 1/)
integer, parameter :: mdiagnum_amode(ntot_amode)   = (/ 0, 0, 0, 0/)
integer, parameter :: mprogsfc_amode(ntot_amode)   = (/ 0, 0, 0, 0/)
integer, parameter :: mcalcwater_amode(ntot_amode) = (/ 0, 0, 0, 0/)

elif

- From [modal_aero_initialize_data.F90](https://github.com/eagles-project/e3sm_mam4_refactor/blob/refactor-maint-2.0/components/eam/src/chemistry/modal_aero/modal_aero_initialize_data.F90#L92):
```fortran
#elif ( defined MODAL_AERO_4MODE_MOM )
    xname_massptr(:nspec_amode(1),1)   = (/ 'so4_a1', 'pom_a1', 
       'soa_a1', 'bc_a1', 'dst_a1', 'ncl_a1', 'mom_a1 ' /)
    xname_massptrcw(:nspec_amode(1),1) = (/ 'so4_c1', 'pom_c1', 
       'soa_c1', 'bc_c1', 'dst_c1', 'ncl_c1', 'mom_c1' /)
    xname_spectype(:nspec_amode(1),1)  = (/ 'sulfate', 'p-organic',
        's-organic', 'black-c', 'dust', 'seasalt', 'm-organic' /)
    #elif ( defined MODAL_AERO_3MODE || defined MODAL_AERO_4MODE )
    xname_massptr(:nspec_amode(1),1)   = (/ 'so4_a1', 'pom_a1',
        'soa_a1', 'bc_a1', 'dst_a1', 'ncl_a1' /)
    xname_massptrcw(:nspec_amode(1),1) = (/ 'so4_c1', 'pom_c1',
        'soa_c1', 'bc_c1', 'dst_c1', 'ncl_c1' /)
    xname_spectype(:nspec_amode(1),1)  = (/ 'sulfate', 'p-organic',
        's-organic', 'black-c', 'dust', 'seasalt' /)
#endif

[...]

#elif ( defined MODAL_AERO_4MODE_MOM )
       xname_massptr(:nspec_amode(2),2)   = (/ 'so4_a2', 'soa_a2',
           'ncl_a2', 'mom_a2' /)
       xname_massptrcw(:nspec_amode(2),2) = (/ 'so4_c2', 'soa_c2',
           'ncl_c2', 'mom_c2' /)
       xname_spectype(:nspec_amode(2),2)  = (/ 'sulfate', 's-organic',
           'seasalt', 'm-organic' /)
#elif

[...]

#elif ( defined MODAL_AERO_4MODE_MOM )
       ! mode 3 (coarse dust & seasalt) species
#if (defined RAIN_EVAP_TO_COARSE_AERO)
    xname_massptr(:nspec_amode(3),3)   =    (/ 'dst_a3',
      'ncl_a3', 'so4_a3', 'bc_a3', 'pom_a3', 'soa_a3', 'mom_a3' /)
    xname_massptrcw(:nspec_amode(3),3) =    (/ 'dst_c3',
      'ncl_c3', 'so4_c3', 'bc_c3', 'pom_c3', 'soa_c3', 'mom_c3' /)
    xname_spectype(:nspec_amode(3),3)  = (/ 'dust', 'seasalt',
      'sulfate', 'black-c', 'p-organic', 's-organic', 'm-organic' /)
#else
    xname_massptr(:nspec_amode(3),3)   = (/ 'dst_a3', 'ncl_a3', 
        'so4_a3' /)
    xname_massptrcw(:nspec_amode(3),3) = (/ 'dst_c3', 'ncl_c3', 
        'so4_c3' /)
    xname_spectype(:nspec_amode(3),3)  = (/ 'dust', 'seasalt', 
        'sulfate' /)
#endif
#endif

[...]

#if ( defined MODAL_AERO_4MODE_MOM )
       ! mode 4 (primary carbon) species
    xname_massptr(:nspec_amode(4),4)   = (/ 'pom_a4', 'bc_a4',
       'mom_a4' /)
    xname_massptrcw(:nspec_amode(4),4) = (/ 'pom_c4', 'bc_c4',
       'mom_c4' /)
    xname_spectype(:nspec_amode(4),4)  = (/ 'p-organic', 'black-c',
        'm-organic' /)
#elif
jeff-cohere commented 1 year ago

I'm making some progress here. Some diagnostic quantities apparently are needed in order to compute aerosol microphysics, so perhaps we need to do this during initialization. The required diagnostic (modal) quantities are

All but qaerwat currently exist in the Diagnostics type. Once I figure out how to compute qaerwat, I'll probably put up a little PR to add an aerosol_water_mass_mixing_ratio field to Diagnostics.

Copying @pressel because he's got the most fingerprints on Diagnostics, if I'm not mistaken.