Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F88641522
test_dumper.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
Sat, Oct 19, 22:20
Size
5 KB
Mime Type
text/x-python
Expires
Mon, Oct 21, 22:20 (2 d)
Engine
blob
Format
Raw Data
Handle
21713819
Attached To
rTAMAAS tamaas
test_dumper.py
View Options
# -*- coding: utf-8 -*-
#
# Copyright (©) 2016-2023 EPFL (École Polytechnique Fédérale de Lausanne),
# Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides)
# Copyright (©) 2020-2023 Lucas Frérot
#
# 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
import
os
import
pytest
import
numpy
as
np
import
tamaas
as
tm
from
pathlib
import
Path
from
numpy.testing
import
assert_allclose
from
conftest
import
mtidfn
,
type_list
from
tamaas.dumpers
import
NumpyDumper
,
JSONDumper
,
FieldDumper
from
tamaas.dumpers._helper
import
directory_dump
,
step_dump
@pytest.fixture
(
scope
=
"module"
,
params
=
type_list
,
ids
=
mtidfn
)
def
model_fixture
(
request
):
dim
=
tm
.
type_traits
[
request
.
param
]
.
dimension
model
=
tm
.
ModelFactory
.
createModel
(
request
.
param
,
dim
*
[
1.
],
dim
*
[
4
])
model
.
displacement
[:]
=
3
model
.
traction
[:]
=
1
model
[
'additional'
]
=
2
*
np
.
ones
(
model
.
shape
+
[
tm
.
type_traits
[
model
.
type
]
.
components
])
return
model
class
Dumper
(
tm
.
ModelDumper
):
"""Simple numpy dumper"""
def
__init__
(
self
):
tm
.
ModelDumper
.
__init__
(
self
)
def
dump
(
self
,
model
):
np
.
savetxt
(
'tractions.txt'
,
np
.
ravel
(
model
.
traction
))
np
.
savetxt
(
'displacement.txt'
,
np
.
ravel
(
model
.
displacement
))
dumper_types
=
[
NumpyDumper
,
JSONDumper
]
try
:
from
tamaas.dumpers
import
H5Dumper
dumper_types
.
append
(
H5Dumper
)
except
ImportError
:
pass
try
:
from
tamaas.dumpers
import
UVWDumper
dumper_types
.
append
(
UVWDumper
)
except
ImportError
:
pass
try
:
from
tamaas.dumpers
import
NetCDFDumper
dumper_types
.
append
(
NetCDFDumper
)
except
ImportError
:
pass
@pytest.mark.parametrize
(
'dumper_class'
,
dumper_types
)
def
test_dumper
(
model_fixture
,
tmp_path
,
dumper_class
):
os
.
chdir
(
tmp_path
)
filename
=
'test_{}'
.
format
(
dumper_class
.
__name__
)
if
not
issubclass
(
dumper_class
,
FieldDumper
):
dumper
=
dumper_class
(
filename
)
else
:
dumper
=
dumper_class
(
filename
,
all_fields
=
True
)
filename
=
dumper
.
file_path
dumper
<<
model_fixture
# UVW does not read VTK files
try
:
if
dumper_class
is
UVWDumper
:
with
pytest
.
raises
(
NotImplementedError
):
dumper
.
read
(
filename
)
assert
Path
(
filename
)
.
is_file
()
return
except
NameError
:
pass
rmodel
=
dumper
.
read
(
filename
)
def
compare
(
model
,
reference
):
assert
model
is
not
reference
assert
model
.
type
==
reference
.
type
assert
model
.
shape
==
reference
.
shape
for
field
in
reference
:
# assert field in model
assert_allclose
(
model
[
field
],
reference
[
field
],
rtol
=
1e-15
)
compare
(
rmodel
,
model_fixture
)
# Skipping sequence read for JSON
if
dumper_class
.
__name__
==
"JSONDumper"
:
return
dumper
<<
model_fixture
count
=
0
for
rmodel
in
dumper
.
read_sequence
(
filename
.
replace
(
"0000"
,
"*"
)):
count
+=
1
compare
(
rmodel
,
model_fixture
)
assert
count
==
2
def
test_custom_dumper
(
tmp_path
):
os
.
chdir
(
tmp_path
)
model
=
tm
.
ModelFactory
.
createModel
(
tm
.
model_type
.
volume_2d
,
[
1.
,
1.
,
1.
],
[
16
,
4
,
8
])
dumper
=
Dumper
()
dumper
<<
model
tractions
=
np
.
loadtxt
(
'tractions.txt'
)
displacements
=
np
.
loadtxt
(
'displacement.txt'
)
assert_allclose
(
tractions
.
reshape
(
model
.
traction
.
shape
),
model
.
traction
,
1e-15
)
assert_allclose
(
displacements
.
reshape
(
model
.
displacement
.
shape
),
model
.
displacement
,
1e-15
)
@pytest.fixture
def
simple_model
(
scope
=
"module"
):
return
tm
.
ModelFactory
.
createModel
(
tm
.
model_type
.
basic_2d
,
[
1
,
1
],
[
1
,
1
])
def
test_directory_dump
(
simple_model
,
tmp_path
):
os
.
chdir
(
tmp_path
)
@directory_dump
(
"dummy"
)
class
Dummy
(
tm
.
ModelDumper
):
def
__init__
(
self
):
super
(
Dummy
,
self
)
.
__init__
()
def
dump
(
self
,
model
):
pass
@property
def
file_path
(
self
):
return
'dummy'
dumper
=
Dummy
()
dumper
<<
simple_model
directory
=
Path
(
'dummy'
)
assert
dumper
.
mkdir
assert
directory
.
is_dir
()
# Testing turning the behavior off
directory
.
rmdir
()
dumper
.
mkdir
=
False
dumper
<<
simple_model
assert
not
directory
.
is_dir
()
def
test_step_dump
(
simple_model
,
tmp_path
):
os
.
chdir
(
tmp_path
)
@step_dump
class
Dummy
(
FieldDumper
):
extension
=
'dummy'
def
_dump_to_file
(
self
,
file_descriptor
,
model
):
with
open
(
file_descriptor
,
'w'
):
pass
files
=
[]
dumper
=
Dummy
(
'dummy'
)
def
dump
():
files
.
append
(
dumper
.
file_path
)
dumper
<<
simple_model
dump
()
dump
()
for
file
in
files
:
assert
Path
(
file
)
.
is_file
()
Event Timeline
Log In to Comment