diff --git a/src/finiteVolume/expressions/fields/fvPatchFields/exprFixedValueFvPatchField.C b/src/finiteVolume/expressions/fields/fvPatchFields/exprFixedValueFvPatchField.C index b413d226c21e9a0404e0464e27c6c63fc3a3aec5..d5820ec4820be21713d458f6fcde3cf05af3def8 100644 --- a/src/finiteVolume/expressions/fields/fvPatchFields/exprFixedValueFvPatchField.C +++ b/src/finiteVolume/expressions/fields/fvPatchFields/exprFixedValueFvPatchField.C @@ -5,8 +5,8 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Original code Copyright (C) 2009-2018 Bernhard Gschaider - Copyright (C) 2019 OpenCFD Ltd. + Copyright (C) 2009-2018 Bernhard Gschaider + Copyright (C) 2019-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -89,7 +89,7 @@ Foam::exprFixedValueFvPatchField<Type>::exprFixedValueFvPatchField setDebug(); DebugInFunction << nl; - // Basic sanity + // Require valueExpr if (this->valueExpr_.empty()) { FatalIOErrorInFunction(dict) @@ -97,6 +97,7 @@ Foam::exprFixedValueFvPatchField<Type>::exprFixedValueFvPatchField << exit(FatalIOError); } + driver_.readDict(dict); if (dict.found("value")) @@ -110,11 +111,12 @@ Foam::exprFixedValueFvPatchField<Type>::exprFixedValueFvPatchField { (*this) == this->patchInternalField(); + #ifdef FULLDEBUG WarningInFunction << "No value defined for " << this->internalField().name() << " on " - << this->patch().name() << " - setting to internalField value " - << nl; + << this->patch().name() << " - using patch internal field" << endl; + #endif } if (this->evalOnConstruct_) @@ -161,31 +163,29 @@ Foam::exprFixedValueFvPatchField<Type>::exprFixedValueFvPatchField template<class Type> void Foam::exprFixedValueFvPatchField<Type>::updateCoeffs() { + if (this->updated()) + { + return; + } + if (debug) { InfoInFunction << "Value: " << this->valueExpr_ << nl << "Variables: "; - driver_.writeVariableStrings(Info) << endl; - } - - if (this->updated()) - { - return; + driver_.writeVariableStrings(Info) << nl; + Info<< "... updating" << endl; } - DebugInFunction - << "updating" << nl; // Expression evaluation { + bool evalValue = (!this->valueExpr_.empty() && this->valueExpr_ != "0"); + + driver_.clearVariables(); - if (this->valueExpr_.empty()) - { - (*this) == Zero; - } - else + if (evalValue) { tmp<Field<Type>> tresult(driver_.evaluate<Type>(this->valueExpr_)); @@ -196,6 +196,10 @@ void Foam::exprFixedValueFvPatchField<Type>::updateCoeffs() (*this) == tresult; } + else + { + (*this) == Zero; + } } fixedValueFvPatchField<Type>::updateCoeffs(); diff --git a/src/finiteVolume/expressions/fields/fvPatchFields/exprMixedFvPatchField.C b/src/finiteVolume/expressions/fields/fvPatchFields/exprMixedFvPatchField.C index 4ead4f37ae2befb83523ea29aff1e48c138820b4..e29aafc3877ec2ba4ebb501497500c683abb2edc 100644 --- a/src/finiteVolume/expressions/fields/fvPatchFields/exprMixedFvPatchField.C +++ b/src/finiteVolume/expressions/fields/fvPatchFields/exprMixedFvPatchField.C @@ -5,8 +5,8 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Original code Copyright (C) 2009-2018 Bernhard Gschaider - Copyright (C) 2019 OpenCFD Ltd. + Copyright (C) 2009-2018 Bernhard Gschaider + Copyright (C) 2019-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -91,20 +91,51 @@ Foam::exprMixedFvPatchField<Type>::exprMixedFvPatchField setDebug(); DebugInFunction << nl; - // Basic sanity checks + // Require one or both of valueExpr, gradientExpr if (this->valueExpr_.empty() && this->gradExpr_.empty()) { - if (this->valueExpr_.empty()) + FatalIOErrorInFunction(dict) + << "For " << this->internalField().name() << " on " + << this->patch().name() << nl + << "Require either or both: valueExpr and gradientExpr" << nl + << exit(FatalIOError); + } + + if (this->fracExpr_.empty()) + { + // No fractionExpr. Expect only one of valueExpr or gradientExpr + if (!this->valueExpr_.empty() && !this->gradExpr_.empty()) { - FatalIOErrorInFunction(dict) - << "The valueExpr was not defined!" << nl - << exit(FatalIOError); + IOWarningInFunction(dict) + << "For " << this->internalField().name() << " on " + << this->patch().name() << nl + << "Recommend using fractionExpr when specifying both" + << " valueExpr and gradientExpr. Assuming a value of 1." + << nl << endl; } + } + else if (this->fracExpr_ == "0") + { + // Gradient only. Expect gradientExpr if (this->gradExpr_.empty()) { - FatalIOErrorInFunction(dict) - << "The gradientExpr was not defined!" << nl - << exit(FatalIOError); + IOWarningInFunction(dict) + << "For " << this->internalField().name() << " on " + << this->patch().name() << nl + << "Gradient only, but did not specify gradientExpr." + << nl << endl; + } + } + else if (this->fracExpr_ == "1") + { + // Value only. Expect valueExpr + if (this->valueExpr_.empty()) + { + IOWarningInFunction(dict) + << "For " << this->internalField().name() << " on " + << this->patch().name() << nl + << "Value only, but did not specify valueExpr." + << nl << endl; } } @@ -114,14 +145,12 @@ Foam::exprMixedFvPatchField<Type>::exprMixedFvPatchField // Similar to fvPatchField constructor, which we have bypassed dict.readIfPresent("patchType", this->patchType()); + bool needsRefValue = true; if (dict.found("refValue")) { + needsRefValue = false; this->refValue() = Field<Type>("refValue", dict, p.size()); } - else - { - this->refValue() = this->patchInternalField(); - } if (dict.found("value")) { @@ -130,22 +159,27 @@ Foam::exprMixedFvPatchField<Type>::exprMixedFvPatchField Field<Type>("value", dict, p.size()) ); - if (!dict.found("refValue")) + if (needsRefValue) { // Ensure refValue has a sensible value for the "update" below - this->refValue() = Field<Type>("value", dict, p.size()); + this->refValue() = static_cast<const Field<Type>&>(*this); } } else { + if (needsRefValue) + { + this->refValue() = this->patchInternalField(); + } + fvPatchField<Type>::operator=(this->refValue()); + #ifdef FULLDEBUG WarningInFunction << "No value defined for " - << this->internalField().name() - << " on " << this->patch().name() << " therefore using " - << "the internal field next to the patch" - << endl; + << this->internalField().name() << " on " + << this->patch().name() << " - using patch internal field" << endl; + #endif } @@ -164,7 +198,7 @@ Foam::exprMixedFvPatchField<Type>::exprMixedFvPatchField } else { - this->valueFraction() = 1; + this->valueFraction() = scalar(1); } @@ -234,6 +268,11 @@ Foam::exprMixedFvPatchField<Type>::exprMixedFvPatchField template<class Type> void Foam::exprMixedFvPatchField<Type>::updateCoeffs() { + if (this->updated()) + { + return; + } + if (debug) { InfoInFunction @@ -241,45 +280,67 @@ void Foam::exprMixedFvPatchField<Type>::updateCoeffs() << "Gradient: " << this->gradExpr_ << nl << "Fraction: " << this->fracExpr_ << nl << "Variables: "; - - driver_.writeVariableStrings(Info) << endl; - } - - if (this->updated()) - { - return; + driver_.writeVariableStrings(Info) << nl; + Info<< "... updating" << endl; } - DebugInFunction << " - updating" << nl; - // Expression evaluation { - driver_.clearVariables(); + bool evalValue = (!this->valueExpr_.empty() && this->valueExpr_ != "0"); + bool evalGrad = (!this->gradExpr_.empty() && this->gradExpr_ != "0"); + bool evalFrac = (!this->fracExpr_.empty()); + scalar fraction = 1; + + // Have one or both of valueExpr, gradientExpr (checked in constructor) if (this->valueExpr_.empty()) { - this->refValue() = Zero; + // No value expression -> gradient only + fraction = 0; + evalValue = false; + evalFrac = false; } - else + else if (this->gradExpr_.empty()) { - this->refValue() = driver_.evaluate<Type>(this->valueExpr_); + // No gradient expression -> value only + fraction = 1; + evalGrad = false; + evalFrac = false; } - - bool evalGrad = !this->gradExpr_.empty(); - - if (this->fracExpr_.empty() || this->fracExpr_ == "1") + else if (this->fracExpr_.empty()) { + // No fractionExpr, but has both valueExpr and gradientExpr + // -> treat as value only (warning in constructor) + fraction = 1; evalGrad = false; - this->valueFraction() = scalar(1); + evalFrac = false; } else if (this->fracExpr_ == "0") { - this->valueFraction() = Zero; + // Gradient only + fraction = 0; + evalValue = false; + evalFrac = false; + } + else if (this->fracExpr_ == "1") + { + // Value only + fraction = 1; + evalGrad = false; + evalFrac = false; + } + + + driver_.clearVariables(); + + if (evalValue) + { + this->refValue() = driver_.evaluate<Type>(this->valueExpr_); } else { - this->valueFraction() = driver_.evaluate<scalar>(this->fracExpr_); + this->refValue() = Zero; } if (evalGrad) @@ -290,6 +351,15 @@ void Foam::exprMixedFvPatchField<Type>::updateCoeffs() { this->refGrad() = Zero; } + + if (evalFrac) + { + this->valueFraction() = driver_.evaluate<scalar>(this->fracExpr_); + } + else + { + this->valueFraction() = fraction; + } } mixedFvPatchField<Type>::updateCoeffs();