37 #ifndef GETFEM_FOURTH_ORDER_H__
38 #define GETFEM_FOURTH_ORDER_H__
53 template<
typename MAT,
typename VECT>
56 const mesh_fem &mf_data,
const VECT &A,
60 "M(#1,#1)+=sym(comp(Hess(#1).Hess(#1).Base(#2))(:,i,i,:,j,j,k).a(k))");
65 assem.
push_mat(
const_cast<MAT &
>(M));
69 template<
typename MAT,
typename VECT>
70 void asm_stiffness_matrix_for_homogeneous_bilaplacian
71 (
const MAT &M,
const mesh_im &mim,
const mesh_fem &mf,
73 generic_assembly assem
75 "M(#1,#1)+=sym(comp(Hess(#1).Hess(#1))(:,i,i,:,j,j).a(1))");
79 assem.push_mat(
const_cast<MAT &
>(M));
84 template<
typename MAT,
typename VECT>
85 void asm_stiffness_matrix_for_bilaplacian_KL
86 (
const MAT &M,
const mesh_im &mim,
const mesh_fem &mf,
87 const mesh_fem &mf_data,
const VECT &D_,
const VECT &nu_,
89 generic_assembly assem
90 (
"d=data$1(#2); n=data$2(#2);"
91 "t=comp(Hess(#1).Hess(#1).Base(#2).Base(#2));"
92 "M(#1,#1)+=sym(t(:,i,j,:,i,j,k,l).d(k)-t(:,i,j,:,i,j,k,l).d(k).n(l)"
93 "+t(:,i,i,:,j,j,k,l).d(k).n(l))");
96 assem.push_mf(mf_data);
99 assem.push_mat(
const_cast<MAT &
>(M));
103 template<
typename MAT,
typename VECT>
104 void asm_stiffness_matrix_for_homogeneous_bilaplacian_KL
105 (
const MAT &M,
const mesh_im &mim,
const mesh_fem &mf,
106 const VECT &D_,
const VECT &nu_,
108 generic_assembly assem
109 (
"d=data$1(1); n=data$2(1);"
110 "t=comp(Hess(#1).Hess(#1));"
111 "M(#1,#1)+=sym(t(:,i,j,:,i,j).d(1)-t(:,i,j,:,i,j).d(1).n(1)"
112 "+t(:,i,i,:,j,j).d(1).n(1))");
116 assem.push_data(nu_);
117 assem.push_mat(
const_cast<MAT &
>(M));
134 (model &md,
const mesh_im &mim,
const std::string &varname,
145 (model &md,
const mesh_im &mim,
const std::string &varname,
146 const std::string &dataname1,
const std::string &dataname2,
158 template<
typename VECT1,
typename VECT2>
162 GMM_ASSERT1(mf_data.
get_qdim() == 1,
163 "invalid data mesh fem (Qdim=1 required)");
189 s =
"Grad_Test_u.(A*Normal)";
191 s =
"Grad_Test_u.(((Reshape(A,meshdim,meshdim)*Normal).Normal)*Normal)";
193 s =
"((Grad_Test_u')*A).Normal";
196 s =
"((((Grad_Test_u').Reshape(A,qdim(u),meshdim,meshdim)).Normal).Normal).Normal";
198 GMM_ASSERT1(
false,
"invalid rhs vector");
199 asm_real_or_complex_1_param_vec(B, mim, mf, &mf_data, F, rg, s);
202 template<
typename VECT1,
typename VECT2>
203 void asm_homogeneous_normal_derivative_source_term
204 (VECT1 &B,
const mesh_im &mim,
const mesh_fem &mf,
205 const VECT2 &F,
const mesh_region &rg) {
230 if (mf.get_qdim() == 1 && Q == 1)
231 s =
"Test_Grad_u.(A*Normal)";
232 else if (mf.get_qdim() == 1 && Q == gmm::sqr(mf.linked_mesh().dim()))
233 s =
"Test_Grad_u.(((Reshape(A,meshdim,meshdim)*Normal).Normal)*Normal)";
234 else if (mf.get_qdim() >
size_type(1) && Q == mf.get_qdim())
235 s =
"((Test_Grad_u')*A).Normal";
237 Q ==
size_type(mf.get_qdim()*gmm::sqr(mf.linked_mesh().dim())))
238 s =
"((((Test_Grad_u').Reshape(A,qdim(u),meshdim,meshdim)).Normal).Normal).Normal";
240 GMM_ASSERT1(
false,
"invalid rhs vector");
241 asm_real_or_complex_1_param_vec(B, mim, mf, 0, F, rg, s);
258 (model &md,
const mesh_im &mim,
const std::string &varname,
259 const std::string &dataname,
size_type region);
270 template<
typename VECT1,
typename VECT2>
271 void asm_neumann_KL_term
272 (VECT1 &B,
const mesh_im &mim,
const mesh_fem &mf,
const mesh_fem &mf_data,
273 const VECT2 &M,
const VECT2 &divM,
const mesh_region &rg) {
274 GMM_ASSERT1(mf_data.get_qdim() == 1,
275 "invalid data mesh fem (Qdim=1 required)");
277 generic_assembly assem
278 (
"MM=data$1(mdim(#1),mdim(#1),#2);"
279 "divM=data$2(mdim(#1),#2);"
280 "V(#1)+=comp(Base(#1).Normal().Base(#2))(:,i,j).divM(i,j);"
281 "V(#1)+=comp(Grad(#1).Normal().Base(#2))(:,i,j,k).MM(i,j,k)*(-1);"
282 "V(#1)+=comp(Grad(#1).Normal().Normal().Normal().Base(#2))(:,i,i,j,k,l).MM(j,k,l);");
286 assem.push_mf(mf_data);
288 assem.push_data(divM);
293 template<
typename VECT1,
typename VECT2>
294 void asm_neumann_KL_homogeneous_term
295 (VECT1 &B,
const mesh_im &mim,
const mesh_fem &mf,
296 const VECT2 &M,
const VECT2 &divM,
const mesh_region &rg) {
298 generic_assembly assem
299 (
"MM=data$1(mdim(#1),mdim(#1));"
300 "divM=data$2(mdim(#1));"
301 "V(#1)+=comp(Base(#1).Normal())(:,i).divM(i);"
302 "V(#1)+=comp(Grad(#1).Normal())(:,i,j).MM(i,j)*(-1);"
303 "V(#1)+=comp(Grad(#1).Normal().Normal().Normal())(:,i,i,j,k).MM(j,k);");
308 assem.push_data(divM);
324 (model &md,
const mesh_im &mim,
const std::string &varname,
325 const std::string &dataname1,
const std::string &dataname2,
349 template<
typename MAT,
typename VECT1,
typename VECT2>
353 const VECT2 &r_data,
const mesh_region &rg,
bool R_must_be_derivated,
355 typedef typename gmm::linalg_traits<VECT1>::value_type value_type;
356 typedef typename gmm::number_traits<value_type>::magnitude_type magn_type;
360 if (version & ASMDIR_BUILDH) {
363 s =
"M(#1,#2)+=comp(Base(#1).Grad(#2).Normal())(:,:,i,i)";
365 s =
"M(#1,#2)+=comp(vBase(#1).vGrad(#2).Normal())(:,i,:,i,j,j);";
373 gmm::clean(H, gmm::default_tol(magn_type())
374 * gmm::mat_maxnorm(H) * magn_type(1000));
376 if (version & ASMDIR_BUILDR) {
378 "invalid data mesh fem (Qdim=1 required)");
379 if (!R_must_be_derivated) {
382 asm_real_or_complex_1_param_vec(R, mim, mf_mult, &mf_r, r_data, rg,
383 "(Grad_A.Normal)*Test_u");
409 (model &md,
const mesh_im &mim,
const std::string &varname,
410 const std::string &multname,
size_type region,
411 const std::string &dataname = std::string(),
412 bool R_must_be_derivated =
false);
429 (model &md,
const mesh_im &mim,
const std::string &varname,
430 const mesh_fem &mf_mult,
size_type region,
431 const std::string &dataname = std::string(),
432 bool R_must_be_derivated =
false);
449 (model &md,
const mesh_im &mim,
const std::string &varname,
451 const std::string &dataname = std::string(),
452 bool R_must_be_derivated =
false);
472 (model &md,
const mesh_im &mim,
const std::string &varname,
473 scalar_type penalisation_coeff,
size_type region,
474 const std::string &dataname = std::string(),
475 bool R_must_be_derivated =
false);
Generic assembly of vectors, matrices.
void push_data(const VEC &d)
Add a new data (dense array)
void push_mat(const MAT &m)
Add a new output matrix (fake const version..)
void assembly(const mesh_region ®ion=mesh_region::all_convexes())
do the assembly on the specified region (boundary or set of convexes)
void push_mi(const mesh_im &im_)
Add a new mesh_im.
void push_mf(const mesh_fem &mf_)
Add a new mesh_fem.
Describe a finite element method linked to a mesh.
virtual dim_type get_qdim() const
Return the Q dimension.
virtual size_type nb_dof() const
Return the total number of degrees of freedom.
const mesh & linked_mesh() const
Return a reference to the underlying mesh.
Describe an integration method linked to a mesh.
const mesh & linked_mesh() const
Give a reference to the linked mesh of type mesh.
structure used to hold a set of convexes and/or convex faces.
const mesh_region & from_mesh(const mesh &m) const
For regions which have been built with just a number 'id', from_mesh(m) sets the current region to 'm...
static mesh_region all_convexes()
provide a default value for the mesh_region parameters of assembly procedures etc.
Miscelleanous assembly routines for common terms. Use the low-level generic assembly....
Model representation in Getfem.
void asm_stiffness_matrix_for_bilaplacian(const MAT &M, const mesh_im &mim, const mesh_fem &mf, const mesh_fem &mf_data, const VECT &A, const mesh_region &rg=mesh_region::all_convexes())
assembly of .
void asm_normal_derivative_dirichlet_constraints(MAT &H, VECT1 &R, const mesh_im &mim, const mesh_fem &mf_u, const mesh_fem &mf_mult, const mesh_fem &mf_r, const VECT2 &r_data, const mesh_region &rg, bool R_must_be_derivated, int version)
Assembly of normal derivative Dirichlet constraints in a weak form.
void asm_normal_derivative_source_term(VECT1 &B, const mesh_im &mim, const mesh_fem &mf, const mesh_fem &mf_data, const VECT2 &F, const mesh_region &rg)
assembly of .
void asm_normal_source_term(VECT1 &B, const mesh_im &mim, const mesh_fem &mf, const mesh_fem &mf_data, const VECT2 &F, const mesh_region &rg)
Normal source term (for boundary (Neumann) condition).
size_t size_type
used as the common size type in the library
GEneric Tool for Finite Element Methods.
size_type add_bilaplacian_brick(model &md, const mesh_im &mim, const std::string &varname, const std::string &dataname, size_type region=size_type(-1))
Adds a bilaplacian brick on the variable varname and on the mesh region region.
size_type add_bilaplacian_brick_KL(model &md, const mesh_im &mim, const std::string &varname, const std::string &dataname1, const std::string &dataname2, size_type region=size_type(-1))
Adds a bilaplacian brick on the variable varname and on the mesh region region.
size_type add_normal_derivative_Dirichlet_condition_with_multipliers(model &md, const mesh_im &mim, const std::string &varname, const std::string &multname, size_type region, const std::string &dataname=std::string(), bool R_must_be_derivated=false)
Adds a Dirichlet condition on the normal derivative of the variable varname and on the mesh region re...
size_type add_normal_derivative_source_term_brick(model &md, const mesh_im &mim, const std::string &varname, const std::string &dataname, size_type region)
Adds a normal derivative source term brick :math:F = \int b.
size_type add_Kirchhoff_Love_Neumann_term_brick(model &md, const mesh_im &mim, const std::string &varname, const std::string &dataname1, const std::string &dataname2, size_type region)
Adds a Neumann term brick for Kirchhoff-Love model on the variable varname and the mesh region region...
size_type add_normal_derivative_Dirichlet_condition_with_penalization(model &md, const mesh_im &mim, const std::string &varname, scalar_type penalisation_coeff, size_type region, const std::string &dataname=std::string(), bool R_must_be_derivated=false)
Adds a Dirichlet condition on the normal derivative of the variable varname and on the mesh region re...