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

Last change on this file since 23189 was 23189, checked in by Mathieu Morlighem, 7 years ago

merged trunk-jpl and trunk for revision 23187

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