Intrepid
/usr/src/RPM/BUILD/trilinos10-10.6.4/packages/intrepid/src/Shared/Intrepid_Types.hpp
Go to the documentation of this file.
00001 // @HEADER
00002 // ************************************************************************
00003 //
00004 //                           Intrepid Package
00005 //                 Copyright (2007) Sandia Corporation
00006 //
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 //
00010 // This library is free software; you can redistribute it and/or modify
00011 // it under the terms of the GNU Lesser General Public License as
00012 // published by the Free Software Foundation; either version 2.1 of the
00013 // License, or (at your option) any later version.
00014 //
00015 // This library is distributed in the hope that it will be useful, but
00016 // WITHOUT ANY WARRANTY; without even the implied warranty of
00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018 // Lesser General Public License for more details.
00019 //
00020 // You should have received a copy of the GNU Lesser General Public
00021 // License along with this library; if not, write to the Free Software
00022 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00023 // USA
00024 // Questions? Contact Pavel Bochev (pbboche@sandia.gov) or
00025 //                    Denis Ridzal (dridzal@sandia.gov).
00026 //
00027 // ************************************************************************
00028 // @HEADER
00029 
00035 #ifndef INTREPID_INTREPID_TYPES_HPP
00036 #define INTREPID_INTREPID_TYPES_HPP
00037 
00038 #ifdef  HAVE_INTREPID_DEBUG
00039 #define INTREPID_VALIDATE( A )  A
00040 #else
00041 #define INTREPID_VALIDATE( A ) /* empty */
00042 #endif
00043 
00044 #include <Teuchos_ScalarTraits.hpp>
00045 
00049 #define INTREPID_MAX_ORDER 10
00050 
00054 #define INTREPID_MAX_INTEGRATION_POINTS 1001
00055 
00060 #define INTREPID_MAX_CUBATURE_DEGREE_EDGE 61
00061 
00066 #define INTREPID_MAX_CUBATURE_DEGREE_TRI 20
00067 
00072 #define INTREPID_MAX_CUBATURE_DEGREE_TET 20
00073 
00078 #define INTREPID_MAX_CUBATURE_DEGREE_PYRAMID 4
00079 
00083 #define INTREPID_MAX_DIMENSION 3
00084 
00089 #define INTREPID_MAX_NEWTON 15
00090 
00094 #define INTREPID_MAX_DERIVATIVE 10
00095 
00096 namespace Intrepid {
00097   
00100   static const double INTREPID_EPSILON   = std::abs(Teuchos::ScalarTraits<double>::eps());
00101     
00104   static const double INTREPID_THRESHOLD = 10.0 * INTREPID_EPSILON;
00105   
00108   static const double INTREPID_TOL       = 10.0* INTREPID_THRESHOLD;
00109   
00113   enum ECoordinates{
00114     COORDINATES_CARTESIAN=0,
00115     COORDINATES_POLAR,
00116     COORDINATES_CYLINDRICAL,
00117     COORDINATES_SPHERICAL,
00118     COORDINATES_MAX
00119   };
00120 
00121   inline std::string ECoordinatesToString(ECoordinates coords) {
00122     std::string retString;
00123     switch(coords) {
00124       case COORDINATES_CARTESIAN:   retString = "Cartesian";            break;
00125       case COORDINATES_POLAR:       retString = "Polar";                break;
00126       case COORDINATES_CYLINDRICAL: retString = "Cylindrical";          break;
00127       case COORDINATES_SPHERICAL:   retString = "Spherical";            break;
00128       case COORDINATES_MAX:         retString = "Max. Coordinates";     break;
00129       default:                      retString = "INVALID ECoordinates";
00130     }
00131     return retString;
00132   }
00133 
00139   inline int isValidCoordinate(ECoordinates coordinateType){
00140     return( ( coordinateType == COORDINATES_CARTESIAN)   ||
00141             ( coordinateType == COORDINATES_POLAR)       ||
00142             ( coordinateType == COORDINATES_CYLINDRICAL) ||
00143             ( coordinateType == COORDINATES_SPHERICAL) );
00144   }
00145   
00146   
00147   
00151   enum ENorm{
00152     NORM_ONE = 0,
00153     NORM_TWO,
00154     NORM_INF,
00155     NORM_FRO,    // Frobenius matrix norm
00156     NORM_MAX
00157   };
00158 
00159   inline std::string ENormToString(ENorm norm) {
00160     std::string retString;
00161     switch(norm) {
00162       case NORM_ONE:   retString = "1-Norm";         break;
00163       case NORM_TWO:   retString = "2-Norm";         break;
00164       case NORM_INF:   retString = "Infinity Norm";  break;
00165       case NORM_FRO:   retString = "Frobenius Norm"; break;
00166       case NORM_MAX:   retString = "Max. Norm";      break;
00167       default:         retString = "INVALID ENorm";
00168     }
00169     return retString;
00170   }
00171   
00177   inline int isValidNorm(ENorm normType){
00178     return( (normType == NORM_ONE) ||
00179             (normType == NORM_TWO) ||
00180             (normType == NORM_INF) ||
00181             (normType == NORM_FRO) ||
00182             (normType == NORM_MAX) );
00183   }
00184 
00185 
00186   
00192   enum EOperator{
00193     OPERATOR_VALUE = 0,
00194     OPERATOR_GRAD,      // 1
00195     OPERATOR_CURL,      // 2
00196     OPERATOR_DIV,       // 3
00197     OPERATOR_D1,        // 4
00198     OPERATOR_D2,        // 5
00199     OPERATOR_D3,        // 6
00200     OPERATOR_D4,        // 7
00201     OPERATOR_D5,        // 8
00202     OPERATOR_D6,        // 9
00203     OPERATOR_D7,        // 10
00204     OPERATOR_D8,        // 11
00205     OPERATOR_D9,        // 12
00206     OPERATOR_D10,       // 13
00207     OPERATOR_MAX        // 14
00208   };
00209   
00210   inline std::string EOperatorToString(EOperator op) {
00211     std::string retString;
00212     switch(op) {
00213       case OPERATOR_VALUE: retString = "Value";         break;
00214       case OPERATOR_GRAD:  retString = "Grad";          break;
00215       case OPERATOR_CURL:  retString = "Curl";          break;
00216       case OPERATOR_DIV:   retString = "Div";           break;
00217       case OPERATOR_D1:    retString = "D1";            break;
00218       case OPERATOR_D2:    retString = "D2";            break;
00219       case OPERATOR_D3:    retString = "D3";            break;
00220       case OPERATOR_D4:    retString = "D4";            break;
00221       case OPERATOR_D5:    retString = "D5";            break;
00222       case OPERATOR_D6:    retString = "D6";            break;
00223       case OPERATOR_D7:    retString = "D7";            break;
00224       case OPERATOR_D8:    retString = "D8";            break;
00225       case OPERATOR_D9:    retString = "D9";            break;
00226       case OPERATOR_D10:   retString = "D10";           break;
00227       case OPERATOR_MAX:   retString = "Max. Operator"; break;
00228       default:             retString = "INVALID EOperator";
00229     }
00230     return retString;
00231   }
00232   
00233   inline EOperator & operator++(EOperator &type) {
00234     return type = static_cast<EOperator>(type+1);
00235   }
00236     
00237   inline EOperator operator++(EOperator &type, int) {
00238     EOperator oldval = type;
00239     ++type;
00240     return oldval;
00241   }
00242    
00243   inline EOperator & operator--(EOperator &type) {
00244     return type = static_cast<EOperator>(type-1);
00245   }
00246     
00247   inline EOperator operator--(EOperator &type, int) {
00248     EOperator oldval = type;
00249     --type;
00250     return oldval;
00251   }
00252 
00258   inline int isValidOperator(const EOperator operatorType){
00259     return ( (operatorType == OPERATOR_VALUE) ||
00260              (operatorType == OPERATOR_GRAD)  || 
00261              (operatorType == OPERATOR_CURL)  || 
00262              (operatorType == OPERATOR_DIV)   ||
00263              (operatorType == OPERATOR_D1)    || 
00264              (operatorType == OPERATOR_D2)    || 
00265              (operatorType == OPERATOR_D3)    || 
00266              (operatorType == OPERATOR_D4)    || 
00267              (operatorType == OPERATOR_D5)    || 
00268              (operatorType == OPERATOR_D6)    || 
00269              (operatorType == OPERATOR_D7)    || 
00270              (operatorType == OPERATOR_D8)    || 
00271              (operatorType == OPERATOR_D9)    || 
00272              (operatorType == OPERATOR_D10) );
00273   }
00274   
00275   
00279   enum EFunctionSpace
00280     {
00281       FUNCTION_SPACE_HGRAD = 0,
00282       FUNCTION_SPACE_HCURL,
00283       FUNCTION_SPACE_HDIV,
00284       FUNCTION_SPACE_HVOL,
00285       FUNCTION_SPACE_VECTOR_HGRAD,
00286       FUNCTION_SPACE_TENSOR_HGRAD,
00287       FUNCTION_SPACE_MAX
00288     };
00289   
00290   inline std::string EFunctionSpaceToString(EFunctionSpace space) {
00291     std::string retString;
00292     switch(space) {
00293       case FUNCTION_SPACE_HGRAD:        retString = "H(grad)";     break;
00294       case FUNCTION_SPACE_HCURL:        retString = "H(curl)";     break;
00295       case FUNCTION_SPACE_HDIV:         retString = "H(div)";     break;
00296       case FUNCTION_SPACE_HVOL:         retString = "H(vol)";     break;
00297       case FUNCTION_SPACE_VECTOR_HGRAD: retString = "Vector H(grad)";     break;
00298       case FUNCTION_SPACE_TENSOR_HGRAD: retString = "Tensor H(grad)";     break;
00299       case FUNCTION_SPACE_MAX:          retString = "Max. Function space"; break;
00300       default:                          retString = "INVALID EFunctionSpace";
00301     }
00302     return retString;
00303   }
00304   
00310   inline int isValidFunctionSpace(const EFunctionSpace spaceType){
00311     return ( (spaceType == FUNCTION_SPACE_HGRAD) ||
00312              (spaceType == FUNCTION_SPACE_HCURL) || 
00313              (spaceType == FUNCTION_SPACE_HDIV)  ||
00314              (spaceType == FUNCTION_SPACE_HVOL)  ||
00315              (spaceType == FUNCTION_SPACE_VECTOR_HGRAD) || 
00316              (spaceType == FUNCTION_SPACE_TENSOR_HGRAD) );
00317   }
00318   
00319   
00320   
00329   enum EDiscreteSpace
00330     {
00331       DISCRETE_SPACE_COMPLETE = 0,        // value = 0
00332       DISCRETE_SPACE_INCOMPLETE,          // value = 1
00333       DISCRETE_SPACE_BROKEN,              // value = 2
00334       DISCRETE_SPACE_MAX                  // value = 3
00335     };
00336   
00337   inline std::string EDiscreteSpaceToString(EDiscreteSpace space) {
00338     std::string retString;
00339     switch(space) {
00340       case DISCRETE_SPACE_COMPLETE:   retString = "Complete";        break;
00341       case DISCRETE_SPACE_INCOMPLETE: retString = "Incomplete";      break;
00342       case DISCRETE_SPACE_BROKEN:     retString = "Broken";          break;
00343       case DISCRETE_SPACE_MAX:        retString = "Max. Rec. Space"; break;
00344       default:                              retString = "INVALID EDiscreteSpace";
00345     }
00346     return retString;
00347   }
00348   
00354   inline int isValidDiscreteSpace(const EDiscreteSpace spaceType){
00355     return ( (spaceType == DISCRETE_SPACE_COMPLETE) ||
00356              (spaceType == DISCRETE_SPACE_INCOMPLETE) || 
00357              (spaceType ==DISCRETE_SPACE_BROKEN) );
00358   }
00359 
00363   enum EPointType
00364     {
00365       POINTTYPE_EQUISPACED = 0,             // value = 0
00366       POINTTYPE_SPECTRAL,
00367       POINTTYPE_SPECTRAL_OPEN,
00368       POINTTYPE_WARPBLEND 
00369     };
00370   
00371   inline std::string EPointTypeToString(EPointType pointType) {
00372     std::string retString;
00373     switch (pointType) {
00374     case POINTTYPE_EQUISPACED:
00375       retString = "Equispaced Points";
00376       break;
00377     case POINTTYPE_WARPBLEND:
00378       retString = "WarpBlend Points";
00379       break;
00380     case POINTTYPE_SPECTRAL:
00381       retString = "Spectral Points";
00382       break;
00383     case POINTTYPE_SPECTRAL_OPEN:
00384       retString = "Open Spectral Points";
00385       break;
00386     }
00387     return retString;
00388   }
00389   
00395   inline int isValidPointType( const EPointType pointType ) {
00396     return ( (pointType == POINTTYPE_EQUISPACED ) ||
00397            (pointType == POINTTYPE_WARPBLEND ) );
00398   }
00399 
00403   enum EBasis
00404     {
00405       BASIS_FEM_DEFAULT = 0,                // value = 0
00406       BASIS_FEM_HIERARCHICAL,               // value = 1  
00407       BASIS_FEM_FIAT,                       // value = 2
00408       BASIS_FVD_DEFAULT,                    // value = 3
00409       BASIS_FVD_COVOLUME,                   // value = 4
00410       BASIS_FVD_MIMETIC,                    // value = 5
00411       BASIS_MAX                             // value = 6
00412     };
00413   
00414   inline std::string EBasisToString(EBasis basis) {
00415     std::string retString;
00416     switch(basis) {
00417       case BASIS_FEM_DEFAULT:      retString = "FEM Default";        break;
00418       case BASIS_FEM_HIERARCHICAL: retString = "FEM Hierarchical";   break;
00419       case BASIS_FEM_FIAT:         retString = "FEM FIAT";           break;
00420       case BASIS_FVD_DEFAULT:      retString = "FVD Default";        break;
00421       case BASIS_FVD_COVOLUME:     retString = "FVD Covolume";       break;
00422       case BASIS_FVD_MIMETIC:      retString = "FVD Mimetic";        break;
00423       case BASIS_MAX:              retString = "Max. Basis";         break;
00424       default:                     retString = "INVALID EBasis";
00425     }
00426     return retString;
00427   }
00428   
00434   inline int isValidBasis(const EBasis basisType){
00435     return ( (basisType == BASIS_FEM_DEFAULT) ||
00436              (basisType == BASIS_FEM_HIERARCHICAL) ||
00437              (basisType == BASIS_FEM_FIAT) ||
00438              (basisType == BASIS_FVD_DEFAULT) ||
00439              (basisType == BASIS_FVD_COVOLUME) ||
00440              (basisType == BASIS_FVD_MIMETIC) );
00441   }
00442 
00443   
00492   struct CubatureTemplate {
00493 
00496     int               numPoints_;
00497     
00500     double            points_[INTREPID_MAX_INTEGRATION_POINTS][INTREPID_MAX_DIMENSION];
00501     
00504     double            weights_[INTREPID_MAX_INTEGRATION_POINTS];
00505     
00506   };
00507 
00508 
00509 
00514   enum ECompEngine
00515   {
00516     COMP_CPP = 0,             
00517     COMP_BLAS,
00518     COMP_ENGINE_MAX
00519   };
00520 
00521   inline std::string ECompEngineToString(ECompEngine cEngine) {
00522     std::string retString;
00523     switch(cEngine) {
00524       case COMP_CPP:             retString = "Native C++";           break;
00525       case COMP_BLAS:            retString = "BLAS";                 break;
00526       case COMP_ENGINE_MAX:      retString = "Max. Comp. Engine";    break;
00527       default:                   retString = "INVALID ECompEngine";
00528     }
00529     return retString;
00530   }
00531   
00532   inline ECompEngine & operator++(ECompEngine &type) {
00533     return type = static_cast<ECompEngine>(type+1);
00534   }
00535 
00536   inline ECompEngine operator++(ECompEngine &type, int) {
00537     ECompEngine oldval = type;
00538     ++type;
00539     return oldval;
00540   }
00541 
00542   inline ECompEngine & operator--(ECompEngine &type) {
00543     return type = static_cast<ECompEngine>(type-1);
00544   }
00545 
00546   inline ECompEngine operator--(ECompEngine &type, int) {
00547     ECompEngine oldval = type;
00548     --type;
00549     return oldval;
00550   }
00551   
00552   
00558   inline int isValidCompEngine(const ECompEngine compEngType){
00559     return ( (compEngType == COMP_CPP) ||
00560              (compEngType == COMP_BLAS) );
00561   }
00562 
00563 } //namespace Intrepid
00564 
00720 #endif