14 const ConstVectorView& Aij,
15 const ConstVectorView& Bij,
16 const ConstVectorView& Bji,
17 const ConstVectorView& Cij,
18 const ConstVectorView& Cji,
19 const ConstVectorView& Jij,
22 const Index nlines = Aij.nelem();
25 for (Index iline = 0; iline < nlines; iline++) {
26 const Index i = upper[iline];
27 const Index j = lower[iline];
29 A(j, j) -= Bji[iline] * Jij[iline] + Cji[iline];
30 A(i, i) -= Aij[iline] + Bij[iline] * Jij[iline] + Cij[iline];
32 A(j, i) += Aij[iline] + Bij[iline] * Jij[iline] + Cij[iline];
33 A(i, j) += Bji[iline] * Jij[iline] + Cji[iline];
39 const ConstVectorView& x,
40 const ConstVectorView& Aij,
41 const ConstVectorView& Bij,
42 const ConstVectorView& Bji,
43 const ConstVectorView& Cij,
44 const ConstVectorView& Cji,
45 const ConstVectorView& Jij,
46 const ConstVectorView& Lambda,
49 const Numeric& total_number_count) {
50 const Index nlines = Aij.nelem();
53 for (Index iline = 0; iline < nlines; iline++) {
54 const Index i = upper[iline];
55 const Index j = lower[iline];
57 const Numeric Source =
59 (x[i] * Aij[iline] / (x[j] * Bji[iline] - x[i] * Bij[iline]));
61 A(j, j) -= Bji[iline] * (Jij[iline] - Lambda[iline] * Source) + Cji[iline];
62 A(i, i) -= Aij[iline] * (1.0 - Lambda[iline]) +
63 Bij[iline] * (Jij[iline] - Lambda[iline] * Source) + Cij[iline];
65 A(j, i) += Aij[iline] * (1.0 - Lambda[iline]) +
66 Bij[iline] * (Jij[iline] - Lambda[iline] * Source) + Cij[iline];
67 A(i, j) += Bji[iline] * (Jij[iline] - Lambda[iline] * Source) + Cji[iline];
73 const Numeric& sem_ratio,
81 const Index n = nelem(abs_lines);
85 for (
auto& lines: abs_lines) {
86 for (
auto& band: lines) {
87 for (Index k=0; k<band.NumLines(); k++) {
88 Aij[i] = band.lines[k].A;
100 const Index n = nelem(abs_lines);
105 for (
auto& lines: abs_lines) {
106 for (
auto& band: lines) {
107 for (Index k=0; k<band.NumLines(); k++) {
108 Bij[i] = band.lines[k].A / (c0 *
Math::pow3(band.lines[k].F0));
118 const Index n = Bij.nelem();
123 for (
auto& lines: abs_lines) {
124 for (
auto& band: lines) {
125 for (Index k=0; k<band.NumLines();k++) {
126 Bji[i] = Bij[i] * band.lines[k].gupp / band.lines[k].glow;
137 const Index n = nelem(abs_lines);
139 setCji(Cji, Cij, abs_lines, T);
148 const Numeric constant = c0 / T;
152 for (
auto& lines: abs_lines) {
153 for (
auto& band: lines) {
154 for (Index k=0; k<band.NumLines(); k++) {
155 Cji[i] = Cij[i] * exp(constant * band.lines[k].F0) * band.lines[k].gupp / band.lines[k].glow;
170 const ConstVectorView& vmr,
174 const Index nspec = abs_species.
nelem();
175 const Index ntrans = collision_line_identifiers.
nelem();
181 for (Index i = 0; i < nspec; i++) {
183 const Numeric numden =
184 vmr[i] * (abs_species[i].FreeElectrons() ? 1.0 : P / (
Constant::k * T));
186 for (Index j = 0; j < ntrans; j++) {
188 for (
auto& lines: abs_lines) {
189 for (
auto& band: lines) {
190 const Numeric isot_ratio = isotopologue_ratios[band.Isotopologue()];
191 for (Index k=0; k<band.NumLines(); k++) {
193 const auto& transition = collision_line_identifiers[j];
194 const auto& gf1 = collision_coefficients[i][j];
197 if (lt == Quantum::Number::StateMatchType::Full) {
199 const FixedLagrangeInterpolation<1> lag(0, T, gf1.get_numeric_grid(0));
202 Cij[iline] +=
interp(gf1.data, itw, lag) * numden * isot_ratio;
214 setCji(Cji, Cij, abs_lines, T);
222 const Index nl = nelem(abs_lines), nq = nlte_field.
levels.
nelem();
228 for (
auto& lines: abs_lines) {
230 for (Index k=0; k<band.NumLines(); k++) {
231 for (Index iq = 0; iq < nq; iq++) {
233 if (lt == Quantum::Number::StateMatchType::Level and lt.low)
235 if (lt == Quantum::Number::StateMatchType::Level and lt.upp)
244 for (Index il = 0; il < nl; il++)
245 if (upper[il] < 0 or lower[il] < 0) i++;
247 "Must set upper and lower levels completely for all but one level");
252 for (
const Index& l : lower) {
253 if (std::find(upper.cbegin(), upper.cend(), l) == upper.cend())
256 return upper.nelem() - 1;
261 std::find_if(collision_line_identifiers.cbegin(),
262 collision_line_identifiers.cend(),
263 [isot = collision_line_identifiers.front().Isotopologue()](
264 auto& x) { return isot not_eq x.Isotopologue(); });
267 "does not match the requirements for a line identifier\n"
268 "Your list of species is:\n",
269 collision_line_identifiers,
"\n"
270 "This contains more than one isotopologue or it contains some non-transition type identifiers.\n"
271 "It will therefore fail in current code. You can only input transitions, and a single isotopologue.\n")
Array< Index > ArrayOfIndex
An array of Index.
Constants of physical expressions as constexpr.
Index nelem() const ARTS_NOEXCEPT
#define ARTS_USER_ERROR_IF(condition,...)
void interpweights(VectorView itw, const GridPos &tc)
Red 1D interpolation weights.
Numeric interp(ConstVectorView itw, ConstVectorView a, const GridPos &tc)
Red 1D Interpolate.
constexpr Numeric boltzmann_constant
Boltzmann constant [J/K] From: https://en.wikipedia.org/wiki/2019_redefinition_of_SI_base_units Date:...
constexpr Numeric k
Boltzmann constant convenience name [J/K].
constexpr Numeric planck_constant
Planck constant [J s] From: https://en.wikipedia.org/wiki/2019_redefinition_of_SI_base_units Date: 20...
constexpr Numeric c
Speed of light convenience name [m/s].
constexpr Numeric h
Planck constant convenience name [J s].
constexpr auto pow3(auto x) noexcept
power of three
constexpr auto pow2(auto x) noexcept
power of two
Vector createBij(const ArrayOfArrayOfAbsorptionLines &abs_lines)
Create a Bij object.
Vector createBji(const Vector &Bij, const ArrayOfArrayOfAbsorptionLines &abs_lines)
Create a Bji object.
Vector createAij(const ArrayOfArrayOfAbsorptionLines &abs_lines)
Create a Aij object.
Vector createCji(const Vector &Cij, const ArrayOfArrayOfAbsorptionLines &abs_lines, const Numeric &T)
Create a Cji object.
void check_collision_line_identifiers(const ArrayOfQuantumIdentifier &collision_line_identifiers)
Checks that a WSV is OK or throws a run-time error.
void set_constant_statistical_equilibrium_matrix(MatrixView A, VectorView x, const Numeric &sem_ratio, const Index row)
Set a row of the SEE matrix and level distribution vector to constant.
void nlte_collision_factorsCalcFromCoeffs(Vector &Cij, Vector &Cji, const ArrayOfArrayOfAbsorptionLines &abs_lines, const ArrayOfArrayOfSpeciesTag &abs_species, const ArrayOfArrayOfGriddedField1 &collision_coefficients, const ArrayOfQuantumIdentifier &collision_line_identifiers, const SpeciesIsotopologueRatios &isotopologue_ratios, const ConstVectorView &vmr, const Numeric &T, const Numeric &P)
Gets collisional factors from coefficients.
Index find_first_unique_in_lower(const ArrayOfIndex &upper, const ArrayOfIndex &lower) ARTS_NOEXCEPT
Finds a unique lower state if one exists or returns index to last element.
void nlte_positions_in_statistical_equilibrium_matrix(ArrayOfIndex &upper, ArrayOfIndex &lower, const ArrayOfArrayOfAbsorptionLines &abs_lines, const EnergyLevelMap &nlte_field)
Finds upper and lower states in SEE Matrix.
void setCji(Vector &Cji, const Vector &Cij, const ArrayOfArrayOfAbsorptionLines &abs_lines, const Numeric &T)
Set the Cji object.
void dampened_statistical_equilibrium_equation(MatrixView A, const ConstVectorView &x, const ConstVectorView &Aij, const ConstVectorView &Bij, const ConstVectorView &Bji, const ConstVectorView &Cij, const ConstVectorView &Cji, const ConstVectorView &Jij, const ConstVectorView &Lambda, const ArrayOfIndex &upper, const ArrayOfIndex &lower, const Numeric &total_number_count)
Sets up the solution matrix for linear dampened statistical equilibrium equation.
void statistical_equilibrium_equation(MatrixView A, const ConstVectorView &Aij, const ConstVectorView &Bij, const ConstVectorView &Bji, const ConstVectorView &Cij, const ConstVectorView &Cji, const ConstVectorView &Jij, const ArrayOfIndex &upper, const ArrayOfIndex &lower)
Sets up the solution matrix for linear statistical equilibrium equation.
Deep calculations for NLTE.
ArrayOfQuantumIdentifier levels
StateMatchType operates so that a check less than a level should be 'better', bar None.