31 Tensor7& cloudbox_field,
32 ArrayOfMatrix& disort_aux,
34 const Index& atmfields_checked,
35 const Index& atmgeom_checked,
36 const Index& scat_data_checked,
37 const Index& cloudbox_checked,
38 const Index& cloudbox_on,
40 const Agenda& propmat_clearsky_agenda,
41 const Agenda& gas_scattering_agenda,
42 const Index& atmosphere_dim,
43 const Tensor4& pnd_field,
44 const Tensor3& t_field,
45 const Tensor3& z_field,
46 const Tensor4& vmr_field,
48 const Vector& lat_true,
49 const Vector& lon_true,
50 const Vector& refellipsoid,
54 const Vector& za_grid,
55 const Vector& aa_grid,
56 const Index& stokes_dim,
57 const Matrix& z_surface,
58 const Numeric& surface_skin_t,
59 const Vector& surface_scalar_reflectivity,
60 const Index& gas_scattering_do,
63 const Index& nstreams,
65 const Index& only_tro,
66 const Index& cdisort_quiet,
67 const Index& emission,
68 const Index& intensity_correction,
73 out0 <<
" Cloudbox is off, DISORT calculation will be skipped.\n";
91 "The simulation setup contains ",
94 "Disort can handle only one sun.")
98 "aa_grid has a size of 0.\n",
99 "aa_grid must have at least a size of one.")
104 Vector cloudboxtop_pos(3);
105 Index sun_on = suns_do;
106 Numeric scale_factor;
107 Index N_aa=aa_grid.nelem();
111 Vector lon_grid{lon_true[0] - 0.1, lon_true[0] + 0.1};
112 Vector lat_grid{lat_true[0] - 0.1, lat_true[0] + 0.1};
115 sun_pos = {suns[0].distance, suns[0].latitude, suns[0].longitude};
119 z_field(cloudbox_limits[1], 0, 0), lat_true[0], lon_true[0]};
136 if (sun_rte_los[0] >= 90) {
143 out0 <<
"Sun is below the horizon\n";
144 out0 <<
"Sun is ignored.\n";
145 out0 <<
"cloudbox_field will have no azimuthal dependency!\n";
149 Numeric R_TOA =
refell2r(refellipsoid,
154 Numeric R_Sun2CloudboxTop;
165 scale_factor=suns[0].radius*suns[0].radius/
166 (suns[0].radius*suns[0].radius+R_Sun2CloudboxTop*R_Sun2CloudboxTop);
172 out3 <<
"Disort calculation encountered aa_grid size larger than 1 in a case when it\n";
173 out3 <<
"does not use aa_grid. Calculations are performed as if there is no aa_grid.\n";
187 Vector albedo(f_grid.nelem(), 0.);
191 albedo, btemp, f_grid, surface_skin_t, surface_scalar_reflectivity);
198 z_field(joker, 0, 0),
200 t_field(joker, 0, 0),
201 vmr_field(joker, joker, 0, 0),
202 pnd_field(joker, joker, 0, 0),
205 propmat_clearsky_agenda,
206 gas_scattering_agenda,
222 intensity_correction,
230 Tensor7& cloudbox_field,
231 ArrayOfMatrix& disort_aux,
233 const Index& atmfields_checked,
234 const Index& atmgeom_checked,
235 const Index& scat_data_checked,
236 const Index& cloudbox_checked,
237 const Index& cloudbox_on,
239 const Agenda& propmat_clearsky_agenda,
240 const Agenda& surface_rtprop_agenda,
241 const Agenda& gas_scattering_agenda,
242 const Index& atmosphere_dim,
243 const Tensor4& pnd_field,
244 const Tensor3& t_field,
245 const Tensor3& z_field,
246 const Tensor4& vmr_field,
247 const Vector& p_grid,
248 const Vector& lat_true,
249 const Vector& lon_true,
250 const Vector& refellipsoid,
253 const Vector& f_grid,
254 const Vector& za_grid,
255 const Vector& aa_grid,
256 const Index& stokes_dim,
257 const Matrix& z_surface,
258 const Index& gas_scattering_do,
259 const Index& suns_do,
261 const Index& nstreams,
263 const Index& only_tro,
264 const Index& cdisort_quiet,
265 const Index& emission,
266 const Index& intensity_correction,
267 const Numeric& inc_angle,
273 out0 <<
" Cloudbox is off, DISORT calculation will be skipped.\n";
291 "The simulation setup contains ",
294 "Disort can handle only one sun.")
298 "aa_grid has a size of 0.\n",
299 "aa_grid must have at least a size of one.")
304 Vector cloudboxtop_pos(3);
305 Index sun_on = suns_do;
306 Numeric scale_factor;
307 Index N_aa=aa_grid.nelem();
311 Vector lon_grid{lon_true[0] - 0.1, lon_true[0] + 0.1};
312 Vector lat_grid{lat_true[0] - 0.1, lat_true[0] + 0.1};
315 sun_pos = {suns[0].distance, suns[0].latitude, suns[0].longitude};
319 z_field(cloudbox_limits[1], 0, 0), lat_true[0], lon_true[0]};
336 if (sun_rte_los[0] >= 90) {
343 out0 <<
"Sun is below the horizon\n";
344 out0 <<
"Sun is ignored.\n";
345 out0 <<
"cloudbox_field will have no azimuthal dependency!\n";
350 Numeric R_TOA =
refell2r(refellipsoid,
355 Numeric R_Sun2CloudboxTop;
366 scale_factor=suns[0].radius*suns[0].radius/
367 (suns[0].radius*suns[0].radius+R_Sun2CloudboxTop*R_Sun2CloudboxTop);
373 out3 <<
"Disort calculation encountered aa_grid size larger than 1 in a case when it\n";
374 out3 <<
"does not use aa_grid. Calculations are performed as if there is no aa_grid.\n";
388 Vector albedo(f_grid.nelem(), 0.);
391 if (inc_angle<0 || inc_angle>90) {
395 surface_rtprop_agenda,
404 surface_rtprop_agenda,
415 z_field(joker, 0, 0),
417 t_field(joker, 0, 0),
418 vmr_field(joker, joker, 0, 0),
419 pnd_field(joker, joker, 0, 0),
422 propmat_clearsky_agenda,
423 gas_scattering_agenda,
439 intensity_correction,
447 Tensor7& spectral_radiance_field,
448 ArrayOfMatrix& disort_aux,
450 const Index& atmfields_checked,
451 const Index& atmgeom_checked,
452 const Agenda& propmat_clearsky_agenda,
453 const Agenda& gas_scattering_agenda,
454 const Index& atmosphere_dim,
455 const Tensor3& t_field,
456 const Tensor3& z_field,
457 const Tensor4& vmr_field,
458 const Vector& p_grid,
459 const Vector& lat_true,
460 const Vector& lon_true,
461 const Vector& refellipsoid,
463 const Vector& f_grid,
464 const Vector& za_grid,
465 const Vector& aa_grid,
466 const Index& stokes_dim,
467 const Matrix& z_surface,
468 const Numeric& surface_skin_t,
469 const Vector& surface_scalar_reflectivity,
470 const Index& gas_scattering_do,
471 const Index& suns_do,
473 const Index& nstreams,
474 const Index& cdisort_quiet,
475 const Index& emission,
476 const Index& intensity_correction,
479 if (atmosphere_dim != 1)
481 "For running DISORT, atmospheric dimensionality "
487 const Index cloudbox_checked = 1;
500 ArrayOfTensor4 dpnd_field_dx;
502 const Index scat_data_checked = 1;
513 Matrix optical_depth_dummy;
517 spectral_radiance_field,
526 propmat_clearsky_agenda,
527 gas_scattering_agenda,
545 surface_scalar_reflectivity,
554 intensity_correction,
562 Tensor5& spectral_irradiance_field,
563 ArrayOfMatrix& disort_aux,
565 const Index& atmfields_checked,
566 const Index& atmgeom_checked,
567 const Index& scat_data_checked,
568 const Agenda& propmat_clearsky_agenda,
569 const Agenda& gas_scattering_agenda,
570 const Index& atmosphere_dim,
571 const Tensor4& pnd_field,
572 const Tensor3& t_field,
573 const Tensor3& z_field,
574 const Tensor4& vmr_field,
575 const Vector& p_grid,
576 const Vector& lat_true,
577 const Vector& lon_true,
578 const Vector& refellipsoid,
581 const Vector& f_grid,
582 const Index& stokes_dim,
583 const Matrix& z_surface,
584 const Numeric& surface_skin_t,
585 const Vector& surface_scalar_reflectivity,
586 const Index& gas_scattering_do,
587 const Index& suns_do,
589 const Index& nstreams,
591 const Index& only_tro,
592 const Index& cdisort_quiet,
593 const Index& emission,
594 const Index& intensity_correction,
609 const Index Nf = f_grid.nelem();
610 const Index Np_cloud = cloudbox_limits[1] - cloudbox_limits[0] + 1;
622 "The simulation setup contains ",
625 "Disort can handle only one sun.")
630 Vector cloudboxtop_pos(3);
631 Index sun_on = suns_do;
632 Numeric scale_factor;
634 spectral_irradiance_field.resize(Nf, Np_cloud, 1, 1, 2);
635 spectral_irradiance_field = NAN;
639 Vector lon_grid{lon_true[0] - 0.1, lon_true[0] + 0.1};
640 Vector lat_grid{lat_true[0] - 0.1, lat_true[0] + 0.1};
643 sun_pos = {suns[0].distance, suns[0].latitude, suns[0].longitude};
647 z_field(cloudbox_limits[1], 0, 0), lat_true[0], lon_true[0]};
664 if (sun_rte_los[0] >= 90) {
668 out0 <<
"Sun is below the horizon\n";
669 out0 <<
"Sun is ignored.\n";
673 Numeric R_TOA =
refell2r(refellipsoid,
678 Numeric R_Sun2CloudboxTop;
689 scale_factor=suns[0].radius*suns[0].radius/
690 (suns[0].radius*suns[0].radius+R_Sun2CloudboxTop*R_Sun2CloudboxTop);
694 Vector albedo(f_grid.nelem(), 0.);
698 albedo, btemp, f_grid, surface_skin_t, surface_scalar_reflectivity);
701 spectral_irradiance_field,
705 z_field(joker, 0, 0),
707 t_field(joker, 0, 0),
708 vmr_field(joker, joker, 0, 0),
709 pnd_field(joker, joker, 0, 0),
712 propmat_clearsky_agenda,
713 gas_scattering_agenda,
727 intensity_correction,
This file contains the definition of Array.
Index nelem() const ARTS_NOEXCEPT
#define ARTS_USER_ERROR_IF(condition,...)
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)
surf_albedoCalc
void run_cdisort(Workspace &ws, Tensor7 &cloudbox_field, ArrayOfMatrix &disort_aux, 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 ArrayOfSun &suns, const Agenda &propmat_clearsky_agenda, const Agenda &gas_scattering_agenda, const ArrayOfIndex &cloudbox_limits, const Numeric &surface_skin_t, const Vector &surface_scalar_reflectivity, ConstVectorView za_grid, ConstVectorView aa_grid, ConstVectorView sun_rte_los, const Index &gas_scattering_do, const Index &suns_do, const ArrayOfString &disort_aux_vars, const Numeric &scale_factor, const Index &nstreams, const Index &Npfct, const Index &only_tro, const Index &quiet, const Index &emission, const Index &intensity_correction, const Verbosity &verbosity)
Calculate doit_i_field with Disort including a sun source.
void run_cdisort_flux(Workspace &ws, Tensor5 &spectral_irradiance_field, ArrayOfMatrix &disort_aux, 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 ArrayOfSun &suns, const Agenda &propmat_clearsky_agenda, const Agenda &gas_scattering_agenda, const ArrayOfIndex &cloudbox_limits, const Numeric &surface_skin_t, const Vector &surface_scalar_reflectivity, ConstVectorView sun_rte_los, const Index &gas_scattering_do, const Index &suns_do, const ArrayOfString &disort_aux_vars, const Numeric &scale_factor, const Index &nstreams, const Index &Npfct, const Index &only_tro, const Index &quiet, const Index &emission, const Index &intensity_correction, const Verbosity &verbosity)
Calculate spectral_irradiance_field with Disort including a sun source.
void get_disortsurf_props(Vector &albedo, Numeric &btemp, ConstVectorView f_grid, const Numeric &surface_skin_t, ConstVectorView surface_scalar_reflectivity)
get_disortsurf_props.
void surf_albedoCalcSingleAngle(Workspace &ws, VectorView albedo, Numeric &btemp, const Agenda &surface_rtprop_agenda, ConstVectorView f_grid, const Numeric &surf_alt, const Numeric &inc_angle)
surf_albedoCalcSingleAngle
void check_disort_irradiance_input(const Index &atmfields_checked, const Index &atmgeom_checked, const Index &scat_data_checked, const Index &atmosphere_dim, const Index &stokes_dim, const ArrayOfArrayOfSingleScatteringData &scat_data, const Index &nstreams)
check_disort_input.
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)
check_disort_input.
void init_ifield(Tensor7 &cloudbox_field, const Vector &f_grid, const ArrayOfIndex &cloudbox_limits, const Index &n_za, const Index &n_aa, const Index &stokes_dim)
init_ifield.
Functions for disort interface.
void distance3D(Numeric &l, const Numeric &r1, const Numeric &lat1, const Numeric &lon1, const Numeric &r2, const Numeric &lat2, const Numeric &lon2)
distance3D
Numeric refell2r(ConstVectorView refellipsoid, const Numeric &lat)
refell2r
Array< RetrievalQuantity > ArrayOfRetrievalQuantity
void cloudboxSetFullAtm(Index &cloudbox_on, ArrayOfIndex &cloudbox_limits, const Index &atmosphere_dim, const Vector &p_grid, const Vector &lat_grid, const Vector &lon_grid, const Index &fullfull, const Verbosity &)
WORKSPACE METHOD: cloudboxSetFullAtm.
void pnd_fieldZero(Tensor4 &pnd_field, ArrayOfTensor4 &dpnd_field_dx, ArrayOfArrayOfSingleScatteringData &scat_data, const Index &atmosphere_dim, const Vector &f_grid, const ArrayOfIndex &cloudbox_limits, const ArrayOfRetrievalQuantity &jacobian_quantities, const Verbosity &)
WORKSPACE METHOD: pnd_fieldZero.
void spectral_irradiance_fieldDisort(Workspace &ws, Tensor5 &spectral_irradiance_field, ArrayOfMatrix &disort_aux, const Index &atmfields_checked, const Index &atmgeom_checked, const Index &scat_data_checked, const Agenda &propmat_clearsky_agenda, const Agenda &gas_scattering_agenda, const Index &atmosphere_dim, const Tensor4 &pnd_field, const Tensor3 &t_field, const Tensor3 &z_field, const Tensor4 &vmr_field, const Vector &p_grid, const Vector &lat_true, const Vector &lon_true, const Vector &refellipsoid, const ArrayOfArrayOfSingleScatteringData &scat_data, const ArrayOfSun &suns, const Vector &f_grid, const Index &stokes_dim, const Matrix &z_surface, const Numeric &surface_skin_t, const Vector &surface_scalar_reflectivity, const Index &gas_scattering_do, const Index &suns_do, const ArrayOfString &disort_aux_vars, const Index &nstreams, const Index &Npfct, const Index &only_tro, const Index &cdisort_quiet, const Index &emission, const Index &intensity_correction, const Verbosity &verbosity)
WORKSPACE METHOD: spectral_irradiance_fieldDisort.
void cloudbox_fieldDisortWithARTSSurface(Workspace &ws, Tensor7 &cloudbox_field, ArrayOfMatrix &disort_aux, const Index &atmfields_checked, const Index &atmgeom_checked, const Index &scat_data_checked, const Index &cloudbox_checked, const Index &cloudbox_on, const ArrayOfIndex &cloudbox_limits, const Agenda &propmat_clearsky_agenda, const Agenda &surface_rtprop_agenda, const Agenda &gas_scattering_agenda, const Index &atmosphere_dim, const Tensor4 &pnd_field, const Tensor3 &t_field, const Tensor3 &z_field, const Tensor4 &vmr_field, const Vector &p_grid, const Vector &lat_true, const Vector &lon_true, const Vector &refellipsoid, const ArrayOfArrayOfSingleScatteringData &scat_data, const ArrayOfSun &suns, const Vector &f_grid, const Vector &za_grid, const Vector &aa_grid, const Index &stokes_dim, const Matrix &z_surface, const Index &gas_scattering_do, const Index &suns_do, const ArrayOfString &disort_aux_vars, const Index &nstreams, const Index &Npfct, const Index &only_tro, const Index &cdisort_quiet, const Index &emission, const Index &intensity_correction, const Numeric &inc_angle, const Verbosity &verbosity)
WORKSPACE METHOD: cloudbox_fieldDisortWithARTSSurface.
void cloudbox_fieldDisort(Workspace &ws, Tensor7 &cloudbox_field, ArrayOfMatrix &disort_aux, const Index &atmfields_checked, const Index &atmgeom_checked, const Index &scat_data_checked, const Index &cloudbox_checked, const Index &cloudbox_on, const ArrayOfIndex &cloudbox_limits, const Agenda &propmat_clearsky_agenda, const Agenda &gas_scattering_agenda, const Index &atmosphere_dim, const Tensor4 &pnd_field, const Tensor3 &t_field, const Tensor3 &z_field, const Tensor4 &vmr_field, const Vector &p_grid, const Vector &lat_true, const Vector &lon_true, const Vector &refellipsoid, const ArrayOfArrayOfSingleScatteringData &scat_data, const ArrayOfSun &suns, const Vector &f_grid, const Vector &za_grid, const Vector &aa_grid, const Index &stokes_dim, const Matrix &z_surface, const Numeric &surface_skin_t, const Vector &surface_scalar_reflectivity, const Index &gas_scattering_do, const Index &suns_do, const ArrayOfString &disort_aux_vars, const Index &nstreams, const Index &Npfct, const Index &only_tro, const Index &cdisort_quiet, const Index &emission, const Index &intensity_correction, const Verbosity &verbosity)
WORKSPACE METHOD: cloudbox_fieldDisort.
void spectral_radiance_fieldDisortClearsky(Workspace &ws, Tensor7 &spectral_radiance_field, ArrayOfMatrix &disort_aux, const Index &atmfields_checked, const Index &atmgeom_checked, const Agenda &propmat_clearsky_agenda, const Agenda &gas_scattering_agenda, const Index &atmosphere_dim, const Tensor3 &t_field, const Tensor3 &z_field, const Tensor4 &vmr_field, const Vector &p_grid, const Vector &lat_true, const Vector &lon_true, const Vector &refellipsoid, const ArrayOfSun &suns, const Vector &f_grid, const Vector &za_grid, const Vector &aa_grid, const Index &stokes_dim, const Matrix &z_surface, const Numeric &surface_skin_t, const Vector &surface_scalar_reflectivity, const Index &gas_scattering_do, const Index &suns_do, const ArrayOfString &disort_aux_vars, const Index &nstreams, const Index &cdisort_quiet, const Index &emission, const Index &intensity_correction, const Verbosity &verbosity)
WORKSPACE METHOD: spectral_radiance_fieldDisortClearsky.
Template functions for general supergeneric ws methods.
void rte_losGeometricFromRtePosToRtePos2(Vector &rte_los, const Index &atmosphere_dim, const Vector &lat_grid, const Vector &lon_grid, const Vector &refellipsoid, const Vector &rte_pos, const Vector &rte_pos2, const Verbosity &)
WORKSPACE METHOD: rte_losGeometricFromRtePosToRtePos2.
Declarations having to do with the four output streams.