Flow123d  DF_patch_fe_data_tables-92632e6
fe_values_views.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 fe_system.cc
15  * @brief Class FESystem for compound finite elements.
16  * @author Jan Stebel
17  */
18 
19 #include "mesh/accessors.hh"
20 #include "fem/fe_values_views.hh"
21 #include "fem/fe_values.hh"
22 #include "fem/finite_element.hh"
23 #include "quadrature/quadrature.hh"
24 
25 using namespace FEValuesViews;
26 
27 template<class FV, unsigned int spacedim>
28 double FEValuesViews::Scalar<FV, spacedim>::value(unsigned int function_no, unsigned int point_no) const
29 {
30  ASSERT_LT( function_no, fe_values_.n_dofs() );
31  ASSERT_LT( point_no, fe_values_.n_points() );
32  return fe_values_.shape_value_component(function_no, point_no, component_);
33 }
34 
35 template<class FV, unsigned int spacedim>
36 arma::vec::fixed<spacedim> FEValuesViews::Scalar<FV, spacedim>::grad(unsigned int function_no, unsigned int point_no) const
37 {
38  ASSERT_LT( function_no, fe_values_.n_dofs() );
39  ASSERT_LT( point_no, fe_values_.n_points() );
40  return fe_values_.shape_grad_component(function_no, point_no, component_);
41 }
42 
43 template<class FV, unsigned int spacedim>
45 { return fe_values_; }
46 
47 
48 
49 
50 template<class FV, unsigned int spacedim>
51 arma::vec::fixed<spacedim> FEValuesViews::Vector<FV, spacedim>::value(unsigned int function_no, unsigned int point_no) const
52 {
53  ASSERT_LT( function_no, fe_values_.n_dofs() );
54  ASSERT_LT( point_no, fe_values_.n_points() );
55  arma::vec::fixed<spacedim> v;
56  for (unsigned int c=0; c<spacedim; ++c)
57  v(c) = fe_values_.shape_value_component(function_no, point_no, first_vector_component_+c);
58  return v;
59 }
60 
61 template<class FV, unsigned int spacedim>
62 arma::mat::fixed<spacedim,spacedim> FEValuesViews::Vector<FV, spacedim>::grad(unsigned int function_no, unsigned int point_no) const
63 {
64  ASSERT_LT( function_no, fe_values_.n_dofs() );
65  ASSERT_LT( point_no, fe_values_.n_points() );
66  arma::mat::fixed<spacedim,spacedim> g;
67  for (unsigned int c=0; c<spacedim; ++c)
68  g.col(c) = fe_values_.shape_grad_component(function_no, point_no, first_vector_component_+c);
69  return g.t();
70 }
71 
72 template<class FV, unsigned int spacedim>
73 arma::mat::fixed<spacedim,spacedim> FEValuesViews::Vector<FV, spacedim>::sym_grad(unsigned int function_no, unsigned int point_no) const
74 {
75  ASSERT_LT( function_no, fe_values_.n_dofs() );
76  ASSERT_LT( point_no, fe_values_.n_points() );
77  arma::mat::fixed<spacedim,spacedim> g = grad(function_no, point_no);
78  return 0.5*(g+trans(g));
79 }
80 
81 template<class FV, unsigned int spacedim>
82 double FEValuesViews::Vector<FV, spacedim>::divergence(unsigned int function_no, unsigned int point_no) const
83 {
84  ASSERT_LT( function_no, fe_values_.n_dofs() );
85  ASSERT_LT( point_no, fe_values_.n_points() );
86  double div = 0;
87  for (unsigned int c=0; c<spacedim; ++c)
88  div += fe_values_.shape_grad_component(function_no, point_no, first_vector_component_+c)(first_vector_component_+c);
89  return div;
90 }
91 
92 template<class FV, unsigned int spacedim>
94 { return fe_values_; }
95 
96 
97 
98 template<class FV, unsigned int spacedim>
99 arma::mat::fixed<spacedim,spacedim> FEValuesViews::Tensor<FV, spacedim>::value(unsigned int function_no, unsigned int point_no) const
100 {
101  ASSERT_LT( function_no, fe_values_.n_dofs() );
102  ASSERT_LT( point_no, fe_values_.n_points() );
103  arma::mat::fixed<spacedim,spacedim> v;
104  for (unsigned int c=0; c<spacedim*spacedim; ++c)
105  v(c/spacedim,c%spacedim) = fe_values_.shape_value_component(function_no, point_no, first_tensor_component_+c);
106  return v;
107 }
108 
109 template<class FV, unsigned int spacedim>
110 arma::mat::fixed<spacedim,spacedim> FEValuesViews::Tensor<FV, spacedim>::derivative(
111  unsigned int variable_no,
112  unsigned int function_no,
113  unsigned int point_no) const
114 {
115  ASSERT_LT( variable_no, spacedim );
116  ASSERT_LT( function_no, fe_values_.n_dofs() );
117  ASSERT_LT( point_no, fe_values_.n_points() );
118  arma::mat::fixed<spacedim,spacedim> g;
119  for (unsigned int c=0; c<spacedim*spacedim; ++c)
120  g(c/spacedim,c%spacedim) = fe_values_.shape_grad_component(function_no, point_no, first_tensor_component_+c)[first_tensor_component_+variable_no];
121  return g;
122 }
123 
124 template<class FV, unsigned int spacedim>
125 arma::vec::fixed<spacedim> FEValuesViews::Tensor<FV, spacedim>::divergence(unsigned int function_no, unsigned int point_no) const
126 {
127  ASSERT_LT( function_no, fe_values_.n_dofs() );
128  ASSERT_LT( point_no, fe_values_.n_points() );
129  arma::vec::fixed<spacedim> div;
130  div.zeros();
131  for (unsigned int c=0; c<spacedim*spacedim; ++c)
132  div(c%spacedim) += fe_values_.shape_grad_component(function_no, point_no, first_tensor_component_+c)[first_tensor_component_+c/spacedim];
133  return div;
134 }
135 
136 template<class FV, unsigned int spacedim>
138 { return fe_values_; }
139 
140 
141 
142 
143 
144 template class FEValuesViews::Scalar<FEValues<3>, 3>;
145 template class FEValuesViews::Vector<FEValues<3>, 3>;
146 template class FEValuesViews::Tensor<FEValues<3>, 3>;
150 
151 
#define ASSERT_LT(a, b)
Definition of comparative assert macro (Less Than) only for debug mode.
Definition: asserts.hh:301
const FV & base() const
Returns the FEValues class.
double value(unsigned int function_no, unsigned int point_no) const
Return value of scalar shape function.
arma::vec::fixed< spacedim > grad(unsigned int function_no, unsigned int point_no) const
Return gradient of scalar shape function.
arma::mat::fixed< spacedim, spacedim > derivative(unsigned int variable_no, unsigned int function_no, unsigned int point_no) const
Return partial derivative of tensor-valued shape function.
arma::mat::fixed< spacedim, spacedim > value(unsigned int function_no, unsigned int point_no) const
Return value of tensor-valued shape function.
arma::vec::fixed< spacedim > divergence(unsigned int function_no, unsigned int point_no) const
Return divergence of tensor-valued shape function.
const FV & base() const
Returns the FEValues class.
arma::mat::fixed< spacedim, spacedim > sym_grad(unsigned int function_no, unsigned int point_no) const
Return symmetric gradient of vector-valued shape function.
arma::mat::fixed< spacedim, spacedim > grad(unsigned int function_no, unsigned int point_no) const
Return gradient of vector-valued shape function.
const FV & base() const
Returns the FEValues class.
double divergence(unsigned int function_no, unsigned int point_no) const
Return divergence of vector-valued shape function.
arma::vec::fixed< spacedim > value(unsigned int function_no, unsigned int point_no) const
Return value of vector-valued shape function.
Class FEValues calculates finite element data on the actual cells such as shape function values,...
Abstract class for description of finite elements.
Basic definitions of numerical quadrature rules.