1 | from MatlabFuncs import *
|
---|
2 | from model import *
|
---|
3 | import numpy as np
|
---|
4 | from fielddisplay import fielddisplay
|
---|
5 | from checkfield import checkfield
|
---|
6 | from WriteData import WriteData
|
---|
7 |
|
---|
8 |
|
---|
9 | class 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 | # }}}
|
---|