Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Development
openfoam
Commits
2ec55a92
Commit
2ec55a92
authored
Jan 20, 2011
by
mattijs
Browse files
ENH: globalIndexAndTransform : added combining of transformIndices
parent
0c6789e5
Changes
3
Hide whitespace changes
Inline
Side-by-side
src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.C
View file @
2ec55a92
...
...
@@ -288,6 +288,19 @@ void Foam::globalIndexAndTransform::determineTransforms()
}
Pstream
::
scatter
(
transforms_
);
if
(
transforms_
.
size
()
>
3
)
{
WarningIn
(
"void globalIndexAndTransform::determineTransforms()"
)
<<
"More than three independent basic "
<<
"transforms detected:"
<<
nl
<<
transforms_
<<
nl
<<
"This is not a space filling tiling and will probably"
<<
" give problems for e.g. lagrangian tracking or interpolation"
<<
endl
;
}
}
...
...
src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.H
View file @
2ec55a92
...
...
@@ -120,6 +120,12 @@ class globalIndexAndTransform
bool
checkBothSigns
)
const
;
//- Decode transform index. Hardcoded to 3 independent transforms max.
inline
static
FixedList
<
label
,
3
>
decodeTransformIndex
(
const
label
transformIndex
);
//- Disallow default bitwise copy construct
globalIndexAndTransform
(
const
globalIndexAndTransform
&
);
...
...
@@ -159,6 +165,20 @@ public:
const
bool
isSendingSide
=
true
)
const
;
//- Combine two transformIndices
static
inline
label
mergeTransformIndex
(
const
label
transformIndex0
,
const
label
transformIndex1
);
//- Combine two transformIndices
static
inline
label
minimumTransformIndex
(
const
label
transformIndex0
,
const
label
transformIndex1
);
//- Encode index and bare index as components on own processor
inline
static
labelPair
encode
(
...
...
src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H
View file @
2ec55a92
...
...
@@ -75,6 +75,38 @@ Foam::label Foam::globalIndexAndTransform::encodeTransformIndex
}
Foam
::
FixedList
<
Foam
::
label
,
3
>
Foam
::
globalIndexAndTransform
::
decodeTransformIndex
(
const
label
transformIndex
)
{
FixedList
<
label
,
3
>
permutation
;
label
t
=
transformIndex
;
permutation
[
0
]
=
(
t
%
3
)
-
1
;
t
/=
3
;
permutation
[
1
]
=
(
t
%
3
)
-
1
;
t
/=
3
;
permutation
[
2
]
=
(
t
%
3
)
-
1
;
# ifdef FULLDEBUG
t
/=
3
;
if
(
t
!=
0
)
{
FatalErrorIn
(
"globalIndexAndTransform::decodeTransformIndex(const label)"
)
<<
"transformIndex : "
<<
transformIndex
<<
" has more than 3 fields."
<<
abort
(
FatalError
);
}
# endif
return
permutation
;
}
Foam
::
label
Foam
::
globalIndexAndTransform
::
addToTransformIndex
(
const
label
transformIndex
,
...
...
@@ -90,17 +122,7 @@ Foam::label Foam::globalIndexAndTransform::addToTransformIndex
if
(
matchTransI
>
-
1
&&
matchTransI
<
3
)
{
label
t
=
transformIndex
;
// Decode permutation as 3 integers
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Note: FixedList for speed reasons.
FixedList
<
label
,
3
>
permutation
;
permutation
[
0
]
=
(
t
%
3
)
-
1
;
t
/=
3
;
permutation
[
1
]
=
(
t
%
3
)
-
1
;
t
/=
3
;
permutation
[
2
]
=
(
t
%
3
)
-
1
;
FixedList
<
label
,
3
>
permutation
=
decodeTransformIndex
(
transformIndex
);
// Add patch transform
...
...
@@ -116,27 +138,37 @@ Foam::label Foam::globalIndexAndTransform::addToTransformIndex
// If this transform been found already by a patch?
if
(
permutation
[
matchTransI
]
!=
0
)
{
// If so, if they have opposite signs, then this is
// considered an error. They are allowed to be the
// same sign, but this only results in a single
// transform.
if
(
permutation
[
matchTransI
]
!=
sign
)
if
(
sign
==
0
)
{
// sent from patch without a transformation. Do nothing.
FatalErrorIn
(
"globalIndexAndTransform::addToTransformIndex(..)"
)
<<
"patch:"
<<
mesh_
.
boundaryMesh
()[
patchI
].
name
()
<<
" transform:"
<<
matchTransI
<<
" sign:"
<<
sign
<<
" current transforms:"
<<
permutation
<<
exit
(
FatalError
);
}
else
if
(
sign
==
permutation
[
matchTransI
])
{
FatalErrorIn
(
"Foam::label "
"Foam::globalIndexAndTransform::addToTransformIndex
\n
"
"(
\n
"
"const label transformIndex,
\n
"
"const label patchI
\n
"
"const label,
\n
"
"const label,
\n
"
"const bool
\n
"
") const
\n
"
)
<<
"More than one patch accessing the same transform "
<<
"but not of the same sign."
<<
endl
<<
"patch:"
<<
mesh_
.
boundaryMesh
()[
patchI
].
name
()
<<
" transform:"
<<
matchTransI
<<
" sign:"
<<
sign
<<
" cu
mulative
transforms:"
<<
permutation
<<
" cu
rrent
transforms:"
<<
permutation
<<
exit
(
FatalError
);
}
else
{
permutation
[
matchTransI
]
=
0
;
}
}
else
{
...
...
@@ -159,6 +191,94 @@ Foam::label Foam::globalIndexAndTransform::addToTransformIndex
}
Foam
::
label
Foam
::
globalIndexAndTransform
::
mergeTransformIndex
(
const
label
transformIndex0
,
const
label
transformIndex1
)
{
FixedList
<
label
,
3
>
permutation0
=
decodeTransformIndex
(
transformIndex0
);
FixedList
<
label
,
3
>
permutation1
=
decodeTransformIndex
(
transformIndex1
);
forAll
(
permutation0
,
i
)
{
if
(
permutation0
[
i
]
==
0
)
{
// Take over whatever sign 1 has
permutation0
[
i
]
=
permutation1
[
i
];
}
else
if
(
permutation1
[
i
]
!=
0
&&
permutation0
[
i
]
!=
permutation1
[
i
])
{
FatalErrorIn
(
"Foam::label "
"Foam::globalIndexAndTransform::addToTransformIndex
\n
"
"(
\n
"
"const label,
\n
"
"const label
\n
"
") const
\n
"
)
<<
"More than one patch accessing the same transform "
<<
"but not of the same sign."
<<
endl
<<
"Trying to combine two transforms "
<<
transformIndex0
<<
" with signs "
<<
permutation0
<<
" and "
<<
transformIndex1
<<
" with signs "
<<
permutation1
<<
exit
(
FatalError
);
}
}
return
(
permutation0
[
2
]
+
1
)
*
9
+
(
permutation0
[
1
]
+
1
)
*
3
+
(
permutation0
[
0
]
+
1
);
}
Foam
::
label
Foam
::
globalIndexAndTransform
::
minimumTransformIndex
(
const
label
transformIndex0
,
const
label
transformIndex1
)
{
FixedList
<
label
,
3
>
permutation0
=
decodeTransformIndex
(
transformIndex0
);
FixedList
<
label
,
3
>
permutation1
=
decodeTransformIndex
(
transformIndex1
);
forAll
(
permutation0
,
i
)
{
if
(
permutation0
[
i
]
==
0
)
{
// 0 wins.
}
else
if
(
permutation1
[
i
]
==
0
)
{
// 0 wins.
permutation0
[
i
]
=
permutation1
[
i
];
}
else
if
(
permutation0
[
i
]
!=
permutation1
[
i
])
{
FatalErrorIn
(
"Foam::label "
"Foam::globalIndexAndTransform::minimumTransformIndex
\n
"
"(
\n
"
"const label,
\n
"
"const label
\n
"
") const
\n
"
)
<<
"More than one patch accessing the same transform "
<<
"but not of the same sign."
<<
endl
<<
"Trying to combine two transforms "
<<
transformIndex0
<<
" with signs "
<<
permutation0
<<
" and "
<<
transformIndex1
<<
" with signs "
<<
permutation1
<<
exit
(
FatalError
);
}
}
return
(
permutation0
[
2
]
+
1
)
*
9
+
(
permutation0
[
1
]
+
1
)
*
3
+
(
permutation0
[
0
]
+
1
);
}
Foam
::
labelPair
Foam
::
globalIndexAndTransform
::
encode
(
const
label
index
,
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment