-
Notifications
You must be signed in to change notification settings - Fork 188
/
minimal-surface-Tao-2d-PETSc.edp
80 lines (74 loc) · 2.45 KB
/
minimal-surface-Tao-2d-PETSc.edp
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
// run with MPI: ff-mpirun -np 4 script.edp
// NBPROC 4
load "PETSc"
macro dimension()2//
include "macro_ddm.idp"
macro def(i)i// EOM
macro init(i)i// EOM
func Pk = P2;
macro grad(u)[dx(u), dy(u)]// EOM
mesh ThNo, Th = square(getARGV("-global", 20), getARGV("-global", 20), [1 + x, y]);
fespace Vh(Th, Pk);
Mat H;
MatCreate(Th, H, Pk);
{
fespace Ph(Th, P0);
Ph part;
PartitionCreate(Th, part[], P0);
ThNo = trunc(Th, abs(part - 1.0) < 1e-1);
}
func g = cos(pi*x)*cos(pi*y);
func real J(real[int]& X) {
Vh u;
ChangeNumbering(H, u[], X, inverse = true, exchange = true);
real glob, loc = int2d(ThNo)(sqrt(1 + grad(u)'*grad(u)));
mpiAllReduce(loc, glob, mpiCommWorld, mpiSUM);
return glob;
}
func real[int] DJ(real[int]& X) {
Vh u;
ChangeNumbering(H, u[], X, inverse = true, exchange = true);
varf vG(w, v) = int2d(Th)((grad(u)'*grad(v)) / sqrt(1 + grad(u)'*grad(u)));
real[int] out = vG(0, Vh);
real[int] outPETSc;
ChangeNumbering(H, out, outPETSc);
return outPETSc;
}
func int HJ(real[int]& X) {
Vh u;
ChangeNumbering(H, u[], X, inverse = true, exchange = true);
varf vH(v, w) = int2d(Th)((grad(w)'*grad(v)) / sqrt(1 + grad(u)'*grad(u))
- (grad(w)'*grad(u)) * (grad(v)'*grad(u)) *(1 + grad(u)'*grad(u))^-1.5);
matrix Loc = vH(Vh, Vh);
H = Loc;
return 0;
}
varf onGamma(u, v) = on(1, 2, 3, 4, u = 1);
Vh onG;
onG[] = onGamma(0, Vh, tgv = 1);
real[int] lbPETSc, ubPETSc;
{
Vh lb = onG != 0 ? g : -1e19;
Vh ub = onG != 0 ? g : 1e19;
lb = max(lb, 3-100*(((x-1.5)^2 + (y-0.5)^2))^2);
ChangeNumbering(H, lb[], lbPETSc);
ChangeNumbering(H, ub[], ubPETSc);
}
{
Vh u = onG != 0 ? g : 0;
real[int] uPETSc;
ChangeNumbering(H, u[], uPETSc);
TaoSolve(H, J, DJ, uPETSc, xl = lbPETSc, xu = ubPETSc, sparams = "-tao_monitor -tao_view -tao_type bqnls -tao_max_it 40 -tao_gatol 1e-4");
ChangeNumbering(H, u[], uPETSc, inverse = true, exchange = true);
real Ju = J(uPETSc);
plotMPI(Th, u, Pk, def, real, cmm = "Global solution, J(u) = " + Ju);
}
{
Vh u = onG != 0 ? g : 0;
real[int] uPETSc;
ChangeNumbering(H, u[], uPETSc);
TaoSolve(H, J, DJ, uPETSc, xl = lbPETSc, xu = ubPETSc, sparams = "-tao_monitor -tao_view -tao_type bnls -tao_max_it 40 -tao_gatol 1e-4", HessianRoutine = HJ);
ChangeNumbering(H, u[], uPETSc, inverse = true, exchange = true);
real Ju = J(uPETSc);
plotMPI(Th, u, Pk, def, real, cmm = "Global solution, J(u) = " + Ju);
}