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

Last change on this file since 25836 was 25836, checked in by Mathieu Morlighem, 4 years ago

merged trunk-jpl and trunk for revision 25834

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