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++){
2
7
cout<<"Sample:"+sample<<endl;
3
8
4
9
/////// Import weights for each CP
@@ -78,36 +83,54 @@ for(int sample = 0; sample<100; sample++){
78
83
79
84
80
85
mesh Mesh = readmesh("data/reference/reference.msh");
86
+ mesh MeshBackup = readmesh("data/reference/reference.msh");
81
87
82
88
int[int] orderOut = [1, 1, 1, 1];
83
89
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
87
91
real niu = 3.5*1e-3; // g mm^-1 s^-1
88
92
real rho = 1.06*1e-3; // g mm^-3
89
93
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;
93
104
94
105
func PkVector = [P2, P2, P1];
95
106
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
+
96
119
fespace SpaceVector(Mesh, PkVector);
97
120
fespace Uh(Mesh,P2);
98
121
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
+
103
124
Uh FX = funcT(weights,cps,int(cps.n/2))[0];
104
125
Uh FY = funcT(weights,cps,int(cps.n/2))[1];
105
126
106
- cout << "Finite Element DOF (in each partition): " + SpaceVector.ndof << endl;
107
127
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;
109
130
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))
111
134
+(dx(ucx)*Finv12(FX,FY)+dy(ucx)*Finv22(FX,FY))*(dx(vx)*Finv12(FX,FY)+dy(vx)*Finv22(FX,FY))
112
135
+(dx(ucy)*Finv11(FX,FY)+dy(ucy)*Finv21(FX,FY))*(dx(vy)*Finv11(FX,FY)+dy(vy)*Finv21(FX,FY))
113
136
+(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++){
118
141
- 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)))
119
142
- JF(FX,FY)*q*((dx(ucx)*Finv11(FX,FY)+dy(ucx)*Finv21(FX,FY))+(dx(ucy)*Finv12(FX,FY)+dy(ucy)*Finv22(FX,FY))))
120
143
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);
125
146
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))
127
149
+ux*(dx(ucx)*Finv11(FX,FY)+dy(ucx)*Finv21(FX,FY))
128
150
+ucy*(dx(ux)*Finv12(FX,FY)+dy(ux)*Finv22(FX,FY))
129
151
+uy*(dx(ucx)*Finv12(FX,FY)+dy(ucx)*Finv22(FX,FY)))
@@ -141,33 +163,80 @@ for(int sample = 0; sample<100; sample++){
141
163
- JF(FX,FY)*q*((dx(ux)*Finv11(FX,FY)+dy(ux)*Finv21(FX,FY))+(dx(uy)*Finv12(FX,FY)+dy(uy)*Finv22(FX,FY))))
142
164
143
165
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
+
146
171
147
172
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
+ // }
149
231
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
+
172
241
173
242
}
0 commit comments