Go to the documentation of this file.
36 #include <Faddeeva/Faddeeva.hh>
63 const Numeric b2 = b * b, c2 = c * c, d2 = d * d, u2 = u * u, v2 = v * v,
66 const Numeric Const2 =
b2 + c2 + d2 - u2 - v2 - w2;
69 Const1 =
b2 * (
b2 * 0.5 + c2 + d2 - u2 - v2 + w2);
70 Const1 += c2 * (c2 * 0.5 + d2 - u2 + v2 - w2);
71 Const1 += d2 * (d2 * 0.5 + u2 - v2 - w2);
72 Const1 += u2 * (u2 * 0.5 + v2 + w2);
73 Const1 += v2 * (v2 * 0.5 + w2);
75 Const1 += 8 * (b * d * u *
w - b * c * v *
w - c * d * u * v);
79 Const1 =
sqrt(Const1);
94 const Numeric inv_x2y2 = 1.0 / x2y2;
96 std::cout <<
x <<
" " <<
y <<
" " << Const1 <<
" " << Const2 <<
"\n";
99 Numeric inv_y = 0.0, inv_x = 0.0;
106 C2 = (1.0 - cos_y) * inv_x2y2;
107 C3 = (1.0 - sin_y * inv_y) * inv_x2y2;
108 }
else if (
y == 0.0) {
112 C2 = (cosh_x - 1.0) * inv_x2y2;
113 C3 = (sinh_x * inv_x - 1.0) * inv_x2y2;
118 C0 = (cos_y *
x2 + cosh_x * y2) * inv_x2y2;
119 C1 = (sin_y *
x2 * inv_y + sinh_x * y2 * inv_x) * inv_x2y2;
120 C2 = (cosh_x - cos_y) * inv_x2y2;
121 C3 = (sinh_x * inv_x - sin_y * inv_y) * inv_x2y2;
124 std::cout << C0 <<
" " << C1 <<
" " << C2 <<
" " << C3 <<
"\n";
126 Matrix F(4, 4, 0), A(4, 4, 0);
129 Eigen::Matrix4d eigA;
130 eigA << 0, b, c, d, b, 0, u, v, c, -u, 0,
w, d, -v, -
w, 0;
132 eigF = C1 * eigA + C2 * eigA * eigA + C3 * eigA * eigA * eigA;
139 std::cout << F <<
"\n";
145 std::cout <<
"Initialized TransmissionMatrix(2, 4):\n" << a <<
"\n";
149 A << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16;
150 std::cout <<
"New Matrix:\n" << A <<
"\n\n";
152 std::cout <<
"Updated TransmissionMatrix Position 1 wit New Matrix:\n"
157 "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 125 26 27 28 29 30 31 32";
158 std::cout <<
"Stream:\n" << S <<
"\n\n";
159 std::istringstream astream(S);
161 std::cout <<
"Streamed into TransmissionMatrix:\n" << a <<
"\n";
165 std::cout <<
"Initialized RadiationVector(3, 3)\n" << b <<
"\n";
170 std::cout <<
"New Vector:\n" << B <<
"\n\n";
171 b.
Vec3(1).noalias() += B;
172 std::cout <<
"Updated RadiationVector Position 1 with New Vector:\n"
176 String T =
"1 2 3 4 5 6 7 8 90";
177 std::cout <<
"Stream:\n" << T <<
"\n\n";
178 std::istringstream bstream(T);
180 std::cout <<
"Streamed into RadiationVector:\n" << b <<
"\n";
184 auto f = [](
Numeric x) {
return 0.1 *
x; };
185 auto df = [](
Numeric x) {
return 0.1 + 0 *
x; };
191 const Numeric r_extra1 = r_normal + f(
x1);
192 const Numeric r_extra2 = r_normal + f(
x2);
228 Tensor3 T_normal(1, nstokes, nstokes), T_extra(1, nstokes, nstokes);
229 Tensor4 dT1(1, 1, nstokes, nstokes), dT2(1, 1, nstokes, nstokes);
232 T_normal, dT1, dT2, r_normal, a, b, da, da, df(
x1), df(
x2), 0);
234 std::cout <<
"Transmission at r=" << r_normal <<
":\n"
237 std::cout <<
"First derivative:\n"
240 std::cout <<
"Second derivative:\n"
246 std::cout <<
"Transmission at perturbed r1=" << r_extra1 <<
":\n"
251 std::cout <<
"First derivative perturbed:\n"
255 std::cout <<
"First derivative perturbed relative:\n"
261 std::cout <<
"Transmission at perturbed r2=" << r_extra2 <<
":\n"
266 std::cout <<
"Second derivative perturbed:\n"
270 std::cout <<
"Second derivative perturbed relative:\n"
303 std::cout <<
test1 <<
"\n\n"
363 std::cout << ans1 <<
"\n\n"
372 for (
auto& pm : propmats) {
390 std::cout <<
"Propmats:\n" << propmats <<
"\n\n";
394 for (i = 0; i < 4; i++) {
408 std::cout <<
"Layers:\n" << layers <<
"\n\n";
415 std::cout <<
"Forward accumulation:\n" << cumulative_forward <<
"\n\n";
416 std::cout <<
"Reflect accumulation:\n" << cumulative_reflect <<
"\n\n";
424 Vector x(n), sx(n), shx(n), cx(n), chx(n);
427 for (
int i = 0; i < n; i++) {
428 sx[i] = std::sin(
x[i]);
429 cx[i] = std::cos(
x[i]);
430 shx[i] = std::sinh(
x[i]);
431 chx[i] = std::cosh(
x[i]);
435 << std::scientific << std::setprecision(15)
436 <<
"x\tabs(sx/x-1)\tabs(shx/x-1)\tabs((chx-cx)/2x^2-1/2)\tabs((shx/x-sx/x)/2x^2-1/6)\n";
438 for (
int i = 0; i < n; i++)
439 std::cout <<
x[i] <<
'\t' <<
std::abs(sx[i] /
x[i] - 1.0) <<
'\t'
441 <<
std::abs((chx[i] - cx[i]) / (2 *
x[i] *
x[i]) - 0.5) <<
'\t'
442 <<
std::abs((shx[i] /
x[i] - sx[i] /
x[i]) / (2 *
x[i] *
x[i]) -
457 qn.
Set(QuantumNumberType::Lambda, 0_rat);
459 qn.
Set(QuantumNumberType::S, 1_rat);
461 std::cout <<
"Table from Larsson, Lankhaar, Eriksson (2019)\n";
462 for (
Index i = 1; i < 51; i++) {
466 std::cout << i <<
"_" << i - 1;
471 std::cout <<
'\t' << g;
476 std::cout <<
'\t' << g;
481 std::cout <<
'\t' << g;
484 std::cout <<
'\t' << i <<
"_" << i;
489 std::cout <<
'\t' << g;
494 std::cout <<
'\t' << g;
499 std::cout <<
'\t' << g;
502 std::cout <<
'\t' << i <<
"_" << i + 1;
507 std::cout <<
'\t' << g;
512 std::cout <<
'\t' << g;
517 std::cout <<
'\t' << g;
531 "Bad last entry in QuantumNumbers. Did you recently expand the list?");
541 constexpr
Index nf = 501;
542 constexpr
Numeric fstart = 25e9;
543 constexpr
Numeric fend = 165e9;
552 jacs[0].PropType(JacPropMatType::Temperature);
553 jacs[1].PropType(JacPropMatType::Frequency);
556 constexpr
auto df = 1000;
557 constexpr
auto dt = 0.1;
559 Matrix pxsec_dt(nf, 1, 0);
560 Matrix pxsec_df(nf, 1, 0);
563 PWR93O2AbsModel(pxsec, 0, 1, 1, 1,
"user",
"PWR98", f, {p}, {t}, {0.5}, {1},
Verbosity());
564 PWR93O2AbsModel(pxsec_dt, 0, 1, 1, 1,
"user",
"PWR98", f, {p}, {t+dt}, {0.5}, {1},
Verbosity());
565 PWR93O2AbsModel(pxsec_df, 0, 1, 1, 1,
"user",
"PWR98", f_pert, {p}, {t}, {0.5}, {1},
Verbosity());
567 std::cout<<
"xr = np.array([";
568 for (
Index i=0; i<nf; i++)
569 std::cout<<
'['<<xsec(i, 0)<<
','<<
' '<<pxsec(i, 0) <<
']' <<
',' <<
' ';
570 std::cout <<
']' <<
')' <<
'\n';
572 std::cout<<
"dxr_dt = np.array([";
573 for (
Index i=0; i<nf; i++)
574 std::cout<<
'['<<dxsec[0](i, 0)<<
','<<
' '<<(pxsec_dt(i, 0)-pxsec(i, 0))/dt <<
']' <<
',' <<
' ';
575 std::cout <<
']' <<
')' <<
'\n';
577 std::cout<<
"dxr_df = np.array([";
578 for (
Index i=0; i<nf; i++)
579 std::cout<<
'['<<dxsec[1](i, 0)<<
','<<
' '<<(pxsec_df(i, 0)-pxsec(i, 0))/df <<
']' <<
',' <<
' ';
580 std::cout <<
']' <<
')' <<
'\n';
586 constexpr
Index nf = 501;
587 constexpr
Numeric fstart = 45e9;
590 constexpr
Numeric p = 1.00658388e5;
609 std::cout<<
"I = np.array([";
611 std::cout<<I[i].real()<<
",\n";
614 std::cout<<
"I2 = np.array([";
616 std::cout<<xsec(i,0)<<
",\n";
629 const Numeric stotmax = 0.1e-21;
631 const Index nsig =
Index(((sigmax - sigmin) / dsig) + 0.5) + 1;
635 for (
Index isig=0; isig<nsig; isig++) {
637 invcm_grid[isig] = sigc;
643 std::array<std::pair<lm_hitran_2017::ModeOfLineMixing, lm_hitran_2017::calctype>, 6>{
644 std::pair<lm_hitran_2017::ModeOfLineMixing, lm_hitran_2017::calctype>{lm_hitran_2017::ModeOfLineMixing::FullW, lm_hitran_2017::calctype::FullW},
646 {lm_hitran_2017::ModeOfLineMixing::VP, lm_hitran_2017::calctype::NoneVP},
647 {lm_hitran_2017::ModeOfLineMixing::VP_Y, lm_hitran_2017::calctype::NoneRosenkranz},
648 {lm_hitran_2017::ModeOfLineMixing::SDVP, lm_hitran_2017::calctype::SDVP},
649 {lm_hitran_2017::ModeOfLineMixing::SDVP_Y, lm_hitran_2017::calctype::SDRosenkranz}};
657 for (
Index i=0;i<n; i++) {
661 Vector vmrs = {1-xco2/100-xh2o/100, xh2o/100, xco2/100};
671 for (
Index i=0; i<nsig; i++) {
672 for (
Index j=0; j<n; j++) {
673 std::cout<<absorption[j][i]<<
' ';
688 if (n == 2 and
String(argc[1]) ==
"new") {
689 std::cout<<
"new test\n";
693 std::cout<<
"old test\n";
Numeric & gl() noexcept
Returns the lower state g.
void define_species_map()
PropagationMatrix PropagationMatrix
Container class for Quantum Numbers.
constexpr bool test_quantum_numbers(const QuantumNumbers qns, const Index i)
Declarations required for the calculation of absorption coefficients.
Complex w(Complex z) noexcept
The Faddeeva function.
void makarov2020_o2_lines_mpm(Matrix &xsec, ArrayOfMatrix &dxsec, const Vector &f, const Vector &p, const Vector &t, const Vector &water_vmr, const ArrayOfRetrievalQuantity &jacs, const ArrayOfIndex &jacs_pos)
Adds Makarov MPM2020 O2 absorption lines to the absorption matrix.
void makarov2020_o2_lines_ecs(ComplexVector &I, const Vector &f, Numeric P, Numeric T, Numeric water_vmr)
constexpr Numeric kaycm2freq(T x)
void test_transmat_to_cumulativetransmat()
void test_hitran2017(bool newtest=true)
Wigner symbol interactions.
Stuff related to lineshape functions.
invlib::Matrix< ArtsMatrix > Matrix
invlib wrapper type for ARTS matrices.
Vector y(Workspace &ws) noexcept
Headers and class definition of Zeeman modeling.
void test_matrix_buildup()
void test_sinc_likes_0limit()
void read(HitranRelaxationMatrixData &hitran, ArrayOfAbsorptionLines &bands, const String &basedir, const Numeric linemixinglimit, const Numeric fmin, const Numeric fmax, const Numeric stot, const ModeOfLineMixing mode)
Read from HITRAN online line mixing file.
void test_transmat_from_propmat()
VectorView K13(const Index iz=0, const Index ia=0)
Vector view to K(0, 2) elements.
std::complex< Numeric > Complex
void compute_transmission_matrix(Tensor3View T, const Numeric &r, const PropagationMatrix &upper_level, const PropagationMatrix &lower_level, const Index iz, const Index ia)
Compute the matrix exponent as the transmission matrix of this propagation matrix.
Model GetSimpleModel(const QuantumIdentifier &qid) noexcept
Returns a simple Zeeman model.
Model GetAdvancedModel(const QuantumIdentifier &qid) noexcept
Returns an advanced Zeeman model.
Auxiliary data for isotopologues.
Index make_wigner_ready(int largest, [[maybe_unused]] int fastest, int size)
Numeric sqrt(const Rational r)
Square root.
void nlogspace(Vector &x, const Numeric start, const Numeric stop, const Index n)
nlogspace
This can be used to make arrays out of anything.
A tag group can consist of the sum of several of these.
VectorView K24(const Index iz=0, const Index ia=0)
Vector view to K(1, 3) elements.
VectorView K23(const Index iz=0, const Index ia=0)
Vector view to K(1, 2) elements.
void test_transmissionmatrix()
ComplexConstMatrixViewMap MapToEigen(const ConstComplexMatrixView &A)
void stepwise_transmission(TransmissionMatrix &T, ArrayOfTransmissionMatrix &dT1, ArrayOfTransmissionMatrix &dT2, const PropagationMatrix &K1, const PropagationMatrix &K2, const ArrayOfPropagationMatrix &dK1, const ArrayOfPropagationMatrix &dK2, const Numeric &r, const Numeric &dr_dtemp1, const Numeric &dr_dtemp2, const Index temp_deriv_pos)
Set the stepwise transmission matrix.
int main(int n, char **argc)
constexpr T hitran2arts_linestrength(T x)
VectorView K12(const Index iz=0, const Index ia=0)
Vector view to K(0, 1) elements.
VectorView K34(const Index iz=0, const Index ia=0)
Vector view to K(2, 3) elements.
Index nelem() const
Returns the number of elements.
Array< PropagationMatrix > ArrayOfPropagationMatrix
void PWR93O2AbsModel(MatrixView pxsec, const Numeric CCin, const Numeric CLin, const Numeric CWin, const Numeric COin, const String &model, const String &version, ConstVectorView f_grid, ConstVectorView abs_p, ConstVectorView abs_t, ConstVectorView vmrh2o, ConstVectorView vmr, const Verbosity &verbosity)
Oxygen complex at 60 GHz plus mm O2 lines plus O2 continuum.
NUMERIC Numeric
The type to use for all floating point numbers.
const Eigen::Vector3d & Vec3(size_t i) const
Return Vector at position.
Tensor4 & Data()
Get full view to data.
Vector f_grid(Workspace &ws) noexcept
void partition_functionsInitFromBuiltin(SpeciesAuxData &partition_functions, const Verbosity &)
WORKSPACE METHOD: partition_functionsInitFromBuiltin.
void test_r_deriv_propagationmatrix()
VectorView K14(const Index iz=0, const Index ia=0)
Vector view to K(0, 3) elements.
constexpr Rational end(Rational Ju, Rational Jl, Polarization type) noexcept
Gives the largest M for a polarization type of this transition.
void nlinspace(Vector &x, const Numeric start, const Numeric stop, const Index n)
nlinspace
ArrayOfTransmissionMatrix cumulative_transmission(const ArrayOfTransmissionMatrix &T, const CumulativeTransmission type)
Accumulate the transmission matrix over all layers.
Radiation Vector for Stokes dimension 1-4.
Eigen::Map< MatrixType, 0, StrideType > MatrixViewMap
constexpr Rational start(Rational Ju, Rational Jl, Polarization type) noexcept
Gives the lowest M for a polarization type of this transition.
Constains various line scaling functions.
my_basic_string< char > String
The String type for ARTS.
VectorView Kjj(const Index iz=0, const Index ia=0)
Vector view to diagonal elements.
SpeciesAuxData partition_functions(Workspace &ws) noexcept
void compute_transmission_matrix_and_derivative(Tensor3View T, Tensor4View dT_dx_upper_level, Tensor4View dT_dx_lower_level, const Numeric &r, const PropagationMatrix &upper_level, const PropagationMatrix &lower_level, const ArrayOfPropagationMatrix &dupper_level_dx, const ArrayOfPropagationMatrix &dlower_level_dx, const Numeric &dr_dTu, const Numeric &dr_dTl, const Index it, const Index iz, const Index ia)
constexpr Numeric atm2pa(T x)
TransmissionMatrix TransmissionMatrix
Vector compute(const Numeric p, const Numeric t, const Numeric xco2, const Numeric xh2o, const ConstVectorView invcm_grid, const Numeric stotmax, const calctype type)
Stuff related to the transmission matrix.
Vector x(Workspace &ws) noexcept
QuantumIdentifier QuantumIdentifier
INDEX Index
The type to use for all integer numbers and indices.
void define_species_data()
Class to keep track of Transmission Matrices for Stokes Dim 1-4.
void Set(Index qn, Rational r)
Set quantum number at position.
Contains the line shape namespace.
The global header file for ARTS.
Vector vmrs(const ConstVectorView &atmospheric_vmrs, const ArrayOfArrayOfSpeciesTag &atmospheric_species, const QuantumIdentifier &self, const ArrayOfSpeciesTag &lineshape_species, bool self_in_list, bool bath_in_list, Type type)
Returns a VMR vector for this model's main calculations.
const Eigen::Matrix4d & Mat4(size_t i) const
Get Matrix at position.
Namespace and functions to deal with HITRAN linemixing.