World.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 WORLD_H_INCLUDED
25 #define WORLD_H_INCLUDED
26 
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <cstring>
30 #include <string>
31 #include <time.h>
32 #include <unistd.h>
33 #include <iostream>
34 #include <fstream>
35 #include <vector>
36 #include <omp.h>
37 #include <ctime>
38 #include <algorithm>
39 
40 #include <boost/algorithm/string.hpp>
41 #include <typeinfo>
42 #include <Eigen/Sparse>
43 #include <Eigen/Eigenvalues>
44 
45 #ifdef FFEA_PARALLEL_FUTURE
46 #include <future>
47 #include <chrono>
48 #endif
49 
50 // #include "MersenneTwister.h"
51 #include "RngStream.h"
53 #include "BEM_Poisson_Boltzmann.h"
54 #include "BiCGSTAB_solver.h"
55 #include "FFEA_user_info.h"
56 #include "FFEA_return_codes.h"
57 #include "FFEA_input_reader.h"
58 #include "mat_vec_types.h"
59 #include "mesh_node.h"
60 #include "tetra_element_linear.h"
61 #include "SimulationParams.h"
62 #include "Solver.h"
64 #include "Face.h"
65 #include "Blob.h"
66 #include "World.h"
67 #include "VdW_solver.h"
68 #include "Steric_solver.h"
69 #include "LJSteric_solver.h"
70 #include "GenSoftSSINT_solver.h"
71 #include "PreComp_solver.h"
72 #include "LJ_matrix.h"
73 #include "BindingSite.h"
74 #include "Spring.h"
76 #include "KineticState.h"
77 #include "rod_structure.h"
78 #include "rod_blob_interface.h"
79 
80 #include "dimensions.h"
81 using namespace std;
82 
83 class World {
84 friend struct ffea_test; //allow our unit test class to see ffea_world's private
85 public:
86  World();
87 
88  ~World();
89 
90  /* */
91  int init(string FFEA_script_filename, int frames_to_delete, int mode, bool writeEnergy);
92 
93  /* */
94  int get_smallest_time_constants();
95 
96  /* */
97  int lem(set<int> blob_indices, int num_modes);
98 
99  /* */
100  int dmm(set<int> blob_indices, int num_modes);
101 
102  /* */
103  int dmm_rp(set<int> blob_indices, int num_modes);
104 
105  /* */
106  int run();
107 
108  /* */
109  int read_and_build_system(vector<string> script_vector);
110 
111  /* */
112  int load_kinetic_maps(vector<string> map_fnames, vector<int> map_from, vector<int> map_to, int blob_index);
113 
114  /* */
115  int build_kinetic_identity_maps();
116 
117  /* */
118  int load_kinetic_states(string states_fname, int blob_index);
119 
120  /* */
121  int load_kinetic_rates(string rates_fname, int blob_index);
122 
123  /* */
124  void print_kinetic_rates_to_screen(int type);
125 
126  /* */
127  void get_system_CoM(vector3 *system_CoM);
128 
129  /* */
130  void get_system_centroid(vector3 *centroid);
131 
132  /* */
133  void get_system_dimensions(vector3 *dimenstion_vector);
134 
135  /* */
136  int enm(int *blob_index, int num_modes);
137 
138  /* */
139  int get_num_blobs();
140 
141 
142 private:
143 
146 
149 
152 
155 
159 
161 
166 
169 
172 
175 
178 
181 
184 
186  unsigned long **Seeds;
187 
190 
193 
196 
202 
205 
208 
211 
215 
218 
222 
224 
225  scalar kineticenergy, strainenergy, springenergy, **springfieldenergy, ssintenergy, preCompenergy;
227 
230 
232 
233  vector3 CoM, CoG;
236 
239 
240  /*
241  *
242  */
243  // SurfaceElementLookup surface_element_lookup;
244 
247 
250 
257 
262 
265 
268 
271 
272 
281 
282 
284 
285  long long step_initial;
286 
287  int load_springs(const char *fname);
288 
289  rod::Rod_blob_interface* rod_blob_interface_from_block(vector<string> block, int interface_id, FFEA_input_reader* systemreader, rod::Rod** rod_array, Blob** blob_array);
290 
291  rod::Rod* rod_from_block(vector<string> block, int block_id, FFEA_input_reader* systemreader);
292 
293  void activate_springs();
294 
295  int apply_springs();
296 
297  scalar get_spring_field_energy(int index0, int index1);
298 
300  int calculate_kinetic_rates();
301 
303  int choose_new_kinetic_state(int blob_index, int *target);
304 
306  int change_kinetic_state(int blob_index, int target_state);
307 
308  int get_next_script_tag(FILE *in, char *buf);
309 
310  void apply_dense_matrix(scalar *y, scalar *M, scalar *x, int N);
311 
312  void do_es();
313 
314  void make_trajectory_from_eigenvector(string traj_out_fname, int blob_index, int mode_index, Eigen_VectorX evec, scalar step);
315 
316  void print_evecs_to_file(string fname, Eigen_MatrixX ev, int num_rows, int num_modes);
317 
318  void print_evals_to_file(string fname, Eigen_VectorX ev, int num_modes, scalar scale);
319 
320  void write_eig_to_files(scalar *evals_ordered, scalar **evecs_ordered, int num_modes, int num_nodes);
321 
322  void write_output_header(FILE *fout, string fname);
323 
324  void print_trajectory_and_measurement_files(int step, scalar wtime);
325  void print_checkpoints();
326  void write_pre_print_to_trajfile(int step);
327  void do_nothing();
328 
329  int prebuild_nearest_neighbour_lookup_wrapper(scalar cell_size);
330 #ifdef FFEA_PARALLEL_FUTURE
331  std::future<void> thread_writingTraj;
332  std::future<int> thread_updatingVdWLL;
333  std::future<int> thread_updatingPCLL;
334  bool updatingVdWLL();
335  bool updatingVdWLL_ready_to_swap();
336  int catch_thread_updatingVdWLL(int step, scalar wtime, int where);
337  bool updatingPCLL();
338  bool updatingPCLL_ready_to_swap();
339  int catch_thread_updatingPCLL(int step, scalar wtime, int where);
340 #endif
341 
342  void make_measurements();
343 
344  void write_measurements_to_file(FILE *fout, int step);
345 
346  void write_detailed_measurements_to_file(FILE *fout);
347 
348  void print_trajectory_conformation_changes(FILE *fout, int step, int *from_index, int *to_index);
349 
350  void print_kinetic_files(int step);
351 
352  void print_static_trajectory(int step, scalar wtime, int blob_index);
353 
355  void calc_blob_corr_matrix(int num_blobs,scalar *blob_corr);
356 
358 
359  int die_with_dignity(int step, scalar wtime);
360 };
361 
362 #endif
KineticState ** kinetic_state
Kinetic State and Rate objects.
Definition: World.h:162
unsigned long ** Seeds
A pointer to an array of arrays, containing the seeds of the different RNGStreams.
Definition: World.h:186
BindingSite_matrix binding_matrix
Binding Interactions matrix.
Definition: World.h:270
Definition: BiCGSTAB_solver.h:34
scalar rmsd
Definition: World.h:234
Definition: Blob.h:94
rod::Rod_blob_interface ** rod_blob_interface_array
1-D array containing pointers to all rod-blob interfaces
Definition: World.h:154
scalar * blob_corr
Definition: World.h:357
scalar * work_vec
Definition: World.h:256
SSINT_matrix ssint_matrix
LJ parameters matrix.
Definition: World.h:267
int num_seeds
The number of seeds stored in Seeds.
Definition: World.h:189
long long step_initial
Definition: World.h:285
Definition: World.h:83
vector3 box_dim
Definition: World.h:283
Definition: rod_structure.h:46
Definition: PreComp_solver.h:49
Eigen::MatrixXd Eigen_MatrixX
Definition: Blob.h:65
FFEA_input_reader * systemreader
Definition: World.h:221
Eigen::VectorXd Eigen_VectorX
Definition: Blob.h:66
STL namespace.
Definition: rod_blob_interface.h:65
Definition: LJ_matrix.h:59
NearestNeighbourLinkedListCube lookup
Data structure keeping track of which `cell&#39; each face lies in (where the world has been discretised ...
Definition: World.h:201
Definition: SimulationParams.h:66
vector3 CoM
Definition: World.h:233
FILE * measurement_out
Output measurement file.
Definition: World.h:210
static const int y
Definition: rod_math_v9.h:53
static const int x
Definition: rod_math_v9.h:52
scalar *** kinetic_rate
Definition: World.h:163
scalar strainenergy
Definition: World.h:225
int num_threads
How many threads are available for parallelisation.
Definition: World.h:180
Spring * spring_array
An array of springs which connect nodes if necessary.
Definition: World.h:168
Definition: KineticState.h:38
Definition: Spring.h:27
Definition: SparseMatrixFixedPattern.h:36
scalar * phi_Gamma
Vector of the electrostatic potential on each surface in entire system.
Definition: World.h:254
scalar *** kinetic_base_rate
Definition: World.h:164
SparseMatrixFixedPattern *** kinetic_map
Maps for kinetic switching of conformations.
Definition: World.h:157
Blob ** active_blob_array
Which conformation is active in each blob.
Definition: World.h:148
RngStream * rng
An array of pointers to random number generators (for use in parallel)
Definition: World.h:183
PreComp_solver pc_solver
PreComputed potentials solver.
Definition: World.h:280
SimulationParams params
Parameters being used for this simulation.
Definition: World.h:195
Definition: RngStream.h:43
FILE * kinetics_out
Output kinetics file.
Definition: World.h:207
rod::Rod ** rod_array
1-D array containing pointers to all rod objects
Definition: World.h:151
Definition: BEM_Poisson_Boltzmann.h:42
RngStream * kinetic_rng
An array of pointers to random number generators for use in kinetics.
Definition: World.h:192
FILE * checkpoint_out
Output Checkpoint file
Definition: World.h:238
int total_num_surface_faces
Number of surface faces in entire system.
Definition: World.h:249
Blob ** blob_array
2-D Array of Blob objects (blob i, conformation j)
Definition: World.h:145
Definition: VdW_solver.h:34
Definition: SimulationParams.h:75
FILE * detailed_meas_out
Definition: World.h:214
int num_springs
And how many springs are there?
Definition: World.h:171
FILE * trajectory_out
Output trajectory file.
Definition: World.h:204
SparseMatrixFixedPattern **** kinetic_return_map
Definition: World.h:158
PreComp_params pc_params
stores info within the <precomp> block at the .ffea file.
Definition: World.h:276
FFEA_input_reader * ffeareader
Definition: World.h:220
Definition: FFEA_input_reader.h:38
BiCGSTAB_solver nonsymmetric_solver
Biconjugate gradient stabilised solver for nonsymmetric matrices.
Definition: World.h:261
FILE * trajbeads_out
Output file for the trajectory beads. Completely optional.
Definition: World.h:217
vector3 L
Definition: World.h:229
int num_binding_sites
How many kinetic binding sites are there?
Definition: World.h:174
VdW_solver * vdw_solver
Definition: World.h:264
Definition: NearestNeighbourLinkedListCube.h:34
scalar * J_Gamma
Definition: World.h:255
bool mass_in_system
Check whether mass is present anywhere, to determine whether or not to write kinetic energies to file...
Definition: World.h:177
Definition: mat_vec_types.h:90
double scalar
Definition: mat_vec_types.h:36
bool writeDetailed
Output detailed measurements file. May be unneccesary.
Definition: World.h:213
BEM_Poisson_Boltzmann PB_solver
BEM solver for the exterior electrostatics.
Definition: World.h:246
Definition: ffea_test.h:51
Definition: BindingSite.h:82