From 0fcebe11f3dcba7c9347f78e8e596de91959739f Mon Sep 17 00:00:00 2001 From: Scott Sibole Date: Thu, 26 Oct 2017 18:45:41 -0600 Subject: [PATCH] Fixed for Python 3 support. Test problems and parsing seem to be working properly --- febio/Boundary.py | 29 ++-- febio/Boundary.pyc | Bin 5263 -> 5488 bytes febio/Control.py | 9 +- febio/Control.pyc | Bin 1421 -> 1444 bytes febio/FebPlt.py | 79 ++++++---- febio/Load.py | 49 +++--- febio/MatDef.py | 4 +- febio/MatDef.pyc | Bin 1895 -> 2018 bytes febio/MeshDef.py | 37 +++-- febio/MeshDef.pyc | Bin 5594 -> 5929 bytes febio/Model.py | 84 ++++++----- febio/Model.pyc | Bin 16288 -> 16688 bytes febio/__init__.py | 14 +- febio/__init__.pyc | Bin 342 -> 381 bytes febio/verification/test.feb | 24 +-- febio/verification/test.log | 279 ++++++++++++++++++++++------------- febio/verification/test.xplt | Bin 6136 -> 6184 bytes 17 files changed, 358 insertions(+), 250 deletions(-) diff --git a/febio/Boundary.py b/febio/Boundary.py index 8c5dbbd..4921214 100644 --- a/febio/Boundary.py +++ b/febio/Boundary.py @@ -3,6 +3,9 @@ @author: Scott Sibole ''' +from __future__ import print_function +from builtins import range +from builtins import object class Boundary(object): ''' @@ -23,16 +26,16 @@ def __init__(self,steps=1): spring - list with each entry containing a 6 element list of: type, node 1, node 2, E, force load curve id, scale ''' self.bcs = [] - for _ in xrange(steps): + for _ in range(steps): self.bcs.append({'fixed': [], 'prescribed': [], 'prescribed relative': [], 'contact': [],'spring': []}) def addFixed(self,nset=None,nodeid=None,dof=None): if dof is None: - print 'WARNING: No degree of freedom was specified for this boundary condition. Skipping...' + print('WARNING: No degree of freedom was specified for this boundary condition. Skipping...') pass if nset is None and nodeid is None: - print 'WARNING: Must specify either a node set or a node id. Skipping...' + print('WARNING: Must specify either a node set or a node id. Skipping...') pass if nset is not None: @@ -49,19 +52,19 @@ def addFixed(self,nset=None,nodeid=None,dof=None): def addPrescribed(self,nset=None,step=0,nodeid=None,dof=None,lc=None,scale=None,ptype=None): if dof is None: - print 'WARNING: No degree of freedom was specified for this boundary condition. Skipping BC assignment...' + print('WARNING: No degree of freedom was specified for this boundary condition. Skipping BC assignment...') pass if nset is None and nodeid is None: - print 'WARNING: Must specify either a node set or a node id. Skipping BC assignment...' + print('WARNING: Must specify either a node set or a node id. Skipping BC assignment...') pass if lc is None: - print 'WARNING: Must specify a load curve ID. Skipping BC assignment...' + print('WARNING: Must specify a load curve ID. Skipping BC assignment...') pass if scale is None: - print 'WARNING: No scale specified for this boundary condition. Using default of 1.0...' + print('WARNING: No scale specified for this boundary condition. Using default of 1.0...') scale = 1.0 if ptype is not None: keywd = 'prescribed relative' @@ -81,11 +84,11 @@ def addPrescribed(self,nset=None,step=0,nodeid=None,dof=None,lc=None,scale=None, def addContact(self,step=0,ctype=None,master=None,slave=None,attributes=None): if ctype is None: - print 'WARNING: Did not specify a contact type. Skipping assignment...' + print('WARNING: Did not specify a contact type. Skipping assignment...') pass elif master is None or slave is None: - print 'WARNING: Did not specify an appropriate value for the master and/or slave. Skipping assignment...' + print('WARNING: Did not specify an appropriate value for the master and/or slave. Skipping assignment...') pass try: if isinstance(master[0][0],list): @@ -109,17 +112,17 @@ def addContact(self,step=0,ctype=None,master=None,slave=None,attributes=None): def addSpring(self,step=0,stype='linear',nodes=[None,None],E=None,lc=None,scale=1.0): if len(nodes) != 2 or not isinstance(nodes[0],int) or not isinstance(nodes[1],int): - print 'WARNING: List of nodes must be 2 integer elements. Skipping spring definition...' + print('WARNING: List of nodes must be 2 integer elements. Skipping spring definition...') pass if stype=='linear' or stype=='tension-only nonlinear': if E is None: - print 'WARNING: Must specify a spring stiffness if type is linear or tension-only linear. Skipping spring definition...' + print('WARNING: Must specify a spring stiffness if type is linear or tension-only linear. Skipping spring definition...') pass if stype=='nonlinear' and lc is None: - print 'WARNING: Must specify a force load curve if type is nonlinear. Skipping spring definition...' + print('WARNING: Must specify a force load curve if type is nonlinear. Skipping spring definition...') pass if stype=='nonlinear' and scale is None: - print 'WARNING: No scale was specified. Using default value of 1.0...' + print('WARNING: No scale was specified. Using default value of 1.0...') scale = 1.0 self.bcs[step]['spring'].append({'stype':stype,'n1':nodes[0],'n2':nodes[1],'E':E,'lc':lc,'scale':scale}) diff --git a/febio/Boundary.pyc b/febio/Boundary.pyc index 13226ff09a4d7872ce7efc651b5a33938feecd00..01e9e9141b36c1fa83ef831e11980f70fcfcbd66 100644 GIT binary patch delta 1808 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 diff --git a/febio/FebPlt.py b/febio/FebPlt.py index 13bf3a0..60206fc 100644 --- a/febio/FebPlt.py +++ b/febio/FebPlt.py @@ -1,5 +1,11 @@ +from __future__ import print_function +from __future__ import division +from builtins import str +from builtins import range +from builtins import object +from past.utils import old_div import numpy as np -import os, re +import os from collections import OrderedDict class FebPlt(object): @@ -96,19 +102,22 @@ def __init__(self,filename): self._parseModel() self._cleanData() + def _asHexString(self, x): + return "{:08x}".format(x) + def _parseModel(self): chunk = np.fromfile(self._fid,dtype=np.uint32,count=1) - if '%08x' % chunk != '00464542': - print 'File passed to FebPlt() is not an FEBio xplt. Exiting...' + if self._asHexString(chunk[0]) != '00464542': + print('File passed to FebPlt() is not an FEBio xplt. Exiting...') raise SystemExit self._read_size += 4 while self._read_size < self._filesize: chunk = np.fromfile(self._fid,dtype=np.uint32,count=1) self._read_size += 4 try: - keyword = self._lookup['%08x' % chunk] + keyword = self._lookup[self._asHexString(chunk[0])] if keyword == 'VERSION': - self.VERSION = '%08x' % np.fromfile(self._fid,dtype=np.uint32,count=2)[-1] + self.VERSION = self._asHexString(np.fromfile(self._fid,dtype=np.uint32,count=2)[-1]) self._read_size += 8 elif keyword == 'NODES': self.NODES = np.fromfile(self._fid,dtype=np.uint32,count=2)[-1] @@ -120,7 +129,7 @@ def _parseModel(self): chunk = np.fromfile(self._fid,dtype=np.uint32,count=1) self._read_size += 4 try: - keyword = self._lookup['%08x' % chunk] + keyword = self._lookup[self._asHexString(chunk[0])] if keyword in ['GLOBAL_DATA','MATERIAL_DATA','NODESET_DATA','DOMAIN_DATA','SURFACE_DATA']: self._readDictSect(np.fromfile(self._fid,dtype=np.uint32,count=1)+self._read_size,keyword) except: @@ -133,7 +142,7 @@ def _parseModel(self): chunk = np.fromfile(self._fid,dtype=np.uint32,count=1) self._read_size += 4 try: - keyword = self._lookup['%08x' % chunk] + keyword = self._lookup[self._asHexString(chunk[0])] if keyword == 'MAT_ID': self.MATERIAL[-1]['MAT_ID'] = np.fromfile(self._fid,dtype=np.uint32,count=2)[-1] self._read_size += 8 @@ -155,7 +164,7 @@ def _parseModel(self): chunk = np.fromfile(self._fid,dtype=np.uint32,count=1) self._read_size += 4 try: - keyword = self._lookup['%08x' % chunk] + keyword = self._lookup[self._asHexString(chunk[0])] if keyword == 'NODE_COORDS': np.fromfile(self._fid,dtype=np.uint32,count=1) self._read_size += 4 @@ -171,7 +180,7 @@ def _parseModel(self): chunk = np.fromfile(self._fid,dtype=np.uint32,count=1) self._read_size += 4 try: - keyword = self._lookup['%08x' % chunk] + keyword = self._lookup[self._asHexString(chunk[0])] if keyword == 'DOMAIN': self._readDomain(np.fromfile(self._fid,dtype=np.uint32,count=1)[0]+self._read_size) except: @@ -183,7 +192,7 @@ def _parseModel(self): chunk = np.fromfile(self._fid,dtype=np.uint32,count=1) self._read_size += 4 try: - keyword = self._lookup['%08x' % chunk] + keyword = self._lookup[self._asHexString(chunk[0])] if keyword == 'SURFACE': self._readSurface(np.fromfile(self._fid,dtype=np.uint32,count=1)[0]+self._read_size) except: @@ -197,7 +206,7 @@ def _parseModel(self): chunk = np.fromfile(self._fid,dtype=np.uint32,count=1) self._read_size += 4 try: - keyword = self._lookup['%08x' % chunk] + keyword = self._lookup[self._asHexString(chunk[0])] if keyword == 'TIME': self.STATE_SECTION[-1]['TIME'] = np.fromfile(self._fid,dtype=np.float32,count=2)[1] self.TIME.append(self.STATE_SECTION[-1]['TIME']) @@ -209,7 +218,7 @@ def _parseModel(self): chunk = np.fromfile(self._fid,dtype=np.uint32,count=1)[0] self._read_size += 4 try: - subkeyword = self._lookup['%08x' % chunk] + subkeyword = self._lookup[self._asHexString(chunk)] if subkeyword == 'VARIABLE_ID': self._addStateData(keyword) self.STATE_SECTION[-1][keyword][-1]['VARIABLE_ID'].append(np.fromfile(self._fid,dtype=np.uint32,count=2)[-1]) @@ -223,7 +232,7 @@ def _parseModel(self): region_size = np.fromfile(self._fid,dtype=np.uint32,count=1)[0] self._read_size += 8 self.STATE_SECTION[-1][keyword][-1]['DATA'].append({'REGION_ID': region_id, - 'DATA': np.reshape(np.fromfile(self._fid,dtype=np.float32,count=region_size/4),(-1,vlengths[itype]))}) + 'DATA': np.reshape(np.fromfile(self._fid,dtype=np.float32,count=old_div(region_size,4)),(-1,vlengths[itype]))}) self._read_size += region_size except: continue @@ -241,7 +250,7 @@ def _readDictSect(self,size,key): chunk = np.fromfile(self._fid,dtype=np.uint32,count=1) self._read_size += 4 try: - keyword = self._lookup['%08x' % chunk] + keyword = self._lookup[self._asHexString(chunk[0])] if keyword == 'DICTIONARY_ITEM': self._addDictionaryItem(key) elif keyword == 'ITEM_TYPE': @@ -253,12 +262,18 @@ def _readDictSect(self,size,key): elif keyword == 'ITEM_NAME': np.fromfile(self._fid,dtype=np.uint32,count=1) #read a 4 byte chunk to move to char64 array self._read_size += 4 - dmy = np.fromfile(self._fid,dtype=np.dtype((str,64)),count=1) - z = re.compile(r'(\x00)') - dmy = z.split(dmy[0]) + word = '' + c = 0 + while c<64: + dmy = np.fromfile(self._fid, dtype='|S1', count=1)[0] + c += 1 + if dmy != b'': + word = ''.join([word, dmy.decode('ascii')]) + else: + np.fromfile(self._fid, dtype='|S1', count=64-c) + break self._read_size += 64 - dmy = str(dmy[0]) - self.DICTIONARY[key][-1]['ITEM_NAME'] = dmy + self.DICTIONARY[key][-1]['ITEM_NAME'] = word except: continue @@ -271,7 +286,7 @@ def _readDomain(self,size): chunk = np.fromfile(self._fid,dtype=np.uint32,count=1) self._read_size += 4 try: - keyword = self._lookup['%08x' % chunk] + keyword = self._lookup[self._asHexString(chunk[0])] if keyword == 'ELEM_TYPE': etype = np.fromfile(self._fid,dtype=np.uint32,count=2)[-1] self.DOMAIN_SECTION[-1]['DOMAIN_HEADER']['ELEM_TYPE'] = elmtypes[etype] @@ -295,7 +310,7 @@ def _readSurface(self,size): chunk = np.fromfile(self._fid,dtype=np.uint32,count=1) self._read_size += 4 try: - keyword = self._lookup['%08x' % chunk] + keyword = self._lookup[self._asHexString(chunk[0])] if keyword == 'SURFACE_ID': self.SURFACE_SECTION[-1]['SURFACE_HEADER']['SURFACE_ID'] = np.fromfile(self._fid,dtype=np.uint32,count=2)[-1] self._read_size += 8 @@ -345,8 +360,8 @@ def _cleanData(self): used_node[n] = True mapping[-1]['MULT'].append(n) N = len(self.STATE_SECTION) - for i in xrange(N): - for j in xrange(len(self.STATE_SECTION[i]['NODESET_DATA'][0]['DATA'][0]['DATA'])): + for i in range(N): + for j in range(len(self.STATE_SECTION[i]['NODESET_DATA'][0]['DATA'][0]['DATA'])): try: self.NodeData[j+1]['displacement'][i,:] = self.STATE_SECTION[i]['NODESET_DATA'][0]['DATA'][0]['DATA'][j] except: @@ -354,15 +369,15 @@ def _cleanData(self): self.NodeData[j+1]['displacement'] = np.zeros((N,3),dtype=np.float32) self.NodeData[j+1]['displacement'][i,:] = self.STATE_SECTION[i]['NODESET_DATA'][0]['DATA'][0]['DATA'][j] - for j in xrange(len(self.STATE_SECTION[i]['DOMAIN_DATA'])): + for j in range(len(self.STATE_SECTION[i]['DOMAIN_DATA'])): vname = self.DICTIONARY['DOMAIN_DATA'][j]['ITEM_NAME'] vformat = self.DICTIONARY['DOMAIN_DATA'][j]['ITEM_FORMAT'] if vformat == 'ITEM': - for k in xrange(len(self.STATE_SECTION[i]['DOMAIN_DATA'][j]['DATA'])): + for k in range(len(self.STATE_SECTION[i]['DOMAIN_DATA'][j]['DATA'])): dat = self.STATE_SECTION[i]['DOMAIN_DATA'][j]['DATA'][k]['DATA'] m = mapping[k][vformat] M,L = dat.shape #rows in dat - for l in xrange(M): + for l in range(M): try: self.ElementData[m[l]][vname][i,:] = dat[l,:] except: @@ -373,11 +388,11 @@ def _cleanData(self): self.ElementData[m[l]][vname] = np.zeros((N,L),dtype=np.float32) self.ElementData[m[l]][vname][i,:] = dat[l,:] elif vformat == 'NODE': - for k in xrange(len(self.STATE_SECTION[i]['DOMAIN_DATA'][j]['DATA'])): + for k in range(len(self.STATE_SECTION[i]['DOMAIN_DATA'][j]['DATA'])): dat = self.STATE_SECTION[i]['DOMAIN_DATA'][j]['DATA'][k]['DATA'] m = mapping[k][vformat] M,L = dat.shape #rows in dat - for l in xrange(M): + for l in range(M): n = m[l]+1 try: self.NodeData[n][vname][i,:] = dat[l,:] @@ -390,11 +405,11 @@ def _cleanData(self): self.NodeData[n][vname][i,:] = dat[l,:] elif vformat == 'MULT': accessed = {} - for k in xrange(len(self.STATE_SECTION[i]['DOMAIN_DATA'][j]['DATA'])): + for k in range(len(self.STATE_SECTION[i]['DOMAIN_DATA'][j]['DATA'])): dat = self.STATE_SECTION[i]['DOMAIN_DATA'][j]['DATA'][k]['DATA'] m = mapping[k][vformat] M,L = dat.shape #rows in dat - for l in xrange(M): + for l in range(M): n = m[l]+1 try: self.NodeData[n][vname][i,:] = self.NodeData[n][vname][i,:] + dat[l,:] @@ -410,9 +425,9 @@ def _cleanData(self): self.NodeData[n][vname] = np.zeros((N,L),dtype=np.float32) self.NodeData[n][vname][i,:] = self.NodeData[n][vname][i,:] + dat[l,:] accessed[n] = 1 - for nid in self.NodeData.keys(): + for nid in list(self.NodeData.keys()): try: - self.NodeData[nid][vname][i,:] = self.NodeData[nid][vname][i,:]/accessed[nid] + self.NodeData[nid][vname][i,:] = old_div(self.NodeData[nid][vname][i,:],accessed[nid]) except: continue diff --git a/febio/Load.py b/febio/Load.py index d3daa1b..51a753d 100644 --- a/febio/Load.py +++ b/febio/Load.py @@ -3,6 +3,9 @@ @author: Scott Sibole ''' +from __future__ import print_function +from builtins import range +from builtins import object class Load(object): ''' @@ -20,24 +23,24 @@ def __init__(self,steps=1): Constructor ''' self.loads = [] - for _ in xrange(steps): + for _ in range(steps): self.loads.append({'force': [], 'pressure': [], 'normal_traction': [], 'fluidflux': [], 'soluteflux': [], 'body_force': []}) def addForce(self,step=0,nset=None,nodeid=None,dof=None,lc=None,scale=None): if dof is None: - print 'WARNING: No degree of freedom was specified for this nodal force. Skipping assignment...' + print('WARNING: No degree of freedom was specified for this nodal force. Skipping assignment...') pass if nset is None and nodeid is None: - print 'WARNING: Must specify either a node set or a node id. Skipping BC assignment...' + print('WARNING: Must specify either a node set or a node id. Skipping BC assignment...') pass if lc is None: - print 'WARNING: No load curve ID specified for nodal force. Assuming load curve ID of 1...' + print('WARNING: No load curve ID specified for nodal force. Assuming load curve ID of 1...') pass if scale is None: - print 'WARNING: No scale specified for nodal force. Using default of 1.0...' + print('WARNING: No scale specified for nodal force. Using default of 1.0...') scale = '1.0' if nset is not None: @@ -53,73 +56,73 @@ def addForce(self,step=0,nset=None,nodeid=None,dof=None,lc=None,scale=None): def addPressure(self,step=0,surface=None,lc=None,scale=None): if surface is None: - print 'WARNING: Must specify surface as a MeshDef.fset object. Skipping pressure assignment...' + print('WARNING: Must specify surface as a MeshDef.fset object. Skipping pressure assignment...') pass if lc is None: - print 'WARNING: No load curve ID specified for pressure. Assuming load curve ID of 1...' + print('WARNING: No load curve ID specified for pressure. Assuming load curve ID of 1...') lc = '1' if scale is None: - print 'WARNING: No scale factor specified for pressure. Assuming scale factor of 1.0...' + print('WARNING: No scale factor specified for pressure. Assuming scale factor of 1.0...') scale = '1.0' self.loads[step]['pressure'].append({'lc': lc, 'scale': scale, 'surface': surface}) def addTraction(self,step=0,surface=None,traction=None,lc=None,scale=None): if surface is None: - print 'WARNING: Must specify surface as a MeshDef.fset object. Skipping prescribed traction assignment...' + print('WARNING: Must specify surface as a MeshDef.fset object. Skipping prescribed traction assignment...') pass if traction is None: - print 'WARNING: No traction type specified. Assuming "mixture"...' + print('WARNING: No traction type specified. Assuming "mixture"...') traction = 'mixture' if lc is None: - print 'WARNING: No load curve ID specified for prescribed traction. Assuming load curve ID of 1...' + print('WARNING: No load curve ID specified for prescribed traction. Assuming load curve ID of 1...') lc = '1' if scale is None: - print 'WARNING: No scale factor specified for prescribed traction. Assuming scale factor of 1.0...' + print('WARNING: No scale factor specified for prescribed traction. Assuming scale factor of 1.0...') scale = '1.0' self.loads[step]['normal_traction'].append({'traction': traction,'lc': lc, 'scale': scale, 'surface': surface}) def addFluidFlux(self,step=0,method=None,surface=None,fluxtype=None,lc=None,scale=None): if method is None: - print 'WARNING: No method specified for flux condition. Assuming to be "nonlinear"...' + print('WARNING: No method specified for flux condition. Assuming to be "nonlinear"...') method = 'nonlinear' if surface is None: - print 'WARNING: Must specify surface as a MeshDef.fset object. Skipping flux condition assignment...' + print('WARNING: Must specify surface as a MeshDef.fset object. Skipping flux condition assignment...') pass if fluxtype is None: - print 'WARNING: No fluxtype was specified. Assuming to be "fluid"' + print('WARNING: No fluxtype was specified. Assuming to be "fluid"') fluxtype = 'fluid' if lc is None: - print 'WARNING: No load curve specified for flux condition. Assuming load curve as 1...' + print('WARNING: No load curve specified for flux condition. Assuming load curve as 1...') lc = '1' if scale is None: - print 'WARNING: No scale factor specified for flux condition. Assuming scale factor as 1.0...' + print('WARNING: No scale factor specified for flux condition. Assuming scale factor as 1.0...') scale = '1.0' self.loads[step]['fluidflux'].append({'type': method, 'flux': fluxtype, 'lc': lc, 'scale': scale, 'surface': surface}) def addSoluteFlux(self,step=0,method=None,surface=None,solute=None,lc=None,scale=None): if method is None: - print 'WARNING: No method specified for flux condition. Assuming to be "nonlinear"...' + print('WARNING: No method specified for flux condition. Assuming to be "nonlinear"...') method = 'nonlinear' if surface is None: - print 'WARNING: Must specify surface as a MeshDef.fset object. Skipping flux condition assignment...' + print('WARNING: Must specify surface as a MeshDef.fset object. Skipping flux condition assignment...') pass if lc is None: - print 'WARNING: No load curve specified for flux condition. Assuming load curve as 1...' + print('WARNING: No load curve specified for flux condition. Assuming load curve as 1...') lc = '1' if scale is None: - print 'WARNING: No scale factor specified for flux condition. Assuming scale factir as 1.0...' + print('WARNING: No scale factor specified for flux condition. Assuming scale factir as 1.0...') scale = '1.0' self.loads[step]['fluidflux'].append({'type': method, 'sol': solute, 'lc': lc, 'scale': scale, 'surface': surface}) def addBodyForce(self,step=0,btype=None,attributes=None): if btype is None: - print "WARNING: Must specify a body force type. Skipping assignment..." + print("WARNING: Must specify a body force type. Skipping assignment...") pass if attributes is None: - print "WARNING: No attributes specified for body force. Skipping assignment..." + print("WARNING: No attributes specified for body force. Skipping assignment...") pass self.loads[step]['body_force'].append({'type': btype, 'attributes': attributes}) \ No newline at end of file diff --git a/febio/MatDef.py b/febio/MatDef.py index ff0b8e1..63d3579 100644 --- a/febio/MatDef.py +++ b/febio/MatDef.py @@ -3,6 +3,8 @@ @author: Scott Sibole ''' +from __future__ import print_function +from builtins import object class MatDef(object): ''' @@ -19,7 +21,7 @@ def __init__(self,mtype=None,elsets=None,mname=None,matid=None,attributes=None): mname = material name ''' if not matid: - print "ERROR: You must specify a material id! Terminating execution..." + print("ERROR: You must specify a material id! Terminating execution...") raise SystemExit self.attributes = attributes self.matid = matid diff --git a/febio/MatDef.pyc b/febio/MatDef.pyc index 55ee078ab38e2e55780e85e40d45d1af3aed09d0..4c4dd72367ad20c2d47f45633b1aec729d2153fe 100644 GIT binary patch delta 603 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 z 0: self.fixedblk = ET.SubElement(self.initialBoundary,'fix') @@ -224,7 +230,7 @@ def addBoundary(self,boundary=None): for c in step['contact']: self.contactblk.append(ET.SubElement(self.boundary[i],'contact',type=c['type'])) if c['attributes'] is not None: - for a in c['attributes'].keys(): + for a in list(c['attributes'].keys()): ET.SubElement(self.contactblk[cnt],a).text = c['attributes'][a] if c['type']=='rigid': for n in c['slave']: @@ -232,15 +238,15 @@ def addBoundary(self,boundary=None): elif 'sliding' in c['type'] or 'tied' in c['type'] or 'periodic' in c['type']: dmy = ET.SubElement(self.contactblk[cnt],"surface",type="master") for f in c['master']: - ET.SubElement(dmy,f[0],id=str(f[1])).text = string.join(map(str,f[2:]),',') + ET.SubElement(dmy,f[0],id=str(f[1])).text = ",".join(list(map(str,f[2:]))) dmy = ET.SubElement(self.contactblk[cnt],"surface",type="slave") for f in c['slave']: - ET.SubElement(dmy,f[0],id=str(f[1])).text = string.join(map(str,f[2:]),',') + ET.SubElement(dmy,f[0],id=str(f[1])).text = ",".join(list(map(str,f[2:]))) elif c['type']=='rigid_wall': - ET.SubElement(self.contactblk[-1],"plane",lc=str(c['master'][0])).text = string.join(map(str,c['master'][1:]),',') + ET.SubElement(self.contactblk[-1],"plane",lc=str(c['master'][0])).text = ",".join(list(map(str,c['master'][1:]))) dmy = ET.SubElement(self.contactblk[cnt],"surface",type="slave") for f in c['slave']: - ET.SubElement(dmy,f[0],id=str(f[1])).text = string.join(map(str,f[2:]),',') + ET.SubElement(dmy,f[0],id=str(f[1])).text = ",".join(list(map(str,f[2:]))) cnt += 1 if len(step['spring']) > 0: for b in step['spring']: @@ -258,7 +264,7 @@ def addLoad(self,load=None): self.ffluxblk = [] self.sfluxblk = [] self.bfblk = [] - for i in xrange(len(load.loads)): + for i in range(len(load.loads)): step = load.loads[i] if len(step['force']) > 0: self.forceblk.append(ET.SubElement(self.load[i],"force")) @@ -270,7 +276,7 @@ def addLoad(self,load=None): for p in step['pressure']: self.pressureblk.append(ET.SubElement(self.load[i],"pressure")) for s in p['surface']: - ET.SubElement(self.pressureblk[cnt],s[0],id=str(s[1]),lc=p['lc'],scale=p['scale']).text = string.join(map(str,s[2:]),',') + ET.SubElement(self.pressureblk[cnt],s[0],id=str(s[1]),lc=p['lc'],scale=p['scale']).text = ",".join(list(map(str,s[2:]))) cnt += 1 if len(step['normal_traction']) > 0: @@ -278,7 +284,7 @@ def addLoad(self,load=None): for t in step['normal_traction']: self.tractionblk.append(ET.SubElement(self.load[i],"normal_traction",traction=t['traction'])) for s in t['surface']: - ET.SubElement(self.tractionblk[cnt],s[0],id=str(s[1]),lc=t['lc'],scale=t['scale']).text = string.join(map(str,s[2:]),',') + ET.SubElement(self.tractionblk[cnt],s[0],id=str(s[1]),lc=t['lc'],scale=t['scale']).text = ",".join(list(map(str,s[2:]))) cnt += 1 if len(step['fluidflux']) > 0: @@ -286,7 +292,7 @@ def addLoad(self,load=None): for ff in step['fluidflux']: self.ffluxblk.append(ET.SubElement(self.load[i],"fluidflux",type=ff['type'],flux=ff['flux'])) for s in ff['surface']: - ET.SubElement(self.ffluxblk[cnt],s[0],id=str(s[1]),lc=ff['lc'],scale=ff['scale']).text = string.join(map(str,s[2:]),',') + ET.SubElement(self.ffluxblk[cnt],s[0],id=str(s[1]),lc=ff['lc'],scale=ff['scale']).text = ",".join(list(map(str,s[2:]))) cnt += 1 if len(step['soluteflux']) > 0: @@ -294,14 +300,14 @@ def addLoad(self,load=None): for sf in step['soluteflux']: self.sfluxblk.append(ET.SubElement(self.load[i],"soluteflux",type=sf['type'],sol=sf['sol'])) for s in sf['surface']: - ET.SubElement(self.sfluxblk[cnt],s[0],id=str(s[1]),lc=sf['lc'],scale=sf['scale']).text = string.join(map(str,s[2:]),',') + ET.SubElement(self.sfluxblk[cnt],s[0],id=str(s[1]),lc=sf['lc'],scale=sf['scale']).text = ",".join(list(map(str,s[2:]))) cnt += 1 if len(step['body_force']) > 0: cnt = 0 for bf in step['body_force']: self.bfblk.append(ET.SubElement(self.load[i],"body_force",type=bf['type'])) - for a in bf['attributes'].keys(): + for a in list(bf['attributes'].keys()): if isinstance(bf['attributes'][a],list): ET.SubElement(self.bfblk[cnt],a,lc=bf['attributes'][a][0]).text = str(bf['attributes'][a][1]) else: @@ -309,21 +315,21 @@ def addLoad(self,load=None): def addConstraint(self,step=None,matid=None,dof=None): if matid is None: - print "WARNING: No material ID was specified. Skipping constraint definition..." + print("WARNING: No material ID was specified. Skipping constraint definition...") pass if dof is None: - print "WARNING: No degree(s) of freedom was specified. Skipping constraint definition..." + print("WARNING: No degree(s) of freedom was specified. Skipping constraint definition...") pass if step is None: parent = ET.SubElement(self.initialConstraint,"rigid_body",mat=str(matid)) else: parent = ET.SubElement(self.constraint[step],"rigid_body",mat=str(matid)) - for i in dof.keys(): + for i in list(dof.keys()): if isinstance(dof[i],list): try: ET.SubElement(parent,i,type=dof[i][0],lc=dof[i][1]).text = dof[i][2] except: - print "WARNING: When defining a force or prescribed constraint the list must be 3 elements long and ordered: TYPE, LOADCURVE ID, SCALE FACTOR. Skipping definition..." + print("WARNING: When defining a force or prescribed constraint the list must be 3 elements long and ordered: TYPE, LOADCURVE ID, SCALE FACTOR. Skipping definition...") else: ET.SubElement(parent,i,type=dof[i]) @@ -334,15 +340,15 @@ def addLoadCurve(self,lc=None,lctype=None,points=[0,0,1,1]): except: self.loaddata = ET.SubElement(self.root,"LoadData") if lc is None: - print "WARNING: No load curve id specified. Assuming default value of 1..." + print("WARNING: No load curve id specified. Assuming default value of 1...") lc = '1' if lctype is None: - print "WARNING: No load curve type specified. Assuming default value of linear" + print("WARNING: No load curve type specified. Assuming default value of linear") if len(points)%2 > 0: - print "ERROR: There must be an even number of load curve points. Terminating execution..." + print("ERROR: There must be an even number of load curve points. Terminating execution...") raise SystemExit dmy = ET.SubElement(self.loaddata,"loadcurve",id=lc,type=lctype) - for i in xrange(0,len(points),2): + for i in range(0,len(points),2): ET.SubElement(dmy,'loadpoint').text = str(points[i])+','+str(points[i+1]) def addGlobal(self,constants=None, solutes=None, generations=None): @@ -352,23 +358,23 @@ def addGlobal(self,constants=None, solutes=None, generations=None): self.globals = ET.SubElement(self.root,"Globals") if constants is not None: try: - for i in constants.keys(): + for i in list(constants.keys()): ET.SubElement(self.constants,i).text = str(constants[i]) except: self.constants = ET.SubElement(self.globals,"Constants") - for i in constants.keys(): + for i in list(constants.keys()): ET.SubElement(self.constants,i).text = str(constants[i]) if solutes is not None: try: cnt = len(self.solutes) - for i in solutes.keys(): + for i in list(solutes.keys()): ET.SubElement(self.solutes,"solute",id=str(cnt),name=i).text = str(solutes[i]) cnt += 1 except: cnt = 1 self.solutes = ET.SubElement(self.globals,"Solutes") - for i in solutes.keys(): + for i in list(solutes.keys()): ET.SubElement(self.solutes,"solute",id=solutes[i][0],name=i).text = str(solutes[i][1]) cnt += 1 diff --git a/febio/Model.pyc b/febio/Model.pyc index 64e4280e1e4fd399abeb870eba783df9064429b9..810bdaeb38d296a44357f736b461b58ba8eaf018 100644 GIT binary patch delta 5591 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 GwEqEzU-DuA delta 5291 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 QoNUHu&c_9m5MYEs0Lgj~8~^|S diff --git a/febio/verification/test.feb b/febio/verification/test.feb index f667aeb..5094ba7 100644 --- a/febio/verification/test.feb +++ b/febio/verification/test.feb @@ -96,10 +96,10 @@ - + @@ -131,28 +131,28 @@ - 0 - 10 example 10 - 1e-20 - + 0.1 + 0.001 + 0.01 + 0 0.9 0.01 + 1 10 10 - 1 - 0.01 - 0.1 - PRINT_MINOR_ITRS 15 - PLOT_MAJOR_ITRS + 10 0 - 1e5 - 0.001 0 + PLOT_MAJOR_ITRS + 1e5 + + PRINT_MINOR_ITRS + 1e-20 diff --git a/febio/verification/test.log b/febio/verification/test.log index 672dc6e..cbb59dc 100644 --- a/febio/verification/test.log +++ b/febio/verification/test.log @@ -15,22 +15,19 @@ F I N I T E E L E M E N T S F O R B I O M E C H A N I C S - --- v e r s i o n - 2 . 0 . 1 --- + --- v e r s i o n - 2 . 5 . 2 . 8980 --- Musculoskeletal Research Laboratory University of Utah - http://mrl.sci.utah.edu + http://febio.org - copyright (c) 2006-2014 - All rights reserved - - This is the NON-COMMERCIAL version of FEBio or the commercial license - key file could not be found. If you have a key file make sure it is - placed in the same directory as the executable. This version may only - be used for non-commercial purposes as described in the license agreement. - The functionality of this version may be limited compared to the commercial - version. If you wish to obtain a valid commercial license file, please - contact the developers. + FEBio is a registered trademark. + copyright (c) 2006-2015 - All rights reserved + + This is the NON-COMMERCIAL version of FEBio. This version may only be + used for non-commercial purposes as described in the license agreement. + To obtain a valid commercial license file, please contact the developers. =========================================================================== @@ -44,16 +41,20 @@ example Log file : test.log - CONTROL DATA + MESH INFO =========================================================================== - Module type .................................... : biphasic - Analysis type .................................. : quasi-static - Plane strain mode .............................. : no Number of materials ............................ : 4 + Number of domains .............................. : 4 Number of nodes ................................ : 31 Number of solid elements ....................... : 8 Number of shell elements ....................... : 1 - Number of truss elements ....................... : 0 + + + CONTROL DATA +=========================================================================== + Module type .................................... : biphasic + Analysis type .................................. : quasi-static + Plane strain mode .............................. : no Number of timesteps ............................ : 10 Time step size ................................. : 0.1 Auto time stepper activated .................... : yes @@ -63,19 +64,19 @@ example Number of loadcurves ........................... : 1 Number of displacement boundary conditions ..... : 9 Number of concentrated nodal forces ............ : 0 - Max nr of stiffness reformations ............... : 15 + Max nr of stiffness reformations ............... : 1090021888 per time steps Max nr of Quasi-Newton iterations .............. : 10 between stiffness matrix reformations + Linesearch convergence tolerance ............... : 0.9 + Minimum line search size ....................... : 0.01 + Maximum number of line search iterations ....... : 5 + Max condition number ........................... : 0.01 Displacement convergence tolerance ............. : 0.001 Energy convergence tolerance ................... : 0.01 Residual convergence tolerance ................. : 0 Minimal residual value ......................... : 1e-20 Fluid pressure convergence tolerance ........... : 0.01 - Linesearch convergence tolerance ............... : 0.9 - Minimum line search size ....................... : 0.01 - Maximum number of line search iterations ....... : 5 - Max condition number ........................... : 100000 OUTPUT DATA @@ -107,6 +108,7 @@ example v ................................................. : 0.3 --------------------------------------------------------------------------- 4 - Plane (type: rigid body) + density ........................................... : 1 density ........................................... : 1 E ................................................. : 1 v ................................................. : 0 @@ -114,6 +116,13 @@ example center_of_mass .................................... : 0,0,0 + RIGID BODY DATA +=========================================================================== +Rigid Body 1: + material id : 4 + center of mass : 0, 0, 0 + + LOADCURVE DATA =========================================================================== 1 @@ -125,19 +134,15 @@ example LINEAR SOLVER DATA =========================================================================== Solver type ............................... : Pardiso + Matrix format ............................. : symmetric - ************************************************************************* - * WARNING * - * * - * Rigid degrees of freedom cannot be prescribed. * - ************************************************************************* + +===== beginning time step 1 : 0.1 ===== ===== reforming stiffness matrix: Nr of equations ........................... : 50 - Nr of nonzeroes in stiffness matrix ....... : 899 + Nr of nonzeroes in stiffness matrix ....... : 815 - -===== beginning time step 1 : 0.1 ===== 1 Nonlinear solution status: time= 0.1 stiffness updates = 0 @@ -149,32 +154,34 @@ example energy 9.028376e-06 4.347025e-09 9.028376e-08 displacement 6.641884e-05 6.641884e-05 6.641884e-11 fluid pressure 6.893405e-03 6.893405e-03 6.893405e-07 + ************************************************************************* + * WARNING * + * * + * The BFGS update has failed. * + * Stiffness matrix will now be reformed. * + ************************************************************************* +Reforming stiffness matrix: reformation #1 + 2 Nonlinear solution status: time= 0.1 - stiffness updates = 1 + stiffness updates = 0 right hand side evaluations = 3 - stiffness matrix reformations = 1 + stiffness matrix reformations = 2 step from line search = 1.000000 convergence norms : INITIAL CURRENT REQUIRED - residual 1.198975e-05 8.235563e-16 0.000000e+00 - energy 9.028376e-06 3.338620e-14 9.028376e-08 - displacement 6.641884e-05 2.017198e-10 6.662176e-11 - fluid pressure 6.893405e-03 2.545902e-07 6.925595e-07 - 3 - Nonlinear solution status: time= 0.1 - stiffness updates = 2 - right hand side evaluations = 4 - stiffness matrix reformations = 1 - step from line search = 1.000000 - convergence norms : INITIAL CURRENT REQUIRED - residual 1.198975e-05 9.089184e-21 0.000000e+00 - energy 9.028376e-06 3.692739e-19 9.028376e-08 - displacement 6.641884e-05 2.296345e-15 6.662223e-11 - fluid pressure 6.893405e-03 7.244059e-12 6.925654e-07 + residual 1.198975e-05 5.767923e-21 0.000000e+00 + energy 9.028376e-06 6.621793e-15 9.028376e-08 + displacement 6.641884e-05 2.028481e-10 6.662226e-11 + fluid pressure 6.893405e-03 2.570608e-07 6.925667e-07 + ************************************************************************* + * WARNING * + * * + * No force acting on the system. * + ************************************************************************* convergence summary - number of iterations : 3 - number of reformations : 1 + number of iterations : 2 + number of reformations : 2 ------- converged at time : 0.1 @@ -194,33 +201,49 @@ AUTO STEPPER: increasing time step, dt = 0.28 residual 2.637206e-04 2.216018e-08 0.000000e+00 energy 2.099803e-04 1.930314e-07 2.099803e-06 displacement 1.356078e-03 1.356078e-03 1.356078e-09 - fluid pressure 9.187632e-02 9.187632e-02 9.187632e-06 + fluid pressure 9.187631e-02 9.187631e-02 9.187631e-06 + ************************************************************************* + * WARNING * + * * + * The BFGS update has failed. * + * Stiffness matrix will now be reformed. * + ************************************************************************* +Reforming stiffness matrix: reformation #1 + 2 Nonlinear solution status: time= 0.38 - stiffness updates = 1 + stiffness updates = 0 right hand side evaluations = 3 - stiffness matrix reformations = 1 + stiffness matrix reformations = 2 step from line search = 1.000000 convergence norms : INITIAL CURRENT REQUIRED - residual 2.637206e-04 6.140884e-12 0.000000e+00 - energy 2.099803e-04 1.100491e-12 2.099803e-06 - displacement 1.356078e-03 8.105883e-08 1.374027e-09 - fluid pressure 9.187632e-02 7.600211e-05 9.492166e-06 + residual 2.637206e-04 1.034312e-15 0.000000e+00 + energy 2.099803e-04 3.800807e-11 2.099803e-06 + displacement 1.356078e-03 8.241206e-08 1.374100e-09 + fluid pressure 9.187631e-02 7.832390e-05 9.494638e-06 + ************************************************************************* + * WARNING * + * * + * The BFGS update has failed. * + * Stiffness matrix will now be reformed. * + ************************************************************************* +Reforming stiffness matrix: reformation #2 + 3 Nonlinear solution status: time= 0.38 - stiffness updates = 2 + stiffness updates = 0 right hand side evaluations = 4 - stiffness matrix reformations = 1 + stiffness matrix reformations = 3 step from line search = 1.000000 convergence norms : INITIAL CURRENT REQUIRED - residual 2.637206e-04 4.326388e-15 0.000000e+00 - energy 2.099803e-04 1.594974e-14 2.099803e-06 - displacement 1.356078e-03 1.549984e-11 1.374071e-09 - fluid pressure 9.187632e-02 2.645880e-08 9.493776e-06 + residual 2.637206e-04 2.662681e-22 0.000000e+00 + energy 2.099803e-04 1.996083e-16 2.099803e-06 + displacement 1.356078e-03 4.367573e-13 1.374077e-09 + fluid pressure 9.187631e-02 3.911978e-10 9.493847e-06 convergence summary number of iterations : 3 - number of reformations : 1 + number of reformations : 3 ------- converged at time : 0.38 @@ -237,36 +260,52 @@ AUTO STEPPER: increasing time step, dt = 0.424 stiffness matrix reformations = 1 step from line search = 1.000000 convergence norms : INITIAL CURRENT REQUIRED - residual 1.932659e-03 1.210939e-06 0.000000e+00 - energy 1.569026e-03 8.646262e-07 1.569026e-05 - displacement 9.091084e-03 9.091084e-03 9.091084e-09 - fluid pressure 5.162097e-01 5.162097e-01 5.162097e-05 + residual 1.932655e-03 1.210940e-06 0.000000e+00 + energy 1.569022e-03 8.645776e-07 1.569022e-05 + displacement 9.091077e-03 9.091077e-03 9.091077e-09 + fluid pressure 5.162096e-01 5.162096e-01 5.162096e-05 + ************************************************************************* + * WARNING * + * * + * The BFGS update has failed. * + * Stiffness matrix will now be reformed. * + ************************************************************************* +Reforming stiffness matrix: reformation #1 + 2 Nonlinear solution status: time= 0.804 - stiffness updates = 1 + stiffness updates = 0 right hand side evaluations = 3 - stiffness matrix reformations = 1 + stiffness matrix reformations = 2 step from line search = 1.000000 convergence norms : INITIAL CURRENT REQUIRED - residual 1.932659e-03 2.129634e-09 0.000000e+00 - energy 1.569026e-03 3.674796e-09 1.569026e-05 - displacement 9.091084e-03 3.258414e-06 9.370269e-09 - fluid pressure 5.162097e-01 3.122812e-03 5.737956e-05 + residual 1.932655e-03 2.265938e-12 0.000000e+00 + energy 1.569022e-03 7.551533e-09 1.569022e-05 + displacement 9.091077e-03 3.370741e-06 9.369905e-09 + fluid pressure 5.162096e-01 3.338238e-03 5.752217e-05 + ************************************************************************* + * WARNING * + * * + * The BFGS update has failed. * + * Stiffness matrix will now be reformed. * + ************************************************************************* +Reforming stiffness matrix: reformation #2 + 3 Nonlinear solution status: time= 0.804 - stiffness updates = 2 + stiffness updates = 0 right hand side evaluations = 4 - stiffness matrix reformations = 1 + stiffness matrix reformations = 3 step from line search = 1.000000 convergence norms : INITIAL CURRENT REQUIRED - residual 1.932659e-03 2.103047e-11 0.000000e+00 - energy 1.569026e-03 4.045379e-11 1.569026e-05 - displacement 9.091084e-03 5.600920e-09 9.367493e-09 - fluid pressure 5.162097e-01 5.170874e-06 5.746469e-05 + residual 1.932655e-03 3.822583e-18 0.000000e+00 + energy 1.569022e-03 6.323447e-13 1.569022e-05 + displacement 9.091077e-03 3.403244e-10 9.368367e-09 + fluid pressure 5.162096e-01 2.266730e-07 5.747931e-05 convergence summary number of iterations : 3 - number of reformations : 1 + number of reformations : 3 ------- converged at time : 0.804 @@ -285,36 +324,52 @@ MUST POINT CONTROLLER: adjusting time step. dt = 0.196 stiffness matrix reformations = 1 step from line search = 1.000000 convergence norms : INITIAL CURRENT REQUIRED - residual 9.122450e-04 2.576700e-07 0.000000e+00 - energy 6.912367e-04 9.059348e-07 6.912367e-06 - displacement 3.872251e-03 3.872251e-03 3.872251e-09 - fluid pressure 2.536727e-01 2.536727e-01 2.536727e-05 + residual 9.120197e-04 2.576994e-07 0.000000e+00 + energy 6.910316e-04 9.035306e-07 6.910316e-06 + displacement 3.872026e-03 3.872026e-03 3.872026e-09 + fluid pressure 2.536566e-01 2.536566e-01 2.536566e-05 + ************************************************************************* + * WARNING * + * * + * The BFGS update has failed. * + * Stiffness matrix will now be reformed. * + ************************************************************************* +Reforming stiffness matrix: reformation #1 + 2 Nonlinear solution status: time= 1 - stiffness updates = 1 + stiffness updates = 0 right hand side evaluations = 3 - stiffness matrix reformations = 1 + stiffness matrix reformations = 2 step from line search = 1.000000 convergence norms : INITIAL CURRENT REQUIRED - residual 9.122450e-04 2.082686e-10 0.000000e+00 - energy 6.912367e-04 1.653436e-09 6.912367e-06 - displacement 3.872251e-03 6.170357e-07 3.947902e-09 - fluid pressure 2.536727e-01 1.324790e-03 2.741645e-05 + residual 9.120197e-04 9.249546e-14 0.000000e+00 + energy 6.910316e-04 9.268792e-10 6.910316e-06 + displacement 3.872026e-03 6.379711e-07 3.948653e-09 + fluid pressure 2.536566e-01 1.390787e-03 2.745954e-05 + ************************************************************************* + * WARNING * + * * + * The BFGS update has failed. * + * Stiffness matrix will now be reformed. * + ************************************************************************* +Reforming stiffness matrix: reformation #2 + 3 Nonlinear solution status: time= 1 - stiffness updates = 2 + stiffness updates = 0 right hand side evaluations = 4 - stiffness matrix reformations = 1 + stiffness matrix reformations = 3 step from line search = 1.000000 convergence norms : INITIAL CURRENT REQUIRED - residual 9.122450e-04 5.081877e-13 0.000000e+00 - energy 6.912367e-04 2.592626e-12 6.912367e-06 - displacement 3.872251e-03 4.946868e-10 3.948488e-09 - fluid pressure 2.536727e-01 8.938841e-07 2.745222e-05 + residual 9.120197e-04 2.062268e-19 0.000000e+00 + energy 6.910316e-04 5.167865e-14 6.910316e-06 + displacement 3.872026e-03 3.975684e-11 3.948326e-09 + fluid pressure 2.536566e-01 2.411182e-08 2.745076e-05 convergence summary number of iterations : 3 - number of reformations : 1 + number of reformations : 3 ------- converged at time : 1 @@ -325,19 +380,41 @@ N O N L I N E A R I T E R A T I O N I N F O R M A T I O N Number of time steps completed .................... : 4 - Total number of equilibrium iterations ............ : 12 + Total number of equilibrium iterations ............ : 11 - Average number of equilibrium iterations .......... : 3 + Average number of equilibrium iterations .......... : 2.75 - Total number of right hand evaluations ............ : 16 + Total number of right hand evaluations ............ : 15 - Total number of stiffness reformations ............ : 4 + Total number of stiffness reformations ............ : 11 - Time in solver: 0:00:00 + Time in linear solver: 0:00:00 Elapsed time : 0:00:00 + T I M I N G I N F O R M A T I O N + + Input time ...................... : 0:00:00 (0 sec) + + Initialization time ............. : 0:00:00 (0 sec) + + Solve time ...................... : 0:00:00 (0 sec) + + IO-time (plot, dmp, data) .... : 0:00:00 (0 sec) + + reforming stiffness .......... : 0:00:00 (0 sec) + + evaluating stiffness ......... : 0:00:00 (0 sec) + + evaluating residual .......... : 0:00:00 (0 sec) + + model update ................. : 0:00:00 (0 sec) + + time in linear solver ........ : 0:00:00 (0 sec) + + Total elapsed time .............. : 0:00:00 (0 sec) + N O R M A L T E R M I N A T I O N diff --git a/febio/verification/test.xplt b/febio/verification/test.xplt index bd88197e19bb42e3b8fffa850962cd4a95676242..336536314daf683a08c0deb21afe8d329785ff1c 100644 GIT binary patch literal 6184 zcmeHLeNYtV8Q;A-R78}D7!_1Ljy5$m5=DjG_YSqCiq#~I2pEilijfv6dWe~{B}7f4 zX(Gf<{fvqt(KcgMD&XzzomCr+A|+x!l9_~L;%C(+tqI! ze=$pU`UD<@+M7+iba#?XOe1k?JWS*95Sz#IlrJyxcm$!}jRJkTHQv6uK>R#Mjy~SU z$ma*g=IYPZH~@JZ_&iS0;>AS^%Zn?D;un{!C|(p_hOjG^7YW9?x*Ny5f9CZB)amy* zL>Gka#-Z%RGJXH-Vm8gU(er=L%dVf%l;W}_g`VPtdVn7Mh@@%O4xCLuJF}$FQ{HoF zI`@0E?UbLLut{VM?f9`h$Qe_t+SnJa{bWgDX;BY#1JfL090a2r;?J=EWXo}|!CQs_ zbBjm#yc@&%bFeYaGtIB!K3Uy2p1XXGlU^5>`{0_!yL^)d*Ma37siEm(aJYtP9JSoBa0(Kvm3r%dkKLW!IUt=*GY*E zF^?RPtP@rT1Mg70tiT5rMjfwO+*Qtnk8$w&Q}0I|7k>d2FGF%Nub4xx_y1_sTc)Un^3i~X>UK?|D0sAKI|_mgC>Zk#*6 zH&`pbH&_Q>w|*~Zjd7Sm7I|PVW2plhPJIM*YPM+*5kwpA1AT{W&{PZ*9Ur3cYbzdf0U zYg5pJc-@_XJ2`_U@iik~+{rYuJzX<2Q%#zB2@n=)Ep|%Cg(_v}J0g zyr|bEl)M1{W{aQ>dNuqAe1eiW{_Bpb&Xo0Y(jNcfJ&E(bY_rSr+Ak_=h6ZrX7q9+P zy5=97JaArkI&|i5o2-1YE>?nnLEq3!ho(7CJ`dK=(br|h@8_H2hQcxP%{iETp&RuS zUY@2t7Iq`8ckOQF=zsU5dgvf#~xOTc+ORpwQz+m5c2HovmU`%d(qCO9*H zm%g_m$7{ix2=@Z#^;CEICH36ovh?F|RZ9A|MoK>&^{_IlY^^fByhD{wzV3~ie@OXi z!^4vB%;EIYN2?SIUm?B}gs%|a3w|i|^icFMbw+KCR-75(OQ<-i{rOp@rq+MWezhda zuGNFad%JZ$s2i?Jw4;aB-|DF z1;0$y5;w-C!{_%0{`ty{&a01mq?7~wyZ95c(wVDvu;z&$rsJG{BrSnOE#2w-`(wK$ z%*|Q&nmTjL3o?A)ZMXA{oGVguy~vi=k5Mzeu9g?~Zj~?Rbvg^HZ|i)n13u-$kPqT= z+=$B%*U*=tZ)nQUH0R0Z!J2i<`2GA)_-2mP=X(pB``xLh+NB$`vNes$bJbzmqwQ-O z51c7cKiqvnw&3Flmx1$o`ZD*A+V#^-az^XBN_ck5#ChJk((L{EHGy zO{(20jr{9I^?3GV`P`~Jb^6&qsK0r0xUX-lL+vFATJm3V<-NnMOZ}(&RSRDwz8r+F z5?=v7lzRG1srQw9waz#6*-v~6PxSUTeA>$V<+1MU);#z1s%7bsb*Ap9r7MJ!n1MY@bR0_UZojsjg|gD{PUod>Y*?hKE=}C3u-QFo%6zVob%sZd7DLFeAC%kjW?-g+Fcc-56g$m#3`H|YCQ&+Sd1Co`O?c=oC-CLOj zmk4LTc|GmFQ14sT@C$Zls;W*{QQ%FDX_2erUs5f2I^imCUQeeQs(r53OnJfiQtd@= zUsk!wsqIjdcxm{l_SUQ!To^$c|?{kH{vNd@b_a?7v7M(+Ufp@z;1qLL>K>W;j>*a zjovM0Gx$YPV{3~}YYldrup z>LBx_++uA{6(+B$O4T|1t{VBckWWBAFk-}YAuc$i&!BH;GH9Cf%2eaRudb(71&{uh9mUd#=BfdT>eaeOGDs5%&4rak6!WnR0PsiT-%y(&9E8FsN zls39*h_YUaVI!p$)q+ceYruIuwN7pKHO?xRosEii{>=B-xjRd>Q;v_c4Joq!@Zc;h z@{Ks(jKOnQpXoL>dw+*!;cLWaLHHW+HSj~JCvWa`|7~xA|NOfB{*T*69o61Sb*~Oj m%4ph@o3VGe>c$v2z%Uj{J)IGsR&G4nI-yj(s2F||{Qm%j5JbKJ literal 6136 zcmeHKeNYtV8Q;A-B|!WH3<4SuiN=qLh{Emef!acXNsDb!z$$78RvaYgofwmEmdsUMw+NgJ$VYg7CD_VzW)4VdF*@?Ur6 z+4tGs`+I)R^SCVnvu zJUuS}N+V)1W!8OiISctyX?(rZUQxENxMXQbxdS-6s+xD0;kUl~^~J|)IgULiC-2m7 z#^a`%_;eEY&xcxBKICTk?2hFnc00$VhP?7b0uIyn&$rPppMM_2vOMrvo{~k2N{St& zl_l|u%2t%V9$$g9E0&jVJ*?}-x8yPIpK(1tb-KTa>>T%PdD18P?H_06E42MH^LZ3+ zqUUeU%dDNz^wNsO3+<)FT7n>MJZT!WeP`p-&MI4IcLXm@=iXHtFNc}1sWj@^@hL&n zj1Yfq>0o4r(r{^WaF~W64%ic1=W2X|j`keD98tRDW^up` zSGRhw6OA}?TxQ+ZdN0A(BM9L}Soi`Ocp4GIju3Hu$-n{DhYTO7 zIC92?k9qL=lRZlY47>qk{m25T2^yBC)YM%K_{O{}{~9n4-XOApWT@#T z4Nu!AXt0`~iG6BBjJ{9U58#8zBFV4^z#_<^$gl^D+ua;$A42vV8ERu(#DNdZXfo_8 zFlY`X!@e>u_P~D*TF{Ik!+NpSnKbyX73*W~1lGaUs+~WrF%B^_q7Lj|EE%w2WW&km zGQA8DjyK`lO*Crz1c)=4#%T#mrkx~6-#MnOG}3pe#z7AH&N1P01J_eNH++Qu-@lt3 zu$WBi_4DbV4F2bHg)kgZauC_kv%$pSwOJ5EzTSr5oqUyo*qTu<-pO->#R|h+npHN_}gNV)f5U^@#rU=y?U?)%6AF>zY<*8tY_rVKnL+@t*uZ_(qPu&-NBL^SNI1 z(_lxsa>Lw_KA^5%-ajiWZU2Q7xqi|{0r&&L2m5dr;le(`SwF2Us8QZKRxRv#cb&T~ z;*%+HSxwfu%GvHUI$le7ZNw)n!?T*)`v_BHV#Bn9LZmU|9 z748{Pc}#8kxulG8K9V*r&atgLRVHB$9AKCWq@P?b9(QfJwWfL7o+C$fe=>YJ_ip=X zZq12|VEQTPi%J@e$;!i``(XUCJTOM}N z(d&`?>(TQ{$gAs%(APCZXd3HebzwBF%ZT^n2f{aU{C&2!z?t8herjC0O?`Povs_uz zM;#hj-F)y|netiv@5Mue&mepS;Zq~4Clf9LXZu$Thw!Py9N1=+m+wsO%v~|D^QBtPAa>8JIwQDtVMZ2 z;M6Za%@?gPcLmc7uX2U>t>5q!;)~$#B>qaB|MySxmGqdqGWdb?(-qn2Nqto9d1KKH z&+QW-Ue{mRr8AD$jDGC}87Woo+b{CO2i!I+3?r|OMBLc_khxZIP{E4j}YB=L(b`G}1Z@I0$ zwkos>{}1+uT0d3(ZM%rr`8&$h=JT&fx(?SdtgrN=nU|%MJyB}Q2g{`GD}Sf)*L=~* zbdXldOZC_c^=P=BS3+K0UxL1_DM8b?E-gsE8P{dRd-8RDPtzK1emXF_pS)pNxNF6xy|V77!KVZ4wx4|e z_j}(@x#Nf1=AHdW>nHqXJQ|wg`S7`)h`=eA)=$3Ql3dcbWt?Q>^P#hB2b*5-G|f)# z!oM|Z5@NYWjw>Q!C)6BL+RYK4Nj{ z_1FycXtcfiu51{q#L&qv!Lm zJatvhSkJN59{KxuRjM=Ox-^#XtAxMh!v(@6;H;m%zVwCX-h1s*TlGM-d}FlyR$7$w zhP71z-a&Y~4;KhmfwO)}&%W%ro#zlwH_Gbu(?5{@`roB$QJ-rnmn?d(4b4$&x5jy* zA`7LIY?E~Uz;$&>SH4Po$)7(YvQV9rZBj21KahTUHUF+x{3yYDa{WPXWc!$7|Js+D qQSeM+X5Vf3nV-cd8JGhH80G@$r?vbX`Cgy%Q{Ha5DeHa<{Qm(`cNg9O