ENH: improve, simplify, rationalize coordinate system handling (issue #863)

Previously the coordinate system functionality was split between
coordinateSystem and coordinateRotation. The coordinateRotation stored
the rotation tensor and handled all tensor transformations.

The functionality has now been revised and consolidated into the
coordinateSystem classes. The sole purpose of coordinateRotation
is now just to provide a selectable mechanism of how to define the
rotation tensor (eg, axis-angle, euler angles, local axes) for user
input, but after providing the appropriate rotation tensor it has
no further influence on the transformations.

--

The coordinateSystem class now contains an origin and a base rotation
tensor directly and various transformation methods.

  - The origin represents the "shift" for a local coordinate system.

  - The base rotation tensor represents the "tilt" or orientation
    of the local coordinate system in general (eg, for mapping
    positions), but may require position-dependent tensors when
    transforming vectors and tensors.

For some coordinate systems (currently the cylindrical coordinate system),
the rotation tensor required for rotating a vector or tensor is
position-dependent.

The new coordinateSystem and its derivates (cartesian, cylindrical,
indirect) now provide a uniform() method to define if the rotation
tensor is position dependent/independent.

The coordinateSystem transform and invTransform methods are now
available in two-parameter forms for obtaining position-dependent
rotation tensors. Eg,

      ... = cs.transform(globalPt, someVector);

In some cases it can be useful to use query uniform() to avoid
storage of redundant values.

      if (cs.uniform())
      {
          vector xx = cs.transform(someVector);
      }
      else
      {
          List<vector> xx = cs.transform(manyPoints, someVector);
      }

Support transform/invTransform for common data types:
   (scalar, vector, sphericalTensor, symmTensor, tensor).

====================
  Breaking Changes
====================

- These changes to coordinate systems and rotations may represent
  a breaking change for existing user coding.

- Relocating the rotation tensor into coordinateSystem itself means
  that the coordinate system 'R()' method now returns the rotation
  directly instead of the coordinateRotation. The method name 'R()'
  was chosen for consistency with other low-level entities (eg,
  quaternion).

  The following changes will be needed in coding:

      Old:  tensor rot = cs.R().R();
      New:  tensor rot = cs.R();

      Old:  cs.R().transform(...);
      New:  cs.transform(...);

  Accessing the runTime selectable coordinateRotation
  has moved to the rotation() method:

      Old:  Info<< "Rotation input: " << cs.R() << nl;
      New:  Info<< "Rotation input: " << cs.rotation() << nl;

- Naming consistency changes may also cause code to break.

      Old:  transformVector()
      New:  transformPrincipal()

  The old method name transformTensor() now simply becomes transform().

====================
  New methods
====================

For operations requiring caching of the coordinate rotations, the
'R()' method can be used with multiple input points:

       tensorField rots(cs.R(somePoints));

   and later

       Foam::transformList(rots, someVectors);

The rotation() method can also be used to change the rotation tensor
via a new coordinateRotation definition (issue #879).

The new methods transformPoint/invTransformPoint provide
transformations with an origin offset using Cartesian for both local
and global points. These can be used to determine the local position
based on the origin/rotation without interpreting it as a r-theta-z
value, for example.

================
  Input format
================

- Streamline dictionary input requirements

  * The default type is cartesian.
  * The default rotation type is the commonly used axes rotation
    specification (with e1/e2/3), which is assumed if the 'rotation'
    sub-dictionary does not exist.

    Example,

    Compact specification:

        coordinateSystem
        {
            origin  (0 0 0);
            e2      (0 1 0);
            e3      (0.5 0 0.866025);
        }

    Full specification (also accepts the longer 'coordinateRotation'
    sub-dictionary name):

        coordinateSystem
        {
            type    cartesian;
            origin  (0 0 0);

            rotation
            {
                type    axes;
                e2      (0 1 0);
                e3      (0.5 0 0.866025);
            }
        }

   This simplifies the input for many cases.

- Additional rotation specification 'none' (an identity rotation):

      coordinateSystem
      {
          origin  (0 0 0);
          rotation { type none; }
      }

- Additional rotation specification 'axisAngle', which is similar
  to the -rotate-angle option for transforming points (issue #660).
  For some cases this can be more intuitive.

  For example,

      rotation
      {
          type    axisAngle;
          axis    (0 1 0);
          angle   30;
      }
  vs.
      rotation
      {
          type    axes;
          e2      (0 1 0);
          e3      (0.5 0 0.866025);
      }

- shorter names (or older longer names) for the coordinate rotation
  specification.

     euler         EulerRotation
     starcd        STARCDRotation
     axes          axesRotation

================
  Coding Style
================
- use Foam::coordSystem namespace for categories of coordinate systems
  (cartesian, cylindrical, indirect). This reduces potential name
  clashes and makes a clearer declaration. Eg,

      coordSystem::cartesian csys_;

  The older names (eg, cartesianCS, etc) remain available via typedefs.

- added coordinateRotations namespace for better organization and
  reduce potential name clashes.
This commit is contained in:
Mark Olesen
2018-10-01 13:54:10 +02:00
parent e7a6095aaf
commit 6697bb4735
138 changed files with 4552 additions and 3014 deletions

View File

@ -31,7 +31,12 @@
coordinates.set coordinates.set
( (
i, i,
coordinateSystem::New(solidRegions[i], thermos[i]) coordinateSystem::New
(
solidRegions[i],
thermos[i],
coordinateSystem::typeName_()
)
); );
tmp<volVectorField> tkappaByCp = tmp<volVectorField> tkappaByCp =
@ -57,7 +62,11 @@
); );
aniAlphas[i].primitiveFieldRef() = aniAlphas[i].primitiveFieldRef() =
coordinates[i].R().transformVector(tkappaByCp()); coordinates[i].transformPrincipal
(
solidRegions[i].cellCentres(),
tkappaByCp()
);
aniAlphas[i].correctBoundaryConditions(); aniAlphas[i].correctBoundaryConditions();
} }

View File

@ -15,7 +15,12 @@ if (!thermo.isotropic())
const coordinateSystem& coodSys = coordinates[i]; const coordinateSystem& coodSys = coordinates[i];
aniAlpha.primitiveFieldRef() = aniAlpha.primitiveFieldRef() =
coodSys.R().transformVector(tkappaByCp()); coodSys.transformPrincipal
(
mesh.cellCentres(),
tkappaByCp()
);
aniAlpha.correctBoundaryConditions(); aniAlpha.correctBoundaryConditions();
taniAlpha = tmp<volSymmTensorField> taniAlpha = tmp<volSymmTensorField>

View File

@ -30,12 +30,68 @@ Description
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "argList.H" #include "argList.H"
#include "coordinateSystem.H" #include "Time.H"
#include "coordinateSystems.H"
#include "identityRotation.H"
#include "indirectCS.H"
#include "Fstream.H" #include "Fstream.H"
#include "IOstreams.H" #include "IOstreams.H"
#include "transform.H"
using namespace Foam; using namespace Foam;
template<class T>
void testTransform(const coordinateSystem& cs, const point& p, const T& val)
{
Info<< " " << pTraits<T>::typeName << ": " << val
<< " transform: " << cs.transform(p, val)
<< " invTransform: " << cs.invTransform(p, val) << nl;
// Info<< " both: " << cs.invTransform(p, cs.transform(p, val)) << nl;
}
void basicTests(const coordinateSystem& cs)
{
cs.writeEntry(cs.name(), Info);
if (isA<coordSystem::indirect>(cs))
{
Info<< "indirect from:" << nl;
dynamicCast<const coordSystem::indirect>(cs).cs()
.writeEntry(cs.name(), Info);
}
Info<< "rotation: " << cs.R() << nl;
List<point> testPoints
({
{1,0,0}, {0,1,0}, {0,0,1}, {1,1,1},
});
for (const point& p : testPoints)
{
Info<< nl
<< " test point: " << p
<< " = local point " << cs.transformPoint(p)
<< " = local coord " << cs.localPosition(p) << nl;
const vector v1(1, 1, 1);
const tensor t1(tensor::I);
const tensor t2(1, 2, 3, 4, 5, 6, 7, 8, 9);
testTransform(cs, p, v1);
testTransform(cs, p, t1);
testTransform(cs, p, t2);
}
Info<< nl;
}
void doTest(const dictionary& dict) void doTest(const dictionary& dict)
{ {
Info<< dict.dictName() << dict << nl; Info<< dict.dictName() << dict << nl;
@ -43,18 +99,42 @@ void doTest(const dictionary& dict)
// Could fail? // Could fail?
const bool throwingIOError = FatalIOError.throwExceptions(); const bool throwingIOError = FatalIOError.throwExceptions();
const bool throwingError = FatalError.throwExceptions(); const bool throwingError = FatalError.throwExceptions();
try try
{ {
coordinateSystem cs1(dict.dictName(), dict); auto cs1ptr = coordinateSystem::New(dict, "");
coordinateSystem& cs1 = *cs1ptr;
cs1.rename(dict.dictName());
coordinateSystem cs2; basicTests(cs1);
}
catch (Foam::IOerror& err)
{
Info<< "Caught FatalIOError " << err << nl << endl;
}
catch (Foam::error& err)
{
Info<< "Caught FatalError " << err << nl << endl;
}
FatalError.throwExceptions(throwingError);
FatalIOError.throwExceptions(throwingIOError);
}
// Move assign
cs2 = std::move(cs1);
// Info<<cs2 << nl; void doTest(const objectRegistry& obr, const dictionary& dict)
cs2.writeDict(Info, true); {
Info<< nl; Info<< dict.dictName() << dict << nl;
// Could fail?
const bool throwingIOError = FatalIOError.throwExceptions();
const bool throwingError = FatalError.throwExceptions();
try
{
auto cs1ptr = coordinateSystem::New(obr, dict, word::null);
coordinateSystem& cs1 = *cs1ptr;
basicTests(cs1);
} }
catch (Foam::IOerror& err) catch (Foam::IOerror& err)
{ {
@ -78,7 +158,40 @@ int main(int argc, char *argv[])
argList::addArgument("dict .. dictN"); argList::addArgument("dict .. dictN");
argList args(argc, argv, false, true); argList args(argc, argv, false, true);
if (args.size() <= 1) if (args.found("case"))
{
Info<<"using case for tests" << nl;
#include "createTime.H"
const coordinateSystems& systems = coordinateSystems::New(runTime);
Info<< systems.size() << " global systems" << nl;
for (const coordinateSystem& cs : systems)
{
basicTests(cs);
}
// systems.write();
for (label argi=1; argi < args.size(); ++argi)
{
const string& dictFile = args[argi];
IFstream is(dictFile);
dictionary inputDict(is);
forAllConstIters(inputDict, iter)
{
if (iter().isDict())
{
doTest(runTime, iter().dict());
}
}
}
}
else if (args.size() <= 1)
{ {
Info<<"no coordinateSystem dictionaries to expand" << nl; Info<<"no coordinateSystem dictionaries to expand" << nl;
} }

View File

@ -0,0 +1,32 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class IOPtrList<coordinateSystem>; //<-- Older name
object coordinateSystems;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
(
cs1
{
type cartesian;
origin (1 2 3);
coordinateRotation
{
type axes;
e1 (0 0 1);
e2 (0 1 0);
}
}
)
// ************************************************************************* //

View File

@ -0,0 +1,48 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application simpleFoam;
startFrom latestTime;
startTime 0;
stopAt endTime;
endTime 4;
deltaT 1;
writeControl timeStep;
writeInterval 100;
purgeWrite 0;
writeFormat binary;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
// ************************************************************************* //

View File

@ -0,0 +1,86 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
//OLD class IOPtrList<coordinateSystem>;
class coordinateSystems;
object coordinateSystems;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
(
cs1
{
type cartesian;
origin (1 2 3);
rotation
{
type axes;
e1 (0 0 1);
e2 (0 1 0);
}
}
cs2
{
type cartesian;
origin (0 3 5);
e1 (1 2 0);
e2 (2 0 2);
}
cs3
{
type cartesian;
origin (0 3 5);
coordinateRotation // older name
{
type euler;
angles (90 0 0);
}
}
cs4
{
type cylindrical;
origin (0 3 5);
rotation
{
type euler;
angles (90 0 0);
}
}
cyl
{
type cylindrical;
origin (0 0 0);
degrees false;
rotation
{
type axisAngle;
axis (0 0 1);
angle 90;
}
}
ident
{
origin (0 0 0);
rotation
{
type none;
}
}
)
// ************************************************************************* //

View File

@ -0,0 +1,48 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application simpleFoam;
startFrom latestTime;
startTime 0;
stopAt endTime;
endTime 4;
deltaT 1;
writeControl timeStep;
writeInterval 100;
purgeWrite 0;
writeFormat binary;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
// ************************************************************************* //

View File

@ -10,12 +10,19 @@ FoamFile
version 2.0; version 2.0;
format ascii; format ascii;
class dictionary; class dictionary;
object testDict; object testCsys1;
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Rotate 90 deg around x: y -> z, z -> -y // Rotate 90 deg around x: y -> z, z -> -y
rot_x90
{
origin (0 0 0);
e1 (1 0 0);
e3 (0 -1 0);
}
rot_x90_axesRotation rot_x90_axesRotation
{ {
origin (0 0 0); origin (0 0 0);
@ -27,13 +34,24 @@ rot_x90_axesRotation
} }
} }
rot_x90_axisAngle
{
origin (0 0 0);
coordinateRotation
{
type axisAngle;
axis (1 0 0); // non-unit also OK
angle 90;
}
}
rot_x90_euler rot_x90_euler
{ {
origin (0 0 0); origin (0 0 0);
coordinateRotation coordinateRotation
{ {
type EulerRotation; type euler;
rotation (0 90 0); // z-x'-z'' angles (0 90 0); // z-x'-z''
} }
} }
@ -51,18 +69,40 @@ rot_z45_axesRotation
} }
} }
rot_z45_axisAngle
{
origin (0 0 0);
coordinateRotation
{
type axisAngle;
axis (0 0 10); // non-unit also OK
angle 45;
}
}
rot_z45_euler rot_z45_euler
{ {
origin (0 0 0); origin (0 0 0);
coordinateRotation coordinateRotation
{ {
type EulerRotation; type euler;
rotation (45 0 0); // z-x'-z'' angles (45 0 0); // z-x'-z''
}
}
rot_z45_starcd
{
origin (0 0 0);
coordinateRotation
{
type starcd;
angles (45 0 0); // z-x'-y''
} }
} }
// Rotate -45 deg around z: x -> (1 -1 0), y = (1 1 0) // Rotate -45 deg around z: x -> (1 -1 0), y = (1 1 0)
rot_zm45_axesRotation rot_zm45_axesRotation
{ {
origin (0 0 0); origin (0 0 0);
@ -74,13 +114,24 @@ rot_zm45_axesRotation
} }
} }
rot_zm45_axisAngle
{
origin (0 0 0);
coordinateRotation
{
type axisAngle;
axis (0 0 10); // non-unit also OK
angle -45;
}
}
rot_zm45_euler rot_zm45_euler
{ {
origin (0 0 0); origin (0 0 0);
coordinateRotation coordinateRotation
{ {
type EulerRotation; type euler;
rotation (-45 0 0); // z-x'-z'' angles (-45 0 0); // z-x'-z''
} }
} }
@ -98,13 +149,35 @@ null_axesRotation
} }
} }
null_axisAngle0
{
origin (0 0 0);
coordinateRotation
{
type axisAngle;
axis (0 0 0); // non-unit also OK
angle 0;
}
}
null_axisAngle1
{
origin (0 0 0);
coordinateRotation
{
type axisAngle;
axis (1 1 1); // non-unit also OK
angle 0;
}
}
null_euler null_euler
{ {
origin (0 0 0); origin (0 0 0);
coordinateRotation coordinateRotation
{ {
type EulerRotation; type euler;
rotation (0 0 0); // z-x'-z'' angles (0 0 0); // z-x'-z''
} }
} }

View File

@ -0,0 +1,59 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1806 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object testCsys1;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// This dictionary only works in combination with constant/coordinateSystems
mycs1
{
type indirect;
name cs1;
}
mycs2
{
type indirect;
name cs2;
}
mycs3
{
type indirect;
name cs3;
}
mycyl
{
type indirect;
name cyl;
}
mycy2
{
coordinateSystem
{
type indirect;
name cyl;
}
}
mycy3
{
coordinateSystem cyl;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -15,10 +15,12 @@ FoamFile
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
type cartesian; type cartesian;
origin (0 0 0); origin (0 0 0);
coordinateRotation
rotation
{ {
type axesRotation; type axes;
e1 $x; e1 $x;
e2 $y; e2 $y;
} }

View File

@ -15,10 +15,12 @@ FoamFile
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
type cartesian; type cartesian;
origin (0 0 0); origin (0 0 0);
coordinateRotation
rotation
{ {
type axesRotation; type axes;
e1 $x; e1 $x;
e3 $z; e3 $z;
} }

View File

@ -15,12 +15,14 @@ FoamFile
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
type cartesian; type cartesian;
origin (0 0 0); origin (0 0 0);
coordinateRotation
rotation
{ {
type axesRotation; type axes;
e2 $y; e2 $y;
e3 $z e3 $z;
} }
//************************************************************************* // //************************************************************************* //

View File

@ -14,8 +14,9 @@ FoamFile
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
type cartesian; type cylindrical;
coordinateRotation
rotation
{ {
type cylindrical; type cylindrical;
e3 $axis; e3 $axis;

View File

@ -208,7 +208,6 @@ DebugSwitches
Ergun 0; Ergun 0;
Euler 0; Euler 0;
EulerImplicit 0; EulerImplicit 0;
EulerRotation 0;
extendedCellToFaceStencil 0; extendedCellToFaceStencil 0;
FDIC 0; FDIC 0;
FaceCellWave 0; FaceCellWave 0;
@ -239,7 +238,6 @@ DebugSwitches
IFstream 0; IFstream 0;
IOMap<dictionary> 0; IOMap<dictionary> 0;
IOPtrList<MRFZone> 0; IOPtrList<MRFZone> 0;
IOPtrList<coordinateSystem> 0;
IOPtrList<injector> 0; IOPtrList<injector> 0;
IOPtrList<porousZone> 0; IOPtrList<porousZone> 0;
IOobject 0; IOobject 0;
@ -336,7 +334,6 @@ DebugSwitches
SLTS 0; SLTS 0;
SRFModel 0; SRFModel 0;
SRFVelocity 0; SRFVelocity 0;
STARCDRotation 0;
Schaeffer 0; Schaeffer 0;
SchillerNaumann 0; SchillerNaumann 0;
SinclairJackson 0; SinclairJackson 0;
@ -456,9 +453,7 @@ DebugSwitches
constantAbsorptionEmission 0; constantAbsorptionEmission 0;
constantAlphaContactAngle 0; constantAlphaContactAngle 0;
constantScatter 0; constantScatter 0;
coordinateRotation 0;
coordinateSystem 0; coordinateSystem 0;
coordinateSystems 0;
corrected 0; corrected 0;
coupled 0; coupled 0;
cubeRootVol 0; cubeRootVol 0;
@ -745,7 +740,6 @@ DebugSwitches
outletInlet 0; outletInlet 0;
outletStabilised 0; outletStabilised 0;
pair 0; pair 0;
parabolicCylindrical 0;
parcel 0; parcel 0;
partialSlip 0; partialSlip 0;
passiveParticle 0; passiveParticle 0;
@ -1101,5 +1095,4 @@ DimensionSets
} }
// ************************************************************************* // // ************************************************************************* //

View File

@ -242,11 +242,6 @@ public:
//- Inner-product of this with another Tensor. //- Inner-product of this with another Tensor.
inline Tensor<Cmpt> inner(const Tensor<Cmpt>& t2) const; inline Tensor<Cmpt> inner(const Tensor<Cmpt>& t2) const;
//- Inner-product of this with transpose of another Tensor.
// Primarily useful for coordinate transformations
// (where transpose is the same as the inverse).
inline Tensor<Cmpt> innerT(const Tensor<Cmpt>& t2) const;
//- Schur-product of this with another Tensor. //- Schur-product of this with another Tensor.
inline Tensor<Cmpt> schur(const Tensor<Cmpt>& t2) const; inline Tensor<Cmpt> schur(const Tensor<Cmpt>& t2) const;

View File

@ -504,29 +504,6 @@ Foam::Tensor<Cmpt>::inner(const Tensor<Cmpt>& t2) const
} }
template<class Cmpt>
inline Foam::Tensor<Cmpt>
Foam::Tensor<Cmpt>::innerT(const Tensor<Cmpt>& t2) const
{
const Tensor<Cmpt>& t1 = *this;
return Tensor<Cmpt>
(
t1.xx()*t2.xx() + t1.xy()*t2.xy() + t1.xz()*t2.xz(),
t1.xx()*t2.yx() + t1.xy()*t2.yy() + t1.xz()*t2.yz(),
t1.xx()*t2.zx() + t1.xy()*t2.zy() + t1.xz()*t2.zz(),
t1.yx()*t2.xx() + t1.yy()*t2.xy() + t1.yz()*t2.xz(),
t1.yx()*t2.yx() + t1.yy()*t2.yy() + t1.yz()*t2.yz(),
t1.yx()*t2.zx() + t1.yy()*t2.zy() + t1.yz()*t2.zz(),
t1.zx()*t2.xx() + t1.zy()*t2.xy() + t1.zz()*t2.xz(),
t1.zx()*t2.yx() + t1.zy()*t2.yy() + t1.zz()*t2.yz(),
t1.zx()*t2.zx() + t1.zy()*t2.zy() + t1.zz()*t2.zz()
);
}
template<class Cmpt> template<class Cmpt>
inline Foam::Tensor<Cmpt> inline Foam::Tensor<Cmpt>
Foam::Tensor<Cmpt>::schur(const Tensor<Cmpt>& t2) const Foam::Tensor<Cmpt>::schur(const Tensor<Cmpt>& t2) const

View File

@ -156,11 +156,6 @@ public:
//- Inner-product of this with another Tensor2D. //- Inner-product of this with another Tensor2D.
inline Tensor2D<Cmpt> inner(const Tensor2D<Cmpt>& t2) const; inline Tensor2D<Cmpt> inner(const Tensor2D<Cmpt>& t2) const;
//- Inner-product of this with transpose of another Tensor2D.
// Primarily useful for coordinate transformations
// (where transpose is the same as the inverse).
inline Tensor2D<Cmpt> innerT(const Tensor2D<Cmpt>& t2) const;
//- Schur-product of this with another Tensor2D. //- Schur-product of this with another Tensor2D.
inline Tensor2D<Cmpt> schur(const Tensor2D<Cmpt>& t2) const; inline Tensor2D<Cmpt> schur(const Tensor2D<Cmpt>& t2) const;

View File

@ -202,23 +202,6 @@ Foam::Tensor2D<Cmpt>::inner(const Tensor2D<Cmpt>& t2) const
} }
template<class Cmpt>
inline Foam::Tensor2D<Cmpt>
Foam::Tensor2D<Cmpt>::innerT(const Tensor2D<Cmpt>& t2) const
{
const Tensor2D<Cmpt>& t1 = *this;
return Tensor2D<Cmpt>
(
t1.xx()*t2.xx() + t1.xy()*t2.xy(),
t1.xx()*t2.yx() + t1.xy()*t2.yy(),
t1.yx()*t2.xx() + t1.yy()*t2.xy(),
t1.yx()*t2.yx() + t1.yy()*t2.yy()
);
}
template<class Cmpt> template<class Cmpt>
inline Foam::Tensor2D<Cmpt> inline Foam::Tensor2D<Cmpt>
Foam::Tensor2D<Cmpt>::schur(const Tensor2D<Cmpt>& t2) const Foam::Tensor2D<Cmpt>::schur(const Tensor2D<Cmpt>& t2) const

View File

@ -43,7 +43,7 @@ Description
U_f | frictional velocity U_f | frictional velocity
K | Von Karman's constant K | Von Karman's constant
z_0 | surface roughness length z_0 | surface roughness length
z | vertical co-ordinate z | vertical coordinate
\endvartable \endvartable
Usage Usage

