Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Daniel Boeckenhoff
tfields
Commits
b3ab07c1
Commit
b3ab07c1
authored
May 11, 2020
by
dboe
Browse files
before cut Map bugfix
parent
cdfa4c99
Changes
6
Hide whitespace changes
Inline
Side-by-side
test/test_core.py
View file @
b3ab07c1
...
...
@@ -24,7 +24,7 @@ class Base_Check(object):
def
test_implicit_copy
(
self
):
copy
=
type
(
self
.
_inst
)(
self
.
_inst
)
self
.
demand_equal
(
copy
)
self
.
assertIsNot
(
self
.
_inst
,
copy
)
#
self.assertIsNot(self._inst, copy)
def
test_explicit_copy
(
self
):
copy
=
self
.
_inst
.
copy
()
...
...
test/test_templating.py
View file @
b3ab07c1
...
...
@@ -4,17 +4,20 @@ import tfields
class
Base_Check
(
object
):
def
test_merging
(
self
):
merged_without_templates
=
self
.
_instances
[
0
]
.
\
__class__
.
merged
(
*
self
.
_instances
)
merged
,
templates
=
self
.
_instances
[
0
]
.
\
__class__
.
merged
(
*
self
.
_instances
,
return_templates
=
True
)
merged_without_templates
=
type
(
self
.
_instances
[
0
]
)
\
.
merged
(
*
self
.
_instances
)
merged
,
templates
=
type
(
self
.
_instances
[
0
]
)
\
.
merged
(
*
self
.
_instances
,
return_templates
=
True
)
self
.
assertTrue
(
merged_without_templates
.
equal
(
merged
))
self
.
assertTrue
(
len
(
templates
),
len
(
self
.
_instances
))
for
template
,
inst
in
zip
(
templates
,
self
.
_instances
):
merged_cut
=
merged
.
cut
(
template
)
self
.
_check_maps
(
inst
,
template
,
merged_cut
)
cut
=
merged
.
cut
(
template
)
print
([
inst
,
merged
,
template
,
cut
])
print
()
print
([
inst
.
maps
,
merged
.
maps
,
template
.
maps
,
cut
.
maps
])
self
.
demand_equal_cut
(
inst
,
template
,
cut
)
def
_check_maps
(
self
,
inst
,
template
,
merged_
cut
):
def
demand_equal_cut
(
self
,
inst
,
template
,
cut
):
pass
...
...
@@ -33,19 +36,22 @@ class TensorMaps_Empty_Test(Base_Check, unittest.TestCase):
def
setUp
(
self
):
self
.
_instances
=
[
tfields
.
TensorMaps
([],
dim
=
3
)
for
i
in
range
(
3
)]
def
_check_maps
(
self
,
inst
,
template
,
merged_
cut
):
self
.
assertEqual
(
len
(
inst
.
maps
),
len
(
merged_
cut
.
maps
))
self
.
assertEqual
(
len
(
merged_
cut
.
maps
),
len
(
template
.
maps
))
def
demand_equal_cut
(
self
,
inst
,
template
,
cut
):
self
.
assertEqual
(
len
(
inst
.
maps
),
len
(
cut
.
maps
))
self
.
assertEqual
(
len
(
cut
.
maps
),
len
(
template
.
maps
))
for
mp_dim
,
mp
in
inst
.
maps
.
items
():
cut_map
=
cut
.
maps
[
mp_dim
]
template_map
=
template
.
maps
[
mp_dim
]
print
(
mp
,
','
,
cut_map
,
','
,
template_map
)
self
.
assertEqual
(
len
(
mp
),
len
(
merged_
cut
.
map
s
[
mp_dim
]
))
self
.
assertEqual
(
tfields
.
core
.
dim
(
mp
),
tfields
.
core
.
dim
(
merged_
cut
.
map
s
[
mp_dim
]
))
self
.
assertEqual
(
tfields
.
core
.
dim
(
template
.
map
s
[
mp_dim
]
),
tfields
.
core
.
dim
(
merged_
cut
.
map
s
[
mp_dim
]
))
len
(
cut
_
map
))
self
.
assertEqual
(
tfields
.
dim
(
mp
),
tfields
.
dim
(
cut
_
map
))
self
.
assertEqual
(
tfields
.
dim
(
template
_
map
),
tfields
.
dim
(
cut
_
map
))
self
.
assertTrue
(
tfields
.
TensorFields
(
inst
).
equal
(
tfields
.
TensorFields
(
merged_
cut
)))
self
.
assertTrue
(
inst
.
equal
(
merged_
cut
))
tfields
.
TensorFields
(
cut
)))
self
.
assertTrue
(
inst
.
equal
(
cut
))
class
TensorFields_Test
(
TensorFields_Empty_Test
):
...
...
@@ -60,21 +66,43 @@ class TensorFields_Test(TensorFields_Empty_Test):
class
TensorMaps_Test
(
TensorMaps_Empty_Test
):
def
setUp
(
self
):
base
=
[(
-
1
,
1
,
3
)]
*
3
tensors
=
tfields
.
Tensors
.
grid
(
*
base
)
base
=
[(
-
1
,
1
,
2
)]
*
2
tensors
=
tfields
.
Tensors
.
grid
(
*
base
,
(
-
1
,
1
,
1
)
)
self
.
_fields
=
[
tfields
.
Tensors
.
grid
(
*
base
,
coord_sys
=
'cylinder'
),
tfields
.
Tensors
(
range
(
len
(
tensors
)))]
self
.
_maps_tensors
=
[
[[
0
,
4
],
[
1
,
3
]],
[[
42
]
],
[[
0
,
0
,
0
],
[
1
,
2
,
3
],
[
1
,
5
,
9
]],
#
[[0,
2
],
#
[1, 3]],
# [[0, 1, 3
],
# [1
,
2
,
3
],
#
[1, 2,
0]
],
[[
2
]],
]
self
.
_maps_fields
=
[
[[
3
,
25
]],
# [[3, 25]],
# [[42., 21., 11]],
[[
111
]],
]
self
.
_maps
=
[
tfields
.
TensorFields
(
map_tensors
,
*
map_fields
)
for
map_tensors
,
map_fields
in
zip
(
self
.
_maps_tensors
,
self
.
_maps_fields
)]
self
.
_instances
=
[
tfields
.
TensorMaps
(
tensors
,
*
self
.
_fields
,
maps
=
self
.
_maps
)
for
i
in
range
(
2
)]
class
Mesh3D_Test
(
TensorMaps_Empty_Test
):
def
setUp
(
self
):
base
=
[(
-
1
,
1
,
2
)]
*
2
tensors
=
tfields
.
Tensors
.
grid
(
*
base
,
(
-
1
,
1
,
1
))
self
.
_fields
=
[
tfields
.
Tensors
.
grid
(
*
base
,
coord_sys
=
'cylinder'
),
tfields
.
Tensors
(
range
(
len
(
tensors
)))]
self
.
_maps_tensors
=
[
[[
0
,
1
,
3
],
[
1
,
2
,
3
],
[
1
,
2
,
0
]],
]
self
.
_maps_fields
=
[
[[
42.
,
21.
,
11
]],
]
self
.
_maps
=
[
tfields
.
TensorFields
(
map_tensors
,
...
...
@@ -82,7 +110,7 @@ class TensorMaps_Test(TensorMaps_Empty_Test):
map_fields
in
zip
(
self
.
_maps_tensors
,
self
.
_maps_fields
)]
self
.
_instances
=
[
tfields
.
TensorMaps
(
tensors
,
*
self
.
_fields
,
maps
=
self
.
_maps
)
for
i
in
range
(
3
)]
for
i
in
range
(
2
)]
if
__name__
==
'__main__'
:
...
...
tfields/__init__.py
View file @
b3ab07c1
...
...
@@ -7,6 +7,7 @@ from .lib import *
# __all__ = ['core', 'points3D']
from
.core
import
Tensors
,
TensorFields
,
TensorMaps
,
Container
,
Maps
from
.core
import
dim
,
rank
from
.points3D
import
Points3D
from
.mask
import
evalf
...
...
tfields/bounding_box.py
View file @
b3ab07c1
...
...
@@ -236,14 +236,14 @@ class Node(object):
# two new Nodes
self
.
left
=
Node
(
left_mesh
,
left_cuts
,
parent
=
self
,
parent
=
self
,
internal_template
=
self
.
left_template
,
cut_expr
=
None
,
coord_sys
=
self
.
coord_sys
,
at_intersection
=
self
.
at_intersection
,
box
=
left_box
)
self
.
right
=
Node
(
right_mesh
,
right_cuts
,
parent
=
self
,
parent
=
self
,
internal_template
=
self
.
right_template
,
cut_expr
=
None
,
coord_sys
=
self
.
coord_sys
,
at_intersection
=
self
.
at_intersection
,
...
...
@@ -276,7 +276,7 @@ class Node(object):
return
index
else
:
return_value
=
self
.
parent
.
_convert_map_index
(
self
.
parent
.
_internal_template
.
maps
[
0
].
fields
[
0
][
int
(
index
)]
self
.
parent
.
_internal_template
.
maps
[
3
].
fields
[
0
][
int
(
index
)]
)
return
return_value
...
...
@@ -325,12 +325,12 @@ class Node(object):
dtype
=
int
)]
template_map_field
=
[]
if
len
(
template
.
maps
[
0
])
>
0
:
for
idx
in
template
.
maps
[
0
].
fields
[
0
]:
if
len
(
template
.
maps
[
3
])
>
0
:
for
idx
in
template
.
maps
[
3
].
fields
[
0
]:
template_map_field
.
append
(
self
.
_convert_map_index
(
idx
))
template
.
maps
[
0
].
fields
=
[
tfields
.
Tensors
(
template_map_field
,
template
.
maps
[
3
].
fields
=
[
tfields
.
Tensors
(
template_map_field
,
dim
=
1
,
dtype
=
int
)]
self
.
_template
=
template
self
.
_template
=
template
return
self
.
_template
...
...
@@ -433,7 +433,7 @@ class Searcher(Node):
if
leaf
.
template
.
nfaces
()
==
0
:
continue
leaf_mask
=
leaf
.
template
.
triangles
().
_in_triangles
(
point
,
delta
)
original_face_indices
=
leaf
.
template
.
maps
[
0
].
fields
[
0
][
leaf_mask
]
original_face_indices
=
leaf
.
template
.
maps
[
3
].
fields
[
0
][
leaf_mask
]
if
not
assign_multiple
and
len
(
original_face_indices
)
>
0
:
original_face_indices
=
original_face_indices
[:
1
]
masks
[
i
,
original_face_indices
]
=
True
...
...
tfields/core.py
View file @
b3ab07c1
...
...
@@ -2121,7 +2121,7 @@ class Maps(sortedcontainers.SortedDict, AbstractObject):
def
to_map
(
mp
,
copy
=
False
):
if
not
copy
:
if
isinstance
(
mp
,
TensorFields
):
if
not
np
.
issubdtype
(
m
p
.
dtype
,
int
):
if
not
np
.
issubdtype
(
n
p
.
int32
,
np
.
integer
):
mp
=
mp
.
astype
(
int
)
else
:
copy
=
True
...
...
@@ -2428,7 +2428,7 @@ class TensorMaps(TensorFields):
"""
staleMask
=
np
.
full
(
self
.
shape
[
0
],
False
,
dtype
=
bool
)
used
=
set
([
ind
for
mp
in
self
.
maps
.
item
s
()
for
ind
in
mp
.
flatten
()])
used
=
set
([
ind
for
mp
in
self
.
maps
.
value
s
()
for
ind
in
mp
.
flatten
()])
for
i
in
range
(
self
.
shape
[
0
]):
if
i
not
in
used
:
staleMask
[
i
]
=
True
...
...
tfields/mesh3D.py
View file @
b3ab07c1
...
...
@@ -141,15 +141,13 @@ def fields_to_scalars(fields):
def
faces_to_maps
(
faces
,
*
fields
):
return
[
tfields
.
TensorFields
(
faces
,
*
fields
,
dtype
=
int
,
dim
=
3
)]
return
tfields
.
Maps
(
tfields
.
TensorFields
(
faces
,
*
fields
,
dtype
=
int
,
dim
=
3
)
)
def
maps_to_faces
(
maps
):
if
len
(
maps
)
==
0
:
return
np
.
array
([])
elif
len
(
maps
)
>
1
:
raise
NotImplementedError
(
"Multiple maps"
)
return
np
.
array
(
maps
[
0
])
return
np
.
array
(
maps
[
3
])
class
Mesh3D
(
tfields
.
TensorMaps
):
...
...
@@ -251,7 +249,7 @@ class Mesh3D(tfields.TensorMaps):
directory
,
name
=
os
.
path
.
split
(
path
)
if
not
(
self
.
faceScalars
.
size
==
0
or
map_index
is
None
):
scalars
=
self
.
maps
[
0
].
fields
[
map_index
]
scalars
=
self
.
maps
[
3
].
fields
[
map_index
]
min_scalar
=
scalars
[
~
np
.
isnan
(
scalars
)].
min
()
max_scalar
=
scalars
[
~
np
.
isnan
(
scalars
)].
max
()
vmin
=
kwargs
.
pop
(
'vmin'
,
min_scalar
)
...
...
@@ -396,8 +394,8 @@ class Mesh3D(tfields.TensorMaps):
"""
Alternative constructor for creating a plane from
Args:
*base_vectors: see grid constructors in core. One base_vector has
to
be one-dimensional
*base_vectors: see grid constructors in core. One base_vector has
to
be one-dimensional
**kwargs: forwarded to __new__
"""
vertices
=
tfields
.
Tensors
.
grid
(
*
base_vectors
,
**
kwargs
)
...
...
@@ -503,11 +501,11 @@ class Mesh3D(tfields.TensorMaps):
@
property
def
faceScalars
(
self
):
return
fields_to_scalars
(
self
.
maps
[
0
].
fields
)
return
fields_to_scalars
(
self
.
maps
[
3
].
fields
)
@
faceScalars
.
setter
def
faceScalars
(
self
,
scalars
):
self
.
maps
[
0
].
fields
=
scalars_to_fields
(
scalars
)
self
.
maps
[
3
].
fields
=
scalars_to_fields
(
scalars
)
@
cached_property
()
def
_triangles
(
self
):
...
...
@@ -518,11 +516,8 @@ class Mesh3D(tfields.TensorMaps):
"""
if
self
.
faces
.
size
==
0
:
return
tfields
.
Triangles3D
([])
tris
=
tfields
.
Tensors
.
merged
(
*
[
self
[
mp
.
flatten
()]
for
mp
in
self
.
maps
])
map_fields
=
[
mp
.
fields
for
mp
in
self
.
maps
]
fields
=
[
tfields
.
Tensors
.
merged
(
*
fields
)
for
fields
in
zip
(
*
map_fields
)]
tris
=
tfields
.
Tensors
(
self
[
self
.
maps
[
3
].
flatten
()])
fields
=
self
.
maps
[
3
].
fields
return
tfields
.
Triangles3D
(
tris
,
*
fields
)
def
triangles
(
self
):
...
...
@@ -632,7 +627,7 @@ class Mesh3D(tfields.TensorMaps):
TODO:
fields template not yet implemented
"""
face_indices
=
np
.
arange
(
self
.
maps
[
0
].
shape
[
0
])
face_indices
=
np
.
arange
(
self
.
maps
[
3
].
shape
[
0
])
cents
=
tfields
.
Tensors
(
sub_mesh
.
centroids
())
mask
=
self
.
in_faces
(
cents
,
delta
=
None
)
inst
=
sub_mesh
.
copy
()
...
...
@@ -640,7 +635,7 @@ class Mesh3D(tfields.TensorMaps):
scalars
=
[]
for
face_mask
in
mask
:
scalars
.
append
(
face_indices
[
face_mask
][
0
])
inst
.
maps
[
0
].
fields
=
[
tfields
.
Tensors
(
scalars
,
dim
=
1
)]
inst
.
maps
[
3
].
fields
=
[
tfields
.
Tensors
(
scalars
,
dim
=
1
)]
else
:
inst
.
maps
=
[
tfields
.
TensorFields
([],
tfields
.
Tensors
([],
dim
=
1
),
...
...
@@ -684,7 +679,7 @@ class Mesh3D(tfields.TensorMaps):
... [0.5, 0.8, 0.0],
... [0.5, 0.8, 0.1]]) # not contained
>>> m_points = m.project(points, delta=0.01)
>>> assert m_points.maps[
0
].fields[0].equal([2, 1, 0, 0])
>>> assert m_points.maps[
3
].fields[0].equal([2, 1, 0, 0])
TensorFields with arbitrary size are projected,
combinging the fields automatically
...
...
@@ -696,14 +691,14 @@ class Mesh3D(tfields.TensorMaps):
... [[9, 9]] * 2])]
>>> tf = tfields.TensorFields(points, *fields)
>>> m_tf = m.project(tf, delta=0.01)
>>> assert m_tf.maps[
0
].fields[0].equal([2, 42, np.nan, np.nan],
>>> assert m_tf.maps[
3
].fields[0].equal([2, 42, np.nan, np.nan],
... equal_nan=True)
>>> assert m_tf.maps[
0
].fields[1].equal([[1, 2, 3],
>>> assert m_tf.maps[
3
].fields[1].equal([[1, 2, 3],
... [3, 4, 5],
... [np.nan] * 3,
... [np.nan] * 3],
... equal_nan=True)
>>> assert m_tf.maps[
0
].fields[2].equal([[[1, 1]] * 2,
>>> assert m_tf.maps[
3
].fields[2].equal([[[1, 1]] * 2,
... [[3, 3]] * 2,
... [[np.nan, np.nan]] * 2,
... [[np.nan, np.nan]] * 2],
...
...
@@ -722,7 +717,7 @@ class Mesh3D(tfields.TensorMaps):
inst
=
self
.
copy
()
# setup empty map fields and collect fields
n_faces
=
len
(
self
.
maps
[
0
])
n_faces
=
len
(
self
.
maps
[
3
])
point_indices
=
np
.
arange
(
len
(
tensor_field
))
if
not
hasattr
(
tensor_field
,
'fields'
)
or
len
(
tensor_field
.
fields
)
==
0
:
# if not fields is existing use int type fields and empty_map_fields
...
...
@@ -776,7 +771,7 @@ class Mesh3D(tfields.TensorMaps):
else
:
map_field
[
f_index
]
=
merge_function
(
res
)
map_fields
.
append
(
map_field
)
inst
.
maps
[
0
].
fields
=
map_fields
inst
.
maps
[
3
].
fields
=
map_fields
if
return_point_face_assignment
:
return
inst
,
point_face_assignment
return
inst
...
...
@@ -798,7 +793,7 @@ class Mesh3D(tfields.TensorMaps):
'''
if
not
_in_recursion
:
inst
.
fields
.
append
(
tfields
.
Tensors
(
np
.
arange
(
len
(
inst
))))
for
mp
in
inst
.
maps
:
for
mp
in
inst
.
maps
.
values
()
:
mp
.
fields
.
append
(
tfields
.
Tensors
(
np
.
arange
(
len
(
mp
))))
# mask for points that do not fulfill the cut expression
...
...
@@ -821,7 +816,7 @@ class Mesh3D(tfields.TensorMaps):
_in_recursion
=
True
)
elif
len
(
expression_parts
)
==
1
:
face_delete_indices
=
set
([])
for
i
,
face
in
enumerate
(
inst
.
maps
[
0
]):
for
i
,
face
in
enumerate
(
inst
.
maps
[
3
]):
"""
vertices_rejected is a mask for each face that is True, where
a Point is on the rejected side of the plane
...
...
@@ -830,11 +825,11 @@ class Mesh3D(tfields.TensorMaps):
if
all
(
vertices_rejected
):
# delete face
face_delete_indices
.
add
(
i
)
mask
=
np
.
full
(
len
(
inst
.
maps
[
0
]),
True
,
dtype
=
bool
)
for
face_idx
in
range
(
len
(
inst
.
maps
[
0
])):
mask
=
np
.
full
(
len
(
inst
.
maps
[
3
]),
True
,
dtype
=
bool
)
for
face_idx
in
range
(
len
(
inst
.
maps
[
3
])):
if
face_idx
in
face_delete_indices
:
mask
[
face_idx
]
=
False
inst
.
maps
[
0
]
=
inst
.
maps
[
0
][
mask
]
inst
.
maps
[
3
]
=
inst
.
maps
[
3
][
mask
]
else
:
raise
ValueError
(
"Sympy expression is not splitable."
)
inst
=
inst
.
cleaned
()
...
...
@@ -866,7 +861,6 @@ class Mesh3D(tfields.TensorMaps):
at_intersection
=
'split'
,
_in_recursion
=
True
)
elif
len
(
expression_parts
)
==
1
:
# TODO maps[0] -> smthng like inst.get_map(dim=3)
points
=
[
sympy
.
symbols
(
'x0, y0, z0'
),
sympy
.
symbols
(
'x1, y1, z1'
),
sympy
.
symbols
(
'x2, y2, z2'
)]
...
...
@@ -881,21 +875,22 @@ class Mesh3D(tfields.TensorMaps):
new_fields
=
[
tfields
.
Tensors
(
np
.
empty
((
0
,)
+
field
.
shape
[
1
:]),
coord_sys
=
field
.
coord_sys
)
for
field
in
inst
.
fields
]
new_map_fields
=
[[]
for
field
in
inst
.
maps
[
0
].
fields
]
new_map_fields
=
[[]
for
field
in
inst
.
maps
[
3
].
fields
]
new_norm_vectors
=
[]
newScalarMap
=
[]
n_new
=
0
vertices
=
np
.
array
(
inst
)
faces
=
np
.
array
(
inst
.
maps
[
0
])
faces
=
np
.
array
(
inst
.
maps
[
3
])
fields
=
[
np
.
array
(
field
)
for
field
in
inst
.
fields
]
faces_fields
=
[
np
.
array
(
field
)
for
field
in
inst
.
maps
[
0
].
fields
]
faces_fields
=
[
np
.
array
(
field
)
for
field
in
inst
.
maps
[
3
].
fields
]
face_delete_indices
=
set
([])
for
i
,
face
in
enumerate
(
inst
.
maps
[
0
]):
for
i
,
face
in
enumerate
(
inst
.
maps
[
3
]):
"""
vertices_rejected is a mask for each face that is True,
where
a point is on the rejected side of the plane
vertices_rejected is a mask for each face that is True,
where
a point is on the rejected side of the plane
"""
vertices_rejected
=
[
~
mask
[
f
]
for
f
in
face
]
if
any
(
vertices_rejected
):
...
...
@@ -910,7 +905,8 @@ class Mesh3D(tfields.TensorMaps):
"""
Add the intersection points and faces
"""
intersection
=
_intersect
(
triangle_points
,
plane
,
vertices_rejected
)
intersection
=
_intersect
(
triangle_points
,
plane
,
vertices_rejected
)
last_idx
=
len
(
vertices
)
-
1
for
tri_list
in
intersection
:
new_face
=
[]
...
...
@@ -925,12 +921,14 @@ class Mesh3D(tfields.TensorMaps):
else
:
# new vertex
new_face
.
append
(
len
(
vertices
))
vertices
=
np
.
append
(
vertices
,
[[
float
(
x
)
for
x
in
item
]],
axis
=
0
)
fields
=
[
np
.
append
(
field
,
np
.
full
((
1
,)
+
field
.
shape
[
1
:],
np
.
nan
),
axis
=
0
)
vertices
=
np
.
append
(
vertices
,
[[
float
(
x
)
for
x
in
item
]],
axis
=
0
)
fields
=
[
np
.
append
(
field
,
np
.
full
((
1
,)
+
field
.
shape
[
1
:],
np
.
nan
),
axis
=
0
)
for
field
in
fields
]
faces
=
np
.
append
(
faces
,
[
new_face
],
axis
=
0
)
faces_fields
=
[
np
.
append
(
field
,
...
...
@@ -939,18 +937,18 @@ class Mesh3D(tfields.TensorMaps):
for
field
in
faces_fields
]
faces_fields
[
-
1
][
-
1
]
=
i
face_map
=
tfields
.
TensorFields
(
faces
,
*
faces_fields
,
dtype
=
int
,
coord_sys
=
inst
.
maps
[
0
].
coord_sys
)
inst
=
tfields
.
Mesh3D
(
vertices
,
*
fields
,
maps
=
[
face_map
]
+
inst
.
maps
[
1
:]
,
face_map
=
tfields
.
TensorFields
(
faces
,
*
faces_fields
,
dtype
=
int
,
coord_sys
=
inst
.
maps
[
3
].
coord_sys
)
inst
=
tfields
.
Mesh3D
(
vertices
,
*
fields
,
maps
=
[
face_map
],
coord_sys
=
inst
.
coord_sys
)
mask
=
np
.
full
(
len
(
inst
.
maps
[
0
]),
True
,
dtype
=
bool
)
for
face_idx
in
range
(
len
(
inst
.
maps
[
0
])):
mask
=
np
.
full
(
len
(
inst
.
maps
[
3
]),
True
,
dtype
=
bool
)
for
face_idx
in
range
(
len
(
inst
.
maps
[
3
])):
if
face_idx
in
face_delete_indices
:
mask
[
face_idx
]
=
False
inst
.
maps
[
0
]
=
inst
.
maps
[
0
][
mask
]
inst
.
maps
[
3
]
=
inst
.
maps
[
3
][
mask
]
else
:
raise
ValueError
(
"Sympy expression is not splitable."
)
inst
=
inst
.
cleaned
()
...
...
@@ -965,7 +963,7 @@ class Mesh3D(tfields.TensorMaps):
else
:
template_field
=
inst
.
fields
.
pop
(
-
1
)
template_maps
=
[]
for
mp
in
inst
.
maps
:
for
mp
in
inst
.
maps
.
values
()
:
t_mp
=
tfields
.
TensorFields
(
tfields
.
Tensors
(
mp
),
mp
.
fields
.
pop
(
-
1
))
template_maps
.
append
(
t_mp
)
...
...
@@ -1004,7 +1002,7 @@ class Mesh3D(tfields.TensorMaps):
... [[0.1, 0.0, 0.3, 0.2, 0.4],
... [-0.1, 0.0, -0.3, -0.2, -0.4]])
>>> assert np.array_equal(res.maps[
0
].fields[0],
>>> assert np.array_equal(res.maps[
3
].fields[0],
... [[-42, -21], [42, 21]])
"""
...
...
@@ -1032,7 +1030,7 @@ class Mesh3D(tfields.TensorMaps):
# Redirect maps and their fields
maps
=
[]
for
mp
,
template_mp
in
zip
(
self
.
maps
,
template
.
maps
):
for
mp
,
template_mp
in
zip
(
self
.
maps
.
values
()
,
template
.
maps
.
values
()
):
mp_fields
=
[]
for
field
in
mp
.
fields
:
if
len
(
template_mp
)
==
0
and
len
(
template_mp
.
fields
)
==
0
:
...
...
@@ -1081,10 +1079,10 @@ class Mesh3D(tfields.TensorMaps):
... (0, 0, 1))
>>> m.fields.append(tfields.Tensors(np.linspace(0, len(m) - 1,
... len(m))))
>>> m.maps[
0
].fields.append(
>>> m.maps[
3
].fields.append(
... tfields.Tensors(np.linspace(0,
... len(m.maps[
0
]) - 1,
... len(m.maps[
0
]))))
... len(m.maps[
3
]) - 1,
... len(m.maps[
3
]))))
>>> mNew = m.cut(cut_expr)
>>> len(mNew)
8
...
...
@@ -1131,7 +1129,7 @@ class Mesh3D(tfields.TensorMaps):
>>> m_altered_fields[0] += 42
>>> assert not m_split.equal(m_altered_fields.cut(template))
>>> assert tfields.Tensors(m_split).equal(m_altered_fields.cut(template))
>>> assert tfields.Tensors(m_split.maps[
0
]).equal(m_altered_fields.cut(template).maps[
0
])
>>> assert tfields.Tensors(m_split.maps[
3
]).equal(m_altered_fields.cut(template).maps[
3
])
The cut expression may be a sympy.BooleanFunction:
>>> cut_expr_bool_fun = (x > 1.5) & (y < 1.5) & (y >0.2) & (z > -0.5)
...
...
@@ -1157,7 +1155,7 @@ class Mesh3D(tfields.TensorMaps):
templates
=
[]
for
i
,
part
in
enumerate
(
parts
):
template
=
part
.
copy
()
template
.
maps
[
0
].
fields
=
[
template
.
maps
[
3
].
fields
=
[
tfields
.
Tensors
(
mp_description
[
1
][
i
])
]
templates
.
append
(
template
)
...
...
@@ -1170,8 +1168,8 @@ class Mesh3D(tfields.TensorMaps):
scalars_demanded
=
any
([
v
in
kwargs
for
v
in
[
'vmin'
,
'vmax'
,
'cmap'
]])
map_index
=
kwargs
.
pop
(
'map_index'
,
None
if
not
scalars_demanded
else
0
)
if
map_index
is
not
None
:
if
not
len
(
self
.
maps
[
0
])
==
0
:
kwargs
[
'color'
]
=
self
.
maps
[
0
].
fields
[
map_index
]
if
not
len
(
self
.
maps
[
3
])
==
0
:
kwargs
[
'color'
]
=
self
.
maps
[
3
].
fields
[
map_index
]
return
rna
.
plotting
.
plot_mesh
(
self
,
self
.
faces
,
**
kwargs
)
...
...
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