Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F90756384
test_hertz.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, Nov 4, 11:42
Size
2 KB
Mime Type
text/x-python
Expires
Wed, Nov 6, 11:42 (2 d)
Engine
blob
Format
Raw Data
Handle
22130060
Attached To
rTAMAAS tamaas
test_hertz.py
View Options
# -*- coding: utf-8 -*-
#
# Copyright (©) 2016-2021 EPFL (École Polytechnique Fédérale de Lausanne),
# Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
from
__future__
import
division
,
print_function
import
numpy
as
np
from
numpy.linalg
import
norm
import
tamaas
as
tm
def
compute_perimeter
(
tractions
):
contact
=
np
.
zeros_like
(
tractions
,
np
.
bool
)
contact
[
tractions
>
0
]
=
True
# Computing clusters
clusters
=
tm
.
FloodFill
.
getClusters
(
contact
,
False
)
return
np
.
sum
([
c
.
perimeter
for
c
in
clusters
])
def
test_contact_area
(
pkr
):
"Testing contact area against Hertz solution for solids of revolution"
model
,
hertz
=
pkr
def
error
(
erzt
,
true
):
return
np
.
abs
(
erzt
-
true
)
/
true
tractions
=
model
[
'traction'
]
true_area
=
hertz
.
a
**
2
*
np
.
pi
contact_area
=
tm
.
Statistics2D
.
contact
(
tractions
)
hertz_area
=
np
.
mean
(
hertz
.
pressure
>
0
)
assert
error
(
contact_area
,
hertz_area
)
<
1e-2
assert
error
(
contact_area
,
true_area
)
<
5e-3
contact_area
=
tm
.
Statistics2D
.
contact
(
tractions
,
compute_perimeter
(
tractions
))
hertz_perimeter
=
compute_perimeter
(
hertz
.
pressure
)
hertz_area
-=
(
np
.
pi
-
1
+
np
.
log
(
2
))
/
24
\
*
hertz_perimeter
/
tractions
.
size
assert
error
(
contact_area
,
hertz_area
)
<
1e-2
assert
error
(
contact_area
,
true_area
)
<
3e-3
def
test_pressure
(
pkr
):
model
,
hertz
=
pkr
error
=
norm
(
model
[
'traction'
]
-
hertz
.
pressure
)
/
norm
(
hertz
.
pressure
)
assert
error
<
5e-3
def
test_displacement
(
pkr
):
model
,
hertz
=
pkr
error
=
norm
(
model
[
'displacement'
]
-
hertz
.
displacement
)
\
/
norm
(
hertz
.
displacement
)
assert
error
<
8e-3
Event Timeline
Log In to Comment