Welcome to the NetCologne GmbH open source mirroring service!

This machine mirrors various open-source projects. 20 Gbit/s uplink.

If there are any issues or you want another project mirrored, please contact mirror-service -=AT=- netcologne DOT de !

GetFEM: src/getfem_mesh_fem_product.cc Source File
GetFEM  5.5
getfem_mesh_fem_product.cc
1 /*===========================================================================
2 
3  Copyright (C) 1999-2026 Yves Renard
4 
5  This file is a part of GetFEM
6 
7  GetFEM is free software; you can redistribute it and/or modify it
8  under the terms of the GNU Lesser General Public License as published
9  by the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version along with the GCC Runtime Library
11  Exception either version 3.1 or (at your option) any later version.
12  This program is distributed in the hope that it will be useful, but
13  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15  License and GCC Runtime Library Exception for more details.
16  You should have received a copy of the GNU Lesser General Public License
17  along with this program. If not, see https://www.gnu.org/licenses/.
18 
19 ===========================================================================*/
20 
21 
23 
24 namespace getfem {
25 
26  void fem_product::init() {
27 
28  GMM_ASSERT1(pfems[0]->target_dim() == 1, "To be done");
29  GMM_ASSERT1(pfems[1]->target_dim() == 1,
30  "The second finite element should be scalar");
31 
32  cvr = pfems[0]->ref_convex(cv);
33  dim_ = cvr->structure()->dim();
34  is_equiv = real_element_defined = true;
35  is_polycomp = is_pol = is_lag = is_standard_fem = false;
36  es_degree = 5; /* humm ... */
37  ntarget_dim = 1;
38  std::stringstream nm;
39  nm << "FEM_PRODUCT(" << pfems[0]->debug_name() << ","
40  << pfems[1]->debug_name() << "," << cv << ")";
41  debug_name_ = nm.str();
42 
43  init_cvs_node();
44  for (dal::bv_visitor i(enriched_dof1); !i.finished(); ++i) {
45  for (size_type j = 0; j < pfems[1]->nb_dof(cv); ++j)
46  add_node(xfem_dof(pfems[0]->dof_types()[i], xfem_index+j),
47  pfems[0]->node_of_dof(cv,i));
48  }
49  }
50 
51  void fem_product::base_value(const base_node &,
52  base_tensor &) const
53  { GMM_ASSERT1(false, "No base values, real only element."); }
54  void fem_product::grad_base_value(const base_node &,
55  base_tensor &) const
56  { GMM_ASSERT1(false, "No base values, real only element."); }
57  void fem_product::hess_base_value(const base_node &,
58  base_tensor &) const
59  { GMM_ASSERT1(false, "No base values, real only element."); }
60 
61  void fem_product::real_base_value(const fem_interpolation_context &c,
62  base_tensor &t, bool) const {
63  bgeot::multi_index mi(2);
64  mi[1] = target_dim(); mi[0] = short_type(nb_dof(0));
65  t.adjust_sizes(mi);
66  base_tensor::iterator it = t.begin(), itf;
67 
68  fem_interpolation_context c0 = c;
69  std::vector<base_tensor> val_e(2);
70  for (size_type k = 0; k < 2; ++k) {
71  if (c0.have_pfp()) {
72  c0.set_pfp(fem_precomp(pfems[k], c0.pfp()->get_ppoint_tab(),
73  c0.pfp()));
74  } else { c0.set_pf(pfems[k]); }
75  c0.base_value(val_e[k]);
76  }
77 
78  assert(target_dim() == 1);
79  for (dal::bv_visitor i(enriched_dof1); !i.finished(); ++i) {
80  itf = val_e[1].begin();
81  scalar_type e = val_e[0][i];
82  for (size_type j = 0; j < pfems[1]->nb_dof(cv); ++j)
83  *it++ = *itf++ * e;
84  }
85  assert(it == t.end());
86  }
87 
88  void fem_product::real_grad_base_value(const fem_interpolation_context &c,
89  base_tensor &t, bool) const {
90  bgeot::multi_index mi(3);
91  mi[2] = short_type(c.N()); mi[1] = target_dim();
92  mi[0] = short_type(nb_dof(0));
93  t.adjust_sizes(mi);
94  base_tensor::iterator it = t.begin();
95 
96  fem_interpolation_context c0 = c;
97  std::vector<base_tensor> grad_e(2), val_e(2);
98  for (size_type k = 0; k < 2; ++k) {
99  if (c0.have_pfp()) {
100  c0.set_pfp(fem_precomp(pfems[k], c0.pfp()->get_ppoint_tab(),
101  c0.pfp()));
102  } else { c0.set_pf(pfems[k]); }
103  c0.grad_base_value(grad_e[k]);
104  c0.base_value(val_e[k]);
105  }
106 
107  assert(target_dim() == 1);
108  for (dim_type k = 0; k < c.N() ; ++k) {
109  for (dal::bv_visitor i(enriched_dof1); !i.finished(); ++i) {
110  size_type posg0 = k * pfems[0]->nb_dof(cv);
111  size_type posg1 = k * pfems[1]->nb_dof(cv);
112  for (size_type j = 0; j < pfems[1]->nb_dof(cv); ++j)
113  *it++ = grad_e[0][i + posg0] * val_e[1][j]
114  + grad_e[1][j + posg1] * val_e[0][i];
115  }
116  }
117  assert(it == t.end());
118  }
119 
120  void fem_product::real_hess_base_value(const fem_interpolation_context &c,
121  base_tensor &t, bool) const {
122  t.adjust_sizes(nb_dof(0), target_dim(), gmm::sqr(c.N()));
123  base_tensor::iterator it = t.begin();
124 
125  fem_interpolation_context c0 = c;
126  std::vector<base_tensor> hess_e(2), grad_e(2), val_e(2);
127  for (size_type k = 0; k < 2; ++k) {
128  if (c0.have_pfp()) {
129  c0.set_pfp(fem_precomp(pfems[k], c0.pfp()->get_ppoint_tab(),
130  c0.pfp()));
131  } else { c0.set_pf(pfems[k]); }
132  c0.hess_base_value(hess_e[k]);
133  c0.grad_base_value(grad_e[k]);
134  c0.base_value(val_e[k]);
135  }
136 
137  assert(target_dim() == 1);
138  for (dim_type k0 = 0; k0 < c.N(); ++k0) {
139  for (dim_type k1 = 0; k1 < c.N() ; ++k1) {
140  for (dal::bv_visitor i(enriched_dof1); !i.finished(); ++i) {
141  size_type posh0 = (k0*c.N()+k1) * pfems[0]->nb_dof(cv);
142  size_type posh1 = (k0*c.N()+k1) * pfems[1]->nb_dof(cv);
143  size_type posg00 = k0 * pfems[0]->nb_dof(cv);
144  size_type posg01 = k1 * pfems[0]->nb_dof(cv);
145  size_type posg10 = k0 * pfems[1]->nb_dof(cv);
146  size_type posg11 = k1 * pfems[1]->nb_dof(cv);
147  for (size_type j = 0; j < pfems[1]->nb_dof(cv); ++j) {
148  *it++ = hess_e[0][i + posh0] * val_e[1][j] +
149  hess_e[1][j + posh1] * val_e[0][i] +
150  grad_e[0][i + posg00] * grad_e[1][j + posg11] +
151  grad_e[0][i + posg01] * grad_e[1][j + posg10];
152  }
153  }
154  }
155  }
156  assert(it == t.end());
157  }
158 
159  void mesh_fem_product::clear_build_methods() {
160  for (size_type i = 0; i < build_methods.size(); ++i)
161  del_stored_object(build_methods[i]);
162  build_methods.clear();
163  }
164  void mesh_fem_product::clear() {
165  mesh_fem::clear();
166  clear_build_methods();
167  is_adapted = false;
168  }
169 
170  DAL_SIMPLE_KEY(special_mflproduct_key, pfem);
171 
172  void mesh_fem_product::adapt() {
173  context_check();
174  clear();
175 
176  GMM_ASSERT1(!mf1.is_reduced() && !mf2.is_reduced(),
177  "Sorry, mesh_fem_product not defined for reduced mesh_fems");
178 
179  for (dal::bv_visitor cv(linked_mesh().convex_index()); !cv.finished();
180  ++cv) {
181  dal::bit_vector local_enriched_dof;
182  for (size_type i = 0; i < mf1.nb_basic_dof_of_element(cv); ++i)
183  if (enriched_dof.is_in(mf1.ind_basic_dof_of_element(cv)[i]))
184  local_enriched_dof.add(i);
185  if (local_enriched_dof.card() > 0) {
186  pfem pf = std::make_shared<fem_product>
187  (mf1.fem_of_element(cv), mf2.fem_of_element(cv), cv,
188  xfem_index, local_enriched_dof);
189  dal::pstatic_stored_object_key
190  pk = std::make_shared<special_mflproduct_key>(pf);
191  dal::add_stored_object(pk, pf, pf->ref_convex(0), pf->node_tab(0));
192  build_methods.push_back(pf);
193  set_finite_element(cv, pf);
194  }
195  }
196  is_adapted = true; touch();
197  }
198 
199 
200 } /* end of namespace getfem. */
201 
A kind of product of two mesh_fems. Specific for Xfem enrichment.
void clear(L &l)
clear (fill with zeros) a vector or matrix.
Definition: gmm_blas.h:58
pdof_description xfem_dof(pdof_description p, size_type ind)
Description of a special dof for Xfem.
Definition: getfem_fem.cc:433
std::shared_ptr< const getfem::virtual_fem > pfem
type of pointer on a fem description
Definition: getfem_fem.h:243
pfem_precomp fem_precomp(pfem pf, bgeot::pstored_point_tab pspt, dal::pstatic_stored_object dep)
Handles precomputations for FEM.
Definition: getfem_fem.cc:4760
gmm::uint16_type short_type
used as the common short type integer in the library
Definition: bgeot_config.h:72
size_t size_type
used as the common size type in the library
Definition: bgeot_poly.h:48
void add_stored_object(pstatic_stored_object_key k, pstatic_stored_object o, permanence perm)
Add an object with two optional dependencies.
void del_stored_object(const pstatic_stored_object &o, bool ignore_unstored)
Delete an object and the object which depend on it.
GEneric Tool for Finite Element Methods.