View File

@ -276,7 +276,7 @@ Foam::directions::directions
List<vectorField>(wordList(dict.lookup("directions")).size()) List<vectorField>(wordList(dict.lookup("directions")).size())
{ {
const wordList wantedDirs(dict.lookup("directions")); const wordList wantedDirs(dict.lookup("directions"));
const word coordSystem(dict.lookup("coordinateSystem")); const word coordSystem(dict.get<word>("coordinateSystem"));
bool wantNormal = false; bool wantNormal = false;
bool wantTan1 = false; bool wantTan1 = false;

View File

@ -230,8 +230,8 @@ void Foam::points0MotionSolver::updateMesh(const mapPolyMesh& mpm)
else else
{ {
FatalErrorInFunction FatalErrorInFunction
<< "Cannot determine co-ordinates of introduced vertices." << "Cannot determine coordinates of introduced vertices."
<< " New vertex " << pointi << " at co-ordinate " << " New vertex " << pointi << " at coordinate "
<< points[pointi] << exit(FatalError); << points[pointi] << exit(FatalError);
} }
} }

View File

@ -30,7 +30,6 @@ License
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct from components
Foam::enginePiston::enginePiston Foam::enginePiston::enginePiston
( (
const polyMesh& mesh, const polyMesh& mesh,
@ -43,13 +42,12 @@ Foam::enginePiston::enginePiston
mesh_(mesh), mesh_(mesh),
engineDB_(refCast<const engineTime>(mesh.time())), engineDB_(refCast<const engineTime>(mesh.time())),
patchID_(pistonPatchName, mesh.boundaryMesh()), patchID_(pistonPatchName, mesh.boundaryMesh()),
csPtr_(pistonCS), csysPtr_(pistonCS),
minLayer_(minLayer), minLayer_(minLayer),
maxLayer_(maxLayer) maxLayer_(maxLayer)
{} {}
// Construct from dictionary
Foam::enginePiston::enginePiston Foam::enginePiston::enginePiston
( (
const polyMesh& mesh, const polyMesh& mesh,
@ -59,22 +57,15 @@ Foam::enginePiston::enginePiston
mesh_(mesh), mesh_(mesh),
engineDB_(refCast<const engineTime>(mesh_.time())), engineDB_(refCast<const engineTime>(mesh_.time())),
patchID_(dict.lookup("patch"), mesh.boundaryMesh()), patchID_(dict.lookup("patch"), mesh.boundaryMesh()),
csPtr_ csysPtr_
( (
coordinateSystem::New coordinateSystem::New(mesh_, dict, coordinateSystem::typeName_())
(
mesh_,
dict.subDict("coordinateSystem")
)
), ),
minLayer_(readScalar(dict.lookup("minLayer"))), minLayer_(dict.get<scalar>("minLayer")),
maxLayer_(readScalar(dict.lookup("maxLayer"))) maxLayer_(dict.get<scalar>("maxLayer"))
{} {}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::enginePiston::writeDict(Ostream& os) const void Foam::enginePiston::writeDict(Ostream& os) const

View File

@ -65,7 +65,7 @@ class enginePiston
polyPatchID patchID_; polyPatchID patchID_;
//- Coordinate system //- Coordinate system
autoPtr<coordinateSystem> csPtr_; autoPtr<coordinateSystem> csysPtr_;
// Piston layering data // Piston layering data
@ -112,7 +112,8 @@ public:
); );
// Destructor - default //- Destructor
~enginePiston() = default;
// Member Functions // Member Functions
@ -120,7 +121,7 @@ public:
//- Return coordinate system //- Return coordinate system
const coordinateSystem& cs() const const coordinateSystem& cs() const
{ {
return *csPtr_; return *csysPtr_;
} }
//- Return ID of piston patch //- Return ID of piston patch

View File

@ -63,7 +63,6 @@ Foam::scalar Foam::engineValve::adjustCrankAngle(const scalar theta) const
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct from components
Foam::engineValve::engineValve Foam::engineValve::engineValve
( (
const word& name, const word& name,
@ -89,7 +88,7 @@ Foam::engineValve::engineValve
name_(name), name_(name),
mesh_(mesh), mesh_(mesh),
engineDB_(refCast<const engineTime>(mesh.time())), engineDB_(refCast<const engineTime>(mesh.time())),
csPtr_(valveCS), csysPtr_(valveCS.clone()),
bottomPatch_(bottomPatchName, mesh.boundaryMesh()), bottomPatch_(bottomPatchName, mesh.boundaryMesh()),
poppetPatch_(poppetPatchName, mesh.boundaryMesh()), poppetPatch_(poppetPatchName, mesh.boundaryMesh()),
stemPatch_(stemPatchName, mesh.boundaryMesh()), stemPatch_(stemPatchName, mesh.boundaryMesh()),
@ -110,7 +109,6 @@ Foam::engineValve::engineValve
{} {}
// Construct from dictionary
Foam::engineValve::engineValve Foam::engineValve::engineValve
( (
const word& name, const word& name,
@ -121,13 +119,9 @@ Foam::engineValve::engineValve
name_(name), name_(name),
mesh_(mesh), mesh_(mesh),
engineDB_(refCast<const engineTime>(mesh_.time())), engineDB_(refCast<const engineTime>(mesh_.time())),
csPtr_ csysPtr_
( (
coordinateSystem::New coordinateSystem::New(mesh_, dict, coordinateSystem::typeName_())
(
mesh_,
dict.subDict("coordinateSystem")
)
), ),
bottomPatch_(dict.lookup("bottomPatch"), mesh.boundaryMesh()), bottomPatch_(dict.lookup("bottomPatch"), mesh.boundaryMesh()),
poppetPatch_(dict.lookup("poppetPatch"), mesh.boundaryMesh()), poppetPatch_(dict.lookup("poppetPatch"), mesh.boundaryMesh()),
@ -156,18 +150,15 @@ Foam::engineValve::engineValve
liftProfile_("theta", "lift", name_, dict.lookup("liftProfile")), liftProfile_("theta", "lift", name_, dict.lookup("liftProfile")),
liftProfileStart_(min(liftProfile_.x())), liftProfileStart_(min(liftProfile_.x())),
liftProfileEnd_(max(liftProfile_.x())), liftProfileEnd_(max(liftProfile_.x())),
minLift_(readScalar(dict.lookup("minLift"))), minLift_(dict.get<scalar>("minLift")),
minTopLayer_(readScalar(dict.lookup("minTopLayer"))), minTopLayer_(dict.get<scalar>("minTopLayer")),
maxTopLayer_(readScalar(dict.lookup("maxTopLayer"))), maxTopLayer_(dict.get<scalar>("maxTopLayer")),
minBottomLayer_(readScalar(dict.lookup("minBottomLayer"))), minBottomLayer_(dict.get<scalar>("minBottomLayer")),
maxBottomLayer_(readScalar(dict.lookup("maxBottomLayer"))), maxBottomLayer_(dict.get<scalar>("maxBottomLayer")),
diameter_(readScalar(dict.lookup("diameter"))) diameter_(dict.get<scalar>("diameter"))
{} {}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::scalar Foam::engineValve::lift(const scalar theta) const Foam::scalar Foam::engineValve::lift(const scalar theta) const
@ -238,7 +229,7 @@ void Foam::engineValve::writeDict(Ostream& os) const
{ {
os << nl << name() << nl << token::BEGIN_BLOCK; os << nl << name() << nl << token::BEGIN_BLOCK;
cs().writeDict(os); cs().writeEntry(coordinateSystem::typeName_(), os);
os << "bottomPatch " << bottomPatch_.name() << token::END_STATEMENT << nl os << "bottomPatch " << bottomPatch_.name() << token::END_STATEMENT << nl
<< "poppetPatch " << poppetPatch_.name() << token::END_STATEMENT << nl << "poppetPatch " << poppetPatch_.name() << token::END_STATEMENT << nl

View File

@ -45,7 +45,7 @@ SourceFiles
namespace Foam namespace Foam
{ {
// Forward declaration of classes // Forward declarations
class polyMesh; class polyMesh;
class engineTime; class engineTime;
@ -67,7 +67,7 @@ class engineValve
const engineTime& engineDB_; const engineTime& engineDB_;
//- Coordinate system //- Coordinate system
autoPtr<coordinateSystem> csPtr_; autoPtr<coordinateSystem> csysPtr_;
// Patch and zone names // Patch and zone names
@ -145,9 +145,6 @@ class engineValve
public: public:
// Static data members
// Constructors // Constructors
//- Construct from components //- Construct from components
@ -171,7 +168,6 @@ public:
const scalar minBottomLayer, const scalar minBottomLayer,
const scalar maxBottomLayer, const scalar maxBottomLayer,
const scalar diameter const scalar diameter
); );
//- Construct from dictionary //- Construct from dictionary
@ -183,7 +179,8 @@ public:
); );
// Destructor - default //- Destructor
~engineValve() = default;
// Member Functions // Member Functions
@ -197,7 +194,7 @@ public:
//- Return coordinate system //- Return coordinate system
const coordinateSystem& cs() const const coordinateSystem& cs() const
{ {
return *csPtr_; return *csysPtr_;
} }
//- Return lift profile //- Return lift profile
@ -308,7 +305,7 @@ public:
//- Write dictionary //- Write dictionary
void writeDict(Ostream&) const; void writeDict(Ostream& os) const;
}; };

View File

@ -34,7 +34,7 @@ License
#include "processorFaPatch.H" #include "processorFaPatch.H"
#include "wedgeFaPatch.H" #include "wedgeFaPatch.H"
#include "PstreamCombineReduceOps.H" #include "PstreamCombineReduceOps.H"
#include "coordinateSystem.H" #include "cartesianCS.H"
#include "scalarMatrices.H" #include "scalarMatrices.H"
#include "processorFaPatchFields.H" #include "processorFaPatchFields.H"
#include "emptyFaPatchFields.H" #include "emptyFaPatchFields.H"
@ -1271,7 +1271,7 @@ void Foam::faMesh::calcPointAreaNormalsByQuadricsFit() const
curPoints = pointSet.toc(); curPoints = pointSet.toc();
} }
vectorField allPoints(curPoints.size()); pointField allPoints(curPoints.size());
scalarField W(curPoints.size(), 1.0); scalarField W(curPoints.size(), 1.0);
for (label i=0; i<curPoints.size(); ++i) for (label i=0; i<curPoints.size(); ++i)
{ {
@ -1280,17 +1280,16 @@ void Foam::faMesh::calcPointAreaNormalsByQuadricsFit() const
} }
// Transform points // Transform points
const vector& origin = points[curPoint]; coordSystem::cartesian cs
const vector axis = normalised(result[curPoint]); (
vector dir(allPoints[0] - points[curPoint]); points[curPoint], // origin
dir -= axis*(axis&dir); result[curPoint], // axis [e3] (normalized by constructor)
dir.normalise(); allPoints[0] - points[curPoint] // direction [e1]
);
coordinateSystem cs("cs", origin, axis, dir); for (point& p : allPoints)
forAll(allPoints, pI)
{ {
allPoints[pI] = cs.localPosition(allPoints[pI]); p = cs.localPosition(p);
} }
scalarRectangularMatrix M scalarRectangularMatrix M

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -27,6 +27,7 @@ License
#include "DarcyForchheimer.H" #include "DarcyForchheimer.H"
#include "geometricOneField.H" #include "geometricOneField.H"
#include "fvMatrices.H" #include "fvMatrices.H"
#include "pointIndList.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -67,69 +68,50 @@ Foam::porosityModels::DarcyForchheimer::DarcyForchheimer
} }
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::porosityModels::DarcyForchheimer::~DarcyForchheimer()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::porosityModels::DarcyForchheimer::calcTransformModelData() void Foam::porosityModels::DarcyForchheimer::calcTransformModelData()
{ {
if (coordSys_.R().uniform()) // The Darcy coefficient as a tensor
tensor darcyCoeff(Zero);
darcyCoeff.xx() = dXYZ_.value().x();
darcyCoeff.yy() = dXYZ_.value().y();
darcyCoeff.zz() = dXYZ_.value().z();
// The Forchheimer coefficient as a tensor
// - the leading 0.5 is from 1/2*rho
tensor forchCoeff(Zero);
forchCoeff.xx() = 0.5*fXYZ_.value().x();
forchCoeff.yy() = 0.5*fXYZ_.value().y();
forchCoeff.zz() = 0.5*fXYZ_.value().z();
if (csys().uniform())
{ {
forAll(cellZoneIDs_, zoneI) forAll(cellZoneIDs_, zonei)
{ {
D_[zoneI].setSize(1); D_[zonei].resize(1);
F_[zoneI].setSize(1); F_[zonei].resize(1);
D_[zoneI][0] = Zero; D_[zonei] = csys().transform(darcyCoeff);
D_[zoneI][0].xx() = dXYZ_.value().x(); F_[zonei] = csys().transform(forchCoeff);
D_[zoneI][0].yy() = dXYZ_.value().y();
D_[zoneI][0].zz() = dXYZ_.value().z();
D_[zoneI][0] = coordSys_.R().transformTensor(D_[zoneI][0]);
// leading 0.5 is from 1/2*rho
F_[zoneI][0] = Zero;
F_[zoneI][0].xx() = 0.5*fXYZ_.value().x();
F_[zoneI][0].yy() = 0.5*fXYZ_.value().y();
F_[zoneI][0].zz() = 0.5*fXYZ_.value().z();
F_[zoneI][0] = coordSys_.R().transformTensor(F_[zoneI][0]);
} }
} }
else else
{ {
forAll(cellZoneIDs_, zoneI) forAll(cellZoneIDs_, zonei)
{ {
const labelList& cells = mesh_.cellZones()[cellZoneIDs_[zoneI]]; const pointUIndList cc
(
mesh_.cellCentres(),
mesh_.cellZones()[cellZoneIDs_[zonei]]
);
D_[zoneI].setSize(cells.size()); D_[zonei] = csys().transform(cc, darcyCoeff);
F_[zoneI].setSize(cells.size()); F_[zonei] = csys().transform(cc, forchCoeff);
forAll(cells, i)
{
D_[zoneI][i] = Zero;
D_[zoneI][i].xx() = dXYZ_.value().x();
D_[zoneI][i].yy() = dXYZ_.value().y();
D_[zoneI][i].zz() = dXYZ_.value().z();
// leading 0.5 is from 1/2*rho
F_[zoneI][i] = Zero;
F_[zoneI][i].xx() = 0.5*fXYZ_.value().x();
F_[zoneI][i].yy() = 0.5*fXYZ_.value().y();
F_[zoneI][i].zz() = 0.5*fXYZ_.value().z();
}
const coordinateRotation& R = coordSys_.R(mesh_, cells);
D_[zoneI] = R.transformTensor(D_[zoneI], cells);
F_[zoneI] = R.transformTensor(F_[zoneI], cells);
} }
} }
if (debug && mesh_.time().writeTime()) if (debug && mesh_.time().writeTime())
{ {
volTensorField Dout volTensorField Dout
@ -159,8 +141,22 @@ void Foam::porosityModels::DarcyForchheimer::calcTransformModelData()
dimensionedTensor(fXYZ_.dimensions(), Zero) dimensionedTensor(fXYZ_.dimensions(), Zero)
); );
UIndirectList<tensor>(Dout, mesh_.cellZones()[cellZoneIDs_[0]]) = D_[0];
UIndirectList<tensor>(Fout, mesh_.cellZones()[cellZoneIDs_[0]]) = F_[0]; forAll(cellZoneIDs_, zonei)
{
const labelList& cells = mesh_.cellZones()[cellZoneIDs_[zonei]];
if (csys().uniform())
{
UIndirectList<tensor>(Dout, cells) = D_[zonei].first();
UIndirectList<tensor>(Fout, cells) = F_[zonei].first();
}
else
{
UIndirectList<tensor>(Dout, cells) = D_[zonei];
UIndirectList<tensor>(Fout, cells) = F_[zonei];
}
}
Dout.write(); Dout.write();
Fout.write(); Fout.write();
@ -176,7 +172,7 @@ void Foam::porosityModels::DarcyForchheimer::calcForce
vectorField& force vectorField& force
) const ) const
{ {
scalarField Udiag(U.size(), 0.0); scalarField Udiag(U.size(), Zero);
vectorField Usource(U.size(), Zero); vectorField Usource(U.size(), Zero);
const scalarField& V = mesh_.V(); const scalarField& V = mesh_.V();
@ -202,19 +198,17 @@ void Foam::porosityModels::DarcyForchheimer::correct
if (UEqn.dimensions() == dimForce) if (UEqn.dimensions() == dimForce)
{ {
const volScalarField& rho = mesh_.lookupObject<volScalarField>(rhoName); const auto& rho = mesh_.lookupObject<volScalarField>(rhoName);
if (mesh_.foundObject<volScalarField>(muName)) if (mesh_.foundObject<volScalarField>(muName))
{ {
const volScalarField& mu = const auto& mu = mesh_.lookupObject<volScalarField>(muName);
mesh_.lookupObject<volScalarField>(muName);
apply(Udiag, Usource, V, rho, mu, U); apply(Udiag, Usource, V, rho, mu, U);
} }
else else
{ {
const volScalarField& nu = const auto& nu = mesh_.lookupObject<volScalarField>(nuName);
mesh_.lookupObject<volScalarField>(nuName);
apply(Udiag, Usource, V, rho, rho*nu, U); apply(Udiag, Usource, V, rho, rho*nu, U);
} }
@ -223,17 +217,14 @@ void Foam::porosityModels::DarcyForchheimer::correct
{ {
if (mesh_.foundObject<volScalarField>(nuName)) if (mesh_.foundObject<volScalarField>(nuName))
{ {
const volScalarField& nu = const auto& nu = mesh_.lookupObject<volScalarField>(nuName);
mesh_.lookupObject<volScalarField>(nuName);
apply(Udiag, Usource, V, geometricOneField(), nu, U); apply(Udiag, Usource, V, geometricOneField(), nu, U);
} }
else else
{ {
const volScalarField& rho = const auto& rho = mesh_.lookupObject<volScalarField>(rhoName);
mesh_.lookupObject<volScalarField>(rhoName); const auto& mu = mesh_.lookupObject<volScalarField>(muName);
const volScalarField& mu =
mesh_.lookupObject<volScalarField>(muName);
apply(Udiag, Usource, V, geometricOneField(), mu/rho, U); apply(Udiag, Usource, V, geometricOneField(), mu/rho, U);
} }
@ -271,8 +262,8 @@ void Foam::porosityModels::DarcyForchheimer::correct
if (UEqn.dimensions() == dimForce) if (UEqn.dimensions() == dimForce)
{ {
const volScalarField& rho = mesh_.lookupObject<volScalarField>(rhoName); const auto& rho = mesh_.lookupObject<volScalarField>(rhoName);
const volScalarField& mu = mesh_.lookupObject<volScalarField>(muName); const auto& mu = mesh_.lookupObject<volScalarField>(muName);
apply(AU, rho, mu, U); apply(AU, rho, mu, U);
} }
@ -280,17 +271,14 @@ void Foam::porosityModels::DarcyForchheimer::correct
{ {
if (mesh_.foundObject<volScalarField>(nuName)) if (mesh_.foundObject<volScalarField>(nuName))
{ {
const volScalarField& nu = const auto& nu = mesh_.lookupObject<volScalarField>(nuName);
mesh_.lookupObject<volScalarField>(nuName);
apply(AU, geometricOneField(), nu, U); apply(AU, geometricOneField(), nu, U);
} }
else else
{ {
const volScalarField& rho = const auto& rho = mesh_.lookupObject<volScalarField>(rhoName);
mesh_.lookupObject<volScalarField>(rhoName); const auto& mu = mesh_.lookupObject<volScalarField>(muName);
const volScalarField& mu =
mesh_.lookupObject<volScalarField>(muName);
apply(AU, geometricOneField(), mu/rho, U); apply(AU, geometricOneField(), mu/rho, U);
} }

View File

@ -41,7 +41,7 @@ Description
to specify a multiplier (of the max component). to specify a multiplier (of the max component).
The orientation of the porous region is defined with the same notation as The orientation of the porous region is defined with the same notation as
a co-ordinate system, but only a Cartesian co-ordinate system is valid. a coordinate system, but only a Cartesian coordinate system is valid.
SourceFiles SourceFiles
DarcyForchheimer.C DarcyForchheimer.C
@ -141,7 +141,7 @@ public:
); );
//- Destructor //- Destructor
virtual ~DarcyForchheimer(); virtual ~DarcyForchheimer() = default;
// Member Functions // Member Functions

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -26,6 +26,7 @@ License
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
#include "fixedCoeff.H" #include "fixedCoeff.H"
#include "fvMatrices.H" #include "fvMatrices.H"
#include "pointIndList.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -78,7 +79,6 @@ void Foam::porosityModels::fixedCoeff::apply
const scalar rho const scalar rho
) const ) const
{ {
forAll(cellZoneIDs_, zoneI) forAll(cellZoneIDs_, zoneI)
{ {
const tensorField& alphaZones = alpha_[zoneI]; const tensorField& alphaZones = alpha_[zoneI];
@ -123,62 +123,45 @@ Foam::porosityModels::fixedCoeff::fixedCoeff
} }
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::porosityModels::fixedCoeff::~fixedCoeff()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::porosityModels::fixedCoeff::calcTransformModelData() void Foam::porosityModels::fixedCoeff::calcTransformModelData()
{ {
if (coordSys_.R().uniform()) // The alpha coefficient as a tensor
{ tensor alphaCoeff(Zero);
forAll(cellZoneIDs_, zoneI) alphaCoeff.xx() = alphaXYZ_.value().x();
{ alphaCoeff.yy() = alphaXYZ_.value().y();
alpha_[zoneI].setSize(1); alphaCoeff.zz() = alphaXYZ_.value().z();
beta_[zoneI].setSize(1);
alpha_[zoneI][0] = Zero; // The beta coefficient as a tensor
alpha_[zoneI][0].xx() = alphaXYZ_.value().x(); tensor betaCoeff(Zero);
alpha_[zoneI][0].yy() = alphaXYZ_.value().y(); betaCoeff.xx() = betaXYZ_.value().x();
alpha_[zoneI][0].zz() = alphaXYZ_.value().z(); betaCoeff.yy() = betaXYZ_.value().y();
alpha_[zoneI][0] = coordSys_.R().transformTensor(alpha_[zoneI][0]); betaCoeff.zz() = betaXYZ_.value().z();
beta_[zoneI][0] = Zero; if (csys().uniform())
beta_[zoneI][0].xx() = betaXYZ_.value().x(); {
beta_[zoneI][0].yy() = betaXYZ_.value().y(); forAll(cellZoneIDs_, zonei)
beta_[zoneI][0].zz() = betaXYZ_.value().z(); {
beta_[zoneI][0] = coordSys_.R().transformTensor(beta_[zoneI][0]); alpha_[zonei].resize(1);
beta_[zonei].resize(1);
alpha_[zonei] = csys().transform(alphaCoeff);
beta_[zonei] = csys().transform(betaCoeff);
} }
} }
else else
{ {
forAll(cellZoneIDs_, zoneI) forAll(cellZoneIDs_, zonei)
{ {
const labelList& cells = mesh_.cellZones()[cellZoneIDs_[zoneI]]; const pointUIndList cc
(
mesh_.cellCentres(),
mesh_.cellZones()[cellZoneIDs_[zonei]]
);
alpha_[zoneI].setSize(cells.size()); alpha_[zonei] = csys().transform(cc, alphaCoeff);
beta_[zoneI].setSize(cells.size()); beta_[zonei] = csys().transform(cc, betaCoeff);
forAll(cells, i)
{
alpha_[zoneI][i] = Zero;
alpha_[zoneI][i].xx() = alphaXYZ_.value().x();
alpha_[zoneI][i].yy() = alphaXYZ_.value().y();
alpha_[zoneI][i].zz() = alphaXYZ_.value().z();
beta_[zoneI][i] = Zero;
beta_[zoneI][i].xx() = betaXYZ_.value().x();
beta_[zoneI][i].yy() = betaXYZ_.value().y();
beta_[zoneI][i].zz() = betaXYZ_.value().z();
}
const coordinateRotation& R = coordSys_.R(mesh_, cells);
alpha_[zoneI] = R.transformTensor(alpha_[zoneI], cells);
beta_[zoneI] = R.transformTensor(beta_[zoneI], cells);
} }
} }
} }
@ -195,7 +178,7 @@ void Foam::porosityModels::fixedCoeff::calcForce
scalarField Udiag(U.size(), 0.0); scalarField Udiag(U.size(), 0.0);
vectorField Usource(U.size(), Zero); vectorField Usource(U.size(), Zero);
const scalarField& V = mesh_.V(); const scalarField& V = mesh_.V();
scalar rhoRef = readScalar(coeffs_.lookup("rhoRef")); const scalar rhoRef = coeffs_.get<scalar>("rhoRef");
apply(Udiag, Usource, V, U, rhoRef); apply(Udiag, Usource, V, U, rhoRef);

View File

@ -118,7 +118,7 @@ public:
); );
//- Destructor //- Destructor
virtual ~fixedCoeff(); virtual ~fixedCoeff() = default;
// Member Functions // Member Functions

View File

@ -48,15 +48,15 @@ Foam::IOobject Foam::IOporosityModelList::createIOobject
Info<< "Creating porosity model list from " << io.name() << nl << endl; Info<< "Creating porosity model list from " << io.name() << nl << endl;
io.readOpt() = IOobject::MUST_READ_IF_MODIFIED; io.readOpt() = IOobject::MUST_READ_IF_MODIFIED;
return io;
} }
else else
{ {
Info<< "No porosity models present" << nl << endl; Info<< "No porosity models present" << nl << endl;
io.readOpt() = IOobject::NO_READ; io.readOpt() = IOobject::NO_READ;
return io;
} }
return io;
} }
@ -79,10 +79,8 @@ bool Foam::IOporosityModelList::read()
porosityModelList::read(*this); porosityModelList::read(*this);
return true; return true;
} }
else
{
return false; return false;
}
} }

