ip volume is now based on the determinant of F. "mesh_ipVolume" represents the initial volume and is multiplied with det(F) wherever the current volume is needed. Since this works for all solver types, the "volume" output in crystallite is now also correct for spectral method and abaqus.

This commit is contained in:
Christoph Kords 2011-08-19 11:18:56 +00:00
parent 2dd8a353bb
commit b300cc7faa
3 changed files with 8 additions and 6 deletions

View File

@ -533,10 +533,9 @@ subroutine CPFEM_general(mode, coords, ffn, ffn1, Temperature, dt, element, IP,
write(6,'(a,i8,a,i8)') '<< CPFEM >> Calculation for elements ',FEsolving_execElem(1),' to ',FEsolving_execElem(2) write(6,'(a,i8,a,i8)') '<< CPFEM >> Calculation for elements ',FEsolving_execElem(1),' to ',FEsolving_execElem(2)
!$OMP END CRITICAL (write2out) !$OMP END CRITICAL (write2out)
endif endif
if (FEsolver == 'Marc') then ! marc updates nodal coordinates, whereas Abaqus and spectral solver directly update ip coordinates. In the latter case it is not possible to get the current ip volume, since the current nodal positions are unknown if (FEsolver == 'Marc') then ! marc returns nodal coordinates, whereas Abaqus and spectral solver return ip coordinates. So for marc we have to calculate the ip coordinates from the nodal coordinates.
call mesh_build_subNodeCoords() ! update subnodal coordinates call mesh_build_subNodeCoords() ! update subnodal coordinates
call mesh_build_ipCoordinates() ! update ip coordinates call mesh_build_ipCoordinates() ! update ip coordinates
call mesh_build_ipVolumes() ! update ip volumes
endif endif
if (debug_verbosity > 0) then if (debug_verbosity > 0) then
!$OMP CRITICAL (write2out) !$OMP CRITICAL (write2out)

View File

@ -1008,7 +1008,7 @@ if (.not. phase_localConstitution(phase)) then
neighboring_latticeStruct = constitutive_nonlocal_structure(neighboring_instance) neighboring_latticeStruct = constitutive_nonlocal_structure(neighboring_instance)
neighboring_ns = constitutive_nonlocal_totalNslip(neighboring_instance) neighboring_ns = constitutive_nonlocal_totalNslip(neighboring_instance)
neighboring_invFe = math_inv3x3(Fe(1:3,1:3,1,neighboring_ip,neighboring_el)) neighboring_invFe = math_inv3x3(Fe(1:3,1:3,1,neighboring_ip,neighboring_el))
neighboring_ipVolumeSideLength = mesh_ipVolume(neighboring_ip,neighboring_el) ** (1.0_pReal/3.0_pReal) neighboring_ipVolumeSideLength = mesh_ipVolume(neighboring_ip,neighboring_el) ** (1.0_pReal/3.0_pReal) ! reference volume used here
forall (s = 1:neighboring_ns, c = 1:2) & forall (s = 1:neighboring_ns, c = 1:2) &
neighboring_rhoExcess(c,1,s) = state(g,neighboring_ip,neighboring_el)%p((2*c-2)*neighboring_ns+s) & ! positive mobiles neighboring_rhoExcess(c,1,s) = state(g,neighboring_ip,neighboring_el)%p((2*c-2)*neighboring_ns+s) & ! positive mobiles
- state(g,neighboring_ip,neighboring_el)%p((2*c-1)*neighboring_ns+s) ! negative mobiles - state(g,neighboring_ip,neighboring_el)%p((2*c-1)*neighboring_ns+s) ! negative mobiles
@ -1178,7 +1178,7 @@ if (.not. phase_localConstitution(phase)) then
sigma = sigma * constitutive_nonlocal_Gmod(neighboring_instance) & sigma = sigma * constitutive_nonlocal_Gmod(neighboring_instance) &
* constitutive_nonlocal_burgersPerSlipSystem(s,neighboring_instance) & * constitutive_nonlocal_burgersPerSlipSystem(s,neighboring_instance) &
/ (4.0_pReal * pi * (1.0_pReal - nu)) & / (4.0_pReal * pi * (1.0_pReal - nu)) &
* mesh_ipVolume(neighboring_ip,neighboring_el) / segmentLength * mesh_ipVolume(neighboring_ip,neighboring_el) / segmentLength ! reference volume is used here (according to the segment length calculation)
Tdislo_neighboringLattice = Tdislo_neighboringLattice & Tdislo_neighboringLattice = Tdislo_neighboringLattice &
+ math_mul33x33(math_transpose3x3(constitutive_nonlocal_lattice2slip(1:3,1:3,s,neighboring_instance)), & + math_mul33x33(math_transpose3x3(constitutive_nonlocal_lattice2slip(1:3,1:3,s,neighboring_instance)), &
math_mul33x33(sigma, constitutive_nonlocal_lattice2slip(1:3,1:3,s,neighboring_instance))) math_mul33x33(sigma, constitutive_nonlocal_lattice2slip(1:3,1:3,s,neighboring_instance)))
@ -1678,7 +1678,7 @@ forall (s = 1:ns, t = 1:4, rhoSgl(s,t+4) * constitutive_nonlocal_v(s,t,g,ip,el)
!*** check CFL condition for flux !*** check CFL condition for flux
if (any(1.2_pReal * constitutive_nonlocal_v(1:ns,1:4,g,ip,el) * timestep & ! security factor 1.2 if (any(1.2_pReal * constitutive_nonlocal_v(1:ns,1:4,g,ip,el) * timestep & ! security factor 1.2
> mesh_ipVolume(ip,el) / maxval(mesh_ipArea(:,ip,el)))) then > mesh_ipVolume(ip,el) / maxval(mesh_ipArea(:,ip,el)))) then ! reference volume and area
dotState%p = NaN(3) dotState%p = NaN(3)
return return
endif endif

View File

@ -3063,6 +3063,7 @@ function crystallite_postResults(&
math_QuaternionToAxisAngle, & math_QuaternionToAxisAngle, &
math_mul33x33, & math_mul33x33, &
math_transpose3x3, & math_transpose3x3, &
math_det3x3, &
math_I3, & math_I3, &
inDeg, & inDeg, &
math_Mandel6to33 math_Mandel6to33
@ -3090,6 +3091,7 @@ function crystallite_postResults(&
!*** local variables ***! !*** local variables ***!
real(pReal), dimension(3,3) :: Ee real(pReal), dimension(3,3) :: Ee
real(pReal) detF
integer(pInt) o,c,crystID,mySize integer(pInt) o,c,crystID,mySize
crystID = microstructure_crystallite(mesh_element(4,e)) crystID = microstructure_crystallite(mesh_element(4,e))
@ -3110,7 +3112,8 @@ function crystallite_postResults(&
crystallite_postResults(c+1) = material_texture(g,i,e) ! textureID of grain crystallite_postResults(c+1) = material_texture(g,i,e) ! textureID of grain
case ('volume') case ('volume')
mySize = 1_pInt mySize = 1_pInt
crystallite_postResults(c+1) = mesh_ipVolume(i,e) / homogenization_Ngrains(mesh_element(3,e)) ! grain volume (not fraction but absolute) detF = math_det3x3(crystallite_partionedF(1:3,1:3,g,i,e)) ! V_current = det(F) * V_reference
crystallite_postResults(c+1) = detF * mesh_ipVolume(i,e) / homogenization_Ngrains(mesh_element(3,e)) ! grain volume (not fraction but absolute)
case ('orientation') case ('orientation')
mySize = 4_pInt mySize = 4_pInt
crystallite_postResults(c+1:c+mySize) = crystallite_orientation(1:4,g,i,e) ! grain orientation as quaternion crystallite_postResults(c+1:c+mySize) = crystallite_orientation(1:4,g,i,e) ! grain orientation as quaternion