Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
64ae5c8
Initial push for wiring up aerosol optics to rrtmgp via abstract aero…
hplin-ucar Mar 14, 2026
03bc889
Add rebin_seasalt to rebin 4-bin bam prescribed sslt01/2/3/4 to sslta…
hplin-ucar Mar 16, 2026
416d7df
Port changes from Francis Vitt: CAM#1500 Fix issue with aerosol optic…
hplin-ucar Mar 16, 2026
e540186
Various cleanup to move host dependencies out of aerosol_optics CCPP …
hplin-ucar Mar 17, 2026
6b64114
Remove read_water_refindex and move to init phase of aerosol_optics C…
hplin-ucar Mar 18, 2026
63bb88e
Fix diag move
hplin-ucar Mar 25, 2026
aa40fc9
Specify lbound for active_calls due to Fortran standard assuming 1 fo…
hplin-ucar Mar 25, 2026
1db5f77
Fix implicit SAVE by assignment of variable at declaration in Fortran
hplin-ucar Mar 25, 2026
22e70db
Fix some logic on refwater idx; add zero stub for rrtmgp snapshot tes…
hplin-ucar Mar 25, 2026
4961c59
Fix whitespace
hplin-ucar Apr 9, 2026
85ffa76
Draft ndrop_bam, nucleate_ice_ccpp for microp_aero_bam suite
hplin-ucar Apr 17, 2026
10b03d8
Add ccpp subdir to avoid ccpp schemes compiling in CAM
hplin-ucar Apr 17, 2026
21c6bcb
Move the shared subgrid vertical velocity schemes back since they are…
hplin-ucar Apr 17, 2026
6032622
Fill some meta.. continued for wsub/wsubi compute/scale, ndrop_bam_cc…
hplin-ucar Apr 17, 2026
9e6090d
Keep filling meta...
hplin-ucar Apr 20, 2026
fdc2d8c
Build fixes
hplin-ucar Apr 20, 2026
48b4bf9
Add dust_default_radii scheme
hplin-ucar Apr 20, 2026
67813c1
Add initialize_pbuf_aerosols for abstract interface to discover aeros…
hplin-ucar Apr 20, 2026
dcd2efa
Use WP2/CLUBB variant for computing wsub, wsubi.
hplin-ucar Apr 21, 2026
f5ced75
Update to cam64_167
hplin-ucar Apr 23, 2026
38ba2f8
Comment update about CAM behavior
hplin-ucar May 18, 2026
30ca29d
Cleanup errmsg len; add diagnostic schemes
hplin-ucar May 18, 2026
3cd6d75
Fix dynamic constituent allocation - unallocated when disabled is not…
hplin-ucar May 18, 2026
e7cb6b4
Populate CAM7 suite with microp_aero (BAM/nochem)
hplin-ucar May 18, 2026
1372346
Merge branch 'main' into hplin/bulk_aero_3_rebased_on_main
hplin-ucar Jun 9, 2026
825c87a
Rename aerosol_mmr_ccpp -> host for consistent name across host models.
hplin-ucar Jun 11, 2026
4d3fdd7
Fix B4B issue in uw pbl due to numliq now having a standard name.
hplin-ucar Jun 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
552 changes: 552 additions & 0 deletions schemes/chemistry/aerosol_optics.F90

Large diffs are not rendered by default.

263 changes: 263 additions & 0 deletions schemes/chemistry/aerosol_optics.meta
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
[ccpp-table-properties]
name = aerosol_optics
type = scheme

[ccpp-arg-table]
name = aerosol_optics_init
type = scheme
[ N_DIAG ]
standard_name = number_of_radiative_aerosol_diagnostic_lists
units = count
type = integer
dimensions = ()
intent = in
[ active_calls ]
standard_name = flag_for_active_radiative_aerosol_diagnostic_list
units = flag
type = logical
dimensions = (index_of_climate_radiative_aerosol_list:number_of_radiative_aerosol_diagnostic_lists)
intent = in
[ water_refindex_file ]
standard_name = filename_of_water_refractive_index_data
units = none
type = character | kind = len=512
dimensions = ()
intent = in
[ nswbands ]
standard_name = number_of_bands_for_shortwave_radiation
units = count
type = integer
dimensions = ()
intent = in
[ nlwbands ]
standard_name = number_of_bands_for_longwave_radiation
units = count
type = integer
dimensions = ()
intent = in
[ num_bulk_aer ]
standard_name = number_of_bulk_aerosol_constituents_in_climate_radiative_aerosol_list
units = count
type = integer
dimensions = ()
intent = out
[ errmsg ]
standard_name = ccpp_error_message
units = none
type = character | kind = len=*
dimensions = ()
intent = out
[ errflg ]
standard_name = ccpp_error_code
units = 1
type = integer
dimensions = ()
intent = out

