1. 05 Oct, 2020 1 commit
• ENH: support arc edge specification with origin point · 1d08ed9b
Mark OLESEN authored
- The arc will frequently enclose an angle less than 180 degrees.
For the case, it is possible to define the arc by its endpoints
and its centre (origin) point. For example,

arc 0 1 origin (0 0 0);

When defined in the way, any discrepancy in the arc radius for the
endpoints is resolved by adjusting the origin to ensure that the

It is also possible to specify a \em flatness factor as a multiplier

arc 0 1 origin 1.1 (0 0 0);

ENH: minor code cleanup for block edges

ENH: expose point appending as polyList::concat
2. 31 Oct, 2019 1 commit
3. 06 Feb, 2019 1 commit
4. 01 Oct, 2018 1 commit
• ENH: improve, simplify, rationalize coordinate system handling (issue #863) · 6697bb47
Mark OLESEN authored
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.
5. 24 Sep, 2018 1 commit
• ENH: cylindricalCS is now in radians only (issue #863) · dcc1dc13
Mark OLESEN authored
- this provides internal consistency and allows direct use of the
coordinate angle with sin(), cos() functions.
It eliminates potential issues that could otherwise arise from
alternative user input.

Eg, in mixerFvMesh it would have previously been possible to specify
the coordinate system to use degrees or radians, but these units were
not checked when determining the tangential sweep positions.

NOTE: this may represent a breaking change if user coding has been
relying on cylindrical coordinate system in degrees.
6. 19 Sep, 2018 1 commit
7. 30 May, 2018 1 commit
8. 27 Apr, 2018 1 commit
9. 25 May, 2017 1 commit
10. 31 Oct, 2016 1 commit
• blockMesh: Added edge projection · 9a155dd0
Henry Weller authored
New functionality contributed by Mattijs Janssens:
- new edge projection: projectCurve for use with new geometry
'searchableCurve'
- new tutorial 'pipe'
- naming of vertices and blocks (see pipe tutorial). Including back
substitution for error messages.
11. 15 Oct, 2016 1 commit
12. 13 Oct, 2016 1 commit
• blockMesh: New experimental support for projecting block face point to geometric surfaces · 00920318
Henry Weller authored
For example, to mesh a sphere with a single block the geometry is defined in the
blockMeshDict as a searchableSurface:

geometry
{
sphere
{
type searchableSphere;
centre (0 0 0);
}
}

The vertices, block topology and curved edges are defined in the usual
way, for example

v 0.5773502;
mv -0.5773502;

a 0.7071067;
ma -0.7071067;

vertices
(
($mv$mv $mv) ($v $mv$mv)
( $v$v $mv) ($mv  $v$mv)
($mv$mv  $v) ($v $mv$v)
( $v$v  $v) ($mv  $v$v)
);

blocks
(
hex (0 1 2 3 4 5 6 7) (10 10 10) simpleGrading (1 1 1)
);

edges
(
arc 0 1 (0 $ma$ma)
arc 2 3 (0 $a$ma)
arc 6 7 (0 $a$a)
arc 4 5 (0 $ma$a)

arc 0 3 ($ma 0$ma)
arc 1 2 ($a 0$ma)
arc 5 6 ($a 0$a)
arc 4 7 ($ma 0$a)

arc 0 4 ($ma$ma 0)
arc 1 5 ($a$ma 0)
arc 2 6 ($a$a 0)
arc 3 7 ($ma$a 0)
);

which will produce a mesh in which the block edges conform to the sphere
but the faces of the block lie somewhere between the original cube and
the spherical surface which is a consequence of the edge-based
transfinite interpolation.

Now the projection of the block faces to the geometry specified above
can also be specified:

faces
(
project (0 4 7 3) sphere
project (2 6 5 1) sphere
project (1 5 4 0) sphere
project (3 7 6 2) sphere
project (0 3 2 1) sphere
project (4 5 6 7) sphere
);

which produces a mesh that actually conforms to the sphere.

See OpenFOAM-dev/tutorials/mesh/blockMesh/sphere

This functionality is experimental and will undergo further development
and generalization in the future to support more complex surfaces,
feature edge specification and extraction etc.  Please get involved if
you would like to see blockMesh become a more flexible block-structured
mesher.

Henry G. Weller, CFD Direct.
13. 08 Oct, 2016 1 commit
14. 14 Aug, 2011 1 commit
15. 19 Jan, 2011 1 commit
16. 14 Jan, 2011 1 commit
17. 07 Jan, 2011 1 commit
18. 05 Jan, 2011 2 commits
19. 28 Jul, 2010 1 commit
20. 12 Apr, 2010 1 commit
21. 29 Mar, 2010 1 commit
22. 14 Jan, 2010 1 commit
23. 07 Dec, 2009 1 commit
24. 29 Nov, 2009 1 commit
• Added Catmull-Rom splines to blockMesh. · 5648be03
Mark Olesen authored
- the blockMesh interface is splineEdge.H, selectable as "spline"

The first tests look fine - it works as expected for the case with
buggy polySpline reported on the forum. Should of course do some more
extensive testing.

The advantages compared to the current B-Spline implementation:

- Doesn't need a matrix solver.
- The coding resembles something that can be found in the literature.
- In contrast to the B-Spline implementation, it is fairly clear what
is actually going on. I don't even know if the B-Spline are actually
B-Spline, Beta-Splines or something else.
- Catmull-Rom splines seem to be what all the graphics people have as
their stable workhorse.

We now have 3 different names for splines in blockMesh:
- "spline" - *new* Catmull-Rom for arbitrary segments.
- "simpleSpline" - B-Spline for a single segment
- "polySpline" - B-Spline for a multiple segments

Assuming the Catmull-Rom splines continue to behave nicely, there is
no reason to keep the other (broken) B-Splines. This would help clean
up the blockMesh interface too.

Placed the older ones under legacy/ for easier identification in the
future.

TODO:
- currently no handling of non-zero end tangents
- could be extended to handle closed loops, which might be useful
for feature edges from CAD (eg, for the cvm mesher)
25. 23 Nov, 2009 1 commit
26. 07 Oct, 2009 1 commit
• blockMesh/curvedEdges misc. cleanup · 33156d98
Mark Olesen authored
- also sifted through code to find out why polySplineEdge is going wrong

It doesn't seem to be a virtual/non-virtual issue, but appears to
be an issue with how BSpline is solving for the new points.
27. 17 Sep, 2009 1 commit
• blockMesh: most mesh data are now demand-driven · 897baf81
Mark Olesen authored
- Unless the points(), cells(), patches() methods are called, the classes
should know maintain a lightweight representation for as long as possible.

- bugfix: old-code used xferMove() instead of xferCopy() when creating the
topology mesh - causing const pointField& to break if the code order was
changed

- relocate blockMesh from src/meshing -> src/mesh
28. 16 Sep, 2009 2 commits
29. 31 Dec, 2008 1 commit
30. 25 Jun, 2008 2 commits
31. 15 Apr, 2008 1 commit