COOLFluiD  Release kernel
COOLFluiD is a Collaborative Simulation Environment (CSE) focused on complex MultiPhysics simulations.
utest-proto-lss.cpp
Go to the documentation of this file.
1 // Copyright (C) 2010-2011 von Karman Institute for Fluid Dynamics, Belgium
2 //
3 // This software is distributed under the terms of the
4 // GNU Lesser General Public License version 3 (LGPLv3).
5 // See doc/lgpl.txt and doc/gpl.txt for the license text.
6 
7 #define BOOST_TEST_DYN_LINK
8 #define BOOST_TEST_MODULE "Test module for proto operators"
9 
10 #include <boost/accumulators/accumulators.hpp>
11 #include <boost/accumulators/statistics/stats.hpp>
12 #include <boost/accumulators/statistics/mean.hpp>
13 #include <boost/accumulators/statistics/max.hpp>
14 
15 #include <boost/foreach.hpp>
16 #include <boost/test/unit_test.hpp>
17 
18 #include <Thyra_describeLinearOp.hpp>
19 #include <Thyra_MultiVectorStdOps.hpp>
20 #include <Teuchos_VerboseObject.hpp>
21 
22 #include "solver/Model.hpp"
23 #include "solver/Solver.hpp"
24 
30 
31 #include "common/Core.hpp"
32 #include "common/Log.hpp"
33 #include "common/Environment.hpp"
35 
36 #include "math/MatrixTypes.hpp"
37 #include "math/LSS/System.hpp"
38 #include "math/LSS/Vector.hpp"
41 #include <math/LSS/SolveLSS.hpp>
42 
43 #include "mesh/Domain.hpp"
44 #include "mesh/Mesh.hpp"
45 #include "mesh/Region.hpp"
46 #include "mesh/Elements.hpp"
47 #include "mesh/Entities.hpp"
48 #include "mesh/MeshReader.hpp"
49 #include "mesh/ElementData.hpp"
50 #include "mesh/FieldManager.hpp"
51 #include "mesh/Dictionary.hpp"
52 
54 #include "mesh/ElementTypes.hpp"
55 
56 #include "physics/PhysModel.hpp"
57 
64 
66 #include "solver/Tags.hpp"
67 
68 using namespace cf3;
69 using namespace cf3::common;
70 using namespace cf3::mesh;
71 using namespace cf3::solver;
72 using namespace cf3::solver::actions;
73 using namespace cf3::solver::actions::Proto;
74 
76 {
78  root(Core::instance().root())
79  {
80  if(is_null(model))
81  {
82  common::PE::Comm::instance().init(boost::unit_test::framework::master_test_suite().argc, boost::unit_test::framework::master_test_suite().argv);
83 
84  common::Core::instance().environment().options().set("log_level", 4);
86  physical_model = Handle<physics::PhysModel>(model->create_physics("cf3.physics.DynamicModel").handle());
87  Domain& dom = model->create_domain("Domain");
88  mesh = dom.create_component<Mesh>("mesh");
89  //Tools::MeshGeneration::create_rectangle(*mesh, 5., 5., 5, 5);
90  //Tools::MeshGeneration::create_line(*mesh, 3.,3);
92 
93  field_manager = model->create_component<FieldManager>("FieldManager");
94  field_manager->options().set("variable_manager", model->physics().variable_manager().handle<math::VariableManager>());
95 
96  // Build node connectivity
97  const Uint nb_nodes = mesh->geometry_fields().size();
98  std::vector< std::set<Uint> > connectivity_sets(nb_nodes);
99  BOOST_FOREACH(const Entities& elements, common::find_components_recursively_with_filter<Entities>(*mesh, IsElementsVolume()))
100  {
101  const Connectivity& connectivity = elements.geometry_space().connectivity();
102  const Uint nb_elems = connectivity.size();
103  const Uint nb_elem_nodes = connectivity.row_size();
104  for(Uint elem = 0; elem != nb_elems; ++elem)
105  {
106  std::cout << "Connectivity for element " << elem << ":";
107  BOOST_FOREACH(const Uint node_a, connectivity[elem])
108  {
109  std::cout << " " << node_a;
110  BOOST_FOREACH(const Uint node_b, connectivity[elem])
111  {
112  connectivity_sets[node_a].insert(node_b);
113  }
114  }
115  std::cout << std::endl;
116  }
117  }
118 
119  const mesh::Field& coords = mesh->geometry_fields().coordinates();
120  for(Uint i = 0; i != nb_nodes; ++i)
121  {
122  std::cout << "node " << i << ": " << coords[i][0] << ", " << coords[i][1] << std::endl;
123  }
124 
125  starting_indices.push_back(0);
126  BOOST_FOREACH(const std::set<Uint>& nodes, connectivity_sets)
127  {
128  starting_indices.push_back(starting_indices.back() + nodes.size());
129  node_connectivity.insert(node_connectivity.end(), nodes.begin(), nodes.end());
130  }
131 
132  loop_regions.push_back(mesh->topology().uri());
133  }
134 
135 
136  }
137 
143  static std::vector<URI> loop_regions;
144 
145  static std::vector<Uint> node_connectivity;
146  static std::vector<Uint> starting_indices;
147 };
148 
153 std::vector<URI> ProtoLSSFixture::loop_regions;
154 
155 std::vector<Uint> ProtoLSSFixture::node_connectivity;
156 std::vector<Uint> ProtoLSSFixture::starting_indices;
157 
158 BOOST_FIXTURE_TEST_SUITE( ProtoLSSSuite, ProtoLSSFixture )
159 
160 using boost::proto::lit;
161 
163 
165 {
167  template<typename Signature>
168  struct result;
169 
170  template<typename This, typename DataT>
171  struct result<This(DataT)>
172  {
173  typedef const Eigen::Matrix<Real, DataT::SupportShapeFunction::nb_nodes, DataT::SupportShapeFunction::nb_nodes>& type;
174  };
175 
176  template<typename StorageT, typename DataT>
177  const StorageT& operator()(StorageT& result, const DataT& field) const
178  {
179  result.setConstant(m_constant);
180  return result;
181  }
182 
183  // Set the constant to use for setting the matrix
184  void set_constant(const Real c)
185  {
186  m_constant = c;
187  }
188 
190 };
191 
192 BOOST_AUTO_TEST_CASE( MyTerminal )
193 {
195 
196  // Create an action that can wrap an expression
197  Handle<ProtoAction> action = root.create_component<ProtoAction>("MyTermAction");
198  action->set_expression(elements_expression(_cout << lit( my_term ) << "\n"));
199  action->options().set("physical_model", physical_model);
200  action->options().set(solver::Tags::regions(), loop_regions);
201 
202  my_term.op.set_constant(2.);
203 
204  // Run the action
205  action->execute();
206 }
207 
209 {
211  template<typename Signature>
212  struct result;
213 
214  template<typename This, typename DataT>
215  struct result<This(DataT)>
216  {
217  typedef const Eigen::Matrix<Real, DataT::SupportShapeFunction::nb_nodes, 1>& type;
218  };
219 
220  template<typename StorageT, typename DataT>
221  const StorageT& operator()(StorageT& result, const DataT& data) const
222  {
223  cf3_assert(result.rows() == data.block_accumulator.sol.rows());
224  m_vector->get_sol_values(data.block_accumulator);
225  result = data.block_accumulator.sol;
226  return result;
227  }
228 
229  // Set the constant to use for setting the matrix
231  {
232  m_vector = v;
233  }
234 
236 };
237 
239 {
241  template<typename Signature>
242  struct result;
243 
244  template<typename This, typename DataT>
245  struct result<This(DataT)>
246  {
247  typedef const Eigen::Matrix<Real, DataT::dimension*DataT::SupportShapeFunction::nb_nodes, 1>& type;
248  };
249 
250  template<typename StorageT, typename DataT>
251  const StorageT& operator()(StorageT& result, const DataT& data) const
252  {
253  cf3_assert(result.rows() == data.block_accumulator.sol.rows());
254  m_vector->get_sol_values(data.block_accumulator);
255  // We need to renumber to the blocked structure used in the element matrices
256  for(Uint j = 0; j != DataT::dimension; ++j)
257  {
258  const Uint offset = j*DataT::SupportShapeFunction::nb_nodes;
259  for(Uint i = 0; i != DataT::SupportShapeFunction::nb_nodes; ++i)
260  {
261  result[offset + i] = data.block_accumulator.sol[i*DataT::dimension + j];
262  }
263  }
264  return result;
265  }
266 
267  // Set the constant to use for setting the matrix
269  {
270  m_vector = v;
271  }
272 
274 };
275 
277 {
278  // Custom ops must implement the TR1 result_of protocol
279  template<typename Signature>
280  struct result;
281 
282  template<typename This, typename TempT, typename MatrixT, typename VectorT>
283  struct result<This(TempT, MatrixT, VectorT)>
284  {
285  typedef const VectorT& type;
286  };
287 
288  template<typename StorageT, typename TempT, typename MatrixT, typename VectorT>
289  const StorageT& operator()(StorageT& result, TempT& T, const MatrixT& m, const VectorT& vec) const
290  {
291  result = m*vec;
292  return result;
293  }
294 };
295 
297 
298 BOOST_AUTO_TEST_CASE( ScalarTest )
299 {
300  Handle<math::LSS::System> lss = root.create_component<math::LSS::System>("scalar_lss");
301  lss->options().set("matrix_builder", std::string("cf3.math.LSS.TrilinosCrsMatrix"));
302  lss->create(mesh->geometry_fields().comm_pattern(), 1, node_connectivity, starting_indices);
303 
305  Handle<math::LSS::ThyraVector> solution(lss->solution());
307 
308  // Set random solution
309  Thyra::randomize(0., 1., solution->thyra_vector().ptr());
310 
311  Handle<ProtoAction> action = root.create_component<ProtoAction>("ScalarLSSAction");
312 
313  // Terminals to use
314  FieldVariable<0, ScalarField> T("ScalarVar", "scalar");
315  SystemMatrix matrix(*lss);
316  SystemRHS sys_rhs(*lss);
317  SolutionVector sol_vec(*lss);
318 
319  Handle<math::LSS::Vector> vec_copy(root.create_component("ScalarVector", "cf3.math.LSS.TrilinosVector"));
320  lss->solution()->clone_to(*vec_copy);
321  SFOp< CustomSFOp<ScalarLSSVector> > scalar_vector;
322  scalar_vector.op.set_vector(vec_copy);
323 
324  // Run the expression
325  action->set_expression(elements_expression(
326  group
327  (
328  _A = _0,
330  (
331  _A(T,T) += transpose(nabla(T)) * nabla(T)
332  ),
333  matrix += _A,
334  sys_rhs += _A * scalar_vector
335  )
336  ));
337 
338  action->options().set("physical_model", physical_model);
339  action->options().set(solver::Tags::regions(), loop_regions);
340 
341  field_manager->create_field("scalar", mesh->geometry_fields());
342 
343  // Set the field to random
344  for_each_node(mesh->topology(), T = sol_vec(T));
345 
346  action->execute();
347 
348 
349  Teuchos::RCP< Thyra::MultiVectorBase<Real> > rhs2 = Thyra::createMembers(op->thyra_operator()->range(), 1);
350  Thyra::apply(*op->thyra_operator(), Thyra::NOTRANS, *solution->thyra_vector(), rhs2.ptr());
351 
352  std::vector<Real> diff_norm(1);
353 
354  Thyra::norms(*rhs2, Teuchos::arrayViewFromVector(diff_norm));
355  std::cout << "rhs2 norm: " << diff_norm.front() << std::endl;
356  BOOST_CHECK(diff_norm.front() > 1e-6);
357 
358  Thyra::update(-1., *rhs->thyra_vector(), rhs2.ptr());
359  Thyra::norms(*rhs2, Teuchos::arrayViewFromVector(diff_norm));
360  std::cout << "diff norm: " << diff_norm.front() << std::endl;
361  BOOST_CHECK_SMALL(diff_norm.front(), 1e-10);
362 }
363 
364 BOOST_AUTO_TEST_CASE( VectorTest )
365 {
366  Handle<math::LSS::System> lss = root.create_component<math::LSS::System>("vector_lss");
367  lss->options().set("matrix_builder", std::string("cf3.math.LSS.TrilinosCrsMatrix"));
368 
369  Handle<ProtoAction> action = root.create_component<ProtoAction>("VectorLSSAction");
370  // Create this so we have an option for the LSS
371  Handle<math::LSS::SolveLSS> solve_action = root.create_component<math::LSS::SolveLSS>("SolveLSS");
372 
373  // Terminals to use
374  FieldVariable<0, VectorField> T("VectorVar", "vector");
375  SystemMatrix matrix(solve_action->options().option("lss"));
376  SystemRHS sys_rhs(solve_action->options().option("lss"));
377  SolutionVector sol_vec(solve_action->options().option("lss"));
378  SFOp< CustomSFOp<VectorLSSVector> > vector_vector;
379 
380  // Run the expression
382  group
383  (
384  _A = _0,
386  (
387  _A(T[_i],T[_i]) += transpose(nabla(T)) * nabla(T)
388  ),
389  matrix += _A,
390  sys_rhs += _A * vector_vector
391  )
392  ));
393 
394  action->options().set("physical_model", physical_model);
395  action->options().set(solver::Tags::regions(), loop_regions);
396 
397  field_manager->create_field("vector", mesh->geometry_fields());
398 
399  //lss->create(mesh->geometry_fields().comm_pattern(), 2, node_connectivity, starting_indices);
400  lss->create_blocked(mesh->geometry_fields().comm_pattern(), *Handle<math::VariablesDescriptor>(physical_model->variable_manager().get_child("vector")), node_connectivity, starting_indices);
401  solve_action->options().set("lss", lss);
402 
404  Handle<math::LSS::ThyraVector> solution(lss->solution());
406 
407  // Set random solution
408  Thyra::randomize(0., 1., solution->thyra_vector().ptr());
409 
410  Handle<math::LSS::Vector> vec_copy(root.create_component("VectorVector", "cf3.math.LSS.TrilinosVector"));
411  lss->solution()->clone_to(*vec_copy);
412  vector_vector.op.set_vector(vec_copy);
413 
414  // Set the field to random
415  for_each_node(mesh->topology(), T = sol_vec(T));
416 
417  action->execute();
418 
419  Teuchos::RCP< Thyra::MultiVectorBase<Real> > rhs2 = Thyra::createMembers(op->thyra_operator()->range(), 1);
420  Thyra::apply(*op->thyra_operator(), Thyra::NOTRANS, *solution->thyra_vector(), rhs2.ptr());
421 
422  std::vector<Real> diff_norm(1);
423 
424  Thyra::norms(*rhs2, Teuchos::arrayViewFromVector(diff_norm));
425  std::cout << "rhs2 norm: " << diff_norm.front() << std::endl;
426  BOOST_CHECK(diff_norm.front() > 1e-6);
427 
428  Thyra::update(-1., *rhs->thyra_vector(), rhs2.ptr());
429  Thyra::norms(*rhs2, Teuchos::arrayViewFromVector(diff_norm));
430  std::cout << "diff norm: " << diff_norm.front() << std::endl;
431  BOOST_CHECK_SMALL(diff_norm.front(), 1e-10);
432 }
433 
434 BOOST_AUTO_TEST_CASE( NestedCustomOps )
435 {
436  Handle<math::LSS::System> lss = root.create_component<math::LSS::System>("nesting_lss");
437  lss->options().set("matrix_builder", std::string("cf3.math.LSS.TrilinosCrsMatrix"));
438  lss->create(mesh->geometry_fields().comm_pattern(), 1, node_connectivity, starting_indices);
439 
441  Handle<math::LSS::ThyraVector> solution(lss->solution());
443 
444  // Set random solution
445  Thyra::randomize(0., 1., solution->thyra_vector().ptr());
446 
447  Handle<ProtoAction> action = root.create_component<ProtoAction>("ScalarLSSAction");
448 
449  // Terminals to use
450  FieldVariable<0, ScalarField> T("ScalarVar2", "scalar2");
451  SystemMatrix matrix(*lss);
452  SystemRHS sys_rhs(*lss);
453  SolutionVector sol_vec(*lss);
454 
455  Handle<math::LSS::Vector> vec_copy(root.create_component("ScalarVector2", "cf3.math.LSS.TrilinosVector"));
456  lss->solution()->clone_to(*vec_copy);
457  SFOp< CustomSFOp<ScalarLSSVector> > scalar_vector;
458  scalar_vector.op.set_vector(vec_copy);
459 
460  boost::mpl::vector1<mesh::LagrangeP1::Line1D> etype;
461 
462  // Run the expression
463  action->set_expression(elements_expression(etype,
464  group
465  (
466  _A = _0,
468  (
469  _A(T,T) += transpose(nabla(T)) * nabla(T)
470  ),
471  matrix += _A,
472  sys_rhs += laplacian_apply(T, _A, lit(scalar_vector))
473  )
474  ));
475 
476  action->options().set("physical_model", physical_model);
477  action->options().set(solver::Tags::regions(), loop_regions);
478 
479  field_manager->create_field("scalar2", mesh->geometry_fields());
480 
481  // Set the field to random
482  for_each_node(mesh->topology(), T = sol_vec(T));
483 
484  action->execute();
485 
486 
487  Teuchos::RCP< Thyra::MultiVectorBase<Real> > rhs2 = Thyra::createMembers(op->thyra_operator()->range(), 1);
488  Thyra::apply(*op->thyra_operator(), Thyra::NOTRANS, *solution->thyra_vector(), rhs2.ptr());
489 
490  std::vector<Real> diff_norm(1);
491 
492  Thyra::norms(*rhs2, Teuchos::arrayViewFromVector(diff_norm));
493  std::cout << "rhs2 norm: " << diff_norm.front() << std::endl;
494  BOOST_CHECK(diff_norm.front() > 1e-6);
495 
496  Thyra::update(-1., *rhs->thyra_vector(), rhs2.ptr());
497  Thyra::norms(*rhs2, Teuchos::arrayViewFromVector(diff_norm));
498  std::cout << "diff norm: " << diff_norm.front() << std::endl;
499  BOOST_CHECK_SMALL(diff_norm.front(), 1e-10);
500 }
501 
502 BOOST_AUTO_TEST_CASE( MassMatrix )
503 {
504  Handle<math::LSS::System> lss = root.create_component<math::LSS::System>("mass_lss");
505  lss->options().set("matrix_builder", std::string("cf3.math.LSS.TrilinosCrsMatrix"));
506  lss->create(mesh->geometry_fields().comm_pattern(), 1, node_connectivity, starting_indices);
507 
508  Handle<ProtoAction> action = root.create_component<ProtoAction>("MassAssembly");
509 
510  FieldVariable<0, ScalarField> T("MassVar", "massvar");
511  SystemMatrix matrix(*lss);
512 
513  boost::mpl::vector1<mesh::LagrangeP1::Triag2D> etype;
514 
515  // Run the expression
516  action->set_expression(elements_expression(etype,
517  group
518  (
519  _A = _0,
521  (
522  _A(T,T) += transpose(N(T)) * N(T)
523  ),
524  matrix += _A
525  )
526  ));
527 
528  action->options().set("physical_model", physical_model);
529  action->options().set(solver::Tags::regions(), loop_regions);
530 
531  field_manager->create_field("massvar", mesh->geometry_fields());
532 
533  action->execute();
534 
535  lss->matrix()->print(std::cout);
536 }
537 
539 {
540  root.remove_component("scalar_lss");
541  root.remove_component("vector_lss");
542 }
543 
544 BOOST_AUTO_TEST_SUITE_END()
545 
546 
boost::proto::terminal< SFOp< ShapeFunctionOp > >::type const N
Handle< LSS::Vector > solution()
Accessor to solution.
Definition: System.hpp:151
void create(cf3::common::PE::CommPattern &cp, Uint neq, std::vector< Uint > &node_connectivity, std::vector< Uint > &starting_indices, const std::vector< Uint > &periodic_links_nodes=std::vector< Uint >(), const std::vector< bool > &periodic_links_active=std::vector< bool >())
Definition: System.cpp:82
static boost::proto::terminal< ZeroTag >::type _0
Placeholder for the zero matrix.
Definition: Terminals.hpp:209
bool is_null(T ptr)
predicate for comparison to nullptr
Definition: CF.hpp:151
const StorageT & operator()(StorageT &result, const DataT &data) const
external boost library namespace
static boost::proto::terminal< ElementSystemMatrix< boost::mpl::int_< 0 > > >::type const _A
Some predefined element matrices (more can be user-defined, but you have to change the number in the ...
Space & geometry_space() const
Definition: Entities.hpp:94
void set_constant(const Real c)
const StorageT & operator()(StorageT &result, const DataT &data) const
void set_expression(const boost::shared_ptr< Expression > &expression)
This header collects all the headers needed for the linear system solver, also including configure-ti...
const Eigen::Matrix< Real, DataT::dimension *DataT::SupportShapeFunction::nb_nodes, 1 > & type
MakeSFOp< CustomLaplacianApply >::type laplacian_apply
Class to encapsulate Proto actions.
Definition: ProtoAction.hpp:26
Custom ops must implement the TR1 result_of protocol.
Custom ops must implement the TR1 result_of protocol.
static Handle< physics::PhysModel > physical_model
static Handle< FieldManager > field_manager
void set_vector(const Handle< math::LSS::Vector > &v)
#define cf3_assert(a)
Definition: Assertions.hpp:93
Basic Classes for Solver applications used by CF.
Definition: Action.cpp:29
Handle< LSS::Matrix > matrix()
Accessor to matrix.
Definition: System.hpp:145
static boost::proto::terminal< ElementQuadratureTag >::type element_quadrature
Use element_quadrature(expr1, expr2, ..., exprN) to evaluate a group of expressions.
void create_rectangle_tris(Mesh &mesh, const Real x_len, const Real y_len, const Uint x_segments, const Uint y_segments)
Create a triangulated version of a 2D rectangular grid.
tuple root
Definition: coolfluid.py:24
boost::shared_ptr< ElementsExpression< ExprT, ElementTypes > > elements_expression(ElementTypes, const ExprT &expr)
Definition: Expression.hpp:292
const StorageT & operator()(StorageT &result, TempT &T, const MatrixT &m, const VectorT &vec) const
void create_blocked(cf3::common::PE::CommPattern &cp, const VariablesDescriptor &vars, std::vector< Uint > &node_connectivity, std::vector< Uint > &starting_indices, const std::vector< Uint > &periodic_links_nodes=std::vector< Uint >(), const std::vector< bool > &periodic_links_active=std::vector< bool >())
Definition: System.cpp:114
Real e()
Definition of the Unit charge [C].
Definition: Consts.hpp:30
boost::proto::terminal< SFOp< NodesOp > >::type const nodes
void for_each_node(mesh::Region &root_region, const ExprT &expr)
Definition: NodeLooper.hpp:239
static boost::proto::terminal< std::ostream & >::type _cout
Wrap std::cout.
Definition: Terminals.hpp:219
boost::proto::terminal< SFOp< CustomSFOp< OpT > > >::type type
Uint size() const
Definition: Table.hpp:127
boost::proto::terminal< TransposeFunction >::type const transpose
boost::proto::terminal< SFOp< NablaOp > >::type const nabla
static std::vector< URI > loop_regions
static std::vector< Uint > starting_indices
Basic Classes for Mesh applications used by COOLFluiD.
Handle< math::LSS::Vector > m_vector
tuple model
Global confifuration.
void init(int argc=0, char **args=0)
Definition: Comm.cpp:80
Top-level namespace for coolfluid.
Definition: Action.cpp:18
Handle< LSS::Vector > rhs()
Accessor to right hand side.
Definition: System.hpp:148
static boost::proto::terminal< IndexTag< boost::mpl::int_< 0 > > >::type const _i
Index looping over the dimensions of a variable.
BOOST_AUTO_TEST_CASE(MyTerminal)
const StorageT & operator()(StorageT &result, const DataT &field) const
Uint row_size(Uint i=0) const
Definition: Table.hpp:133
static Handle< Model > model
Wrap all operations in a template, so we can detect ops using a wildcard.
const Eigen::Matrix< Real, DataT::SupportShapeFunction::nb_nodes, 1 > & type
common::Component & root() const
Gives the default root component.
Definition: Core.cpp:145
static boost::proto::terminal< ExpressionGroupTag >::type group
Use group(expr1, expr2, ..., exprN) to evaluate a group of expressions.
common::Environment & environment() const
Definition: Core.cpp:168
unsigned int Uint
typedef for unsigned int
Definition: CF.hpp:90
Custom ops must implement the TR1 result_of protocol.
static Core & instance()
Definition: Core.cpp:37
void set_vector(const Handle< math::LSS::Vector > &v)
OptionList & options()
Definition: Component.cpp:856
Handle< math::LSS::Vector > m_vector
static Handle< Mesh > mesh
static Comm & instance()
Return a reference to the current PE.
Definition: Comm.cpp:44
virtual void execute()
execute the action
Base class for defining CF components.
Definition: Component.hpp:82
const Eigen::Matrix< Real, DataT::SupportShapeFunction::nb_nodes, DataT::SupportShapeFunction::nb_nodes > & type
void set(const std::string &pname, const boost::any &val)
Definition: OptionList.cpp:132
Handle< Component > create_component(const std::string &name, const std::string &builder)
Build a (sub)component of this component using the extended type_name of the component.
Definition: Component.cpp:568
Most basic kernel library.
Definition: Action.cpp:19
Connectivity & connectivity()
connectivity table to dictionary entries
Definition: Space.hpp:110
static std::vector< Uint > node_connectivity
Send comments to:
COOLFluiD Web Admin