31#include "matpack_data.h"
35#include "propagationmatrix.h"
47 VectorView stokes_vec,
50 const PropagationMatrix& ext_mat_av,
51 const StokesVector& abs_vec_av,
52 ConstVectorView sca_vec_av,
54 const Numeric& rtp_planck_value,
55 const bool& trans_is_precalc) {
57 Index stokes_dim = stokes_vec.nelem();
60 ARTS_ASSERT(ext_mat_av.NumberOfFrequencies() == 1 and
61 abs_vec_av.NumberOfFrequencies() == 1);
64 ARTS_ASSERT(is_size(trans_mat, stokes_dim, stokes_dim));
65 ARTS_ASSERT(stokes_dim == ext_mat_av.StokesDimensions() and
66 stokes_dim == abs_vec_av.StokesDimensions());
82 if (!trans_is_precalc) {
83 compute_transmission_matrix_from_averaged_matrix_at_frequency(
84 trans_mat, lstep, ext_mat_av, 0);
88 if (stokes_dim == 1) {
89 stokes_vec[0] = stokes_vec[0] * trans_mat(0, 0) +
90 (abs_vec_av.Kjj()[0] * rtp_planck_value + sca_vec_av[0]) /
91 ext_mat_av.Kjj()[0] * (1 - trans_mat(0, 0));
117 Matrix invK(stokes_dim, stokes_dim);
118 ext_mat_av.MatrixInverseAtPosition(invK);
120 Vector source{abs_vec_av.VectorAtPosition()};
121 source *= rtp_planck_value;
123 for (Index i = 0; i < stokes_dim; i++)
124 source[i] += sca_vec_av[i];
127 Vector x(stokes_dim);
128 mult(x, invK, source);
130 Vector term1(stokes_dim);
131 Vector term2(stokes_dim);
133 Matrix ImT(stokes_dim, stokes_dim);
140 mult(term1, trans_mat, stokes_vec);
142 for (Index i = 0; i < stokes_dim; i++)
143 stokes_vec[i] = term1[i] + term2[i];
149 Tensor5View ext_mat_field,
150 Tensor4View abs_vec_field,
152 const Agenda& spt_calc_agenda,
153 const Index& za_index,
154 const Index& aa_index,
156 ConstTensor3View t_field,
157 ConstTensor4View pnd_field,
164 out3 <<
"Calculate scattering properties in cloudbox \n";
166 const Index atmosphere_dim = cloudbox_limits.
nelem() / 2;
167 const Index N_se = pnd_field.nbooks();
168 const Index stokes_dim = ext_mat_field.ncols();
170 ARTS_ASSERT(atmosphere_dim == 1 || atmosphere_dim == 3);
171 ARTS_ASSERT(ext_mat_field.ncols() == ext_mat_field.nrows() &&
172 ext_mat_field.ncols() == abs_vec_field.ncols());
174 const Index Np_cloud = cloudbox_limits[1] - cloudbox_limits[0] + 1;
177 Index Nlat_cloud = 1;
178 Index Nlon_cloud = 1;
180 if (atmosphere_dim == 3) {
181 Nlat_cloud = cloudbox_limits[3] - cloudbox_limits[2] + 1;
182 Nlon_cloud = cloudbox_limits[5] - cloudbox_limits[4] + 1;
188 ArrayOfStokesVector abs_vec_spt_local(N_se);
189 for (
auto& av : abs_vec_spt_local) {
190 av = StokesVector(1, stokes_dim);
193 ArrayOfPropagationMatrix ext_mat_spt_local(N_se);
194 for (
auto& pm : ext_mat_spt_local) {
195 pm = PropagationMatrix(1, stokes_dim);
199 StokesVector abs_vec_local;
200 PropagationMatrix ext_mat_local;
201 Numeric rtp_temperature_local;
214 for (Index scat_p_index_local = 0; scat_p_index_local < Np_cloud;
215 scat_p_index_local++) {
216 for (Index scat_lat_index_local = 0; scat_lat_index_local < Nlat_cloud;
217 scat_lat_index_local++) {
218 for (Index scat_lon_index_local = 0; scat_lon_index_local < Nlon_cloud;
219 scat_lon_index_local++) {
220 if (atmosphere_dim == 1)
221 rtp_temperature_local =
222 t_field(scat_p_index_local + cloudbox_limits[0], 0, 0);
224 rtp_temperature_local =
225 t_field(scat_p_index_local + cloudbox_limits[0],
226 scat_lat_index_local + cloudbox_limits[2],
227 scat_lon_index_local + cloudbox_limits[4]);
235 scat_lat_index_local,
236 scat_lon_index_local,
237 rtp_temperature_local,
265 scat_lat_index_local,
266 scat_lon_index_local,
270 abs_vec_field(scat_p_index_local,
271 scat_lat_index_local,
272 scat_lon_index_local,
273 joker) = abs_vec_local.VectorAtPosition();
275 ext_mat_local.MatrixAtPosition(ext_mat_field(scat_p_index_local,
276 scat_lat_index_local,
277 scat_lon_index_local,
287 Tensor6View cloudbox_field_mono,
289 const Index& p_index,
290 const Index& za_index,
291 ConstVectorView za_grid,
293 ConstTensor6View doit_scat_field,
295 const Agenda& propmat_clearsky_agenda,
296 ConstTensor4View vmr_field,
298 const Agenda& ppath_step_agenda,
299 const Numeric& ppath_lmax,
300 const Numeric& ppath_lraytrace,
301 ConstVectorView p_grid,
302 ConstTensor3View z_field,
303 ConstVectorView refellipsoid,
305 ConstTensor3View t_field,
306 ConstVectorView f_grid,
307 const Index& f_index,
309 ConstTensor5View ext_mat_field,
310 ConstTensor4View abs_vec_field,
311 const Agenda& surface_rtprop_agenda,
313 const Index& scat_za_interp,
325 ppath_step.
pos(0, 0) = z_field(p_index, 0, 0);
326 ppath_step.
r[0] = refellipsoid[0] + z_field(p_index, 0, 0);
329 ppath_step.
los(0, 0) = za_grid[za_index];
332 ppath_step.
gp_p[0].idx = p_index;
333 ppath_step.
gp_p[0].fd[0] = 0;
334 ppath_step.
gp_p[0].fd[1] = 1;
341 Vector(1, f_grid[f_index]),
349 if ((cloudbox_limits[0] <= ppath_step.
gp_p[1].idx &&
350 cloudbox_limits[1] > ppath_step.
gp_p[1].idx) ||
351 (cloudbox_limits[1] == ppath_step.
gp_p[1].idx &&
352 abs(ppath_step.
gp_p[1].fd[0]) < 1e-6)) {
354 const Index stokes_dim = cloudbox_field_mono.ncols();
356 const Index N_species = vmr_field.nbooks();
365 Tensor3 ext_mat_int(stokes_dim, stokes_dim, ppath_step.
np, 0.);
366 Matrix abs_vec_int(stokes_dim, ppath_step.
np, 0.);
367 Matrix sca_vec_int(stokes_dim, ppath_step.
np, 0.);
368 Matrix cloudbox_field_mono_int(stokes_dim, ppath_step.
np, 0.);
369 Vector t_int(ppath_step.
np, 0.);
370 Matrix vmr_list_int(N_species, ppath_step.
np, 0.);
371 Vector p_int(ppath_step.
np, 0.);
376 cloudbox_field_mono_int,
404 propmat_clearsky_agenda,
411 cloudbox_field_mono_int,
428 surface_rtprop_agenda,
443 Tensor6View cloudbox_field_mono,
445 const Index& p_index,
446 const Index& za_index,
447 ConstVectorView za_grid,
449 ConstTensor6View cloudbox_field_mono_old,
450 ConstTensor6View doit_scat_field,
452 const Agenda& propmat_clearsky_agenda,
453 ConstTensor4View vmr_field,
455 const Agenda& ppath_step_agenda,
456 const Numeric& ppath_lmax,
457 const Numeric& ppath_lraytrace,
458 ConstVectorView p_grid,
459 ConstTensor3View z_field,
460 ConstVectorView refellipsoid,
462 ConstTensor3View t_field,
463 ConstVectorView f_grid,
465 const Index& f_index,
467 ConstTensor5View ext_mat_field,
468 ConstTensor4View abs_vec_field,
469 const Agenda& surface_rtprop_agenda,
470 const Index& scat_za_interp,
482 ppath_step.
pos(0, 0) = z_field(p_index, 0, 0);
483 ppath_step.
r[0] = refellipsoid[0] + z_field(p_index, 0, 0);
486 ppath_step.
los(0, 0) = za_grid[za_index];
489 ppath_step.
gp_p[0].idx = p_index;
490 ppath_step.
gp_p[0].fd[0] = 0;
491 ppath_step.
gp_p[0].fd[1] = 1;
498 Vector(1, f_grid[f_index]),
506 if ((cloudbox_limits[0] <= ppath_step.
gp_p[1].idx &&
507 cloudbox_limits[1] > ppath_step.
gp_p[1].idx) ||
508 (cloudbox_limits[1] == ppath_step.
gp_p[1].idx &&
509 abs(ppath_step.
gp_p[1].fd[0]) < 1e-6)) {
511 const Index stokes_dim = cloudbox_field_mono.ncols();
513 const Index N_species = vmr_field.nbooks();
522 Tensor3 ext_mat_int(stokes_dim, stokes_dim, ppath_step.
np, 0.);
523 Matrix abs_vec_int(stokes_dim, ppath_step.
np, 0.);
524 Matrix sca_vec_int(stokes_dim, ppath_step.
np, 0.);
525 Matrix cloudbox_field_mono_int(stokes_dim, ppath_step.
np, 0.);
526 Vector t_int(ppath_step.
np, 0.);
527 Matrix vmr_list_int(N_species, ppath_step.
np, 0.);
528 Vector p_int(ppath_step.
np, 0.);
533 cloudbox_field_mono_int,
540 cloudbox_field_mono_old,
565 propmat_clearsky_agenda,
572 cloudbox_field_mono_int,
587 surface_rtprop_agenda,
600 Tensor6View cloudbox_field_mono,
601 const Index& p_index,
602 const Index& za_index,
603 ConstVectorView za_grid,
605 ConstTensor6View doit_scat_field,
607 const Agenda& propmat_clearsky_agenda,
608 ConstTensor4View vmr_field,
610 ConstVectorView p_grid,
611 ConstTensor3View z_field,
613 ConstTensor3View t_field,
614 ConstVectorView f_grid,
615 const Index& f_index,
617 ConstTensor5View ext_mat_field,
618 ConstTensor4View abs_vec_field,
622 const Index N_species = vmr_field.nbooks();
623 const Index stokes_dim = cloudbox_field_mono.ncols();
624 const Index atmosphere_dim = 1;
625 PropagationMatrix propmat_clearsky;
626 PropagationMatrix ext_mat;
627 StokesVector abs_vec;
628 Matrix matrix_tmp(stokes_dim, stokes_dim);
629 Vector vector_tmp(stokes_dim);
630 Vector rtp_vmr(N_species, 0.);
632 Vector sca_vec_av(stokes_dim, 0);
637 Vector stokes_vec(stokes_dim);
639 if ((p_index == 0) && (za_grid[za_index] > 90)) {
647 if (za_grid[za_index] <= 90.0) {
648 stokes_vec = cloudbox_field_mono(
649 p_index - cloudbox_limits[0] + 1, 0, 0, za_index, 0, joker);
650 Numeric z_field_above = z_field(p_index + 1, 0, 0);
651 Numeric z_field_0 = z_field(p_index, 0, 0);
653 Numeric cos_theta, lstep;
654 if (za_grid[za_index] == 90.0) {
660 cos_theta = cos(za_grid[za_index] *
PI / 180.0);
662 Numeric dz = (z_field_above - z_field_0);
664 lstep = abs(dz / cos_theta);
667 Numeric rtp_temperature =
668 0.5 * (t_field(p_index, 0, 0) + t_field(p_index + 1, 0, 0));
671 Numeric rtp_pressure = 0.5 * (p_grid[p_index] + p_grid[p_index + 1]);
674 for (Index j = 0; j < N_species; j++)
675 rtp_vmr[j] = 0.5 * (vmr_field(j, p_index, 0, 0) +
676 vmr_field(j, p_index + 1, 0, 0));
682 const Vector rtp_mag_dummy(3, 0);
683 const Vector ppath_los_dummy;
685 StokesVector nlte_dummy;
686 ArrayOfPropagationMatrix partial_dummy;
687 ArrayOfStokesVector partial_nlte_dummy;
695 Vector{f_grid[Range(f_index, 1)]},
702 propmat_clearsky_agenda);
706 for (Index k = 0; k < stokes_dim; k++) {
713 p_index - cloudbox_limits[0], 0, 0, za_index, 0, k) +
715 p_index - cloudbox_limits[0] + 1, 0, 0, za_index, 0, k));
721 abs_vec.AddAverageAtPosition(
722 abs_vec_field(p_index - cloudbox_limits[0], 0, 0, joker),
723 abs_vec_field(p_index - cloudbox_limits[0] + 1, 0, 0, joker));
727 ext_mat.AddAverageAtPosition(
728 ext_mat_field(p_index - cloudbox_limits[0], 0, 0, joker, joker),
729 ext_mat_field(p_index - cloudbox_limits[0] + 1, 0, 0, joker, joker));
732 Numeric f = f_grid[f_index];
736 Numeric rte_planck_value =
planck(f, rtp_temperature);
739 if (out3.sufficient_priority()) {
740 vector_tmp = abs_vec.VectorAtPosition();
741 ext_mat.MatrixAtPosition(matrix_tmp);
742 out3 <<
"-----------------------------------------\n";
743 out3 <<
"Input for radiative transfer step \n"
744 <<
"calculation inside"
747 out3 <<
"Stokes vector at intersection point: \n" << stokes_vec <<
"\n";
748 out3 <<
"lstep: ..." << lstep <<
"\n";
749 out3 <<
"------------------------------------------\n";
750 out3 <<
"Averaged coefficients: \n";
751 out3 <<
"Planck function: " << rte_planck_value <<
"\n";
752 out3 <<
"Scattering vector: " << sca_vec_av <<
"\n";
753 out3 <<
"Absorption vector: " << vector_tmp <<
"\n";
754 out3 <<
"Extinction matrix: " << matrix_tmp <<
"\n";
762 Matrix(stokes_dim, stokes_dim),
771 p_index - cloudbox_limits[0], 0, 0, za_index, 0, joker) =
774 if (za_grid[za_index] > 90) {
775 stokes_vec = cloudbox_field_mono(
776 p_index - cloudbox_limits[0] - 1, 0, 0, za_index, 0, joker);
777 Numeric z_field_below = z_field(p_index - 1, 0, 0);
778 Numeric z_field_0 = z_field(p_index, 0, 0);
780 Numeric cos_theta, lstep;
781 if (za_grid[za_index] == 90.0) {
782 cos_theta = cos((za_grid[za_index] - 1) *
PI / 180.);
786 cos_theta = cos(za_grid[za_index] *
PI / 180.0);
788 Numeric dz = (z_field_0 - z_field_below);
789 lstep = abs(dz / cos_theta);
792 Numeric rtp_temperature =
793 0.5 * (t_field(p_index, 0, 0) + t_field(p_index - 1, 0, 0));
796 Numeric rtp_pressure = 0.5 * (p_grid[p_index] + p_grid[p_index - 1]);
800 for (Index k = 0; k < N_species; k++)
801 rtp_vmr[k] = 0.5 * (vmr_field(k, p_index, 0, 0) +
802 vmr_field(k, p_index - 1, 0, 0));
808 const Vector rtp_mag_dummy(3, 0);
809 const Vector ppath_los_dummy;
810 StokesVector nlte_dummy;
811 ArrayOfPropagationMatrix partial_dummy;
812 ArrayOfStokesVector partial_nlte_dummy;
820 Vector{f_grid[Range(f_index, 1)]},
827 propmat_clearsky_agenda);
837 for (Index k = 0; k < stokes_dim; k++) {
844 p_index - cloudbox_limits[0], 0, 0, za_index, 0, k) +
846 p_index - cloudbox_limits[0] - 1, 0, 0, za_index, 0, k));
851 abs_vec.AddAverageAtPosition(
852 abs_vec_field(p_index - cloudbox_limits[0], 0, 0, joker),
853 abs_vec_field(p_index - cloudbox_limits[0] - 1, 0, 0, joker));
857 ext_mat.AddAverageAtPosition(
858 ext_mat_field(p_index - cloudbox_limits[0], 0, 0, joker, joker),
859 ext_mat_field(p_index - cloudbox_limits[0] + 1, 0, 0, joker, joker));
862 Numeric f = f_grid[f_index];
866 Numeric rte_planck_value =
planck(f, rtp_temperature);
869 if (out3.sufficient_priority()) {
870 vector_tmp = abs_vec.VectorAtPosition();
871 ext_mat.MatrixAtPosition(matrix_tmp);
872 out3 <<
"-----------------------------------------\n";
873 out3 <<
"Input for radiative transfer step \n"
874 <<
"calculation inside"
877 out3 <<
"Stokes vector at intersection point: \n" << stokes_vec <<
"\n";
878 out3 <<
"lstep: ..." << lstep <<
"\n";
879 out3 <<
"------------------------------------------\n";
880 out3 <<
"Averaged coefficients: \n";
881 out3 <<
"Planck function: " << rte_planck_value <<
"\n";
882 out3 <<
"Scattering vector: " << sca_vec_av <<
"\n";
883 out3 <<
"Absorption vector: " << vector_tmp <<
"\n";
884 out3 <<
"Extinction matrix: " << matrix_tmp <<
"\n";
892 Matrix(stokes_dim, stokes_dim),
901 p_index - cloudbox_limits[0], 0, 0, za_index, 0, joker) =
908 else if (bkgr == 2) {
912 Vector rte_pos(atmosphere_dim);
913 Numeric z_field_0 = z_field(0, 0, 0);
917 rte_los = za_grid[za_index];
929 "Surface reflections inside cloud box not yet handled.");
1089 Tensor6View cloudbox_field_mono,
1091 const Index& p_index,
1092 const Index& lat_index,
1093 const Index& lon_index,
1094 const Index& za_index,
1095 const Index& aa_index,
1096 ConstVectorView za_grid,
1097 ConstVectorView aa_grid,
1099 ConstTensor6View doit_scat_field,
1101 const Agenda& propmat_clearsky_agenda,
1102 ConstTensor4View vmr_field,
1104 const Agenda& ppath_step_agenda,
1105 const Numeric& ppath_lmax,
1106 const Numeric& ppath_lraytrace,
1107 ConstVectorView p_grid,
1108 ConstVectorView lat_grid,
1109 ConstVectorView lon_grid,
1110 ConstTensor3View z_field,
1111 ConstVectorView refellipsoid,
1113 ConstTensor3View t_field,
1114 ConstVectorView f_grid,
1115 const Index& f_index,
1117 ConstTensor5View ext_mat_field,
1118 ConstTensor4View abs_vec_field,
1124 const Index stokes_dim = cloudbox_field_mono.ncols();
1126 Vector sca_vec_av(stokes_dim, 0);
1127 Vector aa_g(aa_grid.nelem());
1129 for (Index i = 0; i < aa_grid.nelem(); i++)
1130 aa_g[i] = aa_grid[i] - 180.;
1142 ppath_step.
pos(0, 2) = lon_grid[lon_index];
1143 ppath_step.
pos(0, 1) = lat_grid[lat_index];
1144 ppath_step.
pos(0, 0) = z_field(p_index, lat_index, lon_index);
1147 refell2r(refellipsoid, ppath_step.
pos(0, 1)) + ppath_step.
pos(0, 0);
1150 ppath_step.
los(0, 0) = za_grid[za_index];
1151 ppath_step.
los(0, 1) = aa_g[aa_index];
1154 ppath_step.
gp_p[0].idx = p_index;
1155 ppath_step.
gp_p[0].fd[0] = 0.;
1156 ppath_step.
gp_p[0].fd[1] = 1.;
1158 ppath_step.
gp_lat[0].idx = lat_index;
1159 ppath_step.
gp_lat[0].fd[0] = 0.;
1160 ppath_step.
gp_lat[0].fd[1] = 1.;
1162 ppath_step.
gp_lon[0].idx = lon_index;
1163 ppath_step.
gp_lon[0].fd[0] = 0.;
1164 ppath_step.
gp_lon[0].fd[1] = 1.;
1171 Vector(1, f_grid[f_index]),
1188 for (Index i = 0; i < ppath_step.
np; i++) {
1189 cloud_gp_p[i].idx -= cloudbox_limits[0];
1190 cloud_gp_lat[i].idx -= cloudbox_limits[2];
1191 cloud_gp_lon[i].idx -= cloudbox_limits[4];
1193 const Index n1 = cloudbox_limits[1] - cloudbox_limits[0];
1194 const Index n2 = cloudbox_limits[3] - cloudbox_limits[2];
1195 const Index n3 = cloudbox_limits[5] - cloudbox_limits[4];
1203 Matrix itw(ppath_step.
np, 8);
1206 Matrix itw_p(ppath_step.
np, 2);
1213 VectorView los_grid_za = ppath_step.
los(joker, 0);
1214 VectorView los_grid_aa = ppath_step.
los(joker, 1);
1216 for (Index i = 0; i < los_grid_aa.nelem(); i++)
1217 los_grid_aa[i] = los_grid_aa[i] + 180.;
1220 gridpos(gp_za, za_grid, los_grid_za);
1223 gridpos(gp_aa, aa_grid, los_grid_aa);
1225 Matrix itw_p_za(ppath_step.
np, 32);
1227 itw_p_za, cloud_gp_p, cloud_gp_lat, cloud_gp_lon, gp_za, gp_aa);
1235 Tensor3 ext_mat_int(stokes_dim, stokes_dim, ppath_step.
np);
1236 Matrix abs_vec_int(stokes_dim, ppath_step.
np);
1237 Matrix sca_vec_int(stokes_dim, ppath_step.
np, 0.);
1238 Matrix cloudbox_field_mono_int(stokes_dim, ppath_step.
np, 0.);
1239 Vector t_int(ppath_step.
np);
1240 Vector vmr_int(ppath_step.
np);
1241 Vector p_int(ppath_step.
np);
1242 Vector stokes_vec(stokes_dim);
1250 for (Index i = 0; i < stokes_dim; i++) {
1253 out3 <<
"Interpolate ext_mat:\n";
1254 for (Index j = 0; j < stokes_dim; j++) {
1258 interp(ext_mat_int(i, j, joker),
1260 ext_mat_field(joker, joker, joker, i, j),
1269 interp(abs_vec_int(i, joker),
1271 abs_vec_field(joker, joker, joker, i),
1280 out3 <<
"Interpolate doit_scat_field:\n";
1281 interp(sca_vec_int(i, joker),
1283 doit_scat_field(joker, joker, joker, joker, joker, i),
1289 out3 <<
"Interpolate cloudbox_field_mono:\n";
1290 interp(cloudbox_field_mono_int(i, joker),
1292 cloudbox_field_mono(joker, joker, joker, joker, joker, i),
1304 out3 <<
"Interpolate temperature field\n";
1307 t_field(joker, joker, joker),
1316 const Index N_species = vmr_field.nbooks();
1321 Matrix vmr_list_int(N_species, ppath_step.
np);
1323 for (Index i = 0; i < N_species; i++) {
1324 out3 <<
"Interpolate vmr field\n";
1327 vmr_field(i, joker, joker, joker),
1332 vmr_list_int(i, joker) = vmr_int;
1336 itw2p(p_int, p_grid, ppath_step.
gp_p, itw_p);
1338 out3 <<
"Calculate radiative transfer inside cloudbox.\n";
1340 cloudbox_field_mono,
1341 propmat_clearsky_agenda,
1348 cloudbox_field_mono_int,
1364 Tensor6View cloudbox_field_mono,
1366 const Agenda& propmat_clearsky_agenda,
1367 const Ppath& ppath_step,
1368 ConstVectorView t_int,
1369 ConstMatrixView vmr_list_int,
1370 ConstTensor3View ext_mat_int,
1371 ConstMatrixView abs_vec_int,
1372 ConstMatrixView sca_vec_int,
1373 ConstMatrixView cloudbox_field_mono_int,
1374 ConstVectorView p_int,
1376 ConstVectorView f_grid,
1377 const Index& f_index,
1378 const Index& p_index,
1379 const Index& lat_index,
1380 const Index& lon_index,
1381 const Index& za_index,
1382 const Index& aa_index,
1386 const Index N_species = vmr_list_int.nrows();
1387 const Index stokes_dim = cloudbox_field_mono.ncols();
1388 const Index atmosphere_dim = cloudbox_limits.
nelem() / 2;
1390 Vector sca_vec_av(stokes_dim, 0);
1391 Vector stokes_vec(stokes_dim, 0.);
1393 Vector rtp_vmr_local(N_species, 0.);
1396 PropagationMatrix cur_propmat_clearsky;
1397 PropagationMatrix prev_propmat_clearsky;
1399 PropagationMatrix ext_mat_local;
1400 StokesVector abs_vec_local;
1401 Matrix matrix_tmp(stokes_dim, stokes_dim);
1402 Vector vector_tmp(stokes_dim);
1405 stokes_vec = cloudbox_field_mono_int(joker, ppath_step.
np - 1);
1407 for (Index k = ppath_step.
np - 1; k >= 0; k--) {
1410 swap(cur_propmat_clearsky, prev_propmat_clearsky);
1415 const Vector rtp_mag_dummy(3, 0);
1416 const Vector ppath_los_dummy;
1418 StokesVector nlte_dummy;
1419 ArrayOfPropagationMatrix partial_dummy;
1420 ArrayOfStokesVector partial_nlte_dummy;
1422 cur_propmat_clearsky,
1428 Vector{f_grid[Range(f_index, 1)]},
1434 Vector{vmr_list_int(joker, k)},
1435 propmat_clearsky_agenda);
1439 if (k == ppath_step.
np - 1)
continue;
1442 prev_propmat_clearsky += cur_propmat_clearsky;
1443 prev_propmat_clearsky *= 0.5;
1446 ext_mat_local, abs_vec_local, prev_propmat_clearsky);
1448 for (Index i = 0; i < stokes_dim; i++) {
1452 sca_vec_av[i] = 0.5 * (sca_vec_int(i, k) + sca_vec_int(i, k + 1));
1458 abs_vec_local.AddAverageAtPosition(abs_vec_int(joker, k),
1459 abs_vec_int(joker, k + 1));
1464 ext_mat_local.AddAverageAtPosition(ext_mat_int(joker, joker, k),
1465 ext_mat_int(joker, joker, k + 1));
1468 Numeric f = f_grid[f_index];
1472 Numeric rte_planck_value =
planck(f, 0.5 * (t_int[k] + t_int[k + 1]));
1475 Numeric lstep = ppath_step.
lstep[k];
1478 if (out3.sufficient_priority()) {
1479 vector_tmp = abs_vec_local.VectorAtPosition();
1480 ext_mat_local.MatrixAtPosition(matrix_tmp);
1481 out3 <<
"-----------------------------------------\n";
1482 out3 <<
"Input for radiative transfer step \n"
1483 <<
"calculation inside"
1486 out3 <<
"Stokes vector at intersection point: \n" << stokes_vec <<
"\n";
1487 out3 <<
"lstep: ..." << lstep <<
"\n";
1488 out3 <<
"------------------------------------------\n";
1489 out3 <<
"Averaged coefficients: \n";
1490 out3 <<
"Planck function: " << rte_planck_value <<
"\n";
1491 out3 <<
"Scattering vector: " << sca_vec_av <<
"\n";
1492 out3 <<
"Absorption vector: " << vector_tmp <<
"\n";
1493 out3 <<
"Extinction matrix: " << matrix_tmp <<
"\n";
1501 Matrix(stokes_dim, stokes_dim),
1510 if (atmosphere_dim == 1)
1511 cloudbox_field_mono(
1512 p_index - cloudbox_limits[0], 0, 0, za_index, 0, joker) =
1514 else if (atmosphere_dim == 3)
1515 cloudbox_field_mono(p_index - cloudbox_limits[0],
1516 lat_index - cloudbox_limits[2],
1517 lon_index - cloudbox_limits[4],
1520 joker) = stokes_vec;
1525 Tensor6View cloudbox_field_mono,
1527 const Agenda& surface_rtprop_agenda,
1528 ConstVectorView f_grid,
1529 const Index& f_index,
1530 const Index& stokes_dim,
1531 const Ppath& ppath_step,
1533 ConstVectorView za_grid,
1534 const Index& za_index) {
1535 chk_not_empty(
"surface_rtprop_agenda", surface_rtprop_agenda);
1540 Numeric surface_skin_t;
1541 Matrix surface_emission;
1543 Tensor4 surface_rmatrix;
1547 Index np = ppath_step.
np;
1550 rte_pos.resize(ppath_step.
dim);
1551 rte_pos = ppath_step.
pos(np - 1, Range(0, ppath_step.
dim));
1554 rte_los.resize(ppath_step.
los.ncols());
1555 rte_los = ppath_step.
los(np - 1, joker);
1564 Vector(1, f_grid[f_index]),
1567 surface_rtprop_agenda);
1569 iy = surface_emission;
1571 Index nlos = surface_los.nrows();
1574 Vector rtmp(stokes_dim);
1576 for (Index ilos = 0; ilos < nlos; ilos++) {
1582 surface_rmatrix(ilos, 0, joker, joker),
1583 cloudbox_field_mono(cloudbox_limits[0],
1586 (za_grid.nelem() - 1 - za_index),
1589 iy(0, joker) += rtmp;
1592 cloudbox_field_mono(cloudbox_limits[0], 0, 0, za_index, 0, joker) =
1597 const ArrayOfTensor6& acceleration_input,
1598 const Index& accelerated,
1600 const Index N_p = cloudbox_field_mono.nvitrines();
1601 const Index N_za = cloudbox_field_mono.npages();
1604 for (Index i = 0; i < accelerated; ++i) {
1605 ConstMatrixView S1 = acceleration_input[0](joker, 0, 0, joker, 0, i);
1606 ConstMatrixView S2 = acceleration_input[1](joker, 0, 0, joker, 0, i);
1607 ConstMatrixView S3 = acceleration_input[2](joker, 0, 0, joker, 0, i);
1608 ConstMatrixView S4 = acceleration_input[3](joker, 0, 0, joker, 0, i);
1610 ConstMatrixView J = S4;
1639 for (Index p_index = 0; p_index < N_p; ++p_index) {
1640 for (Index za_index = 0; za_index < N_za; ++za_index) {
1641 A1 += Q1(p_index, za_index) * Q1(p_index, za_index) *
1642 J(p_index, za_index);
1643 A2B1 += Q2(p_index, za_index) * Q1(p_index, za_index) *
1644 J(p_index, za_index);
1645 B2 += Q2(p_index, za_index) * Q2(p_index, za_index) *
1646 J(p_index, za_index);
1647 C1 += Q1(p_index, za_index) * Q3(p_index, za_index) *
1648 J(p_index, za_index);
1649 C2 += Q2(p_index, za_index) * Q3(p_index, za_index) *
1650 J(p_index, za_index);
1654 NGA = (C1 * B2 - C2 * A2B1) / (A1 * B2 - A2B1 * A2B1);
1655 NGB = (C2 * A1 - C1 * A2B1) / (A1 * B2 - A2B1 * A2B1);
1657 if (!std::isnan(NGB) && !std::isnan(NGA)) {
1659 for (Index p_index = 0; p_index < N_p; ++p_index) {
1660 for (Index za_index = 0; za_index < N_za; ++za_index) {
1661 Q1(p_index, za_index) = (1 - NGA - NGB) * S4(p_index, za_index) +
1662 NGA * S3(p_index, za_index) +
1663 NGB * S2(p_index, za_index);
1666 cloudbox_field_mono(joker, 0, 0, joker, 0, i) = Q1;
1672 Tensor3View ext_mat_int,
1673 MatrixView abs_vec_int,
1674 MatrixView sca_vec_int,
1675 MatrixView cloudbox_field_mono_int,
1677 MatrixView vmr_list_int,
1680 ConstTensor5View ext_mat_field,
1681 ConstTensor4View abs_vec_field,
1682 ConstTensor6View doit_scat_field,
1683 ConstTensor6View cloudbox_field_mono,
1684 ConstTensor3View t_field,
1685 ConstTensor4View vmr_field,
1686 ConstVectorView p_grid,
1687 const Ppath& ppath_step,
1689 ConstVectorView za_grid,
1690 const Index& scat_za_interp,
1695 const Index stokes_dim = cloudbox_field_mono.ncols();
1703 for (Index i = 0; i < ppath_step.
np; i++)
1704 cloud_gp_p[i].idx -= cloudbox_limits[0];
1707 const Index n1 = cloudbox_limits[1] - cloudbox_limits[0];
1711 Matrix itw(cloud_gp_p.
nelem(), 2);
1717 Vector los_grid{ppath_step.
los(joker, 0)};
1720 gridpos(gp_za, za_grid, los_grid);
1722 Matrix itw_p_za(cloud_gp_p.
nelem(), 4);
1729 for (Index i = 0; i < stokes_dim; i++) {
1732 out3 <<
"Interpolate ext_mat:\n";
1733 for (Index j = 0; j < stokes_dim; j++) {
1737 interp(ext_mat_int(i, j, joker),
1739 ext_mat_field(joker, 0, 0, i, j),
1746 out3 <<
"Interpolate abs_vec:\n";
1748 abs_vec_int(i, joker), itw, abs_vec_field(joker, 0, 0, i), cloud_gp_p);
1754 out3 <<
"Interpolate doit_scat_field and cloudbox_field_mono:\n";
1755 if (scat_za_interp == 0)
1757 interp(sca_vec_int(i, joker),
1759 doit_scat_field(joker, 0, 0, joker, 0, i),
1762 interp(cloudbox_field_mono_int(i, joker),
1764 cloudbox_field_mono(joker, 0, 0, joker, 0, i),
1767 }
else if (scat_za_interp == 1)
1772 Tensor3 sca_vec_int_za(
1773 stokes_dim, ppath_step.
np, za_grid.nelem(), 0.);
1774 Tensor3 cloudbox_field_mono_int_za(
1775 stokes_dim, ppath_step.
np, za_grid.nelem(), 0.);
1776 for (Index za = 0; za < za_grid.nelem(); za++) {
1777 interp(sca_vec_int_za(i, joker, za),
1779 doit_scat_field(joker, 0, 0, za, 0, i),
1781 out3 <<
"Interpolate cloudbox_field_mono:\n";
1782 interp(cloudbox_field_mono_int_za(i, joker, za),
1784 cloudbox_field_mono(joker, 0, 0, za, 0, i),
1787 for (Index ip = 0; ip < ppath_step.
np; ip++) {
1789 sca_vec_int_za(i, ip, joker),
1792 cloudbox_field_mono_int(i, ip) =
1794 cloudbox_field_mono_int_za(i, ip, joker),
1805 out3 <<
"Interpolate temperature field\n";
1806 interp(t_int, itw, t_field(joker, 0, 0), ppath_step.
gp_p);
1811 const Index N_species = vmr_field.nbooks();
1816 Vector vmr_int(ppath_step.
np);
1818 for (Index i_sp = 0; i_sp < N_species; i_sp++) {
1819 out3 <<
"Interpolate vmr field\n";
1820 interp(vmr_int, itw, vmr_field(i_sp, joker, 0, 0), ppath_step.
gp_p);
1821 vmr_list_int(i_sp, joker) = vmr_int;
1826 itw2p(p_int, p_grid, ppath_step.
gp_p, itw);
1830 Vector& za_grid_opt,
1831 Matrix& cloudbox_field_opt,
1833 ConstVectorView za_grid_fine,
1834 ConstTensor6View cloudbox_field_mono,
1836 const Index& scat_za_interp) {
1837 Index N_za = za_grid_fine.nelem();
1839 ARTS_ASSERT(cloudbox_field_mono.npages() == N_za);
1841 Index N_p = cloudbox_field_mono.nvitrines();
1843 Vector i_approx_interp(N_za);
1844 Vector za_reduced(2);
1848 idx.push_back(N_za - 1);
1851 Numeric max_diff = 100;
1854 Matrix itw(za_grid_fine.nelem(), 2);
1857 Vector diff_vec(N_za);
1858 Vector max_diff_za(N_p);
1863 while (max_diff > acc) {
1864 za_reduced.resize(idx.
nelem());
1865 cloudbox_field_opt.resize(N_p, idx.
nelem());
1871 for (Index i_p = 0; i_p < N_p; i_p++) {
1872 for (Index i_za_red = 0; i_za_red < idx.
nelem(); i_za_red++) {
1873 za_reduced[i_za_red] = za_grid_fine[idx[i_za_red]];
1874 cloudbox_field_opt(i_p, i_za_red) =
1875 cloudbox_field_mono(i_p, 0, 0, idx[i_za_red], 0, 0);
1878 gridpos(gp_za, za_reduced, za_grid_fine);
1880 if (scat_za_interp == 0 || idx.
nelem() < 3) {
1882 interp(i_approx_interp, itw, cloudbox_field_opt(i_p, joker), gp_za);
1883 }
else if (scat_za_interp == 1) {
1884 for (Index i_za = 0; i_za < N_za; i_za++) {
1886 cloudbox_field_opt(i_p, joker),
1896 for (Index i_za = 0; i_za < N_za; i_za++) {
1897 diff_vec[i_za] = abs(cloudbox_field_mono(i_p, 0, 0, i_za, 0, 0) -
1898 i_approx_interp[i_za]);
1899 if (diff_vec[i_za] > max_diff_za[i_p]) {
1900 max_diff_za[i_p] = diff_vec[i_za];
1905 if (max_diff_za[i_p] > max_diff_p) {
1906 max_diff_p = max_diff_za[i_p];
1913 max_diff_p / cloudbox_field_mono(ind_p, 0, 0, ind_za[ind_p], 0, 0) * 100.;
1915 idx.push_back(ind_za[ind_p]);
1918 i_sort.resize(idx_unsorted.
nelem());
1921 for (Index i = 0; i < idx_unsorted.
nelem(); i++)
1922 idx[i] = idx_unsorted[i_sort[i]];
1924 za_reduced.resize(idx.
nelem());
1927 za_grid_opt.resize(idx.
nelem());
1928 cloudbox_field_opt.resize(N_p, idx.
nelem());
1929 for (Index i = 0; i < idx.
nelem(); i++) {
1930 za_grid_opt[i] = za_grid_fine[idx[i]];
1931 cloudbox_field_opt(joker, i) = cloudbox_field_mono(joker, 0, 0, idx[i], 0, 0);
1936 Tensor6& doit_scat_field,
1937 const Tensor6& cloudbox_field_mono,
1939 const Agenda& spt_calc_agenda,
1940 const Index& atmosphere_dim,
1941 const Vector& za_grid,
1942 const Vector& aa_grid,
1943 const Tensor4& pnd_field,
1944 const Tensor3& t_field,
1945 const Numeric& norm_error_threshold,
1946 const Index& norm_debug,
1949 "Only 1D is supported here for now");
1955 const Index Nza = za_grid.nelem();
1958 "The range of *za_grid* must [0 180].");
1961 const Index Naa = aa_grid.nelem();
1964 "The range of *aa_grid* must [0 360].");
1967 const Index stokes_dim = doit_scat_field.ncols();
1972 Tensor5 ext_mat_field(cloudbox_limits[1] - cloudbox_limits[0] + 1,
1978 Tensor4 abs_vec_field(
1979 cloudbox_limits[1] - cloudbox_limits[0] + 1, 1, 1, stokes_dim, 0.);
1981 const Index Np = doit_scat_field.nvitrines();
1983 Tensor5 doit_scat_ext_field(doit_scat_field.nvitrines(),
1984 doit_scat_field.nshelves(),
1985 doit_scat_field.nbooks(),
1986 doit_scat_field.npages(),
1987 doit_scat_field.nrows(),
1990 Index aa_index_local = 0;
1993 for (Index za_index_local = 0; za_index_local < Nza;
2009 for (Index p_index = 0;
2010 p_index <= (cloudbox_limits[1] - cloudbox_limits[0]);
2016 for (Index i = 0; i < stokes_dim; i++) {
2017 doit_scat_ext_field(p_index, 0, 0, za_index_local, 0) +=
2018 cloudbox_field_mono(p_index, 0, 0, za_index_local, 0, i) *
2019 (ext_mat_field(p_index, 0, 0, 0, i) -
2020 abs_vec_field(p_index, 0, 0, i));
2025 Numeric corr_max = .0;
2026 Index corr_max_p_index = -1;
2028 for (Index p_index = 0; p_index < Np; p_index++) {
2031 doit_scat_field(p_index, 0, 0, joker, 0, 0), za_grid);
2034 doit_scat_ext_field(p_index, 0, 0, joker, 0), za_grid);
2038 const Numeric corr_factor = scat_ext_int / scat_int;
2042 if (!std::isnan(corr_factor) && !std::isinf(corr_factor)) {
2043 if (abs(corr_factor) > abs(corr_max)) {
2044 corr_max = corr_factor;
2045 corr_max_p_index = p_index;
2048 out0 <<
" DOIT corr_factor: " << 1. - corr_factor
2049 <<
" ( scat_ext_int: " << scat_ext_int
2050 <<
", scat_int: " << scat_int <<
")"
2051 <<
" at p_index " << p_index <<
"\n";
2054 "ERROR: DOIT correction factor exceeds threshold (=",
2055 norm_error_threshold,
"): ", setprecision(4),
2056 1. - corr_factor,
" at p_index ", p_index,
"\n")
2057 if (abs(1. - corr_factor) > norm_error_threshold / 2.) {
2058 out0 <<
" WARNING: DOIT correction factor above threshold/2: "
2059 << 1. - corr_factor <<
" at p_index " << p_index <<
"\n";
2063 doit_scat_field(p_index, 0, 0, joker, 0, joker) *= corr_factor;
2064 }
else if (norm_debug) {
2065 out0 <<
" DOIT corr_factor ignored: " << 1. - corr_factor
2066 <<
" ( scat_ext_int: " << scat_ext_int <<
", scat_int: " << scat_int
2068 <<
" at p_index " << p_index <<
"\n";
2073 if (corr_max_p_index != -1) {
2074 os <<
" Max. DOIT correction factor in this iteration: " << 1. - corr_max
2075 <<
" at p_index " << corr_max_p_index <<
"\n";
2077 os <<
" No DOIT correction performed in this iteration.\n";
Declarations for agendas.
This file contains the definition of Array.
Constants of physical expressions as constexpr.
void ppath_step_agendaExecute(Workspace &ws, Ppath &ppath_step, const Numeric ppath_lmax, const Numeric ppath_lraytrace, const Vector &f_grid, const Agenda &input_agenda)
void spt_calc_agendaExecute(Workspace &ws, ArrayOfPropagationMatrix &ext_mat_spt, ArrayOfStokesVector &abs_vec_spt, const Index scat_p_index, const Index scat_lat_index, const Index scat_lon_index, const Numeric rtp_temperature, const Index za_index, const Index aa_index, const Agenda &input_agenda)
void propmat_clearsky_agendaExecute(Workspace &ws, PropagationMatrix &propmat_clearsky, StokesVector &nlte_source, ArrayOfPropagationMatrix &dpropmat_clearsky_dx, ArrayOfStokesVector &dnlte_source_dx, const ArrayOfRetrievalQuantity &jacobian_quantities, const ArrayOfSpeciesTag &select_abs_species, const Vector &f_grid, const Vector &rtp_mag, const Vector &rtp_los, const Numeric rtp_pressure, const Numeric rtp_temperature, const EnergyLevelMap &rtp_nlte, const Vector &rtp_vmr, const Agenda &input_agenda)
void surface_rtprop_agendaExecute(Workspace &ws, Numeric &surface_skin_t, Matrix &surface_emission, Matrix &surface_los, Tensor4 &surface_rmatrix, const Vector &f_grid, const Vector &rtp_pos, const Vector &rtp_los, const Agenda &input_agenda)
Index nelem() const ARTS_NOEXCEPT
bool is_inside_cloudbox(const Ppath &ppath_step, const ArrayOfIndex &cloudbox_limits, const bool include_boundaries)
Internal cloudbox functions.
void mult(MatrixView C, ConstMatrixView A, const Block &B)
#define ARTS_ASSERT(condition,...)
#define ARTS_USER_ERROR(...)
#define ARTS_USER_ERROR_IF(condition,...)
void za_gridOpt(Vector &za_grid_opt, Matrix &cloudbox_field_opt, ConstVectorView za_grid_fine, ConstTensor6View cloudbox_field_mono, const Numeric &acc, const Index &scat_za_interp)
Optimize the zenith angle grid.
void doit_scat_fieldNormalize(Workspace &ws, Tensor6 &doit_scat_field, const Tensor6 &cloudbox_field_mono, const ArrayOfIndex &cloudbox_limits, const Agenda &spt_calc_agenda, const Index &atmosphere_dim, const Vector &za_grid, const Vector &aa_grid, const Tensor4 &pnd_field, const Tensor3 &t_field, const Numeric &norm_error_threshold, const Index &norm_debug, const Verbosity &verbosity)
Normalization of scattered field.
constexpr Numeric RAD2DEG
void cloud_fieldsCalc(Workspace &ws, Tensor5View ext_mat_field, Tensor4View abs_vec_field, const Agenda &spt_calc_agenda, const Index &za_index, const Index &aa_index, const ArrayOfIndex &cloudbox_limits, ConstTensor3View t_field, ConstTensor4View pnd_field, const Verbosity &verbosity)
Calculate ext_mat, abs_vec for all points inside the cloudbox for one.
void cloud_ppath_update1D_noseq(Workspace &ws, Tensor6View cloudbox_field_mono, const Index &p_index, const Index &za_index, ConstVectorView za_grid, const ArrayOfIndex &cloudbox_limits, ConstTensor6View cloudbox_field_mono_old, ConstTensor6View doit_scat_field, const Agenda &propmat_clearsky_agenda, ConstTensor4View vmr_field, const Agenda &ppath_step_agenda, const Numeric &ppath_lmax, const Numeric &ppath_lraytrace, ConstVectorView p_grid, ConstTensor3View z_field, ConstVectorView refellipsoid, ConstTensor3View t_field, ConstVectorView f_grid, const Index &f_index, ConstTensor5View ext_mat_field, ConstTensor4View abs_vec_field, const Agenda &surface_rtprop_agenda, const Index &scat_za_interp, const Verbosity &verbosity)
Calculation of radiation field along a propagation path step for specified zenith direction and press...
void cloud_RT_no_background(Workspace &ws, Tensor6View cloudbox_field_mono, const Agenda &propmat_clearsky_agenda, const Ppath &ppath_step, ConstVectorView t_int, ConstMatrixView vmr_list_int, ConstTensor3View ext_mat_int, ConstMatrixView abs_vec_int, ConstMatrixView sca_vec_int, ConstMatrixView cloudbox_field_mono_int, ConstVectorView p_int, const ArrayOfIndex &cloudbox_limits, ConstVectorView f_grid, const Index &f_index, const Index &p_index, const Index &lat_index, const Index &lon_index, const Index &za_index, const Index &aa_index, const Verbosity &verbosity)
Calculates RT in the cloudbox (1D)
void cloudbox_field_ngAcceleration(Tensor6 &cloudbox_field_mono, const ArrayOfTensor6 &acceleration_input, const Index &accelerated, const Verbosity &)
Convergence acceleration.
void interp_cloud_coeff1D(Tensor3View ext_mat_int, MatrixView abs_vec_int, MatrixView sca_vec_int, MatrixView cloudbox_field_mono_int, VectorView t_int, MatrixView vmr_list_int, VectorView p_int, ConstTensor5View ext_mat_field, ConstTensor4View abs_vec_field, ConstTensor6View doit_scat_field, ConstTensor6View cloudbox_field_mono, ConstTensor3View t_field, ConstTensor4View vmr_field, ConstVectorView p_grid, const Ppath &ppath_step, const ArrayOfIndex &cloudbox_limits, ConstVectorView za_grid, const Index &scat_za_interp, const Verbosity &verbosity)
Interpolate all inputs of the VRTE on a propagation path step.
void rte_step_doit_replacement(VectorView stokes_vec, MatrixView trans_mat, const PropagationMatrix &ext_mat_av, const StokesVector &abs_vec_av, ConstVectorView sca_vec_av, const Numeric &lstep, const Numeric &rtp_planck_value, const bool &trans_is_precalc)
Solves monochromatic VRTE for an atmospheric slab with constant conditions.
void cloud_RT_surface(Workspace &ws, Tensor6View cloudbox_field_mono, const Agenda &surface_rtprop_agenda, ConstVectorView f_grid, const Index &f_index, const Index &stokes_dim, const Ppath &ppath_step, const ArrayOfIndex &cloudbox_limits, ConstVectorView za_grid, const Index &za_index)
Calculates RT in the cloudbox.
void cloud_ppath_update3D(Workspace &ws, Tensor6View cloudbox_field_mono, const Index &p_index, const Index &lat_index, const Index &lon_index, const Index &za_index, const Index &aa_index, ConstVectorView za_grid, ConstVectorView aa_grid, const ArrayOfIndex &cloudbox_limits, ConstTensor6View doit_scat_field, const Agenda &propmat_clearsky_agenda, ConstTensor4View vmr_field, const Agenda &ppath_step_agenda, const Numeric &ppath_lmax, const Numeric &ppath_lraytrace, ConstVectorView p_grid, ConstVectorView lat_grid, ConstVectorView lon_grid, ConstTensor3View z_field, ConstVectorView refellipsoid, ConstTensor3View t_field, ConstVectorView f_grid, const Index &f_index, ConstTensor5View ext_mat_field, ConstTensor4View abs_vec_field, const Index &, const Verbosity &verbosity)
Radiative transfer calculation along a path inside the cloudbox (3D).
void cloud_ppath_update1D_planeparallel(Workspace &ws, Tensor6View cloudbox_field_mono, const Index &p_index, const Index &za_index, ConstVectorView za_grid, const ArrayOfIndex &cloudbox_limits, ConstTensor6View doit_scat_field, const Agenda &propmat_clearsky_agenda, ConstTensor4View vmr_field, ConstVectorView p_grid, ConstTensor3View z_field, ConstTensor3View t_field, ConstVectorView f_grid, const Index &f_index, ConstTensor5View ext_mat_field, ConstTensor4View abs_vec_field, const Verbosity &verbosity)
Radiative transfer calculation inside cloudbox for planeparallel case.
void cloud_ppath_update1D(Workspace &ws, Tensor6View cloudbox_field_mono, const Index &p_index, const Index &za_index, ConstVectorView za_grid, const ArrayOfIndex &cloudbox_limits, ConstTensor6View doit_scat_field, const Agenda &propmat_clearsky_agenda, ConstTensor4View vmr_field, const Agenda &ppath_step_agenda, const Numeric &ppath_lmax, const Numeric &ppath_lraytrace, ConstVectorView p_grid, ConstTensor3View z_field, ConstVectorView refellipsoid, ConstTensor3View t_field, ConstVectorView f_grid, const Index &f_index, ConstTensor5View ext_mat_field, ConstTensor4View abs_vec_field, const Agenda &surface_rtprop_agenda, const Index &scat_za_interp, const Verbosity &verbosity)
Calculates radiation field along a propagation path step for specified zenith direction and pressure ...
Radiative transfer in cloudbox.
Numeric refell2r(ConstVectorView refellipsoid, const Numeric &lat)
refell2r
void gridpos(ArrayOfGridPos &gp, ConstVectorView old_grid, ConstVectorView new_grid, const Numeric &extpolfac)
Set up a grid position Array.
void gridpos_upperend_check(GridPos &gp, const Index &ie)
gridpos_upperend_check
void interpweights(VectorView itw, const GridPos &tc)
Red 1D interpolation weights.
Numeric interp_poly(ConstVectorView x, ConstVectorView y, const Numeric &x_i, const GridPos &gp)
Polynomial interpolation.
Numeric interp(ConstVectorView itw, ConstVectorView a, const GridPos &tc)
Red 1D Interpolate.
Array< RetrievalQuantity > ArrayOfRetrievalQuantity
void opt_prop_bulkCalc(PropagationMatrix &ext_mat, StokesVector &abs_vec, const ArrayOfPropagationMatrix &ext_mat_spt, const ArrayOfStokesVector &abs_vec_spt, const Tensor4 &pnd_field, const Index &scat_p_index, const Index &scat_lat_index, const Index &scat_lon_index, const Verbosity &)
WORKSPACE METHOD: opt_prop_bulkCalc.
Numeric AngIntegrate_trapezoid(ConstMatrixView Integrand, ConstVectorView za_grid, ConstVectorView aa_grid)
AngIntegrate_trapezoid.
Declarations having to do with the four output streams.
constexpr Numeric pi
The following mathematical constants are generated in python Decimal package by the code:
constexpr auto rad2deg(auto x) noexcept
Converts radians to degrees.
void opt_prop_sum_propmat_clearsky(PropagationMatrix &ext_mat, StokesVector &abs_vec, const PropagationMatrix &propmat_clearsky)
Get optical properties from propmat_clearsky.
Numeric planck(const Numeric &f, const Numeric &t)
planck
This file contains declerations of functions of physical character.
Index ppath_what_background(const Ppath &ppath)
Returns the case number for the radiative background.
void ppath_init_structure(Ppath &ppath, const Index &atmosphere_dim, const Index &np)
Initiates a Ppath structure to hold the given number of points.
Propagation path structure and functions.
Declaration of functions in rte.cc.
Contains sorting routines.
void get_sorted_indexes(ArrayOfIndex &sorted, const T &data)
get_sorted_indexes
void itw2p(VectorView p_values, ConstVectorView p_grid, const ArrayOfGridPos &gp, ConstMatrixView itw)
Converts interpolation weights to pressures.
Header file for special_interp.cc.
The structure to describe a propagation path and releated quantities.
Matrix los
Line-of-sight at each ppath point.
ArrayOfGridPos gp_lon
Index position with respect to the longitude grid.
Index np
Number of points describing the ppath.
Matrix pos
The distance between start pos and the last position in pos.
ArrayOfGridPos gp_lat
Index position with respect to the latitude grid.
Vector lstep
The length between ppath points.
Vector r
Radius of each ppath point.
ArrayOfGridPos gp_p
Index position with respect to the pressure grid.
Index dim
Atmospheric dimensionality.
This file contains basic functions to handle XML data files.