|
Intrepid
|
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 00036 #ifndef INTREPID_ARRAYTOOLS_HPP 00037 #define INTREPID_ARRAYTOOLS_HPP 00038 00039 #include "Intrepid_ConfigDefs.hpp" 00040 #include "Intrepid_Types.hpp" 00041 #include "Teuchos_BLAS.hpp" 00042 #include "Teuchos_TestForException.hpp" 00043 00044 namespace Intrepid { 00045 00051 class ArrayTools { 00052 public: 00053 00074 template<class Scalar, class ArrayOutFields, class ArrayInFieldsLeft, class ArrayInFieldsRight> 00075 static void contractFieldFieldScalar(ArrayOutFields & outputFields, 00076 const ArrayInFieldsLeft & leftFields, 00077 const ArrayInFieldsRight & rightFields, 00078 const ECompEngine compEngine, 00079 const bool sumInto = false); 00080 00081 00103 template<class Scalar, class ArrayOutFields, class ArrayInFieldsLeft, class ArrayInFieldsRight> 00104 static void contractFieldFieldVector(ArrayOutFields & outputFields, 00105 const ArrayInFieldsLeft & leftFields, 00106 const ArrayInFieldsRight & rightFields, 00107 const ECompEngine compEngine, 00108 const bool sumInto = false); 00109 00110 00133 template<class Scalar, class ArrayOutFields, class ArrayInFieldsLeft, class ArrayInFieldsRight> 00134 static void contractFieldFieldTensor(ArrayOutFields & outputFields, 00135 const ArrayInFieldsLeft & leftFields, 00136 const ArrayInFieldsRight & rightFields, 00137 const ECompEngine compEngine, 00138 const bool sumInto = false); 00139 00140 00159 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields> 00160 static void contractDataFieldScalar(ArrayOutFields & outputFields, 00161 const ArrayInData & inputData, 00162 const ArrayInFields & inputFields, 00163 const ECompEngine compEngine, 00164 const bool sumInto = false); 00165 00166 00186 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields> 00187 static void contractDataFieldVector(ArrayOutFields & outputFields, 00188 const ArrayInData & inputData, 00189 const ArrayInFields & inputFields, 00190 const ECompEngine compEngine, 00191 const bool sumInto = false); 00192 00193 00214 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields> 00215 static void contractDataFieldTensor(ArrayOutFields & outputFields, 00216 const ArrayInData & inputData, 00217 const ArrayInFields & inputFields, 00218 const ECompEngine compEngine, 00219 const bool sumInto = false); 00220 00221 00238 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight> 00239 static void contractDataDataScalar(ArrayOutData & outputData, 00240 const ArrayInDataLeft & inputDataLeft, 00241 const ArrayInDataRight & inputDataRight, 00242 const ECompEngine compEngine, 00243 const bool sumInto = false); 00244 00245 00262 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight> 00263 static void contractDataDataVector(ArrayOutData & outputData, 00264 const ArrayInDataLeft & inputDataLeft, 00265 const ArrayInDataRight & inputDataRight, 00266 const ECompEngine compEngine, 00267 const bool sumInto = false); 00268 00269 00287 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight> 00288 static void contractDataDataTensor(ArrayOutData & outputData, 00289 const ArrayInDataLeft & inputDataLeft, 00290 const ArrayInDataRight & inputDataRight, 00291 const ECompEngine compEngine, 00292 const bool sumInto = false); 00293 00294 00324 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields> 00325 static void scalarMultiplyDataField(ArrayOutFields & outputFields, 00326 const ArrayInData & inputData, 00327 ArrayInFields & inputFields, 00328 const bool reciprocal = false); 00329 00330 00359 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight> 00360 static void scalarMultiplyDataData(ArrayOutData & outputData, 00361 ArrayInDataLeft & inputDataLeft, 00362 ArrayInDataRight & inputDataRight, 00363 const bool reciprocal = false); 00364 00365 00393 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields> 00394 static void dotMultiplyDataField(ArrayOutFields & outputFields, 00395 const ArrayInData & inputData, 00396 const ArrayInFields & inputFields); 00397 00398 00425 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight> 00426 static void dotMultiplyDataData(ArrayOutData & outputData, 00427 const ArrayInDataLeft & inputDataLeft, 00428 const ArrayInDataRight & inputDataRight); 00429 00430 00452 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields> 00453 static void crossProductDataField(ArrayOutFields & outputFields, 00454 const ArrayInData & inputData, 00455 const ArrayInFields & inputFields); 00456 00457 00478 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight> 00479 static void crossProductDataData(ArrayOutData & outputData, 00480 const ArrayInDataLeft & inputDataLeft, 00481 const ArrayInDataRight & inputDataRight); 00482 00483 00506 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields> 00507 static void outerProductDataField(ArrayOutFields & outputFields, 00508 const ArrayInData & inputData, 00509 const ArrayInFields & inputFields); 00510 00511 00533 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight> 00534 static void outerProductDataData(ArrayOutData & outputData, 00535 const ArrayInDataLeft & inputDataLeft, 00536 const ArrayInDataRight & inputDataRight); 00537 00538 00574 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields> 00575 static void matvecProductDataField(ArrayOutFields & outputFields, 00576 const ArrayInData & inputData, 00577 const ArrayInFields & inputFields, 00578 const char transpose = 'N'); 00579 00580 00581 00614 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight> 00615 static void matvecProductDataData(ArrayOutData & outputData, 00616 const ArrayInDataLeft & inputDataLeft, 00617 const ArrayInDataRight & inputDataRight, 00618 const char transpose = 'N'); 00619 00620 00621 00656 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields> 00657 static void matmatProductDataField(ArrayOutFields & outputFields, 00658 const ArrayInData & inputData, 00659 const ArrayInFields & inputFields, 00660 const char transpose = 'N'); 00661 00662 00663 00697 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight> 00698 static void matmatProductDataData(ArrayOutData & outputData, 00699 const ArrayInDataLeft & inputDataLeft, 00700 const ArrayInDataRight & inputDataRight, 00701 const char transpose = 'N'); 00702 00703 00704 00721 template<class Scalar, class ArrayOutFields, class ArrayInFields> 00722 static void cloneFields(ArrayOutFields & outputFields, 00723 const ArrayInFields & inputFields); 00724 00725 00744 template<class Scalar, class ArrayOutFields, class ArrayInFactors, class ArrayInFields> 00745 static void cloneScaleFields(ArrayOutFields & outputFields, 00746 const ArrayInFactors & inputFactors, 00747 const ArrayInFields & inputFields); 00748 00749 00765 template<class Scalar, class ArrayInOutFields, class ArrayInFactors> 00766 static void scaleFields(ArrayInOutFields & inoutFields, 00767 const ArrayInFactors & inputFactors); 00768 00769 00770 }; // end class ArrayTools 00771 00772 } // end namespace Intrepid 00773 00774 // include templated definitions 00775 #include <Intrepid_ArrayToolsDefContractions.hpp> 00776 #include <Intrepid_ArrayToolsDefScalar.hpp> 00777 #include <Intrepid_ArrayToolsDefDot.hpp> 00778 #include <Intrepid_ArrayToolsDefTensor.hpp> 00779 #include <Intrepid_ArrayToolsDefCloneScale.hpp> 00780 00781 #endif
1.7.4