void TPSLaplaceResid<EvalT, Traits>:: evaluateFields(typename Traits::EvalData workset) { // Note that all the integration operations are ScalarT! We need the partials of the Jacobian to show up in the // system Jacobian as the solution is a function of coordinates (it IS the coordinates!). // This adds significant time to the compile Intrepid2::CellTools<ScalarT>::setJacobian(jacobian, refPoints, solnVec, *cellType); // Since Intrepid2 will perform calculations on the entire workset size and not // just the used portion, we must fill the excess with reasonable values. // Leaving this out leads to a floating point exception in // Intrepid2::RealSpaceTools<Scalar>::det(ArrayDet & detArray, // const ArrayIn & inMats). for (std::size_t cell = workset.numCells; cell < worksetSize; ++cell) for (std::size_t qp = 0; qp < numQPs; ++qp) for (std::size_t i = 0; i < numDims; ++i) jacobian(cell, qp, i, i) = 1.0; Intrepid2::CellTools<ScalarT>::setJacobianDet(jacobian_det, jacobian); // Straight Laplace's equation evaluation for the nodal coord solution for(std::size_t cell = 0; cell < workset.numCells; ++cell) { for(std::size_t node_a = 0; node_a < numNodes; ++node_a) { for(std::size_t eq = 0; eq < numDims; eq++) { solnResidual(cell, node_a, eq) = 0.0; } for(std::size_t qp = 0; qp < numQPs; ++qp) { for(std::size_t node_b = 0; node_b < numNodes; ++node_b) { ScalarT kk = 0.0; for(std::size_t i = 0; i < numDims; i++) { kk += grad_at_cub_points(node_a, qp, i) * grad_at_cub_points(node_b, qp, i); } for(std::size_t eq = 0; eq < numDims; eq++) { solnResidual(cell, node_a, eq) += kk * solnVec(cell, node_b, eq) * jacobian_det(cell, qp) * refWeights(qp); } } } } } }
void LaplaceResid<EvalT, Traits>:: evaluateFields(typename Traits::EvalData workset) { // setJacobian only needs to be RealType since the data type is only // used internally for Basis Fns on reference elements, which are // not functions of coordinates. This save 18min of compile time!!! Intrepid::CellTools<MeshScalarT>::setJacobian(jacobian, refPoints, coordVec, *cellType); // Since Intrepid will perform calculations on the entire workset size and not // just the used portion, we must fill the excess with reasonable values. // Leaving this out leads to a floating point exception in // Intrepid::RealSpaceTools<Scalar>::det(ArrayDet & detArray, // const ArrayIn & inMats). for (std::size_t cell = workset.numCells; cell < worksetSize; ++cell) for (std::size_t qp = 0; qp < numQPs; ++qp) for (std::size_t i = 0; i < numDims; ++i) jacobian(cell, qp, i, i) = 1.0; Intrepid::CellTools<MeshScalarT>::setJacobianDet(jacobian_det, jacobian); // Straight Laplace's equation evaluation for the nodal coord solution for(std::size_t cell = 0; cell < workset.numCells; ++cell) { for(std::size_t node_a = 0; node_a < numNodes; ++node_a) { for(std::size_t eq = 0; eq < numDims; eq++) { solnResidual(cell, node_a, eq) = 0.0; } for(std::size_t qp = 0; qp < numQPs; ++qp) { for(std::size_t node_b = 0; node_b < numNodes; ++node_b) { ScalarT kk = 0.0; for(std::size_t i = 0; i < numDims; i++) { kk += grad_at_cub_points(node_a, qp, i) * grad_at_cub_points(node_b, qp, i); } for(std::size_t eq = 0; eq < numDims; eq++) { solnResidual(cell, node_a, eq) += kk * solnVec(cell, node_b, eq) * jacobian_det(cell, qp) * refWeights(qp); } } } } } }