1#ifndef COLVARGRID_INTEGRATE_H
2#define COLVARGRID_INTEGRATE_H
14 if (need_to_extrapolate_solution && computation_grid !=
nullptr) {
15 delete computation_grid;
16 computation_grid =
nullptr;
22 std::shared_ptr<colvar_grid_gradient> gradients,
bool is_weighted =
false);
39 void update_div_local(
const std::vector<int> &ix0);
45 void set_weighted_div();
48 if (!is_calculations_prepared)
49 prepare_calculations();
50 if (weighted) set_weighted_div();
68 void prepare_calculations();
74 bool weighted =
false;
75 bool precompute =
true;
78 std::vector<cvm::real> div_border_supplement;
80 std::vector<int> computation_nx;
81 std::vector<int> computation_nxc;
83 size_t computation_nt;
84 bool need_to_extrapolate_solution =
false;
86 std::shared_ptr<colvar_grid_gradient> gradients;
87 std::vector<cvm::real> divergence;
92 std::vector<cvm::real> weights;
93 std::vector<cvm::real> regularized_weights;
94 std::vector<cvm::real> laplacian_coefficients;
95 std::vector<size_t> sorted_counts;
100 size_t min_count_F = 0;
103 float lambda_min = 0.1f;
104 size_t upper_threshold_count = 1;
105 size_t lower_threshold_count = 1;
111 bool is_calculations_prepared =
false;
115 void get_regularized_grad(std::vector<cvm::real> &F, std::vector<int> &ix);
118 cvm::real get_regularized_weight(std::vector<int> &ix);
121 std::vector<std::vector<int>> laplacian_stencil;
123 std::vector<std::vector<std::vector<int>>> weight_stencil;
125 std::vector<cvm::real> weight_counts;
128 std::vector<std::vector<int>> surrounding_points_relative_positions;
134 void get_grad(std::vector<cvm::real> &g, std::vector<int> ix);
144 void nr_linbcg_sym(
const bool weighted,
const std::vector<cvm::real> &b,
145 std::vector<cvm::real> &x,
const cvm::real &tol,
const int itmax,
int &iter,
154 void laplacian(
const std::vector<cvm::real> &x, std::vector<cvm::real> &r);
156 template <
bool initialize_div_supplement>
161 template <
bool initialize_div_supplement>
163 std::vector<cvm::real> &r,
size_t grid_address);
166 template <
bool initialize_div_supplement>
168 size_t grid_address);
170 std::vector<cvm::real> &, size_t);
171 func_pointer linewise_laplacian_weighted;
173 std::vector<int> convert_base_two(
int n,
size_t length);
176 std::vector<cvm::real>
179 template <
typename T>
180 typename std::vector<T>::iterator insert_into_sorted_list(std::vector<T> &sortedList,
Class for accumulating a scalar function on a grid.
Definition: colvargrid.h:1312
cvm::real minimum_value() const
Return the lowest value.
Definition: colvargrid.cpp:245
void add_constant(cvm::real const &t)
Add a constant to all elements (fast loop)
Definition: colvargrid.h:682
Integrate (1D, 2D or 3D) gradients.
Definition: colvargrid_integrate.h:8
void prepare_laplacian_stencils()
Computes all the relative positions of objects necessary to calculate the laplacian at a.
Definition: colvargrid_integrate.cpp:909
std::vector< cvm::real > laplacian_matrix_test
Array holding divergence + boundary terms (modified Neumann) if not periodic.
Definition: colvargrid_integrate.h:71
float lambda_max
max and min count to regularize the weights, see user documentation
Definition: colvargrid_integrate.h:102
void update_div_neighbors(const std::vector< int > &ix)
Update matrix containing divergence and boundary conditions based on new gradient point value,...
Definition: colvargrid_integrate.cpp:147
void linewise_laplacian_weighted_otf(const std::vector< cvm::real > &x, std::vector< cvm::real > &r, size_t grid_address)
Definition: colvargrid_integrate.cpp:816
size_t max_count_F
Definition: colvargrid_integrate.h:99
bool b_smoothed
Flag requesting the use of a smoothed version of the gradient (default: false)
Definition: colvargrid_integrate.h:59
int init_Poisson_computation()
Initialize grid sizes and OpenMP threads for Poisson integration.
Definition: colvargrid_integrate.cpp:1263
cvm::real l2norm(const std::vector< cvm::real > &x)
L2 norm of a vector.
Definition: colvargrid_integrate.cpp:1253
void set_unweighted_div()
Set matrix containing divergence and boundary conditions based on complete gradient grid.
Definition: colvargrid_integrate.cpp:129
std::vector< cvm::real > compute_averaged_border_normal_gradient(std::vector< int > ghost_point_coordinates)
Computes the normal border gradient for ghost points calculations in the weighted scheme.
Definition: colvargrid_integrate.cpp:1065
void laplacian(const std::vector< cvm::real > &x, std::vector< cvm::real > &r)
Multiplication by sparse matrix representing Lagrangian (or its transpose)
Definition: colvargrid_integrate.cpp:345
void prepare_divergence_stencils()
Computes all the relative positions to calculate the divergence at a specific point.
Definition: colvargrid_integrate.cpp:309
void get_grad(std::vector< cvm::real > &g, std::vector< int > ix)
Definition: colvargrid_integrate.cpp:184
size_t m_num_threads
Definition: colvargrid_integrate.h:109
int integrate(const int itmax, const cvm::real &tol, cvm::real &err, bool verbose=true)
Calculate potential from divergence (in 2D); return number of steps.
Definition: colvargrid_integrate.cpp:52
void nr_linbcg_sym(const bool weighted, const std::vector< cvm::real > &b, std::vector< cvm::real > &x, const cvm::real &tol, const int itmax, int &iter, cvm::real &err)
Solve linear system based on CG, valid for symmetric matrices only atimes : left multiplication by LH...
Definition: colvargrid_integrate.cpp:1150
void update_weighted_div_local(const std::vector< int > &ix)
Update matrix containing divergence and boundary conditions called by update_div_neighbors and by col...
Definition: colvargrid_integrate.cpp:319
void extrapolate_potential()
Definition: colvargrid_integrate.cpp:1211
void set_zero_minimum()
Add constant to potential so that its minimum value is zero Useful e.g. for output.
Definition: colvargrid_integrate.h:56
void linewise_laplacian_weighted_precomputed(const std::vector< cvm::real > &x, std::vector< cvm::real > &r, size_t grid_address)
Definition: colvargrid_integrate.cpp:772
void laplacian_weighted(const std::vector< cvm::real > &x, std::vector< cvm::real > &r)
Definition: colvargrid_integrate.cpp:874
double real
Defining an abstract real number allows to switch precision.
Definition: colvarmodule.h:99