meshvectorfield.hpp
Go to the documentation of this file.
00001 
00005 /* Copyright (c) 2005-2011 Taneli Kalvas. All rights reserved.
00006  *
00007  * You can redistribute this software and/or modify it under the terms
00008  * of the GNU General Public License as published by the Free Software
00009  * Foundation; either version 2 of the License, or (at your option)
00010  * any later version.
00011  * 
00012  * This library is distributed in the hope that it will be useful, but
00013  * WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00015  * General Public License for more details.
00016  * 
00017  * You should have received a copy of the GNU General Public License
00018  * along with this library (file "COPYING" included in the package);
00019  * if not, write to the Free Software Foundation, Inc., 51 Franklin
00020  * Street, Fifth Floor, Boston, MA 02110-1301 USA
00021  * 
00022  * If you have questions about your rights to use or distribute this
00023  * software, please contact Berkeley Lab's Technology Transfer
00024  * Department at TTD@lbl.gov. Other questions, comments and bug
00025  * reports should be sent directly to the author via email at
00026  * taneli.kalvas@jyu.fi.
00027  * 
00028  * NOTICE. This software was developed under partial funding from the
00029  * U.S.  Department of Energy.  As such, the U.S. Government has been
00030  * granted for itself and others acting on its behalf a paid-up,
00031  * nonexclusive, irrevocable, worldwide license in the Software to
00032  * reproduce, prepare derivative works, and perform publicly and
00033  * display publicly.  Beginning five (5) years after the date
00034  * permission to assert copyright is obtained from the U.S. Department
00035  * of Energy, and subject to any subsequent five (5) year renewals,
00036  * the U.S. Government is granted for itself and others acting on its
00037  * behalf a paid-up, nonexclusive, irrevocable, worldwide license in
00038  * the Software to reproduce, prepare derivative works, distribute
00039  * copies to the public, perform publicly and display publicly, and to
00040  * permit others to do so.
00041  */
00042 
00043 #ifndef MESHVECTORFIELD_HPP
00044 #define MESHVECTORFIELD_HPP 1
00045 
00046 
00047 #include "transformation.hpp"
00048 #include "vectorfield.hpp"
00049 #include "mesh.hpp"
00050 #include "types.hpp"
00051 
00052 
00071 class MeshVectorField : public VectorField, public Mesh {
00072 
00073     field_extrpl_e   _extrpl[6]; 
00074     double          *_F[3];      
00080     Transformation   _T;         
00081     Transformation   _Tinv;      
00083     void check_definition();
00084 
00085     void convert_3d_to_3d( const MeshVectorField &fin );
00086     void convert_cyl_to_3d( const MeshVectorField &fin );
00087 
00088 public:
00089 
00090 
00098     MeshVectorField();
00099 
00106     MeshVectorField( const Mesh &m, const bool fout[3] );
00107 
00118     MeshVectorField( geom_mode_e geom_mode, const bool fout[3], Int3D size, 
00119                      Vec3D origo, double h );
00120 
00146     MeshVectorField( geom_mode_e geom_mode, const bool fout[3], double xscale, 
00147                      double fscale, const std::string &filename );
00148 
00172     MeshVectorField( geom_mode_e geom_mode, const bool fout[3], Int3D size, 
00173                      Vec3D origo, double h, const MeshVectorField &fin );
00174 
00177     MeshVectorField( const MeshVectorField &f );
00178 
00181     MeshVectorField( std::istream &is );
00182 
00185     virtual ~MeshVectorField();
00186 
00206     void set_extrapolation( const field_extrpl_e extrpl[6] ) {
00207         memcpy( _extrpl, extrpl, 6*sizeof(field_extrpl_e) );
00208     }
00209 
00212     void reset_transformation( void );
00213 
00216     void set_transformation( const Transformation &T );
00217 
00220     void translate( const Vec3D &dx );
00221 
00224     void scale( const Vec3D &sx );
00225 
00230     void rotate_x( double a );
00231 
00238     void rotate_y( double a );
00239 
00244     void rotate_z( double a );
00245 
00248     void clear();
00249 
00256     void reset( geom_mode_e geom_mode, const bool fout[3], Int3D size, 
00257                 Vec3D origo, double h );
00258 
00262     void get_minmax( double &min, double &max ) const;
00263 
00266     void get_defined_components( bool fout[3] ) const;
00267 
00270     MeshVectorField &operator=( const MeshVectorField &f );
00271 
00274     MeshVectorField &operator+=( const MeshVectorField &f );
00275 
00278     MeshVectorField &operator*=( double x );
00279 
00282     MeshVectorField &operator/=( double x );
00283 
00286     const Vec3D operator()( int32_t i ) const;
00287 
00290     const Vec3D operator()( int32_t i, int32_t j ) const;
00291 
00294     const Vec3D operator()( int32_t i, int32_t j, int32_t k ) const;
00295 
00298     void set( int32_t i, const Vec3D &v );
00299     
00302     void set( int32_t i, int32_t j, const Vec3D &v );
00303 
00306     void set( int32_t i, int32_t j, int32_t k, const Vec3D &v );
00307 
00311     virtual const Vec3D operator()( Vec3D x ) const;
00312 
00315     void save( const std::string &filename ) const;
00316 
00319     void save( std::ostream &os ) const;
00320 
00323     void debug_print( std::ostream &os ) const;
00324 };
00325 
00326 
00327 #endif
00328