Skip to content

Commit 697598f

Browse files
committed
update parallel steady codes on reference domain
1 parent a0eba17 commit 697598f

File tree

2 files changed

+365
-44
lines changed

2 files changed

+365
-44
lines changed

Example1-Stenosis/ReferNS.edp renamed to Example1-Stenosis/ReferNS_steady_parallel.edp

Lines changed: 113 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
for(int sample = 0; sample<100; sample++){
1+
load "PETSc"
2+
macro dimension()2//
3+
include "macro_ddm.idp"
4+
5+
6+
for(int sample = 0; sample<500; sample++){
27
cout<<"Sample:"+sample<<endl;
38

49
/////// Import weights for each CP
@@ -78,36 +83,54 @@ for(int sample = 0; sample<100; sample++){
7883

7984

8085
mesh Mesh = readmesh("data/reference/reference.msh");
86+
mesh MeshBackup = readmesh("data/reference/reference.msh");
8187

8288
int[int] orderOut = [1, 1, 1, 1];
8389

84-
real umax = 2.51327412286999996*1e3 / (4 * pi); //mm/s
85-
86-
// real uin = -umax*(y-1)^2+umax;
90+
real umax = 2.51327412286999996*1e3 / (8 * 4 * pi); //mm/s
8791
real niu = 3.5*1e-3; // g mm^-1 s^-1
8892
real rho = 1.06*1e-3; // g mm^-3
8993
real nu = niu / rho;
90-
91-
92-
cout << "Number of Elements: " + Mesh.nt << endl;
94+
95+
96+
97+
// fespace Uh(Th, P2);
98+
// fespace Vh(Th, P1);
99+
// Uh u, v, uh, vh, uold, vold, du, dv;
100+
// Vh p, ph, dp, pold;
101+
102+
if (mpirank == 0)
103+
cout << "Number of Elements: " + Mesh.nt << endl;
93104

94105
func PkVector = [P2, P2, P1];
95106

107+
int[int] myN2O;
108+
macro MeshN2O() myN2O//
109+
110+
buildDmesh(Mesh);
111+
Mat J;
112+
113+
{
114+
macro def(i)[i, i#B, i#C]//
115+
macro init(i)[i, i, i]//
116+
createMat(Mesh, J, PkVector)
117+
}
118+
96119
fespace SpaceVector(Mesh, PkVector);
97120
fespace Uh(Mesh,P2);
98121

99-
100-
SpaceVector [ucx, ucy, pc];
101-
SpaceVector [ux, uy, p];
102-
SpaceVector [vx, vy, q];
122+
SpaceVector [ucx, ucy, pc] = [-umax*(y-1)^2+umax, 0, 0];
123+
103124
Uh FX = funcT(weights,cps,int(cps.n/2))[0];
104125
Uh FY = funcT(weights,cps,int(cps.n/2))[1];
105126

106-
cout << "Finite Element DOF (in each partition): " + SpaceVector.ndof << endl;
107127

108-
problem vRes([ux, uy, p], [vx, vy, q]) = int2d(Mesh)(
128+
if (mpirank == 0)
129+
cout << "Finite Element DOF (in each partition): " + SpaceVector.ndof << endl;
109130

110-
+ JF(FX,FY)*nu*((dx(ucx)*Finv11(FX,FY)+dy(ucx)*Finv21(FX,FY))*(dx(vx)*Finv11(FX,FY)+dy(vx)*Finv21(FX,FY))
131+
132+
varf vRes([ux, uy, p], [vx, vy, q]) = int2d(Mesh)(
133+
JF(FX,FY)*nu*((dx(ucx)*Finv11(FX,FY)+dy(ucx)*Finv21(FX,FY))*(dx(vx)*Finv11(FX,FY)+dy(vx)*Finv21(FX,FY))
111134
+(dx(ucx)*Finv12(FX,FY)+dy(ucx)*Finv22(FX,FY))*(dx(vx)*Finv12(FX,FY)+dy(vx)*Finv22(FX,FY))
112135
+(dx(ucy)*Finv11(FX,FY)+dy(ucy)*Finv21(FX,FY))*(dx(vy)*Finv11(FX,FY)+dy(vy)*Finv21(FX,FY))
113136
+(dx(ucy)*Finv12(FX,FY)+dy(ucy)*Finv22(FX,FY))*(dx(vy)*Finv12(FX,FY)+dy(vy)*Finv22(FX,FY)))
@@ -118,12 +141,11 @@ for(int sample = 0; sample<100; sample++){
118141
- JF(FX,FY)/rho*pc*((dx(vx)*Finv11(FX,FY)+dy(vx)*Finv21(FX,FY))+(dx(vy)*Finv12(FX,FY)+dy(vy)*Finv22(FX,FY)))
119142
- JF(FX,FY)*q*((dx(ucx)*Finv11(FX,FY)+dy(ucx)*Finv21(FX,FY))+(dx(ucy)*Finv12(FX,FY)+dy(ucy)*Finv22(FX,FY))))
120143

121-
+on(1,3,ux = 0, uy = 0)
122-
+on(4, ux = -umax*(y-1)^2+umax, uy = 0);
123-
124-
problem vJ([ux, uy, p], [vx, vy, q]) = int2d(Mesh)(
144+
+on(1,3,ux = ucx-0, uy = ucy-0)
145+
+on(4, ux = 0, uy = 0);
125146

126-
+ JF(FX,FY)*vx*(ucx*(dx(ux)*Finv11(FX,FY)+dy(ux)*Finv21(FX,FY))
147+
varf vJ([ux, uy, p], [vx, vy, q]) = int2d(Mesh)(
148+
JF(FX,FY)*vx*(ucx*(dx(ux)*Finv11(FX,FY)+dy(ux)*Finv21(FX,FY))
127149
+ux*(dx(ucx)*Finv11(FX,FY)+dy(ucx)*Finv21(FX,FY))
128150
+ucy*(dx(ux)*Finv12(FX,FY)+dy(ux)*Finv22(FX,FY))
129151
+uy*(dx(ucx)*Finv12(FX,FY)+dy(ucx)*Finv22(FX,FY)))
@@ -141,33 +163,80 @@ for(int sample = 0; sample<100; sample++){
141163
- JF(FX,FY)*q*((dx(ux)*Finv11(FX,FY)+dy(ux)*Finv21(FX,FY))+(dx(uy)*Finv12(FX,FY)+dy(uy)*Finv22(FX,FY))))
142164

143165

144-
+ on(1,3, ux = 0, uy = 0)
145-
+ on(4, ux = -umax*(y-1)^2+umax , uy = 0);
166+
+ on(1,3, ux = ucx-0, uy = ucy-0)
167+
+ on(4, ux = 0 , uy = 0);
168+
169+
set(J, sparams = "-pc_type lu");
170+
146171

147172

148-
real arrns = 1e-9;
173+
func real[int] funcRes(real[int]& inPETSc) {
174+
ChangeNumbering(J, ucx[], inPETSc, inverse = true, exchange = true);
175+
real[int] out(SpaceVector.ndof);
176+
out = vRes(0, SpaceVector, tgv = -1);
177+
ChangeNumbering(J, out, inPETSc);
178+
return inPETSc;
179+
}
180+
181+
func int funcJ(real[int]& inPETSc) {
182+
ChangeNumbering(J, ucx[], inPETSc, inverse = true, exchange = true);
183+
J = vJ(SpaceVector, SpaceVector, tgv = -1);
184+
return 0;
185+
}
186+
187+
188+
// Save to global solution
189+
fespace SpaceVectorGlobal(MeshBackup, PkVector);
190+
int[int] rst = restrict(SpaceVector, SpaceVectorGlobal, myN2O);
191+
SpaceVectorGlobal [globux, globuy, globp], [sumux, sumuy, sump];
192+
SpaceVector [uxTemp, uyTemp, pTemp];
193+
fespace SpaceP1Global(MeshBackup, P1);
194+
SpaceP1Global uxi, uyi, pi;
195+
196+
197+
198+
for(int i = 0; i<3;i++){
199+
ucx[] = ucx[]*2;
200+
real[int] xPETSc;
201+
ChangeNumbering(J, ucx[], xPETSc);
202+
SNESSolve(J, funcJ, funcRes, xPETSc, sparams = "-snes_monitor ");
203+
ChangeNumbering(J, ucx[], xPETSc, inverse = true, exchange = true);
204+
}
205+
206+
globux[] = 0;
207+
globuy[] = 0;
208+
globp[] = 0;
209+
210+
[uxTemp, uyTemp, pTemp] = [ucx, ucy, pc];
211+
212+
uxTemp[] .*= J.D;
213+
uyTemp[] .*= J.D;
214+
pTemp[] .*= J.D;
215+
216+
for[i, v : rst] globux[][v] = uxTemp[][i];
217+
for[i, v : rst] globuy[][v] = uyTemp[][i];
218+
for[i, v : rst] globp[][v] = pTemp[][i];
219+
220+
mpiAllReduce(globux[], sumux[], mpiCommWorld, mpiSUM);
221+
mpiAllReduce(globuy[], sumuy[], mpiCommWorld, mpiSUM);
222+
mpiAllReduce(globp[], sump[], mpiCommWorld, mpiSUM);
223+
224+
uxi = sumux;
225+
uyi = sumuy;
226+
pi = sump;
227+
228+
// if(mpirank == 0){
229+
// savevtk("result/output_"+sample+".vtu", MeshBackup, uxi, uyi, pi, dataname="u v p", order=orderOut);
230+
// }
149231

150-
macro ns() {
151-
int n;
152-
real err=0;
153-
vRes;
154-
155-
for(n=0; n< 15; n++) {
156-
vJ;
157-
158-
ucx[] -= ux[];
159-
ucy[] -= uy[];
160-
pc[] -= p[];
161-
real Lu1=ucx[].linfty, Lu2=ucy[].linfty, Lp=pc[].linfty;
162-
err = ux[].linfty/Lu1 + uy[].linfty/Lu2 + p[].linfty/Lp;
163-
cout << n << " err = " << err << " " << arrns << " rey = " << 1./nu << endl;
164-
if(err < arrns) break;
165-
}
166-
} //EOF
167-
ns;
168-
169-
// Vectorial [ux,uy,p] savev the data together
170-
// ofstream uxfile("data/snapshots/sample_"+sample+"/uvp.txt");
171-
// uxfile << ux[] << endl;
232+
if(mpirank == 0){
233+
ofstream uxfile("data/snapshots/sample_"+sample+"/u.txt");
234+
uxfile << uxi[] << endl;
235+
ofstream uyfile("data/snapshots/sample_"+sample+"/v.txt");
236+
uyfile << uyi[] << endl;
237+
ofstream pfile("data/snapshots/sample_"+sample+"/p.txt");
238+
pfile << pi[] << endl;
239+
}
240+
172241

173242
}

0 commit comments

Comments
 (0)