-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathTubuleSystem.hpp
219 lines (184 loc) · 5.2 KB
/
TubuleSystem.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/**
* @file TubuleSystem.hpp
* @author wenyan4work ([email protected])
* @brief Mixed system of microtubule and protein
* @version 0.1
* @date 2018-12-14
*
* @copyright Copyright (c) 2018
*
*/
#ifndef TUBULESYSTEM_HPP_
#define TUBULESYSTEM_HPP_
// Protein
#include "Protein/ProteinConfig.hpp"
#include "Protein/ProteinData.hpp"
#include "TubuleBind.hpp"
// Sylinder as Tubule
#include "Constraint/ConstraintSolver.hpp"
#include "FDPS/particle_simulator.hpp"
#include "MPI/MixPairInteraction.hpp"
#include "Sylinder/SylinderSystem.hpp"
#include "Trilinos/TpetraUtil.hpp"
#include "Util/TRngPool.hpp"
#include <memory>
#include <mpi.h>
#include <omp.h>
/**
* @brief Mixed system of microtubule and protein
*
*/
class TubuleSystem {
public:
const ProteinConfig proteinConfig; ///< the ProteinConfig file
/**
* @brief Construct a new TubuleSystem object
*
* @param configFileSystem
* @param posFileTubule
* @param configFileProtein
* @param posFileProtein
* @param argc
* @param argv
*/
TubuleSystem(const std::string &configFileSystem,
const std::string &posFileTubule,
const std::string &configFileProtein,
const std::string &posFileProtein, int argc, char **argv);
/**
* @brief Construct a new Tubule System:: Tubule System object
*
* @param configFileSystem
* @param configFileProtein
* @param restartFile saved restarting file
* @param argc
* @param argv
*/
TubuleSystem(const std::string &configFileSystem,
const std::string &configFileProtein,
const std::string &restartFile, //
int argc, char **argv);
/**
* @brief Destroy the TubuleSystem object
*
*/
~TubuleSystem() = default;
// forbid copy
TubuleSystem(const TubuleSystem &) = delete;
TubuleSystem &operator=(const TubuleSystem &) = delete;
/**
* @brief one time step forward
*
*/
void step();
/**
* @brief mark the end of time-stepping
*
* @return true
* @return false
*/
bool end();
private:
int rank; ///< mpi rank
int nProcs; ///< mpi size
std::shared_ptr<TRngPool> rngPoolPtr; ///< point to rodSystem.rngPoolPtr
std::vector<LookupTable> LUTArr; ///< protein LookupTable Holder
SylinderSystem rodSystem; ///< each tubule modeled as a sylinder
// same DomainInfo for protein and tubule
PS::ParticleSystem<ProteinData> proteinContainer; ///< all proteins
MixPairInteraction<ProteinData, Sylinder, // FPT, FPS
ProteinData, TubuleBindEP, // EPT, EPS
ProteinBindStatus> // 'Force'
bindInteraction; ///< mixed interaction
std::vector<double> proteinForceTorqueOnTubule; ///< bind force and torque
/**
* @brief prepare necessary data structures for a step
*
*/
void prepareStep();
/**
* @brief Set the configuration for sylinder system
*
* @param sylinderConfig
*/
void setSylinderConfig(SylinderConfig &sylinderConfig);
/**
* @brief calculate and update protein.bind with bindInteraction tree
*
*/
void calcBindInteraction();
/**
* @brief calculate protein diffusion or walking
*
*/
void updateProteinMotion();
/**
* @brief set protein as bilateral constraints in sylinderSystem
*
*/
void setProteinConstraints();
/**
* @brief update protein.bind with tubule gid
* used in two cases
* (1) tubule moved. update protein.bind.centerBind and directionBind only
* (2) new data. reconstruct full protein.bind
*
* if distBind[e] in [-lenMT/2,lenMT/2], reconstruct
* otherwise, input file mismatch and recalc with pos
*/
void updateBindWithGid(bool reconstruct = false);
/**
* @brief find home rank of each tubule by gid
*
*/
void findTubuleRankWithGid();
/**
* @brief write snapshot
*
*/
void outputProteinData();
/**
* @brief Set initial protein data from config file
*
*/
void setInitialProteinFromConfig();
/**
* @brief Set initial protein data from config and dat files
*
* @param posFilename
*/
void setInitialProteinFromFile(const std::string &posFilename);
/**
* @brief Build all lookup tables in LUTArr
*
*/
void buildLookupTable();
/**
* @brief Make filler object pointer to initialize lookup tables.
* Pointer because there are several different types of fillers available
* inhereted from the abstract class LUTFiller.
*
*/
LUTFiller *makeLUTFiller(const ProteinType &ptype);
/**
* @brief set the LUT ptr in every protein
*
*/
void setLookupTablePtr();
/**
* @brief write protein dat file
*
*/
void writeProteinAscii();
/**
* @brief write protein XML VTK file
*
*/
void writeProteinVTK();
/**
* @brief read protein XML VTK file
*
*/
void readProteinVTK(const std::string &pvtpFileName);
};
#endif