/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2016-2022 OpenCFD Ltd.
-------------------------------------------------------------------------------
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 .
Class
Foam::meshedSurfRef
Description
Implements a meshed surface by referencing another meshed surface
or faces/points components.
In addition to the referencing, supports simple moving/scaling
of points (uses a deep-copy).
\*---------------------------------------------------------------------------*/
#ifndef Foam_meshedSurfRef_H
#define Foam_meshedSurfRef_H
#include "meshedSurf.H"
#include "refPtr.H"
#include
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class meshedSurfRef Declaration
\*---------------------------------------------------------------------------*/
class meshedSurfRef
:
public meshedSurf
{
// Private Data
//- An external surface reference
refPtr surf_;
//- Components
std::reference_wrapper points_;
std::reference_wrapper faces_;
std::reference_wrapper zoneIds_;
std::reference_wrapper faceIds_;
//- Locations of moved/scaled points (if any)
pointField newPoints_;
public:
// Constructors
//- Default construct
meshedSurfRef()
:
points_(std::cref(pointField::null())),
faces_(std::cref(faceList::null())),
zoneIds_(std::cref(labelList::null())),
faceIds_(std::cref(labelList::null()))
{}
//- Construct as reference to a meshedSurf
explicit meshedSurfRef(const meshedSurf& s)
:
meshedSurfRef()
{
surf_.cref(s);
}
//- Construct from components
meshedSurfRef
(
const pointField& points,
const faceList& faces,
const labelList& zoneIds = labelList::null(),
const labelList& faceIds = labelList::null()
)
:
points_(std::cref(points)),
faces_(std::cref(faces)),
zoneIds_(std::cref(zoneIds)),
faceIds_(std::cref(faceIds))
{}
//- Destructor
virtual ~meshedSurfRef() = default;
// Member Functions
//- Contains a valid reference?
bool good() const
{
return (surf_ || notNull(points_.get()));
}
//- Contains a valid reference?
bool valid() const { return good(); }
//- The original points used for the surface
const pointField& points0() const
{
return (surf_ ? surf_.cref().points() : points_.get());
}
//- The points used for the surface
virtual const pointField& points() const
{
return (newPoints_.empty() ? points0() : newPoints_);
}
//- The faces used for the surface
virtual const faceList& faces() const
{
return (surf_ ? surf_.cref().faces() : faces_.get());
}
//- Per-face zone/region information
virtual const labelList& zoneIds() const
{
return (surf_ ? surf_.cref().zoneIds() : zoneIds_.get());
}
//- Per-face identifier (eg, element Id)
virtual const labelList& faceIds() const
{
return (surf_ ? surf_.cref().faceIds() : faceIds_.get());
}
//- Invalid by redirecting to null objects
void clear()
{
surf_.reset();
points_ = std::cref(pointField::null());
faces_ = std::cref(faceList::null());
zoneIds_ = std::cref(labelList::null());
faceIds_ = std::cref(labelList::null());
newPoints_.clear();
}
//- Reset surface
void reset(const meshedSurf& s)
{
clear();
surf_.cref(s);
}
//- Reset components
void reset
(
const pointField& points,
const faceList& faces,
const labelList& zoneIds = labelList::null(),
const labelList& faceIds = labelList::null()
)
{
surf_.reset();
points_ = std::cref(points);
faces_ = std::cref(faces);
zoneIds_ = std::cref(zoneIds);
faceIds_ = std::cref(faceIds);
newPoints_.clear();
}
//- Reset changes in point positions
void resetPoints()
{
newPoints_.clear();
}
//- Change point positions
void movePoints(pointField&& pts)
{
newPoints_.transfer(pts);
}
//- Change point positions
void movePoints(const tmp& tpts)
{
newPoints_.clear();
if (tpts)
{
newPoints_ = tpts;
}
tpts.clear();
}
//- Scale points: ignore unity and non-positive factors
void scalePoints(const scalar scaleFactor)
{
if (scaleFactor > SMALL && !equal(scaleFactor, 1))
{
if (newPoints_.empty())
{
newPoints_ = points0();
}
newPoints_ *= scaleFactor;
}
}
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //