#ifndef ONED_INVERSION_H #define ONED_INVERSION_H #include #include #include #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 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 canditate = std::vector(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