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

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

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

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

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

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

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

                        const scalar dn = mag(pl.normal() & opl.normal());
Andrew Heather's avatar
Andrew Heather committed
73
                        if (dn > SMALL)
74
                        {
Andrew Heather's avatar
Andrew Heather committed
75
                            if (dn <(1.0 - SMALL))
76
                            {
Andrew Heather's avatar
Andrew Heather committed
77 78 79 80 81 82 83
                                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);
84 85 86
                            }
                            else
                            {
Andrew Heather's avatar
Andrew Heather committed
87
                                // check if the scaling regions overlap
88 89
                                const scalar tMax =
                                    (
Andrew Heather's avatar
Andrew Heather committed
90
                                        bndPlanes[i + 1].refPoint() -
91 92 93 94 95 96 97 98 99 100 101
                                        pl.refPoint()
                                    ) & pl.normal();

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

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

                                # ifdef DEBUGCoordinateModifier
Andrew Heather's avatar
Andrew Heather committed
107 108 109
                                Info<< "tMax " << tMax << endl;
                                Info<< "t0 " << t0 << endl;
                                Info<< "t1 " << t1 << endl;
110 111
                                # endif

Andrew Heather's avatar
Andrew Heather committed
112 113
                                // check if the intervals overlap
                                if ((t1 >= 0) && (t0 < tMax))
114
                                {
Andrew Heather's avatar
Andrew Heather committed
115 116 117 118 119 120 121 122
                                    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);
123 124 125 126 127 128 129 130 131 132
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Andrew Heather's avatar
Andrew Heather committed
133

134 135
// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //

136 137 138 139
Foam::Module::coordinateModifier::coordinateModifier
(
    const dictionary& geomModDict
)
140 141 142 143 144 145 146
:
    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
// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //

183 184 185 186
Foam::point Foam::Module::coordinateModifier::modifiedPoint
(
    const point& p
) const
187 188 189 190
{
    point pNew = p;

    forAll(modifiers_, modI)
191
    {
192
        pNew += modifiers_[modI].displacement(p);
193
    }
194 195 196 197

    return pNew;
}

Andrew Heather's avatar
Andrew Heather committed
198

199 200 201 202
Foam::point Foam::Module::coordinateModifier::backwardModifiedPoint
(
    const point& p
) const
203 204 205 206
{
    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
void Foam::Module::coordinateModifier::printObjects() const
216
{
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
// ************************************************************************* //