Loading...
Searching...
No Matches
dynamicMotionSolverTopoFvMesh.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2016-2022 OpenCFD Ltd
9-------------------------------------------------------------------------------
10License
11 This file is part of OpenFOAM.
12
13 OpenFOAM is free software: you can redistribute it and/or modify it
14 under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25
26\*---------------------------------------------------------------------------*/
27
30#include "mapPolyMesh.H"
31#include "OBJstream.H"
32#include "Time.H"
34#include "volFields.H"
36// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
37
38namespace Foam
39{
43 (
47 );
49 (
52 doInit
53 );
54}
55
56
57// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
58
59Foam::dynamicMotionSolverTopoFvMesh::dynamicMotionSolverTopoFvMesh
60(
61 const IOobject& io,
62 const bool doInit
63)
64:
65 topoChangerFvMesh(io, doInit)
66{
67 if (doInit)
68 {
69 init(false); // do not initialise lower levels
70 }
71}
72
73
75{
76 if (doInit)
77 {
79 }
80
81 motionPtr_ = motionSolver::New(*this);
82
83 // Assume something changed
84 return true;
85}
86
87
88// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
91{}
92
93
94// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
95
97{
98 // Clear moving flag. This is currently required since geometry calculation
99 // might get triggered when doing processor patches.
100 // (TBD: should be in changeMesh if no inflation?)
101 moving(false);
102 // Do mesh changes (not using inflation - points added directly into mesh)
103 autoPtr<mapPolyMesh> topoChangeMap = topoChanger_.changeMesh(false);
104
105 if (topoChangeMap)
106 {
107 Info << "Executing mesh topology update" << endl;
108 motionPtr_->updateMesh(topoChangeMap());
109
110 setV0() = V();
111
112 pointField newPoints(motionPtr_->newPoints());
113 movePoints(newPoints);
114
115 if (debug)
116 {
117 OBJstream osOld("oldPts_" + time().timeName() + ".obj");
118 osOld.write(oldPoints());
119
120 OBJstream osNew("newPts_" + time().timeName() + ".obj");
121 osNew.write(points());
122 }
123 }
124 else
125 {
126 // Calculate the new point positions using the motion solver
127 pointField newPoints(motionPtr_->newPoints());
128
129 // The mesh now contains the cells with zero volume
130 Info << "Executing mesh motion" << endl;
131 movePoints(newPoints);
132 }
133
134 return true;
135}
136
137
138// ************************************************************************* //
Macros for easy insertion into run-time selection tables.
#define addToRunTimeSelectionTable(baseType, thisType, argNames)
Add to construction table with typeName as the key.
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition IOobject.H:191
An OFstream that keeps track of vertices and provides convenience output methods for OBJ files.
Definition OBJstream.H:58
virtual Ostream & write(const char c) override
Write character.
Definition OBJstream.C:69
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
Definition autoPtr.H:65
Abstract base class for geometry and/or topology changing fvMesh.
virtual bool init(const bool doInit)
Initialise all non-demand-driven data.
Sample topoChangerFvMesh that moves an object using a motion solver.
virtual bool init(const bool doInit)
Initialise all non-demand-driven data.
virtual bool update()
Update the mesh for both mesh motion and topology change.
const DimensionedField< scalar, volMesh > & V() const
Return cell volumes.
DimensionedField< scalar, volMesh > & setV0()
Return old-time cell volumes.
const Time & time() const
Return the top-level database.
Definition fvMesh.H:360
virtual void movePoints(const pointField &)
Move points, returns volumes swept by faces in motion.
Definition fvMesh.C:884
static autoPtr< motionSolver > New(const polyMesh &)
Select constructed from polyMesh.
bool moving() const noexcept
Is mesh moving.
Definition polyMesh.H:732
virtual const pointField & oldPoints() const
Return old points (mesh motion).
Definition polyMesh.C:1113
Abstract base class for a topology changing fvMesh.
#define defineTypeNameAndDebug(Type, DebugSwitch)
Define the typeName and debug information.
Definition className.H:142
const auto & io
const pointField & points
word timeName
Definition getTimeIndex.H:3
Namespace for handling debugging switches.
Definition debug.C:45
Namespace for OpenFOAM.
messageStream Info
Information stream (stdout output on master, null elsewhere).
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition Ostream.H:519
vectorField pointField
pointField is a vectorField.
Foam::surfaceFields.