ENH: configurable output temperature for externalCoupled mixed T BC (#1072)

- Uses the user-specified value for outputTemperature:

  {
      type  externalCoupledTemperature;
      outputTemperture  fluid;  // or wall;
  }

  Otherwises uses 'wall' as a default (for compatibility) and emits a
  warning.

  The T.out header now reflects the type of output. Eg,

     # Values: area Tfluid qDot htc
This commit is contained in:
Mark Olesen 2018-12-02 17:35:48 +01:00
parent 1116ba803a
commit 550e47629b
25 changed files with 1255 additions and 37 deletions

View File

@ -95,14 +95,6 @@ externalCoupledMixedFvPatchField
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template<class Type>
Foam::externalCoupledMixedFvPatchField<Type>::
~externalCoupledMixedFvPatchField()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type>

View File

@ -146,19 +146,19 @@ public:
//- Destructor
virtual ~externalCoupledMixedFvPatchField();
virtual ~externalCoupledMixedFvPatchField() = default;
// Member functions
//- Write header
virtual void writeHeader(Ostream&) const;
virtual void writeHeader(Ostream& os) const;
//- Write data
virtual void writeData(Ostream&) const;
virtual void writeData(Ostream& os) const;
//- Read data
virtual void readData(Istream&);
virtual void readData(Istream& is);
};

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2013-2016 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
\\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -28,6 +28,21 @@ License
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "Enum.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
const Foam::Enum
<
Foam::externalCoupledTemperatureMixedFvPatchScalarField::
outputTemperatureType
>
Foam::externalCoupledTemperatureMixedFvPatchScalarField::outputTemperatureNames
({
{ outputTemperatureType::FLUID, "fluid" },
{ outputTemperatureType::WALL, "wall" },
});
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
@ -36,7 +51,14 @@ void Foam::externalCoupledTemperatureMixedFvPatchScalarField::writeHeader
Ostream& os
) const
{
os << "# Values: magSf T qDot htc" << endl;
if (outputTemperature_ == outputTemperatureType::FLUID)
{
os << "# Values: area Tfluid qDot htc" << endl;
}
else
{
os << "# Values: area Twall qDot htc" << endl;
}
}
@ -49,7 +71,8 @@ externalCoupledTemperatureMixedFvPatchScalarField
const DimensionedField<scalar, volMesh>& iF
)
:
externalCoupledMixedFvPatchField<scalar>(p, iF)
externalCoupledMixedFvPatchField<scalar>(p, iF),
outputTemperature_(outputTemperatureType::WALL)
{}
@ -62,7 +85,8 @@ externalCoupledTemperatureMixedFvPatchScalarField
const fvPatchFieldMapper& mapper
)
:
externalCoupledMixedFvPatchField<scalar>(ptf, p, iF, mapper)
externalCoupledMixedFvPatchField<scalar>(ptf, p, iF, mapper),
outputTemperature_(ptf.outputTemperature_)
{}
@ -75,8 +99,23 @@ externalCoupledTemperatureMixedFvPatchScalarField
)
:
//externalCoupledMixedFvPatchField<scalar>(p, iF, dict)
externalCoupledMixedFvPatchField<scalar>(p, iF)
externalCoupledMixedFvPatchField<scalar>(p, iF),
outputTemperature_(outputTemperatureType::WALL)
{
if (dict.found("outputTemperature"))
{
outputTemperature_ =
outputTemperatureNames.get("outputTemperature", dict);
}
else
{
WarningInFunction
<< "outputTemperature not specified "
<< flatOutput(outputTemperatureNames) << nl
<< "using 'wall' as compatibility default" << nl
<< endl;
}
if (dict.found("refValue"))
{
// Initialise same way as mixed
@ -116,7 +155,8 @@ externalCoupledTemperatureMixedFvPatchScalarField
const externalCoupledTemperatureMixedFvPatchScalarField& ecmpf
)
:
externalCoupledMixedFvPatchField<scalar>(ecmpf)
externalCoupledMixedFvPatchField<scalar>(ecmpf),
outputTemperature_(ecmpf.outputTemperature_)
{}
@ -127,14 +167,8 @@ externalCoupledTemperatureMixedFvPatchScalarField
const DimensionedField<scalar, volMesh>& iF
)
:
externalCoupledMixedFvPatchField<scalar>(ecmpf, iF)
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::externalCoupledTemperatureMixedFvPatchScalarField::
~externalCoupledTemperatureMixedFvPatchScalarField()
externalCoupledMixedFvPatchField<scalar>(ecmpf, iF),
outputTemperature_(ecmpf.outputTemperature_)
{}
@ -148,7 +182,7 @@ void Foam::externalCoupledTemperatureMixedFvPatchScalarField::writeData
const label patchi = patch().index();
// Heat flux [W/m2]
scalarField qDot(this->patch().size(), 0.0);
scalarField qDot(this->patch().size(), Zero);
typedef compressible::turbulenceModel cmpTurbModelType;
@ -189,10 +223,11 @@ void Foam::externalCoupledTemperatureMixedFvPatchScalarField::writeData
<< "thermo model to be available" << exit(FatalError);
}
// Patch temperature [K]
// Patch (wall) temperature [K]
const scalarField& Tp(*this);
// Near wall cell temperature [K]
// Near wall cell (fluid) temperature [K]
const scalarField Tc(patchInternalField());
// Heat transfer coefficient [W/m2/K]
@ -200,13 +235,19 @@ void Foam::externalCoupledTemperatureMixedFvPatchScalarField::writeData
const Field<scalar>& magSf(this->patch().magSf());
const UList<scalar>& Tout =
(
outputTemperature_ == outputTemperatureType::FLUID
? Tc
: Tp
);
forAll(patch(), facei)
{
os << magSf[facei] << token::SPACE
<< Tp[facei] << token::SPACE
<< Tout[facei] << token::SPACE
<< qDot[facei] << token::SPACE
<< htc[facei] << token::SPACE
<< nl;
<< htc[facei] << nl;
}
}
@ -235,6 +276,20 @@ void Foam::externalCoupledTemperatureMixedFvPatchScalarField::readData
}
void Foam::externalCoupledTemperatureMixedFvPatchScalarField::write
(
Ostream& os
) const
{
externalCoupledMixedFvPatchField::write(os);
os.writeEntry
(
"outputTemperature",
outputTemperatureNames[outputTemperature_]
);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2013-2016 OpenFOAM Foundation
\\/ M anipulation |
\\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -87,6 +87,14 @@ Description
To be used in combination with the functionObjects::externalCoupled
functionObject.
Usage
\table
Property | Description | Required | Default
outputTemperature | The output temperature: fluid/wall | yes |
\endtable
Note the
SeeAlso
externalCoupledFunctionObject
mixedFvPatchField
@ -101,6 +109,7 @@ SourceFiles
#define externalCoupledTemperatureMixedFvPatchScalarField_H
#include "externalCoupledMixedFvPatchFields.H"
#include "Enum.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -115,6 +124,24 @@ class externalCoupledTemperatureMixedFvPatchScalarField
:
public externalCoupledMixedFvPatchField<scalar>
{
// Data Types
//- Location for the ouput temperature
enum outputTemperatureType
{
FLUID, //!< Use fluid (cell) temperature
WALL //!< Use wall (patch) temperature
};
//- Names for outputTemperatureType
static const Enum<outputTemperatureType> outputTemperatureNames;
// Private Data
//- Location for the ouput temperature
enum outputTemperatureType outputTemperature_;
public:
@ -189,19 +216,22 @@ public:
//- Destructor
virtual ~externalCoupledTemperatureMixedFvPatchScalarField();
virtual ~externalCoupledTemperatureMixedFvPatchScalarField() = default;
// Member functions
//- Write header
virtual void writeHeader(Ostream&) const;
virtual void writeHeader(Ostream& os) const;
//- Write data
virtual void writeData(Ostream&) const;
virtual void writeData(Ostream& os) const;
//- Read data
virtual void readData(Istream&);
virtual void readData(Istream& is);
//- Write
virtual void write(Ostream& os) const;
};

View File

@ -0,0 +1,51 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object T;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 0 0 1 0 0 0];
internalField uniform 300;
boundaryField
{
inlet
{
type fixedValue;
value $internalField;
}
outlet
{
type inletOutlet;
inletValue $internalField;
value $internalField;
}
inletWalls
{
type mixed;
refValue uniform 250;
refGradient uniform 0;
valueFraction uniform 1;
value uniform 250;
}
"(?i).*walls"
{
type zeroGradient;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,42 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volVectorField;
object U;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
inlet
{
type flowRateInletVelocity;
massFlowRate constant 0.01;
rhoInlet 1000; // Guess for rho
}
outlet
{
type pressureInletOutletVelocity;
value $internalField;
}
"(?i).*walls"
{
type noSlip;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,43 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object alphat;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [1 -1 -1 0 0 0 0];
internalField uniform 0;
boundaryField
{
inlet
{
type calculated;
value $internalField;
}
outlet
{
type calculated;
value $internalField;
}
"(?i).*walls"
{
type compressible::alphatWallFunction;
Prt 0.85;
value $internalField;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,47 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object epsilon;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -3 0 0 0 0];
internalField uniform 200;
boundaryField
{
inlet
{
type turbulentMixingLengthDissipationRateInlet;
mixingLength 0.005;
value $internalField;
}
outlet
{
type inletOutlet;
inletValue $internalField;
value $internalField;
}
"(?i).*walls"
{
type epsilonWallFunction;
Cmu 0.09;
kappa 0.41;
E 9.8;
value $internalField;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,44 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object k;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -2 0 0 0 0];
internalField uniform 1;
boundaryField
{
inlet
{
type turbulentIntensityKineticEnergyInlet;
intensity 0.05;
value $internalField;
}
outlet
{
type inletOutlet;
inletValue $internalField;
value $internalField;
}
"(?i).*walls"
{
type kqRWallFunction;
value $internalField;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,45 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object nut;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -1 0 0 0 0];
internalField uniform 0;
boundaryField
{
inlet
{
type calculated;
value $internalField;
}
outlet
{
type calculated;
value $internalField;
}
"(?i).*walls"
{
type nutkWallFunction;
Cmu 0.09;
kappa 0.41;
E 9.8;
value $internalField;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,40 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object p;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [1 -1 -2 0 0 0 0];
internalField uniform 1e5;
boundaryField
{
inlet
{
type zeroGradient;
}
outlet
{
type fixedValue;
value $internalField;
}
"(?i).*walls"
{
type zeroGradient;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,12 @@
#!/bin/sh
cd ${0%/*} || exit 1 # Run from this directory
. $WM_PROJECT_DIR/bin/tools/CleanFunctions # Tutorial clean functions
cleanCase0
rm externalCoupled.control 2> /dev/null
rm -rf comms
### rm -rf VTK
#------------------------------------------------------------------------------

View File

@ -0,0 +1,81 @@
#!/bin/sh
cd ${0%/*} || exit 1 # Run from this directory
. $WM_PROJECT_DIR/bin/tools/RunFunctions # Tutorial run functions
./Allrun.pre
unset coupling parallel testCreate
isTrue -dict controls -entry coupling && coupling=true
isTrue -dict controls -entry parallel && parallel=true
# isTrue -dict controls -entry testCreate && testCreate=true
# Remove lock file on interrupt
trap '\rm -f comms/OpenFOAM.lock 2>/dev/null' INT
# Decompose
if [ "$parallel" = true ]
then
runApplication decomposePar
# ## Can verify parallel operation of createExternalCoupledPatchGeometry
if [ "$coupling" = true ] && [ "$testCreate" = true ]
then
\rm -f log.createExternalCoupledPatchGeometry
runParallel createExternalCoupledPatchGeometry \
coupleGroup \
-commsDir $PWD/comms
fi
fi
if [ "$coupling" = true ]
then
echo "Running with external coupling"
# Controls
cat << CONTROLS >| externalCoupled.control
//- Overrides for externalCoupled
enabled true;
CONTROLS
# Run OpenFOAM, with externalCoupled enabled
if [ "$parallel" = true ]
then
runParallel $(getApplication) &
else
runApplication $(getApplication) &
fi
# Simulated external solver
runApplication ./externalSolver
else
echo "Running without external coupling"
# Controls
cat << CONTROLS >| externalCoupled.control
//- Overrides for externalCoupled
enabled false;
CONTROLS
# Run OpenFOAM, with externalCoupled disabled
if [ "$parallel" = true ]
then
runParallel $(getApplication)
else
runApplication $(getApplication)
fi
fi
# Reconstruct
if [ "$parallel" = true ]
then
runApplication reconstructPar
fi
#------------------------------------------------------------------------------

View File

@ -0,0 +1,23 @@
#!/bin/sh
cd ${0%/*} || exit 1 # Run from this directory
. $WM_PROJECT_DIR/bin/tools/RunFunctions # Tutorial run functions
runApplication blockMesh
# Restore initial fields
restore0Dir
# Controls
unset coupling testCreate
isTrue -dict controls -entry coupling && coupling=true
isTrue -dict controls -entry testCreate && testCreate=true
if [ "$coupling" = true ]
then
runApplication changeDictionary
# Create coupling geometry
runApplication createExternalCoupledPatchGeometry coupleGroup
fi
#------------------------------------------------------------------------------

View File

@ -0,0 +1,30 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object thermophysicalProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
thermoType
{
type heRhoThermo;
mixture pureMixture;
properties liquid;
energy sensibleInternalEnergy;
}
mixture
{
H2O;
}
// ************************************************************************* //

View File

@ -0,0 +1,28 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object turbulenceProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
simulationType RAS;
RAS
{
RASModel kEpsilon;
turbulence on;
printCoeffs on;
}
// ************************************************************************* //

View File

@ -0,0 +1,25 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object controls;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Tutorial controls
coupling true;
parallel true;
testCreate true;
// ************************************************************************* //

View File

@ -0,0 +1,214 @@
#!/bin/sh
cd ${0%/*} || exit 1 # Run from this directory
. $WM_PROJECT_DIR/bin/tools/RunFunctions # Tutorial run functions
# Dummy external solver to communicate with OpenFOAM via externalCoupled
# functionObject
#
# Functionality is hard-coded for particular test case
# - it simply return a patch temperature of 500K.
# Since the default temperature on the patch is 250K, this can be used
# to readily detect if the external values are being used.
#
# -----------------------------------------------------------------------------
action="$1"
# Check for unassigned variables
set -u
commsDir="comms"
patchDir="coupleGroup"
fieldName="T"
lockFile="${commsDir}/OpenFOAM.lock"
dataFile="${commsDir}/${patchDir}/${fieldName}"
waitSec=5
timeOut=100
nSteps=1000 # maximum number of time steps. Note: should be more than
# number of iterations on the OpenFOAM side
stopAt=600 # external solver signals OpenFOAM to stop
refValue1=500
refGrad=0
valueFraction=1
# Remove any old junk
\rm -f $lockFile 2>/dev/null
log()
{
echo "External: $@"
}
# Create lock file to pass control to OpenFOAM
useMaster()
{
log "creating lock file '${lockFile}'"
echo "status=openfoam" >| ${lockFile}
}
# Lock file with special content to stop OpenFOAM master
stopMasterNow()
{
log "writeNow terminate via lock file '${lockFile}'"
echo "action=writeNow" >| ${lockFile}
}
# Patch size (inletWalls)
nFaces1=$(getNumberOfPatchFaces inletWalls) || exit $?
init()
{
log "init - creating ${dataFile}.in"
cat /dev/null >| "${dataFile}.in"
# Local face counter, Local refValue
local nFaces refValue
# Patch inletWalls
nFaces="$nFaces1"
refValue="$refValue1"
log "init - adding $nFaces data elements with refValue $refValue"
while [ "$nFaces" -gt 0 ]
do
nFaces=$((nFaces - 1))
# Hard-coded output for patch
echo "$refValue $refGrad $valueFraction"
done >> "${dataFile}.in"
# Verify line count?
# log "init ($(wc -l ${dataFile}.in))"
# Give time for T.in file to flush
sleep 1
useMaster
}
# Calculate average temperature
# Extract from:
#
# ----
# # Values: area Twall qDot htc
# 6.25e-06 500 3.53296e+06 20884
# ----
avgTemperature()
{
local file="$1"
local tempType
local avg
tempType=$(sed -ne '1{s/^.* \(T[^ ]*\).*$/\1/p; q}' "$file")
avg=$(awk 'BEGIN {area=0; sum=0;}END{print sum/area}{if (/^[0-9]/) {area += $1; sum += ($1 * $2);}}' "$file")
echo "${file##*/} : $tempType avg=$avg"
}
loop()
{
echo "Executing dummy external solver"
local totalWait=0
local step=0
local nFaces refValue
while [ $step -lt $nSteps ]
do
if [ -f $lockFile ]
then
if grep -q "status=done" ${lockFile}
then
log "found lock file '${lockFile}' with 'status=done' - finished"
break
elif [ -s $lockFile ]
then
log "found lock file '${lockFile}' containing '$(< $lockFile)' - waiting"
else
log "found lock file '${lockFile}' - waiting"
fi
totalWait=$(expr $totalWait + $waitSec)
if [ $totalWait -gt $timeOut ]
then
log "timeout"
break
else
sleep $waitSec
fi
else
totalWait=0
step=$(expr $step + 1)
log "step $step"
log "lock not present - taking control"
log "sleeping for $waitSec secs to simulate external process"
sleep $waitSec
log "updating ${dataFile}.in from ${dataFile}.out"
if [ -f "${dataFile}.out" ]
then
avgTemperature "${dataFile}.out"
cat /dev/null >| "${dataFile}.in"
# Hard-coded output for patch
nFaces="$nFaces1"
refValue="$refValue1"
while [ "$nFaces" -gt 0 ]
do
nFaces=$((nFaces - 1))
echo "$refValue $refGrad $valueFraction"
done >> "${dataFile}.in"
else
log "Warning: no such file ${dataFile}.out"
fi
if [ "${stopAt:-0}" -eq $step ]
then
stopMasterNow
else
useMaster
fi
fi
done
}
# Create the comms directory
mkdir -p ${commsDir}/${patchDir}
case "$action" in
-once | once)
echo "One-shot triggering"
init
;;
*)
# Tutorial case uses 'initByExternal' option,
# so we must provide initial values
init
loop
log "done"
# Cleanup. Remove the lock file
\rm -f $lockFile 2>/dev/null
;;
esac
#------------------------------------------------------------------------------

View File

@ -0,0 +1,119 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
scale 0.001;
vertices
(
// front-plane: z = +25mm
// inlet region
( -50 25 25) // pt 0
( 0 25 25) // pt 1
( -50 75 25) // pt 2
( 0 75 25) // pt 3
// outlet region
( -500 -75 25) // pt 4
( 0 -75 25) // pt 5
( -500 -25 25) // pt 6
( 0 -25 25) // pt 7
// bend mid-points
( 25 0 25) // pt 8
( 75 0 25) // pt 9
// back-plane: z = -25mm
// inlet region
( -50 25 -25) // pt 0 + 10
( 0 25 -25) // pt 1 + 10
( -50 75 -25) // pt 2 + 10
( 0 75 -25) // pt 3 + 10
// outlet region
( -500 -75 -25) // pt 4 + 10
( 0 -75 -25) // pt 5 + 10
( -500 -25 -25) // pt 7 + 10
( 0 -25 -25) // pt 8 + 10
// bend mid-points
( 25 0 -25) // pt 8 + 10
( 75 0 -25) // pt 9 + 10
);
blocks
(
hex (0 1 11 10 2 3 13 12) inlet ( 20 20 20) simpleGrading (1 1 1)
hex (4 5 15 14 6 7 17 16) outlet (200 20 20) simpleGrading (1 1 1)
hex (1 8 18 11 3 9 19 13) bend1 ( 30 20 20) simpleGrading (1 1 1)
hex (5 9 19 15 7 8 18 17) bend2 ( 30 20 20) simpleGrading (1 1 1)
);
edges
(
// block 2
arc 1 8 ( 17.678 17.678 25)
arc 11 18 ( 17.678 17.678 -25)
arc 3 9 ( 53.033 53.033 25)
arc 13 19 ( 53.033 53.033 -25)
// block 3
arc 7 8 ( 17.678 -17.678 25)
arc 17 18 ( 17.678 -17.678 -25)
arc 5 9 ( 53.033 -53.033 25)
arc 15 19 ( 53.033 -53.033 -25)
);
boundary
(
inlet
{
type patch;
faces
(
(0 2 12 10)
);
}
outlet
{
type patch;
faces
(
(4 6 16 14)
);
}
inletWalls
{
type wall;
faces
(
// block0
( 0 1 3 2 )
( 11 10 12 13 )
( 0 10 11 1 )
( 2 3 13 12 )
);
}
);
mergePatchPairs
(
);
// The defaultFaces == outside "walls"
defaultPatch
{
name walls;
type wall;
}
// ************************************************************************* //

View File

@ -0,0 +1,38 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object changeDictionaryDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
boundary
{
inletWalls
{
inGroups (coupleGroup wall);
}
}
T
{
boundaryField
{
inletWalls
{
type externalCoupledTemperature;
// outputTemperature fluid; // fluid|wall
}
}
}
// ************************************************************************* //

View File

@ -0,0 +1,65 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Library defines new boundary conditions
libs ("libOpenFOAM.so" "libfieldFunctionObjects.so");
application rhoPimpleFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 0.5;
deltaT 2e-3;
writeControl timeStep;
writeInterval 10;
purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
graphFormat raw;
runTimeModifiable true;
functions
{
#include "externalCoupled"
minMax
{
type fieldMinMax;
libs ("libfieldFunctionObjects.so");
fields (T);
}
}
// ************************************************************************* //

View File

@ -0,0 +1,34 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object decomposeParDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
numberOfSubdomains 8;
method hierarchical;
simpleCoeffs
{
n (8 1 1);
delta 0.001;
}
hierarchicalCoeffs
{
n (4 2 1);
delta 0.001;
order xyz;
}
// ************************************************************************* //

View File

@ -0,0 +1,40 @@
// -*- C++ -*-
// Control for external coupled simulation
externalCoupled
{
type externalCoupled;
libs ("libfieldFunctionObjects.so");
log true;
executeControl timeStep;
// Directory to use for communication
commsDir "<case>/comms";
// Does external process start first
initByExternal true;
regions
{
// Region name (wildcards allowed)
".*"
{
// Patch or patchGroup
coupleGroup
{
// Fields to output in commsDir
writeFields (T);
// Fields to read from commsDir
readFields (T);
}
}
}
// Enabled or not?
#sinclude "<case>/externalCoupled.control"
}
// ************************************************************************* //

View File

@ -0,0 +1,58 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
ddtSchemes
{
default Euler;
}
gradSchemes
{
default Gauss linear;
limited cellLimited Gauss linear 1;
}
divSchemes
{
default none;
div(phi,U) Gauss linearUpwind limited;
div(phi,e) Gauss linearUpwind limited;
div(phi,epsilon) Gauss linearUpwind limited;
div(phi,k) Gauss linearUpwind limited;
div(phi,K) Gauss linearUpwind limited;
div(phiv,p) Gauss linearUpwind limited;
div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
}
laplacianSchemes
{
default Gauss linear corrected;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default corrected;
}
// ************************************************************************* //

View File

@ -0,0 +1,62 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object fvSolution;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
solvers
{
"rho.*"
{
solver nthn;
}
"p.*"
{
solver GAMG;
smoother GaussSeidel;
tolerance 1e-7;
relTol 0;
}
"(U|e|k|epsilon).*"
{
solver PBiCGStab;
preconditioner DILU;
tolerance 1e-7;
relTol 0;
}
}
PIMPLE
{
nCorrectors 3;
nNonOrthogonalCorrectors 0;
pMinFactor 0.1;
pMaxFactor 1.5;
transonic no;
consistent no;
}
relaxationFactors
{
equations
{
".*" 1;
}
}
// ************************************************************************* //