VdW_solver.h
Go to the documentation of this file.
1 //
2 // This file is part of the FFEA simulation package
3 //
4 // Copyright (c) by the Theory and Development FFEA teams,
5 // as they appear in the README.md file.
6 //
7 // FFEA is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation, either version 3 of the License, or
10 // (at your option) any later version.
11 //
12 // FFEA is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with FFEA. If not, see <http://www.gnu.org/licenses/>.
19 //
20 // To help us fund FFEA development, we humbly ask that you cite
21 // the research papers on the package.
22 //
23 
24 #ifndef VDW_SOLVER_H_INCLUDED
25 #define VDW_SOLVER_H_INCLUDED
26 
27 #include <math.h>
28 
29 #include "FFEA_return_codes.h"
31 #include "LJ_matrix.h"
32 #include "Blob.h"
33 
34 #define VDW_TYPE_UNDEFINED 0
35 #define VDW_TYPE_STERIC 1
36 #define VDW_TYPE_LJSTERIC 2
37 #define VDW_TYPE_LJ 3
38 
39 class VdW_solver {
40 public:
41  VdW_solver();
42 
43  ~VdW_solver();
44 
45  int init(NearestNeighbourLinkedListCube *surface_face_lookup, vector3 *box_size, LJ_matrix *lj_matrix, scalar &vdw_steric_factor, int num_blobs, int inc_self_vdw, string vdw_type_string, scalar &vdw_steric_dr, int calc_kinetics, bool working_w_static_blobs);
46 
47  int solve(scalar *blob_corr);
48 
51 
52  scalar get_field_energy(int i, int j);
53 
54  void reset_fieldenergy();
55 
56 protected:
57 
60 
63 
65  int num_blobs;
70  int ix, iy, iz;
71  };
72 
75  // static const scalar phi_f[4]; ///< shape function for the center of the "element"
76  static const int adjacent_cell_lookup_table[27][3];
77 
78  static const int num_tri_gauss_quad_points = 3;
79  struct tri_gauss_point {
81  scalar eta[3];
82  };
83  // static const struct tri_gauss_point gauss_pointx[num_tri_gauss_quad_points];
84  static const tri_gauss_point gauss_points[];
85 
86  bool consider_interaction(Face *f1, int l_index_i, int motion_state_i, LinkedListNode<Face> *l_j, scalar *blob_corr);
87 
88  virtual void do_interaction(Face *f1, Face *f2, scalar *blob_corr);
89 
90  bool do_steric_interaction(Face *f1, Face *f2, scalar *blob_corr);
91 
92  void do_lj_interaction(Face *f1, Face *f2, scalar *blob_corr);
93 
94  void do_sticky_xz_interaction(Face *f, bool bottom_wall, scalar dim_y);
95 
97  vector3 (&force_pair_matrix)[num_tri_gauss_quad_points][num_tri_gauss_quad_points],
98  vector3 (&p)[num_tri_gauss_quad_points], vector3 (&q)[num_tri_gauss_quad_points],
99  scalar &vdw_r_eq, scalar &vdw_eps, scalar &energy);
100 
102  vector3 (&force_pair_matrix)[num_tri_gauss_quad_points][num_tri_gauss_quad_points],
103  vector3 (&p)[num_tri_gauss_quad_points], vector3 (&q)[num_tri_gauss_quad_points],
104  scalar &vdw_r_eq, scalar &vdw_eps, scalar &energy);
105 
106  void calc_lj_factors(scalar &mag_r, int index_k, int index_l, scalar &vdw_eps, scalar &vdw_r_eq_6,
107  scalar &force_mag, scalar &e);
108 
109  void calc_ljinterpolated_factors(scalar &mag_r, int index_k, int index_l, scalar &vdw_eps, scalar &vdw_r_eqi,
110  scalar &force_mag, scalar &e);
111 
113 
114  scalar dot(vector3 *p, vector3 *q);
115 
117 
118  scalar minimum_image(scalar delta, scalar size);
119 
120  int vdw_type;
121 };
122 
123 #endif
bool do_steric_interaction(Face *f1, Face *f2, scalar *blob_corr)
Definition: VdW_solver.cpp:451
int total_num_surface_faces
Definition: VdW_solver.h:58
static const int adjacent_cell_lookup_table[27][3]
Definition: VdW_solver.h:76
scalar steric_factor
Proportionality factor to the Steric repulsion.
Definition: VdW_solver.h:73
virtual void do_interaction(Face *f1, Face *f2, scalar *blob_corr)
Definition: VdW_solver.cpp:325
int ix
Definition: VdW_solver.h:70
Definition: VdW_solver.h:79
scalar ** fieldenergy
Definition: VdW_solver.h:64
void reset_fieldenergy()
Definition: VdW_solver.cpp:157
int solve_sticky_wall(scalar h)
Definition: VdW_solver.cpp:214
scalar distance2(vector3 &p, vector3 &q)
Definition: VdW_solver.cpp:536
void calc_ljinterpolated_factors(scalar &mag_r, int index_k, int index_l, scalar &vdw_eps, scalar &vdw_r_eqi, scalar &force_mag, scalar &e)
Definition: VdW_solver.cpp:634
vector3 box_size
Definition: VdW_solver.h:61
LJ_matrix * lj_matrix
Definition: VdW_solver.h:62
int vdw_type
Definition: VdW_solver.h:120
void calc_lj_force_pair_matrix(vector3(&force_pair_matrix)[num_tri_gauss_quad_points][num_tri_gauss_quad_points], vector3(&p)[num_tri_gauss_quad_points], vector3(&q)[num_tri_gauss_quad_points], scalar &vdw_r_eq, scalar &vdw_eps, scalar &energy)
Definition: VdW_solver.cpp:579
scalar dot_with_normal(vector3 *p, vector3 *q, vector3 *n)
Definition: VdW_solver.cpp:545
~VdW_solver()
Definition: VdW_solver.cpp:109
void calc_ljinterpolated_force_pair_matrix(vector3(&force_pair_matrix)[num_tri_gauss_quad_points][num_tri_gauss_quad_points], vector3(&p)[num_tri_gauss_quad_points], vector3(&q)[num_tri_gauss_quad_points], scalar &vdw_r_eq, scalar &vdw_eps, scalar &energy)
Definition: VdW_solver.cpp:646
int init(NearestNeighbourLinkedListCube *surface_face_lookup, vector3 *box_size, LJ_matrix *lj_matrix, scalar &vdw_steric_factor, int num_blobs, int inc_self_vdw, string vdw_type_string, scalar &vdw_steric_dr, int calc_kinetics, bool working_w_static_blobs)
Definition: VdW_solver.cpp:124
int iy
Definition: VdW_solver.h:70
scalar get_field_energy(int i, int j)
Definition: VdW_solver.cpp:557
Definition: VdW_solver.h:69
int inc_self_vdw
whether to include interactions between faces within the same blob, or not.
Definition: VdW_solver.h:66
bool consider_interaction(Face *f1, int l_index_i, int motion_state_i, LinkedListNode< Face > *l_j, scalar *blob_corr)
Definition: VdW_solver.cpp:331
int solve(scalar *blob_corr)
Definition: VdW_solver.cpp:166
scalar minimum_image(scalar delta, scalar size)
Definition: VdW_solver.cpp:549
void do_sticky_xz_interaction(Face *f, bool bottom_wall, scalar dim_y)
Definition: VdW_solver.cpp:389
int calc_kinetics
Definition: VdW_solver.h:67
scalar steric_dr
Constant to calculate the numerical derivative.
Definition: VdW_solver.h:74
Definition: VdW_solver.h:39
void calc_lj_factors(scalar &mag_r, int index_k, int index_l, scalar &vdw_eps, scalar &vdw_r_eq_6, scalar &force_mag, scalar &e)
Definition: VdW_solver.cpp:615
static const int num_tri_gauss_quad_points
Definition: VdW_solver.h:78
scalar W
Definition: VdW_solver.h:80
static const tri_gauss_point gauss_points[]
Definition: VdW_solver.h:84
int iz
Definition: VdW_solver.h:70
void do_lj_interaction(Face *f1, Face *f2, scalar *blob_corr)
Definition: VdW_solver.cpp:235
bool working_w_static_blobs
Definition: VdW_solver.h:68
Definition: NearestNeighbourLinkedListCube.h:34
NearestNeighbourLinkedListCube * surface_face_lookup
Definition: VdW_solver.h:59
VdW_solver()
Definition: VdW_solver.cpp:98
Definition: mat_vec_types.h:90
scalar dot(vector3 *p, vector3 *q)
Definition: VdW_solver.cpp:541
Definition: LJ_matrix.h:46
double scalar
Definition: mat_vec_types.h:36
Definition: Face.h:38
int num_blobs
Definition: VdW_solver.h:65