Files
TomoATT/include/eikonal_solver_2d.h
2025-12-17 10:53:43 +08:00

79 lines
2.2 KiB
C++

#ifndef EIKONAL_SOLVER_2D_H
#define EIKONAL_SOLVER_2D_H
#include <fstream>
#include <string>
#include <iostream>
#include "utils.h"
#include "input_params.h"
#include "grid.h"
#include "1d_models.h"
#include "mpi_funcs.h"
#include "io.h"
class PlainGrid {
public:
PlainGrid(Source& src, InputParams& IP);
~PlainGrid();
void run_iteration(InputParams& IP);
void run_iteration_upwind(InputParams& IP);
//private:
// grid parameters
CUSTOMREAL src_r, src_t, src_p;
CUSTOMREAL src_t_dummy;
CUSTOMREAL rmin_3d, rmax_3d, tmin_3d, tmax_3d, pmin_3d, pmax_3d;
CUSTOMREAL max_degree;
int nr_2d, nt_2d;
// for eikonal solver
int count_cand;
int ii,ii_nr,ii_n2r,ii_pr,ii_p2r,ii_nt,ii_n2t,ii_pt,ii_p2t;
CUSTOMREAL ar,br,at,bt,ar1,ar2,at1,at2,br1,br2,bt1,bt2;
CUSTOMREAL eqn_a, eqn_b, eqn_c, eqn_Delta;
CUSTOMREAL tmp_tau, T_r, T_t, charact_r, charact_t;
bool is_causality;
std::vector<CUSTOMREAL> canditate = std::vector<CUSTOMREAL>(60);
// arrays
// azimuth
CUSTOMREAL *azimuth_2d;
// epicentral distance
CUSTOMREAL *epicentral_distance_2d;
// activated boundaries
//bool *activated_boundaries;
// grid
CUSTOMREAL *r_2d, *t_2d; // coordinates
CUSTOMREAL *fun_2d, *fac_a_2d, *fac_b_2d, *u_2d, *T_2d; // functions
CUSTOMREAL *T0v_2d, *T0r_2d, *T0t_2d, *tau_2d, *tau_old_2d;
bool *is_changed_2d;
// member functions
void allocate_arrays();
void deallocate_arrays();
void load_1d_model(std::string);
void select_1d_model(std::string);
void calculate_stencil_2d(int&, int&);
void calculate_stencil_upwind_2d(int&, int&);
CUSTOMREAL eps_2d = 1e-12;
private:
// # TODO: make id model type selectable by input file
// 1D model used for 2D solver
std::vector<std::vector<CUSTOMREAL>> model_1d_ref = model_1d_prem;
};
void prepare_teleseismic_boundary_conditions(InputParams&, Grid&, IO_utils&);
void run_2d_solver(InputParams&, Source&, IO_utils&);
void interp2d(PlainGrid&, CUSTOMREAL, CUSTOMREAL, CUSTOMREAL&);
void load_2d_traveltime(InputParams&, Source&, Grid&, IO_utils&);
std::string get_2d_tt_filename(const std::string&, Source&);
#endif // EIKONAL_SOLVER_2D_H