Merge branch 'development' into DADF5-improvements
This commit is contained in:
commit
ffb112b0d8
2
PRIVATE
2
PRIVATE
|
@ -1 +1 @@
|
||||||
Subproject commit d5b572ae84c299aa9d4af100ba09acd14e4ef596
|
Subproject commit a3a88933cbb92b81d481305ce93374917baf3980
|
|
@ -546,15 +546,15 @@ fi
|
||||||
|
|
||||||
|
|
||||||
# DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3
|
# DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3
|
||||||
DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O0 $I8FFLAGS -I$MARC_SOURCE/common \
|
DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
-qopenmp -qopenmp-threadprivate=compat\
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
||||||
DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O1 $I8FFLAGS -I$MARC_SOURCE/common \
|
DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
-qopenmp -qopenmp-threadprivate=compat\
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
||||||
DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias -O2 $I8FFLAGS -I$MARC_SOURCE/common \
|
DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
-qopenmp -qopenmp-threadprivate=compat\
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
||||||
|
@ -572,20 +572,6 @@ then
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3
|
|
||||||
DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
|
||||||
DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
|
||||||
DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias $I8FFLAGS -I$MARC_SOURCE/common \
|
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
|
||||||
|
|
||||||
|
|
||||||
FORTLOWT="$FORTLOW"
|
FORTLOWT="$FORTLOW"
|
||||||
FORTRANT="$FORTRAN"
|
FORTRANT="$FORTRAN"
|
||||||
|
|
|
@ -546,15 +546,15 @@ fi
|
||||||
|
|
||||||
|
|
||||||
# DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3
|
# DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3
|
||||||
DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O0 $I8FFLAGS -I$MARC_SOURCE/common \
|
DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \
|
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
-qopenmp -qopenmp-threadprivate=compat\
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
||||||
DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O1 $I8FFLAGS -I$MARC_SOURCE/common \
|
DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \
|
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
-qopenmp -qopenmp-threadprivate=compat\
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
||||||
DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias -O2 $I8FFLAGS -I$MARC_SOURCE/common \
|
DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \
|
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
-qopenmp -qopenmp-threadprivate=compat\
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
||||||
|
@ -572,20 +572,6 @@ then
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3
|
|
||||||
DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \
|
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
|
||||||
DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \
|
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
|
||||||
DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias $I8FFLAGS -I$MARC_SOURCE/common \
|
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \
|
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
|
||||||
|
|
||||||
|
|
||||||
FORTLOWT="$FORTLOW"
|
FORTLOWT="$FORTLOW"
|
||||||
FORTRANT="$FORTRAN"
|
FORTRANT="$FORTRAN"
|
||||||
|
|
|
@ -554,16 +554,16 @@ fi
|
||||||
|
|
||||||
|
|
||||||
# DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3
|
# DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3
|
||||||
DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O0 $I8FFLAGS -I$MARC_SOURCE/common \
|
DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2019 -DDAMASKVERSION=$DAMASKVERSION \
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
-qopenmp -qopenmp-threadprivate=compat\
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
||||||
DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O1 $I8FFLAGS -I$MARC_SOURCE/common \
|
DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2019 -DDAMASKVERSION=$DAMASKVERSION \
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
-qopenmp -qopenmp-threadprivate=compat\
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
||||||
DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias -O2 $I8FFLAGS -I$MARC_SOURCE/common \
|
DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2019 -DDAMASKVERSION=$DAMASKVERSION \
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
-qopenmp -qopenmp-threadprivate=compat\
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
||||||
|
|
||||||
|
@ -579,19 +579,6 @@ then
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM"
|
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3
|
|
||||||
DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
|
||||||
DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
|
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
|
||||||
DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias $I8FFLAGS -I$MARC_SOURCE/common \
|
|
||||||
-fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \
|
|
||||||
-qopenmp -qopenmp-threadprivate=compat\
|
|
||||||
$MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD"
|
|
||||||
|
|
||||||
FORTLOWT="$FORTLOW"
|
FORTLOWT="$FORTLOW"
|
||||||
FORTRANT="$FORTRAN"
|
FORTRANT="$FORTRAN"
|
||||||
|
|
|
@ -178,19 +178,19 @@ subroutine CPFEM_general(mode, parallelExecution, ffn, ffn1, temperature_inp, dt
|
||||||
if (iand(mode, CPFEM_RESTOREJACOBIAN) /= 0_pInt) &
|
if (iand(mode, CPFEM_RESTOREJACOBIAN) /= 0_pInt) &
|
||||||
CPFEM_dcsde = CPFEM_dcsde_knownGood
|
CPFEM_dcsde = CPFEM_dcsde_knownGood
|
||||||
|
|
||||||
!*** age results and write restart data if requested
|
!*** age results
|
||||||
if (iand(mode, CPFEM_AGERESULTS) /= 0_pInt) then
|
if (iand(mode, CPFEM_AGERESULTS) /= 0_pInt) then
|
||||||
crystallite_F0 = crystallite_partionedF ! crystallite deformation (_subF is perturbed...)
|
crystallite_F0 = crystallite_partionedF ! crystallite deformation
|
||||||
crystallite_Fp0 = crystallite_Fp ! crystallite plastic deformation
|
crystallite_Fp0 = crystallite_Fp ! crystallite plastic deformation
|
||||||
crystallite_Lp0 = crystallite_Lp ! crystallite plastic velocity
|
crystallite_Lp0 = crystallite_Lp ! crystallite plastic velocity
|
||||||
crystallite_Fi0 = crystallite_Fi ! crystallite intermediate deformation
|
crystallite_Fi0 = crystallite_Fi ! crystallite intermediate deformation
|
||||||
crystallite_Li0 = crystallite_Li ! crystallite intermediate velocity
|
crystallite_Li0 = crystallite_Li ! crystallite intermediate velocity
|
||||||
crystallite_S0 = crystallite_S ! crystallite 2nd Piola Kirchhoff stress
|
crystallite_S0 = crystallite_S ! crystallite 2nd Piola Kirchhoff stress
|
||||||
|
|
||||||
forall ( i = 1:size(plasticState )) plasticState(i)%state0 = plasticState(i)%state ! copy state in this lenghty way because: A component cannot be an array if the encompassing structure is an array
|
forall (i = 1:size(plasticState)) plasticState(i)%state0 = plasticState(i)%state
|
||||||
do i = 1, size(sourceState)
|
do i = 1, size(sourceState)
|
||||||
do mySource = 1,phase_Nsources(i)
|
do mySource = 1,phase_Nsources(i)
|
||||||
sourceState(i)%p(mySource)%state0 = sourceState(i)%p(mySource)%state ! copy state in this lenghty way because: A component cannot be an array if the encompassing structure is an array
|
sourceState(i)%p(mySource)%state0 = sourceState(i)%p(mySource)%state
|
||||||
enddo; enddo
|
enddo; enddo
|
||||||
if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0_pInt) then
|
if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0_pInt) then
|
||||||
write(6,'(a)') '<< CPFEM >> aging states'
|
write(6,'(a)') '<< CPFEM >> aging states'
|
||||||
|
|
114
src/CPFEM2.f90
114
src/CPFEM2.f90
|
@ -33,9 +33,10 @@ module CPFEM2
|
||||||
private
|
private
|
||||||
|
|
||||||
public :: &
|
public :: &
|
||||||
CPFEM_age, &
|
CPFEM_forward, &
|
||||||
CPFEM_initAll, &
|
CPFEM_initAll, &
|
||||||
CPFEM_results
|
CPFEM_results, &
|
||||||
|
CPFEM_restartWrite
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
|
@ -92,24 +93,24 @@ subroutine CPFEM_init
|
||||||
|
|
||||||
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5')
|
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5')
|
||||||
|
|
||||||
call HDF5_read(fileHandle,crystallite_F0, 'convergedF')
|
call HDF5_read(fileHandle,crystallite_F0, 'F')
|
||||||
call HDF5_read(fileHandle,crystallite_Fp0,'convergedFp')
|
call HDF5_read(fileHandle,crystallite_Fp0,'Fp')
|
||||||
call HDF5_read(fileHandle,crystallite_Fi0,'convergedFi')
|
call HDF5_read(fileHandle,crystallite_Fi0,'Fi')
|
||||||
call HDF5_read(fileHandle,crystallite_Lp0,'convergedLp')
|
call HDF5_read(fileHandle,crystallite_Lp0,'Lp')
|
||||||
call HDF5_read(fileHandle,crystallite_Li0,'convergedLi')
|
call HDF5_read(fileHandle,crystallite_Li0,'Li')
|
||||||
call HDF5_read(fileHandle,crystallite_S0, 'convergedS')
|
call HDF5_read(fileHandle,crystallite_S0, 'S')
|
||||||
|
|
||||||
groupPlasticID = HDF5_openGroup(fileHandle,'PlasticPhases')
|
groupPlasticID = HDF5_openGroup(fileHandle,'constituent')
|
||||||
do ph = 1,size(phase_plasticity)
|
do ph = 1,size(phase_plasticity)
|
||||||
write(PlasticItem,*) ph,'_'
|
write(PlasticItem,*) ph,'_'
|
||||||
call HDF5_read(groupPlasticID,plasticState(ph)%state0,trim(PlasticItem)//'convergedStateConst')
|
call HDF5_read(groupPlasticID,plasticState(ph)%state0,trim(PlasticItem)//'omega_plastic')
|
||||||
enddo
|
enddo
|
||||||
call HDF5_closeGroup(groupPlasticID)
|
call HDF5_closeGroup(groupPlasticID)
|
||||||
|
|
||||||
groupHomogID = HDF5_openGroup(fileHandle,'HomogStates')
|
groupHomogID = HDF5_openGroup(fileHandle,'materialpoint')
|
||||||
do homog = 1, material_Nhomogenization
|
do homog = 1, material_Nhomogenization
|
||||||
write(HomogItem,*) homog,'_'
|
write(HomogItem,*) homog,'_'
|
||||||
call HDF5_read(groupHomogID,homogState(homog)%state0, trim(HomogItem)//'convergedStateHomog')
|
call HDF5_read(groupHomogID,homogState(homog)%state0, trim(HomogItem)//'omega_homogenization')
|
||||||
enddo
|
enddo
|
||||||
call HDF5_closeGroup(groupHomogID)
|
call HDF5_closeGroup(groupHomogID)
|
||||||
|
|
||||||
|
@ -120,13 +121,12 @@ end subroutine CPFEM_init
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief forwards data after successful increment
|
!> @brief Forward data after successful increment.
|
||||||
|
! ToDo: Any guessing for the current states possible?
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine CPFEM_age
|
subroutine CPFEM_forward
|
||||||
|
|
||||||
integer :: i, ph, homog, mySource
|
integer :: i, homog, mySource
|
||||||
character(len=32) :: rankStr, PlasticItem, HomogItem
|
|
||||||
integer(HID_T) :: fileHandle, groupPlastic, groupHomog
|
|
||||||
|
|
||||||
if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0) &
|
if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0) &
|
||||||
write(6,'(a)') '<< CPFEM >> aging states'
|
write(6,'(a)') '<< CPFEM >> aging states'
|
||||||
|
@ -151,46 +151,52 @@ subroutine CPFEM_age
|
||||||
damageState (homog)%state0 = damageState (homog)%state
|
damageState (homog)%state0 = damageState (homog)%state
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
if (restartWrite) then
|
end subroutine CPFEM_forward
|
||||||
if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0) &
|
|
||||||
write(6,'(a)') '<< CPFEM >> writing restart variables of last converged step to hdf5 file'
|
|
||||||
|
|
||||||
write(rankStr,'(a1,i0)')'_',worldrank
|
|
||||||
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','a')
|
|
||||||
|
|
||||||
call HDF5_write(fileHandle,crystallite_F0, 'convergedF')
|
|
||||||
call HDF5_write(fileHandle,crystallite_Fp0, 'convergedFp')
|
|
||||||
call HDF5_write(fileHandle,crystallite_Fi0, 'convergedFi')
|
|
||||||
call HDF5_write(fileHandle,crystallite_Lp0, 'convergedLp')
|
|
||||||
call HDF5_write(fileHandle,crystallite_Li0, 'convergedLi')
|
|
||||||
call HDF5_write(fileHandle,crystallite_S0, 'convergedS')
|
|
||||||
|
|
||||||
groupPlastic = HDF5_addGroup(fileHandle,'PlasticPhases')
|
|
||||||
do ph = 1,size(phase_plasticity)
|
|
||||||
write(PlasticItem,*) ph,'_'
|
|
||||||
call HDF5_write(groupPlastic,plasticState(ph)%state0,trim(PlasticItem)//'convergedStateConst')
|
|
||||||
enddo
|
|
||||||
call HDF5_closeGroup(groupPlastic)
|
|
||||||
|
|
||||||
groupHomog = HDF5_addGroup(fileHandle,'HomogStates')
|
|
||||||
do homog = 1, material_Nhomogenization
|
|
||||||
write(HomogItem,*) homog,'_'
|
|
||||||
call HDF5_write(groupHomog,homogState(homog)%state0,trim(HomogItem)//'convergedStateHomog')
|
|
||||||
enddo
|
|
||||||
call HDF5_closeGroup(groupHomog)
|
|
||||||
|
|
||||||
call HDF5_closeFile(fileHandle)
|
|
||||||
restartWrite = .false.
|
|
||||||
endif
|
|
||||||
|
|
||||||
if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0) &
|
|
||||||
write(6,'(a)') '<< CPFEM >> done aging states'
|
|
||||||
|
|
||||||
end subroutine CPFEM_age
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief triggers writing of the results
|
!> @brief Write current constitutive variables for restart to file.
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
subroutine CPFEM_restartWrite
|
||||||
|
|
||||||
|
integer :: ph, homog
|
||||||
|
character(len=32) :: rankStr, PlasticItem, HomogItem
|
||||||
|
integer(HID_T) :: fileHandle, groupPlastic, groupHomog
|
||||||
|
|
||||||
|
|
||||||
|
write(6,'(a)') ' writing constitutive data required for restart to file';flush(6)
|
||||||
|
|
||||||
|
write(rankStr,'(a1,i0)')'_',worldrank
|
||||||
|
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','a')
|
||||||
|
|
||||||
|
call HDF5_write(fileHandle,crystallite_partionedF,'F')
|
||||||
|
call HDF5_write(fileHandle,crystallite_Fp, 'Fp')
|
||||||
|
call HDF5_write(fileHandle,crystallite_Fi, 'Fi')
|
||||||
|
call HDF5_write(fileHandle,crystallite_Lp, 'Lp')
|
||||||
|
call HDF5_write(fileHandle,crystallite_Li, 'Li')
|
||||||
|
call HDF5_write(fileHandle,crystallite_S, 'S')
|
||||||
|
|
||||||
|
groupPlastic = HDF5_addGroup(fileHandle,'constituent')
|
||||||
|
do ph = 1,size(phase_plasticity)
|
||||||
|
write(PlasticItem,*) ph,'_'
|
||||||
|
call HDF5_write(groupPlastic,plasticState(ph)%state,trim(PlasticItem)//'omega_plastic')
|
||||||
|
enddo
|
||||||
|
call HDF5_closeGroup(groupPlastic)
|
||||||
|
|
||||||
|
groupHomog = HDF5_addGroup(fileHandle,'materialpoint')
|
||||||
|
do homog = 1, material_Nhomogenization
|
||||||
|
write(HomogItem,*) homog,'_'
|
||||||
|
call HDF5_write(groupHomog,homogState(homog)%state,trim(HomogItem)//'omega_homogenization')
|
||||||
|
enddo
|
||||||
|
call HDF5_closeGroup(groupHomog)
|
||||||
|
|
||||||
|
call HDF5_closeFile(fileHandle)
|
||||||
|
|
||||||
|
end subroutine CPFEM_restartWrite
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Trigger writing of results.
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine CPFEM_results(inc,time)
|
subroutine CPFEM_results(inc,time)
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@ module DAMASK_interface
|
||||||
implicit none
|
implicit none
|
||||||
private
|
private
|
||||||
character(len=4), dimension(2), parameter, public :: INPUTFILEEXTENSION = ['.pes','.inp']
|
character(len=4), dimension(2), parameter, public :: INPUTFILEEXTENSION = ['.pes','.inp']
|
||||||
character(len=4), parameter, public :: LOGFILEEXTENSION = '.log'
|
|
||||||
|
|
||||||
public :: &
|
public :: &
|
||||||
DAMASK_interface_init, &
|
DAMASK_interface_init, &
|
||||||
|
|
|
@ -41,8 +41,7 @@ module DAMASK_interface
|
||||||
implicit none
|
implicit none
|
||||||
private
|
private
|
||||||
|
|
||||||
character(len=4), parameter, public :: InputFileExtension = '.dat'
|
character(len=4), parameter, public :: INPUTFILEEXTENSION = '.dat'
|
||||||
character(len=4), parameter, public :: LogFileExtension = '.log'
|
|
||||||
|
|
||||||
public :: &
|
public :: &
|
||||||
DAMASK_interface_init, &
|
DAMASK_interface_init, &
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
module FEsolving
|
module FEsolving
|
||||||
use prec
|
use prec
|
||||||
use debug
|
|
||||||
use IO
|
use IO
|
||||||
use DAMASK_interface
|
use DAMASK_interface
|
||||||
|
|
||||||
|
@ -13,10 +12,6 @@ module FEsolving
|
||||||
private
|
private
|
||||||
|
|
||||||
logical, public :: &
|
logical, public :: &
|
||||||
#if defined(Marc4DAMASK) || defined(Abaqus)
|
|
||||||
restartRead = .false., & !< restart information to continue calculation from saved state
|
|
||||||
#endif
|
|
||||||
restartWrite = .false., & !< write current state to enable restart
|
|
||||||
terminallyIll = .false. !< at least one material point is terminally ill
|
terminallyIll = .false. !< at least one material point is terminally ill
|
||||||
|
|
||||||
integer, dimension(:,:), allocatable, public :: &
|
integer, dimension(:,:), allocatable, public :: &
|
||||||
|
@ -26,9 +21,7 @@ module FEsolving
|
||||||
|
|
||||||
#if defined(Marc4DAMASK) || defined(Abaqus)
|
#if defined(Marc4DAMASK) || defined(Abaqus)
|
||||||
logical, public, protected :: &
|
logical, public, protected :: &
|
||||||
symmetricSolver = .false. !< use a symmetric FEM solver (only Abaqus)
|
symmetricSolver = .false. !< use a symmetric FEM solver
|
||||||
character(len=1024), public :: &
|
|
||||||
modelName !< needs description
|
|
||||||
logical, dimension(:,:), allocatable, public :: &
|
logical, dimension(:,:), allocatable, public :: &
|
||||||
calcMode !< do calculation or simply collect when using ping pong scheme
|
calcMode !< do calculation or simply collect when using ping pong scheme
|
||||||
|
|
||||||
|
@ -37,90 +30,36 @@ module FEsolving
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
|
|
||||||
#if defined(Marc4DAMASK) || defined(Abaqus)
|
#if defined(Marc4DAMASK) || defined(Abaqus)
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief determine whether a symmetric solver is used and whether restart is requested
|
!> @brief determine whether a symmetric solver is used
|
||||||
!> @details restart information is found in input file in case of FEM solvers, in case of spectal
|
|
||||||
!> solver the information is provided by the interface module
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine FE_init
|
subroutine FE_init
|
||||||
|
|
||||||
integer, parameter :: &
|
|
||||||
FILEUNIT = 222
|
|
||||||
integer :: j
|
|
||||||
character(len=65536) :: tag, line
|
|
||||||
integer, allocatable, dimension(:) :: chunkPos
|
|
||||||
|
|
||||||
write(6,'(/,a)') ' <<<+- FEsolving init -+>>>'
|
write(6,'(/,a)') ' <<<+- FEsolving init -+>>>'
|
||||||
|
|
||||||
modelName = getSolverJobName()
|
#if defined(Marc4DAMASK)
|
||||||
call IO_open_inputFile(FILEUNIT,modelName)
|
block
|
||||||
rewind(FILEUNIT)
|
integer, parameter :: FILEUNIT = 222
|
||||||
do
|
character(len=pStringLen) :: line
|
||||||
read (FILEUNIT,'(a1024)',END=100) line
|
integer, allocatable, dimension(:) :: chunkPos
|
||||||
chunkPos = IO_stringPos(line)
|
call IO_open_inputFile(FILEUNIT)
|
||||||
tag = IO_lc(IO_stringValue(line,chunkPos,1)) ! extract key
|
rewind(FILEUNIT)
|
||||||
select case(tag)
|
do
|
||||||
case ('solver')
|
read (FILEUNIT,'(a256)',END=100) line
|
||||||
read (FILEUNIT,'(a1024)',END=100) line ! next line
|
chunkPos = IO_stringPos(line)
|
||||||
|
if(IO_lc(IO_stringValue(line,chunkPos,1)) == 'solver') then
|
||||||
|
read (FILEUNIT,'(a256)',END=100) line ! next line
|
||||||
chunkPos = IO_stringPos(line)
|
chunkPos = IO_stringPos(line)
|
||||||
symmetricSolver = (IO_intValue(line,chunkPos,2) /= 1)
|
symmetricSolver = (IO_intValue(line,chunkPos,2) /= 1)
|
||||||
case ('restart')
|
|
||||||
read (FILEUNIT,'(a1024)',END=100) line ! next line
|
|
||||||
chunkPos = IO_stringPos(line)
|
|
||||||
restartWrite = iand(IO_intValue(line,chunkPos,1),1) > 0
|
|
||||||
restartRead = iand(IO_intValue(line,chunkPos,1),2) > 0
|
|
||||||
case ('*restart')
|
|
||||||
do j=2,chunkPos(1)
|
|
||||||
restartWrite = (IO_lc(IO_StringValue(line,chunkPos,j)) == 'write') .or. restartWrite
|
|
||||||
restartRead = (IO_lc(IO_StringValue(line,chunkPos,j)) == 'read') .or. restartRead
|
|
||||||
enddo
|
|
||||||
if(restartWrite) then
|
|
||||||
do j=2,chunkPos(1)
|
|
||||||
restartWrite = (IO_lc(IO_StringValue(line,chunkPos,j)) /= 'frequency=0') .and. restartWrite
|
|
||||||
enddo
|
|
||||||
endif
|
|
||||||
end select
|
|
||||||
enddo
|
|
||||||
100 close(FILEUNIT)
|
|
||||||
|
|
||||||
if (restartRead) then
|
|
||||||
#ifdef Marc4DAMASK
|
|
||||||
call IO_open_logFile(FILEUNIT)
|
|
||||||
rewind(FILEUNIT)
|
|
||||||
do
|
|
||||||
read (FILEUNIT,'(a1024)',END=200) line
|
|
||||||
chunkPos = IO_stringPos(line)
|
|
||||||
if ( IO_lc(IO_stringValue(line,chunkPos,1)) == 'restart' &
|
|
||||||
.and. IO_lc(IO_stringValue(line,chunkPos,2)) == 'file' &
|
|
||||||
.and. IO_lc(IO_stringValue(line,chunkPos,3)) == 'job' &
|
|
||||||
.and. IO_lc(IO_stringValue(line,chunkPos,4)) == 'id' ) &
|
|
||||||
modelName = IO_StringValue(line,chunkPos,6)
|
|
||||||
enddo
|
|
||||||
#else
|
|
||||||
call IO_open_inputFile(FILEUNIT,modelName)
|
|
||||||
rewind(FILEUNIT)
|
|
||||||
do
|
|
||||||
read (FILEUNIT,'(a1024)',END=200) line
|
|
||||||
chunkPos = IO_stringPos(line)
|
|
||||||
if (IO_lc(IO_stringValue(line,chunkPos,1))=='*heading') then
|
|
||||||
read (FILEUNIT,'(a1024)',END=200) line
|
|
||||||
chunkPos = IO_stringPos(line)
|
|
||||||
modelName = IO_StringValue(line,chunkPos,1)
|
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
|
100 close(FILEUNIT)
|
||||||
|
end block
|
||||||
#endif
|
#endif
|
||||||
200 close(FILEUNIT)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if (iand(debug_level(debug_FEsolving),debug_levelBasic) /= 0) then
|
|
||||||
write(6,'(a21,l1)') ' restart writing: ', restartWrite
|
|
||||||
write(6,'(a21,l1)') ' restart reading: ', restartRead
|
|
||||||
if (restartRead) write(6,'(a,/)') ' restart Job: '//trim(modelName)
|
|
||||||
endif
|
|
||||||
|
|
||||||
end subroutine FE_init
|
end subroutine FE_init
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
end module FEsolving
|
end module FEsolving
|
||||||
|
|
36
src/IO.f90
36
src/IO.f90
|
@ -37,7 +37,6 @@ module IO
|
||||||
#if defined(Marc4DAMASK) || defined(Abaqus)
|
#if defined(Marc4DAMASK) || defined(Abaqus)
|
||||||
public :: &
|
public :: &
|
||||||
IO_open_inputFile, &
|
IO_open_inputFile, &
|
||||||
IO_open_logFile, &
|
|
||||||
IO_countContinuousIntValues, &
|
IO_countContinuousIntValues, &
|
||||||
IO_continuousIntValues, &
|
IO_continuousIntValues, &
|
||||||
#if defined(Abaqus)
|
#if defined(Abaqus)
|
||||||
|
@ -207,10 +206,9 @@ end function IO_open_binary
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief opens FEM input file for reading located in current working directory to given unit
|
!> @brief opens FEM input file for reading located in current working directory to given unit
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine IO_open_inputFile(fileUnit,modelName)
|
subroutine IO_open_inputFile(fileUnit)
|
||||||
|
|
||||||
integer, intent(in) :: fileUnit !< file unit
|
integer, intent(in) :: fileUnit !< file unit
|
||||||
character(len=*), intent(in) :: modelName !< model name, in case of restart not solver job name
|
|
||||||
|
|
||||||
integer :: myStat
|
integer :: myStat
|
||||||
character(len=1024) :: path
|
character(len=1024) :: path
|
||||||
|
@ -218,16 +216,16 @@ subroutine IO_open_inputFile(fileUnit,modelName)
|
||||||
integer :: fileType
|
integer :: fileType
|
||||||
|
|
||||||
fileType = 1 ! assume .pes
|
fileType = 1 ! assume .pes
|
||||||
path = trim(modelName)//inputFileExtension(fileType) ! attempt .pes, if it exists: it should be used
|
path = trim(getSolverJobName())//inputFileExtension(fileType) ! attempt .pes, if it exists: it should be used
|
||||||
open(fileUnit+1,status='old',iostat=myStat,file=path,action='read',position='rewind')
|
open(fileUnit+1,status='old',iostat=myStat,file=path,action='read',position='rewind')
|
||||||
if(myStat /= 0) then ! if .pes does not work / exist; use conventional extension, i.e.".inp"
|
if(myStat /= 0) then ! if .pes does not work / exist; use conventional extension, i.e.".inp"
|
||||||
fileType = 2
|
fileType = 2
|
||||||
path = trim(modelName)//inputFileExtension(fileType)
|
path = trim(getSolverJobName())//inputFileExtension(fileType)
|
||||||
open(fileUnit+1,status='old',iostat=myStat,file=path,action='read',position='rewind')
|
open(fileUnit+1,status='old',iostat=myStat,file=path,action='read',position='rewind')
|
||||||
endif
|
endif
|
||||||
if (myStat /= 0) call IO_error(100,el=myStat,ext_msg=path)
|
if (myStat /= 0) call IO_error(100,el=myStat,ext_msg=path)
|
||||||
|
|
||||||
path = trim(modelName)//inputFileExtension(fileType)//'_assembly'
|
path = trim(getSolverJobName())//inputFileExtension(fileType)//'_assembly'
|
||||||
open(fileUnit,iostat=myStat,file=path)
|
open(fileUnit,iostat=myStat,file=path)
|
||||||
if (myStat /= 0) call IO_error(100,el=myStat,ext_msg=path)
|
if (myStat /= 0) call IO_error(100,el=myStat,ext_msg=path)
|
||||||
if (.not.abaqus_assembleInputFile(fileUnit,fileUnit+1)) call IO_error(103) ! strip comments and concatenate any "include"s
|
if (.not.abaqus_assembleInputFile(fileUnit,fileUnit+1)) call IO_error(103) ! strip comments and concatenate any "include"s
|
||||||
|
@ -258,10 +256,8 @@ subroutine IO_open_inputFile(fileUnit,modelName)
|
||||||
fname = trim(line(9+scan(line(9:),'='):))
|
fname = trim(line(9+scan(line(9:),'='):))
|
||||||
inquire(file=fname, exist=fexist)
|
inquire(file=fname, exist=fexist)
|
||||||
if (.not.(fexist)) then
|
if (.not.(fexist)) then
|
||||||
!$OMP CRITICAL (write2out)
|
write(6,*)'ERROR: file does not exist error in abaqus_assembleInputFile'
|
||||||
write(6,*)'ERROR: file does not exist error in abaqus_assembleInputFile'
|
write(6,*)'filename: ', trim(fname)
|
||||||
write(6,*)'filename: ', trim(fname)
|
|
||||||
!$OMP END CRITICAL (write2out)
|
|
||||||
createSuccess = .false.
|
createSuccess = .false.
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -285,30 +281,12 @@ subroutine IO_open_inputFile(fileUnit,modelName)
|
||||||
|
|
||||||
end function abaqus_assembleInputFile
|
end function abaqus_assembleInputFile
|
||||||
#elif defined(Marc4DAMASK)
|
#elif defined(Marc4DAMASK)
|
||||||
path = trim(modelName)//inputFileExtension
|
path = trim(getSolverJobName())//inputFileExtension
|
||||||
open(fileUnit,status='old',iostat=myStat,file=path)
|
open(fileUnit,status='old',iostat=myStat,file=path)
|
||||||
if (myStat /= 0) call IO_error(100,el=myStat,ext_msg=path)
|
if (myStat /= 0) call IO_error(100,el=myStat,ext_msg=path)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
end subroutine IO_open_inputFile
|
end subroutine IO_open_inputFile
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief opens existing FEM log file for reading to given unit. File is named after solver job
|
|
||||||
!! name and located in current working directory
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
subroutine IO_open_logFile(fileUnit)
|
|
||||||
|
|
||||||
integer, intent(in) :: fileUnit !< file unit
|
|
||||||
|
|
||||||
integer :: myStat
|
|
||||||
character(len=1024) :: path
|
|
||||||
|
|
||||||
path = trim(getSolverJobName())//LogFileExtension
|
|
||||||
open(fileUnit,status='old',iostat=myStat,file=path,action='read',position='rewind')
|
|
||||||
if (myStat /= 0) call IO_error(100,el=myStat,ext_msg=path)
|
|
||||||
|
|
||||||
end subroutine IO_open_logFile
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,8 @@ program DAMASK_spectral
|
||||||
remainingLoadCaseTime = 0.0_pReal !< remaining time of current load case
|
remainingLoadCaseTime = 0.0_pReal !< remaining time of current load case
|
||||||
logical :: &
|
logical :: &
|
||||||
guess, & !< guess along former trajectory
|
guess, & !< guess along former trajectory
|
||||||
stagIterate
|
stagIterate, &
|
||||||
|
cutBack = .false.
|
||||||
integer :: &
|
integer :: &
|
||||||
i, j, k, l, field, &
|
i, j, k, l, field, &
|
||||||
errorID = 0, &
|
errorID = 0, &
|
||||||
|
@ -70,13 +71,11 @@ program DAMASK_spectral
|
||||||
currentLoadcase = 0, & !< current load case
|
currentLoadcase = 0, & !< current load case
|
||||||
inc, & !< current increment in current load case
|
inc, & !< current increment in current load case
|
||||||
totalIncsCounter = 0, & !< total # of increments
|
totalIncsCounter = 0, & !< total # of increments
|
||||||
convergedCounter = 0, & !< # of converged increments
|
|
||||||
notConvergedCounter = 0, & !< # of non-converged increments
|
|
||||||
fileUnit = 0, & !< file unit for reading load case and writing results
|
fileUnit = 0, & !< file unit for reading load case and writing results
|
||||||
myStat, &
|
myStat, &
|
||||||
statUnit = 0, & !< file unit for statistics output
|
statUnit = 0, & !< file unit for statistics output
|
||||||
lastRestartWritten = 0, & !< total increment # at which last restart information was written
|
stagIter, &
|
||||||
stagIter
|
nActiveFields = 0
|
||||||
character(len=6) :: loadcase_string
|
character(len=6) :: loadcase_string
|
||||||
character(len=1024) :: &
|
character(len=1024) :: &
|
||||||
incInfo
|
incInfo
|
||||||
|
@ -86,7 +85,7 @@ program DAMASK_spectral
|
||||||
type(tSolutionState), allocatable, dimension(:) :: solres
|
type(tSolutionState), allocatable, dimension(:) :: solres
|
||||||
integer(MPI_OFFSET_KIND) :: fileOffset
|
integer(MPI_OFFSET_KIND) :: fileOffset
|
||||||
integer(MPI_OFFSET_KIND), dimension(:), allocatable :: outputSize
|
integer(MPI_OFFSET_KIND), dimension(:), allocatable :: outputSize
|
||||||
integer, parameter :: maxByteOut = 2147483647-4096 !< limit of one file output write https://trac.mpich.org/projects/mpich/ticket/1742
|
integer, parameter :: maxByteOut = 2147483647-4096 !< limit of one file output write https://trac.mpich.org/projects/mpich/ticket/1742
|
||||||
integer, parameter :: maxRealOut = maxByteOut/pReal
|
integer, parameter :: maxRealOut = maxByteOut/pReal
|
||||||
integer(pLongInt), dimension(2) :: outputIndex
|
integer(pLongInt), dimension(2) :: outputIndex
|
||||||
PetscErrorCode :: ierr
|
PetscErrorCode :: ierr
|
||||||
|
@ -96,6 +95,10 @@ program DAMASK_spectral
|
||||||
mech_forward
|
mech_forward
|
||||||
procedure(grid_mech_spectral_basic_solution), pointer :: &
|
procedure(grid_mech_spectral_basic_solution), pointer :: &
|
||||||
mech_solution
|
mech_solution
|
||||||
|
procedure(grid_mech_spectral_basic_updateCoords), pointer :: &
|
||||||
|
mech_updateCoords
|
||||||
|
procedure(grid_mech_spectral_basic_restartWrite), pointer :: &
|
||||||
|
mech_restartWrite
|
||||||
|
|
||||||
external :: &
|
external :: &
|
||||||
quit
|
quit
|
||||||
|
@ -120,23 +123,29 @@ program DAMASK_spectral
|
||||||
! assign mechanics solver depending on selected type
|
! assign mechanics solver depending on selected type
|
||||||
select case (trim(config_numerics%getString('spectral_solver',defaultVal='basic')))
|
select case (trim(config_numerics%getString('spectral_solver',defaultVal='basic')))
|
||||||
case ('basic')
|
case ('basic')
|
||||||
mech_init => grid_mech_spectral_basic_init
|
mech_init => grid_mech_spectral_basic_init
|
||||||
mech_forward => grid_mech_spectral_basic_forward
|
mech_forward => grid_mech_spectral_basic_forward
|
||||||
mech_solution => grid_mech_spectral_basic_solution
|
mech_solution => grid_mech_spectral_basic_solution
|
||||||
|
mech_updateCoords => grid_mech_spectral_basic_updateCoords
|
||||||
|
mech_restartWrite => grid_mech_spectral_basic_restartWrite
|
||||||
|
|
||||||
case ('polarisation')
|
case ('polarisation')
|
||||||
if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) &
|
if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) &
|
||||||
call IO_warning(42, ext_msg='debug Divergence')
|
call IO_warning(42, ext_msg='debug Divergence')
|
||||||
mech_init => grid_mech_spectral_polarisation_init
|
mech_init => grid_mech_spectral_polarisation_init
|
||||||
mech_forward => grid_mech_spectral_polarisation_forward
|
mech_forward => grid_mech_spectral_polarisation_forward
|
||||||
mech_solution => grid_mech_spectral_polarisation_solution
|
mech_solution => grid_mech_spectral_polarisation_solution
|
||||||
|
mech_updateCoords => grid_mech_spectral_polarisation_updateCoords
|
||||||
|
mech_restartWrite => grid_mech_spectral_polarisation_restartWrite
|
||||||
|
|
||||||
case ('fem')
|
case ('fem')
|
||||||
if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) &
|
if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) &
|
||||||
call IO_warning(42, ext_msg='debug Divergence')
|
call IO_warning(42, ext_msg='debug Divergence')
|
||||||
mech_init => grid_mech_FEM_init
|
mech_init => grid_mech_FEM_init
|
||||||
mech_forward => grid_mech_FEM_forward
|
mech_forward => grid_mech_FEM_forward
|
||||||
mech_solution => grid_mech_FEM_solution
|
mech_solution => grid_mech_FEM_solution
|
||||||
|
mech_updateCoords => grid_mech_FEM_updateCoords
|
||||||
|
mech_restartWrite => grid_mech_FEM_restartWrite
|
||||||
|
|
||||||
case default
|
case default
|
||||||
call IO_error(error_ID = 891, ext_msg = config_numerics%getString('spectral_solver'))
|
call IO_error(error_ID = 891, ext_msg = config_numerics%getString('spectral_solver'))
|
||||||
|
@ -158,11 +167,11 @@ program DAMASK_spectral
|
||||||
chunkPos = IO_stringPos(line)
|
chunkPos = IO_stringPos(line)
|
||||||
do i = 1, chunkPos(1) ! reading compulsory parameters for loadcase
|
do i = 1, chunkPos(1) ! reading compulsory parameters for loadcase
|
||||||
select case (IO_lc(IO_stringValue(line,chunkPos,i)))
|
select case (IO_lc(IO_stringValue(line,chunkPos,i)))
|
||||||
case('l','velocitygrad','velgrad','velocitygradient','fdot','dotf','f')
|
case('l','fdot','dotf','f')
|
||||||
N_def = N_def + 1
|
N_def = N_def + 1
|
||||||
case('t','time','delta')
|
case('t','time','delta')
|
||||||
N_t = N_t + 1
|
N_t = N_t + 1
|
||||||
case('n','incs','increments','steps','logincs','logincrements','logsteps')
|
case('n','incs','increments','logincs','logincrements')
|
||||||
N_n = N_n + 1
|
N_n = N_n + 1
|
||||||
end select
|
end select
|
||||||
enddo
|
enddo
|
||||||
|
@ -183,7 +192,7 @@ program DAMASK_spectral
|
||||||
|
|
||||||
readIn: do i = 1, chunkPos(1)
|
readIn: do i = 1, chunkPos(1)
|
||||||
select case (IO_lc(IO_stringValue(line,chunkPos,i)))
|
select case (IO_lc(IO_stringValue(line,chunkPos,i)))
|
||||||
case('fdot','dotf','l','velocitygrad','velgrad','velocitygradient','f') ! assign values for the deformation BC matrix
|
case('fdot','dotf','l','f') ! assign values for the deformation BC matrix
|
||||||
temp_valueVector = 0.0_pReal
|
temp_valueVector = 0.0_pReal
|
||||||
if (IO_lc(IO_stringValue(line,chunkPos,i)) == 'fdot'.or. & ! in case of Fdot, set type to fdot
|
if (IO_lc(IO_stringValue(line,chunkPos,i)) == 'fdot'.or. & ! in case of Fdot, set type to fdot
|
||||||
IO_lc(IO_stringValue(line,chunkPos,i)) == 'dotf') then
|
IO_lc(IO_stringValue(line,chunkPos,i)) == 'dotf') then
|
||||||
|
@ -200,7 +209,7 @@ program DAMASK_spectral
|
||||||
newLoadCase%deformation%maskLogical = transpose(reshape(temp_maskVector,[ 3,3])) ! logical mask in 3x3 notation
|
newLoadCase%deformation%maskLogical = transpose(reshape(temp_maskVector,[ 3,3])) ! logical mask in 3x3 notation
|
||||||
newLoadCase%deformation%maskFloat = merge(ones,zeros,newLoadCase%deformation%maskLogical)! float (1.0/0.0) mask in 3x3 notation
|
newLoadCase%deformation%maskFloat = merge(ones,zeros,newLoadCase%deformation%maskLogical)! float (1.0/0.0) mask in 3x3 notation
|
||||||
newLoadCase%deformation%values = math_9to33(temp_valueVector) ! values in 3x3 notation
|
newLoadCase%deformation%values = math_9to33(temp_valueVector) ! values in 3x3 notation
|
||||||
case('p','pk1','piolakirchhoff','stress', 's')
|
case('p','stress', 's')
|
||||||
temp_valueVector = 0.0_pReal
|
temp_valueVector = 0.0_pReal
|
||||||
do j = 1, 9
|
do j = 1, 9
|
||||||
temp_maskVector(j) = IO_stringValue(line,chunkPos,i+j) /= '*' ! true if not an asterisk
|
temp_maskVector(j) = IO_stringValue(line,chunkPos,i+j) /= '*' ! true if not an asterisk
|
||||||
|
@ -211,9 +220,9 @@ program DAMASK_spectral
|
||||||
newLoadCase%stress%values = math_9to33(temp_valueVector)
|
newLoadCase%stress%values = math_9to33(temp_valueVector)
|
||||||
case('t','time','delta') ! increment time
|
case('t','time','delta') ! increment time
|
||||||
newLoadCase%time = IO_floatValue(line,chunkPos,i+1)
|
newLoadCase%time = IO_floatValue(line,chunkPos,i+1)
|
||||||
case('n','incs','increments','steps') ! number of increments
|
case('n','incs','increments') ! number of increments
|
||||||
newLoadCase%incs = IO_intValue(line,chunkPos,i+1)
|
newLoadCase%incs = IO_intValue(line,chunkPos,i+1)
|
||||||
case('logincs','logincrements','logsteps') ! number of increments (switch to log time scaling)
|
case('logincs','logincrements') ! number of increments (switch to log time scaling)
|
||||||
newLoadCase%incs = IO_intValue(line,chunkPos,i+1)
|
newLoadCase%incs = IO_intValue(line,chunkPos,i+1)
|
||||||
newLoadCase%logscale = 1
|
newLoadCase%logscale = 1
|
||||||
case('freq','frequency','outputfreq') ! frequency of result writings
|
case('freq','frequency','outputfreq') ! frequency of result writings
|
||||||
|
@ -464,15 +473,16 @@ program DAMASK_spectral
|
||||||
select case(loadCases(currentLoadCase)%ID(field))
|
select case(loadCases(currentLoadCase)%ID(field))
|
||||||
case(FIELD_MECH_ID)
|
case(FIELD_MECH_ID)
|
||||||
call mech_forward (&
|
call mech_forward (&
|
||||||
guess,timeinc,timeIncOld,remainingLoadCaseTime, &
|
cutBack,guess,timeinc,timeIncOld,remainingLoadCaseTime, &
|
||||||
deformation_BC = loadCases(currentLoadCase)%deformation, &
|
deformation_BC = loadCases(currentLoadCase)%deformation, &
|
||||||
stress_BC = loadCases(currentLoadCase)%stress, &
|
stress_BC = loadCases(currentLoadCase)%stress, &
|
||||||
rotation_BC = loadCases(currentLoadCase)%rotation)
|
rotation_BC = loadCases(currentLoadCase)%rotation)
|
||||||
|
|
||||||
case(FIELD_THERMAL_ID); call grid_thermal_spectral_forward
|
case(FIELD_THERMAL_ID); call grid_thermal_spectral_forward(cutBack)
|
||||||
case(FIELD_DAMAGE_ID); call grid_damage_spectral_forward
|
case(FIELD_DAMAGE_ID); call grid_damage_spectral_forward(cutBack)
|
||||||
end select
|
end select
|
||||||
enddo
|
enddo
|
||||||
|
if(.not. cutBack) call CPFEM_forward
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! solve fields
|
! solve fields
|
||||||
|
@ -507,8 +517,9 @@ program DAMASK_spectral
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! check solution for either advance or retry
|
! check solution for either advance or retry
|
||||||
|
|
||||||
if ( (continueCalculation .or. all(solres(:)%converged .and. solres(:)%stagConverged)) & ! don't care or did converge
|
if ( (all(solres(:)%converged .and. solres(:)%stagConverged)) & ! converged
|
||||||
.and. .not. solres(1)%termIll) then ! and acceptable solution found
|
.and. .not. solres(1)%termIll) then ! and acceptable solution found
|
||||||
|
call mech_updateCoords
|
||||||
timeIncOld = timeinc
|
timeIncOld = timeinc
|
||||||
cutBack = .false.
|
cutBack = .false.
|
||||||
guess = .true. ! start guessing after first converged (sub)inc
|
guess = .true. ! start guessing after first converged (sub)inc
|
||||||
|
@ -528,7 +539,7 @@ program DAMASK_spectral
|
||||||
call IO_warning(850)
|
call IO_warning(850)
|
||||||
call MPI_File_close(fileUnit,ierr)
|
call MPI_File_close(fileUnit,ierr)
|
||||||
close(statUnit)
|
close(statUnit)
|
||||||
call quit(-1*(lastRestartWritten+1)) ! quit and provide information about last restart inc written
|
call quit(0) ! quit
|
||||||
endif
|
endif
|
||||||
|
|
||||||
enddo subStepLooping
|
enddo subStepLooping
|
||||||
|
@ -536,11 +547,9 @@ program DAMASK_spectral
|
||||||
cutBackLevel = max(0, cutBackLevel - 1) ! try half number of subincs next inc
|
cutBackLevel = max(0, cutBackLevel - 1) ! try half number of subincs next inc
|
||||||
|
|
||||||
if (all(solres(:)%converged)) then
|
if (all(solres(:)%converged)) then
|
||||||
convergedCounter = convergedCounter + 1
|
|
||||||
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report converged inc
|
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report converged inc
|
||||||
' increment ', totalIncsCounter, ' converged'
|
' increment ', totalIncsCounter, ' converged'
|
||||||
else
|
else
|
||||||
notConvergedCounter = notConvergedCounter + 1
|
|
||||||
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report non-converged inc
|
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report non-converged inc
|
||||||
' increment ', totalIncsCounter, ' NOT converged'
|
' increment ', totalIncsCounter, ' NOT converged'
|
||||||
endif; flush(6)
|
endif; flush(6)
|
||||||
|
@ -563,11 +572,10 @@ program DAMASK_spectral
|
||||||
fileOffset = fileOffset + sum(outputSize) ! forward to current file position
|
fileOffset = fileOffset + sum(outputSize) ! forward to current file position
|
||||||
call CPFEM_results(totalIncsCounter,time)
|
call CPFEM_results(totalIncsCounter,time)
|
||||||
endif
|
endif
|
||||||
if (mod(inc,loadCases(currentLoadCase)%restartFrequency) == 0) then ! at frequency of writing restart information
|
if (mod(inc,loadCases(currentLoadCase)%restartFrequency) == 0) then
|
||||||
restartWrite = .true. ! set restart parameter for FEsolving
|
call mech_restartWrite
|
||||||
lastRestartWritten = inc ! QUESTION: first call to CPFEM_general will write?
|
call CPFEM_restartWrite
|
||||||
endif
|
endif
|
||||||
|
|
||||||
endif skipping
|
endif skipping
|
||||||
|
|
||||||
enddo incLooping
|
enddo incLooping
|
||||||
|
@ -578,16 +586,9 @@ program DAMASK_spectral
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! report summary of whole calculation
|
! report summary of whole calculation
|
||||||
write(6,'(/,a)') ' ###########################################################################'
|
write(6,'(/,a)') ' ###########################################################################'
|
||||||
write(6,'(1x,'//IO_intOut(convergedCounter)//',a,'//IO_intOut(notConvergedCounter + convergedCounter)//',a,f5.1,a)') &
|
|
||||||
convergedCounter, ' out of ', &
|
|
||||||
notConvergedCounter + convergedCounter, ' (', &
|
|
||||||
real(convergedCounter, pReal)/&
|
|
||||||
real(notConvergedCounter + convergedCounter,pReal)*100.0_pReal, ' %) increments converged!'
|
|
||||||
flush(6)
|
|
||||||
call MPI_file_close(fileUnit,ierr)
|
call MPI_file_close(fileUnit,ierr)
|
||||||
close(statUnit)
|
close(statUnit)
|
||||||
|
|
||||||
if (notConvergedCounter > 0) call quit(2) ! error if some are not converged
|
|
||||||
call quit(0) ! no complains ;)
|
call quit(0) ! no complains ;)
|
||||||
|
|
||||||
end program DAMASK_spectral
|
end program DAMASK_spectral
|
||||||
|
|
|
@ -203,8 +203,9 @@ end function grid_damage_spectral_solution
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief spectral damage forwarding routine
|
!> @brief spectral damage forwarding routine
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine grid_damage_spectral_forward
|
subroutine grid_damage_spectral_forward(cutBack)
|
||||||
|
|
||||||
|
logical, intent(in) :: cutBack
|
||||||
integer :: i, j, k, cell
|
integer :: i, j, k, cell
|
||||||
DM :: dm_local
|
DM :: dm_local
|
||||||
PetscScalar, dimension(:,:,:), pointer :: x_scal
|
PetscScalar, dimension(:,:,:), pointer :: x_scal
|
||||||
|
|
|
@ -71,7 +71,9 @@ module grid_mech_FEM
|
||||||
public :: &
|
public :: &
|
||||||
grid_mech_FEM_init, &
|
grid_mech_FEM_init, &
|
||||||
grid_mech_FEM_solution, &
|
grid_mech_FEM_solution, &
|
||||||
grid_mech_FEM_forward
|
grid_mech_FEM_forward, &
|
||||||
|
grid_mech_FEM_updateCoords, &
|
||||||
|
grid_mech_FEM_restartWrite
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
|
@ -95,7 +97,7 @@ subroutine grid_mech_FEM_init
|
||||||
1.0_pReal, 1.0_pReal, 1.0_pReal, 1.0_pReal], [4,8])
|
1.0_pReal, 1.0_pReal, 1.0_pReal, 1.0_pReal], [4,8])
|
||||||
PetscErrorCode :: ierr
|
PetscErrorCode :: ierr
|
||||||
integer :: rank
|
integer :: rank
|
||||||
integer(HID_T) :: fileHandle
|
integer(HID_T) :: fileHandle, groupHandle
|
||||||
character(len=1024) :: rankStr
|
character(len=1024) :: rankStr
|
||||||
real(pReal), dimension(3,3,3,3) :: devNull
|
real(pReal), dimension(3,3,3,3) :: devNull
|
||||||
PetscScalar, pointer, dimension(:,:,:,:) :: &
|
PetscScalar, pointer, dimension(:,:,:,:) :: &
|
||||||
|
@ -186,15 +188,16 @@ subroutine grid_mech_FEM_init
|
||||||
'reading values of increment ', interface_restartInc, ' from file'
|
'reading values of increment ', interface_restartInc, ' from file'
|
||||||
|
|
||||||
write(rankStr,'(a1,i0)')'_',worldrank
|
write(rankStr,'(a1,i0)')'_',worldrank
|
||||||
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5')
|
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5')
|
||||||
|
groupHandle = HDF5_openGroup(fileHandle,'solver')
|
||||||
|
|
||||||
call HDF5_read(fileHandle,F_aim, 'F_aim')
|
call HDF5_read(groupHandle,F_aim, 'F_aim')
|
||||||
call HDF5_read(fileHandle,F_aim_lastInc,'F_aim_lastInc')
|
call HDF5_read(groupHandle,F_aim_lastInc,'F_aim_lastInc')
|
||||||
call HDF5_read(fileHandle,F_aimDot, 'F_aimDot')
|
call HDF5_read(groupHandle,F_aimDot, 'F_aimDot')
|
||||||
call HDF5_read(fileHandle,F, 'F')
|
call HDF5_read(groupHandle,F, 'F')
|
||||||
call HDF5_read(fileHandle,F_lastInc, 'F_lastInc')
|
call HDF5_read(groupHandle,F_lastInc, 'F_lastInc')
|
||||||
call HDF5_read(fileHandle,u_current, 'u')
|
call HDF5_read(groupHandle,u_current, 'u')
|
||||||
call HDF5_read(fileHandle,u_lastInc, 'u_lastInc')
|
call HDF5_read(groupHandle,u_lastInc, 'u_lastInc')
|
||||||
|
|
||||||
elseif (interface_restartInc == 0) then restartRead
|
elseif (interface_restartInc == 0) then restartRead
|
||||||
F_lastInc = spread(spread(spread(math_I3,3,grid(1)),4,grid(2)),5,grid3) ! initialize to identity
|
F_lastInc = spread(spread(spread(math_I3,3,grid(1)),4,grid(2)),5,grid3) ! initialize to identity
|
||||||
|
@ -214,9 +217,12 @@ subroutine grid_mech_FEM_init
|
||||||
restartRead2: if (interface_restartInc > 0) then
|
restartRead2: if (interface_restartInc > 0) then
|
||||||
write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') &
|
write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') &
|
||||||
'reading more values of increment ', interface_restartInc, ' from file'
|
'reading more values of increment ', interface_restartInc, ' from file'
|
||||||
call HDF5_read(fileHandle,C_volAvg, 'C_volAvg')
|
call HDF5_read(groupHandle,C_volAvg, 'C_volAvg')
|
||||||
call HDF5_read(fileHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
call HDF5_read(groupHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
||||||
|
|
||||||
|
call HDF5_closeGroup(groupHandle)
|
||||||
call HDF5_closeFile(fileHandle)
|
call HDF5_closeFile(fileHandle)
|
||||||
|
|
||||||
endif restartRead2
|
endif restartRead2
|
||||||
|
|
||||||
end subroutine grid_mech_FEM_init
|
end subroutine grid_mech_FEM_init
|
||||||
|
@ -278,9 +284,11 @@ end function grid_mech_FEM_solution
|
||||||
!> @details find new boundary conditions and best F estimate for end of current timestep
|
!> @details find new boundary conditions and best F estimate for end of current timestep
|
||||||
!> possibly writing restart information, triggering of state increment in DAMASK, and updating of IPcoordinates
|
!> possibly writing restart information, triggering of state increment in DAMASK, and updating of IPcoordinates
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformation_BC,stress_BC,rotation_BC)
|
subroutine grid_mech_FEM_forward(cutBack,guess,timeinc,timeinc_old,loadCaseTime,&
|
||||||
|
deformation_BC,stress_BC,rotation_BC)
|
||||||
|
|
||||||
logical, intent(in) :: &
|
logical, intent(in) :: &
|
||||||
|
cutBack, &
|
||||||
guess
|
guess
|
||||||
real(pReal), intent(in) :: &
|
real(pReal), intent(in) :: &
|
||||||
timeinc_old, &
|
timeinc_old, &
|
||||||
|
@ -292,42 +300,15 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat
|
||||||
real(pReal), dimension(3,3), intent(in) :: &
|
real(pReal), dimension(3,3), intent(in) :: &
|
||||||
rotation_BC
|
rotation_BC
|
||||||
PetscErrorCode :: ierr
|
PetscErrorCode :: ierr
|
||||||
integer(HID_T) :: fileHandle
|
PetscScalar, pointer, dimension(:,:,:,:) :: &
|
||||||
character(len=32) :: rankStr
|
u_current,u_lastInc
|
||||||
PetscScalar, pointer, dimension(:,:,:,:) :: &
|
|
||||||
u_current,u_lastInc
|
|
||||||
|
|
||||||
call DMDAVecGetArrayF90(mech_grid,solution_current,u_current,ierr); CHKERRQ(ierr)
|
call DMDAVecGetArrayF90(mech_grid,solution_current,u_current,ierr); CHKERRQ(ierr)
|
||||||
call DMDAVecGetArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr); CHKERRQ(ierr)
|
call DMDAVecGetArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr); CHKERRQ(ierr)
|
||||||
|
|
||||||
if (cutBack) then
|
if (cutBack) then
|
||||||
C_volAvg = C_volAvgLastInc ! QUESTION: where is this required?
|
C_volAvg = C_volAvgLastInc
|
||||||
else
|
else
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
! restart information for spectral solver
|
|
||||||
if (restartWrite) then
|
|
||||||
write(6,'(/,a)') ' writing converged results for restart';flush(6)
|
|
||||||
|
|
||||||
write(rankStr,'(a1,i0)')'_',worldrank
|
|
||||||
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w')
|
|
||||||
|
|
||||||
call HDF5_write(fileHandle,F_aim, 'F_aim')
|
|
||||||
call HDF5_write(fileHandle,F_aim_lastInc, 'F_aim_lastInc')
|
|
||||||
call HDF5_write(fileHandle,F_aimDot, 'F_aimDot')
|
|
||||||
call HDF5_write(fileHandle,F, 'F')
|
|
||||||
call HDF5_write(fileHandle,F_lastInc, 'F_lastInc')
|
|
||||||
call HDF5_write(fileHandle,u_current, 'u')
|
|
||||||
call HDF5_write(fileHandle,u_lastInc, 'u_lastInc')
|
|
||||||
|
|
||||||
call HDF5_write(fileHandle,C_volAvg, 'C_volAvg')
|
|
||||||
call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
|
||||||
|
|
||||||
call HDF5_closeFile(fileHandle)
|
|
||||||
|
|
||||||
endif
|
|
||||||
call CPFEM_age ! age state and kinematics
|
|
||||||
call utilities_updateCoords(F)
|
|
||||||
|
|
||||||
C_volAvgLastInc = C_volAvg
|
C_volAvgLastInc = C_volAvg
|
||||||
|
|
||||||
F_aimDot = merge(stress_BC%maskFloat*(F_aim-F_aim_lastInc)/timeinc_old, 0.0_pReal, guess)
|
F_aimDot = merge(stress_BC%maskFloat*(F_aim-F_aim_lastInc)/timeinc_old, 0.0_pReal, guess)
|
||||||
|
@ -346,7 +327,6 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat
|
||||||
F_aimDot + deformation_BC%maskFloat * (deformation_BC%values - F_aim_lastInc)/loadCaseTime
|
F_aimDot + deformation_BC%maskFloat * (deformation_BC%values - F_aim_lastInc)/loadCaseTime
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
if (guess) then
|
if (guess) then
|
||||||
call VecWAXPY(solution_rate,-1.0_pReal,solution_lastInc,solution_current,ierr)
|
call VecWAXPY(solution_rate,-1.0_pReal,solution_lastInc,solution_current,ierr)
|
||||||
CHKERRQ(ierr)
|
CHKERRQ(ierr)
|
||||||
|
@ -356,9 +336,9 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat
|
||||||
endif
|
endif
|
||||||
call VecCopy(solution_current,solution_lastInc,ierr); CHKERRQ(ierr)
|
call VecCopy(solution_current,solution_lastInc,ierr); CHKERRQ(ierr)
|
||||||
|
|
||||||
F_lastInc = F ! winding F forward
|
F_lastInc = F
|
||||||
materialpoint_F0 = reshape(F_lastInc, [3,3,1,product(grid(1:2))*grid3]) ! set starting condition for materialpoint_stressAndItsTangent
|
|
||||||
|
|
||||||
|
materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3])
|
||||||
endif
|
endif
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -366,14 +346,61 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat
|
||||||
F_aim = F_aim_lastInc + F_aimDot * timeinc
|
F_aim = F_aim_lastInc + F_aimDot * timeinc
|
||||||
call VecAXPY(solution_current,timeinc,solution_rate,ierr); CHKERRQ(ierr)
|
call VecAXPY(solution_current,timeinc,solution_rate,ierr); CHKERRQ(ierr)
|
||||||
|
|
||||||
call DMDAVecRestoreArrayF90(mech_grid,solution_current,u_current,ierr)
|
call DMDAVecRestoreArrayF90(mech_grid,solution_current,u_current,ierr);CHKERRQ(ierr)
|
||||||
CHKERRQ(ierr)
|
call DMDAVecRestoreArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr);CHKERRQ(ierr)
|
||||||
call DMDAVecRestoreArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr)
|
|
||||||
CHKERRQ(ierr)
|
|
||||||
|
|
||||||
end subroutine grid_mech_FEM_forward
|
end subroutine grid_mech_FEM_forward
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Age
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
subroutine grid_mech_FEM_updateCoords()
|
||||||
|
|
||||||
|
call utilities_updateCoords(F)
|
||||||
|
|
||||||
|
end subroutine grid_mech_FEM_updateCoords
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Write current solver and constitutive data for restart to file
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
subroutine grid_mech_FEM_restartWrite()
|
||||||
|
|
||||||
|
PetscErrorCode :: ierr
|
||||||
|
PetscScalar, dimension(:,:,:,:), pointer :: u_current,u_lastInc
|
||||||
|
integer(HID_T) :: fileHandle, groupHandle
|
||||||
|
character(len=32) :: rankStr
|
||||||
|
|
||||||
|
call DMDAVecGetArrayF90(mech_grid,solution_current,u_current,ierr); CHKERRQ(ierr)
|
||||||
|
call DMDAVecGetArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr); CHKERRQ(ierr)
|
||||||
|
|
||||||
|
write(6,'(a)') ' writing solver data required for restart to file';flush(6)
|
||||||
|
|
||||||
|
write(rankStr,'(a1,i0)')'_',worldrank
|
||||||
|
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w')
|
||||||
|
groupHandle = HDF5_addGroup(fileHandle,'solver')
|
||||||
|
|
||||||
|
call HDF5_write(groupHandle,F_aim, 'F_aim')
|
||||||
|
call HDF5_write(groupHandle,F_aim_lastInc,'F_aim_lastInc')
|
||||||
|
call HDF5_write(groupHandle,F_aimDot, 'F_aimDot')
|
||||||
|
call HDF5_write(groupHandle,F, 'F')
|
||||||
|
call HDF5_write(groupHandle,F_lastInc, 'F_lastInc')
|
||||||
|
call HDF5_write(groupHandle,u_current, 'u')
|
||||||
|
call HDF5_write(groupHandle,u_lastInc, 'u_lastInc')
|
||||||
|
|
||||||
|
call HDF5_write(groupHandle,C_volAvg, 'C_volAvg')
|
||||||
|
call HDF5_write(groupHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
||||||
|
|
||||||
|
call HDF5_closeGroup(groupHandle)
|
||||||
|
call HDF5_closeFile(fileHandle)
|
||||||
|
|
||||||
|
call DMDAVecRestoreArrayF90(mech_grid,solution_current,u_current,ierr);CHKERRQ(ierr)
|
||||||
|
call DMDAVecRestoreArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr);CHKERRQ(ierr)
|
||||||
|
|
||||||
|
end subroutine grid_mech_FEM_restartWrite
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief convergence check
|
!> @brief convergence check
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -549,7 +576,7 @@ subroutine formJacobian(da_local,x_local,Jac_pre,Jac,dummy,ierr)
|
||||||
PetscScalar,dimension(24,24) :: K_ele
|
PetscScalar,dimension(24,24) :: K_ele
|
||||||
PetscScalar,dimension(9,24) :: BMatFull
|
PetscScalar,dimension(9,24) :: BMatFull
|
||||||
PetscInt :: i, ii, j, jj, k, kk, ctr, ele
|
PetscInt :: i, ii, j, jj, k, kk, ctr, ele
|
||||||
PetscInt,dimension(3) :: rows
|
PetscInt,dimension(3),parameter :: rows = [0, 1, 2]
|
||||||
PetscScalar :: diag
|
PetscScalar :: diag
|
||||||
PetscObject :: dummy
|
PetscObject :: dummy
|
||||||
MatNullSpace :: matnull
|
MatNullSpace :: matnull
|
||||||
|
@ -606,7 +633,6 @@ subroutine formJacobian(da_local,x_local,Jac_pre,Jac,dummy,ierr)
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! applying boundary conditions
|
! applying boundary conditions
|
||||||
rows = [0, 1, 2]
|
|
||||||
diag = (C_volAvg(1,1,1,1)/delta(1)**2.0_pReal + &
|
diag = (C_volAvg(1,1,1,1)/delta(1)**2.0_pReal + &
|
||||||
C_volAvg(2,2,2,2)/delta(2)**2.0_pReal + &
|
C_volAvg(2,2,2,2)/delta(2)**2.0_pReal + &
|
||||||
C_volAvg(3,3,3,3)/delta(3)**2.0_pReal)*detJ
|
C_volAvg(3,3,3,3)/delta(3)**2.0_pReal)*detJ
|
||||||
|
|
|
@ -75,10 +75,9 @@ module grid_mech_spectral_basic
|
||||||
public :: &
|
public :: &
|
||||||
grid_mech_spectral_basic_init, &
|
grid_mech_spectral_basic_init, &
|
||||||
grid_mech_spectral_basic_solution, &
|
grid_mech_spectral_basic_solution, &
|
||||||
grid_mech_spectral_basic_forward
|
grid_mech_spectral_basic_forward, &
|
||||||
private :: &
|
grid_mech_spectral_basic_updateCoords, &
|
||||||
converged, &
|
grid_mech_spectral_basic_restartWrite
|
||||||
formResidual
|
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
|
@ -95,8 +94,8 @@ subroutine grid_mech_spectral_basic_init
|
||||||
PetscScalar, pointer, dimension(:,:,:,:) :: &
|
PetscScalar, pointer, dimension(:,:,:,:) :: &
|
||||||
F ! pointer to solution data
|
F ! pointer to solution data
|
||||||
PetscInt, dimension(worldsize) :: localK
|
PetscInt, dimension(worldsize) :: localK
|
||||||
integer(HID_T) :: fileHandle
|
integer(HID_T) :: fileHandle, groupHandle
|
||||||
integer :: fileUnit
|
integer :: fileUnit
|
||||||
character(len=1024) :: rankStr
|
character(len=1024) :: rankStr
|
||||||
|
|
||||||
write(6,'(/,a)') ' <<<+- grid_mech_spectral_basic init -+>>>'
|
write(6,'(/,a)') ' <<<+- grid_mech_spectral_basic init -+>>>'
|
||||||
|
@ -156,13 +155,14 @@ subroutine grid_mech_spectral_basic_init
|
||||||
' reading values of increment ', interface_restartInc, ' from file'
|
' reading values of increment ', interface_restartInc, ' from file'
|
||||||
|
|
||||||
write(rankStr,'(a1,i0)')'_',worldrank
|
write(rankStr,'(a1,i0)')'_',worldrank
|
||||||
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5')
|
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5')
|
||||||
|
groupHandle = HDF5_openGroup(fileHandle,'solver')
|
||||||
|
|
||||||
call HDF5_read(fileHandle,F_aim, 'F_aim')
|
call HDF5_read(groupHandle,F_aim, 'F_aim')
|
||||||
call HDF5_read(fileHandle,F_aim_lastInc,'F_aim_lastInc')
|
call HDF5_read(groupHandle,F_aim_lastInc,'F_aim_lastInc')
|
||||||
call HDF5_read(fileHandle,F_aimDot, 'F_aimDot')
|
call HDF5_read(groupHandle,F_aimDot, 'F_aimDot')
|
||||||
call HDF5_read(fileHandle,F, 'F')
|
call HDF5_read(groupHandle,F, 'F')
|
||||||
call HDF5_read(fileHandle,F_lastInc, 'F_lastInc')
|
call HDF5_read(groupHandle,F_lastInc, 'F_lastInc')
|
||||||
|
|
||||||
elseif (interface_restartInc == 0) then restartRead
|
elseif (interface_restartInc == 0) then restartRead
|
||||||
F_lastInc = spread(spread(spread(math_I3,3,grid(1)),4,grid(2)),5,grid3) ! initialize to identity
|
F_lastInc = spread(spread(spread(math_I3,3,grid(1)),4,grid(2)),5,grid3) ! initialize to identity
|
||||||
|
@ -180,8 +180,10 @@ subroutine grid_mech_spectral_basic_init
|
||||||
restartRead2: if (interface_restartInc > 0) then
|
restartRead2: if (interface_restartInc > 0) then
|
||||||
write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') &
|
write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') &
|
||||||
'reading more values of increment ', interface_restartInc, ' from file'
|
'reading more values of increment ', interface_restartInc, ' from file'
|
||||||
call HDF5_read(fileHandle,C_volAvg, 'C_volAvg')
|
call HDF5_read(groupHandle,C_volAvg, 'C_volAvg')
|
||||||
call HDF5_read(fileHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
call HDF5_read(groupHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
||||||
|
|
||||||
|
call HDF5_closeGroup(groupHandle)
|
||||||
call HDF5_closeFile(fileHandle)
|
call HDF5_closeFile(fileHandle)
|
||||||
|
|
||||||
call MPI_File_open(PETSC_COMM_WORLD, trim(getSolverJobName())//'.C_ref', &
|
call MPI_File_open(PETSC_COMM_WORLD, trim(getSolverJobName())//'.C_ref', &
|
||||||
|
@ -190,7 +192,8 @@ subroutine grid_mech_spectral_basic_init
|
||||||
call MPI_File_close(fileUnit,ierr)
|
call MPI_File_close(fileUnit,ierr)
|
||||||
endif restartRead2
|
endif restartRead2
|
||||||
|
|
||||||
call utilities_updateGamma(C_minMaxAvg,.true.)
|
call utilities_updateGamma(C_minMaxAvg)
|
||||||
|
call utilities_saveReferenceStiffness
|
||||||
|
|
||||||
end subroutine grid_mech_spectral_basic_init
|
end subroutine grid_mech_spectral_basic_init
|
||||||
|
|
||||||
|
@ -222,7 +225,7 @@ function grid_mech_spectral_basic_solution(incInfoIn,timeinc,timeinc_old,stress_
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! update stiffness (and gamma operator)
|
! update stiffness (and gamma operator)
|
||||||
S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg)
|
S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg)
|
||||||
if (num%update_gamma) call utilities_updateGamma(C_minMaxAvg,restartWrite)
|
if(num%update_gamma) call utilities_updateGamma(C_minMaxAvg)
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! set module wide available data
|
! set module wide available data
|
||||||
|
@ -253,9 +256,11 @@ end function grid_mech_spectral_basic_solution
|
||||||
!> @details find new boundary conditions and best F estimate for end of current timestep
|
!> @details find new boundary conditions and best F estimate for end of current timestep
|
||||||
!> possibly writing restart information, triggering of state increment in DAMASK, and updating of IPcoordinates
|
!> possibly writing restart information, triggering of state increment in DAMASK, and updating of IPcoordinates
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTime,deformation_BC,stress_BC,rotation_BC)
|
subroutine grid_mech_spectral_basic_forward(cutBack,guess,timeinc,timeinc_old,loadCaseTime,&
|
||||||
|
deformation_BC,stress_BC,rotation_BC)
|
||||||
|
|
||||||
logical, intent(in) :: &
|
logical, intent(in) :: &
|
||||||
|
cutBack, &
|
||||||
guess
|
guess
|
||||||
real(pReal), intent(in) :: &
|
real(pReal), intent(in) :: &
|
||||||
timeinc_old, &
|
timeinc_old, &
|
||||||
|
@ -269,39 +274,12 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi
|
||||||
PetscErrorCode :: ierr
|
PetscErrorCode :: ierr
|
||||||
PetscScalar, dimension(:,:,:,:), pointer :: F
|
PetscScalar, dimension(:,:,:,:), pointer :: F
|
||||||
|
|
||||||
integer(HID_T) :: fileHandle
|
|
||||||
character(len=32) :: rankStr
|
|
||||||
|
|
||||||
call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr)
|
call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr)
|
||||||
|
|
||||||
if (cutBack) then
|
if (cutBack) then
|
||||||
C_volAvg = C_volAvgLastInc ! QUESTION: where is this required?
|
C_volAvg = C_volAvgLastInc
|
||||||
C_minMaxAvg = C_minMaxAvgLastInc ! QUESTION: where is this required?
|
C_minMaxAvg = C_minMaxAvgLastInc
|
||||||
else
|
else
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
! restart information for spectral solver
|
|
||||||
if (restartWrite) then
|
|
||||||
write(6,'(/,a)') ' writing converged results for restart';flush(6)
|
|
||||||
|
|
||||||
write(rankStr,'(a1,i0)')'_',worldrank
|
|
||||||
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w')
|
|
||||||
|
|
||||||
call HDF5_write(fileHandle,F_aim, 'F_aim')
|
|
||||||
call HDF5_write(fileHandle,F_aim_lastInc,'F_aim_lastInc')
|
|
||||||
call HDF5_write(fileHandle,F_aimDot, 'F_aimDot')
|
|
||||||
call HDF5_write(fileHandle,F, 'F')
|
|
||||||
call HDF5_write(fileHandle,F_lastInc, 'F_lastInc')
|
|
||||||
|
|
||||||
call HDF5_write(fileHandle,C_volAvg, 'C_volAvg')
|
|
||||||
call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
|
||||||
call HDF5_write(fileHandle,C_minMaxAvg, 'C_minMaxAvg')
|
|
||||||
|
|
||||||
call HDF5_closeFile(fileHandle)
|
|
||||||
endif
|
|
||||||
|
|
||||||
call CPFEM_age ! age state and kinematics
|
|
||||||
call utilities_updateCoords(F)
|
|
||||||
|
|
||||||
C_volAvgLastInc = C_volAvg
|
C_volAvgLastInc = C_volAvg
|
||||||
C_minMaxAvgLastInc = C_minMaxAvg
|
C_minMaxAvgLastInc = C_minMaxAvg
|
||||||
|
|
||||||
|
@ -310,23 +288,23 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! calculate rate for aim
|
! calculate rate for aim
|
||||||
if (deformation_BC%myType=='l') then ! calculate F_aimDot from given L and current F
|
if (deformation_BC%myType=='l') then ! calculate F_aimDot from given L and current F
|
||||||
F_aimDot = &
|
F_aimDot = &
|
||||||
F_aimDot + deformation_BC%maskFloat * matmul(deformation_BC%values, F_aim_lastInc)
|
F_aimDot + deformation_BC%maskFloat * matmul(deformation_BC%values, F_aim_lastInc)
|
||||||
elseif(deformation_BC%myType=='fdot') then ! F_aimDot is prescribed
|
elseif(deformation_BC%myType=='fdot') then ! F_aimDot is prescribed
|
||||||
F_aimDot = &
|
F_aimDot = &
|
||||||
F_aimDot + deformation_BC%maskFloat * deformation_BC%values
|
F_aimDot + deformation_BC%maskFloat * deformation_BC%values
|
||||||
elseif (deformation_BC%myType=='f') then ! aim at end of load case is prescribed
|
elseif (deformation_BC%myType=='f') then ! aim at end of load case is prescribed
|
||||||
F_aimDot = &
|
F_aimDot = &
|
||||||
F_aimDot + deformation_BC%maskFloat * (deformation_BC%values - F_aim_lastInc)/loadCaseTime
|
F_aimDot + deformation_BC%maskFloat * (deformation_BC%values - F_aim_lastInc)/loadCaseTime
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
Fdot = utilities_calculateRate(guess, &
|
Fdot = utilities_calculateRate(guess, &
|
||||||
F_lastInc,reshape(F,[3,3,grid(1),grid(2),grid3]),timeinc_old, &
|
F_lastInc,reshape(F,[3,3,grid(1),grid(2),grid3]),timeinc_old, &
|
||||||
math_rotate_backward33(F_aimDot,rotation_BC))
|
math_rotate_backward33(F_aimDot,rotation_BC))
|
||||||
F_lastInc = reshape(F, [3,3,grid(1),grid(2),grid3]) ! winding F forward
|
F_lastInc = reshape(F,[3,3,grid(1),grid(2),grid3])
|
||||||
materialpoint_F0 = reshape(F_lastInc, [3,3,1,product(grid(1:2))*grid3]) ! set starting condition for materialpoint_stressAndItsTangent
|
|
||||||
|
materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3])
|
||||||
endif
|
endif
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -339,6 +317,59 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi
|
||||||
end subroutine grid_mech_spectral_basic_forward
|
end subroutine grid_mech_spectral_basic_forward
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Age
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
subroutine grid_mech_spectral_basic_updateCoords()
|
||||||
|
|
||||||
|
PetscErrorCode :: ierr
|
||||||
|
PetscScalar, dimension(:,:,:,:), pointer :: F
|
||||||
|
|
||||||
|
call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr)
|
||||||
|
call utilities_updateCoords(F)
|
||||||
|
call DMDAVecRestoreArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr)
|
||||||
|
|
||||||
|
end subroutine grid_mech_spectral_basic_updateCoords
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Write current solver and constitutive data for restart to file
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
subroutine grid_mech_spectral_basic_restartWrite()
|
||||||
|
|
||||||
|
PetscErrorCode :: ierr
|
||||||
|
PetscScalar, dimension(:,:,:,:), pointer :: F
|
||||||
|
integer(HID_T) :: fileHandle, groupHandle
|
||||||
|
character(len=32) :: rankStr
|
||||||
|
|
||||||
|
call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr)
|
||||||
|
|
||||||
|
write(6,'(a)') ' writing solver data required for restart to file';flush(6)
|
||||||
|
|
||||||
|
write(rankStr,'(a1,i0)')'_',worldrank
|
||||||
|
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w')
|
||||||
|
groupHandle = HDF5_addGroup(fileHandle,'solver')
|
||||||
|
|
||||||
|
call HDF5_write(groupHandle,F_aim, 'F_aim')
|
||||||
|
call HDF5_write(groupHandle,F_aim_lastInc,'F_aim_lastInc')
|
||||||
|
call HDF5_write(groupHandle,F_aimDot, 'F_aimDot')
|
||||||
|
call HDF5_write(groupHandle,F, 'F')
|
||||||
|
call HDF5_write(groupHandle,F_lastInc, 'F_lastInc')
|
||||||
|
|
||||||
|
call HDF5_write(groupHandle,C_volAvg, 'C_volAvg')
|
||||||
|
call HDF5_write(groupHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
||||||
|
call HDF5_write(groupHandle,C_minMaxAvg, 'C_minMaxAvg')
|
||||||
|
|
||||||
|
call HDF5_closeGroup(groupHandle)
|
||||||
|
call HDF5_closeFile(fileHandle)
|
||||||
|
|
||||||
|
if (num%update_gamma) call utilities_saveReferenceStiffness
|
||||||
|
|
||||||
|
call DMDAVecRestoreArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr)
|
||||||
|
|
||||||
|
end subroutine grid_mech_spectral_basic_restartWrite
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief convergence check
|
!> @brief convergence check
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -81,10 +81,9 @@ module grid_mech_spectral_polarisation
|
||||||
public :: &
|
public :: &
|
||||||
grid_mech_spectral_polarisation_init, &
|
grid_mech_spectral_polarisation_init, &
|
||||||
grid_mech_spectral_polarisation_solution, &
|
grid_mech_spectral_polarisation_solution, &
|
||||||
grid_mech_spectral_polarisation_forward
|
grid_mech_spectral_polarisation_forward, &
|
||||||
private :: &
|
grid_mech_spectral_polarisation_updateCoords, &
|
||||||
converged, &
|
grid_mech_spectral_polarisation_restartWrite
|
||||||
formResidual
|
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
|
@ -103,8 +102,8 @@ subroutine grid_mech_spectral_polarisation_init
|
||||||
F, & ! specific (sub)pointer
|
F, & ! specific (sub)pointer
|
||||||
F_tau ! specific (sub)pointer
|
F_tau ! specific (sub)pointer
|
||||||
PetscInt, dimension(worldsize) :: localK
|
PetscInt, dimension(worldsize) :: localK
|
||||||
integer(HID_T) :: fileHandle
|
integer(HID_T) :: fileHandle, groupHandle
|
||||||
integer :: fileUnit
|
integer :: fileUnit
|
||||||
character(len=1024) :: rankStr
|
character(len=1024) :: rankStr
|
||||||
|
|
||||||
write(6,'(/,a)') ' <<<+- grid_mech_spectral_polarisation init -+>>>'
|
write(6,'(/,a)') ' <<<+- grid_mech_spectral_polarisation init -+>>>'
|
||||||
|
@ -157,23 +156,24 @@ subroutine grid_mech_spectral_polarisation_init
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! init fields
|
! init fields
|
||||||
call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) ! places pointer on PETSc data
|
call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) ! places pointer on PETSc data
|
||||||
F => FandF_tau( 0: 8,:,:,:)
|
F => FandF_tau(0: 8,:,:,:)
|
||||||
F_tau => FandF_tau( 9:17,:,:,:)
|
F_tau => FandF_tau(9:17,:,:,:)
|
||||||
|
|
||||||
restartRead: if (interface_restartInc > 0) then
|
restartRead: if (interface_restartInc > 0) then
|
||||||
write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') &
|
write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') &
|
||||||
' reading values of increment ', interface_restartInc, ' from file'
|
' reading values of increment ', interface_restartInc, ' from file'
|
||||||
|
|
||||||
write(rankStr,'(a1,i0)')'_',worldrank
|
write(rankStr,'(a1,i0)')'_',worldrank
|
||||||
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5')
|
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5')
|
||||||
|
groupHandle = HDF5_openGroup(fileHandle,'solver')
|
||||||
|
|
||||||
call HDF5_read(fileHandle,F_aim, 'F_aim')
|
call HDF5_read(groupHandle,F_aim, 'F_aim')
|
||||||
call HDF5_read(fileHandle,F_aim_lastInc,'F_aim_lastInc')
|
call HDF5_read(groupHandle,F_aim_lastInc,'F_aim_lastInc')
|
||||||
call HDF5_read(fileHandle,F_aimDot, 'F_aimDot')
|
call HDF5_read(groupHandle,F_aimDot, 'F_aimDot')
|
||||||
call HDF5_read(fileHandle,F, 'F')
|
call HDF5_read(groupHandle,F, 'F')
|
||||||
call HDF5_read(fileHandle,F_lastInc, 'F_lastInc')
|
call HDF5_read(groupHandle,F_lastInc, 'F_lastInc')
|
||||||
call HDF5_read(fileHandle,F_tau, 'F_tau')
|
call HDF5_read(groupHandle,F_tau, 'F_tau')
|
||||||
call HDF5_read(fileHandle,F_tau_lastInc,'F_tau_lastInc')
|
call HDF5_read(groupHandle,F_tau_lastInc,'F_tau_lastInc')
|
||||||
|
|
||||||
elseif (interface_restartInc == 0) then restartRead
|
elseif (interface_restartInc == 0) then restartRead
|
||||||
F_lastInc = spread(spread(spread(math_I3,3,grid(1)),4,grid(2)),5,grid3) ! initialize to identity
|
F_lastInc = spread(spread(spread(math_I3,3,grid(1)),4,grid(2)),5,grid3) ! initialize to identity
|
||||||
|
@ -193,8 +193,10 @@ subroutine grid_mech_spectral_polarisation_init
|
||||||
restartRead2: if (interface_restartInc > 0) then
|
restartRead2: if (interface_restartInc > 0) then
|
||||||
write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') &
|
write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') &
|
||||||
' reading more values of increment ', interface_restartInc, ' from file'
|
' reading more values of increment ', interface_restartInc, ' from file'
|
||||||
call HDF5_read(fileHandle,C_volAvg, 'C_volAvg')
|
call HDF5_read(groupHandle,C_volAvg, 'C_volAvg')
|
||||||
call HDF5_read(fileHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
call HDF5_read(groupHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
||||||
|
|
||||||
|
call HDF5_closeGroup(groupHandle)
|
||||||
call HDF5_closeFile(fileHandle)
|
call HDF5_closeFile(fileHandle)
|
||||||
|
|
||||||
call MPI_File_open(PETSC_COMM_WORLD, trim(getSolverJobName())//'.C_ref', &
|
call MPI_File_open(PETSC_COMM_WORLD, trim(getSolverJobName())//'.C_ref', &
|
||||||
|
@ -203,7 +205,8 @@ subroutine grid_mech_spectral_polarisation_init
|
||||||
call MPI_File_close(fileUnit,ierr)
|
call MPI_File_close(fileUnit,ierr)
|
||||||
endif restartRead2
|
endif restartRead2
|
||||||
|
|
||||||
call utilities_updateGamma(C_minMaxAvg,.true.)
|
call utilities_updateGamma(C_minMaxAvg)
|
||||||
|
call utilities_saveReferenceStiffness
|
||||||
C_scale = C_minMaxAvg
|
C_scale = C_minMaxAvg
|
||||||
S_scale = math_invSym3333(C_minMaxAvg)
|
S_scale = math_invSym3333(C_minMaxAvg)
|
||||||
|
|
||||||
|
@ -238,7 +241,7 @@ function grid_mech_spectral_polarisation_solution(incInfoIn,timeinc,timeinc_old,
|
||||||
! update stiffness (and gamma operator)
|
! update stiffness (and gamma operator)
|
||||||
S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg)
|
S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg)
|
||||||
if (num%update_gamma) then
|
if (num%update_gamma) then
|
||||||
call utilities_updateGamma(C_minMaxAvg,restartWrite)
|
call utilities_updateGamma(C_minMaxAvg)
|
||||||
C_scale = C_minMaxAvg
|
C_scale = C_minMaxAvg
|
||||||
S_scale = math_invSym3333(C_minMaxAvg)
|
S_scale = math_invSym3333(C_minMaxAvg)
|
||||||
endif
|
endif
|
||||||
|
@ -272,9 +275,11 @@ end function grid_mech_spectral_polarisation_solution
|
||||||
!> @details find new boundary conditions and best F estimate for end of current timestep
|
!> @details find new boundary conditions and best F estimate for end of current timestep
|
||||||
!> possibly writing restart information, triggering of state increment in DAMASK, and updating of IPcoordinates
|
!> possibly writing restart information, triggering of state increment in DAMASK, and updating of IPcoordinates
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loadCaseTime,deformation_BC,stress_BC,rotation_BC)
|
subroutine grid_mech_spectral_polarisation_forward(cutBack,guess,timeinc,timeinc_old,loadCaseTime,&
|
||||||
|
deformation_BC,stress_BC,rotation_BC)
|
||||||
|
|
||||||
logical, intent(in) :: &
|
logical, intent(in) :: &
|
||||||
|
cutBack, &
|
||||||
guess
|
guess
|
||||||
real(pReal), intent(in) :: &
|
real(pReal), intent(in) :: &
|
||||||
timeinc_old, &
|
timeinc_old, &
|
||||||
|
@ -290,49 +295,21 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa
|
||||||
integer :: i, j, k
|
integer :: i, j, k
|
||||||
real(pReal), dimension(3,3) :: F_lambda33
|
real(pReal), dimension(3,3) :: F_lambda33
|
||||||
|
|
||||||
integer(HID_T) :: fileHandle
|
|
||||||
character(len=32) :: rankStr
|
|
||||||
|
|
||||||
call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr)
|
call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr)
|
||||||
F => FandF_tau( 0: 8,:,:,:)
|
F => FandF_tau(0: 8,:,:,:)
|
||||||
F_tau => FandF_tau( 9:17,:,:,:)
|
F_tau => FandF_tau(9:17,:,:,:)
|
||||||
|
|
||||||
if (cutBack) then
|
if (cutBack) then
|
||||||
C_volAvg = C_volAvgLastInc ! QUESTION: where is this required?
|
C_volAvg = C_volAvgLastInc
|
||||||
C_minMaxAvg = C_minMaxAvgLastInc ! QUESTION: where is this required?
|
C_minMaxAvg = C_minMaxAvgLastInc
|
||||||
else
|
else
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
! restart information for spectral solver
|
|
||||||
if (restartWrite) then
|
|
||||||
write(6,'(/,a)') ' writing converged results for restart';flush(6)
|
|
||||||
|
|
||||||
write(rankStr,'(a1,i0)')'_',worldrank
|
|
||||||
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w')
|
|
||||||
|
|
||||||
call HDF5_write(fileHandle,F_aim, 'F_aim')
|
|
||||||
call HDF5_write(fileHandle,F_aim_lastInc, 'F_aim_lastInc')
|
|
||||||
call HDF5_write(fileHandle,F_aimDot, 'F_aimDot')
|
|
||||||
call HDF5_write(fileHandle,F, 'F')
|
|
||||||
call HDF5_write(fileHandle,F_lastInc, 'F_lastInc')
|
|
||||||
call HDF5_write(fileHandle,F_tau, 'F_tau')
|
|
||||||
call HDF5_write(fileHandle,F_tau_lastInc, 'F_tau_lastInc')
|
|
||||||
|
|
||||||
call HDF5_write(fileHandle,C_volAvg, 'C_volAvg')
|
|
||||||
call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
|
||||||
|
|
||||||
call HDF5_closeFile(fileHandle)
|
|
||||||
endif
|
|
||||||
|
|
||||||
call CPFEM_age ! age state and kinematics
|
|
||||||
call utilities_updateCoords(F)
|
|
||||||
|
|
||||||
C_volAvgLastInc = C_volAvg
|
C_volAvgLastInc = C_volAvg
|
||||||
C_minMaxAvgLastInc = C_minMaxAvg
|
C_minMaxAvgLastInc = C_minMaxAvg
|
||||||
|
|
||||||
F_aimDot = merge(stress_BC%maskFloat*(F_aim-F_aim_lastInc)/timeinc_old, 0.0_pReal, guess)
|
F_aimDot = merge(stress_BC%maskFloat*(F_aim-F_aim_lastInc)/timeinc_old, 0.0_pReal, guess)
|
||||||
F_aim_lastInc = F_aim
|
F_aim_lastInc = F_aim
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!-----------------------------------------------------------------------------------------------
|
||||||
! calculate rate for aim
|
! calculate rate for aim
|
||||||
if (deformation_BC%myType=='l') then ! calculate F_aimDot from given L and current F
|
if (deformation_BC%myType=='l') then ! calculate F_aimDot from given L and current F
|
||||||
F_aimDot = &
|
F_aimDot = &
|
||||||
|
@ -345,16 +322,16 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa
|
||||||
F_aimDot + deformation_BC%maskFloat * (deformation_BC%values - F_aim_lastInc)/loadCaseTime
|
F_aimDot + deformation_BC%maskFloat * (deformation_BC%values - F_aim_lastInc)/loadCaseTime
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
Fdot = utilities_calculateRate(guess, &
|
||||||
|
F_lastInc,reshape(F,[3,3,grid(1),grid(2),grid3]),timeinc_old, &
|
||||||
|
math_rotate_backward33(F_aimDot,rotation_BC))
|
||||||
|
F_tauDot = utilities_calculateRate(guess, &
|
||||||
|
F_tau_lastInc,reshape(F_tau,[3,3,grid(1),grid(2),grid3]), timeinc_old, &
|
||||||
|
math_rotate_backward33(F_aimDot,rotation_BC))
|
||||||
|
F_lastInc = reshape(F, [3,3,grid(1),grid(2),grid3])
|
||||||
|
F_tau_lastInc = reshape(F_tau,[3,3,grid(1),grid(2),grid3])
|
||||||
|
|
||||||
Fdot = utilities_calculateRate(guess, &
|
materialpoint_F0 = reshape(F,[3,3,1,product(grid(1:2))*grid3])
|
||||||
F_lastInc,reshape(F,[3,3,grid(1),grid(2),grid3]),timeinc_old, &
|
|
||||||
math_rotate_backward33(F_aimDot,rotation_BC))
|
|
||||||
F_tauDot = utilities_calculateRate(guess, &
|
|
||||||
F_tau_lastInc,reshape(F_tau,[3,3,grid(1),grid(2),grid3]), timeinc_old, &
|
|
||||||
math_rotate_backward33(F_aimDot,rotation_BC))
|
|
||||||
F_lastInc = reshape(F, [3,3,grid(1),grid(2),grid3]) ! winding F forward
|
|
||||||
F_tau_lastInc = reshape(F_tau, [3,3,grid(1),grid(2),grid3]) ! winding F_tau forward
|
|
||||||
materialpoint_F0 = reshape(F_lastInc, [3,3,1,product(grid(1:2))*grid3]) ! set starting condition for materialpoint_stressAndItsTangent
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -383,6 +360,62 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa
|
||||||
end subroutine grid_mech_spectral_polarisation_forward
|
end subroutine grid_mech_spectral_polarisation_forward
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Age
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
subroutine grid_mech_spectral_polarisation_updateCoords()
|
||||||
|
|
||||||
|
PetscErrorCode :: ierr
|
||||||
|
PetscScalar, dimension(:,:,:,:), pointer :: FandF_tau
|
||||||
|
|
||||||
|
call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr)
|
||||||
|
call utilities_updateCoords(FandF_tau(0:8,:,:,:))
|
||||||
|
call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr)
|
||||||
|
|
||||||
|
end subroutine grid_mech_spectral_polarisation_updateCoords
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Write current solver and constitutive data for restart to file
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
subroutine grid_mech_spectral_polarisation_restartWrite()
|
||||||
|
|
||||||
|
PetscErrorCode :: ierr
|
||||||
|
PetscScalar, dimension(:,:,:,:), pointer :: FandF_tau, F, F_tau
|
||||||
|
integer(HID_T) :: fileHandle, groupHandle
|
||||||
|
character(len=32) :: rankStr
|
||||||
|
|
||||||
|
call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr)
|
||||||
|
F => FandF_tau(0: 8,:,:,:)
|
||||||
|
F_tau => FandF_tau(9:17,:,:,:)
|
||||||
|
|
||||||
|
write(6,'(a)') ' writing solver data required for restart to file';flush(6)
|
||||||
|
|
||||||
|
write(rankStr,'(a1,i0)')'_',worldrank
|
||||||
|
fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w')
|
||||||
|
groupHandle = HDF5_addGroup(fileHandle,'solver')
|
||||||
|
|
||||||
|
call HDF5_write(groupHandle,F_aim, 'F_aim')
|
||||||
|
call HDF5_write(groupHandle,F_aim_lastInc,'F_aim_lastInc')
|
||||||
|
call HDF5_write(groupHandle,F_aimDot, 'F_aimDot')
|
||||||
|
call HDF5_write(groupHandle,F, 'F')
|
||||||
|
call HDF5_write(groupHandle,F_lastInc, 'F_lastInc')
|
||||||
|
call HDF5_write(groupHandle,F_tau, 'F_tau')
|
||||||
|
call HDF5_write(groupHandle,F_tau_lastInc,'F_tau_lastInc')
|
||||||
|
|
||||||
|
call HDF5_write(groupHandle,C_volAvg, 'C_volAvg')
|
||||||
|
call HDF5_write(groupHandle,C_volAvgLastInc,'C_volAvgLastInc')
|
||||||
|
|
||||||
|
call HDF5_closeGroup(groupHandle)
|
||||||
|
call HDF5_closeFile(fileHandle)
|
||||||
|
|
||||||
|
if(num%update_gamma) call utilities_saveReferenceStiffness
|
||||||
|
|
||||||
|
call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr)
|
||||||
|
|
||||||
|
end subroutine grid_mech_spectral_polarisation_restartWrite
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief convergence check
|
!> @brief convergence check
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -457,13 +490,13 @@ subroutine formResidual(in, FandF_tau, &
|
||||||
integer :: &
|
integer :: &
|
||||||
i, j, k, e
|
i, j, k, e
|
||||||
|
|
||||||
F => FandF_tau(1:3,1:3,1,&
|
F => FandF_tau(1:3,1:3,1,&
|
||||||
XG_RANGE,YG_RANGE,ZG_RANGE)
|
XG_RANGE,YG_RANGE,ZG_RANGE)
|
||||||
F_tau => FandF_tau(1:3,1:3,2,&
|
F_tau => FandF_tau(1:3,1:3,2,&
|
||||||
XG_RANGE,YG_RANGE,ZG_RANGE)
|
XG_RANGE,YG_RANGE,ZG_RANGE)
|
||||||
residual_F => residuum(1:3,1:3,1,&
|
residual_F => residuum(1:3,1:3,1,&
|
||||||
X_RANGE, Y_RANGE, Z_RANGE)
|
X_RANGE, Y_RANGE, Z_RANGE)
|
||||||
residual_F_tau => residuum(1:3,1:3,2,&
|
residual_F_tau => residuum(1:3,1:3,2,&
|
||||||
X_RANGE, Y_RANGE, Z_RANGE)
|
X_RANGE, Y_RANGE, Z_RANGE)
|
||||||
|
|
||||||
F_av = sum(sum(sum(F,dim=5),dim=4),dim=3) * wgt
|
F_av = sum(sum(sum(F,dim=5),dim=4),dim=3) * wgt
|
||||||
|
|
|
@ -203,8 +203,9 @@ end function grid_thermal_spectral_solution
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief forwarding routine
|
!> @brief forwarding routine
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine grid_thermal_spectral_forward
|
subroutine grid_thermal_spectral_forward(cutBack)
|
||||||
|
|
||||||
|
logical, intent(in) :: cutBack
|
||||||
integer :: i, j, k, cell
|
integer :: i, j, k, cell
|
||||||
DM :: dm_local
|
DM :: dm_local
|
||||||
PetscScalar, dimension(:,:,:), pointer :: x_scal
|
PetscScalar, dimension(:,:,:), pointer :: x_scal
|
||||||
|
|
|
@ -23,9 +23,6 @@ module spectral_utilities
|
||||||
|
|
||||||
include 'fftw3-mpi.f03'
|
include 'fftw3-mpi.f03'
|
||||||
|
|
||||||
logical, public :: cutBack = .false. !< cut back of BVP solver in case convergence is not achieved or a material point is terminally ill
|
|
||||||
integer, public :: nActiveFields = 0
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! field labels information
|
! field labels information
|
||||||
enum, bind(c)
|
enum, bind(c)
|
||||||
|
@ -38,11 +35,13 @@ module spectral_utilities
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! grid related information information
|
! grid related information information
|
||||||
real(pReal), public :: wgt !< weighting factor 1/Nelems
|
real(pReal), protected, public :: wgt !< weighting factor 1/Nelems
|
||||||
|
integer, protected, public :: grid1Red !< grid(1)/2
|
||||||
|
real(pReal), protected, public, dimension(3) :: scaledGeomSize !< scaled geometry size for calculation of divergence
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! variables storing information for spectral method and FFTW
|
! variables storing information for spectral method and FFTW
|
||||||
integer, public :: grid1Red !< grid(1)/2
|
|
||||||
real (C_DOUBLE), public, dimension(:,:,:,:,:), pointer :: tensorField_real !< real representation (some stress or deformation) of field_fourier
|
real (C_DOUBLE), public, dimension(:,:,:,:,:), pointer :: tensorField_real !< real representation (some stress or deformation) of field_fourier
|
||||||
complex(C_DOUBLE_COMPLEX),public, dimension(:,:,:,:,:), pointer :: tensorField_fourier !< field on which the Fourier transform operates
|
complex(C_DOUBLE_COMPLEX),public, dimension(:,:,:,:,:), pointer :: tensorField_fourier !< field on which the Fourier transform operates
|
||||||
real(C_DOUBLE), public, dimension(:,:,:,:), pointer :: vectorField_real !< vector field real representation for fftw
|
real(C_DOUBLE), public, dimension(:,:,:,:), pointer :: vectorField_real !< vector field real representation for fftw
|
||||||
|
@ -53,7 +52,7 @@ module spectral_utilities
|
||||||
complex(pReal), private, dimension(:,:,:,:), allocatable :: xi1st !< wave vector field for first derivatives
|
complex(pReal), private, dimension(:,:,:,:), allocatable :: xi1st !< wave vector field for first derivatives
|
||||||
complex(pReal), private, dimension(:,:,:,:), allocatable :: xi2nd !< wave vector field for second derivatives
|
complex(pReal), private, dimension(:,:,:,:), allocatable :: xi2nd !< wave vector field for second derivatives
|
||||||
real(pReal), private, dimension(3,3,3,3) :: C_ref !< mechanic reference stiffness
|
real(pReal), private, dimension(3,3,3,3) :: C_ref !< mechanic reference stiffness
|
||||||
real(pReal), protected, public, dimension(3) :: scaledGeomSize !< scaled geometry size for calculation of divergence (Basic, Basic PETSc)
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! plans for FFTW
|
! plans for FFTW
|
||||||
|
@ -157,12 +156,11 @@ module spectral_utilities
|
||||||
utilities_calculateRate, &
|
utilities_calculateRate, &
|
||||||
utilities_forwardField, &
|
utilities_forwardField, &
|
||||||
utilities_updateCoords, &
|
utilities_updateCoords, &
|
||||||
|
utilities_saveReferenceStiffness, &
|
||||||
FIELD_UNDEFINED_ID, &
|
FIELD_UNDEFINED_ID, &
|
||||||
FIELD_MECH_ID, &
|
FIELD_MECH_ID, &
|
||||||
FIELD_THERMAL_ID, &
|
FIELD_THERMAL_ID, &
|
||||||
FIELD_DAMAGE_ID
|
FIELD_DAMAGE_ID
|
||||||
private :: &
|
|
||||||
utilities_getFreqDerivative
|
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
|
@ -389,27 +387,18 @@ end subroutine utilities_init
|
||||||
!> @details Sets the current reference stiffness to the stiffness given as an argument.
|
!> @details Sets the current reference stiffness to the stiffness given as an argument.
|
||||||
!> If the gamma operator is precalculated, it is calculated with this stiffness.
|
!> If the gamma operator is precalculated, it is calculated with this stiffness.
|
||||||
!> In case of an on-the-fly calculation, only the reference stiffness is updated.
|
!> In case of an on-the-fly calculation, only the reference stiffness is updated.
|
||||||
!> Also writes out the current reference stiffness for restart.
|
|
||||||
!---------------------------------------------------------------------------------------------------
|
!---------------------------------------------------------------------------------------------------
|
||||||
subroutine utilities_updateGamma(C,saveReference)
|
subroutine utilities_updateGamma(C)
|
||||||
|
|
||||||
real(pReal), intent(in), dimension(3,3,3,3) :: C !< input stiffness to store as reference stiffness
|
real(pReal), intent(in), dimension(3,3,3,3) :: C !< input stiffness to store as reference stiffness
|
||||||
logical , intent(in) :: saveReference !< save reference stiffness to file for restart
|
|
||||||
complex(pReal), dimension(3,3) :: temp33_complex, xiDyad_cmplx
|
complex(pReal), dimension(3,3) :: temp33_complex, xiDyad_cmplx
|
||||||
real(pReal), dimension(6,6) :: A, A_inv
|
real(pReal), dimension(6,6) :: A, A_inv
|
||||||
integer :: &
|
integer :: &
|
||||||
i, j, k, &
|
i, j, k, &
|
||||||
l, m, n, o, &
|
l, m, n, o
|
||||||
fileUnit
|
|
||||||
logical :: err
|
logical :: err
|
||||||
|
|
||||||
C_ref = C
|
C_ref = C
|
||||||
if (saveReference .and. worldrank == 0) then
|
|
||||||
write(6,'(/,a)') ' writing reference stiffness to file'
|
|
||||||
flush(6)
|
|
||||||
fileUnit = IO_open_jobFile_binary('C_ref','w')
|
|
||||||
write(fileUnit) C_ref; close(fileUnit)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if(.not. num%memory_efficient) then
|
if(.not. num%memory_efficient) then
|
||||||
gamma_hat = cmplx(0.0_pReal,0.0_pReal,pReal) ! for the singular point and any non invertible A
|
gamma_hat = cmplx(0.0_pReal,0.0_pReal,pReal) ! for the singular point and any non invertible A
|
||||||
|
@ -437,10 +426,12 @@ end subroutine utilities_updateGamma
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief forward FFT of data in field_real to field_fourier
|
!> @brief forward FFT of data in field_real to field_fourier
|
||||||
!> @details Does an unweighted filtered FFT transform from real to complex
|
!> @details Does an unweighted FFT transform from real to complex. Extra padding entries are set
|
||||||
|
! to 0.0
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine utilities_FFTtensorForward
|
subroutine utilities_FFTtensorForward
|
||||||
|
|
||||||
|
tensorField_real(1:3,1:3,grid(1)+1:grid1Red*2,:,:) = cmplx(0.0,0.0,pReal)
|
||||||
call fftw_mpi_execute_dft_r2c(planTensorForth,tensorField_real,tensorField_fourier)
|
call fftw_mpi_execute_dft_r2c(planTensorForth,tensorField_real,tensorField_fourier)
|
||||||
|
|
||||||
end subroutine utilities_FFTtensorForward
|
end subroutine utilities_FFTtensorForward
|
||||||
|
@ -459,10 +450,12 @@ end subroutine utilities_FFTtensorBackward
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief forward FFT of data in scalarField_real to scalarField_fourier
|
!> @brief forward FFT of data in scalarField_real to scalarField_fourier
|
||||||
!> @details Does an unweighted filtered FFT transform from real to complex
|
!> @details Does an unweighted FFT transform from real to complex. Extra padding entries are set
|
||||||
|
! to 0.0
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine utilities_FFTscalarForward
|
subroutine utilities_FFTscalarForward
|
||||||
|
|
||||||
|
scalarField_real(grid(1)+1:grid1Red*2,:,:) = cmplx(0.0,0.0,pReal)
|
||||||
call fftw_mpi_execute_dft_r2c(planScalarForth,scalarField_real,scalarField_fourier)
|
call fftw_mpi_execute_dft_r2c(planScalarForth,scalarField_real,scalarField_fourier)
|
||||||
|
|
||||||
end subroutine utilities_FFTscalarForward
|
end subroutine utilities_FFTscalarForward
|
||||||
|
@ -482,10 +475,12 @@ end subroutine utilities_FFTscalarBackward
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief forward FFT of data in field_real to field_fourier with highest freqs. removed
|
!> @brief forward FFT of data in field_real to field_fourier with highest freqs. removed
|
||||||
!> @details Does an unweighted filtered FFT transform from real to complex.
|
!> @details Does an unweighted FFT transform from real to complex. Extra padding entries are set
|
||||||
|
! to 0.0
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine utilities_FFTvectorForward
|
subroutine utilities_FFTvectorForward
|
||||||
|
|
||||||
|
vectorField_real(1:3,grid(1)+1:grid1Red*2,:,:) = cmplx(0.0,0.0,pReal)
|
||||||
call fftw_mpi_execute_dft_r2c(planVectorForth,vectorField_real,vectorField_fourier)
|
call fftw_mpi_execute_dft_r2c(planVectorForth,vectorField_real,vectorField_fourier)
|
||||||
|
|
||||||
end subroutine utilities_FFTvectorForward
|
end subroutine utilities_FFTvectorForward
|
||||||
|
@ -782,9 +777,9 @@ subroutine utilities_fourierScalarGradient()
|
||||||
|
|
||||||
integer :: i, j, k
|
integer :: i, j, k
|
||||||
|
|
||||||
vectorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal)
|
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red
|
||||||
forall(k = 1:grid3, j = 1:grid(2), i = 1:grid1Red) &
|
vectorField_fourier(1:3,i,j,k) = scalarField_fourier(i,j,k)*xi1st(1:3,i,j,k) ! ToDo: no -conjg?
|
||||||
vectorField_fourier(1:3,i,j,k) = scalarField_fourier(i,j,k)*xi1st(1:3,i,j,k)
|
enddo; enddo; enddo
|
||||||
|
|
||||||
end subroutine utilities_fourierScalarGradient
|
end subroutine utilities_fourierScalarGradient
|
||||||
|
|
||||||
|
@ -794,12 +789,11 @@ end subroutine utilities_fourierScalarGradient
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine utilities_fourierVectorDivergence()
|
subroutine utilities_fourierVectorDivergence()
|
||||||
|
|
||||||
integer :: i, j, k
|
integer :: i, j, k
|
||||||
|
|
||||||
scalarField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal)
|
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red
|
||||||
forall(k = 1:grid3, j = 1:grid(2), i = 1:grid1Red) &
|
scalarField_fourier(i,j,k) = sum(vectorField_fourier(1:3,i,j,k)*conjg(-xi1st(1:3,i,j,k)))
|
||||||
scalarField_fourier(i,j,k) = scalarField_fourier(i,j,k) &
|
enddo; enddo; enddo
|
||||||
+ sum(vectorField_fourier(1:3,i,j,k)*conjg(-xi1st(1:3,i,j,k)))
|
|
||||||
|
|
||||||
end subroutine utilities_fourierVectorDivergence
|
end subroutine utilities_fourierVectorDivergence
|
||||||
|
|
||||||
|
@ -811,7 +805,6 @@ subroutine utilities_fourierVectorGradient()
|
||||||
|
|
||||||
integer :: i, j, k, m, n
|
integer :: i, j, k, m, n
|
||||||
|
|
||||||
tensorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal)
|
|
||||||
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red
|
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red
|
||||||
do m = 1, 3; do n = 1, 3
|
do m = 1, 3; do n = 1, 3
|
||||||
tensorField_fourier(m,n,i,j,k) = vectorField_fourier(m,i,j,k)*xi1st(n,i,j,k)
|
tensorField_fourier(m,n,i,j,k) = vectorField_fourier(m,i,j,k)*xi1st(n,i,j,k)
|
||||||
|
@ -826,14 +819,10 @@ end subroutine utilities_fourierVectorGradient
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine utilities_fourierTensorDivergence()
|
subroutine utilities_fourierTensorDivergence()
|
||||||
|
|
||||||
integer :: i, j, k, m, n
|
integer :: i, j, k
|
||||||
|
|
||||||
vectorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal)
|
|
||||||
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red
|
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red
|
||||||
do m = 1, 3; do n = 1, 3
|
vectorField_fourier(:,i,j,k) = matmul(tensorField_fourier(:,:,i,j,k),conjg(-xi1st(:,i,j,k)))
|
||||||
vectorField_fourier(m,i,j,k) = vectorField_fourier(m,i,j,k) &
|
|
||||||
+ tensorField_fourier(m,n,i,j,k)*conjg(-xi1st(n,i,j,k))
|
|
||||||
enddo; enddo
|
|
||||||
enddo; enddo; enddo
|
enddo; enddo; enddo
|
||||||
|
|
||||||
end subroutine utilities_fourierTensorDivergence
|
end subroutine utilities_fourierTensorDivergence
|
||||||
|
@ -1037,7 +1026,7 @@ subroutine utilities_updateCoords(F)
|
||||||
ierr
|
ierr
|
||||||
integer, dimension(MPI_STATUS_SIZE) :: &
|
integer, dimension(MPI_STATUS_SIZE) :: &
|
||||||
s
|
s
|
||||||
real(pReal), dimension(3) :: step, offset_coords
|
real(pReal), dimension(3) :: step
|
||||||
real(pReal), dimension(3,3) :: Favg
|
real(pReal), dimension(3,3) :: Favg
|
||||||
integer, dimension(3) :: me
|
integer, dimension(3) :: me
|
||||||
integer, dimension(3,8) :: &
|
integer, dimension(3,8) :: &
|
||||||
|
@ -1054,18 +1043,19 @@ subroutine utilities_updateCoords(F)
|
||||||
step = geomSize/real(grid, pReal)
|
step = geomSize/real(grid, pReal)
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! integration in Fourier space to get fluctuations of cell center discplacements
|
! integration in Fourier space to get fluctuations of cell center discplacements
|
||||||
tensorField_real = 0.0_pReal
|
|
||||||
tensorField_real(1:3,1:3,1:grid(1),1:grid(2),1:grid3) = F
|
tensorField_real(1:3,1:3,1:grid(1),1:grid(2),1:grid3) = F
|
||||||
call utilities_FFTtensorForward()
|
call utilities_FFTtensorForward()
|
||||||
call utilities_fourierTensorDivergence()
|
|
||||||
|
|
||||||
do k = 1, grid3; do j = 1, grid(2); do i = 1, grid1Red
|
do k = 1, grid3; do j = 1, grid(2); do i = 1, grid1Red
|
||||||
if (any(cNeq(xi1st(1:3,i,j,k),cmplx(0.0,0.0,pReal)))) &
|
if(any([i,j,k+grid3Offset] /= 1)) then
|
||||||
vectorField_fourier(1:3,i,j,k) = vectorField_fourier(1:3,i,j,k) &
|
vectorField_fourier(1:3,i,j,k) = matmul(tensorField_fourier(1:3,1:3,i,j,k),xi2nd(1:3,i,j,k)) &
|
||||||
/ sum(conjg(-xi1st(1:3,i,j,k))*xi1st(1:3,i,j,k))
|
/ sum(conjg(-xi2nd(1:3,i,j,k))*xi2nd(1:3,i,j,k)) * wgt
|
||||||
|
else
|
||||||
|
vectorField_fourier(1:3,i,j,k) = cmplx(0.0,0.0,pReal)
|
||||||
|
endif
|
||||||
enddo; enddo; enddo
|
enddo; enddo; enddo
|
||||||
|
|
||||||
call fftw_mpi_execute_dft_c2r(planVectorBack,vectorField_fourier,vectorField_real)
|
call fftw_mpi_execute_dft_c2r(planVectorBack,vectorField_fourier,vectorField_real)
|
||||||
vectorField_real = vectorField_real * wgt
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! average F
|
! average F
|
||||||
|
@ -1073,14 +1063,6 @@ subroutine utilities_updateCoords(F)
|
||||||
call MPI_Bcast(Favg,9,MPI_DOUBLE,0,PETSC_COMM_WORLD,ierr)
|
call MPI_Bcast(Favg,9,MPI_DOUBLE,0,PETSC_COMM_WORLD,ierr)
|
||||||
if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Bcast')
|
if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Bcast')
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
! add average to fluctuation and put (0,0,0) on (0,0,0): MD: Needs improvement, edge should be on zero
|
|
||||||
step = geomSize/real(grid, pReal)
|
|
||||||
if (grid3Offset == 0) offset_coords = vectorField_real(1:3,1,1,1)
|
|
||||||
call MPI_Bcast(offset_coords,3,MPI_DOUBLE,0,PETSC_COMM_WORLD,ierr)
|
|
||||||
if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Bcast')
|
|
||||||
offset_coords = offset_coords - matmul(Favg,step/2.0_pReal)
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! pad cell center fluctuations along z-direction (needed when running MPI simulation)
|
! pad cell center fluctuations along z-direction (needed when running MPI simulation)
|
||||||
IPfluct_padded(1:3,1:grid(1),1:grid(2),2:grid3+1) = vectorField_real(1:3,1:grid(1),1:grid(2),1:grid3)
|
IPfluct_padded(1:3,1:grid(1),1:grid(2),2:grid3+1) = vectorField_real(1:3,1:grid(1),1:grid(2),1:grid3)
|
||||||
|
@ -1107,21 +1089,19 @@ subroutine utilities_updateCoords(F)
|
||||||
! calculate nodal displacements
|
! calculate nodal displacements
|
||||||
nodeCoords = 0.0_pReal
|
nodeCoords = 0.0_pReal
|
||||||
do k = 0,grid3; do j = 0,grid(2); do i = 0,grid(1)
|
do k = 0,grid3; do j = 0,grid(2); do i = 0,grid(1)
|
||||||
average: do n = 1,8
|
nodeCoords(1:3,i+1,j+1,k+1) = matmul(Favg,step*(real([i,j,k+grid3Offset],pReal)))
|
||||||
|
averageFluct: do n = 1,8
|
||||||
me = [i+neighbor(1,n),j+neighbor(2,n),k+neighbor(3,n)]
|
me = [i+neighbor(1,n),j+neighbor(2,n),k+neighbor(3,n)]
|
||||||
nodeCoords(1:3,i+1,j+1,k+1) = nodeCoords(1:3,i+1,j+1,k+1) &
|
nodeCoords(1:3,i+1,j+1,k+1) = nodeCoords(1:3,i+1,j+1,k+1) &
|
||||||
+ IPfluct_padded(1:3,modulo(me(1)-1,grid(1))+1,modulo(me(2)-1,grid(2))+1,me(3)+1) &
|
+ IPfluct_padded(1:3,modulo(me(1)-1,grid(1))+1,modulo(me(2)-1,grid(2))+1,me(3)+1)*0.125_pReal
|
||||||
+ matmul(Favg,step*(real([me(1),me(2),me(3)+grid3Offset],pReal)-0.5_pReal))
|
enddo averageFluct
|
||||||
enddo average
|
|
||||||
enddo; enddo; enddo
|
enddo; enddo; enddo
|
||||||
nodeCoords = nodeCoords/8.0_pReal
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! calculate cell center displacements
|
! calculate cell center displacements
|
||||||
do k = 1,grid3; do j = 1,grid(2); do i = 1,grid(1)
|
do k = 1,grid3; do j = 1,grid(2); do i = 1,grid(1)
|
||||||
IPcoords(1:3,i,j,k) = vectorField_real(1:3,i,j,k) &
|
IPcoords(1:3,i,j,k) = vectorField_real(1:3,i,j,k) &
|
||||||
+ matmul(Favg,step*real([i,j,k+grid3Offset]-1,pReal)) &
|
+ matmul(Favg,step*real([i,j,k+grid3Offset]-0.5_pReal,pReal))
|
||||||
- offset_coords
|
|
||||||
enddo; enddo; enddo
|
enddo; enddo; enddo
|
||||||
|
|
||||||
call discretization_setNodeCoords(reshape(NodeCoords,[3,(grid(1)+1)*(grid(2)+1)*(grid3+1)]))
|
call discretization_setNodeCoords(reshape(NodeCoords,[3,(grid(1)+1)*(grid(2)+1)*(grid3+1)]))
|
||||||
|
@ -1129,4 +1109,22 @@ subroutine utilities_updateCoords(F)
|
||||||
|
|
||||||
end subroutine utilities_updateCoords
|
end subroutine utilities_updateCoords
|
||||||
|
|
||||||
|
|
||||||
|
!---------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Write out the current reference stiffness for restart.
|
||||||
|
!---------------------------------------------------------------------------------------------------
|
||||||
|
subroutine utilities_saveReferenceStiffness
|
||||||
|
|
||||||
|
integer :: &
|
||||||
|
fileUnit
|
||||||
|
|
||||||
|
if (worldrank == 0) then
|
||||||
|
write(6,'(a)') ' writing reference stiffness data required for restart to file';flush(6)
|
||||||
|
fileUnit = IO_open_jobFile_binary('C_ref','w')
|
||||||
|
write(fileUnit) C_ref
|
||||||
|
close(fileUnit)
|
||||||
|
endif
|
||||||
|
|
||||||
|
end subroutine utilities_saveReferenceStiffness
|
||||||
|
|
||||||
end module spectral_utilities
|
end module spectral_utilities
|
||||||
|
|
268
src/lattice.f90
268
src/lattice.f90
|
@ -43,10 +43,10 @@ module lattice
|
||||||
LATTICE_FCC_NCLEAVAGESYSTEM = [3, 4] !< # of cleavage systems per family for fcc
|
LATTICE_FCC_NCLEAVAGESYSTEM = [3, 4] !< # of cleavage systems per family for fcc
|
||||||
|
|
||||||
integer, parameter :: &
|
integer, parameter :: &
|
||||||
LATTICE_FCC_NSLIP = sum(LATTICE_FCC_NSLIPSYSTEM), & !< total # of slip systems for fcc
|
LATTICE_FCC_NSLIP = sum(LATTICE_FCC_NSLIPSYSTEM), & !< total # of slip systems for fcc
|
||||||
LATTICE_FCC_NTWIN = sum(LATTICE_FCC_NTWINSYSTEM), & !< total # of twin systems for fcc
|
LATTICE_FCC_NTWIN = sum(LATTICE_FCC_NTWINSYSTEM), & !< total # of twin systems for fcc
|
||||||
LATTICE_FCC_NTRANS = sum(LATTICE_FCC_NTRANSSYSTEM), & !< total # of transformation systems for fcc
|
LATTICE_FCC_NTRANS = sum(LATTICE_FCC_NTRANSSYSTEM), & !< total # of transformation systems for fcc
|
||||||
LATTICE_FCC_NCLEAVAGE = sum(LATTICE_FCC_NCLEAVAGESYSTEM) !< total # of cleavage systems for fcc
|
LATTICE_FCC_NCLEAVAGE = sum(LATTICE_FCC_NCLEAVAGESYSTEM) !< total # of cleavage systems for fcc
|
||||||
|
|
||||||
real(pReal), dimension(3+3,LATTICE_FCC_NSLIP), parameter :: &
|
real(pReal), dimension(3+3,LATTICE_FCC_NSLIP), parameter :: &
|
||||||
LATTICE_FCC_SYSTEMSLIP = reshape(real([&
|
LATTICE_FCC_SYSTEMSLIP = reshape(real([&
|
||||||
|
@ -72,10 +72,6 @@ module lattice
|
||||||
0, 1,-1, 0, 1, 1 &
|
0, 1,-1, 0, 1, 1 &
|
||||||
],pReal),shape(LATTICE_FCC_SYSTEMSLIP)) !< Slip system <110>{111} directions. Sorted according to Eisenlohr & Hantcherli
|
],pReal),shape(LATTICE_FCC_SYSTEMSLIP)) !< Slip system <110>{111} directions. Sorted according to Eisenlohr & Hantcherli
|
||||||
|
|
||||||
character(len=*), dimension(2), parameter :: LATTICE_FCC_SLIPFAMILY_NAME = &
|
|
||||||
['<0 1 -1>{1 1 1}', &
|
|
||||||
'<0 1 -1>{0 1 1}']
|
|
||||||
|
|
||||||
real(pReal), dimension(3+3,LATTICE_FCC_NTWIN), parameter :: &
|
real(pReal), dimension(3+3,LATTICE_FCC_NTWIN), parameter :: &
|
||||||
LATTICE_FCC_SYSTEMTWIN = reshape(real( [&
|
LATTICE_FCC_SYSTEMTWIN = reshape(real( [&
|
||||||
-2, 1, 1, 1, 1, 1, &
|
-2, 1, 1, 1, 1, 1, &
|
||||||
|
@ -92,10 +88,6 @@ module lattice
|
||||||
-1, 1, 2, -1, 1,-1 &
|
-1, 1, 2, -1, 1,-1 &
|
||||||
],pReal),shape(LATTICE_FCC_SYSTEMTWIN)) !< Twin system <112>{111} directions. Sorted according to Eisenlohr & Hantcherli
|
],pReal),shape(LATTICE_FCC_SYSTEMTWIN)) !< Twin system <112>{111} directions. Sorted according to Eisenlohr & Hantcherli
|
||||||
|
|
||||||
character(len=*), dimension(1), parameter :: LATTICE_FCC_TWINFAMILY_NAME = &
|
|
||||||
['<-2 1 1>{1 1 1}']
|
|
||||||
|
|
||||||
|
|
||||||
integer, dimension(2,LATTICE_FCC_NTWIN), parameter, public :: &
|
integer, dimension(2,LATTICE_FCC_NTWIN), parameter, public :: &
|
||||||
LATTICE_FCC_TWINNUCLEATIONSLIPPAIR = reshape( [&
|
LATTICE_FCC_TWINNUCLEATIONSLIPPAIR = reshape( [&
|
||||||
2,3, &
|
2,3, &
|
||||||
|
@ -136,9 +128,9 @@ module lattice
|
||||||
LATTICE_BCC_NCLEAVAGESYSTEM = [3, 6] !< # of cleavage systems per family for bcc
|
LATTICE_BCC_NCLEAVAGESYSTEM = [3, 6] !< # of cleavage systems per family for bcc
|
||||||
|
|
||||||
integer, parameter :: &
|
integer, parameter :: &
|
||||||
LATTICE_BCC_NSLIP = sum(LATTICE_BCC_NSLIPSYSTEM), & !< total # of slip systems for bcc
|
LATTICE_BCC_NSLIP = sum(LATTICE_BCC_NSLIPSYSTEM), & !< total # of slip systems for bcc
|
||||||
LATTICE_BCC_NTWIN = sum(LATTICE_BCC_NTWINSYSTEM), & !< total # of twin systems for bcc
|
LATTICE_BCC_NTWIN = sum(LATTICE_BCC_NTWINSYSTEM), & !< total # of twin systems for bcc
|
||||||
LATTICE_BCC_NCLEAVAGE = sum(LATTICE_BCC_NCLEAVAGESYSTEM) !< total # of cleavage systems for bcc
|
LATTICE_BCC_NCLEAVAGE = sum(LATTICE_BCC_NCLEAVAGESYSTEM) !< total # of cleavage systems for bcc
|
||||||
|
|
||||||
real(pReal), dimension(3+3,LATTICE_BCC_NSLIP), parameter :: &
|
real(pReal), dimension(3+3,LATTICE_BCC_NSLIP), parameter :: &
|
||||||
LATTICE_BCC_SYSTEMSLIP = reshape(real([&
|
LATTICE_BCC_SYSTEMSLIP = reshape(real([&
|
||||||
|
@ -171,10 +163,6 @@ module lattice
|
||||||
1, 1, 1, 1, 1,-2 &
|
1, 1, 1, 1, 1,-2 &
|
||||||
],pReal),shape(LATTICE_BCC_SYSTEMSLIP))
|
],pReal),shape(LATTICE_BCC_SYSTEMSLIP))
|
||||||
|
|
||||||
character(len=*), dimension(2), parameter :: LATTICE_BCC_SLIPFAMILY_NAME = &
|
|
||||||
['<1 -1 1>{0 1 1}', &
|
|
||||||
'<1 -1 1>{2 1 1}']
|
|
||||||
|
|
||||||
real(pReal), dimension(3+3,LATTICE_BCC_NTWIN), parameter :: &
|
real(pReal), dimension(3+3,LATTICE_BCC_NTWIN), parameter :: &
|
||||||
LATTICE_BCC_SYSTEMTWIN = reshape(real([&
|
LATTICE_BCC_SYSTEMTWIN = reshape(real([&
|
||||||
! Twin system <111>{112}
|
! Twin system <111>{112}
|
||||||
|
@ -192,9 +180,6 @@ module lattice
|
||||||
1, 1, 1, 1, 1,-2 &
|
1, 1, 1, 1, 1,-2 &
|
||||||
],pReal),shape(LATTICE_BCC_SYSTEMTWIN))
|
],pReal),shape(LATTICE_BCC_SYSTEMTWIN))
|
||||||
|
|
||||||
character(len=*), dimension(1), parameter :: LATTICE_BCC_TWINFAMILY_NAME = &
|
|
||||||
['<1 1 1>{2 1 1}']
|
|
||||||
|
|
||||||
real(pReal), dimension(3+3,LATTICE_BCC_NCLEAVAGE), parameter :: &
|
real(pReal), dimension(3+3,LATTICE_BCC_NCLEAVAGE), parameter :: &
|
||||||
LATTICE_BCC_SYSTEMCLEAVAGE = reshape(real([&
|
LATTICE_BCC_SYSTEMCLEAVAGE = reshape(real([&
|
||||||
! Cleavage direction Plane normal
|
! Cleavage direction Plane normal
|
||||||
|
@ -221,9 +206,9 @@ module lattice
|
||||||
LATTICE_HEX_NCLEAVAGESYSTEM = [3] !< # of cleavage systems per family for hex
|
LATTICE_HEX_NCLEAVAGESYSTEM = [3] !< # of cleavage systems per family for hex
|
||||||
|
|
||||||
integer, parameter :: &
|
integer, parameter :: &
|
||||||
LATTICE_HEX_NSLIP = sum(LATTICE_HEX_NSLIPSYSTEM), & !< total # of slip systems for hex
|
LATTICE_HEX_NSLIP = sum(LATTICE_HEX_NSLIPSYSTEM), & !< total # of slip systems for hex
|
||||||
LATTICE_HEX_NTWIN = sum(LATTICE_HEX_NTWINSYSTEM), & !< total # of twin systems for hex
|
LATTICE_HEX_NTWIN = sum(LATTICE_HEX_NTWINSYSTEM), & !< total # of twin systems for hex
|
||||||
LATTICE_HEX_NCLEAVAGE = sum(LATTICE_HEX_NCLEAVAGESYSTEM) !< total # of cleavage systems for hex
|
LATTICE_HEX_NCLEAVAGE = sum(LATTICE_HEX_NCLEAVAGESYSTEM) !< total # of cleavage systems for hex
|
||||||
|
|
||||||
real(pReal), dimension(4+4,LATTICE_HEX_NSLIP), parameter :: &
|
real(pReal), dimension(4+4,LATTICE_HEX_NSLIP), parameter :: &
|
||||||
LATTICE_HEX_SYSTEMSLIP = reshape(real([&
|
LATTICE_HEX_SYSTEMSLIP = reshape(real([&
|
||||||
|
@ -269,14 +254,6 @@ module lattice
|
||||||
-2, 1, 1, 3, 2, -1, -1, 2 &
|
-2, 1, 1, 3, 2, -1, -1, 2 &
|
||||||
],pReal),shape(LATTICE_HEX_SYSTEMSLIP)) !< slip systems for hex, sorted by P. Eisenlohr CCW around <c> starting next to a_1 axis
|
],pReal),shape(LATTICE_HEX_SYSTEMSLIP)) !< slip systems for hex, sorted by P. Eisenlohr CCW around <c> starting next to a_1 axis
|
||||||
|
|
||||||
character(len=*), dimension(6), parameter :: LATTICE_HEX_SLIPFAMILY_NAME = &
|
|
||||||
['< 1 1 . 0>{ 0 0 . 1}', &
|
|
||||||
'< 1 1 . 0>{ 1 0 . 0}', &
|
|
||||||
'<-1 1 . 0>{ 1 1 . 0}', &
|
|
||||||
'< 1 1 . 0>{ 1 -1 . 1}', &
|
|
||||||
'< 1 1 . 3>{-1 0 . 1}', &
|
|
||||||
'< 1 1 . 3>{-1 -1 . 2}']
|
|
||||||
|
|
||||||
real(pReal), dimension(4+4,LATTICE_HEX_NTWIN), parameter :: &
|
real(pReal), dimension(4+4,LATTICE_HEX_NTWIN), parameter :: &
|
||||||
LATTICE_HEX_SYSTEMTWIN = reshape(real([&
|
LATTICE_HEX_SYSTEMTWIN = reshape(real([&
|
||||||
! Compression or Tension = f(twinning shear=f(c/a)) for each metal ! (according to Yoo 1981)
|
! Compression or Tension = f(twinning shear=f(c/a)) for each metal ! (according to Yoo 1981)
|
||||||
|
@ -309,12 +286,6 @@ module lattice
|
||||||
2, -1, -1, -3, 2, -1, -1, 2 &
|
2, -1, -1, -3, 2, -1, -1, 2 &
|
||||||
],pReal),shape(LATTICE_HEX_SYSTEMTWIN)) !< twin systems for hex, sorted by P. Eisenlohr CCW around <c> starting next to a_1 axis
|
],pReal),shape(LATTICE_HEX_SYSTEMTWIN)) !< twin systems for hex, sorted by P. Eisenlohr CCW around <c> starting next to a_1 axis
|
||||||
|
|
||||||
character(len=*), dimension(4), parameter :: LATTICE_HEX_TWINFAMILY_NAME = &
|
|
||||||
['<-1 0 . 1>{ 1 0 . 2}', &
|
|
||||||
'< 1 1 . 6>{-1 -1 . 1}', &
|
|
||||||
'< 1 0 . -2>{ 1 0 . 1}', &
|
|
||||||
'< 1 1 . -3>{ 1 1 . 2}']
|
|
||||||
|
|
||||||
real(pReal), dimension(4+4,LATTICE_HEX_NCLEAVAGE), parameter :: &
|
real(pReal), dimension(4+4,LATTICE_HEX_NCLEAVAGE), parameter :: &
|
||||||
LATTICE_HEX_SYSTEMCLEAVAGE = reshape(real([&
|
LATTICE_HEX_SYSTEMCLEAVAGE = reshape(real([&
|
||||||
! Cleavage direction Plane normal
|
! Cleavage direction Plane normal
|
||||||
|
@ -330,7 +301,7 @@ module lattice
|
||||||
LATTICE_BCT_NSLIPSYSTEM = [2, 2, 2, 4, 2, 4, 2, 2, 4, 8, 4, 8, 8 ] !< # of slip systems per family for bct (Sn) Bieler J. Electr Mater 2009
|
LATTICE_BCT_NSLIPSYSTEM = [2, 2, 2, 4, 2, 4, 2, 2, 4, 8, 4, 8, 8 ] !< # of slip systems per family for bct (Sn) Bieler J. Electr Mater 2009
|
||||||
|
|
||||||
integer, parameter :: &
|
integer, parameter :: &
|
||||||
LATTICE_BCT_NSLIP = sum(LATTICE_BCT_NSLIPSYSTEM) !< total # of slip systems for bct
|
LATTICE_BCT_NSLIP = sum(LATTICE_BCT_NSLIPSYSTEM) !< total # of slip systems for bct
|
||||||
|
|
||||||
real(pReal), dimension(3+3,LATTICE_BCT_NSLIP), parameter :: &
|
real(pReal), dimension(3+3,LATTICE_BCT_NSLIP), parameter :: &
|
||||||
LATTICE_BCT_SYSTEMSLIP = reshape(real([&
|
LATTICE_BCT_SYSTEMSLIP = reshape(real([&
|
||||||
|
@ -402,29 +373,13 @@ module lattice
|
||||||
1, 1, 1, 1,-2, 1 &
|
1, 1, 1, 1,-2, 1 &
|
||||||
],pReal),[ 3 + 3,LATTICE_BCT_NSLIP]) !< slip systems for bct sorted by Bieler
|
],pReal),[ 3 + 3,LATTICE_BCT_NSLIP]) !< slip systems for bct sorted by Bieler
|
||||||
|
|
||||||
character(len=*), dimension(13), parameter :: LATTICE_BCT_SLIPFAMILY_NAME = &
|
|
||||||
['{1 0 0)<0 0 1] ', &
|
|
||||||
'{1 1 0)<0 0 1] ', &
|
|
||||||
'{1 0 0)<0 1 0] ', &
|
|
||||||
'{1 1 0)<1 -1 1]', &
|
|
||||||
'{1 1 0)<1 -1 0]', &
|
|
||||||
'{1 0 0)<0 1 1] ', &
|
|
||||||
'{0 0 1)<0 1 0] ', &
|
|
||||||
'{0 0 1)<1 1 0] ', &
|
|
||||||
'{0 1 1)<0 1 -1]', &
|
|
||||||
'{0 1 1)<1 -1 1]', &
|
|
||||||
'{0 1 1)<1 0 0] ', &
|
|
||||||
'{2 1 1)<0 1 -1]', &
|
|
||||||
'{2 1 1)<-1 1 1]']
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! isotropic
|
! isotropic
|
||||||
integer, dimension(1), parameter :: &
|
integer, dimension(1), parameter :: &
|
||||||
LATTICE_ISO_NCLEAVAGESYSTEM = [3] !< # of cleavage systems per family for iso
|
LATTICE_ISO_NCLEAVAGESYSTEM = [3] !< # of cleavage systems per family for iso
|
||||||
|
|
||||||
integer, parameter :: &
|
integer, parameter :: &
|
||||||
LATTICE_ISO_NCLEAVAGE = sum(LATTICE_ISO_NCLEAVAGESYSTEM) !< total # of cleavage systems for iso
|
LATTICE_ISO_NCLEAVAGE = sum(LATTICE_ISO_NCLEAVAGESYSTEM) !< total # of cleavage systems for iso
|
||||||
|
|
||||||
real(pReal), dimension(3+3,LATTICE_ISO_NCLEAVAGE), parameter :: &
|
real(pReal), dimension(3+3,LATTICE_ISO_NCLEAVAGE), parameter :: &
|
||||||
LATTICE_ISO_SYSTEMCLEAVAGE= reshape(real([&
|
LATTICE_ISO_SYSTEMCLEAVAGE= reshape(real([&
|
||||||
|
@ -441,7 +396,7 @@ module lattice
|
||||||
LATTICE_ORT_NCLEAVAGESYSTEM = [1, 1, 1] !< # of cleavage systems per family for ortho
|
LATTICE_ORT_NCLEAVAGESYSTEM = [1, 1, 1] !< # of cleavage systems per family for ortho
|
||||||
|
|
||||||
integer, parameter :: &
|
integer, parameter :: &
|
||||||
LATTICE_ORT_NCLEAVAGE = sum(LATTICE_ORT_NCLEAVAGESYSTEM) !< total # of cleavage systems for ortho
|
LATTICE_ORT_NCLEAVAGE = sum(LATTICE_ORT_NCLEAVAGESYSTEM) !< total # of cleavage systems for ortho
|
||||||
|
|
||||||
real(pReal), dimension(3+3,LATTICE_ORT_NCLEAVAGE), parameter :: &
|
real(pReal), dimension(3+3,LATTICE_ORT_NCLEAVAGE), parameter :: &
|
||||||
LATTICE_ORT_SYSTEMCLEAVAGE = reshape(real([&
|
LATTICE_ORT_SYSTEMCLEAVAGE = reshape(real([&
|
||||||
|
@ -468,7 +423,7 @@ module lattice
|
||||||
lattice_mu, lattice_nu
|
lattice_mu, lattice_nu
|
||||||
|
|
||||||
! SHOULD NOT BE PART OF LATTICE BEGIN
|
! SHOULD NOT BE PART OF LATTICE BEGIN
|
||||||
real(pReal), dimension(:,:,:,:), allocatable, public, protected :: & ! with higher-order parameters (e.g. temperature-dependent)
|
real(pReal), dimension(:,:,:,:), allocatable, public, protected :: & ! with higher-order parameters (e.g. temperature-dependent)
|
||||||
lattice_thermalExpansion33
|
lattice_thermalExpansion33
|
||||||
real(pReal), dimension(:,:,:), allocatable, public, protected :: &
|
real(pReal), dimension(:,:,:), allocatable, public, protected :: &
|
||||||
lattice_thermalConductivity33, &
|
lattice_thermalConductivity33, &
|
||||||
|
@ -527,7 +482,8 @@ module lattice
|
||||||
lattice_forestProjection_screw, &
|
lattice_forestProjection_screw, &
|
||||||
lattice_slip_normal, &
|
lattice_slip_normal, &
|
||||||
lattice_slip_direction, &
|
lattice_slip_direction, &
|
||||||
lattice_slip_transverse
|
lattice_slip_transverse, &
|
||||||
|
lattice_labels_slip
|
||||||
|
|
||||||
contains
|
contains
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -597,7 +553,7 @@ subroutine lattice_init
|
||||||
lattice_C66(6,6,p) = config_phase(p)%getFloat('c66',defaultVal=0.0_pReal)
|
lattice_C66(6,6,p) = config_phase(p)%getFloat('c66',defaultVal=0.0_pReal)
|
||||||
|
|
||||||
|
|
||||||
CoverA(p) = config_phase(p)%getFloat('c/a',defaultVal=0.0_pReal)
|
CoverA(p) = config_phase(p)%getFloat('c/a',defaultVal=0.0_pReal)
|
||||||
|
|
||||||
lattice_thermalConductivity33(1,1,p) = config_phase(p)%getFloat('thermal_conductivity11',defaultVal=0.0_pReal)
|
lattice_thermalConductivity33(1,1,p) = config_phase(p)%getFloat('thermal_conductivity11',defaultVal=0.0_pReal)
|
||||||
lattice_thermalConductivity33(2,2,p) = config_phase(p)%getFloat('thermal_conductivity22',defaultVal=0.0_pReal)
|
lattice_thermalConductivity33(2,2,p) = config_phase(p)%getFloat('thermal_conductivity22',defaultVal=0.0_pReal)
|
||||||
|
@ -841,9 +797,9 @@ function lattice_characteristicShear_Twin(Ntwin,structure,CoverA) result(charact
|
||||||
|
|
||||||
integer :: &
|
integer :: &
|
||||||
a, & !< index of active system
|
a, & !< index of active system
|
||||||
c, & !< index in complete system list
|
p, & !< index in potential system list
|
||||||
mf, & !< index of my family
|
f, & !< index of my family
|
||||||
ms !< index of my system in current family
|
s !< index of my system in current family
|
||||||
|
|
||||||
integer, dimension(LATTICE_HEX_NTWIN), parameter :: &
|
integer, dimension(LATTICE_HEX_NTWIN), parameter :: &
|
||||||
HEX_SHEARTWIN = reshape( [&
|
HEX_SHEARTWIN = reshape( [&
|
||||||
|
@ -877,8 +833,8 @@ function lattice_characteristicShear_Twin(Ntwin,structure,CoverA) result(charact
|
||||||
call IO_error(137,ext_msg='lattice_characteristicShear_Twin: '//trim(structure))
|
call IO_error(137,ext_msg='lattice_characteristicShear_Twin: '//trim(structure))
|
||||||
|
|
||||||
a = 0
|
a = 0
|
||||||
myFamilies: do mf = 1,size(Ntwin,1)
|
myFamilies: do f = 1,size(Ntwin,1)
|
||||||
mySystems: do ms = 1,Ntwin(mf)
|
mySystems: do s = 1,Ntwin(f)
|
||||||
a = a + 1
|
a = a + 1
|
||||||
select case(structure(1:3))
|
select case(structure(1:3))
|
||||||
case('fcc','bcc')
|
case('fcc','bcc')
|
||||||
|
@ -886,8 +842,8 @@ function lattice_characteristicShear_Twin(Ntwin,structure,CoverA) result(charact
|
||||||
case('hex')
|
case('hex')
|
||||||
if (cOverA < 1.0_pReal .or. cOverA > 2.0_pReal) &
|
if (cOverA < 1.0_pReal .or. cOverA > 2.0_pReal) &
|
||||||
call IO_error(131,ext_msg='lattice_characteristicShear_Twin')
|
call IO_error(131,ext_msg='lattice_characteristicShear_Twin')
|
||||||
c = sum(LATTICE_HEX_NTWINSYSTEM(1:mf-1))+ms
|
p = sum(LATTICE_HEX_NTWINSYSTEM(1:f-1))+s
|
||||||
select case(HEX_SHEARTWIN(c)) ! from Christian & Mahajan 1995 p.29
|
select case(HEX_SHEARTWIN(p)) ! from Christian & Mahajan 1995 p.29
|
||||||
case (1) ! <-10.1>{10.2}
|
case (1) ! <-10.1>{10.2}
|
||||||
characteristicShear(a) = (3.0_pReal-cOverA**2.0_pReal)/sqrt(3.0_pReal)/CoverA
|
characteristicShear(a) = (3.0_pReal-cOverA**2.0_pReal)/sqrt(3.0_pReal)/CoverA
|
||||||
case (2) ! <11.6>{-1-1.1}
|
case (2) ! <11.6>{-1-1.1}
|
||||||
|
@ -1808,8 +1764,8 @@ function lattice_SchmidMatrix_trans(Ntrans,structure_target,cOverA,a_bcc,a_fcc)
|
||||||
real(pReal), intent(in) :: cOverA !< c/a ratio
|
real(pReal), intent(in) :: cOverA !< c/a ratio
|
||||||
real(pReal), dimension(3,3,sum(Ntrans)) :: SchmidMatrix
|
real(pReal), dimension(3,3,sum(Ntrans)) :: SchmidMatrix
|
||||||
|
|
||||||
real(pReal), dimension(3,3,sum(Ntrans)):: devNull
|
real(pReal), dimension(3,3,sum(Ntrans)) :: devNull
|
||||||
real(pReal) :: a_bcc, a_fcc
|
real(pReal) :: a_bcc, a_fcc
|
||||||
|
|
||||||
if (len_trim(structure_target) /= 3) &
|
if (len_trim(structure_target) /= 3) &
|
||||||
call IO_error(137,ext_msg='lattice_SchmidMatrix_trans: '//trim(structure_target))
|
call IO_error(137,ext_msg='lattice_SchmidMatrix_trans: '//trim(structure_target))
|
||||||
|
@ -1960,6 +1916,91 @@ function slipProjection_transverse(Nslip,structure,cOverA) result(projection)
|
||||||
end function slipProjection_transverse
|
end function slipProjection_transverse
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Labels for slip systems
|
||||||
|
!> details only active slip systems are considered
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
function lattice_labels_slip(Nslip,structure) result(labels)
|
||||||
|
|
||||||
|
integer, dimension(:), intent(in) :: Nslip !< number of active slip systems per family
|
||||||
|
character(len=*), intent(in) :: structure !< lattice structure
|
||||||
|
|
||||||
|
character(len=:), dimension(:), allocatable :: labels
|
||||||
|
|
||||||
|
real(pReal), dimension(:,:), allocatable :: slipSystems
|
||||||
|
integer, dimension(:), allocatable :: NslipMax
|
||||||
|
|
||||||
|
if (len_trim(structure) /= 3) &
|
||||||
|
call IO_error(137,ext_msg='lattice_labels_slip: '//trim(structure))
|
||||||
|
|
||||||
|
select case(structure(1:3))
|
||||||
|
case('fcc')
|
||||||
|
NslipMax = LATTICE_FCC_NSLIPSYSTEM
|
||||||
|
slipSystems = LATTICE_FCC_SYSTEMSLIP
|
||||||
|
case('bcc')
|
||||||
|
NslipMax = LATTICE_BCC_NSLIPSYSTEM
|
||||||
|
slipSystems = LATTICE_BCC_SYSTEMSLIP
|
||||||
|
case('hex')
|
||||||
|
NslipMax = LATTICE_HEX_NSLIPSYSTEM
|
||||||
|
slipSystems = LATTICE_HEX_SYSTEMSLIP
|
||||||
|
case('bct')
|
||||||
|
NslipMax = LATTICE_BCT_NSLIPSYSTEM
|
||||||
|
slipSystems = LATTICE_BCT_SYSTEMSLIP
|
||||||
|
case default
|
||||||
|
call IO_error(137,ext_msg='lattice_labels_slip: '//trim(structure))
|
||||||
|
end select
|
||||||
|
|
||||||
|
if (any(NslipMax(1:size(Nslip)) - Nslip < 0)) &
|
||||||
|
call IO_error(145,ext_msg='Nslip '//trim(structure))
|
||||||
|
if (any(Nslip < 0)) &
|
||||||
|
call IO_error(144,ext_msg='Nslip '//trim(structure))
|
||||||
|
|
||||||
|
labels = getLabels(Nslip,NslipMax,slipSystems,structure)
|
||||||
|
|
||||||
|
end function lattice_labels_slip
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Labels for twin systems
|
||||||
|
!> details only active twin systems are considered
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
function lattice_labels_twin(Ntwin,structure) result(labels)
|
||||||
|
|
||||||
|
integer, dimension(:), intent(in) :: Ntwin !< number of active slip systems per family
|
||||||
|
character(len=*), intent(in) :: structure !< lattice structure
|
||||||
|
|
||||||
|
character(len=:), dimension(:), allocatable :: labels
|
||||||
|
|
||||||
|
real(pReal), dimension(:,:), allocatable :: twinSystems
|
||||||
|
integer, dimension(:), allocatable :: NtwinMax
|
||||||
|
|
||||||
|
if (len_trim(structure) /= 3) &
|
||||||
|
call IO_error(137,ext_msg='lattice_labels_twin: '//trim(structure))
|
||||||
|
|
||||||
|
select case(structure(1:3))
|
||||||
|
case('fcc')
|
||||||
|
NtwinMax = LATTICE_FCC_NTWINSYSTEM
|
||||||
|
twinSystems = LATTICE_FCC_SYSTEMTWIN
|
||||||
|
case('bcc')
|
||||||
|
NtwinMax = LATTICE_BCC_NTWINSYSTEM
|
||||||
|
twinSystems = LATTICE_BCC_SYSTEMTWIN
|
||||||
|
case('hex')
|
||||||
|
NtwinMax = LATTICE_HEX_NTWINSYSTEM
|
||||||
|
twinSystems = LATTICE_HEX_SYSTEMTWIN
|
||||||
|
case default
|
||||||
|
call IO_error(137,ext_msg='lattice_labels_twin: '//trim(structure))
|
||||||
|
end select
|
||||||
|
|
||||||
|
if (any(NtwinMax(1:size(Ntwin)) - Ntwin < 0)) &
|
||||||
|
call IO_error(145,ext_msg='Ntwin '//trim(structure))
|
||||||
|
if (any(Ntwin < 0)) &
|
||||||
|
call IO_error(144,ext_msg='Ntwin '//trim(structure))
|
||||||
|
|
||||||
|
labels = getLabels(Ntwin,NtwinMax,twinSystems,structure)
|
||||||
|
|
||||||
|
end function lattice_labels_twin
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief Projection of the slip direction onto the slip plane
|
!> @brief Projection of the slip direction onto the slip plane
|
||||||
!> @details: This projection is used to calculate forest hardening for screw dislocations
|
!> @details: This projection is used to calculate forest hardening for screw dislocations
|
||||||
|
@ -2075,11 +2116,11 @@ end function buildInteraction
|
||||||
!> @brief build a local coordinate system on slip, twin, trans, cleavage systems
|
!> @brief build a local coordinate system on slip, twin, trans, cleavage systems
|
||||||
!> @details Order: Direction, plane (normal), and common perpendicular
|
!> @details Order: Direction, plane (normal), and common perpendicular
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
function buildCoordinateSystem(active,complete,system,structure,cOverA)
|
function buildCoordinateSystem(active,potential,system,structure,cOverA)
|
||||||
|
|
||||||
integer, dimension(:), intent(in) :: &
|
integer, dimension(:), intent(in) :: &
|
||||||
active, &
|
active, &
|
||||||
complete
|
potential
|
||||||
real(pReal), dimension(:,:), intent(in) :: &
|
real(pReal), dimension(:,:), intent(in) :: &
|
||||||
system
|
system
|
||||||
character(len=*), intent(in) :: &
|
character(len=*), intent(in) :: &
|
||||||
|
@ -2093,7 +2134,7 @@ function buildCoordinateSystem(active,complete,system,structure,cOverA)
|
||||||
direction, normal
|
direction, normal
|
||||||
integer :: &
|
integer :: &
|
||||||
a, & !< index of active system
|
a, & !< index of active system
|
||||||
c, & !< index in complete system matrix
|
p, & !< index in potential system matrix
|
||||||
f, & !< index of my family
|
f, & !< index of my family
|
||||||
s !< index of my system in current family
|
s !< index of my system in current family
|
||||||
|
|
||||||
|
@ -2108,21 +2149,21 @@ function buildCoordinateSystem(active,complete,system,structure,cOverA)
|
||||||
activeFamilies: do f = 1,size(active,1)
|
activeFamilies: do f = 1,size(active,1)
|
||||||
activeSystems: do s = 1,active(f)
|
activeSystems: do s = 1,active(f)
|
||||||
a = a + 1
|
a = a + 1
|
||||||
c = sum(complete(1:f-1))+s
|
p = sum(potential(1:f-1))+s
|
||||||
|
|
||||||
select case(trim(structure(1:3)))
|
select case(trim(structure(1:3)))
|
||||||
|
|
||||||
case ('fcc','bcc','iso','ort','bct')
|
case ('fcc','bcc','iso','ort','bct')
|
||||||
direction = system(1:3,c)
|
direction = system(1:3,p)
|
||||||
normal = system(4:6,c)
|
normal = system(4:6,p)
|
||||||
|
|
||||||
case ('hex')
|
case ('hex')
|
||||||
direction = [ system(1,c)*1.5_pReal, &
|
direction = [ system(1,p)*1.5_pReal, &
|
||||||
(system(1,c)+2.0_pReal*system(2,c))*sqrt(0.75_pReal), &
|
(system(1,p)+2.0_pReal*system(2,p))*sqrt(0.75_pReal), &
|
||||||
system(4,c)*cOverA ] ! direction [uvtw]->[3u/2 (u+2v)*sqrt(3)/2 w*(c/a)])
|
system(4,p)*cOverA ] ! direction [uvtw]->[3u/2 (u+2v)*sqrt(3)/2 w*(p/a)])
|
||||||
normal = [ system(5,c), &
|
normal = [ system(5,p), &
|
||||||
(system(5,c)+2.0_pReal*system(6,c))/sqrt(3.0_pReal), &
|
(system(5,p)+2.0_pReal*system(6,p))/sqrt(3.0_pReal), &
|
||||||
system(8,c)/cOverA ] ! plane (hkil)->(h (h+2k)/sqrt(3) l/(c/a))
|
system(8,p)/cOverA ] ! plane (hkil)->(h (h+2k)/sqrt(3) l/(p/a))
|
||||||
|
|
||||||
case default
|
case default
|
||||||
call IO_error(137,ext_msg='buildCoordinateSystem: '//trim(structure))
|
call IO_error(137,ext_msg='buildCoordinateSystem: '//trim(structure))
|
||||||
|
@ -2130,9 +2171,9 @@ function buildCoordinateSystem(active,complete,system,structure,cOverA)
|
||||||
end select
|
end select
|
||||||
|
|
||||||
buildCoordinateSystem(1:3,1,a) = direction/norm2(direction)
|
buildCoordinateSystem(1:3,1,a) = direction/norm2(direction)
|
||||||
buildCoordinateSystem(1:3,2,a) = normal/norm2(normal)
|
buildCoordinateSystem(1:3,2,a) = normal /norm2(normal)
|
||||||
buildCoordinateSystem(1:3,3,a) = math_cross(buildCoordinateSystem(1:3,1,a),&
|
buildCoordinateSystem(1:3,3,a) = math_cross(direction/norm2(direction),&
|
||||||
buildCoordinateSystem(1:3,2,a))
|
normal /norm2(normal))
|
||||||
|
|
||||||
enddo activeSystems
|
enddo activeSystems
|
||||||
enddo activeFamilies
|
enddo activeFamilies
|
||||||
|
@ -2266,4 +2307,61 @@ subroutine buildTransformationSystem(Q,S,Ntrans,cOverA,a_fcc,a_bcc)
|
||||||
|
|
||||||
end subroutine buildTransformationSystem
|
end subroutine buildTransformationSystem
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief select active systems as strings
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
function getlabels(active,potential,system,structure) result(labels)
|
||||||
|
|
||||||
|
integer, dimension(:), intent(in) :: &
|
||||||
|
active, &
|
||||||
|
potential
|
||||||
|
real(pReal), dimension(:,:), intent(in) :: &
|
||||||
|
system
|
||||||
|
character(len=*), intent(in) :: structure !< lattice structure
|
||||||
|
|
||||||
|
character(len=:), dimension(:), allocatable :: labels
|
||||||
|
character(len=:), allocatable :: label
|
||||||
|
|
||||||
|
integer :: i,j
|
||||||
|
integer :: &
|
||||||
|
a, & !< index of active system
|
||||||
|
p, & !< index in potential system matrix
|
||||||
|
f, & !< index of my family
|
||||||
|
s !< index of my system in current family
|
||||||
|
|
||||||
|
i = 2*size(system,1) + (size(system,1) - 2) + 4 ! 2 letters per index + spaces + brackets
|
||||||
|
allocate(character(len=i) :: labels(sum(active)), label)
|
||||||
|
|
||||||
|
a = 0
|
||||||
|
activeFamilies: do f = 1,size(active,1)
|
||||||
|
activeSystems: do s = 1,active(f)
|
||||||
|
a = a + 1
|
||||||
|
p = sum(potential(1:f-1))+s
|
||||||
|
|
||||||
|
i = 1
|
||||||
|
label(i:i) = merge('[','<',structure(1:3) /= 'bct')
|
||||||
|
direction: do j = 1, size(system,1)/2
|
||||||
|
write(label(i+1:i+2),"(I2.1)") int(system(j,p))
|
||||||
|
label(i+3:i+3) = ' '
|
||||||
|
i = i + 3
|
||||||
|
enddo direction
|
||||||
|
label(i:i) = ']'
|
||||||
|
i = i +1
|
||||||
|
label(i:i) = merge('(','{',structure(1:3) /= 'bct')
|
||||||
|
normal: do j = size(system,1)/2+1, size(system,1)
|
||||||
|
write(label(i+1:i+2),"(I2.1)") int(system(j,p))
|
||||||
|
label(i+3:i+3) = ' '
|
||||||
|
i = i + 3
|
||||||
|
enddo normal
|
||||||
|
label(i:i) = ')'
|
||||||
|
|
||||||
|
labels(s) = label
|
||||||
|
|
||||||
|
enddo activeSystems
|
||||||
|
enddo activeFamilies
|
||||||
|
|
||||||
|
end function getlabels
|
||||||
|
|
||||||
|
|
||||||
end module lattice
|
end module lattice
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
|
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
|
||||||
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
|
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
|
||||||
!> @brief Driver controlling inner and outer load case looping of the FEM solver
|
!> @brief Driver controlling inner and outer load case looping of the FEM solver
|
||||||
!> @details doing cutbacking, forwarding in case of restart, reporting statistics, writing
|
!> @details doing cutbacking, reporting statistics, writing
|
||||||
!> results
|
!> results
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
program DAMASK_FEM
|
program DAMASK_FEM
|
||||||
|
@ -53,12 +53,9 @@ program DAMASK_FEM
|
||||||
currentFace = 0, &
|
currentFace = 0, &
|
||||||
inc, & !< current increment in current load case
|
inc, & !< current increment in current load case
|
||||||
totalIncsCounter = 0, & !< total # of increments
|
totalIncsCounter = 0, & !< total # of increments
|
||||||
convergedCounter = 0, & !< # of converged increments
|
|
||||||
notConvergedCounter = 0, & !< # of non-converged increments
|
|
||||||
fileUnit = 0, & !< file unit for reading load case and writing results
|
fileUnit = 0, & !< file unit for reading load case and writing results
|
||||||
myStat, &
|
myStat, &
|
||||||
statUnit = 0, & !< file unit for statistics output
|
statUnit = 0, & !< file unit for statistics output
|
||||||
lastRestartWritten = 0, & !< total increment No. at which last restart information was written
|
|
||||||
stagIter, &
|
stagIter, &
|
||||||
component
|
component
|
||||||
character(len=6) :: loadcase_string
|
character(len=6) :: loadcase_string
|
||||||
|
@ -164,9 +161,6 @@ program DAMASK_FEM
|
||||||
loadCases(currentLoadCase)%logscale = 1
|
loadCases(currentLoadCase)%logscale = 1
|
||||||
case('freq','frequency','outputfreq') ! frequency of result writings
|
case('freq','frequency','outputfreq') ! frequency of result writings
|
||||||
loadCases(currentLoadCase)%outputfrequency = IO_intValue(line,chunkPos,i+1)
|
loadCases(currentLoadCase)%outputfrequency = IO_intValue(line,chunkPos,i+1)
|
||||||
case('r','restart','restartwrite') ! frequency of writing restart information
|
|
||||||
loadCases(currentLoadCase)%restartfrequency = &
|
|
||||||
max(0,IO_intValue(line,chunkPos,i+1))
|
|
||||||
case('guessreset','dropguessing')
|
case('guessreset','dropguessing')
|
||||||
loadCases(currentLoadCase)%followFormerTrajectory = .false. ! do not continue to predict deformation along former trajectory
|
loadCases(currentLoadCase)%followFormerTrajectory = .false. ! do not continue to predict deformation along former trajectory
|
||||||
|
|
||||||
|
@ -246,8 +240,6 @@ program DAMASK_FEM
|
||||||
if (loadCases(currentLoadCase)%outputfrequency < 1) errorID = 836 ! non-positive result frequency
|
if (loadCases(currentLoadCase)%outputfrequency < 1) errorID = 836 ! non-positive result frequency
|
||||||
write(6,'(2x,a,i5)') 'output frequency: ', &
|
write(6,'(2x,a,i5)') 'output frequency: ', &
|
||||||
loadCases(currentLoadCase)%outputfrequency
|
loadCases(currentLoadCase)%outputfrequency
|
||||||
write(6,'(2x,a,i5,/)') 'restart frequency: ', &
|
|
||||||
loadCases(currentLoadCase)%restartfrequency
|
|
||||||
if (errorID > 0) call IO_error(error_ID = errorID, ext_msg = loadcase_string) ! exit with error message
|
if (errorID > 0) call IO_error(error_ID = errorID, ext_msg = loadcase_string) ! exit with error message
|
||||||
enddo checkLoadcases
|
enddo checkLoadcases
|
||||||
|
|
||||||
|
@ -293,117 +285,106 @@ program DAMASK_FEM
|
||||||
endif
|
endif
|
||||||
timeinc = timeinc * real(subStepFactor,pReal)**real(-cutBackLevel,pReal) ! depending on cut back level, decrease time step
|
timeinc = timeinc * real(subStepFactor,pReal)**real(-cutBackLevel,pReal) ! depending on cut back level, decrease time step
|
||||||
|
|
||||||
skipping: if (totalIncsCounter <= interface_restartInc) then ! not yet at restart inc?
|
|
||||||
time = time + timeinc ! just advance time, skip already performed calculation
|
|
||||||
guess = .true.
|
|
||||||
else skipping
|
|
||||||
stepFraction = 0 ! fraction scaled by stepFactor**cutLevel
|
|
||||||
|
|
||||||
subStepLooping: do while (stepFraction < subStepFactor**cutBackLevel)
|
stepFraction = 0 ! fraction scaled by stepFactor**cutLevel
|
||||||
remainingLoadCaseTime = loadCases(currentLoadCase)%time+time0 - time
|
|
||||||
time = time + timeinc ! forward target time
|
subStepLooping: do while (stepFraction < subStepFactor**cutBackLevel)
|
||||||
stepFraction = stepFraction + 1 ! count step
|
remainingLoadCaseTime = loadCases(currentLoadCase)%time+time0 - time
|
||||||
|
time = time + timeinc ! forward target time
|
||||||
|
stepFraction = stepFraction + 1 ! count step
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! report begin of new step
|
! report begin of new step
|
||||||
write(6,'(/,a)') ' ###########################################################################'
|
write(6,'(/,a)') ' ###########################################################################'
|
||||||
write(6,'(1x,a,es12.5'//&
|
write(6,'(1x,a,es12.5'//&
|
||||||
',a,'//IO_intOut(inc)//',a,'//IO_intOut(loadCases(currentLoadCase)%incs)//&
|
',a,'//IO_intOut(inc)//',a,'//IO_intOut(loadCases(currentLoadCase)%incs)//&
|
||||||
',a,'//IO_intOut(stepFraction)//',a,'//IO_intOut(subStepFactor**cutBackLevel)//&
|
',a,'//IO_intOut(stepFraction)//',a,'//IO_intOut(subStepFactor**cutBackLevel)//&
|
||||||
',a,'//IO_intOut(currentLoadCase)//',a,'//IO_intOut(size(loadCases))//')') &
|
',a,'//IO_intOut(currentLoadCase)//',a,'//IO_intOut(size(loadCases))//')') &
|
||||||
'Time', time, &
|
'Time', time, &
|
||||||
's: Increment ', inc, '/', loadCases(currentLoadCase)%incs,&
|
's: Increment ', inc, '/', loadCases(currentLoadCase)%incs,&
|
||||||
'-', stepFraction, '/', subStepFactor**cutBackLevel,&
|
'-', stepFraction, '/', subStepFactor**cutBackLevel,&
|
||||||
' of load case ', currentLoadCase,'/',size(loadCases)
|
' of load case ', currentLoadCase,'/',size(loadCases)
|
||||||
write(incInfo,&
|
write(incInfo,&
|
||||||
'(a,'//IO_intOut(totalIncsCounter)//&
|
'(a,'//IO_intOut(totalIncsCounter)//&
|
||||||
',a,'//IO_intOut(sum(loadCases%incs))//&
|
',a,'//IO_intOut(sum(loadCases%incs))//&
|
||||||
',a,'//IO_intOut(stepFraction)//&
|
',a,'//IO_intOut(stepFraction)//&
|
||||||
',a,'//IO_intOut(subStepFactor**cutBackLevel)//')') &
|
',a,'//IO_intOut(subStepFactor**cutBackLevel)//')') &
|
||||||
'Increment ',totalIncsCounter,'/',sum(loadCases%incs),&
|
'Increment ',totalIncsCounter,'/',sum(loadCases%incs),&
|
||||||
'-',stepFraction, '/', subStepFactor**cutBackLevel
|
'-',stepFraction, '/', subStepFactor**cutBackLevel
|
||||||
flush(6)
|
flush(6)
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! forward fields
|
! forward fields
|
||||||
do field = 1, nActiveFields
|
do field = 1, nActiveFields
|
||||||
select case (loadCases(currentLoadCase)%fieldBC(field)%ID)
|
select case (loadCases(currentLoadCase)%fieldBC(field)%ID)
|
||||||
case(FIELD_MECH_ID)
|
case(FIELD_MECH_ID)
|
||||||
call FEM_mech_forward (&
|
call FEM_mech_forward (&
|
||||||
guess,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(field))
|
guess,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(field))
|
||||||
|
|
||||||
end select
|
end select
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! solve fields
|
! solve fields
|
||||||
stagIter = 0
|
stagIter = 0
|
||||||
stagIterate = .true.
|
stagIterate = .true.
|
||||||
do while (stagIterate)
|
do while (stagIterate)
|
||||||
do field = 1, nActiveFields
|
do field = 1, nActiveFields
|
||||||
select case (loadCases(currentLoadCase)%fieldBC(field)%ID)
|
select case (loadCases(currentLoadCase)%fieldBC(field)%ID)
|
||||||
case(FIELD_MECH_ID)
|
case(FIELD_MECH_ID)
|
||||||
solres(field) = FEM_mech_solution (&
|
solres(field) = FEM_mech_solution (&
|
||||||
incInfo,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(field))
|
incInfo,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(field))
|
||||||
|
|
||||||
end select
|
end select
|
||||||
|
|
||||||
if(.not. solres(field)%converged) exit ! no solution found
|
if(.not. solres(field)%converged) exit ! no solution found
|
||||||
|
|
||||||
enddo
|
|
||||||
stagIter = stagIter + 1
|
|
||||||
stagIterate = stagIter < stagItMax &
|
|
||||||
.and. all(solres(:)%converged) &
|
|
||||||
.and. .not. all(solres(:)%stagConverged) ! stationary with respect to staggered iteration
|
|
||||||
enddo
|
enddo
|
||||||
|
stagIter = stagIter + 1
|
||||||
|
stagIterate = stagIter < stagItMax &
|
||||||
|
.and. all(solres(:)%converged) &
|
||||||
|
.and. .not. all(solres(:)%stagConverged) ! stationary with respect to staggered iteration
|
||||||
|
enddo
|
||||||
|
|
||||||
! check solution
|
! check solution
|
||||||
cutBack = .False.
|
cutBack = .False.
|
||||||
if(.not. all(solres(:)%converged .and. solres(:)%stagConverged)) then ! no solution found
|
if(.not. all(solres(:)%converged .and. solres(:)%stagConverged)) then ! no solution found
|
||||||
if (cutBackLevel < maxCutBack) then ! do cut back
|
if (cutBackLevel < maxCutBack) then ! do cut back
|
||||||
write(6,'(/,a)') ' cut back detected'
|
write(6,'(/,a)') ' cut back detected'
|
||||||
cutBack = .True.
|
cutBack = .True.
|
||||||
stepFraction = (stepFraction - 1) * subStepFactor ! adjust to new denominator
|
stepFraction = (stepFraction - 1) * subStepFactor ! adjust to new denominator
|
||||||
cutBackLevel = cutBackLevel + 1
|
cutBackLevel = cutBackLevel + 1
|
||||||
time = time - timeinc ! rewind time
|
time = time - timeinc ! rewind time
|
||||||
timeinc = timeinc/2.0_pReal
|
timeinc = timeinc/2.0_pReal
|
||||||
else ! default behavior, exit if spectral solver does not converge
|
else ! default behavior, exit if spectral solver does not converge
|
||||||
call IO_warning(850)
|
call IO_warning(850)
|
||||||
call quit(-1*(lastRestartWritten+1)) ! quit and provide information about last restart inc written
|
call quit(1) ! quit
|
||||||
endif
|
|
||||||
else
|
|
||||||
guess = .true. ! start guessing after first converged (sub)inc
|
|
||||||
timeIncOld = timeinc
|
|
||||||
endif
|
endif
|
||||||
if (.not. cutBack) then
|
|
||||||
if (worldrank == 0) write(statUnit,*) totalIncsCounter, time, cutBackLevel, &
|
|
||||||
solres%converged, solres%iterationsNeeded ! write statistics about accepted solution
|
|
||||||
endif
|
|
||||||
enddo subStepLooping
|
|
||||||
|
|
||||||
cutBackLevel = max(0, cutBackLevel - 1) ! try half number of subincs next inc
|
|
||||||
|
|
||||||
if (all(solres(:)%converged)) then
|
|
||||||
convergedCounter = convergedCounter + 1
|
|
||||||
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report converged inc
|
|
||||||
' increment ', totalIncsCounter, ' converged'
|
|
||||||
else
|
else
|
||||||
notConvergedCounter = notConvergedCounter + 1
|
guess = .true. ! start guessing after first converged (sub)inc
|
||||||
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report non-converged inc
|
timeIncOld = timeinc
|
||||||
' increment ', totalIncsCounter, ' NOT converged'
|
|
||||||
endif; flush(6)
|
|
||||||
|
|
||||||
if (mod(inc,loadCases(currentLoadCase)%outputFrequency) == 0) then ! at output frequency
|
|
||||||
write(6,'(1/,a)') ' ... writing results to file ......................................'
|
|
||||||
call CPFEM_results(totalIncsCounter,time)
|
|
||||||
endif
|
endif
|
||||||
if ( loadCases(currentLoadCase)%restartFrequency > 0 & ! writing of restart info requested ...
|
if (.not. cutBack) then
|
||||||
.and. mod(inc,loadCases(currentLoadCase)%restartFrequency) == 0) then ! ... and at frequency of writing restart information
|
if (worldrank == 0) write(statUnit,*) totalIncsCounter, time, cutBackLevel, &
|
||||||
restartWrite = .true. ! set restart parameter for FEsolving
|
solres%converged, solres%iterationsNeeded ! write statistics about accepted solution
|
||||||
lastRestartWritten = inc ! first call to CPFEM_general will write
|
|
||||||
endif
|
endif
|
||||||
|
enddo subStepLooping
|
||||||
|
|
||||||
|
cutBackLevel = max(0, cutBackLevel - 1) ! try half number of subincs next inc
|
||||||
|
|
||||||
|
if (all(solres(:)%converged)) then
|
||||||
|
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report converged inc
|
||||||
|
' increment ', totalIncsCounter, ' converged'
|
||||||
|
else
|
||||||
|
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report non-converged inc
|
||||||
|
' increment ', totalIncsCounter, ' NOT converged'
|
||||||
|
endif; flush(6)
|
||||||
|
|
||||||
|
if (mod(inc,loadCases(currentLoadCase)%outputFrequency) == 0) then ! at output frequency
|
||||||
|
write(6,'(1/,a)') ' ... writing results to file ......................................'
|
||||||
|
call CPFEM_results(totalIncsCounter,time)
|
||||||
|
endif
|
||||||
|
|
||||||
endif skipping
|
|
||||||
|
|
||||||
enddo incLooping
|
enddo incLooping
|
||||||
|
|
||||||
|
@ -413,15 +394,8 @@ program DAMASK_FEM
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! report summary of whole calculation
|
! report summary of whole calculation
|
||||||
write(6,'(/,a)') ' ###########################################################################'
|
write(6,'(/,a)') ' ###########################################################################'
|
||||||
write(6,'(1x,'//IO_intOut(convergedCounter)//',a,'//IO_intOut(notConvergedCounter + convergedCounter)//',a,f5.1,a)') &
|
|
||||||
convergedCounter, ' out of ', &
|
|
||||||
notConvergedCounter + convergedCounter, ' (', &
|
|
||||||
real(convergedCounter, pReal)/&
|
|
||||||
real(notConvergedCounter + convergedCounter,pReal)*100.0_pReal, ' %) increments converged!'
|
|
||||||
flush(6)
|
|
||||||
close(statUnit)
|
close(statUnit)
|
||||||
|
|
||||||
if (notConvergedCounter > 0) call quit(2) ! error if some are not converged
|
|
||||||
call quit(0) ! no complains ;)
|
call quit(0) ! no complains ;)
|
||||||
|
|
||||||
end program DAMASK_FEM
|
end program DAMASK_FEM
|
||||||
|
|
|
@ -62,7 +62,7 @@ module FEM_mech
|
||||||
contains
|
contains
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief allocates all neccessary fields and fills them with data, potentially from restart info
|
!> @brief allocates all neccessary fields and fills them with data
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine FEM_mech_init(fieldBC)
|
subroutine FEM_mech_init(fieldBC)
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,6 @@ module FEM_utilities
|
||||||
real(pReal) :: time = 0.0_pReal !< length of increment
|
real(pReal) :: time = 0.0_pReal !< length of increment
|
||||||
integer :: incs = 0, & !< number of increments
|
integer :: incs = 0, & !< number of increments
|
||||||
outputfrequency = 1, & !< frequency of result writes
|
outputfrequency = 1, & !< frequency of result writes
|
||||||
restartfrequency = 0, & !< frequency of restart writes
|
|
||||||
logscale = 0 !< linear/logarithmic time inc flag
|
logscale = 0 !< linear/logarithmic time inc flag
|
||||||
logical :: followFormerTrajectory = .true. !< follow trajectory of former loadcase
|
logical :: followFormerTrajectory = .true. !< follow trajectory of former loadcase
|
||||||
integer, allocatable :: faceID(:)
|
integer, allocatable :: faceID(:)
|
||||||
|
@ -145,7 +144,6 @@ subroutine utilities_constitutiveResponse(timeinc,P_av,forwardData)
|
||||||
|
|
||||||
call materialpoint_stressAndItsTangent(.true.,timeinc) ! calculate P field
|
call materialpoint_stressAndItsTangent(.true.,timeinc) ! calculate P field
|
||||||
|
|
||||||
restartWrite = .false. ! reset restartWrite status
|
|
||||||
cutBack = .false. ! reset cutBack status
|
cutBack = .false. ! reset cutBack status
|
||||||
|
|
||||||
P_av = sum(sum(materialpoint_P,dim=4),dim=3) * wgt ! average of P
|
P_av = sum(sum(materialpoint_P,dim=4),dim=3) * wgt ! average of P
|
||||||
|
|
|
@ -454,7 +454,7 @@ subroutine mesh_init(ip,el)
|
||||||
|
|
||||||
myDebug = (iand(debug_level(debug_mesh),debug_levelBasic) /= 0)
|
myDebug = (iand(debug_level(debug_mesh),debug_levelBasic) /= 0)
|
||||||
|
|
||||||
call IO_open_inputFile(FILEUNIT,modelName) ! parse info from input file...
|
call IO_open_inputFile(FILEUNIT) ! parse info from input file...
|
||||||
if (myDebug) write(6,'(a)') ' Opened input file'; flush(6)
|
if (myDebug) write(6,'(a)') ' Opened input file'; flush(6)
|
||||||
noPart = hasNoPart(FILEUNIT)
|
noPart = hasNoPart(FILEUNIT)
|
||||||
call mesh_abaqus_count_nodesAndElements(FILEUNIT)
|
call mesh_abaqus_count_nodesAndElements(FILEUNIT)
|
||||||
|
|
|
@ -201,9 +201,9 @@ subroutine inputRead(elem,node0_elem,connectivity_elem,microstructureAt,homogeni
|
||||||
character(len=64), dimension(:), allocatable :: &
|
character(len=64), dimension(:), allocatable :: &
|
||||||
nameElemSet
|
nameElemSet
|
||||||
integer, dimension(:,:), allocatable :: &
|
integer, dimension(:,:), allocatable :: &
|
||||||
mapElemSet !< list of elements in elementSet
|
mapElemSet !< list of elements in elementSet
|
||||||
|
|
||||||
inputFile = IO_read_ASCII(trim(modelName)//trim(InputFileExtension))
|
inputFile = IO_read_ASCII(trim(getSolverJobName())//trim(InputFileExtension))
|
||||||
call inputRead_fileFormat(fileFormatVersion, &
|
call inputRead_fileFormat(fileFormatVersion, &
|
||||||
inputFile)
|
inputFile)
|
||||||
call inputRead_tableStyles(initialcondTableStyle,hypoelasticTableStyle, &
|
call inputRead_tableStyles(initialcondTableStyle,hypoelasticTableStyle, &
|
||||||
|
@ -214,7 +214,7 @@ subroutine inputRead(elem,node0_elem,connectivity_elem,microstructureAt,homogeni
|
||||||
call inputRead_NnodesAndElements(nNodes,nElems,&
|
call inputRead_NnodesAndElements(nNodes,nElems,&
|
||||||
inputFile)
|
inputFile)
|
||||||
|
|
||||||
call IO_open_inputFile(FILEUNIT,modelName) ! ToDo: It would be better to use fileContent
|
call IO_open_inputFile(FILEUNIT) ! ToDo: It would be better to use fileContent
|
||||||
|
|
||||||
call inputRead_mapElemSets(nameElemSet,mapElemSet,&
|
call inputRead_mapElemSets(nameElemSet,mapElemSet,&
|
||||||
FILEUNIT)
|
FILEUNIT)
|
||||||
|
|
|
@ -82,9 +82,6 @@ module numerics
|
||||||
&-damage_snes_type ngmres &
|
&-damage_snes_type ngmres &
|
||||||
&-thermal_snes_type ngmres ', &
|
&-thermal_snes_type ngmres ', &
|
||||||
petsc_options = ''
|
petsc_options = ''
|
||||||
logical, protected, public :: &
|
|
||||||
continueCalculation = .false. !< false:exit if BVP solver does not converge, true: continue calculation despite BVP solver not converging
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -259,8 +256,6 @@ subroutine numerics_init
|
||||||
err_stress_tolrel = IO_floatValue(line,chunkPos,2)
|
err_stress_tolrel = IO_floatValue(line,chunkPos,2)
|
||||||
case ('err_stress_tolabs')
|
case ('err_stress_tolabs')
|
||||||
err_stress_tolabs = IO_floatValue(line,chunkPos,2)
|
err_stress_tolabs = IO_floatValue(line,chunkPos,2)
|
||||||
case ('continuecalculation')
|
|
||||||
continueCalculation = IO_intValue(line,chunkPos,2) > 0
|
|
||||||
case ('petsc_options')
|
case ('petsc_options')
|
||||||
petsc_options = trim(line(chunkPos(4):))
|
petsc_options = trim(line(chunkPos(4):))
|
||||||
case ('err_curl_tolabs')
|
case ('err_curl_tolabs')
|
||||||
|
@ -354,7 +349,6 @@ subroutine numerics_init
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! spectral parameters
|
! spectral parameters
|
||||||
#ifdef Grid
|
#ifdef Grid
|
||||||
write(6,'(a24,1x,L8)') ' continueCalculation: ',continueCalculation
|
|
||||||
write(6,'(a24,1x,es8.1)') ' err_stress_tolAbs: ',err_stress_tolAbs
|
write(6,'(a24,1x,es8.1)') ' err_stress_tolAbs: ',err_stress_tolAbs
|
||||||
write(6,'(a24,1x,es8.1)') ' err_stress_tolRel: ',err_stress_tolRel
|
write(6,'(a24,1x,es8.1)') ' err_stress_tolRel: ',err_stress_tolRel
|
||||||
write(6,'(a24,1x,es8.1)') ' err_div_tolAbs: ',err_div_tolAbs
|
write(6,'(a24,1x,es8.1)') ' err_div_tolAbs: ',err_div_tolAbs
|
||||||
|
|
|
@ -42,7 +42,6 @@ subroutine quit(stop_id)
|
||||||
dateAndTime(7)
|
dateAndTime(7)
|
||||||
|
|
||||||
if (stop_id == 0 .and. ierr == 0 .and. error == 0) stop 0 ! normal termination
|
if (stop_id == 0 .and. ierr == 0 .and. error == 0) stop 0 ! normal termination
|
||||||
if (stop_id == 2 .and. ierr == 0 .and. error == 0) stop 2 ! not all incs converged
|
|
||||||
stop 1 ! error (message from IO_error)
|
stop 1 ! error (message from IO_error)
|
||||||
|
|
||||||
end subroutine quit
|
end subroutine quit
|
||||||
|
|
Loading…
Reference in New Issue