Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
dumux-repositories
dumux
Commits
7ef42f5c
Commit
7ef42f5c
authored
Apr 04, 2020
by
Timo Koch
Browse files
[test][0d3d][intersection] Write test in terms of a translation
parent
53c7d3e9
Changes
1
Hide whitespace changes
Inline
Side-by-side
test/common/geometry/test_0d3d_intersection.cc
View file @
7ef42f5c
...
...
@@ -2,94 +2,139 @@
#include <iostream>
#include <algorithm>
#include <functional>
#include <dune/common/exceptions.hh>
#include <dune/common/parallel/mpihelper.hh>
#include <dune/common/fvector.hh>
#include <dune/geometry/type.hh>
#include <dune/geometry/multilineargeometry.hh>
#include <dumux/common/math.hh>
#include <dumux/common/geometry/intersectspointgeometry.hh>
#ifndef DOXYGEN
template
<
int
dimworld
=
3
,
class
Geometry
>
template
<
class
Geometry
>
bool
testIntersection
(
const
Geometry
&
geo
,
const
Dune
::
FieldVector
<
double
,
dimworld
>
&
p
,
bool
foundExpected
=
false
)
const
typename
Geometry
::
GlobalCoordinate
&
p
,
bool
foundExpected
)
{
bool
found
=
Dumux
::
intersectsPointGeometry
(
p
,
geo
);
if
(
!
found
&&
foundExpected
)
std
::
cerr
<<
"Failed detecting intersection with "
<<
p
<<
std
::
endl
;
std
::
cerr
<<
"
Failed detecting intersection with "
<<
p
<<
std
::
endl
;
else
if
(
found
&&
foundExpected
)
std
::
cout
<<
"Found intersection with "
<<
p
<<
std
::
endl
;
std
::
cout
<<
"
Found intersection with "
<<
p
<<
std
::
endl
;
else
if
(
found
&&
!
foundExpected
)
std
::
cerr
<<
"Found false positive: intersection with "
<<
p
<<
std
::
endl
;
std
::
cerr
<<
"
Found false positive: intersection with "
<<
p
<<
std
::
endl
;
else
if
(
!
found
&&
!
foundExpected
)
std
::
cout
<<
"No intersection with "
<<
p
<<
std
::
endl
;
std
::
cout
<<
"
No intersection with "
<<
p
<<
std
::
endl
;
return
(
found
==
foundExpected
);
}
template
<
class
ctype
,
class
Transformation
>
void
runTest
(
std
::
vector
<
bool
>&
returns
,
const
Transformation
&
transform
)
{
using
Geo
=
Dune
::
MultiLinearGeometry
<
ctype
,
3
,
3
>
;
using
Points
=
std
::
vector
<
typename
Geo
::
GlobalCoordinate
>
;
// test tetrahedron-point intersections
std
::
cout
<<
"
\n
-- Test tetrahedron-point intersections"
<<
std
::
endl
;
auto
cornersTet
=
Points
({{
0.0
,
0.0
,
0.0
},
{
1.0
,
0.0
,
0.0
},
{
0.0
,
1.0
,
0.0
},
{
0.0
,
0.0
,
1.0
}});
std
::
transform
(
cornersTet
.
begin
(),
cornersTet
.
end
(),
cornersTet
.
begin
(),
[
&
transform
](
const
auto
&
p
)
{
return
transform
(
p
);
});
const
auto
tetrahedron
=
Geo
(
Dune
::
GeometryTypes
::
tetrahedron
,
cornersTet
);
for
(
const
auto
&
corner
:
cornersTet
)
returns
.
push_back
(
testIntersection
(
tetrahedron
,
corner
,
true
));
returns
.
push_back
(
testIntersection
(
tetrahedron
,
transform
({
0.0
,
0.0
,
0.5
}),
true
));
returns
.
push_back
(
testIntersection
(
tetrahedron
,
transform
({
0.25
,
0.25
,
0.5
}),
true
));
returns
.
push_back
(
testIntersection
(
tetrahedron
,
transform
({
0.5
,
0.5
,
0.5
}),
false
));
returns
.
push_back
(
testIntersection
(
tetrahedron
,
transform
({
1.01
,
0.0
,
0.0
}),
false
));
returns
.
push_back
(
testIntersection
(
tetrahedron
,
transform
({
0.5
,
0.0
,
0.51
}),
false
));
// test hexahedron-point intersections
std
::
cout
<<
"
\n
-- Test hexahedron-point intersections"
<<
std
::
endl
;
auto
cornersHex
=
Points
({{
0.0
,
0.0
,
0.0
},
{
1.0
,
0.0
,
0.0
},
{
0.0
,
1.0
,
0.0
},
{
1.0
,
1.0
,
0.0
},
{
0.0
,
0.0
,
1.0
},
{
1.0
,
0.0
,
1.0
},
{
0.0
,
1.0
,
1.0
},
{
1.0
,
1.0
,
1.0
}});
std
::
transform
(
cornersHex
.
begin
(),
cornersHex
.
end
(),
cornersHex
.
begin
(),
[
&
transform
](
const
auto
&
p
)
{
return
transform
(
p
);
});
auto
hexahedron
=
Geo
(
Dune
::
GeometryTypes
::
hexahedron
,
cornersHex
);
for
(
const
auto
&
corner
:
cornersHex
)
returns
.
push_back
(
testIntersection
(
hexahedron
,
corner
,
true
));
// test pyramid-point intersections
std
::
cout
<<
"
\n
-- Test pyramid-point intersections"
<<
std
::
endl
;
auto
cornersPyramid
=
Points
({{
0.0
,
0.0
,
0.0
},
{
1.0
,
0.0
,
0.0
},
{
0.0
,
1.0
,
0.0
},
{
1.0
,
1.0
,
0.0
},
{
0.5
,
0.5
,
1.0
}});
std
::
transform
(
cornersPyramid
.
begin
(),
cornersPyramid
.
end
(),
cornersPyramid
.
begin
(),
[
&
transform
](
const
auto
&
p
)
{
return
transform
(
p
);
});
auto
pyramid
=
Geo
(
Dune
::
GeometryTypes
::
pyramid
,
cornersPyramid
);
for
(
const
auto
&
corner
:
cornersPyramid
)
returns
.
push_back
(
testIntersection
(
pyramid
,
corner
,
true
));
// test prism-point intersections
std
::
cout
<<
"
\n
-- Test prism-point intersections"
<<
std
::
endl
;
auto
cornersPrism
=
Points
({{
0.0
,
0.0
,
0.0
},
{
1.0
,
0.0
,
0.0
},
{
0.0
,
1.0
,
0.0
},
{
0.0
,
0.0
,
1.0
},
{
1.0
,
0.0
,
1.0
},
{
0.0
,
1.0
,
1.0
}});
std
::
transform
(
cornersPrism
.
begin
(),
cornersPrism
.
end
(),
cornersPrism
.
begin
(),
[
&
transform
](
const
auto
&
p
)
{
return
transform
(
p
);
});
auto
prism
=
Geo
(
Dune
::
GeometryTypes
::
prism
,
cornersPrism
);
for
(
const
auto
&
corner
:
cornersPrism
)
returns
.
push_back
(
testIntersection
(
prism
,
corner
,
true
));
}
template
<
class
ctype
>
auto
createTransformation
(
const
ctype
scale
,
const
Dune
::
FieldVector
<
ctype
,
3
>&
translate
,
const
Dune
::
FieldVector
<
ctype
,
3
>&
rotationAxis
,
const
ctype
rotationAngle
)
{
std
::
cout
<<
"
\n\n
Created transformation with"
<<
" scaling: "
<<
scale
<<
", translation: "
<<
translate
<<
", rotationAxis: "
<<
rotationAxis
<<
", rotationAngle: "
<<
rotationAngle
<<
std
::
endl
;
const
ctype
sinAngle
=
std
::
sin
(
rotationAngle
);
const
ctype
cosAngle
=
std
::
cos
(
rotationAngle
);
return
[
=
](
Dune
::
FieldVector
<
ctype
,
3
>
p
){
p
*=
scale
;
p
+=
translate
;
auto
tp
=
p
;
tp
*=
cosAngle
;
tp
.
axpy
(
sinAngle
,
Dumux
::
crossProduct
(
rotationAxis
,
p
));
return
tp
.
axpy
((
1.0
-
cosAngle
)
*
(
rotationAxis
*
p
),
rotationAxis
);
};
}
#endif
int
main
(
int
argc
,
char
*
argv
[])
try
{
// maybe initialize mpi
Dune
::
MPIHelper
::
instance
(
argc
,
argv
);
constexpr
int
dimworld
=
3
;
// collect returns to determine exit code
std
::
vector
<
bool
>
returns
;
for
(
auto
scaling
:
{
1.0
,
1e3
,
1e12
,
1e-12
})
for
(
const
double
scaling
:
{
1.0
,
1e3
,
1e12
,
1e-12
})
{
std
::
cout
<<
"Test with scaling "
<<
scaling
<<
std
::
endl
;
using
Points
=
std
::
vector
<
Dune
::
FieldVector
<
double
,
dimworld
>>
;
using
Geo
=
Dune
::
MultiLinearGeometry
<
double
,
3
,
dimworld
>
;
// test tetrahedron-point intersections
std
::
cout
<<
"test tetrahedron-point intersections"
<<
std
::
endl
;
auto
cornersTetrahedron
=
Points
({{
0.0
,
0.0
,
0.0
},
{
1.0
*
scaling
,
0.0
,
0.0
},
{
0.0
,
1.0
*
scaling
,
0.0
},
{
0.0
,
0.0
,
1.0
*
scaling
}});
auto
tetrahedron
=
Geo
(
Dune
::
GeometryTypes
::
tetrahedron
,
cornersTetrahedron
);
returns
.
push_back
(
testIntersection
(
tetrahedron
,
{
0.0
,
0.0
,
0.0
},
true
));
returns
.
push_back
(
testIntersection
(
tetrahedron
,
{
0.0
,
0.0
,
0.5
*
scaling
},
true
));
returns
.
push_back
(
testIntersection
(
tetrahedron
,
{
0.25
*
scaling
,
0.25
*
scaling
,
0.5
*
scaling
},
true
));
returns
.
push_back
(
testIntersection
(
tetrahedron
,
{
0.5
*
scaling
,
0.5
*
scaling
,
0.5
*
scaling
}));
returns
.
push_back
(
testIntersection
(
tetrahedron
,
{
1.01
*
scaling
,
0.0
,
0.0
}));
returns
.
push_back
(
testIntersection
(
tetrahedron
,
{
0.5
*
scaling
,
0.0
,
0.51
*
scaling
}));
// test hexahedron-point intersections
std
::
cout
<<
"test hexahedron-point intersections"
<<
std
::
endl
;
auto
cornersHexahedron
=
Points
({{
0.0
,
0.0
,
0.0
},
{
1.0
*
scaling
,
0.0
,
0.0
},
{
0.0
,
1.0
*
scaling
,
0.0
},
{
1.0
*
scaling
,
1.0
*
scaling
,
0.0
},
{
0.0
,
0.0
,
1.0
*
scaling
},
{
1.0
*
scaling
,
0.0
,
1.0
*
scaling
},
{
0.0
,
1.0
*
scaling
,
1.0
*
scaling
},
{
1.0
*
scaling
,
1.0
*
scaling
,
1.0
*
scaling
}});
auto
hexahedron
=
Geo
(
Dune
::
GeometryTypes
::
hexahedron
,
cornersHexahedron
);
returns
.
push_back
(
testIntersection
(
hexahedron
,
{
0.0
,
0.0
,
0.0
},
true
));
// test pyramid-point intersections
std
::
cout
<<
"test pyramid-point intersections"
<<
std
::
endl
;
auto
cornersPyramid
=
Points
({{
0.0
,
0.0
,
0.0
},
{
1.0
*
scaling
,
0.0
,
0.0
},
{
0.0
,
1.0
*
scaling
,
0.0
},
{
1.0
*
scaling
,
1.0
*
scaling
,
0.0
},
{
0.5
*
scaling
,
0.5
*
scaling
,
1.0
*
scaling
}});
auto
pyramid
=
Geo
(
Dune
::
GeometryTypes
::
pyramid
,
cornersPyramid
);
returns
.
push_back
(
testIntersection
(
pyramid
,
{
0.0
,
0.0
,
0.0
},
true
));
// test prism-point intersections
std
::
cout
<<
"test prism-point intersections"
<<
std
::
endl
;
auto
cornersPrism
=
Points
({{
0.0
,
0.0
,
0.0
},
{
1.0
*
scaling
,
0.0
,
0.0
},
{
0.0
,
1.0
*
scaling
,
0.0
},
{
0.0
,
0.0
,
1.0
*
scaling
},
{
1.0
*
scaling
,
0.0
,
1.0
*
scaling
},
{
0.0
,
1.0
*
scaling
,
1.0
*
scaling
}});
auto
prism
=
Geo
(
Dune
::
GeometryTypes
::
prism
,
cornersPrism
);
returns
.
push_back
(
testIntersection
(
prism
,
{
0.0
,
0.0
,
0.0
},
true
));
const
auto
transform
=
createTransformation
(
scaling
,
{
0.0
,
0.0
,
0.0
},
{
1.0
,
0.0
,
0.0
},
0.0
);
runTest
<
double
>
(
returns
,
transform
);
}
// determine the exit code
if
(
std
::
any_of
(
returns
.
begin
(),
returns
.
end
(),
[](
bool
i
){
return
!
i
;
}))
if
(
std
::
any_of
(
returns
.
begin
(),
returns
.
end
(),
std
::
logical_not
<
bool
>
{
}))
return
1
;
std
::
cout
<<
"All tests passed!"
<<
std
::
endl
;
std
::
cout
<<
"
\n
++++++++++++++++++++++
\n
"
<<
"All tests passed!"
<<
"
\n
++++++++++++++++++++++"
<<
std
::
endl
;
return
0
;
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a 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