coordinateModifier.C 7.68 KB
Newer Older
1 2 3 4 5 6 7 8
/*---------------------------------------------------------------------------*\
  =========                 |
  \\      /  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
Andrew Heather's avatar
Andrew Heather committed
9
    This file is part of OpenFOAM.
10

Andrew Heather's avatar
Andrew Heather committed
11 12 13 14
    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.
15

Andrew Heather's avatar
Andrew Heather committed
16
    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 18 19 20 21
    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
Andrew Heather's avatar
Andrew Heather committed
22
    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
23 24 25 26

\*---------------------------------------------------------------------------*/

#include "coordinateModifier.H"
27
#include "plane.H"
28 29 30 31

namespace Foam
{

32 33
void coordinateModifier::checkForValidInverse() const
{
Andrew Heather's avatar
Andrew Heather committed
34
    if (modifiers_.size() > 1)
35
    {
Andrew Heather's avatar
Andrew Heather committed
36
        // the if the modifiers allow combinations
37
        forAll(modifiers_, modI)
Andrew Heather's avatar
Andrew Heather committed
38
            if (!modifiers_[modI].combiningPossible())
39
            {
Andrew Heather's avatar
Andrew Heather committed
40 41 42 43
                FatalErrorInFunction
                    << modifiers_[modI].name() << " cannot be combined with"
                    << " other anisotropic sources. The operation"
                    << " cannot be reverted!" << exit(FatalError);
44 45
            }

Andrew Heather's avatar
Andrew Heather committed
46
        // check if the modifications overlap
47 48 49 50 51 52
        forAll(modifiers_, modI)
        {
            PtrList<plane> bndPlanes;
            modifiers_[modI].boundingPlanes(bndPlanes);

            # ifdef DEBUGCoordinateModifier
Andrew Heather's avatar
Andrew Heather committed
53 54
            Info<< "Checking planes for object " << modifiers_[modI].name()
                << " which are " << bndPlanes << endl;
55 56
            # endif

Andrew Heather's avatar
Andrew Heather committed
57
            for (label modJ = modI + 1; modJ < modifiers_.size(); ++modJ)
58 59 60 61 62
            {
                PtrList<plane> otherBndPlanes;
                modifiers_[modJ].boundingPlanes(otherBndPlanes);

                # ifdef DEBUGCoordinateModifier
Andrew Heather's avatar
Andrew Heather committed
63 64
                Info<< "Bnd planes planes for " << modifiers_[modJ].name()
                    << " are " << otherBndPlanes << endl;
65 66
                # endif

Andrew Heather's avatar
Andrew Heather committed
67
                for (label i = 0; i < bndPlanes.size(); i += 2)
68 69 70
                {
                    const plane& pl = bndPlanes[i];

Andrew Heather's avatar
Andrew Heather committed
71
                    for (label j = 0; j < otherBndPlanes.size(); j += 2)
72 73 74 75
                    {
                        const plane& opl = otherBndPlanes[j];

                        const scalar dn = mag(pl.normal() & opl.normal());
Andrew Heather's avatar
Andrew Heather committed
76
                        if (dn > SMALL)
77
                        {
Andrew Heather's avatar
Andrew Heather committed
78
                            if (dn <(1.0 - SMALL))
79
                            {
Andrew Heather's avatar
Andrew Heather committed
80 81 82 83 84 85 86
                                FatalErrorInFunction
                                    << "Bounding planes of the objects "
                                    << modifiers_[modI].name()
                                    << " and " << modifiers_[modJ].name()
                                    << " are not parallel. This combination of"
                                    << " modifications cannot be reverted!"
                                    << exit(FatalError);
87 88 89
                            }
                            else
                            {
Andrew Heather's avatar
Andrew Heather committed
90
                                // check if the scaling regions overlap
91 92
                                const scalar tMax =
                                    (
Andrew Heather's avatar
Andrew Heather committed
93
                                        bndPlanes[i + 1].refPoint() -
94 95 96 97 98 99 100 101 102 103 104
                                        pl.refPoint()
                                    ) & pl.normal();

                                const scalar t0 =
                                    (
                                        otherBndPlanes[j].refPoint() -
                                        pl.refPoint()
                                    ) & pl.normal();

                                const scalar t1 =
                                    (
Andrew Heather's avatar
Andrew Heather committed
105
                                        otherBndPlanes[j + 1].refPoint() -
106 107 108 109
                                        pl.refPoint()
                                    ) & pl.normal();

                                # ifdef DEBUGCoordinateModifier
Andrew Heather's avatar
Andrew Heather committed
110 111 112
                                Info<< "tMax " << tMax << endl;
                                Info<< "t0 " << t0 << endl;
                                Info<< "t1 " << t1 << endl;
113 114
                                # endif

Andrew Heather's avatar
Andrew Heather committed
115 116
                                // check if the intervals overlap
                                if ((t1 >= 0) && (t0 < tMax))
117
                                {
Andrew Heather's avatar
Andrew Heather committed
118 119 120 121 122 123 124 125
                                    FatalErrorInFunction
                                        << "Scaling regions of objects "
                                        << modifiers_[modI].name()
                                        << " and " << modifiers_[modJ].name()
                                        << " are overlapping each other."
                                        << " This combination of"
                                        << " modifications cannot be reverted!"
                                        << exit(FatalError);
126 127 128 129 130 131 132 133 134 135
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Andrew Heather's avatar
Andrew Heather committed
136

137 138 139 140 141 142 143 144 145 146
// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //

coordinateModifier::coordinateModifier(const dictionary& geomModDict)
:
    modificationDict_(geomModDict),
    modifiers_(),
    backwardModifiers_()
{
    const wordList modifiers = modificationDict_.toc();

Andrew Heather's avatar
Andrew Heather committed
147
    // setup modification
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
    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)
        );
    }

Andrew Heather's avatar
Andrew Heather committed
163
    // setup backward modification
164 165 166 167 168 169
    forAll(backwardModifiers_, modI)
    {
        vector disp(vector::zero);
        const point pOrigin = backwardModifiers_[modI].origin();

        forAll(modifiers_, i)
Andrew Heather's avatar
Andrew Heather committed
170
        {
171
            disp += modifiers_[i].displacement(pOrigin);
Andrew Heather's avatar
Andrew Heather committed
172
        }
173 174 175

        backwardModifiers_[modI].translateAndModifyObject(disp);
    }
176 177

    checkForValidInverse();
178 179
}

Andrew Heather's avatar
Andrew Heather committed
180

181 182 183 184 185 186 187 188 189 190 191 192 193
// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //

coordinateModifier::~coordinateModifier()
{}


// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //

point coordinateModifier::modifiedPoint(const point& p) const
{
    point pNew = p;

    forAll(modifiers_, modI)
194
    {
195
        pNew += modifiers_[modI].displacement(p);
196
    }
197 198 199 200

    return pNew;
}

Andrew Heather's avatar
Andrew Heather committed
201

202 203 204 205 206
point coordinateModifier::backwardModifiedPoint(const point& p) const
{
    point pNew = p;

    forAll(backwardModifiers_, modI)
Andrew Heather's avatar
Andrew Heather committed
207
    {
208
        pNew += backwardModifiers_[modI].backwardDisplacement(p);
Andrew Heather's avatar
Andrew Heather committed
209
    }
210 211 212 213

    return pNew;
}

Andrew Heather's avatar
Andrew Heather committed
214

215 216
void coordinateModifier::printObjects() const
{
Andrew Heather's avatar
Andrew Heather committed
217
    Info<< "Modification objects " << modifiers_ << endl;
218

Andrew Heather's avatar
Andrew Heather committed
219
    Info<< "Backward modification objects " << backwardModifiers_ << endl;
220 221
}

Andrew Heather's avatar
Andrew Heather committed
222

223 224 225 226 227
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

} // End namespace Foam

// ************************************************************************* //