Commit 9db76bdba54c5e3535560e29c9b9112237aa0f1d

Authored by Jiaming Guo
1 parent 28b882ce

change flow object

Showing 1 changed file with 92 additions and 71 deletions   Show diff stats
stim/biomodels/flow.h
... ... @@ -92,82 +92,30 @@ namespace stim {
92 92 }
93 93  
94 94 public:
95   - std::vector<typename stim::triple<unsigned, unsigned, T> > V; // velocity
96   - std::vector<typename stim::triple<unsigned, unsigned, T> > Q; // volume flow rate
97   - std::vector<typename stim::triple<unsigned, unsigned, T> > deltaP; // pressure drop
98   - std::vector<T> pressure; // pressure
  95 + T** C; // Conductance
  96 + std::vector<typename stim::triple<unsigned, unsigned, float> > Q; // volume flow rate
  97 + std::vector<T> QQ; // Q' vector
  98 + std::vector<T> P; // initial pressure
  99 + std::vector<T> pressure; // final pressure
99 100  
100   - flow() {} // default constructor
101   -
102   - // calculate the flow rate of 3D model(circle cross section)
103   - void calculate_flow_rate(unsigned e, T r) {
104   - stim::triple<unsigned, unsigned, T> tmp_Q;
105   - tmp_Q.first = V[e].first; // copy the vertices information
106   - tmp_Q.second = V[e].second;
107   - tmp_Q.third = V[e].third * stim::PI * pow(r, 2); // UNITS: uL/s
108   - Q.push_back(tmp_Q); // push back the volume flow rate information for every edge
109   - }
110   -
111   - // calculate the flow rate of 2D model(rectangular cross section)
112   - void calculate_flow_rate(unsigned e, T r, T h) {
113   - stim::triple<unsigned, unsigned, T> tmp_Q;
114   - tmp_Q.first = V[e].first; // copy the vertices information
115   - tmp_Q.second = V[e].second;
116   - tmp_Q.third = V[e].third * h * r; // UNITS: uL/s = mm^3/s
117   - Q.push_back(tmp_Q); // push back the volume flow rate information for every edge
118   - }
119   -
120   - // calculate the pressure drop of 3D model(circle cross section)
121   - void calculate_deltaP(unsigned e, T u, T l, T r) {
122   - stim::triple<unsigned, unsigned, T> tmp_deltaP;
123   - tmp_deltaP.first = V[e].first; // copy the vertices information
124   - tmp_deltaP.second = V[e].second;
125   - tmp_deltaP.third = (8 * u * l * Q[e].third) / (stim::PI * pow(r, 4)); // UNITS: g/mm/s^2 = Pa
126   - deltaP.push_back(tmp_deltaP); // push back the volume flow rate information for every edge
127   - }
  101 + //std::vector<typename stim::triple<unsigned, unsigned, T> > V; // velocity
  102 + //std::vector<typename stim::triple<unsigned, unsigned, T> > Q; // volume flow rate
  103 + //std::vector<typename stim::triple<unsigned, unsigned, T> > deltaP; // pressure drop
128 104  
129   - // calculate the pressure drop of 2D model(rectangular cross section)
130   - void calculate_deltaP(unsigned e, T u, T l, T r, T h) {
131   - stim::triple<unsigned, unsigned, T> tmp_deltaP;
132   - tmp_deltaP.first = V[e].first; // copy the vertices information
133   - tmp_deltaP.second = V[e].second;
134   - tmp_deltaP.third = (12 * u * l * Q[e].third) / (stim::PI * h * pow(r, 3)); // UNITS: g/mm/s^2 = Pa
135   - deltaP.push_back(tmp_deltaP); // push back the volume flow rate information for every edge
136   - }
  105 + flow() {} // default constructor
