- rationalized waiting logic - timeout and wait are unsigned int (not label) since this is what the underlying sleep uses anyhow.
122 lines
2.9 KiB
Bash
Executable File
122 lines
2.9 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Dummy external solver to communicate with OpenFOAM via externalCoupled
|
|
# functionObject
|
|
#
|
|
# Functionality is hard-coded for this particular test case
|
|
# - patch temperatures increased by 1K on each step
|
|
#
|
|
cd ${0%/*} || exit 1 # Run from this directory
|
|
|
|
# Check for unassigned variables
|
|
set -u
|
|
|
|
echo "Executing dummy external solver"
|
|
|
|
commsDir="comms"
|
|
regionGroupName="heater_topAir"
|
|
patchGroupName="coupleGroup"
|
|
fieldName="T"
|
|
|
|
lockFile="${commsDir}/OpenFOAM.lock"
|
|
dataFile="${commsDir}/${regionGroupName}/${patchGroupName}/${fieldName}"
|
|
waitSec=5
|
|
timeOut=100
|
|
nSteps=1000 # maximum number of time steps. Note: should be more than
|
|
# number of iterations on the OpenFOAM side
|
|
refGrad=0
|
|
valueFraction=1
|
|
|
|
|
|
# Remove any old junk
|
|
\rm -f $lockFile 2>/dev/null
|
|
|
|
log()
|
|
{
|
|
echo "External: $@"
|
|
}
|
|
|
|
init()
|
|
{
|
|
log "init - creating ${dataFile}.in"
|
|
|
|
# Hard-coded for patch of size 8 (heater/minY)
|
|
n1=8
|
|
refValue1=500
|
|
touch "${dataFile}.in"
|
|
log "init - adding $n1 data elements with refValue $refValue1"
|
|
for i in $(seq 1 $n1); do
|
|
echo "$refValue1 $refGrad $valueFraction" >> "${dataFile}.in"
|
|
done
|
|
|
|
# Hard-coded for patch of size 40 (topAir/minX)
|
|
n2=40
|
|
refValue2=300
|
|
log "init - adding $n2 data elements with refValue $refValue2"
|
|
for i in $(seq 1 $n2); do
|
|
echo "$refValue2 $refGrad $valueFraction" >> "${dataFile}.in"
|
|
done
|
|
|
|
# Create lock file to pass control to OpenFOAM
|
|
touch ${lockFile}
|
|
}
|
|
|
|
|
|
# create the comms directory
|
|
mkdir -p ${commsDir}/${regionGroupName}/${patchGroupName}
|
|
|
|
# Tutorial case uses 'initByExternalOption', so we must provide initial values
|
|
init
|
|
|
|
|
|
totalWait=0
|
|
step=0
|
|
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"
|
|
|
|
awk '{if( $1 != "#" ){print $1+1 " 0 1"}}' \
|
|
${dataFile}.out >| ${dataFile}.in
|
|
|
|
log "creating lock file '${lockFile}'"
|
|
touch ${lockFile}
|
|
fi
|
|
done
|
|
|
|
log "done"
|
|
|
|
# Remove the lock file too
|
|
\rm -f $lockFile 2>/dev/null
|
|
|
|
#------------------------------------------------------------------------------
|