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 ssint_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, SSINT_matrix *ssint_matrix,
123  BindingSite_matrix *binding_matrix, RngStream rng[]);
124  int init();
125 
130  int update_internal_forces();
131 
135  int check_inversion();
136 
140  int update_positions();
141 
145  int reset_solver();
146 
150  void translate_linear(vector3 *vec);
151 
157  void rotate(float r11, float r12, float r13, float r21, float r22, float r23, float r31, float r32, float r33, bool beads=false);
158 
162  void rotate(float xang, float yang, float zang, bool beads=false);
163 
169  vector3 position(scalar x, scalar y, scalar z);
170 
175  void position_beads(scalar x, scalar y, scalar z);
176 
181  int forget_beads();
182 
187  void add_steric_nodes();
188 
192  void move(scalar dx, scalar dy, scalar dz);
193 
197  void get_CoM(vector3 *com);
198 
202  void get_centroid(vector3 *com);
203  void calc_and_store_centroid(vector3 &com);
204  vector3 calc_centroid();
205 
206  void set_pos_0();
207  void kinetically_set_faces(bool state);
211  int create_viewer_node_file(const char *node_filename, scalar scale);
212 
216  void write_nodes_to_file(FILE *trajectory_out);
217 
221  void pre_print();
222  void write_pre_print_to_file(FILE *trajectory_out);
223  int toBePrinted_conf[2];
224  int toBePrinted_state[2];
225 
230  int read_nodes_from_file(FILE *trajectory_out);
231 
235  void make_measurements();
236 
240  void write_measurements_to_file(FILE *fout);
241 
245  int calculate_deformation();
246 
247  scalar calc_volume();
248 
249  void make_stress_measurements(FILE *stress_out, int blob_number);
250 
251  /* DEPRECATED
252  * Will be removed.
253  void calculate_vdw_bb_interaction_with_another_blob(FILE *vdw_measurement_out, int other_blob_index);
254  */
255 
259  void calc_centroids_and_normals_of_all_faces();
260 
264  void calc_all_centroids();
265 
266  /*
267  *
268  */
269  int get_num_faces();
270 
274  Face *get_face(int i);
275 
276  Face *absolutely_get_face(int i);
277 
281  tetra_element_linear *get_element(int i);
282 
284  void get_bead_position(int i, arr3 &v);
285 
287  int *get_bead_type_ptr();
288 
290  int get_bead_type(int i);
291 
297  vector<int> get_bead_assignment(int i);
298 
299 
300  scalar get_ssint_area();
301 
302  // /*
303  // *
304  // */
305  // int get_num_surface_elements();
306 
307 
311  int solve_poisson(scalar *phi_gamma_IN, scalar *J_Gamma_OUT);
312 
316  int apply_ctforces();
317 
318 
322  void zero_force();
323 
324  void set_forces_to_zero();
325 
326  // vector3 get_node(int index);
327  // std::array<scalar,3> get_node(int index);
328  void get_node(int index, arr3 &v);
329 
330  void get_node_0(int index, arr3 &v);
331 
332  void copy_node_positions(vector3 *nodes);
333 
334  vector3 ** get_actual_node_positions();
335 
336  void set_node_positions(vector3 *node_pos);
337 
338  void add_force_to_node(vector3 f, int index);
339 
340  // void zero_vdw_bb_measurement_data(); // DEPRECATED
341 
342  // void zero_vdw_xz_measurement_data(); // DEPRECATED
343 
347  void velocity_all(scalar vel_x, scalar vel_y, scalar vel_z);
348 
352  void build_poisson_matrices();
353 
354  // int elements_are_connected(int e1, int e2);
355 
359  int build_linear_node_viscosity_matrix(Eigen::SparseMatrix<scalar> *K);
360 
364  int build_linear_node_rp_diffusion_matrix(Eigen_MatrixX *D);
365 
369  int build_linear_node_elasticity_matrix(Eigen::SparseMatrix<scalar> *A);
370 
374  int build_linear_node_mass_matrix(Eigen::SparseMatrix<scalar> *M);
375 
379  scalar get_mass();
380 
387  void enforce_box_boundaries(vector3 *box_dim);
388 
389  /* DEPRECTATED
390  * Will be removed.
391  * Set the interaction flag for all faces of this Blob back to false (i.e. not interacting)
392  void reset_all_faces();
393  */
394 
395  void linearise_elements();
396 
397  void linearise_force();
398 
399 
400 
402  void compress_blob(scalar compress);
403 
404  int get_num_nodes();
405 
406  int get_num_elements();
407 
408  int get_motion_state();
409 
410  scalar get_scale();
411 
412  scalar get_RandU01();
413 
414  int get_num_linear_nodes();
415 
416  int get_num_beads();
417  bool is_using_beads();
418 
419  scalar get_rmsd();
420 
421  int get_linear_solver();
422 
423  // std::array<scalar,3> get_CoG();
424  // arr3 get_CoG();
425  void get_stored_centroid(arr3 &cog);
426 
427  int get_conformation_index();
428  int get_previous_conformation_index();
429  void set_previous_conformation_index(int index);
430  int get_state_index();
431  void set_state_index(int index);
432  int get_previous_state_index();
433  void set_previous_state_index(int index);
434  BindingSite* get_binding_site(int index);
435 
436  scalar calculate_strain_energy();
437 
438  void get_min_max(vector3 *blob_min, vector3 *blob_max);
439 
440  /* Blob, conformation and state indices */
442  int conformation_index, previous_conformation_index;
443  int state_index, previous_state_index;
444 
448 
449  /*
450  *
451  */
452  //void kinetic_bind(int site_index);
453  //void kinetic_unbind(int site_index);
454 
456  void pin_binding_site(set<int> node_indices);
457 
459  void unpin_binding_site(set<int> node_indices);
460 
461  void print_node_positions();
462  void print_bead_positions();
463  bool there_is_mass();
464  void set_springs_on_blob(bool state);
465  bool there_are_springs();
466  bool there_are_beads();
467  bool there_is_ssint();
468 
469  scalar get_kinetic_energy();
470  scalar get_strain_energy();
471 
472  int pbc_count[3];
473 
474 private:
475 
478 
481 
484 
487 
490 
493 
496 
499 
503 
509 
512 
515 
518 
521 
524 
527 
530 
533 
536 
539 
543 
546  vector <vector<int>> bead_assignment;
547 
551  int *bead_type;
552 
561 
575  char *ctf_r_type;
579 
581  string s_node_filename, s_topology_filename, s_surface_filename,
582  s_material_params_filename, s_stokes_filename, s_ssint_filename,
583  s_pin_filename, s_binding_filename, s_beads_filename;
584 
585 
588 
590  scalar calc_compress, compress;
591 
595 
598 
601 
607 
610 
613 
616 
619 
622 
625 
628 
630 
631  scalar kineticenergy, strainenergy;
633 
636 
638 
639  vector3 CoM, CoG, CoM_0, CoG_0;
642 
651 
653 
655 
656  /*
657  *
658  */
660 
661 
662  /*
663  */
665 
670  int load_nodes(const char *node_filename, scalar scale);
671 
676  int load_topology(const char *topology_filename);
677 
681  int load_surface(const char *surface_filename, SimulationParams* params);
682 
683 
687  int load_surface_no_topology(const char *surface_filename, SimulationParams *params);
688 
692  int load_material_params(const char *material_params_filename);
693 
697  int load_stokes_params(const char *stokes_filename, scalar scale);
698 
699 
703  int load_ssint(const char *ssint_filename, int num_ssint_face_types, string ssint_method);
704 
708  int load_beads(const char *beads_filename, PreComp_params *pc_params, scalar scale);
709 
710 
714  int load_ctforces(string ctforces_fname);
715 
716 
720  int load_binding_sites(); // const char *binding_filename, int num_binding_site_types);
721 
725  int load_pinned_nodes(const char *pin_filename);
726 
730  int create_pinned_nodes(set<int> list);
731 
735  void calc_rest_state_info();
736 
737  /*
738  *
739  */
740  int aggregate_forces_and_solve();
741 
742  /*
743  *
744  */
745  void euler_integrate();
746 
747  /*
748  *
749  */
750  int calculate_node_element_connectivity();
751 
752  int build_mass_matrix();
753 };
754 
755 #endif
int num_pinned_nodes
Definition: Blob.h:498
int * num_contributing_faces
Definition: Blob.h:652
Definition: tetra_element_linear.h:136
int * ctf_sl_faces
Definition: Blob.h:558
int num_beads
Definition: Blob.h:502
scalar * poisson_rhs
Definition: Blob.h:650
Definition: Blob.h:94
Definition: BindingSite.h:41
static const int z
Definition: rod_math_v9.h:54
int * ctf_sl_surfsize
Definition: Blob.h:560
Eigen::Vector3d Eigen_Vector3
Definition: Blob.h:68
string states
Definition: Blob.h:84
scalar * ctf_r_axis
Definition: Blob.h:571
SparseMatrixFixedPattern * M
Definition: Blob.h:659
connectivity_entry * element_connectivity_table
Definition: Blob.h:654
scalar * q
Definition: Blob.h:648
scalar * ctf_r_forces
Definition: Blob.h:566
bool mass_in_blob
Definition: Blob.h:612
Eigen::MatrixXd Eigen_MatrixX
Definition: Blob.h:65
scalar scale
Definition: Blob.h:587
PreComp_params * pc_params
Definition: Blob.h:594
int num_interior_elements
Definition: Blob.h:486
set< int > bsite_pinned_nodes_list
Definition: Blob.h:538
Eigen::VectorXd Eigen_VectorX
Definition: Blob.h:66
int blob_state
Definition: Blob.h:514
string rates
Definition: Blob.h:84
SimulationParams * params
Definition: Blob.h:593
vector3 * force
Definition: Blob.h:624
Definition: LJ_matrix.h:59
SparseMatrixFixedPattern * poisson_interior_matrix
Definition: Blob.h:645
scalar * phi_Omega
Definition: Blob.h:646
int * ctf_l_nodes
Definition: Blob.h:554
Definition: SimulationParams.h:66
int num_surface_elements
Definition: Blob.h:483
static const int y
Definition: rod_math_v9.h:53
scalar rmsd
Definition: Blob.h:640
static const int x
Definition: rod_math_v9.h:52
scalar * phi_Gamma
Definition: Blob.h:647
scalar compress
Definition: Blob.h:590
int linear_solver
Definition: Blob.h:609
int num_sltotal_ctf
Definition: Blob.h:507
int set_centroid
Definition: Blob.h:75
scalar * ctf_sl_forces
Definition: Blob.h:578
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:529
vector3 L
Definition: Blob.h:635
bool ssint_on_blob
Definition: Blob.h:618
int * pinned_nodes_list
Definition: Blob.h:535
int state_index
Definition: Blob.h:443
scalar * ctf_l_forces
Definition: Blob.h:564
int * ctf_slsurf_ndx
Definition: Blob.h:511
mesh_node * node
Definition: Blob.h:523
Definition: RngStream.h:43
int set_rotation
Definition: Blob.h:79
int num_r_ctf
Definition: Blob.h:506
int set_velocity
Definition: Blob.h:77
Definition: CG_solver.h:34
SparseMatrixFixedPattern * poisson_surface_matrix
Definition: Blob.h:644
Definition: Blob.h:72
vector< string > maps
Definition: Blob.h:85
int num_nodes
Definition: Blob.h:477
int * bead_type
Definition: Blob.h:551
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:542
int num_surface_faces
Definition: Blob.h:489
string s_topology_filename
Definition: Blob.h:581
Definition: Solver.h:30
Definition: ConnectivityTypes.h:27
bool beads_on_blob
Definition: Blob.h:621
int num_surface_nodes
Definition: Blob.h:492
int num_slsets_ctf
number of surface sets, corresponding to the length of the ctf_sl_forces, num_slsurf_ctf array ...
Definition: Blob.h:508
Face * surface
Definition: Blob.h:532
scalar ssint_bb_energy
Definition: Blob.h:520
int num_interior_nodes
Definition: Blob.h:495
int rotation_type
Definition: Blob.h:80
RngStream * rng
Definition: Blob.h:627
Eigen::Matrix3d Eigen_Matrix3
Definition: Blob.h:67
int blob_index
Definition: Blob.h:441
int num_elements
Definition: Blob.h:480
static const int i
index of ith thing
Definition: rod_math_v9.h:63
Solver * solver
Definition: Blob.h:606
char * ctf_r_type
Definition: Blob.h:575
CG_solver * poisson_solver
Definition: Blob.h:643
BindingSite_matrix * binding_matrix
Definition: Blob.h:597
scalar strainenergy
Definition: Blob.h:631
scalar * toBePrinted_nodes
Definition: Blob.h:664
vector< vector< int > > bead_assignment
Definition: Blob.h:546
scalar mass
Definition: Blob.h:517
int num_binding_sites
Definition: Blob.h:446
BindingSite * binding_site
Definition: Blob.h:447
vector3 ** node_position
Definition: Blob.h:526
Definition: mat_vec_types.h:90
vector3 CoM_0
Definition: Blob.h:639
double scalar
Definition: mat_vec_types.h:36
Definition: Face.h:38
int * ctf_r_nodes
Definition: Blob.h:556
int num_l_ctf
Definition: Blob.h:505
bool springs_on_blob
Definition: Blob.h:615
int previous_conformation_index
Definition: Blob.h:442
scalar * nodal_q
Definition: Blob.h:649
scalar velocity[3]
Definition: Blob.h:78
Definition: BindingSite.h:82
SSINT_matrix * ssint_matrix
Definition: Blob.h:600
vector< int > maps_conf_index_from
Definition: Blob.h:86