46 for (
const auto& lines: abs_lines_per_species) {
47 for (
const auto& band: lines) {
48 for (
Index k=0; k<band.NumLines() and (global ? (k==0) :
false); k++) {
53 auto x = band.QuantumIdentityOfLine(k);
58 if (std::none_of(qid.begin(), qid.end(), [&](
auto& x){return x == lower;}))
60 if (std::none_of(qid.begin(), qid.end(), [&](
auto& x){return x == upper;}))
71 nlte_field.
value *= scale;
83 const Agenda& iy_main_agenda,
84 const Agenda& ppath_agenda,
85 const Agenda& iy_space_agenda,
86 const Agenda& iy_surface_agenda,
87 const Agenda& iy_cloudbox_agenda,
88 const Agenda& propmat_clearsky_agenda,
94 const Index& atmosphere_dim,
95 const Vector& refellipsoid,
96 const Tensor3& surface_props_data,
99 const Numeric& convergence_limit,
102 const Index& dampened,
103 const Index& iteration_limit,
110 "Error in NLTE field, it is empty");
117 "Must have more than a four levels");
120 "Only for 1D atmosphere");
122 const Index nlines = nelem(abs_lines_per_species);
124 "Bad number of lines... overlapping lines in nlte_level_identifiers?");
130 Vector Cij(nlines), Cji(nlines);
134 upper, lower, abs_lines_per_species, nlte_field);
138 Matrix SEE(nlevels, nlevels, 0.0);
139 Vector r(nlevels, 0.0), x(nlevels, 0.0);
140 Numeric max_change = convergence_limit + 1;
143 while (i < iteration_limit and max_change > convergence_limit) {
153 abs_lines_per_species,
166 propmat_clearsky_agenda,
173 for (
Index ip = 0; ip < np; ip++) {
177 abs_lines_per_species,
179 collision_coefficients,
180 collision_line_identifiers,
182 vmr_field(
joker, ip, 0, 0),
196 line_irradiance(
joker, ip),
197 line_transmission(0,
joker, ip),
207 line_irradiance(
joker, ip),
214 for (
Index il = 0; il < nlevels; il++) {
216 max(
abs(nlte_field.
value(il, ip, 0, 0) - r[il]) / r[il], max_change);
222 if (i < iteration_limit)
223 out2 <<
"Converged NLTE ratios (within convergence_limit) returned after "
224 << i <<
" iterations\n";
227 <<
"No convergence of NLTE ratios (within convergence_limit) returned even after "
228 << iteration_limit <<
" iterations\n";
239 String tmp_basename = basename, filename;
240 if (basename.length() && basename[basename.length() - 1] !=
'/')
244 filename = tmp_basename +
"qid.xml";
249 const Index n = collision_line_identifiers.
nelem();
252 collision_coefficients.resize(abs_species.
nelem());
253 for (
Index i = 0; i < collision_coefficients.
nelem(); i++) {
257 filename = tmp_basename +
String(Species::toShortName(abs_species[i].
Species())) +
".xml";
260 "Mismatch between collision_line_identifiers and some collision_coefficients");
261 collision_coefficients[i] = aogf1;
272 nlte_level_identifiers.resize(0);
Declarations required for the calculation of absorption coefficients.
base max(const Array< base > &x)
Max function.
The global header file for ARTS.
Index nelem() const ARTS_NOEXCEPT
bool empty() const noexcept
Numeric sum() const ARTS_NOEXCEPT
The sum of all elements of a Vector.
Index nelem() const noexcept
Returns the number of elements.
void solve(VectorView w, const CovarianceMatrix &A, ConstVectorView v)
#define ARTS_USER_ERROR_IF(condition,...)
Linear algebra functions.
void nlte_fieldForSingleSpeciesNonOverlappingLines(Workspace &ws, EnergyLevelMap &nlte_field, const ArrayOfArrayOfSpeciesTag &abs_species, const ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfGriddedField1 &collision_coefficients, const ArrayOfQuantumIdentifier &collision_line_identifiers, const SpeciesIsotopologueRatios &isotopologue_ratios, const Agenda &iy_main_agenda, const Agenda &ppath_agenda, const Agenda &iy_space_agenda, const Agenda &iy_surface_agenda, const Agenda &iy_cloudbox_agenda, const Agenda &propmat_clearsky_agenda, const Agenda &, const Tensor4 &vmr_field, const Tensor3 &t_field, const Tensor3 &z_field, const Vector &p_grid, const Index &atmosphere_dim, const Vector &refellipsoid, const Tensor3 &surface_props_data, const Index &nlte_do, const Numeric &df, const Numeric &convergence_limit, const Index &nz, const Index &nf, const Index &dampened, const Index &iteration_limit, const Verbosity &verbosity)
WORKSPACE METHOD: nlte_fieldForSingleSpeciesNonOverlappingLines.
void collision_coefficientsFromSplitFiles(ArrayOfArrayOfGriddedField1 &collision_coefficients, ArrayOfQuantumIdentifier &collision_line_identifiers, const ArrayOfArrayOfSpeciesTag &abs_species, const String &basename, const Verbosity &verbosity)
WORKSPACE METHOD: collision_coefficientsFromSplitFiles.
void nlteOff(Index &nlte_do, EnergyLevelMap &nlte_field, ArrayOfQuantumIdentifier &nlte_level_identifiers, const Verbosity &)
WORKSPACE METHOD: nlteOff.
void nlte_fieldRescalePopulationLevels(EnergyLevelMap &nlte_field, const Numeric &scale, const Verbosity &)
WORKSPACE METHOD: nlte_fieldRescalePopulationLevels.
void ArrayOfQuantumIdentifierFromLines(ArrayOfQuantumIdentifier &qid, const ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const Index &global, const Verbosity &)
WORKSPACE METHOD: ArrayOfQuantumIdentifierFromLines.
void line_irradianceCalcForSingleSpeciesNonOverlappingLinesPseudo2D(Workspace &ws, Matrix &line_irradiance, Tensor3 &line_transmission, const ArrayOfArrayOfSpeciesTag &abs_species, const ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const EnergyLevelMap &nlte_field, const Tensor4 &vmr_field, const Tensor3 &t_field, const Tensor3 &z_field, const Vector &p_grid, const Vector &refellipsoid, const Tensor3 &surface_props_data, const Agenda &ppath_agenda, const Agenda &iy_main_agenda, const Agenda &iy_space_agenda, const Agenda &iy_surface_agenda, const Agenda &iy_cloudbox_agenda, const Agenda &propmat_clearsky_agenda, const Numeric &df, const Index &nz, const Index &nf, const Numeric &r, const Verbosity &verbosity)
WORKSPACE METHOD: line_irradianceCalcForSingleSpeciesNonOverlappingLinesPseudo2D.
void abs(Sparse &A, const Sparse &B)
Absolute value of sparse matrix elements.
NUMERIC Numeric
The type to use for all floating point numbers.
INDEX Index
The type to use for all integer numbers and indices.
my_basic_string< char > String
The String type for ARTS.
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.
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 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
A logical struct for global quantum numbers with species identifiers.
GlobalState UpperLevel() const
GlobalState LowerLevel() const
This file contains basic functions to handle XML data files.
void xml_read_from_file(const String &filename, T &type, const Verbosity &verbosity)
Reads data from XML file.