Go to the documentation of this file.
66 const Index& nstreams,
67 const String& pfct_method) {
70 "Cloudbox is off, no scattering calculations to be"
76 "The atmospheric fields must be flagged to have "
77 "passed a consistency check (atmfields_checked=1).");
80 "The atmospheric geometry must be flagged to have "
81 "passed a consistency check (atmgeom_checked=1).");
84 "The cloudbox must be flagged to have "
85 "passed a consistency check (cloudbox_checked=1).");
88 "The scat_data must be flagged to have "
89 "passed a consistency check (scat_data_checked=1).");
93 "For running DISORT, atmospheric dimensionality "
96 if (stokes_dim < 0 || stokes_dim > 1)
98 "For running DISORT, the dimension of stokes vector "
103 "*cloudbox_limits* is a vector which contains the"
104 "upper and lower limit of the cloud for all "
105 "atmospheric dimensions. So its dimension must"
106 "be 2 x *atmosphere_dim*");
110 os <<
"DISORT calculations currently only possible with "
111 <<
"lower cloudbox limit\n"
112 <<
"at 0th atmospheric level "
113 <<
"(assumes surface there, ignoring z_surface).\n";
114 throw runtime_error(os.str());
119 "No single scattering data present.\n"
120 "See documentation of WSV *scat_data* for options to "
121 "make single scattering data available.\n");
128 if (nstreams / 2 * 2 != nstreams) {
130 os <<
"DISORT requires an even number of streams, but yours is " << nstreams
132 throw runtime_error(os.str());
146 os <<
"We require size of za_grid to be >= 20, to ensure a\n"
147 <<
"reasonable interpolation of the calculated cloudbox field.\n"
148 <<
"Note that for DISORT additional computation costs for\n"
149 <<
"larger numbers of angles are negligible.";
150 throw runtime_error(os.str());
154 throw runtime_error(
"The range of *za_grid* must [0 180].");
157 throw runtime_error(
"*za_grid* must be increasing.");
162 throw runtime_error(
"*za_grid* is not allowed to contain the value 90");
167 bool all_totrand =
true;
173 os <<
"DISORT can only handle scattering elements of type "
178 throw runtime_error(os.str());
181 if (pfct_method !=
"interpolate") {
186 bool ident_anggrid =
true;
194 scat_data[i_ss][i_se].za_grid[1] != data_za_grid[1] ||
195 scat_data[i_ss][i_se].za_grid[ndza - 2] != data_za_grid[ndza - 2])
196 ident_anggrid =
false;
197 if (!ident_anggrid) {
199 os <<
"ARTS-DISORT currently supports varying angular grids of\n"
200 <<
"scattering data for different scattering elements only for\n"
201 <<
"pfct_method = \"interpolate.\"";
202 throw runtime_error(os.str());
231 if (surface_skin_t < 0. || surface_skin_t > 1000.) {
233 os <<
"Surface temperature has been set or derived as " << btemp <<
" K,\n"
234 <<
"which is not considered a meaningful value.\n"
235 <<
"For surface method 'L', *surface_skin_t* needs to\n"
236 <<
"be set and passed explicitly. Maybe you didn't do this?";
237 throw runtime_error(os.str());
245 os <<
"The number of elements in *surface_scalar_reflectivity*\n"
246 <<
"should match length of *f_grid* or be 1."
247 <<
"\n length of *f_grid* : " <<
f_grid.nelem()
248 <<
"\n length of *surface_scalar_reflectivity* : "
250 throw runtime_error(os.str());
256 "All values in *surface_scalar_reflectivity*"
257 " must be inside [0,1].");
278 assert(ext_bulk_gas.
ncols() == Np);
285 const Vector rtp_mag_dummy(3, 0);
286 const Vector ppath_los_dummy;
292 for (
Index ip = 0; ip < Np; ip++) {
295 for (
auto& pm : propmat_clearsky_local) {
299 propmat_clearsky_local,
302 partial_source_dummy,
311 vmr_profiles(
joker, ip),
315 for (
Index ias = 1; ias < propmat_clearsky_local.nelem(); ias++)
316 propmat_bulk += propmat_clearsky_local[ias];
317 ext_bulk_gas(
joker, ip) += propmat_bulk.
Kjj();
333 assert(ext_bulk_par.
nrows() == nf);
334 assert(abs_bulk_par.
nrows() == nf);
335 assert(ext_bulk_par.
ncols() == Np);
336 assert(abs_bulk_par.
ncols() == Np);
344 Matrix dir_array(1, 2, 0.);
385 bool pf = (abs_vec_bulk.
nbooks() != 1);
386 for (
Index ip = 0; ip < Np_cloud; ip++)
390 ext_mat_bulk(f_this, ip, 0, 0, 0);
392 abs_vec_bulk(f_this, ip, 0, 0);
405 assert(dtauc.
nrows() == nf);
406 assert(ssalb.
nrows() == nf);
407 assert(dtauc.
ncols() == Np - 1);
408 assert(ssalb.
ncols() == Np - 1);
414 for (
Index ip = 0; ip < Np - 1; ip++)
425 ssalb(
f_index, Np - 2 - ip) = (ext -
abs) / ext;
428 dtauc(
f_index, Np - 2 - ip) = ext * (z_profile[ip + 1] - z_profile[ip]);
434 const Index& Npfct) {
435 const Index min_nang = 3;
439 Index this_ss = 0, this_se = 0;
448 nang =
scat_data[i_ss][i_se].za_grid.nelem();
452 pfct_angs =
scat_data[this_ss][this_se].za_grid;
453 }
else if (Npfct < min_nang) {
455 os <<
"Number of requested angular grid points (Npfct=" << Npfct
456 <<
") is insufficient.\n"
457 <<
"At least " << min_nang <<
" points required.\n";
458 throw runtime_error(os.str());
478 Matrix idir_array(1, 2, 0.);
480 Matrix pdir_array(nang, 2, 0.);
481 pdir_array(
joker, 0) = pfct_angs;
510 pha_mat_Bulk(pha_mat_bulk, ptype_bulk, pha_mat_ssbulk, ptype_ssbulk);
526 assert(pfct_bulk_par.
npages() == nf);
527 assert(pfct_bulk_par.
nrows() == Np - 1);
528 assert(pfct_bulk_par.
ncols() == nang);
543 for (
Index ia = 0; ia < nang; ia++)
544 pfct_bulk_par(
f_index, Np - 2 - ip, ia) +=
545 pha_bulk_par(
f_index, ip, ia) + pha_bulk_par(
f_index, ip + 1, ia);
554 const Index& Nlegendre) {
559 assert(nang == pfct_angs.
nelem());
561 assert(pmom.
npages() == nf);
562 assert(pmom.
nrows() == nlyr);
563 assert(pmom.
ncols() == Nlegendre);
571 Vector u(nang), adu(nang - 1);
572 Tensor3 px(nang - 1, Nlegendre, 2, 0.);
573 u[0] = cos(pfct_angs[0] *
PI / 180.);
575 for (
Index ia = 1; ia < nang; ia++) {
576 u[ia] = cos(pfct_angs[ia] *
PI / 180.);
577 adu[ia - 1] =
abs(u[ia] - u[ia - 1]);
578 px(ia - 1, 1, 0) = u[ia - 1];
579 px(ia - 1, 1, 1) = u[ia];
580 for (
Index l = 2; l < Nlegendre; l++) {
582 px(ia - 1, l, 0) = (2 * dl - 1) / dl * u[ia - 1] * px(ia - 1, l - 1, 0) -
583 (dl - 1) / dl * px(ia - 1, l - 2, 0);
584 px(ia - 1, l, 1) = (2 * dl - 1) / dl * u[ia] * px(ia - 1, l - 1, 1) -
585 (dl - 1) / dl * px(ia - 1, l - 2, 1);
589 for (
Index il = 0; il < nlyr; il++)
590 if (pfct_bulk_par(
joker, il, 0).sum() != 0.)
592 if (pfct_bulk_par(
f_index, il, 0) != 0) {
597 for (
Index ia = 0; ia < nang - 1; ia++)
598 pint += 0.5 * adu[ia] * (pfct[ia] + pfct[ia + 1]);
600 if (
abs(pint / 2. - 1.) > pfct_threshold) {
602 os <<
"Phase function normalization deviates from expected value by\n"
603 << 1e2 * pint / 2. - 1e2 <<
"(allowed: " << pfct_threshold * 1e2
605 <<
"Occurs at layer #" << il <<
" and frequency #" <<
f_index
607 <<
"Something is wrong with your scattering data. Check!\n";
608 throw runtime_error(os.str());
615 for (
Index ia = 0; ia < nang - 1; ia++) {
617 for (
Index l = 1; l < Nlegendre; l++)
620 (px(ia, l, 0) * pfct[ia] + px(ia, l, 1) * pfct[ia + 1]);
633 #define MAX_WARNINGS 100
638 static int warning_limit = FALSE, num_warnings = 0;
640 if (type == DS_ERROR) {
642 out0 <<
" ******* ERROR >>>>>> " << messag <<
"\n";
646 if (warning_limit)
return;
650 out1 <<
" ******* WARNING >>>>>> " << messag <<
"\n";
653 out1 <<
" >>>>>> TOO MANY WARNING MESSAGES -- They will no longer be "
654 "printed <<<<<<<\n\n";
655 warning_limit = TRUE;
665 const int maxmsg = 50;
666 static int nummsg = 0;
669 if (quiet != QUIET) {
672 out1 <<
" **** Input variable " << varnam <<
" in error ****\n";
673 if (nummsg == maxmsg) {
674 c_errmsg(
"Too many input errors. Aborting...", DS_ERROR);
683 if (quiet != QUIET) {
686 out1 <<
" **** Symbolic dimension " << dimnam
687 <<
" should be increased to at least " << minval <<
" ****\n";
722 for (;
z_surface >= z_profile[ifirst + 1]; ifirst++) {
726 Range ind(ifirst, np);
730 vmr = vmr_profiles(
joker, ind);
739 t[0] =
interp(itw, t, gp[0]);
740 for (
int i = 0; i < vmr.
nrows(); i++) {
747 itw2p(p[0], p, gp, itw2);
751 cboxlims[0] -= ifirst;
752 cboxlims[1] -= ifirst;
756 ncboxremoved = ifirst - cboxlims[0];
759 ind =
Range(ncboxremoved, cboxlims[1] + 1);
760 pnd = pnd_profiles(
joker, ind);
762 for (
int i = 0; i < pnd.
nrows(); i++) {
784 const Index& nstreams,
820 ds.flag.prnt[0] = FALSE;
821 ds.flag.prnt[1] = FALSE;
822 ds.flag.prnt[2] = FALSE;
823 ds.flag.prnt[3] = FALSE;
824 ds.flag.prnt[4] = TRUE;
826 ds.flag.usrtau = FALSE;
827 ds.flag.usrang = TRUE;
828 ds.flag.spher = FALSE;
829 ds.flag.general_source = FALSE;
830 ds.flag.output_uum = FALSE;
832 ds.nlyr =
static_cast<int>(p.
nelem() - 1);
834 ds.flag.brdf_type = BRDF_NONE;
836 ds.flag.ibcnd = GENERAL_BC;
837 ds.flag.usrang = TRUE;
838 ds.flag.planck = TRUE;
839 ds.flag.onlyfl = FALSE;
840 ds.flag.lamber = TRUE;
841 ds.flag.quiet = FALSE;
842 ds.flag.intensity_correction = TRUE;
843 ds.flag.old_intensity_correction = TRUE;
845 ds.nstr =
static_cast<int>(nstreams);
849 ds.numu =
static_cast<int>(
za_grid.nelem());
851 Index Nlegendre = nstreams + 1;
854 c_disort_state_alloc(&ds);
855 c_disort_out_alloc(&ds, &out);
866 for (
Index i = 0; i <= ds.nlyr; i++) ds.temper[i] = t[ds.nlyr - i];
868 Matrix ext_bulk_gas(nf, ds.nlyr + 1);
870 Matrix ext_bulk_par(nf, ds.nlyr + 1), abs_bulk_par(nf, ds.nlyr + 1);
875 Matrix dtauc(nf, ds.nlyr);
877 Matrix ssalb(nf, ds.nlyr);
878 get_dtauc_ssalb(dtauc, ssalb, ext_bulk_gas, ext_bulk_par, abs_bulk_par, z);
881 for (
Index i = 0; i < ds.numu; i++) ds.umu[i] = -cos(
za_grid[i] *
PI / 180);
908 Tensor3 pha_bulk_par(nf_ssd, ds.nlyr + 1, nang);
910 Tensor3 pfct_bulk_par(nf_ssd, ds.nlyr, nang);
911 get_pfct(pfct_bulk_par, pha_bulk_par, ext_bulk_par, abs_bulk_par, cboxlims);
914 Tensor3 pmom(nf_ssd, ds.nlyr, Nlegendre, 0.);
915 get_pmom(pmom, pfct_bulk_par, pfct_angs, Nlegendre);
918 sprintf(ds.header,
"ARTS Calc f_index = %ld",
f_index);
920 std::memcpy(ds.dtauc,
923 std::memcpy(ds.ssalb,
929 ds.wvnmhi += ds.wvnmhi * 1e-7;
930 ds.wvnmlo -= ds.wvnmlo * 1e-7;
940 for (
Index j = 0; j < ds.numu; j++) {
941 for (
Index k = cboxlims[1] - cboxlims[0]; k >= 0; k--) {
943 out.uu[ds.numu * (ds.nlyr - k - cboxlims[0]) + j] /
948 for (
Index k = ncboxremoved - 1; k >= 0; k--) {
956 c_disort_out_free(&ds, &out);
957 c_disort_state_free(&ds);
1005 while (frza < scat_za_grid.
nelem() && scat_za_grid[frza] < 90.) frza++;
1006 if (frza == scat_za_grid.
nelem()) {
1008 os <<
"No upwelling direction found in scat_za_grid.\n";
1009 throw runtime_error(os.str());
1011 const Index nrza = scat_za_grid.
nelem() - frza;
1014 Matrix dir_refl_coeff(nrza, nf, 0.);
1021 for (
Index rza = 0; rza < nrza; rza++) {
1029 out2 <<
"Doing reflected dir #" << rza <<
" at " <<
rtp_los[0] <<
" degs\n";
1047 os <<
"Something went wrong.\n"
1048 <<
" *surface_rtprop_agenda* returned different surface_skin_t\n"
1049 <<
" for different LOS.\n";
1050 throw runtime_error(os.str());
1054 dir_refl_coeff(rza,
f_index) =
1057 out2 <<
" directional albedos[f_grid] = " << dir_refl_coeff(rza,
joker)
1061 if (btemp < 0. || btemp > 1000.) {
1063 os <<
"Surface temperature has been derived as " << btemp <<
" K,\n"
1064 <<
"which is not considered a meaningful value.\n";
1065 throw runtime_error(os.str());
1072 Vector surf_int_grid(nrza + 1);
1079 os <<
"Looks like scat_za_grid contains the 90deg direction,\n"
1080 <<
"which it shouldn't for running Disort.\n";
1081 throw runtime_error(os.str());
1083 Numeric za_extrapol = (scat_za_grid[frza] - 90.) /
1084 (scat_za_grid[frza + 1] - scat_za_grid[frza]);
1085 const Numeric ok_extrapol = 0.5;
1086 if ((za_extrapol - ok_extrapol) > 1e-6) {
1088 os <<
"Extrapolation range from shallowest scat_za_grid point\n"
1089 <<
"to horizon is too big.\n"
1090 <<
" Allowed extrapolation factor is 0.5.\n Yours is " << za_extrapol
1091 <<
", which is " << za_extrapol - 0.5 <<
" too big.\n";
1092 throw runtime_error(os.str());
1095 scat_za_grid[scat_za_grid.
nelem() - 1], 180., 1e-6)) {
1097 os <<
"Looks like last point in scat_za_grid is not 180deg.\n";
1098 throw runtime_error(os.str());
1101 surf_int_grid[0] = 90.;
1102 surf_int_grid[nrza] = 180.;
1103 for (
Index rza = 1; rza < nrza; rza++)
1104 surf_int_grid[rza] =
1105 0.5 * (scat_za_grid[frza + rza - 1] + scat_za_grid[frza + rza]);
1109 for (
Index rza = 0; rza < nrza; rza++) {
1114 0.5 * (cos(2. * surf_int_grid[rza + 1]) - cos(2. * surf_int_grid[rza]));
1120 dir_refl_coeff(rza,
joker) *=
w;
1128 <<
" GHz, ending up with albedo=" << albedo[
f_index] <<
"\n";
1131 os <<
"Something went wrong: Albedo must be inside [0,1],\n"
1132 <<
" but is not at freq #" <<
f_index <<
" , where it is "
1134 throw runtime_error(os.str());
Index atmosphere_dim(Workspace &ws) noexcept
bool is_same_within_epsilon(const Numeric &a, const Numeric &b, const Numeric &epsilon)
Check, if two numbers agree within a given epsilon.
void get_pmom(Tensor3View pmom, ConstTensor3View pfct_bulk_par, ConstVectorView pfct_angs, const Index &Nlegendre)
get_pmom
int c_write_bad_var(int quiet, const char *varnam)
Verbosity enabled replacement for the original cdisort function.
Vector rtp_los(Workspace &ws) noexcept
void run_cdisort(Workspace &ws, Tensor7 &cloudbox_field, ConstVectorView f_grid, ConstVectorView p_grid, ConstVectorView z_profile, const Numeric &z_surface, ConstVectorView t_profile, ConstMatrixView vmr_profiles, ConstMatrixView pnd_profiles, const ArrayOfArrayOfSingleScatteringData &scat_data, const Agenda &propmat_clearsky_agenda, const ArrayOfIndex &cloudbox_limits, const Numeric &surface_skin_t, const Vector &surface_scalar_reflectivity, ConstVectorView za_grid, const Index &nstreams, const Index &Npfct, const Index &quiet, const Verbosity &verbosity)
Calculate doit_i_feild with Disort.
Index atmgeom_checked(Workspace &ws) noexcept
Complex w(Complex z) noexcept
The Faddeeva function.
void get_disortsurf_props(Vector &albedo, Numeric &btemp, ConstVectorView f_grid, const Numeric &surface_skin_t, ConstVectorView surface_scalar_reflectivity)
get_disortsurf_props.
int c_write_too_small_dim(int quiet, const char *dimnam, int minval)
Verbosity enabled replacement for the original cdisort function.
void gridpos(ArrayOfGridPos &gp, ConstVectorView old_grid, ConstVectorView new_grid, const Numeric &extpolfac)
Set up a grid position Array.
void itw2p(VectorView p_values, ConstVectorView p_grid, const ArrayOfGridPos &gp, ConstMatrixView itw)
Converts interpolation weights to pressures.
void c_errmsg(const char *messag, int type)
Verbosity enabled replacement for the original cdisort function.
Tensor4 surface_rmatrix(Workspace &ws) noexcept
Header file for interpolation.cc.
Numeric interp(ConstVectorView itw, ConstVectorView a, const GridPos &tc)
Red 1D Interpolate.
Verbosity verbosity(Workspace &ws) noexcept
void check_disort_input(const Index &cloudbox_on, const Index &atmfields_checked, const Index &atmgeom_checked, const Index &cloudbox_checked, const Index &scat_data_checked, const Index &atmosphere_dim, const Index &stokes_dim, const ArrayOfIndex &cloudbox_limits, const ArrayOfArrayOfSingleScatteringData &scat_data, ConstVectorView za_grid, const Index &nstreams, const String &pfct_method)
check_disort_input.
Index f_index(Workspace &ws) noexcept
ArrayOfIndex cloudbox_limits(Workspace &ws) noexcept
void get_angs(Vector &pfct_angs, const ArrayOfArrayOfSingleScatteringData &scat_data, const Index &Npfct)
get_angs.
void opt_prop_ScatSpecBulk(ArrayOfTensor5 &ext_mat, ArrayOfTensor4 &abs_vec, ArrayOfIndex &ptype, const ArrayOfArrayOfTensor5 &ext_mat_se, const ArrayOfArrayOfTensor4 &abs_vec_se, const ArrayOfArrayOfIndex &ptypes_se, ConstMatrixView pnds, ConstMatrixView t_ok)
Scattering species bulk extinction and absorption.
void get_gasoptprop(Workspace &ws, MatrixView ext_bulk_gas, const Agenda &propmat_clearsky_agenda, ConstVectorView t_profile, ConstMatrixView vmr_profiles, ConstVectorView p_grid, ConstVectorView f_grid)
get_gasoptprop.
Index stokes_dim(Workspace &ws) noexcept
void surf_albedoCalc(Workspace &ws, VectorView albedo, Numeric &btemp, const Agenda &surface_rtprop_agenda, ConstVectorView f_grid, ConstVectorView scat_za_grid, const Numeric &surf_alt, const Verbosity &verbosity)
Surface albed.
Index nrows() const
Returns the number of rows.
Array< RetrievalQuantity > ArrayOfRetrievalQuantity
void reduced_1datm(Vector &p, Vector &z, Vector &t, Matrix &vmr, Matrix &pnd, ArrayOfIndex &cboxlims, Index &ncboxremoved, ConstVectorView p_grid, ConstVectorView z_profile, const Numeric &z_surface, ConstVectorView t_profile, ConstMatrixView vmr_profiles, ConstMatrixView pnd_profiles, const ArrayOfIndex &cloudbox_limits)
reduced_1datm
This file contains the definition of Array.
void get_pfct(Tensor3 &pfct_bulk_par, ConstTensor3View &pha_bulk_par, ConstMatrixView ext_bulk_par, ConstMatrixView abs_bulk_par, const ArrayOfIndex &cloudbox_limits)
get_pfct.
Agenda surface_rtprop_agenda(Workspace &ws) noexcept
Index npages() const
Returns the number of pages.
void opt_prop_NScatElems(ArrayOfArrayOfTensor5 &ext_mat, ArrayOfArrayOfTensor4 &abs_vec, ArrayOfArrayOfIndex &ptypes, Matrix &t_ok, const ArrayOfArrayOfSingleScatteringData &scat_data, const Index &stokes_dim, const Vector &T_array, const Matrix &dir_array, const Index &f_index, const Index &t_interp_order)
Extinction and absorption from all scattering elements.
This can be used to make arrays out of anything.
Index nelem(const Lines &l)
Number of lines.
String PTypeToString(const PType &ptype)
Convert particle type enum value to String.
void get_dtauc_ssalb(MatrixView dtauc, MatrixView ssalb, ConstMatrixView ext_bulk_gas, ConstMatrixView ext_bulk_par, ConstMatrixView abs_bulk_par, ConstVectorView z_profile)
get_dtauc_ssalb
Declarations for agendas.
void pha_mat_Bulk(Tensor6 &pha_mat, Index &ptype, const ArrayOfTensor6 &pha_mat_ss, const ArrayOfIndex &ptypes_ss)
Scattering species bulk phase matrix.
Declarations having to do with the four output streams.
void get_parZ(Tensor3 &pha_bulk_par, const ArrayOfArrayOfSingleScatteringData &scat_data, ConstMatrixView pnd_profiles, ConstVectorView t_profile, ConstVectorView pfct_angs, const ArrayOfIndex &cloudbox_limits)
get_parZ.
Index ncols() const
Returns the number of columns.
Index nelem() const
Returns the number of elements.
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 atmfields_checked(Workspace &ws) noexcept
Vector p_grid(Workspace &ws) noexcept
NUMERIC Numeric
The type to use for all floating point numbers.
void propmat_clearsky_agendaExecute(Workspace &ws, ArrayOfPropagationMatrix &propmat_clearsky, ArrayOfStokesVector &nlte_source, ArrayOfPropagationMatrix &dpropmat_clearsky_dx, ArrayOfStokesVector &dnlte_dx_source, ArrayOfStokesVector &nlte_dsource_dx, const ArrayOfRetrievalQuantity &jacobian_quantities, 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)
Vector surface_scalar_reflectivity(Workspace &ws) noexcept
void pha_mat_NScatElems(ArrayOfArrayOfTensor6 &pha_mat, ArrayOfArrayOfIndex &ptypes, Matrix &t_ok, const ArrayOfArrayOfSingleScatteringData &scat_data, const Index &stokes_dim, const Vector &T_array, const Matrix &pdir_array, const Matrix &idir_array, const Index &f_index, const Index &t_interp_order)
Phase matrices from all scattering elements.
Index nbooks() const
Returns the number of books.
Vector f_grid(Workspace &ws) noexcept
ArrayOfArrayOfSingleScatteringData scat_data(Workspace &ws) noexcept
void get_paroptprop(MatrixView ext_bulk_par, MatrixView abs_bulk_par, const ArrayOfArrayOfSingleScatteringData &scat_data, ConstMatrixView pnd_profiles, ConstVectorView t_profile, ConstVectorView DEBUG_ONLY(p_grid), const ArrayOfIndex &cloudbox_limits, ConstVectorView f_grid)
Vector za_grid(Workspace &ws) noexcept
Matrix surface_emission(Workspace &ws) noexcept
Index nrows() const
Returns the number of rows.
void nlinspace(Vector &x, const Numeric start, const Numeric stop, const Index n)
nlinspace
A constant view of a Matrix.
const Numeric SPEED_OF_LIGHT
Index scat_data_checked(Workspace &ws) noexcept
thread_local Verbosity disort_verbosity
bool is_increasing(ConstVectorView x)
Checks if a vector is sorted and strictly increasing.
Header file for logic.cc.
void opt_prop_Bulk(Tensor5 &ext_mat, Tensor4 &abs_vec, Index &ptype, const ArrayOfTensor5 &ext_mat_ss, const ArrayOfTensor4 &abs_vec_ss, const ArrayOfIndex &ptypes_ss)
one-line descript
Index ncols() const
Returns the number of columns.
Functions for disort interface.
Declaration of functions in rte.cc.
A constant view of a Tensor3.
VectorView Kjj(const Index iz=0, const Index ia=0)
Vector view to diagonal elements.
void init_ifield(Tensor7 &cloudbox_field, const Vector &f_grid, const ArrayOfIndex &cloudbox_limits, const Index &nang, const Index &stokes_dim)
init_ifield.
Tensor7 cloudbox_field(Workspace &ws) noexcept
Agenda propmat_clearsky_agenda(Workspace &ws) noexcept
INDEX Index
The type to use for all integer numbers and indices.
void arts_exit(int status)
This is the exit function of ARTS.
Numeric surface_skin_t(Workspace &ws) noexcept
Matrix surface_los(Workspace &ws) noexcept
A constant view of a Vector.
Index cloudbox_checked(Workspace &ws) noexcept
void interpweights(VectorView itw, const GridPos &tc)
Red 1D interpolation weights.
Matrix z_surface(Workspace &ws) noexcept
Vector rtp_pos(Workspace &ws) noexcept
void pha_mat_ScatSpecBulk(ArrayOfTensor6 &pha_mat, ArrayOfIndex &ptype, const ArrayOfArrayOfTensor6 &pha_mat_se, const ArrayOfArrayOfIndex &ptypes_se, ConstMatrixView pnds, ConstMatrixView t_ok)
Scattering species bulk phase matrices.
Index cloudbox_on(Workspace &ws) noexcept
This file contains basic functions to handle XML data files.
const Numeric PLANCK_CONST
const Numeric COSMIC_BG_TEMP