Source code for issm.mesh3dsurface

from issm.MatlabFuncs import *
from issm.model import *
import numpy as np
from issm.fielddisplay import fielddisplay
from issm.checkfield import checkfield
from issm.WriteData import WriteData

[docs]class mesh3dsurface(object): #MESH3DSURFACE class definition # # Usage: # mesh3dsurface=mesh3dsurface(); def __init__(self,*args): # {{{ self.x = np.nan self.y = np.nan self.z = np.nan self.elements = np.nan self.numberofelements = 0 self.numberofvertices = 0 self.numberofedges = 0 self.lat = np.nan self.long = np.nan self.r = np.nan self.vertexonboundary = np.nan self.edges = np.nan self.segments = np.nan self.segmentmarkers = np.nan self.vertexconnectivity = np.nan self.elementconnectivity = np.nan self.average_vertex_connectivity = 0 self.extractedvertices = np.nan self.extractedelements = np.nan if not len(args): self.setdefaultparameters() elif len(args)==1: self=mesh3dsurface() arg=args[1] fields=fieldnames(arg) for i in range(len(fields)): field=fields[i] if ismember(field,properties('mesh3dsurface')): self.field=arg.field else: raise RuntimeError('constructor not supported') # }}} def __repr__(self): # {{{ string=' 2D tria Mesh (horizontal):' string+='\n Elements and vertices:' string="%s\n%s"%(string,fielddisplay(self,'numberofelements','number of elements')) string="%s\n%s"%(string,fielddisplay(self,'numberofvertices','number of vertices')) string="%s\n%s"%(string,fielddisplay(self,'elements','vertex indices of the mesh elements')) string="%s\n%s"%(string,fielddisplay(self,'x','vertices x coordinate [m]')) string="%s\n%s"%(string,fielddisplay(self,'y','vertices y coordinate [m]')) string="%s\n%s"%(string,fielddisplay(self,'z','vertices z coordinate [m]')) string="%s\n%s"%(string,fielddisplay(self,'lat','vertices latitude [degrees]')) string="%s\n%s"%(string,fielddisplay(self,'long','vertices longitude [degrees]')) string="%s\n%s"%(string,fielddisplay(self,'r','vertices radius [m]')) string="%s\n%s"%(string,fielddisplay(self,'edges','edges of the 2d mesh (vertex1 vertex2 element1 element2)')) string="%s\n%s"%(string,fielddisplay(self,'numberofedges','number of edges of the 2d mesh')) string+='\n Properties:' string="%s\n%s"%(string,fielddisplay(self,'vertexonboundary','vertices on the boundary of the domain flag list')) string="%s\n%s"%(string,fielddisplay(self,'segments','edges on domain boundary (vertex1 vertex2 element)')) string="%s\n%s"%(string,fielddisplay(self,'segmentmarkers','number associated to each segment')) string="%s\n%s"%(string,fielddisplay(self,'vertexconnectivity','list of vertices connected to vertex_i')) string="%s\n%s"%(string,fielddisplay(self,'elementconnectivity','list of vertices connected to element_i')) string="%s\n%s"%(string,fielddisplay(self,'average_vertex_connectivity','average number of vertices connected to one vertex')) string+='\n Extracted model():' string="%s\n%s"%(string,fielddisplay(self,'extractedvertices','vertices extracted from the model()')) string="%s\n%s"%(string,fielddisplay(self,'extractedelements','elements extracted from the model()')) return string # }}}
[docs] def loadobj(self): # {{{ # This def is directly called by matlab when a model() selfect is # loaded. Update old properties here #2014 Oct. 1st if isstruct(self): oldself=self #Assign property values from struct self=structtoobj(mesh3dsurface(),oldself) if isfield(oldself,'hemisphere'): print ('md.mesh.hemisphere has been automatically converted to EPSG code') if strcmpi(oldself.hemisphere,'n'): self.epsg=3413 else: self.epsg=3031 return self
# }}}
[docs] def setdefaultparameters(self): # {{{ #the connectivity is the averaged number of nodes linked to a #given node through an edge. This connectivity is used to initially #allocate memory to the stiffness matrix. A value of 16 seems to #give a good memory/time ration. This value can be checked in #trunk/test/Miscellaneous/runme.m self.average_vertex_connectivity=25 return self
# }}}
[docs] def checkconsistency(self,md,solution,analyses): # {{{ md = checkfield(md,'fieldname','mesh.x','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices]) md = checkfield(md,'fieldname','mesh.y','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices]) md = checkfield(md,'fieldname','mesh.z','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices]) md = checkfield(md,'fieldname','mesh.lat','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices]) md = checkfield(md,'fieldname','mesh.long','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices]) md = checkfield(md,'fieldname','mesh.r','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices]) md = checkfield(md,'fieldname','mesh.elements','NaN',1,'Inf',1,'>',0,'values',np.arange(1,md.mesh.numberofvertices+1)) md = checkfield(md,'fieldname','mesh.elements','size',[md.mesh.numberofelements,3]) if np.any(np.logical_not(np.in1d(np.arange(1,md.mesh.numberofvertices+1),md.mesh.elements.flat))): md = checkmessage(md,'orphan nodes have been found. Check the mesh outline') md = checkfield(md,'fieldname','mesh.numberofelements','>',0) md = checkfield(md,'fieldname','mesh.numberofvertices','>',0) md = checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',9,'message','"mesh.average_vertex_connectivity" should be at least 9 in 2d') if (solution=='ThermalSolution'): md = checkmessage(md,'thermal not supported for 2d mesh'); return md
# }}}
[docs] def marshall(self,prefix,md,fid): # {{{ WriteData(fid,prefix,'name','md.mesh.domain_type','data','Domain' + self.domaintype(),'format','String') WriteData(fid,prefix,'name','md.mesh.domain_dimension','data',self.dimension(),'format','Integer') WriteData(fid,prefix,'name','md.mesh.elementtype','data',self.elementtype(),'format','String') WriteData(fid,prefix,'object',self,'fieldname','x','format','DoubleMat','mattype',1) WriteData(fid,prefix,'object',self,'fieldname','y','format','DoubleMat','mattype',1) WriteData(fid,prefix,'object',self,'fieldname','z','format','DoubleMat','mattype',1) WriteData(fid,prefix,'object',self,'fieldname','lat','format','DoubleMat','mattype',1) WriteData(fid,prefix,'object',self,'fieldname','long','format','DoubleMat','mattype',1) WriteData(fid,prefix,'object',self,'fieldname','r','format','DoubleMat','mattype',1) WriteData(fid,prefix,'name','md.mesh.z','data',np.zeros(md.mesh.numberofvertices),'format','DoubleMat','mattype',1) WriteData(fid,prefix,'object',self,'fieldname','elements','format','DoubleMat','mattype',2) WriteData(fid,prefix,'object',self,'fieldname','numberofelements','format','Integer') WriteData(fid,prefix,'object',self,'fieldname','numberofvertices','format','Integer') WriteData(fid,prefix,'object',self,'fieldname','average_vertex_connectivity','format','Integer') WriteData(fid,prefix,'object',self,'fieldname','vertexonboundary','format','DoubleMat','mattype',1)
# }}}
[docs] def domaintype(self): # {{{ return '3Dsurface'
# }}}
[docs] def dimension(self): # {{{ return 2
# }}}
[docs] def elementtype(self): # {{{ return 'Tria'
# }}}
[docs] def processmesh(self,options): # {{{ isplanet = 1 is2d = 0 elements = self.elements x = self.x y = self.y z = self.z return [x, y, z, elements, is2d, isplanet]
# }}}
[docs] def savemodeljs(self,fid,modelname): # {{{ fid.write('#s.mesh=new mesh3dsurface()\n'%modelname) writejs1Darray(fid,[modelname, '.mesh.x'],self.x) writejs1Darray(fid,[modelname, '.mesh.y'],self.y) writejs1Darray(fid,[modelname, '.mesh.z'],self.z) writejs2Darray(fid,[modelname, '.mesh.elements'],self.elements) writejsdouble(fid,[modelname, '.mesh.numberofelements'],self.numberofelements) writejsdouble(fid,[modelname, '.mesh.numberofvertices'],self.numberofvertices) writejsdouble(fid,[modelname, '.mesh.numberofedges'],self.numberofedges) writejs1Darray(fid,[modelname, '.mesh.lat'],self.lat) writejs1Darray(fid,[modelname, '.mesh.long'],self.long) writejs1Darray(fid,[modelname, '.mesh.r'],self.r) writejs1Darray(fid,[modelname, '.mesh.vertexonboundary'],self.vertexonboundary) writejs2Darray(fid,[modelname, '.mesh.edges'],self.edges) writejs2Darray(fid,[modelname, '.mesh.segments'],self.segments) writejs2Darray(fid,[modelname, '.mesh.segmentmarkers'],self.segmentmarkers) writejs2Darray(fid,[modelname, '.mesh.vertexconnectivity'],self.vertexconnectivity) writejs2Darray(fid,[modelname, '.mesh.elementconnectivity'],self.elementconnectivity) writejsdouble(fid,[modelname, '.mesh.average_vertex_connectivity'],self.average_vertex_connectivity) writejs1Darray(fid,[modelname, '.mesh.extractedvertices'],self.extractedvertices) writejs1Darray(fid,[modelname, '.mesh.extractedelements'],self.extractedelements)
# }}}