Collective Variables Module - Developer Documentation
Loading...
Searching...
No Matches
colvargrid_integrate.h
1#ifndef COLVARGRID_INTEGRATE_H
2#define COLVARGRID_INTEGRATE_H
3
4
5#include "colvargrid.h"
6
9public:
11
12 virtual ~colvargrid_integrate()
13 {
14 if (need_to_extrapolate_solution && computation_grid != nullptr) {
15 delete computation_grid;
16 computation_grid = nullptr;
17 }
18 }
19
21 colvargrid_integrate(std::vector<colvar *> &colvars,
22 std::shared_ptr<colvar_grid_gradient> gradients, bool is_weighted = false);
23
25 colvargrid_integrate(std::shared_ptr<colvar_grid_gradient> gradients, bool is_weighted = false);
26
28 int integrate(const int itmax, const cvm::real &tol, cvm::real &err, bool verbose = true);
29
32 void update_div_neighbors(const std::vector<int> &ix);
33
37 void update_weighted_div_local(const std::vector<int> &ix);
38
39 void update_div_local(const std::vector<int> &ix0);
40
43 void set_unweighted_div();
44
45 void set_weighted_div();
46
47 void set_div() {
48 if (!is_calculations_prepared)
49 prepare_calculations();
50 if (weighted) set_weighted_div();
51 else set_unweighted_div();
52 };
53
56 inline void set_zero_minimum() { add_constant(-1.0 * minimum_value()); }
57
60
62 // specific point
64
67
68 void prepare_calculations();
69
71 std::vector<cvm::real> laplacian_matrix_test;
72
73protected:
74 bool weighted = false;
75 bool precompute = true;
76
77 colvar_grid_scalar* computation_grid = nullptr;
78 std::vector<cvm::real> div_border_supplement;
79
80 std::vector<int> computation_nx;
81 std::vector<int> computation_nxc;
82
83 size_t computation_nt;
84 bool need_to_extrapolate_solution = false;
85 // Reference to gradient grid
86 std::shared_ptr<colvar_grid_gradient> gradients;
87 std::vector<cvm::real> divergence;
88
89
90 // Scalar grid containing interpolated weights, same mesh as FES and Laplacian
91 // Stored as a flat vector like the 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;
96
99 size_t max_count_F = 1;
100 size_t min_count_F = 0;
102 float lambda_max = 0.5f;
103 float lambda_min = 0.1f;
104 size_t upper_threshold_count = 1;
105 size_t lower_threshold_count = 1;
106
109 size_t m_num_threads = 1;
110
111 bool is_calculations_prepared = false;
112
113 // Get G at a specific point where G is the gradient F if there is enough observation else it's F
114 // multiplied by a coefficient < 1
115 void get_regularized_grad(std::vector<cvm::real> &F, std::vector<int> &ix);
116
117 // Get weight regularized by a lower and upper threshold and a ramp in between
118 cvm::real get_regularized_weight(std::vector<int> &ix);
119
120 // positions of the points in the stencil relative to the stencil center
121 std::vector<std::vector<int>> laplacian_stencil;
122 // positions of the weights to average for each stencil point. This position is relative to the stencil point
123 std::vector<std::vector<std::vector<int>>> weight_stencil;
124 // Coefficient of each point in the stencil
125 std::vector<cvm::real> weight_counts;
126 // relative coordinates (in the data grid) of the points to take into account in the divergence
127 // calculation
128 std::vector<std::vector<int>> surrounding_points_relative_positions;
129 // std::vector<cvm::real> inv_lap_diag; // Inverse of the diagonal of the Laplacian; for
130 // conditioning
131
134 void get_grad(std::vector<cvm::real> &g, std::vector<int> ix);
135
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,
146 cvm::real &err);
147
149 cvm::real l2norm(const std::vector<cvm::real> &x);
150
154 void laplacian(const std::vector<cvm::real> &x, std::vector<cvm::real> &r);
155
156 template <bool initialize_div_supplement>
157 void laplacian_weighted(const std::vector<cvm::real> &x, std::vector<cvm::real> &r);
158
161 template <bool initialize_div_supplement>
162 void linewise_laplacian_weighted_precomputed(const std::vector<cvm::real> &x,
163 std::vector<cvm::real> &r, size_t grid_address);
166 template <bool initialize_div_supplement>
167 void linewise_laplacian_weighted_otf(const std::vector<cvm::real> &x, std::vector<cvm::real> &r,
168 size_t grid_address);
169 typedef void (colvargrid_integrate::*func_pointer)(const std::vector<cvm::real> &,
170 std::vector<cvm::real> &, size_t);
171 func_pointer linewise_laplacian_weighted;
172
173 std::vector<int> convert_base_two(int n, size_t length);
174
176 std::vector<cvm::real>
177 compute_averaged_border_normal_gradient(std::vector<int> ghost_point_coordinates);
178
179 template <typename T>
180 typename std::vector<T>::iterator insert_into_sorted_list(std::vector<T> &sortedList,
181 const T &value);
182
187
188 // Potential enhancement, needs testing
189 // /// \brief From the cells with estimate of the gradient of the free energy propagates the
190 // /// information through interpolation to other cells where data is lacking
191 // void extrapolate_data();
192
194 // Must be used after we initialize nx, the dimensions' sizes of the extrapolated solution
196};
197#endif
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