Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

metric.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2001 The AUTHORS 
00003  *   Romeu Andre' Pieritz, Ph.D.        - romeu_pieritz@hotmail.com
00004  *   Rafael Mendes, Eng.                – mendes_rafael@yahoo.com
00005  *   Rodrigo Ferraz de Andrade, Eng.    – rferraz@iname.com 
00006  * All rights reserved.
00007  *
00008  * Permission to use, copy and distribute this software and its
00009  * documentation for educational and personal use, without fee is hereby granted, 
00010  * provided that the above copyright notice and the following
00011  * two paragraphs appear in all copies of this software.
00012  *
00013  * IN NO EVENT SHALL THE AUTHORS BE LIABLE TO ANY PARTY FOR
00014  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
00015  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS
00016  * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00017  *
00018  * THE AUTHORS SPECIFICALLY DISCLAIMS ANY WARRANTIES,
00019  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
00020  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HERE UNDER IS
00021  * ON AN "AS IS" BASIS, AND THE AUTHORS HAVE NO OBLIGATION TO
00022  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
00023  *
00024  * SINMEC Lab. - CFD Sinflow Project - http://www.sinmec.ufsc.br/cfd
00025  */
00026 
00027 
00028 // File Define
00029 #ifndef __SFL_GEOM_METRIC_METRIC_H__
00030 #define __SFL_GEOM_METRIC_METRIC_H__
00031 
00032 
00033 // Include
00034 #include <csfl/geom/grid/grid.h>
00035 #include <csfl/field/value/scalar.h>
00036 #include <csfl/field/value/scalar_face.h>
00037 
00038 
00039 // Namespace
00040 namespace csfl {
00041 
00042 
00043 class IMetric : 
00044         virtual public ISFLObject
00045 
00050 
00051 {
00052 
00053 public:
00054         
00059         IMetric( IGrid *_grid = NULL );
00060     ~IMetric();
00061     
00062         static double control;
00063         
00069     inline TDomainRegion RegionID( const IPoint & _p );
00070     TDomainRegion RegionID( int _x, int _y );
00071     
00077     inline double Area( const IPoint & _p );
00078     inline double Area( int _x, int _y );
00079     
00090     inline double Jacobian( const IPoint & _p, TDirection _dir ); 
00091     inline double Jacobian( int _x, int _y, TDirection _dir ); 
00092     
00105     inline double XKsi( const IPoint & _p, TDirection _dir );
00106     inline double XKsi( int _x, int _y, TDirection _dir );
00107 
00120     inline double XEta( const IPoint & _p, TDirection _dir );
00121     inline double XEta( int _x, int _y, TDirection _dir );
00122 
00135     inline double YKsi( const IPoint & _p, TDirection _dir );
00136     inline double YKsi( int _x, int _y, TDirection _dir );
00137 
00150     inline double YEta( const IPoint & _p, TDirection _dir );
00151     inline double YEta( int _x, int _y, TDirection _dir );
00152 
00163     inline double Alpha( const IPoint & _p, TDirection _dir );
00164     inline double Alpha( int _x, int _y, TDirection _dir );
00165 
00176     inline double Beta( const IPoint & _p, TDirection _dir );
00177     inline double Beta( int _x, int _y, TDirection _dir );
00178 
00189     inline double Gamma( const IPoint & _p, TDirection _dir );
00190     inline double Gamma( int _x, int _y, TDirection _dir );
00191      
00202     inline double FaceLengthKsi( const IPoint & _p, TDirection _dir );
00203     inline double FaceLengthKsi( int _x, int _y, TDirection _dir );
00204 
00214     inline double FaceLengthEta( const IPoint & _p, TDirection _dir );
00215     inline double FaceLengthEta( int _x, int _y, TDirection _dir );
00216     
00220     IGrid * Grid() { return grid; }
00221     
00228     double PositionKsi( const IPoint & _p, TDirection _dir );
00229     double PositionKsi( int _x, int _y, TDirection);
00230 
00237     double PositionEta( const IPoint & _p, TDirection _dir );
00238     double PositionEta( int _x, int _y, TDirection _dir );
00239 
00246         inline IArray2D<TDomainRegion> * DomainRegion() { return domain; }
00247         inline TDomainRegion RelativeRegionID( int _i, int _j );
00248         inline TDomainRegion RelativeRegionID( const IPoint & _p);
00249 
00254         inline void SetDomainRegionID( int _i, int _j, TDomainRegion _tdr );
00255 
00256 protected:
00257     IGrid       *grid;
00258         IFieldScalar            *cxksi, *cyksi,
00259                                                 *cxeta, *cyeta;
00260         IFieldScalarFace *fxksi, *fyksi,
00261                                                 *fxeta, *fyeta;
00262 
00263         IArray2D<TDomainRegion> *domain;
00264 
00265         void InitDomainRegionID();
00266 
00267         void CalculateXKsi();
00268         void CalculateYKsi();
00269         void CalculateXEta();
00270         void CalculateYEta();
00271 
00272     double EvalXKsi( int _x, int _y, TDirection _dir );
00273     double EvalXEta( int _x, int _y, TDirection _dir );
00274     double EvalYKsi( int _x, int _y, TDirection _dir );
00275     double EvalYEta( int _x, int _y, TDirection _dir );
00276 
00277 };
00278 
00279 // =============================================================================
00280 // Inline functions
00281 // =============================================================================
00282 
00283 inline void IMetric::SetDomainRegionID( int _i, int _j, TDomainRegion _tdr )
00284 {
00285         (*domain)( _i, _j ) = _tdr;
00286 }
00287 
00288 inline TDomainRegion IMetric::RelativeRegionID( int _i, int _j )
00289 {
00290         return domain->Value( _i, _j );
00291 }
00292 
00293 inline TDomainRegion IMetric::RelativeRegionID( const IPoint &_p )
00294 {
00295         return domain->Value( _p.x, _p.y );
00296 }
00297 
00298 
00299 inline double IMetric::XKsi( const IPoint &_p, TDirection _dir ) 
00300 { 
00301     return XKsi( _p.x, _p.y, _dir );
00302 }
00303    
00304 
00305 inline double IMetric::YKsi( const IPoint &_p, TDirection _dir ) 
00306 { 
00307     return YKsi( _p.x, _p.y, _dir );
00308 }
00309 
00310 
00311 inline double IMetric::XEta( const IPoint &_p, TDirection _dir )  
00312 { 
00313     return XEta( _p.x, _p.y, _dir );
00314 }
00315 
00316 
00317 inline double IMetric::XKsi( int _x, int _y, TDirection _dir ) 
00318 { 
00319         if (_dir==diNULL)
00320                 return cxksi->Value( _x, _y );
00321         else
00322                 return fxksi->Value( _x, _y, _dir);
00323 }
00324 
00325 inline double IMetric::YKsi( int _x, int _y, TDirection _dir ) 
00326 { 
00327         if (_dir==diNULL)
00328                 return cyksi->Value( _x, _y );
00329         else
00330                 return fyksi->Value( _x, _y, _dir);
00331 }
00332 
00333 inline double IMetric::XEta( int _x, int _y, TDirection _dir ) 
00334 { 
00335         if (_dir==diNULL)
00336                 return cxeta->Value( _x, _y );
00337         else
00338                 return fxeta->Value( _x, _y, _dir);
00339 }
00340 
00341 inline double IMetric::YEta( int _x, int _y, TDirection _dir ) 
00342 { 
00343         if (_dir==diNULL)
00344                 return cyeta->Value( _x, _y );
00345         else
00346                 return fyeta->Value( _x, _y, _dir);
00347 }
00348 
00349 inline TDomainRegion IMetric::RegionID( const IPoint &_p )
00350 {
00351     return RegionID( _p.x, _p.y );
00352 }
00353 
00354 inline double IMetric::Area( int _x, int _y ) 
00355 { 
00356     return fabs(1.0 / Jacobian( _x, _y, diNULL ));
00357 }
00358 
00359 inline double IMetric::Area( const IPoint &_p ) 
00360 { 
00361     return Area( _p.x, _p.y );
00362 }
00363 
00364 inline double IMetric::Jacobian( int _x, int _y, TDirection _dir ) 
00365 {       
00366         return 1.0 / fabs( ( XKsi( _x, _y, _dir )*YEta( _x, _y, _dir ) ) - 
00367                            ( XEta( _x, _y, _dir )*YKsi( _x, _y, _dir ) ) );                     
00368 }
00369 
00370 inline double IMetric::Jacobian( const IPoint &_p, TDirection _dir ) 
00371 { 
00372     return Jacobian( _p.x, _p.y, _dir );                    
00373 }
00374 
00375 inline double IMetric::YEta( const IPoint &_p, TDirection _dir )  
00376 { 
00377     return YEta( _p.x, _p.y, _dir );
00378 }
00379  
00380 inline double IMetric::Alpha( int _x, int _y, TDirection _dir )
00381 {
00382         return ( XEta( _x, _y, _dir )*XEta( _x, _y, _dir ) + 
00383                      YEta( _x, _y, _dir )*YEta( _x, _y, _dir ) ); 
00384 }
00385   
00386 inline double IMetric::Alpha( const IPoint &_p, TDirection _dir )
00387 {
00388         return Alpha( _p.x, _p.y, _dir ); 
00389 }
00390 
00391 inline double IMetric::Beta( const IPoint &_p, TDirection _dir ) 
00392 { 
00393     return ( XKsi( _p, _dir )*XEta( _p, _dir ) + 
00394                      YKsi( _p, _dir )*YEta( _p, _dir ) );
00395 }
00396 
00397 inline double IMetric::Beta( int _x, int _y, TDirection _dir ) 
00398 { 
00399     return ( XKsi( _x, _y, _dir )*XEta( _x, _y, _dir ) + 
00400                      YKsi( _x, _y, _dir )*YEta( _x, _y, _dir ) );
00401 }
00402 
00403 inline double IMetric::Gamma( const IPoint &_p, TDirection _dir )
00404 { 
00405     return ( XKsi( _p, _dir )*XKsi( _p, _dir ) + 
00406                      YKsi( _p, _dir )*YKsi( _p, _dir ) ); 
00407 }
00408 
00409 inline double IMetric::Gamma( int _x, int _y,   TDirection _dir )
00410 { 
00411     return ( XKsi( _x, _y, _dir )*XKsi( _x, _y, _dir ) + 
00412                      YKsi( _x, _y, _dir )*YKsi( _x, _y, _dir ) ); 
00413 }
00414 
00415 inline double IMetric::FaceLengthKsi( const IPoint &_p, TDirection _dir )
00416 {
00417         return sqrt( Gamma( _p, _dir ) ); 
00418 }
00419 
00420 inline double IMetric::FaceLengthKsi( int _x, int _y, TDirection _dir )
00421 {
00422         return sqrt( Gamma( _x, _y, _dir ) ); 
00423 }
00424 
00425 inline double IMetric::FaceLengthEta( const IPoint &_p, TDirection _dir ) 
00426 { 
00427         return sqrt( Alpha( _p, _dir ) ); 
00428 }
00429 
00430 inline double IMetric::FaceLengthEta( int _x, int _y, TDirection _dir ) 
00431 { 
00432         return sqrt( Alpha( _x, _y, _dir ) ); 
00433 }
00434   
00435 
00436 } // csfl namespace
00437 
00438 #endif// __SFL_GEOM_METRIC_METRIC_H__

 

CFD Project | Documents | Downloads | Contact us | Use Terms

 

© SINMEC/EMC/UFSC, 2001.

All rights reserved.

Last Update: Jan. 18, 2002

 Webmaster