[ccpp-arg-table]
name = aerosol_optics_run
type = scheme
[ ncol ]
standard_name = horizontal_loop_extent
units = count
type = integer
dimensions = ()
intent = in
[ pver ]
standard_name = vertical_layer_dimension
units = count
type = integer
dimensions = ()
intent = in
[ const_props ]
standard_name = ccpp_constituent_properties
units = none
type = ccpp_constituent_prop_ptr_t
dimensions = (number_of_ccpp_constituents)
intent = in
[ nswbands ]
standard_name = number_of_bands_for_shortwave_radiation
units = count
type = integer
dimensions = ()
intent = in
[ nlwbands ]
standard_name = number_of_bands_for_longwave_radiation
units = count
type = integer
dimensions = ()
intent = in
[ top_lev ]
standard_name = index_of_air_pressure_at_top_of_aerosol_model
units = index
type = integer
dimensions = ()
intent = in
[ rga ]
standard_name = reciprocal_of_gravitational_acceleration
units = s2 m-1
type = real | kind = kind_phys
dimensions = ()
intent = in
[ idx_sw_diag ]
standard_name = index_of_shortwave_band
units = index
type = integer
dimensions = ()
intent = in
[ num_bulk_aer ]
standard_name = number_of_bulk_aerosol_constituents_in_climate_radiative_aerosol_list
units = count
type = integer
dimensions = ()
intent = in
[ relh ]
standard_name = relative_humidity
units = fraction
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
intent = in
[ pdeldry ]
standard_name = air_pressure_thickness_of_dry_air
units = Pa
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
intent = in
[ constituents ]
standard_name = ccpp_constituents
units = none
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent, vertical_layer_dimension, number_of_ccpp_constituents)
intent = in
[ aer_tau ]
standard_name = shortwave_aerosol_extinction_optical_depth
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent, vertical_layer_dimension, number_of_bands_for_shortwave_radiation)
intent = out
[ aer_tau_w ]
standard_name = shortwave_aerosol_single_scattering_albedo_times_optical_depth
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent, vertical_layer_dimension, number_of_bands_for_shortwave_radiation)
intent = out
[ aer_tau_w_g ]
standard_name = shortwave_aerosol_asymmetry_parameter_times_single_scattering_albedo_times_optical_depth
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent, vertical_layer_dimension, number_of_bands_for_shortwave_radiation)
intent = out
[ aer_lw_abs ]
standard_name = longwave_aerosol_absorption_optical_depth
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent, vertical_layer_dimension, number_of_bands_for_longwave_radiation)
intent = out
[ dustaod ]
standard_name = aerosol_optical_depth_from_dust
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ sulfaod ]
standard_name = aerosol_optical_depth_from_sulfate
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ bcaod ]
standard_name = aerosol_optical_depth_from_black_carbon
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ pomaod ]
standard_name = aerosol_optical_depth_from_primary_organic_matter
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ soaaod ]
standard_name = aerosol_optical_depth_from_secondary_organic_aerosol
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ ssltaod ]
standard_name = aerosol_optical_depth_from_seasalt
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ aodabsbc ]
standard_name = absorption_aerosol_optical_depth_from_black_carbon
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ burdendust ]
standard_name = column_burden_from_dust
units = kg m-2
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ burdenso4 ]
standard_name = column_burden_from_sulfate
units = kg m-2
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ burdenbc ]
standard_name = column_burden_from_black_carbon
units = kg m-2
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ burdenpom ]
standard_name = column_burden_from_primary_organic_matter
units = kg m-2
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ burdensoa ]
standard_name = column_burden_from_secondary_organic_aerosol
units = kg m-2
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ burdenseasalt ]
standard_name = column_burden_from_seasalt
units = kg m-2
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ ssavis ]
standard_name = aerosol_single_scatter_albedo_at_vis
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ aodvis ]
standard_name = aerosol_optical_depth_at_vis
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent)
intent = out
[ odv_col_aod ]
standard_name = column_visible_optical_depth_per_bulk_aerosol
units = 1
type = real | kind = kind_phys
dimensions = (horizontal_loop_extent, number_of_bulk_aerosol_constituents_in_climate_radiative_aerosol_list)
intent = out
[ errmsg ]
standard_name = ccpp_error_message
units = none
type = character | kind = len=*
dimensions = ()
intent = out
[ errflg ]
standard_name = ccpp_error_code
units = 1
type = integer
dimensions = ()
intent = out
93 changes: 93 additions & 0 deletions schemes/chemistry/aerosol_optics_namelist.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl"?>

