Blob.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 /*
25  * Blob.h
26  */
27 
28 #ifndef BLOB_H_INCLUDED
29 #define BLOB_H_INCLUDED
30 
31 #include "SparsityPattern.h"
32 #include "ConnectivityTypes.h"
33 
34 #include <stdio.h>
35 #include <math.h>
36 #include <set>
37 #include <omp.h>
38 #include <algorithm> // std::find
39 #include <Eigen/Sparse>
40 #include "FFEA_return_codes.h"
41 #include "mat_vec_types.h"
42 #include "mat_vec_fns.h"
43 #include "mesh_node.h"
44 #include "tetra_element_linear.h"
45 #include "SimulationParams.h"
46 #include "Solver.h"
49 #include "MassLumpedSolver.h"
50 #include "NoMassCGSolver.h"
51 #include "Face.h"
52 #include "CG_solver.h"
53 #include "BEM_Poisson_Boltzmann.h"
54 #include "LJ_matrix.h"
55 #include "BindingSite.h"
56 #include "PreComp_solver.h"
57 #include "dimensions.h"
58 
59 #ifdef USE_DOUBLE_LESS
60 typedef Eigen::MatrixXf Eigen_MatrixX;
61 typedef Eigen::VectorXf Eigen_VectorX;
62 typedef Eigen::Matrix3f Eigen_Matrix3;
63 typedef Eigen::Vector3f Eigen_Vector3;
64 #else
65 typedef Eigen::MatrixXd Eigen_MatrixX;
66 typedef Eigen::VectorXd Eigen_VectorX;
67 typedef Eigen::Matrix3d Eigen_Matrix3;
68 typedef Eigen::Vector3d Eigen_Vector3;
69 #endif
70 
71 
72 struct Blob_conf {
73 
74  // initial placement, orientation and velocity:
82 
83  // kinetics:
84  string states, rates;
85  vector<string> maps;
87 
88 };
89 
90 
91 /*
92  * The "Blob" class
93  */
94 class Blob {
95 public:
96 
102  Blob();
103 
108  ~Blob();
109 
117  int config(const int blob_index, const int conformation_index, string node_filename,
118  string topology_filename, string surface_filename, string material_params_filename,
119  string stokes_filename, string vdw_filename, string pin_filename,
120  string binding_filename, string beads_filename, scalar scale, scalar calc_compress,
121  scalar compress, int linear_solver, int blob_state, SimulationParams *params,
122  PreComp_params *pc_params, LJ_matrix *lj_matrix,
123  BindingSite_matrix *binding_matrix, RngStream rng[]);
124  int init();
125 
130  int update_internal_forces();
131 
135  int update_positions();
136 
140  int reset_solver();
141 
145  void translate_linear(vector3 *vec);
146 
152  void rotate(float r11, float r12, float r13, float r21, float r22, float r23, float r31, float r32, float r33, bool beads=false);
153 
157  void rotate(float xang, float yang, float zang, bool beads=false);
158 
164  vector3 position(scalar x, scalar y, scalar z);
165 
170  void position_beads(scalar x, scalar y, scalar z);
171 
176  int forget_beads();
177 
182  void add_steric_nodes();
183 
187  void move(scalar dx, scalar dy, scalar dz);
188 
192  void get_CoM(vector3 *com);
193 
197  void get_centroid(vector3 *com);
198  void calc_and_store_centroid(vector3 &com);
199  vector3 calc_centroid();
200 
201  void set_pos_0();
202  void kinetically_set_faces(bool state);
206  int create_viewer_node_file(const char *node_filename, scalar scale);
207 
211  void write_nodes_to_file(FILE *trajectory_out);
212 
216  void pre_print();
217  void write_pre_print_to_file(FILE *trajectory_out);
218  int toBePrinted_conf[2];
219  int toBePrinted_state[2];
220 
225  int read_nodes_from_file(FILE *trajectory_out);
226 
230  void make_measurements();
231 
235  void write_measurements_to_file(FILE *fout);
236 
240  int calculate_deformation();
241 
242  scalar calc_volume();
243 
244  void make_stress_measurements(FILE *stress_out, int blob_number);
245 
246  /* DEPRECATED
247  * Will be removed.
248  void calculate_vdw_bb_interaction_with_another_blob(FILE *vdw_measurement_out, int other_blob_index);
249  */
250 
254  void calc_centroids_and_normals_of_all_faces();
255 
259  void calc_all_centroids();
260 
261  /*
262  *
263  */
264  int get_num_faces();
265 
269  Face *get_face(int i);
270 
271  Face *absolutely_get_face(int i);
272 
276  tetra_element_linear *get_element(int i);
277 
279  void get_bead_position(int i, arr3 &v);
280 
282  int *get_bead_type_ptr();
283 
285  int get_bead_type(int i);
286 
292  vector<int> get_bead_assignment(int i);
293 
294 
295  scalar get_vdw_area();
296 
297  // /*
298  // *
299  // */
300  // int get_num_surface_elements();
301 
302 
306  int solve_poisson(scalar *phi_gamma_IN, scalar *J_Gamma_OUT);
307 
311  int apply_ctforces();
312 
313 
317  void zero_force();
318 
319  void set_forces_to_zero();
320 
321  // vector3 get_node(int index);
322  // std::array<scalar,3> get_node(int index);
323  void get_node(int index, arr3 &v);
324 
325  void copy_node_positions(vector3 *nodes);
326 
327  vector3 ** get_actual_node_positions();
328 
329  void set_node_positions(vector3 *node_pos);
330 
331  void add_force_to_node(vector3 f, int index);
332 
333  // void zero_vdw_bb_measurement_data(); // DEPRECATED
334 
335  // void zero_vdw_xz_measurement_data(); // DEPRECATED
336 
340  void velocity_all(scalar vel_x, scalar vel_y, scalar vel_z);
341 
345  void build_poisson_matrices();
346 
347  // int elements_are_connected(int e1, int e2);
348 
352  int build_linear_node_viscosity_matrix(Eigen::SparseMatrix<scalar> *K);
353 
357  int build_linear_node_rp_diffusion_matrix(Eigen_MatrixX *D);
358 
362  int build_linear_node_elasticity_matrix(Eigen::SparseMatrix<scalar> *A);
363 
367  int build_linear_node_mass_matrix(Eigen::SparseMatrix<scalar> *M);
368 
372  scalar get_mass();
373 
380  void enforce_box_boundaries(vector3 *box_dim);
381 
382  /* DEPRECTATED
383  * Will be removed.
384  * Set the interaction flag for all faces of this Blob back to false (i.e. not interacting)
385  void reset_all_faces();
386  */
387 
388  void linearise_elements();
389 
390  void linearise_force();
391 
392 
393 
395  void compress_blob(scalar compress);
396 
397  int get_num_nodes();
398 
399  int get_num_elements();
400 
401  int get_motion_state();
402 
403  scalar get_scale();
404 
405  scalar get_RandU01();
406 
407  int get_num_linear_nodes();
408 
409  int get_num_beads();
410  bool is_using_beads();
411 
412  scalar get_rmsd();
413 
414  int get_linear_solver();
415 
416  // std::array<scalar,3> get_CoG();
417  // arr3 get_CoG();
418  void get_stored_centroid(arr3 &cog);
419 
420  int get_conformation_index();
421  int get_previous_conformation_index();
422  void set_previous_conformation_index(int index);
423  int get_state_index();
424  void set_state_index(int index);
425  int get_previous_state_index();
426  void set_previous_state_index(int index);
427  BindingSite* get_binding_site(int index);
428 
429  scalar calculate_strain_energy();
430 
431  void get_min_max(vector3 *blob_min, vector3 *blob_max);
432 
433  /* Blob, conformation and state indices */
435  int conformation_index, previous_conformation_index;
436  int state_index, previous_state_index;
437 
441 
442  /*
443  *
444  */
445  //void kinetic_bind(int site_index);
446  //void kinetic_unbind(int site_index);
447 
449  void pin_binding_site(set<int> node_indices);
450 
452  void unpin_binding_site(set<int> node_indices);
453 
454  void print_node_positions();
455  void print_bead_positions();
456  bool there_is_mass();
457  void set_springs_on_blob(bool state);
458  bool there_are_springs();
459  bool there_are_beads();
460  bool there_is_vdw();
461 
462  scalar get_kinetic_energy();
463  scalar get_strain_energy();
464 
465  int pbc_count[3];
466 
467 private:
468 
471 
474 
477 
480 
483 
486 
489 
492 
496 
502 
505 
508 
511 
514 
517 
520 
523 
526 
529 
532 
536 
539  vector <vector<int>> bead_assignment;
540 
544  int *bead_type;
545 
554 
568  char *ctf_r_type;
572 
574  string s_node_filename, s_topology_filename, s_surface_filename,
575  s_material_params_filename, s_stokes_filename, s_vdw_filename,
576  s_pin_filename, s_binding_filename, s_beads_filename;
577 
578 
581 
583  scalar calc_compress, compress;
584 
588 
591 
594 
600 
603 
606 
609 
612 
615 
618 
621 
623 
624  scalar kineticenergy, strainenergy;
626 
629 
631 
632  vector3 CoM, CoG, CoM_0, CoG_0;
635 
644 
646 
648 
649  /*
650  *
651  */
653 
654 
655  /*
656  */
658 
663  int load_nodes(const char *node_filename, scalar scale);
664 
669  int load_topology(const char *topology_filename);
670 
674  int load_surface(const char *surface_filename, SimulationParams* params);
675 
676 
680  int load_surface_no_topology(const char *surface_filename, SimulationParams *params);
681 
685  int load_material_params(const char *material_params_filename);
686 
690  int load_stokes_params(const char *stokes_filename, scalar scale);
691 
692 
696  int load_vdw(const char *vdw_filename, int num_vdw_face_types, string vdw_method);
697 
701  int load_beads(const char *beads_filename, PreComp_params *pc_params, scalar scale);
702 
703 
707  int load_ctforces(string ctforces_fname);
708 
709 
713  int load_binding_sites(); // const char *binding_filename, int num_binding_site_types);
714 
718  int load_pinned_nodes(const char *pin_filename);
719 
723  int create_pinned_nodes(set<int> list);
724 
728  void calc_rest_state_info();
729 
730  /*
731  *
732  */
733  int aggregate_forces_and_solve();
734 
735  /*
736  *
737  */
738  void euler_integrate();
739 
740  /*
741  *
742  */
743  int calculate_node_element_connectivity();
744 
745  int build_mass_matrix();
746 };
747 
748 #endif
int num_pinned_nodes
Definition: Blob.h:491
int * num_contributing_faces
Definition: Blob.h:645
Definition: tetra_element_linear.h:136
int * ctf_sl_faces
Definition: Blob.h:551
int num_beads
Definition: Blob.h:495
scalar * poisson_rhs
Definition: Blob.h:643
Definition: Blob.h:94
Definition: BindingSite.h:41
int * ctf_sl_surfsize
Definition: Blob.h:553
Eigen::Vector3d Eigen_Vector3
Definition: Blob.h:68
string states
Definition: Blob.h:84
scalar * ctf_r_axis
Definition: Blob.h:564
SparseMatrixFixedPattern * M
Definition: Blob.h:652
connectivity_entry * element_connectivity_table
Definition: Blob.h:647
scalar * q
Definition: Blob.h:641
scalar * ctf_r_forces
Definition: Blob.h:559
bool mass_in_blob
Definition: Blob.h:605
Eigen::MatrixXd Eigen_MatrixX
Definition: Blob.h:65
scalar scale
Definition: Blob.h:580
PreComp_params * pc_params
Definition: Blob.h:587
int num_interior_elements
Definition: Blob.h:479
set< int > bsite_pinned_nodes_list
Definition: Blob.h:531
Eigen::VectorXd Eigen_VectorX
Definition: Blob.h:66
int blob_state
Definition: Blob.h:507
string rates
Definition: Blob.h:84
SimulationParams * params
Definition: Blob.h:586
vector3 * force
Definition: Blob.h:617
SparseMatrixFixedPattern * poisson_interior_matrix
Definition: Blob.h:638
scalar * phi_Omega
Definition: Blob.h:639
int * ctf_l_nodes
Definition: Blob.h:547
Definition: SimulationParams.h:66
int num_surface_elements
Definition: Blob.h:476
scalar rmsd
Definition: Blob.h:633
scalar * phi_Gamma
Definition: Blob.h:640
scalar compress
Definition: Blob.h:583
int linear_solver
Definition: Blob.h:602
int num_sltotal_ctf
Definition: Blob.h:500
int set_centroid
Definition: Blob.h:75
scalar * ctf_sl_forces
Definition: Blob.h:571
Definition: SparseMatrixFixedPattern.h:36
scalar arr3[3]
Definition: mat_vec_types.h:70
scalar centroid[3]
Definition: Blob.h:76
tetra_element_linear * elem
Definition: Blob.h:522
vector3 L
Definition: Blob.h:628
int * pinned_nodes_list
Definition: Blob.h:528
int state_index
Definition: Blob.h:436
scalar * ctf_l_forces
Definition: Blob.h:557
int * ctf_slsurf_ndx
Definition: Blob.h:504
mesh_node * node
Definition: Blob.h:516
Definition: RngStream.h:43
int set_rotation
Definition: Blob.h:79
int num_r_ctf
Definition: Blob.h:499
int set_velocity
Definition: Blob.h:77
Definition: CG_solver.h:34
SparseMatrixFixedPattern * poisson_surface_matrix
Definition: Blob.h:637
Definition: Blob.h:72
vector< string > maps
Definition: Blob.h:85
int num_nodes
Definition: Blob.h:470
int * bead_type
Definition: Blob.h:544
Definition: mesh_node.h:39
scalar rotation[9]
Definition: Blob.h:81
vector< int > maps_conf_index_to
Definition: Blob.h:86
Definition: SimulationParams.h:75
scalar * bead_position
Definition: Blob.h:535
int num_surface_faces
Definition: Blob.h:482
Definition: Solver.h:30
Definition: ConnectivityTypes.h:27
bool beads_on_blob
Definition: Blob.h:614
int num_surface_nodes
Definition: Blob.h:485
int num_slsets_ctf
number of surface sets, corresponding to the length of the ctf_sl_forces, num_slsurf_ctf array ...
Definition: Blob.h:501
Face * surface
Definition: Blob.h:525
int num_interior_nodes
Definition: Blob.h:488
int rotation_type
Definition: Blob.h:80
RngStream * rng
Definition: Blob.h:620
string s_vdw_filename
Definition: Blob.h:574
Eigen::Matrix3d Eigen_Matrix3
Definition: Blob.h:67
int blob_index
Definition: Blob.h:434
int num_elements
Definition: Blob.h:473
Solver * solver
Definition: Blob.h:599
char * ctf_r_type
Definition: Blob.h:568
CG_solver * poisson_solver
Definition: Blob.h:636
BindingSite_matrix * binding_matrix
Definition: Blob.h:590
scalar strainenergy
Definition: Blob.h:624
scalar vdw_bb_energy
Definition: Blob.h:513
scalar * toBePrinted_nodes
Definition: Blob.h:657
vector< vector< int > > bead_assignment
Definition: Blob.h:539
scalar mass
Definition: Blob.h:510
LJ_matrix * lj_matrix
Definition: Blob.h:593
int num_binding_sites
Definition: Blob.h:439
BindingSite * binding_site
Definition: Blob.h:440
vector3 ** node_position
Definition: Blob.h:519
Definition: mat_vec_types.h:90
vector3 CoM_0
Definition: Blob.h:632
Definition: LJ_matrix.h:46
double scalar
Definition: mat_vec_types.h:36
Definition: Face.h:38
int * ctf_r_nodes
Definition: Blob.h:549
int num_l_ctf
Definition: Blob.h:498
bool springs_on_blob
Definition: Blob.h:608
int previous_conformation_index
Definition: Blob.h:435
scalar * nodal_q
Definition: Blob.h:642
bool vdw_on_blob
Definition: Blob.h:611
scalar velocity[3]
Definition: Blob.h:78
Definition: BindingSite.h:82
vector< int > maps_conf_index_from
Definition: Blob.h:86