Skip to content

Commit 744182d

Browse files
committed
adding Jacobian Adjoint Vector Products in the new form
1 parent 81cd444 commit 744182d

File tree

4 files changed

+63
-45
lines changed

4 files changed

+63
-45
lines changed

src/+otp/+qg/QuasiGeostrophicProblem.m

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,12 @@ function onSettingsChanged(obj)
131131
Ddx = otp.utils.pde.Dd(n, xdomain, 1, 2, bc(1));
132132
Ddy = otp.utils.pde.Dd(n, ydomain, 2, 2, bc(2));
133133

134+
% create the spatial derivatives
134135
Dx = otp.utils.pde.Dd(nx, xdomain, 1, 1, bc(1));
136+
DxT = Dx.';
135137

136-
% The transpose here is important
137-
DyT = otp.utils.pde.Dd(ny, ydomain, 1, 1, bc(2)).';
138+
Dy = otp.utils.pde.Dd(ny, ydomain, 1, 1, bc(2));
139+
DyT = Dy.';
138140

139141
% create the x and y Laplacians
140142
Lx = otp.utils.pde.laplacian(nx, xdomain, 1, bc(1));
@@ -145,12 +147,11 @@ function onSettingsChanged(obj)
145147
RdnLT = RdnL.';
146148
PdnLT = PdnL.';
147149

148-
% do decompositions for the eigenvalue sylvester method. see
150+
% Do decompositions for the eigenvalue sylvester method. See
149151
%
150152
% Kirsten, Gerhardus Petrus. Comparison of methods for solving Sylvester systems. Stellenbosch University, 2018.
151153
%
152-
% for a detailed method, the "Eigenvalue Method" which makes this
153-
% particularly efficient
154+
% for a detailed method, the "Eigenvalue Method" which makes this particularly efficient.
154155

155156
hx2 = hx^2;
156157
hy2 = hy^2;
@@ -167,13 +168,13 @@ function onSettingsChanged(obj)
167168
F = sin(pi*(ymat.' - 1));
168169

169170
obj.Rhs = otp.Rhs(@(t, psi) ...
170-
otp.qg.f(psi, Lx, Ly, P1, P2, L12, Dx, DyT, F, Re, Ro), ...
171+
otp.qg.f(psi, Lx, Ly, P1, P2, L12, Dx, DxT, Dy, DyT, F, Re, Ro), ...
171172
...
172173
otp.Rhs.FieldNames.JacobianVectorProduct, @(t, psi, v) ...
173-
otp.qg.jvp(psi, v, Lx, Ly, P1, P2, L12, Dx, DyT, F, Re, Ro), ...
174+
otp.qg.jvp(psi, v, Lx, Ly, P1, P2, L12, Dx, DxT, Dy, DyT, F, Re, Ro), ...
174175
...
175176
otp.Rhs.FieldNames.JacobianAdjointVectorProduct, @(t, psi, v) ...
176-
otp.qg.javp(psi, v, L, RdnL, PdnL, Ddx, Ddy, Re, Ro));
177+
otp.qg.javp(psi, v, Lx, Ly, P1, P2, L12, Dx, DxT, Dy, DyT, F, Re, Ro));
177178

178179

179180
% AD LES

src/+otp/+qg/f.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
function dpsit = f(psi, Lx, Ly, P1, P2, L12, Dx, DyT, F, Re, Ro)
1+
function dpsit = f(psi, Lx, Ly, P1, P2, L12, Dx, ~, ~, DyT, F, Re, Ro)
22

33
[nx, ny] = size(L12);
44

src/+otp/+qg/javp.m

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,53 @@
1-
function Jacobianavp = javp(psi, u, L, RdnL, PdnL, Ddx, Ddy, Re, Ro)
1+
function javp = javp(psi, v, Lx, Ly, P1, P2, L12, Dx, DxT, Dy, DyT, ~, Re, Ro)
22

3-
% supporting multiple mat-vecs at the same time
4-
N = size(u, 2);
5-
psi = repmat(psi, 1, N);
3+
[nx, ny] = size(L12);
64

7-
dpsix = Ddx*psi;
8-
dpsiy = Ddy*psi;
5+
psi = reshape(psi, nx, ny);
6+
v = reshape(v, nx, ny);
97

10-
q = -L*psi;
11-
dqx = Ddx*q;
12-
dqy = Ddy*q;
8+
% Calculate the vorticity
9+
q = -(Lx*psi + psi*Ly);
1310

14-
dnLu = PdnL*(RdnL\(RdnL'\(PdnL'*u)));
11+
dpsix = Dx*psi;
12+
dpsiy = psi*DyT;
13+
14+
dqx = Dx*q;
15+
dqy = q*DyT;
16+
17+
% solve the sylvester equation
18+
dnLv = P1*(L12.*(P1*v*P2))*P2;
19+
20+
DxadnLv = DxT*dnLv;
21+
DyadnLv = dnLv*Dy;
22+
23+
dpsixdnLvDy = (dpsix.*dnLv)*Dy;
24+
DxTdpsiydnLv = DxT*(dpsiy.*dnLv);
25+
26+
psiDxadnLvDy = (psi.*DxadnLv)*Dy;
27+
DxTpsiDyadnLv = DxT*(psi.*DyadnLv);
28+
29+
dpsixDyadnLv = dpsix.*DyadnLv
30+
dpsiyDxadnLv = dpsiy.*DxadnLv;
1531

