Foam::tmp<Foam::Field<Type> > Foam::fvMatrix<Type>::residual() const { // Complete matrix assembly. HJ, 17/Apr/2012 fvMatrix& m = const_cast<fvMatrix&>(*this); m.completeAssembly(); // Bug fix: Creating a tmp out of a const reference will change the field // HJ, 15/Apr/2011 tmp<Field<Type> > tres(new Field<Type>(source_)); Field<Type>& res = tres(); addBoundarySource(res); // Make a copy of interfaces: no longer a reference // HJ, 20/Nov/2007 lduInterfaceFieldPtrsList interfaces = psi_.boundaryField().interfaces(); // Loop over field components for (direction cmpt = 0; cmpt < Type::nComponents; cmpt++) { scalarField psiCmpt = psi_.internalField().component(cmpt); scalarField boundaryDiagCmpt(psi_.size(), 0); addBoundaryDiag(boundaryDiagCmpt, cmpt); FieldField<Field, scalar> bouCoeffsCmpt ( boundaryCoeffs_.component(cmpt) ); res.replace ( cmpt, lduMatrix::residual ( psiCmpt, res.component(cmpt) - boundaryDiagCmpt*psiCmpt, bouCoeffsCmpt, interfaces, cmpt ) ); } return tres; }
Foam::tmp<Foam::Field<Type>> Foam::fvMatrix<Type>::residual() const { tmp<Field<Type>> tres(new Field<Type>(source_)); Field<Type>& res = tres(); addBoundarySource(res); // Loop over field components for (direction cmpt=0; cmpt<Type::nComponents; cmpt++) { scalarField psiCmpt(psi_.internalField().component(cmpt)); scalarField boundaryDiagCmpt(psi_.size(), 0.0); addBoundaryDiag(boundaryDiagCmpt, cmpt); FieldField<Field, scalar> bouCoeffsCmpt ( boundaryCoeffs_.component(cmpt) ); res.replace ( cmpt, lduMatrix::residual ( psiCmpt, res.component(cmpt) - boundaryDiagCmpt*psiCmpt, bouCoeffsCmpt, psi_.boundaryField().scalarInterfaces(), cmpt ) ); } return tres; }