diff --git a/src/v0/photolysis_parser.cpp b/src/v0/photolysis_parser.cpp index 7340d591..844d2b26 100644 --- a/src/v0/photolysis_parser.cpp +++ b/src/v0/photolysis_parser.cpp @@ -31,10 +31,19 @@ namespace mechanism_configuration::v0 errors.insert(errors.end(), parse_error.begin(), parse_error.end()); double scaling_factor = object[keys::SCALING_FACTOR] ? object[keys::SCALING_FACTOR].as() : 1.0; + std::string name = object[keys::MUSICA_NAME].as(); - if (!reactants.empty()) + if (reactants.empty()) + { + // A photolysis reaction with no reactants is a pure production term -- + // Music Box Interactive encodes emissions this way (as a photolysis so + // they can carry an irr product). Represent it as an emission, which has + // no reactant, so it is not silently dropped. + types::Emission emission = { .scaling_factor = scaling_factor, .products = products, .name = name }; + mechanism.reactions.emission.push_back(emission); + } + else { - std::string name = object[keys::MUSICA_NAME].as(); types::Photolysis user_defined = { .scaling_factor = scaling_factor, .reactants = reactants[0], .products = products, .name = name }; diff --git a/test/unit/v0/test_photolysis_config.cpp b/test/unit/v0/test_photolysis_config.cpp index e4f95812..c790230c 100644 --- a/test/unit/v0/test_photolysis_config.cpp +++ b/test/unit/v0/test_photolysis_config.cpp @@ -86,6 +86,15 @@ TEST(PhotolysisConfig, ParseConfig) EXPECT_EQ(process_vector[1].name, "jbar"); EXPECT_EQ(process_vector[1].scaling_factor, 2.5); } + + // A photolysis reaction with no reactants (an emission encoded as photolysis) + // is kept as an emission rather than dropped. + auto& emissions = mechanism.reactions.emission; + ASSERT_EQ(emissions.size(), 1); + EXPECT_EQ(emissions[0].name, "jemis"); + ASSERT_EQ(emissions[0].products.size(), 1); + EXPECT_EQ(emissions[0].products[0].name, "foo"); + EXPECT_EQ(emissions[0].products[0].coefficient, 1.0); } } diff --git a/test/unit/v0/v0_unit_configs/photolysis/valid/reactions.json b/test/unit/v0/v0_unit_configs/photolysis/valid/reactions.json index dc4dec9a..a3e2a93b 100644 --- a/test/unit/v0/v0_unit_configs/photolysis/valid/reactions.json +++ b/test/unit/v0/v0_unit_configs/photolysis/valid/reactions.json @@ -26,6 +26,14 @@ }, "MUSICA name": "jbar", "scaling factor": 2.5 + }, + { + "type": "PHOTOLYSIS", + "reactants": { }, + "products": { + "foo": { "yield": 1.0 } + }, + "MUSICA name": "jemis" } ] } diff --git a/test/unit/v0/v0_unit_configs/photolysis/valid/reactions.yaml b/test/unit/v0/v0_unit_configs/photolysis/valid/reactions.yaml index 776b8c87..517e1b71 100644 --- a/test/unit/v0/v0_unit_configs/photolysis/valid/reactions.yaml +++ b/test/unit/v0/v0_unit_configs/photolysis/valid/reactions.yaml @@ -19,4 +19,10 @@ camp-data: bar: {} scaling factor: 2.5 type: PHOTOLYSIS + - MUSICA name: jemis + products: + foo: + yield: 1.0 + reactants: {} + type: PHOTOLYSIS type: MECHANISM