/* GRChombo * Copyright 2012 The GRChombo collaboration. * Please refer to LICENSE in GRChombo's root directory. */ #ifndef CONSTRAINTSEXTRACTION_HPP_ #define CONSTRAINTSEXTRACTION_HPP_ #include "AMRInterpolator.hpp" #include "InterpolationQuery.hpp" #include "Lagrange.hpp" #include "SimulationParametersBase.hpp" #include "SmallDataIO.hpp" #include "SphericalHarmonics.hpp" #include "UserVariables.hpp" #include #include #include #include #include //! The class allows extraction of constraints (Ham and Mom) along x-axis class ConstraintsExtraction { private: //! Params for extraction const int m_comp1; const int m_comp2; const int m_num_points; const double m_L; const std::array m_origin; // Origin of an extraction line const double m_dt; const double m_time; public: //! The constructor ConstraintsExtraction(int a_comp1, int a_comp2, int a_num_points, double a_L, std::array a_origin, double a_dt, double a_time) : m_comp1(a_comp1), m_comp2(a_comp2), m_num_points(a_num_points), m_origin(a_origin), m_L(a_L), m_dt(a_dt), m_time(a_time) { } //! Destructor ~ConstraintsExtraction() {} //! Execute the query void execute_query(AMRInterpolator> *a_interpolator, std::string a_file_prefix) const { CH_TIME("CustomExtraction::execute_query"); if (a_interpolator == nullptr) { MayDay::Error("Interpolator has not been initialised."); } std::vector interp_ham_data(m_num_points); std::vector interp_mom_data(m_num_points); std::vector interp_x(m_num_points); std::vector interp_y(m_num_points); std::vector interp_z(m_num_points); // Work out the coordinates // go out along x-axis from 0 to L for (int idx = 0; idx < m_num_points; ++idx) { interp_x[idx] = (double(idx) / double(m_num_points) * m_L); interp_y[idx] = m_origin[1]; interp_z[idx] = m_origin[2]; } // set up the query InterpolationQuery query_ham(m_num_points); query_ham.setCoords(0, interp_x.data()) .setCoords(1, interp_y.data()) .setCoords(2, interp_z.data()) .addComp(m_comp1, interp_ham_data.data(), Derivative::LOCAL, VariableType::diagnostic); // evolution or diagnostic InterpolationQuery query_mom(m_num_points); query_mom.setCoords(0, interp_x.data()) .setCoords(1, interp_y.data()) .setCoords(2, interp_z.data()) .addComp(m_comp2, interp_mom_data.data(), Derivative::LOCAL, VariableType::diagnostic); // evolution or diagnostic // submit the query a_interpolator->interp(query_ham); a_interpolator->interp(query_mom); // now write out bool first_step = (m_time == 0.0); double restart_time = 0.0; SmallDataIO output_file(a_file_prefix, m_dt, m_time, restart_time, SmallDataIO::APPEND, first_step); std::vector header_line(2); if (first_step) { header_line[0] = "Ham"; header_line[1] = "Mom"; output_file.write_header_line(header_line, "x"); } for (int idx = 0; idx < m_num_points; ++idx) { std::vector data(2); data[0] = interp_ham_data[idx]; data[1] = interp_mom_data[idx]; output_file.write_data_line(data, interp_x[idx]); } } }; #endif /* CONSTRAINTSEXTRACTION_HPP_ */