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

109 lines
3.9 KiB
C++

#ifndef ONED_INVERSION_H
#define ONED_INVERSION_H
#include <fstream>
#include <string>
#include <iostream>
#include "input_params.h"
#include "grid.h"
#include "utils.h"
#include "config.h"
#include "receiver.h"
class OneDInversion {
public:
OneDInversion(InputParams&, Grid&);
~OneDInversion();
// grid parameters
int nr_1dinv, nt_1dinv; // number of grid points in r and epicenter distance
CUSTOMREAL *r_1dinv, *t_1dinv; // coordinates
CUSTOMREAL dr_1dinv, dt_1dinv; // grid spacing
// parameters on grid nodes (for model)
CUSTOMREAL *slowness_1dinv; // slowness
CUSTOMREAL *fac_a_1dinv; // fac_a
CUSTOMREAL *fac_b_1dinv; // fac_b
// parameters on grid nodes (for eikonal solver and adjoint solver)
CUSTOMREAL *tau_1dinv; // tau
CUSTOMREAL *tau_old_1dinv; // tau_old
CUSTOMREAL *T_1dinv; // T
CUSTOMREAL *Tadj_1dinv; // Tadj
CUSTOMREAL *Tadj_density_1dinv; // Tadj
CUSTOMREAL *T0v_1dinv; // T0v
CUSTOMREAL *T0r_1dinv; // T0r
CUSTOMREAL *T0t_1dinv; // T0t
bool *is_changed_1dinv; // is_changed
CUSTOMREAL *delta_1dinv; // delta
// parameters on grid nodes (for inversion)
CUSTOMREAL *Ks_1dinv; // Ks
CUSTOMREAL *Ks_density_1dinv; // Ks_density
CUSTOMREAL *Ks_over_Kden_1dinv; // Ks_over_Kdensity
CUSTOMREAL *Ks_multigrid_1dinv; // (Ks_over_Kdensity) parameterized by multigrid
CUSTOMREAL *Ks_multigrid_previous_1dinv; // Ks_multigrid at previous iteration
// parameters for optimization
CUSTOMREAL v_obj;
CUSTOMREAL old_v_obj;
// functions
std::vector<CUSTOMREAL> run_simulation_one_step_1dinv(InputParams&, IO_utils&, const int&);
void model_optimize_1dinv(InputParams&, Grid&, IO_utils&, const int&);
// h5 file output
void write_T_1dinv(IO_utils&, const std::string&, const int&);
void write_Tadj_1dinv(IO_utils&, const std::string&, const int&);
void write_vel_1dinv(IO_utils&, const int&);
private:
// 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);
// member functions
// class functions
void generate_2d_mesh(InputParams&);
void deallocate_arrays();
void allocate_arrays();
void load_1d_model(Grid&);
int I2V_1DINV(const int&,const int&);
// "run_simulation_one_step_1dinv" subfunctions:
void eikonal_solver_2d(InputParams&, int& );
void initialize_eikonal_array(CUSTOMREAL);
void FSM_2d();
void calculate_stencil(const int&, const int&);
void calculate_synthetic_traveltime_and_adjoint_source(InputParams&, int& );
CUSTOMREAL interpolate_2d_traveltime(const CUSTOMREAL&, const CUSTOMREAL&);
void adjoint_solver_2d(InputParams&, const int&, const int&);
void initialize_adjoint_array(InputParams&, const int&, const int&);
void FSM_2d_adjoint(const int&);
void calculate_stencil_adj(const int&, const int&);
void initialize_kernel_1d();
void calculate_kernel_1d();
// "model_optimize_1dinv" subfunctions:
void kernel_processing_1dinv(Grid&);
void density_normalization_1dinv();
void multi_grid_parameterization_1dinv(Grid&);
void model_update_1dinv(const int&);
void determine_step_size_1dinv(const int&);
CUSTOMREAL norm_1dinv(const CUSTOMREAL*, const int&);
void generate_3d_model(Grid&);
};
#endif // ONED_INVERSION_H