137 106  
138   - // better way to do this???
139   - // find the maximum and minimum pressure positions
140   - void find_max_min_pressure(size_t n_e, size_t n_v, unsigned& max, unsigned& min) {
141   - std::vector<T> P(n_v, FLT_MAX);
142   - // set one to reference
143   - P[Q[0].first] = 0.0;
144   - unsigned first = 0;
145   - unsigned second = 0;
146   - // calculate all the relative pressure in brute force manner
147   - for (unsigned e = 0; e < n_e; e++) {
148   - // assuming the obj file stores in a straight order, in other words, like swc file
149   - first = Q[e].first;
150   - second = Q[e].second;
151   - if (P[first] != FLT_MAX) // if pressure at start vertex is known
152   - P[second] = P[first] - deltaP[e].third;
153   - else if (P[second] != FLT_MAX) // if pressure at end vertex is known
154   - P[first] = P[second] + deltaP[e].third;
  107 + void init(unsigned n_e, unsigned n_v) {
  108 +
  109 + C = new T*[n_v]();
  110 + for (unsigned i = 0; i < n_v; i++) {
  111 + C[i] = new T[n_v]();
155 112 }
156 113  
157   - // find the maximum and minimum pressure position
158   - auto m1 = std::max_element(P.begin(), P.end()); // temporarily max number
159   - auto m2 = std::min_element(P.begin(), P.end()); // temporarily min number
160   -
161   - max = std::distance(P.begin(), m1);
162   - min = std::distance(P.begin(), m2);
163   -
164   - T tmp_m = *m2;
165   - // Now set the lowest pressure port to reference pressure(0.0 Pa)
166   - for (unsigned i = 0; i < n_v; i++)
167   - P[i] -= tmp_m;
  114 + QQ.resize(n_v);
  115 + P.resize(n_v);
  116 + pressure.resize(n_v);
168 117  
169   - for (unsigned i = 0; i < n_v; i++)
170   - pressure.push_back(P[i]);
  118 + Q.resize(n_e);
171 119 }
172 120  
173 121 void inversion(T** A, int order, T** C) {
... ... @@ -270,4 +218,77 @@ namespace stim {
270 218 };
271 219 }
272 220  
273   -#endif
274 221 \ No newline at end of file
  222 +#endif
  223 +
  224 +
  225 +
  226 +//// calculate the flow rate of 3D model(circle cross section)
  227 +//void calculate_flow_rate(unsigned e, T r) {
  228 +// stim::triple<unsigned, unsigned, T> tmp_Q;
  229 +// tmp_Q.first = V[e].first; // copy the vertices information
  230 +// tmp_Q.second = V[e].second;
  231 +// tmp_Q.third = V[e].third * stim::PI * pow(r, 2); // UNITS: uL/s
  232 +// Q.push_back(tmp_Q); // push back the volume flow rate information for every edge
  233 +//}
  234 +
  235 +//// calculate the flow rate of 2D model(rectangular cross section)
  236 +//void calculate_flow_rate(unsigned e, T r, T h) {
  237 +// stim::triple<unsigned, unsigned, T> tmp_Q;
  238 +// tmp_Q.first = V[e].first; // copy the vertices information
  239 +// tmp_Q.second = V[e].second;
  240 +// tmp_Q.third = V[e].third * h * r; // UNITS: uL/s = mm^3/s
  241 +// Q.push_back(tmp_Q); // push back the volume flow rate information for every edge
  242 +//}
  243 +
  244 +//// calculate the pressure drop of 3D model(circle cross section)
  245 +//void calculate_deltaP(unsigned e, T u, T l, T r) {
  246 +// stim::triple<unsigned, unsigned, T> tmp_deltaP;
  247 +// tmp_deltaP.first = V[e].first; // copy the vertices information
  248 +// tmp_deltaP.second = V[e].second;
  249 +// tmp_deltaP.third = (8 * u * l * Q[e].third) / (stim::PI * pow(r, 4)); // UNITS: g/mm/s^2 = Pa
  250 +// deltaP.push_back(tmp_deltaP); // push back the volume flow rate information for every edge
  251 +//}
  252 +
  253 +//// calculate the pressure drop of 2D model(rectangular cross section)
  254 +//void calculate_deltaP(unsigned e, T u, T l, T r, T h) {
  255 +// stim::triple<unsigned, unsigned, T> tmp_deltaP;
  256 +// tmp_deltaP.first = V[e].first; // copy the vertices information
  257 +// tmp_deltaP.second = V[e].second;
  258 +// tmp_deltaP.third = (12 * u * l * Q[e].third) / (h * pow(r, 3)); // UNITS: g/mm/s^2 = Pa
  259 +// deltaP.push_back(tmp_deltaP); // push back the volume flow rate information for every edge
  260 +//}
  261 +
  262 +//// better way to do this???
  263 +//// find the maximum and minimum pressure positions
  264 +//void find_max_min_pressure(size_t n_e, size_t n_v, unsigned& max, unsigned& min) {
  265 +// std::vector<T> P(n_v, FLT_MAX);
  266 +// // set one to reference
  267 +// P[Q[0].first] = 0.0;
  268 +// unsigned first = 0;
  269 +// unsigned second = 0;
  270 +// // calculate all the relative pressure in brute force manner
  271 +// for (unsigned e = 0; e < n_e; e++) {
  272 +// // assuming the obj file stores in a straight order, in other words, like swc file
  273 +// first = Q[e].first;
  274 +// second = Q[e].second;
  275 +// if (P[first] != FLT_MAX) // if pressure at start vertex is known
  276 +// P[second] = P[first] - deltaP[e].third;
  277 +// else if (P[second] != FLT_MAX) // if pressure at end vertex is known
  278 +// P[first] = P[second] + deltaP[e].third;
  279 +// }
  280 +
  281 +// // find the maximum and minimum pressure position
  282 +// auto m1 = std::max_element(P.begin(), P.end()); // temporarily max number
  283 +// auto m2 = std::min_element(P.begin(), P.end()); // temporarily min number
  284 +
  285 +// max = std::distance(P.begin(), m1);
  286 +// min = std::distance(P.begin(), m2);
  287 +
  288 +// T tmp_m = *m2;
  289 +// // Now set the lowest pressure port to reference pressure(0.0 Pa)
  290 +// for (unsigned i = 0; i < n_v; i++)
  291 +// P[i] -= tmp_m;
  292 +
  293 +// for (unsigned i = 0; i < n_v; i++)
  294 +// pressure.push_back(P[i]);
  295 +//}
275 296 \ No newline at end of file
... ...