Intrepid
http://trilinos.sandia.gov/packages/docs/r11.2/packages/intrepid/src/Discretization/Basis/Intrepid_HCURL_TET_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 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Pavel Bochev  (pbboche@sandia.gov)
00038 //                    Denis Ridzal  (dridzal@sandia.gov), or
00039 //                    Kara Peterson (kjpeter@sandia.gov)
00040 //
00041 // ************************************************************************
00042 // @HEADER
00043 
00049 namespace Intrepid {
00050 
00051 template<class Scalar, class ArrayScalar>
00052 Basis_HCURL_TET_I1_FEM<Scalar,ArrayScalar>::Basis_HCURL_TET_I1_FEM()
00053   {
00054     this -> basisCardinality_  = 6;
00055     this -> basisDegree_       = 1;
00056     this -> basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Tetrahedron<4> >() );
00057     this -> basisType_         = BASIS_FEM_DEFAULT;
00058     this -> basisCoordinates_  = COORDINATES_CARTESIAN;
00059     this -> basisTagsAreSet_   = false;
00060   }
00061   
00062 template<class Scalar, class ArrayScalar>
00063 void Basis_HCURL_TET_I1_FEM<Scalar, ArrayScalar>::initializeTags() {
00064   
00065   // Basis-dependent intializations
00066   int tagSize  = 4;        // size of DoF tag
00067   int posScDim = 0;        // position in the tag, counting from 0, of the subcell dim 
00068   int posScOrd = 1;        // position in the tag, counting from 0, of the subcell ordinal
00069   int posDfOrd = 2;        // position in the tag, counting from 0, of DoF ordinal relative to the subcell
00070 
00071   // An array with local DoF tags assigned to basis functions, in the order of their local enumeration 
00072   int tags[]  = {
00073                   1, 0, 0, 1,
00074                   1, 1, 0, 1,
00075                   1, 2, 0, 1,
00076                   1, 3, 0, 1,
00077                   1, 4, 0, 1,
00078                   1, 5, 0, 1 };
00079   
00080   // Basis-independent function sets tag and enum data in tagToOrdinal_ and ordinalToTag_ arrays:
00081   Intrepid::setOrdinalTagData(this -> tagToOrdinal_,
00082                               this -> ordinalToTag_,
00083                               tags,
00084                               this -> basisCardinality_,
00085                               tagSize,
00086                               posScDim,
00087                               posScOrd,
00088                               posDfOrd);
00089 }
00090 
00091 
00092 
00093 template<class Scalar, class ArrayScalar>
00094 void Basis_HCURL_TET_I1_FEM<Scalar, ArrayScalar>::getValues(ArrayScalar &        outputValues,
00095                                                             const ArrayScalar &  inputPoints,
00096                                                             const EOperator      operatorType) const {
00097 
00098 // Verify arguments
00099 #ifdef HAVE_INTREPID_DEBUG
00100   Intrepid::getValues_HCURL_Args<Scalar, ArrayScalar>(outputValues,
00101                                                       inputPoints,
00102                                                       operatorType,
00103                                                       this -> getBaseCellTopology(),
00104                                                       this -> getCardinality() );
00105 #endif
00106   
00107  // Number of evaluation points = dim 0 of inputPoints
00108   int dim0 = inputPoints.dimension(0);
00109 
00110   // Temporaries: (x,y,z) coordinates of the evaluation point
00111   Scalar x = 0.0;                                    
00112   Scalar y = 0.0;                                    
00113   Scalar z = 0.0;                                    
00114   
00115   switch (operatorType) {
00116     case OPERATOR_VALUE:
00117       for (int i0 = 0; i0 < dim0; i0++) {
00118         x = inputPoints(i0, 0);
00119         y = inputPoints(i0, 1);
00120         z = inputPoints(i0, 2);
00121         
00122         // outputValues is a rank-3 array with dimensions (basisCardinality_, dim0, spaceDim)
00123         outputValues(0, i0, 0) = 1.0 - y - z;
00124         outputValues(0, i0, 1) = x;
00125         outputValues(0, i0, 2) = x;
00126 
00127         outputValues(1, i0, 0) =-y;
00128         outputValues(1, i0, 1) = x;
00129         outputValues(1, i0, 2) = 0.0;
00130 
00131         outputValues(2, i0, 0) = -y;
00132         outputValues(2, i0, 1) = -1.0 + x + z;
00133         outputValues(2, i0, 2) = -y;
00134 
00135         outputValues(3, i0, 0) = z;
00136         outputValues(3, i0, 1) = z;
00137         outputValues(3, i0, 2) = 1.0 - x - y;
00138 
00139         outputValues(4, i0, 0) =-z;
00140         outputValues(4, i0, 1) = 0.0;
00141         outputValues(4, i0, 2) = x;
00142 
00143         outputValues(5, i0, 0) = 0.0;
00144         outputValues(5, i0, 1) =-z;
00145         outputValues(5, i0, 2) = y;
00146       }
00147       break;
00148       
00149     case OPERATOR_CURL:
00150       for (int i0 = 0; i0 < dim0; i0++) {
00151         x = inputPoints(i0, 0);
00152         y = inputPoints(i0, 1);
00153         z = inputPoints(i0, 2);
00154         
00155         // outputValues is a rank-3 array with dimensions (basisCardinality_, dim0, spaceDim)
00156         outputValues(0, i0, 0) = 0.0;
00157         outputValues(0, i0, 1) =-2.0;
00158         outputValues(0, i0, 2) = 2.0;
00159 
00160         outputValues(1, i0, 0) = 0.0;
00161         outputValues(1, i0, 1) = 0.0;
00162         outputValues(1, i0, 2) = 2.0;
00163 
00164         outputValues(2, i0, 0) =-2.0;
00165         outputValues(2, i0, 1) = 0.0; 
00166         outputValues(2, i0, 2) = 2.0;
00167 
00168         outputValues(3, i0, 0) =-2.0;
00169         outputValues(3, i0, 1) = 2.0;
00170         outputValues(3, i0, 2) = 0.0;
00171 
00172         outputValues(4, i0, 0) = 0.0;
00173         outputValues(4, i0, 1) =-2.0;
00174         outputValues(4, i0, 2) = 0.0;
00175 
00176         outputValues(5, i0, 0) = 2.0;
00177         outputValues(5, i0, 1) = 0.0;
00178         outputValues(5, i0, 2) = 0.0;
00179       }
00180       break;
00181       
00182     case OPERATOR_DIV:
00183        TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_DIV), std::invalid_argument,
00184                           ">>> ERROR (Basis_HCURL_TET_I1_FEM): DIV is invalid operator for HCURL Basis Functions");
00185       break;
00186       
00187     case OPERATOR_GRAD:
00188        TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_GRAD), std::invalid_argument,
00189                           ">>> ERROR (Basis_HCURL_TET_I1_FEM): GRAD is invalid operator for HCURL Basis Functions");
00190       break;
00191 
00192     case OPERATOR_D1:
00193     case OPERATOR_D2:
00194     case OPERATOR_D3:
00195     case OPERATOR_D4:
00196     case OPERATOR_D5:
00197     case OPERATOR_D6:
00198     case OPERATOR_D7:
00199     case OPERATOR_D8:
00200     case OPERATOR_D9:
00201     case OPERATOR_D10:
00202       TEUCHOS_TEST_FOR_EXCEPTION( ( (operatorType == OPERATOR_D1)    ||
00203                             (operatorType == OPERATOR_D2)    ||
00204                             (operatorType == OPERATOR_D3)    ||
00205                             (operatorType == OPERATOR_D4)    ||
00206                             (operatorType == OPERATOR_D5)    ||
00207                             (operatorType == OPERATOR_D6)    ||
00208                             (operatorType == OPERATOR_D7)    ||
00209                             (operatorType == OPERATOR_D8)    ||
00210                             (operatorType == OPERATOR_D9)    ||
00211                             (operatorType == OPERATOR_D10) ),
00212                           std::invalid_argument,
00213                           ">>> ERROR (Basis_HCURL_TET_I1_FEM): Invalid operator type");
00214       break;
00215 
00216     default:
00217       TEUCHOS_TEST_FOR_EXCEPTION( ( (operatorType != OPERATOR_VALUE) &&
00218                             (operatorType != OPERATOR_GRAD)  &&
00219                             (operatorType != OPERATOR_CURL)  &&
00220                             (operatorType != OPERATOR_DIV)   &&
00221                             (operatorType != OPERATOR_D1)    &&
00222                             (operatorType != OPERATOR_D2)    &&
00223                             (operatorType != OPERATOR_D3)    &&
00224                             (operatorType != OPERATOR_D4)    &&
00225                             (operatorType != OPERATOR_D5)    &&
00226                             (operatorType != OPERATOR_D6)    &&
00227                             (operatorType != OPERATOR_D7)    &&
00228                             (operatorType != OPERATOR_D8)    &&
00229                             (operatorType != OPERATOR_D9)    &&
00230                             (operatorType != OPERATOR_D10) ),
00231                           std::invalid_argument,
00232                           ">>> ERROR (Basis_HCURL_TET_I1_FEM): Invalid operator type");
00233   }
00234 }
00235 
00236 
00237   
00238 template<class Scalar, class ArrayScalar>
00239 void Basis_HCURL_TET_I1_FEM<Scalar, ArrayScalar>::getValues(ArrayScalar&           outputValues,
00240                                                             const ArrayScalar &    inputPoints,
00241                                                             const ArrayScalar &    cellVertices,
00242                                                             const EOperator        operatorType) const {
00243   TEUCHOS_TEST_FOR_EXCEPTION( (true), std::logic_error,
00244                       ">>> ERROR (Basis_HCURL_TET_I1_FEM): FEM Basis calling an FVD member function");
00245                                                              }
00246 
00247 }// namespace Intrepid