Download as pdf or txt
Download as pdf or txt
You are on page 1of 16

29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.

cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

deepmorzaria / Lid-Driven-Cavity Public

Code Issues Pull requests Actions Projects Security Insights

main

Lid-Driven-Cavity / driven_cavity_final.cpp

deepmorzaria Add files via upload History

1 contributor

751 lines (549 sloc) 20.9 KB

1 #include <iostream>
2 #include <eigen-3.3.7/Eigen/Sparse>
3 #include<algorithm>
4 #include<fstream>
5
6 using namespace Eigen;
7
8 int n_x,n_y,i,j;
9 double dx,dy,Re;
10 double velocity=1.0;
11
12 double l2_norm_x=0.0;
13 double alpha_uv=1e-4;
14 double epsilon_uv=0.75;
15
16 double l2_norm_y=0.0;
17
18 double l2_norm_p=0.0;
19 double epsilon_p=1e-4;
20 double alpha_p=0.5;
21
22 void link_coefficients(MatrixXd &A_p,MatrixXd &A_e,MatrixXd &A_w,MatrixXd &A_n,MatrixXd &A_s,Vecto
23
24 {
25 int n;
26 double D_e,D_w,D_n,D_s,F_e,F_n,F_s,F_w;
27
28 D_e=dy/(dx*Re);
29 D_w=dy/(dx*Re);

https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 1/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

30 D_n=dx/(dy*Re);
31 D_s=dx/(dy*Re);
32
33 //interior cells
34 for(i=2;i<n_y;i++)
35 {
36 for (j=2;j<n_x;j++)
37 {
38 n=(i-1)*n_x + (j-1);
39
40 F_e=dy*u_face(i,j);
41 F_w=dy*u_face(i,j-1);
42 F_n=dx*v_face(i-1,j);
43 F_s=dx*v_face(i,j);
44
45 A_e(i,j)=D_e + std::max(0.0,-F_e);
46 A_w(i,j)=D_w + std::max(0.0,F_w);
47 A_n(i,j)=D_n + std::max(0.0,-F_n);
48 A_s(i,j)=D_s + std::max(0.0,F_s);
49 A_p(i,j)=D_e + D_w + D_n + D_s + std::max(0.0,F_e) + std::max(0.0,-F_w) + std::max(0.0
50
51 source_x[n]=0.5*alpha_uv*(p(i,j-1)-p(i,j+1))*dy + (1-alpha_uv)*A_p(i,j)*u_star(i,j);
52 source_y[n]=0.5*alpha_uv*(p(i+1,j)-p(i-1,j))*dx + (1-alpha_uv)*A_p(i,j)*v_star(i,j);
53 }
54 }
55
56 //left wall
57 j=1;
58 for (i=2;i<n_y;i++)
59 {
60 n=(i-1)*n_x ;
61
62 F_e=dy*u_face(i,j);
63 F_w=dy*u_face(i,j - 1); //left face velocity is initialised to zero
64 F_n=dx*v_face(i - 1,j);
65 F_s=dx*v_face(i,j);
66
67 A_e(i,j)=D_e + std::max(0.0,-F_e);
68 A_n(i,j)=D_n + std::max(0.0,-F_n);
69 A_s(i,j)=D_s + std::max(0.0,F_s);
70 A_p(i,j)=D_e + 2*D_w + D_n + D_s + std::max(0.0,F_e) + std::max(0.0,-F_w) + std::max(0.0,-
71
72 source_x[n]=0.5*alpha_uv*(p(i,j) - p(i,j + 1))*dy + (1-alpha_uv)*A_p(i,j)*u_star(i,j); //
73 source_y[n]=0.5*alpha_uv*(p(i + 1,j) - p(i - 1,j))*dx + (1-alpha_uv)*A_p(i,j)*v_star(i,j);
74 }
75
76 //bottom wall
77 i=n_y;
78 for(j=2;j<n_x;j++)
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 2/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

79 {
80 n=(n_y-1)*n_x + (j-1);
81
82 F_e=dy*u_face(i,j);
83 F_w=dy*u_face(i,j - 1);
84 F_n=dx*v_face(i - 1,j);
85 F_s=dx*v_face(i,j) ; //bottom wall v-velocity is already initialised to zero
86
87 A_e(i,j)=D_e + std::max(0.0,-F_e);
88 A_w(i,j)=D_w + std::max(0.0,F_w);
89 A_n(i,j)=D_n + std::max(0.0,-F_n);
90 A_p(i,j)=D_e + D_w + D_n + 2*D_s + std::max(0.0,F_e) + std::max(0.0,-F_w) + std::max(0.0,-
91
92 source_x[n]=0.5*alpha_uv*(p(i,j - 1) - p(i,j + 1))*dy + (1-alpha_uv)*A_p(i,j)*u_star(i,j);
93 source_y[n]=0.5*alpha_uv*(p(i,j) - p(i - 1,j))*dx + (1-alpha_uv)*A_p(i,j)*v_star(i,j);
94 }
95 //right wall
96 j=n_x;
97 for(i=2;i<n_y;i++)
98 {
99 n=i*n_x -1;
100
101 F_e=dy*u_face(i,j);
102 F_w=dy*u_face(i,j - 1); //right face velocity is initialised to zero
103 F_n=dx*v_face(i - 1,j);
104 F_s=dx*v_face(i,j);
105
106 A_w(i,j)=D_w + std::max(0.0,F_w);
107 A_n(i,j)=D_n + std::max(0.0,-F_n);
108 A_s(i,j)=D_s + std::max(0.0,F_s);
109 A_p(i,j)=2*D_e + D_w + D_n + D_s + std::max(0.0,F_e) + std::max(0.0,-F_w) + std::max(0.0,-
110
111 source_x[n]=0.5*alpha_uv*(p(i,j-1) - p(i,j))*dy + (1-alpha_uv)*A_p(i,j)*u_star(i,j); //0
112 source_y[n]=0.5*alpha_uv*(p(i + 1,j) - p(i - 1,j))*dx + (1-alpha_uv)*A_p(i,j)*v_star(i,j);
113 }
114 //top wall
115 i=1;
116 for(j=2;j<n_x;j++)
117 {
118 n=(j-1);
119
120 F_e=dy*u_face(i,j);
121 F_w=dy*u_face(i,j - 1);
122 F_n=dx*v_face(i - 1,j);
123 F_s=dx*v_face(i,j);
124
125 A_e(i,j)=D_e + std::max(0.0,-F_e);
126 A_w(i,j)=D_w + std::max(0.0,F_w);
127 A_s(i,j)=D_s + std::max(0.0,F_s);
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 3/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

128 A_p(i,j)=D_e + D_w + 2*D_n + D_s + std::max(0.0,F_e) + std::max(0.0,-F_w) + std::max(0.0,-


129
130 source_x[n]=0.5*alpha_uv*(p(i,j - 1) - p(i,j + 1))*dy + (1-alpha_uv)*A_p(i,j)*u_star(i,j)
131 source_y[n]=0.5*alpha_uv*(p(i + 1,j) - p(i,j))*dx + (1-alpha_uv)*A_p(i,j)*v_star(i,j);
132 }
133 //top left corner
134 i=1;
135 j=1;
136 n=0;
137
138 F_e=dy*u_face(i,j);
139 F_w=dy*u_face(i,j - 1);
140 F_n=dx*v_face(i - 1,j);
141 F_s=dx*v_face(i,j);
142
143 A_e(i,j)=D_e + std::max(0.0,-F_e);
144 A_s(i,j)=D_s + std::max(0.0,F_s);
145 A_p(i,j)=D_e + 2*D_w + 2*D_n + D_s + std::max(0.0,F_e) + std::max(0.0,-F_w) + std::max(0.0,-F_
146
147 source_x[n]=0.5*alpha_uv*(p(i,j) - p(i,j + 1))*dy + (1-alpha_uv)*A_p(i,j)*u_star(i,j) + alpha_
148 source_y[n]=0.5*alpha_uv*(p(i + 1,j) - p(i,j))*dx + (1-alpha_uv)*A_p(i,j)*v_star(i,j); //0.5(
149
150 //top right corner
151 i=1;
152 j=n_x;
153 n=n_x-1;
154
155 F_e=dy*u_face(i,j);
156 F_w=dy*u_face(i,j - 1); //right face velocity is initialised to zero
157 F_n=dx*v_face(i - 1,j);
158 F_s=dx*v_face(i,j);
159
160 A_w(i,j)=D_w + std::max(0.0,F_w);
161 A_s(i,j)=D_s + std::max(0.0,F_s);
162 A_p(i,j)=2*D_e + D_w + 2*D_n + D_s + std::max(0.0,F_e) + std::max(0.0,-F_w) + std::max(0.0,-F_
163
164 source_x[n]=0.5*alpha_uv*(p(i,j - 1) - p(i,j))*dy + (1-alpha_uv)*A_p(i,j)*u_star(i,j) + alpha_
165 source_y[n]=0.5*alpha_uv*(p(i + 1,j) - p(i,j))*dx + (1-alpha_uv)*A_p(i,j)*v_star(i,j); //0.5(P
166
167 //bottom left corner
168 i=n_y;
169 j=1;
170 n=(n_y-1)*n_x ;
171
172
173 F_e=dy*u_face(i,j);
174 F_w=dy*u_face(i,j - 1) ; //left face velocity is initialised to zero
175 F_n=dx*v_face(i - 1,j);
176 F_s=dx*v_face(i,j);
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 4/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

177
178 A_e(i,j)=D_e + std::max(0.0,-F_e);
179 A_n(i,j)=D_n + std::max(0.0,-F_n);
180 A_p(i,j)=D_e + 2*D_w + D_n + 2*D_s + std::max(0.0,F_e) + std::max(0.0,-F_w) + std::max(0.0,-F_
181
182 source_x[n]=0.5*alpha_uv*(p(i,j) - p(i,j + 1))*dy + (1-alpha_uv)*A_p(i,j)*u_star(i,j); //P_o
183 source_y[n]=0.5*alpha_uv*(p(i,j) - p(i - 1,j))*dx + (1-alpha_uv)*A_p(i,j)*v_star(i,j); //P_o
184
185 //bottom right corner
186 i=n_y;
187 j=n_x;
188 n=n_x*n_y-1;
189
190 F_e=dy*u_face(i,j);
191 F_w=dy*u_face(i,j - 1) ; //right face velocity is initialised to zero
192 F_n=dx*v_face(i - 1,j);
193 F_s=dx*v_face(i,j);
194
195 A_w(i,j)=D_w + std::max(0.0,F_w);
196 A_n(i,j)=D_n + std::max(0.0,-F_n);
197 A_p(i,j)=2*D_e + D_w + D_n + 2*D_s + std::max(0.0,F_e) + std::max(0.0,-F_w) + std::max(0.0,-F_
198
199 source_x[n]=0.5*alpha_uv*(p(i,j - 1)- p(i,j))*dy + (1-alpha_uv)*A_p(i,j)*u_star(i,j); //0.5(P
200 source_y[n]=0.5*alpha_uv*(p(i,j) - p(i-1,j))*dx + (1-alpha_uv)*A_p(i,j)*v_star(i,j); //P_o -
201
202
203 A_e=alpha_uv*A_e;
204 A_w=alpha_uv*A_w;
205 A_n=alpha_uv*A_n;
206 A_s=alpha_uv*A_s;
207
208
209
210 }
211
212 void build_coefficient_matrix(SparseMatrix <double> &A,MatrixXd &ap,MatrixXd &ae,MatrixXd &aw,Matr
213
214
215 typedef Triplet<double> T;
216 std::vector<T> tripletList;
217
218 int n;
219
220 //top wall
221 int i=1;
222 for (int j=2;j<n_x;j++)
223 {
224 n=(j-1);
225
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 5/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

226 tripletList.push_back(T(n,n,ap(i,j)));
227 tripletList.push_back(T(n,n-1,-aw(i,j)));
228 tripletList.push_back(T(n,n+1,-ae(i,j)));
229 tripletList.push_back(T(n,n+n_x,-as(i,j)));
230
231 }
232
233 //interior cells
234 for(int i=2;i<n_y;i++)
235 {
236 for(int j=2;j<n_x;j++)
237 {
238 n=(i-1)*n_x + (j-1);
239
240 tripletList.push_back(T(n,n,ap(i,j)));
241 tripletList.push_back(T(n,n-1,-aw(i,j)));
242 tripletList.push_back(T(n,n+1,-ae(i,j)));
243 tripletList.push_back(T(n,n-n_x,-an(i,j)));
244 tripletList.push_back(T(n,n+n_x,-as(i,j)));
245
246
247 }
248 }
249
250
251 //left wall
252 int j=1;
253 for(int i=2;i<n_y;i++)
254 {
255 n=(i-1)*n_x ;
256
257 tripletList.push_back(T(n,n,ap(i,j)));
258 tripletList.push_back(T(n,n+1,-ae(i,j)));
259 tripletList.push_back(T(n,n-n_x,-an(i,j)));
260 tripletList.push_back(T(n,n+n_x,-as(i,j)));
261
262 }
263
264
265
266 //right wall
267 j=n_x;
268 for(int i=2;i<n_y;i++)
269 {
270 n=i*n_x -1;
271
272 tripletList.push_back(T(n,n,ap(i,j)));
273 tripletList.push_back(T(n,n-1,-aw(i,j)));
274 tripletList.push_back(T(n,n-n_x,-an(i,j)));
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 6/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

275 tripletList.push_back(T(n,n+n_x,-as(i,j)));
276 }
277
278
279 //bottom wall
280 i =n_y;
281 for (int j=2;j<n_x;j++)
282 {
283 n=(n_y-1)*n_x + (j-1);
284
285 tripletList.push_back(T(n,n,ap(i,j)));
286 tripletList.push_back(T(n,n-1,-aw(i,j)));
287 tripletList.push_back(T(n,n+1,-ae(i,j)));
288 tripletList.push_back(T(n,n-n_x,-an(i,j)));
289
290 }
291
292 //top left corner
293 n=0;
294 i=1;
295 j=1;
296 tripletList.push_back(T(n,n,ap(i,j)));
297 tripletList.push_back(T(n,n+1,-ae(i,j)));
298 tripletList.push_back(T(n,n+n_x,-as(i,j)));
299
300
301 //top right corner
302 i=1;
303 j=n_x;
304 n=n_x-1;
305
306 tripletList.push_back(T(n,n,ap(i,j)));
307 tripletList.push_back(T(n,n-1,-aw(i,j)));
308 tripletList.push_back(T(n,n+n_x,-as(i,j)));
309
310
311
312 //bottom left corner
313 n=(n_y-1)*n_x ;
314 j=1;
315 i=n_y;
316
317 tripletList.push_back(T(n,n,ap(i,j)));
318 tripletList.push_back(T(n,n+1,-ae(i,j)));
319 tripletList.push_back(T(n,n-n_x,-an(i,j)));
320
321 //bottom right corner
322 n=(n_x*n_y)-1;
323 i=n_y;
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 7/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

324 j=n_x;
325
326 tripletList.push_back(T(n,n,ap(i,j)));
327 tripletList.push_back(T(n,n-1,-aw(i,j)));
328 tripletList.push_back(T(n,n-n_x,-an(i,j)));
329
330
331 A.setFromTriplets(tripletList.begin(),tripletList.end());
332
333 }
334
335 void solve(SparseMatrix <double> &A,VectorXd &b,MatrixXd &phi,double &l2_norm,double &epsilon)
336 {
337 VectorXd x(n_x*n_y);
338
339 int n=0;
340 for(int i=1;i<n_y+1;i++)
341 {
342 for (int j=1;j<n_x+1;j++)
343 {
344
345 x[n]=phi(i,j);
346 n+=1;
347
348 }
349 }
350 l2_norm=(A*x-b).norm() ;
351
352 BiCGSTAB<SparseMatrix<double> > solver;
353 solver.compute(A);
354 solver.setTolerance(epsilon);
355 x = solver.solve(b);
356 //std::cout << "L2 Norm : " << (A*x-b).norm() << std::endl;
357 //std::cout << "Number of iterations : " << solver.iterations() << std::endl;
358
359 n=0;
360 for(int i=1;i<n_y+1;i++)
361 {
362 for (int j=1;j<n_x+1;j++)
363 {
364
365 phi(i,j)=x[n];
366 n+=1;
367
368 }
369 }
370
371
372
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 8/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

373 }
374
375 void face_velocity(MatrixXd &u,MatrixXd &v,MatrixXd &u_face,MatrixXd &v_face,MatrixXd &p,MatrixXd
376 {
377
378 //u face velocity
379
380 for(i=1;i<n_y+1;i++)
381 {
382 for (j=1;j<n_x;j++)
383 {
384 u_face(i,j)=0.5*(u(i,j) + u(i,j + 1)) + 0.25*alpha_uv*(p(i,j + 1) - p(i,j - 1))*dy/A_p(i,j
385
386 }
387 }
388
389
390
391 //v face velocity
392 for(i=2;i<n_y+1;i++)
393 {
394 for (j=1;j<n_x+1;j++)
395 {
396
397 v_face(i-1,j)=0.5*(v(i,j) + v(i - 1,j)) + 0.25*alpha_uv*(p(i - 1,j) - p(i + 1,j))*dy/A
398 }
399 }
400
401 }
402
403 void pressure_correction_link_coefficients(MatrixXd &u,MatrixXd &u_face,MatrixXd &v_face,MatrixXd
404 {
405 int n;
406 //interior cells
407 for(i=2;i<n_y;i++)
408 {
409 for(j=2;j<n_x;j++)
410 {
411 n=(i-1)*n_x + (j-1);
412
413 Ap_e(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j + 1))*(dy*dy);
414 Ap_w(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j - 1))*(dy*dy);
415 Ap_n(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i - 1,j))*(dx*dx);
416 Ap_s(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i + 1,j))*(dx*dx);
417 Ap_p(i,j)=Ap_e(i,j) + Ap_w(i,j) + Ap_n(i,j) + Ap_s(i,j);
418
419 source_p[n]=-(u_face(i,j) - u_face(i,j - 1))*dy - (v_face(i - 1,j) - v_face(i,j))*dx;
420
421 }
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 9/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

422
423 }
424
425 //top
426 i=1;
427 for(j=2;j<n_x;j++)
428 {
429 n=(j-1);
430
431 Ap_e(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j + 1))*(dy*dy);
432 Ap_w(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j - 1))*(dy*dy);
433 Ap_s(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i + 1,j))*(dx*dx);
434 Ap_p(i,j)=Ap_e(i,j) + Ap_w(i,j) + Ap_n(i,j) + Ap_s(i,j);
435
436 source_p[n]=-(u_face(i,j) - u_face(i,j - 1))*dy - (v_face(i - 1,j) - v_face(i,j))*dx;
437 }
438
439 //left
440 j=1;
441 for(i=2;i<n_y;i++)
442 {
443 n=(i-1)*n_x ;
444
445 Ap_e(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j + 1))*(dy*dy);
446 Ap_n(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i - 1,j))*(dx*dx);
447 Ap_s(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i + 1,j))*(dx*dx);
448 Ap_p(i,j)=Ap_e(i,j) + Ap_w(i,j) + Ap_n(i,j) + Ap_s(i,j);
449
450 source_p[n]=-(u_face(i,j) - u_face(i,j - 1))*dy - (v_face(i - 1,j) - v_face(i,j))*dx;
451 }
452
453 //right
454 j=n_x;
455 for(i=2;i<n_y;i++)
456 {
457 n=i*n_x -1;
458
459 Ap_w(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j - 1))*(dy*dy);
460 Ap_n(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i - 1,j))*(dx*dx);
461 Ap_s(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i + 1,j))*(dx*dx);
462 Ap_p(i,j)=Ap_e(i,j) + Ap_w(i,j) + Ap_n(i,j) + Ap_s(i,j);
463
464 source_p[n]=-(u_face(i,j) - u_face(i,j - 1))*dy - (v_face(i - 1,j) - v_face(i,j))*dx;
465 }
466 //bottom
467 i=n_y;
468 for(j=2;j<n_x;j++)
469 {
470 n=(n_y-1)*n_x + (j-1);
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 10/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

471
472 Ap_e(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j + 1))*(dy*dy);
473 Ap_w(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j - 1))*(dy*dy);
474 Ap_n(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i - 1,j))*(dx*dx);
475 Ap_p(i,j)=Ap_e(i,j) + Ap_w(i,j) + Ap_n(i,j) + Ap_s(i,j);
476
477 source_p[n]=-(u_face(i,j) - u_face(i,j - 1))*dy - (v_face(i - 1,j) - v_face(i,j))*dx;
478 }
479
480 //top left corner
481 i=1;
482 j=1;
483 n=0;
484
485 Ap_e(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j + 1))*(dy*dy);
486 Ap_s(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i + 1,j))*(dx*dx);
487 Ap_p(i,j)=Ap_e(i,j) + Ap_w(i,j) + Ap_n(i,j) + Ap_s(i,j);
488
489 source_p[n]=-(u_face(i,j) - u_face(i,j - 1))*dy - (v_face(i - 1,j) - v_face(i,j))*dx;
490
491 //top right corner
492 i=1;
493 j=n_x;
494 n=n_x-1;
495
496 Ap_w(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j - 1))*(dy*dy);
497 Ap_s(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i + 1,j))*(dx*dx);
498 Ap_p(i,j)=Ap_e(i,j) + Ap_w(i,j) + Ap_n(i,j) + Ap_s(i,j);
499
500 source_p[n]=-(u_face(i,j) - u_face(i,j - 1))*dy - (v_face(i - 1,j) - v_face(i,j))*dx;
501
502 //bottom left corner
503 i=n_y;
504 j=1;
505 n=(n_y-1)*n_x ;
506
507 Ap_e(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j + 1))*(dy*dy);
508 Ap_n(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i - 1,j))*(dx*dx);
509 Ap_p(i,j)=Ap_e(i,j) + Ap_w(i,j) + Ap_n(i,j) + Ap_s(i,j);
510
511 source_p[n]=-(u_face(i,j) - u_face(i,j - 1))*dy - (v_face(i - 1,j) - v_face(i,j))*dx;
512
513 //bottom right corner
514 i=n_y;
515 j=n_x;
516 n=n_x*n_y-1;
517
518 Ap_w(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i,j - 1))*(dy*dy);
519 Ap_n(i,j)=0.5*alpha_uv*(1/A_p(i,j) + 1/A_p(i - 1,j))*(dx*dx);
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 11/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

