Computing the Jacobian matrix and the right-hand side vector
Contents
Compute time derivative coefficients
dt2 = dt1 + dt;
bm = -(dt2/dt) / (dt2-dt);
bmm = (dt/dt2) / (dt2-dt);
bp = -((dt2/dt)^2 - 1) / ((dt2/dt)*(dt-dt2));
xt = bp * x0full + bm * x0mfull + bmm * x0mmfull;
Store variable values and derivatives
yfA = zeros(NVA, NDA, ntA);
for i = 1:NVA
indices = JMfull{i};
variable = x0full(indices);
yfA(i, 1, :) = variable;
yfA(i, 2, :) = ddr0v{i} * variable;
yfA(i, 3, :) = ddz0v{i} * variable;
yfA(i, 4, :) = ddrr0v{i} * variable;
yfA(i, 5, :) = ddzz0v{i} * variable;
yfA(i, 6, :) = ddzr0v{i} * variable;
yfA(i, 7, :) = xt(indices);
end
Compute analytical Jacobians
[FAA, DFAA] = evaluatingMatrices(nrA, nzA, pa, z0A, r0A, yfA, NVA, NDA, ndA, X1, Y1, X2, Y2);
Assemble system matrices
ablock = cell(NVA, NVA); xablock = cell(NVA, 1);
for j = 1:NVA
C = FAA(j, :);
xablock{j} = -PMNv{j} * C';
for k = 1:NVA
km = (k-1)*NDA + 1; kp = k*NDA;
C_block = squeeze(DFAA(j, km:kp, :));
B = spdiags(C_block(1,:)', 0, ntA, ntA) + ...
spdiags(C_block(2,:)', 0, ntA, ntA) * ddr0v{k} + ...
spdiags(C_block(3,:)', 0, ntA, ntA) * ddz0v{k} + ...
spdiags(C_block(4,:)', 0, ntA, ntA) * ddrr0v{k} + ...
spdiags(C_block(5,:)', 0, ntA, ntA) * ddzz0v{k} + ...
spdiags(C_block(6,:)', 0, ntA, ntA) * ddzr0v{k} + ...
spdiags(C_block(7,:)', 0, ntA, ntA) * bp;
ablock{j, k} = sparse(PMNv{j} * B * PNMv{k});
end
end
a = cell2mat(ablock);
b = cell2mat(xablock);