void Foam::porousZone::modifyDdt(fvMatrix<Type>& m) const { if (porosity_ < 1) { const labelList& cells = mesh_.cellZones()[cellZoneID_]; forAll(cells, i) { m.diag()[cells[i]] *= porosity_; m.source()[cells[i]] *= porosity_; } }
void Foam::fv::interRegionExplicitPorositySource::addSup ( fvMatrix<vector>& eqn, const label fieldI ) { initialise(); const fvMesh& nbrMesh = mesh_.time().lookupObject<fvMesh>(nbrRegionName_); const volVectorField& U = eqn.psi(); volVectorField UNbr ( IOobject ( name_ + ":UNbr", nbrMesh.time().timeName(), nbrMesh, IOobject::NO_READ, IOobject::NO_WRITE ), nbrMesh, dimensionedVector("zero", U.dimensions(), vector::zero) ); // map local velocity onto neighbour region meshInterp().mapSrcToTgt ( U.internalField(), plusEqOp<vector>(), UNbr.internalField() ); fvMatrix<vector> nbrEqn(UNbr, eqn.dimensions()); porosityPtr_->addResistance(nbrEqn); // convert source from neighbour to local region fvMatrix<vector> porosityEqn(U, eqn.dimensions()); scalarField& Udiag = porosityEqn.diag(); vectorField& Usource = porosityEqn.source(); Udiag.setSize(eqn.diag().size(), 0.0); Usource.setSize(eqn.source().size(), vector::zero); meshInterp().mapTgtToSrc(nbrEqn.diag(), plusEqOp<scalar>(), Udiag); meshInterp().mapTgtToSrc(nbrEqn.source(), plusEqOp<vector>(), Usource); eqn -= porosityEqn; }
void Foam::jjc2014Zone::modifyDdt(fvMatrix<Type>& m) const { if (porosity_ < 1) { const labelList& cells = mesh_.cellZones()[cellZoneID_]; scalar coeff( (1.0 + addedMassCoeff_ * ( 1 - porosity_ ) / porosity_) / porosity_ ); forAll(cells, i) { m.diag()[cells[i]] *= coeff; m.source()[cells[i]] *= coeff; } }
void fvBlockMatrix<Type>::insertDiagSource ( const direction dir, fvMatrix<matrixType>& matrix ) { matrix.completeAssembly(); // Save a copy for different components scalarField& diag = matrix.diag(); scalarField saveDiag(diag); // Add source boundary contribution Field<matrixType>& source = matrix.source(); matrix.addBoundarySource(source, false); const direction nCmpts = pTraits<matrixType>::nComponents; direction localDir = dir; // Get reference to this source field of block system Field<Type>& b = this->source(); if ( // This is needed if the matrixType is <vector>, then you need to grab // coeffs as linear. Consider doing a matrixType check also. // VV, 17/March/2014 this->diag().activeType() != blockCoeffBase::SQUARE ) { typename CoeffField<Type>::linearTypeField& blockDiag = this->diag().asLinear(); for (direction cmptI = 0; cmptI < nCmpts; cmptI++) { matrix.addBoundaryDiag(diag, cmptI); scalarField sourceCmpt(source.component(cmptI)); // FieldField<Field, scalar> bouCoeffsCmpt // ( // matrix.boundaryCoeffs().component(cmptI) // ); // Possible problem for coupled non-aligned boundaries. // VV, 14/May/2014. // matrix.correctImplicitBoundarySource // ( // bouCoeffsCmpt, // sourceCmpt, // cmptI // ); forAll (diag, cellI) { blockDiag[cellI](localDir) = diag[cellI]; b[cellI](localDir) += sourceCmpt[cellI]; } localDir++; // Reset diagonal diag = saveDiag; }