520 Ap_p(i,j)=Ap_e(i,j) + Ap_w(i,j) + Ap_n(i,j) + Ap_s(i,j);


521
522 source_p[n]=-(u_face(i,j) - u_face(i,j - 1))*dy - (v_face(i - 1,j) - v_face(i,j))*dx;
523
524 }
525
526 void correct_pressure(MatrixXd &p_star,MatrixXd &p,MatrixXd &p_prime)
527 {
528
529 //top wall
530 p_prime.block(0,1,1,n_x)=p_prime.block(1,1,1,n_x);
531
532 //left wall
533 p_prime.block(1,0,n_y,1)=p_prime.block(1,1,n_y,1);
534
535 //right wall
536 p_prime.block(1,n_x+1,n_y,1)=p_prime.block(1,n_x,n_y,1);
537
538 //bottom wall
539 p_prime.block(n_y+1,1,1,n_x)=p_prime.block(n_y,1,1,n_x);
540
541 //top left corner
542 p_prime(0,0)=(p_prime(1,1)+p_prime(0,1)+p_prime(1,0))/3;
543
544 //top right corner
545 p_prime(0,n_x+1)=(p_prime(0,n_x)+p_prime(1,n_x)+p_prime(1,n_x+1))/3;
546
547 //bottom left corner
548 p_prime(n_y+1,0)=(p_prime(n_y,0)+p_prime(n_y,1)+p_prime(n_y+1,1))/3;
549
550 //bottom right corner
551 p_prime(n_y+1,n_x+1)=(p_prime(n_y,n_x+1)+p_prime(n_y+1,n_x)+p_prime(n_y,n_x))/3;
552
553 MatrixXd p_ref=MatrixXd::Constant(n_y+2,n_x+2,p_prime(0,0));
554
555
556 p_star=p+alpha_p*(p_prime);
557
558
559
560 }
561
562 void correct_cell_center_velocity(MatrixXd &u,MatrixXd &v,MatrixXd &u_star,MatrixXd &v_star,Matrix
563 {
564
565 //u velocity
566 //interior cells
567 for(i=1;i<n_y+1;i++)
568 {
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 12/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

569 for(j=2;j<n_x;j++)
570 {
571
572 u_star(i,j)= u(i,j) + 0.5*alpha_uv*(p_prime(i,j-1)-p_prime(i,j+1))*dy/A_p(i,j);
573 }
574 }
575
576
577 //left
578 j=1;
579 for(i=1;i<n_y+1;i++)
580 {
581 u_star(i,j)=u(i,j) + 0.5*alpha_uv*(p_prime(i,j) - p_prime(i,j+1))*dy/A_p(i,j);
582 }
583
584 //right
585 j=n_x;
586 for(i=1;i<n_y+1;i++)
587 {
588 u_star(i,j)=u(i,j) + 0.5*alpha_uv*(p_prime(i,j-1) - p_prime(i,j))*dy/A_p(i,j);
589 }
590
591 //v velocity
592 for(i=2;i<n_y;i++)
593 {
594 for(j=1;j<n_x+1;j++)
595 {
596 v_star(i,j)=v(i,j) + 0.5*alpha_uv*(p_prime(i+1,j)-p_prime(i-1,j))*dx/A_p(i,j);
597 }
598 }
599
600
601 //top
602 i=1;
603 for(j=1;j<n_x+1;j++)
604 {
605 v_star(i,j)=v(i,j) + 0.5*alpha_uv*(p_prime(i + 1,j) - p_prime(i,j))*dx/A_p(i,j);
606 }
607
608 //bottom
609 i=n_y;
610 for(j=1;j<n_x+1;j++)
611 {
612 v_star(i,j)=v(i,j) + 0.5*alpha_uv*(p_prime(i,j) - p_prime(i - 1,j))*dx/A_p(i,j);
613 }
614 }
615
616 void correct_face_velocity(MatrixXd &u_face,MatrixXd &v_face,MatrixXd &p_prime,MatrixXd &A_p)
617 {
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 13/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

618 for(i=1;i<n_y+1;i++)
619 {
620 for(j=1;j<n_x;j++)
621 {
622 u_face(i,j)=u_face(i,j)+ 0.5*alpha_uv*(1/A_p(i,j)+1/A_p(i,j+1))*(p_prime(i,j)-p_prime(
623 }
624 }
625
626 for(i=2;i<n_y+1;i++)
627 {
628 for(j=1;j<n_x+1;j++)
629 {
630 v_face(i-1,j)=v_face(i-1,j) + 0.5*alpha_uv*(1/A_p(i,j)+1/A_p(i-1,j))*(p_prime(i,j)-p_
631 }
632 }
633
634
635 }
636
637 void post_processing(MatrixXd u_star,MatrixXd v_star,MatrixXd p_star)
638 {
639 VectorXd x(n_x+2),y(n_y+2);
640 x << 0,VectorXd::LinSpaced(n_x,dx/2.0,1-dx/2.0),1;
641 y << 0,VectorXd::LinSpaced(n_y,dy/2.0,1-dy/2.0),1;
642
643 //Saving outputs for post-processing
644 std::ofstream outFile;
645 outFile.open("/Users/deep/Desktop/CFMHT final project/u.dat");
646 outFile << u_star;
647 outFile.close();
648
649 outFile.open("/Users/deep/Desktop/CFMHT final project/v.dat");
650 outFile << v_star;
651 outFile.close();
652
653 outFile.open("/Users/deep/Desktop/CFMHT final project/p.dat");
654 outFile << p_star;
655 outFile.close();
656
657 outFile.open("/Users/deep/Desktop/CFMHT final project/x.dat");
658 outFile << x;
659 outFile.close();
660
661 outFile.open("/Users/deep/Desktop/CFMHT final project/y.dat");
662 outFile << y;
663 outFile.close();
664
665
666
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 14/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

667
668 }
669
670 int main ()
671 {
672
673 std::cout << "Enter number of divisions in x-direction:";
674 std::cin >> n_x;
675
676 std::cout << "Enter number of divisions in y-direction:";
677 std::cin >> n_y;
678
679 dx=1.0/n_x;
680 dy=1.0/n_y;
681
682 std::cout << "Enter Reynolds number:";
683 std::cin >> Re;
684
685 //Declaring primitive variables
686 MatrixXd u(n_y+2,n_x+2),u_star(n_y+2,n_x+2);
687 MatrixXd v(n_y+2,n_x+2),v_star(n_y+2,n_x+2);
688 MatrixXd p(n_y+2,n_x+2),p_star(n_y+2,n_x+2),p_prime(n_y+2,n_x+2);
689
690 //Declaring momentum-link coefficients
691 MatrixXd A_p(n_y+2,n_x+2),A_e(n_y+2,n_x+2),A_w(n_y+2,n_x+2),A_n(n_y+2,n_x+2),A_s(n_y+2,n_x+2);
692
693 //Declaring pressure-correction link coefficients
694 MatrixXd Ap_p(n_y+2,n_x+2),Ap_e(n_y+2,n_x+2),Ap_w(n_y+2,n_x+2),Ap_n(n_y+2,n_x+2),Ap_s(n_y+2,n_
695
696 //Declaring source-terms
697 VectorXd source_x(n_y*n_x),source_y(n_y*n_x),source_p(n_y*n_x);
698
699 //Declaring face velocities
700 MatrixXd u_face(n_y+2,n_x+1),v_face(n_y+1,n_x+2);
701
702 //Declaring coefficient matrix and vectors in Ax=b
703 SparseMatrix<double> A_momentum(n_x*n_y,n_x*n_y),A_pressure_correction(n_x*n_y,n_x*n_y);
704
705 //Boundary conditions
706 u.block(0,1,1,n_x)=MatrixXd::Constant(1,n_x,1.0);
707 u_star.block(0,1,1,n_x)=MatrixXd::Constant(1,n_x,1.0);
708 u_face.block(0,1,1,n_x-1)=MatrixXd::Constant(1,n_x-1,1.0);
709
710
711 int max_outer_iterations=1000;
712
713 for(int n=1;n<=max_outer_iterations;n++)
714 {
715 link_coefficients(A_p,A_e,A_w,A_n,A_s,source_x,source_y,u_face,v_face,p,u_star,v_star);
https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 15/16
29/6/23, 21:24 Lid-Driven-Cavity/driven_cavity_final.cpp at main · deepmorzaria/Lid-Driven-Cavity · GitHub

716
717 build_coefficient_matrix(A_momentum,A_p,A_e,A_w,A_n,A_s);
718
719 solve(A_momentum,source_x,u,l2_norm_x,epsilon_uv);
720
721 solve(A_momentum,source_y,v,l2_norm_y,epsilon_uv);
722
723 face_velocity(u,v,u_face,v_face,p,A_p);
724
725 pressure_correction_link_coefficients(u,u_face,v_face,Ap_p,Ap_e,Ap_w,Ap_n,Ap_s,source_p,A_
726
727 build_coefficient_matrix(A_pressure_correction,Ap_p,Ap_e,Ap_w,Ap_n,Ap_s);
728
729 solve(A_pressure_correction,source_p,p_prime,l2_norm_p,epsilon_p);
730
731 correct_pressure(p_star,p,p_prime);
732
733 correct_cell_center_velocity(u,v,u_star,v_star,p_prime,A_p);
734
735 correct_face_velocity(u_face,v_face,p_prime,A_p);
736
737 p=p_star;
738
739 std::cout << n << " " << l2_norm_x << " " << l2_norm_y << " " << l2_norm_p << "\n";
740
741 if(l2_norm_x < 1e-5 & l2_norm_y < 1e-5 & l2_norm_p < 1e-6)
742 {
743 std::cout << "Converged !";
744 break;
745 }
746
747 }
748
749 post_processing(u_star,v_star,p_star);
750
751 }

https://github.com/deepmorzaria/Lid-Driven-Cavity/blob/main/driven_cavity_final.cpp 16/16

You might also like