Flow123d  release_3.0.0-968-gc87a28e79
discrete_space.cc
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file discrete_space.cc
15  * @brief Implementation of class which provides the finite element for every mesh cell.
16  * @author Jan Stebel
17  */
18 
19 #include "fem/discrete_space.hh"
20 #include "fem/finite_element.hh"
21 #include "mesh/mesh.h"
22 #include "mesh/duplicate_nodes.h"
23 
24 
25 
27 {
28  unsigned int n_dofs = 0;
29  switch (cell->dim())
30  {
31  case 0:
32  for (unsigned int d=0; d<fe0_->n_dofs(); d++)
33  if (fe0_->dof(d).dim == 0)
34  n_dofs++;
35  break;
36  case 1:
37  for (unsigned int d=0; d<fe1_->n_dofs(); d++)
38  if (fe1_->dof(d).dim == 1)
39  n_dofs++;
40  break;
41  case 2:
42  for (unsigned int d=0; d<fe2_->n_dofs(); d++)
43  if (fe2_->dof(d).dim == 2)
44  n_dofs++;
45  break;
46  case 3:
47  for (unsigned int d=0; d<fe3_->n_dofs(); d++)
48  if (fe3_->dof(d).dim == 3)
49  n_dofs++;
50  break;
51  }
52  return n_dofs;
53 }
54 
55 
56 unsigned int EqualOrderDiscreteSpace::n_node_dofs(unsigned int nid) const
57 {
58  unsigned int n_dofs = 0;
59  unsigned int dim = mesh_->tree->node_dim()[nid];
60  switch (dim)
61  {
62  case 0:
63  for (unsigned int d=0; d<fe0_->n_dofs(); d++)
64  if (fe0_->dof(d).dim == 0 && fe0_->dof(d).n_face_idx == 0)
65  n_dofs++;
66  break;
67  case 1:
68  for (unsigned int d=0; d<fe1_->n_dofs(); d++)
69  if (fe1_->dof(d).dim == 0 && fe1_->dof(d).n_face_idx == 0)
70  n_dofs++;
71  break;
72  case 2:
73  for (unsigned int d=0; d<fe2_->n_dofs(); d++)
74  if (fe2_->dof(d).dim == 0 && fe2_->dof(d).n_face_idx == 0)
75  n_dofs++;
76  break;
77  case 3:
78  for (unsigned int d=0; d<fe3_->n_dofs(); d++)
79  if (fe3_->dof(d).dim == 0 && fe3_->dof(d).n_face_idx == 0)
80  n_dofs++;
81  break;
82  }
83  return n_dofs;
84 }
85 
86 
87 
88 template<> FiniteElement<0> *DiscreteSpace::fe(const ElementAccessor<3> &cell) const { return fe0d(cell); }
89 template<> FiniteElement<1> *DiscreteSpace::fe(const ElementAccessor<3> &cell) const { return fe1d(cell); }
90 template<> FiniteElement<2> *DiscreteSpace::fe(const ElementAccessor<3> &cell) const { return fe2d(cell); }
91 template<> FiniteElement<3> *DiscreteSpace::fe(const ElementAccessor<3> &cell) const { return fe3d(cell); }
92 
93 
94 
95 
96 
Dof::n_face_idx
unsigned int n_face_idx
Index of n-face to which the dof is associated.
Definition: finite_element.hh:99
EqualOrderDiscreteSpace::fe1_
FiniteElement< 1 > * fe1_
Definition: discrete_space.hh:102
DiscreteSpace::fe3d
virtual FiniteElement< 3 > * fe3d(const ElementAccessor< 3 > &) const =0
EqualOrderDiscreteSpace::fe2_
FiniteElement< 2 > * fe2_
Definition: discrete_space.hh:103
discrete_space.hh
Declaration of class which provides the finite element for every mesh cell.
Element::dim
unsigned int dim() const
Definition: elements.h:124
Mesh::tree
DuplicateNodes * tree
Definition: mesh.h:277
ElementAccessor< 3 >
EqualOrderDiscreteSpace::n_elem_dofs
unsigned int n_elem_dofs(const ElementAccessor< 3 > &cell) const override
Number of dofs associated to element (not shared by adjacent elements).
Definition: discrete_space.cc:26
FiniteElement::dof
const Dof & dof(unsigned int i) const
Returns i -th degree of freedom.
Definition: finite_element.hh:300
duplicate_nodes.h
Dof::dim
unsigned int dim
Association to n-face of given dimension (point, line, triangle, tetrahedron.
Definition: finite_element.hh:96
DiscreteSpace::fe1d
virtual FiniteElement< 1 > * fe1d(const ElementAccessor< 3 > &) const =0
DuplicateNodes::node_dim
const std::vector< unsigned int > & node_dim() const
Definition: duplicate_nodes.h:105
FiniteElement::n_dofs
const unsigned int n_dofs() const
Returns the number of degrees of freedom needed by the finite element.
Definition: finite_element.hh:266
finite_element.hh
Abstract class for description of finite elements.
DiscreteSpace::fe
FiniteElement< dim > * fe(const ElementAccessor< 3 > &) const
Return finite element object for given element.
mesh.h
FiniteElement< 0 >
DiscreteSpace::fe2d
virtual FiniteElement< 2 > * fe2d(const ElementAccessor< 3 > &) const =0
EqualOrderDiscreteSpace::n_node_dofs
unsigned int n_node_dofs(unsigned int nid) const override
Number of dofs associated to node. nid is the node index in the mesh tree.
Definition: discrete_space.cc:56
EqualOrderDiscreteSpace::fe0_
FiniteElement< 0 > * fe0_
Definition: discrete_space.hh:101
EqualOrderDiscreteSpace::fe3_
FiniteElement< 3 > * fe3_
Definition: discrete_space.hh:104
DiscreteSpace::fe0d
virtual FiniteElement< 0 > * fe0d(const ElementAccessor< 3 > &) const =0
DiscreteSpace::mesh_
Mesh * mesh_
Definition: discrete_space.hh:74