Source code for issm.rifts

import numpy as np
from fielddisplay import fielddisplay
from checkfield import checkfield
from WriteData import WriteData
from isnans import isnans
import MatlabFuncs as m

[docs]class rifts(object): """ RIFTS class definition Usage: rifts=rifts(); """ def __init__(self): # {{{ self.riftstruct = [] self.riftproperties = [] #set defaults self.setdefaultparameters() #}}} def __repr__(self): # {{{ string=' rifts parameters:' string="%s\n%s"%(string,fielddisplay(self,'riftstruct','structure containing all rift information (vertices coordinates, segments, type of melange, ...)')) string="%s\n%s"%(string,fielddisplay(self,'riftproperties','')) return string #}}}
[docs] def setdefaultparameters(self): # {{{ return self
#}}}
[docs] def checkconsistency(self,md,solution,analyses): # {{{ if (not self.riftstruct) or np.any(isnans(self.riftstruct)): numrifts=0 else: numrifts=len(self.riftstruct) if numrifts: if not m.strcmp(md.mesh.domaintype(),'2Dhorizontal'): md.checkmessage("models with rifts are only supported in 2d for now!") if not isinstance(self.riftstruct,list): md.checkmessage("rifts.riftstruct should be a structure!") if np.any(md.mesh.segmentmarkers>=2): #We have segments with rift markers, but no rift structure! md.checkmessage("model should be processed for rifts (run meshprocessrifts)!") for i,rift in enumerate(self.riftstruct): md = checkfield(md,'fieldname',"rifts.riftstruct[%d]['fill']" % i,'values',['Water','Air','Ice','Melange',0,1,2,3]) else: if self.riftstruct and np.any(np.logical_not(isnans(self.riftstruct))): md.checkmessage("riftstruct should be NaN since numrifts is 0!") return md
# }}}
[docs] def marshall(self,prefix,md,fid): # {{{ #Process rift info if (not self.riftstruct) or np.any(isnans(self.riftstruct)): numrifts=0 else: numrifts=len(self.riftstruct) numpairs=0 for rift in self.riftstruct: numpairs+=np.size(rift['penaltypairs'],axis=0) # Convert strings in riftstruct to hard coded numbers FillDict={'Air':0, 'Ice':1, 'Melange':2, 'Water':3} for rift in self.riftstruct: if rift['fill'] in ['Air','Ice','Melange','Water']: rift['fill'] = FillDict[rift['fill']] # 2 for nodes + 2 for elements+ 2 for normals + 1 for length + 1 for fill + 1 for friction + 1 for fraction + 1 for fractionincrement + 1 for state. data=np.zeros((numpairs,12)) count=0 for rift in self.riftstruct: numpairsforthisrift=np.size(rift['penaltypairs'],0) data[count:count+numpairsforthisrift,0:7]=rift['penaltypairs'] data[count:count+numpairsforthisrift,7]=rift['fill'] data[count:count+numpairsforthisrift,8]=rift['friction'] data[count:count+numpairsforthisrift,9]=rift['fraction'] data[count:count+numpairsforthisrift,10]=rift['fractionincrement'] data[count:count+numpairsforthisrift,11]=rift['state'].reshape(-1) count+=numpairsforthisrift WriteData(fid,prefix,'data',numrifts,'name','md.rifts.numrifts','format','Integer') WriteData(fid,prefix,'data',data,'name','md.rifts.riftstruct','format','DoubleMat','mattype',3)
# }}}