Skip to content

Commit 3a5a4b6

Browse files
committed
Added Jacobian vector product in the new form
1 parent 7d03236 commit 3a5a4b6

File tree

1 file changed

+28
-23
lines changed

1 file changed

+28
-23
lines changed

src/+otp/+qg/jvp.m

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,44 @@
1-
function Jacobianvp = jvp(psi, u, L, RdnL, PdnL, Ddx, Ddy, Re, Ro)
1+
function jvp = jvp(psi, u, L, RdnL, PdnL, Ddx, Ddy, 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+
u = reshape(u, 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-
nLu = -L*u;
15-
Ddxu = Ddx*u;
16-
Ddyu = Ddy*u;
11+
dpsix = Dx*psi;
12+
dpsiy = psi*DyT;
1713

18-
DdxnLu = Ddx*nLu;
19-
DdynLu = Ddy*nLu;
14+
dqx = Dx*q;
15+
dqy = q*DyT;
2016

21-
% Arakawa approximation
22-
dJpsi1u = dpsix.*DdynLu + dqy.*Ddxu ...
23-
- dpsiy.*DdxnLu - dqx.*Ddyu;
17+
nLu = -(Lx*u + u*Ly);
18+
Dxu = Dx*u;
19+
Dyu = u*DyT;
20+
21+
DxnLu = Dx*nLu;
22+
DynLu = nLu*DyT;
2423

25-
dJpsi2u = Ddx*(psi.*DdynLu) + Ddx*(dqy.*u) ...
26-
- Ddy*(psi.*DdxnLu) - Ddy*(dqx.*u);
24+
% Arakawa approximation
25+
dJpsi1u = dpsix.*DynLu + dqy.*Dxu ...
26+
- dpsiy.*DxnLu - dqx.*Dyu;
2727

28-
dJpsi3u = Ddy*(dpsix.*nLu) + Ddy*(q.*Ddxu) ...
29-
- Ddx*(dpsiy.*nLu) - Ddx*(q.*Ddyu);
28+
dJpsi2u = Dx*(psi.*DynLu) + Dx*(dqy.*u) ...
29+
- (psi.*DxnLu)*DyT - (dqx.*u)*DyT;
3030

31+
dJpsi3u = (dpsix.*nLu)*DyT + (q.*Dxu)*DyT ...
32+
- Dx*(dpsiy.*nLu) - Dx*(q.*Dyu);
3133

3234
dJpsiu = -(dJpsi1u + dJpsi2u + dJpsi3u)/3;
3335

36+
ddqtpsivp = -dJpsiu + (1/Ro)*Dxu;
3437

35-
ddqtpsivp = -dJpsiu + (1/Ro)*Ddxu + (1/Re)*(L*(nLu));
38+
% solve the sylvester equation
39+
nLidqtmq = P1*(L12.*(P1*ddqtpsivp*P2))*P2;
3640

37-
Jacobianvp = PdnL*(RdnL\(RdnL'\(PdnL'*ddqtpsivp)));
41+
% solve into stream form of the Jacobian vp
42+
jvp = reshape(nLidqtmq - (1/Re)*(nLu), nx*ny, 1);
3843

3944
end

0 commit comments

Comments
 (0)