49 #ifndef __INTREPID2_PROJECTIONTOOLSDEFHVOL_HPP__
50 #define __INTREPID2_PROJECTIONTOOLSDEFHVOL_HPP__
59 template<
typename DeviceType>
60 template<
typename basisCoeffsValueType,
class ...basisCoeffsProperties,
61 typename funValsValueType,
class ...funValsProperties,
63 typename ortValueType,
class ...ortProperties>
66 const Kokkos::DynRankView<funValsValueType,funValsProperties...> targetAtTargetEPoints,
67 const Kokkos::DynRankView<ortValueType, ortProperties...> orts,
68 const BasisType* cellBasis,
69 ProjectionStruct<DeviceType, typename BasisType::scalarType> * projStruct){
71 typedef typename BasisType::scalarType scalarType;
72 typedef Kokkos::DynRankView<scalarType,DeviceType> ScalarViewType;
73 ordinal_type dim = cellBasis->getBaseCellTopology().getDimension();
75 ordinal_type basisCardinality = cellBasis->getCardinality();
77 ordinal_type numCells = targetAtTargetEPoints.extent(0);
79 auto refTargetEWeights = projStruct->getTargetEvalWeights(dim,0);
80 auto targetEPointsRange = projStruct->getTargetPointsRange();
82 auto refBasisEWeights = projStruct->getBasisEvalWeights(dim,0);
83 auto basisEPointsRange = projStruct->getBasisPointsRange();
85 ordinal_type numTargetEPoints = range_size(targetEPointsRange(dim,0));
86 ordinal_type numBasisEPoints = range_size(basisEPointsRange(dim,0));
88 ScalarViewType basisAtBasisEPoints(
"basisAtBasisEPoints", 1, basisCardinality, numBasisEPoints);
89 ScalarViewType basisAtTargetEPoints(
"basisAtTargetEPoints", basisCardinality, numTargetEPoints);
91 auto basisEPoints = projStruct->getAllEvalPoints(EvalPointsType::BASIS);
92 auto targetEPoints = projStruct->getAllEvalPoints(EvalPointsType::TARGET);
94 cellBasis->getValues(Kokkos::subview(basisAtBasisEPoints, 0, Kokkos::ALL(), Kokkos::ALL()), basisEPoints);
95 cellBasis->getValues(basisAtTargetEPoints, targetEPoints);
97 ScalarViewType weightedBasisAtTargetEPoints(
"weightedBasisAtTargetEPoints_",numCells, basisCardinality, numTargetEPoints);
98 ScalarViewType weightedBasisAtBasisEPoints(
"weightedBasisAtBasisEPoints", 1, basisCardinality, numBasisEPoints);
100 auto tagToOrdinal = Kokkos::create_mirror_view_and_copy(MemSpaceType(), cellBasis->getAllDofOrdinal());
101 auto cellDofs = Kokkos::subview(tagToOrdinal, dim, 0, Kokkos::ALL());
104 massMat0(
"massMat0", 1, basisCardinality, basisCardinality),
105 massMat(
"massMat", numCells, basisCardinality, basisCardinality),
106 rhsMat(
"rhsMat", numCells, basisCardinality );
108 ordinal_type offsetBasis = basisEPointsRange(dim,0).first;
109 ordinal_type offsetTarget = targetEPointsRange(dim,0).first;
111 using HostSpaceType = Kokkos::DefaultHostExecutionSpace;
112 auto hWeightedBasisAtBasisEPoints = Kokkos::create_mirror_view(weightedBasisAtBasisEPoints);
113 auto hWeightedBasisAtTargetEPoints = Kokkos::create_mirror_view(weightedBasisAtTargetEPoints);
114 auto hBasisAtBasisEPoints = Kokkos::create_mirror_view_and_copy(HostSpaceType(), basisAtBasisEPoints);
115 auto hBasisAtTargetEPoints = Kokkos::create_mirror_view_and_copy(HostSpaceType(), basisAtTargetEPoints);
117 for(ordinal_type j=0; j <basisCardinality; ++j) {
118 ordinal_type idof = cellBasis->getDofOrdinal(dim, 0, j);
119 for(ordinal_type iq=0; iq <ordinal_type(refBasisEWeights.extent(0)); ++iq)
120 hWeightedBasisAtBasisEPoints(0,j,iq) = hBasisAtBasisEPoints(0,idof,offsetBasis+iq) * refBasisEWeights(iq);
121 for(ordinal_type iq=0; iq <ordinal_type(refTargetEWeights.extent(0)); ++iq)
122 hWeightedBasisAtTargetEPoints(0,j,iq) = hBasisAtTargetEPoints(idof,offsetTarget+iq)* refTargetEWeights(iq);
124 Kokkos::deep_copy(weightedBasisAtBasisEPoints,hWeightedBasisAtBasisEPoints);
125 Kokkos::deep_copy(weightedBasisAtTargetEPoints,hWeightedBasisAtTargetEPoints);
131 typedef Kokkos::DynRankView<scalarType, Kokkos::LayoutRight, DeviceType> WorkArrayViewType;
132 ScalarViewType t_(
"t",numCells, basisCardinality);
133 WorkArrayViewType w_(
"w",numCells,basisCardinality);
135 ElemSystem cellSystem(
"cellSystem",
true);
136 cellSystem.solve(basisCoeffs, massMat, rhsMat, t_, w_, cellDofs, basisCardinality);
Header file for the abstract base class Intrepid2::DefaultCubatureFactory.