diff --git a/processing/misc/yieldSurface.py b/processing/misc/yieldSurface.py index 2bd73f867..171e3dfc2 100755 --- a/processing/misc/yieldSurface.py +++ b/processing/misc/yieldSurface.py @@ -44,28 +44,32 @@ def principalStress(p): I1s3I2= (I1**2 - 3.0*I2)**0.5 numer = 2.0*I1**3 - 9.0*I1*I2 + 27.0*I3 - denom = I1s3I2**(-3.0) - cs = 0.5*numer*denom + denom = 0.5*I1s3I2**(-3.0) + cs = numer*denom + phi = np.arccos(cs)/3.0 t1 = I1/3.0; t2 = 2.0/3.0*I1s3I2 return np.array( [t1 + t2*cos(phi), t1+t2*cos(phi+np.pi*2.0/3.0), t1+t2*cos(phi+np.pi*4.0/3.0)]) -def principalStrs_Der(p, (s1, s2, s3, s4, s5, s6), Karafillis=False): +def principalStrs_Der(p, (s1, s2, s3, s4, s5, s6), dim, Karafillis=False): + ''' + The derivative of principal stress with respect to stress + ''' sin = np.sin; cos = np.cos I1,I2,I3 = invariant(p) third = 1.0/3.0 I1s3I2= (I1**2 - 3.0*I2)**0.5 numer = 2.0*I1**3 - 9.0*I1*I2 + 27.0*I3 - denom = I1s3I2**(-3.0) - cs = 0.5*numer*denom + denom = 0.5*I1s3I2**(-3.0) + cs = numer*denom phi = np.arccos(cs)*third dphidcs = -third/np.sqrt(1.0 - cs**2) dcsddenom = 0.5*numer*(-1.5)*I1s3I2**(-5.0) - dcsdI1 = 0.5*(6.0*I1**2 - 9.0*I2)*denom + dcsddenom*(2.0*I1) - dcsdI2 = 0.5*( - 9.0*I1)*denom + dcsddenom*(-3.0) - dcsdI3 = 13.5*denom + dcsdI1 = (6.0*I1**2 - 9.0*I2)*denom + dcsddenom*(2.0*I1) + dcsdI2 = ( - 9.0*I1)*denom + dcsddenom*(-3.0) + dcsdI3 = 27.0*denom dphidI1, dphidI2, dphidI3 = dphidcs*dcsdI1, dphidcs*dcsdI2, dphidcs*dcsdI3 dI1s3I2dI1= I1/I1s3I2; dI1s3I2dI2 = -1.5/I1s3I2 @@ -77,21 +81,28 @@ def principalStrs_Der(p, (s1, s2, s3, s4, s5, s6), Karafillis=False): dSdI = np.array([dSidIj(phi),dSidIj(phi+np.pi*2.0/3.0),dSidIj(phi+np.pi*4.0/3.0)]) # i=1,2,3; j=1,2,3 # calculate the derivation of principal stress with regards to the anisotropic coefficients - one = np.ones_like(s1); zero = np.zeros_like(s1); dim = len(s1) + one = np.ones_like(s1); zero = np.zeros_like(s1); num = len(s1) dIdp = np.array([[one, one, one, zero, zero, zero], [p[1]+p[2], p[2]+p[0], p[0]+p[1], -2.0*p[3], -2.0*p[4], -2.0*p[5]], [p[1]*p[2]-p[4]**2, p[2]*p[0]-p[5]**2, p[0]*p[1]-p[3]**2, -2.0*p[3]*p[2]+2.0*p[4]*p[5], -2.0*p[4]*p[0]+2.0*p[5]*p[3], -2.0*p[5]*p[1]+2.0*p[3]*p[4]] ]) if Karafillis: dpdc = np.array([[zero,s2-s3,s3-s2], [s1-s3,zero,s3-s1], [s1-s2,s2-s1,zero]]) - dSdp = np.array([np.dot(dSdI[:,:,i],dIdp[:,:,i]).T for i in xrange(dim)]).T - return np.concatenate((np.array([np.dot(dSdp[:,0:3,i], dpdc[:,:,i].T).T/3.0 for i in xrange(dim)]).T, - np.vstack([dSdp[:,3]*s4,dSdp[:,4]*s5,dSdp[:,5]*s6]).T.reshape(dim,3,3).T), axis=1) + dSdp = np.array([np.dot(dSdI[:,:,i],dIdp[:,:,i]).T for i in xrange(num)]).T + if dim == 2: temp = np.vstack([dSdp[:,3]*s4]).T.reshape(num,1,3).T + else: temp = np.vstack([dSdp[:,3]*s4,dSdp[:,4]*s5,dSdp[:,5]*s6]).T.reshape(num,3,3).T + return np.concatenate((np.array([np.dot(dSdp[:,0:3,i], dpdc[:,:,i].T).T/3.0 for i in xrange(num)]).T, + temp), axis=1) else: - dIdc=np.array([[-dIdp[i,0]*s2, -dIdp[i,1]*s1, -dIdp[i,1]*s3, - -dIdp[i,2]*s2, -dIdp[i,2]*s1, -dIdp[i,0]*s3, - dIdp[i,3]*s4, dIdp[i,4]*s5, dIdp[i,5]*s6 ] for i in xrange(3)]) - return np.array([np.dot(dSdI[:,:,i],dIdc[:,:,i]).T for i in xrange(dim)]).T + if dim == 2: + dIdc=np.array([[-dIdp[i,0]*s2, -dIdp[i,1]*s1, -dIdp[i,1]*s3, + -dIdp[i,2]*s2, -dIdp[i,2]*s1, -dIdp[i,0]*s3, + dIdp[i,3]*s4 ] for i in xrange(3)]) + else: + dIdc=np.array([[-dIdp[i,0]*s2, -dIdp[i,1]*s1, -dIdp[i,1]*s3, + -dIdp[i,2]*s2, -dIdp[i,2]*s1, -dIdp[i,0]*s3, + dIdp[i,3]*s4, dIdp[i,4]*s5, dIdp[i,5]*s6 ] for i in xrange(3)]) + return np.array([np.dot(dSdI[:,:,i],dIdc[:,:,i]).T for i in xrange(num)]).T def invariant(sigmas): s11,s22,s33,s12,s23,s31 = sigmas @@ -132,18 +143,19 @@ class Criteria(object): ''' residuum of anisotropic Barlat 1991 yield criterion (eq. 2.37) ''' - def __init__(self, criterion, uniaxialStress,exponent): + def __init__(self, criterion, uniaxialStress,exponent, dimension): self.stress0 = uniaxialStress - if exponent < 0.0: + if exponent < 0.0: # The exponent m is undetermined self.mFix = [False, exponent] - else: + else: # The exponent m is fixed self.mFix = [True, exponent] self.func = fitCriteria[criterion]['func'] self.criteria = criterion + self.dim = dimension def fun(self, paras, ydata, sigmas): - return self.func(self.stress0, paras, sigmas,self.mFix,self.criteria) + return self.func(self.stress0, paras, sigmas,self.mFix,self.criteria,self.dim) def jac(self, paras, ydata, sigmas): - return self.func(self.stress0, paras, sigmas,self.mFix,self.criteria,Jac=True) + return self.func(self.stress0, paras, sigmas,self.mFix,self.criteria,self.dim,Jac=True) class Vegter(object): ''' @@ -232,11 +244,11 @@ def VetgerCriterion(stress,lankford, rhoBi0, theta=0.0): vegter = Vegter(refPts, refNormals) -def Tresca(eqStress, paras, sigmas, mFix, criteria, Jac = False): +def Tresca(eqStress, paras, sigmas, mFix, criteria, dim, Jac = False): ''' Tresca yield criterion the fitted parameters is: paras(sigma0) - eqStress, mFix, criteria are invalid input + eqStress, mFix, criteria, dim are invalid input ''' if not Jac: lambdas = principalStresses(sigmas) @@ -247,7 +259,7 @@ def Tresca(eqStress, paras, sigmas, mFix, criteria, Jac = False): else: return -np.ones(len(sigmas)) -def Cazacu_Barlat(eqStress, paras, sigmas, mFix, criteria, Jac = False): +def Cazacu_Barlat(eqStress, paras, sigmas, mFix, criteria, dim, Jac = False): ''' Cazacu-Barlat (CB) yield criterion the fitted parameters are: @@ -294,7 +306,7 @@ def Cazacu_Barlat(eqStress, paras, sigmas, mFix, criteria, Jac = False): df = r/f0/108.0 return np.vstack((df*3.0*J20**2.0*dJ2da, -df*2.0*J30*c*dJ3db, -df*J30**2)).T -def Drucker(eqStress, paras, sigmas, mFix, criteria, Jac = False): +def Drucker(eqStress, paras, sigmas, mFix, criteria, dim, Jac = False): ''' Drucker yield criterion the fitted parameters are @@ -334,20 +346,25 @@ def Drucker(eqStress, paras, sigmas, mFix, criteria, Jac = False): if mFix[0]: return np.vstack((-r/sigma0, -drdl*J3_2p)).T else: return np.vstack((-r/sigma0, -drdl*J3_2p, jp)).T -def Hill1948(eqStress, paras, sigmas, mFix, criteria, Jac = False): +def Hill1948(eqStress, paras, sigmas, mFix, criteria, dim, Jac = False): ''' Hill 1948 yield criterion - the fitted parameters are F, G, H, L, M, N + the fitted parameters are: + F, G, H, L, M, N for 3D + F, G, H, N for 2D eqStress, mFix, criteria are invalid input ''' s11,s22,s33,s12,s23,s31 = sigmas - jac = np.array([(s22-s33)**2,(s33-s11)**2,(s11-s22)**2, 2.0*s23**2,2.0*s31**2,2.0*s12**2]) + if dim == 2: # plane stress + jac = np.array([ s22**2, s11**2, (s11-s22)**2, 2.0*s12**2]) + else: # general case + jac = np.array([(s22-s33)**2,(s33-s11)**2,(s11-s22)**2, 2.0*s23**2,2.0*s31**2,2.0*s12**2]) if not Jac: return (np.dot(paras,jac)/2.0-0.5).ravel() else: return jac.T -def Hill1979(eqStress,paras, sigmas, mFix, criteria, Jac = False): +def Hill1979(eqStress,paras, sigmas, mFix, criteria, dim, Jac = False): ''' Hill 1979 yield criterion the fitted parameters are: f,g,h,a,b,c,m @@ -362,20 +379,19 @@ def Hill1979(eqStress,paras, sigmas, mFix, criteria, Jac = False): diffs = np.array([s2-s3, s3-s1, s1-s2, 2.0*s1-s2-s3, 2.0*s2-s3-s1, 2.0*s3-s1-s2])**2 #diffs = np.array([s[1]-s[2], s[2]-s[0], etc ... s1-s2, 2.0*s1-s2-s3, 2.0*s2-s3-s1, 2.0*s3-s1-s2])**2 diffsm = diffs**(m/2.0) - base = np.dot(coeff,diffsm) - r = base**(1.0/m)/eqStress #left = base**mi + left = np.dot(coeff,diffsm) + r = (0.5*left)**(1.0/m)/eqStress #left = base**mi if not Jac: return (r-1.0).ravel() else: - drdb = r/base/m - dbdm = np.dot(coeff,diffsm*math_ln(diffs)) #****0.5 - jm = drdb*dbdm + r*math_ln(base)/(-m**2) + drdl, dldm = r/left/m, np.dot(coeff,diffsm*math_ln(diffs))*0.5 + jm = drdl*dldm + r*math_ln(0.5*left)*(-1.0/m/m) #/(-m**2) - if mFix[0]: return np.vstack((drdb*diffsm)).T - else: return np.vstack((drdb*diffsm, jm)).T + if mFix[0]: return np.vstack((drdl*diffsm)).T + else: return np.vstack((drdl*diffsm, jm)).T -def Hosford(eqStress, paras, sigmas, mFix, criteria, Jac = False): +def Hosford(eqStress, paras, sigmas, mFix, criteria, dim, Jac = False): ''' Hosford family criteria the fitted parameters are: @@ -385,26 +401,25 @@ def Hosford(eqStress, paras, sigmas, mFix, criteria, Jac = False): ''' if criteria == 'vonmises': - coeff = np.ones(3) sigma0 = paras + coeff = np.ones(3) a = 2.0 elif criteria == 'hershey': - coeff = np.ones(3) sigma0 = paras[0] + coeff = np.ones(3) if mFix[0]: a = mFix[1] else: a = paras[1] else: - coeff = paras[0:3] sigma0 = eqStress + coeff = paras[0:3] if mFix[0]: a = mFix[1] else: a = paras[3] s1,s2,s3 = principalStresses(sigmas) - diffs = np.abs(np.array([s2-s3, s3-s1, s1-s2])) - diffsm = diffs**a - base = np.dot(coeff,diffsm) - expo = 1.0/a - r = (base/2.0)**expo/sigma0 + diffs = np.array([s2-s3, s3-s1, s1-s2])**2 + diffsm = diffs**(a/2.0) + left = np.dot(coeff,diffsm) + r = (0.5*left)**(1.0/a)/sigma0 if not Jac: return (r-1.0).ravel() @@ -412,17 +427,16 @@ def Hosford(eqStress, paras, sigmas, mFix, criteria, Jac = False): if criteria == 'vonmises': # von Mises return -r/sigma0 else: - dbda = np.dot(coeff,diffsm*math_ln(diffs)) - drdb = r/base*expo - ja = drdb*dbda + r*math_ln(base/2.0)*(-expo*expo) + drdl, dlda = r/left/a, np.dot(coeff,diffsm*math_ln(diffs))*0.5 + ja = drdl*dlda + r*math_ln(0.5*left)*(-1.0/a/a) if criteria == 'hershey': # Hershey if mFix[0]: return -r/sigma0 else: return np.vstack((-r/sigma0, ja)).T else: # Anisotropic Hosford - if mFix[0]: return np.vstack((drdb*diffsm)).T - else: return np.vstack((drdb*diffsm, ja)).T + if mFix[0]: return np.vstack((drdl*diffsm)).T + else: return np.vstack((drdl*diffsm, ja)).T -def Barlat1989(eqStress, paras, sigmas, mFix, criteria, Jac=False): +def Barlat1989(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): ''' Barlat-Lian 1989 yield criteria the fitted parameters are: @@ -432,8 +446,8 @@ def Barlat1989(eqStress, paras, sigmas, mFix, criteria, Jac=False): if mFix[0]: m = mFix[1] #??? else: m = paras[-1] - s11 = sigmas[0]; s22 = sigmas[1]; s12 = sigmas[3] - k1,k2 = (s11 + h*s22)/2.0, ((s11 - h*s22)**2/4.0 + (p*s12)**2)**0.5 + s11,s22,s12 = sigmas[0], sigmas[1], sigmas[3] + k1,k2 = 0.5*(s11 + h*s22), (0.25*(s11 - h*s22)**2 + (p*s12)**2)**0.5 fs = np.array([ (k1+k2)**2, (k1-k2)**2, 4.0*k2**2 ]); fm = fs**(m/2.0) left = np.dot(np.array([a,a,c]),fm) r = (0.5*left)**(1.0/m)/eqStress @@ -442,10 +456,11 @@ def Barlat1989(eqStress, paras, sigmas, mFix, criteria, Jac=False): return (r-1.0).ravel() else: dk1dh = 0.5*s22 - dk2dh, dk2dp = 0.5/k2*(s11-h*s22)*(-s22), 0.5/k2*2.0*p*s12**2 + dk2dh, dk2dp = 0.25*(s11-h*s22)*(-s22)/k2, p*s12**2/k2 dlda, dldc = fm[0]+fm[1], fm[2] - dldk1, dldk2 = left[0]*m/(k1+k2)+left[1]*m/(k1-k2), left[0]*m/(k1+k2)-left[1]*m/(k1-k2)+left[2]*m/k2 - drdl, drdm = r/m/left, r*math_ln(0.5*left)/(-m*m) + fm1 = fs**(m/2.0-1.0)*m + dldk1, dldk2 = a*fm1[0]*(k1+k2)+a*fm1[1]*(k1-k2), a*fm1[0]*(k1+k2)-a*fm1[1]*(k1-k2)+c*fm1[2]*k2*4.0 + drdl, drdm = r/m/left, r*math_ln(0.5*left)*(-1.0/m/m) dldm = np.dot(np.array([a,a,c]),fm*math_ln(fs))*0.5 ja,jc = drdl*dlda, drdl*dldc @@ -455,27 +470,29 @@ def Barlat1989(eqStress, paras, sigmas, mFix, criteria, Jac=False): if mFix[0]: return np.vstack((ja,jc,jh,jp)).T else: return np.vstack((ja,jc,jh,jp,jm)).T -def Barlat1991(eqStress, paras, sigmas, mFix, criteria, Jac=False): +def Barlat1991(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): ''' Barlat 1991 criteria the fitted parameters are: Isotropic: sigma0, m - Anisotropic: a, b, c, f, g, h, m + Anisotropic: a, b, c, f, g, h, m for 3D + a, b, c, h, m for plane stress m is optional ''' - if criteria == 'barlat1991iso': - sigma0 = paras[0] - coeff = np.ones(6) - else: - sigma0 = eqStress - coeff = paras[0:6] - if mFix[0]:m = mFix[1] - else: m = paras[-1] - + sigma0 = eqStress + if dim == 2: coeff = paras[0:4] # plane stress + else: coeff = paras[0:6] # general case + if mFix[0]: m = mFix[1] + else: m = paras[-1] + cos = np.cos; sin = np.sin; pi = np.pi; abs = np.abs - s1,s2,s3,s4,s5,s6 = sigmas - dXdx = np.array([s2-s3,s3-s1,s1-s2,s5,s6,s4]) - A,B,C,F,G,H = np.array(coeff)[:,None]*dXdx + s11,s22,s33,s12,s23,s31 = sigmas + if dim == 2: + dXdx = np.array([s22,s33-s11,s11-s22,s12]) + A,B,C,H = np.array(coeff)[:,None]*dXdx; F=G=0.0 + else: + dXdx = np.array([s22-s33,s33-s11,s11-s22,s23,s31,s12]) + A,B,C,F,G,H = np.array(coeff)[:,None]*dXdx I2 = (F*F + G*G + H*H)/3.0+ ((A-C)**2+(C-B)**2+(B-A)**2)/54.0 I3 = (C-B)*(A-C)*(B-A)/54.0 + F*G*H - ((C-B)*F*F + (A-C)*G*G + (B-A)*H*H)/6.0 @@ -489,28 +506,29 @@ def Barlat1991(eqStress, paras, sigmas, mFix, criteria, Jac=False): return (r - 1.0).ravel() else: dfdl = r/left/m - jm = r*math_ln(left)/(-m**2) + dfdl*0.5*( + jm = r*math_ln(left)*(-1.0/m/m) + dfdl*0.5*( absc1**m*math_ln(absc1) + absc2**m*math_ln(absc2) + absc3**m*math_ln(absc3) ) - if criteria == 'barlat1991iso': - js = -r/sigma0 - if mFix[0]: return js - else: return np.vstack((js,jm)).T + + da,db,dc = (2.0*A-B-C)/18.0, (2.0*B-C-A)/18.0, (2.0*C-A-B)/18.0 + if dim == 2: + dI2dx = np.array([da, db, dc, H])/1.5*dXdx + dI3dx = np.array([da*(B-C) + (H**2-G**2)/2.0, db*(C-A) + (F**2-H**2)/2.0, dc*(A-B) + (G**2-F**2)/2.0, + (G*F + (A-B))*H])/3.0*dXdx else: - da,db,dc = (2.0*A-B-C)/18.0, (2.0*B-C-A)/18.0, (2.0*C-A-B)/18.0 dI2dx = np.array([da, db, dc, F,G,H])/1.5*dXdx dI3dx = np.array([da*(B-C) + (H**2-G**2)/2.0, db*(C-A) + (F**2-H**2)/2.0, dc*(A-B) + (G**2-F**2)/2.0, - (H*G + (B-C))*F, (F*H + (C-A))*G, (G*F + (A-B))*H])/3.0*dXdx - darccos = -(1.0 - I3**2/I2**3)**(-0.5) + (H*G + (B-C))*F, (F*H + (C-A))*G, (G*F + (A-B))*H])/3.0*dXdx + darccos = -(1.0 - I3**2/I2**3)**(-0.5) - dfdc = dfdl*0.5*m - dfdcos = lambda phi : dfdc*(2.0*abs(cos(phi)))**(1.0/m-1.0)*np.sign(cos(phi))*(-sin(phi)/1.5) - dfdthe= (dfdcos(phi1) + dfdcos(phi2) + dfdcos(phi3)) - dfdI2 = dfdthe*darccos*I3*(-1.5)*I2**(-2.5); dfdI3 = dfdthe*darccos*I2**(-1.5) + dfdc = dfdl*0.5*m + dfdcos = lambda phi : dfdc*(2.0*abs(cos(phi)))**(1.0/m-1.0)*np.sign(cos(phi))*(-sin(phi)/1.5) + dfdthe= (dfdcos(phi1) + dfdcos(phi2) + dfdcos(phi3)) + dfdI2, dfdI3 = dfdthe*darccos*I3*(-1.5)*I2**(-2.5), dfdthe*darccos*I2**(-1.5) - if mFix[0]: return np.vstack((dfdI2*dI2dx+dfdI3*dI3dx)).T - else: return np.vstack((dfdI2*dI2dx+dfdI3*dI3dx, jm)).T + if mFix[0]: return np.vstack((dfdI2*dI2dx + dfdI3*dI3dx)).T + else: return np.vstack((dfdI2*dI2dx + dfdI3*dI3dx, jm)).T -def BBC2000(eqStress, paras, sigmas, mFix, criteria, Jac=False): +def BBC2000(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): ''' BBC2000 yield criterion the fitted parameters are @@ -566,7 +584,7 @@ def BBC2000(eqStress, paras, sigmas, mFix, criteria, Jac=False): if mFix[0]: return np.vstack((ja,jb,jc,jd, je, jf,jg)).T else: return np.vstack((ja,jb,jc,jd, je, jf,jg,jk)).T -def BBC2003(eqStress, paras, sigmas, mFix, criteria, Jac=False): +def BBC2003(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): ''' BBC2003 yield criterion the fitted parameters are @@ -611,7 +629,7 @@ def BBC2003(eqStress, paras, sigmas, mFix, criteria, Jac=False): if mFix[0]: return np.vstack(J).T else : return np.vstack((J, drdl*dldk+drdk)).T -def BBC2005(eqStress, paras, sigmas, mFix, criteria, Jac=False): +def BBC2005(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): ''' BBC2005 yield criterion the fitted parameters are @@ -661,7 +679,7 @@ def BBC2005(eqStress, paras, sigmas, mFix, criteria, Jac=False): if mFix[0]: return np.vstack(J).T else : return np.vstack(J, dldk+dsBarde*dedk).T -def Yld2000(eqStress, paras, sigmas, mFix, criteria, Jac=False): +def Yld2000(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): ''' C: c11,c22,c66 c12=c21=1.0 PASS D: d11,d12,d21,d22,d66 @@ -708,15 +726,17 @@ def Yld2000(eqStress, paras, sigmas, mFix, criteria, Jac=False): if mFix[0]: return np.vstack((jC,jD)).T else: return np.vstack((jC,jD,jm)).T -def Yld200418p(eqStress, paras, sigmas, mFix, criteria, Jac=False): +def Yld200418p(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): ''' Yld2004-18p yield criterion the fitted parameters are - C: c12,c21,c23,c32,c13,c31,c44,c55,c66; D: d12,d21,d23,d32,d31,d13,d44,d55,d66 + C: c12,c21,c23,c32,c13,c31,c44,c55,c66; D: d12,d21,d23,d32,d31,d13,d44,d55,d66 for 3D + C: c12,c21,c23,c32,c13,c31,c44; D: d12,d21,d23,d32,d31,d13,d44 for 2D and m, m is optional criteria are invalid input ''' - C,D = paras[0:9], paras[9:18] + if dim == 2: C,D = np.append(paras[0:7],[0.0,0.0]), np.append(paras[7:14],[0.0,0.0]) + else: C,D = paras[0:9], paras[9:18] if mFix[0]: m = mFix[1] else: m = paras[-1] @@ -727,45 +747,47 @@ def Yld200418p(eqStress, paras, sigmas, mFix, criteria, Jac=False): p,q = ys(sdev, C), ys(sdev, D) pLambdas, qLambdas = principalStress(p), principalStress(q) # no sort - m2 = m/2.0; m1 = 1.0/m; m21 = m2-1.0; x3 = xrange(3); dim = len(sv) + m2 = m/2.0; m1 = 1.0/m; m21 = m2-1.0; x3 = xrange(3); num = len(sv) PiQj = np.array([(pLambdas[i,:]-qLambdas[j,:]) for i in x3 for j in x3]) - QiPj = np.array([(qLambdas[i,:]-pLambdas[j,:]) for i in x3 for j in x3]).reshape(3,3,dim) + QiPj = np.array([(qLambdas[i,:]-pLambdas[j,:]) for i in x3 for j in x3]).reshape(3,3,num) PiQjs = PiQj**2 - phi = np.sum(PiQjs**m2,axis=0) - r = (0.25*phi)**m1/eqStress + left = np.sum(PiQjs**m2,axis=0) + r = (0.25*left)**(1.0/m)/eqStress if not Jac: return (r - 1.0).ravel() else: - drdphi = r*m1/phi*4.0 - dphidm = np.sum(PiQjs**m2*math_ln(PiQjs),axis=0)*0.5 - dPdc, dQdd = principalStrs_Der(p, sdev), principalStrs_Der(q, sdev) - PiQjs3d = (PiQjs**m21).reshape(3,3,dim) - dphidP = -m*np.array([np.diag(np.dot(PiQjs3d[:,:,i], QiPj [:,:,i])) for i in xrange(dim)]).T - dphidQ = m*np.array([np.diag(np.dot(QiPj [:,:,i], PiQjs3d[:,:,i])) for i in xrange(dim)]).T + drdl, drdm = r/m/left, r*math_ln(0.25*left)*(-1.0/m/m) + dldm = np.sum(PiQjs**m2*math_ln(PiQjs),axis=0)*0.5 + dPdc, dQdd = principalStrs_Der(p, sdev, dim), principalStrs_Der(q, sdev, dim) + PiQjs3d = ( PiQjs**(m2-1.0) ).reshape(3,3,num) + dldP = -m*np.array([np.diag(np.dot(PiQjs3d[:,:,i], QiPj [:,:,i])) for i in xrange(num)]).T + dldQ = m*np.array([np.diag(np.dot(QiPj [:,:,i], PiQjs3d[:,:,i])) for i in xrange(num)]).T + + jm = drdl*dldm + drdm + jc = drdl*np.sum([dldP[i]*dPdc[i] for i in x3],axis=0) + jd = drdl*np.sum([dldQ[i]*dQdd[i] for i in x3],axis=0) - jm = drdphi*dphidm + r*math_ln(0.25*phi)*(-m1*m1) - jc = drdphi*np.sum([dphidP[i]*dPdc[i] for i in x3],axis=0) - jd = drdphi*np.sum([dphidQ[i]*dQdd[i] for i in x3],axis=0) if mFix[0]: return np.vstack((jc,jd)).T else: return np.vstack((jc,jd,jm)).T -def KarafillisBoyce(eqStress, paras, sigmas, mFix, criteria, Jac=False): +def KarafillisBoyce(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): ''' Karafillis-Boyce yield criterion the fitted parameters are - c11,c12,c13,c14,c15,c16,c21,c22,c23,c24,c25,c26,alpha,b1,b2,a + c11,c12,c13,c14,c15,c16,c21,c22,c23,c24,c25,c26,alpha,b1,b2,a for 3D + c11,c12,c13,c14,c21,c22,c23,c24,alpha,b1,b2,a for plane stress 0 0.0: nExponent = nExpo else: nExponent = 0 nameCriterion = self.name.lower() - criteria = Criteria(nameCriterion,self.uniaxial,self.expo) - textParas = fitCriteria[nameCriterion]['text'] + formatOutput(numParas+nExponent) + criteria = Criteria(nameCriterion,self.uniaxial,self.expo, self.dimen) + textParas = fitCriteria[nameCriterion]['text']+fitCriteria[nameCriterion]['paras'][dDim]+':\n' + \ + formatOutput(numParas+nExponent) textError = fitCriteria[nameCriterion]['error']+ formatOutput(numParas+nExponent,'%-14.8f')+'\n' - bounds = fitCriteria[nameCriterion]['bound'] # Default bounds, no bound + bounds = fitCriteria[nameCriterion]['bound'][dDim] # Default bounds, no bound guess0 = Guess # Default initial guess, depends on bounds if fitResults == [] : initialguess = guess0 @@ -1264,31 +1273,35 @@ Performs calculations with various loads on given geometry file and fits yield s """, version=string.replace(scriptID,'\n','\\n') ) # maybe make an option to specifiy if 2D/3D fitting should be done? -parser.add_option('-l','--load' , dest='load', type='float', nargs=3, - help='load: final strain; increments; time %default', metavar='float int float') -parser.add_option('-g','--geometry', dest='geometry', type='string', - help='name of the geometry file [%default]', metavar='string') -parser.add_option('-c','--criterion', dest='criterion', choices=fitCriteria.keys(), - help='criterion for stopping simulations [%default]', metavar='string') + +parser.add_option('-l','--load' , dest='load', type='float', nargs=3, + help='load: final strain; increments; time %default', metavar='float int float') +parser.add_option('-g','--geometry', dest='geometry', type='string', + help='name of the geometry file [%default]', metavar='string') +parser.add_option('-c','--criterion', dest='criterion', choices=fitCriteria.keys(), + help='criterion for stopping simulations [%default]', metavar='string') # best/worse fitting? Stopping? -parser.add_option('-f','--fitting', dest='fitting', choices=thresholdParameter, - help='yield criterion [%default]', metavar='string') -parser.add_option('-y','--yieldvalue', dest='yieldValue', type='float', nargs=3, - help='yield points: start; end; count %default', metavar='float float int') -parser.add_option('--min', dest='min', type='int', - help='minimum number of simulations [%default]', metavar='int') -parser.add_option('--max', dest='max', type='int', - help='maximum number of iterations [%default]', metavar='int') -parser.add_option('-t','--threads', dest='threads', type='int', - help='number of parallel executions [%default]', metavar='int') -parser.add_option('-d','--dimension', dest='dimension', type='int', - help='dimension of the virtual test [%default]', metavar='int') -parser.add_option('-v', '--vegter', dest='vegter', action='store_true', - help='Vegter criteria [%default]', metavar='float') -parser.add_option('-e', '--exponent',dest='exponent', type='float', - help='exponent of non-quadratic criteria') -parser.add_option('-u', '--uniaxial',dest='eqStress', type='float', - help='Equivalent stress', metavar='float') +parser.add_option('-f','--fitting', dest='fitting', choices=thresholdParameter, + help='yield criterion [%default]', metavar='string') +parser.add_option('-y','--yieldvalue', dest='yieldValue', type='float', nargs=3, + help='yield points: start; end; count %default', metavar='float float int') +parser.add_option('--min', dest='min', type='int', + help='minimum number of simulations [%default]', metavar='int') +parser.add_option('--max', dest='max', type='int', + help='maximum number of iterations [%default]', metavar='int') +parser.add_option('-t','--threads', dest='threads', type='int', + help='number of parallel executions [%default]', metavar='int') +parser.add_option('-b','--bound', dest='bounds', type='float', nargs=2, + help='yield points: start; end; count %default', metavar='float float') +parser.add_option('-d','--dimension', dest='dimension', type='int', + help='dimension of the virtual test [%default]', metavar='int') +parser.add_option('-v', '--vegter', dest='vegter', action='store_true', + help='Vegter criteria [%default]', metavar='float') +parser.add_option('-e', '--exponent', dest='exponent', type='float', + help='exponent of non-quadratic criteria', metavar='int') +parser.add_option('-u', '--uniaxial', dest='eqStress', type='float', + help='Equivalent stress', metavar='float') + parser.set_defaults(min = 12) parser.set_defaults(max = 30) parser.set_defaults(threads = 4) @@ -1317,18 +1330,25 @@ if options.yieldValue[0]>options.yieldValue[1]: parser.error('invalid yield start (below yield end)') if options.yieldValue[2] != int(options.yieldValue[2]): parser.error('count must be an integer') +if options.dimension not in [2,3]: + parser.error('Dimension is wrong, should be 2(plane stress state) or 3(general stress state)') if not os.path.isfile('numerics.config'): print('numerics.config file not found') -numParas = len(fitCriteria[options.criterion]['bound']) +if not os.path.isfile('material.config'): + print('material.config file not found') + +dDim = options.dimension - 3 +numParas = len(fitCriteria[options.criterion]['bound'][dDim]) + nExpo = fitCriteria[options.criterion]['nExpo'] Guess = [] if options.exponent > 0.0: numParas = numParas-nExpo # User defines the exponents - fitCriteria[options.criterion]['bound'] = fitCriteria[options.criterion]['bound'][:numParas] + fitCriteria[options.criterion]['bound'][dDim] = fitCriteria[options.criterion]['bound'][dDim][:numParas] for i in xrange(numParas): - temp = fitCriteria[options.criterion]['bound'][i] - if fitCriteria[options.criterion]['bound'][i] == (None,None):Guess.append(1.0) + temp = fitCriteria[options.criterion]['bound'][dDim][i] + if fitCriteria[options.criterion]['bound'][dDim][i] == (None,None): Guess.append(1.0) else: g = (temp[0]+temp[1])/2.0 if g == 0: g = temp[1]*0.5 @@ -1336,19 +1356,16 @@ for i in xrange(numParas): if options.vegter is True: options.dimension = 2 -unitGPa = 10.e8 +unitGPa = 10.e5 N_simulations=0 -fitResults = [] s=threading.Semaphore(1) - -stressAll=[np.zeros(0,'d').reshape(0,0) for i in xrange(int(options.yieldValue[2]))] -strainAll=[np.zeros(0,'d').reshape(0,0) for i in xrange(int(options.yieldValue[2]))] myLoad = Loadcase(options.load[0],options.load[1],options.load[2], nSet = 10, dimension = options.dimension, vegter = options.vegter) -myFit = Criterion(options.criterion) - -threads=[] +stressAll= [np.zeros(0,'d').reshape(0,0) for i in xrange(int(options.yieldValue[2]))] +strainAll= [np.zeros(0,'d').reshape(0,0) for i in xrange(int(options.yieldValue[2]))] +fitResults = []; fitErrors = []; threads=[] +myFit = Criterion(options.exponent,options.eqStress, options.dimension, options.criterion) for i in range(options.threads): threads.append(myThread(i)) threads[i].start() @@ -1356,4 +1373,4 @@ for i in range(options.threads): for i in range(options.threads): threads[i].join() -print 'finished fitting to yield criteria' +print 'Finished fitting to yield criteria'