View File

@ -71,12 +71,11 @@ public:
// Constructors // Constructors
//- Construct from mesh //- Construct from mesh
IOporosityModelList(const fvMesh& mesh); explicit IOporosityModelList(const fvMesh& mesh);
//- Destructor //- Destructor
virtual ~IOporosityModelList() virtual ~IOporosityModelList() = default;
{}
// Member Functions // Member Functions

View File

@ -61,17 +61,6 @@ void Foam::porosityModel::adjustNegativeResistance(dimensionedVector& resist)
} }
Foam::label Foam::porosityModel::fieldIndex(const label i) const
{
label index = 0;
if (!coordSys_.R().uniform())
{
index = i;
}
return index;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::porosityModel::porosityModel Foam::porosityModel::porosityModel
@ -101,7 +90,10 @@ Foam::porosityModel::porosityModel
active_(true), active_(true),
zoneName_(cellZoneName), zoneName_(cellZoneName),
cellZoneIDs_(), cellZoneIDs_(),
coordSys_(*(coordinateSystem::New(mesh, coeffs_))) csysPtr_
(
coordinateSystem::New(mesh, coeffs_, coordinateSystem::typeName_())
)
{ {
if (zoneName_ == word::null) if (zoneName_ == word::null)
{ {
@ -123,45 +115,36 @@ Foam::porosityModel::porosityModel
<< exit(FatalError); << exit(FatalError);
} }
Info<< incrIndent << indent << coordSys_ << decrIndent << endl; Info<< incrIndent << indent << csys() << decrIndent << endl;
const pointField& points = mesh_.points(); const pointField& points = mesh_.points();
const cellList& cells = mesh_.cells(); const cellList& cells = mesh_.cells();
const faceList& faces = mesh_.faces(); const faceList& faces = mesh_.faces();
forAll(cellZoneIDs_, zoneI)
{
const cellZone& cZone = mesh_.cellZones()[cellZoneIDs_[zoneI]];
point bbMin = point::max;
point bbMax = point::min;
forAll(cZone, i) for (const label zonei : cellZoneIDs_)
{ {
const label cellI = cZone[i]; const cellZone& cZone = mesh_.cellZones()[zonei];
const cell& c = cells[cellI];
boundBox bb;
for (const label celli : cZone)
{
const cell& c = cells[celli];
const pointField cellPoints(c.points(faces, points)); const pointField cellPoints(c.points(faces, points));
forAll(cellPoints, pointI) for (const point& pt : cellPoints)
{ {
const point pt = coordSys_.localPosition(cellPoints[pointI]); bb.add(csys().localPosition(pt));
bbMin = min(bbMin, pt);
bbMax = max(bbMax, pt);
} }
} }
reduce(bbMin, minOp<point>()); bb.reduce();
reduce(bbMax, maxOp<point>());
Info<< " local bounds: " << (bbMax - bbMin) << nl << endl; Info<< " local bounds: " << bb.span() << nl << endl;
} }
} }
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::porosityModel::~porosityModel()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::porosityModel::transformModelData() void Foam::porosityModel::transformModelData()

View File

@ -91,13 +91,12 @@ protected:
//- Cell zone IDs //- Cell zone IDs
labelList cellZoneIDs_; labelList cellZoneIDs_;
//- Local co-ordinate system //- Local coordinate system
coordinateSystem coordSys_; autoPtr<coordinateSystem> csysPtr_;
// Protected Member Functions // Protected Member Functions
//- Transform the model data wrt mesh changes //- Transform the model data wrt mesh changes
virtual void calcTransformModelData() = 0; virtual void calcTransformModelData() = 0;
@ -128,8 +127,12 @@ protected:
volTensorField& AU volTensorField& AU
) const = 0; ) const = 0;
//- Local coordinate system
inline const coordinateSystem& csys() const;
//- Return label index //- Return label index
label fieldIndex(const label index) const; inline label fieldIndex(const label index) const;
public: public:
@ -209,7 +212,7 @@ public:
); );
//- Destructor //- Destructor
virtual ~porosityModel(); virtual ~porosityModel() = default;
// Member Functions // Member Functions

View File

@ -23,6 +23,22 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
inline const Foam::coordinateSystem& Foam::porosityModel::csys() const
{
return *csysPtr_;
}
inline Foam::label Foam::porosityModel::fieldIndex(const label i) const
{
return (csysPtr_->uniform() ? 0 : i);
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline const Foam::word& Foam::porosityModel::name() const inline const Foam::word& Foam::porosityModel::name() const
{ {
return name_; return name_;

View File

@ -38,33 +38,26 @@ Foam::porosityModelList::porosityModelList
mesh_(mesh) mesh_(mesh)
{ {
reset(dict); reset(dict);
active(true); active(true);
} }
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::porosityModelList::~porosityModelList()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::porosityModelList::active(const bool warn) const bool Foam::porosityModelList::active(const bool warn) const
{ {
bool a = false; bool anyOk = false;
forAll(*this, i) forAll(*this, i)
{ {
a = a || this->operator[](i).active(); anyOk = anyOk || this->operator[](i).active();
} }
if (warn && this->size() && !a) if (warn && this->size() && !anyOk)
{ {
Info<< "No porosity models active" << endl; Info<< "No porosity models active" << endl;
} }
return a; return anyOk;
} }

View File

@ -45,7 +45,7 @@ SourceFiles
namespace Foam namespace Foam
{ {
// Forward declaration of friend functions and operators // Forward declarations
class porosityModelList; class porosityModelList;
Ostream& operator<<(Ostream& os, const porosityModelList& models); Ostream& operator<<(Ostream& os, const porosityModelList& models);
@ -82,13 +82,13 @@ public:
porosityModelList(const fvMesh& mesh, const dictionary& dict); porosityModelList(const fvMesh& mesh, const dictionary& dict);
//- Destructor //- Destructor
~porosityModelList(); ~porosityModelList() = default;
// Member Functions // Member Functions
//- Return active status //- Return active status
bool active(const bool active = false) const; bool active(const bool warn = false) const;
//- Reset the source list //- Reset the source list
void reset(const dictionary& dict); void reset(const dictionary& dict);

View File

@ -35,7 +35,7 @@ Foam::autoPtr<Foam::porosityModel> Foam::porosityModel::New
const word& cellZoneName const word& cellZoneName
) )
{ {
const word modelType(dict.lookup("type")); const word modelType(dict.get<word>("type"));
Info<< "Porosity region " << name << ":" << nl Info<< "Porosity region " << name << ":" << nl
<< " selecting model: " << modelType << endl; << " selecting model: " << modelType << endl;
@ -46,7 +46,7 @@ Foam::autoPtr<Foam::porosityModel> Foam::porosityModel::New
{ {
FatalErrorInFunction FatalErrorInFunction
<< "Unknown " << typeName << " type " << modelType << nl << nl << "Unknown " << typeName << " type " << modelType << nl << nl
<< "Valid " << typeName << " types are:" << nl << "Valid types are:" << nl
<< meshConstructorTablePtr_->sortedToc() << meshConstructorTablePtr_->sortedToc()
<< exit(FatalError); << exit(FatalError);
} }

View File

@ -52,18 +52,12 @@ Foam::porosityModels::powerLaw::powerLaw
) )
: :
porosityModel(name, modelType, mesh, dict, cellZoneName), porosityModel(name, modelType, mesh, dict, cellZoneName),
C0_(readScalar(coeffs_.lookup("C0"))), C0_(coeffs_.get<scalar>("C0")),
C1_(readScalar(coeffs_.lookup("C1"))), C1_(coeffs_.get<scalar>("C1")),
rhoName_(coeffs_.lookupOrDefault<word>("rho", "rho")) rhoName_(coeffs_.lookupOrDefault<word>("rho", "rho"))
{} {}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::porosityModels::powerLaw::~powerLaw()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::porosityModels::powerLaw::calcTransformModelData() void Foam::porosityModels::powerLaw::calcTransformModelData()
@ -100,7 +94,7 @@ void Foam::porosityModels::powerLaw::correct
if (UEqn.dimensions() == dimForce) if (UEqn.dimensions() == dimForce)
{ {
const volScalarField& rho = mesh_.lookupObject<volScalarField> const auto& rho = mesh_.lookupObject<volScalarField>
( (
IOobject::groupName(rhoName_, U.group()) IOobject::groupName(rhoName_, U.group())
); );
@ -139,7 +133,7 @@ void Foam::porosityModels::powerLaw::correct
if (UEqn.dimensions() == dimForce) if (UEqn.dimensions() == dimForce)
{ {
const volScalarField& rho = mesh_.lookupObject<volScalarField> const auto& rho = mesh_.lookupObject<volScalarField>
( (
IOobject::groupName(rhoName_, U.group()) IOobject::groupName(rhoName_, U.group())
); );

View File

@ -119,7 +119,7 @@ public:
); );
//- Destructor //- Destructor
virtual ~powerLaw(); virtual ~powerLaw() = default;
// Member Functions // Member Functions

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -37,14 +37,12 @@ void Foam::porosityModels::powerLaw::apply
const scalar C0 = C0_; const scalar C0 = C0_;
const scalar C1m1b2 = (C1_ - 1.0)/2.0; const scalar C1m1b2 = (C1_ - 1.0)/2.0;
forAll(cellZoneIDs_, zoneI) for (const label zonei : cellZoneIDs_)
{ {
const labelList& cells = mesh_.cellZones()[cellZoneIDs_[zoneI]]; const labelList& cells = mesh_.cellZones()[zonei];
forAll(cells, i) for (const label celli : cells)
{ {
const label celli = cells[i];
Udiag[celli] += Udiag[celli] +=
V[celli]*rho[celli]*C0*pow(magSqr(U[celli]), C1m1b2); V[celli]*rho[celli]*C0*pow(magSqr(U[celli]), C1m1b2);
} }
@ -63,14 +61,12 @@ void Foam::porosityModels::powerLaw::apply
const scalar C0 = C0_; const scalar C0 = C0_;
const scalar C1m1b2 = (C1_ - 1.0)/2.0; const scalar C1m1b2 = (C1_ - 1.0)/2.0;
forAll(cellZoneIDs_, zoneI) for (const label zonei : cellZoneIDs_)
{ {
const labelList& cells = mesh_.cellZones()[cellZoneIDs_[zoneI]]; const labelList& cells = mesh_.cellZones()[zonei];
forAll(cells, i) for (const label celli : cells)
{ {
const label celli = cells[i];
AU[celli] = AU[celli] =
AU[celli] + I*(rho[celli]*C0*pow(magSqr(U[celli]), C1m1b2)); AU[celli] + I*(rho[celli]*C0*pow(magSqr(U[celli]), C1m1b2));
} }

View File

@ -99,7 +99,7 @@ void Foam::porosityModels::solidification::correct
if (UEqn.dimensions() == dimForce) if (UEqn.dimensions() == dimForce)
{ {
const volScalarField& rho = mesh_.lookupObject<volScalarField> const auto& rho = mesh_.lookupObject<volScalarField>
( (
IOobject::groupName(rhoName_, U.group()) IOobject::groupName(rhoName_, U.group())
); );
@ -138,7 +138,7 @@ void Foam::porosityModels::solidification::correct
if (UEqn.dimensions() == dimForce) if (UEqn.dimensions() == dimForce)
{ {
const volScalarField& rho = mesh_.lookupObject<volScalarField> const auto& rho = mesh_.lookupObject<volScalarField>
( (
IOobject::groupName(rhoName_, U.group()) IOobject::groupName(rhoName_, U.group())
); );

View File

@ -63,16 +63,11 @@ Description
// use the global coordinate system // use the global coordinate system
coordinateSystem coordinateSystem
{ {
type cartesian;
origin (0 0 0); origin (0 0 0);
coordinateRotation
{
type axesRotation;
e1 (1 0 0); e1 (1 0 0);
e2 (0 1 0); e2 (0 1 0);
} }
} }
}
\endverbatim \endverbatim
SourceFiles SourceFiles

View File

@ -38,18 +38,17 @@ void Foam::porosityModels::solidification::apply
const volVectorField& U const volVectorField& U
) const ) const
{ {
const volScalarField& T = mesh_.lookupObject<volScalarField> const auto& T = mesh_.lookupObject<volScalarField>
( (
IOobject::groupName(TName_, U.group()) IOobject::groupName(TName_, U.group())
); );
forAll(cellZoneIDs_, zoneI) for (const label zonei : cellZoneIDs_)
{ {
const labelList& cells = mesh_.cellZones()[cellZoneIDs_[zoneI]]; const labelList& cells = mesh_.cellZones()[zonei];
forAll(cells, i) for (const label celli : cells)
{ {
const label celli = cells[i];
Udiag[celli] += Udiag[celli] +=
V[celli]*alpha[celli]*rho[celli]*D_->value(T[celli]); V[celli]*alpha[celli]*rho[celli]*D_->value(T[celli]);
} }
@ -66,18 +65,17 @@ void Foam::porosityModels::solidification::apply
const volVectorField& U const volVectorField& U
) const ) const
{ {
const volScalarField& T = mesh_.lookupObject<volScalarField> const auto& T = mesh_.lookupObject<volScalarField>
( (
IOobject::groupName(TName_, U.group()) IOobject::groupName(TName_, U.group())
); );
forAll(cellZoneIDs_, zoneI) for (const label zonei : cellZoneIDs_)
{ {
const labelList& cells = mesh_.cellZones()[cellZoneIDs_[zoneI]]; const labelList& cells = mesh_.cellZones()[zonei];
forAll(cells, i) for (const label celli : cells)
{ {
const label celli = cells[i];
AU[celli] += AU[celli] +=
tensor::I*alpha[celli]*rho[celli]*D_->value(T[celli]); tensor::I*alpha[celli]*rho[celli]*D_->value(T[celli]);
} }
@ -100,7 +98,7 @@ void Foam::porosityModels::solidification::apply
} }
else else
{ {
const volScalarField& alpha = mesh_.lookupObject<volScalarField> const auto& alpha = mesh_.lookupObject<volScalarField>
( (
IOobject::groupName(alphaName_, U.group()) IOobject::groupName(alphaName_, U.group())
); );
@ -124,7 +122,7 @@ void Foam::porosityModels::solidification::apply
} }
else else
{ {
const volScalarField& alpha = mesh_.lookupObject<volScalarField> const auto& alpha = mesh_.lookupObject<volScalarField>
( (
IOobject::groupName(alphaName_, U.group()) IOobject::groupName(alphaName_, U.group())
); );

View File

@ -29,7 +29,7 @@ Group
Description Description
This boundary condition describes an inlet vector boundary condition in This boundary condition describes an inlet vector boundary condition in
cylindrical co-ordinates given a central axis, central point, rpm, axial cylindrical coordinates given a central axis, central point, rpm, axial
and radial velocity. and radial velocity.
Usage Usage

View File

@ -39,7 +39,7 @@ Description
\vartable \vartable
p_{hyd} | hyrostatic pressure [Pa] p_{hyd} | hyrostatic pressure [Pa]
p_{ref} | reference pressure [Pa] p_{ref} | reference pressure [Pa]
x_{ref} | reference point in Cartesian co-ordinates x_{ref} | reference point in Cartesian coordinates
\rho | density (assumed uniform) \rho | density (assumed uniform)
g | acceleration due to gravity [m/s2] g | acceleration due to gravity [m/s2]
\endtable \endtable

View File

@ -33,7 +33,7 @@ Description
Usage Usage
\table \table
Property | Description | Required | Default value Property | Description | Required | Default value
origin | origin of rotation in Cartesian co-ordinates | yes| origin | origin of rotation in Cartesian coordinates | yes|
axis | axis of rotation | yes | axis | axis of rotation | yes |
omega | angular velocty of the frame [rad/s] | yes | omega | angular velocty of the frame [rad/s] | yes |
\endtable \endtable

View File

@ -29,7 +29,7 @@ Group
Description Description
This boundary condition describes an inlet vector boundary condition in This boundary condition describes an inlet vector boundary condition in
swirl co-ordinates given a central axis, central point, axial, radial and swirl coordinates given a central axis, central point, axial, radial and
tangential velocity profiles. tangential velocity profiles.
Usage Usage

View File

@ -42,19 +42,18 @@ SourceFiles
#include "point.H" #include "point.H"
#include "tensor.H" #include "tensor.H"
#include "Random.H" #include "Random.H"
#include "coordinateSystem.H" #include "boundBox.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam namespace Foam
{ {
// Forward declaration of classes // Forward declarations
class eddy;
class Istream; class Istream;
class Ostream; class Ostream;
// Forward declaration of friend functions and operators
class eddy;
bool operator==(const eddy& a, const eddy& b); bool operator==(const eddy& a, const eddy& b);
bool operator!=(const eddy& a, const eddy& b); bool operator!=(const eddy& a, const eddy& b);
Istream& operator>>(Istream& is, eddy& e); Istream& operator>>(Istream& is, eddy& e);
@ -87,7 +86,7 @@ class eddy
//- Time-averaged intensity //- Time-averaged intensity
vector alpha_; vector alpha_;
//- Co-ordinate system transformation from local to global axes //- Coordinate system transformation from local to global axes
// X-direction aligned with max stress eigenvalue // X-direction aligned with max stress eigenvalue
tensor Rpg_; tensor Rpg_;
@ -161,7 +160,7 @@ public:
//- Return the time-averaged intensity //- Return the time-averaged intensity
inline const vector& alpha() const; inline const vector& alpha() const;
//- Return the co-ordinate system transformation from local //- Return the coordinate system transformation from local
// principal to global axes // principal to global axes
inline const tensor& Rpg() const; inline const tensor& Rpg() const;

View File

@ -39,7 +39,7 @@ Description
\vartable \vartable
p_{hyd} | hyrostatic pressure [Pa] p_{hyd} | hyrostatic pressure [Pa]
p_{ref} | reference pressure [Pa] p_{ref} | reference pressure [Pa]
x_{ref} | reference point in Cartesian co-ordinates x_{ref} | reference point in Cartesian coordinates
\rho | density (assumed uniform) \rho | density (assumed uniform)
g | acceleration due to gravity [m/s2] g | acceleration due to gravity [m/s2]
\endtable \endtable

View File

@ -89,7 +89,7 @@ public:
//- Debug switch //- Debug switch
static int debug; static int debug;
//- Tolerance used in calculating barycentric co-ordinates //- Tolerance used in calculating barycentric coordinates
// (applied to normalised values) // (applied to normalised values)
static scalar tol; static scalar tol;

View File

@ -107,7 +107,7 @@ public:
//- Debug switch //- Debug switch
static int debug; static int debug;
//- Tolerance used in calculating barycentric co-ordinates //- Tolerance used in calculating barycentric coordinates
// (applied to normalised values) // (applied to normalised values)
static scalar tol; static scalar tol;

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. \\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -56,23 +56,19 @@ fieldCoordinateSystemTransform
: :
fvMeshFunctionObject(name, runTime, dict), fvMeshFunctionObject(name, runTime, dict),
fieldSet_(mesh_), fieldSet_(mesh_),
coordSys_(mesh_, dict.subDict("coordinateSystem")) csysPtr_
(
coordinateSystem::New(mesh_, dict, coordinateSystem::typeName_())
)
{ {
read(dict); read(dict);
Info<< type() << " " << name << ":" << nl Info<< type() << " " << name << ":" << nl
<< " Applying transformation from global Cartesian to local " << " Applying transformation from global Cartesian to local "
<< coordSys_ << nl << endl; << *csysPtr_ << nl << endl;
} }
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::functionObjects::fieldCoordinateSystemTransform::
~fieldCoordinateSystemTransform()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::word Foam::word

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd. \\/ M anipulation | Copyright (C) 2015-2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -29,7 +29,7 @@ Group
Description Description
Transforms a user-specified selection of fields from global Cartesian Transforms a user-specified selection of fields from global Cartesian
co-ordinates to a local co-ordinate system. The fields are run-time coordinates to a local coordinate system. The fields are run-time
modifiable. modifiable.
Usage Usage
@ -50,9 +50,9 @@ Usage
coordinateSystem coordinateSystem
{ {
origin (0.001 0 0); origin (0.001 0 0);
coordinateRotation rotation
{ {
type axesRotation; type axes;
e1 (1 0.15 0); e1 (1 0.15 0);
e3 (0 0 -1); e3 (0 0 -1);
} }
@ -65,7 +65,7 @@ Usage
Property | Description | Required | Default value Property | Description | Required | Default value
type | type name: fieldCoordinateSystemTransform | yes | type | type name: fieldCoordinateSystemTransform | yes |
fields | list of fields to be transformed |yes | fields | list of fields to be transformed |yes |
coordinateSystem | local co-ordinate system | yes | coordinateSystem | local coordinate system | yes |
\endtable \endtable
See also See also
@ -107,8 +107,8 @@ protected:
//- Fields to transform //- Fields to transform
volFieldSelection fieldSet_; volFieldSelection fieldSet_;
//- Co-ordinate system to transform to //- Coordinate system to transform to
coordinateSystem coordSys_; autoPtr<coordinateSystem> csysPtr_;
// Protected Member Functions // Protected Member Functions
@ -143,7 +143,7 @@ public:
//- Destructor //- Destructor
virtual ~fieldCoordinateSystemTransform(); virtual ~fieldCoordinateSystemTransform() = default;
// Member Functions // Member Functions

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. \\/ M anipulation | Copyright (C) 2016-2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -41,7 +41,7 @@ void Foam::functionObjects::fieldCoordinateSystemTransform::transformField
store store
( (
transFieldName, transFieldName,
Foam::transform(dimensionedTensor(coordSys_.R().R()), field) Foam::transform(dimensionedTensor(csysPtr_->R()), field)
); );
} }
@ -61,7 +61,10 @@ void Foam::functionObjects::fieldCoordinateSystemTransform::transform
<< type() << ": Field " << fieldName << " already in database" << type() << ": Field " << fieldName << " already in database"
<< endl; << endl;
transformField<VolFieldType>(lookupObject<VolFieldType>(fieldName)); transformField<VolFieldType>
(
lookupObject<VolFieldType>(fieldName)
);
} }
else if (foundObject<SurfaceFieldType>(fieldName)) else if (foundObject<SurfaceFieldType>(fieldName))
{ {

View File

@ -41,14 +41,10 @@ functions
coordinateSystem coordinateSystem
{ {
origin (0 0 0); origin (0 0 0);
coordinateRotation
{
type axesRotation;
e1 (1 0.15 0); e1 (1 0.15 0);
e3 (0 0 -1); e3 (0 0 -1);
} }
} }
}
} }
// ************************************************************************* // // ************************************************************************* //

View File

@ -350,12 +350,19 @@ bool Foam::functionObjects::regionSizeDistribution::read(const dictionary& dict)
const word format(dict.get<word>("setFormat")); const word format(dict.get<word>("setFormat"));
formatterPtr_ = writer<scalar>::New(format); formatterPtr_ = writer<scalar>::New(format);
if (dict.found("coordinateSystem")) if (dict.found(coordinateSystem::typeName_()))
{ {
coordSysPtr_.reset(new coordinateSystem(obr_, dict)); csysPtr_.reset
(
coordinateSystem::New(obr_, dict, coordinateSystem::typeName_())
);
Info<< "Transforming all vectorFields with coordinate system " Info<< "Transforming all vectorFields with coordinate system "
<< coordSysPtr_().name() << endl; << csysPtr_->name() << endl;
}
else
{
csysPtr_.clear();
} }
if (isoPlanes_) if (isoPlanes_)
@ -897,14 +904,14 @@ bool Foam::functionObjects::regionSizeDistribution::write()
volVectorField volVectorField
>(fldName).primitiveField(); >(fldName).primitiveField();
if (coordSysPtr_.valid()) if (csysPtr_.valid())
{ {
Log << "Transforming vector field " << fldName Log << "Transforming vector field " << fldName
<< " with coordinate system " << " with coordinate system "
<< coordSysPtr_().name() << csysPtr_->name()
<< endl; << endl;
fld = coordSysPtr_().localVector(fld); fld = csysPtr_->localVector(fld);
} }

View File

@ -113,8 +113,8 @@ Usage
maxDiameter | maximum region equivalent diameter | yes | maxDiameter | maximum region equivalent diameter | yes |
minDiameter | minimum region equivalent diameter | no | 0 minDiameter | minimum region equivalent diameter | no | 0
setFormat | writing format | yes | setFormat | writing format | yes |
origin | origin of local co-ordinate system | yes | origin | origin of local coordinate system | yes |
coordinateRoation | orientation of local co-ordinate system | no coordinateRoation | orientation of local coordinate system | no
log | Log to standard output | no | yes log | Log to standard output | no | yes
isoPlanes | switch for isoPlanes | no | false isoPlanes | switch for isoPlanes | no | false
origin | origin of the plane when isoPlanes is used | no | none origin | origin of the plane when isoPlanes is used | no | none
@ -198,7 +198,7 @@ class regionSizeDistribution
autoPtr<writer<scalar>> formatterPtr_; autoPtr<writer<scalar>> formatterPtr_;
//- Optional coordinate system //- Optional coordinate system
autoPtr<coordinateSystem> coordSysPtr_; autoPtr<coordinateSystem> csysPtr_;
// Optional extra definition of bins on planes downstream to the origin // Optional extra definition of bins on planes downstream to the origin
// point and maximum diameter // point and maximum diameter

View File

@ -29,6 +29,7 @@ License
#include "turbulentTransportModel.H" #include "turbulentTransportModel.H"
#include "turbulentFluidThermoModel.H" #include "turbulentFluidThermoModel.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
#include "cartesianCS.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -37,7 +38,6 @@ namespace Foam
namespace functionObjects namespace functionObjects
{ {
defineTypeNameAndDebug(forces, 0); defineTypeNameAndDebug(forces, 0);
addToRunTimeSelectionTable(functionObject, forces, dictionary); addToRunTimeSelectionTable(functionObject, forces, dictionary);
} }
} }
@ -857,7 +857,23 @@ bool Foam::functionObjects::forces::read(const dictionary& dict)
// specified directly, from coordinate system, or implicitly (0 0 0) // specified directly, from coordinate system, or implicitly (0 0 0)
if (!dict.readIfPresent<point>("CofR", coordSys_.origin())) if (!dict.readIfPresent<point>("CofR", coordSys_.origin()))
{ {
coordSys_ = coordinateSystem(obr_, dict); // The 'coordinateSystem' sub-dictionary is optional,
// but enforce use of a cartesian system.
if (dict.found(coordinateSystem::typeName_()))
{
// New() for access to indirect (global) coordinate system
coordSys_ =
coordinateSystem::New
(
obr_, dict, coordinateSystem::typeName_()
);
}
else
{
coordSys_ = coordSystem::cartesian(dict);
}
localSystem_ = true; localSystem_ = true;
} }

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd. \\/ M anipulation | Copyright (C) 2015-2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -32,21 +32,21 @@ Description
skin-friction forces over a given list of patches, and the resistance skin-friction forces over a given list of patches, and the resistance
from porous zones. from porous zones.
Forces and moments are calculated, with optional co-ordinate system and Forces and moments are calculated, with optional coordinate system and
writing of binned data, where force and moment contributions are collected writing of binned data, where force and moment contributions are collected
into a user-defined number of bins that span the input geometries for a into a user-defined number of bins that span the input geometries for a
user-defined direction vector. user-defined direction vector.
Data is written into multiple files in the Data is written into multiple files in the
postProcessing/\<functionObjectName\> directory: postProcessing/\<functionObjectName\> directory:
- force.dat : forces in global Cartesian co-ordinate system - force.dat : forces in global Cartesian coordinate system
- moment.dat : moments in global Cartesian co-ordinate system - moment.dat : moments in global Cartesian coordinate system
- forceBin.dat : force bins in global Cartesian co-ordinate system - forceBin.dat : force bins in global Cartesian coordinate system
- momentBin.dat : moment bins in global Cartesian co-ordinate system - momentBin.dat : moment bins in global Cartesian coordinate system
- localForce.dat : forces in local co-ordinate system - localForce.dat : forces in local Cartesian coordinate system
- localMoment.dat : moments in local co-ordinate system - localMoment.dat : moments in local Cartesian coordinate system
- localForceBin.dat : force bins in local co-ordinate system - localForceBin.dat : force bins in local Cartesian coordinate system
- localMomentBin.dat : moment bins in local co-ordinate system - localMomentBin.dat : moment bins in local Cartesian coordinate system
Usage Usage
Example of function object specification: Example of function object specification:
@ -107,13 +107,19 @@ Note
CofR (0 0 0); CofR (0 0 0);
\endverbatim \endverbatim
or or
\verbatim
origin (0 0 0);
e1 (0 1 0);
e3 (0 0 1);
\endverbatim
or
\verbatim \verbatim
coordinateSystem coordinateSystem
{ {
origin (0 0 0); origin (0 0 0);
coordinateRotation rotation
{ {
type axesRotation; type axes;
e3 (0 0 1); e3 (0 0 1);
e1 (1 0 0); e1 (1 0 0);
} }
@ -136,7 +142,7 @@ SourceFiles
#include "fvMeshFunctionObject.H" #include "fvMeshFunctionObject.H"
#include "writeFile.H" #include "writeFile.H"
#include "coordinateSystem.H" #include "cartesianCS.H"
#include "volFieldsFwd.H" #include "volFieldsFwd.H"
#include "HashSet.H" #include "HashSet.H"
#include "Tuple2.H" #include "Tuple2.H"
@ -224,9 +230,9 @@ protected:
scalar pRef_; scalar pRef_;
//- Coordinate system used when evaluting forces/moments //- Coordinate system used when evaluting forces/moments
coordinateSystem coordSys_; coordSystem::cartesian coordSys_;
//- Flag to indicate whether we are using a local co-ordinate sys //- Flag to indicate whether we are using a local coordinates
bool localSystem_; bool localSystem_;
//- Flag to include porosity effects //- Flag to include porosity effects

View File

@ -44,17 +44,12 @@ Usage
coordinateSystem coordinateSystem
{ {
type cartesian;
origin (0 0 0); origin (0 0 0);
coordinateRotation
{
type axesRotation;
e1 (0.70710678 0.70710678 0); e1 (0.70710678 0.70710678 0);
e2 (0 0 1); e2 (0 0 1);
} }
} }
} }
}
\endverbatim \endverbatim
Note: Note:

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. \\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -53,16 +53,16 @@ const Foam::word Foam::fv::jouleHeatingSource::sigmaName(typeName + ":sigma");
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
const Foam::coordinateSystem& Foam::fv::jouleHeatingSource::coordSys() const const Foam::coordinateSystem& Foam::fv::jouleHeatingSource::csys() const
{ {
if (!coordSysPtr_.valid()) if (!csysPtr_ || !csysPtr_.valid())
{ {
FatalErrorInFunction FatalErrorInFunction
<< "Co-ordinate system invalid" << "Coordinate system invalid"
<< abort(FatalError); << abort(FatalError);
} }
return *coordSysPtr_; return *csysPtr_;
} }
@ -87,10 +87,18 @@ Foam::fv::jouleHeatingSource::transformSigma
dimensionedSymmTensor(sigmaLocal.dimensions(), Zero), dimensionedSymmTensor(sigmaLocal.dimensions(), Zero),
zeroGradientFvPatchField<symmTensor>::typeName zeroGradientFvPatchField<symmTensor>::typeName
); );
auto& sigma = tsigma.ref(); auto& sigma = tsigma.ref();
sigma.primitiveFieldRef() = coordSys().R().transformVector(sigmaLocal); if (csys().uniform())
{
sigma.primitiveFieldRef() =
csys().transformPrincipal(sigmaLocal);
}
else
{
sigma.primitiveFieldRef() =
csys().transformPrincipal(mesh_.cellCentres(), sigmaLocal);
}
sigma.correctBoundaryConditions(); sigma.correctBoundaryConditions();
@ -125,7 +133,7 @@ Foam::fv::jouleHeatingSource::jouleHeatingSource
anisotropicElectricalConductivity_(false), anisotropicElectricalConductivity_(false),
scalarSigmaVsTPtr_(nullptr), scalarSigmaVsTPtr_(nullptr),
vectorSigmaVsTPtr_(nullptr), vectorSigmaVsTPtr_(nullptr),
coordSysPtr_(nullptr), csysPtr_(nullptr),
curTimeIndex_(-1) curTimeIndex_(-1)
{ {
// Set the field name to that of the energy field from which the temperature // Set the field name to that of the energy field from which the temperature
@ -223,7 +231,14 @@ bool Foam::fv::jouleHeatingSource::read(const dictionary& dict)
Info<< " Using vector electrical conductivity" << endl; Info<< " Using vector electrical conductivity" << endl;
initialiseSigma(coeffs_, vectorSigmaVsTPtr_); initialiseSigma(coeffs_, vectorSigmaVsTPtr_);
coordSysPtr_ = coordinateSystem::New(mesh_, coeffs_);
csysPtr_ =
coordinateSystem::New
(
mesh_,
coeffs_,
coordinateSystem::typeName_()
);
} }
else else
{ {

View File

@ -91,16 +91,10 @@ Usage
coordinateSystem coordinateSystem
{ {
type cartesian;
origin (0 0 0); origin (0 0 0);
coordinateRotation
{
type axesRotation;
e1 (1 0 0); e1 (1 0 0);
e3 (0 0 1); e3 (0 0 1);
} }
}
// Optionally specify sigma as a function of temperature // Optionally specify sigma as a function of temperature
//sigma (31900 63800 127600); //sigma (31900 63800 127600);
@ -179,8 +173,8 @@ class jouleHeatingSource
//- Electrical conductivity as a vector function of temperature //- Electrical conductivity as a vector function of temperature
autoPtr<Function1<vector>> vectorSigmaVsTPtr_; autoPtr<Function1<vector>> vectorSigmaVsTPtr_;
//- Co-ordinate system - used for vectorial electrical conductivity //- Coordinate system - used for vectorial electrical conductivity
autoPtr<coordinateSystem> coordSysPtr_; autoPtr<coordinateSystem> csysPtr_;
//- Current time index (used for updating) //- Current time index (used for updating)
label curTimeIndex_; label curTimeIndex_;
@ -194,9 +188,8 @@ class jouleHeatingSource
//- No copy assignment //- No copy assignment
void operator=(const jouleHeatingSource&) = delete; void operator=(const jouleHeatingSource&) = delete;
//- Return the co-ordinate system for anisotropic electrical //- The coordinate system for anisotropic electrical conductivity
// conductivity const coordinateSystem& csys() const;
const coordinateSystem& coordSys() const;
//- Transform the anisotropic electrical conductivity into global system //- Transform the anisotropic electrical conductivity into global system
tmp<volSymmTensorField> transformSigma tmp<volSymmTensorField> transformSigma

View File

@ -91,7 +91,7 @@ void Foam::fv::rotorDiskSource::checkData()
case ifSurfaceNormal: case ifSurfaceNormal:
{ {
scalar UIn(coeffs_.get<scalar>("inletNormalVelocity")); scalar UIn(coeffs_.get<scalar>("inletNormalVelocity"));
inletVelocity_ = -coordSys_.R().e3()*UIn; inletVelocity_ = -coordSys_.e3()*UIn;
break; break;
} }
case ifLocal: case ifLocal:
@ -333,17 +333,6 @@ void Foam::fv::rotorDiskSource::createCoordinateSystem()
coeffs_.readEntry("refDirection", refDir); coeffs_.readEntry("refDirection", refDir);
cylindrical_.reset
(
new cylindrical
(
mesh_,
axis,
origin,
cells_
)
);
// Set the face areas and apply correction to calculated axis // Set the face areas and apply correction to calculated axis
// e.g. if cellZone is more than a single layer in thickness // e.g. if cellZone is more than a single layer in thickness
setFaceArea(axis, true); setFaceArea(axis, true);
@ -356,17 +345,6 @@ void Foam::fv::rotorDiskSource::createCoordinateSystem()
coeffs_.readEntry("axis", axis); coeffs_.readEntry("axis", axis);
coeffs_.readEntry("refDirection", refDir); coeffs_.readEntry("refDirection", refDir);
cylindrical_.reset
(
new cylindrical
(
mesh_,
axis,
origin,
cells_
)
);
setFaceArea(axis, false); setFaceArea(axis, false);
break; break;
@ -381,7 +359,7 @@ void Foam::fv::rotorDiskSource::createCoordinateSystem()
} }
} }
coordSys_ = cylindricalCS("rotorCS", origin, axis, refDir); coordSys_ = coordSystem::cylindrical(origin, axis, refDir);
const scalar sumArea = gSum(area_); const scalar sumArea = gSum(area_);
const scalar diameter = Foam::sqrt(4.0*sumArea/mathematical::pi); const scalar diameter = Foam::sqrt(4.0*sumArea/mathematical::pi);
@ -389,24 +367,25 @@ void Foam::fv::rotorDiskSource::createCoordinateSystem()
<< " - disk diameter = " << diameter << nl << " - disk diameter = " << diameter << nl
<< " - disk area = " << sumArea << nl << " - disk area = " << sumArea << nl
<< " - origin = " << coordSys_.origin() << nl << " - origin = " << coordSys_.origin() << nl
<< " - r-axis = " << coordSys_.R().e1() << nl << " - r-axis = " << coordSys_.e1() << nl
<< " - psi-axis = " << coordSys_.R().e2() << nl << " - psi-axis = " << coordSys_.e2() << nl
<< " - z-axis = " << coordSys_.R().e3() << endl; << " - z-axis = " << coordSys_.e3() << endl;
} }
void Foam::fv::rotorDiskSource::constructGeometry() void Foam::fv::rotorDiskSource::constructGeometry()
{ {
const vectorField& C = mesh_.C(); const pointUIndList cc(mesh_.C(), cells_);
// Optional: for later transform(), invTransform()
/// Rcyl_.reset(coordSys_.R(cc).ptr());
forAll(cells_, i) forAll(cells_, i)
{ {
if (area_[i] > ROOTVSMALL) if (area_[i] > ROOTVSMALL)
{ {
const label celli = cells_[i];
// Position in (planar) rotor coordinate system // Position in (planar) rotor coordinate system
x_[i] = coordSys_.localPosition(C[celli]); x_[i] = coordSys_.localPosition(cc[i]);
// Cache max radius // Cache max radius
rMax_ = max(rMax_, x_[i].x()); rMax_ = max(rMax_, x_[i].x());
@ -482,7 +461,6 @@ Foam::fv::rotorDiskSource::rotorDiskSource
Rcone_(cells_.size(), I), Rcone_(cells_.size(), I),
area_(cells_.size(), Zero), area_(cells_.size(), Zero),
coordSys_(), coordSys_(),
cylindrical_(),
rMax_(0.0), rMax_(0.0),
trim_(trimModel::New(*this, coeffs_)), trim_(trimModel::New(*this, coeffs_)),
blade_(coeffs_.subDict("blade")), blade_(coeffs_.subDict("blade")),

View File

@ -102,7 +102,6 @@ SourceFiles
#include "cellSetOption.H" #include "cellSetOption.H"
#include "cylindricalCS.H" #include "cylindricalCS.H"
#include "cylindrical.H"
#include "Enum.H" #include "Enum.H"
#include "bladeModel.H" #include "bladeModel.H"
#include "profileModelList.H" #include "profileModelList.H"
@ -184,7 +183,7 @@ protected:
flapData flap_; flapData flap_;
//- Cell centre positions in local rotor frame //- Cell centre positions in local rotor frame
// (Cylindrical r, theta, z) // (Cylindrical r-theta-z)
List<point> x_; List<point> x_;
//- Rotation tensor for flap angle //- Rotation tensor for flap angle
@ -194,10 +193,10 @@ protected:
List<scalar> area_; List<scalar> area_;
//- Rotor local cylindrical coordinate system (r-theta-z) //- Rotor local cylindrical coordinate system (r-theta-z)
cylindricalCS coordSys_; coordSystem::cylindrical coordSys_;
//- Rotor transformation coordinate system //- Cached rotation tensors for cylindrical coordinates
autoPtr<cylindrical> cylindrical_; autoPtr<tensorField> Rcyl_;
//- Maximum radius //- Maximum radius
scalar rMax_; scalar rMax_;
@ -273,11 +272,11 @@ public:
inline scalar omega() const; inline scalar omega() const;
//- Return the cell centre positions in local rotor frame //- Return the cell centre positions in local rotor frame
// (Cylindrical r, theta, z) // (Cylindrical r-theta-z)
inline const List<point>& x() const; inline const List<point>& x() const;
//- Return the rotor coordinate system (r-theta-z) //- Return the rotor coordinate system (r-theta-z)
inline const cylindricalCS& coordSys() const; inline const coordSystem::cylindrical& coordSys() const;
// Evaluation // Evaluation

View File

@ -27,25 +27,26 @@ License
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Foam::scalar Foam::fv::rotorDiskSource::rhoRef() const inline Foam::scalar Foam::fv::rotorDiskSource::rhoRef() const
{ {
return rhoRef_; return rhoRef_;
} }
Foam::scalar Foam::fv::rotorDiskSource::omega() const inline Foam::scalar Foam::fv::rotorDiskSource::omega() const
{ {
return omega_; return omega_;
} }
const Foam::List<Foam::point>& Foam::fv::rotorDiskSource::x() const inline const Foam::List<Foam::point>& Foam::fv::rotorDiskSource::x() const
{ {
return x_; return x_;
} }
const Foam::cylindricalCS& Foam::fv::rotorDiskSource::coordSys() const inline const Foam::coordSystem::cylindrical&
Foam::fv::rotorDiskSource::coordSys() const
{ {
return coordSys_; return coordSys_;
} }

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -26,7 +26,6 @@ License
#include "rotorDiskSource.H" #include "rotorDiskSource.H"
#include "volFields.H" #include "volFields.H"
#include "unitConversion.H" #include "unitConversion.H"
#include "transform.H"
using namespace Foam::constant; using namespace Foam::constant;
@ -51,6 +50,9 @@ void Foam::fv::rotorDiskSource::calculate
scalar AOAmin = GREAT; scalar AOAmin = GREAT;
scalar AOAmax = -GREAT; scalar AOAmax = -GREAT;
// Cached position-dependent rotations available?
const bool hasCache = Rcyl_.valid();
forAll(cells_, i) forAll(cells_, i)
{ {
if (area_[i] > ROOTVSMALL) if (area_[i] > ROOTVSMALL)
@ -59,8 +61,15 @@ void Foam::fv::rotorDiskSource::calculate
const scalar radius = x_[i].x(); const scalar radius = x_[i].x();
const tensor Rcyl =
(
hasCache
? (*Rcyl_)[i]
: coordSys_.R(mesh_.C()[celli])
);
// Transform velocity into local cylindrical reference frame // Transform velocity into local cylindrical reference frame
vector Uc = cylindrical_->invTransform(U[celli], i); vector Uc = invTransform(Rcyl, U[celli]);
// Transform velocity into local coning system // Transform velocity into local coning system
Uc = transform(Rcone_[i], Uc); Uc = transform(Rcone_[i], Uc);
@ -132,8 +141,8 @@ void Foam::fv::rotorDiskSource::calculate
// Transform force from local coning system into rotor cylindrical // Transform force from local coning system into rotor cylindrical
localForce = invTransform(Rcone_[i], localForce); localForce = invTransform(Rcone_[i], localForce);
// Transform force into global Cartesian co-ordinate system // Transform force into global Cartesian coordinate system
force[celli] = cylindrical_->transform(localForce, i); force[celli] = transform(Rcyl, localForce);
if (divideVolume) if (divideVolume)
{ {

View File

@ -57,9 +57,9 @@ Foam::vector Foam::targetCoeffTrim::calcCoeffs
const List<point>& x = rotor_.x(); const List<point>& x = rotor_.x();
const vector& origin = rotor_.coordSys().origin(); const vector& origin = rotor_.coordSys().origin();
const vector& rollAxis = rotor_.coordSys().R().e1(); const vector& rollAxis = rotor_.coordSys().e1();
const vector& pitchAxis = rotor_.coordSys().R().e2(); const vector& pitchAxis = rotor_.coordSys().e2();
const vector& yawAxis = rotor_.coordSys().R().e3(); const vector& yawAxis = rotor_.coordSys().e3();
scalar coeff1 = alpha_*sqr(rotor_.omega())*mathematical::pi; scalar coeff1 = alpha_*sqr(rotor_.omega())*mathematical::pi;

View File

@ -44,15 +44,11 @@ Description
coordinateSystem coordinateSystem
{ {
origin (0 0 0); origin (0 0 0);
coordinateRotation
{
type axesRotation;
e1 (0.70710678 0.70710678 0); e1 (0.70710678 0.70710678 0);
e2 (0 0 1); e2 (0 0 1);
} }
} }
} }
}
\endverbatim \endverbatim
Note Note

View File

@ -63,7 +63,7 @@ Foam::injectedParticle::injectedParticle
if (readFields) if (readFields)
{ {
// After the base particle class has read the fields from file and // After the base particle class has read the fields from file and
// constructed the necessary barycentric co-ordinates we can update the // constructed the necessary barycentric coordinates we can update the
// particle position on this mesh // particle position on this mesh
position_ = particle::position(); position_ = particle::position();

View File

@ -207,7 +207,7 @@ void Foam::ParticleCollector<CloudType>::initConcentricCircles()
faces_.setSize(nFace); faces_.setSize(nFace);
area_.setSize(nFace); area_.setSize(nFace);
coordSys_ = cylindricalCS("collector", origin, normal_[0], refDir); coordSys_ = coordSystem::cylindrical(origin, normal_[0], refDir);
List<label> ptIDs(identity(nPointPerRadius)); List<label> ptIDs(identity(nPointPerRadius));
@ -356,7 +356,7 @@ void Foam::ParticleCollector<CloudType>::collectParcelConcentricCircles
return; return;
} }
// Intersection point in cylindrical co-ordinate system // Intersection point in cylindrical coordinate system
const point pCyl = coordSys_.localPosition(p1 + (d1/(d1 - d2))*(p2 - p1)); const point pCyl = coordSys_.localPosition(p1 + (d1/(d1 - d2))*(p2 - p1));
scalar r = pCyl[0]; scalar r = pCyl[0];

View File

@ -160,8 +160,8 @@ private:
//- List of radii //- List of radii
List<scalar> radius_; List<scalar> radius_;
//- Cylindrical co-ordinate system //- Cylindrical coordinate system
cylindricalCS coordSys_; coordSystem::cylindrical coordSys_;
//- Face areas //- Face areas

View File

@ -42,7 +42,7 @@ Description
where: where:
\plaintable \plaintable
x, y, z | global cartesian co-ordinates [m] x, y, z | global cartesian coordinates [m]
u, v, w | global cartesian velocity components [m/s] u, v, w | global cartesian velocity components [m/s]
d | diameter [m] d | diameter [m]
rho | density [kg/m3] rho | density [kg/m3]

View File

@ -39,7 +39,7 @@ Description
); );
where: where:
x, y, z = global cartesian co-ordinates [m] x, y, z = global cartesian coordinates [m]
u, v, w = global cartesian velocity components [m/s] u, v, w = global cartesian velocity components [m/s]
d = diameter [m] d = diameter [m]
rho = density [kg/m3] rho = density [kg/m3]

View File

@ -39,7 +39,7 @@ Description
); );
where: where:
x, y, z = global cartesian co-ordinates [m] x, y, z = global cartesian coordinates [m]
u, v, w = global cartesian velocity components [m/s] u, v, w = global cartesian velocity components [m/s]
d = diameter [m] d = diameter [m]
rho = density [kg/m3] rho = density [kg/m3]

View File

@ -39,7 +39,7 @@ Description
); );
where: where:
x, y, z = global cartesian co-ordinates [m] x, y, z = global cartesian coordinates [m]
u, v, w = global cartesian velocity components [m/s] u, v, w = global cartesian velocity components [m/s]
d = diameter [m] d = diameter [m]
rho = density [kg/m3] rho = density [kg/m3]

View File

@ -26,7 +26,7 @@ License
#include "lumpedPointState.H" #include "lumpedPointState.H"
#include "OFstream.H" #include "OFstream.H"
#include "axesRotation.H" #include "axesRotation.H"
#include "coordinateSystem.H"
#include "foamVtkOutput.H" #include "foamVtkOutput.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -183,14 +183,17 @@ void Foam::lumpedPointState::writeVTP
} }
// Standard corners in local axis // Standard corners in local axis
const axesRotation cornerTransform(axis);
FixedList<point, 4> corners; FixedList<point, 4> corners;
{
coordinateRotations::axes orient(axis);
coordinateSystem cornerTransform(orient);
forAll(standardCorners, corni) forAll(standardCorners, corni)
{ {
corners[corni] = cornerTransform.transform(standardCorners[corni]); corners[corni] = cornerTransform.transform(standardCorners[corni]);
} }
}
// //
// Planes to visualize location/rotation // Planes to visualize location/rotation

View File

@ -41,7 +41,7 @@ namespace blockEdges
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
Foam::cylindricalCS Foam::blockEdges::arcEdge::calcAngle() Foam::coordSystem::cylindrical Foam::blockEdges::arcEdge::calcAngle()
{ {
const vector a = p2_ - p1_; const vector a = p2_ - p1_;
const vector b = p3_ - p1_; const vector b = p3_ - p1_;
@ -99,7 +99,7 @@ Foam::cylindricalCS Foam::blockEdges::arcEdge::calcAngle()
radius_ = mag(r3); radius_ = mag(r3);
// The corresponding local cylindrical coordinate system (radians) // The corresponding local cylindrical coordinate system (radians)
return cylindricalCS("arc", centre, arcAxis, r1); return coordSystem::cylindrical("arc", centre, arcAxis, r1);
} }

View File

@ -65,14 +65,14 @@ class arcEdge
scalar radius_; scalar radius_;
//- The local cylindrical coordinate system //- The local cylindrical coordinate system
cylindricalCS cs_; coordSystem::cylindrical cs_;
// Private Member Functions // Private Member Functions
//- Calculate the angle, radius and axis //- Calculate the angle, radius and axis
// \return the coordinate system // \return the cylindrical coordinate system
cylindricalCS calcAngle(); coordSystem::cylindrical calcAngle();
//- No copy construct //- No copy construct
arcEdge(const arcEdge&) = delete; arcEdge(const arcEdge&) = delete;

View File

@ -59,17 +59,20 @@ cellFeatures/cellFeatures.C
csys = coordinate/systems csys = coordinate/systems
$(csys)/coordinateSystem.C $(csys)/coordinateSystem.C
$(csys)/coordinateSystemNew.C $(csys)/coordinateSystemNew.C
$(csys)/coordinateSystemTransform.C
$(csys)/coordinateSystems.C $(csys)/coordinateSystems.C
$(csys)/cylindricalCS.C
$(csys)/cartesianCS.C $(csys)/cartesianCS.C
$(csys)/cylindricalCS.C
$(csys)/indirectCS.C
crot = coordinate/rotation crot = coordinate/rotation
$(crot)/axesRotation.C $(crot)/axesRotation.C
$(crot)/axisAngleRotation.C
$(crot)/coordinateRotation.C $(crot)/coordinateRotation.C
$(crot)/coordinateRotationNew.C $(crot)/cylindricalRotation.C
$(crot)/identityRotation.C
$(crot)/EulerCoordinateRotation.C $(crot)/EulerCoordinateRotation.C
$(crot)/STARCDCoordinateRotation.C $(crot)/STARCDCoordinateRotation.C
$(crot)/cylindrical.C
polyMeshZipUpCells/polyMeshZipUpCells.C polyMeshZipUpCells/polyMeshZipUpCells.C
primitiveMeshGeometry/primitiveMeshGeometry.C primitiveMeshGeometry/primitiveMeshGeometry.C

View File

@ -31,24 +31,34 @@ License
namespace Foam namespace Foam
{ {
defineTypeNameAndDebug(EulerCoordinateRotation, 0); namespace coordinateRotations
addToRunTimeSelectionTable {
defineTypeName(euler);
// Standard short name
addNamedToRunTimeSelectionTable
( (
coordinateRotation, coordinateRotation,
EulerCoordinateRotation, euler,
dictionary dictionary,
euler
); );
addToRunTimeSelectionTable
// Longer name - Compat 1806
addNamedToRunTimeSelectionTable
( (
coordinateRotation, coordinateRotation,
EulerCoordinateRotation, euler,
objectRegistry dictionary,
EulerRotation
); );
}
} }
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
Foam::tensor Foam::EulerCoordinateRotation::rotation Foam::tensor Foam::coordinateRotations::euler::rotation
( (
const vector& angles, const vector& angles,
bool degrees bool degrees
@ -84,174 +94,96 @@ Foam::tensor Foam::EulerCoordinateRotation::rotation
} }
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
Foam::vector Foam::EulerCoordinateRotation::transform(const vector& st) const
{
return (R_ & st);
}
Foam::vector Foam::EulerCoordinateRotation::invTransform
(
const vector& st
) const
{
return (Rtr_ & st);
}
Foam::tmp<Foam::vectorField> Foam::EulerCoordinateRotation::transform
(
const vectorField& st
) const
{
NotImplemented;
return nullptr;
}
Foam::tmp<Foam::vectorField> Foam::EulerCoordinateRotation::invTransform
(
const vectorField& st
) const
{
NotImplemented;
return nullptr;
}
const Foam::tensorField& Foam::EulerCoordinateRotation::Tr() const
{
NotImplemented;
return NullObjectRef<tensorField>();
}
Foam::tmp<Foam::tensorField> Foam::EulerCoordinateRotation::transformTensor
(
const tensorField& st
) const
{
NotImplemented;
return nullptr;
}
Foam::tensor Foam::EulerCoordinateRotation::transformTensor
(
const tensor& st
) const
{
return (R_ & st & Rtr_);
}
Foam::tmp<Foam::tensorField> Foam::EulerCoordinateRotation::transformTensor
(
const tensorField& st,
const labelList& cellMap
) const
{
NotImplemented;
return nullptr;
}
Foam::tmp<Foam::symmTensorField> Foam::EulerCoordinateRotation::
transformVector
(
const vectorField& st
) const
{
tmp<symmTensorField> tfld(new symmTensorField(st.size()));
symmTensorField& fld = tfld.ref();
forAll(fld, i)
{
fld[i] = transformPrincipal(R_, st[i]);
}
return tfld;
}
Foam::symmTensor Foam::EulerCoordinateRotation::transformVector
(
const vector& st
) const
{
return transformPrincipal(R_, st);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::EulerCoordinateRotation::EulerCoordinateRotation() Foam::coordinateRotations::euler::euler()
: :
R_(sphericalTensor::I), coordinateRotation(),
Rtr_(sphericalTensor::I) angles_(Zero),
degrees_(true)
{} {}
Foam::EulerCoordinateRotation::EulerCoordinateRotation Foam::coordinateRotations::euler::euler(const euler& crot)
(
const EulerCoordinateRotation& r
)
: :
R_(r.R_), coordinateRotation(crot),
Rtr_(r.Rtr_) angles_(crot.angles_),
degrees_(crot.degrees_)
{} {}
Foam::EulerCoordinateRotation::EulerCoordinateRotation Foam::coordinateRotations::euler::euler
( (
const vector& phiThetaPsi, const vector& phiThetaPsi,
const bool degrees bool degrees
) )
: :
R_(rotation(phiThetaPsi, degrees)), coordinateRotation(),
Rtr_(R_.T()) angles_(phiThetaPsi),
degrees_(degrees)
{} {}
Foam::EulerCoordinateRotation::EulerCoordinateRotation Foam::coordinateRotations::euler::euler
( (
const scalar phi, scalar phi,
const scalar theta, scalar theta,
const scalar psi, scalar psi,
const bool degrees bool degrees
) )
: :
R_(rotation(vector(phi, theta, psi), degrees)), coordinateRotation(),
Rtr_(R_.T()) angles_(phi, theta, psi),
degrees_(degrees)
{} {}
Foam::EulerCoordinateRotation::EulerCoordinateRotation Foam::coordinateRotations::euler::euler(const dictionary& dict)
:
coordinateRotation(),
angles_(dict.getCompat<vector>("angles", {{"rotation", 1806}})),
degrees_(dict.lookupOrDefault("degrees", true))
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::coordinateRotations::euler::clear()
{
angles_ = Zero;
degrees_ = true;
}
Foam::tensor Foam::coordinateRotations::euler::R() const
{
return euler::rotation(angles_, degrees_);
}
void Foam::coordinateRotations::euler::write(Ostream& os) const
{
os << "euler-angles(" << (degrees_ ? "deg" : "rad") << "): " << angles_;
}
void Foam::coordinateRotations::euler::writeEntry
( (
const dictionary& dict const word& keyword,
) Ostream& os
: ) const
R_ {
( os.beginBlock(keyword);
rotation
(
dict.get<vector>("rotation"),
dict.lookupOrDefault("degrees", true)
)
),
Rtr_(R_.T())
{}
os.writeEntry("type", type());
os.writeEntry("angles", angles_);
if (!degrees_)
{
os.writeEntry("degrees", "false");
}
Foam::EulerCoordinateRotation::EulerCoordinateRotation os.endBlock();
( }
const dictionary& dict,
const objectRegistry&
)
:
EulerCoordinateRotation(dict)
{}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. \\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -22,7 +22,7 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class Class
Foam::EulerCoordinateRotation Foam::coordinateRotations::euler
Description Description
A coordinateRotation defined in the z-x-z (intrinsic) Euler convention. A coordinateRotation defined in the z-x-z (intrinsic) Euler convention.
@ -34,24 +34,29 @@ Description
For reference and illustration, see For reference and illustration, see
https://en.wikipedia.org/wiki/Euler_angles https://en.wikipedia.org/wiki/Euler_angles
The rotation angles are in degrees, unless otherwise explicitly specified:
\verbatim \verbatim
coordinateRotation coordinateRotation
{ {
type EulerRotation; type euler;
degrees false; angles (0 0 180);
rotation (0 0 3.141592654);
} }
\endverbatim \endverbatim
\heading Dictionary entries
\table
Property | Description | Required | Default
type | Type name: euler (or EulerRotation) | yes |
angles | The z-x-z rotation angles | yes |
degrees | Angles are in degrees | no | true
\endtable
SourceFiles SourceFiles
EulerCoordinateRotation.C EulerCoordinateRotation.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef EulerCoordinateRotation_H #ifndef coordinateRotations_euler_H
#define EulerCoordinateRotation_H #define coordinateRotations_euler_H
#include "coordinateRotation.H" #include "coordinateRotation.H"
@ -59,73 +64,62 @@ SourceFiles
namespace Foam namespace Foam
{ {
namespace coordinateRotations
{
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class EulerCoordinateRotation Declaration Class coordinateRotations::euler Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class EulerCoordinateRotation class euler
: :
public coordinateRotation public coordinateRotation
{ {
// Private Member Data // Private Data
//- Local-to-global transformation tensor //- The rotation angles
tensor R_; vector angles_;
//- Global-to-Local transformation tensor //- Angles measured in degrees
tensor Rtr_; bool degrees_;
public: public:
//- Runtime type information //- Runtime type information
TypeName("EulerRotation"); TypeNameNoDebug("euler");
// Constructors // Constructors
//- Construct null //- Construct null - an identity transform
EulerCoordinateRotation(); euler();
//- Construct as copy //- Copy construct
EulerCoordinateRotation(const EulerCoordinateRotation& r); euler(const euler& crot);
//- Construct from rotation vector //- Construct from Euler rotation angles (z-x-z)
EulerCoordinateRotation euler(const vector& phiThetaPsi, bool degrees);
(
const vector& phiThetaPsi,
const bool degrees
);
//- Construct from components of rotation vector //- Construct from Euler rotation angles (z-x-z)
EulerCoordinateRotation euler(scalar phi, scalar theta, scalar psi, bool degrees);
(
const scalar phi,
const scalar theta,
const scalar psi,
const bool degrees
);
//- Construct from dictionary //- Construct from dictionary
explicit EulerCoordinateRotation(const dictionary& dict); explicit euler(const dictionary& dict);
//- Construct from dictionary and a registry (typically a mesh)
EulerCoordinateRotation
(
const dictionary& dict,
const objectRegistry& unused
);
//- Return clone //- Return clone
autoPtr<coordinateRotation> clone() const autoPtr<coordinateRotation> clone() const
{ {
return return
autoPtr<coordinateRotation>::NewFrom autoPtr<coordinateRotation>::NewFrom
<EulerCoordinateRotation>(*this); <coordinateRotations::euler>(*this);
} }
//- Destructor
virtual ~euler() = default;
// Static Member Functions // Static Member Functions
//- The rotation tensor calculated for the specified Euler angles //- The rotation tensor calculated for the specified Euler angles
@ -135,91 +129,29 @@ public:
// Member Functions // Member Functions
//- Reset rotation to an identity rotation //- Reset specification
virtual void clear() virtual void clear();
{
R_ = sphericalTensor::I;
Rtr_ = sphericalTensor::I;
}
//- Update the rotation for a list of cells //- The rotation tensor calculated for the specified Euler angles.
virtual void updateCells(const polyMesh&, const labelList&) virtual tensor R() const;
{}
//- Return local-to-global transformation tensor //- Write information
virtual const tensor& R() const virtual void write(Ostream& os) const;
{
return R_;
}
//- Return global-to-local transformation tensor //- Write dictionary entry
virtual const tensor& Rtr() const virtual void writeEntry(const word& keyword, Ostream& os) const;
{
return Rtr_;
};
//- Return local Cartesian x-axis in global coordinates
virtual const vector e1() const
{
return Rtr_.x();
}
//- Return local Cartesian y-axis in global coordinates
virtual const vector e2() const
{
return Rtr_.y();
}
//- Return local Cartesian z-axis in global coordinates
virtual const vector e3() const
{
return Rtr_.z();
}
//- Return transformation tensor field
virtual const tensorField& Tr() const;
//- Transform vectorField using transformation tensor field
virtual tmp<vectorField> transform(const vectorField& st) const;
//- Transform vector using transformation tensor
virtual vector transform(const vector& st) const;
//- Inverse transform vectorField using transformation tensor field
virtual tmp<vectorField> invTransform(const vectorField& st) const;
//- Inverse transform vector using transformation tensor
virtual vector invTransform(const vector& st) const;
//- Transform tensor field using transformation tensorField
virtual tmp<tensorField> transformTensor(const tensorField& st) const;
//- Transform tensor using transformation tensorField
virtual tensor transformTensor(const tensor& st) const;
//- Transform tensor sub-field using transformation tensorField
virtual tmp<tensorField> transformTensor
(
const tensorField& st,
const labelList& cellMap
) const;
//- Transform vectorField using transformation tensorField and return
// symmetrical tensorField
virtual tmp<symmTensorField> transformVector
(
const vectorField& st
) const;
//- Transform vector using transformation tensor and return
// symmetrical tensor
virtual symmTensor transformVector(const vector& st) const;
}; };
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace coordinateRotations
//- Compatibility typedef 1806
typedef coordinateRotations::euler EulerCoordinateRotation;
} // End namespace Foam } // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -31,128 +31,37 @@ License
namespace Foam namespace Foam
{ {
defineTypeNameAndDebug(STARCDCoordinateRotation, 0); namespace coordinateRotations
addToRunTimeSelectionTable
(
coordinateRotation,
STARCDCoordinateRotation,
dictionary
);
addToRunTimeSelectionTable
(
coordinateRotation,
STARCDCoordinateRotation,
objectRegistry
);
}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
Foam::vector Foam::STARCDCoordinateRotation::transform(const vector& st) const
{
return (R_ & st);
}
Foam::vector Foam::STARCDCoordinateRotation::invTransform
(
const vector& st
) const
{
return (Rtr_ & st);
}
Foam::tmp<Foam::vectorField> Foam::STARCDCoordinateRotation::transform
(
const vectorField& st
) const
{
NotImplemented;
return nullptr;
}
Foam::tmp<Foam::vectorField> Foam::STARCDCoordinateRotation::invTransform
(
const vectorField& st
) const
{
NotImplemented;
return nullptr;
}
const Foam::tensorField& Foam::STARCDCoordinateRotation::Tr() const
{
NotImplemented;
return NullObjectRef<tensorField>();
}
Foam::tmp<Foam::tensorField> Foam::STARCDCoordinateRotation::transformTensor
(
const tensorField& st
) const
{
NotImplemented;
return nullptr;
}
Foam::tensor Foam::STARCDCoordinateRotation::transformTensor
(
const tensor& st
) const
{
return (R_ & st & Rtr_);
}
Foam::tmp<Foam::tensorField> Foam::STARCDCoordinateRotation::transformTensor
(
const tensorField& st,
const labelList& cellMap
) const
{
NotImplemented;
return nullptr;
}
Foam::tmp<Foam::symmTensorField> Foam::STARCDCoordinateRotation::
transformVector
(
const vectorField& st
) const
{
tmp<symmTensorField> tfld(new symmTensorField(st.size()));
symmTensorField& fld = tfld.ref();
forAll(fld, i)
{ {
fld[i] = transformPrincipal(R_, st[i]); defineTypeName(starcd);
// Standard short name
addNamedToRunTimeSelectionTable
(
coordinateRotation,
starcd,
dictionary,
starcd
);
// Longer name - Compat 1806
addNamedToRunTimeSelectionTable
(
coordinateRotation,
starcd,
dictionary,
STARCDRotation
);
} }
return tfld;
}
Foam::symmTensor Foam::STARCDCoordinateRotation::transformVector
(
const vector& st
) const
{
return transformPrincipal(R_, st);
} }
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
Foam::tensor Foam::STARCDCoordinateRotation::rotation Foam::tensor Foam::coordinateRotations::starcd::rotation
( (
const vector& angles, const vector& angles,
const bool degrees bool degrees
) )
{ {
scalar z = angles.component(vector::X); // 1. Rotate about Z scalar z = angles.component(vector::X); // 1. Rotate about Z
@ -170,7 +79,6 @@ Foam::tensor Foam::STARCDCoordinateRotation::rotation
const scalar cy = cos(y); const scalar sy = sin(y); const scalar cy = cos(y); const scalar sy = sin(y);
const scalar cz = cos(z); const scalar sz = sin(z); const scalar cz = cos(z); const scalar sz = sin(z);
return return
tensor tensor
( (
@ -183,72 +91,94 @@ Foam::tensor Foam::STARCDCoordinateRotation::rotation
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::STARCDCoordinateRotation::STARCDCoordinateRotation() Foam::coordinateRotations::starcd::starcd()
: :
R_(sphericalTensor::I), coordinateRotation(),
Rtr_(sphericalTensor::I) angles_(Zero),
degrees_(true)
{} {}
Foam::STARCDCoordinateRotation::STARCDCoordinateRotation Foam::coordinateRotations::starcd::starcd(const starcd& crot)
(
const STARCDCoordinateRotation& r
)
: :
R_(r.R_), coordinateRotation(crot),
Rtr_(r.Rtr_) angles_(crot.angles_),
degrees_(crot.degrees_)
{} {}
Foam::STARCDCoordinateRotation::STARCDCoordinateRotation Foam::coordinateRotations::starcd::starcd
( (
const vector& rotZrotXrotY, const vector& rotZrotXrotY,
const bool degrees bool degrees
) )
: :
R_(rotation(rotZrotXrotY, degrees)), coordinateRotation(),
Rtr_(R_.T()) angles_(rotZrotXrotY),
degrees_(degrees)
{} {}
Foam::STARCDCoordinateRotation::STARCDCoordinateRotation Foam::coordinateRotations::starcd::starcd
( (
const scalar rotZ, scalar rotZ,
const scalar rotX, scalar rotX,
const scalar rotY, scalar rotY,
const bool degrees bool degrees
) )
: :
R_(rotation(vector(rotZ, rotX, rotY), degrees)), coordinateRotation(),
Rtr_(R_.T()) angles_(rotZ, rotX, rotY),
degrees_(degrees)
{} {}
Foam::STARCDCoordinateRotation::STARCDCoordinateRotation Foam::coordinateRotations::starcd::starcd(const dictionary& dict)
:
coordinateRotation(),
angles_(dict.getCompat<vector>("angles", {{"rotation", 1806}})),
degrees_(dict.lookupOrDefault("degrees", true))
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::coordinateRotations::starcd::clear()
{
angles_ = Zero;
degrees_ = true;
}
Foam::tensor Foam::coordinateRotations::starcd::R() const
{
return starcd::rotation(angles_, degrees_);
}
void Foam::coordinateRotations::starcd::write(Ostream& os) const
{
os << "starcd-angles(" << (degrees_ ? "deg" : "rad") << "): " << angles_;
}
void Foam::coordinateRotations::starcd::writeEntry
( (
const dictionary& dict const word& keyword,
) Ostream& os
: ) const
R_ {
( os.beginBlock(keyword);
rotation
(
dict.get<vector>("rotation"),
dict.lookupOrDefault("degrees", true)
)
),
Rtr_(R_.T())
{}
os.writeEntry("type", type());
os.writeEntry("angles", angles_);
if (!degrees_)
{
os.writeEntry("degrees", "false");
}
Foam::STARCDCoordinateRotation::STARCDCoordinateRotation os.endBlock();
( }
const dictionary& dict,
const objectRegistry&
)
:
STARCDCoordinateRotation(dict)
{}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -22,7 +22,7 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class Class
Foam::STARCDCoordinateRotation Foam::coordinateRotations::starcd
Description Description
A coordinateRotation defined by the STAR-CD convention. A coordinateRotation defined by the STAR-CD convention.
@ -36,19 +36,26 @@ Description
\verbatim \verbatim
coordinateRotation coordinateRotation
{ {
type STARCDRotation; type starcd;
degrees false; angles (0 0 180);
rotation (0 0 3.141592654);
} }
\endverbatim \endverbatim
\heading Dictionary entries
\table
Property | Description | Required | Default
type | Type name: starcd (or STARCDRotation) | yes |
angles | The z-x-y rotation angles | yes |
degrees | Angles are in degrees | no | true
\endtable
SourceFiles SourceFiles
STARCDCoordinateRotation.C STARCDCoordinateRotation.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef STARCDCoordinateRotation_H #ifndef coordinateRotations_starcd_H
#define STARCDCoordinateRotation_H #define coordinateRotations_starcd_H
#include "coordinateRotation.H" #include "coordinateRotation.H"
@ -56,74 +63,62 @@ SourceFiles
namespace Foam namespace Foam
{ {
namespace coordinateRotations
{
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class STARCDCoordinateRotation Declaration Class coordinateRotations::starcd Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class STARCDCoordinateRotation class starcd
: :
public coordinateRotation public coordinateRotation
{ {
// Private Member Data // Private Data
//- Local-to-Global transformation tensor //- The rotation angles
tensor R_; vector angles_;
//- Global-to-Local transformation tensor //- Angles measured in degrees
tensor Rtr_; bool degrees_;
public: public:
//- Runtime type information //- Runtime type information
TypeName("STARCDRotation"); TypeNameNoDebug("starcd");
// Constructors // Constructors
//- Construct null //- Construct null - an identity transform
STARCDCoordinateRotation(); starcd();
//- Construct as copy //- Copy construct
STARCDCoordinateRotation(const STARCDCoordinateRotation& r); starcd(const starcd& crot);
//- Construct from rotation vector //- Construct from rotation vector
STARCDCoordinateRotation starcd(const vector& rotZrotXrotY, bool degrees);
(
const vector& rotZrotXrotY,
const bool degrees
);
//- Construct from components of rotation vector //- Construct from components of rotation vector
STARCDCoordinateRotation starcd(scalar rotZ, scalar rotX, scalar rotY, bool degrees);
(
const scalar rotZ,
const scalar rotX,
const scalar rotY,
const bool degrees
);
//- Construct from dictionary //- Construct from dictionary
explicit STARCDCoordinateRotation(const dictionary& dict); explicit starcd(const dictionary& dict);
//- Construct from dictionary and a registry (typically a mesh)
STARCDCoordinateRotation
(
const dictionary& dict,
const objectRegistry& unused
);
//- Return clone //- Return clone
autoPtr<coordinateRotation> clone() const autoPtr<coordinateRotation> clone() const
{ {
return return
autoPtr<coordinateRotation>::NewFrom autoPtr<coordinateRotation>::NewFrom
<STARCDCoordinateRotation>(*this); <coordinateRotations::starcd>(*this);
} }
//- Destructor
virtual ~starcd() = default;
// Static Member Functions // Static Member Functions
//- The rotation tensor calculated for the specified STARCD angles //- The rotation tensor calculated for the specified STARCD angles
@ -133,91 +128,29 @@ public:
// Member Functions // Member Functions
//- Reset rotation to an identity rotation //- Reset specification
virtual void clear() virtual void clear();
{
R_ = sphericalTensor::I;
Rtr_ = sphericalTensor::I;
}
//- Update the rotation for a list of cells //- The rotation tensor calculated for the specified STARCD angles.
virtual void updateCells(const polyMesh&, const labelList&) virtual tensor R() const;
{}
//- Return local-to-global transformation tensor //- Write information
virtual const tensor& R() const virtual void write(Ostream& os) const;
{
return R_;
}
//- Return global-to-local transformation tensor //- Write dictionary entry
virtual const tensor& Rtr() const virtual void writeEntry(const word& keyword, Ostream& os) const;
{
return Rtr_;
};
//- Return local Cartesian x-axis in global coordinates
virtual const vector e1() const
{
return Rtr_.x();
}
//- Return local Cartesian y-axis in global coordinates
virtual const vector e2() const
{
return Rtr_.y();
}
//- Return local Cartesian z-axis in global coordinates
virtual const vector e3() const
{
return Rtr_.z();
}
//- Return transformation tensor field
virtual const tensorField& Tr() const;
//- Transform vectorField using transformation tensor field
virtual tmp<vectorField> transform(const vectorField& st) const;
//- Transform vector using transformation tensor
virtual vector transform(const vector& st) const;
//- Inverse transform vectorField using transformation tensor field
virtual tmp<vectorField> invTransform(const vectorField& st) const;
//- Inverse transform vector using transformation tensor
virtual vector invTransform(const vector& st) const;
//- Transform tensor field using transformation tensorField
virtual tmp<tensorField> transformTensor(const tensorField& st) const;
//- Transform tensor using transformation tensorField
virtual tensor transformTensor(const tensor& st) const;
//- Transform tensor sub-field using transformation tensorField
virtual tmp<tensorField> transformTensor
(
const tensorField& st,
const labelList& cellMap
) const;
//- Transform vectorField using transformation tensorField and return
// symmetrical tensorField
virtual tmp<symmTensorField> transformVector
(
const vectorField& st
) const;
//- Transform vector using transformation tensor and return
// symmetrical tensor
virtual symmTensor transformVector(const vector& st) const;
}; };
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace coordinateRotations
//- Compatibility typedef 1806
typedef coordinateRotations::starcd STARCDCoordinateRotation;
} // End namespace Foam } // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -31,25 +31,34 @@ License
namespace Foam namespace Foam
{ {
defineTypeNameAndDebug(axesRotation, 0); namespace coordinateRotations
addToRunTimeSelectionTable {
defineTypeName(axes);
// Standard short name
addNamedToRunTimeSelectionTable
( (
coordinateRotation, coordinateRotation,
axesRotation, axes,
dictionary dictionary,
axes
); );
addToRunTimeSelectionTable
// Longer name - Compat 1806
addNamedToRunTimeSelectionTable
( (
coordinateRotation, coordinateRotation,
axesRotation, axes,
objectRegistry dictionary,
axesRotation
); );
}
} }
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
Foam::tensor Foam::axesRotation::rotation Foam::tensor Foam::coordinateRotations::axes::rotation
( (
const vector& axis1, const vector& axis1,
const vector& axis2, const vector& axis2,
@ -143,221 +152,193 @@ Foam::tensor Foam::axesRotation::rotation
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
void Foam::axesRotation::read(const dictionary& dict) void Foam::coordinateRotations::axes::read(const dictionary& dict)
{ {
vector axis1, axis2;
axisOrder order = E3_E1;
if if
( (
dict.readIfPresent("e1", axis1) dict.readIfPresent("e1", axis1_)
&& dict.readIfPresent("e2", axis2) && dict.readIfPresent("e2", axis2_)
) )
{ {
order = E1_E2; order_ = E1_E2;
} }
else if else if
( (
dict.readIfPresent("e2", axis1) dict.readIfPresent("e2", axis1_)
&& dict.readIfPresent("e3", axis2) && dict.readIfPresent("e3", axis2_)
) )
{ {
order = E2_E3; order_ = E2_E3;
} }
else if else if
( (
dict.readIfPresent("e3", axis1) dict.readIfPresent("e3", axis1_)
&& dict.readIfPresent("e1", axis2) && dict.readIfPresent("e1", axis2_)
) )
{ {
order = E3_E1; order_ = E3_E1;
} }
else if else if
( (
dict.readIfPresent("axis", axis1) dict.readIfPresent("axis", axis1_)
&& dict.readIfPresent("direction", axis2) && dict.readIfPresent("direction", axis2_)
) )
{ {
order = E3_E1_COMPAT; order_ = E3_E1_COMPAT;
} }
else else
{ {
FatalErrorInFunction FatalIOErrorInFunction(dict)
<< "No entries of the type (e1, e2) or (e2, e3) or (e3, e1) found" << "No entries of the type (e1, e2) or (e2, e3) or (e3, e1) found"
<< exit(FatalError); << exit(FatalIOError);
} }
R_ = rotation(axis1, axis2, order);
Rtr_ = R_.T();
} }
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::axesRotation::axesRotation() Foam::coordinateRotations::axes::axes()
: :
R_(sphericalTensor::I), coordinateRotation(),
Rtr_(sphericalTensor::I) axis1_(0,0,1), // e3 = global Z
axis2_(1,0,0), // e1 = global X
order_(E3_E1)
{} {}
Foam::axesRotation::axesRotation(const axesRotation& r) Foam::coordinateRotations::axes::axes(const axes& crot)
: :
R_(r.R_), coordinateRotation(crot),
Rtr_(r.Rtr_) axis1_(crot.axis1_),
axis2_(crot.axis2_),
order_(crot.order_)
{} {}
Foam::axesRotation::axesRotation(const tensor& R) Foam::coordinateRotations::axes::axes(axes&& crot)
: :
R_(R), coordinateRotation(std::move(crot)),
Rtr_(R_.T()) axis1_(std::move(crot.axis1_)),
axis2_(std::move(crot.axis2_)),
order_(crot.order_)
{} {}
Foam::axesRotation::axesRotation Foam::coordinateRotations::axes::axes
( (
const vector& axis, const vector& axis1,
const vector& dir, const vector& axis2,
const axisOrder& order axisOrder order
) )
: :
R_(rotation(axis, dir, order)), coordinateRotation(),
Rtr_(R_.T()) axis1_(axis1),
axis2_(axis2),
order_(order)
{} {}
Foam::axesRotation::axesRotation Foam::coordinateRotations::axes::axes(const vector& axis)
(
const vector& axis
)
: :
R_(rotation(axis, findOrthogonal(axis), E3_E1)), coordinateRotations::axes(axis, Zero, E3_E1_COMPAT) // Guess second axis
Rtr_(R_.T())
{} {}
Foam::axesRotation::axesRotation Foam::coordinateRotations::axes::axes(const dictionary& dict)
(
const dictionary& dict
)
: :
R_(sphericalTensor::I), coordinateRotations::axes()
Rtr_(sphericalTensor::I)
{ {
read(dict); read(dict);
} }
Foam::axesRotation::axesRotation
(
const dictionary& dict,
const objectRegistry&
)
:
axesRotation(dict)
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
const Foam::tensorField& Foam::axesRotation::Tr() const void Foam::coordinateRotations::axes::clear()
{ {
NotImplemented; axis1_ = vector(0,0,1); // e3 = global Z
return NullObjectRef<tensorField>(); axis2_ = vector(1,0,0); // e1 = global X
order_ = E3_E1;
} }
Foam::tmp<Foam::vectorField> Foam::axesRotation::transform Foam::tensor Foam::coordinateRotations::axes::R() const
(
const vectorField& st
) const
{ {
return (R_ & st); return axes::rotation(axis1_, axis2_, order_);
} }
Foam::vector Foam::axesRotation::transform(const vector& st) const // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::coordinateRotations::axes::write(Ostream& os) const
{ {
return (R_ & st); switch (order_)
}
Foam::tmp<Foam::vectorField> Foam::axesRotation::invTransform
(
const vectorField& st
) const
{
return (Rtr_ & st);
}
Foam::vector Foam::axesRotation::invTransform(const vector& st) const
{
return (Rtr_ & st);
}
Foam::tmp<Foam::tensorField> Foam::axesRotation::transformTensor
(
const tensorField& st
) const
{
NotImplemented;
return nullptr;
}
Foam::tensor Foam::axesRotation::transformTensor
(
const tensor& st
) const
{
return (R_ & st & Rtr_);
}
Foam::tmp<Foam::tensorField> Foam::axesRotation::transformTensor
(
const tensorField& st,
const labelList& cellMap
) const
{
NotImplemented;
return nullptr;
}
Foam::tmp<Foam::symmTensorField> Foam::axesRotation::transformVector
(
const vectorField& st
) const
{
tmp<symmTensorField> tfld(new symmTensorField(st.size()));
symmTensorField& fld = tfld.ref();
forAll(fld, i)
{ {
fld[i] = transformPrincipal(R_, st[i]); case E1_E2:
os << "e1: " << axis1_ << " e2: " << axis2_;
break;
case E2_E3:
os << "e2: " << axis1_ << " e3: " << axis2_;
break;
case E3_E1:
os << "e1: " << axis2_ << " e3: " << axis1_;
break;
case E3_E1_COMPAT:
os << "axis: " << axis1_ << " direction: " << axis2_;
break;
} }
return tfld;
} }
Foam::symmTensor Foam::axesRotation::transformVector void Foam::coordinateRotations::axes::writeEntry
( (
const vector& st const word& keyword,
Ostream& os
) const ) const
{ {
return transformPrincipal(R_, st); // We permit direct embedding of the axes specification without
} // requiring a sub-dictionary.
const bool subDict = !keyword.empty();
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // if (subDict)
{
os.beginBlock(keyword);
os.writeEntry("type", type());
}
void Foam::axesRotation::operator=(const dictionary& dict) switch (order_)
{ {
read(dict); case E1_E2:
{
os.writeEntry("e1", axis1_);
os.writeEntry("e2", axis2_);
break;
}
case E2_E3:
{
os.writeEntry("e2", axis1_);
os.writeEntry("e3", axis2_);
break;
}
case E3_E1:
{
os.writeEntry("e1", axis2_);
os.writeEntry("e3", axis1_);
break;
}
case E3_E1_COMPAT:
{
os.writeEntry("axis", axis1_);
os.writeEntry("direction", axis2_);
break;
}
}
if (subDict)
{
os.endBlock();
}
} }

View File

@ -22,48 +22,59 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class Class
Foam::axesRotation Foam::coordinateRotations::axes
Description Description
A coordinate rotation specified using global axes A coordinateRotation specified using global axes.
The rotation is defined by a combination of vectors (e1/e2), (e2/e3) The rotation is defined by a combination of vectors (e1/e2), (e2/e3)
or (e3/e1). Any nonorthogonality will be absorbed into the second or (e3/e1). Any nonorthogonality is absorbed into the second vector.
vector. In terms of cylindrical coordinates, the 'axis' would
correspond to the \a z-axis and the 'direction' to the \a r-axis.
\verbatim \verbatim
axesRotation coordinateRotation
{ {
type axesRotation; type axes;
e1 (1 0 0); e1 (1 0 0);
e2 (0 1 0); e2 (0 1 0);
} }
\endverbatim \endverbatim
\heading Dictionary entries
\table
Property | Description | Required | Default
type | type name: axes (previously axesRotation) | yes |
e1 | local x-axis | partly |
e2 | local y-axis | partly |
e3 | local z-axis | partly |
\endtable
Note
It is also possible to specify in terms of \c axis and \c direction.
For cylindrical coordinates, the \c axis would correspond to the
\a z-axis and the \c direction to the \a r-axis.
SourceFiles SourceFiles
axesRotation.C axesRotation.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef axesRotation_H #ifndef coordinateRotations_axes_H
#define axesRotation_H #define coordinateRotations_axes_H
#include "vector.H"
#include "coordinateRotation.H" #include "coordinateRotation.H"
#include "dictionary.H"
#include "runTimeSelectionTables.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam namespace Foam
{ {
namespace coordinateRotations
{
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class axesRotation Declaration Class coordinateRotations::axes Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class axesRotation class axes
: :
public coordinateRotation public coordinateRotation
{ {
@ -76,19 +87,22 @@ public:
E1_E2, //!< The axis1 (dominant) is local X, axis2 is local Y. E1_E2, //!< The axis1 (dominant) is local X, axis2 is local Y.
E2_E3, //!< The axis1 (dominant) is local Y, axis2 is local Z. E2_E3, //!< The axis1 (dominant) is local Y, axis2 is local Z.
E3_E1, //!< The axis1 (dominant) is local Z, axis2 is local X. E3_E1, //!< The axis1 (dominant) is local Z, axis2 is local X.
E3_E1_COMPAT, //!< E3_E1 specified as axis/direction. E3_E1_COMPAT //!< E3_E1 specified as axis/direction.
}; };
private: protected:
// Private data // Protected Data
//- Local-to-Global transformation tensor //- The primary axis
tensor R_; vector axis1_;
//- Global-to-Local transformation tensor //- The secondary axis
tensor Rtr_; vector axis2_;
//- The axis order
axisOrder order_;
// Protected Member Functions // Protected Member Functions
@ -100,67 +114,52 @@ private:
public: public:
//- Runtime type information //- Runtime type information
TypeName("axesRotation"); TypeNameNoDebug("axes");
// Constructors // Constructors
//- Construct null //- Construct null - an identity transform
axesRotation(); axes();
//- Construct as copy //- Copy construct
axesRotation(const axesRotation& r); axes(const axes& crot);
//- Construct from local to global rotation matrix //- Move construct
explicit axesRotation(const tensor& R); axes(axes&& crot);
//- Construct from two axes (axis and direction) //- Construct from two axes
axesRotation axes(const vector& axis1, const vector& axis2, axisOrder order=E3_E1);
(
const vector& axis,
const vector& dir,
const axisOrder& order = E3_E1
);
//- Construct from a single axis using a best-guess for the second axis //- Construct from a single axis (as e3) using a best-guess for the
// For the best-guess, the largest component value and sign of the //- second axis.
// axis determines the direction orientation. // The largest component and its sign are used when guessing
explicit axesRotation(const vector& axis); // an appropriate orientation (direction).
explicit axes(const vector& axis);
//- Construct from dictionary //- Construct from dictionary
explicit axesRotation(const dictionary& dict); explicit axes(const dictionary& dict);
//- Construct from dictionary and a registry (typically a mesh)
axesRotation
(
const dictionary& dict,
const objectRegistry& unused
);
//- Return clone //- Return clone
autoPtr<coordinateRotation> clone() const autoPtr<coordinateRotation> clone() const
{ {
return autoPtr<coordinateRotation>::NewFrom<axesRotation>(*this); return
autoPtr<coordinateRotation>::NewFrom
<coordinateRotations::axes>(*this);
} }
//- Destructor //- Destructor
virtual ~axesRotation() = default; virtual ~axes() = default;
// Member Functions
//- Reset rotation to an identity rotation
virtual void clear()
{
R_ = sphericalTensor::I;
Rtr_ = sphericalTensor::I;
}
// Static Member Functions // Static Member Functions
//- The rotation tensor calculated from two axes and their order. //- The rotation tensor calculated from two axes and their order.
// The input axes will be normalised. // The input axes will be normalised.
// If axis2 is zero, an axis orthogonal to axis1 will be guessed.
// The largest component and its sign are used when guessing
// an appropriate orientation (direction).
static tensor rotation static tensor rotation
( (
const vector& axis1, const vector& axis1,
@ -169,90 +168,29 @@ public:
); );
//- Update the rotation for a list of cells // Member Functions
virtual void updateCells(const polyMesh&, const labelList&)
{}
//- Return local-to-global transformation tensor //- Reset specification
virtual const tensor& R() const virtual void clear();
{
return R_;
}
//- Return global-to-local transformation tensor //- The rotation tensor calculated from the specified axes and order
virtual const tensor& Rtr() const virtual tensor R() const;
{
return Rtr_;
}
//- Return local Cartesian x-axis in global coordinates //- Write information
virtual const vector e1() const virtual void write(Ostream& os) const;
{
return Rtr_.x();
}
//- Return local Cartesian y-axis in global coordinates
virtual const vector e2() const
{
return Rtr_.y();
}
//- Return local Cartesian z-axis in global coordinates
virtual const vector e3() const
{
return Rtr_.z();
}
//- Return transformation tensor field
virtual const tensorField& Tr() const;
//- Transform vectorField using transformation tensor field
virtual tmp<vectorField> transform(const vectorField& st) const;
//- Transform vector using transformation tensor
virtual vector transform(const vector& st) const;
//- Inverse transform vectorField using transformation tensor field
virtual tmp<vectorField> invTransform(const vectorField& st) const;
//- Inverse transform vector using transformation tensor
virtual vector invTransform(const vector& st) const;
//- Transform tensor field using transformation tensorField
virtual tmp<tensorField> transformTensor(const tensorField& st) const;
//- Transform tensor using transformation tensorField
virtual tensor transformTensor(const tensor& st) const;
//- Transform tensor sub-field using transformation tensorField
virtual tmp<tensorField> transformTensor
(
const tensorField& st,
const labelList& cellMap
) const;
//- Transform vectorField using transformation tensorField and return
// symmetric tensorField
virtual tmp<symmTensorField> transformVector
(
const vectorField& st
) const;
//- Transform vector using transformation tensor and return
// symmetric tensor
virtual symmTensor transformVector(const vector& st) const;
// Member Operators
//- Assign from dictionary
void operator=(const dictionary& dict);
//- Write dictionary entry
virtual void writeEntry(const word& keyword, Ostream& os) const;
}; };
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace coordinateRotations
// Compatibility typedef 1806
typedef coordinateRotations::axes axesRotation;
} // End namespace Foam } // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -0,0 +1,167 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
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 <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "axisAngleRotation.H"
#include "dictionary.H"
#include "quaternion.H"
#include "unitConversion.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace coordinateRotations
{
defineTypeName(axisAngle);
addToRunTimeSelectionTable
(
coordinateRotation,
axisAngle,
dictionary
);
}
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::coordinateRotations::axisAngle::checkSpec()
{
if (mag(angle_) < VSMALL || mag(axis_) < SMALL)
{
clear(); // identity rotation
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::coordinateRotations::axisAngle::axisAngle()
:
coordinateRotation(),
axis_ (0,0,1), // e3 = global Z
angle_(Zero),
degrees_(true)
{}
Foam::coordinateRotations::axisAngle::axisAngle(const axisAngle& crot)
:
coordinateRotation(crot),
axis_(crot.axis_),
angle_(crot.angle_),
degrees_(crot.degrees_)
{
checkSpec();
}
Foam::coordinateRotations::axisAngle::axisAngle(axisAngle&& crot)
:
coordinateRotation(std::move(crot)),
axis_(std::move(crot.axis_)),
angle_(std::move(crot.angle_)),
degrees_(crot.degrees_)
{
checkSpec();
}
Foam::coordinateRotations::axisAngle::axisAngle
(
const vector& axis,
scalar angle,
bool degrees
)
:
coordinateRotation(),
axis_(axis),
angle_(angle),
degrees_(degrees)
{
checkSpec();
}
Foam::coordinateRotations::axisAngle::axisAngle(const dictionary& dict)
:
axisAngle
(
dict.get<vector>("axis"),
dict.get<scalar>("angle"),
dict.lookupOrDefault("degrees", true)
)
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::coordinateRotations::axisAngle::clear()
{
axis_ = vector(0,0,1); // e3 = global Z
angle_ = Zero;
}
Foam::tensor Foam::coordinateRotations::axisAngle::R() const
{
if (mag(angle_) < VSMALL || mag(axis_) < SMALL)
{
return sphericalTensor::I; // identity rotation
}
return quaternion(axis_, (degrees_ ? degToRad(angle_) : angle_)).R();
}
void Foam::coordinateRotations::axisAngle::write(Ostream& os) const
{
os << "rotation axis: " << axis_
<< " angle(" << (degrees_ ? "deg" : "rad") << "): " << angle_;
}
void Foam::coordinateRotations::axisAngle::writeEntry
(
const word& keyword,
Ostream& os
) const
{
os.beginBlock(keyword);
os.writeEntry("type", type());
os.writeEntry("axis", axis_);
os.writeEntry("angle", angle_);
if (!degrees_)
{
os.writeEntry("degrees", "false");
}
os.endBlock();
}
// ************************************************************************* //

View File

@ -0,0 +1,156 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
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 <http://www.gnu.org/licenses/>.
Class
Foam::coordinateRotations::axisAngle
Description
A coordinateRotation specified by a rotation axis and a rotation angle
about that axis.
\verbatim
coordinateRotation
{
type axisAngle;
axis (1 0 0);
angle 90;
}
\endverbatim
\heading Dictionary entries
\table
Property | Description | Required | Default
type | Type name: axisAngle | yes |
axis | Axis of rotation (vector) | yes |
angle | Rotation angle | yes |
degrees | The angle is in degrees | no | true
\endtable
Note
The rotation axis will be normalized internally.
SourceFiles
axisAngle.C
\*---------------------------------------------------------------------------*/
#ifndef coordinateRotations_axisAngle_H
#define coordinateRotations_axisAngle_H
#include "coordinateRotation.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace coordinateRotations
{
/*---------------------------------------------------------------------------*\
Class coordinateRotations::axisAngle Declaration
\*---------------------------------------------------------------------------*/
class axisAngle
:
public coordinateRotation
{
// Private Data
//- The rotation axis
vector axis_;
//- The rotation angle
scalar angle_;
//- Angle measured in degrees
bool degrees_;
// Private Member Functions
//- Check specification for an identity rotation
void checkSpec();
public:
//- Runtime type information
TypeNameNoDebug("axisAngle");
// Constructors
//- Construct null
axisAngle();
//- Copy construct
axisAngle(const axisAngle& crot);
//- Move construct
axisAngle(axisAngle&& crot);
//- Construct from axis and angle
axisAngle(const vector& axis, scalar angle, bool degrees);
//- Construct from dictionary
explicit axisAngle(const dictionary& dict);
//- Return clone
autoPtr<coordinateRotation> clone() const
{
return
autoPtr<coordinateRotation>::NewFrom
<coordinateRotations::axisAngle>(*this);
}
//- Destructor
virtual ~axisAngle() = default;
// Member Functions
//- Reset specification
virtual void clear();
//- Calculate and return the rotation tensor
//- calculated from axis and angle
virtual tensor R() const;
//- Write information
virtual void write(Ostream& os) const;
//- Write dictionary entry
virtual void writeEntry(const word& keyword, Ostream& os) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace coordinateRotations
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -31,9 +31,8 @@ License
namespace Foam namespace Foam
{ {
defineTypeNameAndDebug(coordinateRotation, 0); defineTypeName(coordinateRotation);
defineRunTimeSelectionTable(coordinateRotation, dictionary); defineRunTimeSelectionTable(coordinateRotation, dictionary);
defineRunTimeSelectionTable(coordinateRotation, objectRegistry);
} }
@ -64,46 +63,28 @@ Foam::vector Foam::coordinateRotation::findOrthogonal(const vector& axis)
} }
Foam::symmTensor Foam::coordinateRotation::transformPrincipal // * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
Foam::autoPtr<Foam::coordinateRotation> Foam::coordinateRotation::New
( (
const tensor& tt, const dictionary& dict
const vector& v
) )
{ {
return symmTensor const word modelType(dict.get<word>("type"));
(
tt.xx()*v.x()*tt.xx()
+ tt.xy()*v.y()*tt.xy()
+ tt.xz()*v.z()*tt.xz(),
tt.xx()*v.x()*tt.yx() auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
+ tt.xy()*v.y()*tt.yy()
+ tt.xz()*v.z()*tt.yz(),
tt.xx()*v.x()*tt.zx() if (!cstrIter.found())
+ tt.xy()*v.y()*tt.zy() {
+ tt.xz()*v.z()*tt.zz(), FatalIOErrorInFunction(dict)
<< "Unknown coordinateRotation type "
<< modelType << nl << nl
<< "Valid types: "
<< flatOutput(dictionaryConstructorTablePtr_->sortedToc())
<< exit(FatalIOError);
}
tt.yx()*v.x()*tt.yx() return autoPtr<coordinateRotation>(cstrIter()(dict));
+ tt.yy()*v.y()*tt.yy()
+ tt.yz()*v.z()*tt.yz(),
tt.yx()*v.x()*tt.zx()
+ tt.yy()*v.y()*tt.zy()
+ tt.yz()*v.z()*tt.zz(),
tt.zx()*v.x()*tt.zx()
+ tt.zy()*v.y()*tt.zy()
+ tt.zz()*v.z()*tt.zz()
);
}
void Foam::coordinateRotation::write(Ostream& os) const
{
os.writeEntry("e1", e1());
os.writeEntry("e2", e2());
os.writeEntry("e3", e3());
} }

View File

@ -21,43 +21,47 @@ License
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Namespace
Foam::coordinateRotations
Description
Namespace for coordinate system rotations.
Class Class
Foam::coordinateRotation Foam::coordinateRotation
Description Description
Abstract base class for coordinate rotation User specification of a coordinate rotation.
\verbatim \verbatim
coordinateRotation coordinateRotation
{ {
type axesRotation type axes
e1 (1 0 0); e1 (1 0 0);
e2 (0 1 0); e2 (0 1 0);
} }
\endverbatim \endverbatim
Types of coordinateRotation: Types of coordinateRotations:
-# axesRotation -# \link coordinateRotations::identity none \endlink
-# STARCDRotation -# \link coordinateRotations::axes axes \endlink
-# cylindrical -# \link coordinateRotations::axisAngle axisAngle \endlink
-# EulerCoordinateRotation -# \link coordinateRotations::cylindrical cylindrical \endlink
-# \link coordinateRotations::euler euler \endlink
-# \link coordinateRotations::starcd starcd \endlink
SourceFiles SourceFiles
coordinateRotation.C coordinateRotation.C
coordinateRotationNew.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef coordinateRotation_H #ifndef coordinateRotation_H
#define coordinateRotation_H #define coordinateRotation_H
#include "vector.H" #include "vectorField.H"
#include "tensor.H"
#include "tensorField.H" #include "tensorField.H"
#include "dictionary.H" #include "dictionary.H"
#include "runTimeSelectionTables.H" #include "runTimeSelectionTables.H"
#include "objectRegistry.H"
#include "polyMesh.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -72,10 +76,7 @@ class coordinateRotation
{ {
protected: protected:
// Protected member functions // Protected Member Functions
//- Transform principal
static symmTensor transformPrincipal(const tensor&, const vector&);
//- Determine best-guess for an orthogonal axis //- Determine best-guess for an orthogonal axis
static vector findOrthogonal(const vector& axis); static vector findOrthogonal(const vector& axis);
@ -84,25 +85,9 @@ protected:
public: public:
//- Runtime type information //- Runtime type information
TypeName("coordinateRotation"); TypeNameNoDebug("coordinateRotation");
// Declare run-time constructor selection table from dictionary
// Declare run-time constructor selection table
// for constructors with dictionary and objectRegistry
declareRunTimeSelectionTable
(
autoPtr,
coordinateRotation,
objectRegistry,
(
const dictionary& dict, const objectRegistry& obr
),
(dict, obr)
);
// Declare run-time constructor selection table
// for constructors with dictionary
declareRunTimeSelectionTable declareRunTimeSelectionTable
( (
autoPtr, autoPtr,
@ -114,26 +99,19 @@ public:
(dict) (dict)
); );
// Constructors // Constructors
// Uses all default constructors
//- Construct and return a clone //- Construct and return a clone
virtual autoPtr<coordinateRotation> clone() const = 0; virtual autoPtr<coordinateRotation> clone() const = 0;
// Selectors // Selectors
//- Select constructed from dictionary and objectRegistry
static autoPtr<coordinateRotation> New
(
const dictionary& dict,
const objectRegistry& obr
);
//- Select constructed from dictionary //- Select constructed from dictionary
static autoPtr<coordinateRotation> New static autoPtr<coordinateRotation> New(const dictionary& dict);
(
const dictionary& dict
);
//- Destructor //- Destructor
@ -142,84 +120,20 @@ public:
// Member Functions // Member Functions
//- Reset rotation to an identity rotation //- Reset specification
virtual void clear() = 0; virtual void clear() = 0;
//- Update the rotation for a list of cells //- Calculate and return the rotation tensor
virtual void updateCells virtual tensor R() const = 0;
(
const polyMesh& mesh,
const labelList& cells
) = 0;
//- Return local-to-global transformation tensor
virtual const tensor& R() const = 0;
//- Return global-to-local transformation tensor
virtual const tensor& Rtr() const = 0;
//- Return local Cartesian x-axis
virtual const vector e1() const = 0;
//- Return local Cartesian y-axis
virtual const vector e2() const = 0;
//- Return local Cartesian z-axis
virtual const vector e3() const = 0;
//- Return local-to-global transformation tensor
virtual const tensorField& Tr() const = 0;
//- Return true if the rotation tensor is uniform
virtual bool uniform() const
{
return true;
}
//- Transform vectorField using transformation tensor field
virtual tmp<vectorField> transform(const vectorField& st) const = 0;
//- Transform vector using transformation tensor
virtual vector transform(const vector& st) const = 0;
//- Inverse transform vectorField using transformation tensor field
virtual tmp<vectorField> invTransform(const vectorField& st) const = 0;
//- Inverse transform vector using transformation tensor
virtual vector invTransform(const vector& st) const = 0;
//- Transform tensor field using transformation tensorField
virtual tmp<tensorField> transformTensor
(
const tensorField& st
) const = 0;
//- Transform tensor sub-field using transformation tensorField
virtual tmp<tensorField> transformTensor
(
const tensorField& st,
const labelList& cellMap
) const = 0;
//- Transform tensor using transformation tensorField
virtual tensor transformTensor(const tensor& st) const = 0;
//- Transform vectorField using transformation tensorField and return
// symmetrical tensorField
virtual tmp<symmTensorField> transformVector
(
const vectorField& st
) const = 0;
//- Transform vector using transformation tensor and return
// symmetrical tensor
virtual symmTensor transformVector(const vector& st) const = 0;
// Write // Write
//- Write coordinateRotation as e1,e2,e3 vectors //- Write information
virtual void write(Ostream& os) const; virtual void write(Ostream& os) const = 0;
//- Write dictionary entry
virtual void writeEntry(const word& keyword, Ostream& os) const = 0;
}; };

View File

@ -1,76 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2017-2018 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 <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "coordinateRotation.H"
#include "objectRegistry.H"
// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
Foam::autoPtr<Foam::coordinateRotation> Foam::coordinateRotation::New
(
const dictionary& dict,
const objectRegistry& obr
)
{
const word modelType(dict.get<word>("type"));
auto cstrIter = objectRegistryConstructorTablePtr_->cfind(modelType);
if (!cstrIter.found())
{
FatalIOErrorInFunction(dict)
<< "Unknown coordinateRotation type " << modelType << nl << nl
<< "Valid types: "
<< flatOutput(objectRegistryConstructorTablePtr_->sortedToc())
<< exit(FatalIOError);
}
return autoPtr<coordinateRotation>(cstrIter()(dict, obr));
}
Foam::autoPtr<Foam::coordinateRotation> Foam::coordinateRotation::New
(
const dictionary& dict
)
{
const word modelType(dict.get<word>("type"));
auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
if (!cstrIter.found())
{
FatalIOErrorInFunction(dict)
<< "Unknown coordinateRotation type " << modelType << nl << nl
<< "Valid types: "
<< flatOutput(dictionaryConstructorTablePtr_->sortedToc())
<< exit(FatalIOError);
}
return autoPtr<coordinateRotation>(cstrIter()(dict));
}
// ************************************************************************* //

View File

@ -1,360 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
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 <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "cylindrical.H"
#include "axesRotation.H"
#include "addToRunTimeSelectionTable.H"
#include "polyMesh.H"
#include "tensorIOField.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(cylindrical, 0);
addToRunTimeSelectionTable
(
coordinateRotation,
cylindrical,
dictionary
);
addToRunTimeSelectionTable
(
coordinateRotation,
cylindrical,
objectRegistry
);
}
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
void Foam::cylindrical::init
(
const objectRegistry& obr,
const labelUList& cells
)
{
const polyMesh& mesh = refCast<const polyMesh>(obr);
const vectorField& cc = mesh.cellCentres();
if (cells.size())
{
Rptr_.reset(new tensorField(cells.size()));
tensorField& R = Rptr_();
forAll(cells, i)
{
const label celli = cells[i];
vector dir = cc[celli] - origin_;
dir /= mag(dir) + VSMALL;
R[i] = axesRotation(e3_, dir).R();
}
}
else
{
Rptr_.reset(new tensorField(mesh.nCells()));
tensorField& R = Rptr_();
forAll(cc, celli)
{
vector dir = cc[celli] - origin_;
dir /= mag(dir) + VSMALL;
R[celli] = axesRotation(e3_, dir).R();
}
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::cylindrical::cylindrical(const cylindrical& r)
:
Rptr_(r.Rptr_.clone()),
origin_(r.origin_),
e3_(r.e3_)
{}
Foam::cylindrical::cylindrical(const tensorField& R)
:
Rptr_(),
origin_(Zero),
e3_(Zero)
{
Rptr_() = R;
}
Foam::cylindrical::cylindrical(const dictionary& dict)
:
Rptr_(),
origin_(Zero),
e3_(Zero)
{
FatalErrorInFunction
<< " cylindrical can not be constructed from dictionary "
<< " use the constructor : "
"("
" const dictionary&, const objectRegistry&"
")"
<< exit(FatalIOError);
}
Foam::cylindrical::cylindrical
(
const dictionary& dict,
const objectRegistry& obr
)
:
Rptr_(),
origin_(Zero),
e3_(Zero)
{
// If origin is specified in the coordinateSystem
dict.parent().readIfPresent("origin", origin_);
// Rotation axis
dict.readEntry("e3", e3_);
init(obr);
}
Foam::cylindrical::cylindrical
(
const objectRegistry& obr,
const vector& axis,
const point& origin
)
:
Rptr_(),
origin_(origin),
e3_(axis)
{
init(obr);
}
Foam::cylindrical::cylindrical
(
const objectRegistry& obr,
const vector& axis,
const point& origin,
const List<label>& cells
)
:
Rptr_(),
origin_(origin),
e3_(axis)
{
init(obr, cells);
}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::cylindrical::clear()
{
Rptr_.clear();
}
void Foam::cylindrical::updateCells
(
const polyMesh& mesh,
const labelList& cells
)
{
const vectorField& cc = mesh.cellCentres();
tensorField& R = Rptr_();
forAll(cells, i)
{
const label celli = cells[i];
vector dir = cc[celli] - origin_;
dir /= mag(dir) + VSMALL;
R[celli] = axesRotation(e3_, dir).R();
}
}
Foam::tmp<Foam::vectorField> Foam::cylindrical::transform
(
const vectorField& vf
) const
{
if (Rptr_->size() != vf.size())
{
FatalErrorInFunction
<< "vectorField st has different size to tensorField "
<< abort(FatalError);
}
return (Rptr_() & vf);
}
Foam::vector Foam::cylindrical::transform(const vector& v) const
{
NotImplemented;
return Zero;
}
Foam::vector Foam::cylindrical::transform
(
const vector& v,
const label cmptI
) const
{
return (Rptr_()[cmptI] & v);
}
Foam::tmp<Foam::vectorField> Foam::cylindrical::invTransform
(
const vectorField& vf
) const
{
return (Rptr_().T() & vf);
}
Foam::vector Foam::cylindrical::invTransform(const vector& v) const
{
NotImplemented;
return Zero;
}
Foam::vector Foam::cylindrical::invTransform
(
const vector& v,
const label cmptI
) const
{
return (Rptr_()[cmptI].T() & v);
}
Foam::tmp<Foam::tensorField> Foam::cylindrical::transformTensor
(
const tensorField& tf
) const
{
if (Rptr_->size() != tf.size())
{
FatalErrorInFunction
<< "tensorField st has different size to tensorField Tr"
<< abort(FatalError);
}
return (Rptr_() & tf & Rptr_().T());
}
Foam::tensor Foam::cylindrical::transformTensor
(
const tensor& t
) const
{
NotImplemented;
return Zero;
}
Foam::tmp<Foam::tensorField> Foam::cylindrical::transformTensor
(
const tensorField& tf,
const labelList& cellMap
) const
{
if (cellMap.size() != tf.size())
{
FatalErrorInFunction
<< "tensorField tf has different size to tensorField Tr"
<< abort(FatalError);
}
const tensorField& R = Rptr_();
const tensorField Rtr(R.T());
tmp<tensorField> tt(new tensorField(cellMap.size()));
tensorField& t = tt.ref();
forAll(cellMap, i)
{
const label celli = cellMap[i];
t[i] = R[celli] & tf[i] & Rtr[celli];
}
return tt;
}
Foam::tmp<Foam::symmTensorField> Foam::cylindrical::transformVector
(
const vectorField& vf
) const
{
if (Rptr_->size() != vf.size())
{
FatalErrorInFunction
<< "tensorField vf has different size to tensorField Tr"
<< abort(FatalError);
}
tmp<symmTensorField> tfld(new symmTensorField(Rptr_->size()));
symmTensorField& fld = tfld.ref();
const tensorField& R = Rptr_();
forAll(fld, i)
{
fld[i] = transformPrincipal(R[i], vf[i]);
}
return tfld;
}
Foam::symmTensor Foam::cylindrical::transformVector
(
const vector& v
) const
{
NotImplemented;
return Zero;
}
void Foam::cylindrical::write(Ostream& os) const
{
os.writeEntry("e3", e3());
}
// ************************************************************************* //

View File

@ -1,251 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
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 <http://www.gnu.org/licenses/>.
Class
Foam::cylindrical
Description
A local coordinate rotation.
The cell based rotational field can be created in two ways:
-# Each rotational tensor is defined with two vectors (\c dir and \c e3)
where <tt>dir = cellC - origin</tt> and \c e3 is the rotation axis.
Per each cell an axesRotation type of rotation is created
(cylindrical coordinates). For example:
\verbatim
cylindrical
{
type localAxes;
e3 (0 0 1);
}
\endverbatim
-# The rotational tensor field is provided at construction.
SourceFiles
cylindrical.C
\*---------------------------------------------------------------------------*/
#ifndef cylindrical_H
#define cylindrical_H
#include "point.H"
#include "vector.H"
#include "ListOps.H"
#include "coordinateRotation.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class cylindrical Declaration
\*---------------------------------------------------------------------------*/
class cylindrical
:
public coordinateRotation
{
// Private data
//- An autoPtr to the transformation tensor
autoPtr<tensorField> Rptr_;
//- Origin of the coordinate system
point origin_;
//- Rotation axis
vector e3_;
// Private members
//- Init transformation tensor field
void init
(
const objectRegistry& obr,
const labelUList& cells = Foam::emptyLabelList
);
public:
//- Runtime type information
TypeName("cylindrical");
// Constructors
//- Construct as copy
cylindrical(const cylindrical& r);
//- Construct from tensor Field
explicit cylindrical(const tensorField& R);
//- Construct from dictionary - for API compatibility only
explicit cylindrical(const dictionary& dict);
//- Construct from dictionary and objectRegistry
cylindrical(const dictionary& dict, const objectRegistry& obr);
//- Construct from components for all cells
cylindrical
(
const objectRegistry& obr,
const vector& axis,
const point& origin
);
//- Construct from components for list of cells
cylindrical
(
const objectRegistry& obr,
const vector& axis,
const point& origin,
const List<label>& cells
);
//- Return clone
autoPtr<coordinateRotation> clone() const
{
return autoPtr<coordinateRotation>::NewFrom<cylindrical>(*this);
}
//- Destructor
virtual ~cylindrical() = default;
// Member Functions
//- Reset rotation to an identity rotation
virtual void clear();
//- Update the rotation for a list of cells
virtual void updateCells(const polyMesh& mesh, const labelList& cells);
//- Return local-to-global transformation tensor
virtual const tensor& R() const
{
NotImplemented;
return tensor::zero;
}
//- Return global-to-local transformation tensor
virtual const tensor& Rtr() const
{
NotImplemented;
return tensor::zero;
}
//- Return local Cartesian x-axis in global coordinates
virtual const vector e1() const
{
NotImplemented;
return vector::zero;
}
//- Return local Cartesian y-axis in global coordinates
virtual const vector e2() const
{
NotImplemented;
return vector::zero;
}
//- Return local Cartesian z-axis in global coordinates
virtual const vector e3() const
{
return e3_;
}
virtual const tensorField& Tr() const
{
return *Rptr_;
}
//- Transform vectorField using transformation tensor field
virtual tmp<vectorField> transform(const vectorField& tf) const;
//- Transform vector using transformation tensor
virtual vector transform(const vector& v) const;
//- Transform vector using transformation tensor for component
virtual vector transform(const vector& v, const label cmptI) const;
//- Inverse transform vectorField using transformation tensor field
virtual tmp<vectorField> invTransform(const vectorField& vf) const;
//- Inverse transform vector using transformation tensor
virtual vector invTransform(const vector& v) const;
//- Inverse transform vector using transformation tensor for component
virtual vector invTransform(const vector& v, const label cmptI) const;
//- Return if the rotation is uniform
virtual bool uniform() const
{
return false;
}
//- Transform tensor field using transformation tensorField
virtual tmp<tensorField> transformTensor(const tensorField& tf) const;
//- Transform tensor using transformation tensorField
virtual tensor transformTensor(const tensor& t) const;
//- Transform tensor sub-field using transformation tensorField
virtual tmp<tensorField> transformTensor
(
const tensorField& tf,
const labelList& cellMap
) const;
//- Transform vectorField using transformation tensorField and return
// symmetrical tensorField
virtual tmp<symmTensorField> transformVector
(
const vectorField& vf
) const;
//- Transform vector using transformation tensor and return
// symmetrical tensor (R & st & R.T())
virtual symmTensor transformVector(const vector& v) const;
// Write
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,101 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
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 <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "cylindricalRotation.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace coordinateRotations
{
defineTypeName(cylindrical);
addToRunTimeSelectionTable
(
coordinateRotation,
cylindrical,
dictionary
);
}
}
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
Foam::tensor Foam::coordinateRotations::cylindrical::rotation
(
const vector& axis
)
{
// Guess second axis
return axes::rotation(axis, Zero, E3_E1);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::coordinateRotations::cylindrical::cylindrical(const cylindrical& crot)
:
coordinateRotations::axes(crot)
{}
Foam::coordinateRotations::cylindrical::cylindrical(const vector& axis)
:
coordinateRotations::axes(axis) // Guess second axis
{}
Foam::coordinateRotations::cylindrical::cylindrical(const dictionary& dict)
:
cylindrical(dict.getCompat<vector>("axis", {{"e3", -1806}}))
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::coordinateRotations::cylindrical::write(Ostream& os) const
{
os << type() << " axis: " << axis1_;
}
void Foam::coordinateRotations::cylindrical::writeEntry
(
const word& keyword,
Ostream& os
) const
{
os.beginBlock(keyword);
os.writeEntry("type", type());
os.writeEntry("axis", axis1_);
os.endBlock();
}
// ************************************************************************* //

View File

@ -0,0 +1,122 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2018 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 <http://www.gnu.org/licenses/>.
Class
Foam::coordinateRotations::cylindrical
Description
A special purpose coordinateRotation that is generally for use in
combination with a cylindricalCS when only the orientation of the
local Z-axis is relevant.
\heading Dictionary entries
\table
Property | Description | Required | Default
type | Type name: cylindrical | yes |
axis | The z-axis | yes |
e3 | Alias for 'axis' | no |
\endtable
SourceFiles
cylindricalRotation.C
\*---------------------------------------------------------------------------*/
#ifndef coordinateRotations_cylindrical_H
#define coordinateRotations_cylindrical_H
#include "axesRotation.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace coordinateRotations
{
/*---------------------------------------------------------------------------*\
Class coordinateRotations::cylindrical Declaration
\*---------------------------------------------------------------------------*/
class cylindrical
:
public coordinateRotations::axes
{
public:
//- Runtime type information
TypeNameNoDebug("cylindrical");
// Constructors
//- Copy construct
cylindrical(const cylindrical& crot);
//- Construct from single axis (as e3) using best-guess for the
//- second axis.
explicit cylindrical(const vector& axis);
//- Construct from dictionary
explicit cylindrical(const dictionary& dict);
//- Return clone
autoPtr<coordinateRotation> clone() const
{
return
autoPtr<coordinateRotation>::NewFrom
<coordinateRotations::cylindrical>(*this);
}
//- Destructor
virtual ~cylindrical() = default;
// Static Member Functions
//- The rotation tensor calculated from axes and order.
// The input axes will be normalised.
static tensor rotation(const vector& axis);
// Member Functions
//- Write information
virtual void write(Ostream& os) const;
//- Write dictionary entry
virtual void writeEntry(const word& keyword, Ostream& os) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace coordinateRotations
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,99 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
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 <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "identityRotation.H"
#include "dictionary.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace coordinateRotations
{
defineTypeName(identity);
addToRunTimeSelectionTable
(
coordinateRotation,
identity,
dictionary
);
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::coordinateRotations::identity::identity()
:
coordinateRotation()
{}
Foam::coordinateRotations::identity::identity(const identity&)
:
identity()
{}
Foam::coordinateRotations::identity::identity(const dictionary&)
:
identity()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::coordinateRotations::identity::clear()
{}
Foam::tensor Foam::coordinateRotations::identity::R() const
{
return sphericalTensor::I;
}
void Foam::coordinateRotations::identity::write(Ostream& os) const
{
os << "identity rotation";
}
void Foam::coordinateRotations::identity::writeEntry
(
const word& keyword,
Ostream& os
) const
{
os.beginBlock(keyword);
os.writeEntry("type", type());
os.endBlock();
}
// ************************************************************************* //

View File

@ -0,0 +1,124 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
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 <http://www.gnu.org/licenses/>.
Class
Foam::coordinateRotations::identity
Description
An identity coordinateRotation.
\verbatim
coordinateRotation
{
type none;
}
\endverbatim
\heading Dictionary entries
\table
Property | Description | Required | Default
type | Type name: none | yes |
\endtable
SourceFiles
identityRotation.C
\*---------------------------------------------------------------------------*/
#ifndef coordinateRotations_identity_H
#define coordinateRotations_identity_H
#include "coordinateRotation.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace coordinateRotations
{
/*---------------------------------------------------------------------------*\
Class coordinateRotations::identity Declaration
\*---------------------------------------------------------------------------*/
class identity
:
public coordinateRotation
{
public:
//- Runtime type information
TypeNameNoDebug("none");
// Constructors
//- Construct null
identity();
//- Copy construct
identity(const identity& unused);
//- Construct from dictionary
explicit identity(const dictionary& unused);
//- Return clone
autoPtr<coordinateRotation> clone() const
{
return
autoPtr<coordinateRotation>::NewFrom
<coordinateRotations::identity>(*this);
}
//- Destructor
virtual ~identity() = default;
// Member Functions
//- Reset specification (no-op)
virtual void clear();
//- Return an identity rotation tensor
virtual tensor R() const;
//- Write information
virtual void write(Ostream& os) const;
//- Write dictionary entry
virtual void writeEntry(const word& keyword, Ostream& os) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace coordinateRotations
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -24,59 +24,68 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "cartesianCS.H" #include "cartesianCS.H"
#include "one.H"
#include "mathematicalConstants.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam namespace Foam
{ {
defineTypeNameAndDebug(cartesianCS, 0); namespace coordSystem
addToRunTimeSelectionTable(coordinateSystem, cartesianCS, dictionary); {
defineTypeName(cartesian);
addToRunTimeSelectionTable(coordinateSystem, cartesian, dictionary);
}
} }
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::cartesianCS::cartesianCS() Foam::coordSystem::cartesian::cartesian()
: :
coordinateSystem() coordinateSystem()
{} {}
Foam::cartesianCS::cartesianCS Foam::coordSystem::cartesian::cartesian(const coordinateSystem& csys)
(
const coordinateSystem& cs
)
: :
coordinateSystem(cs) coordinateSystem(csys)
{} {}
Foam::cartesianCS::cartesianCS Foam::coordSystem::cartesian::cartesian(coordinateSystem&& csys)
(
const word& name,
const coordinateSystem& cs
)
: :
coordinateSystem(name, cs) coordinateSystem(std::move(csys))
{} {}
Foam::cartesianCS::cartesianCS Foam::coordSystem::cartesian::cartesian(autoPtr<coordinateSystem>&& csys)
:
coordinateSystem(std::move(csys))
{}
Foam::coordSystem::cartesian::cartesian
( (
const word& name,
const point& origin, const point& origin,
const coordinateRotation& cr const coordinateRotation& crot
) )
: :
coordinateSystem(name, origin, cr) coordinateSystem(origin, crot)
{} {}
Foam::cartesianCS::cartesianCS Foam::coordSystem::cartesian::cartesian
(
const point& origin,
const vector& axis,
const vector& dirn
)
:
coordinateSystem(origin, axis, dirn)
{}
Foam::coordSystem::cartesian::cartesian
( (
const word& name, const word& name,
const point& origin, const point& origin,
@ -88,7 +97,7 @@ Foam::cartesianCS::cartesianCS
{} {}
Foam::cartesianCS::cartesianCS Foam::coordSystem::cartesian::cartesian
( (
const word& name, const word& name,
const dictionary& dict const dictionary& dict
@ -98,63 +107,20 @@ Foam::cartesianCS::cartesianCS
{} {}
Foam::cartesianCS::cartesianCS Foam::coordSystem::cartesian::cartesian(const dictionary& dict)
:
coordinateSystem(dict)
{}
Foam::coordSystem::cartesian::cartesian
( (
const objectRegistry& obr, const dictionary& dict,
const dictionary& dict const word& dictName
) )
: :
coordinateSystem(obr, dict) coordinateSystem(dict, dictName)
{} {}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::cartesianCS::~cartesianCS()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::vector Foam::cartesianCS::localToGlobal
(
const vector& local,
bool translate
) const
{
return coordinateSystem::localToGlobal(local, translate);
}
Foam::tmp<Foam::vectorField> Foam::cartesianCS::localToGlobal
(
const vectorField& local,
bool translate
) const
{
return coordinateSystem::localToGlobal(local, translate);
}
Foam::vector Foam::cartesianCS::globalToLocal
(
const vector& global,
bool translate
) const
{
return coordinateSystem::globalToLocal(global, translate);
}
Foam::tmp<Foam::vectorField> Foam::cartesianCS::globalToLocal
(
const vectorField& global,
bool translate
) const
{
return coordinateSystem::globalToLocal(global, translate);
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -22,10 +22,16 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class Class
Foam::cartesianCS Foam::coordSystem::cartesian
Description Description
Cartesian coordinate system A Cartesian coordinate system
\heading Dictionary entries
\table
Property | Description | Required | Default
type | Type name: cartesian | yes |
\endtable
SourceFiles SourceFiles
cartesianCS.C cartesianCS.C
@ -36,85 +42,61 @@ SourceFiles
#define cartesianCS_H #define cartesianCS_H
#include "coordinateSystem.H" #include "coordinateSystem.H"
#include "typeInfo.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam namespace Foam
{ {
namespace coordSystem
{
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class cartesianCS Declaration Class coordSystem::cartesian Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class cartesianCS class cartesian
: :
public coordinateSystem public coordinateSystem
{ {
protected:
// Protected Member Functions
//- Convert from local coordinate system to the global Cartesian system
// with optional translation for the origin
virtual vector localToGlobal(const vector&, bool translate) const;
//- Convert from local coordinate system to the global Cartesian system
// with optional translation for the origin
virtual tmp<vectorField> localToGlobal
(
const vectorField&,
bool translate
) const;
//- Convert from global Cartesian system to the local coordinate system
// with optional translation for the origin
virtual vector globalToLocal(const vector&, bool translate) const;
//- Convert from global Cartesian system to the local coordinate system
// with optional translation for the origin
virtual tmp<vectorField> globalToLocal
(
const vectorField&,
bool translate
) const;
public: public:
//- Runtime type information //- Runtime type information
TypeName("cartesian"); TypeNameNoDebug("cartesian");
// Constructors // Constructors
//- Construct null //- Construct null. This is an identity coordinateSystem.
cartesianCS(); cartesian();
//- Construct copy //- Copy construct
cartesianCS cartesian(const cartesian& csys) = default;
(
const coordinateSystem&
);
//- Construct copy with a different name //- Move construct
cartesianCS cartesian(cartesian&& csys) = default;
(
const word& name, //- Copy construct from another coordinateSystem type
const coordinateSystem& explicit cartesian(const coordinateSystem& csys);
);
//- Move construct from another coordinateSystem type
explicit cartesian(coordinateSystem&& csys);
//- Move construct from autoPtr of another coordinateSystem type
explicit cartesian(autoPtr<coordinateSystem>&& csys);
//- Construct from origin and rotation //- Construct from origin and rotation
cartesianCS cartesian(const point& origin, const coordinateRotation& crot);
//- Construct from origin and 2 axes
cartesian
( (
const word& name,
const point& origin, const point& origin,
const coordinateRotation& const vector& axis,
const vector& dirn
); );
//- Construct from origin and 2 axes //- Construct from origin and 2 axes
cartesianCS cartesian
( (
const word& name, const word& name,
const point& origin, const point& origin,
@ -122,24 +104,48 @@ public:
const vector& dirn const vector& dirn
); );
//- Construct from dictionary //- Construct from dictionary with a given name
cartesianCS(const word&, const dictionary&); cartesian(const word& name, const dictionary& dict);
//- Construct from dictionary without a name
explicit cartesian(const dictionary& dict);
//- Construct from dictionary and objectRegistry //- Construct from dictionary with optional subDict lookup.
cartesianCS(const objectRegistry&, const dictionary&); //
// \param dictName If non-empty, the sub-dictionary to use.
cartesian(const dictionary& dict, const word& dictName);
//- Destructor //- Destructor
virtual ~cartesianCS(); virtual ~cartesian() = default;
// Member Operators
//- Copy assignment
cartesian& operator=(const cartesian&) = default;
//- Move assignment
cartesian& operator=(cartesian&&) = default;
//- Copy/move assignment from coordinateSystem, autoPtr
using coordinateSystem::operator=;
}; };
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace coordSystem
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
//- Compatibility typedef 1806
typedef coordSystem::cartesian cartesianCS;
} // End namespace Foam } // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif #endif

View File

@ -23,10 +23,12 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "coordinateSystem.H"
#include "cartesianCS.H"
#include "IOstream.H" #include "IOstream.H"
#include "axesRotation.H" #include "axesRotation.H"
#include "coordinateSystem.H" #include "identityRotation.H"
#include "coordinateSystems.H" #include "transform.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -35,47 +37,157 @@ namespace Foam
{ {
defineTypeNameAndDebug(coordinateSystem, 0); defineTypeNameAndDebug(coordinateSystem, 0);
defineRunTimeSelectionTable(coordinateSystem, dictionary); defineRunTimeSelectionTable(coordinateSystem, dictionary);
defineRunTimeSelectionTable(coordinateSystem, registry);
} }
Foam::coordinateSystem Foam::coordinateSystem::dummy_(nullptr);
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
namespace Foam
{
//- Is it cartesian?
// For output, can treat the base class as Cartesian too,
// since it defaults to cartesian on input.
static inline bool isCartesian(const word& modelType)
{
return
(
modelType == coordinateSystem::typeName_()
|| modelType == coordSystem::cartesian::typeName_()
);
}
} // End namespace Foam
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
void Foam::coordinateSystem::assign(const dictionary& dict)
{
dict.readEntry("origin", origin_);
note_.clear();
dict.readIfPresent("note", note_);
// Non-recursive, no pattern search for "rotation"
// or "coordinateRotation" (older) sub-dictionary.
// Don't warn about older naming for now (OCT-2018)
const auto finder = dict.csearchCompat
(
"rotation", {{"coordinateRotation", -1806}},
false, false
);
if (finder.isDict())
{
spec_ = coordinateRotation::New(finder.dict());
}
else
{
// Fall through to expecting e1/e2/e3 specification in the dictionary
spec_.reset(new coordinateRotations::axes(dict));
}
rot_ = spec_->R();
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::coordinateSystem::coordinateSystem(std::nullptr_t)
:
spec_(),
origin_(Zero),
rot_(sphericalTensor::I),
name_(),
note_()
{}
Foam::coordinateSystem::coordinateSystem() Foam::coordinateSystem::coordinateSystem()
: :
name_(), spec_(new coordinateRotations::identity()),
note_(),
origin_(Zero), origin_(Zero),
R_(new axesRotation(sphericalTensor::I)) rot_(sphericalTensor::I),
name_(),
note_()
{} {}
Foam::coordinateSystem::coordinateSystem(const coordinateSystem& cs) Foam::coordinateSystem::coordinateSystem(const coordinateRotation& crot)
: :
name_(cs.name_), coordinateSystem(word::null, point::zero, crot)
note_(cs.note_),
origin_(cs.origin_),
R_(cs.R_.clone())
{} {}
Foam::coordinateSystem::coordinateSystem(coordinateSystem&& cs) Foam::coordinateSystem::coordinateSystem(coordinateRotation&& crot)
: :
name_(std::move(cs.name_)), coordinateSystem(word::null, point::zero, std::move(crot))
note_(std::move(cs.note_)),
origin_(std::move(cs.origin_)),
R_(std::move(cs.R_))
{} {}
Foam::coordinateSystem::coordinateSystem(const coordinateSystem& csys)
:
spec_(csys.spec_.clone()),
origin_(csys.origin_),
rot_(csys.rot_),
name_(csys.name_),
note_(csys.note_)
{}
Foam::coordinateSystem::coordinateSystem(coordinateSystem&& csys)
:
spec_(std::move(csys.spec_)),
origin_(std::move(csys.origin_)),
rot_(std::move(csys.rot_)),
name_(std::move(csys.name_)),
note_(std::move(csys.note_))
{}
Foam::coordinateSystem::coordinateSystem(autoPtr<coordinateSystem>&& csys)
:
coordinateSystem(nullptr)
{
if (csys)
{
// Has valid autoPtr - move.
coordinateSystem::operator=(std::move(*csys));
csys.clear();
}
else
{
// No valid autoPtr - treat like identity
spec_.reset(new coordinateRotations::identity());
}
}
Foam::coordinateSystem::coordinateSystem Foam::coordinateSystem::coordinateSystem
( (
const word& name, const word& name,
const coordinateSystem& cs const coordinateSystem& csys
) )
: :
spec_(csys.spec_.clone()),
origin_(csys.origin_),
rot_(csys.rot_),
name_(name), name_(name),
note_(cs.note_), note_(csys.note_)
origin_(cs.origin_), {}
R_(cs.R_.clone())
Foam::coordinateSystem::coordinateSystem
(
const point& origin,
const coordinateRotation& crot
)
:
coordinateSystem(word::null, origin, crot)
{} {}
@ -83,13 +195,25 @@ Foam::coordinateSystem::coordinateSystem
( (
const word& name, const word& name,
const point& origin, const point& origin,
const coordinateRotation& cr const coordinateRotation& crot
) )
: :
name_(name), spec_(crot.clone()),
note_(),
origin_(origin), origin_(origin),
R_(cr.clone()) rot_(spec_->R()),
name_(name),
note_()
{}
Foam::coordinateSystem::coordinateSystem
(
const point& origin,
const vector& axis,
const vector& dirn
)
:
coordinateSystem(word::null, origin, axis, dirn)
{} {}
@ -101,10 +225,11 @@ Foam::coordinateSystem::coordinateSystem
const vector& dirn const vector& dirn
) )
: :
name_(name), spec_(new coordinateRotations::axes(axis, dirn)),
note_(),
origin_(origin), origin_(origin),
R_(new axesRotation(axis, dirn)) rot_(spec_->R()),
name_(name),
note_()
{} {}
@ -114,119 +239,91 @@ Foam::coordinateSystem::coordinateSystem
const dictionary& dict const dictionary& dict
) )
: :
name_(name), spec_(nullptr),
note_(),
origin_(Zero), origin_(Zero),
R_() rot_(sphericalTensor::I),
name_(name),
note_()
{ {
init(dict); assign(dict);
} }
Foam::coordinateSystem::coordinateSystem(const dictionary& dict) Foam::coordinateSystem::coordinateSystem(const dictionary& dict)
: :
name_(), coordinateSystem(word::null, dict)
note_(), {}
origin_(Zero),
R_()
{
init(dict);
}
Foam::coordinateSystem::coordinateSystem Foam::coordinateSystem::coordinateSystem
( (
const objectRegistry& obr, const dictionary& dict,
const dictionary& dict const word& dictName
) )
: :
name_(), coordinateSystem(nullptr)
note_(),
origin_(Zero),
R_()
{ {
const entry* entryPtr = dict.lookupEntryPtr(typeName_(), false, false); if (dictName.size())
if (!entryPtr)
{ {
// No 'coordinateSystem' entry assign(dict.subDict(dictName));
init(dict, obr);
}
else if (entryPtr->isDict())
{
// 'coordinateSystem' as dictionary entry - use it
init(entryPtr->dict(), obr);
} }
else else
{ {
// 'coordinateSystem' as non-dictionary entry assign(dict);
// - this is a lookup into global coordinateSystems
keyType key(entryPtr->stream());
const coordinateSystems& lst = coordinateSystems::New(obr);
const label index = lst.findIndex(key);
if (debug)
{
InfoInFunction
<< "Using global coordinate system: "
<< key << "=" << index << endl;
} }
if (index < 0)
{
FatalErrorInFunction
<< "could not find coordinate system: " << key << nl
<< "available coordinate systems: " << lst.toc() << nl << nl
<< exit(FatalError);
}
// Copy from coordinateSystem, but assign the name as the typeName
// to avoid strange things in writeDict()
operator=(lst[index]);
name_ = typeName_();
}
}
Foam::coordinateSystem::coordinateSystem(Istream& is)
:
name_(is),
note_(),
origin_(Zero),
R_()
{
dictionary dict(is);
init(dict);
} }
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::dictionary Foam::coordinateSystem::dict(bool ignoreType) const void Foam::coordinateSystem::clear()
{ {
dictionary dict; spec_->clear();
origin_ = Zero;
rot_ = sphericalTensor::I;
note_.clear();
}
dict.add("name", name_);
// Only write type for derived types Foam::tensor Foam::coordinateSystem::R(const point& global) const
if (!ignoreType && type() != typeName_()) {
{ return rot_;
dict.add("type", type()); }
}
// The note entry is optional
if (note_.size())
{
dict.add("note", note_);
}
dict.add("origin", origin_); Foam::tmp<Foam::tensorField> Foam::coordinateSystem::R
dict.add("e1", R_->e1()); (
dict.add("e3", R_->e3()); const UList<point>& global
) const
{
return rotationsImpl(global);
}
return dict;
Foam::tmp<Foam::tensorField> Foam::coordinateSystem::R
(
const pointUIndList& global
) const
{
return rotationsImpl(global);
}
Foam::point Foam::coordinateSystem::transformPoint
(
const point& localCart
) const
{
return Foam::transform(rot_, localCart) + origin_;
}
Foam::point Foam::coordinateSystem::invTransformPoint
(
const point& global
) const
{
return Foam::invTransform(rot_, global - origin_);
} }
@ -238,10 +335,10 @@ Foam::vector Foam::coordinateSystem::localToGlobal
{ {
if (translate) if (translate)
{ {
return (R_->transform(local)) + origin_; return this->transform(local) + origin_;
} }
return R_->transform(local); return this->transform(local);
} }
@ -253,10 +350,10 @@ Foam::tmp<Foam::vectorField> Foam::coordinateSystem::localToGlobal
{ {
if (translate) if (translate)
{ {
return (R_->transform(local)) + origin_; return this->transform(local) + origin_;
} }
return R_->transform(local); return this->transform(local);
} }
@ -268,10 +365,10 @@ Foam::vector Foam::coordinateSystem::globalToLocal
{ {
if (translate) if (translate)
{ {
return R_->invTransform(global - origin_); return this->invTransform(global - origin_);
} }
return R_->invTransform(global); return this->invTransform(global);
} }
@ -283,54 +380,74 @@ Foam::tmp<Foam::vectorField> Foam::coordinateSystem::globalToLocal
{ {
if (translate) if (translate)
{ {
return R_->invTransform(global - origin_); return this->invTransform(global - origin_);
} }
return R_->invTransform(global); return this->invTransform(global);
} }
void Foam::coordinateSystem::clear() void Foam::coordinateSystem::rotation(autoPtr<coordinateRotation>&& crot)
{ {
note_.clear(); spec_.reset(std::move(crot));
origin_ = Zero; if (spec_)
R_->clear(); {
} rot_ = spec_->R();
}
else
void Foam::coordinateSystem::transfer(coordinateSystem& cs) {
{ rot_ = sphericalTensor::I;
name_ = std::move(cs.name_); }
note_ = std::move(cs.note_);
origin_ = std::move(cs.origin_);
R_ = std::move(cs.R_);
} }
void Foam::coordinateSystem::write(Ostream& os) const void Foam::coordinateSystem::write(Ostream& os) const
{ {
os << type() << " origin: " << origin() << nl; if (!valid())
R_->write(os); {
return;
}
// Suppress output of type for Cartesian
if (!isCartesian(type()))
{
os << type() << ' ';
}
os << "origin: " << origin_ << ' ';
spec_->write(os);
} }
void Foam::coordinateSystem::writeDict(Ostream& os, bool subDict) const void Foam::coordinateSystem::writeEntry(const word& keyword, Ostream& os) const
{ {
if (subDict) if (!valid())
{ {
os.beginBlock(name_); return;
} }
os.writeEntry("type", type()); const bool subDict = !keyword.empty();
if (subDict)
{
os.beginBlock(keyword);
// Suppress output of type for Cartesian
if (!isCartesian(type()))
{
os.writeEntry<word>("type", type());
}
if (note_.size()) if (note_.size())
{ {
// The 'note' is optional // The 'note' is optional
os.writeEntry("note", note_); os.writeEntry("note", note_);
} }
}
os.writeEntry("origin", origin_); os.writeEntry("origin", origin_);
R_->write(os);
spec_->writeEntry("rotation", os);
if (subDict) if (subDict)
{ {
@ -341,71 +458,64 @@ void Foam::coordinateSystem::writeDict(Ostream& os, bool subDict) const
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
void Foam::coordinateSystem::operator=(const coordinateSystem& cs) void Foam::coordinateSystem::operator=(const coordinateSystem& csys)
{ {
name_ = cs.name_; name_ = csys.name_;
note_ = cs.note_; note_ = csys.note_;
origin_ = cs.origin_; origin_ = csys.origin_;
// Some extra safety // Some extra safety
if (cs.R_.valid()) if (csys.spec_)
{ {
R_ = cs.R_.clone(); rotation(csys.spec_.clone());
} }
else else
{ {
R_.reset(new axesRotation(sphericalTensor::I)); spec_.reset(new coordinateRotations::identity());
rot_ = sphericalTensor::I;
} }
} }
void Foam::coordinateSystem::operator=(coordinateSystem&& cs)
void Foam::coordinateSystem::operator=(coordinateSystem&& csys)
{ {
transfer(cs); name_ = std::move(csys.name_);
note_ = std::move(csys.note_);
spec_ = std::move(csys.spec_);
origin_ = csys.origin_;
rot_ = csys.rot_;
} }
void Foam::coordinateSystem::init(const dictionary& dict) void Foam::coordinateSystem::operator=(const autoPtr<coordinateSystem>& csys)
{ {
dict.readEntry("origin", origin_); coordinateSystem::operator=(*csys);
note_.clear();
dict.readIfPresent("note", note_);
R_ = coordinateRotation::New(dict.subDict("coordinateRotation"));
} }
void Foam::coordinateSystem::init void Foam::coordinateSystem::operator=(autoPtr<coordinateSystem>&& csys)
(
const dictionary& dict,
const objectRegistry& obr
)
{ {
dict.readEntry("origin", origin_); coordinateSystem::operator=(std::move(*csys));
csys.clear();
// The 'note' entry is optional
note_.clear();
dict.readIfPresent("note", note_);
R_ = coordinateRotation::New(dict.subDict("coordinateRotation"), obr);
} }
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * //
bool Foam::operator!=(const coordinateSystem& a, const coordinateSystem& b) bool Foam::operator!=(const coordinateSystem& a, const coordinateSystem& b)
{ {
return return
( (
a.origin() != b.origin() a.type() != b.type()
|| a.type() != b.type() || a.origin() != b.origin()
|| a.R().R() != b.R().R() || a.R() != b.R()
); );
} }
// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // Foam::Ostream& Foam::operator<<(Ostream& os, const coordinateSystem& csys)
Foam::Ostream& Foam::operator<<(Ostream& os, const coordinateSystem& cs)
{ {
cs.write(os); csys.write(os);
os.check(FUNCTION_NAME); os.check(FUNCTION_NAME);
return os; return os;
} }

Some files were not shown because too many files have changed in this diff Show More