source: issm/trunk/src/m/classes/mesh2dvertical.py

Last change on this file was 28013, checked in by Mathieu Morlighem, 17 months ago

merged trunk-jpl and trunk for revision 28011

File size: 7.6 KB
Line 
1import numpy as np
2from fielddisplay import fielddisplay
3from checkfield import checkfield
4import MatlabFuncs as m
5from WriteData import WriteData
6
7
8class mesh2dvertical(object):
9 """
10 MESH2DVERTICAL class definition
11
12 Usage:
13 mesh2dvertical = mesh2dvertical()
14 """
15
16 def __init__(self): # {{{
17 self.x = float('NaN')
18 self.y = float('NaN')
19 self.elements = float('NaN')
20 self.numberofelements = 0
21 self.numberofvertices = 0
22 self.numberofedges = 0
23
24 self.lat = float('NaN')
25 self.long = float('NaN')
26 self.epsg = float('NaN')
27 self.scale_factor = float('NaN')
28
29 self.vertexonboundary = float('NaN')
30 self.vertexonbase = float('NaN')
31 self.vertexonsurface = float('NaN')
32
33 self.edges = float('NaN')
34 self.segments = float('NaN')
35 self.segmentmarkers = float('NaN')
36 self.vertexconnectivity = float('NaN')
37 self.elementconnectivity = float('NaN')
38 self.average_vertex_connectivity = 0
39
40 #set defaults
41 self.setdefaultparameters()
42
43 # }}}
44 def __repr__(self): # {{{
45 string = " 2D tria Mesh (vertical):"
46
47 string = "%s\n%s" % (string, "\n Elements and vertices:")
48 string = "%s\n%s" % (string, fielddisplay(self, "numberofelements", "number of elements"))
49 string = "%s\n%s" % (string, fielddisplay(self, "numberofvertices", "number of vertices"))
50 string = "%s\n%s" % (string, fielddisplay(self, "elements", "vertex indices of the mesh elements"))
51 string = "%s\n%s" % (string, fielddisplay(self, "x", "vertices x coordinate [m]"))
52 string = "%s\n%s" % (string, fielddisplay(self, "y", "vertices y coordinate [m]"))
53 string = "%s\n%s" % (string, fielddisplay(self, "edges", "edges of the 2d mesh (vertex1 vertex2 element1 element2)"))
54 string = "%s\n%s" % (string, fielddisplay(self, "numberofedges", "number of edges of the 2d mesh"))
55
56 string = "%s%s" % (string, "\n\n Properties:")
57 string = "%s\n%s" % (string, fielddisplay(self, "vertexonboundary", "vertices on the boundary of the domain flag list"))
58 string = "%s\n%s" % (string, fielddisplay(self, 'vertexonbase', 'vertices on the bed of the domain flag list'))
59 string = "%s\n%s" % (string, fielddisplay(self, 'vertexonsurface', 'vertices on the surface of the domain flag list'))
60 string = "%s\n%s" % (string, fielddisplay(self, "segments", "edges on domain boundary (vertex1 vertex2 element)"))
61 string = "%s\n%s" % (string, fielddisplay(self, "segmentmarkers", "number associated to each segment"))
62 string = "%s\n%s" % (string, fielddisplay(self, "vertexconnectivity", "list of elements connected to vertex_i"))
63 string = "%s\n%s" % (string, fielddisplay(self, "elementconnectivity", "list of elements adjacent to element_i"))
64 string = "%s\n%s" % (string, fielddisplay(self, "average_vertex_connectivity", "average number of vertices connected to one vertex"))
65
66 string = "%s%s" % (string, "\n\n Projection:")
67 string = "%s\n%s" % (string, fielddisplay(self, "lat", "vertices latitude [degrees]"))
68 string = "%s\n%s" % (string, fielddisplay(self, "long", "vertices longitude [degrees]"))
69 string = "%s\n%s" % (string, fielddisplay(self, "epsg", "EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)"))
70 string = "%s\n%s" % (string, fielddisplay(self, "scale_factor", "Projection correction for volume, area, etc. computation"))
71 return string
72 # }}}
73
74 def setdefaultparameters(self): # {{{
75 #the connectivity is the averaged number of nodes linked to a
76 #given node through an edge. This connectivity is used to initially
77 #allocate memory to the stiffness matrix. A value of 16 seems to
78 #give a good memory / time ration. This value can be checked in
79 #trunk / test / Miscellaneous / runme.m
80 self.average_vertex_connectivity = 25.
81
82 return self
83 # }}}
84
85 def checkconsistency(self, md, solution, analyses): # {{{
86 if(solution == 'LoveSolution'):
87 return
88
89 md = checkfield(md, 'fieldname', 'mesh.x', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices])
90 md = checkfield(md, 'fieldname', 'mesh.y', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices])
91 md = checkfield(md, 'fieldname', 'mesh.elements', 'NaN', 1, 'Inf', 1, '>', 0, 'values', np.arange(1, md.mesh.numberofvertices + 1))
92 md = checkfield(md, 'fieldname', 'mesh.elements', 'size', [md.mesh.numberofelements, 3])
93 if np.any(np.logical_not(m.ismember(np.arange(1, md.mesh.numberofvertices + 1), md.mesh.elements))):
94 md.checkmessage("orphan nodes have been found. Check the mesh outline")
95 md = checkfield(md, 'fieldname', 'mesh.numberofelements', '>', 0)
96 md = checkfield(md, 'fieldname', 'mesh.numberofvertices', '>', 0)
97 md = checkfield(md, 'fieldname', 'mesh.vertexonbase', 'size', [md.mesh.numberofvertices], 'values', [0, 1])
98 md = checkfield(md, 'fieldname', 'mesh.vertexonsurface', 'size', [md.mesh.numberofvertices], 'values', [0, 1])
99 md = checkfield(md, 'fieldname', 'mesh.average_vertex_connectivity', '>=', 9, 'message', "'mesh.average_vertex_connectivity' should be at least 9 in 2d")
100 if(np.size(self.scale_factor) > 1):
101 md = checkfield(md, 'fieldname', 'mesh.scale_factor', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices])
102
103 if solution == 'ThermalSolution':
104 md.checkmessage("thermal not supported for 2d mesh")
105
106 return md
107 # }}}
108
109 def domaintype(self): # {{{
110 return "2Dvertical"
111 # }}}
112
113 def dimension(self): # {{{
114 return 2
115 # }}}
116
117 def elementtype(self): # {{{
118 return "Tria"
119 # }}}
120
121 def vertexflags(self, value): # {{{
122 flags = np.zeros((self.numberofvertices, ))
123 pos = self.segments[np.where(self.segmentmarkers == value), 0:2] - 1
124 flags[pos] = 1
125 return flags
126 # }}}
127
128 def marshall(self, prefix, md, fid): # {{{
129 WriteData(fid, prefix, 'name', 'md.mesh.domain_type', 'data', "Domain" + self.domaintype(), 'format', 'String')
130 WriteData(fid, prefix, 'name', 'md.mesh.domain_dimension', 'data', self.dimension(), 'format', 'Integer')
131 WriteData(fid, prefix, 'name', 'md.mesh.elementtype', 'data', self.elementtype(), 'format', 'String')
132 WriteData(fid, prefix, 'object', self, 'class', 'mesh', 'fieldname', 'x', 'format', 'DoubleMat', 'mattype', 1)
133 WriteData(fid, prefix, 'object', self, 'class', 'mesh', 'fieldname', 'y', 'format', 'DoubleMat', 'mattype', 1)
134 WriteData(fid, prefix, 'name', 'md.mesh.z', 'data', np.zeros(self.numberofvertices), 'format', 'DoubleMat', 'mattype', 1)
135 WriteData(fid, prefix, 'object', self, 'class', 'mesh', 'fieldname', 'elements', 'format', 'DoubleMat', 'mattype', 2)
136 WriteData(fid, prefix, 'object', self, 'class', 'mesh', 'fieldname', 'numberofelements', 'format', 'Integer')
137 WriteData(fid, prefix, 'object', self, 'class', 'mesh', 'fieldname', 'numberofvertices', 'format', 'Integer')
138 WriteData(fid, prefix, 'object', self, 'class', 'mesh', 'fieldname', 'vertexonbase', 'format', 'BooleanMat', 'mattype', 1)
139 WriteData(fid, prefix, 'object', self, 'class', 'mesh', 'fieldname', 'vertexonsurface', 'format', 'BooleanMat', 'mattype', 1)
140 WriteData(fid, prefix, 'object', self, 'class', 'mesh', 'fieldname', 'average_vertex_connectivity', 'format', 'Integer')
141 WriteData(fid, prefix, 'object', self, 'class', 'mesh', 'fieldname', 'scale_factor', 'format', 'DoubleMat', 'mattype', 1)
142 # }}}
Note: See TracBrowser for help on using the repository browser.