-
Notifications
You must be signed in to change notification settings - Fork 22
Description
All the water vapor uptake from the surroundings happens in the EPM, and none happen in the Vortex object initialisation (here), nor in the VortexLosses implementation (here).
Since the EPM represents the jet regime, and the increase in plume area is large in the vortex regime (See Fig. 2 of LU2025)
This means that when calculating the humidity deficit from the ice crystal growth (see code snippet below), icemass is smaller than WV_exhaust_ for many cases, leading APCEMM to add water to the environment (after the closely related bugfix in Issue #87, as seen in PR #86).
In reality, as the contrail mixes in the vortex phase, surviving ice crystals grow with the humidity of the entrained air.

Fig. 2 of LU2025
APCEMM/Code.v05-00/src/Core/LAGRIDPlumeModel.cpp
Lines 328 to 349 in 95ab976
| double mass_WV = WV_exhaust_ - icemass; | |
| double E_H2O = mass_WV / (MW_H2O * 1e3) * Na; | |
| // Spread the emitted water evenly over the cells that contain ice crystals | |
| auto localPlumeEmission = [&](std::size_t j, std::size_t i) -> double { | |
| if(mask[j][i] == 0) return 0; | |
| return E_H2O * 1.0E-06 / ( nonMaskCount * areas[j][i] ); | |
| }; | |
| //Set the H2O field to the plume H2O, and mark locations with 1 or 0 to indicate | |
| //the presence of contrail ice | |
| for(std::size_t j = 0; j < mask.size(); j++) { | |
| for(std::size_t i = 0; i < mask[0].size(); i++) { | |
| if(mask[j][i] == 1) { | |
| double localPlumeH2O = localPlumeEmission(j, i); | |
| H2O_[j][i] += localPlumeH2O; | |
| Contrail_[j][i] = 1.0; | |
| } else { | |
| Contrail_[j][i] = 0.0; | |
| } | |
| } | |
| } | |
| } |
References
LU2025: Lottermoser, A. and Unterstrasser, S.: High-resolution modeling of early contrail evolution from hydrogen-powered aircraft, Atmos. Chem. Phys., 25, 7903–7924, https://doi.org/10.5194/acp-25-7903-2025, 2025.