From d3f7f91f6c6ba6cd044d04be9735b415ff19c160 Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@esi-group.com> Date: Wed, 29 Jul 2020 10:59:59 +0200 Subject: [PATCH] ENH: track old output times for lumpedPoint output (#1793) - now also tracks the previous output time, which aids on restarts since it allows the FEA side the possibility of determining the effective deltaT between the output of forces --- .../movement/lumpedPointMovement.C | 44 ++++++-------- .../movement/lumpedPointMovement.H | 6 +- ...edPointDisplacementPointPatchVectorField.C | 59 ++++++++++++------- ...edPointDisplacementPointPatchVectorField.H | 19 +++--- 4 files changed, 72 insertions(+), 56 deletions(-) diff --git a/src/lumpedPointMotion/movement/lumpedPointMovement.C b/src/lumpedPointMotion/movement/lumpedPointMovement.C index 6bf3f63d3fd..195307dade7 100644 --- a/src/lumpedPointMotion/movement/lumpedPointMovement.C +++ b/src/lumpedPointMotion/movement/lumpedPointMovement.C @@ -1157,7 +1157,7 @@ bool Foam::lumpedPointMovement::writeData const UList<vector>& forces, const UList<vector>& moments, const outputFormatType fmt, - const Time* timeinfo + const Tuple2<scalar, scalar>* timesWritten ) const { const bool writeMoments = (moments.size() == forces.size()); @@ -1165,15 +1165,13 @@ bool Foam::lumpedPointMovement::writeData if (fmt == outputFormatType::PLAIN) { os <<"########" << nl; - if (timeinfo) + if (timesWritten) { - const Time& t = *timeinfo; - - os <<"# Time index=" << t.timeIndex() << nl - <<"# Time value=" << t.timeOutputValue() << nl; + os << "# Time value=" << timesWritten->first() << nl + << "# Time prev=" << timesWritten->second() << nl; } - os <<"# size=" << this->size() << nl - <<"# columns (points) (forces)"; + os << "# size=" << this->size() << nl + << "# columns (points) (forces)"; if (writeMoments) { @@ -1272,12 +1270,10 @@ bool Foam::lumpedPointMovement::writeData // - ensure lists have consistent format os <<"////////" << nl; - if (timeinfo) + if (timesWritten) { - const Time& t = *timeinfo; - - os <<"// Time index=" << t.timeIndex() << nl; - os.writeEntry("time", t.timeOutputValue()); + os.writeEntry("time", timesWritten->first()); + os.writeEntry("prevTime", timesWritten->second()); } os << nl; @@ -1298,7 +1294,7 @@ bool Foam::lumpedPointMovement::writeData ( const UList<vector>& forces, const UList<vector>& moments, - const Time* timeinfo + const Tuple2<scalar, scalar>* timesWritten ) const { if (!Pstream::master()) @@ -1308,26 +1304,24 @@ bool Foam::lumpedPointMovement::writeData // Regular output { - const fileName output(coupler().resolveFile(outputName_)); - OFstream os(output, IOstream::ASCII); + OFstream os + ( + coupler().resolveFile(outputName_) + ); - writeData(os, forces, moments, outputFormat_, timeinfo); + writeData(os, forces, moments, outputFormat_, timesWritten); } // Log output { - const fileName output(coupler().resolveFile(logName_)); - OFstream os ( - output, - IOstream::ASCII, - IOstream::currentVersion, - IOstream::UNCOMPRESSED, - true // append mode + coupler().resolveFile(logName_), + IOstreamOption(), + true // append ); - writeData(os, forces, moments, outputFormatType::PLAIN, timeinfo); + writeData(os, forces, moments, outputFormatType::PLAIN, timesWritten); } return true; diff --git a/src/lumpedPointMotion/movement/lumpedPointMovement.H b/src/lumpedPointMotion/movement/lumpedPointMovement.H index adbc403f05e..3e8f30dcf88 100644 --- a/src/lumpedPointMotion/movement/lumpedPointMovement.H +++ b/src/lumpedPointMotion/movement/lumpedPointMovement.H @@ -100,6 +100,7 @@ SourceFiles #include "primitiveFields.H" #include "IOobject.H" #include "tmp.H" +#include "Tuple2.H" #include "HashPtrTable.H" #include "externalFileCoupler.H" #include "lumpedPointController.H" @@ -116,7 +117,6 @@ namespace Foam class polyMesh; class polyPatch; class pointPatch; -class Time; /*---------------------------------------------------------------------------*\ Class lumpedPointMovement Declaration @@ -423,7 +423,7 @@ public: const UList<vector>& forces, const UList<vector>& moments, const outputFormatType fmt = outputFormatType::PLAIN, - const Time* timeinfo = nullptr + const Tuple2<scalar, scalar>* timesWritten = nullptr ) const; //- Write points, forces, moments @@ -431,7 +431,7 @@ public: ( const UList<vector>& forces, const UList<vector>& moments = List<vector>(), - const Time* timeinfo = nullptr + const Tuple2<scalar, scalar>* timesWritten = nullptr ) const; //- Read state from file, applying relaxation as requested diff --git a/src/lumpedPointMotion/pointPatchFields/lumpedPointDisplacementPointPatchVectorField.C b/src/lumpedPointMotion/pointPatchFields/lumpedPointDisplacementPointPatchVectorField.C index a81a50e2a02..c239481f9e8 100644 --- a/src/lumpedPointMotion/pointPatchFields/lumpedPointDisplacementPointPatchVectorField.C +++ b/src/lumpedPointMotion/pointPatchFields/lumpedPointDisplacementPointPatchVectorField.C @@ -208,7 +208,9 @@ lumpedPointDisplacementPointPatchVectorField ) : fixedValuePointPatchField<vector>(p, iF), - controllers_() + controllers_(), + dataWritten_(0, 0), + points0Ptr_(nullptr) {} @@ -221,10 +223,14 @@ lumpedPointDisplacementPointPatchVectorField ) : fixedValuePointPatchField<vector>(p, iF, dict), - controllers_() + controllers_(), + dataWritten_(0, 0), + points0Ptr_(nullptr) { dict.readIfPresent("controllers", controllers_); + dict.readIfPresent("dataWritten", dataWritten_); + if (controllers_.empty()) { WarningInFunction @@ -239,26 +245,30 @@ lumpedPointDisplacementPointPatchVectorField Foam::lumpedPointDisplacementPointPatchVectorField:: lumpedPointDisplacementPointPatchVectorField ( - const lumpedPointDisplacementPointPatchVectorField& pf, + const lumpedPointDisplacementPointPatchVectorField& rhs, const pointPatch& p, const DimensionedField<vector, pointMesh>& iF, const pointPatchFieldMapper& mapper ) : - fixedValuePointPatchField<vector>(pf, p, iF, mapper), - controllers_(pf.controllers_) + fixedValuePointPatchField<vector>(rhs, p, iF, mapper), + controllers_(rhs.controllers_), + dataWritten_(rhs.dataWritten_), + points0Ptr_(nullptr) {} Foam::lumpedPointDisplacementPointPatchVectorField:: lumpedPointDisplacementPointPatchVectorField ( - const lumpedPointDisplacementPointPatchVectorField& pf, + const lumpedPointDisplacementPointPatchVectorField& rhs, const DimensionedField<vector, pointMesh>& iF ) : - fixedValuePointPatchField<vector>(pf, iF), - controllers_(pf.controllers_) + fixedValuePointPatchField<vector>(rhs, iF), + controllers_(rhs.controllers_), + dataWritten_(rhs.dataWritten_), + points0Ptr_(nullptr) {} @@ -336,7 +346,7 @@ void Foam::lumpedPointDisplacementPointPatchVectorField::updateCoeffs() } else if (movement().couplingPending(timeIndex)) { - // Trigger is pending, or coupling not yet not initialized + // Trigger is pending, or coupling not yet initialized triggered = 1; } @@ -351,21 +361,24 @@ void Foam::lumpedPointDisplacementPointPatchVectorField::updateCoeffs() Pout<<"gatherForces: " << forces << " called from patch " << this->patch().index() << endl; - if (Pstream::master()) - { - Pout<<"output forces to file: called from patch " - << this->patch().index() << nl - <<"# " << forces.size() << " force entries" << nl - <<"# fx fy fz" << nl - <<"output forces to file: " - << forces << " called from patch " - << this->patch().index() << endl; - } + Info<< "output forces to file: called from patch " + << this->patch().index() << nl + << "# " << forces.size() << " force entries" << nl + << "# fx fy fz" << nl + << "output forces to file: " + << forces << " called from patch " + << this->patch().index() << endl; } + // Update times when data (forces) were written + // With first=time, second=prevTime + + dataWritten_.second() = dataWritten_.first(); + dataWritten_.first() = this->db().time().timeOutputValue(); + if (Pstream::master()) { - movement().writeData(forces, moments, &(this->db().time())); + movement().writeData(forces, moments, &dataWritten_); // Signal external source to execute movement().coupler().useSlave(); @@ -427,6 +440,12 @@ const os.writeEntry("controllers", controllers_); } + // Times when data were written is only meaningful on the owner patch + if (movement().ownerId() == this->patch().index()) + { + os.writeEntry("dataWritten", dataWritten_); + } + writeEntry("value", os); } diff --git a/src/lumpedPointMotion/pointPatchFields/lumpedPointDisplacementPointPatchVectorField.H b/src/lumpedPointMotion/pointPatchFields/lumpedPointDisplacementPointPatchVectorField.H index e5ae9c8ad73..26e7997b05e 100644 --- a/src/lumpedPointMotion/pointPatchFields/lumpedPointDisplacementPointPatchVectorField.H +++ b/src/lumpedPointMotion/pointPatchFields/lumpedPointDisplacementPointPatchVectorField.H @@ -56,10 +56,7 @@ SourceFiles #include "fixedValuePointPatchField.H" #include "lumpedPointMovement.H" -#include "lumpedPointState.H" #include "lumpedPointIOMovement.H" -#include "labelList.H" -#include "tmp.H" #include "pointField.H" #include "pointFieldsFwd.H" @@ -84,13 +81,18 @@ class lumpedPointDisplacementPointPatchVectorField //- Names of the movement controller(s) in use wordList controllers_; + //- Times when data (forces) were written + // With first=time, second=prevTime + Tuple2<scalar, scalar> dataWritten_; + //- Backup method for getting "points0" without a motion solver mutable autoPtr<pointIOField> points0Ptr_; - //- Convenience typedefs - typedef lumpedPointDisplacementPointPatchVectorField patchType; - typedef DimensionedField<vector, pointMesh> fieldType; + // Convenience typedefs + + typedef lumpedPointDisplacementPointPatchVectorField patchType; + typedef DimensionedField<vector, pointMesh> fieldType; protected: @@ -130,7 +132,7 @@ public: //- Construct by mapping given patchField<vector> onto a new patch lumpedPointDisplacementPointPatchVectorField ( - const lumpedPointDisplacementPointPatchVectorField& pf, + const lumpedPointDisplacementPointPatchVectorField& rhs, const pointPatch& p, const DimensionedField<vector, pointMesh>& iF, const pointPatchFieldMapper& mapper @@ -151,7 +153,7 @@ public: //- Construct as copy setting internal field reference lumpedPointDisplacementPointPatchVectorField ( - const lumpedPointDisplacementPointPatchVectorField& pf, + const lumpedPointDisplacementPointPatchVectorField& rhs, const DimensionedField<vector, pointMesh>& iF ); @@ -171,6 +173,7 @@ public: ); } + //- Destructor. De-register movement if in use and managed by this patch virtual ~lumpedPointDisplacementPointPatchVectorField(); -- GitLab