24 mc = sys.Model.Config;
26 geo = fe_pos.Geometry;
27 fe_press = mc.PressureFEM;
28 pgeo = fe_press.Geometry;
33 dofsperelem_pos = geo.DofsPerElement;
34 dofsperelem_press = pgeo.DofsPerElement;
35 num_gausspoints = fe_pos.GaussPointsPerElem;
36 num_elements = geo.NumElements;
39 relidx_press = 1:dofsperelem_press;
40 totalsize = num_elements*num_gausspoints*dofsperelem_press;
41 i = zeros(totalsize,1);
42 j = zeros(totalsize,1);
43 s = zeros(totalsize,1);
45 idx_pos = sys.idx_u_elems_local;
46 idx_press = sys.idx_p_elems_local;
49 uvwcomplete = sys.includeDirichletValues(t, uvwdof);
52 for m = 1:num_elements
53 elemidx_u_glob = idx_pos(:,:,m);
54 elemidx_p = idx_press(:,m);
55 elemidx_pressure3 = [elemidx_p
59 for gp = 1:num_gausspoints
60 pos = 3*(gp-1)+1:3*gp;
61 dtn = fe_pos.transgrad(:,pos,m);
62 u = uvwcomplete(elemidx_u_glob);
70 weight = fe_pos.GaussWeights(gp) * fe_pos.elem_detjac(m, gp);
72 for k = 1:dofsperelem_pos
74 U1k = [dtn(
k,:); 0 0 0; 0 0 0];
75 U2k = [0 0 0; dtn(
k,:); 0 0 0];
76 U3k = [0 0 0; 0 0 0; dtn(
k,:)];
79 precomp = weight * det(
F) * fe_press.Ngp(:,gp,m);
81 i(cur_off + (1:3*dofsperelem_press)) = elemidx_pressure3;
83 j(cur_off + relidx_press) = elemidx_u_glob(1,
k);
84 s(cur_off + relidx_press) = sum(diag(Finv*U1k)) * precomp;
86 cur_off = cur_off + dofsperelem_press;
88 j(cur_off + relidx_press) = elemidx_u_glob(2,
k);
89 s(cur_off + relidx_press) = sum(diag(Finv*U2k)) * precomp;
91 cur_off = cur_off + dofsperelem_press;
93 j(cur_off + relidx_press) = elemidx_u_glob(3,
k);
94 s(cur_off + relidx_press) = sum(diag(Finv*U3k)) * precomp;
96 cur_off = cur_off + dofsperelem_press;
100 Jg = sparse(i,j,s,M,6*N+M);
102 Jg(:,sys.idx_uv_bc_glob) = [];
function J = getStateJacobianImpl(colvec< double > x,double t)
Default implementation of state jacobians. uses finite differences.