void Foam::lduMatrix::H(Foam::gpuField<Type>& Hpsi,const gpuField<Type>& psi) const { Hpsi = pTraits<Type>::zero; if (lowerPtr_ || upperPtr_) { const scalargpuField& Lower = this->lower(); const scalargpuField& Upper = this->upper(); const labelgpuList& l = lduAddr().lowerAddr(); const labelgpuList& u = lduAddr().upperAddr(); matrixOperation ( Hpsi.begin(), Hpsi, lduAddr(), matrixCoeffsMultiplyFunctor<Type,scalar,negateUnaryOperatorFunctor<Type,Type> > ( psi.data(), Upper.data(), u.data(), negateUnaryOperatorFunctor<Type,Type>() ), matrixCoeffsMultiplyFunctor<Type,scalar,negateUnaryOperatorFunctor<Type,Type> > ( psi.data(), Lower.data(), l.data(), negateUnaryOperatorFunctor<Type,Type>() ) ); } }
Foam::tmp<Foam::gpuField<Type> > Foam::lduMatrix::H(const gpuField<Type>& psi) const { tmp<gpuField<Type> > tHpsi ( new gpuField<Type>(lduAddr().size(), pTraits<Type>::zero) ); if (lowerPtr_ || upperPtr_) { gpuField<Type> & Hpsi = tHpsi(); const scalargpuField& Lower = this->lower(); const scalargpuField& Upper = this->upper(); const labelgpuList& l = lduAddr().lowerAddr(); const labelgpuList& u = lduAddr().upperAddr(); matrixOperation ( Hpsi.begin(), Hpsi, lduAddr(), matrixCoeffsMultiplyFunctor<Type,scalar,negateUnaryOperatorFunctor<Type,Type> > ( psi.data(), Upper.data(), u.data(), negateUnaryOperatorFunctor<Type,Type>() ), matrixCoeffsMultiplyFunctor<Type,scalar,negateUnaryOperatorFunctor<Type,Type> > ( psi.data(), Lower.data(), l.data(), negateUnaryOperatorFunctor<Type,Type>() ) ); } return tHpsi; }
pmatrix subMatrix(pmatrix a, pmatrix b){ if (a == NULL || b == NULL || a->size != b->size || a->size == 0 || b->size == 0) return NULL; return matrixOperation(a, b, *(sub)); }