16-
DdxadnLu = Ddx'*dnLu;
17-
DdyadnLu = Ddy'*dnLu;
1832

1933
% Arakawa approximation
20-
dJpsi1u = -L*(Ddy'*(dpsix.*dnLu)) + Ddx'*(dqy.*dnLu) ...
21-
+ L*(Ddx'*(dpsiy.*dnLu)) - Ddy'*(dqx.*dnLu);
34+
dJpsi1v = -(Lx*dpsixdnLvDy + dpsixdnLvDy*Ly) + DxT*(dqy.*dnLv) ...
35+
+ (Lx*DxTdpsiydnLv + DxTdpsiydnLv*Ly) - (dqx.*dnLv)*Dy;
2236

23-
dJpsi2u = -L*(Ddy'*(psi.*DdxadnLu)) + dqy.*DdxadnLu ...
24-
+ L*(Ddx'*(psi.*DdyadnLu)) - dqx.*DdyadnLu;
37+
dJpsi2v = -(Lx*psiDxadnLvDy + psiDxadnLvDy*Ly) + dqy.*DxadnLv ...
38+
+ (Lx*DxTpsiDyadnLv + DxTpsiDyadnLv*Ly) - dqx.*DyadnLv;
2539

26-
dJpsi3u = -L*(dpsix.*DdyadnLu) + Ddx'*(q.*DdyadnLu) ...
27-
+ L*(dpsiy.*DdxadnLu) - Ddy'*(q.*DdxadnLu);
40+
dJpsi3v = -(Lx*dpsixDyadnLv + dpsixDyadnLv*Ly) + DxT*(q.*DyadnLv) ...
41+
+ (Lx*dpsiyDxadnLv + dpsiyDxadnLv*Ly) - (q.*DxadnLv)*Dy;
2842

2943

30-
dJpsiu = -(dJpsi1u + dJpsi2u + dJpsi3u)/3;
44+
dJpsiv = -(dJpsi1v + dJpsi2v + dJpsi3v)/3;
3145

32-
ddqtpsiau = - dJpsiu + (1/Ro)*DdxadnLu + (1/Re)*(-L'*(L*dnLu));
46+
nLv = -(Lx*v + v*Ly);
3347

34-
Jacobianavp = ddqtpsiau;
48+
ddqtpsiav = -dJpsiv + (1/Ro)*DxadnLv - (1/Re)*(nLv);
49+
50+
javp = ddqtpsiav;
3551

3652
end
53+

src/+otp/+qg/jvp.m

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
function jvp = jvp(psi, v, Lx, Ly, P1, P2, L12, Dx, DyT, ~, Re, Ro)
1+
function jvp = jvp(psi, v, Lx, Ly, P1, P2, L12, Dx, ~, ~, DyT, ~, Re, Ro)
22

33
[nx, ny] = size(L12);
44

@@ -14,31 +14,31 @@
1414
dqx = Dx*q;
1515
dqy = q*DyT;
1616

17-
nLu = -(Lx*v + v*Ly);
18-
Dxu = Dx*v;
19-
Dyu = v*DyT;
17+
nLv = -(Lx*v + v*Ly);
18+
Dxv = Dx*v;
19+
Dyv = v*DyT;
2020

21-
DxnLu = Dx*nLu;
22-
DynLu = nLu*DyT;
21+
DxnLv = Dx*nLv;
22+
DynLv = nLv*DyT;
2323

2424
% Arakawa approximation
25-
dJpsi1u = dpsix.*DynLu + dqy.*Dxu ...
26-
- dpsiy.*DxnLu - dqx.*Dyu;
25+
dJpsi1v = dpsix.*DynLv + dqy.*Dxv ...
26+
- dpsiy.*DxnLv - dqx.*Dyv;
2727

28-
dJpsi2u = Dx*(psi.*DynLu) + Dx*(dqy.*v) ...
29-
- (psi.*DxnLu)*DyT - (dqx.*v)*DyT;
28+
dJpsi2v = Dx*(psi.*DynLv) + Dx*(dqy.*v) ...
29+
- (psi.*DxnLv)*DyT - (dqx.*v)*DyT;
3030

31-
dJpsi3u = (dpsix.*nLu)*DyT + (q.*Dxu)*DyT ...
32-
- Dx*(dpsiy.*nLu) - Dx*(q.*Dyu);
31+
dJpsi3v = (dpsix.*nLv)*DyT + (q.*Dxv)*DyT ...
32+
- Dx*(dpsiy.*nLv) - Dx*(q.*Dyv);
3333

34-
dJpsiu = -(dJpsi1u + dJpsi2u + dJpsi3u)/3;
34+
dJpsiv = -(dJpsi1v + dJpsi2v + dJpsi3v)/3;
3535

36-
ddqtpsivp = -dJpsiu + (1/Ro)*Dxu;
36+
ddqtpsivp = -dJpsiv + (1/Ro)*Dxv;
3737

3838
% solve the sylvester equation
3939
nLidqtmq = P1*(L12.*(P1*ddqtpsivp*P2))*P2;
4040

4141
% solve into stream form of the Jacobian vp
42-
jvp = reshape(nLidqtmq - (1/Re)*(nLu), nx*ny, 1);
42+
jvp = reshape(nLidqtmq - (1/Re)*(nLv), nx*ny, 1);
4343

4444
end

0 commit comments

Comments
 (0)