-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Tunneling reaction rate constant (#156)
* add tunneling rate constant and tests * add tunneling config parsing and tests * Auto-format code using Clang-Format --------- Co-authored-by: GitHub Actions <actions@github.com>
- Loading branch information
1 parent
01f3cd6
commit 5f2891b
Showing
18 changed files
with
378 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
// Copyright (C) 2023 National Center for Atmospheric Research, | ||
// | ||
// SPDX-License-Identifier: Apache-2.0 | ||
#pragma once | ||
|
||
#include <cmath> | ||
#include <micm/process/rate_constant.hpp> | ||
|
||
namespace micm | ||
{ | ||
|
||
struct TunnelingRateConstantParameters | ||
{ | ||
/// @brief Pre-exponential factor [(mol m−3)^(−(𝑛−1)) s−1] | ||
double A_ = 1.0; | ||
/// @brief Linear temperature-dependent parameter [K] | ||
double B_ = 0.0; | ||
/// @brief Cubed temperature-dependent parameter [K^3] | ||
double C_ = 0.0; | ||
}; | ||
|
||
/// @brief Rate constant for tunneling reactions | ||
class TunnelingRateConstant : public RateConstant | ||
{ | ||
public: | ||
const TunnelingRateConstantParameters parameters_; | ||
|
||
public: | ||
/// @brief Default constructor | ||
TunnelingRateConstant(); | ||
|
||
/// @brief An explicit constructor | ||
/// @param parameters A set of troe rate constants | ||
TunnelingRateConstant(const TunnelingRateConstantParameters& parameters); | ||
|
||
/// @brief Deep copy | ||
std::unique_ptr<RateConstant> clone() const override; | ||
|
||
/// @brief Calculate the rate constant | ||
/// @param conditions The current environmental conditions of the chemical system | ||
/// @param custom_parameters User-defined rate constant parameters | ||
/// @return A rate constant based off of the conditions in the system | ||
double calculate(const Conditions& conditions, const std::vector<double>::const_iterator& custom_parameters) | ||
const override; | ||
|
||
/// @brief Calculate the rate constant | ||
/// @param temperature Temperature in [K] | ||
/// @return the calculated rate constant | ||
double calculate(const double& temperature) const; | ||
}; | ||
|
||
inline TunnelingRateConstant::TunnelingRateConstant() | ||
: parameters_() | ||
{ | ||
} | ||
|
||
inline TunnelingRateConstant::TunnelingRateConstant(const TunnelingRateConstantParameters& parameters) | ||
: parameters_(parameters) | ||
{ | ||
} | ||
|
||
inline std::unique_ptr<RateConstant> TunnelingRateConstant::clone() const | ||
{ | ||
return std::unique_ptr<RateConstant>{ new TunnelingRateConstant{ *this } }; | ||
} | ||
|
||
inline double TunnelingRateConstant::calculate( | ||
const Conditions& conditions, | ||
const std::vector<double>::const_iterator& custom_parameters) const | ||
{ | ||
return calculate(conditions.temperature_); | ||
} | ||
|
||
inline double TunnelingRateConstant::calculate(const double& temperature) const | ||
{ | ||
return parameters_.A_ * std::exp(-parameters_.B_ / temperature + parameters_.C_ / std::pow(temperature, 3)); | ||
} | ||
|
||
} // namespace micm |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
#include <gtest/gtest.h> | ||
|
||
#include <micm/configure/solver_config.hpp> | ||
|
||
TEST(TunnelingConfig, DetectsInvalidConfig) | ||
{ | ||
micm::SolverConfig solver_config; | ||
|
||
// Read and parse the configure files | ||
micm::ConfigParseStatus status = solver_config.ReadAndParse("./unit_configs/process/tunneling/missing_reactants"); | ||
EXPECT_EQ(micm::ConfigParseStatus::RequiredKeyNotFound, status); | ||
status = solver_config.ReadAndParse("./unit_configs/process/tunneling/missing_products"); | ||
EXPECT_EQ(micm::ConfigParseStatus::RequiredKeyNotFound, status); | ||
} | ||
|
||
TEST(TunnelingConfig, ParseConfig) | ||
{ | ||
micm::SolverConfig solver_config; | ||
|
||
micm::ConfigParseStatus status = solver_config.ReadAndParse("./unit_configs/process/tunneling/valid"); | ||
EXPECT_EQ(micm::ConfigParseStatus::Success, status); | ||
|
||
micm::SolverParameters solver_params = solver_config.GetSolverParams(); | ||
|
||
auto& process_vector = solver_params.processes_; | ||
|
||
// first reaction | ||
{ | ||
EXPECT_EQ(process_vector[0].reactants_.size(), 3); | ||
EXPECT_EQ(process_vector[0].reactants_[0].name_, "foo"); | ||
EXPECT_EQ(process_vector[0].reactants_[1].name_, "quz"); | ||
EXPECT_EQ(process_vector[0].reactants_[2].name_, "quz"); | ||
EXPECT_EQ(process_vector[0].products_.size(), 2); | ||
EXPECT_EQ(process_vector[0].products_[0].first.name_, "bar"); | ||
EXPECT_EQ(process_vector[0].products_[0].second, 1.0); | ||
EXPECT_EQ(process_vector[0].products_[1].first.name_, "baz"); | ||
EXPECT_EQ(process_vector[0].products_[1].second, 3.2); | ||
micm::TunnelingRateConstant* tunneling_rate_constant = | ||
dynamic_cast<micm::TunnelingRateConstant*>(process_vector[0].rate_constant_.get()); | ||
auto& params = tunneling_rate_constant->parameters_; | ||
EXPECT_EQ(params.A_, 1.0); | ||
EXPECT_EQ(params.B_, 0.0); | ||
EXPECT_EQ(params.C_, 0.0); | ||
} | ||
|
||
// second reaction | ||
{ | ||
EXPECT_EQ(process_vector[1].reactants_.size(), 2); | ||
EXPECT_EQ(process_vector[1].reactants_[0].name_, "bar"); | ||
EXPECT_EQ(process_vector[1].reactants_[1].name_, "baz"); | ||
EXPECT_EQ(process_vector[1].products_.size(), 2); | ||
EXPECT_EQ(process_vector[1].products_[0].first.name_, "bar"); | ||
EXPECT_EQ(process_vector[1].products_[0].second, 0.5); | ||
EXPECT_EQ(process_vector[1].products_[1].first.name_, "foo"); | ||
EXPECT_EQ(process_vector[1].products_[1].second, 1.0); | ||
micm::TunnelingRateConstant* tunneling_rate_constant = | ||
dynamic_cast<micm::TunnelingRateConstant*>(process_vector[1].rate_constant_.get()); | ||
auto& params = tunneling_rate_constant->parameters_; | ||
EXPECT_EQ(params.A_, 32.1); | ||
EXPECT_EQ(params.B_, -2.3); | ||
EXPECT_EQ(params.C_, 102.3); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
#include <gtest/gtest.h> | ||
|
||
#include <micm/process/tunneling_rate_constant.hpp> | ||
#include <micm/solver/state.hpp> | ||
#include <micm/system/system.hpp> | ||
|
||
TEST(TunnelingRateConstant, CalculateWithMinimalArugments) | ||
{ | ||
micm::State<micm::Matrix> state{ 0, 0, 1 }; | ||
state.conditions_[0].temperature_ = 301.24; // [K] | ||
std::vector<double>::const_iterator params = state.custom_rate_parameters_[0].begin(); | ||
micm::TunnelingRateConstantParameters tunneling_params; | ||
micm::TunnelingRateConstant tunneling{ tunneling_params }; | ||
auto k = tunneling.calculate(state.conditions_[0], params); | ||
EXPECT_NEAR(k, 1.0, 1.0e-8); | ||
} | ||
|
||
TEST(TunnelingRateConstant, CalculateWithAllArugments) | ||
{ | ||
micm::State<micm::Matrix> state{ 0, 0, 1 }; | ||
double temperature = 301.24; | ||
state.conditions_[0].temperature_ = temperature; // [K] | ||
std::vector<double>::const_iterator params = state.custom_rate_parameters_[0].begin(); | ||
micm::TunnelingRateConstant tunneling{ micm::TunnelingRateConstantParameters{ .A_ = 1.2, .B_ = 2.3, .C_ = 302.3 } }; | ||
auto k = tunneling.calculate(state.conditions_[0], params); | ||
EXPECT_NEAR(k, 1.2 * std::exp(-2.3 / temperature) * std::exp(302.3 / std::pow(temperature, 3)), 1.0e-8); | ||
} |
2 changes: 1 addition & 1 deletion
2
test/unit/unit_configs/process/ternary_chemical_activation/missing_products/reactions.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
test/unit/unit_configs/process/ternary_chemical_activation/valid/reactions.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 17 additions & 0 deletions
17
test/unit/unit_configs/process/tunneling/missing_products/reactions.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
{ | ||
"camp-data": [ | ||
{ | ||
"name": "Tunneling missing products", | ||
"type": "MECHANISM", | ||
"reactions": [ | ||
{ | ||
"type": "TUNNELING", | ||
"reactants": { | ||
"bar": { }, | ||
"baz": { "qty": 2 } | ||
} | ||
} | ||
] | ||
} | ||
] | ||
} |
16 changes: 16 additions & 0 deletions
16
test/unit/unit_configs/process/tunneling/missing_products/species.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
{ | ||
"camp-data": [ | ||
{ | ||
"name": "foo", | ||
"type": "CHEM_SPEC" | ||
}, | ||
{ | ||
"name": "bar", | ||
"type": "CHEM_SPEC" | ||
}, | ||
{ | ||
"name": "baz", | ||
"type": "CHEM_SPEC" | ||
} | ||
] | ||
} |
8 changes: 8 additions & 0 deletions
8
test/unit/unit_configs/process/tunneling/missing_products/tolerance.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
{ | ||
"camp-data": [ | ||
{ | ||
"type": "RELATIVE_TOLERANCE", | ||
"value": 1.0e-4 | ||
} | ||
] | ||
} |
17 changes: 17 additions & 0 deletions
17
test/unit/unit_configs/process/tunneling/missing_reactants/reactions.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
{ | ||
"camp-data": [ | ||
{ | ||
"name": "Tunneling missing reactants", | ||
"type": "MECHANISM", | ||
"reactions": [ | ||
{ | ||
"type": "TUNNELING", | ||
"products": { | ||
"bar": { "yield": 1.0 }, | ||
"baz": { "yield": 3.2 } | ||
} | ||
} | ||
] | ||
} | ||
] | ||
} |
Oops, something went wrong.