Dune Core Modules (2.6.0)

field.hh
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_LOCALFUNCTIONS_UTILITY_FIELD_HH
4 #define DUNE_LOCALFUNCTIONS_UTILITY_FIELD_HH
5 
7 #include <dune/common/fvector.hh>
8 #include <dune/common/fmatrix.hh>
9 
10 namespace Dune
11 {
12 
13  // Unity
14  // -----
15 
26  template< class Field >
27  struct Unity
28  {
29  operator Field () const
30  {
31  return Field( 1 );
32  }
33  };
34 
35  template< class Field >
36  Field operator+ ( const Unity< Field > &u, const Field &f )
37  {
38  return (Field)u + f;
39  }
40 
41  template< class Field >
42  Field operator- ( const Unity< Field > &u, const Field &f )
43  {
44  return (Field)u - f;
45  }
46 
47  template< class Field >
48  Field operator* ( const Unity< Field > &u, const Field &f )
49  {
50  return f;
51  }
52 
53  template< class Field >
54  Field operator/ ( const Unity< Field > &u, const Field &f )
55  {
56  return (Field)u / f;
57  }
58 
59 
60 
61  // Zero
62  // ----
63 
75  template< class Field >
76  struct Zero
77  {
78  operator Field () const
79  {
80  return Field( 0 );
81  }
82  static const Field epsilon()
83  {
84  return Field(1e-12);
85  }
86  };
87 
88 #if HAVE_GMP
89  template< unsigned int precision >
90  struct Zero< GMPField< precision > >
91  {
92  typedef GMPField< precision > Field;
93  operator Field () const
94  {
95  return Field( 0 );
96  }
97  static const Field epsilon()
98  {
99  return Field(1e-20);
100  }
101  };
102 #endif
103 
104  template< class Field >
105  inline bool operator == ( const Zero< Field > &, const Field &f )
106  {
107  return ( f < Zero<Field>::epsilon() && f > -Zero<Field>::epsilon() );
108  }
109 
110  template< class Field >
111  inline bool operator == ( const Field &f, const Zero< Field > &z)
112  {
113  return ( z == f );
114  }
115 
116  template< class Field >
117  inline bool operator< ( const Zero< Field > &, const Field &f )
118  {
119  return f > Zero<Field>::epsilon();
120  }
121 
122  template< class Field >
123  inline bool operator< ( const Field &f, const Zero< Field > & )
124  {
125  return f < -Zero<Field>::epsilon();
126  }
127 
128  template< class Field >
129  inline bool operator> ( const Zero< Field > &z, const Field &f )
130  {
131  return f < z;
132  }
133 
134  template< class Field >
135  inline bool operator> ( const Field &f, const Zero< Field > &z )
136  {
137  return z < f;
138  }
139 
140 
141  // field_cast
142  // ----------
143 
156  template< class F2, class F1 >
157  inline void field_cast ( const F1 &f1, F2 &f2 )
158  {
159  f2 = f1;
160  }
161 
162 #if HAVE_GMP
163  template< unsigned int precision >
164  inline void field_cast ( const Dune::GMPField< precision > &f1, double &f2 )
165  {
166  f2 = f1.get_d();
167  }
168 
169  template< unsigned int precision >
170  inline void field_cast ( const Dune::GMPField< precision > &f1, long double &f2 )
171  {
172  f2 = f1.get_d();
173  }
174 #endif
175 
176  template< class F2, class F1, int dim >
178  {
179  for( int d = 0; d < dim; ++d )
180  field_cast( f1[ d ], f2[ d ] );
181  }
182  template< class F2, class F1 >
183  inline void field_cast ( const Dune::FieldVector< F1, 1 > &f1, F2 &f2 )
184  {
185  field_cast( f1[ 0 ], f2 );
186  }
187  template< class F2, class F1 >
188  inline void field_cast ( const F1 &f1, Dune::FieldVector< F2, 1 > &f2 )
189  {
190  field_cast( f1, f2[ 0 ] );
191  }
192 
193  template< class F2, class F1, int rdim, int cdim >
195  {
196  for( int r = 0; r < rdim; ++r )
197  field_cast( f1[ r ], f2[ r ] );
198  }
199  template< class F2, class F1 >
201  {
202  field_cast( f1[ 0 ][ 0 ], f2[ 0 ][ 0 ] );
203  }
204  template< class F2, class F1 >
205  inline void field_cast ( const Dune::FieldMatrix< F1, 1,1 > &f1, F2 &f2 )
206  {
207  field_cast( f1[ 0 ][ 0 ], f2 );
208  }
209  template< class F2, class F1 >
210  inline void field_cast ( const F1 &f1, Dune::FieldMatrix< F2, 1,1 > &f2 )
211  {
212  field_cast( f1, f2[ 0 ][ 0 ] );
213  }
214  template< class F2, class F1 >
216  {
217  field_cast( f1[ 0 ], f2[ 0 ][ 0 ] );
218  }
219  template< class F2, class F1 >
221  {
222  field_cast( f1[ 0 ][ 0 ], f2[ 0 ] );
223  }
224 
225  template< class F2, class F1 >
226  inline void field_cast ( const Dune::FieldVector< F1, 1 > &f1, Dune::FieldVector<F2, 1> &f2 )
227  {
228  field_cast( f1[ 0 ], f2[ 0 ] );
229  }
230 
231  template< class F2,class V >
232  struct FieldCast
233  {
234  typedef F2 type;
235  };
236  template< class F2,class F1,int dim >
237  struct FieldCast< F2, Dune::FieldVector<F1,dim> >
238  {
239  typedef Dune::FieldVector<F2,dim> type;
240  };
241  template< class F2,class F1,int dim1, int dim2>
242  struct FieldCast< F2, Dune::FieldMatrix<F1,dim1,dim2> >
243  {
244  typedef Dune::FieldMatrix<F2,dim1,dim2> type;
245  };
246  template< class F2,class V >
247  inline typename FieldCast<F2,V>::type field_cast ( const V &f1 )
248  {
249  typename FieldCast<F2,V>::type f2;
250  field_cast( f1, f2 );
251  return f2;
252  }
253 
254 
255  // Precision
256  // this is not a perfect solution to obtain the
257  // precision of a field - definition is not clear
258  // to be removed
259  // ---------
260 
261  template <class Field>
262  struct Precision;
263 
264  template<>
265  struct Precision< double >
266  {
267  static const unsigned int value = 64;
268  };
269 
270  template<>
271  struct Precision< long double >
272  {
273  static const unsigned int value = 80;
274  };
275 
276  template<>
277  struct Precision< float >
278  {
279  static const unsigned int value = 32;
280  };
281 
282 #if HAVE_GMP
283  template< unsigned int precision >
284  struct Precision< GMPField< precision > >
285  {
286  static const unsigned int value = precision;
287  };
288 #endif
289 
290  // ComputeField
291  // ------------
292 
293  template <class Field,unsigned int sum>
294  struct ComputeField
295  {
296  typedef Field Type;
297  };
298 
299 #if HAVE_GMP
300  template< unsigned int precision, unsigned int sum >
301  struct ComputeField< GMPField< precision >, sum >
302  {
303  typedef GMPField<precision+sum> Type;
304  };
305 #endif
306 } // namespace Dune
307 
308 #endif // #ifndef DUNE_LOCALFUNCTIONS_UTILITY_FIELD_HH
A dense n x m matrix.
Definition: fmatrix.hh:68
vector space out of a tensor product of fields.
Definition: fvector.hh:93
Number class for high precision floating point number using the GMP library mpf_class implementation.
Definition: gmpfield.hh:29
Implements a matrix constructed from a given type representing a field and compile-time given number ...
Implements a vector constructed from a given type representing a field and a compile-time given size.
Wrapper for the GNU multiprecision (GMP) library.
EnableIfInterOperable< T1, T2, bool >::type operator>(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:675
EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:629
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:233
Dune namespace.
Definition: alignedallocator.hh:10
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:157
A class representing the unit of a given Field.
Definition: field.hh:28
A class representing the zero of a given Field.
Definition: field.hh:77
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (Apr 27, 22:29, 2024)