00001 #ifndef FIELD_H 00002 #define FIELD_H 00003 00004 #include "ddf/ddf.h" 00005 #include "interpolator.h" 00006 #include "afltypes.h" 00007 #include "value.h" 00008 #include "boundary.h" 00009 #include "simplex.h" 00010 #include "integrator.h" 00011 #include "afltypes.h" 00012 #include "exc/aflexc.h" 00013 00014 namespace afl 00015 { 00016 class Iterator; 00017 class FieldFactory; 00018 class Derivator; 00023 class Field 00024 { 00025 public: 00027 typedef Iterator iterator; 00028 00030 protected: 00038 Field( const std::string& name, ddf::PropertySet* pset); 00039 00040 public: 00044 virtual ~Field( ); 00045 00047 public: 00057 virtual void interpolation( Interpolator* interpolator ); 00058 00073 virtual void interpolation( interp_t method ) = 0; 00074 00082 virtual void interpolation( const std::string& function ); 00083 00090 virtual void boundary( Boundary* boundary ) throw(exc::GeometryException); 00091 00096 virtual void derivator( Derivator* derivator ); 00097 00102 virtual void integrator( Integrator* integrator ); 00103 00116 virtual void addBoundarySegment( const Point& p1, const Point& p2 ); 00117 00135 virtual void addBoundarySegment( const Field* f ); 00136 00145 virtual void toXML( std::ostream& doc, const std::string& componentsDir, 00146 const std::string& baseURI, bool allInline ) const; 00147 00153 virtual Value get( const Point& x ) const = 0; 00154 00159 virtual Derivative jacobian( const Point& x ) const = 0; 00160 00168 virtual Point gradient( const Point& x ) const = 0; 00169 00176 virtual data_t divergence( const Point& x ) const = 0; 00177 00184 virtual data_t laplacian( const Point& x ) const = 0; 00185 00193 virtual Point curl( const Point& x ) const; 00194 00207 virtual Value integral ( const Simplex& s ) const = 0; 00208 00218 virtual void set( const Point& x, const Value& value ) = 0; 00219 00233 virtual void set( const Point& x, const Value& value, const Derivative& dvalue ) = 0; 00234 00238 virtual iterator begin() const; 00239 00243 virtual iterator end() const; 00244 00250 virtual void erase( const iterator& pt ); 00251 00256 virtual bool hasDerivative( ) const; 00257 00261 virtual size_t size( ) const; 00262 00269 virtual size_t getDimension( ) const = 0; 00270 00274 virtual const Boundary* getBoundary( ) const; 00275 00282 virtual Point getBoundingBoxMin( ) const = 0; 00283 00290 virtual Point getBoundingBoxMax( ) const = 0; 00291 00296 virtual void resetBoundary( ); 00300 virtual const std::string& getName( ) const { return _name; } 00301 00305 virtual const ddf::Geometry* getValueGeometry( ) const; 00306 00311 virtual std::string getValueTypeStr( ) const; 00312 00318 virtual troolean locate( const Point& p ) const; 00319 00323 virtual Field* clone( ) const = 0; 00324 00331 void setDirichletCondition( const Field* value ); 00332 00338 void setDirichletCondition( const Value& value ); 00339 00344 bool hasDirichletCondition( ) const; 00345 00350 Value getDirichlet( const Point& p ) const; 00351 00359 void setNeumannCondition( const Field* deriv ); 00360 00366 void setNeumannCondition( const Value& value ); 00367 00372 bool hasNeumannCondition( ) const; 00373 00378 Value getNeumann( const Point& p ) const; 00379 00383 const ddf::PropertySet* getNumericData( ) const { return _pset; } 00384 00386 protected: 00387 friend class FieldFactory; 00388 friend class Iterator; 00389 00391 ddf::PropertySet* _pset; 00392 00396 std::string _name; 00397 00401 Interpolator* _interpolator; 00405 Boundary* _boundary; 00409 Derivator* _derivator; 00413 Integrator* _integrator; 00414 00418 const Field* _dirichlet; 00419 00423 const Field* _neumann; 00424 00425 }; 00426 00427 }; 00428 00429 #endif // FIELD_H