2
/// This file is part of Rheolef.
4
/// Copyright (C) 2000-2009 Pierre Saramito <Pierre.Saramito@imag.fr>
6
/// Rheolef is free software; you can redistribute it and/or modify
7
/// it under the terms of the GNU General Public License as published by
8
/// the Free Software Foundation; either version 2 of the License, or
9
/// (at your option) any later version.
11
/// Rheolef is distributed in the hope that it will be useful,
12
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
/// GNU General Public License for more details.
16
/// You should have received a copy of the GNU General Public License
17
/// along with Rheolef; if not, write to the Free Software
18
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
/// =========================================================================
22
// 2D_s_D_s matrix on a surface, as defined by a level set
25
#include "rheolef/ublas_matrix_range.h"
27
extern void compute_matrix_2D_s_D_s (const geo_element& K, const ublas::vector<point>& x, const ublas::vector<Float>& f, ublas::matrix<Float>& mk);
28
} // namespace rheolef
29
using namespace rheolef;
31
using namespace ublas;
34
_2D_s_D_s::operator() (const geo_element& K, ublas::matrix<Float>& b) const
36
size_type nloc = K.size();
37
ublas::vector<point> x (nloc);
38
ublas::vector<Float> f (nloc);
39
tiny_vector<size_t> bgd_idof (nloc);
40
size_type d = coordinate_dimension();
41
b.resize (d*nloc, d*nloc);
42
const space& Bh = get_first_space();
43
Bh.set_global_dof (K, bgd_idof);
44
const field& phi_h = _wh;
45
const geo& bgd_lambda = phi_h.get_geo();
46
for (size_t iloc = 0; iloc < nloc; iloc++) {
47
x[iloc] = bgd_lambda.vertex(K[iloc]);
48
f[iloc] = phi_h.at (bgd_idof[iloc]);
50
compute_matrix_2D_s_D_s (K, x, f, b);
53
_2D_s_D_s::check_after_initialize () const
55
size_type d = coordinate_dimension();
57
d == get_second_space().n_component(),
58
"unsupported non-vectorial second space for `2D_s_D_s' form");
60
d == get_first_space().n_component(),
61
"unsupported non-vectorial first space for `2D_s_D_s' form");
62
check_macro (get_first_space().get_approx() == "P1", "`2D_s_D_s' form: P1 approx required");
63
check_macro (get_second_space().get_approx() == "P1", "`2D_s_D_s' form: P1 approx required");
64
check_macro (is_weighted(), "`2D_s_D_s' form may specify the level set function");