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
RevLine 
[21341]1import numpy as np
[25836]2
[17806]3from pairoptions import pairoptions
[13151]4
5
[24313]6def project3d(md, *args):
[25836]7 '''
[24313]8 PROJECT3D - vertically project a vector from 2d mesh
[13151]9
[25836]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).
[13151]14
[25836]15 arguments:
16 'vector': 2d vector
17 'type': 'element' or 'node'
[13151]18
[25836]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
[24313]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")
[13151]37
[24313]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
[13151]44
[25836]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
[13151]48
[25836]49 if np.size(vector2d) == 1:
[24313]50 projected_vector = vector2d
[13151]51
[24313]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")
[25836]63 #Fill in
[24313]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")
[25836]78 #Fill in
[24313]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
[13151]84
[24313]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")
[25836]96 #Fill in
[24313]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")
[25836]111 #Fill in
[24313]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
[13151]117
[24313]118 else:
119 raise TypeError("project3d error message: unknown projection type")
[13151]120
[24313]121 return projected_vector
Note: See TracBrowser for help on using the repository browser.