28 for (
const auto& lines: abs_lines_per_species) {
29 for (
const auto& band: lines) {
30 for (Index k=0; k<band.NumLines() and (global ? (k==0) :
false); k++) {
35 auto x = band.QuantumIdentityOfLine(k);
40 if (std::none_of(qid.begin(), qid.end(), [&](
auto& x){
return x == lower;}))
42 if (std::none_of(qid.begin(), qid.end(), [&](
auto& x){
return x == upper;}))
53 nlte_field.
value *= scale;
65 const Agenda& iy_main_agenda,
66 const Agenda& ppath_agenda,
67 const Agenda& iy_space_agenda,
68 const Agenda& iy_surface_agenda,
69 const Agenda& iy_cloudbox_agenda,
70 const Agenda& propmat_clearsky_agenda,
72 const Tensor4& vmr_field,
73 const Tensor3& t_field,
74 const Tensor3& z_field,
76 const Index& atmosphere_dim,
77 const Vector& refellipsoid,
78 const Tensor3& surface_props_data,
81 const Numeric& convergence_limit,
84 const Index& dampened,
85 const Index& iteration_limit,
92 "Error in NLTE field, it is empty");
94 Matrix line_irradiance;
95 Tensor3 line_transmission;
97 const Index nlevels = nlte_field.
levels.
nelem(), np = p_grid.nelem();
99 "Must have more than a four levels");
102 "Only for 1D atmosphere");
104 const Index nlines = nelem(abs_lines_per_species);
106 "Bad number of lines... overlapping lines in nlte_level_identifiers?");
109 const Vector Aij =
createAij(abs_lines_per_species);
110 const Vector Bij =
createBij(abs_lines_per_species);
111 const Vector Bji =
createBji(Bij, abs_lines_per_species);
112 Vector Cij(nlines), Cji(nlines);
116 upper, lower, abs_lines_per_species, nlte_field);
120 Matrix SEE(nlevels, nlevels, 0.0);
121 Vector r(nlevels, 0.0), x(nlevels, 0.0);
122 Numeric max_change = convergence_limit + 1;
125 while (i < iteration_limit and max_change > convergence_limit) {
135 abs_lines_per_species,
148 propmat_clearsky_agenda,
155 for (Index ip = 0; ip < np; ip++) {
156 r = nlte_field.
value(joker, ip, 0, 0);
159 abs_lines_per_species,
161 collision_coefficients,
162 collision_line_identifiers,
164 vmr_field(joker, ip, 0, 0),
178 line_irradiance(joker, ip),
179 line_transmission(0, joker, ip),
189 line_irradiance(joker, ip),
194 solve(nlte_field.
value(joker, ip, 0, 0), SEE, x);
196 for (Index il = 0; il < nlevels; il++) {
198 max(abs(nlte_field.
value(il, ip, 0, 0) - r[il]) / r[il], max_change);
204 if (i < iteration_limit)
205 out2 <<
"Converged NLTE ratios (within convergence_limit) returned after "
206 << i <<
" iterations\n";
209 <<
"No convergence of NLTE ratios (within convergence_limit) returned even after "
210 << iteration_limit <<
" iterations\n";
221 String tmp_basename = basename, filename;
222 if (basename.length() && basename[basename.length() - 1] !=
'/')
226 filename = tmp_basename +
"qid.xml";
231 const Index n = collision_line_identifiers.
nelem();
234 collision_coefficients.resize(abs_species.
nelem());
235 for (Index i = 0; i < collision_coefficients.
nelem(); i++) {
239 filename = tmp_basename +
String(Species::toShortName(abs_species[i].
Species())) +
".xml";
242 "Mismatch between collision_line_identifiers and some collision_coefficients");
243 collision_coefficients[i] = aogf1;
254 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
void solve(VectorView w, const CovarianceMatrix &A, ConstVectorView v)
#define ARTS_USER_ERROR_IF(condition,...)
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.
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.