source: issm/trunk/src/m/classes/mesh3dsurface.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: 10.2 KB
Line 
1from MatlabFuncs import *
2from model import *
3import numpy as np
4from fielddisplay import fielddisplay
5from checkfield import checkfield
6from WriteData import WriteData
7
8
9class mesh3dsurface(object):
10 #MESH3DSURFACE class definition
11 #
12 # Usage:
13 # mesh3dsurface = mesh3dsurface();
14 def __init__(self, *args): # {{{
15 self.x = np.nan
16 self.y = np.nan
17 self.z = np.nan
18 self.elements = np.nan
19 self.numberofelements = 0
20 self.numberofvertices = 0
21 self.numberofedges = 0
22
23 self.lat = np.nan
24 self.long = np.nan
25 self.r = np.nan
26
27 self.vertexonboundary = np.nan
28 self.edges = np.nan
29 self.segments = np.nan
30 self.segmentmarkers = np.nan
31 self.vertexconnectivity = np.nan
32 self.elementconnectivity = np.nan
33 self.average_vertex_connectivity = 0
34
35 self.extractedvertices = np.nan
36 self.extractedelements = np.nan
37
38 if not len(args):
39 self.setdefaultparameters()
40 elif len(args) == 1:
41 self = mesh3dsurface()
42 arg = args[1]
43 fields = fieldnames(arg)
44 for i in range(len(fields)):
45 field = fields[i]
46 if ismember(field, properties('mesh3dsurface')):
47 self.field = arg.field
48 else:
49 raise RuntimeError('constructor not supported')
50
51 # }}}
52
53 def __repr__(self): # {{{
54 string = ' 2D tria Mesh (horizontal):'
55
56 string += '\n Elements and vertices:'
57 string = "%s\n%s" % (string, fielddisplay(self, 'numberofelements', 'number of elements'))
58 string = "%s\n%s" % (string, fielddisplay(self, 'numberofvertices', 'number of vertices'))
59 string = "%s\n%s" % (string, fielddisplay(self, 'elements', 'vertex indices of the mesh elements'))
60 string = "%s\n%s" % (string, fielddisplay(self, 'x', 'vertices x coordinate [m]'))
61 string = "%s\n%s" % (string, fielddisplay(self, 'y', 'vertices y coordinate [m]'))
62 string = "%s\n%s" % (string, fielddisplay(self, 'z', 'vertices z coordinate [m]'))
63 string = "%s\n%s" % (string, fielddisplay(self, 'lat', 'vertices latitude [degrees]'))
64 string = "%s\n%s" % (string, fielddisplay(self, 'long', 'vertices longitude [degrees]'))
65 string = "%s\n%s" % (string, fielddisplay(self, 'r', 'vertices radius [m]'))
66
67 string = "%s\n%s" % (string, fielddisplay(self, 'edges', 'edges of the 2d mesh (vertex1 vertex2 element1 element2)'))
68 string = "%s\n%s" % (string, fielddisplay(self, 'numberofedges', 'number of edges of the 2d mesh'))
69
70 string += '\n Properties:'
71 string = "%s\n%s" % (string, fielddisplay(self, 'vertexonboundary', 'vertices on the boundary of the domain flag list'))
72 string = "%s\n%s" % (string, fielddisplay(self, 'segments', 'edges on domain boundary (vertex1 vertex2 element)'))
73 string = "%s\n%s" % (string, fielddisplay(self, 'segmentmarkers', 'number associated to each segment'))
74 string = "%s\n%s" % (string, fielddisplay(self, 'vertexconnectivity', 'list of elements connected to vertex_i'))
75 string = "%s\n%s" % (string, fielddisplay(self, 'elementconnectivity', 'list of elements adjacent to element_i'))
76 string = "%s\n%s" % (string, fielddisplay(self, 'average_vertex_connectivity', 'average number of vertices connected to one vertex'))
77
78 string += '\n Extracted model():'
79 string = "%s\n%s" % (string, fielddisplay(self, 'extractedvertices', 'vertices extracted from the model()'))
80 string = "%s\n%s" % (string, fielddisplay(self, 'extractedelements', 'elements extracted from the model()'))
81
82 return string
83 # }}}
84
85 def loadobj(self): # {{{
86 # This def is directly called by matlab when a model() selfect is
87 # loaded. Update old properties here
88
89 #2014 Oct. 1st
90 if isstruct(self):
91 oldself = self
92 #Assign property values from struct
93 self = structtoobj(mesh3dsurface(), oldself)
94 if isfield(oldself, 'hemisphere'):
95 print('md.mesh.hemisphere has been automatically converted to EPSG code')
96 if strcmpi(oldself.hemisphere, 'n'):
97 self.epsg = 3413
98 else:
99 self.epsg = 3031
100 return self
101 # }}}
102
103 def setdefaultparameters(self): # {{{
104 #the connectivity is the averaged number of nodes linked to a
105 #given node through an edge. This connectivity is used to initially
106 #allocate memory to the stiffness matrix. A value of 16 seems to
107 #give a good memory / time ration. This value can be checked in
108 #trunk / test / Miscellaneous / runme.m
109 self.average_vertex_connectivity = 25
110 return self
111 # }}}
112
113 def checkconsistency(self, md, solution, analyses): # {{{
114 md = checkfield(md, 'fieldname', 'mesh.x', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices])
115 md = checkfield(md, 'fieldname', 'mesh.y', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices])
116 md = checkfield(md, 'fieldname', 'mesh.z', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices])
117 md = checkfield(md, 'fieldname', 'mesh.lat', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices])
118 md = checkfield(md, 'fieldname', 'mesh.long', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices])
119 md = checkfield(md, 'fieldname', 'mesh.r', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices])
120 md = checkfield(md, 'fieldname', 'mesh.elements', 'NaN', 1, 'Inf', 1, '>', 0, 'values', np.arange(1, md.mesh.numberofvertices + 1))
121 md = checkfield(md, 'fieldname', 'mesh.elements', 'size', [md.mesh.numberofelements, 3])
122 if np.any(np.logical_not(np.in1d(np.arange(1, md.mesh.numberofvertices + 1), md.mesh.elements.flat))):
123 md = checkmessage(md, 'orphan nodes have been found. Check the mesh outline')
124
125 md = checkfield(md, 'fieldname', 'mesh.numberofelements', '>', 0)
126 md = checkfield(md, 'fieldname', 'mesh.numberofvertices', '>', 0)
127 md = checkfield(md, 'fieldname', 'mesh.average_vertex_connectivity', '>=', 9, 'message', '"mesh.average_vertex_connectivity" should be at least 9 in 2d')
128
129 if (solution == 'ThermalSolution'):
130 md = checkmessage(md, 'thermal not supported for 2d mesh')
131
132 return md
133 # }}}
134
135 def marshall(self, prefix, md, fid): # {{{
136 WriteData(fid, prefix, 'name', 'md.mesh.domain_type', 'data', 'Domain' + self.domaintype(), 'format', 'String')
137 WriteData(fid, prefix, 'name', 'md.mesh.domain_dimension', 'data', self.dimension(), 'format', 'Integer')
138 WriteData(fid, prefix, 'name', 'md.mesh.elementtype', 'data', self.elementtype(), 'format', 'String')
139 WriteData(fid, prefix, 'object', self, 'fieldname', 'x', 'format', 'DoubleMat', 'mattype', 1)
140 WriteData(fid, prefix, 'object', self, 'fieldname', 'y', 'format', 'DoubleMat', 'mattype', 1)
141 WriteData(fid, prefix, 'object', self, 'fieldname', 'z', 'format', 'DoubleMat', 'mattype', 1)
142 WriteData(fid, prefix, 'object', self, 'fieldname', 'lat', 'format', 'DoubleMat', 'mattype', 1)
143 WriteData(fid, prefix, 'object', self, 'fieldname', 'long', 'format', 'DoubleMat', 'mattype', 1)
144 WriteData(fid, prefix, 'object', self, 'fieldname', 'r', 'format', 'DoubleMat', 'mattype', 1)
145 WriteData(fid, prefix, 'name', 'md.mesh.z', 'data', np.zeros(md.mesh.numberofvertices), 'format', 'DoubleMat', 'mattype', 1)
146 WriteData(fid, prefix, 'object', self, 'fieldname', 'elements', 'format', 'DoubleMat', 'mattype', 2)
147 WriteData(fid, prefix, 'object', self, 'fieldname', 'numberofelements', 'format', 'Integer')
148 WriteData(fid, prefix, 'object', self, 'fieldname', 'numberofvertices', 'format', 'Integer')
149 WriteData(fid, prefix, 'object', self, 'fieldname', 'average_vertex_connectivity', 'format', 'Integer')
150 WriteData(fid, prefix, 'object', self, 'fieldname', 'vertexonboundary', 'format', 'DoubleMat', 'mattype', 1)
151 # }}}
152
153 def domaintype(self): # {{{
154 return '3Dsurface'
155 # }}}
156
157 def dimension(self): # {{{
158 return 2
159 # }}}
160
161 def elementtype(self): # {{{
162 return 'Tria'
163 # }}}
164
165 def processmesh(self, options): # {{{
166 isplanet = 1
167 is2d = 0
168
169 elements = self.elements
170 x = self.x
171 y = self.y
172 z = self.z
173 return [x, y, z, elements, is2d, isplanet]
174 # }}}
175
176 def savemodeljs(self, fid, modelname): # {{{
177 fid.write(' #s.mesh = new mesh3dsurface()\n' % modelname)
178 writejs1Darray(fid, [modelname, '.mesh.x'], self.x)
179 writejs1Darray(fid, [modelname, '.mesh.y'], self.y)
180 writejs1Darray(fid, [modelname, '.mesh.z'], self.z)
181 writejs2Darray(fid, [modelname, '.mesh.elements'], self.elements)
182 writejsdouble(fid, [modelname, '.mesh.numberofelements'], self.numberofelements)
183 writejsdouble(fid, [modelname, '.mesh.numberofvertices'], self.numberofvertices)
184 writejsdouble(fid, [modelname, '.mesh.numberofedges'], self.numberofedges)
185 writejs1Darray(fid, [modelname, '.mesh.lat'], self.lat)
186 writejs1Darray(fid, [modelname, '.mesh.long'], self.long)
187 writejs1Darray(fid, [modelname, '.mesh.r'], self.r)
188 writejs1Darray(fid, [modelname, '.mesh.vertexonboundary'], self.vertexonboundary)
189 writejs2Darray(fid, [modelname, '.mesh.edges'], self.edges)
190 writejs2Darray(fid, [modelname, '.mesh.segments'], self.segments)
191 writejs2Darray(fid, [modelname, '.mesh.segmentmarkers'], self.segmentmarkers)
192 writejs2Darray(fid, [modelname, '.mesh.vertexconnectivity'], self.vertexconnectivity)
193 writejs2Darray(fid, [modelname, '.mesh.elementconnectivity'], self.elementconnectivity)
194 writejsdouble(fid, [modelname, '.mesh.average_vertex_connectivity'], self.average_vertex_connectivity)
195 writejs1Darray(fid, [modelname, '.mesh.extractedvertices'], self.extractedvertices)
196 writejs1Darray(fid, [modelname, '.mesh.extractedelements'], self.extractedelements)
197
198 # }}}
Note: See TracBrowser for help on using the repository browser.