46 const Agenda& forloop_agenda,
54 for (Index i = start; i <= stop; i += step) {
55 out1 <<
" Executing for loop body, index: " << i <<
"\n";
63 ArrayOfVector& ybatch,
64 ArrayOfArrayOfVector& ybatch_aux,
65 ArrayOfMatrix& ybatch_jacobians,
67 const Index& ybatch_start,
68 const Index& ybatch_n,
69 const Agenda& ybatch_calc_agenda,
75 Index first_ybatch_index = 0;
78 bool do_abort =
false;
90 Index job_counter = 0;
93 ybatch.resize(ybatch_n);
94 ybatch_aux.resize(ybatch_n);
95 ybatch_jacobians.resize(ybatch_n);
96 for (Index i = 0; i < ybatch_n; i++) {
98 ybatch_aux[i].resize(0);
99 ybatch_jacobians[i].resize(0, 0);
107#pragma omp parallel for schedule(dynamic) if (!arts_omp_in_parallel() && \
108 ybatch_n > 1) firstprivate(wss)
109 for (Index ybatch_index = first_ybatch_index; ybatch_index < ybatch_n;
113 if (do_abort)
continue;
114#pragma omp critical(ybatchCalc_job_counter)
115 { l_job_counter = ++job_counter; }
119 os <<
" Job " << l_job_counter <<
" of " << ybatch_n <<
", Index "
120 << ybatch_start + ybatch_index <<
", Thread-Id "
134 ybatch_start + ybatch_index,
138#pragma omp critical(ybatchCalc_assign_y)
139 ybatch[ybatch_index] = y;
140#pragma omp critical(ybatchCalc_assign_y_aux)
141 ybatch_aux[ybatch_index] = y_aux;
144 const Index Knr = jacobian.nrows();
145 const Index Knc = jacobian.ncols();
147 if (Knr != 0 || Knc != 0) {
148 if (Knr != y.nelem()) {
150 os <<
"First dimension of Jacobian must have same length as the measurement *y*.\n"
151 <<
"Length of *y*: " << y.nelem() <<
"\n"
152 <<
"Dimensions of *jacobian*: (" << Knr <<
", " << Knc
158#pragma omp critical(ybatchCalc_setabort)
161 throw runtime_error(os.str());
164 ybatch_jacobians[ybatch_index] = jacobian;
170 }
catch (
const std::exception& e) {
171 if (robust && !do_abort) {
173 os <<
"WARNING! Job at ybatch_index " << ybatch_start + ybatch_index
175 <<
"y Vector in output variable ybatch will be empty for this job.\n"
176 <<
"The runtime error produced was:\n"
182#pragma omp critical(ybatchCalc_setabort)
186 os <<
" Job at ybatch_index " << ybatch_start + ybatch_index
187 <<
" failed. Aborting...\n";
191 os <<
"Run-time error at ybatch_index " << ybatch_start + ybatch_index
194#pragma omp critical(ybatchCalc_push_fail_msg)
195 fail_msg.push_back(os.str());
200 if (fail_msg.
nelem()) {
203 if (!do_abort) os <<
"\nError messages from failed batch cases:\n";
204 for (ArrayOfString::const_iterator it = fail_msg.begin();
205 it != fail_msg.end();
210 throw runtime_error(os.str());
219 ArrayOfVector& ybatch,
222 const Agenda& met_profile_calc_agenda,
223 const Vector& f_grid,
224 const Matrix& met_amsu_data,
225 const Matrix& sensor_pos,
226 const Vector& refellipsoid,
227 const Vector& lat_grid,
228 const Vector& lon_grid,
229 const Index& atmosphere_dim,
232 const Index& nelem_p_grid,
233 const String& met_profile_path,
234 const String& met_profile_pnd_path,
246 Index no_profiles = met_amsu_data.nrows();
252 vmr_field_raw.resize(abs_species.
nelem());
259 pnd_field_raw.resize(N_se);
263 ConstVectorView sat_za_from_data = met_amsu_data(Range(joker), 3);
265 sensor_los.resize(1, 1);
269 ConstVectorView lat = met_amsu_data(Range(joker), 0);
270 ConstVectorView lon = met_amsu_data(Range(joker), 1);
272 z_surface.resize(1, 1);
275 y.resize(f_grid.nelem());
278 ybatch.resize(no_profiles);
281 for (Index i = 0; i < no_profiles; ++i) {
282 ostringstream lat_os, lon_os;
285 if (lat[i] < 0) lat_prec--;
286 if (abs(lat[i]) >= 10) {
288 if (abs(lat[i]) >= 100) lat_prec--;
291 lat_os.setf(ios::showpoint | ios::fixed);
292 lat_os << setprecision((
int)lat_prec) << lat[i];
295 if (lon[i] < 0) lon_prec--;
296 if (abs(lon[i]) >= 10) {
298 if (abs(lon[i]) >= 100) lon_prec--;
300 lon_os.setf(ios::showpoint | ios::fixed);
301 lon_os << setprecision((
int)lon_prec) << lon[i];
304 180.0 - (asin(refellipsoid[0] * sin(sat_za_from_data[i] *
DEG2RAD) /
310 ".lon_" + lon_os.str() +
".t.xml",
316 ".lon_" + lon_os.str() +
".z.xml",
322 ".lon_" + lon_os.str() +
".H2O.xml",
332 lat_os.str() +
".lon_" + lon_os.str() +
".pnd15.xml",
339 z_surface(0, 0) = z_field_raw.
data(0, 0, 0);
353 vmr_field_raw[1].resize(vmr_field_raw[0]);
354 vmr_field_raw[1].copy_grids(vmr_field_raw[0]);
355 vmr_field_raw[1] = 0.782;
361 vmr_field_raw[2].resize(vmr_field_raw[0]);
362 vmr_field_raw[2].copy_grids(vmr_field_raw[0]);
363 vmr_field_raw[2] = 0.209;
365 const Vector& tfr_p_grid =
368 Index N_p = tfr_p_grid.nelem();
372 p_grid, nelem_p_grid, tfr_p_grid[0], tfr_p_grid[N_p - 1], verbosity);
378 Numeric cl_grid_min, cl_grid_max;
382 cl_grid_min = tfr_p_grid[0];
385 Index level_counter = 0;
388 for (Index ip = 0; ip < N_p; ++ip) {
392 if (pnd_field_raw[0].data(ip, 0, 0) > 0.001) {
398 cl_grid_max = tfr_p_grid[ip + 1];
403 cloudbox_limits.resize(atmosphere_dim * 2);
408 if (level_counter == 0) {
409 cl_grid_max = p_grid[1];
445 met_profile_calc_agenda);
457 ArrayOfVector& ybatch,
460 const Agenda& met_profile_calc_agenda,
461 const Vector& f_grid,
462 const Matrix& met_amsu_data,
463 const Matrix& sensor_pos,
464 const Vector& refellipsoid,
466 const Index& nelem_p_grid,
467 const String& met_profile_path,
475 Index cloudbox_on = 0;
479 Index no_profiles = met_amsu_data.nrows();
485 vmr_field_raw.resize(abs_species.
nelem());
487 y.resize(f_grid.nelem());
488 ybatch.resize(no_profiles);
490 Vector sat_za_from_profile;
491 sat_za_from_profile = met_amsu_data(Range(joker), 3);
494 sensor_los.resize(1, 1);
497 lat = met_amsu_data(Range(joker), 0);
498 lon = met_amsu_data(Range(joker), 1);
503 z_surface.resize(1, 1);
504 for (Index i = 0; i < no_profiles; ++i) {
505 ostringstream lat_os, lon_os;
508 if (lat[i] < 0) lat_prec--;
509 if (abs(lat[i]) >= 10) {
511 if (abs(lat[i]) >= 100) lat_prec--;
514 lat_os.setf(ios::showpoint | ios::fixed);
515 lat_os << setprecision((
int)lat_prec) << lat[i];
518 if (lon[i] < 0) lon_prec--;
519 if (abs(lon[i]) >= 10) {
521 if (abs(lon[i]) >= 100) lon_prec--;
523 lon_os.setf(ios::showpoint | ios::fixed);
524 lon_os << setprecision((
int)lon_prec) << lon[i];
525 cout << lat_os.str() << endl;
526 cout << lon_os.str() << endl;
528 sat_za = sat_za_from_profile[i];
530 sensor_los(Range(joker), 0) =
532 (asin(refellipsoid[0] * sin(sat_za *
PI / 180.) / sensor_pos(0, 0))) *
534 cout <<
"sensor_los" << sat_za_from_profile[i] << endl;
535 cout <<
"sensor_los" << sat_za << endl;
536 cout <<
"sensor_los" << sensor_los << endl;
540 ".lon_" + lon_os.str() +
".t.xml",
545 ".lon_" + lon_os.str() +
".z.xml",
553 ".lon_" + lon_os.str() +
".H2O.xml",
560 <<
"--------------------------------------------------------------------------"
563 << met_profile_path +
"profile.lat_" + lat_os.str() +
".lon_" +
565 <<
"is executed now" << endl;
567 <<
"--------------------------------------------------------------------------"
574 z_surface(0, 0) = z_field_raw.
data(0, 0, 0);
575 cout <<
"z_surface" << z_surface << endl;
576 const Vector& tfr_p_grid =
578 Index N_p = tfr_p_grid.nelem();
580 vmr_field_raw[0] = vmr_field_raw_h2o;
586 vmr_field_raw[1].resize(vmr_field_raw[0]);
587 vmr_field_raw[1].copy_grids(vmr_field_raw[0]);
588 vmr_field_raw[1].data(joker, joker, joker) = 0.782;
594 vmr_field_raw[2].resize(vmr_field_raw[0]);
595 vmr_field_raw[2].copy_grids(vmr_field_raw[0]);
596 vmr_field_raw[2].data(joker, joker, joker) = 0.209;
605 p_grid, nelem_p_grid, tfr_p_grid[0], tfr_p_grid[N_p - 1], verbosity);
606 cout <<
"t_field_raw[0](0,0,0)" << tfr_p_grid[0] << endl;
607 cout <<
"t_field_raw[0](N_p -1,0,0)" << tfr_p_grid[N_p - 1] << endl;
622 met_profile_calc_agenda);
632 ArrayOfTensor7& dobatch_cloudbox_field,
633 ArrayOfTensor5& dobatch_radiance_field,
634 ArrayOfTensor4& dobatch_irradiance_field,
635 ArrayOfTensor5& dobatch_spectral_irradiance_field,
636 const Index& ybatch_start,
637 const Index& ybatch_n,
638 const Agenda& dobatch_calc_agenda,
643 Index first_ybatch_index = 0;
646 bool do_abort =
false;
658 Index job_counter = 0;
661 dobatch_cloudbox_field.resize(ybatch_n);
662 dobatch_radiance_field.resize(ybatch_n);
663 dobatch_irradiance_field.resize(ybatch_n);
664 dobatch_spectral_irradiance_field.resize(ybatch_n);
671#pragma omp parallel for schedule(dynamic) if (!arts_omp_in_parallel() && \
672 ybatch_n > 1) firstprivate(wss)
673 for (Index ybatch_index = first_ybatch_index; ybatch_index < ybatch_n;
677 if (do_abort)
continue;
678#pragma omp critical(dobatchCalc_job_counter)
679 { l_job_counter = ++job_counter; }
683 os <<
" Job " << l_job_counter <<
" of " << ybatch_n <<
", Index "
684 << ybatch_start + ybatch_index <<
", Thread-Id "
690 Tensor7 cloudbox_field;
691 Tensor5 radiance_field;
692 Tensor4 irradiance_field;
693 Tensor5 spectral_irradiance_field;
699 spectral_irradiance_field,
700 ybatch_start + ybatch_index,
701 dobatch_calc_agenda);
703#pragma omp critical(dobatchCalc_assign_cloudbox_field)
704 dobatch_cloudbox_field[ybatch_index] = cloudbox_field;
705#pragma omp critical(dobatchCalc_assign_radiance_field)
706 dobatch_radiance_field[ybatch_index] = radiance_field;
707#pragma omp critical(dobatchCalc_assign_irradiance_field)
708 dobatch_irradiance_field[ybatch_index] = irradiance_field;
709#pragma omp critical(dobatchCalc_assign_spectral_irradiance_field)
710 dobatch_spectral_irradiance_field[ybatch_index] =
711 spectral_irradiance_field;
713 }
catch (
const std::exception& e) {
714 if (robust && !do_abort) {
716 os <<
"WARNING! Job at ybatch_index " << ybatch_start + ybatch_index
718 <<
"element in output variables will be empty for this job.\n"
719 <<
"The runtime error produced was:\n"
725#pragma omp critical(dobatchCalc_setabort)
729 os <<
" Job at ybatch_index " << ybatch_start + ybatch_index
730 <<
" failed. Aborting...\n";
734 os <<
"Run-time error at ybatch_index " << ybatch_start + ybatch_index
737#pragma omp critical(dobatchCalc_push_fail_msg)
738 fail_msg.push_back(os.str());
743 if (fail_msg.
nelem()) {
746 if (!do_abort) os <<
"\nError messages from failed batch cases:\n";
747 for (ArrayOfString::const_iterator it = fail_msg.begin();
748 it != fail_msg.end();
753 throw runtime_error(os.str());
Index TotalNumberOfElements(const Array< Array< base > > &aa)
Determine total number of elements in an ArrayOfArray.
The global header file for ARTS.
int arts_omp_get_thread_num()
Wrapper for omp_get_thread_num.
Header file for helper functions for OpenMP.
void forloop_agendaExecute(Workspace &ws, const Index forloop_index, const Agenda &input_agenda)
void dobatch_calc_agendaExecute(Workspace &ws, Tensor7 &spectral_radiance_field, Tensor5 &radiance_field, Tensor4 &irradiance_field, Tensor5 &spectral_irradiance_field, const Index ybatch_index, const Agenda &input_agenda)
void ybatch_calc_agendaExecute(Workspace &ws, Vector &y, ArrayOfVector &y_aux, Matrix &jacobian, const Index ybatch_index, const Agenda &input_agenda)
void met_profile_calc_agendaExecute(Workspace &ws, Vector &y, const GriddedField3 &t_field_raw, const ArrayOfGriddedField3 &vmr_field_raw, const GriddedField3 &z_field_raw, const ArrayOfGriddedField3 &pnd_field_raw, const Vector &p_grid, const Matrix &sensor_los, const Index cloudbox_on, const ArrayOfIndex &cloudbox_limits, const Matrix &z_surface, const Agenda &input_agenda)
Index nelem() const ARTS_NOEXCEPT
const Vector & get_numeric_grid(Index i) const
Get a numeric grid.
Implementation of gridded fields.
void VectorNLogSpace(Vector &x, const Index &n, const Numeric &start, const Numeric &stop, const Verbosity &verbosity)
WORKSPACE METHOD: VectorNLogSpace.
constexpr Numeric DEG2RAD
constexpr Numeric RAD2DEG
void ForLoop(Workspace &ws, const Agenda &forloop_agenda, const Index &start, const Index &stop, const Index &step, const Verbosity &verbosity)
WORKSPACE METHOD: ForLoop.
void ybatchMetProfilesClear(Workspace &ws, ArrayOfVector &ybatch, const ArrayOfArrayOfSpeciesTag &abs_species, const Agenda &met_profile_calc_agenda, const Vector &f_grid, const Matrix &met_amsu_data, const Matrix &sensor_pos, const Vector &refellipsoid, const Index &nelem_p_grid, const String &met_profile_path, const Verbosity &verbosity)
WORKSPACE METHOD: ybatchMetProfilesClear.
void ybatchCalc(Workspace &ws, ArrayOfVector &ybatch, ArrayOfArrayOfVector &ybatch_aux, ArrayOfMatrix &ybatch_jacobians, const Index &ybatch_start, const Index &ybatch_n, const Agenda &ybatch_calc_agenda, const Index &robust, const Verbosity &verbosity)
WORKSPACE METHOD: ybatchCalc.
void ybatchMetProfiles(Workspace &ws, ArrayOfVector &ybatch, const ArrayOfArrayOfSpeciesTag &abs_species, const Agenda &met_profile_calc_agenda, const Vector &f_grid, const Matrix &met_amsu_data, const Matrix &sensor_pos, const Vector &refellipsoid, const Vector &lat_grid, const Vector &lon_grid, const Index &atmosphere_dim, const ArrayOfArrayOfSingleScatteringData &scat_data, const Index &nelem_p_grid, const String &met_profile_path, const String &met_profile_pnd_path, const Verbosity &verbosity)
WORKSPACE METHOD: ybatchMetProfiles.
void DOBatchCalc(Workspace &ws, ArrayOfTensor7 &dobatch_cloudbox_field, ArrayOfTensor5 &dobatch_radiance_field, ArrayOfTensor4 &dobatch_irradiance_field, ArrayOfTensor5 &dobatch_spectral_irradiance_field, const Index &ybatch_start, const Index &ybatch_n, const Agenda &dobatch_calc_agenda, const Index &robust, const Verbosity &verbosity)
WORKSPACE METHOD: DOBatchCalc.
void cloudboxSetManually(Index &cloudbox_on, ArrayOfIndex &cloudbox_limits, const Index &atmosphere_dim, const Vector &p_grid, const Vector &lat_grid, const Vector &lon_grid, const Numeric &p1, const Numeric &p2, const Numeric &lat1, const Numeric &lat2, const Numeric &lon1, const Numeric &lon2, const Verbosity &)
WORKSPACE METHOD: cloudboxSetManually.
constexpr Numeric pi
The following mathematical constants are generated in python Decimal package by the code:
constexpr auto deg2rad(auto x) noexcept
Converts degrees to radians.
constexpr auto rad2deg(auto x) noexcept
Converts radians to degrees.
constexpr Index GFIELD3_P_GRID
Global constant, Index of the pressure grid in GriddedField3.
This file contains declerations of functions of physical character.
Declaration of functions in rte.cc.
This file contains basic functions to handle XML data files.
void xml_write_to_file(const String &filename, const T &type, const FileType ftype, const Index no_clobber, const Verbosity &verbosity)
Write data to XML file.
void xml_read_from_file(const String &filename, T &type, const Verbosity &verbosity)
Reads data from XML file.