included subtract method

This commit is contained in:
andy
2009-02-10 18:38:01 +00:00
parent 5235d41622
commit 9eaaff14c4
5 changed files with 153 additions and 99 deletions

View File

@ -9,6 +9,6 @@ field/div/div.C
field/randomise/randomise.C field/randomise/randomise.C
field/interpolate/interpolate.C field/interpolate/interpolate.C
basic/add/add.C basic/addSubtract/addSubtract.C
LIB = $(FOAM_LIBBIN)/libfoamCalcFunctions LIB = $(FOAM_LIBBIN)/libfoamCalcFunctions

View File

@ -24,7 +24,7 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "add.H" #include "addSubtract.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -33,15 +33,15 @@ namespace Foam
{ {
namespace calcTypes namespace calcTypes
{ {
defineTypeNameAndDebug(add, 0); defineTypeNameAndDebug(addSubtract, 0);
addToRunTimeSelectionTable(calcType, add, dictionary); addToRunTimeSelectionTable(calcType, addSubtract, dictionary);
} }
} }
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::calcTypes::add::writeAddFields void Foam::calcTypes::addSubtract::writeAddSubtractFields
( (
const Time& runTime, const Time& runTime,
const fvMesh& mesh, const fvMesh& mesh,
@ -50,48 +50,48 @@ void Foam::calcTypes::add::writeAddFields
{ {
bool processed = false; bool processed = false;
IOobject addFieldHeader IOobject addSubtractFieldHeader
( (
addFieldName_, addSubtractFieldName_,
runTime.timeName(), runTime.timeName(),
mesh, mesh,
IOobject::MUST_READ IOobject::MUST_READ
); );
if (addFieldHeader.headerOk()) if (addSubtractFieldHeader.headerOk())
{ {
writeAddField<scalar> writeAddSubtractField<scalar>
( (
baseFieldHeader, baseFieldHeader,
addFieldHeader, addSubtractFieldHeader,
mesh, mesh,
processed processed
); );
writeAddField<vector> writeAddSubtractField<vector>
( (
baseFieldHeader, baseFieldHeader,
addFieldHeader, addSubtractFieldHeader,
mesh, mesh,
processed processed
); );
writeAddField<sphericalTensor> writeAddSubtractField<sphericalTensor>
( (
baseFieldHeader, baseFieldHeader,
addFieldHeader, addSubtractFieldHeader,
mesh, mesh,
processed processed
); );
writeAddField<symmTensor> writeAddSubtractField<symmTensor>
( (
baseFieldHeader, baseFieldHeader,
addFieldHeader, addSubtractFieldHeader,
mesh, mesh,
processed processed
); );
writeAddField<tensor> writeAddSubtractField<tensor>
( (
baseFieldHeader, baseFieldHeader,
addFieldHeader, addSubtractFieldHeader,
mesh, mesh,
processed processed
); );
@ -100,23 +100,23 @@ void Foam::calcTypes::add::writeAddFields
{ {
FatalError FatalError
<< "Unable to process " << baseFieldName_ << "Unable to process " << baseFieldName_
<< " + " << addFieldName_ << nl << " + " << addSubtractFieldName_ << nl
<< "No call to add for fields of type " << "No call to addSubtract for fields of type "
<< baseFieldHeader.headerClassName() << " + " << baseFieldHeader.headerClassName() << " + "
<< addFieldHeader.headerClassName() << nl << nl << addSubtractFieldHeader.headerClassName() << nl << nl
<< exit(FatalError); << exit(FatalError);
} }
} }
else else
{ {
FatalErrorIn("calcTypes::add::writeAddFields()") FatalErrorIn("calcTypes::addSubtract::writeAddSubtractFields()")
<< "Unable to read add field: " << addFieldName_ << "Unable to read addSubtract field: " << addSubtractFieldName_
<< nl << exit(FatalError); << nl << exit(FatalError);
} }
} }
void Foam::calcTypes::add::writeAddValues void Foam::calcTypes::addSubtract::writeAddSubtractValues
( (
const Time& runTime, const Time& runTime,
const fvMesh& mesh, const fvMesh& mesh,
@ -125,48 +125,48 @@ void Foam::calcTypes::add::writeAddValues
{ {
bool processed = false; bool processed = false;
writeAddValue<scalar> writeAddSubtractValue<scalar>
( (
baseFieldHeader, baseFieldHeader,
addValueStr_, addSubtractValueStr_,
mesh, mesh,
processed processed
); );
writeAddValue<vector> writeAddSubtractValue<vector>
( (
baseFieldHeader, baseFieldHeader,
addValueStr_, addSubtractValueStr_,
mesh, mesh,
processed processed
); );
writeAddValue<sphericalTensor> writeAddSubtractValue<sphericalTensor>
( (
baseFieldHeader, baseFieldHeader,
addValueStr_, addSubtractValueStr_,
mesh, mesh,
processed processed
); );
writeAddValue<symmTensor> writeAddSubtractValue<symmTensor>
( (
baseFieldHeader, baseFieldHeader,
addValueStr_, addSubtractValueStr_,
mesh, mesh,
processed processed
); );
writeAddValue<tensor> writeAddSubtractValue<tensor>
( (
baseFieldHeader, baseFieldHeader,
addValueStr_, addSubtractValueStr_,
mesh, mesh,
processed processed
); );
if (!processed) if (!processed)
{ {
FatalErrorIn("calcTypes::add::writeAddValues()") FatalErrorIn("calcTypes::addSubtract::writeAddSubtractValue()")
<< "Unable to process " << baseFieldName_ << "Unable to process " << baseFieldName_
<< " + " << addValueStr_ << nl << " + " << addSubtractValueStr_ << nl
<< "No call to add for fields of type " << "No call to addSubtract for fields of type "
<< baseFieldHeader.headerClassName() << nl << nl << baseFieldHeader.headerClassName() << nl << nl
<< exit(FatalError); << exit(FatalError);
} }
@ -175,36 +175,38 @@ void Foam::calcTypes::add::writeAddValues
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::calcTypes::add::add() Foam::calcTypes::addSubtract::addSubtract()
: :
calcType(), calcType(),
baseFieldName_(""), baseFieldName_(""),
calcType_(FIELD), calcType_(FIELD),
addFieldName_(""), addSubtractFieldName_(""),
addValueStr_(""), addSubtractValueStr_(""),
resultName_("") resultName_(""),
calcMode_(ADD)
{} {}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::calcTypes::add::~add() Foam::calcTypes::addSubtract::~addSubtract()
{} {}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::calcTypes::add::init() void Foam::calcTypes::addSubtract::init()
{ {
argList::validArgs.append("add"); argList::validArgs.append("add");
argList::validArgs.append("baseField"); argList::validArgs.append("baseField");
argList::validArgs.append("calcMode");
argList::validOptions.insert("field", "fieldName"); argList::validOptions.insert("field", "fieldName");
argList::validOptions.insert("value", "valueString"); argList::validOptions.insert("value", "valueString");
argList::validOptions.insert("resultName", "fieldName"); argList::validOptions.insert("resultName", "fieldName");
} }
void Foam::calcTypes::add::preCalc void Foam::calcTypes::addSubtract::preCalc
( (
const argList& args, const argList& args,
const Time& runTime, const Time& runTime,
@ -212,21 +214,38 @@ void Foam::calcTypes::add::preCalc
) )
{ {
baseFieldName_ = args.additionalArgs()[1]; baseFieldName_ = args.additionalArgs()[1];
word calcModeName = args.additionalArgs()[2];
if (calcModeName == "add")
{
calcMode_ = ADD;
}
else if (calcModeName == "subtract")
{
calcMode_ = SUBTRACT;
}
else
{
FatalErrorIn("calcTypes::addSubtract::preCalc")
<< "Invalid calcMode: " << calcModeName << nl
<< " Valid calcModes are add and subtract" << nl
<< exit(FatalError);
}
if (args.options().found("field")) if (args.options().found("field"))
{ {
addFieldName_ = args.options()["field"]; addSubtractFieldName_ = args.options()["field"];
calcType_ = FIELD; calcType_ = FIELD;
} }
else if (args.options().found("value")) else if (args.options().found("value"))
{ {
addValueStr_ = args.options()["value"]; addSubtractValueStr_ = args.options()["value"];
calcType_ = VALUE; calcType_ = VALUE;
} }
else else
{ {
FatalErrorIn("calcTypes::add::preCalc") FatalErrorIn("calcTypes::addSubtract::preCalc")
<< "add requires either -field or -value option" << "addSubtract requires either -field or -value option"
<< nl << exit(FatalError); << nl << exit(FatalError);
} }
@ -237,7 +256,7 @@ void Foam::calcTypes::add::preCalc
} }
void Foam::calcTypes::add::calc void Foam::calcTypes::addSubtract::calc
( (
const argList& args, const argList& args,
const Time& runTime, const Time& runTime,
@ -258,17 +277,17 @@ void Foam::calcTypes::add::calc
{ {
case FIELD: case FIELD:
{ {
writeAddFields(runTime, mesh, baseFieldHeader); writeAddSubtractFields(runTime, mesh, baseFieldHeader);
break; break;
} }
case VALUE: case VALUE:
{ {
writeAddValues(runTime, mesh, baseFieldHeader); writeAddSubtractValues(runTime, mesh, baseFieldHeader);
break; break;
} }
default: default:
{ {
FatalErrorIn("calcTypes::add::calc") FatalErrorIn("calcTypes::addSubtract::calc")
<< "unknown calcType " << calcType_ << nl << "unknown calcType " << calcType_ << nl
<< abort(FatalError); << abort(FatalError);
} }
@ -276,7 +295,7 @@ void Foam::calcTypes::add::calc
} }
else else
{ {
FatalErrorIn("calcTypes::add::calc") FatalErrorIn("calcTypes::addSubtract::calc")
<< "Unable to read base field: " << baseFieldName_ << "Unable to read base field: " << baseFieldName_
<< nl << exit(FatalError); << nl << exit(FatalError);
} }

View File

@ -23,28 +23,30 @@ License
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Class Class
Foam::calcTypes::add Foam::calcTypes::addSubtract
Description Description
Adds and field or value to base field. adds/subtracts a field or value to/from a base field.
New field name specified by -resultName option, or automatically as: New field name specified by -resultName option, or automatically as:
<baseFieldName>_plus_<addFieldName> <baseFieldName>_add_<addSubtractFieldName>
<baseFieldName>_plus_value <baseFieldName>_add_value
<baseFieldName>_subtract_<addSubtractFieldName>
<baseFieldName>_subtract_value
Example usage: Example usage:
add p -value 100000 -resultName pAbs addSubtract p add -value 100000 -resultName pAbs
add U -field U0 addSubtract U subtract -field U0
SourceFiles SourceFiles
add.C addSubtract.C
writeAddField.C writeaddSubtractField.C
writeAddValue.C writeaddSubtractValue.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef add_H #ifndef addSubtract_H
#define add_H #define addSubtract_H
#include "calcType.H" #include "calcType.H"
@ -57,10 +59,10 @@ namespace calcTypes
{ {
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class add Declaration Class addSubtract Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class add class addSubtract
: :
public calcType public calcType
{ {
@ -72,41 +74,50 @@ public:
VALUE VALUE
}; };
enum calcModes
{
ADD,
SUBTRACT
};
private: private:
// Private data // Private data
//- Name of base field (to add to) //- Name of base field (to addSubtract to)
word baseFieldName_; word baseFieldName_;
//- Calc type as given by enumerations above //- Calc type as given by enumerations above
calcTypes calcType_; calcTypes calcType_;
//- Name of field to add //- Name of field to add/subtract
word addFieldName_; word addSubtractFieldName_;
//- String representation of value to add //- String representation of value to add/subtract
string addValueStr_; string addSubtractValueStr_;
//- Name of result field //- Name of result field
word resultName_; word resultName_;
//- Mode - addSubtract/subtract
calcModes calcMode_;
// Private Member Functions // Private Member Functions
// Output // Output
//- Calc and output field additions //- Calc and output field addSubtractitions
void writeAddFields void writeAddSubtractFields
( (
const Time& runTime, const Time& runTime,
const fvMesh& mesh, const fvMesh& mesh,
const IOobject& baseFieldHeader const IOobject& baseFieldHeader
); );
//- Calc and output field and value additions //- Calc and output field and value addSubtractitions
void writeAddValues void writeAddSubtractValues
( (
const Time& runTime, const Time& runTime,
const fvMesh& mesh, const fvMesh& mesh,
@ -115,10 +126,10 @@ private:
//- Disallow default bitwise copy construct //- Disallow default bitwise copy construct
add(const add&); addSubtract(const addSubtract&);
//- Disallow default bitwise assignment //- Disallow default bitwise assignment
void operator=(const add&); void operator=(const addSubtract&);
protected: protected:
@ -150,19 +161,19 @@ protected:
// I-O // I-O
//- Write add field //- Write addSubtract field
template<class Type> template<class Type>
void writeAddField void writeAddSubtractField
( (
const IOobject& baseHeader, const IOobject& baseHeader,
const IOobject& addHeader, const IOobject& addSubtractHeader,
const fvMesh& mesh, const fvMesh& mesh,
bool& processed bool& processed
); );
//- Write add value //- Write addSubtract value
template<class Type> template<class Type>
void writeAddValue void writeAddSubtractValue
( (
const IOobject& baseHeader, const IOobject& baseHeader,
const string& valueStr, const string& valueStr,
@ -174,18 +185,18 @@ protected:
public: public:
//- Runtime type information //- Runtime type information
TypeName("add"); TypeName("addSubtract");
// Constructors // Constructors
//- Construct null //- Construct null
add(); addSubtract();
// Destructor // Destructor
virtual ~add(); virtual ~addSubtract();
}; };
@ -197,8 +208,8 @@ public:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository #ifdef NoRepository
# include "writeAddField.C" # include "writeAddSubtractField.C"
# include "writeAddValue.C" # include "writeAddSubtractValue.C"
#endif #endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -25,7 +25,7 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
template<class Type> template<class Type>
void Foam::calcTypes::add::writeAddField void Foam::calcTypes::addSubtract::writeAddSubtractField
( (
const IOobject& baseHeader, const IOobject& baseHeader,
const IOobject& addHeader, const IOobject& addHeader,
@ -33,11 +33,6 @@ void Foam::calcTypes::add::writeAddField
bool& processed bool& processed
) )
{ {
if (resultName_ == "")
{
resultName_ = baseHeader.name() + "_plus_" + addHeader.name();
}
typedef GeometricField<Type, fvPatchField, volMesh> fieldType; typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
if if
@ -46,6 +41,19 @@ void Foam::calcTypes::add::writeAddField
&& baseHeader.headerClassName() == addHeader.headerClassName() && baseHeader.headerClassName() == addHeader.headerClassName()
) )
{ {
if (resultName_ == "")
{
if (calcMode_ == ADD)
{
resultName_ = baseHeader.name() + "_add_" + addHeader.name();
}
else
{
resultName_ = baseHeader.name() + "_subtract_"
+ addHeader.name();
}
}
Info<< " Reading " << baseHeader.name() << endl; Info<< " Reading " << baseHeader.name() << endl;
fieldType baseField(baseHeader, mesh); fieldType baseField(baseHeader, mesh);
@ -65,7 +73,7 @@ void Foam::calcTypes::add::writeAddField
mesh, mesh,
IOobject::NO_READ IOobject::NO_READ
), ),
baseField + addField calcMode_ == ADD ? baseField + addField : baseField - addField
); );
newField.write(); newField.write();
} }

View File

@ -25,7 +25,7 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
template<class Type> template<class Type>
void Foam::calcTypes::add::writeAddValue void Foam::calcTypes::addSubtract::writeAddSubtractValue
( (
const IOobject& baseHeader, const IOobject& baseHeader,
const string& valueStr, const string& valueStr,
@ -39,14 +39,21 @@ void Foam::calcTypes::add::writeAddValue
{ {
if (resultName_ == "") if (resultName_ == "")
{ {
resultName_ = baseHeader.name() + "_plus_value"; if (calcMode_ == ADD)
{
resultName_ = baseHeader.name() + "_add_value";
}
else
{
resultName_ = baseHeader.name() + "_subtract_value";
}
} }
Type value; Type value;
IStringStream(valueStr)() >> value; IStringStream(valueStr)() >> value;
Info<< " Reading " << baseHeader.name() << endl; Info<< " Reading " << baseHeader.name() << endl;
fieldType baseField(baseHeader, mesh); fieldType baseField(baseHeader, mesh);
fieldType newField fieldType newField
( (
@ -61,8 +68,17 @@ void Foam::calcTypes::add::writeAddValue
); );
Info<< " Calculating " << resultName_ << endl; Info<< " Calculating " << resultName_ << endl;
newField == baseField if (calcMode_ == ADD)
+ dimensioned<Type>("value", baseField.dimensions(), value); {
newField == baseField
+ dimensioned<Type>("value", baseField.dimensions(), value);
}
else
{
newField == baseField
- dimensioned<Type>("value", baseField.dimensions(), value);
}
newField.write(); newField.write();
processed = true; processed = true;