From ed8446e0f3bf0d9e4c645754310fd97441b18ec6 Mon Sep 17 00:00:00 2001 From: Christoph Kords Date: Wed, 6 Jan 2010 09:54:00 +0000 Subject: [PATCH] - corrected contribution of immobile singles to dipole formation and annihilation rates - remobilization of immobile singles immediately increases the mobile single dislocation density and therefore directly affects all other mechanisms in dotState --- code/constitutive_nonlocal.f90 | 86 +++++++++++++++++----------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/code/constitutive_nonlocal.f90 b/code/constitutive_nonlocal.f90 index 8b3f8e358..a3268284a 100644 --- a/code/constitutive_nonlocal.f90 +++ b/code/constitutive_nonlocal.f90 @@ -1279,7 +1279,7 @@ endif !**************************************************************************** -!*** dislocation remobilization (changing direction of slip remobilizes used dislocation densities) +!*** dislocation remobilization (bauschinger effect) thisRhoDotSgl = 0.0_pReal if (timestep > 0.0_pReal) then @@ -1287,7 +1287,9 @@ if (timestep > 0.0_pReal) then do s = 1,ns if (rhoSgl(s,t+4) * v(s) < 0.0_pReal) then thisRhoDotSgl(s,t) = abs(rhoSgl(s,t+4)) / timestep + rhoSgl(s,t) = rhoSgl(s,t) + abs(rhoSgl(s,t+4)) thisRhoDotSgl(s,t+4) = - sign(1.0_pReal,rhoSgl(s,t+4)) * rhoSgl(s,t+4) / timestep + rhoSgl(s,t+4) = 0.0_pReal endif enddo enddo @@ -1400,14 +1402,10 @@ endif !*** formation by glide do c = 1,2 - thisRhoDotSgl(:,2*c-1) = - 2.0_pReal * dUpper(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) & - * abs(rhoSgl(:,2*c-1)) * abs(gdot(:,2*c)) - thisRhoDotSgl(:,2*c) = - 2.0_pReal * dUpper(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) & - * abs(rhoSgl(:,2*c)) * abs(gdot(:,2*c-1)) - thisRhoDotSgl(:,2*c+3) = - 2.0_pReal * dUpper(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) & - * abs(rhoSgl(:,2*c+3)) * abs(gdot(:,2*c)) - thisRhoDotSgl(:,2*c+4) = - 2.0_pReal * dUpper(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) & - * abs(rhoSgl(:,2*c+4)) * abs(gdot(:,2*c-1)) + thisRhoDotSgl(:,2*c-1) = - 4.0_pReal * dUpper(:,c) * rhoSgl(:,2*c-1) * rhoSgl(:,2*c) * abs(v) + thisRhoDotSgl(:,2*c) = thisRhoDotSgl(:,2*c-1) + thisRhoDotSgl(:,2*c+3) = - 2.0_pReal * dUpper(:,c) * abs(rhoSgl(:,2*c+3)) * rhoSgl(:,2*c) * abs(v) + thisRhoDotSgl(:,2*c+4) = - 2.0_pReal * dUpper(:,c) * abs(rhoSgl(:,2*c+4)) * rhoSgl(:,2*c-1) * abs(v) thisRhoDotDip(:,c) = - thisRhoDotSgl(:,2*c-1) - thisRhoDotSgl(:,2*c) - thisRhoDotSgl(:,2*c+3) - thisRhoDotSgl(:,2*c+4) enddo @@ -1424,10 +1422,10 @@ endif !*** athermal annihilation forall (c=1:2) & - thisRhoDotDip(:,c) = - 4.0_pReal * dLower(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) & - * ( ( rhoSgl(:,2*c-1) + abs(rhoSgl(:,2*c+3)) ) * abs(gdot(:,2*c)) & ! was single hitting (used) single - + ( rhoSgl(:,2*c) + abs(rhoSgl(:,2*c+4)) ) * abs(gdot(:,2*c-1)) & ! was single hitting (used) single - + 0.5_pReal * rhoDip(:,c) * (abs(gdot(:,2*c-1))+abs(gdot(:,2*c))) ) ! single knocks dipole constituent + thisRhoDotDip(:,c) = - 2.0_pReal * dLower(:,c) * abs(v) & + * ( 4.0_pReal * rhoSgl(:,2*c-1) * rhoSgl(:,2*c) & ! was single hitting single + + abs(rhoSgl(:,2*c+3)) * rhoSgl(:,2*c) + abs(rhoSgl(:,2*c+4)) * rhoSgl(:,2*c-1) & ! was single hitting immobile/used single + + rhoDip(:,c) * ( rhoSgl(:,2*c-1) + rhoSgl(:,2*c) ) ) ! single knocks dipole constituent thisRhoDotSgl = 0.0_pReal ! singles themselves don't annihilate totalRhoDotSgl = totalRhoDotSgl + thisRhoDotSgl @@ -1691,7 +1689,8 @@ cs = 0_pInt constitutive_nonlocal_postResults = 0.0_pReal -! short hand notations for state variables +!* short hand notations for state variables + forall (t = 1:8) rhoSgl(:,t) = state(g,ip,el)%p((t-1)*ns+1:t*ns) forall (t = 1:8) previousRhoSgl(:,t) = previousState(g,ip,el)%p((t-1)*ns+1:t*ns) forall (c = 1:2) rhoDip(:,c) = state(g,ip,el)%p((7+c)*ns+1:(8+c)*ns) @@ -1704,7 +1703,8 @@ forall (t = 1:8) rhoDotSgl(:,t) = dotState(g,ip,el)%p((t-1)*ns+1:t*ns) forall (c = 1:2) rhoDotDip(:,c) = dotState(g,ip,el)%p((7+c)*ns+1:(8+c)*ns) -! Calculate shear rate +!* Calculate shear rate + do s = 1,ns sLattice = constitutive_nonlocal_slipSystemLattice(s,myInstance) tauSlip(s) = math_mul6x6( Tstar_v + Tdislocation_v, lattice_Sslip_v(:,sLattice,myStructure) ) @@ -1714,14 +1714,21 @@ enddo v = constitutive_nonlocal_v0PerSlipSystem(:,myInstance) & * exp( - constitutive_nonlocal_Q0(myInstance) / ( kB * Temperature) * (1.0_pReal - (abs(tauSlip)/tauSlipThreshold) ) ) & * sign(1.0_pReal,tauSlip) + +do t = 1,4 + do s = 1,ns + if (rhoSgl(s,t+4) * v(s) < 0.0_pReal) then + rhoSgl(s,t) = rhoSgl(s,t) + abs(rhoSgl(s,t+4)) ! remobilization of immobile singles for changing sign of v (bauschinger effect) + rhoSgl(s,t+4) = 0.0_pReal ! remobilization of immobile singles for changing sign of v (bauschinger effect) + endif + enddo +enddo -forall (t = 1:4) & - gdot(:,t) = rhoSgl(:,t) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) * v -forall (s = 1:ns, t = 1:4, rhoSgl(s,t+4) * v(s) < 0.0_pReal) & ! contribution of used rho for changing sign of v - gdot(s,t) = gdot(s,t) + abs(rhoSgl(s,t+4)) * constitutive_nonlocal_burgersPerSlipSystem(s,myInstance) * v(s) +forall (t = 1:4) gdot(:,t) = rhoSgl(:,t) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) * v -! calculate limits for stable dipole height and its rate of change +!* calculate limits for stable dipole height and its rate of change + dLower(:,1) = constitutive_nonlocal_dLowerEdgePerSlipSystem(:,myInstance) dLower(:,2) = constitutive_nonlocal_dLowerScrewPerSlipSystem(:,myInstance) dUpper(:,2) = min( constitutive_nonlocal_Gmod(myInstance) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) & @@ -1740,7 +1747,8 @@ else endif -! calculate fluxes +!* calculate fluxes + m(:,:,1) = lattice_sd(:, constitutive_nonlocal_slipSystemLattice(:,myInstance), myStructure) m(:,:,2) = -lattice_sd(:, constitutive_nonlocal_slipSystemLattice(:,myInstance), myStructure) m(:,:,3) = lattice_st(:, constitutive_nonlocal_slipSystemLattice(:,myInstance), myStructure) @@ -1750,30 +1758,26 @@ F = math_mul33x33(Fe(:,:,g,ip,el), Fp(:,:,g,ip,el)) detFe = math_det3x3(Fe(:,:,g,ip,el)) fluxes = 0.0_pReal -do n = 1,FE_NipNeighbors(mesh_element(2,el)) ! loop through my neighbors +do n = 1,FE_NipNeighbors(mesh_element(2,el)) ! loop through my neighbors neighboring_el = mesh_ipNeighborhood(1,n,ip,el) neighboring_ip = mesh_ipNeighborhood(2,n,ip,el) - ! if neighbor exists, total deformation gradient is averaged over me and my neighbor - if ( neighboring_el > 0 .and. neighboring_ip > 0 ) then + if ( neighboring_el > 0 .and. neighboring_ip > 0 ) then ! if neighbor exists, total deformation gradient is averaged over me and my neighbor neighboring_F = math_mul33x33(Fe(:,:,g,neighboring_ip,neighboring_el), Fp(:,:,g,neighboring_ip,neighboring_el)) Favg = 0.5_pReal * (F + neighboring_F) else Favg = F endif - - ! calculate the normal of the interface in current and lattice configuration - surfaceNormal_currentconf = math_det3x3(Favg) * math_mul33x3(math_inv3x3(transpose(Favg)), mesh_ipAreaNormal(:,n,ip,el)) - surfaceNormal = math_mul33x3(transpose(Fe(:,:,g,ip,el)), surfaceNormal_currentconf) / detFe - ! normalize the surface normal to unit length - surfaceNormal = surfaceNormal / math_norm3(surfaceNormal) - ! calculate the area of the interface - area = mesh_ipArea(n,ip,el) * math_norm3(surfaceNormal) + surfaceNormal_currentconf = math_det3x3(Favg) * math_mul33x3(math_inv3x3(transpose(Favg)), mesh_ipAreaNormal(:,n,ip,el)) ! normal of the interface in current configuration + surfaceNormal = math_mul33x3(transpose(Fe(:,:,g,ip,el)), surfaceNormal_currentconf) / detFe ! normal of the interface in lattice configuration + surfaceNormal = surfaceNormal / math_norm3(surfaceNormal) ! normalize the surface normal to unit length + + area = mesh_ipArea(n,ip,el) * math_norm3(surfaceNormal) ! area of the interface - do s = 1,ns ! loop over slip systems - do t = 1,4 ! loop over dislocation types + do s = 1,ns ! loop over slip systems + do t = 1,4 ! loop over dislocation types if ( sign(1.0_pReal,math_mul3x3(m(:,s,t),surfaceNormal)) == sign(1.0_pReal,gdot(s,t)) ) & fluxes(s,n,t) = gdot(s,t) / constitutive_nonlocal_burgersPerSlipSystem(s,myInstance) & * math_mul3x3(m(:,s,t), surfaceNormal) * area & @@ -1974,11 +1978,8 @@ do o = 1,phase_Noutput(material_phase(g,ip,el)) case ('rho_dot_sgl2dip') do c=1,2 ! dipole formation by glide constitutive_nonlocal_postResults(cs+1:cs+ns) = constitutive_nonlocal_postResults(cs+1:cs+ns) + & - 2.0_pReal * dUpper(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) & - * ( rhoSgl(:,2*c-1) * abs(gdot(:,2*c )) & - + rhoSgl(:,2*c ) * abs(gdot(:,2*c-1)) & - + abs(rhoSgl(:,2*c+3)) * abs(gdot(:,2*c )) & - + abs(rhoSgl(:,2*c+4)) * abs(gdot(:,2*c-1)) ) + 2.0_pReal * dUpper(:,c) * abs(v) * ( 4.0_pReal * rhoSgl(:,2*c-1) * rhoSgl(:,2*c) & ! was single hitting single + + abs(rhoSgl(:,2*c+3)) * rhoSgl(:,2*c) + abs(rhoSgl(:,2*c+4)) * rhoSgl(:,2*c-1) ) ! was single hitting immobile/used single enddo ! do c=1,2 ! forall (s=1:ns, dUpperDot(s,c) > 0.0_pReal) & ! dipole formation by stress decrease @@ -1999,10 +2000,9 @@ do o = 1,phase_Noutput(material_phase(g,ip,el)) case ('rho_dot_ann_ath') do c=1,2 constitutive_nonlocal_postResults(cs+1:cs+ns) = constitutive_nonlocal_postResults(cs+1:cs+ns) + & - 4.0_pReal * dLower(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) & - * ( ( rhoSgl(:,2*c-1) + abs(rhoSgl(:,2*c+3)) ) * abs(gdot(:,2*c)) & ! was single hitting (used) single - + ( rhoSgl(:,2*c) + abs(rhoSgl(:,2*c+4)) ) * abs(gdot(:,2*c-1)) & ! was single hitting (used) single - + 0.5_pReal * rhoDip(:,c) * ( abs(gdot(:,2*c-1)) + abs(gdot(:,2*c)) ) ) ! single knocks dipole constituent + 2.0_pReal * dLower(:,c) * abs(v) * ( 4.0_pReal * rhoSgl(:,2*c-1) * rhoSgl(:,2*c) & ! was single hitting single + + abs(rhoSgl(:,2*c+3)) * rhoSgl(:,2*c) + abs(rhoSgl(:,2*c+4)) * rhoSgl(:,2*c-1) & ! was single hitting immobile/used single + + rhoDip(:,c) * ( rhoSgl(:,2*c-1) + rhoSgl(:,2*c) ) ) ! single knocks dipole constituent enddo cs = cs + ns