1 #ifndef DUNE_FEM_LINESEGMENTSAMPLER_HH 2 #define DUNE_FEM_LINESEGMENTSAMPLER_HH 7 #include <dune/common/fvector.hh> 9 #include <dune/geometry/referenceelements.hh> 33 template<
class Gr
idPart >
40 static const int dimDomain = GridPartType::dimensionworld;
41 static const int dimGrid = GridPartType::dimension;
43 typedef FieldVector< DomainFieldType, dimDomain >
DomainType;
47 static_assert( dimDomain == dimGrid,
"LineSegmentSampler supports only flat grids." );
49 template<
class Vector >
52 typedef Dune::ReferenceElement< DomainFieldType, dimGrid > ReferenceElement;
53 typedef Dune::ReferenceElements< DomainFieldType, dimGrid > ReferenceElements;
67 : gridPart_( gridPart ), left_( left ), right_( right )
80 template<
class Gr
idFunction >
81 void operator() (
const GridFunction &f, std::vector< typename GridFunction::RangeType > &samples )
const;
92 void samplePoints( std::vector< DomainType > &points )
const;
95 const GridPart &
gridPart ()
const {
return gridPart_; }
98 const GridPart &gridPart_;
99 DomainType left_, right_;
107 template<
class Gr
idPart >
108 template<
class Vector >
111 Vector
operator() (
const Vector &a,
const Vector &b )
const 114 for(
int k = 0; k < Vector::dimension; ++k )
115 c[ k ] =
std::min( a[ k ], b[ k ] );
125 template<
class Gr
idPart >
126 template<
class Gr
idFunction >
128 ::operator() (
const GridFunction &f, std::vector< typename GridFunction::RangeType > &samples )
const 130 typedef typename GridPartType::template Codim< 0 >::IteratorType IteratorType;
131 typedef typename GridPartType::template Codim< 0 >::EntityType EntityType;
133 typedef typename GridFunction::LocalFunctionType LocalFunctionType;
135 const int numSamples = samples.size();
137 DUNE_THROW( InvalidStateException,
"LineSegmentSampler cannot sample less than 2 points." );
141 const typename GridFunction::RangeFieldType invalid
142 = std::numeric_limits< typename GridFunction::RangeFieldType >::infinity();
143 for(
int i = 0; i < numSamples; ++i )
144 samples[ i ] =
typename GridFunction::RangeType( invalid );
146 const IteratorType end =
gridPart().template end< 0 >();
147 for( IteratorType it =
gridPart().template begin< 0 >(); it != end; ++it )
149 const EntityType &entity = *it;
150 const typename EntityType::Geometry &geometry = entity.geometry();
155 const ReferenceElement &refElement = ReferenceElements::general( geometry.type() );
156 const int numFaces = refElement.size( 1 );
157 for(
int face = 0; face < numFaces; ++face )
162 const LocalDomainType &refNormal = refElement.integrationOuterNormal( face );
163 geometry.jacobianInverseTransposed( center ).mv( refNormal, normal );
166 const DomainFieldType ncl = normal * (geometry.global( center ) - left_);
176 else if( ncl < -1e-8 )
186 const LocalFunctionType &lf = f.localFunction( entity );
187 const int i_upper =
std::min(
int( std::floor( upper + 1e-8 ) ), numSamples - 1 );
188 const int i_lower =
std::max(
int( std::ceil( lower - 1e-8 ) ), 0 );
189 for(
int i = i_lower; i <= i_upper; ++i )
193 lf.evaluate( geometry.local( xi ), samples[ i ] );
198 typedef Reduce< typename GridFunction::RangeType > Op;
199 gridPart().comm().template allreduce< Op >( &(samples[ 0 ]), numSamples );
202 for(
int i = 0; i < numSamples; ++i )
203 valid &= (samples[ i ] !=
typename GridFunction::RangeType( invalid ));
205 DUNE_THROW( InvalidStateException,
"LineSegmentSampler could not find all samples." );
209 template<
class Gr
idPart >
213 const int numSamples = points.size();
215 DUNE_THROW( InvalidStateException,
"LineSegmentSampler cannot sample less than 2 points." );
219 for(
int i = 0; i < numSamples; ++i )
230 #endif // #ifndef DUNE_FEM_LINESEGMENTSAMPLER_HH
static const int dimGrid
Definition: linesegmentsampler.hh:41
GridPartType::GridType::ctype DomainFieldType
Definition: linesegmentsampler.hh:38
static constexpr T min(T a)
Definition: utility.hh:81
samples values of a discrete function along a given line segment
Definition: linesegmentsampler.hh:34
FieldVector< DomainFieldType, dimGrid > LocalDomainType
Definition: linesegmentsampler.hh:44
static constexpr T max(T a)
Definition: utility.hh:65
static const int dimDomain
Definition: linesegmentsampler.hh:40
GridPart GridPartType
Definition: linesegmentsampler.hh:36
Double abs(const Double &a)
Definition: double.hh:860
Definition: coordinate.hh:4
const GridPart & gridPart() const
obtain grid part on which the LineSegmentSampler works
Definition: linesegmentsampler.hh:95
LineSegmentSampler(const GridPart &gridPart, const DomainType &left, const DomainType &right)
constructor
Definition: linesegmentsampler.hh:66
FieldVector< DomainFieldType, dimDomain > DomainType
Definition: linesegmentsampler.hh:43
void samplePoints(std::vector< DomainType > &points) const
returns sampling points
Definition: linesegmentsampler.hh:211
void operator()(const GridFunction &f, std::vector< typename GridFunction::RangeType > &samples) const
sample a given function
Definition: linesegmentsampler.hh:128