ug4
neumann_boundary_fv1.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013-2015: G-CSC, Goethe University Frankfurt
3  * Author: Andreas Vogel
4  *
5  * This file is part of UG4.
6  *
7  * UG4 is free software: you can redistribute it and/or modify it under the
8  * terms of the GNU Lesser General Public License version 3 (as published by the
9  * Free Software Foundation) with the following additional attribution
10  * requirements (according to LGPL/GPL v3 §7):
11  *
12  * (1) The following notice must be displayed in the Appropriate Legal Notices
13  * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14  *
15  * (2) The following notice must be displayed at a prominent place in the
16  * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17  *
18  * (3) The following bibliography is recommended for citation and must be
19  * preserved in all covered files:
20  * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21  * parallel geometric multigrid solver on hierarchically distributed grids.
22  * Computing and visualization in science 16, 4 (2013), 151-164"
23  * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24  * flexible software system for simulating pde based models on high performance
25  * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26  *
27  * This program is distributed in the hope that it will be useful,
28  * but WITHOUT ANY WARRANTY; without even the implied warranty of
29  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30  * GNU Lesser General Public License for more details.
31  */
32 
33 #ifndef __H__UG__LIB_DISC__SPATIAL_DISC__ELEM_DISC__NEUMANN_BOUNDARY___NEUMANN_BOUNDARY_FV1__
34 #define __H__UG__LIB_DISC__SPATIAL_DISC__ELEM_DISC__NEUMANN_BOUNDARY___NEUMANN_BOUNDARY_FV1__
35 
36 // other ug4 modules
37 #include "common/common.h"
38 
39 // library intern headers
40 #include "../neumann_boundary_base.h"
41 
42 namespace ug{
43 
44 template<typename TDomain>
46  : public NeumannBoundaryBase<TDomain>
47 {
48  private:
51 
54 
57 
58  public:
60  static const int dim = base_type::dim;
61 
62  public:
64  NeumannBoundaryFV1(const char* function);
65 
68  void add(SmartPtr<CplUserData<number, dim> > data, const char* BndSubsets, const char* InnerSubsets);
69  void add(SmartPtr<CplUserData<number, dim, bool> > user, const char* BndSubsets, const char* InnerSubsets);
70  void add(SmartPtr<CplUserData<MathVector<dim>, dim> > user, const char* BndSubsets, const char* InnerSubsets);
72 
73  protected:
74  using typename base_type::Data;
75 
77  struct NumberData : public base_type::Data
78  {
80  std::string BndSubsets, std::string InnerSubsets)
81  : base_type::Data(BndSubsets, InnerSubsets)
82  {
83  import.set_data(data);
84  }
85 
86  template<typename TElem, typename TFVGeom>
87  void extract_bip(const TFVGeom& geo);
88 
89  template <typename TElem, typename TFVGeom>
90  void lin_def(const LocalVector& u,
91  std::vector<std::vector<number> > vvvLinDef[],
92  const size_t nip);
93 
94  template <int refDim>
95  void set_local_ips(const MathVector<refDim>* ips, std::size_t nIPs)
96  {import.template set_local_ips<refDim>(ips, nIPs);}
97 
98  void set_global_ips(const MathVector<dim>* ips, std::size_t nIPs)
99  {import.set_global_ips(ips, nIPs);}
100 
101  template <int refDim>
102  std::vector<MathVector<refDim> >* local_ips();
103 
105  std::vector<MathVector<3> > vLocIP_dim3;
106  std::vector<MathVector<2> > vLocIP_dim2; // might have Neumann bnd for lower-dim elements!
107  std::vector<MathVector<1> > vLocIP_dim1;
108  std::vector<MathVector<dim> > vGloIP;
109  };
110 
112  struct BNDNumberData : public base_type::Data
113  {
115  std::string BndSubsets, std::string InnerSubsets)
116  : base_type::Data(BndSubsets, InnerSubsets), functor(functor_) {}
117 
119  };
120 
122  struct VectorData : public base_type::Data
123  {
125  std::string BndSubsets, std::string InnerSubsets)
126  : base_type::Data(BndSubsets, InnerSubsets), functor(functor_) {}
127 
129  };
130 
131  std::vector<NumberData> m_vNumberData;
132  std::vector<BNDNumberData> m_vBNDNumberData;
133  std::vector<VectorData> m_vVectorData;
134 
135  void update_subset_groups();
137 
139  int m_si;
140 
141  public:
143  virtual void prepare_setting(const std::vector<LFEID>& vLfeID, bool bNonRegularGrid);
144 
145  protected:
148  template<typename TElem, typename TFVGeom>
149  void prep_elem_loop(const ReferenceObjectID roid, const int si);
150  template<typename TElem, typename TFVGeom>
151  void prep_elem(const LocalVector& u, GridObject* elem, const ReferenceObjectID roid, const MathVector<dim> vCornerCoords[]);
152  template<typename TElem, typename TFVGeom>
153  void fsh_elem_loop();
154  template<typename TElem, typename TFVGeom>
155  void add_rhs_elem(LocalVector& d, GridObject* elem, const MathVector<dim> vCornerCoords[]);
156 
158  template <typename TElem, typename TFVGeom>
159  void prep_err_est_elem_loop(const ReferenceObjectID roid, const int si);
160 
162  template <typename TElem, typename TFVGeom>
163  void prep_err_est_elem(const LocalVector& u, GridObject* elem, const MathVector<dim> vCornerCoords[]);
164 
166  template <typename TElem, typename TFVGeom>
167  void compute_err_est_rhs_elem(GridObject* elem, const MathVector<dim> vCornerCoords[], const number& scale);
168 
170  template <typename TElem, typename TFVGeom>
171  void fsh_err_est_elem_loop();
172 
173 
175 
176  static const int _C_ = 0;
177 
178  private:
179  void register_all_funcs(bool bHang);
180  template <typename TElem, typename TFVGeom> void register_func();
181 };
182 
183 } // end namespac ug
184 
185 #endif /*__H__UG__LIB_DISC__SPATIAL_DISC__ELEM_DISC__NEUMANN_BOUNDARY___NEUMANN_BOUNDARY_FV1__*/
Definition: smart_pointer.h:108
Type based UserData.
Definition: user_data.h:501
The base class for all geometric objects, such as vertices, edges, faces, volumes,...
Definition: grid_base_objects.h:157
Definition: elem_disc_interface.h:760
Definition: local_algebra.h:198
Definition: neumann_boundary_base.h:47
static const int dim
World dimension.
Definition: neumann_boundary_base.h:57
void update_subset_groups(Data &userData)
method used to extract subsets id
Definition: neumann_boundary_base.cpp:60
Definition: neumann_boundary_fv1.h:47
int m_si
current inner subset
Definition: neumann_boundary_fv1.h:139
void prep_err_est_elem_loop(const ReferenceObjectID roid, const int si)
prepares the loop over all elements of one type for the computation of the error estimator
Definition: neumann_boundary_fv1.cpp:284
SideAndElemErrEstData< TDomain > err_est_type
error estimator type
Definition: neumann_boundary_fv1.h:56
void prep_err_est_elem(const LocalVector &u, GridObject *elem, const MathVector< dim > vCornerCoords[])
prepares the element for assembling the error estimator
Definition: neumann_boundary_fv1.cpp:346
void add_rhs_elem(LocalVector &d, GridObject *elem, const MathVector< dim > vCornerCoords[])
Definition: neumann_boundary_fv1.cpp:179
NeumannBoundaryFV1< TDomain > this_type
Base class type.
Definition: neumann_boundary_fv1.h:53
void register_all_funcs(bool bHang)
void add(SmartPtr< CplUserData< number, dim > > data, const char *BndSubsets, const char *InnerSubsets)
Definition: neumann_boundary_fv1.cpp:67
static const int dim
World dimension.
Definition: neumann_boundary_fv1.h:60
void prep_elem(const LocalVector &u, GridObject *elem, const ReferenceObjectID roid, const MathVector< dim > vCornerCoords[])
Definition: neumann_boundary_fv1.cpp:161
std::vector< NumberData > m_vNumberData
Definition: neumann_boundary_fv1.h:131
NeumannBoundaryBase< TDomain > base_type
Base class type.
Definition: neumann_boundary_fv1.h:50
void prep_elem_loop(const ReferenceObjectID roid, const int si)
Definition: neumann_boundary_fv1.cpp:107
std::vector< VectorData > m_vVectorData
Definition: neumann_boundary_fv1.h:133
void compute_err_est_rhs_elem(GridObject *elem, const MathVector< dim > vCornerCoords[], const number &scale)
computes the error estimator contribution for one element
Definition: neumann_boundary_fv1.cpp:373
void fsh_elem_loop()
Definition: neumann_boundary_fv1.cpp:239
NeumannBoundaryFV1(const char *function)
default constructor
Definition: neumann_boundary_fv1.cpp:45
virtual void prepare_setting(const std::vector< LFEID > &vLfeID, bool bNonRegularGrid)
type of trial space for each function used
Definition: neumann_boundary_fv1.cpp:53
void fsh_err_est_elem_loop()
postprocesses the loop over all elements of one type in the computation of the error estimator
Definition: neumann_boundary_fv1.cpp:490
void register_func()
Definition: neumann_boundary_fv1.cpp:619
std::vector< BNDNumberData > m_vBNDNumberData
Definition: neumann_boundary_fv1.h:132
void update_subset_groups()
Definition: neumann_boundary_fv1.cpp:90
static const int _C_
Definition: neumann_boundary_fv1.h:176
Error estimator data class storing a number vector per side and per element.
Definition: err_est_data.h:221
double number
Definition: types.h:124
the ug namespace
ReferenceObjectID
these ids are used to identify the shape of a geometric object.
Definition: grid_base_objects.h:74
base class for user data
Definition: neumann_boundary_base.h:87
Conditional scalar user data.
Definition: neumann_boundary_fv1.h:113
SmartPtr< CplUserData< number, dim, bool > > functor
Definition: neumann_boundary_fv1.h:118
BNDNumberData(SmartPtr< CplUserData< number, dim, bool > > functor_, std::string BndSubsets, std::string InnerSubsets)
Definition: neumann_boundary_fv1.h:114
Unconditional scalar user data.
Definition: neumann_boundary_fv1.h:78
std::vector< MathVector< 1 > > vLocIP_dim1
Definition: neumann_boundary_fv1.h:107
std::vector< MathVector< 3 > > vLocIP_dim3
Definition: neumann_boundary_fv1.h:105
std::vector< MathVector< refDim > > * local_ips()
Definition: neumann_boundary_fv1.cpp:567
void lin_def(const LocalVector &u, std::vector< std::vector< number > > vvvLinDef[], const size_t nip)
Definition: neumann_boundary_fv1.cpp:508
void set_local_ips(const MathVector< refDim > *ips, std::size_t nIPs)
Definition: neumann_boundary_fv1.h:95
void extract_bip(const TFVGeom &geo)
Definition: neumann_boundary_fv1.cpp:530
std::vector< MathVector< 2 > > vLocIP_dim2
Definition: neumann_boundary_fv1.h:106
NumberData(SmartPtr< CplUserData< number, dim > > data, std::string BndSubsets, std::string InnerSubsets)
Definition: neumann_boundary_fv1.h:79
void set_global_ips(const MathVector< dim > *ips, std::size_t nIPs)
Definition: neumann_boundary_fv1.h:98
std::vector< MathVector< dim > > vGloIP
Definition: neumann_boundary_fv1.h:108
Unconditional vector user data.
Definition: neumann_boundary_fv1.h:123
VectorData(SmartPtr< CplUserData< MathVector< dim >, dim > > functor_, std::string BndSubsets, std::string InnerSubsets)
Definition: neumann_boundary_fv1.h:124
SmartPtr< CplUserData< MathVector< dim >, dim > > functor
Definition: neumann_boundary_fv1.h:128