source: issm/trunk/src/m/extrusion/project3d.py@ 24313

Last change on this file since 24313 was 24313, checked in by Mathieu Morlighem, 5 years ago

merged trunk-jpl and trunk for revision 24310

File size: 5.8 KB
Line 
1import numpy as np
2from pairoptions import pairoptions
3
4
5def project3d(md, *args):
6 """
7 PROJECT3D - vertically project a vector from 2d mesh
8
9 vertically project a vector from 2d mesh (split in noncoll and coll areas) into a 3d mesh.
10 This vector can be a node vector of size (md.mesh.numberofvertices2d, N / A) or an
11 element vector of size (md.mesh.numberofelements2d, N / A).
12 arguments:
13 'vector': 2d vector
14 'type': 'element' or 'node'.
15 options:
16 'layer' a layer number where vector should keep its values. If not specified, all layers adopt the
17 value of the 2d vector.
18 'padding': default to 0 (value adopted by other 3d layers not being projected
19
20 Examples:
21 extruded_vector = project3d(md, 'vector', vector2d, 'type', 'node', 'layer', 1, 'padding', NaN)
22 extruded_vector = project3d(md, 'vector', vector2d, 'type', 'element', 'padding', 0)
23 extruded_vector = project3d(md, 'vector', vector2d, 'type', 'node')
24 """
25
26 #some regular checks
27 if not md:
28 raise TypeError("bad usage")
29 if md.mesh.domaintype().lower() != '3d':
30 raise TypeError("input model is not 3d")
31
32 #retrieve parameters from options.
33 options = pairoptions(*args)
34 vector2d = options.getfieldvalue('vector') #mandatory
35 vectype = options.getfieldvalue('type') #mandatory
36 layer = options.getfieldvalue('layer', 0) #optional (do all layers otherwise)
37 paddingvalue = options.getfieldvalue('padding', 0) #0 by default
38
39 vector1d = False
40 if isinstance(vector2d, np.ndarray) and np.ndim(vector2d) == 1:
41 vector1d = True
42 vector2d = vector2d.reshape(-1, )
43
44 if isinstance(vector2d, (bool, int, float)) or np.size(vector2d) == 1:
45 projected_vector = vector2d
46
47 elif vectype.lower() == 'node':
48 #Initialize 3d vector
49 if np.ndim(vector2d) == 1:
50 if vector2d.shape[0] == md.mesh.numberofvertices2d:
51 projected_vector = (paddingvalue * np.ones((md.mesh.numberofvertices))).astype(vector2d.dtype)
52 elif vector2d.shape[0] == md.mesh.numberofvertices2d + 1:
53 projected_vector = (paddingvalue * np.ones((md.mesh.numberofvertices + 1))).astype(vector2d.dtype)
54 projected_vector[-1] = vector2d[-1]
55 vector2d = vector2d[:-1]
56 else:
57 raise TypeError("vector length not supported")
58 #Fill in
59 if layer == 0:
60 for i in range(md.mesh.numberoflayers):
61 projected_vector[(i * md.mesh.numberofvertices2d):((i + 1) * md.mesh.numberofvertices2d)] = vector2d
62 else:
63 projected_vector[((layer - 1) * md.mesh.numberofvertices2d):(layer * md.mesh.numberofvertices2d)] = vector2d
64 else:
65 if vector2d.shape[0] == md.mesh.numberofvertices2d:
66 projected_vector = (paddingvalue * np.ones((md.mesh.numberofvertices, np.size(vector2d, axis=1)))).astype(vector2d.dtype)
67 elif vector2d.shape[0] == md.mesh.numberofvertices2d + 1:
68 projected_vector = (paddingvalue * np.ones((md.mesh.numberofvertices + 1, np.size(vector2d, axis=1)))).astype(vector2d.dtype)
69 projected_vector[-1, :] = vector2d[-1, :]
70 vector2d = vector2d[:-1, :]
71 else:
72 raise TypeError("vector length not supported")
73 #Fill in
74 if layer == 0:
75 for i in range(md.mesh.numberoflayers):
76 projected_vector[(i * md.mesh.numberofvertices2d):((i + 1) * md.mesh.numberofvertices2d), :] = vector2d
77 else:
78 projected_vector[((layer - 1) * md.mesh.numberofvertices2d):(layer * md.mesh.numberofvertices2d), :] = vector2d
79
80 elif vectype.lower() == 'element':
81 #Initialize 3d vector
82 if np.ndim(vector2d) == 1:
83 if vector2d.shape[0] == md.mesh.numberofelements2d:
84 projected_vector = (paddingvalue * np.ones((md.mesh.numberofelements))).astype(vector2d.dtype)
85 elif vector2d.shape[0] == md.mesh.numberofelements2d + 1:
86 projected_vector = (paddingvalue * np.ones((md.mesh.numberofelements + 1))).astype(vector2d.dtype)
87 projected_vector[-1] = vector2d[-1]
88 vector2d = vector2d[:-1]
89 else:
90 raise TypeError("vector length not supported")
91 #Fill in
92 if layer == 0:
93 for i in range(md.mesh.numberoflayers - 1):
94 projected_vector[(i * md.mesh.numberofelements2d):((i + 1) * md.mesh.numberofelements2d)] = vector2d
95 else:
96 projected_vector[((layer - 1) * md.mesh.numberofelements2d):(layer * md.mesh.numberofelements2d)] = vector2d
97 else:
98 if vector2d.shape[0] == md.mesh.numberofelements2d:
99 projected_vector = (paddingvalue * np.ones((md.mesh.numberofelements, np.size(vector2d, axis=1)))).astype(vector2d.dtype)
100 elif vector2d.shape[0] == md.mesh.numberofelements2d + 1:
101 projected_vector = (paddingvalue * np.ones((md.mesh.numberofelements + 1, np.size(vector2d, axis=1)))).astype(vector2d.dtype)
102 projected_vector[-1, :] = vector2d[-1, :]
103 vector2d = vector2d[:-1, :]
104 else:
105 raise TypeError("vector length not supported")
106 #Fill in
107 if layer == 0:
108 for i in range(md.mesh.numberoflayers - 1):
109 projected_vector[(i * md.mesh.numberofelements2d):((i + 1) * md.mesh.numberofelements2d), :] = vector2d
110 else:
111 projected_vector[((layer - 1) * md.mesh.numberofelements2d):(layer * md.mesh.numberofelements2d), :] = vector2d
112
113 else:
114 raise TypeError("project3d error message: unknown projection type")
115
116 if vector1d:
117 projected_vector = projected_vector.reshape(-1, )
118
119 return projected_vector
Note: See TracBrowser for help on using the repository browser.