from Vec3D import * from math import * import sys # ---------------------------------------------------------------- # Constants # Crack Front Points FP_HAVE_NPOS = 0x00000001 FP_HAVE_KS = 0x00000002 FP_HAVE_JS = 0x00000004 FP_HAVE_TS = 0x00000008 FP_HAVE_TEMP = 0x00000010 FP_HAVE_COORD = 0x00000020 FP_HAVE_AXES = 0x00000040 FP_HAVE_KINK_ANGLE = 0x00000080 FP_HAVE_EXT = 0x00000100 FP_HAVE_NODE_ID = 0x00000200 FP_HAVE_SECT_ID = 0x00000400 FP_HAVE_GS = 0x00000800 FP_HAVE_CODS = 0x00001000 FP_HAVE_DC_POINT = 0x00002000 FP_HAVE_MODULI = 0x00004000 FP_HAVE_YS = 0x00008000 FP_HAVE_DEPTH = 0x00010000 FP_HAVE_EPJS = 0x00020000 FP_HAVE_FRAC_EXT = 0x00040000 FP_HAVE_FRAC_ANG = 0x00080000 FP_HAVE_CGM_CODE = 0x00100000 FP_HAVE_TGM_CODE = 0x00200000 # Crack Fronts CF_HAVE_ID = 0x00000001 CF_HAVE_START = 0x00000002 CF_HAVE_STOP = 0x00000004 CF_HAVE_SYM = 0x00000008 CF_HAVE_SRC_FILE = 0x00000010 CF_HAVE_EXT_MULT = 0x00000020 CF_HAVE_FITFRT = 0x00000040 CF_HAVE_OLDFIT = 0x00000080 CF_HAVE_FITEXT = 0x00000100 CF_HAVE_FITPARAMS = 0x00000200 # Crack Steps CS_HAVE_NAME = 0x00000001 CS_HAVE_USER_INDX = 0x00000002 CS_HAVE_LC_INFO = 0x00000004 CS_HAVE_EXT_TYPE = 0x00000008 CS_HAVE_EXT_CYCLES = 0x00000010 CS_HAVE_EXT_TIME = 0x00000020 CS_HAVE_EXT_FRAC = 0x00000040 CS_HAVE_EXT_STOP = 0x00000080 CS_HAVE_EXT_LEN = 0x00000100 CS_HAVE_TOT_PASS = 0x00000200 CS_HAVE_SIF_FLAGS = 0x00000400 # Growth Flags and constants CG_HAVE_START_POINT = 0x00000001 CG_HAVE_START_LEN = 0x00000002 CS_DIST_EXT = 0 CS_CYCLES_EXT = 1 CS_TIME_EXT = 2 CS_PASS_EXT = 3 CS_USER_EXT = 4 CS_QUASI_STATIC = 5 CS_MEDIAN_EXT = 6 STEP_LENGTH = 0 FULL_SCHED = 1 MAX_CYCLES = 2 MAX_TIME = 3 K_CRIT = 4 THRESHOLD = 5 MAX_DEPTH = 6 HCF_THRESH = 7 MAX_STEPS = 8 FAILED_GROWTH = 9 SIF_M_INTEGRAL = 0x00000001 SIF_DISP_CORR = 0x00000002 SIF_VCCT = 0x00000004 SIF_TYPE_MASK = 0x0000000F SIF_THERMAL_TERMS = 0x00000010 SIF_CF_TRACTIONS = 0x00000020 SIF_CF_CONTACT = 0x00000040 SIF_LARGE_ROT = 0x00000080 SIF_ELAST_PLAST = 0x00000100 SIF_INIT_STRESS = 0x00000200 SIF_INIT_STRAIN = 0x00000400 # --------------------------------------------------------------- # File iterator class FileIterator(object): def __init__(self,fd): self.fd = fd self.Last = None self.Next() def Next(self): if self.Last != None: self.buff = self.Last else: self.buff = self.fd.readline() if len(self.buff) > 0: self.split = self.buff.split() else: self.split = [] #print self.buff def Push(self): self.Last = self.buff def More(self): return len(self.split) > 0 def Len(self): return len(self.split) def Buff(self): return self.buff def __getitem__(self,indx): return self.split[indx] def __len__(self): return len(self.split) # --------------------------------------------------------------- # FractionalPart class - stores the fractional extension or angle # amounts associated with labeled load events # in a load schedule class FractionalPart: def __init__(self): self.Label = "" self.Frac = 0 def SetValues(self,label,frac): self.Label = label self.Frac = frac def SetFromString(self,in_str): ptr = in_str.Find(':') if ptr < 1: self.Label = "" self.Frac = 0 self.Label = in_str[0:ptr] self.Frac = int(in_str[ptr+1:]) / 1000.0 ; def AsString(self): return "%s:%d" % (self.Label,int(self.Frac*1000)) # --------------------------------------------------------------- # FitFrontParams class FitFrontParams: def __init__(self): self.SmoothingOpts = None self.PolyOrder = None self.Discard = [None,None] self.Extrapolate = [None,None] self.MultiPolyRatio = 5 self.MvPolyRange = 5 self.RetainNodes = False self.AutoAdjust = True self.IsPartial = False self.PartialExtTol = 0.0 # --------------------------------------------------------------- # FrontPoint class class FrontPoint: def __init__(self): self.Flags = 0 self.NPos = 0 self.Ks = None self.Gs = None self.Js = None self.Ts = None self.Temps = None self.Coord = None self.Axes = [Vec3D(1,0,0),Vec3D(0,1,0),Vec3D(0,0,1)] self.KinkAngle = 0 # in radians self.Extension = 0 self.NodeId = -1 self.SectionId = [-1,-1] self.CODs = [] self.DcPoint = None self.Moduli = [0,0] self.YieldStress = 0 self.Depth = 0 self.EPJs = None self.FracExt = None self.FracAng = None self.CyclesGrowthModelCode = "" self.TimeGrowthModelCode = "" def Clear(self): self.Flags = 0 self.Ks = None self.Js = None self.Ts = None self.Gs = None self.Temps = None self.CODs = None self.EPJs = None self.FracExt = None self.FracAng = None def GetPropDir(self): ca = cos(self.KinkAngle) sa = sin(self.KinkAngle) x = self.Axes[0][0]*ca + self.Axes[1][0]*sa y = self.Axes[0][1]*ca + self.Axes[1][1]*sa z = self.Axes[0][2]*ca + self.Axes[1][2]*sa return Vec3D(x,y,z) ; def ClearSelective(self): self.Ks = None self.Flags &= ~FP_HAVE_KS self.Gs = None self.Flags &= ~FP_HAVE_GS self.CODs = None self.Flags &= ~FP_HAVE_CODS self.Js = None self.Flags &= ~FP_HAVE_JS self.Ts = None self.Flags &= ~FP_HAVE_TS self.Temps = None self.Flags &= ~FP_HAVE_TEMP self.Flags &= ~FP_HAVE_KINK_ANGLE self.Flags &= ~FP_HAVE_EXT self.EPJs = None self.Flags &= ~FP_HAVE_EPJS self.FracExt = None self.Flags &= ~FP_HAVE_FRAC_EXT self.FracAng = None self.Flags &= ~FP_HAVE_FRAC_ANG def SetExt(self,ext): self.Extension = ext # --------------------------------------------------------------- # CrackFront class class CrackFront: def __init__(self): self.Flags = 0 self.Id = None #self.StartPoint = None #self.StopPoint = None self.Start = None self.Stop = None self.SymFlag = False self.SrcFile = None self.ExtensionMult = 1.0 self.FitFront = None self.FitOldFront = None self.FitExtens = None self.FitParams = None self.PointData = [] def Clear(self): self.PointData = [] def Len(self): return len(self.PointData.Len()) def Reverse(self): self.PointData.reverse() for pd in self.PointData: pd.NPos = 1-pd.NPos tmp = self.Start self.Start = self.Stop self.Stop = tmp if self.FitFront is not None: self.FitFront.Reverse() if self.FitOldFront is not None: self.FitOldFront.Reverse() if self.FitExtens is not None: self.FitExtens.Reverse() # --------------------------------------------------------------- # CrackStep class class CrackStep: def __init__(self): self.Flags = 0 self.Name = "" self.UserIndx = 0 self.ExtensionType = None self.ExtensionCycles = None self.ExtensionTime = None self.ExtensionFraction = None self.StopReason = None self.ExtensionLength = None self.TotalPasses = None self.SifComputationFlags = 0 self.FrontData = [] def Clear(self): self.Flags = 0 self.Name = "" self.UserIndx = 0 self.FrontData = [] # ----------------------------------------------------------------------- class LoadStepMap(object): class LoadStepCFTInfo(object): def __init__(self,int_step,ext_step,sub,anal_type,mesh,stress): self.IntStep = int_step self.ExtStep = ext_step self.Substep = sub self.AnalType = anal_type self.MeshFile = mesh self.StressFile = stress def __init__(self): self.Map = [] self.RevMap = [] #self.MaxSub = [] self.SubRange = [] self.Flags = [] self.Labels = {} self.ExtData = {} def Load(self,fr): fr.Next() if fr[0] != "LOAD_STEP_MAP": self._FormatError(fr) fr.Next() if fr[0] != "(": self._FormatError(fr) fr.Next() if fr[0] != "VERSION:" or len(fr) < 2: self._FormatError(fr) if int(fr[1]) > 1: self._VersionError(fr) fr.Next() if fr[0] == "SUB_RANGE:": if len(fr) < 2: self._FormatError(fr) num = int(fr[1]) fr.Next() if len(fr) < 3*num: self._FormatError(fr) for i in range(num): self.SubRange.append((int(fr[i*3]),int(fr[i*3+1]))) self.Flags.append(int(fr[i*3+2])) elif fr[0] != "MAX_SUB:": if len(fr) < 2: self._FormatError(fr) num = int(fr[1]) fr.Next() if len(fr) < 2*num: self._FormatError(fr) for i in range(num): self.SubRange.append((0,int(fr[i*2]))) self.Flags.append(int(fr[i*2+1])) else: self._FormatError(fr) fr.Next() while fr[0] != ")": if fr[0] == "LABELS:": if len(fr) < 2: self._FormatError(fr) lnum = int(fr[1]) for i in range(lnum): fr.Next() if len(fr) < 2: self._FormatError(fr) step_id = int(fr[0]) lab = fr[1] for j in range(2,len(fr)): lab += ' ' lab += fr[j] self.Labels[step_id] = lab elif fr[0] == "EXT_CFT:": if len(fr) < 2: self._FormatError(fr) cnum = int(fr[1]) for i in range(cnum): fr.Next() if len(fr) < 6: self._FormatError(fr) step_id = int(fr[0]) self.ExtData[step_id] = \ self.LoadStepCFTInfo(-1,int(fr[4]),int(fr[5]), fr[1],fr[2],fr[3]) else: self._FormatError(fr) fr.Next() def Save(self,out,indent): print(indent,"LOAD_STEP_MAP", file=out) print(indent,"(", file=out) print(indent,"VERSION: ",1, file=out) #print(indent,"MAX_SUB: ",len(self.MaxSub), file=out) #if len(self.MaxSub) > 0: # print(indent, end=' ', file=out) # for i in range(len(self.MaxSub)): # print(self.MaxSub[i],self.Flags[i], end=' ', file=out) # print(file=out) print(indent,"SUB_RANGE:", len(self.SubRange), file=out) if len(self.SubRange) > 0: print(indent+" ", end=' ', file=out) for i in range(len(self.SubRange)): print(self.SubRange[i][0],self.SubRange[i][1], self.Flags[i], end=' ', file=out) print(file=out) if len(self.Labels) > 0: print(indent,"LABELS:",len(self.Labels), file=out) for step_id in self.Labels: print(indent+" ",step_id,self.Labels[step_id], file=out) if len(self.ExtData) > 0: print(indent,"EXT_CFT:",len(self.ExtData), file=out) for step_id in self.ExtData: cft_info = self.ExtData[step_id] print(indent,step_id,cft_info.AnalType, \ cft_info.MeshFile,cft_info.StressFile, file=out) print(indent,")", file=out) def _FormatError(self,fr): print("Format Error:",fr.Buff(), file=sys.stderr) raise SystemExit def _VersionError(self,fr): print("Version Error:",fr.Buff(), file=sys.stderr) raise SystemExit # --------------------------------------------------------------- # EchoGrowthParams class class EchoGrowthParams: def __init__(self): self.Lines = [] def Load(self,fi): while True: fi.Next() self.Lines.append(fi.Buff()) if fi[0] == ")": break def Save(self,out): print("GROWTH_PARAMS",file=out) for line in self.Lines: print(line,end="",file=out) # --------------------------------------------------------------- # CrackGrowthData class class CrackGrowthData: def __init__(self): self.Flags = 0 self.StartPoint = None self.StartLength = None self.Steps = [] self.LoadCaseMaps = [] # ========================================================================= # FrontPointWrapper - class to manage I/O for FrontPoint structs class FrontPointWrapper: T_INT = 0 T_DOUBLE = 1 T_VEC3D = 2 T_STRING = 3 T_DBLLIST = 4 T_V3DLIST = 5 T_FPLIST = 6 T_DLLIST = 7 T_BASIS = 8 T_SHTPAIR = 9 T_DBLPAIR = 10 FlagName = 0 StringName = 1 Type = 2 Desc = ( (FP_HAVE_NPOS, "NPos", T_DOUBLE), (FP_HAVE_KS, "Ks", T_V3DLIST), (FP_HAVE_GS, "Gs", T_V3DLIST), (FP_HAVE_JS, "Js", T_DBLLIST), (FP_HAVE_TS, "Ts", T_DBLLIST), (FP_HAVE_TEMP, "Temp", T_DBLLIST), (FP_HAVE_COORD, "Coord", T_VEC3D ), (FP_HAVE_AXES, "Axes", T_BASIS ), (FP_HAVE_KINK_ANGLE,"KAng", T_DOUBLE ), (FP_HAVE_EXT, "Ext", T_DOUBLE ), (FP_HAVE_NODE_ID, "NodeId", T_INT ), (FP_HAVE_SECT_ID, "SectId", T_SHTPAIR), (FP_HAVE_CODS, "CODs", T_V3DLIST), (FP_HAVE_DC_POINT, "DcPoint",T_VEC3D ), (FP_HAVE_MODULI, "Moduli", T_DOUBLE ), (FP_HAVE_YS, "YS", T_DOUBLE ), (FP_HAVE_DEPTH, "DEPTH", T_DOUBLE ), (FP_HAVE_EPJS, "EPJs", T_DLLIST ), (FP_HAVE_FRAC_EXT, "FExt", T_FPLIST ), (FP_HAVE_FRAC_ANG, "FAng", T_FPLIST ), (FP_HAVE_CGM_CODE, "CGM", T_STRING ), (FP_HAVE_TGM_CODE, "TGM", T_STRING ), ) def __init__(self): self.map = {} for i in range(len(self.Desc)): self.map[self.Desc[i][self.StringName]] = i def Load(self,fi): point = FrontPoint() while fi.More(): if fi[0] == "ENDFP": break key = fi[0][0:len(fi[0])-1] indx = self.map.get(key) if indx is not None: point.Flags |= self.Desc[indx][self.FlagName] type = self.Desc[indx][self.Type] name = self.Desc[indx][self.StringName] if type == self.T_INT: setattr(point,name,int(fi[1])) elif type == self.T_DOUBLE: setattr(point,name,float(fi[1]) if fi[1] != "NO_DBL" else None) elif type == self.T_VEC3D: setattr(point,name,Vec3D( float(fi[1]) if fi[1] != "NO_DBL" else None, float(fi[2]) if fi[2] != "NO_DBL" else None, float(fi[3]) if fi[3] != "NO_DBL" else None)) elif type == self.T_STRING: setattr(point,name,fi[1]) elif type == self.T_DBLLIST: setattr(point,name,[]) for j in range(1,fi.Len()) : getattr(point,name).append( float(fi[j]) if fi[j] != "NO_DBL" else None) elif type == self.T_V3DLIST: setattr(point,name,[]) for j in range(1,fi.Len(),3) : getattr(point,name).append(Vec3D( float(fi[j]) if fi[j] != "NO_DBL" else None, float(fi[j+1]) if fi[j+1] != "NO_DBL" else None, float(fi[j+2]) if fi[j+2] != "NO_DBL" else None)) elif type == self.T_FPLIST: setattr(point,name,[]) for j in range(1,fi.Len()) : getattr(point,name).append(FractionalPart) getattr(point,name)[-1].SetFromString(fi[j]) elif type == self.T_DLLIST: num = fi[1].AsInt() ; setattr(point,name,[]) for j in range(num): getattr(point,name).append([]) fi.Next() ; for k in range(fi.Len()): getattr(point,name)[-1].append( float(fi[k]) if fi[k] != "NO_DBL" else None) elif type == self.T_BASIS: setattr(point,name,[ Vec3D(float(fi[1]),float(fi[2]),float(fi[3])), Vec3D(float(fi[4]),float(fi[5]),float(fi[6])), Vec3D(float(fi[7]),float(fi[8]),float(fi[9]))]) elif type == self.T_SHTPAIR: setattr(point,name,[int(fi[1]),None]) if fi.Len() > 2: getattr(point,name)[1] = int(fi[2]) elif type == self.T_DBLPAIR: setattr(point,name,[float(fi[1]),None]) if fi.Len() > 2: getattr(point,name)[1] = float(fi[2]) else: print("Warning, Unrecognized option: %s" % fi[0], file = sys.stderr) fi.Next() fi.Next() return point def Save(self,point,out): for i in range(len(self.Desc)): if point.Flags & self.Desc[i][self.FlagName] != 0: print(self.Desc[i][self.StringName],end="",file=out) print(":",end="",file=out) type = self.Desc[i][self.Type] name = self.Desc[i][self.StringName] if type == self.T_INT or type == self.T_STRING or type == self.T_VEC3D: print(' ',end="",file=out) print(getattr(point,name),file=out) elif type == self.T_DOUBLE: if getattr(point,name) is None: print(" NO_DBL",file=out) else: print(" %g" % getattr(point,name),file=out) elif type == self.T_DBLLIST: for j in range(len(getattr(point,name))): if getattr(point,name)[j] is None: print(" NO_DBL",end="",file=out) else: print(' ',end="",file=out) print(getattr(point,name)[j],end="",file=out) print(file=out) elif type == self.T_V3DLIST: for j in range(len(getattr(point,name))): for k in range(3): if getattr(point,name)[j][k] is None: print(" NO_DBL",end="",file=out) else: print(' ',end="",file=out) print(getattr(point,name)[j][k],end="",file=out) print(file=out) elif type == self.T_FPLIST: for j in range(len(getattr(point,name))): print(' ',end="",file=out) print(getattr(point,name)[j].AsString(),end="",file=out) print(file=out) elif type == self.T_DLLIST: print(" %d" % len(getattr(point,name)),file=out) for j in range(len(getattr(point,name))): for k in range(len(getattr(point,name)[j])): if getattr(point,name)[j][k] is None: print(" NO_DBL",end="",file=out) else: print(' ',end="",file=out) print(getattr(point,name)[k],end="",file=out) print(file=out) elif type == self.T_BASIS: for j in range(3): for k in range(3): print(" %g" % getattr(point,name)[j][k],end="",file=out) print(file=out) elif type == self.T_SHTPAIR: print(" %d" % getattr(point,name)[0],end="",file=out) if getattr(point,name)[1] is not None: print(" %d" % getattr(point,name)[1],end="",file=out) print(file=out) elif type == self.T_DBLPAIR: print(" %d" % getattr(point,name)[0],end="",file=out) if getattr(point,name)[1] is not None: print(" %g" % getattr(point,name)[1],end="",file=out) print(file=out) print("ENDFP",file=out) def Update(self,point,other): for i in range(len(self.Desc)): if other.Flags & self.Desc[i][self.FlagName] == 0: continue point.Flags |= other.Flags & self.Desc[i][self.FlagName] type = self.Desc[i][self.Type] name = self.Desc[indx][self.StringName] if type == self.T_INT or type == self.T_DOUBLE or \ type == self.T_VEC3D or type == self.T_STRING: setattr(point,name,getattr(other,name)) elif type == self.T_DBLLIST or type == self.T_V3DLIST or \ type == self.T_FPLIST: setattr(point,name,[]) for j in range(len(getattr(other,name))): getattr(point,name)[j] = getattr(other,name)[j] elif type == T_DLLIST: setattr(point,name,[]) for j in range(len(getattr(other,name))): getattr(point,name).append([]) for k in range(len(getattr(other,name)[j])): getattr(point,name)[j].append(getattr(other,name)[j][k]) elif type == self.T_BASIS: setattr(point,name,[]) for j in range(3): tmp = Vec3D(getattr(other,name)[j][0], getattr(other,name)[j][1], getattr(other,name)[j][2]) getattr(point,name).append(tmp) elif type == T_SHTPAIR or type == self.T_DBLPAIR: getattr(point,name)[0] = getattr(other,name)[0] getattr(point,name)[1] = getattr(other,name)[1] # ========================================================================= # CrackFrontWrapper - class to manage I/O for CrackFront structs class CrackFrontWrapper: T_INT = 0 T_DOUBLE = 1 T_BOOL = 2 T_STRING = 3 T_VEC3D = 4 T_DBLLIST = 5 T_V3DLIST = 6 T_FPARAMS = 7 FlagName = 0 StringName = 1 Type = 2 Desc = ( (CF_HAVE_ID, "ID", T_INT ), (CF_HAVE_START, "Start", T_VEC3D ), (CF_HAVE_STOP, "Stop", T_VEC3D ), (CF_HAVE_SYM, "Symmetry", T_BOOL ), (CF_HAVE_SRC_FILE, "SrcFile", T_STRING ), (CF_HAVE_EXT_MULT, "ExtMult", T_DOUBLE ), (CF_HAVE_FITFRT, "FitFrt", T_V3DLIST), (CF_HAVE_OLDFIT, "FitOld", T_V3DLIST), (CF_HAVE_FITEXT, "FitExt", T_DBLLIST), (CF_HAVE_FITPARAMS,"FitParams",T_FPARAMS), ) def __init__(self): self.map = {} for i in range(len(self.Desc)): self.map[self.Desc[i][self.StringName]] = i def Load(self,fi): front = CrackFront() while fi.More(): if fi[0] == "FrtPts:": fpw = FrontPointWrapper() num = int(fi[1]) fi.Next() ; for i in range(num): front.PointData.append(fpw.Load(fi)) break else: key = fi[0][0:len(fi[0])-1] indx = self.map.get(key) if indx is not None: front.Flags |= self.Desc[indx][self.FlagName] type = self.Desc[indx][self.Type] name = self.Desc[indx][self.StringName] if type == self.T_INT: setattr(front,name,int(fi[1])) elif type == self.T_DOUBLE: setattr(front,name,float(fi[1]) if fi[1] != "NO_DBL" else None) elif type == self.T_BOOL: setattr(front,name,(int(fi[i]) != 0)) elif type == self.T_STRING: setattr(front,name,fi[1]) elif type == self.T_VEC3D: setattr(front,name,Vec3D( float(fi[1]) if fi[1] != "NO_DBL" else None, float(fi[2]) if fi[2] != "NO_DBL" else None, float(fi[3]) if fi[3] != "NO_DBL" else None)) elif type == self.T_DBLLIST: setattr(front,name,[]) for j in range(1,fi.Len()) : getattr(front,name).append( float(fi[j]) if fi[j] != "NO_DBL" else None) elif type == self.T_V3DLIST: setattr(front,name,[]) for j in range(1,fi.Len(),3) : getattr(front,name).append(Vec3D( float(fi[j]) if fi[j] != "NO_DBL" else None, float(fi[j+1]) if fi[j+1] != "NO_DBL" else None, float(fi[j+2]) if fi[j+2] != "NO_DBL" else None)) elif type == self.T_FPARAMS: setattr(front,name,FitFrontParams()) ; getattr(front,name).SmoothType = fi[1] getattr(front,name).PolyOrder = int(fi[2]) getattr(front,name).Discard[0] = int(fi[3]) getattr(front,name).Discard[1] = int(fi[4]) getattr(front,name).Extrapolate[0] = float(fi[5]) getattr(front,name).Extrapolate[1] = float(fi[6]) if fi.Len() > 7: if getattr(front,name).SmoothType == "MOVING_POLY": gettattr(front,name).MvPolyRange = int(fi[7]) else: print("Warning, Unrecognized option: %s" % fi[0], file = sys.stderr) fi.Next() fi.Next() return front def Save(self,front,out): for i in range(len(self.Desc)): if front.Flags & self.Desc[i][self.FlagName] != 0: print(self.Desc[i][self.StringName],end="",file=out) print(":",end="",file=out) type = self.Desc[i][self.Type] name = self.Desc[i][self.StringName] if type == self.T_INT or type == self.T_STRING or type == self.T_VEC3D: print(' ',end="",file=out) print(getattr(front,name),file=out) elif type == self.T_DOUBLE: if getattr(front,name) is None: print(" NO_DBL",file=out) else: print(" %g" % getattr(front,name),file=out) elif type == self.T_BOOL: if getattr(front,name): print(" 1",file=out) else: print(" 0",file=out) elif type == self.T_DBLLIST: for j in range(len(getattr(front,name))): if getattr(front,name)[j] is None: print(" NO_DBL",end="",file=out) else: print(' ',end="",file=out) print(getattr(front,name)[j],end="",file=out) print(file=out) elif type == self.T_V3DLIST: for j in range(len(getattr(front,name))): for k in range(3): if getattr(front,name)[j][k] is None: print(" NO_DBL",end="",file=out) else: print(' ',end="",file=out) print(getattr(front,name)[j][k],end="",file=out) print(file=out) elif type == self.T_FPARAMS: print(" %s" % getattr(front,name).SmoothType,end="",file=out) print(" %d" % getattr(front,name).PolyOrder,end="",file=out) print(" %d" % getattr(front,name).Discard[0],end="",file=out) print(" %d" % getattr(front,name).Discard[1],end="",file=out) print(" %g" % getattr(front,name).Extrapolate[0],end="",file=out) print(" %g" % getattr(front,name).Extrapolate[1],end="",file=out) if getattr(front,name).SmoothType == "MOVING_POLY": print(" %d" % getattr(front,name).MvPolyRange,end="",file=out) print(file=out) fpw = FrontPointWrapper() print("FrtPts: %d" % len(front.PointData),file=out) for i in range(len(front.PointData)): fpw.Save(front.PointData[i],out) print("ENDCF",file=out) # ========================================================================= # CrackStepWrapper - class to manage I/O for CrackStep structs class CrackStepWrapper: T_INT = 0 T_DOUBLE = 1 T_STRLIST = 2 T_LLONG = 3 T_EXTTYPE = 4 T_SREASON = 5 T_COMPFLG = 6 CompFlagMap = { 0x0001:"M_INTEGRAL", 0x0002:"DISP_CORR", 0x0004:"VCCT", 0x0008:"THERM", 0x0010:"CFT", 0x0020:"CFC", 0x0040:"LROT", 0x0080:"EPJ", 0x0100:"SIG0", 0x0200:"EPS0" } FlagName = 0 StringName = 1 Type = 2 Desc = ( (CS_HAVE_NAME, "Name", T_STRLIST), (CS_HAVE_EXT_TYPE, "ExtType", T_EXTTYPE), (CS_HAVE_EXT_CYCLES,"Cycles", T_LLONG ), (CS_HAVE_EXT_TIME, "Time", T_DOUBLE ), (CS_HAVE_EXT_FRAC, "Fraction", T_DOUBLE ), (CS_HAVE_EXT_STOP, "StopReason", T_SREASON), (CS_HAVE_EXT_LEN, "Length", T_DOUBLE ), (CS_HAVE_TOT_PASS, "TotalPasses", T_LLONG ), (CS_HAVE_SIF_FLAGS, "SifCompFlags",T_COMPFLG), ) def __init__(self): self.map = {} for i in range(len(self.Desc)): self.map[self.Desc[i][self.StringName]] = i self.rev_comp_flags = {} for code in self.CompFlagMap: self.rev_comp_flags[self.CompFlagMap[code]] = code def Load(self,fi): step = CrackStep() step.Flags = 0 step.UserIndx = 0 step.SifComputationFlags = 0 while fi.More(): if fi[0] == "ENDCS": break elif fi[0] == "FrtData:": cfw = CrackFrontWrapper() num = int(fi[1]) fi.Next() for i in range(num): step.FrontData.append(cfw.Load(fi)) #print(" step front data: ",num,len(step.FrontData),file=sys.stderr) break else: key = fi[0][0:len(fi[0])-1] indx = self.map.get(key) if indx is not None: step.Flags |= self.Desc[indx][self.FlagName] type = self.Desc[indx][self.Type] name = self.Desc[indx][self.StringName] if type == self.T_INT: setattr(step,name,int(fi[1])) elif type == self.T_DOUBLE: setattr(step,name,float(fi[1])) elif type == self.T_STRLIST: string = fi[1] for j in range(2,fi.Len()): string += ' ' string += fi[j] setattr(step,name,string) elif type == self.T_LLONG: setattr(step,name,int(fi[1])) elif type == self.T_EXTTYPE or type == self.T_SREASON: setattr(step,name,fi[1]) elif type == self.T_COMPFLG: setattr(step,name,0) for j in range(1,fi.Len()): flags = getattr(step,name) setattr(step,name,flags | self.rev_comp_flags[fi[j]]) if type == self.T_EXTTYPE and step.ExtensionType == "CS_MEDIAN_EXT": step.ExtensionType = "CS_DIST_EXT" else: if fi[0] == "Extension:" or fi[0] == "SifCompType:": pass else: print("Warning, Unrecognized option: %s" % fi[0], file = sys.stderr) fi.Next() fi.Next() return step def Save(self,step,out): for i in range(len(self.Desc)): if step.Flags & self.Desc[i][self.FlagName] != 0: print(self.Desc[i][self.StringName],end="",file=out) print(":",end="",file=out) type = self.Desc[i][self.Type] name = self.Desc[i][self.StringName] if type == self.T_INT or type == self.T_DOUBLE or \ type == self.T_STRLIST or type == self.T_LLONG or \ type == self.T_EXTTYPE or type == self.T_SREASON: print(' ',end="",file=out) print(getattr(step,name),file=out) if type == self.T_COMPFLG: for code in self.CompFlagMap: if getattr(step,name) & code != 0: print(" %s" % self.CompFlagMap[code],end="",file=out) print(file=out) if len(step.FrontData) > 0: cfw = CrackFrontWrapper() print("FrtData: %d" % len(step.FrontData),file=out) for i in range(len(step.FrontData)): cfw.Save(step.FrontData[i],out) print("ENDCS",file=out) # ========================================================================= # CrackGrowthWrapper - class to manage I/O for CrackGrowth structs class CrackGrowthWrapper: T_INT = 0 T_DOUBLE = 1 T_VEC3D = 2 FlagName = 0 StringName = 1 Type = 2 Desc = ( (CG_HAVE_START_POINT,"StartPoint",T_VEC3D), (CG_HAVE_START_LEN, "StartLen", T_DOUBLE) ) def __init__(self): self.map = {} for i in range(len(self.Desc)): self.map[self.Desc[i][self.StringName]] = i self.GrowthParams = None def Load(self,fi): cgd = CrackGrowthData() while fi.More(): if fi[0] == "ENDFCGD": break elif fi[0] == "StepData:": csw = CrackStepWrapper() num = int(fi[1]) fi.Next() for i in range(num): step = csw.Load(fi) if len(step.FrontData) > 0: cgd.Steps.append(step) #print(num,i,len(step.FrontData),len(cgd.Steps),file=sys.stderr) elif fi[0] == "LoadCaseMaps:": num = int(fi[1]) for i in range(num): fi.Next() ; step = int(fi[1]) if len(cgd.LoadCaseMaps) == 0 or \ step != cgd.LoadCaseMaps[-1][0]: cgd.LoadCaseMaps.append([step,LoadStepMap()]) cgd.LoadCaseMaps[-1][1].Load(fi) fi.Next() else: key = fi[0][0:len(fi[0])-1] indx = self.map.get(key) if indx is not None: cgd.Flags |= self.Desc[indx][self.FlagName] type = self.Desc[indx][self.Type] name = self.Desc[indx][self.StringName] if type == self.T_INT: setattr(cgd,name,int(fi[1])) elif type == self.T_DOUBLE: setattr(cgd,name,float(fi[1])) elif type == self.T_VEC3D: setattr(point,name,Vec3D(float(fi[1]),float(fi[2]),float(fi[3]))) else: print("Warning, Unrecognized option: %s" % fi[0], file = sys.stderr) fi.Next() if fi.More(): if fi[0] == "GROWTH_PARAMS": self.GrowthParams = EchoGrowthParams() self.GrowthParams.Load(fi) return cgd def Save(self,cgd,out): for i in range(len(self.Desc)): if cgd.Flags & self.Desc[i][self.FlagName] != 0: print(self.Desc[i][self.StringName],end="",file=out) print(":",end="",file=out) type = self.Desc[i][self.Type] name = self.Desc[i][self.StringName] print(' ',end="",file=out) print(getattr(point,name),file=out) csw = CrackStepWrapper() if len(cgd.Steps) > 0 and len(cgd.Steps[0].FrontData) > 0: print("StepData: %d" % len(cgd.Steps),file=out) for i in range(len(cgd.Steps)): csw.Save(cgd.Steps[i],out) print("LoadCaseMaps: %d" % len(cgd.LoadCaseMaps),file=out) for i in range(len(cgd.LoadCaseMaps)): print(" LoadMap: %d" % cgd.LoadCaseMaps[i][0],file=out) cgd.LoadCaseMaps[i][1].Save(out," ") print("ENDFCGD",file=out) if self.GrowthParams is not None: self.GrowthParams.Save(out) # ======================================================================== if __name__ == "__main__": fd = open("combined.fcg") fi = FileIterator(fd) cgd_wrapper = CrackGrowthWrapper() cgd = cgd_wrapper.Load(fi) cgd_wrapper.Save(cgd,sys.stdout)