Foam::tmp<Foam::Field<Type>> Foam::transformFvPatchField<Type>::gradientBoundaryCoeffs() const { return snGrad() - cmptMultiply(gradientInternalCoeffs(), this->patchInternalField()); }
void Foam::solidWallHeatFluxTemperatureFvPatchScalarField::updateCoeffs() { if (updated()) { return; } gradient() = q_/K(); fixedGradientFvPatchScalarField::updateCoeffs(); if (debug) { scalar Q = gSum(K()*patch().magSf()*snGrad()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->dimensionedInternalField().name() << " :" << " heatFlux:" << Q << " walltemperature " << " min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } }
void thermalBaffle1DFvPatchScalarField<solidType>::updateCoeffs() { if (updated()) { return; } // Since we're inside initEvaluate/evaluate there might be processor // comms underway. Change the tag we use. int oldTag = UPstream::msgType(); UPstream::msgType() = oldTag+1; const mapDistribute& mapDist = this->mappedPatchBase::map(); const label patchi = patch().index(); const label nbrPatchi = samplePolyPatch().index(); if (baffleActivated_) { const fvPatch& nbrPatch = patch().boundaryMesh()[nbrPatchi]; const compressible::turbulenceModel& turbModel = db().template lookupObject<compressible::turbulenceModel> ( "turbulenceModel" ); // local properties const scalarField kappaw(turbModel.kappaEff(patchi)); const fvPatchScalarField& Tp = patch().template lookupPatchField<volScalarField, scalar>(TName_); scalarField Qr(Tp.size(), 0.0); if (QrName_ != "none") { Qr = patch().template lookupPatchField<volScalarField, scalar> (QrName_); Qr = QrRelaxation_*Qr + (1.0 - QrRelaxation_)*QrPrevious_; QrPrevious_ = Qr; } tmp<scalarField> Ti = patchInternalField(); scalarField myKDelta(patch().deltaCoeffs()*kappaw); // nrb properties scalarField nbrTp = turbModel.thermo().T().boundaryField()[nbrPatchi]; mapDist.distribute(nbrTp); // solid properties scalarField kappas(patch().size(), 0.0); forAll(kappas, i) { kappas[i] = solid().kappa(0.0, (Tp[i] + nbrTp[i])/2.0); } const scalarField KDeltaSolid(kappas/baffleThickness()); const scalarField alpha(KDeltaSolid - Qr/Tp); valueFraction() = alpha/(alpha + myKDelta); refValue() = (KDeltaSolid*nbrTp + Qs()/2.0)/alpha; if (debug) { scalar Q = gAverage(kappaw*snGrad()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->dimensionedInternalField().name() << " <- " << nbrPatch.name() << ':' << this->dimensionedInternalField().name() << " :" << " heat[W]:" << Q << " walltemperature " << " min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } }
void turbulentTemperatureCoupledBaffleMixedFvPatchScalarField::updateCoeffs() { if (updated()) { return; } // Since we're inside initEvaluate/evaluate there might be processor // comms underway. Change the tag we use. int oldTag = UPstream::msgType(); UPstream::msgType() = oldTag+1; // Get the coupling information from the mappedPatchBase const mappedPatchBase& mpp = refCast<const mappedPatchBase>(patch().patch()); const polyMesh& nbrMesh = mpp.sampleMesh(); const label samplePatchi = mpp.samplePolyPatch().index(); const fvPatch& nbrPatch = refCast<const fvMesh>(nbrMesh).boundary()[samplePatchi]; // Calculate the temperature by harmonic averaging // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ const turbulentTemperatureCoupledBaffleMixedFvPatchScalarField& nbrField = refCast < const turbulentTemperatureCoupledBaffleMixedFvPatchScalarField > ( nbrPatch.lookupPatchField<volScalarField, scalar> ( TnbrName_ ) ); // Swap to obtain full local values of neighbour internal field tmp<scalarField> nbrIntFld(new scalarField(nbrField.size(), 0.0)); tmp<scalarField> nbrKDelta(new scalarField(nbrField.size(), 0.0)); if (contactRes_ == 0.0) { nbrIntFld.ref() = nbrField.patchInternalField(); nbrKDelta.ref() = nbrField.kappa(nbrField)*nbrPatch.deltaCoeffs(); } else { nbrIntFld.ref() = nbrField; nbrKDelta.ref() = contactRes_; } mpp.distribute(nbrIntFld.ref()); mpp.distribute(nbrKDelta.ref()); tmp<scalarField> myKDelta = kappa(*this)*patch().deltaCoeffs(); // Both sides agree on // - temperature : (myKDelta*fld + nbrKDelta*nbrFld)/(myKDelta+nbrKDelta) // - gradient : (temperature-fld)*delta // We've got a degree of freedom in how to implement this in a mixed bc. // (what gradient, what fixedValue and mixing coefficient) // Two reasonable choices: // 1. specify above temperature on one side (preferentially the high side) // and above gradient on the other. So this will switch between pure // fixedvalue and pure fixedgradient // 2. specify gradient and temperature such that the equations are the // same on both sides. This leads to the choice of // - refGradient = zero gradient // - refValue = neighbour value // - mixFraction = nbrKDelta / (nbrKDelta + myKDelta()) this->refValue() = nbrIntFld(); this->refGrad() = 0.0; this->valueFraction() = nbrKDelta()/(nbrKDelta() + myKDelta()); mixedFvPatchScalarField::updateCoeffs(); if (debug) { scalar Q = gSum(kappa(*this)*patch().magSf()*snGrad()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->internalField().name() << " <- " << nbrMesh.name() << ':' << nbrPatch.name() << ':' << this->internalField().name() << " :" << " heat transfer rate:" << Q << " walltemperature " << " min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } // Restore tag UPstream::msgType() = oldTag; }
void Foam::solidWallMixedTemperatureCoupledFvPatchScalarField::updateCoeffs() { if (updated()) { return; } // Get the coupling information from the directMappedPatchBase const directMappedPatchBase& mpp = refCast<const directMappedPatchBase> ( patch().patch() ); const polyMesh& nbrMesh = mpp.sampleMesh(); const fvPatch& nbrPatch = refCast<const fvMesh> ( nbrMesh ).boundary()[mpp.samplePolyPatch().index()]; // Force recalculation of mapping and schedule const mapDistribute& distMap = mpp.map(); tmp<scalarField> intFld = patchInternalField(); const solidWallMixedTemperatureCoupledFvPatchScalarField& nbrField = refCast<const solidWallMixedTemperatureCoupledFvPatchScalarField> ( nbrPatch.lookupPatchField<volScalarField, scalar> ( neighbourFieldName_ ) ); // Swap to obtain full local values of neighbour internal field scalarField nbrIntFld = nbrField.patchInternalField(); mapDistribute::distribute ( Pstream::defaultCommsType, distMap.schedule(), distMap.constructSize(), distMap.subMap(), // what to send distMap.constructMap(), // what to receive nbrIntFld ); // Swap to obtain full local values of neighbour K*delta scalarField nbrKDelta = nbrField.K()*nbrPatch.deltaCoeffs(); mapDistribute::distribute ( Pstream::defaultCommsType, distMap.schedule(), distMap.constructSize(), distMap.subMap(), // what to send distMap.constructMap(), // what to receive nbrKDelta ); tmp<scalarField> myKDelta = K()*patch().deltaCoeffs(); // Both sides agree on // - temperature : (myKDelta*fld + nbrKDelta*nbrFld)/(myKDelta+nbrKDelta) // - gradient : (temperature-fld)*delta // We've got a degree of freedom in how to implement this in a mixed bc. // (what gradient, what fixedValue and mixing coefficient) // Two reasonable choices: // 1. specify above temperature on one side (preferentially the high side) // and above gradient on the other. So this will switch between pure // fixedvalue and pure fixedgradient // 2. specify gradient and temperature such that the equations are the // same on both sides. This leads to the choice of // - refGradient = zero gradient // - refValue = neighbour value // - mixFraction = nbrKDelta / (nbrKDelta + myKDelta()) this->refValue() = nbrIntFld; this->refGrad() = 0.0; this->valueFraction() = nbrKDelta / (nbrKDelta + myKDelta()); mixedFvPatchScalarField::updateCoeffs(); if (debug) { scalar Q = gSum(K()*patch().magSf()*snGrad()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->dimensionedInternalField().name() << " <- " << nbrMesh.name() << ':' << nbrPatch.name() << ':' << this->dimensionedInternalField().name() << " :" << " heat[W]:" << Q << " walltemperature " << " min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } }
void turbulentTemperatureRadCoupledMixedFvPatchScalarField::updateCoeffs() { if (updated()) { return; } // Since we're inside initEvaluate/evaluate there might be processor // comms underway. Change the tag we use. int oldTag = UPstream::msgType(); UPstream::msgType() = oldTag+1; // Get the coupling information from the mappedPatchBase const mappedPatchBase& mpp = refCast<const mappedPatchBase>(patch().patch()); const polyMesh& nbrMesh = mpp.sampleMesh(); const label samplePatchi = mpp.samplePolyPatch().index(); const fvPatch& nbrPatch = refCast<const fvMesh>(nbrMesh).boundary()[samplePatchi]; scalarField Tc(patchInternalField()); scalarField& Tp = *this; const turbulentTemperatureRadCoupledMixedFvPatchScalarField& nbrField = refCast <const turbulentTemperatureRadCoupledMixedFvPatchScalarField> ( nbrPatch.lookupPatchField<volScalarField, scalar>(TnbrName_) ); // Swap to obtain full local values of neighbour internal field scalarField TcNbr(nbrField.patchInternalField()); mpp.distribute(TcNbr); // Swap to obtain full local values of neighbour K*delta scalarField KDeltaNbr; if (contactRes_ == 0.0) { KDeltaNbr = nbrField.kappa(nbrField)*nbrPatch.deltaCoeffs(); } else { KDeltaNbr.setSize(nbrField.size(), contactRes_); } mpp.distribute(KDeltaNbr); scalarField KDelta(kappa(Tp)*patch().deltaCoeffs()); scalarField Qr(Tp.size(), 0.0); if (QrName_ != "none") { Qr = patch().lookupPatchField<volScalarField, scalar>(QrName_); } scalarField QrNbr(Tp.size(), 0.0); if (QrNbrName_ != "none") { QrNbr = nbrPatch.lookupPatchField<volScalarField, scalar>(QrNbrName_); mpp.distribute(QrNbr); } valueFraction() = KDeltaNbr/(KDeltaNbr + KDelta); refValue() = TcNbr; refGrad() = (Qr + QrNbr)/kappa(Tp); mixedFvPatchScalarField::updateCoeffs(); if (debug) { scalar Q = gSum(kappa(Tp)*patch().magSf()*snGrad()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->internalField().name() << " <- " << nbrMesh.name() << ':' << nbrPatch.name() << ':' << this->internalField().name() << " :" << " heat transfer rate:" << Q << " walltemperature " << " min:" << gMin(Tp) << " max:" << gMax(Tp) << " avg:" << gAverage(Tp) << endl; } // Restore tag UPstream::msgType() = oldTag; }
void Foam::turbulentTemperatureCoupledBaffleFvPatchScalarField::updateCoeffs() { if (updated()) { return; } // Get the coupling information from the directMappedPatchBase const directMappedPatchBase& mpp = refCast<const directMappedPatchBase> ( patch().patch() ); const polyMesh& nbrMesh = mpp.sampleMesh(); const fvPatch& nbrPatch = refCast<const fvMesh> ( nbrMesh ).boundary()[mpp.samplePolyPatch().index()]; // Force recalculation of mapping and schedule const mapDistribute& distMap = mpp.map(); (void)distMap.schedule(); tmp<scalarField> intFld = patchInternalField(); if (interfaceOwner(nbrMesh, nbrPatch.patch())) { // Note: other side information could be cached - it only needs // to be updated the first time round the iteration (i.e. when // switching regions) but unfortunately we don't have this information. // Calculate the temperature by harmonic averaging // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ const turbulentTemperatureCoupledBaffleFvPatchScalarField& nbrField = refCast<const turbulentTemperatureCoupledBaffleFvPatchScalarField> ( nbrPatch.lookupPatchField<volScalarField, scalar> ( neighbourFieldName_ ) ); // Swap to obtain full local values of neighbour internal field scalarField nbrIntFld = nbrField.patchInternalField(); mapDistribute::distribute ( Pstream::defaultCommsType, distMap.schedule(), distMap.constructSize(), distMap.subMap(), // what to send distMap.constructMap(), // what to receive nbrIntFld ); // Swap to obtain full local values of neighbour K*delta scalarField nbrKDelta = nbrField.K()*nbrPatch.deltaCoeffs(); mapDistribute::distribute ( Pstream::defaultCommsType, distMap.schedule(), distMap.constructSize(), distMap.subMap(), // what to send distMap.constructMap(), // what to receive nbrKDelta ); tmp<scalarField> myKDelta = K()*patch().deltaCoeffs(); // Calculate common wall temperature. Reuse *this to store common value. scalarField Twall ( (myKDelta()*intFld() + nbrKDelta*nbrIntFld) / (myKDelta() + nbrKDelta) ); // Assign to me fvPatchScalarField::operator=(Twall); // Distribute back and assign to neighbour mapDistribute::distribute ( Pstream::defaultCommsType, distMap.schedule(), nbrField.size(), distMap.constructMap(), // reverse : what to send distMap.subMap(), Twall ); const_cast<turbulentTemperatureCoupledBaffleFvPatchScalarField&> ( nbrField ).fvPatchScalarField::operator=(Twall); } if (debug) { //tmp<scalarField> normalGradient = // (*this-intFld()) // * patch().deltaCoeffs(); scalar Q = gSum(K()*patch().magSf()*snGrad()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->dimensionedInternalField().name() << " <- " << nbrMesh.name() << ':' << nbrPatch.name() << ':' << this->dimensionedInternalField().name() << " :" << " heat[W]:" << Q << " walltemperature " << " min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } fixedValueFvPatchScalarField::updateCoeffs(); }
void surfaceChargeCoupledFvPatchScalarField::updateCoeffs() { if (updated()) { return; } // Since we're inside initEvaluate/evaluate there might be processor // comms underway. Change the tag we use. int oldTag = UPstream::msgType(); UPstream::msgType() = oldTag+1; // Get the coupling information from the mappedPatchBase const mappedPatchBase& mpp = refCast<const mappedPatchBase> ( patch().patch() ); const polyMesh& nbrMesh = mpp.sampleMesh(); const fvPatch& nbrPatch = refCast<const fvMesh> ( nbrMesh ).boundary()[mpp.samplePolyPatch().index()]; // Force recalculation of mapping and schedule const mapDistribute& distMap = mpp.map(); tmp<scalarField> intFld = patchInternalField(); // Calculate the temperature by harmonic averaging // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ const surfaceChargeCoupledFvPatchScalarField& nbrField = refCast < const surfaceChargeCoupledFvPatchScalarField > ( nbrPatch.lookupPatchField<volScalarField, scalar> ( neighbourFieldName_ ) ); // Swap to obtain full local values of neighbour internal field scalarField nbrIntFld(nbrField.patchInternalField()); distMap.distribute(nbrIntFld); // Swap to obtain full local values of neighbour K*delta scalarField nbrKDelta(nbrEpr_*nbrPatch.deltaCoeffs()); distMap.distribute(nbrKDelta); tmp<scalarField> myKDelta = myEpr_*patch().deltaCoeffs(); // Both sides agree on // - temperature : (myKDelta*fld + nbrKDelta*nbrFld)/(myKDelta+nbrKDelta) // - gradient : (temperature-fld)*delta // We've got a degree of freedom in how to implement this in a mixed bc. // (what gradient, what fixedValue and mixing coefficient) // Two reasonable choices: // 1. specify above temperature on one side (preferentially the high side) // and above gradient on the other. So this will switch between pure // fixedvalue and pure fixedgradient // 2. specify gradient and temperature such that the equations are the // same on both sides. This leads to the choice of // - refGradient = zeroGradient // - refValue = neighbour value // - mixFraction = nbrKDelta / (nbrKDelta + myKDelta()) // the implementation of the jump condition across a surface with surface // charges by virtual of mixed boundary condition yields: // - refGradient = sigma / myK; // - refValue = neighbour value // - mixFraction = nbrKDelta / (nbrKDelta + myKDelta()) this->refValue() = nbrIntFld; this->refGrad() = surfCharge_ / myEpr_; this->valueFraction() = nbrKDelta / (nbrKDelta + myKDelta()); mixedFvPatchScalarField::updateCoeffs(); if (debug) { scalar Q = gSum(myEpr_*patch().magSf()*snGrad()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->dimensionedInternalField().name() << " <- " << nbrMesh.name() << ':' << nbrPatch.name() << ':' << this->dimensionedInternalField().name() << " :" << " heat[W]:" << Q << " walltemperature " << " min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } // Restore tag UPstream::msgType() = oldTag; }