Source code for pycif.plugins.models.iconart.perturb_model
import copy
from logging import warn
[docs]
def perturb_model(self, nsamples, transf_mapper):
"""Extend the ICON-ART chemistry scheme to accommodate ensemble members.
Creates ``nsamples`` copies of each active species (``acspecies``) and
corresponding emission-to-active-species mappings. Original species
are removed after copies are added.
Args:
self: ICON-ART model plugin instance.
nsamples (int): number of ensemble members.
transf_mapper (dict): transform mapper (unused; kept for API
consistency).
"""
self.chemistry.nsamples = nsamples
self.chemistry.mapping_active2emi = {}
self.chemistry.mapping_active2emi_ref = {}
# Perturb active species in the chemical scheme
list_acspecies = copy.deepcopy(self.chemistry.acspecies.attributes)
for spec in list_acspecies:
spec_plg = getattr(self.chemistry.acspecies, spec)
list_emis_species = sorted(copy.deepcopy(spec_plg.emis_species))
self.chemistry.mapping_active2emi_ref[spec] = list_emis_species
for i in range(nsamples):
spec_sample = f"{spec}__sample#{i:03d}"
self.chemistry.acspecies.attributes.append(spec_sample)
setattr(self.chemistry.acspecies, spec_sample, spec_plg)
emspecs_sample = [f"{emspec}__sample#{i:03d}"
for emspec in list_emis_species]
self.chemistry.mapping_active2emi[spec_sample] = emspecs_sample
# Remove the old active species
delattr(self.chemistry.acspecies, spec)
self.chemistry.acspecies.attributes.remove(spec)
# Dump updated chemical scheme
self.chemistry.create_chemicalscheme()