/** \file TransformDOF.h */ #ifndef AMDIS_TRANSFORM_DOF_H #define AMDIS_TRANSFORM_DOF_H namespace AMDiS { /** * analogon to std::for_each/std::transform for DOFVectors. * The operators are applied to each degree of freedom: * * forEachDOF(vec, op) * transformDOF(vec1, result, op) * transformDOF(vec1, vec2, result, binary_op) * transformDOF(vec1, vec2, vec3, result, tertiary_op) * * transformDOFInterpolation(vec, f(x), result, binary_op) * * vec1,vec2,vec3 .. {DOFVector*, DOFVector&, Ti} * vec, result .. {DOFVector*, DOFVector&} * op .. AbstractFunction* * binary_op ..BinaryAbstractFunction* * tertiary_op .. TertiaryAbstractFunction* * * analogon to std::accumulate for DOFVectors: * * result = accumulateDOF_simple(vec, value0, binary_op) * result = accumulateDOF_simple(vec1, vec2, value0, tertiary_op) **/ // result = op(vec) template inline void transformDOF_simple(DOFVector *vec, DOFVector *result, AbstractFunction *op) { TEST_EXIT(vec->getFeSpace() == result->getFeSpace())("FeSpaces must be equal!\n"); DOFIterator vecIter(vec,USED_DOFS); DOFIterator resultIter(result,USED_DOFS); for(vecIter.reset(),resultIter.reset(); !vecIter.end(); ++vecIter,++resultIter) { *resultIter = (*op)(*vecIter); } } template inline void transformDOF_extended(DOFVector *vec, DOFVector *result, AbstractFunction *op) { DOFVector* res; bool useResult = true; if(static_cast(vec)==static_cast(result)) { res= new DOFVector(result->getFeSpace(), result->getName()); useResult = false; } else res= result; const FiniteElemSpace *vecFeSpace = vec->getFeSpace(); const FiniteElemSpace *resFeSpace = result->getFeSpace(); const BasisFunction *vecBasisFcts = vecFeSpace->getBasisFcts(); const BasisFunction *resBasisFcts = resFeSpace->getBasisFcts(); int nVecBasisFcts = vecBasisFcts->getNumber(); int nResBasisFcts = resBasisFcts->getNumber(); std::vector resLocalIndices(nResBasisFcts); mtl::dense_vector vecLocalCoeffs(nVecBasisFcts); DimVec *coords = NULL; TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(resFeSpace->getMesh(), -1, Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS); while (elInfo) { Element *el = elInfo->getElement(); resBasisFcts->getLocalIndices(el, resFeSpace->getAdmin(), resLocalIndices); vec->getLocalVector(el, vecLocalCoeffs); for (int i = 0; i < nResBasisFcts; i++) { coords = vecBasisFcts->getCoords(i); (*res)[resLocalIndices[i]] = (*op)(vecBasisFcts->evalUh(*coords, vecLocalCoeffs)); } elInfo = stack.traverseNext(elInfo); } if (!useResult) { result->copy(*res); delete res; } } /// result = op(vec) template inline void transformDOF(DOFVector *vec, DOFVector *result, AbstractFunction *op) { if (vec->getFeSpace() == result->getFeSpace()) transformDOF_simple(vec,result,op); else transformDOF_extended(vec,result,op); } template inline void transformDOF(DOFVector &vec, DOFVector &result, AbstractFunction &op) { transformDOF(&vec, &result, &op); } template inline void transformDOF(DOFVector *vec, AbstractFunction *op) { transformDOF(vec, vec, op); } template inline void transformDOF(DOFVector &vec, AbstractFunction &op) { transformDOF(&vec, &op); } template inline void forEachDOF(DOFVector *vec, AbstractFunction *op) { transformDOF(vec, op); } template inline void forEachDOF(DOFVector &vec, AbstractFunction &op) { transformDOF(&vec, &op); } // result = binary_op(vec1, vec2) template inline void transformDOF_simple(DOFVector *vec1, DOFVector *vec2, DOFVector *result, BinaryAbstractFunction *binary_op) { TEST_EXIT(vec1->getFeSpace() == vec2->getFeSpace() && vec2->getFeSpace() == result->getFeSpace())("FeSpaces must be equal!\n"); DOFIterator vec1Iter(vec1,USED_DOFS); DOFIterator vec2Iter(vec2,USED_DOFS); DOFIterator resultIter(result,USED_DOFS); for(vec1Iter.reset(),vec2Iter.reset(),resultIter.reset(); !vec1Iter.end(); ++vec1Iter,++vec2Iter,++resultIter) { *resultIter = (*binary_op)(*vec1Iter, *vec2Iter); } } // result = binary_op(vec1, vec2) template inline void transformDOF_extended(DOFVector *vec1, DOFVector *vec2, DOFVector *result, BinaryAbstractFunction *binary_op) { DOFVector* res; bool useResult = true; if(static_cast(vec1)==static_cast(result) || static_cast(vec2) == static_cast(result)) { res= new DOFVector(result->getFeSpace(), result->getName()); useResult = false; } else res= result; const FiniteElemSpace *vec1FeSpace = vec1->getFeSpace(); const FiniteElemSpace *vec2FeSpace = vec2->getFeSpace(); const FiniteElemSpace *resFeSpace = result->getFeSpace(); const BasisFunction *vec1BasisFcts = vec1FeSpace->getBasisFcts(); const BasisFunction *vec2BasisFcts = vec2FeSpace->getBasisFcts(); const BasisFunction *resBasisFcts = resFeSpace->getBasisFcts(); int nVec1BasisFcts = vec1BasisFcts->getNumber(); int nVec2BasisFcts = vec2BasisFcts->getNumber(); int nResBasisFcts = resBasisFcts->getNumber(); std::vector resLocalIndices(nResBasisFcts); mtl::dense_vector vec1LocalCoeffs(nVec1BasisFcts); mtl::dense_vector vec2LocalCoeffs(nVec2BasisFcts); DimVec *coords1 = NULL, *coords2 = NULL; TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(resFeSpace->getMesh(), -1, Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS); while (elInfo) { Element *el = elInfo->getElement(); resBasisFcts->getLocalIndices(el, resFeSpace->getAdmin(), resLocalIndices); vec1->getLocalVector(el, vec1LocalCoeffs); vec2->getLocalVector(el, vec2LocalCoeffs); for (int i = 0; i < nResBasisFcts; i++) { coords1 = vec1BasisFcts->getCoords(i); coords2 = vec2BasisFcts->getCoords(i); (*res)[resLocalIndices[i]] = (*binary_op)( vec1BasisFcts->evalUh(*coords1, vec1LocalCoeffs), vec2BasisFcts->evalUh(*coords2, vec2LocalCoeffs) ); } elInfo = stack.traverseNext(elInfo); } if (!useResult) { result->copy(*res); delete res; } } /// result = binary_op(vec1, vec2) template inline void transformDOF(DOFVector *vec1, DOFVector *vec2, DOFVector *result, BinaryAbstractFunction *binary_op) { if (vec1->getFeSpace() == vec2->getFeSpace() && vec2->getFeSpace() == result->getFeSpace()) transformDOF_simple(vec1,vec2,result,binary_op); else transformDOF_extended(vec1,vec2,result,binary_op); } template inline void transformDOF(DOFVector &vec1, DOFVector &vec2, DOFVector &result, BinaryAbstractFunction &binary_op) { transformDOF(&vec1, &vec2, &result, &binary_op); } // result = binary_op(vec1, value) template inline void transformDOF_simple(DOFVector *vec1, const T2 val, DOFVector *result, BinaryAbstractFunction *binary_op) { TEST_EXIT(vec1->getFeSpace() == result->getFeSpace())("FeSpaces must be equal!\n"); DOFIterator vec1Iter(vec1,USED_DOFS); DOFIterator resultIter(result,USED_DOFS); for(vec1Iter.reset(),resultIter.reset(); !vec1Iter.end(); ++vec1Iter,++resultIter) { *resultIter = (*binary_op)(*vec1Iter, val); } } // result = binary_op(vec1, value) template inline void transformDOF_extended(DOFVector *vec1, const T2 val, DOFVector *result, BinaryAbstractFunction *binary_op) { DOFVector* res; bool useResult = true; if(static_cast(vec1)==static_cast(result)) { res= new DOFVector(result->getFeSpace(), result->getName()); useResult = false; } else res= result; const FiniteElemSpace *vec1FeSpace = vec1->getFeSpace(); const FiniteElemSpace *resFeSpace = result->getFeSpace(); const BasisFunction *vec1BasisFcts = vec1FeSpace->getBasisFcts(); const BasisFunction *resBasisFcts = resFeSpace->getBasisFcts(); int nVec1BasisFcts = vec1BasisFcts->getNumber(); int nResBasisFcts = resBasisFcts->getNumber(); std::vector resLocalIndices(nResBasisFcts); ElementVector vec1LocalCoeffs(nVec1BasisFcts); DimVec *coords1 = NULL; TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(resFeSpace->getMesh(), -1, Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS); while (elInfo) { Element *el = elInfo->getElement(); resBasisFcts->getLocalIndices(el, resFeSpace->getAdmin(), resLocalIndices); vec1->getLocalVector(el, vec1LocalCoeffs); for (int i = 0; i < nResBasisFcts; i++) { coords1 = vec1BasisFcts->getCoords(i); (*res)[resLocalIndices[i]] = (*binary_op)( vec1BasisFcts->evalUh(*coords1, vec1LocalCoeffs), val ); } elInfo = stack.traverseNext(elInfo); } if (!useResult) { result->copy(*res); delete res; } } /// result = binary_op(vec1, value) template inline void transformDOF(DOFVector *vec1, const T2 val, DOFVector *result, BinaryAbstractFunction *binary_op) { if (vec1->getFeSpace() == result->getFeSpace()) transformDOF_simple(vec1,val,result,binary_op); else transformDOF_extended(vec1,val,result,binary_op); } template inline void transformDOF(DOFVector &vec1, const T2 val, DOFVector &result, BinaryAbstractFunction &binary_op) { transformDOF(&vec1, val, &result, &binary_op); } // result = binary_op(value, vec2) template inline void transformDOF_simple(const T1 val, DOFVector *vec1, DOFVector *result, BinaryAbstractFunction *binary_op) { TEST_EXIT(vec1->getFeSpace() == result->getFeSpace())("FeSpaces must be equal!\n"); DOFIterator vec1Iter(vec1,USED_DOFS); DOFIterator resultIter(result,USED_DOFS); for(vec1Iter.reset(),resultIter.reset(); !vec1Iter.end(); ++vec1Iter,++resultIter) { *resultIter = (*binary_op)(val, *vec1Iter); } } // result = binary_op(value, vec2) template inline void transformDOF_extended(const T1 val, DOFVector *vec1, DOFVector *result, BinaryAbstractFunction *binary_op) { DOFVector* res; bool useResult = true; if(static_cast(vec1)==static_cast(result)) { res= new DOFVector(result->getFeSpace(), result->getName()); useResult = false; } else res= result; const FiniteElemSpace *vec1FeSpace = vec1->getFeSpace(); const FiniteElemSpace *resFeSpace = result->getFeSpace(); const BasisFunction *vec1BasisFcts = vec1FeSpace->getBasisFcts(); const BasisFunction *resBasisFcts = resFeSpace->getBasisFcts(); int nVec1BasisFcts = vec1BasisFcts->getNumber(); int nResBasisFcts = resBasisFcts->getNumber(); std::vector resLocalIndices(nResBasisFcts); ElementVector vec1LocalCoeffs(nVec1BasisFcts); DimVec *coords1 = NULL; TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(resFeSpace->getMesh(), -1, Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS); while (elInfo) { Element *el = elInfo->getElement(); resBasisFcts->getLocalIndices(el, resFeSpace->getAdmin(), resLocalIndices); vec1->getLocalVector(el, vec1LocalCoeffs); for (int i = 0; i < nResBasisFcts; i++) { coords1 = vec1BasisFcts->getCoords(i); (*res)[resLocalIndices[i]] = (*binary_op)( val, vec1BasisFcts->evalUh(*coords1, vec1LocalCoeffs) ); } elInfo = stack.traverseNext(elInfo); } if (!useResult) { result->copy(*res); delete res; } } /// result = binary_op(value, vec2) template inline void transformDOF(const T1 val, DOFVector *vec1, DOFVector *result, BinaryAbstractFunction *binary_op) { if (vec1->getFeSpace() == result->getFeSpace()) transformDOF_simple(val,vec1,result,binary_op); else transformDOF_extended(val,vec1,result,binary_op); } template inline void transformDOF(const T1 val, DOFVector &vec1, DOFVector &result, BinaryAbstractFunction &binary_op) { transformDOF(val, &vec1, &result, &binary_op); } // result = tertiary_op(vec1, vec2, vec3) template inline void transformDOF_simple(DOFVector *vec1, DOFVector *vec2, DOFVector *vec3, DOFVector *result, TertiaryAbstractFunction *tertiary_op) { TEST_EXIT(vec1->getFeSpace() == vec2->getFeSpace() && vec2->getFeSpace() == vec3->getFeSpace() && vec3->getFeSpace() == result->getFeSpace())("FeSpaces must be equal!\n"); DOFIterator vec1Iter(vec1,USED_DOFS); DOFIterator vec2Iter(vec2,USED_DOFS); DOFIterator vec3Iter(vec3,USED_DOFS); DOFIterator resultIter(result,USED_DOFS); for(vec1Iter.reset(),vec2Iter.reset(),vec3Iter.reset(),resultIter.reset(); !vec1Iter.end(); ++vec1Iter,++vec2Iter,++vec3Iter,++resultIter) { *resultIter = (*tertiary_op)(*vec1Iter, *vec2Iter, *vec3Iter); } } // result = tertiary_op(vec1, vec2, vec3) template inline void transformDOF_extended(DOFVector *vec1, DOFVector *vec2, DOFVector *vec3, DOFVector *result, TertiaryAbstractFunction *tertiary_op) { DOFVector* res; bool useResult = true; if(static_cast(vec1)==static_cast(result) || static_cast(vec2) == static_cast(result) || static_cast(vec3) == static_cast(result)) { res= new DOFVector(result->getFeSpace(), result->getName()); useResult = false; } else res= result; const FiniteElemSpace *vec1FeSpace = vec1->getFeSpace(); const FiniteElemSpace *vec2FeSpace = vec2->getFeSpace(); const FiniteElemSpace *vec3FeSpace = vec3->getFeSpace(); const FiniteElemSpace *resFeSpace = res->getFeSpace(); const BasisFunction *vec1BasisFcts = vec1FeSpace->getBasisFcts(); const BasisFunction *vec2BasisFcts = vec2FeSpace->getBasisFcts(); const BasisFunction *vec3BasisFcts = vec3FeSpace->getBasisFcts(); const BasisFunction *resBasisFcts = resFeSpace->getBasisFcts(); int nVec1BasisFcts = vec1BasisFcts->getNumber(); int nVec2BasisFcts = vec2BasisFcts->getNumber(); int nVec3BasisFcts = vec3BasisFcts->getNumber(); int nResBasisFcts = resBasisFcts->getNumber(); std::vector resLocalIndices(nResBasisFcts); ElementVector vec1LocalCoeffs(nVec1BasisFcts); ElementVector vec2LocalCoeffs(nVec2BasisFcts); ElementVector vec3LocalCoeffs(nVec3BasisFcts); DimVec *coords1 = NULL, *coords2 = NULL, *coords3 = NULL; TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(resFeSpace->getMesh(), -1, Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS); while (elInfo) { Element *el = elInfo->getElement(); resBasisFcts->getLocalIndices(el, resFeSpace->getAdmin(), resLocalIndices); vec1->getLocalVector(el, vec1LocalCoeffs); vec2->getLocalVector(el, vec2LocalCoeffs); vec3->getLocalVector(el, vec3LocalCoeffs); for (int i = 0; i < nResBasisFcts; i++) { coords1 = vec1BasisFcts->getCoords(i); coords2 = vec2BasisFcts->getCoords(i); coords3 = vec3BasisFcts->getCoords(i); (*res)[resLocalIndices[i]] = (*tertiary_op)( vec1BasisFcts->evalUh(*coords1, vec1LocalCoeffs), vec2BasisFcts->evalUh(*coords2, vec2LocalCoeffs), vec3BasisFcts->evalUh(*coords3, vec3LocalCoeffs) ); } elInfo = stack.traverseNext(elInfo); } if (!useResult) { result->copy(*res); delete res; } } /// result = tertiary_op(vec1, vec2, vec3) template inline void transformDOF(DOFVector *vec1, DOFVector *vec2, DOFVector *vec3, DOFVector *result, TertiaryAbstractFunction *tertiary_op) { if (vec1->getFeSpace() == vec2->getFeSpace() && vec2->getFeSpace() == vec3->getFeSpace() && vec3->getFeSpace() == result->getFeSpace()) transformDOF_simple(vec1,vec2,vec3,result,tertiary_op); else transformDOF_extended(vec1,vec2,vec3,result,tertiary_op); } template inline void transformDOF(DOFVector &vec1, DOFVector &vec2, DOFVector &vec3, DOFVector &result, TertiaryAbstractFunction &tertiary_op) { transformDOF(&vec1, &vec2, &vec3, &result, &tertiary_op); } /// result = tertiary_op(vec1, vec2, value) template inline void transformDOF(DOFVector *vec1, DOFVector *vec2, T3 val, DOFVector *result, TertiaryAbstractFunction *tertiary_op) { DOFVector* res; bool useResult = true; if(static_cast(vec1)==static_cast(result) || static_cast(vec2) == static_cast(result)) { res= new DOFVector(result->getFeSpace(), result->getName()); useResult = false; } else res= result; const FiniteElemSpace *vec1FeSpace = vec1->getFeSpace(); const FiniteElemSpace *vec2FeSpace = vec2->getFeSpace(); const FiniteElemSpace *resFeSpace = res->getFeSpace(); const BasisFunction *vec1BasisFcts = vec1FeSpace->getBasisFcts(); const BasisFunction *vec2BasisFcts = vec2FeSpace->getBasisFcts(); const BasisFunction *resBasisFcts = resFeSpace->getBasisFcts(); int nVec1BasisFcts = vec1BasisFcts->getNumber(); int nVec2BasisFcts = vec2BasisFcts->getNumber(); int nResBasisFcts = resBasisFcts->getNumber(); std::vector resLocalIndices(nResBasisFcts); ElementVector vec1LocalCoeffs(nVec1BasisFcts); ElementVector vec2LocalCoeffs(nVec2BasisFcts); DimVec *coords1 = NULL, *coords2 = NULL; TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(resFeSpace->getMesh(), -1, Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS); while (elInfo) { Element *el = elInfo->getElement(); resBasisFcts->getLocalIndices(el, resFeSpace->getAdmin(), resLocalIndices); vec1->getLocalVector(el, vec1LocalCoeffs); vec2->getLocalVector(el, vec2LocalCoeffs); for (int i = 0; i < nResBasisFcts; i++) { coords1 = vec1BasisFcts->getCoords(i); coords2 = vec2BasisFcts->getCoords(i); (*res)[resLocalIndices[i]] = (*tertiary_op)( vec1BasisFcts->evalUh(*coords1, vec1LocalCoeffs), vec2BasisFcts->evalUh(*coords2, vec2LocalCoeffs), val ); } elInfo = stack.traverseNext(elInfo); } if (!useResult) { result->copy(*res); delete res; } } template inline void transformDOF(DOFVector &vec1, DOFVector &vec2, T3 val, DOFVector &result, TertiaryAbstractFunction &tertiary_op) { transformDOF(&vec1, &vec2, val, &result, &tertiary_op); } /// result = tertiary_op(vec1, value, vec3) template inline void transformDOF(DOFVector *vec1, T2 val, DOFVector *vec3, DOFVector *result, TertiaryAbstractFunction *tertiary_op) { DOFVector* res; bool useResult = true; if(static_cast(vec1)==static_cast(result) || static_cast(vec3) == static_cast(result)) { res= new DOFVector(result->getFeSpace(), result->getName()); useResult = false; } else res= result; const FiniteElemSpace *vec1FeSpace = vec1->getFeSpace(); const FiniteElemSpace *vec3FeSpace = vec3->getFeSpace(); const FiniteElemSpace *resFeSpace = res->getFeSpace(); const BasisFunction *vec1BasisFcts = vec1FeSpace->getBasisFcts(); const BasisFunction *vec3BasisFcts = vec3FeSpace->getBasisFcts(); const BasisFunction *resBasisFcts = resFeSpace->getBasisFcts(); int nVec1BasisFcts = vec1BasisFcts->getNumber(); int nVec3BasisFcts = vec3BasisFcts->getNumber(); int nResBasisFcts = resBasisFcts->getNumber(); std::vector resLocalIndices(nResBasisFcts); ElementVector vec1LocalCoeffs(nVec1BasisFcts); ElementVector vec3LocalCoeffs(nVec3BasisFcts); DimVec *coords1 = NULL, *coords2 = NULL; TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(resFeSpace->getMesh(), -1, Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS); while (elInfo) { Element *el = elInfo->getElement(); resBasisFcts->getLocalIndices(el, resFeSpace->getAdmin(), resLocalIndices); vec1->getLocalVector(el, vec1LocalCoeffs); vec3->getLocalVector(el, vec3LocalCoeffs); for (int i = 0; i < nResBasisFcts; i++) { coords1 = vec1BasisFcts->getCoords(i); coords2 = vec3BasisFcts->getCoords(i); (*res)[resLocalIndices[i]] = (*tertiary_op)( vec1BasisFcts->evalUh(*coords1, vec1LocalCoeffs), val, vec3BasisFcts->evalUh(*coords2, vec3LocalCoeffs) ); } elInfo = stack.traverseNext(elInfo); } if (!useResult) { result->copy(*res); delete res; } } template inline void transformDOF(DOFVector &vec1, T2 val, DOFVector &vec3, DOFVector &result, TertiaryAbstractFunction &tertiary_op) { transformDOF(&vec1, val, &vec3, &result, &tertiary_op); } /// result = tertiary_op(value, vec2, vec3) template inline void transformDOF(T1 val, DOFVector *vec2, DOFVector *vec3, DOFVector *result, TertiaryAbstractFunction *tertiary_op) { DOFVector* res; bool useResult = true; if(static_cast(vec2)==static_cast(result) || static_cast(vec3) == static_cast(result)) { res= new DOFVector(result->getFeSpace(), result->getName()); useResult = false; } else res= result; const FiniteElemSpace *vec2FeSpace = vec2->getFeSpace(); const FiniteElemSpace *vec3FeSpace = vec3->getFeSpace(); const FiniteElemSpace *resFeSpace = res->getFeSpace(); const BasisFunction *vec2BasisFcts = vec2FeSpace->getBasisFcts(); const BasisFunction *vec3BasisFcts = vec3FeSpace->getBasisFcts(); const BasisFunction *resBasisFcts = resFeSpace->getBasisFcts(); int nVec2BasisFcts = vec2BasisFcts->getNumber(); int nVec3BasisFcts = vec3BasisFcts->getNumber(); int nResBasisFcts = resBasisFcts->getNumber(); std::vector resLocalIndices(nResBasisFcts); ElementVector vec2LocalCoeffs(nVec2BasisFcts); ElementVector vec3LocalCoeffs(nVec3BasisFcts); DimVec *coords1 = NULL, *coords2 = NULL; TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(resFeSpace->getMesh(), -1, Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS); while (elInfo) { Element *el = elInfo->getElement(); resBasisFcts->getLocalIndices(el, resFeSpace->getAdmin(), resLocalIndices); vec2->getLocalVector(el, vec2LocalCoeffs); vec3->getLocalVector(el, vec3LocalCoeffs); for (int i = 0; i < nResBasisFcts; i++) { coords1 = vec2BasisFcts->getCoords(i); coords2 = vec3BasisFcts->getCoords(i); (*res)[resLocalIndices[i]] = (*tertiary_op)( val, vec2BasisFcts->evalUh(*coords1, vec2LocalCoeffs), vec3BasisFcts->evalUh(*coords2, vec3LocalCoeffs) ); } elInfo = stack.traverseNext(elInfo); } if (!useResult) { result->copy(*res); delete res; } } template inline void transformDOF(T1 val, DOFVector &vec2, DOFVector &vec3, DOFVector &result, TertiaryAbstractFunction &tertiary_op) { transformDOF(val, &vec2, &vec3, &result, &tertiary_op); } // =========================================================================================== /// return binary_op(vec, interpol(fct)) template inline void transformDOFInterpolation( DOFVector *vec, AbstractFunction > *fct, BinaryAbstractFunction *binary_op) { DOFVector helpDOF(vec->getFeSpace(), "temp"); helpDOF.interpol(fct); transformDOF(vec,&helpDOF,vec,binary_op); } template inline void transformDOFInterpolation( DOFVector &vec, AbstractFunction > &fct, BinaryAbstractFunction &binary_op) { transformDOFInterpolation(&vec, &fct, &binary_op); } /// return binary_op(vec, interpol(fct)) template inline void transformDOFInterpolation( DOFVector *vec, AbstractFunction > *fct, DOFVector *result, BinaryAbstractFunction *binary_op) { DOFVector helpDOF(vec->getFeSpace(), "temp"); helpDOF.interpol(fct); transformDOF(vec,&helpDOF,result,binary_op); } template inline void transformDOFInterpolation( DOFVector &vec, AbstractFunction > &fct, DOFVector &result, BinaryAbstractFunction &binary_op) { transformDOFInterpolation(&vec, &fct, &result, &binary_op); } // ==================================================================================== template T accumulateDOF_simple(DOFVector *vec, T value0, BinaryAbstractFunction *binary_op) { DOFIterator vecIter(vec, USED_DOFS); T value = value0; for(vecIter.reset(); !vecIter.end(); ++vecIter) { value = (*binary_op)(value, *vecIter); } return value; } template TOut accumulateDOF_simple(DOFVector *vec1, DOFVector *vec2, TOut value0, TertiaryAbstractFunction *tertiary_op) { TEST_EXIT(vec1->getFeSpace() == vec2->getFeSpace())("FeSpaces must be equal!\n"); DOFIterator vec1Iter(vec1, USED_DOFS); DOFIterator vec2Iter(vec2, USED_DOFS); TOut value = value0; for(vec1Iter.reset(),vec2Iter.reset(); !vec1Iter.end(); ++vec1Iter,++vec2Iter) { value = (*tertiary_op)(value, *vec1Iter, *vec2Iter); } return value; } } // end namespace #endif // AMDIS_TRANSFORM_DOF_H