[22267] | 1 | import numpy as np
|
---|
| 2 | from fielddisplay import fielddisplay
|
---|
| 3 | from checkfield import checkfield
|
---|
| 4 | import MatlabFuncs as m
|
---|
| 5 | from WriteData import WriteData
|
---|
| 6 |
|
---|
| 7 | class 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')
|
---|
[22323] | 26 | self.scale_factor = float('NaN');
|
---|
[22267] | 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"))
|
---|
[23189] | 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"))
|
---|
[22267] | 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)"))
|
---|
[22323] | 69 | string="%s\n%s"%(string,fielddisplay(self,"scale_factor","Projection correction for volume, area, etc. computation"))
|
---|
[22267] | 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")
|
---|
[22329] | 98 | if(np.size(self.scale_factor)>1):
|
---|
[22323] | 99 | md = checkfield(md,'fieldname','mesh.scale_factor','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices])
|
---|
[22267] | 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')
|
---|
[22323] | 134 | WriteData(fid,prefix,'object',self,'class','mesh','fieldname','scale_factor','format','DoubleMat','mattype',1)
|
---|
[22267] | 135 | # }}}
|
---|