/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | cfMesh: A library for mesh generation
\\ / O peration |
\\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
\\/ M anipulation | Copyright (C) Creative Fields, Ltd.
-------------------------------------------------------------------------------
License
This file is part of cfMesh.
cfMesh 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.
cfMesh 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 cfMesh. If not, see .
\*---------------------------------------------------------------------------*/
#include "coordinateModifier.H"
#include "plane.H"
namespace Foam
{
void coordinateModifier::checkForValidInverse() const
{
if( modifiers_.size() >= 1 )
{
//- the if the modifiers allow combinations
forAll(modifiers_, modI)
if( !modifiers_[modI].combiningPossible() )
{
FatalErrorIn
(
"void coordinateModifier::checkForValidInverse() const"
) << modifiers_[modI].name() << " cannot be combined with"
<< " other anisotropic sources. The operation"
<< " cannot be reverted!" << exit(FatalError);
}
//- check if the modifications overlap
forAll(modifiers_, modI)
{
PtrList bndPlanes;
modifiers_[modI].boundingPlanes(bndPlanes);
# ifdef DEBUGCoordinateModifier
Info << "Checking planes for object " << modifiers_[modI].name()
<< " which are " << bndPlanes << endl;
# endif
for(label modJ=modI+1;modJ otherBndPlanes;
modifiers_[modJ].boundingPlanes(otherBndPlanes);
# ifdef DEBUGCoordinateModifier
Info << "Bnd planes planes for " << modifiers_[modJ].name()
<< " are " << otherBndPlanes << endl;
# endif
for(label i=0;i SMALL )
{
if( dn < (1.0 - SMALL) )
{
FatalErrorIn
(
"void coordinateModifier::"
"checkForValidInverse() const"
) << "Bounding planes of the objects "
<< modifiers_[modI].name()
<< " and " << modifiers_[modJ].name()
<< " are not parallel. This combination of"
<< " modifications cannot be reverted!"
<< exit(FatalError);
}
else
{
//- check if the scaling regions overlap
const scalar tMax =
(
bndPlanes[i+1].refPoint() -
pl.refPoint()
) & pl.normal();
const scalar t0 =
(
otherBndPlanes[j].refPoint() -
pl.refPoint()
) & pl.normal();
const scalar t1 =
(
otherBndPlanes[j+1].refPoint() -
pl.refPoint()
) & pl.normal();
# ifdef DEBUGCoordinateModifier
Info << "tMax " << tMax << endl;
Info << "t0 " << t0 << endl;
Info << "t1 " << t1 << endl;
# endif
//- check if the intervals overlap
if( (t1 >= 0) && (t0 < tMax) )
{
FatalErrorIn
(
"void coordinateModifier::"
"checkForValidInverse() const"
) << "Scaling regions of objects "
<< modifiers_[modI].name()
<< " and " << modifiers_[modJ].name()
<< " are overlapping each other."
<< " This combination of"
<< " modifications cannot be reverted!"
<< exit(FatalError);
}
}
}
}
}
}
}
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
coordinateModifier::coordinateModifier(const dictionary& geomModDict)
:
modificationDict_(geomModDict),
modifiers_(),
backwardModifiers_()
{
const wordList modifiers = modificationDict_.toc();
//- setup modification
modifiers_.setSize(modifiers.size());
backwardModifiers_.setSize(modifiers.size());
forAll(modifiers, modI)
{
const word& mName = modifiers[modI];
const dictionary& modDict = modificationDict_.subDict(mName);
modifiers_.set(modI, coordinateModification::New(mName, modDict));
backwardModifiers_.set
(
modI,
coordinateModification::New(mName, modDict)
);
}
//- setup backward modification
forAll(backwardModifiers_, modI)
{
vector disp(vector::zero);
const point pOrigin = backwardModifiers_[modI].origin();
forAll(modifiers_, i)
disp += modifiers_[i].displacement(pOrigin);
backwardModifiers_[modI].translateAndModifyObject(disp);
}
checkForValidInverse();
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
coordinateModifier::~coordinateModifier()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
point coordinateModifier::modifiedPoint(const point& p) const
{
point pNew = p;
forAll(modifiers_, modI)
{
pNew += modifiers_[modI].displacement(p);
}
return pNew;
}
point coordinateModifier::backwardModifiedPoint(const point& p) const
{
point pNew = p;
forAll(backwardModifiers_, modI)
pNew += backwardModifiers_[modI].backwardDisplacement(p);
return pNew;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //