From 091d847094138d343c56c4f0a6e4d1ceb1822600 Mon Sep 17 00:00:00 2001 From: Andrew Heather Date: Tue, 8 May 2018 13:19:46 +0100 Subject: [PATCH] ENH: Added a new function object to create a field relative to a field value Calculates and outputs a field whose values are offset to a reference value obtained by sampling the field at a user-specified location. The field values are calculated using: \f[ f_c = s(f_{c,t} - f_p + f_{off}) \f] where \vartable f_c | field values at cell s | optional scale factor (default = 1) f_{c,t} | current field values at cell at this time f_p | field value at position f_{off} | offset field value (default = 0) \endvartable Usage Example of function object specification to calculate the reference field: \verbatim pRef { type reference; libs ("libfieldFunctionObjects.so"); ... field p; result pRef; position (0 0 0); scale 1.2; offset 100000; } \endverbatim --- src/functionObjects/field/Make/files | 1 + .../field/reference/reference.C | 133 +++++++++++++ .../field/reference/reference.H | 180 ++++++++++++++++++ .../field/reference/referenceTemplates.C | 75 ++++++++ 4 files changed, 389 insertions(+) create mode 100644 src/functionObjects/field/reference/reference.C create mode 100644 src/functionObjects/field/reference/reference.H create mode 100644 src/functionObjects/field/reference/referenceTemplates.C diff --git a/src/functionObjects/field/Make/files b/src/functionObjects/field/Make/files index bcd494e51d..6746b0b4a1 100644 --- a/src/functionObjects/field/Make/files +++ b/src/functionObjects/field/Make/files @@ -60,6 +60,7 @@ blendingFactor/blendingFactor.C pressure/pressure.C MachNo/MachNo.C Curle/Curle.C +reference/reference.C fieldsExpression/fieldsExpression.C add/add.C diff --git a/src/functionObjects/field/reference/reference.C b/src/functionObjects/field/reference/reference.C new file mode 100644 index 0000000000..2ef1682204 --- /dev/null +++ b/src/functionObjects/field/reference/reference.C @@ -0,0 +1,133 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2018 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "reference.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace functionObjects +{ + defineTypeNameAndDebug(reference, 0); + + addToRunTimeSelectionTable + ( + functionObject, + reference, + dictionary + ); +} +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +bool Foam::functionObjects::reference::calc() +{ + Log << type() << " " << name() << " output:" << nl; + + bool processed = calcType(); + processed = processed || calcType(); + processed = processed || calcType(); + processed = processed || calcType(); + processed = processed || calcType(); + + Log << endl; + + + return returnReduce(processed, orOp()); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::functionObjects::reference::reference +( + const word& name, + const Time& runTime, + const dictionary& dict +) +: + fieldExpression(name, runTime, dict), + localDict_(dict), + position_(point::zero), + celli_(-1), + interpolationScheme_("cell"), + scale_(1) +{ + read(dict); + + // Forcing default result name to include the name of the field + setResultName(typeName, word::null); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::functionObjects::reference::~reference() +{} + + +bool Foam::functionObjects::reference::read(const dictionary& dict) +{ + if (fieldExpression::read(dict)) + { + localDict_ = dict; + + dict.lookup("position") >> position_; + + interpolationScheme_ = + dict.lookupOrDefault("interpolationScheme", "cell"); + + + dict.readIfPresent("scale", scale_); + + celli_ = mesh_.findCell(position_); + + label celli = returnReduce(celli_, maxOp