polishing
This commit is contained in:
parent
e952ab7127
commit
0a9902818c
|
@ -172,62 +172,62 @@ subroutine hypela2(d,g,e,de,s,t,dt,ngens,m,nn,kcus,matus,ndi,nshear,disp, &
|
||||||
dispt,coord,ffn,frotn,strechn,eigvn,ffn1,frotn1, &
|
dispt,coord,ffn,frotn,strechn,eigvn,ffn1,frotn1, &
|
||||||
strechn1,eigvn1,ncrd,itel,ndeg,ndm,nnode, &
|
strechn1,eigvn1,ncrd,itel,ndeg,ndm,nnode, &
|
||||||
jtype,lclass,ifr,ifu)
|
jtype,lclass,ifr,ifu)
|
||||||
use prec
|
use prec
|
||||||
use DAMASK_interface
|
use DAMASK_interface
|
||||||
use numerics
|
use numerics
|
||||||
use FEsolving
|
use FEsolving
|
||||||
use debug
|
use debug
|
||||||
use discretization_marc
|
use discretization_marc
|
||||||
use homogenization
|
use homogenization
|
||||||
use CPFEM
|
use CPFEM
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
!$ include "omp_lib.h" ! the openMP function library
|
include "omp_lib.h" ! the openMP function library
|
||||||
integer, intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
integer, intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
||||||
ngens, & !< size of stress-strain law
|
ngens, & !< size of stress-strain law
|
||||||
nn, & !< integration point number
|
nn, & !< integration point number
|
||||||
ndi, & !< number of direct components
|
ndi, & !< number of direct components
|
||||||
nshear, & !< number of shear components
|
nshear, & !< number of shear components
|
||||||
ncrd, & !< number of coordinates
|
ncrd, & !< number of coordinates
|
||||||
itel, & !< dimension of F and R, either 2 or 3
|
itel, & !< dimension of F and R, either 2 or 3
|
||||||
ndeg, & !< number of degrees of freedom
|
ndeg, & !< number of degrees of freedom
|
||||||
ndm, & !< not specified in MSC.Marc 2012 Manual D
|
ndm, & !< not specified in MSC.Marc 2012 Manual D
|
||||||
nnode, & !< number of nodes per element
|
nnode, & !< number of nodes per element
|
||||||
jtype, & !< element type
|
jtype, & !< element type
|
||||||
ifr, & !< set to 1 if R has been calculated
|
ifr, & !< set to 1 if R has been calculated
|
||||||
ifu !< set to 1 if stretch has been calculated
|
ifu !< set to 1 if stretch has been calculated
|
||||||
integer, dimension(2), intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
integer, dimension(2), intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
||||||
m, & !< (1) user element number, (2) internal element number
|
m, & !< (1) user element number, (2) internal element number
|
||||||
matus, & !< (1) user material identification number, (2) internal material identification number
|
matus, & !< (1) user material identification number, (2) internal material identification number
|
||||||
kcus, & !< (1) layer number, (2) internal layer number
|
kcus, & !< (1) layer number, (2) internal layer number
|
||||||
lclass !< (1) element class, (2) 0: displacement, 1: low order Herrmann, 2: high order Herrmann
|
lclass !< (1) element class, (2) 0: displacement, 1: low order Herrmann, 2: high order Herrmann
|
||||||
real(pReal), dimension(*), intent(in) :: & ! has dimension(1) according to MSC.Marc 2012 Manual D, but according to example hypela2.f dimension(*)
|
real(pReal), dimension(*), intent(in) :: & ! has dimension(1) according to MSC.Marc 2012 Manual D, but according to example hypela2.f dimension(*)
|
||||||
e, & !< total elastic strain
|
e, & !< total elastic strain
|
||||||
de, & !< increment of strain
|
de, & !< increment of strain
|
||||||
dt !< increment of state variables
|
dt !< increment of state variables
|
||||||
real(pReal), dimension(itel), intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
real(pReal), dimension(itel), intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
||||||
strechn, & !< square of principal stretch ratios, lambda(i) at t=n
|
strechn, & !< square of principal stretch ratios, lambda(i) at t=n
|
||||||
strechn1 !< square of principal stretch ratios, lambda(i) at t=n+1
|
strechn1 !< square of principal stretch ratios, lambda(i) at t=n+1
|
||||||
real(pReal), dimension(3,3), intent(in) :: & ! has dimension(itel,*) according to MSC.Marc 2012 Manual D, but we alway assume dimension(3,3)
|
real(pReal), dimension(3,3), intent(in) :: & ! has dimension(itel,*) according to MSC.Marc 2012 Manual D, but we alway assume dimension(3,3)
|
||||||
ffn, & !< deformation gradient at t=n
|
ffn, & !< deformation gradient at t=n
|
||||||
ffn1 !< deformation gradient at t=n+1
|
ffn1 !< deformation gradient at t=n+1
|
||||||
real(pReal), dimension(itel,*), intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
real(pReal), dimension(itel,*), intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
||||||
frotn, & !< rotation tensor at t=n
|
frotn, & !< rotation tensor at t=n
|
||||||
eigvn, & !< i principal direction components for j eigenvalues at t=n
|
eigvn, & !< i principal direction components for j eigenvalues at t=n
|
||||||
frotn1, & !< rotation tensor at t=n+1
|
frotn1, & !< rotation tensor at t=n+1
|
||||||
eigvn1 !< i principal direction components for j eigenvalues at t=n+1
|
eigvn1 !< i principal direction components for j eigenvalues at t=n+1
|
||||||
real(pReal), dimension(ndeg,*), intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
real(pReal), dimension(ndeg,*), intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
||||||
disp, & !< incremental displacements
|
disp, & !< incremental displacements
|
||||||
dispt !< displacements at t=n (at assembly, lovl=4) and displacements at t=n+1 (at stress recovery, lovl=6)
|
dispt !< displacements at t=n (at assembly, lovl=4) and displacements at t=n+1 (at stress recovery, lovl=6)
|
||||||
real(pReal), dimension(ncrd,*), intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
real(pReal), dimension(ncrd,*), intent(in) :: & ! according to MSC.Marc 2012 Manual D
|
||||||
coord !< coordinates
|
coord !< coordinates
|
||||||
real(pReal), dimension(*), intent(inout) :: & ! according to MSC.Marc 2012 Manual D
|
real(pReal), dimension(*), intent(inout) :: & ! according to MSC.Marc 2012 Manual D
|
||||||
t !< state variables (comes in at t=n, must be updated to have state variables at t=n+1)
|
t !< state variables (comes in at t=n, must be updated to have state variables at t=n+1)
|
||||||
real(pReal), dimension(ndi+nshear), intent(out) :: & ! has dimension(*) according to MSC.Marc 2012 Manual D, but we need to loop over it
|
real(pReal), dimension(ndi+nshear), intent(out) :: & ! has dimension(*) according to MSC.Marc 2012 Manual D, but we need to loop over it
|
||||||
s, & !< stress - should be updated by user
|
s, & !< stress - should be updated by user
|
||||||
g !< change in stress due to temperature effects
|
g !< change in stress due to temperature effects
|
||||||
real(pReal), dimension(ngens,ngens), intent(out) :: & ! according to MSC.Marc 2012 Manual D, but according to example hypela2.f dimension(ngens,*)
|
real(pReal), dimension(ngens,ngens), intent(out) :: & ! according to MSC.Marc 2012 Manual D, but according to example hypela2.f dimension(ngens,*)
|
||||||
d !< stress-strain law to be formed
|
d !< stress-strain law to be formed
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! Marc common blocks are in fixed format so they have to be reformated to free format (f90)
|
! Marc common blocks are in fixed format so they have to be reformated to free format (f90)
|
||||||
|
@ -236,98 +236,94 @@ subroutine hypela2(d,g,e,de,s,t,dt,ngens,m,nn,kcus,matus,ndi,nshear,disp, &
|
||||||
#include QUOTE(PASTE(./marc/include/concom,Marc4DAMASK)) ! concom is needed for inc, lovl
|
#include QUOTE(PASTE(./marc/include/concom,Marc4DAMASK)) ! concom is needed for inc, lovl
|
||||||
#include QUOTE(PASTE(./marc/include/creeps,Marc4DAMASK)) ! creeps is needed for timinc (time increment)
|
#include QUOTE(PASTE(./marc/include/creeps,Marc4DAMASK)) ! creeps is needed for timinc (time increment)
|
||||||
|
|
||||||
logical :: cutBack
|
logical :: cutBack
|
||||||
real(pReal), dimension(6) :: stress
|
real(pReal), dimension(6) :: stress
|
||||||
real(pReal), dimension(6,6) :: ddsdde
|
real(pReal), dimension(6,6) :: ddsdde
|
||||||
integer :: computationMode, i, cp_en, node, CPnodeID
|
integer :: computationMode, i, cp_en, node, CPnodeID
|
||||||
!$ integer(4) :: defaultNumThreadsInt !< default value set by Marc
|
integer(4) :: defaultNumThreadsInt !< default value set by Marc
|
||||||
|
|
||||||
|
if (iand(debug_level(debug_MARC),debug_LEVELBASIC) /= 0) then
|
||||||
|
write(6,'(a,/,i8,i8,i2)') ' MSC.MARC information on shape of element(2), IP:', m, nn
|
||||||
|
write(6,'(a,2(i1))') ' Jacobian: ', ngens,ngens
|
||||||
|
write(6,'(a,i1)') ' Direct stress: ', ndi
|
||||||
|
write(6,'(a,i1)') ' Shear stress: ', nshear
|
||||||
|
write(6,'(a,i2)') ' DoF: ', ndeg
|
||||||
|
write(6,'(a,i2)') ' Coordinates: ', ncrd
|
||||||
|
write(6,'(a,i12)') ' Nodes: ', nnode
|
||||||
|
write(6,'(a,i1)') ' Deformation gradient: ', itel
|
||||||
|
write(6,'(/,a,/,3(3(f12.7,1x)/))',advance='no') ' Deformation gradient at t=n:', &
|
||||||
|
transpose(ffn)
|
||||||
|
write(6,'(/,a,/,3(3(f12.7,1x)/))',advance='no') ' Deformation gradient at t=n+1:', &
|
||||||
|
transpose(ffn1)
|
||||||
|
endif
|
||||||
|
|
||||||
if (iand(debug_level(debug_MARC),debug_LEVELBASIC) /= 0) then
|
defaultNumThreadsInt = omp_get_num_threads() ! remember number of threads set by Marc
|
||||||
write(6,'(a,/,i8,i8,i2)') ' MSC.MARC information on shape of element(2), IP:', m, nn
|
call omp_set_num_threads(1) ! no openMP
|
||||||
write(6,'(a,2(i1))') ' Jacobian: ', ngens,ngens
|
|
||||||
write(6,'(a,i1)') ' Direct stress: ', ndi
|
|
||||||
write(6,'(a,i1)') ' Shear stress: ', nshear
|
|
||||||
write(6,'(a,i2)') ' DoF: ', ndeg
|
|
||||||
write(6,'(a,i2)') ' Coordinates: ', ncrd
|
|
||||||
write(6,'(a,i12)') ' Nodes: ', nnode
|
|
||||||
write(6,'(a,i1)') ' Deformation gradient: ', itel
|
|
||||||
write(6,'(/,a,/,3(3(f12.7,1x)/))',advance='no') ' Deformation gradient at t=n:', &
|
|
||||||
transpose(ffn)
|
|
||||||
write(6,'(/,a,/,3(3(f12.7,1x)/))',advance='no') ' Deformation gradient at t=n+1:', &
|
|
||||||
transpose(ffn1)
|
|
||||||
endif
|
|
||||||
|
|
||||||
!$ defaultNumThreadsInt = omp_get_num_threads() ! remember number of threads set by Marc
|
if (.not. CPFEM_init_done) call CPFEM_initAll
|
||||||
!$ call omp_set_num_threads(1) ! set number of threads for parallel execution set by DAMASK_NUM_THREADS
|
|
||||||
|
|
||||||
if (.not. CPFEM_init_done) call CPFEM_initAll
|
computationMode = 0 ! save initialization value, since it does not result in any calculation
|
||||||
|
if (lovl == 4 ) then ! jacobian requested by marc
|
||||||
|
if (timinc < theDelta .and. theInc == inc .and. lastLovl /= lovl) & ! first after cutback
|
||||||
|
computationMode = CPFEM_RESTOREJACOBIAN
|
||||||
|
elseif (lovl == 6) then ! stress requested by marc
|
||||||
|
computationMode = CPFEM_CALCRESULTS ! always calc
|
||||||
|
cp_en = mesh_FEM2DAMASK_elem(m(1))
|
||||||
|
if (cptim > theTime .or. inc /= theInc) then ! reached "convergence"
|
||||||
|
terminallyIll = .false.
|
||||||
|
cycleCounter = -1 ! first calc step increments this to cycle = 0
|
||||||
|
if (inc == 0) then ! >> start of analysis <<
|
||||||
|
lastIncConverged = .false.
|
||||||
|
outdatedByNewInc = .false.
|
||||||
|
lastLovl = lovl ! pretend that this is NOT the first after a lovl change
|
||||||
|
write(6,'(a,i6,1x,i2)') '<< HYPELA2 >> start of analysis..! ',m(1),nn
|
||||||
|
else if (inc - theInc > 1) then ! >> restart of broken analysis <<
|
||||||
|
lastIncConverged = .false.
|
||||||
|
outdatedByNewInc = .false.
|
||||||
|
write(6,'(a,i6,1x,i2)') '<< HYPELA2 >> restart of analysis..! ',m(1),nn
|
||||||
|
else ! >> just the next inc <<
|
||||||
|
lastIncConverged = .true.
|
||||||
|
outdatedByNewInc = .true.
|
||||||
|
write(6,'(a,i6,1x,i2)') '<< HYPELA2 >> new increment..! ',m(1),nn
|
||||||
|
endif
|
||||||
|
else if ( timinc < theDelta ) then ! >> cutBack <<
|
||||||
|
lastIncConverged = .false.
|
||||||
|
outdatedByNewInc = .false.
|
||||||
|
terminallyIll = .false.
|
||||||
|
cycleCounter = -1 ! first calc step increments this to cycle = 0
|
||||||
|
write(6,'(a,i6,1x,i2)') '<< HYPELA2 >> cutback detected..! ',m(1),nn
|
||||||
|
endif ! convergence treatment end
|
||||||
|
flush(6)
|
||||||
|
|
||||||
computationMode = 0 ! save initialization value, since it does not result in any calculation
|
if (lastLovl /= lovl) then
|
||||||
if (lovl == 4 ) then ! jacobian requested by marc
|
cycleCounter = cycleCounter + 1
|
||||||
if (timinc < theDelta .and. theInc == inc .and. lastLovl /= lovl) & ! first after cutback
|
!mesh_cellnode = mesh_build_cellnodes() ! update cell node coordinates
|
||||||
computationMode = CPFEM_RESTOREJACOBIAN
|
!call mesh_build_ipCoordinates() ! update ip coordinates
|
||||||
elseif (lovl == 6) then ! stress requested by marc
|
endif
|
||||||
cp_en = mesh_FEM2DAMASK_elem(m(1))
|
if (outdatedByNewInc) then
|
||||||
if (cptim > theTime .or. inc /= theInc) then ! reached "convergence"
|
computationMode = ior(computationMode,CPFEM_AGERESULTS)
|
||||||
terminallyIll = .false.
|
outdatedByNewInc = .false.
|
||||||
cycleCounter = -1 ! first calc step increments this to cycle = 0
|
endif
|
||||||
if (inc == 0) then ! >> start of analysis <<
|
if (lastIncConverged) then
|
||||||
lastIncConverged = .false. ! no Jacobian backup
|
computationMode = ior(computationMode,CPFEM_BACKUPJACOBIAN)
|
||||||
outdatedByNewInc = .false. ! no aging of state
|
lastIncConverged = .false.
|
||||||
lastLovl = lovl ! pretend that this is NOT the first after a lovl change
|
endif
|
||||||
write(6,'(a,i6,1x,i2)') '<< HYPELA2 >> start of analysis..! ',m(1),nn
|
|
||||||
flush(6)
|
|
||||||
else if (inc - theInc > 1) then ! >> restart of broken analysis <<
|
|
||||||
lastIncConverged = .false. ! no Jacobian backup
|
|
||||||
outdatedByNewInc = .false. ! no aging of state
|
|
||||||
write(6,'(a,i6,1x,i2)') '<< HYPELA2 >> restart of analysis..! ',m(1),nn
|
|
||||||
flush(6)
|
|
||||||
else ! >> just the next inc <<
|
|
||||||
lastIncConverged = .true. ! request Jacobian backup
|
|
||||||
outdatedByNewInc = .true. ! request aging of state
|
|
||||||
write(6,'(a,i6,1x,i2)') '<< HYPELA2 >> new increment..! ',m(1),nn
|
|
||||||
flush(6)
|
|
||||||
endif
|
|
||||||
else if ( timinc < theDelta ) then ! >> cutBack <<
|
|
||||||
lastIncConverged = .false. ! no Jacobian backup
|
|
||||||
outdatedByNewInc = .false. ! no aging of state
|
|
||||||
terminallyIll = .false.
|
|
||||||
cycleCounter = -1 ! first calc step increments this to cycle = 0
|
|
||||||
write(6,'(a,i6,1x,i2)') '<< HYPELA2 >> cutback detected..! ',m(1),nn
|
|
||||||
flush(6)
|
|
||||||
endif ! convergence treatment end
|
|
||||||
|
|
||||||
|
theTime = cptim
|
||||||
|
theDelta = timinc
|
||||||
|
theInc = inc
|
||||||
|
|
||||||
computationMode = CPFEM_CALCRESULTS ! always calc
|
endif
|
||||||
if (lastLovl /= lovl) then
|
lastLovl = lovl
|
||||||
cycleCounter = cycleCounter + 1
|
|
||||||
!mesh_cellnode = mesh_build_cellnodes() ! update cell node coordinates
|
|
||||||
!call mesh_build_ipCoordinates() ! update ip coordinates
|
|
||||||
endif
|
|
||||||
if (outdatedByNewInc) then
|
|
||||||
computationMode = ior(computationMode,CPFEM_AGERESULTS)
|
|
||||||
outdatedByNewInc = .false. ! reset flag
|
|
||||||
endif
|
|
||||||
if (lastIncConverged) then
|
|
||||||
computationMode = ior(computationMode,CPFEM_BACKUPJACOBIAN) ! backup Jacobian after convergence
|
|
||||||
lastIncConverged = .false. ! reset flag
|
|
||||||
endif
|
|
||||||
|
|
||||||
theTime = cptim ! record current starting time
|
call CPFEM_general(computationMode,ffn,ffn1,t(1),timinc,m(1),nn,stress,ddsdde)
|
||||||
theDelta = timinc ! record current time increment
|
|
||||||
theInc = inc ! record current increment number
|
|
||||||
|
|
||||||
endif
|
d = ddsdde(1:ngens,1:ngens)
|
||||||
lastLovl = lovl ! record lovl
|
s = stress(1:ndi+nshear)
|
||||||
|
g = 0.0_pReal
|
||||||
|
if(symmetricSolver) d = 0.5_pReal*(d+transpose(d))
|
||||||
|
|
||||||
call CPFEM_general(computationMode,ffn,ffn1,t(1),timinc,m(1),nn,stress,ddsdde)
|
call omp_set_num_threads(defaultNumThreadsInt) ! reset number of threads to stored default value
|
||||||
|
|
||||||
d = ddsdde(1:ngens,1:ngens)
|
|
||||||
s = stress(1:ndi+nshear)
|
|
||||||
g = 0.0_pReal
|
|
||||||
if(symmetricSolver) d = 0.5_pReal*(d+transpose(d))
|
|
||||||
|
|
||||||
!$ call omp_set_num_threads(defaultNumThreadsInt) ! reset number of threads to stored default value
|
|
||||||
|
|
||||||
end subroutine hypela2
|
end subroutine hypela2
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue