diff --git a/code/config/material.config b/code/config/material.config index 0acb95e52..c61a2825d 100644 --- a/code/config/material.config +++ b/code/config/material.config @@ -285,6 +285,7 @@ viscosity 1e-4 # viscosity for dislocation gli p 1 # exponent for thermal barrier profile q 1 # exponent for thermal barrier profile attackFrequency 50e9 # attack frequency in Hz +maximumVelocity 3600 # maximum allowed velocity surfaceTransmissivity 1.0 # transmissivity of free surfaces for dislocation flux grainboundaryTransmissivity 0.0 # transmissivity of grain boundaries for dislocation flux (grain bundaries are identified as interfaces with different textures on both sides); if not set or set to negative number, the subroutine automatically determines the transmissivity at the grain boundary interaction_SlipSlip 0 0 0.625 0.07 0.137 0.122 # Dislocation interaction coefficient diff --git a/code/constitutive_nonlocal.f90 b/code/constitutive_nonlocal.f90 index 0bc0c4b84..5e2361982 100644 --- a/code/constitutive_nonlocal.f90 +++ b/code/constitutive_nonlocal.f90 @@ -125,6 +125,7 @@ constitutive_nonlocal_p, & ! parameter constitutive_nonlocal_q, & ! parameter for kinetic law (Kocks,Argon,Ashby) constitutive_nonlocal_viscosity, & ! viscosity for dislocation glide in Pa s constitutive_nonlocal_fattack, & ! attack frequency in Hz +constitutive_nonlocal_vmax, & ! maximum allowed velocity constitutive_nonlocal_rhoSglScatter, & ! standard deviation of scatter in initial dislocation density constitutive_nonlocal_surfaceTransmissivity, & ! transmissivity at free surface constitutive_nonlocal_grainboundaryTransmissivity, & ! transmissivity at grain boundary (identified by different texture) @@ -330,6 +331,7 @@ allocate(constitutive_nonlocal_p(maxNinstance)) allocate(constitutive_nonlocal_q(maxNinstance)) allocate(constitutive_nonlocal_viscosity(maxNinstance)) allocate(constitutive_nonlocal_fattack(maxNinstance)) +allocate(constitutive_nonlocal_vmax(maxNinstance)) allocate(constitutive_nonlocal_rhoSglScatter(maxNinstance)) allocate(constitutive_nonlocal_surfaceTransmissivity(maxNinstance)) allocate(constitutive_nonlocal_grainboundaryTransmissivity(maxNinstance)) @@ -359,6 +361,7 @@ constitutive_nonlocal_p = 1.0_pReal constitutive_nonlocal_q = 1.0_pReal constitutive_nonlocal_viscosity = 0.0_pReal constitutive_nonlocal_fattack = 0.0_pReal +constitutive_nonlocal_vmax = 0.0_pReal constitutive_nonlocal_rhoSglScatter = 0.0_pReal constitutive_nonlocal_surfaceTransmissivity = 1.0_pReal constitutive_nonlocal_grainboundaryTransmissivity = -1.0_pReal @@ -501,6 +504,8 @@ do constitutive_nonlocal_viscosity(i) = IO_floatValue(line,positions,2_pInt) case('attackfrequency','fattack') constitutive_nonlocal_fattack(i) = IO_floatValue(line,positions,2_pInt) + case('maximumvelocity','vmax') + constitutive_nonlocal_vmax(i) = IO_floatValue(line,positions,2_pInt) case('rhosglscatter') constitutive_nonlocal_rhoSglScatter(i) = IO_floatValue(line,positions,2_pInt) case('surfacetransmissivity') @@ -597,6 +602,8 @@ enddo //constitutive_nonlocal_label//')') if (constitutive_nonlocal_fattack(i) <= 0.0_pReal) call IO_error(211_pInt,ext_msg='attackFrequency (' & //constitutive_nonlocal_label//')') + if (constitutive_nonlocal_vmax(i) <= 0.0_pReal) call IO_error(211_pInt,ext_msg='maximumVelocity (' & + //constitutive_nonlocal_label//')') if (constitutive_nonlocal_rhoSglScatter(i) < 0.0_pReal) call IO_error(211_pInt,ext_msg='rhoSglScatter (' & //constitutive_nonlocal_label//')') if (constitutive_nonlocal_surfaceTransmissivity(i) < 0.0_pReal & @@ -1387,12 +1394,16 @@ if (Temperature > 0.0_pReal) then activationVolume_P = activationLength_P * jumpWidth_P * constitutive_nonlocal_burgers(s,instance) criticalStress_P = constitutive_nonlocal_peierlsStress(s,c,instance) activationEnergy_P = criticalStress_P * activationVolume_P - tauRel_P = tauEff(s) / criticalStress_P + tauRel_P = min(1.0_pReal, tauEff(s) / criticalStress_P) ! ensure that the activation probability cannot become greater than one tPeierls = 1.0_pReal / constitutive_nonlocal_fattack(instance) & * exp(activationEnergy_P / (kB * Temperature) * (1.0_pReal - tauRel_P**p)**q) if (present(dv_dtau)) then - dtPeierls_dtau = tPeierls * p * q * activationVolume_P / (kB * Temperature) & - * (1.0_pReal - tauRel_P**p)**(q-1.0_pReal) * tauRel_P**(p-1.0_pReal) + if (tauEff(s) < criticalStress_P) then + dtPeierls_dtau = tPeierls * p * q * activationVolume_P / (kB * Temperature) & + * (1.0_pReal - tauRel_P**p)**(q-1.0_pReal) * tauRel_P**(p-1.0_pReal) + else + dtPeierls_dtau = 0.0_pReal + endif endif @@ -1406,12 +1417,16 @@ if (Temperature > 0.0_pReal) then activationVolume_S = activationLength_S * jumpWidth_S * constitutive_nonlocal_burgers(s,instance) activationEnergy_S = constitutive_nonlocal_solidSolutionEnergy(instance) criticalStress_S = activationEnergy_S / activationVolume_S - tauRel_S = tauEff(s) / criticalStress_S + tauRel_S = min(1.0_pReal, tauEff(s) / criticalStress_S) ! ensure that the activation probability cannot become greater than one tSolidSolution = 1.0_pReal / constitutive_nonlocal_fattack(instance) & * exp(activationEnergy_S / (kB * Temperature) * (1.0_pReal - tauRel_S**p)**q) if (present(dv_dtau)) then - dtSolidSolution_dtau = tSolidSolution * p * q * activationVolume_S / (kB * Temperature) & - * (1.0_pReal - tauRel_S**p)**(q-1.0_pReal) * tauRel_S**(p-1.0_pReal) + if (tauEff(s) < criticalStress_S) then + dtSolidSolution_dtau = tSolidSolution * p * q * activationVolume_S / (kB * Temperature) & + * (1.0_pReal - tauRel_S**p)**(q-1.0_pReal) * tauRel_S**(p-1.0_pReal) + else + dtSolidSolution_dtau = 0.0_pReal + endif endif @@ -1427,15 +1442,26 @@ if (Temperature > 0.0_pReal) then v(s) = 1.0_pReal / (tPeierls / meanfreepath_P + tSolidSolution / meanfreepath_S + 1.0_pReal / vViscous) & * (1.0_pReal - exp(-tauEff(s) * activationVolume_P / (kB * Temperature))) - v(s) = sign(v(s),tau(s)) if (present(dv_dtau)) then dv_dtau(s) = 1.0_pReal / (tPeierls / meanfreepath_P + tSolidSolution / meanfreepath_S + 1.0_pReal / vViscous) & - * (abs(v(s)) * ( dtPeierls_dtau / meanfreepath_P & - + dtSolidSolution_dtau / meanfreepath_S & - + 1.0_pReal / (mobility * tauEff(s)*tauEff(s))) & + * (v(s) * ( dtPeierls_dtau / meanfreepath_P + dtSolidSolution_dtau / meanfreepath_S & + + 1.0_pReal / (mobility * tauEff(s)*tauEff(s))) & + activationVolume_P / (kB * Temperature) * exp(-tauEff(s) * activationVolume_P / (kB * Temperature))) endif + + !* relativistic correction + + if (present(dv_dtau)) then + dv_dtau(s) = dv_dtau(s) * exp( -v(s) / constitutive_nonlocal_vmax(instance)) + endif + v(s) = constitutive_nonlocal_vmax(instance) * (1.0_pReal - exp( -v(s) / constitutive_nonlocal_vmax(instance))) + + + !* adopt sign from resolved stress + + v(s) = sign(v(s),tau(s)) + endif enddo endif @@ -2244,8 +2270,7 @@ if (numerics_integrationMode == 1_pInt) then constitutive_nonlocal_rhoDotSingle2DipoleGlide(1:ns,1:2,g,ip,el) = rhoDotSingle2DipoleGlide(1:ns,9:10) constitutive_nonlocal_rhoDotAthermalAnnihilation(1:ns,1:2,g,ip,el) = rhoDotAthermalAnnihilation(1:ns,9:10) constitutive_nonlocal_rhoDotThermalAnnihilation(1:ns,1:2,g,ip,el) = rhoDotThermalAnnihilation(1:ns,9:10) - constitutive_nonlocal_rhoDotEdgeJogs(1:ns,g,ip,el) = & - 2.0_pReal * rhoDotThermalAnnihilation(constitutive_nonlocal_colinearSystem(1:ns,myInstance),1) + constitutive_nonlocal_rhoDotEdgeJogs(1:ns,g,ip,el) = 2.0_pReal * rhoDotThermalAnnihilation(1:ns,1) endif @@ -2269,8 +2294,8 @@ endif #endif -if ( any(rhoSgl(1:ns,1:4) + rhoDot(1:ns,1:4) * timestep < -constitutive_nonlocal_significantRho(myInstance)) & - .or. any(rhoDip(1:ns,1:2) + rhoDot(1:ns,9:10) * timestep < -constitutive_nonlocal_significantRho(myInstance))) then +if ( any(rhoSgl(1:ns,1:4) + rhoDot(1:ns,1:4) * timestep < -constitutive_nonlocal_aTolRho(myInstance)) & + .or. any(rhoDip(1:ns,1:2) + rhoDot(1:ns,9:10) * timestep < -constitutive_nonlocal_aTolRho(myInstance))) then #ifndef _OPENMP if (iand(debug_level(debug_constitutive),debug_levelBasic) /= 0_pInt) then write(6,'(a,i5,a,i2)') '<< CONST >> evolution rate leads to negative density at el ',el,' ip ',ip