Intrepid
Intrepid_FunctionSpaceTools.hpp
Go to the documentation of this file.
1// @HEADER
2// ************************************************************************
3//
4// Intrepid Package
5// Copyright (2007) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Pavel Bochev (pbboche@sandia.gov)
38// Denis Ridzal (dridzal@sandia.gov), or
39// Kara Peterson (kjpeter@sandia.gov)
40//
41// ************************************************************************
42// @HEADER
43
48
49#ifndef INTREPID_FUNCTIONSPACETOOLS_HPP
50#define INTREPID_FUNCTIONSPACETOOLS_HPP
51
52#include "Intrepid_ConfigDefs.hpp"
57
58#include <Intrepid_Rank.hpp>
59
60
61namespace Intrepid {
62
70 public:
106 template<class Scalar, class ArrayTypeOut, class ArrayTypeIn>
107 static void HGRADtransformVALUE(ArrayTypeOut & outVals,
108 const ArrayTypeIn & inVals);
109/*
110 template<class Scalar, class ArrayTypeOut, class ArrayTypeIn>
111 static void HGRADtransformVALUETemp(ArrayTypeOut & outVals,
112 const ArrayTypeIn & inVals);*/
149 template<class Scalar, class ArrayTypeOut, class ArrayTypeJac, class ArrayTypeIn>
150 static void HGRADtransformGRAD(ArrayTypeOut & outVals,
151 const ArrayTypeJac & jacobianInverse,
152 const ArrayTypeIn & inVals,
153 const char transpose = 'T');
154 /*
155 template<class Scalar, class ArrayTypeOut, class ArrayTypeJac, class ArrayTypeIn>
156 static void HGRADtransformGRADTemp(ArrayTypeOut & outVals,
157 const ArrayTypeJac & jacobianInverse,
158 const ArrayTypeIn & inVals,
159 const char transpose = 'T');
160*/
196 template<class Scalar, class ArrayTypeOut, class ArrayTypeJac, class ArrayTypeIn>
197 static void HCURLtransformVALUE(ArrayTypeOut & outVals,
198 const ArrayTypeJac & jacobianInverse,
199 const ArrayTypeIn & inVals,
200 const char transpose = 'T');
201 /*
202 template<class Scalar, class ArrayTypeOut, class ArrayTypeJac, class ArrayTypeIn>
203 static void HCURLtransformVALUETemp(ArrayTypeOut & outVals,
204 const ArrayTypeJac & jacobianInverse,
205 const ArrayTypeIn & inVals,
206 const char transpose = 'T');*/
244 template<class Scalar, class ArrayTypeOut, class ArrayTypeJac, class ArrayTypeDet, class ArrayTypeIn>
245 static void HCURLtransformCURL(ArrayTypeOut & outVals,
246 const ArrayTypeJac & jacobian,
247 const ArrayTypeDet & jacobianDet,
248 const ArrayTypeIn & inVals,
249 const char transpose = 'N');
250 /*
251 template<class Scalar, class ArrayTypeOut, class ArrayTypeJac, class ArrayTypeDet, class ArrayTypeIn>
252 static void HCURLtransformCURLTemp(ArrayTypeOut & outVals,
253 const ArrayTypeJac & jacobian,
254 const ArrayTypeDet & jacobianDet,
255 const ArrayTypeIn & inVals,
256 const char transpose = 'N');*/
294 template<class Scalar, class ArrayTypeOut, class ArrayTypeJac, class ArrayTypeDet, class ArrayTypeIn>
295 static void HDIVtransformVALUE(ArrayTypeOut & outVals,
296 const ArrayTypeJac & jacobian,
297 const ArrayTypeDet & jacobianDet,
298 const ArrayTypeIn & inVals,
299 const char transpose = 'N');
300 /*
301 template<class Scalar, class ArrayTypeOut, class ArrayTypeJac, class ArrayTypeDet, class ArrayTypeIn>
302 static void HDIVtransformVALUETemp(ArrayTypeOut & outVals,
303 const ArrayTypeJac & jacobian,
304 const ArrayTypeDet & jacobianDet,
305 const ArrayTypeIn & inVals,
306 const char transpose = 'N');*/
343 template<class Scalar, class ArrayTypeOut, class ArrayTypeDet, class ArrayTypeIn>
344 static void HDIVtransformDIV(ArrayTypeOut & outVals,
345 const ArrayTypeDet & jacobianDet,
346 const ArrayTypeIn & inVals);
347 /*
348 template<class Scalar, class ArrayTypeOut, class ArrayTypeDet, class ArrayTypeIn>
349 static void HDIVtransformDIVTemp(ArrayTypeOut & outVals,
350 const ArrayTypeDet & jacobianDet,
351 const ArrayTypeIn & inVals);
352*/
389 template<class Scalar, class ArrayTypeOut, class ArrayTypeDet, class ArrayTypeIn>
390 static void HVOLtransformVALUE(ArrayTypeOut & outVals,
391 const ArrayTypeDet & jacobianDet,
392 const ArrayTypeIn & inVals);
393
408 template<class Scalar>
409 static void integrate(Intrepid::FieldContainer<Scalar> & outputValues,
410 const Intrepid::FieldContainer<Scalar> & leftValues,
411 const Intrepid::FieldContainer<Scalar> & rightValues,
412 const ECompEngine compEngine,
413 const bool sumInto = false);
414
415 template<class Scalar, class ArrayOut, class ArrayInLeft, class ArrayInRight>
416 static void integrate(ArrayOut & outputValues,
417 const ArrayInLeft & leftValues,
418 const ArrayInRight & rightValues,
419 const ECompEngine compEngine,
420 const bool sumInto = false);
421
422 /* template<class Scalar, class ArrayOut, class ArrayInLeft, class ArrayInRight>
423 static void integrateTemp(ArrayOut & outputValues,
424 const ArrayInLeft & leftValues,
425 const ArrayInRight & rightValues,
426 const ECompEngine compEngine,
427 const bool sumInto = false);
428 */
429 template<class Scalar, class ArrayOut, class ArrayInLeft, class ArrayInRight,int leftrank,int outrank>
431
455 template<class Scalar, class ArrayOutFields, class ArrayInFieldsLeft, class ArrayInFieldsRight>
456 static void operatorIntegral(ArrayOutFields & outputFields,
457 const ArrayInFieldsLeft & leftFields,
458 const ArrayInFieldsRight & rightFields,
459 const ECompEngine compEngine,
460 const bool sumInto = false);
461/* template<class Scalar, class ArrayOutFields, class ArrayInFieldsLeft, class ArrayInFieldsRight>
462 static void operatorIntegralTemp(ArrayOutFields & outputFields,
463 const ArrayInFieldsLeft & leftFields,
464 const ArrayInFieldsRight & rightFields,
465 const ECompEngine compEngine,
466 const bool sumInto = false);*/
489 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
490 static void functionalIntegral(ArrayOutFields & outputFields,
491 const ArrayInData & inputData,
492 const ArrayInFields & inputFields,
493 const ECompEngine compEngine,
494 const bool sumInto = false);
495 /* template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
496 static void functionalIntegralTemp(ArrayOutFields & outputFields,
497 const ArrayInData & inputData,
498 const ArrayInFields & inputFields,
499 const ECompEngine compEngine,
500 const bool sumInto = false);
501*/
521 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
522 static void dataIntegral(ArrayOutData & outputData,
523 const ArrayInDataLeft & inputDataLeft,
524 const ArrayInDataRight & inputDataRight,
525 const ECompEngine compEngine,
526 const bool sumInto = false);
527 /* template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
528 static void dataIntegralTemp(ArrayOutData & outputData,
529 const ArrayInDataLeft & inputDataLeft,
530 const ArrayInDataRight & inputDataRight,
531 const ECompEngine compEngine,
532 const bool sumInto = false);
533*/
564 template<class Scalar, class ArrayOut, class ArrayDet, class ArrayWeights>
565 static void computeCellMeasure(ArrayOut & outVals,
566 const ArrayDet & inDet,
567 const ArrayWeights & inWeights);
568
569 /*template<class Scalar, class ArrayOut, class ArrayDet, class ArrayWeights>
570 static void computeCellMeasureTemp(ArrayOut & outVals,
571 const ArrayDet & inDet,
572 const ArrayWeights & inWeights);*/
617 template<class Scalar, class ArrayOut, class ArrayJac, class ArrayWeights>
618 static void computeFaceMeasure(ArrayOut & outVals,
619 const ArrayJac & inJac,
620 const ArrayWeights & inWeights,
621 const int whichFace,
622 const shards::CellTopology & parentCell);
623
624/* template<class Scalar, class ArrayOut, class ArrayJac, class ArrayWeights>
625 static void computeFaceMeasureTemp(ArrayOut & outVals,
626 const ArrayJac & inJac,
627 const ArrayWeights & inWeights,
628 const int whichFace,
629 const shards::CellTopology & parentCell);*/
672 template<class Scalar, class ArrayOut, class ArrayJac, class ArrayWeights>
673 static void computeEdgeMeasure(ArrayOut & outVals,
674 const ArrayJac & inJac,
675 const ArrayWeights & inWeights,
676 const int whichEdge,
677 const shards::CellTopology & parentCell);
678
679/* template<class Scalar, class ArrayOut, class ArrayJac, class ArrayWeights>
680 static void computeEdgeMeasureTemp(ArrayOut & outVals,
681 const ArrayJac & inJac,
682 const ArrayWeights & inWeights,
683 const int whichEdge,
684 const shards::CellTopology & parentCell);*/
693 template<class Scalar, class ArrayTypeOut, class ArrayTypeMeasure, class ArrayTypeIn>
694 static void multiplyMeasure(ArrayTypeOut & outVals,
695 const ArrayTypeMeasure & inMeasure,
696 const ArrayTypeIn & inVals);
697 /* template<class Scalar, class ArrayTypeOut, class ArrayTypeMeasure, class ArrayTypeIn>
698 static void multiplyMeasureTemp(ArrayTypeOut & outVals,
699 const ArrayTypeMeasure & inMeasure,
700 const ArrayTypeIn & inVals);*/
734 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
735 static void scalarMultiplyDataField(ArrayOutFields & outputFields,
736 ArrayInData & inputData,
737 ArrayInFields & inputFields,
738 const bool reciprocal = false);
739
772 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
773 static void scalarMultiplyDataData(ArrayOutData & outputData,
774 ArrayInDataLeft & inputDataLeft,
775 ArrayInDataRight & inputDataRight,
776 const bool reciprocal = false);
777
809 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
810 static void dotMultiplyDataField(ArrayOutFields & outputFields,
811 const ArrayInData & inputData,
812 const ArrayInFields & inputFields);
813
844 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
845 static void dotMultiplyDataData(ArrayOutData & outputData,
846 const ArrayInDataLeft & inputDataLeft,
847 const ArrayInDataRight & inputDataRight);
848
883 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
884 static void vectorMultiplyDataField(ArrayOutFields & outputFields,
885 const ArrayInData & inputData,
886 const ArrayInFields & inputFields);
887
921 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
922 static void vectorMultiplyDataData(ArrayOutData & outputData,
923 const ArrayInDataLeft & inputDataLeft,
924 const ArrayInDataRight & inputDataRight);
925
976 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
977 static void tensorMultiplyDataField(ArrayOutFields & outputFields,
978 const ArrayInData & inputData,
979 const ArrayInFields & inputFields,
980 const char transpose = 'N');
981
1031 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
1032 static void tensorMultiplyDataData(ArrayOutData & outputData,
1033 const ArrayInDataLeft & inputDataLeft,
1034 const ArrayInDataRight & inputDataRight,
1035 const char transpose = 'N');
1036
1037/* template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
1038 static void tensorMultiplyDataDataTemp(ArrayOutData & outputData,
1039 const ArrayInDataLeft & inputDataLeft,
1040 const ArrayInDataRight & inputDataRight,
1041 const char transpose = 'N');
1042 */
1043 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight,int outvalRank>
1071 template<class Scalar, class ArrayTypeInOut, class ArrayTypeSign>
1072 static void applyLeftFieldSigns(ArrayTypeInOut & inoutOperator,
1073 const ArrayTypeSign & fieldSigns);
1074
1101 template<class Scalar, class ArrayTypeInOut, class ArrayTypeSign>
1102 static void applyRightFieldSigns(ArrayTypeInOut & inoutOperator,
1103 const ArrayTypeSign & fieldSigns);
1104
1127 template<class Scalar, class ArrayTypeInOut, class ArrayTypeSign>
1128 static void applyFieldSigns(ArrayTypeInOut & inoutFunction,
1129 const ArrayTypeSign & fieldSigns);
1130 /* template<class Scalar, class ArrayTypeInOut, class ArrayTypeSign>
1131 static void applyFieldSignsTemp(ArrayTypeInOut & inoutFunction,
1132 const ArrayTypeSign & fieldSigns);
1133*/
1169 template<class Scalar, class ArrayOutPointVals, class ArrayInCoeffs, class ArrayInFields>
1170 static void evaluate(ArrayOutPointVals & outPointVals,
1171 const ArrayInCoeffs & inCoeffs,
1172 const ArrayInFields & inFields);
1173
1174}; // end FunctionSpaceTools
1175
1176} // end namespace Intrepid
1177
1178// include templated definitions
1180
1181#endif
1182
1183/***************************************************************************************************
1184 ** **
1185 ** D O C U M E N T A T I O N P A G E S **
1186 ** **
1187 **************************************************************************************************/
1188
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410#if defined(Intrepid_SHOW_DEPRECATED_WARNINGS)
1411#ifdef __GNUC__
1412#warning "The Intrepid package is deprecated"
1413#endif
1414#endif
1415
Header file for utility class to provide array tools, such as tensor contractions,...
Header file for the Intrepid::CellTools class.
Header file for utility class to provide multidimensional containers.
Definition file for the Intrepid::FunctionSpaceTools class.
Header file for classes providing basic linear algebra functionality in 1D, 2D and 3D.
Implementation of a templated lexicographical container for a multi-indexed scalar quantity....
Defines expert-level interfaces for the evaluation of functions and operators in physical space (supp...
static void computeFaceMeasure(ArrayOut &outVals, const ArrayJac &inJac, const ArrayWeights &inWeights, const int whichFace, const shards::CellTopology &parentCell)
Returns the weighted integration measures outVals with dimensions (C,P) used for the computation of f...
static void vectorMultiplyDataField(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields)
Cross or outer product of data and fields; please read the description below.
static void integrate(Intrepid::FieldContainer< Scalar > &outputValues, const Intrepid::FieldContainer< Scalar > &leftValues, const Intrepid::FieldContainer< Scalar > &rightValues, const ECompEngine compEngine, const bool sumInto=false)
Contracts leftValues and rightValues arrays on the point and possibly space dimensions and stores the...
static void HDIVtransformDIV(ArrayTypeOut &outVals, const ArrayTypeDet &jacobianDet, const ArrayTypeIn &inVals)
Transformation of a divergence field in the H-div space, defined at points on a reference cell,...
static void HGRADtransformVALUE(ArrayTypeOut &outVals, const ArrayTypeIn &inVals)
Transformation of a (scalar) value field in the H-grad space, defined at points on a reference cell,...
static void tensorMultiplyDataData(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight, const char transpose='N')
Matrix-vector or matrix-matrix product of data and data; please read the description below.
static void HVOLtransformVALUE(ArrayTypeOut &outVals, const ArrayTypeDet &jacobianDet, const ArrayTypeIn &inVals)
Transformation of a (scalar) value field in the H-vol space, defined at points on a reference cell,...
static void scalarMultiplyDataField(ArrayOutFields &outputFields, ArrayInData &inputData, ArrayInFields &inputFields, const bool reciprocal=false)
Scalar multiplication of data and fields; please read the description below.
static void HCURLtransformVALUE(ArrayTypeOut &outVals, const ArrayTypeJac &jacobianInverse, const ArrayTypeIn &inVals, const char transpose='T')
Transformation of a (vector) value field in the H-curl space, defined at points on a reference cell,...
static void applyRightFieldSigns(ArrayTypeInOut &inoutOperator, const ArrayTypeSign &fieldSigns)
Applies right (column) signs, stored in the user-provided container fieldSigns and indexed by (C,...
static void scalarMultiplyDataData(ArrayOutData &outputData, ArrayInDataLeft &inputDataLeft, ArrayInDataRight &inputDataRight, const bool reciprocal=false)
Scalar multiplication of data and data; please read the description below.
static void dotMultiplyDataField(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields)
Dot product of data and fields; please read the description below.
static void evaluate(ArrayOutPointVals &outPointVals, const ArrayInCoeffs &inCoeffs, const ArrayInFields &inFields)
Computes point values outPointVals of a discrete function specified by the basis inFields and coeffic...
static void dotMultiplyDataData(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight)
Dot product of data and data; please read the description below.
static void multiplyMeasure(ArrayTypeOut &outVals, const ArrayTypeMeasure &inMeasure, const ArrayTypeIn &inVals)
Multiplies fields inVals by weighted measures inMeasure and returns the field array outVals; this is ...
static void applyLeftFieldSigns(ArrayTypeInOut &inoutOperator, const ArrayTypeSign &fieldSigns)
Applies left (row) signs, stored in the user-provided container fieldSigns and indexed by (C,...
static void vectorMultiplyDataData(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight)
Cross or outer product of data and data; please read the description below.
static void HGRADtransformGRAD(ArrayTypeOut &outVals, const ArrayTypeJac &jacobianInverse, const ArrayTypeIn &inVals, const char transpose='T')
Transformation of a gradient field in the H-grad space, defined at points on a reference cell,...
static void computeCellMeasure(ArrayOut &outVals, const ArrayDet &inDet, const ArrayWeights &inWeights)
Returns the weighted integration measures outVals with dimensions (C,P) used for the computation of c...
static void applyFieldSigns(ArrayTypeInOut &inoutFunction, const ArrayTypeSign &fieldSigns)
Applies field signs, stored in the user-provided container fieldSigns and indexed by (C,...
static void operatorIntegral(ArrayOutFields &outputFields, const ArrayInFieldsLeft &leftFields, const ArrayInFieldsRight &rightFields, const ECompEngine compEngine, const bool sumInto=false)
Contracts the point (and space) dimensions P (and D1 and D2) of two rank-3, 4, or 5 containers with d...
static void functionalIntegral(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields, const ECompEngine compEngine, const bool sumInto=false)
Contracts the point (and space) dimensions P (and D1 and D2) of a rank-3, 4, or 5 container and a ran...
static void computeEdgeMeasure(ArrayOut &outVals, const ArrayJac &inJac, const ArrayWeights &inWeights, const int whichEdge, const shards::CellTopology &parentCell)
Returns the weighted integration measures outVals with dimensions (C,P) used for the computation of e...
static void dataIntegral(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight, const ECompEngine compEngine, const bool sumInto=false)
Contracts the point (and space) dimensions P (and D1 and D2) of two rank-2, 3, or 4 containers with d...
static void tensorMultiplyDataField(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields, const char transpose='N')
Matrix-vector or matrix-matrix product of data and fields; please read the description below.
static void HCURLtransformCURL(ArrayTypeOut &outVals, const ArrayTypeJac &jacobian, const ArrayTypeDet &jacobianDet, const ArrayTypeIn &inVals, const char transpose='N')
Transformation of a curl field in the H-curl space, defined at points on a reference cell,...
static void HDIVtransformVALUE(ArrayTypeOut &outVals, const ArrayTypeJac &jacobian, const ArrayTypeDet &jacobianDet, const ArrayTypeIn &inVals, const char transpose='N')
Transformation of a (vector) value field in the H-div space, defined at points on a reference cell,...