18 #ifndef __deal2__mesh_worker_functional_h
19 #define __deal2__mesh_worker_functional_h
21 #include <deal.II/base/named_data.h>
22 #include <deal.II/base/smartpointer.h>
23 #include <deal.II/base/mg_level_object.h>
24 #include <deal.II/lac/block_vector.h>
25 #include <deal.II/meshworker/dof_info.h>
26 #include <deal.II/multigrid/mg_constrained_dofs.h>
44 template <
typename number =
double>
67 template <
class DOFINFO>
74 template<
class DOFINFO>
81 template<
class DOFINFO>
83 const DOFINFO &info2);
89 number
operator() (
const unsigned int i)
const;
105 template <
typename number =
double>
153 bool separate_faces =
true);
167 template <
class DOFINFO>
174 template<
class DOFINFO>
181 template<
class DOFINFO>
183 const DOFINFO &info2);
189 number
operator() (
const unsigned int i)
const;
196 template <
typename number>
201 std::fill(results.begin(), results.end(), 0.);
205 template <
typename number>
206 template <
class DOFINFO>
210 info.initialize_numbers(results.size());
214 template <
typename number>
215 template <
class DOFINFO>
219 for (
unsigned int i=0; i<results.size(); ++i)
220 results[i] += info.value(i);
224 template <
typename number>
225 template <
class DOFINFO>
228 const DOFINFO &info2)
230 for (
unsigned int i=0; i<results.size(); ++i)
232 results[i] += info1.value(i);
233 results[i] += info2.value(i);
238 template <
typename number>
248 template <
typename number>
252 Assert(r.
name(0) ==
"cells",
typename DataVectors::ExcNameMismatch(0,
"cells"));
255 Assert(r.
name(1) ==
"faces",
typename DataVectors::ExcNameMismatch(1,
"faces"));
260 separate_faces = sep;
264 template <
typename number>
265 template <
class DOFINFO>
269 info.initialize_numbers(results(0)->n_blocks());
273 template <
typename number>
274 template <
class DOFINFO>
278 for (
unsigned int i=0; i<info.n_values(); ++i)
280 if (separate_faces &&
281 info.face_number != deal_II_numbers::invalid_unsigned_int)
282 results(1)->block(i)(info.face->user_index()) += info.value(i);
284 results(0)->block(i)(info.cell->user_index()) += info.value(i);
289 template <
typename number>
290 template <
class DOFINFO>
293 const DOFINFO &info2)
295 for (
unsigned int i=0; i<info1.n_values(); ++i)
299 const double J = info1.value(i) + info2.value(i);
300 results(1)->block(i)(info1.face->user_index()) += J;
301 if (info2.face != info1.face)
302 results(1)->block(i)(info2.face->user_index()) += J;
306 results(0)->block(i)(info1.cell->user_index()) += .5*info1.value(i);
307 results(0)->block(i)(info2.cell->user_index()) += .5*info2.value(i);
314 DEAL_II_NAMESPACE_CLOSE
#define AssertDimension(dim1, dim2)
const std::string & name(unsigned int i) const
Name of object at index.
void initialize(const unsigned int n)
#define AssertIndexRange(index, range)
number operator()(const unsigned int i) const
NamedData< BlockVector< number > * > DataVectors
#define Assert(cond, exc)
void initialize_info(DOFINFO &info, bool face)
void initialize_info(DOFINFO &info, bool face) const
void assemble(const DOFINFO &info)
std::vector< double > results
void initialize(DataVectors &results, bool separate_faces=true)
void assemble(const DOFINFO &info)
number operator()(const unsigned int i) const