Intrepid
/usr/src/RPM/BUILD/trilinos10-10.6.4/packages/intrepid/src/Discretization/Basis/Intrepid_HDIV_HEX_I1_FEMDef.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 //                    Kara Peterson (kjpeter@sandia.gov).
00027 //
00028 // ************************************************************************
00029 // @HEADER
00030 
00036 namespace Intrepid {
00037 
00038 template<class Scalar, class ArrayScalar>
00039 Basis_HDIV_HEX_I1_FEM<Scalar,ArrayScalar>::Basis_HDIV_HEX_I1_FEM()
00040   {
00041     this -> basisCardinality_  = 6;
00042     this -> basisDegree_       = 1;
00043     this -> basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Hexahedron<8> >() );
00044     this -> basisType_         = BASIS_FEM_DEFAULT;
00045     this -> basisCoordinates_  = COORDINATES_CARTESIAN;
00046     this -> basisTagsAreSet_   = false;
00047   }
00048   
00049 template<class Scalar, class ArrayScalar>
00050 void Basis_HDIV_HEX_I1_FEM<Scalar, ArrayScalar>::initializeTags() {
00051   
00052   // Basis-dependent intializations
00053   int tagSize  = 4;        // size of DoF tag
00054   int posScDim = 0;        // position in the tag, counting from 0, of the subcell dim 
00055   int posScOrd = 1;        // position in the tag, counting from 0, of the subcell ordinal
00056   int posDfOrd = 2;        // position in the tag, counting from 0, of DoF ordinal relative to the subcell
00057 
00058   // An array with local DoF tags assigned to basis functions, in the order of their local enumeration 
00059   int tags[]  = {
00060                   2, 0, 0, 1,
00061                   2, 1, 0, 1,
00062                   2, 2, 0, 1,
00063                   2, 3, 0, 1,
00064                   2, 4, 0, 1,
00065                   2, 5, 0, 1,
00066                 };
00067   
00068   // Basis-independent function sets tag and enum data in tagToOrdinal_ and ordinalToTag_ arrays:
00069   Intrepid::setOrdinalTagData(this -> tagToOrdinal_,
00070                               this -> ordinalToTag_,
00071                               tags,
00072                               this -> basisCardinality_,
00073                               tagSize,
00074                               posScDim,
00075                               posScOrd,
00076                               posDfOrd);
00077 }
00078 
00079 
00080 
00081 template<class Scalar, class ArrayScalar>
00082 void Basis_HDIV_HEX_I1_FEM<Scalar, ArrayScalar>::getValues(ArrayScalar &        outputValues,
00083                                                            const ArrayScalar &  inputPoints,
00084                                                            const EOperator      operatorType) const {
00085   
00086 // Verify arguments
00087 #ifdef HAVE_INTREPID_DEBUG
00088   Intrepid::getValues_HDIV_Args<Scalar, ArrayScalar>(outputValues,
00089                                                       inputPoints,
00090                                                       operatorType,
00091                                                       this -> getBaseCellTopology(),
00092                                                       this -> getCardinality() );
00093 #endif
00094   
00095  // Number of evaluation points = dim 0 of inputPoints
00096   int dim0 = inputPoints.dimension(0);
00097 
00098   // Temporaries: (x,y,z) coordinates of the evaluation point
00099   Scalar x = 0.0;                                    
00100   Scalar y = 0.0;                                    
00101   Scalar z = 0.0;                                    
00102   
00103   switch (operatorType) {
00104     case OPERATOR_VALUE:
00105       for (int i0 = 0; i0 < dim0; i0++) {
00106         x = inputPoints(i0, 0);
00107         y = inputPoints(i0, 1);
00108         z = inputPoints(i0, 2);
00109         
00110         // outputValues is a rank-3 array with dimensions (basisCardinality_, dim0, spaceDim)
00111         outputValues(0, i0, 0) = 0.0;
00112         outputValues(0, i0, 1) = (y - 1.0)/8.0;
00113         outputValues(0, i0, 2) = 0.0;
00114 
00115         outputValues(1, i0, 0) = (1.0 + x)/8.0;
00116         outputValues(1, i0, 1) = 0.0; 
00117         outputValues(1, i0, 2) = 0.0;
00118 
00119         outputValues(2, i0, 0) = 0.0;
00120         outputValues(2, i0, 1) = (1.0 + y)/8.0;
00121         outputValues(2, i0, 2) = 0.0;
00122 
00123         outputValues(3, i0, 0) = (x - 1.0)/8.0;
00124         outputValues(3, i0, 1) = 0.0;
00125         outputValues(3, i0, 2) = 0.0;
00126 
00127         outputValues(4, i0, 0) = 0.0;
00128         outputValues(4, i0, 1) = 0.0;
00129         outputValues(4, i0, 2) = (z - 1.0)/8.0;
00130 
00131         outputValues(5, i0, 0) = 0.0;
00132         outputValues(5, i0, 1) = 0.0;
00133         outputValues(5, i0, 2) = (1.0 + z)/8.0;
00134       }
00135       break;
00136 
00137     case OPERATOR_DIV:
00138       // outputValues is a rank-2 array with dimensions (basisCardinality_, dim0)
00139       for (int i0 = 0; i0 < dim0; i0++) {
00140          outputValues(0, i0) = 0.125;
00141          outputValues(1, i0) = 0.125;
00142          outputValues(2, i0) = 0.125;
00143          outputValues(3, i0) = 0.125;
00144          outputValues(4, i0) = 0.125;
00145          outputValues(5, i0) = 0.125;
00146        }
00147       break;
00148 
00149     case OPERATOR_CURL:
00150        TEST_FOR_EXCEPTION( (operatorType == OPERATOR_CURL), std::invalid_argument,
00151                           ">>> ERROR (Basis_HDIV_HEX_I1_FEM): CURL is invalid operator for HDIV Basis Functions");
00152       break;
00153       
00154     case OPERATOR_GRAD:
00155        TEST_FOR_EXCEPTION( (operatorType == OPERATOR_GRAD), std::invalid_argument,
00156                           ">>> ERROR (Basis_HDIV_HEX_I1_FEM): GRAD is invalid operator for HDIV Basis Functions");
00157       break;
00158 
00159     case OPERATOR_D1:
00160     case OPERATOR_D2:
00161     case OPERATOR_D3:
00162     case OPERATOR_D4:
00163     case OPERATOR_D5:
00164     case OPERATOR_D6:
00165     case OPERATOR_D7:
00166     case OPERATOR_D8:
00167     case OPERATOR_D9:
00168     case OPERATOR_D10:
00169       TEST_FOR_EXCEPTION( ( (operatorType == OPERATOR_D1)    ||
00170                             (operatorType == OPERATOR_D2)    ||
00171                             (operatorType == OPERATOR_D3)    ||
00172                             (operatorType == OPERATOR_D4)    ||
00173                             (operatorType == OPERATOR_D5)    ||
00174                             (operatorType == OPERATOR_D6)    ||
00175                             (operatorType == OPERATOR_D7)    ||
00176                             (operatorType == OPERATOR_D8)    ||
00177                             (operatorType == OPERATOR_D9)    ||
00178                             (operatorType == OPERATOR_D10) ),
00179                           std::invalid_argument,
00180                           ">>> ERROR (Basis_HDIV_HEX_I1_FEM): Invalid operator type");
00181       break;
00182       
00183     default:
00184       TEST_FOR_EXCEPTION( ( (operatorType != OPERATOR_VALUE) &&
00185                             (operatorType != OPERATOR_GRAD)  &&
00186                             (operatorType != OPERATOR_CURL)  &&
00187                             (operatorType != OPERATOR_DIV)   &&
00188                             (operatorType != OPERATOR_D1)    &&
00189                             (operatorType != OPERATOR_D2)    &&
00190                             (operatorType != OPERATOR_D3)    &&
00191                             (operatorType != OPERATOR_D4)    &&
00192                             (operatorType != OPERATOR_D5)    &&
00193                             (operatorType != OPERATOR_D6)    &&
00194                             (operatorType != OPERATOR_D7)    &&
00195                             (operatorType != OPERATOR_D8)    &&
00196                             (operatorType != OPERATOR_D9)    &&
00197                             (operatorType != OPERATOR_D10) ),
00198                           std::invalid_argument,
00199                           ">>> ERROR (Basis_HDIV_HEX_I1_FEM): Invalid operator type");
00200   }
00201 }
00202 
00203 
00204   
00205 template<class Scalar, class ArrayScalar>
00206 void Basis_HDIV_HEX_I1_FEM<Scalar, ArrayScalar>::getValues(ArrayScalar&           outputValues,
00207                                                            const ArrayScalar &    inputPoints,
00208                                                            const ArrayScalar &    cellVertices,
00209                                                            const EOperator        operatorType) const {
00210   TEST_FOR_EXCEPTION( (true), std::logic_error,
00211                       ">>> ERROR (Basis_HDIV_HEX_I1_FEM): FEM Basis calling an FVD member function");
00212 }
00213 
00214 }// namespace Intrepid