points0MotionSolver.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) 2012-2017 OpenFOAM Foundation
9  Copyright (C) 2015-2021 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 \*---------------------------------------------------------------------------*/
28 
29 #include "points0MotionSolver.H"
30 #include "mapPolyMesh.H"
31 
32 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
33 
34 namespace Foam
35 {
36  defineTypeNameAndDebug(points0MotionSolver, 0);
37 }
38 
39 
40 // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
41 
43 {
44  const word instance =
46  (
47  mesh.meshDir(),
48  "points0",
50  );
51  IOobject io
52  (
53  "points0",
54  instance,
56  mesh,
59  false
60  );
61 
62  // If points0 are located in constant directory, verify their existence
63  // or fallback to a copy of the original mesh points
64  if
65  (
66  instance == mesh.time().constant()
67  && !io.typeHeaderOk<pointIOField>()
68  )
69  {
70  io.rename("points");
71  }
72 
73  return io;
74 }
75 
76 
77 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
78 
79 Foam::points0MotionSolver::points0MotionSolver
80 (
81  const polyMesh& mesh,
82  const IOdictionary& dict,
83  const word& type
84 )
85 :
88  points0_(points0IO(mesh))
89 {
90  if
91  (
93  && (points0_.size() > mesh.nPoints())
94  )
95  {
96  // Allowed
97  }
98  else if (points0_.size() != mesh.nPoints())
99  {
101  << "Number of points in mesh " << mesh.nPoints()
102  << " differs from number of points " << points0_.size()
103  << " read from file "
104  << typeFilePath<pointIOField>
105  (
106  IOobject
107  (
108  "points",
109  time().constant(),
111  mesh,
114  false
115  )
116  )
117  << exit(FatalError);
118  }
119 }
120 
121 
122 Foam::points0MotionSolver::points0MotionSolver
123 (
124  const polyMesh& mesh,
125  const IOdictionary& dict,
126  const pointIOField& points0,
127  const word& type
128 )
129 :
131  zoneMotion(dict, mesh),
132  points0_(points0)
133 {
134  if (points0_.size() != mesh.nPoints())
135  {
137  << "Number of points in mesh " << mesh.nPoints()
138  << " differs from number of points " << points0_.size()
139  << " read from file " << points0.filePath()
140  << exit(FatalError);
141  }
142 }
143 
144 
145 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
146 
148 {}
149 
150 
151 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
152 
154 {}
155 
156 
158 {
159  // pointMesh already updates pointFields
160 
162 
163  // Map points0_. Bit special since we somehow have to come up with
164  // a sensible points0 position for introduced points.
165  // Find out scaling between points0 and current points
166 
167  // Get the new points either from the map or the mesh
168  const pointField& points =
169  (
170  mpm.hasMotionPoints()
171  ? mpm.preMotionPoints()
172  : mesh().points()
173  );
174 
175  // Note: boundBox does reduce
176  const vector span0 = boundBox(points0_).span();
177  const vector span = boundBox(points).span();
178 
179  vector scaleFactors(cmptDivide(span0, span));
180 
181  pointField newPoints0(mpm.pointMap().size());
182 
183  forAll(newPoints0, pointi)
184  {
185  label oldPointi = mpm.pointMap()[pointi];
186 
187  if (oldPointi >= 0)
188  {
189  label masterPointi = mpm.reversePointMap()[oldPointi];
190 
191  if (masterPointi == pointi)
192  {
193  newPoints0[pointi] = points0_[oldPointi];
194  }
195  else
196  {
197  // New point - assume motion is scaling
198  newPoints0[pointi] = points0_[oldPointi] + cmptMultiply
199  (
200  scaleFactors,
201  points[pointi] - points[masterPointi]
202  );
203  }
204  }
205  else
206  {
208  << "Cannot determine coordinates of introduced vertices."
209  << " New vertex " << pointi << " at coordinate "
210  << points[pointi] << exit(FatalError);
211  }
212  }
213 
214  twoDCorrectPoints(newPoints0);
215 
216  points0_.transfer(newPoints0);
217 
218  // points0 changed - set to write and check-in to database
219  points0_.rename("points0");
220  points0_.writeOpt(IOobject::AUTO_WRITE);
221  points0_.instance() = time().timeName();
222  points0_.checkIn();
223 }
224 
225 
226 // ************************************************************************* //
Foam::IOobject::NO_WRITE
Definition: IOobject.H:195
Foam::IOdictionary
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
Definition: IOdictionary.H:54
Foam::polyMesh::points
virtual const pointField & points() const
Return raw points.
Definition: polyMesh.C:1069
Foam::IOobject
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition: IOobject.H:169
Foam::IOobject::AUTO_WRITE
Definition: IOobject.H:194
Foam::word
A class for handling words, derived from Foam::string.
Definition: word.H:65
Foam::IOField
A primitive field of type <T> with automated input and output.
Definition: foamVtkLagrangianWriter.H:61
Foam::cmptMultiply
dimensioned< Type > cmptMultiply(const dimensioned< Type > &, const dimensioned< Type > &)
Foam::IOobject::instance
const fileName & instance() const noexcept
Definition: IOobjectI.H:196
Foam::FieldBase::allowConstructFromLargerSize
static bool allowConstructFromLargerSize
Permit read construct from a larger size.
Definition: FieldBase.H:63
Foam::IOobject::typeHeaderOk
bool typeHeaderOk(const bool checkType=true, const bool search=true, const bool verbose=true)
Read header (uses typeFilePath to find file) and check its info.
Definition: IOobjectTemplates.C:39
mapPolyMesh.H
Foam::polyMesh::meshSubDir
static word meshSubDir
Return the mesh sub-directory name (usually "polyMesh")
Definition: polyMesh.H:321
Foam::mapPolyMesh::preMotionPoints
const pointField & preMotionPoints() const
Pre-motion point positions.
Definition: mapPolyMesh.H:613
Foam::polyMesh
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:77
Foam::primitiveMesh::nPoints
label nPoints() const noexcept
Number of mesh points.
Definition: primitiveMeshI.H:37
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:296
Foam::points0MotionSolver::points0IO
static IOobject points0IO(const polyMesh &mesh)
Return IO object for points0.
Definition: points0MotionSolver.C:42
Foam::boundBox::span
vector span() const
The bounding box span (from minimum to maximum)
Definition: boundBoxI.H:127
Foam::Field< vector >
points0MotionSolver.H
Foam::IOobject::READ_IF_PRESENT
Definition: IOobject.H:187
dict
dictionary dict
Definition: searchingEngine.H:14
Foam::FatalError
error FatalError
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:6
Foam::points0MotionSolver::~points0MotionSolver
virtual ~points0MotionSolver()
Destructor.
Definition: points0MotionSolver.C:147
Foam
Namespace for OpenFOAM.
Definition: atmBoundaryLayer.C:33
Foam::IOobject::rename
virtual void rename(const word &newName)
Rename.
Definition: IOobject.H:506
Foam::Time::findInstance
word findInstance(const fileName &dir, const word &name=word::null, const IOobject::readOption rOpt=IOobject::MUST_READ, const word &stopInstance=word::null) const
Definition: Time.C:797
Foam::polyMesh::meshDir
fileName meshDir() const
Return the local mesh directory (dbDir()/meshSubDir)
Definition: polyMesh.C:840
Foam::exit
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:130
Foam::cmptDivide
dimensioned< Type > cmptDivide(const dimensioned< Type > &, const dimensioned< Type > &)
points0
pointField points0(pointIOField(IOobject("points", mesh.time().constant(), polyMesh::meshSubDir, mesh, IOobject::MUST_READ, IOobject::NO_WRITE, false)))
Foam::zoneMotion
Definition: zoneMotion.H:55
Foam::points0MotionSolver::movePoints
virtual void movePoints(const pointField &)
Update local data for geometry changes.
Definition: points0MotionSolver.C:153
FatalErrorInFunction
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:453
Foam::motionSolver
Virtual base class for mesh motion solver.
Definition: motionSolver.H:58
Foam::points0MotionSolver::updateMesh
virtual void updateMesh(const mapPolyMesh &)
Update local data for topology changes.
Definition: points0MotionSolver.C:157
Foam::mapPolyMesh::reversePointMap
const labelList & reversePointMap() const
Reverse point map.
Definition: mapPolyMesh.H:469
Foam::Vector< scalar >
Foam::mapPolyMesh::pointMap
const labelList & pointMap() const
Old point map.
Definition: mapPolyMesh.H:396
Foam::type
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
Definition: MSwindows.C:590
Foam::motionSolver::updateMesh
virtual void updateMesh(const mapPolyMesh &)=0
Update local data for topology changes.
Definition: motionSolver.C:213
points
const pointField & points
Definition: gmvOutputHeader.H:1
Foam::motionSolver::mesh
const polyMesh & mesh() const
Return reference to mesh.
Definition: motionSolver.H:144
Foam::boundBox
A bounding box defined in terms of min/max extrema points.
Definition: boundBox.H:63
Foam::mapPolyMesh
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
Definition: mapPolyMesh.H:161
Foam::mapPolyMesh::hasMotionPoints
bool hasMotionPoints() const
Has valid preMotionPoints?
Definition: mapPolyMesh.H:619
Foam::TimePaths::constant
const word & constant() const
Return constant name.
Definition: TimePathsI.H:96
constant
constant condensation/saturation model.
Foam::defineTypeNameAndDebug
defineTypeNameAndDebug(combustionModel, 0)
Foam::objectRegistry::time
const Time & time() const noexcept
Return time registry.
Definition: objectRegistry.H:178
Foam::IOobject::MUST_READ
Definition: IOobject.H:185