This is a description on how to avoid the bricks framework.
The model bricks are very convenient, as they hide most of the details of the assembly of the final linear systems. However it is also possible to stay at a lower level, and handle the assembly of linear systems, and their resolution, directly in scilab. For example, the demonstration demo_tripod_alt.m is very similar to the demo_tripod.sce except that the assembly is explicit:
nbd = gf_mesh_fem_get(mfd, 'nbdof'); F = gf_asm('boundary_source', 1, mim, mfu, mfd, repmat([0;-10;0],1,nbd)); K = gf_asm('linear_elasticity', mim, mfu, mfd, lambda*ones(1,nbd),mu*ones(1,nbd)); // handle Dirichlet condition [H,R] = gf_asm('dirichlet', 2, mim, mfu, mfd, repmat(eye(3,3),[1,1,nbd]), zeros(3, nbd)); [N,U0] = gf_spmat_get(H, 'dirichlet_nullspace', R); KK = N'*K*N; FF = N'*F; // solve ... disp('solving...'); t0 = timer(); lsolver = 1 // change this to compare the different solvers if (lsolver == 1) then // conjugate gradient P = gf_precond('ildlt',KK); UU = gf_linsolve('cg',KK,FF,P,'noisy','res',1e-9); elseif (lsolver == 2) then // superlu UU = gf_linsolve('superlu',KK,FF); else // the scilab "slash" operator UU = KK \ FF; end disp(sprintf('linear system solved in %.2f sec', timer()-t0)); U = (N*UU).' + U0; | ![]() | ![]() |
In getfem-interface, the assembly of vectors, and matrices is done via the gf_asm function. The Dirichlet condition u(x) = r(x) is handled in the weak form
(where h(x) is a 3×3 matrix field - here it is constant and equal to the identity). The reduced system KK * UU = FF is then built via the elimination of Dirichlet constraints from the original system. Note that it might be more efficient (and simpler) to deal with Dirichlet condition via a penalization technique.
Y. Collette