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()