00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef montecarlo_h
00019 #define montecarlo_h
00020
00021
00022
00023
00024 #include <stdexcept>
00025 #include <cmath>
00026 #include "messages.h"
00027 #include "arts.h"
00028 #include "ppath.h"
00029 #include "matpackI.h"
00030 #include "special_interp.h"
00031 #include "check_input.h"
00032 #include "rte.h"
00033 #include "lin_alg.h"
00034 #include "logic.h"
00035 #include "optproperties.h"
00036 #include "physics_funcs.h"
00037 #include "xml_io.h"
00038 #include "rng.h"
00039 #include "scatrte.h"
00040
00041 extern const Numeric DEG2RAD;
00042 extern const Numeric RAD2DEG;
00043 extern const Numeric PI;
00044
00045 void clear_rt_vars_at_gp(Workspace& ws,
00046 MatrixView& ext_mat_mono,
00047 VectorView& abs_vec_mono,
00048 Numeric& temperature,
00049 const Agenda& opt_prop_gas_agenda,
00050 const Agenda& abs_scalar_gas_agenda,
00051 const Index& f_index,
00052 const GridPos& gp_p,
00053 const GridPos& gp_lat,
00054 const GridPos& gp_lon,
00055 const ConstVectorView p_grid,
00056 const ConstVectorView lat_grid,
00057 const ConstVectorView lon_grid,
00058 const ConstTensor3View t_field,
00059 const ConstTensor4View vmr_field);
00060
00061 void cloud_atm_vars_by_gp(
00062 VectorView pressure,
00063 VectorView temperature,
00064 MatrixView vmr,
00065 MatrixView pnd,
00066 const ArrayOfGridPos& gp_p,
00067 const ArrayOfGridPos& gp_lat,
00068 const ArrayOfGridPos& gp_lon,
00069 const ArrayOfIndex& cloudbox_limits,
00070 const ConstVectorView p_grid_cloud,
00071 const ConstVectorView lat_grid_cloud,
00072 const ConstVectorView lon_grid_cloud,
00073 const ConstTensor3View t_field_cloud,
00074 const ConstTensor4View vmr_field_cloud,
00075 const ConstTensor4View pnd_field
00076 );
00077
00078 void Cloudbox_ppathCalc(Workspace& ws,
00079
00080 Ppath& ppath,
00081 Ppath& ppath_step,
00082
00083 const Agenda& ppath_step_agenda,
00084 const Index& atmosphere_dim,
00085 const Vector& p_grid,
00086 const Vector& lat_grid,
00087 const Vector& lon_grid,
00088 const Tensor3& z_field,
00089 const Matrix& r_geoid,
00090 const Matrix& z_surface,
00091 const ArrayOfIndex& cloudbox_limits,
00092 const Vector& rte_pos,
00093 const Vector& rte_los,
00094 const Index& z_field_is_1D);
00095
00096
00097 void Cloudbox_ppath_rteCalc( Workspace& ws,
00098 Ppath& ppathcloud,
00099 Ppath& ppath,
00100 Ppath& ppath_step,
00101
00102
00103
00104 Vector& rte_pos,
00105 Vector& rte_los,
00106 Vector& cum_l_step,
00107 ArrayOfMatrix& TArray,
00108 ArrayOfMatrix& ext_matArray,
00109 ArrayOfVector& abs_vecArray,
00110 Vector& t_ppath,
00111
00112
00113 Tensor3& ext_mat,
00114 Matrix& abs_vec,
00115 Numeric& rte_pressure,
00116 Numeric& rte_temperature,
00117 Vector& rte_vmr_list,
00118 Matrix& iy,
00119
00120
00121
00122
00123 Matrix& pnd_ppath,
00124 const Agenda& ppath_step_agenda,
00125 const Index& atmosphere_dim,
00126 const Vector& p_grid,
00127 const Vector& lat_grid,
00128 const Vector& lon_grid,
00129 const Tensor3& z_field,
00130 const Matrix& r_geoid,
00131 const Matrix& z_surface,
00132 const ArrayOfIndex& cloudbox_limits,
00133 const Index& record_ppathcloud,
00134 const Index& record_ppath,
00135 const Agenda& opt_prop_gas_agenda,
00136 const Agenda& abs_scalar_gas_agenda,
00137 const Index& f_index,
00138 const Index& stokes_dim,
00139 const Tensor3& t_field,
00140 const Tensor4& vmr_field,
00141 const Agenda& rte_agenda,
00142 const Agenda& iy_space_agenda,
00143 const Agenda& surface_prop_agenda,
00144 const Agenda& iy_cloudbox_agenda,
00145 const Vector& f_grid,
00146 const Index& photon_number,
00147 const Index& scattering_order,
00148 const Tensor4& pnd_field,
00149 const ArrayOfSingleScatteringData& scat_data_mono,
00150 const Index& z_field_is_1D
00151 );
00152
00153
00154 void cloudbox_ppath_start_stepping(
00155 Ppath& ppath,
00156 const Index& atmosphere_dim,
00157 ConstVectorView p_grid,
00158 ConstVectorView lat_grid,
00159 ConstVectorView lon_grid,
00160 ConstTensor3View z_field,
00161 ConstMatrixView r_geoid,
00162 ConstMatrixView z_surface,
00163 ConstVectorView rte_pos,
00164 ConstVectorView rte_los,
00165 const Index& z_field_is_1D );
00166
00167
00168 void cloudy_rt_vars_at_gp(
00169 Workspace& ws,
00170 MatrixView& ext_mat_mono,
00171 VectorView& abs_vec_mono,
00172 VectorView& pnd_vec,
00173 Numeric& temperature,
00174 const Agenda& opt_prop_gas_agenda,
00175 const Agenda& abs_scalar_gas_agenda,
00176 const Index& stokes_dim,
00177 const Index& f_index,
00178 const GridPos gp_p,
00179 const GridPos gp_lat,
00180 const GridPos gp_lon,
00181 const ConstVectorView p_grid_cloud,
00182 const ConstVectorView lat_grid_cloud,
00183 const ConstVectorView lon_grid_cloud,
00184 const ConstTensor3View t_field_cloud,
00185 const ConstTensor4View vmr_field_cloud,
00186 const Tensor4& pnd_field,
00187 const ArrayOfSingleScatteringData& scat_data_mono,
00188 const ArrayOfIndex& cloudbox_limits,
00189 const Vector& rte_los
00190 );
00191
00192 void cum_l_stepCalc(
00193 Vector& cum_l_step,
00194 const Ppath& ppath
00195 );
00196
00197 void findZ11max(Vector& Z11maxvector,
00198 const ArrayOfSingleScatteringData& scat_data_mono);
00199
00200 bool is_anyptype30(const ArrayOfSingleScatteringData& scat_data_mono);
00201
00202 void iwp_cloud_opt_pathCalc(Workspace& ws,
00203 Numeric& iwp,
00204 Numeric& cloud_opt_path,
00205
00206 const Vector& rte_pos,
00207 const Vector& rte_los,
00208 const Agenda& ppath_step_agenda,
00209 const Vector& p_grid,
00210 const Vector& lat_grid,
00211 const Vector& lon_grid,
00212 const Matrix& r_geoid,
00213 const Matrix& z_surface,
00214 const Tensor3& z_field,
00215 const Tensor3& t_field,
00216 const Tensor4& vmr_field,
00217 const ArrayOfIndex& cloudbox_limits,
00218 const Tensor4& pnd_field,
00219 const ArrayOfSingleScatteringData& scat_data_mono,
00220 const Vector& particle_masses
00221 );
00222
00223
00224 void matrix_exp_p30(MatrixView& M,
00225 ConstMatrixView& A);
00226
00227 void mcPathTrace(Workspace& ws,
00228 MatrixView& evol_op,
00229 VectorView& abs_vec_mono,
00230 Numeric& temperature,
00231 MatrixView& ext_mat_mono,
00232 Rng& rng,
00233 Vector& rte_pos,
00234 Vector& rte_los,
00235 Vector& pnd_vec,
00236 Numeric& g,
00237 bool& left_cloudbox,
00238 const Agenda& opt_prop_gas_agenda,
00239 const Agenda& abs_scalar_gas_agenda,
00240 const Index& stokes_dim,
00241 const Index& f_index,
00242 const Vector& p_grid,
00243 const Vector& lat_grid,
00244 const Vector& lon_grid,
00245 const Tensor3& z_field,
00246 const Matrix& r_geoid,
00247 const Matrix& z_surface,
00248 const Tensor3& t_field,
00249 const Tensor4& vmr_field,
00250 const ArrayOfIndex& cloudbox_limits,
00251 const Tensor4& pnd_field,
00252 const ArrayOfSingleScatteringData& scat_data_mono,
00253 const Index& z_field_is_1D);
00254
00255 void mcPathTraceGeneral(Workspace& ws,
00256 MatrixView& evol_op,
00257 Vector& abs_vec_mono,
00258 Numeric& temperature,
00259 MatrixView& ext_mat_mono,
00260 Rng& rng,
00261 Vector& rte_pos,
00262 Vector& rte_los,
00263 Vector& pnd_vec,
00264 Numeric& g,
00265 Ppath& ppath_step,
00266 Index& termination_flag,
00267 bool& inside_cloud,
00268
00269
00270 const Agenda& opt_prop_gas_agenda,
00271 const Agenda& abs_scalar_gas_agenda,
00272 const Index& stokes_dim,
00273 const Index& f_index,
00274 const Vector& p_grid,
00275 const Vector& lat_grid,
00276 const Vector& lon_grid,
00277 const Tensor3& z_field,
00278 const Matrix& r_geoid,
00279 const Matrix& z_surface,
00280 const Tensor3& t_field,
00281 const Tensor4& vmr_field,
00282 const ArrayOfIndex& cloudbox_limits,
00283 const Tensor4& pnd_field,
00284 const ArrayOfSingleScatteringData& scat_data_mono,
00285 const Index& z_field_is_1D);
00286
00287 void mcPathTraceIPA(Workspace& ws,
00288 MatrixView& evol_op,
00289 Vector& abs_vec_mono,
00290 Numeric& temperature,
00291 MatrixView& ext_mat_mono,
00292 Rng& rng,
00293 Vector& rte_pos,
00294 Vector& rte_los,
00295 Vector& pnd_vec,
00296 Numeric& g,
00297 Index& termination_flag,
00298 bool& inside_cloud,
00299
00300
00301 const Agenda& opt_prop_gas_agenda,
00302 const Agenda& abs_scalar_gas_agenda,
00303 const Index& stokes_dim,
00304 const Index& f_index,
00305 const Vector& p_grid,
00306 const Vector& lat_grid,
00307 const Vector& lon_grid,
00308 const Tensor3& z_field,
00309 const Matrix& r_geoid,
00310 const Matrix& z_surface,
00311 const Tensor3& t_field,
00312 const Tensor4& vmr_field,
00313 const ArrayOfIndex& cloudbox_limits,
00314 const Tensor4& pnd_field,
00315 const ArrayOfSingleScatteringData& scat_data_mono,
00316 const Index& z_field_is_1D,
00317 const Ppath& ppath);
00318
00319 void montecarloGetIncoming(Workspace& ws,
00320 Matrix& iy,
00321 Vector& rte_pos,
00322 Vector& rte_los,
00323 Ppath& ppath,
00324
00325
00326
00327 const Agenda& ppath_step_agenda,
00328 const Agenda& rte_agenda,
00329 const Agenda& iy_space_agenda,
00330 const Agenda& surface_prop_agenda,
00331 const Agenda& iy_cloudbox_agenda,
00332 const Vector& p_grid,
00333 const Vector& lat_grid,
00334 const Vector& lon_grid,
00335 const Tensor3& z_field,
00336 const Tensor3& t_field,
00337 const Tensor4& vmr_field,
00338 const Matrix& r_geoid,
00339 const Matrix& z_surface,
00340 const ArrayOfIndex& cloudbox_limits,
00341 const Index& atmosphere_dim,
00342 const Vector& f_grid,
00343 const Index& stokes_dim
00344 );
00345
00346 Numeric opt_depth_calc(Workspace& ws,
00347 Tensor3& ext_mat,
00348 Matrix& abs_vec,
00349 Numeric& rte_pressure,
00350 Numeric& rte_temperature,
00351 Vector& rte_vmr_list,
00352 const Ppath& ppath,
00353 const Agenda& opt_prop_gas_agenda,
00354 const Agenda& abs_scalar_gas_agenda,
00355 const Index& f_index,
00356 const Vector& p_grid,
00357 const Vector& lat_grid,
00358 const Vector& lon_grid,
00359 const Tensor3& t_field,
00360 const Tensor4& vmr_field,
00361 const Index& atmosphere_dim);
00362
00363 void opt_propCalc(
00364 MatrixView& K,
00365 VectorView& K_abs,
00366 const Numeric za,
00367 const Numeric aa,
00368 const ArrayOfSingleScatteringData& scat_data_mono,
00369 const Index& stokes_dim,
00370 const VectorView& pnd_vec,
00371 const Numeric& rte_temperature
00372 );
00373
00374 void opt_propExtract(
00375 MatrixView& K_spt,
00376 VectorView& K_abs_spt,
00377 const SingleScatteringData& scat_data,
00378 const Numeric& za,
00379 const Numeric& aa,
00380 const Numeric& rte_temperature,
00381 const Index& stokes_dim
00382 );
00383
00384 void pha_mat_singleCalc(
00385 MatrixView& Z,
00386 Numeric za_sca,
00387 Numeric aa_sca,
00388 Numeric za_inc,
00389 Numeric aa_inc,
00390 const ArrayOfSingleScatteringData& scat_data_mono,
00391 const Index& stokes_dim,
00392 const VectorView& pnd_vec,
00393 const Numeric& rte_temperature
00394 );
00395
00396 void pha_mat_singleExtract(
00397 MatrixView& Z_spt,
00398 const SingleScatteringData& scat_data,
00399 const Numeric& za_sca,
00400 const Numeric& aa_sca,
00401 const Numeric& za_inc,
00402 const Numeric& aa_inc,
00403 const Numeric& rte_temperature,
00404 const Index& stokes_dim
00405 );
00406
00407
00408 void Sample_los (
00409 VectorView& new_rte_los,
00410 Numeric& g_los_csc_theta,
00411 MatrixView& Z,
00412 Rng& rng,
00413 const VectorView& rte_los,
00414 const ArrayOfSingleScatteringData& scat_data_mono,
00415 const Index& stokes_dim,
00416 const VectorView& pnd_vec,
00417 const bool& anyptype30,
00418 const VectorView& Z11maxvector,
00419 Numeric Csca,
00420 const Numeric& rte_temperature
00421 );
00422
00423 void Sample_ppathlengthLOS (
00424 Numeric& pathlength,
00425 Numeric& g,
00426 Rng& rng,
00427 const ArrayOfMatrix& TArray,
00428 const ConstVectorView& cum_l_step
00429 );
00430
00431
00432 void TArrayCalc(Workspace& ws,
00433
00434 ArrayOfMatrix& TArray,
00435 ArrayOfMatrix& ext_matArray,
00436 ArrayOfVector& abs_vecArray,
00437 Vector& t_ppath,
00438 Tensor3& ext_mat,
00439 Matrix& abs_vec,
00440 Numeric& rte_pressure,
00441 Numeric& rte_temperature,
00442 Vector& rte_vmr_list,
00443 Matrix& pnd_ppath,
00444
00445 const Ppath& ppath,
00446 const Agenda& opt_prop_gas_agenda,
00447 const Agenda& abs_scalar_gas_agenda,
00448 const Index& f_index,
00449 const Index& stokes_dim,
00450 const ConstVectorView& p_grid_cloud,
00451 const ConstVectorView& lat_grid_cloud,
00452 const ConstVectorView& lon_grid_cloud,
00453 const ConstTensor3View& t_field_cloud,
00454 const ConstTensor4View& vmr_field_cloud,
00455 const Tensor4& pnd_field,
00456 const ArrayOfSingleScatteringData& scat_data_mono,
00457 const ArrayOfIndex& cloudbox_limits
00458 );
00459
00460 #endif // montecarlo_h