tmp<Foam::fvVectorMatrix> kinematicSingleLayer::solveMomentum ( const volScalarField& pu, const volScalarField& pp ) { if (debug) { InfoInFunction << endl; } // Momentum tmp<fvVectorMatrix> tUEqn ( fvm::ddt(deltaRho_, U_) + fvm::div(phi_, U_) == - USp_ // - fvm::SuSp(rhoSp_, U_) - rhoSp_*U_ + forces_.correct(U_) + turbulence_->Su(U_) ); fvVectorMatrix& UEqn = tUEqn.ref(); UEqn.relax(); if (momentumPredictor_) { solve ( UEqn == fvc::reconstruct ( - fvc::interpolate(delta_) * ( regionMesh().magSf() * ( fvc::snGrad(pu, "snGrad(p)") + fvc::snGrad(pp, "snGrad(p)")*fvc::interpolate(delta_) + fvc::snGrad(delta_)*fvc::interpolate(pp) ) - fvc::flux(rho_*gTan()) ) ) ); // Remove any patch-normal components of velocity U_ -= nHat()*(nHat() & U_); U_.correctBoundaryConditions(); } return tUEqn; }
void kinematicSingleLayer::updateSurfaceVelocities() { // Push boundary film velocity values into internal field for (label i=0; i<intCoupledPatchIDs_.size(); i++) { label patchi = intCoupledPatchIDs_[i]; const polyPatch& pp = regionMesh().boundaryMesh()[patchi]; UIndirectList<vector>(Uw_, pp.faceCells()) = U_.boundaryField()[patchi]; } Uw_ -= nHat()*(Uw_ & nHat()); Uw_.correctBoundaryConditions(); Us_ = turbulence_->Us(); }
Foam::tmp<Foam::gpuField<Type> > Foam::symmetryPlaneFvPatchField<Type>::snGradTransformDiag() const { vector nHat(symmetryPlanePatch_.n()); const vector diag ( mag(nHat.component(vector::X)), mag(nHat.component(vector::Y)), mag(nHat.component(vector::Z)) ); return tmp<gpuField<Type> > ( new gpuField<Type> ( this->size(), transformMask<Type> ( //pow<vector, pTraits<Type>::rank>(diag) pow ( diag, pTraits<typename powProduct<vector, pTraits<Type>::rank> ::type>::zero ) ) ) ); }
Foam::tmp<Foam::gpuField<Type> > Foam::symmetryPlaneFvPatchField<Type>::snGrad() const { vector nHat(symmetryPlanePatch_.n()); const gpuField<Type> iF(this->patchInternalField()); return (transform(I - 2.0*sqr(nHat), iF) - iF) *(this->patch().deltaCoeffs()/2.0); }
tmp<Field<Type> > mixedFixedValueSlipFvPatchField<Type>::snGradTransformDiag() const { vectorField nHat(this->patch().nf()); vectorField diag(nHat.size()); diag.replace(vector::X, mag(nHat.component(vector::X))); diag.replace(vector::Y, mag(nHat.component(vector::Y))); diag.replace(vector::Z, mag(nHat.component(vector::Z))); return valueFraction_*Type(pTraits<Type>::one) + (1.0 - valueFraction_) *transformFieldMask<Type>(pow<vector, pTraits<Type>::rank>(diag)); }
void Foam::symmetryPlaneFvPatchField<Type>::evaluate(const Pstream::commsTypes) { if (!this->updated()) { this->updateCoeffs(); } vector nHat(symmetryPlanePatch_.n()); const gpuField<Type> iF(this->patchInternalField()); gpuField<Type>::operator= ( (iF + transform(I - 2.0*sqr(nHat), iF))/2.0 ); transformFvPatchField<Type>::evaluate(); }
void mixedFixedValueSlipFvPatchField<Type>::evaluate(const Pstream::commsTypes) { if (!this->updated()) { this->updateCoeffs(); } vectorField nHat(this->patch().nf()); Field<Type>::operator= ( valueFraction_*refValue_ + (1.0 - valueFraction_) *transform(I - nHat*nHat, this->patchInternalField()) ); transformFvPatchField<Type>::evaluate(); }
void kinematicSingleLayer::solveThickness ( const volScalarField& pu, const volScalarField& pp, const fvVectorMatrix& UEqn ) { if (debug) { InfoInFunction << endl; } volScalarField rUA(1.0/UEqn.A()); U_ = rUA*UEqn.H(); surfaceScalarField deltarUAf(fvc::interpolate(delta_*rUA)); surfaceScalarField rhof(fvc::interpolate(rho_)); surfaceScalarField phiAdd ( "phiAdd", regionMesh().magSf() * ( fvc::snGrad(pu, "snGrad(p)") + fvc::snGrad(pp, "snGrad(p)")*fvc::interpolate(delta_) ) - fvc::flux(rho_*gTan()) ); constrainFilmField(phiAdd, 0.0); surfaceScalarField phid ( "phid", fvc::flux(U_*rho_) - deltarUAf*phiAdd*rhof ); constrainFilmField(phid, 0.0); surfaceScalarField ddrhorUAppf ( "deltaCoeff", fvc::interpolate(delta_)*deltarUAf*rhof*fvc::interpolate(pp) ); regionMesh().setFluxRequired(delta_.name()); for (int nonOrth=0; nonOrth<=nNonOrthCorr_; nonOrth++) { // Film thickness equation fvScalarMatrix deltaEqn ( fvm::ddt(rho_, delta_) + fvm::div(phid, delta_) - fvm::laplacian(ddrhorUAppf, delta_) == - rhoSp_ ); deltaEqn.solve(); if (nonOrth == nNonOrthCorr_) { phiAdd += fvc::interpolate(pp) * fvc::snGrad(delta_) * regionMesh().magSf(); phi_ == deltaEqn.flux(); } } // Bound film thickness by a minimum of zero delta_.max(0.0); // Update U field U_ -= fvc::reconstruct(deltarUAf*phiAdd); // Remove any patch-normal components of velocity U_ -= nHat()*(nHat() & U_); U_.correctBoundaryConditions(); // Continuity check continuityCheck(); }