chombo-discharge
Loading...
Searching...
No Matches
CD_KMCDualStateImplem.H
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021-2026 SINTEF Energy Research
3 *
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
13#ifndef CD_KMCDUALSTATEIMPLEM_H
14#define CD_KMCDUALSTATEIMPLEM_H
15
16// Chombo includes
17#include <CH_assert.H>
18
19// Our includes
20#include <CD_KMCDualState.H>
21#include <CD_NamespaceHeader.H>
22
23template <typename T>
24KMCDualState<T>::KMCDualState(const size_t a_numReactiveSpecies, const size_t a_numNonReactiveSpecies) noexcept
25{
26 this->define(a_numReactiveSpecies, a_numNonReactiveSpecies);
27
28 CH_assert(m_reactiveState.size() > 0);
29}
30
31template <typename T>
34
35template <typename T>
36inline void
37KMCDualState<T>::define(const size_t a_numReactiveSpecies, const size_t a_numNonReactiveSpecies) noexcept
38{
39 m_numReactiveSpecies = a_numReactiveSpecies;
40 m_numNonReactiveSpecies = a_numNonReactiveSpecies;
41
42 m_reactiveState.resize(a_numReactiveSpecies);
43 m_nonReactiveState.resize(a_numNonReactiveSpecies);
44}
45
46template <typename T>
47inline bool
49{
50 bool isValid = true;
51
52 for (const auto& p : m_reactiveState) {
53 if (p < 0) {
54 isValid = false;
55
56 break;
57 }
58 }
59
60 for (const auto& p : m_nonReactiveState) {
61 if (p < 0) {
62 isValid = false;
63
64 break;
65 }
66 }
67
68 return isValid;
69}
70
71template <typename T>
72inline std::vector<T>
74{
75 std::vector<T> out(0);
76
77 out.insert(out.end(), m_reactiveState.begin(), m_reactiveState.end());
78 out.insert(out.end(), m_nonReactiveState.begin(), m_nonReactiveState.end());
79
80 return out;
81}
82
83template <typename T>
84inline void
85KMCDualState<T>::linearIn(const std::vector<T>& a_linearizedState) noexcept
86{
87 CH_assert(a_linearizedState.size() == m_numReactiveSpecies + m_numNonReactiveSpecies);
88
89 for (size_t i = 0; i < m_numReactiveSpecies; i++) {
90 m_reactiveState[i] = a_linearizedState[i];
91 }
92
93 for (size_t i = 0; i < m_numNonReactiveSpecies; i++) {
94 m_nonReactiveState[i] = a_linearizedState[m_numReactiveSpecies + i];
95 }
96}
97
98template <typename T>
99inline typename KMCDualState<T>::State&
101{
102 return m_reactiveState;
103}
104
105template <typename T>
106inline const typename KMCDualState<T>::State&
108{
109 return m_reactiveState;
110}
111
112template <typename T>
113inline typename KMCDualState<T>::State&
115{
116 return m_nonReactiveState;
117}
118
119template <typename T>
120inline const typename KMCDualState<T>::State&
122{
123 return m_nonReactiveState;
124}
125
126template <typename T>
127inline std::ostream&
128operator<<(std::ostream& ostr, const KMCDualState<T>& a_state)
129{
130 ostr << "KMCDualState : \n";
131
132 // Print position.
133 const auto& reactiveState = a_state.getReactiveState();
134 const auto& nonReactiveState = a_state.getNonReactiveState();
135
136 ostr << "\t Reactive = (";
137 for (size_t i = 0; i < reactiveState.size(); i++) {
138 ostr << reactiveState[i];
139 if (i < reactiveState.size() - 1) {
140 ostr << ",";
141 }
142 }
143 ostr << ")\n";
144
145 ostr << "\t Non-reactive = (";
146 for (size_t i = 0; i < nonReactiveState.size(); i++) {
147 ostr << nonReactiveState[i];
148 if (i < nonReactiveState.size() - 1) {
149 ostr << ",";
150 }
151 }
152 ostr << ")\n";
153
154 return ostr;
155}
156
157#include <CD_NamespaceFooter.H>
158
159#endif
std::ostream & operator<<(std::ostream &ostr, const KMCDualState< T > &a_state)
State printing function.
Definition CD_KMCDualStateImplem.H:128
Declaration of a simple state vector for running Kinetic Monte Carlo for plasma problems.
Declaration of a "dual state" for advancing with the Kinetic Monte Carlo module.
Definition CD_KMCDualState.H:32
std::vector< T > State
Alias for the state type.
Definition CD_KMCDualState.H:37
State & getNonReactiveState() noexcept
Get modifiable non-reactive state.
Definition CD_KMCDualStateImplem.H:114
KMCDualState()=default
Default constructor.
bool isValidState() const noexcept
Check if state is a valid state. An invalid state will have a negative number of reactants/non-reacta...
Definition CD_KMCDualStateImplem.H:48
void define(const size_t a_numReactiveSpecies, const size_t a_numNonReactiveSpecies) noexcept
Define function.
Definition CD_KMCDualStateImplem.H:37
void linearIn(const std::vector< T > &a_linearizedState) noexcept
Linearize the input buffer onto the current state.
Definition CD_KMCDualStateImplem.H:85
virtual ~KMCDualState()
Destructor.
Definition CD_KMCDualStateImplem.H:32
std::vector< T > linearOut() const noexcept
Linearize the state onto an output vector.
Definition CD_KMCDualStateImplem.H:73
State & getReactiveState() noexcept
Get modifiable reactive state.
Definition CD_KMCDualStateImplem.H:100