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 |
|