<entry_id_pg version="2.0">

<!-- Each namelist variable is defined in an <entry> element. The
content of the element is the documentation of how the variable is
used. Other aspects of the variable's definition are expressed as
attributes of the <entry> element. Note that it is an XML requirement
that the attribute values are enclosed in quotes. The attributes are:

id
The variable's name. *** N.B. *** The name must be lower case.
The module convert all namelist variable names to lower case
since Fortran is case insensitive.

type
An abbreviation of the fortran declaration for the variable.
Valid declarations are:

char*n
integer
logical
real

Any of these types may be followed by a comma separated list of
integers enclosed in parenthesis to indicate an array.

The current namelist validation code only distinquishes between
string and non-string types.

input_pathname
Only include this attribute to indicate that the variable
contains the pathname of an input dataset that resides in the
CESM inputdata directory tree. Note that the variables
containing the names of restart files that are used in branch
runs don't reside in the inputdata tree and should not be given
this attribute.

The recognized values are "abs" to indicate that an absolute
pathname is required, or "rel:var_name" to indicate that the
pathname is relative and that the namelist variable "var_name"
contains the absolute root directory.

category
A category assigned for organizing the documentation.

group
The namelist group that the variable is declared in.

valid_values
This is an optional attribute that is mainly useful for variables
that have only a small number of allowed values. It is a
comma-separated list of valid values for the variable.

desc
This is a text description of the variable including its
purpose and use.

values
This is a grouping of all the cases where a value can be
assigned with the namelist generator has been run.

value
Each <value> tag specifies a case where a value is assigned
to this variable when the namelist generator is run. If the
tag has no attributes, it is a default value. In general,
the namelist generator attempts to find a value with the
maximium number of attribute matches (and no non-matches).

standard_name
This is the CCPP Standard Name of the variable

units
This is the CCPP unit specification of the variable (e.g., m s-1).
-->

<entry id="water_refindex_file">
<type>char*512</type>
<category>radiation</category>
<group>aerosol_optics_nl</group>
<standard_name>filename_of_water_refractive_index_data</standard_name>
<units>none</units>
<desc>
Full pathname of dataset for water refractive indices used in aerosol optics.
</desc>
<values>
<value>${DIN_LOC_ROOT}/atm/cam/physprops/water_refindex_rrtmg_c080910.nc</value>
</values>
</entry>

</entry_id_pg>
40 changes: 40 additions & 0 deletions schemes/chemistry/aerosol_optics_zero_stub.F90
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
! Zero stub for aerosol optical properties.
! Sets all aerosol optics arrays to zero (no aerosol), for use in
! test SDFs where full aerosol optics calculations are not needed.
module aerosol_optics_zero_stub
use ccpp_kinds, only: kind_phys

implicit none
private

public :: aerosol_optics_zero_stub_run

contains

!> \section arg_table_aerosol_optics_zero_stub_run Argument Table
!! \htmlinclude aerosol_optics_zero_stub_run.html
!!
subroutine aerosol_optics_zero_stub_run( &
aer_tau, aer_tau_w, aer_tau_w_g, aer_lw_abs, &
errmsg, errflg)

! Outputs
real(kind_phys), intent(out) :: aer_tau(:,:,:) !< SW extinction OD
real(kind_phys), intent(out) :: aer_tau_w(:,:,:) !< SW ssa*tau
real(kind_phys), intent(out) :: aer_tau_w_g(:,:,:) !< SW asy*ssa*tau
real(kind_phys), intent(out) :: aer_lw_abs(:,:,:) !< LW absorption OD

character(len=*), intent(out) :: errmsg !< CCPP error message
integer, intent(out) :: errflg !< CCPP error flag

errmsg = ''
errflg = 0

aer_tau(:,:,:) = 0._kind_phys
aer_tau_w(:,:,:) = 0._kind_phys
aer_tau_w_g(:,:,:) = 0._kind_phys
aer_lw_abs(:,:,:) = 0._kind_phys

end subroutine aerosol_optics_zero_stub_run

end module aerosol_optics_zero_stub
Loading
Loading