diff --git a/dG3D/benchmarks/impactSphere/VEVP.py b/dG3D/benchmarks/impactSphere/VEVP.py new file mode 100755 index 0000000000000000000000000000000000000000..cb6af3a13bec6a3b123190e68abf8c2e874b8b4e --- /dev/null +++ b/dG3D/benchmarks/impactSphere/VEVP.py @@ -0,0 +1,200 @@ +#coding-Utf-8-*- +from gmshpy import * +from dG3Dpy import * + +import pickle +import numpy as np + + +def FillMatPara(x_E,x_P,VEVP): #x = [E0,nu0,K1,G1,....,tk,tg, aP] + tk = np.power(10.0, x_E[int(len(x_E)-3)]) + tg = np.power(10.0, x_E[int(len(x_E)-2)]) + MatPara = [] + MatPara.append([x_E[0], x_E[1]]) + Ki = [] + Gi = [] + N = int((len(x_E)-5)/2) + for i in range(N): + a = 1.0/np.power(10.0, i) + Ki.append([np.power(10.0,x_E[2+2*i]), a*tk]) + Gi.append([np.power(10.0,x_E[2+2*i+1]), a*tg]) + MatPara.append(Ki) + MatPara.append(Gi) + + + if(VEVP): + Compression = [] + Tension = [] + ViscoPlastic = [] + + Compression.append(x_P[0]) + Tension.append(x_P[4]) + for i in range(1,3): + Compression.append(np.power(10.0, x_P[i])) + Tension.append(np.power(10.0, x_P[4+i])) + Compression.append(x_P[3]) + Tension.append(x_P[7]) + + for i in range(4): + ViscoPlastic.append(x_P[8+i]) + + MatPara.append(Compression) + MatPara.append(Tension) + MatPara.append(ViscoPlastic) + return MatPara +############################################################################ + + + + +def RunCase(LoadCase,MatPara, VEVP): + + nstep = 800 # number of step (used only if soltype=1) + # === Problem parameters ============================================================================ + E0 = MatPara[0][0] + nu0 = MatPara[0][1] + Nt = len(MatPara[1]) #the number of branches in the generalized Maxwell model + aP = 1.0 + + if(VEVP): + indxplastic = 3 + sy0c = MatPara[indxplastic][0] #MPa, compressive yield stress + hc = MatPara[indxplastic][1] + hc2 = MatPara[indxplastic][2] + kc = MatPara[indxplastic][3] + + sy0t = MatPara[indxplastic+1][0]*sy0c #MPa, compressive yield stress + ht = MatPara[indxplastic+1][1] + ht2 = MatPara[indxplastic+1][2] + kt = MatPara[indxplastic+1][3] + + alpha = MatPara[indxplastic+2][0] + beta = MatPara[indxplastic+2][1] + eta = MatPara[indxplastic+2][2] + p = MatPara[indxplastic+2][3] + + #============================================= + lawnum = 11 + rho = 7850e-9 + + if(VEVP): + law1 = HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw(lawnum,rho,E0,nu0) + else: + law1 = HyperViscoElasticDG3DMaterialLaw(lawnum,rho,E0,nu0) + + law1.setViscoelasticMethod(0) + law1.setViscoElasticNumberOfElement(Nt) + for i in range(Nt): + law1.setViscoElasticData_Bulk(i+1, MatPara[1][i][0], aP*MatPara[1][i][1]) + law1.setViscoElasticData_Shear(i+1, MatPara[2][i][0], aP*MatPara[2][i][1]) + law1.setStrainOrder(5) + #----------------------------------------------------------------------------- + if(VEVP): + hardenc = LinearExponentialJ2IsotropicHardening(1, sy0c, hc, hc2, kc) + hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, ht2, kt) + + law1.setCompressionHardening(hardenc) + law1.setTractionHardening(hardent) + + law1.setYieldPowerFactor(alpha) + law1.setNonAssociatedFlow(True) + law1.nonAssociatedFlowRuleFactor(beta) + etac = constantViscosityLaw(1,eta) + law1.setViscosityEffect(etac,p) + + + if(LoadCase[0] == 0): + ft1 = 5.732 + eps = -0.0157 + if(VEVP): + ft1 = 106.5 + eps = -0.296 + ftime = LoadCase[2] + else: + strainrate = LoadCase[1] + strain_end = LoadCase[2] + ftime = strain_end/strainrate # Final time (used only if soltype=1) + # print("######################",strain_end,strainrate,ftime) + # ===Solver parameters============================================================================= + sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 + soltype = 1 # StaticLinear=0 (default) StaticNonLinear=1 + tol=1.e-5 # relative tolerance for NR scheme (used only if soltype=1) + nstepArch=10 # Number of step between 2 archiving (used only if soltype=1) + fullDg = 0 #O = CG, 1 = DG + space1 = 0 # function space (Lagrange=0) + beta1 = 100 + + # ===Domain creation=============================================================================== + # creation of ElasticField + myfield1 = dG3D1DDomain(11,11,space1,lawnum, False) #for non local + myfield1.setState(1) #UniaxialStrain=0, UniaxialStress =1,ConstantTriaxiality=2 + L = 5. + + # ===Solver creation=============================================================================== + # geometry & mesh + geofile = "line.geo" + meshfile = "line.msh" + + # creation of Solver + mysolver = nonLinearMechSolver(1000) + #mysolver.createModel(geofile,meshfile,1,1) + mysolver.loadModel(meshfile) + mysolver.addDomain(myfield1) + mysolver.addMaterialLaw(law1) + mysolver.Scheme(soltype) + mysolver.Solver(sol) + mysolver.snlData(nstep,ftime,tol) + mysolver.stepBetweenArchiving(nstepArch) + + mysolver.snlManageTimeStep(15,5,2.,20) # maximal 20 times + +# ===Boundary conditions=========================================================================== + mysolver.displacementBC("Edge",11,1,0.) + mysolver.displacementBC("Edge",11,2,0.) + mysolver.displacementBC("Node",1,0,0.) + + disp = PiecewiseLinearFunction() + disp.put(0.,0.) + if(LoadCase[0] != 0): + disp.put(ftime, LoadCase[0]*strain_end*L) + else: + disp.put(ft1,eps*L) + disp.put(ftime,eps*L) + + mysolver.displacementBC("Node",2,0,disp) + mysolver.archivingAverageValue(IPField.F_XX) + mysolver.archivingAverageValue(IPField.P_XX) + + # ===Solving======================================================================================= + mysolver.SetVerbosity(0) + mysolver.solve() + return + + +#def test(): +# print("It works!!") + + +#MatPara= +#RunCase(L_Case,MatPara,VEVP) + + + + + + + + + + + + + + + + + + + + + diff --git a/dG3D/benchmarks/impactSphere/impact.py b/dG3D/benchmarks/impactSphere/impact.py new file mode 100755 index 0000000000000000000000000000000000000000..38945a6266f0db5e09d437a7236cba88103f7424 --- /dev/null +++ b/dG3D/benchmarks/impactSphere/impact.py @@ -0,0 +1,221 @@ +#coding-Utf-8-*- +from gmshpy import * +from dG3Dpy import* +# import functions from VEVP.py +from VEVP import * +import math + + +# geometry =================================================================== +# Input .msh +#meshfile = "square.msh" # name of mesh file + +meshfile = 'impactSphere.msh' +geofile = 'impactSphere.geo' # name of mesh file +order = 1 + +#parameters +nstep = 4000 # number of step +ftime = 1e-3 # Final time v0 = 0.1mm/s, pour la demi structure v = v0/2 +nstepArch = 4 # Number of step between 2 archiving (used only if soltype=1) +tol = 1e-4 + +penalty= 1.e4 + +# material law for impactor +EImpactor = 2e5 +nuImpactor = 0.3 +mm=1. +RextImpactor = 100*mm +RintImpactor = 75.*mm +lawnum3 = 3 +VolImpactor = math.pi*(RextImpactor**3-RintImpactor**3)*4./3./8. +MassImpactor = 5*(1e-3/mm)/4. #in tonnes if mm=1 +rhoImpactor = MassImpactor/VolImpactor +velocity = -1.*(2.*9.81*1.8)**0.5*(mm/1.e-3) +print("Density Impactor = ", rhoImpactor, "; Velocity Impactor = ", velocity) + +law3 = J2LinearDG3DMaterialLaw(lawnum3,rhoImpactor,EImpactor,nuImpactor,1000.*EImpactor,10.) + +#VEVP Law for plates as to generate the sve: line 70 000 of the MCMC +x=[1374.2643289981168, 0.2826036623239532, 4.220196044260534, -0.06622730551411246, -0.2361729746734328, 1.0658488572731906, 2.955587774357835, 0.8846323146785388, 2.1134546059887156, 0.3900795755310005, -0.07807917229891632, 1.3340258222804844, 3.8978259552106973, 0.8147820955100668, 1.7082119337043935, 3.1818481562348735, 3.1460140132039993, 0.952562223405303, 1.0351529596236166, 0.8971311953490693, 0.04770622785629489, 29.696376534920287, -2.5325714558968597, 1.1573320881902116, 299.0940006076202, 0.7771046411287497, 2.1446624378399077, -3.183873130566032, 9648.947729066591, 3.7047493821391746, 0.2175363944799915, 5.182554847703984, 0.17938765700173523] + + +numVE = 21 +number_of_parametrs = len(x) +x_E = list(x)[0:numVE] +x_P = list(x)[numVE:number_of_parametrs] +VEVP = True # "Compression" +MatPara=FillMatPara(x_E,x_P,VEVP) + +E0 = MatPara[0][0] +nu0 = MatPara[0][1] +Nt = len(MatPara[1]) #the number of branches in the generalized Maxwell model +aP = 1.0 + +indxplastic = 3 +sy0c = MatPara[indxplastic][0] #MPa, compressive yield stress +hc = MatPara[indxplastic][1] +hc2 = MatPara[indxplastic][2] +kc = MatPara[indxplastic][3] + +sy0t = MatPara[indxplastic+1][0]*sy0c #MPa, compressive yield stress +ht = MatPara[indxplastic+1][1] +ht2 = MatPara[indxplastic+1][2] +kt = MatPara[indxplastic+1][3] + +alpha = MatPara[indxplastic+2][0] +beta = 1.5*MatPara[indxplastic+2][1] +eta = MatPara[indxplastic+2][2] +p = MatPara[indxplastic+2][3] + +lawnum1 = 11 +rho = 1200e-9 + +law1 = HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw(lawnum1,rho,E0,nu0) +law1.setViscoelasticMethod(0) +law1.setViscoElasticNumberOfElement(Nt) +for i in range(Nt): + law1.setViscoElasticData_Bulk(i+1, MatPara[1][i][0], aP*MatPara[1][i][1]) + law1.setViscoElasticData_Shear(i+1, MatPara[2][i][0], aP*MatPara[2][i][1]) +law1.setStrainOrder(5) + +hardenc = LinearExponentialJ2IsotropicHardening(1, sy0c, hc, hc2, kc) +hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, ht2, kt) + +law1.setCompressionHardening(hardenc) +law1.setTractionHardening(hardent) + +law1.setYieldPowerFactor(alpha) +law1.setNonAssociatedFlow(True) +law1.nonAssociatedFlowRuleFactor(beta) +etac = constantViscosityLaw(1,eta) +law1.setViscosityEffect(etac,p) +if (order==1): + law1.setUseBarF(True) + +# lattice here to change +lawnum2=2 +law2 = HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw(lawnum2,rho*0.02,E0*0.02,nu0) +law2.setViscoelasticMethod(0) +law2.setViscoElasticNumberOfElement(Nt) +for i in range(Nt): + law2.setViscoElasticData_Bulk(i+1, MatPara[1][i][0]*0.02, aP*MatPara[1][i][1]) + law2.setViscoElasticData_Shear(i+1, MatPara[2][i][0]*0.02, aP*MatPara[2][i][1]) +law2.setStrainOrder(5) + +hardenc2 = LinearExponentialJ2IsotropicHardening(3, sy0c*0.02, hc*0.02, hc2*0.02, kc) +hardent2 = LinearExponentialJ2IsotropicHardening(4, sy0t*0.02, ht*0.02, ht2*0.02, kt) + +law2.setCompressionHardening(hardenc2) +law2.setTractionHardening(hardent2) + +law2.setYieldPowerFactor(alpha) +law2.setNonAssociatedFlow(True) +law2.nonAssociatedFlowRuleFactor(beta) +eta2 = constantViscosityLaw(2,eta) +law2.setViscosityEffect(eta2,p) + +if (order==1): + law2.setUseBarF(True) #maybe no need if no locking + + +# data law def ============================================================ + +# solver info ============================================================ +sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 +soltype = 4 # StaticLinear=0 (default) StaticNonLinear=1 +fullDg = 0 #O = CG, 1 = DG +space1 = 0 # function space (Lagrange=0) +# solver info ============================================================ + +# creation of Domain +#Impactor +nfield3 = 1001 # number of the field (physical number of volume in 3D) +myfield3 = dG3DDomain(1000,nfield3,space1,lawnum3,fullDg) + +#Plates +nfield1_1 = 51 # number of the field (physical number of volume in 3D) +myfield1_1 = dG3DDomain(1001,nfield1_1,space1,lawnum1,fullDg) +myfield1_1.strainSubstep(2,10) + +nfield1_2 = 52 # number of the field (physical number of volume in 3D) +myfield1_2 = dG3DDomain(1001,nfield1_2,space1,lawnum1,fullDg) +myfield1_2.strainSubstep(2,10) + +#lattice +nfield2 = 53 # number of the field (physical number of volume in 3D) +myfield2 = dG3DDomain(1001,nfield2,space1,lawnum2,fullDg) +myfield2.strainSubstep(2,10) + + + + +# creation of ElasticField ============================================================== + +# Solver ============================================================== +mysolver = nonLinearMechSolver(1002) +mysolver.createModel(geofile,meshfile,3,order) +#mysolver.loadModel(meshfile) +mysolver.addDomain(myfield1_1) +mysolver.addDomain(myfield1_2) +mysolver.addDomain(myfield2) +mysolver.addDomain(myfield3) +mysolver.addMaterialLaw(law1) +mysolver.addMaterialLaw(law2) +mysolver.addMaterialLaw(law3) +mysolver.Scheme(soltype) +mysolver.Solver(sol) +mysolver.snlData(nstep,ftime,tol,tol/100.) +mysolver.stepBetweenArchiving(nstepArch) +mysolver.implicitSpectralRadius(0.05) +#mysolver.options("-ksp_type preonly -pc_type lu -pc_factor_mat_solver_type mumps") + +# Solver ============================================================== + +# BC ============================================================== +# blocked in z bottom if no rigid contact with plane +mysolver.displacementBC("Face",100,2,0.) + +# blocked in y side +mysolver.displacementBC("Face",101,1,0.) +mysolver.displacementBC("Face",1001,1,0.) +# blocked in x side +mysolver.displacementBC("Face",100,0,0.) +mysolver.displacementBC("Face",1000,0,0.) + +mysolver.initialBC("Volume","Velocity",1001,2,velocity) + +# BC ============================================================== + +# Contact + + +defoDefoContact1=dG3DNodeOnSurfaceContactDomain(1002, 2, 200, 2,2000, penalty, 3.*mm) +mysolver.defoDefoContactInteraction(defoDefoContact1) + + +#Contact + + +# save +mysolver.internalPointBuildView("svm",IPField.SVM, 1, nstepArch) +# save stress tensor +mysolver.internalPointBuildView("sig_xx",IPField.SIG_XX, 1, nstepArch) +mysolver.internalPointBuildView("sig_yy",IPField.SIG_YY, 1, nstepArch) +mysolver.internalPointBuildView("sig_zz",IPField.SIG_ZZ, 1, nstepArch) +mysolver.internalPointBuildView("sig_xy",IPField.SIG_XY, 1, nstepArch) +mysolver.internalPointBuildView("sig_yz",IPField.SIG_YZ, 1, nstepArch) +mysolver.internalPointBuildView("sig_xz",IPField.SIG_XZ, 1, nstepArch) +# save platic strain +mysolver.internalPointBuildView("epl",IPField.PLASTICSTRAIN, 1, nstepArch) +# save bottom force +mysolver.archivingForceOnPhysicalGroup("Face", 100, 2,nstepArch) + +#save impactor displacement, velocity etc ... +mysolver.archivingNodeDisplacement(1002, 2,nstepArch) +mysolver.archivingNodeVelocity(1002, 2,nstepArch); +mysolver.archivingNodeAcceleration(1002, 2, nstepArch); + + +mysolver.solve() diff --git a/dG3D/benchmarks/impactSphere/impactSphere.geo b/dG3D/benchmarks/impactSphere/impactSphere.geo index dd866554f984630d4508a4234c0f5d007639b325..d6bf8f692d514bfbd23a927a23bf093bf8494df3 100644 --- a/dG3D/benchmarks/impactSphere/impactSphere.geo +++ b/dG3D/benchmarks/impactSphere/impactSphere.geo @@ -57,6 +57,9 @@ impactor()+=newv; BooleanDifference(newv) = { Volume{impactortmp(0)}; Delete; }{ surfimpactor[] = Abs(Boundary{ Volume{impactor(0)}; }); Printf("surf impactor ",surfimpactor()); +ptimpactor[] = PointsOf{ Surface{surfimpactor(1)}; }; +Printf("pts impactor ",ptimpactor()); + Characteristic Length { PointsOf{ Volume{ impactor[] }; } } = LImpactor; @@ -94,6 +97,9 @@ Physical Surface(OXYIMPACTORUP) = {surfimpactor(1)}; IMPACTOR=1001; Physical Volume(IMPACTOR) = {impactor(0)}; +PTIMPACTOR = 1002; +Physical Point(PTIMPACTOR) = {ptimpactor(2)}; + //rigid contact X_contact=-0.1*mm;