59 #define PART_TYPE scat_data_array[i_pt].particle_type 60 #define F_DATAGRID scat_data_array[i_pt].f_grid 61 #define T_DATAGRID scat_data_array[i_pt].T_grid 62 #define ZA_DATAGRID scat_data_array[i_pt].za_grid 63 #define AA_DATAGRID scat_data_array[i_pt].aa_grid 64 #define PHA_MAT_DATA_RAW scat_data_array[i_pt].pha_mat_data //CPD: changed from pha_mat_data 65 #define EXT_MAT_DATA_RAW scat_data_array[i_pt].ext_mat_data //which wouldn't let me play with 66 #define ABS_VEC_DATA_RAW scat_data_array[i_pt].abs_vec_data //scat_data_array_mono. 67 #define PND_LIMIT 1e-12 // If particle number density is below this value, 76 const Vector& scat_za_grid,
77 const Vector& scat_aa_grid,
78 const Index& scat_za_index,
79 const Index& scat_aa_index,
84 const Index& scat_p_index,
85 const Index& scat_lat_index,
86 const Index& scat_lon_index,
92 out3 <<
"Calculate *pha_mat_spt* from database\n";
97 if (stokes_dim > 4 || stokes_dim < 1){
98 throw runtime_error(
"The dimension of the stokes vector \n" 99 "must be 1,2,3 or 4");
102 assert( pha_mat_spt.
nshelves() == N_pt );
110 for (
Index i_pt = 0; i_pt < N_pt; i_pt++)
114 if (pnd_field(i_pt, scat_p_index, scat_lat_index, scat_lon_index) >
PND_LIMIT)
152 pha_mat_data_int(i_za_sca,
167 for (
Index za_inc_idx = 0; za_inc_idx < scat_za_grid.
nelem();
170 for (
Index aa_inc_idx = 0; aa_inc_idx < scat_aa_grid.
nelem();
179 aa_inc_idx, scat_za_grid, scat_aa_grid,
194 const Index& doit_za_grid_size,
195 const Vector& scat_aa_grid,
196 const Index& scat_za_index,
197 const Index& scat_aa_index,
198 const Numeric& rtp_temperature,
200 const Index& scat_p_index,
201 const Index& scat_lat_index,
202 const Index& scat_lon_index,
206 if (pnd_field.
ncols() > 1)
208 assert(pha_mat_sptDOITOpt.
nelem() == scat_data_array_mono.
nelem());
211 assert(pha_mat_sptDOITOpt[0].nlibraries() == scat_data_array_mono[0].T_grid.
nelem());
212 assert(pha_mat_sptDOITOpt[0].nvitrines() == doit_za_grid_size);
213 assert(pha_mat_sptDOITOpt[0].nshelves() == scat_aa_grid.
nelem() );
214 assert(pha_mat_sptDOITOpt[0].nbooks() == doit_za_grid_size);
215 assert(pha_mat_sptDOITOpt[0].npages() == scat_aa_grid.
nelem());
219 else if ( pnd_field.
ncols() == 1 )
224 assert(pha_mat_sptDOITOpt.
nelem() == scat_data_array_mono.
nelem());
227 assert(pha_mat_sptDOITOpt[0].nlibraries() == scat_data_array_mono[0].T_grid.
nelem());
228 assert(pha_mat_sptDOITOpt[0].nvitrines() == doit_za_grid_size);
229 assert(pha_mat_sptDOITOpt[0].nshelves() == 1);
230 assert(pha_mat_sptDOITOpt[0].nbooks() == doit_za_grid_size);
231 assert(pha_mat_sptDOITOpt[0].npages() == scat_aa_grid.
nelem());
234 assert(doit_za_grid_size > 0);
238 nlinspace(za_grid, 0, 180, doit_za_grid_size);
240 const Index N_pt = scat_data_array_mono.
nelem();
243 if (stokes_dim > 4 || stokes_dim < 1){
244 throw runtime_error(
"The dimension of the stokes vector \n" 245 "must be 1,2,3 or 4");
248 assert( pha_mat_spt.
nshelves() == N_pt );
257 for (
Index i_pt = 0; i_pt < N_pt; i_pt ++)
262 if (pnd_field(i_pt, scat_p_index, scat_lat_index, scat_lon_index) >
PND_LIMIT)
264 if( scat_data_array_mono[i_pt].T_grid.
nelem() > 1)
267 os <<
"The temperature grid of the scattering data does not cover the \n" 268 "atmospheric temperature at cloud location. The data should \n" 269 "include the value T="<< rtp_temperature <<
" K. \n";
273 gridpos(T_gp, scat_data_array_mono[i_pt].T_grid, rtp_temperature);
280 for (
Index za_inc_idx = 0; za_inc_idx < doit_za_grid_size;
283 for (
Index aa_inc_idx = 0; aa_inc_idx < scat_aa_grid.
nelem();
286 if( scat_data_array_mono[i_pt].T_grid.
nelem() == 1)
288 pha_mat_spt(i_pt, za_inc_idx, aa_inc_idx,
joker,
joker) =
289 pha_mat_sptDOITOpt[i_pt](0, scat_za_index,
290 scat_aa_index, za_inc_idx,
297 for (
Index i = 0; i< stokes_dim; i++)
299 for (
Index j = 0; j< stokes_dim; j++)
301 pha_mat_spt(i_pt, za_inc_idx, aa_inc_idx, i, j)=
302 interp(itw,pha_mat_sptDOITOpt[i_pt]
303 (
joker, scat_za_index,
304 scat_aa_index, za_inc_idx,
305 aa_inc_idx, i, j) , T_gp);
322 const Vector& scat_za_grid,
323 const Vector& scat_aa_grid,
324 const Index& scat_za_index,
325 const Index& scat_aa_index,
326 const Index& f_index,
328 const Numeric& rtp_temperature,
330 const Index& scat_p_index,
331 const Index& scat_lat_index,
332 const Index& scat_lon_index,
338 const Numeric za_sca = scat_za_grid[scat_za_index];
339 const Numeric aa_sca = scat_aa_grid[scat_aa_index];
341 if (stokes_dim > 4 || stokes_dim < 1){
342 throw runtime_error(
"The dimension of the stokes vector \n" 343 "must be 1,2,3 or 4");
346 assert( ext_mat_spt.
npages() == N_pt );
347 assert( abs_vec_spt.
nrows() == N_pt );
360 for (
Index i_pt = 0; i_pt < N_pt; i_pt++)
365 if (pnd_field(i_pt, scat_p_index, scat_lat_index, scat_lon_index) >
PND_LIMIT)
395 os <<
"The temperature grid of the scattering data does not cover the \n" 396 "atmospheric temperature at cloud location. The data should \n" 397 "include the value T="<< rtp_temperature <<
" K. \n";
417 ext_mat_data_int(i_za_sca, i_aa_sca, i) =
419 i_za_sca, i_aa_sca, i),
436 abs_vec_data_int(i_za_sca, i_aa_sca, i) =
461 ext_mat_data_int(i_za_sca, i_aa_sca, i) =
463 i_za_sca, i_aa_sca, i),
480 abs_vec_data_int(i_za_sca, i_aa_sca, i) =
508 za_sca, aa_sca, verbosity);
519 const Index& atmosphere_dim,
520 const Index& scat_p_index,
521 const Index& scat_lat_index,
522 const Index& scat_lon_index,
529 Matrix ext_mat_part(stokes_dim, stokes_dim, 0.0);
532 if (stokes_dim > 4 || stokes_dim < 1){
534 "The dimension of stokes vector can be " 537 if ( ext_mat_spt.
ncols() != stokes_dim){
539 throw runtime_error(
" The columns of ext_mat_spt should " 540 "agree to stokes_dim");
543 if (atmosphere_dim == 1)
546 for (
Index l = 0; l < N_pt; l++)
550 for (
Index m = 0; m < stokes_dim; m++)
552 for (
Index n = 0; n < stokes_dim; n++)
555 ext_mat_part(m, n) +=
556 (ext_mat_spt(l, m, n) * pnd_field(l, scat_p_index, 0, 0));
564 if (atmosphere_dim == 3)
568 for (
Index l = 0; l < N_pt; l++)
572 for (
Index m = 0; m < stokes_dim; m++)
574 for (
Index n = 0; n < stokes_dim; n++)
577 ext_mat_part(m, n) += (ext_mat_spt(l, m, n) *
578 pnd_field(l, scat_p_index,
595 const Matrix& abs_vec_spt,
597 const Index& atmosphere_dim,
598 const Index& scat_p_index,
599 const Index& scat_lat_index,
600 const Index& scat_lon_index,
607 Vector abs_vec_part(stokes_dim, 0.0);
609 if ((stokes_dim > 4) || (stokes_dim <1)){
610 throw runtime_error(
"The dimension of stokes vector " 611 "can be only 1,2,3, or 4");
614 if (atmosphere_dim == 1)
617 for (
Index l = 0; l < N_pt ; ++l)
621 for (
Index m = 0; m < stokes_dim; ++m)
625 (abs_vec_spt(l, m) * pnd_field(l, scat_p_index, 0, 0));
632 if (atmosphere_dim == 3)
635 for (
Index l = 0; l < N_pt ; ++l)
639 for (
Index m = 0; m < stokes_dim; ++m)
642 abs_vec_part[m] += (abs_vec_spt(l, m) *
643 pnd_field(l, scat_p_index,
657 const Index& stokes_dim,
658 const Index& f_index,
666 freq_dim = f_grid.
nelem();
675 out2 <<
"Set dimensions of ext_mat as [" 678 << stokes_dim <<
"] and initialized to 0.\n";
684 const Tensor4& propmat_clearsky,
692 if ( stokes_dim != ext_mat.
nrows() )
693 throw runtime_error(
"Row dimension of ext_mat inconsistent with " 694 "column dimension.");
695 if ( stokes_dim != propmat_clearsky.
ncols() )
696 throw runtime_error(
"Col dimension of propmat_clearsky " 697 "inconsistent with col dimension in ext_mat.");
704 if ( f_dim != propmat_clearsky.
npages() )
705 throw runtime_error(
"Frequency dimension of ext_mat and propmat_clearsky\n" 706 "are inconsistent in ext_matAddGas.");
711 Tensor3 abs_total(f_dim,stokes_dim,stokes_dim);
716 for (
Index iv=0; iv<f_dim; ++iv )
717 for (
Index is1=0; is1<stokes_dim; ++is1 )
718 for (
Index is2=0; is2<stokes_dim; ++is2 )
719 abs_total(iv,is1,is2) += propmat_clearsky(
joker,iv,is1,is2).sum();
722 ext_mat += abs_total;
730 const Index& stokes_dim,
731 const Index& f_index,
739 freq_dim = f_grid.
nelem();
747 out2 <<
"Set dimensions of abs_vec as [" 749 << stokes_dim <<
"] and initialized to 0.\n";
755 const Tensor4& propmat_clearsky,
764 if ( f_dim != propmat_clearsky.
npages() )
765 throw runtime_error(
"Frequency dimension of abs_vec and propmat_clearsky\n" 766 "are inconsistent in abs_vecAddGas.");
767 if ( stokes_dim != propmat_clearsky.
ncols() )
768 throw runtime_error(
"Stokes dimension of abs_vec and propmat_clearsky\n" 769 "are inconsistent in abs_vecAddGas.");
773 for (
Index i=0; i<f_dim; ++i )
777 for(
Index is = 0; is < stokes_dim;is++)
778 abs_vec(i,is) += propmat_clearsky(
joker,i,is,0).sum();
835 const Index& atmosphere_dim,
836 const Index& scat_p_index,
837 const Index& scat_lat_index,
838 const Index& scat_lon_index,
847 pha_mat.
resize(Nza, Naa, stokes_dim, stokes_dim);
852 if (atmosphere_dim == 1)
855 for (
Index pt_index = 0; pt_index < N_pt; ++ pt_index)
858 for (
Index za_index = 0; za_index < Nza; ++ za_index)
860 for (
Index aa_index = 0; aa_index < Naa; ++ aa_index)
864 for (
Index stokes_index_1 = 0; stokes_index_1 < stokes_dim;
867 for (
Index stokes_index_2 = 0; stokes_index_2 < stokes_dim;
871 pha_mat(za_index, aa_index,
872 stokes_index_1, stokes_index_2) +=
874 (pha_mat_spt(pt_index, za_index, aa_index,
875 stokes_index_1, stokes_index_2) *
876 pnd_field(pt_index,scat_p_index, 0, 0));
883 if (atmosphere_dim == 3)
886 for (
Index pt_index = 0; pt_index < N_pt; ++ pt_index)
890 for (
Index za_index = 0; za_index < Nza; ++ za_index)
892 for (
Index aa_index = 0; aa_index < Naa; ++ aa_index)
896 for (
Index i = 0; i < stokes_dim; ++ i)
898 for (
Index j = 0; j < stokes_dim; ++ j)
902 pha_mat(za_index, aa_index, i,j ) +=
903 (pha_mat_spt(pt_index, za_index, aa_index, i, j) *
904 pnd_field(pt_index, scat_p_index,
905 scat_lat_index, scat_lon_index));
935 for (
Index i_pt = 0; i_pt < N_pt; i_pt++)
937 out2 <<
" particle " << i_pt <<
"\n";
945 out2 <<
"frequency " <<
F_DATAGRID[f] <<
"Hz\n";
948 out2 <<
"Temperature " <<
T_DATAGRID[t] <<
"K\n";
955 Numeric Cabs = Cext_data - Csca;
959 Numeric Csca_data = Cext_data - Cabs_data;
962 out2 <<
" Coefficients in database: " 963 <<
"Cext: " << Cext_data <<
" Cabs: " << Cabs_data
964 <<
" Csca: " << Csca_data <<
"\n" 965 <<
" Calculated coefficients: " 966 <<
"Cabs calc: " << Cabs
967 <<
" Csca calc: " << Csca <<
"\n" 969 <<
"Cabs: " << 1e2*Cabs/Cabs_data-1e2
970 <<
"% Csca: " << 1e2*Csca/Csca_data-1e2
971 <<
"% Alb: " << (Csca-Csca_data)/Cext_data <<
"\n";
977 if (
abs(Csca-Csca_data)/Cext_data > threshold)
980 os <<
" Deviations in scat_data_array too large:\n" 981 <<
" scat dev [%] " << 1e2*Csca/Csca_data-1e2
982 <<
" at albedo of " << Csca_data/Cext_data <<
"\n" 983 <<
" Check entry for particle " << i_pt <<
" at " 984 << f <<
".frequency and " << t <<
".temperature!\n";
985 throw runtime_error( os.str() );
995 out0 <<
" WARNING:\n" 996 <<
" scat_data_array consistency check not implemented (yet?!) for\n" 997 <<
" particle type " <<
PART_TYPE <<
"!\n";
1010 const Index& doit_za_grid_size,
1011 const Vector& scat_aa_grid,
1015 const Index& f_index,
1016 const Index& atmosphere_dim,
1017 const Index& stokes_dim,
1026 if(atmosphere_dim == 1)
1029 N_aa_sca = scat_aa_grid.
nelem();
1032 nlinspace(za_grid, 0, 180, doit_za_grid_size);
1034 assert( scat_data_array.
nelem() == scat_data_array_mono.
nelem() );
1038 pha_mat_sptDOITOpt.resize(N_pt);
1040 for (
Index i_pt = 0; i_pt < N_pt; i_pt++)
1042 Index N_T = scat_data_array_mono[i_pt].T_grid.
nelem();
1043 pha_mat_sptDOITOpt[i_pt].resize(N_T, doit_za_grid_size, N_aa_sca,
1044 doit_za_grid_size, scat_aa_grid.
nelem(),
1045 stokes_dim, stokes_dim);
1048 pha_mat_sptDOITOpt[i_pt]= 0.;
1052 for (
Index t_idx = 0; t_idx < N_T; t_idx ++)
1055 for (
Index za_sca_idx = 0; za_sca_idx < doit_za_grid_size; za_sca_idx ++)
1057 for (
Index aa_sca_idx = 0; aa_sca_idx < N_aa_sca; aa_sca_idx ++)
1060 for (
Index za_inc_idx = 0; za_inc_idx < doit_za_grid_size;
1063 for (
Index aa_inc_idx = 0; aa_inc_idx <
1064 scat_aa_grid.
nelem();
1069 aa_sca_idx, za_inc_idx, aa_inc_idx,
1071 scat_data_array_mono[i_pt].
1075 scat_data_array_mono[i_pt].za_grid,
1076 scat_data_array_mono[i_pt].aa_grid,
1077 scat_data_array_mono[i_pt].particle_type,
1098 const Index& f_index,
1107 for (
Index i = 0; i<scat_data_array.
nelem(); i++)
1111 scat_data_array[i].f_grid,
1132 scat_data_array_mono.resize(N_pt);
1135 for (
Index i_pt = 0; i_pt < N_pt; i_pt++)
1146 scat_data_array_mono[i_pt].particle_type=
PART_TYPE;
1147 scat_data_array_mono[i_pt].f_grid.resize(1);
1148 scat_data_array_mono[i_pt].f_grid=f_grid[f_index];
1149 scat_data_array_mono[i_pt].T_grid=scat_data_array[i_pt].T_grid;
1154 scat_data_array_mono[i_pt].pha_mat_data.resize(1,
1170 for (
Index i_za_inc = 0; i_za_inc <
1174 for (
Index i_aa_inc = 0;
1180 scat_data_array_mono[i_pt].pha_mat_data(0, t_index,
1197 scat_data_array_mono[i_pt].ext_mat_data.resize(1,
T_DATAGRID.nelem(),
1212 scat_data_array_mono[i_pt].ext_mat_data(0, t_index,
1213 i_za_sca, i_aa_sca, i)
1221 scat_data_array_mono[i_pt].abs_vec_data.resize(1,
T_DATAGRID.nelem(),
1236 scat_data_array_mono[i_pt].abs_vec_data(0, t_index, i_za_sca,
1255 const Vector& scat_za_grid,
1256 const Vector& scat_aa_grid,
1257 const Index& scat_za_index,
1258 const Index& scat_aa_index,
1259 const Numeric& rtp_temperature,
1261 const Index& scat_p_index,
1262 const Index& scat_lat_index,
1263 const Index& scat_lon_index,
1266 const Index N_pt = scat_data_array_mono.
nelem();
1267 const Index stokes_dim = ext_mat_spt.
ncols();
1268 const Numeric za_sca = scat_za_grid[scat_za_index];
1269 const Numeric aa_sca = scat_aa_grid[scat_aa_index];
1271 if (stokes_dim > 4 || stokes_dim < 1){
1272 throw runtime_error(
"The dimension of the stokes vector \n" 1273 "must be 1,2,3 or 4");
1276 assert( ext_mat_spt.
npages() == N_pt );
1277 assert( abs_vec_spt.
nrows() == N_pt );
1288 for (
Index i_pt = 0; i_pt < N_pt; i_pt++)
1292 if (pnd_field(i_pt, scat_p_index, scat_lat_index, scat_lon_index) >
PND_LIMIT)
1304 Index ext_npages = scat_data_array_mono[i_pt].ext_mat_data.npages();
1305 Index ext_nrows = scat_data_array_mono[i_pt].ext_mat_data.nrows();
1306 Index ext_ncols = scat_data_array_mono[i_pt].ext_mat_data.ncols();
1307 Index abs_npages = scat_data_array_mono[i_pt].abs_vec_data.npages();
1308 Index abs_nrows = scat_data_array_mono[i_pt].abs_vec_data.nrows();
1309 Index abs_ncols = scat_data_array_mono[i_pt].abs_vec_data.ncols();
1310 Tensor3 ext_mat_data1temp(ext_npages,ext_nrows,ext_ncols,0.0);
1311 Tensor3 abs_vec_data1temp(abs_npages,abs_nrows,abs_ncols,0.0);
1316 if (t_grid.
nelem() > 1)
1324 gridpos(t_gp, scat_data_array_mono[i_pt].T_grid, rtp_temperature);
1326 for (
Index i_p = 0; i_p < ext_npages ; i_p++)
1328 for (
Index i_r = 0; i_r < ext_nrows ; i_r++)
1330 for (
Index i_c = 0; i_c < ext_ncols ; i_c++)
1332 ext_mat_data1temp(i_p,i_r,i_c)=
interp(itw,
1333 scat_data_array_mono[i_pt].ext_mat_data(0,
joker,i_p,i_r,i_c),t_gp);
1346 scat_data_array_mono[i_pt].za_grid,
1347 scat_data_array_mono[i_pt].aa_grid,
1348 scat_data_array_mono[i_pt].particle_type,
1355 if (t_grid.
nelem() > 1)
1358 for (
Index i_p = 0; i_p < abs_npages ; i_p++)
1360 for (
Index i_r = 0; i_r < abs_nrows ; i_r++)
1362 for (
Index i_c = 0; i_c < abs_ncols ; i_c++)
1364 abs_vec_data1temp(i_p,i_r,i_c)=
interp(itw,
1365 scat_data_array_mono[i_pt].abs_vec_data(0,
joker,i_p,i_r,i_c),t_gp);
1378 scat_data_array_mono[i_pt].za_grid,
1379 scat_data_array_mono[i_pt].aa_grid,
1380 scat_data_array_mono[i_pt].particle_type,
1394 const Index& doit_za_grid_size,
1395 const Vector& scat_aa_grid,
1396 const Index& scat_za_index,
1397 const Index& scat_aa_index,
1398 const Numeric& rtp_temperature,
1400 const Index& scat_p_index,
1401 const Index& scat_lat_index,
1402 const Index& scat_lon_index,
1407 out3 <<
"Calculate *pha_mat_spt* from scat_data_array_mono. \n";
1410 nlinspace(za_grid, 0, 180, doit_za_grid_size);
1412 const Index N_pt = scat_data_array_mono.
nelem();
1413 const Index stokes_dim = pha_mat_spt.
ncols();
1417 if (stokes_dim > 4 || stokes_dim < 1){
1418 throw runtime_error(
"The dimension of the stokes vector \n" 1419 "must be 1,2,3 or 4");
1422 assert( pha_mat_spt.
nshelves() == N_pt );
1430 for (
Index i_pt = 0; i_pt < N_pt; i_pt ++)
1435 if (pnd_field(i_pt, scat_p_index, scat_lat_index, scat_lon_index) >
1439 Tensor3 pha_mat_spt_tmp(scat_data_array_mono[i_pt].T_grid.
nelem(),
1442 pha_mat_spt_tmp = 0.;
1444 if( scat_data_array_mono[i_pt].T_grid.
nelem() > 1)
1447 os <<
"The temperature grid of the scattering data does not cover the \n" 1448 "atmospheric temperature at cloud location. The data should \n" 1449 "include the value T="<< rtp_temperature <<
" K. \n";
1453 gridpos(T_gp, scat_data_array_mono[i_pt].T_grid, rtp_temperature);
1459 for (
Index za_inc_idx = 0; za_inc_idx < doit_za_grid_size;
1462 for (
Index aa_inc_idx = 0; aa_inc_idx < scat_aa_grid.
nelem();
1465 for (
Index t_idx = 0; t_idx <
1466 scat_data_array_mono[i_pt].T_grid.
nelem();
1470 scat_data_array_mono[i_pt].
1474 scat_data_array_mono[i_pt].za_grid,
1475 scat_data_array_mono[i_pt].aa_grid,
1476 scat_data_array_mono[i_pt].particle_type,
1477 scat_za_index, scat_aa_index,
1479 aa_inc_idx, za_grid, scat_aa_grid,
1483 if( scat_data_array_mono[i_pt].T_grid.
nelem() > 1)
1485 for (
Index i = 0; i< stokes_dim; i++)
1487 for (
Index j = 0; j< stokes_dim; j++)
1489 pha_mat_spt(i_pt, za_inc_idx, aa_inc_idx, i, j)=
1496 pha_mat_spt(i_pt, za_inc_idx, aa_inc_idx,
joker,
joker) =
1511 const Index& atmosphere_dim,
1512 const Index& cloudbox_on,
1517 const Index& cloudbox_checked,
1520 if (!cloudbox_checked)
1521 throw std::runtime_error(
"You must call *cloudbox_checkedCalc* before this method.");
1523 if (atmosphere_dim != 1)
1524 throw std::runtime_error(
"Merging particles only works with a 1D atmoshere");
1530 pnd_field.
resize(0, 0, 0, 0);
1537 limits[0] = cloudbox_limits[0];
1538 limits[1] = cloudbox_limits[1] + 1;
1540 Tensor4 pnd_field_merged(limits[1] - limits[0],
1541 limits[1] - limits[0],
1548 scat_data_array_merged.resize(pnd_field_merged.
nbooks());
1549 for (
Index sp = 0; sp < scat_data_array_merged.
nelem(); sp++)
1554 this_part.
f_grid = scat_data_array[0].f_grid;
1555 this_part.
za_grid = scat_data_array[0].za_grid;
1556 this_part.
aa_grid = scat_data_array[0].aa_grid;
1560 scat_data_array[0].pha_mat_data.nshelves(),
1561 scat_data_array[0].pha_mat_data.nbooks(),
1562 scat_data_array[0].pha_mat_data.npages(),
1563 scat_data_array[0].pha_mat_data.nrows(),
1564 scat_data_array[0].pha_mat_data.ncols());
1567 scat_data_array[0].ext_mat_data.npages(),
1568 scat_data_array[0].ext_mat_data.nrows(),
1569 scat_data_array[0].ext_mat_data.ncols());
1572 scat_data_array[0].abs_vec_data.npages(),
1573 scat_data_array[0].abs_vec_data.nrows(),
1574 scat_data_array[0].abs_vec_data.ncols());
1579 this_part.
T_grid[0] = t_field(sp, 0, 0);
1584 for (
Index i_pt = 1; i_pt < pnd_field.
nbooks(); i_pt++)
1589 throw std::runtime_error(
"All particles must have the same type");
1592 throw std::runtime_error(
"All particles must have the same f_grid");
1602 throw std::runtime_error(
"All particles must have the same pha_mat_data size" 1603 " (except for temperature).");
1611 throw std::runtime_error(
"All particles must have the same ext_mat_data size" 1612 " (except for temperature).");
1620 throw std::runtime_error(
"All particles must have the same abs_vec_data size" 1621 " (except for temperature).");
1631 for (
Index i_lv = 0; i_lv < nlevels-1; i_lv++)
1633 pnd_field_merged(i_lv,i_lv,0,0) = 1.;
1636 for (
Index i_pt = 0; i_pt < pnd_field.
nbooks(); i_pt++)
1643 if (pnd_field(i_pt, i_lv, 0, 0) >
PND_LIMIT)
1646 if( scat_data_array[i_pt].T_grid.
nelem() > 1)
1649 os <<
"The temperature grid of the scattering data does not cover the \n" 1650 "atmospheric temperature at cloud location. The data should \n" 1651 "include the value T="<< this_part.
T_grid[0] <<
" K. \n";
1664 if( scat_data_array[i_pt].T_grid.
nelem() == 1)
1667 pnd_field(i_pt, i_lv, 0, 0)
1671 pnd_field(i_pt, i_lv, 0, 0)
1680 pnd_field(i_pt, i_lv, 0, 0)
1689 pnd_field(i_pt, i_lv, 0, 0)
1700 if( scat_data_array[i_pt].T_grid.
nelem() == 1)
1702 const Numeric pnd = pnd_field(i_pt, i_lv, 0, 0);
1706 pnd * orig_part.
pha_mat_data(i_f, 0, i_za, 0, 0, 0, i_s);
1715 pnd_field(i_pt, i_lv, 0, 0)
1730 if (z_field(cloudbox_limits[0], 0, 0) > z_surface(0, 0))
1731 pnd_field_merged(0, 0, 0, 0) = 0.;
1733 pnd_field = pnd_field_merged;
1734 scat_data_array = scat_data_array_merged;
1746 const Index& part_species_index,
1749 if ( part_species_index<0 )
1752 os <<
"part_species_index can't be <0!";
1753 throw runtime_error( os.str() );
1756 const Index nps = scat_data_per_part_species.
nelem();
1760 if ( !(nps>part_species_index) )
1763 os <<
"Can not extract data for scattering species #" 1764 << part_species_index <<
"\n" 1765 <<
"because scat_data_per_part_species has only " << nps <<
" elements.";
1766 throw runtime_error( os.str() );
1769 const Index npe = scat_data_per_part_species[part_species_index];
1775 for (
Index i=0; i<part_species_index; i++ )
1776 indoff+=scat_data_per_part_species[i];
1779 for (
Index i=0; i<npe; i++ )
1781 if ( meta_name==
"volume" )
1782 meta_param[i] = scat_meta_array[indoff+i].volume;
1783 else if ( meta_name==
"diameter_max" )
1784 meta_param[i] = scat_meta_array[indoff+i].diameter_max;
1785 else if ( meta_name==
"density" )
1786 meta_param[i] = scat_meta_array[indoff+i].density;
1787 else if ( meta_name==
"area_projected" )
1788 meta_param[i] = scat_meta_array[indoff+i].area_projected;
1789 else if ( meta_name==
"aspect_ratio" )
1790 meta_param[i] = scat_meta_array[indoff+i].aspect_ratio;
1794 os <<
"Meta parameter \"" << meta_name <<
"\"is unknown.";
1795 throw runtime_error( os.str() );
Index npages() const
Returns the number of pages.
INDEX Index
The type to use for all integer numbers and indices.
void opt_prop_sptFromMonoData(Tensor3 &ext_mat_spt, Matrix &abs_vec_spt, const ArrayOfSingleScatteringData &scat_data_array_mono, const Vector &scat_za_grid, const Vector &scat_aa_grid, const Index &scat_za_index, const Index &scat_aa_index, const Numeric &rtp_temperature, const Tensor4 &pnd_field, const Index &scat_p_index, const Index &scat_lat_index, const Index &scat_lon_index, const Verbosity &verbosity)
WORKSPACE METHOD: opt_prop_sptFromMonoData.
Index nrows() const
Returns the number of rows.
void ScatteringMergeParticles1D(Tensor4 &pnd_field, ArrayOfSingleScatteringData &scat_data_array, const Index &atmosphere_dim, const Index &cloudbox_on, const ArrayOfIndex &cloudbox_limits, const Tensor3 &t_field, const Tensor3 &z_field, const Matrix &z_surface, const Index &cloudbox_checked, const Verbosity &)
WORKSPACE METHOD: ScatteringMergeParticles1D.
Index nelem() const
Number of elements.
void resize(Index s, Index b, Index p, Index r, Index c)
Resize function.
Declarations having to do with the four output streams.
void ext_matAddPart(Tensor3 &ext_mat, const Tensor3 &ext_mat_spt, const Tensor4 &pnd_field, const Index &atmosphere_dim, const Index &scat_p_index, const Index &scat_lat_index, const Index &scat_lon_index, const Verbosity &)
WORKSPACE METHOD: ext_matAddPart.
void ext_matTransform(MatrixView ext_mat_lab, ConstTensor3View ext_mat_data, ConstVectorView za_datagrid, ConstVectorView aa_datagrid, const ParticleType &particle_type, const Numeric &za_sca, const Numeric &aa_sca, const Verbosity &verbosity)
Transformation of extinction matrix.
void abs_vecTransform(VectorView abs_vec_lab, ConstTensor3View abs_vec_data, ConstVectorView za_datagrid, ConstVectorView aa_datagrid, const ParticleType &particle_type, const Numeric &za_sca, const Numeric &aa_sca, const Verbosity &verbosity)
Transformation of absorption vector.
Numeric interp(ConstVectorView itw, ConstVectorView a, const GridPos &tc)
Red 1D Interpolate.
Index nrows() const
Returns the number of rows.
Index npages() const
Returns the number of pages.
This file contains basic functions to handle XML data files.
Structure which describes the single scattering properties of a particle or a particle distribution...
Header file for interpolation.cc.
Index nbooks() const
Returns the number of books.
Index nrows() const
Returns the number of rows.
Index nelem() const
Returns the number of elements.
Contains sorting routines.
void ExtractFromMetaSinglePartSpecies(Vector &meta_param, const ArrayOfScatteringMetaData &scat_meta_array, const ArrayOfIndex &scat_data_per_part_species, const String &meta_name, const Index &part_species_index, const Verbosity &)
WORKSPACE METHOD: ExtractFromMetaSinglePartSpecies.
Structure to store a grid position.
This file contains the definition of Array.
The implementation for String, the ARTS string class.
Index ncols() const
Returns the number of columns.
The global header file for ARTS.
Index nshelves() const
Returns the number of shelves.
void opt_prop_sptFromData(Tensor3 &ext_mat_spt, Matrix &abs_vec_spt, const ArrayOfSingleScatteringData &scat_data_array, const Vector &scat_za_grid, const Vector &scat_aa_grid, const Index &scat_za_index, const Index &scat_aa_index, const Index &f_index, const Vector &f_grid, const Numeric &rtp_temperature, const Tensor4 &pnd_field, const Index &scat_p_index, const Index &scat_lat_index, const Index &scat_lon_index, const Verbosity &verbosity)
WORKSPACE METHOD: opt_prop_sptFromData.
void scat_data_array_monoCalc(ArrayOfSingleScatteringData &scat_data_array_mono, const ArrayOfSingleScatteringData &scat_data_array, const Vector &f_grid, const Index &f_index, const Verbosity &)
WORKSPACE METHOD: scat_data_array_monoCalc.
Index ncols() const
Returns the number of columns.
void pha_matTransform(MatrixView pha_mat_lab, ConstTensor5View pha_mat_data, ConstVectorView za_datagrid, ConstVectorView aa_datagrid, const ParticleType &particle_type, const Index &za_sca_idx, const Index &aa_sca_idx, const Index &za_inc_idx, const Index &aa_inc_idx, ConstVectorView scat_za_grid, ConstVectorView scat_aa_grid, const Verbosity &verbosity)
Transformation of phase matrix.
void pha_mat_sptFromMonoData(Tensor5 &pha_mat_spt, const ArrayOfSingleScatteringData &scat_data_array_mono, const Index &doit_za_grid_size, const Vector &scat_aa_grid, const Index &scat_za_index, const Index &scat_aa_index, const Numeric &rtp_temperature, const Tensor4 &pnd_field, const Index &scat_p_index, const Index &scat_lat_index, const Index &scat_lon_index, const Verbosity &verbosity)
WORKSPACE METHOD: pha_mat_sptFromMonoData.
The declarations of all the exception classes.
void nlinspace(Vector &x, const Numeric start, const Numeric stop, const Index n)
nlinspace
void gridpos(ArrayOfGridPos &gp, ConstVectorView old_grid, ConstVectorView new_grid, const Numeric &extpolfac)
Set up a grid position Array.
NUMERIC Numeric
The type to use for all floating point numbers.
Index nlibraries() const
Returns the number of libraries.
void abs_vecInit(Matrix &abs_vec, const Vector &f_grid, const Index &stokes_dim, const Index &f_index, const Verbosity &verbosity)
WORKSPACE METHOD: abs_vecInit.
void DoitScatteringDataPrepare(ArrayOfTensor7 &pha_mat_sptDOITOpt, ArrayOfSingleScatteringData &scat_data_array_mono, const Index &doit_za_grid_size, const Vector &scat_aa_grid, const ArrayOfSingleScatteringData &scat_data_array, const Vector &f_grid, const Index &f_index, const Index &atmosphere_dim, const Index &stokes_dim, const Verbosity &verbosity)
WORKSPACE METHOD: DoitScatteringDataPrepare.
void resize(Index p, Index r, Index c)
Resize function.
Header file for logic.cc.
Index npages() const
Returns the number of pages.
This can be used to make arrays out of anything.
void resize(Index n)
Assignment operator from VectorView.
void pha_matCalc(Tensor4 &pha_mat, const Tensor5 &pha_mat_spt, const Tensor4 &pnd_field, const Index &atmosphere_dim, const Index &scat_p_index, const Index &scat_lat_index, const Index &scat_lon_index, const Verbosity &)
WORKSPACE METHOD: pha_matCalc.
A constant view of a Vector.
Index nshelves() const
Returns the number of shelves.
Index npages() const
Returns the number of pages.
Index nbooks() const
Returns the number of books.
void ext_matAddGas(Tensor3 &ext_mat, const Tensor4 &propmat_clearsky, const Verbosity &)
WORKSPACE METHOD: ext_matAddGas.
void abs_vecAddPart(Matrix &abs_vec, const Matrix &abs_vec_spt, const Tensor4 &pnd_field, const Index &atmosphere_dim, const Index &scat_p_index, const Index &scat_lat_index, const Index &scat_lon_index, const Verbosity &)
WORKSPACE METHOD: abs_vecAddPart.
Index ncols() const
Returns the number of columns.
bool is_size(ConstVectorView x, const Index &n)
Verifies that the size of x is l.
Index ncols() const
Returns the number of columns.
ParticleType particle_type
Index ncols() const
Returns the number of columns.
void pha_mat_sptFromData(Tensor5 &pha_mat_spt, const ArrayOfSingleScatteringData &scat_data_array, const Vector &scat_za_grid, const Vector &scat_aa_grid, const Index &scat_za_index, const Index &scat_aa_index, const Index &f_index, const Vector &f_grid, const Numeric &rtp_temperature, const Tensor4 &pnd_field, const Index &scat_p_index, const Index &scat_lat_index, const Index &scat_lon_index, const Verbosity &verbosity)
WORKSPACE METHOD: pha_mat_sptFromData.
void scat_data_arrayCheck(const ArrayOfSingleScatteringData &scat_data_array, const Numeric &threshold, const Verbosity &verbosity)
WORKSPACE METHOD: scat_data_arrayCheck.
void interpweights(VectorView itw, const GridPos &tc)
Red 1D interpolation weights.
void resize(Index l, Index v, Index s, Index b, Index p, Index r, Index c)
Resize function.
void abs_vecAddGas(Matrix &abs_vec, const Tensor4 &propmat_clearsky, const Verbosity &)
WORKSPACE METHOD: abs_vecAddGas.
Scattering database structure and functions.
void pha_mat_sptFromDataDOITOpt(Tensor5 &pha_mat_spt, const ArrayOfTensor7 &pha_mat_sptDOITOpt, const ArrayOfSingleScatteringData &scat_data_array_mono, const Index &doit_za_grid_size, const Vector &scat_aa_grid, const Index &scat_za_index, const Index &scat_aa_index, const Numeric &rtp_temperature, const Tensor4 &pnd_field, const Index &scat_p_index, const Index &scat_lat_index, const Index &scat_lon_index, const Verbosity &)
WORKSPACE METHOD: pha_mat_sptFromDataDOITOpt.
Index nrows() const
Returns the number of rows.
Index nbooks() const
Returns the number of books.
void resize(Index b, Index p, Index r, Index c)
Resize function.
Numeric AngIntegrate_trapezoid(ConstMatrixView Integrand, ConstVectorView za_grid, ConstVectorView aa_grid)
AngIntegrate_trapezoid.
void resize(Index r, Index c)
Resize function.
void ext_matInit(Tensor3 &ext_mat, const Vector &f_grid, const Index &stokes_dim, const Index &f_index, const Verbosity &verbosity)
WORKSPACE METHOD: ext_matInit.