From 94843becdafeab9d743d5496556a5b749c15cc3c Mon Sep 17 00:00:00 2001 From: Abisheik Panneerselvam Date: Wed, 14 Jul 2021 19:33:54 +0200 Subject: [PATCH 01/46] writing ip displacements (algorithm contain bugs) --- PRIVATE | 2 +- src/mesh/mesh_mech_FEM.f90 | 43 ++++++++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/PRIVATE b/PRIVATE index 1ca9a0e9f..918eed1d9 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 1ca9a0e9f2b333d3244b1ab44480380b3b22bebe +Subproject commit 918eed1d9f67eed75b4a4c66945c8c3053fa10fb diff --git a/src/mesh/mesh_mech_FEM.f90 b/src/mesh/mesh_mech_FEM.f90 index 6fa2f668b..43b997b70 100644 --- a/src/mesh/mesh_mech_FEM.f90 +++ b/src/mesh/mesh_mech_FEM.f90 @@ -670,7 +670,7 @@ end subroutine FEM_mechanical_converged !-------------------------------------------------------------------------------------------------- -!> @brief Calculate current coordinates (FEM nodal coordinates only at the moment) +!> @brief Calculate current coordinates (both nodal and ip coordinates) !-------------------------------------------------------------------------------------------------- subroutine FEM_mechanical_updateCoords() @@ -678,28 +678,63 @@ subroutine FEM_mechanical_updateCoords() nodeCoords_linear !< nodal coordinates (dimPlex*Nnodes) real(pReal), pointer, dimension(:,:) :: & nodeCoords !< nodal coordinates (3,Nnodes) + real(pReal), pointer, dimension(:,:,:) :: & + ipCoords !< ip coordinates (3,nQuadrature,mesh_NcpElems) DM :: dm_local Vec :: x_local PetscErrorCode :: ierr - PetscInt :: dimPlex, pStart, pEnd, p, s, e + PetscInt :: dimPlex, pStart, pEnd, p, s, e,& + cellStart, cellEnd, c, qPt, comp, nc, nqpoints,qOffset,nOffset,n,Nnodes PetscSection :: section + PetscFE :: mechFE + PetscDS :: mechDS + PetscQuadrature :: mechQuad + PetscReal, dimension(:), pointer :: qPoints, qWeights, basisField, basisFieldDer + PetscScalar, dimension(:), pointer :: x_scal call SNESGetDM(mechanical_snes,dm_local,ierr); CHKERRQ(ierr) + call DMGetDS(dm_local,mechQuad,ierr); CHKERRQ(ierr) call DMGetLocalSection(dm_local,section,ierr); CHKERRQ(ierr) call DMGetLocalVector(dm_local,x_local,ierr); CHKERRQ(ierr) call DMGetDimension(dm_local,dimPlex,ierr); CHKERRQ(ierr) + + ! write cell vertex displacements call DMPlexGetDepthStratum(dm_local,0,pStart,pEnd,ierr); CHKERRQ(ierr) allocate(nodeCoords(3,pStart:pEnd-1),source=0.0_pReal) call VecGetArrayF90(x_local,nodeCoords_linear,ierr); CHKERRQ(ierr) - do p=pStart, pEnd-1 call DMPlexGetPointLocal(dm_local, p, s, e, ierr); CHKERRQ(ierr) nodeCoords(1:dimPlex,p)=nodeCoords_linear(s+1:e) end do - call discretization_setNodeCoords(nodeCoords) call VecRestoreArrayF90(x_local,nodeCoords_linear,ierr); CHKERRQ(ierr) + + ! write ip displacements + call DMPlexGetHeightStratum(dm_local,0,cellStart,cellEnd,ierr); CHKERRQ(ierr) + call PetscDSGetTabulation(mechQuad,0,basisField,basisFieldDer,ierr); CHKERRQ(ierr) + allocate(ipCoords(0:2,0:nQuadrature-1,0:mesh_NcpElems-1),source=0.0_pReal) + ipCoords=0.0_pReal + do c=cellStart,cellEnd-1 + qOffset=0 + call DMPlexVecGetClosure(dm_local,section,x_local,c,x_scal,ierr); CHKERRQ(ierr) !< get nodal coordinates of each element + Nnodes=size(x_scal)/dimplex !< no. of nodes for each element + do qPt=0,nQuadrature-1 + qOffset=qPt*(cellDof*dimPlex) + do comp=0,dimPlex-1 !< loop over components + nOffset=0 + do n=0,Nnodes-1 + ipCoords(comp,qPt,c)=ipCoords(comp,qPt,c)+sum(basisField(qOffset*dimplex+1:qOffset*dimplex+2)*& + x_scal(nOffset+1:nOffset+2)) + qOffset=qOffset+dimplex + nOffset=nOffset+dimPlex + enddo + qOffset=qPt*(cellDof*dimPlex)+1 + enddo + enddo + call DMPlexVecRestoreClosure(dm_local,section,x_local,c,x_scal,ierr); CHKERRQ(ierr) + end do + call discretization_setIPcoords(reshape(ipCoords,[3,mesh_NcpElems*nQuadrature])) call DMRestoreLocalVector(dm_local,x_local,ierr); CHKERRQ(ierr) end subroutine FEM_mechanical_updateCoords From 4d6a9a51ed8be27ef3b2d81411369a26f5dd5d89 Mon Sep 17 00:00:00 2001 From: Sharan Roongta Date: Thu, 15 Jul 2021 17:30:00 +0200 Subject: [PATCH 02/46] correct logic --- PRIVATE | 2 +- src/mesh/mesh_mech_FEM.f90 | 28 +++++++++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/PRIVATE b/PRIVATE index 918eed1d9..8fec909d1 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 918eed1d9f67eed75b4a4c66945c8c3053fa10fb +Subproject commit 8fec909d1931b092b223b0560dd30c3339c6e5a7 diff --git a/src/mesh/mesh_mech_FEM.f90 b/src/mesh/mesh_mech_FEM.f90 index 43b997b70..c63f92a2c 100644 --- a/src/mesh/mesh_mech_FEM.f90 +++ b/src/mesh/mesh_mech_FEM.f90 @@ -681,10 +681,17 @@ subroutine FEM_mechanical_updateCoords() real(pReal), pointer, dimension(:,:,:) :: & ipCoords !< ip coordinates (3,nQuadrature,mesh_NcpElems) + integer :: & + qPt, & + comp, & + nc, & + qOffset, & + nOffset + DM :: dm_local Vec :: x_local PetscErrorCode :: ierr - PetscInt :: dimPlex, pStart, pEnd, p, s, e,& + PetscInt :: dimPlex, pStart, pEnd, p, s, e, q, & cellStart, cellEnd, c, qPt, comp, nc, nqpoints,qOffset,nOffset,n,Nnodes PetscSection :: section PetscFE :: mechFE @@ -713,23 +720,22 @@ subroutine FEM_mechanical_updateCoords() ! write ip displacements call DMPlexGetHeightStratum(dm_local,0,cellStart,cellEnd,ierr); CHKERRQ(ierr) call PetscDSGetTabulation(mechQuad,0,basisField,basisFieldDer,ierr); CHKERRQ(ierr) - allocate(ipCoords(0:2,0:nQuadrature-1,0:mesh_NcpElems-1),source=0.0_pReal) - ipCoords=0.0_pReal + allocate(ipCoords(3,nQuadrature,mesh_NcpElems),source=0.0_pReal) do c=cellStart,cellEnd-1 qOffset=0 call DMPlexVecGetClosure(dm_local,section,x_local,c,x_scal,ierr); CHKERRQ(ierr) !< get nodal coordinates of each element - Nnodes=size(x_scal)/dimplex !< no. of nodes for each element do qPt=0,nQuadrature-1 - qOffset=qPt*(cellDof*dimPlex) + qOffset= qPt * (size(basisField)/nQuadrature) do comp=0,dimPlex-1 !< loop over components nOffset=0 - do n=0,Nnodes-1 - ipCoords(comp,qPt,c)=ipCoords(comp,qPt,c)+sum(basisField(qOffset*dimplex+1:qOffset*dimplex+2)*& - x_scal(nOffset+1:nOffset+2)) - qOffset=qOffset+dimplex - nOffset=nOffset+dimPlex + q = comp + do n=0,nBasis-1 + ipCoords(comp+1,qPt+1,c+1)=ipCoords(comp+1,qPt+1,c+1)+& + sum(basisField(qOffset+(q*dimPlex)+1:qOffset+(q*dimPlex)+dimPlex)*& + x_scal(nOffset+1:nOffset+dimPlex)) + q = q+dimPlex + nOffset = nOffset+dimPlex enddo - qOffset=qPt*(cellDof*dimPlex)+1 enddo enddo call DMPlexVecRestoreClosure(dm_local,section,x_local,c,x_scal,ierr); CHKERRQ(ierr) From f05ac877eb9eb557dddb8254049c5f1f5f644c03 Mon Sep 17 00:00:00 2001 From: Sharan Roongta Date: Thu, 15 Jul 2021 18:53:51 +0200 Subject: [PATCH 03/46] ip displacement added to reference file --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 8fec909d1..feed4bff5 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 8fec909d1931b092b223b0560dd30c3339c6e5a7 +Subproject commit feed4bff505c7d556393d35ac9938379eda6d2e4 From 97203ff551e468277f9980a1b7f0e4217edabc66 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 18 Jul 2021 23:30:30 +0200 Subject: [PATCH 04/46] document and keep definitions together --- src/mesh/FEM_quadrature.f90 | 7 +++++++ src/prec.f90 | 5 ----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index ed0bbef9a..3af535c2f 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -20,6 +20,10 @@ module FEM_quadrature -1.0_pReal, 1.0_pReal, -1.0_pReal, & -1.0_pReal, -1.0_pReal, 1.0_pReal], shape=[3,4]) + type :: group_float !< variable length datatype used for storage of state + real(pReal), dimension(:), pointer :: p + end type group_float + integer, dimension(2:3,maxOrder), public, protected :: & FEM_nQuadrature !< number of quadrature points for a given spatial dimension(2-3) and interpolation order(1-maxOrder) type(group_float), dimension(2:3,maxOrder), public, protected :: & @@ -39,6 +43,9 @@ subroutine FEM_quadrature_init print'(/,a)', ' <<<+- FEM_quadrature init -+>>>'; flush(6) + print*, 'L. Zhang et al., Journal of Computational Mathematics 27(1):89-96, 2009' + print*, 'https://www.jstor.org/stable/43693493' + !-------------------------------------------------------------------------------------------------- ! 2D linear FEM_nQuadrature(2,1) = 1 diff --git a/src/prec.f90 b/src/prec.f90 index 7613cfe46..733286a8a 100644 --- a/src/prec.f90 +++ b/src/prec.f90 @@ -27,11 +27,6 @@ module prec real(pReal), parameter :: tol_math_check = 1.0e-8_pReal !< tolerance for internal math self-checks (rotation) - - type :: group_float !< variable length datatype used for storage of state - real(pReal), dimension(:), pointer :: p - end type group_float - type :: tState integer :: & sizeState = 0, & !< size of state From 28179963a292877022aab8161569038e0e33313b Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 19 Jul 2021 13:04:16 +0200 Subject: [PATCH 05/46] avoid failing tests --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index feed4bff5..806d65296 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit feed4bff505c7d556393d35ac9938379eda6d2e4 +Subproject commit 806d6529674b21931bb42957492b3f063032febc From a654cd4fb1caa30bff7178986eeb43acf376acf4 Mon Sep 17 00:00:00 2001 From: Abisheik Panneerselvam Date: Mon, 19 Jul 2021 17:07:43 +0200 Subject: [PATCH 06/46] To avoid fortran double variable truncation for quadrature points --- PRIVATE | 2 +- src/mesh/FEM_quadrature.f90 | 25 ++++++++++++++----------- src/mesh/mesh_mech_FEM.f90 | 8 +++----- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/PRIVATE b/PRIVATE index 806d65296..2bafc2dbc 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 806d6529674b21931bb42957492b3f063032febc +Subproject commit 2bafc2dbc9b3b6682ef7c77c193dcdfe55d6b9c2 diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index 3af535c2f..5aa7ff947 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -71,12 +71,12 @@ subroutine FEM_quadrature_init FEM_nQuadrature(2,3) = 6 allocate(FEM_quadrature_weights(2,3)%p(6)) - FEM_quadrature_weights(2,3)%p(1:3) = 0.22338158967801146570_pReal - FEM_quadrature_weights(2,3)%p(4:6) = 0.10995174365532186764_pReal + FEM_quadrature_weights(2,3)%p(1:3) = 0.2233815896780115_pReal + FEM_quadrature_weights(2,3)%p(4:6) = 0.1099517436553218_pReal allocate(FEM_quadrature_points (2,3)%p(12)) - FEM_quadrature_points (2,3)%p(1:6) = permutationStar21([0.44594849091596488632_pReal]) - FEM_quadrature_points (2,3)%p(7:12)= permutationStar21([0.091576213509770743460_pReal]) + FEM_quadrature_points (2,3)%p(1:6) = permutationStar21([0.4459484909159649_pReal]) + FEM_quadrature_points (2,3)%p(7:12)= permutationStar21([0.0915762135097707_pReal]) !-------------------------------------------------------------------------------------------------- ! 2D quartic @@ -97,6 +97,7 @@ subroutine FEM_quadrature_init FEM_nQuadrature(2,5) = 16 allocate(FEM_quadrature_weights(2,5)%p(16)) + FEM_quadrature_weights(2,5)%p(1 ) = 0.14431560767779_pReal FEM_quadrature_weights(2,5)%p(2:4) = 0.09509163426728_pReal FEM_quadrature_weights(2,5)%p(5:7) = 0.10321737053472_pReal @@ -104,6 +105,7 @@ subroutine FEM_quadrature_init FEM_quadrature_weights(2,5)%p(11:16)= 0.02723031417443_pReal allocate(FEM_quadrature_points (2,5)%p(32)) + FEM_quadrature_points (2,5)%p(1:2) = permutationStar3([0.33333333333333_pReal]) FEM_quadrature_points (2,5)%p(3:8) = permutationStar21([0.45929258829272_pReal]) FEM_quadrature_points (2,5)%p(9:14) = permutationStar21([0.17056930775176_pReal]) @@ -128,21 +130,22 @@ subroutine FEM_quadrature_init FEM_quadrature_weights(3,2)%p(1:4) = 0.25_pReal allocate(FEM_quadrature_points (3,2)%p(12)) - FEM_quadrature_points (3,2)%p(1:12)= permutationStar31([0.13819660112501051518_pReal]) + + FEM_quadrature_points (3,2)%p(1:12)= permutationStar31([0.1381966011250105_pReal]) !-------------------------------------------------------------------------------------------------- ! 3D cubic FEM_nQuadrature(3,3) = 14 allocate(FEM_quadrature_weights(3,3)%p(14)) - FEM_quadrature_weights(3,3)%p(5:8) = 0.11268792571801585080_pReal - FEM_quadrature_weights(3,3)%p(1:4) = 0.073493043116361949544_pReal - FEM_quadrature_weights(3,3)%p(9:14) = 0.042546020777081466438_pReal + FEM_quadrature_weights(3,3)%p(5:8) = 0.11268792571801574_pReal + FEM_quadrature_weights(3,3)%p(1:4) = 0.0734930431163620_pReal + FEM_quadrature_weights(3,3)%p(9:14) = 0.0425460207770815_pReal allocate(FEM_quadrature_points (3,3)%p(42)) - FEM_quadrature_points (3,3)%p(1:12) = permutationStar31([0.092735250310891226402_pReal]) - FEM_quadrature_points (3,3)%p(13:24)= permutationStar31([0.31088591926330060980_pReal]) - FEM_quadrature_points (3,3)%p(25:42)= permutationStar22([0.045503704125649649492_pReal]) + FEM_quadrature_points (3,3)%p(1:12) = permutationStar31([0.0927352503108912_pReal]) + FEM_quadrature_points (3,3)%p(13:24)= permutationStar31([0.3108859192633006_pReal]) + FEM_quadrature_points (3,3)%p(25:42)= permutationStar22([0.0455037041256497_pReal]) !-------------------------------------------------------------------------------------------------- ! 3D quartic diff --git a/src/mesh/mesh_mech_FEM.f90 b/src/mesh/mesh_mech_FEM.f90 index 1bbb3d178..f63ec347f 100644 --- a/src/mesh/mesh_mech_FEM.f90 +++ b/src/mesh/mesh_mech_FEM.f90 @@ -690,13 +690,11 @@ subroutine FEM_mechanical_updateCoords() DM :: dm_local Vec :: x_local PetscErrorCode :: ierr - PetscInt :: dimPlex, pStart, pEnd, p, s, e, q, & - cellStart, cellEnd, c, nqpoints,n + PetscInt :: pStart, pEnd, p, s, e, q, & + cellStart, cellEnd, c, n PetscSection :: section - PetscFE :: mechFE - PetscDS :: mechDS PetscQuadrature :: mechQuad - PetscReal, dimension(:), pointer :: qPoints, qWeights, basisField, basisFieldDer + PetscReal, dimension(:), pointer :: basisField, basisFieldDer PetscScalar, dimension(:), pointer :: x_scal call SNESGetDM(mechanical_snes,dm_local,ierr); CHKERRQ(ierr) From 86d918367fe0d4b0ea95b8b3a6b8d3487a4d2bf8 Mon Sep 17 00:00:00 2001 From: Abisheik Panneerselvam Date: Tue, 20 Jul 2021 15:34:13 +0200 Subject: [PATCH 07/46] Round quadrature points --- src/mesh/FEM_quadrature.f90 | 49 ++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index 5aa7ff947..32516f4e1 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -71,10 +71,12 @@ subroutine FEM_quadrature_init FEM_nQuadrature(2,3) = 6 allocate(FEM_quadrature_weights(2,3)%p(6)) + FEM_quadrature_weights(2,3)%p(1:3) = 0.2233815896780115_pReal - FEM_quadrature_weights(2,3)%p(4:6) = 0.1099517436553218_pReal + FEM_quadrature_weights(2,3)%p(4:6) = 0.1099517436553219_pReal allocate(FEM_quadrature_points (2,3)%p(12)) + FEM_quadrature_points (2,3)%p(1:6) = permutationStar21([0.4459484909159649_pReal]) FEM_quadrature_points (2,3)%p(7:12)= permutationStar21([0.0915762135097707_pReal]) @@ -83,34 +85,35 @@ subroutine FEM_quadrature_init FEM_nQuadrature(2,4) = 12 allocate(FEM_quadrature_weights(2,4)%p(12)) - FEM_quadrature_weights(2,4)%p(1:3) = 0.11678627572638_pReal - FEM_quadrature_weights(2,4)%p(4:6) = 0.05084490637021_pReal - FEM_quadrature_weights(2,4)%p(7:12) = 0.08285107561837_pReal + + FEM_quadrature_weights(2,4)%p(1:3) = 0.1167862757263800_pReal + FEM_quadrature_weights(2,4)%p(4:6) = 0.0508449063702100_pReal + FEM_quadrature_weights(2,4)%p(7:12) = 0.0828510756183700_pReal allocate(FEM_quadrature_points (2,4)%p(24)) - FEM_quadrature_points (2,4)%p(1:6) = permutationStar21([0.24928674517091_pReal]) - FEM_quadrature_points (2,4)%p(7:12) = permutationStar21([0.06308901449150_pReal]) - FEM_quadrature_points (2,4)%p(13:24)= permutationStar111([0.31035245103378_pReal, 0.63650249912140_pReal]) + + FEM_quadrature_points (2,4)%p(1:6) = permutationStar21([0.2492867451709100_pReal]) + FEM_quadrature_points (2,4)%p(7:12) = permutationStar21([0.0630890144915000_pReal]) + FEM_quadrature_points (2,4)%p(13:24)= permutationStar111([0.3103524510337800_pReal, 0.6365024991214000_pReal]) !-------------------------------------------------------------------------------------------------- ! 2D quintic FEM_nQuadrature(2,5) = 16 allocate(FEM_quadrature_weights(2,5)%p(16)) - - FEM_quadrature_weights(2,5)%p(1 ) = 0.14431560767779_pReal - FEM_quadrature_weights(2,5)%p(2:4) = 0.09509163426728_pReal - FEM_quadrature_weights(2,5)%p(5:7) = 0.10321737053472_pReal - FEM_quadrature_weights(2,5)%p(8:10) = 0.03245849762320_pReal - FEM_quadrature_weights(2,5)%p(11:16)= 0.02723031417443_pReal + FEM_quadrature_weights(2,5)%p(1 ) = 0.1443156076777900_pReal + FEM_quadrature_weights(2,5)%p(2:4) = 0.0950916342672800_pReal + FEM_quadrature_weights(2,5)%p(5:7) = 0.1032173705347200_pReal + FEM_quadrature_weights(2,5)%p(8:10) = 0.0324584976232000_pReal + FEM_quadrature_weights(2,5)%p(11:16)= 0.0272303141744300_pReal allocate(FEM_quadrature_points (2,5)%p(32)) - FEM_quadrature_points (2,5)%p(1:2) = permutationStar3([0.33333333333333_pReal]) - FEM_quadrature_points (2,5)%p(3:8) = permutationStar21([0.45929258829272_pReal]) - FEM_quadrature_points (2,5)%p(9:14) = permutationStar21([0.17056930775176_pReal]) - FEM_quadrature_points (2,5)%p(15:20)= permutationStar21([0.05054722831703_pReal]) - FEM_quadrature_points (2,5)%p(21:32)= permutationStar111([0.26311282963464_pReal, 0.72849239295540_pReal]) + FEM_quadrature_points (2,5)%p(1:2) = permutationStar3([0.3333333333333300_pReal]) + FEM_quadrature_points (2,5)%p(3:8) = permutationStar21([0.4592925882927200_pReal]) + FEM_quadrature_points (2,5)%p(9:14) = permutationStar21([0.1705693077517600_pReal]) + FEM_quadrature_points (2,5)%p(15:20)= permutationStar21([0.0505472283170300_pReal]) + FEM_quadrature_points (2,5)%p(21:32)= permutationStar111([0.2631128296346400_pReal, 0.7284923929554000_pReal]) !-------------------------------------------------------------------------------------------------- ! 3D linear @@ -138,11 +141,13 @@ subroutine FEM_quadrature_init FEM_nQuadrature(3,3) = 14 allocate(FEM_quadrature_weights(3,3)%p(14)) - FEM_quadrature_weights(3,3)%p(5:8) = 0.11268792571801574_pReal + + FEM_quadrature_weights(3,3)%p(5:8) = 0.1126879257180159_pReal FEM_quadrature_weights(3,3)%p(1:4) = 0.0734930431163620_pReal FEM_quadrature_weights(3,3)%p(9:14) = 0.0425460207770815_pReal allocate(FEM_quadrature_points (3,3)%p(42)) + FEM_quadrature_points (3,3)%p(1:12) = permutationStar31([0.0927352503108912_pReal]) FEM_quadrature_points (3,3)%p(13:24)= permutationStar31([0.3108859192633006_pReal]) FEM_quadrature_points (3,3)%p(25:42)= permutationStar22([0.0455037041256497_pReal]) @@ -152,6 +157,7 @@ subroutine FEM_quadrature_init FEM_nQuadrature(3,4) = 35 allocate(FEM_quadrature_weights(3,4)%p(35)) + FEM_quadrature_weights(3,4)%p(1:4) = 0.0021900463965388_pReal FEM_quadrature_weights(3,4)%p(5:16) = 0.0143395670177665_pReal FEM_quadrature_weights(3,4)%p(17:22) = 0.0250305395686746_pReal @@ -159,6 +165,7 @@ subroutine FEM_quadrature_init FEM_quadrature_weights(3,4)%p(35) = 0.0931745731195340_pReal allocate(FEM_quadrature_points (3,4)%p(105)) + FEM_quadrature_points (3,4)%p(1:12) = permutationStar31([0.0267367755543735_pReal]) FEM_quadrature_points (3,4)%p(13:48) = permutationStar211([0.0391022406356488_pReal, 0.7477598884818090_pReal]) FEM_quadrature_points (3,4)%p(49:66) = permutationStar22([0.4547545999844830_pReal]) @@ -170,6 +177,7 @@ subroutine FEM_quadrature_init FEM_nQuadrature(3,5) = 56 allocate(FEM_quadrature_weights(3,5)%p(56)) + FEM_quadrature_weights(3,5)%p(1:4) = 0.0010373112336140_pReal FEM_quadrature_weights(3,5)%p(5:16) = 0.0096016645399480_pReal FEM_quadrature_weights(3,5)%p(17:28) = 0.0164493976798232_pReal @@ -178,6 +186,7 @@ subroutine FEM_quadrature_init FEM_quadrature_weights(3,5)%p(53:56) = 0.0366291366405108_pReal allocate(FEM_quadrature_points (3,5)%p(168)) + FEM_quadrature_points (3,5)%p(1:12) = permutationStar31([0.0149520651530592_pReal]) FEM_quadrature_points (3,5)%p(13:48) = permutationStar211([0.0340960211962615_pReal, 0.1518319491659370_pReal]) FEM_quadrature_points (3,5)%p(49:84) = permutationStar211([0.0462051504150017_pReal, 0.3549340560639790_pReal]) @@ -372,4 +381,4 @@ pure function permutationStar1111(point) result(qPt) end function permutationStar1111 -end module FEM_quadrature +end module FEM_quadrature \ No newline at end of file From 9427885b43b8b6ac66385de5da6c1e09d24a8005 Mon Sep 17 00:00:00 2001 From: Sharan Roongta Date: Wed, 21 Jul 2021 13:29:59 +0200 Subject: [PATCH 08/46] updated private --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 2bafc2dbc..4d696af2b 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 2bafc2dbc9b3b6682ef7c77c193dcdfe55d6b9c2 +Subproject commit 4d696af2bf78bb6d707fd51e958843b42b1279ff From f25dee4c3a7f1ddc73a577072fe7f2a87b78a50f Mon Sep 17 00:00:00 2001 From: Abisheik Panneerselvam Date: Wed, 21 Jul 2021 14:34:18 +0200 Subject: [PATCH 09/46] quad points updated and rounded based on literature values --- PRIVATE | 2 +- src/mesh/FEM_quadrature.f90 | 48 +++++++++++++++++-------------------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/PRIVATE b/PRIVATE index 4d696af2b..567067daf 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 4d696af2bf78bb6d707fd51e958843b42b1279ff +Subproject commit 567067daf05866c8e022fc0af6f441840f143b81 diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index 32516f4e1..e310cae06 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -70,50 +70,46 @@ subroutine FEM_quadrature_init ! 2D cubic FEM_nQuadrature(2,3) = 6 - allocate(FEM_quadrature_weights(2,3)%p(6)) - + allocate(FEM_quadrature_weights(2,3)%p(6)) FEM_quadrature_weights(2,3)%p(1:3) = 0.2233815896780115_pReal FEM_quadrature_weights(2,3)%p(4:6) = 0.1099517436553219_pReal allocate(FEM_quadrature_points (2,3)%p(12)) - FEM_quadrature_points (2,3)%p(1:6) = permutationStar21([0.4459484909159649_pReal]) - FEM_quadrature_points (2,3)%p(7:12)= permutationStar21([0.0915762135097707_pReal]) + FEM_quadrature_points (2,3)%p(7:12)= permutationStar21([0.09157621350977074_pReal]) !-------------------------------------------------------------------------------------------------- ! 2D quartic FEM_nQuadrature(2,4) = 12 - allocate(FEM_quadrature_weights(2,4)%p(12)) - - FEM_quadrature_weights(2,4)%p(1:3) = 0.1167862757263800_pReal - FEM_quadrature_weights(2,4)%p(4:6) = 0.0508449063702100_pReal - FEM_quadrature_weights(2,4)%p(7:12) = 0.0828510756183700_pReal + allocate(FEM_quadrature_weights(2,4)%p(12)) + FEM_quadrature_weights(2,4)%p(1:3) = 0.1167862757263794_pReal + FEM_quadrature_weights(2,4)%p(4:6) = 0.0508449063702068_pReal + FEM_quadrature_weights(2,4)%p(7:12) = 0.08285107561837358_pReal - allocate(FEM_quadrature_points (2,4)%p(24)) - - FEM_quadrature_points (2,4)%p(1:6) = permutationStar21([0.2492867451709100_pReal]) - FEM_quadrature_points (2,4)%p(7:12) = permutationStar21([0.0630890144915000_pReal]) - FEM_quadrature_points (2,4)%p(13:24)= permutationStar111([0.3103524510337800_pReal, 0.6365024991214000_pReal]) + allocate(FEM_quadrature_points (2,4)%p(24)) + FEM_quadrature_points (2,4)%p(1:6) = permutationStar21([0.2492867451709104_pReal]) + FEM_quadrature_points (2,4)%p(7:12) = permutationStar21([0.06308901449150223_pReal]) + FEM_quadrature_points (2,4)%p(13:24)= permutationStar111([0.3103524510337844_pReal, 0.05314504984481695_pReal]) !-------------------------------------------------------------------------------------------------- ! 2D quintic FEM_nQuadrature(2,5) = 16 allocate(FEM_quadrature_weights(2,5)%p(16)) - FEM_quadrature_weights(2,5)%p(1 ) = 0.1443156076777900_pReal - FEM_quadrature_weights(2,5)%p(2:4) = 0.0950916342672800_pReal - FEM_quadrature_weights(2,5)%p(5:7) = 0.1032173705347200_pReal - FEM_quadrature_weights(2,5)%p(8:10) = 0.0324584976232000_pReal - FEM_quadrature_weights(2,5)%p(11:16)= 0.0272303141744300_pReal + FEM_quadrature_weights(2,5)%p(1 ) = 0.1443156076777871_pReal + FEM_quadrature_weights(2,5)%p(2:4) = 0.09509163426728462_pReal + FEM_quadrature_weights(2,5)%p(5:7) = 0.1032173705347183_pReal + FEM_quadrature_weights(2,5)%p(8:10) = 0.03245849762319808_pReal + FEM_quadrature_weights(2,5)%p(11:16)= 0.02723031417443499_pReal allocate(FEM_quadrature_points (2,5)%p(32)) - FEM_quadrature_points (2,5)%p(1:2) = permutationStar3([0.3333333333333300_pReal]) - FEM_quadrature_points (2,5)%p(3:8) = permutationStar21([0.4592925882927200_pReal]) - FEM_quadrature_points (2,5)%p(9:14) = permutationStar21([0.1705693077517600_pReal]) - FEM_quadrature_points (2,5)%p(15:20)= permutationStar21([0.0505472283170300_pReal]) - FEM_quadrature_points (2,5)%p(21:32)= permutationStar111([0.2631128296346400_pReal, 0.7284923929554000_pReal]) + FEM_quadrature_points (2,5)%p(1:2) = permutationStar3([0.3333333333333333_pReal]) + FEM_quadrature_points (2,5)%p(3:8) = permutationStar21([0.4592925882927231_pReal]) + FEM_quadrature_points (2,5)%p(9:14) = permutationStar21([0.1705693077517602_pReal]) + FEM_quadrature_points (2,5)%p(15:20)= permutationStar21([0.0505472283170310_pReal]) + FEM_quadrature_points (2,5)%p(21:32)= permutationStar111([0.2631128296346381_pReal, 0.008394777409957605_pReal]) !-------------------------------------------------------------------------------------------------- ! 3D linear @@ -148,9 +144,9 @@ subroutine FEM_quadrature_init allocate(FEM_quadrature_points (3,3)%p(42)) - FEM_quadrature_points (3,3)%p(1:12) = permutationStar31([0.0927352503108912_pReal]) + FEM_quadrature_points (3,3)%p(1:12) = permutationStar31([0.09273525031089123_pReal]) FEM_quadrature_points (3,3)%p(13:24)= permutationStar31([0.3108859192633006_pReal]) - FEM_quadrature_points (3,3)%p(25:42)= permutationStar22([0.0455037041256497_pReal]) + FEM_quadrature_points (3,3)%p(25:42)= permutationStar22([0.04550370412564965_pReal]) !-------------------------------------------------------------------------------------------------- ! 3D quartic From b1ba64e6afbc7ba9e2b013c2750ccb7ef07d3d87 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 21 Jul 2021 17:51:58 +0200 Subject: [PATCH 10/46] understanding floating point precision double can use 16 or 17 significant figures - if the leading number is high (above 5 or so), only 16 figures are significant. - a trailing 1 is never significant --- src/mesh/FEM_quadrature.f90 | 70 ++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 39 deletions(-) diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index e310cae06..f99bc58b3 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -51,65 +51,64 @@ subroutine FEM_quadrature_init FEM_nQuadrature(2,1) = 1 allocate(FEM_quadrature_weights(2,1)%p(1)) - FEM_quadrature_weights(2,1)%p(1) = 1.0_pReal + FEM_quadrature_weights(2,1)%p(1) = 1._pReal allocate(FEM_quadrature_points (2,1)%p(2)) - FEM_quadrature_points (2,1)%p(1:2) = permutationStar3([1.0_pReal/3.0_pReal]) + FEM_quadrature_points (2,1)%p(1:2) = permutationStar3([1._pReal/3._pReal]) !-------------------------------------------------------------------------------------------------- ! 2D quadratic FEM_nQuadrature(2,2) = 3 allocate(FEM_quadrature_weights(2,2)%p(3)) - FEM_quadrature_weights(2,2)%p(1:3) = 1.0_pReal/3.0_pReal + FEM_quadrature_weights(2,2)%p(1:3) = 1._pReal/3._pReal allocate(FEM_quadrature_points (2,2)%p(6)) - FEM_quadrature_points (2,2)%p(1:6) = permutationStar21([1.0_pReal/6.0_pReal]) + FEM_quadrature_points (2,2)%p(1:6) = permutationStar21([1._pReal/6._pReal]) !-------------------------------------------------------------------------------------------------- ! 2D cubic FEM_nQuadrature(2,3) = 6 allocate(FEM_quadrature_weights(2,3)%p(6)) - FEM_quadrature_weights(2,3)%p(1:3) = 0.2233815896780115_pReal - FEM_quadrature_weights(2,3)%p(4:6) = 0.1099517436553219_pReal + FEM_quadrature_weights(2,3)%p(1:3) = 2.2338158967801147e-1_pReal + FEM_quadrature_weights(2,3)%p(4:6) = 1.0995174365532187e-1_pReal allocate(FEM_quadrature_points (2,3)%p(12)) - FEM_quadrature_points (2,3)%p(1:6) = permutationStar21([0.4459484909159649_pReal]) - FEM_quadrature_points (2,3)%p(7:12)= permutationStar21([0.09157621350977074_pReal]) + FEM_quadrature_points (2,3)%p(1:6) = permutationStar21([4.4594849091596489e-1_pReal]) + FEM_quadrature_points (2,3)%p(7:12)= permutationStar21([9.157621350977074e-2_pReal]) !-------------------------------------------------------------------------------------------------- ! 2D quartic FEM_nQuadrature(2,4) = 12 allocate(FEM_quadrature_weights(2,4)%p(12)) - FEM_quadrature_weights(2,4)%p(1:3) = 0.1167862757263794_pReal - FEM_quadrature_weights(2,4)%p(4:6) = 0.0508449063702068_pReal - FEM_quadrature_weights(2,4)%p(7:12) = 0.08285107561837358_pReal + FEM_quadrature_weights(2,4)%p(1:3) = 1.1678627572637937e-1_pReal + FEM_quadrature_weights(2,4)%p(4:6) = 5.0844906370206817e-2_pReal + FEM_quadrature_weights(2,4)%p(7:12) = 8.285107561837358e-2_pReal allocate(FEM_quadrature_points (2,4)%p(24)) - FEM_quadrature_points (2,4)%p(1:6) = permutationStar21([0.2492867451709104_pReal]) - FEM_quadrature_points (2,4)%p(7:12) = permutationStar21([0.06308901449150223_pReal]) - FEM_quadrature_points (2,4)%p(13:24)= permutationStar111([0.3103524510337844_pReal, 0.05314504984481695_pReal]) + FEM_quadrature_points (2,4)%p(1:6) = permutationStar21([2.4928674517091042e-1_pReal]) + FEM_quadrature_points (2,4)%p(7:12) = permutationStar21([6.308901449150223e-2_pReal]) + FEM_quadrature_points (2,4)%p(13:24)= permutationStar111([3.1035245103378440e-1_pReal, 5.3145049844816947e-2_pReal]) !-------------------------------------------------------------------------------------------------- ! 2D quintic FEM_nQuadrature(2,5) = 16 allocate(FEM_quadrature_weights(2,5)%p(16)) - FEM_quadrature_weights(2,5)%p(1 ) = 0.1443156076777871_pReal - FEM_quadrature_weights(2,5)%p(2:4) = 0.09509163426728462_pReal - FEM_quadrature_weights(2,5)%p(5:7) = 0.1032173705347183_pReal - FEM_quadrature_weights(2,5)%p(8:10) = 0.03245849762319808_pReal - FEM_quadrature_weights(2,5)%p(11:16)= 0.02723031417443499_pReal + FEM_quadrature_weights(2,5)%p(1 ) = 1.4431560767778717e-1_pReal + FEM_quadrature_weights(2,5)%p(2:4) = 9.509163426728463e-2_pReal + FEM_quadrature_weights(2,5)%p(5:7) = 1.0321737053471825e-1_pReal + FEM_quadrature_weights(2,5)%p(8:10) = 3.2458497623198080e-2_pReal + FEM_quadrature_weights(2,5)%p(11:16)= 2.7230314174434994e-2_pReal allocate(FEM_quadrature_points (2,5)%p(32)) - - FEM_quadrature_points (2,5)%p(1:2) = permutationStar3([0.3333333333333333_pReal]) - FEM_quadrature_points (2,5)%p(3:8) = permutationStar21([0.4592925882927231_pReal]) - FEM_quadrature_points (2,5)%p(9:14) = permutationStar21([0.1705693077517602_pReal]) - FEM_quadrature_points (2,5)%p(15:20)= permutationStar21([0.0505472283170310_pReal]) - FEM_quadrature_points (2,5)%p(21:32)= permutationStar111([0.2631128296346381_pReal, 0.008394777409957605_pReal]) + FEM_quadrature_points (2,5)%p(1:2) = permutationStar3([1._pReal/3._pReal]) + FEM_quadrature_points (2,5)%p(3:8) = permutationStar21([4.5929258829272316e-1_pReal]) + FEM_quadrature_points (2,5)%p(9:14) = permutationStar21([1.705693077517602e-1_pReal]) + FEM_quadrature_points (2,5)%p(15:20)= permutationStar21([5.0547228317030975e-2_pReal]) + FEM_quadrature_points (2,5)%p(21:32)= permutationStar111([2.631128296346381e-1_pReal, 8.3947774099576053e-2_pReal]) !-------------------------------------------------------------------------------------------------- ! 3D linear @@ -129,7 +128,6 @@ subroutine FEM_quadrature_init FEM_quadrature_weights(3,2)%p(1:4) = 0.25_pReal allocate(FEM_quadrature_points (3,2)%p(12)) - FEM_quadrature_points (3,2)%p(1:12)= permutationStar31([0.1381966011250105_pReal]) !-------------------------------------------------------------------------------------------------- @@ -137,23 +135,20 @@ subroutine FEM_quadrature_init FEM_nQuadrature(3,3) = 14 allocate(FEM_quadrature_weights(3,3)%p(14)) - - FEM_quadrature_weights(3,3)%p(5:8) = 0.1126879257180159_pReal - FEM_quadrature_weights(3,3)%p(1:4) = 0.0734930431163620_pReal - FEM_quadrature_weights(3,3)%p(9:14) = 0.0425460207770815_pReal + FEM_quadrature_weights(3,3)%p(5:8) = 1.1268792571801585e-1_pReal + FEM_quadrature_weights(3,3)%p(1:4) = 7.3493043116361949e-2_pReal + FEM_quadrature_weights(3,3)%p(9:14) = 4.2546020777081467e-2_pReal allocate(FEM_quadrature_points (3,3)%p(42)) - - FEM_quadrature_points (3,3)%p(1:12) = permutationStar31([0.09273525031089123_pReal]) - FEM_quadrature_points (3,3)%p(13:24)= permutationStar31([0.3108859192633006_pReal]) - FEM_quadrature_points (3,3)%p(25:42)= permutationStar22([0.04550370412564965_pReal]) + FEM_quadrature_points (3,3)%p(1:12) = permutationStar31([9.273525031089123e-2_pReal]) + FEM_quadrature_points (3,3)%p(13:24)= permutationStar31([3.108859192633006e-1_pReal]) + FEM_quadrature_points (3,3)%p(25:42)= permutationStar22([4.5503704125649649e-2_pReal]) !-------------------------------------------------------------------------------------------------- ! 3D quartic FEM_nQuadrature(3,4) = 35 allocate(FEM_quadrature_weights(3,4)%p(35)) - FEM_quadrature_weights(3,4)%p(1:4) = 0.0021900463965388_pReal FEM_quadrature_weights(3,4)%p(5:16) = 0.0143395670177665_pReal FEM_quadrature_weights(3,4)%p(17:22) = 0.0250305395686746_pReal @@ -161,7 +156,6 @@ subroutine FEM_quadrature_init FEM_quadrature_weights(3,4)%p(35) = 0.0931745731195340_pReal allocate(FEM_quadrature_points (3,4)%p(105)) - FEM_quadrature_points (3,4)%p(1:12) = permutationStar31([0.0267367755543735_pReal]) FEM_quadrature_points (3,4)%p(13:48) = permutationStar211([0.0391022406356488_pReal, 0.7477598884818090_pReal]) FEM_quadrature_points (3,4)%p(49:66) = permutationStar22([0.4547545999844830_pReal]) @@ -173,7 +167,6 @@ subroutine FEM_quadrature_init FEM_nQuadrature(3,5) = 56 allocate(FEM_quadrature_weights(3,5)%p(56)) - FEM_quadrature_weights(3,5)%p(1:4) = 0.0010373112336140_pReal FEM_quadrature_weights(3,5)%p(5:16) = 0.0096016645399480_pReal FEM_quadrature_weights(3,5)%p(17:28) = 0.0164493976798232_pReal @@ -182,7 +175,6 @@ subroutine FEM_quadrature_init FEM_quadrature_weights(3,5)%p(53:56) = 0.0366291366405108_pReal allocate(FEM_quadrature_points (3,5)%p(168)) - FEM_quadrature_points (3,5)%p(1:12) = permutationStar31([0.0149520651530592_pReal]) FEM_quadrature_points (3,5)%p(13:48) = permutationStar211([0.0340960211962615_pReal, 0.1518319491659370_pReal]) FEM_quadrature_points (3,5)%p(49:84) = permutationStar211([0.0462051504150017_pReal, 0.3549340560639790_pReal]) @@ -377,4 +369,4 @@ pure function permutationStar1111(point) result(qPt) end function permutationStar1111 -end module FEM_quadrature \ No newline at end of file +end module FEM_quadrature From 000007ba596390ac52427e812805567897865cb5 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 21 Jul 2021 18:06:37 +0200 Subject: [PATCH 11/46] better test automatically --- src/mesh/FEM_quadrature.f90 | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index f99bc58b3..31d4acec0 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -39,7 +39,7 @@ contains !-------------------------------------------------------------------------------------------------- !> @brief initializes FEM interpolation data !-------------------------------------------------------------------------------------------------- -subroutine FEM_quadrature_init +subroutine FEM_quadrature_init() print'(/,a)', ' <<<+- FEM_quadrature init -+>>>'; flush(6) @@ -182,6 +182,8 @@ subroutine FEM_quadrature_init FEM_quadrature_points (3,5)%p(121:156)= permutationStar211([0.3523052600879940_pReal, 0.0992057202494530_pReal]) FEM_quadrature_points (3,5)%p(157:168)= permutationStar31([0.1344783347929940_pReal]) + call selfTest + end subroutine FEM_quadrature_init @@ -369,4 +371,21 @@ pure function permutationStar1111(point) result(qPt) end function permutationStar1111 + +!-------------------------------------------------------------------------------------------------- +!> @brief Check correctness of quadrature weights. +!-------------------------------------------------------------------------------------------------- +subroutine selfTest + + integer :: o, d + + + do d = lbound(FEM_quadrature_weights,1), ubound(FEM_quadrature_weights,1) + do o = lbound(FEM_quadrature_weights(d,:),1), ubound(FEM_quadrature_weights(d,:),1) + if (dNeq(sum(FEM_quadrature_weights(d,o)%p),1.0_pReal,5e-15_pReal)) error stop 'quadrature weights' + enddo + enddo + +end subroutine selfTest + end module FEM_quadrature From c56979e2ad7d1b08accc75081ee98fc3e4840668 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 21 Jul 2021 18:09:44 +0200 Subject: [PATCH 12/46] single source of truth --- src/mesh/FEM_quadrature.f90 | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index 31d4acec0..2498e3947 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -50,7 +50,7 @@ subroutine FEM_quadrature_init() ! 2D linear FEM_nQuadrature(2,1) = 1 - allocate(FEM_quadrature_weights(2,1)%p(1)) + allocate(FEM_quadrature_weights(2,1)%p(FEM_nQuadrature(2,1))) FEM_quadrature_weights(2,1)%p(1) = 1._pReal allocate(FEM_quadrature_points (2,1)%p(2)) @@ -60,7 +60,7 @@ subroutine FEM_quadrature_init() ! 2D quadratic FEM_nQuadrature(2,2) = 3 - allocate(FEM_quadrature_weights(2,2)%p(3)) + allocate(FEM_quadrature_weights(2,2)%p(FEM_nQuadrature(2,2))) FEM_quadrature_weights(2,2)%p(1:3) = 1._pReal/3._pReal allocate(FEM_quadrature_points (2,2)%p(6)) @@ -70,7 +70,7 @@ subroutine FEM_quadrature_init() ! 2D cubic FEM_nQuadrature(2,3) = 6 - allocate(FEM_quadrature_weights(2,3)%p(6)) + allocate(FEM_quadrature_weights(2,3)%p(FEM_nQuadrature(2,3))) FEM_quadrature_weights(2,3)%p(1:3) = 2.2338158967801147e-1_pReal FEM_quadrature_weights(2,3)%p(4:6) = 1.0995174365532187e-1_pReal @@ -82,7 +82,7 @@ subroutine FEM_quadrature_init() ! 2D quartic FEM_nQuadrature(2,4) = 12 - allocate(FEM_quadrature_weights(2,4)%p(12)) + allocate(FEM_quadrature_weights(2,4)%p(FEM_nQuadrature(2,4))) FEM_quadrature_weights(2,4)%p(1:3) = 1.1678627572637937e-1_pReal FEM_quadrature_weights(2,4)%p(4:6) = 5.0844906370206817e-2_pReal FEM_quadrature_weights(2,4)%p(7:12) = 8.285107561837358e-2_pReal @@ -96,7 +96,7 @@ subroutine FEM_quadrature_init() ! 2D quintic FEM_nQuadrature(2,5) = 16 - allocate(FEM_quadrature_weights(2,5)%p(16)) + allocate(FEM_quadrature_weights(2,5)%p(FEM_nQuadrature(2,5))) FEM_quadrature_weights(2,5)%p(1 ) = 1.4431560767778717e-1_pReal FEM_quadrature_weights(2,5)%p(2:4) = 9.509163426728463e-2_pReal FEM_quadrature_weights(2,5)%p(5:7) = 1.0321737053471825e-1_pReal @@ -114,7 +114,7 @@ subroutine FEM_quadrature_init() ! 3D linear FEM_nQuadrature(3,1) = 1 - allocate(FEM_quadrature_weights(3,1)%p(1)) + allocate(FEM_quadrature_weights(3,1)%p(FEM_nQuadrature(3,1))) FEM_quadrature_weights(3,1)%p(1) = 1.0_pReal allocate(FEM_quadrature_points (3,1)%p(3)) @@ -124,7 +124,7 @@ subroutine FEM_quadrature_init() ! 3D quadratic FEM_nQuadrature(3,2) = 4 - allocate(FEM_quadrature_weights(3,2)%p(4)) + allocate(FEM_quadrature_weights(3,2)%p(FEM_nQuadrature(3,2))) FEM_quadrature_weights(3,2)%p(1:4) = 0.25_pReal allocate(FEM_quadrature_points (3,2)%p(12)) @@ -134,7 +134,7 @@ subroutine FEM_quadrature_init() ! 3D cubic FEM_nQuadrature(3,3) = 14 - allocate(FEM_quadrature_weights(3,3)%p(14)) + allocate(FEM_quadrature_weights(3,3)%p(FEM_nQuadrature(3,3))) FEM_quadrature_weights(3,3)%p(5:8) = 1.1268792571801585e-1_pReal FEM_quadrature_weights(3,3)%p(1:4) = 7.3493043116361949e-2_pReal FEM_quadrature_weights(3,3)%p(9:14) = 4.2546020777081467e-2_pReal @@ -148,7 +148,7 @@ subroutine FEM_quadrature_init() ! 3D quartic FEM_nQuadrature(3,4) = 35 - allocate(FEM_quadrature_weights(3,4)%p(35)) + allocate(FEM_quadrature_weights(3,4)%p(FEM_nQuadrature(3,4))) FEM_quadrature_weights(3,4)%p(1:4) = 0.0021900463965388_pReal FEM_quadrature_weights(3,4)%p(5:16) = 0.0143395670177665_pReal FEM_quadrature_weights(3,4)%p(17:22) = 0.0250305395686746_pReal @@ -166,7 +166,7 @@ subroutine FEM_quadrature_init() ! 3D quintic FEM_nQuadrature(3,5) = 56 - allocate(FEM_quadrature_weights(3,5)%p(56)) + allocate(FEM_quadrature_weights(3,5)%p(FEM_nQuadrature(3,5))) FEM_quadrature_weights(3,5)%p(1:4) = 0.0010373112336140_pReal FEM_quadrature_weights(3,5)%p(5:16) = 0.0096016645399480_pReal FEM_quadrature_weights(3,5)%p(17:28) = 0.0164493976798232_pReal From 5a04a1d661a384c8469f9b22bc3f03e9b5a40f15 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 21 Jul 2021 18:59:34 +0200 Subject: [PATCH 13/46] let the computer do the counting --- src/mesh/FEM_quadrature.f90 | 104 +++++++++++++++++------------------- 1 file changed, 50 insertions(+), 54 deletions(-) diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index 2498e3947..e76e9849f 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -9,7 +9,7 @@ module FEM_quadrature private integer, parameter :: & - maxOrder = 5 !< current max interpolation set at cubic (intended to be arbitrary) + maxOrder = 5 !< maximum integration order real(pReal), dimension(2,3), parameter :: & triangle = reshape([-1.0_pReal, -1.0_pReal, & 1.0_pReal, -1.0_pReal, & @@ -21,7 +21,7 @@ module FEM_quadrature -1.0_pReal, -1.0_pReal, 1.0_pReal], shape=[3,4]) type :: group_float !< variable length datatype used for storage of state - real(pReal), dimension(:), pointer :: p + real(pReal), dimension(:), allocatable :: p end type group_float integer, dimension(2:3,maxOrder), public, protected :: & @@ -53,8 +53,7 @@ subroutine FEM_quadrature_init() allocate(FEM_quadrature_weights(2,1)%p(FEM_nQuadrature(2,1))) FEM_quadrature_weights(2,1)%p(1) = 1._pReal - allocate(FEM_quadrature_points (2,1)%p(2)) - FEM_quadrature_points (2,1)%p(1:2) = permutationStar3([1._pReal/3._pReal]) + FEM_quadrature_points (2,1)%p = permutationStar3([1._pReal/3._pReal]) !-------------------------------------------------------------------------------------------------- ! 2D quadratic @@ -63,8 +62,7 @@ subroutine FEM_quadrature_init() allocate(FEM_quadrature_weights(2,2)%p(FEM_nQuadrature(2,2))) FEM_quadrature_weights(2,2)%p(1:3) = 1._pReal/3._pReal - allocate(FEM_quadrature_points (2,2)%p(6)) - FEM_quadrature_points (2,2)%p(1:6) = permutationStar21([1._pReal/6._pReal]) + FEM_quadrature_points (2,2)%p = permutationStar21([1._pReal/6._pReal]) !-------------------------------------------------------------------------------------------------- ! 2D cubic @@ -74,9 +72,9 @@ subroutine FEM_quadrature_init() FEM_quadrature_weights(2,3)%p(1:3) = 2.2338158967801147e-1_pReal FEM_quadrature_weights(2,3)%p(4:6) = 1.0995174365532187e-1_pReal - allocate(FEM_quadrature_points (2,3)%p(12)) - FEM_quadrature_points (2,3)%p(1:6) = permutationStar21([4.4594849091596489e-1_pReal]) - FEM_quadrature_points (2,3)%p(7:12)= permutationStar21([9.157621350977074e-2_pReal]) + FEM_quadrature_points (2,3)%p = [ & + permutationStar21([4.4594849091596489e-1_pReal]), & + permutationStar21([9.157621350977074e-2_pReal]) ] !-------------------------------------------------------------------------------------------------- ! 2D quartic @@ -87,10 +85,10 @@ subroutine FEM_quadrature_init() FEM_quadrature_weights(2,4)%p(4:6) = 5.0844906370206817e-2_pReal FEM_quadrature_weights(2,4)%p(7:12) = 8.285107561837358e-2_pReal - allocate(FEM_quadrature_points (2,4)%p(24)) - FEM_quadrature_points (2,4)%p(1:6) = permutationStar21([2.4928674517091042e-1_pReal]) - FEM_quadrature_points (2,4)%p(7:12) = permutationStar21([6.308901449150223e-2_pReal]) - FEM_quadrature_points (2,4)%p(13:24)= permutationStar111([3.1035245103378440e-1_pReal, 5.3145049844816947e-2_pReal]) + FEM_quadrature_points (2,4)%p = [ & + permutationStar21([2.4928674517091042e-1_pReal]), & + permutationStar21([6.308901449150223e-2_pReal]), & + permutationStar111([3.1035245103378440e-1_pReal, 5.3145049844816947e-2_pReal]) ] !-------------------------------------------------------------------------------------------------- ! 2D quintic @@ -103,22 +101,21 @@ subroutine FEM_quadrature_init() FEM_quadrature_weights(2,5)%p(8:10) = 3.2458497623198080e-2_pReal FEM_quadrature_weights(2,5)%p(11:16)= 2.7230314174434994e-2_pReal - allocate(FEM_quadrature_points (2,5)%p(32)) - FEM_quadrature_points (2,5)%p(1:2) = permutationStar3([1._pReal/3._pReal]) - FEM_quadrature_points (2,5)%p(3:8) = permutationStar21([4.5929258829272316e-1_pReal]) - FEM_quadrature_points (2,5)%p(9:14) = permutationStar21([1.705693077517602e-1_pReal]) - FEM_quadrature_points (2,5)%p(15:20)= permutationStar21([5.0547228317030975e-2_pReal]) - FEM_quadrature_points (2,5)%p(21:32)= permutationStar111([2.631128296346381e-1_pReal, 8.3947774099576053e-2_pReal]) + FEM_quadrature_points (2,5)%p = [ & + permutationStar3([1._pReal/3._pReal]), & + permutationStar21([4.5929258829272316e-1_pReal]), & + permutationStar21([1.705693077517602e-1_pReal]), & + permutationStar21([5.0547228317030975e-2_pReal]), & + permutationStar111([2.631128296346381e-1_pReal, 8.3947774099576053e-2_pReal]) ] !-------------------------------------------------------------------------------------------------- ! 3D linear FEM_nQuadrature(3,1) = 1 allocate(FEM_quadrature_weights(3,1)%p(FEM_nQuadrature(3,1))) - FEM_quadrature_weights(3,1)%p(1) = 1.0_pReal + FEM_quadrature_weights(3,1)%p(1) = 1.0_pReal - allocate(FEM_quadrature_points (3,1)%p(3)) - FEM_quadrature_points (3,1)%p(1:3)= permutationStar4([0.25_pReal]) + FEM_quadrature_points (3,1)%p = permutationStar4([0.25_pReal]) !-------------------------------------------------------------------------------------------------- ! 3D quadratic @@ -127,60 +124,59 @@ subroutine FEM_quadrature_init() allocate(FEM_quadrature_weights(3,2)%p(FEM_nQuadrature(3,2))) FEM_quadrature_weights(3,2)%p(1:4) = 0.25_pReal - allocate(FEM_quadrature_points (3,2)%p(12)) - FEM_quadrature_points (3,2)%p(1:12)= permutationStar31([0.1381966011250105_pReal]) + FEM_quadrature_points (3,2)%p = permutationStar31([0.1381966011250105_pReal]) !-------------------------------------------------------------------------------------------------- ! 3D cubic FEM_nQuadrature(3,3) = 14 allocate(FEM_quadrature_weights(3,3)%p(FEM_nQuadrature(3,3))) - FEM_quadrature_weights(3,3)%p(5:8) = 1.1268792571801585e-1_pReal FEM_quadrature_weights(3,3)%p(1:4) = 7.3493043116361949e-2_pReal + FEM_quadrature_weights(3,3)%p(5:8) = 1.1268792571801585e-1_pReal FEM_quadrature_weights(3,3)%p(9:14) = 4.2546020777081467e-2_pReal - allocate(FEM_quadrature_points (3,3)%p(42)) - FEM_quadrature_points (3,3)%p(1:12) = permutationStar31([9.273525031089123e-2_pReal]) - FEM_quadrature_points (3,3)%p(13:24)= permutationStar31([3.108859192633006e-1_pReal]) - FEM_quadrature_points (3,3)%p(25:42)= permutationStar22([4.5503704125649649e-2_pReal]) + FEM_quadrature_points (3,3)%p = [ & + permutationStar31([9.273525031089123e-2_pReal]), & + permutationStar31([3.108859192633006e-1_pReal]), & + permutationStar22([4.5503704125649649e-2_pReal]) ] !-------------------------------------------------------------------------------------------------- ! 3D quartic FEM_nQuadrature(3,4) = 35 allocate(FEM_quadrature_weights(3,4)%p(FEM_nQuadrature(3,4))) - FEM_quadrature_weights(3,4)%p(1:4) = 0.0021900463965388_pReal - FEM_quadrature_weights(3,4)%p(5:16) = 0.0143395670177665_pReal - FEM_quadrature_weights(3,4)%p(17:22) = 0.0250305395686746_pReal - FEM_quadrature_weights(3,4)%p(23:34) = 0.0479839333057554_pReal - FEM_quadrature_weights(3,4)%p(35) = 0.0931745731195340_pReal + FEM_quadrature_weights(3,4)%p(1:4) = 0.0021900463965388_pReal + FEM_quadrature_weights(3,4)%p(5:16) = 0.0143395670177665_pReal + FEM_quadrature_weights(3,4)%p(17:22) = 0.0250305395686746_pReal + FEM_quadrature_weights(3,4)%p(23:34) = 0.0479839333057554_pReal + FEM_quadrature_weights(3,4)%p(35) = 0.0931745731195340_pReal - allocate(FEM_quadrature_points (3,4)%p(105)) - FEM_quadrature_points (3,4)%p(1:12) = permutationStar31([0.0267367755543735_pReal]) - FEM_quadrature_points (3,4)%p(13:48) = permutationStar211([0.0391022406356488_pReal, 0.7477598884818090_pReal]) - FEM_quadrature_points (3,4)%p(49:66) = permutationStar22([0.4547545999844830_pReal]) - FEM_quadrature_points (3,4)%p(67:102) = permutationStar211([0.2232010379623150_pReal, 0.0504792790607720_pReal]) - FEM_quadrature_points (3,4)%p(103:105)= permutationStar4([0.25_pReal]) + FEM_quadrature_points (3,4)%p = [ & + permutationStar31([0.0267367755543735_pReal]), & + permutationStar211([0.0391022406356488_pReal, 0.7477598884818090_pReal]), & + permutationStar22([0.4547545999844830_pReal]), & + permutationStar211([0.2232010379623150_pReal, 0.0504792790607720_pReal]), & + permutationStar4([0.25_pReal]) ] !-------------------------------------------------------------------------------------------------- ! 3D quintic FEM_nQuadrature(3,5) = 56 allocate(FEM_quadrature_weights(3,5)%p(FEM_nQuadrature(3,5))) - FEM_quadrature_weights(3,5)%p(1:4) = 0.0010373112336140_pReal - FEM_quadrature_weights(3,5)%p(5:16) = 0.0096016645399480_pReal - FEM_quadrature_weights(3,5)%p(17:28) = 0.0164493976798232_pReal - FEM_quadrature_weights(3,5)%p(29:40) = 0.0153747766513310_pReal - FEM_quadrature_weights(3,5)%p(41:52) = 0.0293520118375230_pReal - FEM_quadrature_weights(3,5)%p(53:56) = 0.0366291366405108_pReal + FEM_quadrature_weights(3,5)%p(1:4) = 0.0010373112336140_pReal + FEM_quadrature_weights(3,5)%p(5:16) = 0.0096016645399480_pReal + FEM_quadrature_weights(3,5)%p(17:28) = 0.0164493976798232_pReal + FEM_quadrature_weights(3,5)%p(29:40) = 0.0153747766513310_pReal + FEM_quadrature_weights(3,5)%p(41:52) = 0.0293520118375230_pReal + FEM_quadrature_weights(3,5)%p(53:56) = 0.0366291366405108_pReal - allocate(FEM_quadrature_points (3,5)%p(168)) - FEM_quadrature_points (3,5)%p(1:12) = permutationStar31([0.0149520651530592_pReal]) - FEM_quadrature_points (3,5)%p(13:48) = permutationStar211([0.0340960211962615_pReal, 0.1518319491659370_pReal]) - FEM_quadrature_points (3,5)%p(49:84) = permutationStar211([0.0462051504150017_pReal, 0.3549340560639790_pReal]) - FEM_quadrature_points (3,5)%p(85:120) = permutationStar211([0.2281904610687610_pReal, 0.0055147549744775_pReal]) - FEM_quadrature_points (3,5)%p(121:156)= permutationStar211([0.3523052600879940_pReal, 0.0992057202494530_pReal]) - FEM_quadrature_points (3,5)%p(157:168)= permutationStar31([0.1344783347929940_pReal]) + FEM_quadrature_points (3,5)%p = [ & + permutationStar31([0.0149520651530592_pReal]), & + permutationStar211([0.0340960211962615_pReal, 0.1518319491659370_pReal]), & + permutationStar211([0.0462051504150017_pReal, 0.3549340560639790_pReal]), & + permutationStar211([0.2281904610687610_pReal, 0.0055147549744775_pReal]), & + permutationStar211([0.3523052600879940_pReal, 0.0992057202494530_pReal]), & + permutationStar31([0.1344783347929940_pReal]) ] call selfTest @@ -218,7 +214,7 @@ pure function permutationStar21(point) result(qPt) temp(:,2) = [point(1), 1.0_pReal - 2.0_pReal*point(1), point(1)] temp(:,3) = [1.0_pReal - 2.0_pReal*point(1), point(1), point(1)] - qPt = reshape(matmul(triangle, temp),[6]) + qPt = reshape(matmul(triangle, temp),[6]) end function permutationStar21 From 23077fd58c13f8f584a8e8ff30b6b5fa212ab1ce Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 21 Jul 2021 19:42:53 +0200 Subject: [PATCH 14/46] testing coordinates I don't understand why this pattern exists (with w(2) = 3, w(3) = 2), but it exists --- src/mesh/FEM_quadrature.f90 | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index e76e9849f..53aadbe6f 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -373,12 +373,21 @@ end function permutationStar1111 !-------------------------------------------------------------------------------------------------- subroutine selfTest - integer :: o, d - + integer :: o, d, n + real(pReal), dimension(2:3), parameter :: w = [3.0_pReal,2.0_pReal] do d = lbound(FEM_quadrature_weights,1), ubound(FEM_quadrature_weights,1) do o = lbound(FEM_quadrature_weights(d,:),1), ubound(FEM_quadrature_weights(d,:),1) - if (dNeq(sum(FEM_quadrature_weights(d,o)%p),1.0_pReal,5e-15_pReal)) error stop 'quadrature weights' + if (dNeq(sum(FEM_quadrature_weights(d,o)%p),1.0_pReal,5e-15_pReal)) & + error stop 'quadrature weights' + enddo + enddo + + do d = lbound(FEM_quadrature_points,1), ubound(FEM_quadrature_points,1) + do o = lbound(FEM_quadrature_points(d,:),1), ubound(FEM_quadrature_points(d,:),1) + n = size(FEM_quadrature_points(d,o)%p,1)/d + if (any(dNeq(sum(reshape(FEM_quadrature_points(d,o)%p,[d,n]),2),-real(n,pReal)/w(d),1.e-14_pReal))) & + error stop 'quadrature points' enddo enddo From b817c620a371e7dcb32b9172b756a5bd59e83879 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 21 Jul 2021 20:35:42 +0200 Subject: [PATCH 15/46] let the computer count --- src/mesh/FEM_quadrature.f90 | 147 ++++++++++++++++++++---------------- 1 file changed, 82 insertions(+), 65 deletions(-) diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index 53aadbe6f..278bfb5db 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -51,7 +51,7 @@ subroutine FEM_quadrature_init() FEM_nQuadrature(2,1) = 1 allocate(FEM_quadrature_weights(2,1)%p(FEM_nQuadrature(2,1))) - FEM_quadrature_weights(2,1)%p(1) = 1._pReal + FEM_quadrature_weights(2,1)%p(1) = 1._pReal FEM_quadrature_points (2,1)%p = permutationStar3([1._pReal/3._pReal]) @@ -95,11 +95,11 @@ subroutine FEM_quadrature_init() FEM_nQuadrature(2,5) = 16 allocate(FEM_quadrature_weights(2,5)%p(FEM_nQuadrature(2,5))) - FEM_quadrature_weights(2,5)%p(1 ) = 1.4431560767778717e-1_pReal - FEM_quadrature_weights(2,5)%p(2:4) = 9.509163426728463e-2_pReal - FEM_quadrature_weights(2,5)%p(5:7) = 1.0321737053471825e-1_pReal - FEM_quadrature_weights(2,5)%p(8:10) = 3.2458497623198080e-2_pReal - FEM_quadrature_weights(2,5)%p(11:16)= 2.7230314174434994e-2_pReal + FEM_quadrature_weights(2,5)%p(1:1) = 1.4431560767778717e-1_pReal + FEM_quadrature_weights(2,5)%p(2:4) = 9.509163426728463e-2_pReal + FEM_quadrature_weights(2,5)%p(5:7) = 1.0321737053471825e-1_pReal + FEM_quadrature_weights(2,5)%p(8:10) = 3.2458497623198080e-2_pReal + FEM_quadrature_weights(2,5)%p(11:16) = 2.7230314174434994e-2_pReal FEM_quadrature_points (2,5)%p = [ & permutationStar3([1._pReal/3._pReal]), & @@ -193,7 +193,9 @@ pure function permutationStar3(point) result(qPt) real(pReal), dimension(3,1) :: temp - temp(:,1) = [point(1), point(1), point(1)] + + temp = reshape([ & + point(1), point(1), point(1)],shape(temp)) qPt = reshape(matmul(triangle, temp),[2]) @@ -210,9 +212,11 @@ pure function permutationStar21(point) result(qPt) real(pReal), dimension(3,3) :: temp - temp(:,1) = [point(1), point(1), 1.0_pReal - 2.0_pReal*point(1)] - temp(:,2) = [point(1), 1.0_pReal - 2.0_pReal*point(1), point(1)] - temp(:,3) = [1.0_pReal - 2.0_pReal*point(1), point(1), point(1)] + + temp = reshape([ & + point(1), point(1), 1.0_pReal - 2.0_pReal*point(1), & + point(1), 1.0_pReal - 2.0_pReal*point(1), point(1), & + 1.0_pReal - 2.0_pReal*point(1), point(1), point(1)],shape(temp)) qPt = reshape(matmul(triangle, temp),[6]) @@ -229,12 +233,14 @@ pure function permutationStar111(point) result(qPt) real(pReal), dimension(3,6) :: temp - temp(:,1) = [point(1), point(2), 1.0_pReal - point(1) - point(2)] - temp(:,2) = [point(1), 1.0_pReal - point(1) - point(2), point(2)] - temp(:,3) = [point(2), point(1), 1.0_pReal - point(1) - point(2)] - temp(:,4) = [point(2), 1.0_pReal - point(1) - point(2), point(1)] - temp(:,5) = [1.0_pReal - point(1) - point(2), point(2), point(1)] - temp(:,6) = [1.0_pReal - point(1) - point(2), point(1), point(2)] + + temp = reshape([ & + point(1), point(2), 1.0_pReal - point(1) - point(2), & + point(1), 1.0_pReal - point(1) - point(2), point(2), & + point(2), point(1), 1.0_pReal - point(1) - point(2), & + point(2), 1.0_pReal - point(1) - point(2), point(1), & + 1.0_pReal - point(1) - point(2), point(2), point(1), & + 1.0_pReal - point(1) - point(2), point(1), point(2)],shape(temp)) qPt = reshape(matmul(triangle, temp),[12]) @@ -251,7 +257,9 @@ pure function permutationStar4(point) result(qPt) real(pReal), dimension(4,1) :: temp - temp(:,1) = [point(1), point(1), point(1), point(1)] + + temp = reshape([ & + point(1), point(1), point(1), point(1)],shape(temp)) qPt = reshape(matmul(tetrahedron, temp),[3]) @@ -268,10 +276,12 @@ pure function permutationStar31(point) result(qPt) real(pReal), dimension(4,4) :: temp - temp(:,1) = [point(1), point(1), point(1), 1.0_pReal - 3.0_pReal*point(1)] - temp(:,2) = [point(1), point(1), 1.0_pReal - 3.0_pReal*point(1), point(1)] - temp(:,3) = [point(1), 1.0_pReal - 3.0_pReal*point(1), point(1), point(1)] - temp(:,4) = [1.0_pReal - 3.0_pReal*point(1), point(1), point(1), point(1)] + + temp = reshape([ & + point(1), point(1), point(1), 1.0_pReal - 3.0_pReal*point(1), & + point(1), point(1), 1.0_pReal - 3.0_pReal*point(1), point(1), & + point(1), 1.0_pReal - 3.0_pReal*point(1), point(1), point(1), & + 1.0_pReal - 3.0_pReal*point(1), point(1), point(1), point(1)],shape(temp)) qPt = reshape(matmul(tetrahedron, temp),[12]) @@ -281,19 +291,21 @@ end function permutationStar31 !-------------------------------------------------------------------------------------------------- !> @brief star 22 permutation of input !-------------------------------------------------------------------------------------------------- -pure function permutationStar22(point) result(qPt) +function permutationStar22(point) result(qPt) real(pReal), dimension(18) :: qPt real(pReal), dimension(1), intent(in) :: point real(pReal), dimension(4,6) :: temp - temp(:,1) = [point(1), point(1), 0.5_pReal - point(1), 0.5_pReal - point(1)] - temp(:,2) = [point(1), 0.5_pReal - point(1), point(1), 0.5_pReal - point(1)] - temp(:,3) = [0.5_pReal - point(1), point(1), point(1), 0.5_pReal - point(1)] - temp(:,4) = [0.5_pReal - point(1), point(1), 0.5_pReal - point(1), point(1)] - temp(:,5) = [0.5_pReal - point(1), 0.5_pReal - point(1), point(1), point(1)] - temp(:,6) = [point(1), 0.5_pReal - point(1), 0.5_pReal - point(1), point(1)] + + temp = reshape([ & + point(1), point(1), 0.5_pReal - point(1), 0.5_pReal - point(1), & + point(1), 0.5_pReal - point(1), point(1), 0.5_pReal - point(1), & + 0.5_pReal - point(1), point(1), point(1), 0.5_pReal - point(1), & + 0.5_pReal - point(1), point(1), 0.5_pReal - point(1), point(1), & + 0.5_pReal - point(1), 0.5_pReal - point(1), point(1), point(1), & + point(1), 0.5_pReal - point(1), 0.5_pReal - point(1), point(1)],shape(temp)) qPt = reshape(matmul(tetrahedron, temp),[18]) @@ -310,18 +322,20 @@ pure function permutationStar211(point) result(qPt) real(pReal), dimension(4,12) :: temp - temp(:,1 ) = [point(1), point(1), point(2), 1.0_pReal - 2.0_pReal*point(1) - point(2)] - temp(:,2 ) = [point(1), point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(2)] - temp(:,3 ) = [point(1), point(2), point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2)] - temp(:,4 ) = [point(1), point(2), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1)] - temp(:,5 ) = [point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), point(2)] - temp(:,6 ) = [point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(2), point(1)] - temp(:,7 ) = [point(2), point(1), point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2)] - temp(:,8 ) = [point(2), point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1)] - temp(:,9 ) = [point(2), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), point(1)] - temp(:,10) = [1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), point(1), point(2)] - temp(:,11) = [1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), point(2), point(1)] - temp(:,12) = [1.0_pReal - 2.0_pReal*point(1) - point(2), point(2), point(1), point(1)] + + temp = reshape([ & + point(1), point(1), point(2), 1.0_pReal - 2.0_pReal*point(1) - point(2), & + point(1), point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(2), & + point(1), point(2), point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), & + point(1), point(2), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), & + point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), point(2), & + point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(2), point(1), & + point(2), point(1), point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), & + point(2), point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), & + point(2), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), point(1), & + 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), point(1), point(2), & + 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), point(2), point(1), & + 1.0_pReal - 2.0_pReal*point(1) - point(2), point(2), point(1), point(1)],shape(temp)) qPt = reshape(matmul(tetrahedron, temp),[36]) @@ -338,30 +352,32 @@ pure function permutationStar1111(point) result(qPt) real(pReal), dimension(4,24) :: temp - temp(:,1 ) = [point(1), point(2), point(3), 1.0_pReal - point(1) - point(2)- point(3)] - temp(:,2 ) = [point(1), point(2), 1.0_pReal - point(1) - point(2)- point(3), point(3)] - temp(:,3 ) = [point(1), point(3), point(2), 1.0_pReal - point(1) - point(2)- point(3)] - temp(:,4 ) = [point(1), point(3), 1.0_pReal - point(1) - point(2)- point(3), point(2)] - temp(:,5 ) = [point(1), 1.0_pReal - point(1) - point(2)- point(3), point(2), point(3)] - temp(:,6 ) = [point(1), 1.0_pReal - point(1) - point(2)- point(3), point(3), point(2)] - temp(:,7 ) = [point(2), point(1), point(3), 1.0_pReal - point(1) - point(2)- point(3)] - temp(:,8 ) = [point(2), point(1), 1.0_pReal - point(1) - point(2)- point(3), point(3)] - temp(:,9 ) = [point(2), point(3), point(1), 1.0_pReal - point(1) - point(2)- point(3)] - temp(:,10) = [point(2), point(3), 1.0_pReal - point(1) - point(2)- point(3), point(1)] - temp(:,11) = [point(2), 1.0_pReal - point(1) - point(2)- point(3), point(1), point(3)] - temp(:,12) = [point(2), 1.0_pReal - point(1) - point(2)- point(3), point(3), point(1)] - temp(:,13) = [point(3), point(1), point(2), 1.0_pReal - point(1) - point(2)- point(3)] - temp(:,14) = [point(3), point(1), 1.0_pReal - point(1) - point(2)- point(3), point(2)] - temp(:,15) = [point(3), point(2), point(1), 1.0_pReal - point(1) - point(2)- point(3)] - temp(:,16) = [point(3), point(2), 1.0_pReal - point(1) - point(2)- point(3), point(1)] - temp(:,17) = [point(3), 1.0_pReal - point(1) - point(2)- point(3), point(1), point(2)] - temp(:,18) = [point(3), 1.0_pReal - point(1) - point(2)- point(3), point(2), point(1)] - temp(:,19) = [1.0_pReal - point(1) - point(2)- point(3), point(1), point(2), point(3)] - temp(:,20) = [1.0_pReal - point(1) - point(2)- point(3), point(1), point(3), point(2)] - temp(:,21) = [1.0_pReal - point(1) - point(2)- point(3), point(2), point(1), point(3)] - temp(:,22) = [1.0_pReal - point(1) - point(2)- point(3), point(2), point(3), point(1)] - temp(:,23) = [1.0_pReal - point(1) - point(2)- point(3), point(3), point(1), point(2)] - temp(:,24) = [1.0_pReal - point(1) - point(2)- point(3), point(3), point(2), point(1)] + + temp = reshape([ & + point(1), point(2), point(3), 1.0_pReal - point(1) - point(2)- point(3), & + point(1), point(2), 1.0_pReal - point(1) - point(2)- point(3), point(3), & + point(1), point(3), point(2), 1.0_pReal - point(1) - point(2)- point(3), & + point(1), point(3), 1.0_pReal - point(1) - point(2)- point(3), point(2), & + point(1), 1.0_pReal - point(1) - point(2)- point(3), point(2), point(3), & + point(1), 1.0_pReal - point(1) - point(2)- point(3), point(3), point(2), & + point(2), point(1), point(3), 1.0_pReal - point(1) - point(2)- point(3), & + point(2), point(1), 1.0_pReal - point(1) - point(2)- point(3), point(3), & + point(2), point(3), point(1), 1.0_pReal - point(1) - point(2)- point(3), & + point(2), point(3), 1.0_pReal - point(1) - point(2)- point(3), point(1), & + point(2), 1.0_pReal - point(1) - point(2)- point(3), point(1), point(3), & + point(2), 1.0_pReal - point(1) - point(2)- point(3), point(3), point(1), & + point(3), point(1), point(2), 1.0_pReal - point(1) - point(2)- point(3), & + point(3), point(1), 1.0_pReal - point(1) - point(2)- point(3), point(2), & + point(3), point(2), point(1), 1.0_pReal - point(1) - point(2)- point(3), & + point(3), point(2), 1.0_pReal - point(1) - point(2)- point(3), point(1), & + point(3), 1.0_pReal - point(1) - point(2)- point(3), point(1), point(2), & + point(3), 1.0_pReal - point(1) - point(2)- point(3), point(2), point(1), & + 1.0_pReal - point(1) - point(2)- point(3), point(1), point(2), point(3), & + 1.0_pReal - point(1) - point(2)- point(3), point(1), point(3), point(2), & + 1.0_pReal - point(1) - point(2)- point(3), point(2), point(1), point(3), & + 1.0_pReal - point(1) - point(2)- point(3), point(2), point(3), point(1), & + 1.0_pReal - point(1) - point(2)- point(3), point(3), point(1), point(2), & + 1.0_pReal - point(1) - point(2)- point(3), point(3), point(2), point(1)],shape(temp)) qPt = reshape(matmul(tetrahedron, temp),[72]) @@ -369,13 +385,14 @@ end function permutationStar1111 !-------------------------------------------------------------------------------------------------- -!> @brief Check correctness of quadrature weights. +!> @brief Check correctness of quadrature weights and points. !-------------------------------------------------------------------------------------------------- subroutine selfTest integer :: o, d, n real(pReal), dimension(2:3), parameter :: w = [3.0_pReal,2.0_pReal] + do d = lbound(FEM_quadrature_weights,1), ubound(FEM_quadrature_weights,1) do o = lbound(FEM_quadrature_weights(d,:),1), ubound(FEM_quadrature_weights(d,:),1) if (dNeq(sum(FEM_quadrature_weights(d,o)%p),1.0_pReal,5e-15_pReal)) & From 58a79219666525ae8be6d86051e190da983f3573 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 21 Jul 2021 22:45:04 +0200 Subject: [PATCH 16/46] no need for temp, pack instead of reshape for 1D array --- src/mesh/FEM_quadrature.f90 | 68 ++++++++++--------------------------- 1 file changed, 18 insertions(+), 50 deletions(-) diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index 278bfb5db..bf1f1567f 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -20,12 +20,12 @@ module FEM_quadrature -1.0_pReal, 1.0_pReal, -1.0_pReal, & -1.0_pReal, -1.0_pReal, 1.0_pReal], shape=[3,4]) - type :: group_float !< variable length datatype used for storage of state + type :: group_float !< variable length datatype real(pReal), dimension(:), allocatable :: p end type group_float integer, dimension(2:3,maxOrder), public, protected :: & - FEM_nQuadrature !< number of quadrature points for a given spatial dimension(2-3) and interpolation order(1-maxOrder) + FEM_nQuadrature !< number of quadrature points for spatial dimension(2-3) and interpolation order (1-maxOrder) type(group_float), dimension(2:3,maxOrder), public, protected :: & FEM_quadrature_weights, & !< quadrature weights for each quadrature rule FEM_quadrature_points !< quadrature point coordinates (in simplical system) for each quadrature rule @@ -191,13 +191,9 @@ pure function permutationStar3(point) result(qPt) real(pReal), dimension(2) :: qPt real(pReal), dimension(1), intent(in) :: point - real(pReal), dimension(3,1) :: temp - - temp = reshape([ & - point(1), point(1), point(1)],shape(temp)) - - qPt = reshape(matmul(triangle, temp),[2]) + qPt = pack(matmul(triangle,reshape([ & + point(1), point(1), point(1)],[3,1])),.true.) end function permutationStar3 @@ -210,15 +206,11 @@ pure function permutationStar21(point) result(qPt) real(pReal), dimension(6) :: qPt real(pReal), dimension(1), intent(in) :: point - real(pReal), dimension(3,3) :: temp - - temp = reshape([ & + qPt = pack(matmul(triangle,reshape([ & point(1), point(1), 1.0_pReal - 2.0_pReal*point(1), & point(1), 1.0_pReal - 2.0_pReal*point(1), point(1), & - 1.0_pReal - 2.0_pReal*point(1), point(1), point(1)],shape(temp)) - - qPt = reshape(matmul(triangle, temp),[6]) + 1.0_pReal - 2.0_pReal*point(1), point(1), point(1)],[3,3])),.true.) end function permutationStar21 @@ -231,18 +223,14 @@ pure function permutationStar111(point) result(qPt) real(pReal), dimension(12) :: qPt real(pReal), dimension(2), intent(in) :: point - real(pReal), dimension(3,6) :: temp - - temp = reshape([ & + qPt = pack(matmul(triangle,reshape([ & point(1), point(2), 1.0_pReal - point(1) - point(2), & point(1), 1.0_pReal - point(1) - point(2), point(2), & point(2), point(1), 1.0_pReal - point(1) - point(2), & point(2), 1.0_pReal - point(1) - point(2), point(1), & 1.0_pReal - point(1) - point(2), point(2), point(1), & - 1.0_pReal - point(1) - point(2), point(1), point(2)],shape(temp)) - - qPt = reshape(matmul(triangle, temp),[12]) + 1.0_pReal - point(1) - point(2), point(1), point(2)],[3,6])),.true.) end function permutationStar111 @@ -255,13 +243,9 @@ pure function permutationStar4(point) result(qPt) real(pReal), dimension(3) :: qPt real(pReal), dimension(1), intent(in) :: point - real(pReal), dimension(4,1) :: temp - - temp = reshape([ & - point(1), point(1), point(1), point(1)],shape(temp)) - - qPt = reshape(matmul(tetrahedron, temp),[3]) + qPt = pack(matmul(tetrahedron,reshape([ & + point(1), point(1), point(1), point(1)],[4,1])),.true.) end function permutationStar4 @@ -274,16 +258,12 @@ pure function permutationStar31(point) result(qPt) real(pReal), dimension(12) :: qPt real(pReal), dimension(1), intent(in) :: point - real(pReal), dimension(4,4) :: temp - - temp = reshape([ & + qPt = pack(matmul(tetrahedron,reshape([ & point(1), point(1), point(1), 1.0_pReal - 3.0_pReal*point(1), & point(1), point(1), 1.0_pReal - 3.0_pReal*point(1), point(1), & point(1), 1.0_pReal - 3.0_pReal*point(1), point(1), point(1), & - 1.0_pReal - 3.0_pReal*point(1), point(1), point(1), point(1)],shape(temp)) - - qPt = reshape(matmul(tetrahedron, temp),[12]) + 1.0_pReal - 3.0_pReal*point(1), point(1), point(1), point(1)],[4,4])),.true.) end function permutationStar31 @@ -296,18 +276,14 @@ function permutationStar22(point) result(qPt) real(pReal), dimension(18) :: qPt real(pReal), dimension(1), intent(in) :: point - real(pReal), dimension(4,6) :: temp - - temp = reshape([ & + qPt = pack(matmul(tetrahedron,reshape([ & point(1), point(1), 0.5_pReal - point(1), 0.5_pReal - point(1), & point(1), 0.5_pReal - point(1), point(1), 0.5_pReal - point(1), & 0.5_pReal - point(1), point(1), point(1), 0.5_pReal - point(1), & 0.5_pReal - point(1), point(1), 0.5_pReal - point(1), point(1), & 0.5_pReal - point(1), 0.5_pReal - point(1), point(1), point(1), & - point(1), 0.5_pReal - point(1), 0.5_pReal - point(1), point(1)],shape(temp)) - - qPt = reshape(matmul(tetrahedron, temp),[18]) + point(1), 0.5_pReal - point(1), 0.5_pReal - point(1), point(1)],[4,6])),.true.) end function permutationStar22 @@ -320,10 +296,8 @@ pure function permutationStar211(point) result(qPt) real(pReal), dimension(36) :: qPt real(pReal), dimension(2), intent(in) :: point - real(pReal), dimension(4,12) :: temp - - temp = reshape([ & + qPt = pack(matmul(tetrahedron,reshape([ & point(1), point(1), point(2), 1.0_pReal - 2.0_pReal*point(1) - point(2), & point(1), point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(2), & point(1), point(2), point(1), 1.0_pReal - 2.0_pReal*point(1) - point(2), & @@ -335,9 +309,7 @@ pure function permutationStar211(point) result(qPt) point(2), 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), point(1), & 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), point(1), point(2), & 1.0_pReal - 2.0_pReal*point(1) - point(2), point(1), point(2), point(1), & - 1.0_pReal - 2.0_pReal*point(1) - point(2), point(2), point(1), point(1)],shape(temp)) - - qPt = reshape(matmul(tetrahedron, temp),[36]) + 1.0_pReal - 2.0_pReal*point(1) - point(2), point(2), point(1), point(1)],[4,12])),.true.) end function permutationStar211 @@ -350,10 +322,8 @@ pure function permutationStar1111(point) result(qPt) real(pReal), dimension(72) :: qPt real(pReal), dimension(3), intent(in) :: point - real(pReal), dimension(4,24) :: temp - - temp = reshape([ & + qPt = pack(matmul(tetrahedron,reshape([ & point(1), point(2), point(3), 1.0_pReal - point(1) - point(2)- point(3), & point(1), point(2), 1.0_pReal - point(1) - point(2)- point(3), point(3), & point(1), point(3), point(2), 1.0_pReal - point(1) - point(2)- point(3), & @@ -377,9 +347,7 @@ pure function permutationStar1111(point) result(qPt) 1.0_pReal - point(1) - point(2)- point(3), point(2), point(1), point(3), & 1.0_pReal - point(1) - point(2)- point(3), point(2), point(3), point(1), & 1.0_pReal - point(1) - point(2)- point(3), point(3), point(1), point(2), & - 1.0_pReal - point(1) - point(2)- point(3), point(3), point(2), point(1)],shape(temp)) - - qPt = reshape(matmul(tetrahedron, temp),[72]) + 1.0_pReal - point(1) - point(2)- point(3), point(3), point(2), point(1)],[4,24])),.true.) end function permutationStar1111 From de7ef430958183843867ea2b42430f16919af16f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 21 Jul 2021 23:43:55 +0200 Subject: [PATCH 17/46] documenting/silencing gfortran --- src/mesh/FEM_quadrature.f90 | 6 +++--- src/mesh/discretization_mesh.f90 | 6 ++---- src/quit.f90 | 5 ++++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/mesh/FEM_quadrature.f90 b/src/mesh/FEM_quadrature.f90 index bf1f1567f..0c470ca6b 100644 --- a/src/mesh/FEM_quadrature.f90 +++ b/src/mesh/FEM_quadrature.f90 @@ -124,7 +124,7 @@ subroutine FEM_quadrature_init() allocate(FEM_quadrature_weights(3,2)%p(FEM_nQuadrature(3,2))) FEM_quadrature_weights(3,2)%p(1:4) = 0.25_pReal - FEM_quadrature_points (3,2)%p = permutationStar31([0.1381966011250105_pReal]) + FEM_quadrature_points (3,2)%p = permutationStar31([1.3819660112501052e-1_pReal]) !-------------------------------------------------------------------------------------------------- ! 3D cubic @@ -141,7 +141,7 @@ subroutine FEM_quadrature_init() permutationStar22([4.5503704125649649e-2_pReal]) ] !-------------------------------------------------------------------------------------------------- -! 3D quartic +! 3D quartic (lower precision/unknown source) FEM_nQuadrature(3,4) = 35 allocate(FEM_quadrature_weights(3,4)%p(FEM_nQuadrature(3,4))) @@ -159,7 +159,7 @@ subroutine FEM_quadrature_init() permutationStar4([0.25_pReal]) ] !-------------------------------------------------------------------------------------------------- -! 3D quintic +! 3D quintic (lower precision/unknown source) FEM_nQuadrature(3,5) = 56 allocate(FEM_quadrature_weights(3,5)%p(FEM_nQuadrature(3,5))) diff --git a/src/mesh/discretization_mesh.f90 b/src/mesh/discretization_mesh.f90 index 49eaf0e18..422f4ca85 100644 --- a/src/mesh/discretization_mesh.f90 +++ b/src/mesh/discretization_mesh.f90 @@ -71,16 +71,14 @@ subroutine discretization_mesh_init(restart) logical, intent(in) :: restart - integer, allocatable, dimension(:) :: chunkPos integer :: dimPlex, & mesh_Nnodes, & !< total number of nodes in mesh - j, l, & + j, & debug_element, debug_ip PetscSF :: sf DM :: globalMesh PetscInt :: nFaceSets PetscInt, pointer, dimension(:) :: pFaceSets - character(len=pStringLen), dimension(:), allocatable :: fileContent IS :: faceSetIS PetscErrorCode :: ierr integer, dimension(:), allocatable :: & @@ -88,7 +86,7 @@ subroutine discretization_mesh_init(restart) class(tNode), pointer :: & num_mesh integer :: integrationOrder !< order of quadrature rule required - type(tvec) :: coords_node0 + type(tvec) :: coords_node0 print'(/,a)', ' <<<+- discretization_mesh init -+>>>' diff --git a/src/quit.f90 b/src/quit.f90 index 786241d85..6361ff783 100644 --- a/src/quit.f90 +++ b/src/quit.f90 @@ -6,7 +6,10 @@ !-------------------------------------------------------------------------------------------------- subroutine quit(stop_id) #include - use PetscSys + use PETScSys +#if (PETSC_VERSION_MAJOR==3 && PETSC_VERSION_MINOR>14) && !defined(PETSC_HAVE_MPI_F90MODULE_VISIBILITY) + use MPI_f08 +#endif use HDF5 implicit none From 9767866c1e8d944483fb40857458dda05cb55fab Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 22 Jul 2021 07:24:36 +0200 Subject: [PATCH 18/46] cleaned+updated test --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 567067daf..96cf7af03 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 567067daf05866c8e022fc0af6f441840f143b81 +Subproject commit 96cf7af039b3153f91c037bcce62eb456af51f4b From 173a5f8e55e365a6f875096686953b6d8e1db717 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 22 Jul 2021 07:48:01 +0200 Subject: [PATCH 19/46] less public/unneeded variables --- src/mesh/DAMASK_mesh.f90 | 1 + src/mesh/FEM_utilities.f90 | 17 ++++------------- src/mesh/discretization_mesh.f90 | 10 +++++----- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/mesh/DAMASK_mesh.f90 b/src/mesh/DAMASK_mesh.f90 index 342dec5c0..2eb6a7d91 100644 --- a/src/mesh/DAMASK_mesh.f90 +++ b/src/mesh/DAMASK_mesh.f90 @@ -21,6 +21,7 @@ program DAMASK_mesh use mesh_mechanical_FEM implicit none + integer :: nActiveFields = 0 !-------------------------------------------------------------------------------------------------- ! variables related to information from load case and geom file diff --git a/src/mesh/FEM_utilities.f90 b/src/mesh/FEM_utilities.f90 index 5bb6d5f44..1c073dd69 100644 --- a/src/mesh/FEM_utilities.f90 +++ b/src/mesh/FEM_utilities.f90 @@ -23,14 +23,8 @@ module FEM_utilities implicit none private -!-------------------------------------------------------------------------------------------------- - logical, public :: cutBack = .false. !< cut back of BVP solver in case convergence is not achieved or a material point is terminally ill - integer, public, parameter :: maxFields = 6 - integer, public :: nActiveFields = 0 - -!-------------------------------------------------------------------------------------------------- -! grid related information information - real(pReal), public :: wgt !< weighting factor 1/Nelems + logical, public :: cutBack = .false. !< cut back of BVP solver in case convergence is not achieved or a material point is terminally ill + real(pReal), public, protected :: wgt !< weighting factor 1/Nelems !-------------------------------------------------------------------------------------------------- @@ -49,10 +43,6 @@ module FEM_utilities COMPONENT_MECH_Z_ID end enum -!-------------------------------------------------------------------------------------------------- -! variables controlling debugging - logical :: & - debugPETSc !< use some in debug defined options for more verbose PETSc solution !-------------------------------------------------------------------------------------------------- ! derived types @@ -109,8 +99,9 @@ subroutine FEM_utilities_init integer :: structOrder !< order of displacement shape functions character(len=*), parameter :: & PETSCDEBUG = ' -snes_view -snes_monitor ' - PetscErrorCode :: ierr + logical :: debugPETSc !< use some in debug defined options for more verbose PETSc solution + print'(/,a)', ' <<<+- FEM_utilities init -+>>>' diff --git a/src/mesh/discretization_mesh.f90 b/src/mesh/discretization_mesh.f90 index 422f4ca85..e5f989484 100644 --- a/src/mesh/discretization_mesh.f90 +++ b/src/mesh/discretization_mesh.f90 @@ -40,6 +40,11 @@ module discretization_mesh mesh_maxNips !< max number of IPs in any CP element !!!! BEGIN DEPRECATED !!!!! + DM, public :: geomMesh + + PetscInt, dimension(:), allocatable, public, protected :: & + mesh_boundaries + real(pReal), dimension(:,:), allocatable :: & mesh_ipVolume, & !< volume associated with IP (initially!) mesh_node0 !< node x,y,z coordinates (initially!) @@ -50,11 +55,6 @@ module discretization_mesh real(pReal), dimension(:,:,:), allocatable :: & mesh_ipCoordinates !< IP x,y,z coordinates (after deformation!) - DM, public :: geomMesh - - PetscInt, dimension(:), allocatable, public, protected :: & - mesh_boundaries - public :: & discretization_mesh_init, & mesh_FEM_build_ipVolumes, & From eb834b635dee5e301dcea4d0d8fef29e01a38b79 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 22 Jul 2021 07:58:34 +0200 Subject: [PATCH 20/46] unify notation with grid consistent style: Symbols, not descriptions. also removed untested/unused loginc functionality. Once load cases are written in YAML, we can introduce the scaling as in DAMASK_grid --- PRIVATE | 2 +- examples/mesh/tensionZ.load | 4 +-- src/mesh/DAMASK_mesh.f90 | 70 +++++++++++++++---------------------- src/mesh/FEM_utilities.f90 | 10 ------ 4 files changed, 32 insertions(+), 54 deletions(-) diff --git a/PRIVATE b/PRIVATE index 96cf7af03..d92b030e5 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 96cf7af039b3153f91c037bcce62eb456af51f4b +Subproject commit d92b030e5777e718c77edc2e1e93abfa0981b024 diff --git a/examples/mesh/tensionZ.load b/examples/mesh/tensionZ.load index eb9a7c426..b3588daef 100644 --- a/examples/mesh/tensionZ.load +++ b/examples/mesh/tensionZ.load @@ -1,11 +1,11 @@ #initial elastic step -$Loadcase 1 time 0.0005 incs 1 frequency 5 +$Loadcase 1 t 0.0005 N 1 f_out 5 Face 1 X 0.01 Face 2 X 0.0 Face 2 Y 0.0 Face 2 Z 0.0 $EndLoadcase -$Loadcase 2 time 10.0 incs 200 frequency 5 +$Loadcase 2 t 10.0 N 200 f_out 5 Face 1 X 0.01 Face 2 X 0.0 Face 2 Y 0.0 diff --git a/src/mesh/DAMASK_mesh.f90 b/src/mesh/DAMASK_mesh.f90 index 2eb6a7d91..d1568e87f 100644 --- a/src/mesh/DAMASK_mesh.f90 +++ b/src/mesh/DAMASK_mesh.f90 @@ -23,6 +23,15 @@ program DAMASK_mesh implicit none integer :: nActiveFields = 0 + type :: tLoadCase + real(pReal) :: time = 0.0_pReal !< length of increment + integer :: incs = 0, & !< number of increments + outputfrequency = 1 !< frequency of result writes + logical :: followFormerTrajectory = .true. !< follow trajectory of former loadcase + integer, allocatable, dimension(:) :: faceID + type(tFieldBC), allocatable, dimension(:) :: fieldBC + end type tLoadCase + !-------------------------------------------------------------------------------------------------- ! variables related to information from load case and geom file integer, allocatable, dimension(:) :: chunkPos ! this is longer than needed for geometry parsing @@ -104,8 +113,8 @@ program DAMASK_mesh chunkPos = IO_stringPos(line) do i = 1, chunkPos(1) ! reading compulsory parameters for loadcase - select case (IO_lc(IO_stringValue(line,chunkPos,i))) - case('$loadcase') + select case (IO_stringValue(line,chunkPos,i)) + case('$Loadcase') N_def = N_def + 1 end select enddo ! count all identifiers to allocate memory and do sanity check @@ -152,39 +161,36 @@ program DAMASK_mesh chunkPos = IO_stringPos(line) do i = 1, chunkPos(1) - select case (IO_lc(IO_stringValue(line,chunkPos,i))) + select case (IO_stringValue(line,chunkPos,i)) !-------------------------------------------------------------------------------------------------- ! loadcase information - case('$loadcase') + case('$Loadcase') currentLoadCase = IO_intValue(line,chunkPos,i+1) - case('face') + case('Face') currentFace = IO_intValue(line,chunkPos,i+1) currentFaceSet = -1 do faceSet = 1, mesh_Nboundaries if (mesh_boundaries(faceSet) == currentFace) currentFaceSet = faceSet enddo if (currentFaceSet < 0) call IO_error(error_ID = 837, ext_msg = 'invalid BC') - case('t','time','delta') ! increment time + case('t') loadCases(currentLoadCase)%time = IO_floatValue(line,chunkPos,i+1) - case('n','incs','increments','steps') ! number of increments + case('N') loadCases(currentLoadCase)%incs = IO_intValue(line,chunkPos,i+1) - case('logincs','logincrements','logsteps') ! number of increments (switch to log time scaling) - loadCases(currentLoadCase)%incs = IO_intValue(line,chunkPos,i+1) - loadCases(currentLoadCase)%logscale = 1 - case('freq','frequency','outputfreq') ! frequency of result writings + case('f_out') loadCases(currentLoadCase)%outputfrequency = IO_intValue(line,chunkPos,i+1) - case('guessreset','dropguessing') + case('estimate_rate') loadCases(currentLoadCase)%followFormerTrajectory = .false. ! do not continue to predict deformation along former trajectory !-------------------------------------------------------------------------------------------------- ! boundary condition information - case('x','y','z') - select case(IO_lc(IO_stringValue(line,chunkPos,i))) - case('x') + case('X','Y','Z') + select case(IO_stringValue(line,chunkPos,i)) + case('X') ID = COMPONENT_MECH_X_ID - case('y') + case('Y') ID = COMPONENT_MECH_Y_ID - case('z') + case('Z') ID = COMPONENT_MECH_Z_ID end select @@ -223,8 +229,8 @@ program DAMASK_mesh do component = 1, loadCases(currentLoadCase)%fieldBC(field)%nComponents if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask(faceSet)) & print'(a,i2,a,i2,a,f12.7)', ' Face ', mesh_boundaries(faceSet), & - ' Component ', component, & - ' Value ', loadCases(currentLoadCase)%fieldBC(field)% & + ' Component ', component, & + ' Value ', loadCases(currentLoadCase)%fieldBC(field)% & componentBC(component)%Value(faceSet) enddo enddo @@ -267,32 +273,14 @@ program DAMASK_mesh !-------------------------------------------------------------------------------------------------- ! forwarding time timeIncOld = timeinc ! last timeinc that brought former inc to an end - if (loadCases(currentLoadCase)%logscale == 0) then ! linear scale - timeinc = loadCases(currentLoadCase)%time/real(loadCases(currentLoadCase)%incs,pReal) - else - if (currentLoadCase == 1) then ! 1st load case of logarithmic scale - if (inc == 1) then ! 1st inc of 1st load case of logarithmic scale - timeinc = loadCases(1)%time*(2.0_pReal**real( 1-loadCases(1)%incs ,pReal)) ! assume 1st inc is equal to 2nd - else ! not-1st inc of 1st load case of logarithmic scale - timeinc = loadCases(1)%time*(2.0_pReal**real(inc-1-loadCases(1)%incs ,pReal)) - endif - else ! not-1st load case of logarithmic scale - timeinc = time0 * & - ( (1.0_pReal + loadCases(currentLoadCase)%time/time0 )**(real( inc,pReal)/& - real(loadCases(currentLoadCase)%incs ,pReal))& - -(1.0_pReal + loadCases(currentLoadCase)%time/time0 )**(real( inc-1 ,pReal)/& - real(loadCases(currentLoadCase)%incs ,pReal))) - endif - endif + timeinc = loadCases(currentLoadCase)%time/real(loadCases(currentLoadCase)%incs,pReal) timeinc = timeinc * real(subStepFactor,pReal)**real(-cutBackLevel,pReal) ! depending on cut back level, decrease time step - - - stepFraction = 0 ! fraction scaled by stepFactor**cutLevel + stepFraction = 0 ! fraction scaled by stepFactor**cutLevel subStepLooping: do while (stepFraction < subStepFactor**cutBackLevel) remainingLoadCaseTime = loadCases(currentLoadCase)%time+time0 - time - time = time + timeinc ! forward target time - stepFraction = stepFraction + 1 ! count step + time = time + timeinc ! forward target time + stepFraction = stepFraction + 1 ! count step !-------------------------------------------------------------------------------------------------- ! report begin of new step diff --git a/src/mesh/FEM_utilities.f90 b/src/mesh/FEM_utilities.f90 index 1c073dd69..319997ad6 100644 --- a/src/mesh/FEM_utilities.f90 +++ b/src/mesh/FEM_utilities.f90 @@ -64,16 +64,6 @@ module FEM_utilities type(tComponentBC), allocatable :: componentBC(:) end type tFieldBC - type, public :: tLoadCase - real(pReal) :: time = 0.0_pReal !< length of increment - integer :: incs = 0, & !< number of increments - outputfrequency = 1, & !< frequency of result writes - logscale = 0 !< linear/logarithmic time inc flag - logical :: followFormerTrajectory = .true. !< follow trajectory of former loadcase - integer, allocatable, dimension(:) :: faceID - type(tFieldBC), allocatable, dimension(:) :: fieldBC - end type tLoadCase - public :: & FEM_utilities_init, & utilities_constitutiveResponse, & From 5b66db8a394ffe34b303039fe8cd17b370e60a30 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 22 Jul 2021 10:12:43 +0200 Subject: [PATCH 21/46] only mechanics at the moment will be extended, but most likely differently --- src/mesh/DAMASK_mesh.f90 | 113 ++++++++++++------------------------- src/mesh/FEM_utilities.f90 | 8 +-- 2 files changed, 41 insertions(+), 80 deletions(-) diff --git a/src/mesh/DAMASK_mesh.f90 b/src/mesh/DAMASK_mesh.f90 index d1568e87f..a8446d9fa 100644 --- a/src/mesh/DAMASK_mesh.f90 +++ b/src/mesh/DAMASK_mesh.f90 @@ -21,7 +21,6 @@ program DAMASK_mesh use mesh_mechanical_FEM implicit none - integer :: nActiveFields = 0 type :: tLoadCase real(pReal) :: time = 0.0_pReal !< length of increment @@ -78,7 +77,7 @@ program DAMASK_mesh type(tLoadCase), allocatable, dimension(:) :: loadCases !< array of all load cases type(tSolutionState), allocatable, dimension(:) :: solres - PetscInt :: faceSet, currentFaceSet, field, dimPlex + PetscInt :: faceSet, currentFaceSet, dimPlex PetscErrorCode :: ierr integer(kind(COMPONENT_UNDEFINED_ID)) :: ID external :: & @@ -101,8 +100,7 @@ program DAMASK_mesh ! reading basic information from load case file and allocate data structure containing load cases call DMGetDimension(geomMesh,dimPlex,ierr) !< dimension of mesh (2D or 3D) CHKERRA(ierr) - nActiveFields = 1 - allocate(solres(nActiveFields)) + allocate(solres(1)) !-------------------------------------------------------------------------------------------------- ! reading basic information from load case file and allocate data structure containing load cases @@ -124,32 +122,26 @@ program DAMASK_mesh allocate(loadCases(N_def)) do i = 1, size(loadCases) - allocate(loadCases(i)%fieldBC(nActiveFields)) - field = 1 - loadCases(i)%fieldBC(field)%ID = FIELD_MECH_ID + allocate(loadCases(i)%fieldBC(1)) + loadCases(i)%fieldBC(1)%ID = FIELD_MECH_ID enddo do i = 1, size(loadCases) - do field = 1, nActiveFields - select case (loadCases(i)%fieldBC(field)%ID) - case(FIELD_MECH_ID) - loadCases(i)%fieldBC(field)%nComponents = dimPlex !< X, Y (, Z) displacements - allocate(loadCases(i)%fieldBC(field)%componentBC(loadCases(i)%fieldBC(field)%nComponents)) - do component = 1, loadCases(i)%fieldBC(field)%nComponents - select case (component) - case (1) - loadCases(i)%fieldBC(field)%componentBC(component)%ID = COMPONENT_MECH_X_ID - case (2) - loadCases(i)%fieldBC(field)%componentBC(component)%ID = COMPONENT_MECH_Y_ID - case (3) - loadCases(i)%fieldBC(field)%componentBC(component)%ID = COMPONENT_MECH_Z_ID - end select - enddo + loadCases(i)%fieldBC(1)%nComponents = dimPlex !< X, Y (, Z) displacements + allocate(loadCases(i)%fieldBC(1)%componentBC(loadCases(i)%fieldBC(1)%nComponents)) + do component = 1, loadCases(i)%fieldBC(1)%nComponents + select case (component) + case (1) + loadCases(i)%fieldBC(1)%componentBC(component)%ID = COMPONENT_MECH_X_ID + case (2) + loadCases(i)%fieldBC(1)%componentBC(component)%ID = COMPONENT_MECH_Y_ID + case (3) + loadCases(i)%fieldBC(1)%componentBC(component)%ID = COMPONENT_MECH_Z_ID end select - do component = 1, loadCases(i)%fieldBC(field)%nComponents - allocate(loadCases(i)%fieldBC(field)%componentBC(component)%Value(mesh_Nboundaries), source = 0.0_pReal) - allocate(loadCases(i)%fieldBC(field)%componentBC(component)%Mask (mesh_Nboundaries), source = .false.) - enddo + enddo + do component = 1, loadCases(i)%fieldBC(1)%nComponents + allocate(loadCases(i)%fieldBC(1)%componentBC(component)%Value(mesh_Nboundaries), source = 0.0_pReal) + allocate(loadCases(i)%fieldBC(1)%componentBC(component)%Mask (mesh_Nboundaries), source = .false.) enddo enddo @@ -194,16 +186,12 @@ program DAMASK_mesh ID = COMPONENT_MECH_Z_ID end select - do field = 1, nActiveFields - if (loadCases(currentLoadCase)%fieldBC(field)%ID == FIELD_MECH_ID) then - do component = 1, loadcases(currentLoadCase)%fieldBC(field)%nComponents - if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%ID == ID) then - loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask (currentFaceSet) = & - .true. - loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Value(currentFaceSet) = & - IO_floatValue(line,chunkPos,i+1) - endif - enddo + do component = 1, loadcases(currentLoadCase)%fieldBC(1)%nComponents + if (loadCases(currentLoadCase)%fieldBC(1)%componentBC(component)%ID == ID) then + loadCases(currentLoadCase)%fieldBC(1)%componentBC(component)%Mask (currentFaceSet) = & + .true. + loadCases(currentLoadCase)%fieldBC(1)%componentBC(component)%Value(currentFaceSet) = & + IO_floatValue(line,chunkPos,i+1) endif enddo end select @@ -219,21 +207,16 @@ program DAMASK_mesh print'(a,i0)', ' load case: ', currentLoadCase if (.not. loadCases(currentLoadCase)%followFormerTrajectory) & print'(a)', ' drop guessing along trajectory' - do field = 1, nActiveFields - select case (loadCases(currentLoadCase)%fieldBC(field)%ID) - case(FIELD_MECH_ID) - print'(a)', ' Field '//trim(FIELD_MECH_label) + print'(a)', ' Field '//trim(FIELD_MECH_label) - end select - do faceSet = 1, mesh_Nboundaries - do component = 1, loadCases(currentLoadCase)%fieldBC(field)%nComponents - if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask(faceSet)) & - print'(a,i2,a,i2,a,f12.7)', ' Face ', mesh_boundaries(faceSet), & - ' Component ', component, & - ' Value ', loadCases(currentLoadCase)%fieldBC(field)% & - componentBC(component)%Value(faceSet) - enddo - enddo + do faceSet = 1, mesh_Nboundaries + do component = 1, loadCases(currentLoadCase)%fieldBC(1)%nComponents + if (loadCases(currentLoadCase)%fieldBC(1)%componentBC(component)%Mask(faceSet)) & + print'(a,i2,a,i2,a,f12.7)', ' Face ', mesh_boundaries(faceSet), & + ' Component ', component, & + ' Value ', loadCases(currentLoadCase)%fieldBC(1)% & + componentBC(component)%Value(faceSet) + enddo enddo print'(a,f12.6)', ' time: ', loadCases(currentLoadCase)%time if (loadCases(currentLoadCase)%incs < 1) errorID = 835 ! non-positive incs count @@ -247,12 +230,7 @@ program DAMASK_mesh !-------------------------------------------------------------------------------------------------- ! doing initialization depending on active solvers call FEM_Utilities_init - do field = 1, nActiveFields - select case (loadCases(1)%fieldBC(field)%ID) - case(FIELD_MECH_ID) - call FEM_mechanical_init(loadCases(1)%fieldBC(field)) - end select - enddo + call FEM_mechanical_init(loadCases(1)%fieldBC(1)) if (worldrank == 0) then open(newunit=statUnit,file=trim(getSolverJobName())//'.sta',form='FORMATTED',status='REPLACE') @@ -295,33 +273,16 @@ program DAMASK_mesh '-',stepFraction, '/', subStepFactor**cutBackLevel flush(IO_STDOUT) -!-------------------------------------------------------------------------------------------------- -! forward fields - do field = 1, nActiveFields - select case (loadCases(currentLoadCase)%fieldBC(field)%ID) - case(FIELD_MECH_ID) - call FEM_mechanical_forward (& - guess,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(field)) - - end select - enddo + call FEM_mechanical_forward(guess,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(1)) !-------------------------------------------------------------------------------------------------- ! solve fields stagIter = 0 stagIterate = .true. do while (stagIterate) - do field = 1, nActiveFields - select case (loadCases(currentLoadCase)%fieldBC(field)%ID) - case(FIELD_MECH_ID) - solres(field) = FEM_mechanical_solution (& - incInfo,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(field)) + solres(1) = FEM_mechanical_solution(incInfo,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(1)) + if(.not. solres(1)%converged) exit - end select - - if(.not. solres(field)%converged) exit ! no solution found - - enddo stagIter = stagIter + 1 stagIterate = stagIter < stagItMax & .and. all(solres(:)%converged) & diff --git a/src/mesh/FEM_utilities.f90 b/src/mesh/FEM_utilities.f90 index 319997ad6..64bcc3896 100644 --- a/src/mesh/FEM_utilities.f90 +++ b/src/mesh/FEM_utilities.f90 @@ -53,15 +53,15 @@ module FEM_utilities end type tSolutionState type, public :: tComponentBC - integer(kind(COMPONENT_UNDEFINED_ID)) :: ID - real(pReal), allocatable, dimension(:) :: Value - logical, allocatable, dimension(:) :: Mask + integer(kind(COMPONENT_UNDEFINED_ID)) :: ID + real(pReal), allocatable, dimension(:) :: Value + logical, allocatable, dimension(:) :: Mask end type tComponentBC type, public :: tFieldBC integer(kind(FIELD_UNDEFINED_ID)) :: ID integer :: nComponents = 0 - type(tComponentBC), allocatable :: componentBC(:) + type(tComponentBC), allocatable, dimension(:) :: componentBC end type tFieldBC public :: & From aa03e5930632147cf984710d0fef6f41c68eb37d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 22 Jul 2021 11:22:25 +0200 Subject: [PATCH 22/46] same statement, different syntax but silences gfortran runtime warning with automated LHS, compiling in DEBUG mode (tested for mesh solver) gives: home/m/DAMASK/src/phase_mechanical.f90:1010:43: runtime error: signed integer overflow: -9223372036854775808 - 1 cannot be represented in type 'integer(kind=8)' --- src/phase_mechanical.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phase_mechanical.f90 b/src/phase_mechanical.f90 index 8b04a0009..3c14accb5 100644 --- a/src/phase_mechanical.f90 +++ b/src/phase_mechanical.f90 @@ -1007,7 +1007,7 @@ module function phase_mechanical_constitutive(Delta_t,co,ip,el) result(converged subLi0 = phase_mechanical_Li0(ph)%data(1:3,1:3,en) subLp0 = phase_mechanical_Lp0(ph)%data(1:3,1:3,en) - subState0 = plasticState(ph)%State0(:,en) + allocate(subState0,source=plasticState(ph)%State0(:,en)) subFp0 = phase_mechanical_Fp0(ph)%data(1:3,1:3,en) subFi0 = phase_mechanical_Fi0(ph)%data(1:3,1:3,en) subF0 = phase_mechanical_F0(ph)%data(1:3,1:3,en) From 69cc0b528bf8a02695a59ed315cc316c852a07fb Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 22 Jul 2021 11:38:03 +0200 Subject: [PATCH 23/46] do calculation for initialization --- src/mesh/mesh_mech_FEM.f90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mesh/mesh_mech_FEM.f90 b/src/mesh/mesh_mech_FEM.f90 index 1468e3fcc..6bcf44c3a 100644 --- a/src/mesh/mesh_mech_FEM.f90 +++ b/src/mesh/mesh_mech_FEM.f90 @@ -109,7 +109,7 @@ subroutine FEM_mechanical_init(fieldBC) character(len=*), parameter :: prefix = 'mechFE_' PetscErrorCode :: ierr - + real(pReal), dimension(3,3) :: devNull class(tNode), pointer :: & num_mesh @@ -258,6 +258,7 @@ subroutine FEM_mechanical_init(fieldBC) call DMPlexVecSetClosure(mechanical_mesh,section,solution_local,cell,px_scal,5,ierr) CHKERRQ(ierr) enddo + call utilities_constitutiveResponse(0.0_pReal,devNull,.true.) end subroutine FEM_mechanical_init @@ -397,7 +398,7 @@ subroutine FEM_mechanical_formResidual(dm_local,xx_local,f_local,dummy,ierr) !-------------------------------------------------------------------------------------------------- ! evaluate constitutive response - call Utilities_constitutiveResponse(params%timeinc,P_av,ForwardData) + call utilities_constitutiveResponse(params%timeinc,P_av,ForwardData) call MPI_Allreduce(MPI_IN_PLACE,terminallyIll,1,MPI_LOGICAL,MPI_LOR,MPI_COMM_WORLD,ierr) ForwardData = .false. From 5ac592eb9e331de2988f97946237092882ad5795 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 22 Jul 2021 12:31:10 +0200 Subject: [PATCH 24/46] initialize L_(i/p), L_(i,p)0 --- src/mesh/mesh_mech_FEM.f90 | 4 ++-- src/phase_mechanical.f90 | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/mesh/mesh_mech_FEM.f90 b/src/mesh/mesh_mech_FEM.f90 index 6bcf44c3a..d6d314a42 100644 --- a/src/mesh/mesh_mech_FEM.f90 +++ b/src/mesh/mesh_mech_FEM.f90 @@ -289,8 +289,8 @@ type(tSolutionState) function FEM_mechanical_solution( & params%timeinc = timeinc params%fieldBC = fieldBC - call SNESSolve(mechanical_snes,PETSC_NULL_VEC,solution,ierr); CHKERRQ(ierr) ! solve mechanical_snes based on solution guess (result in solution) - call SNESGetConvergedReason(mechanical_snes,reason,ierr); CHKERRQ(ierr) ! solution converged? + call SNESSolve(mechanical_snes,PETSC_NULL_VEC,solution,ierr); CHKERRQ(ierr) ! solve mechanical_snes based on solution guess (result in solution) + call SNESGetConvergedReason(mechanical_snes,reason,ierr); CHKERRQ(ierr) ! solution converged? terminallyIll = .false. if (reason < 1) then ! 0: still iterating (will not occur), negative -> convergence error diff --git a/src/phase_mechanical.f90 b/src/phase_mechanical.f90 index 3c14accb5..a14102513 100644 --- a/src/phase_mechanical.f90 +++ b/src/phase_mechanical.f90 @@ -215,8 +215,8 @@ module subroutine mechanical_init(materials,phases) allocate(phase_mechanical_F0(phases%length)) allocate(phase_mechanical_Li(phases%length)) allocate(phase_mechanical_Li0(phases%length)) - allocate(phase_mechanical_Lp0(phases%length)) allocate(phase_mechanical_Lp(phases%length)) + allocate(phase_mechanical_Lp0(phases%length)) allocate(phase_mechanical_S(phases%length)) allocate(phase_mechanical_P(phases%length)) allocate(phase_mechanical_S0(phases%length)) @@ -224,20 +224,20 @@ module subroutine mechanical_init(materials,phases) do ph = 1, phases%length Nmembers = count(material_phaseID == ph) - allocate(phase_mechanical_Fi(ph)%data(3,3,Nmembers)) allocate(phase_mechanical_Fe(ph)%data(3,3,Nmembers)) + allocate(phase_mechanical_Fi(ph)%data(3,3,Nmembers)) allocate(phase_mechanical_Fi0(ph)%data(3,3,Nmembers)) allocate(phase_mechanical_Fp(ph)%data(3,3,Nmembers)) allocate(phase_mechanical_Fp0(ph)%data(3,3,Nmembers)) - allocate(phase_mechanical_Li(ph)%data(3,3,Nmembers)) - allocate(phase_mechanical_Li0(ph)%data(3,3,Nmembers)) - allocate(phase_mechanical_Lp0(ph)%data(3,3,Nmembers)) - allocate(phase_mechanical_Lp(ph)%data(3,3,Nmembers)) + allocate(phase_mechanical_F(ph)%data(3,3,Nmembers)) + allocate(phase_mechanical_F0(ph)%data(3,3,Nmembers)) + allocate(phase_mechanical_Li(ph)%data(3,3,Nmembers),source=0.0_pReal) + allocate(phase_mechanical_Li0(ph)%data(3,3,Nmembers),source=0.0_pReal) + allocate(phase_mechanical_Lp(ph)%data(3,3,Nmembers),source=0.0_pReal) + allocate(phase_mechanical_Lp0(ph)%data(3,3,Nmembers),source=0.0_pReal) allocate(phase_mechanical_S(ph)%data(3,3,Nmembers),source=0.0_pReal) allocate(phase_mechanical_P(ph)%data(3,3,Nmembers),source=0.0_pReal) allocate(phase_mechanical_S0(ph)%data(3,3,Nmembers),source=0.0_pReal) - allocate(phase_mechanical_F(ph)%data(3,3,Nmembers)) - allocate(phase_mechanical_F0(ph)%data(3,3,Nmembers)) phase => phases%get(ph) mech => phase%get('mechanical') @@ -494,7 +494,7 @@ function integrateStress(F,subFp0,subFi0,Delta_t,co,ip,el) result(broken) enddo LpLoop call phase_LiAndItsTangents(Li_constitutive, dLi_dS, dLi_dFi, & - S, Fi_new, ph,en) + S, Fi_new, ph,en) !* update current residuum and check for convergence of loop atol_Li = max(num%rtol_crystalliteStress * max(norm2(Liguess),norm2(Li_constitutive)), & ! absolute tolerance from largest acceptable relative error @@ -1130,12 +1130,12 @@ module function phase_mechanical_dPdF(Delta_t,co,ce) result(dPdF) en = material_phaseEntry(co,ce) call phase_hooke_SandItsTangents(devNull,dSdFe,dSdFi, & - phase_mechanical_Fe(ph)%data(1:3,1:3,en), & - phase_mechanical_Fi(ph)%data(1:3,1:3,en),ph,en) + phase_mechanical_Fe(ph)%data(1:3,1:3,en), & + phase_mechanical_Fi(ph)%data(1:3,1:3,en),ph,en) call phase_LiAndItsTangents(devNull,dLidS,dLidFi, & - phase_mechanical_S(ph)%data(1:3,1:3,en), & - phase_mechanical_Fi(ph)%data(1:3,1:3,en), & - ph,en) + phase_mechanical_S(ph)%data(1:3,1:3,en), & + phase_mechanical_Fi(ph)%data(1:3,1:3,en), & + ph,en) invFp = math_inv33(phase_mechanical_Fp(ph)%data(1:3,1:3,en)) invFi = math_inv33(phase_mechanical_Fi(ph)%data(1:3,1:3,en)) From 11cdc63a2768013ec5b5e7e283431f65b6f5cab1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 22 Jul 2021 13:50:41 +0200 Subject: [PATCH 25/46] use reasonable load case, even for compile test --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index d92b030e5..f2e2d6c71 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit d92b030e5777e718c77edc2e1e93abfa0981b024 +Subproject commit f2e2d6c71ea798bfc63230a756b7cf9748599bec From 6936ecb0910066fbfa59fcd19331a93fae4caa50 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 23 Jul 2021 21:36:26 +0200 Subject: [PATCH 26/46] sl is the subscript for slip --- .../Phase_Dislotwin_TWIP-Steel-FeMnC.yaml | 2 +- .../plastic/dislotwin_IF-steel.yaml | 2 +- src/phase_mechanical_plastic_dislotwin.f90 | 48 +++++++++---------- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/examples/config/Phase_Dislotwin_TWIP-Steel-FeMnC.yaml b/examples/config/Phase_Dislotwin_TWIP-Steel-FeMnC.yaml index fe51585be..6c19b9f93 100644 --- a/examples/config/Phase_Dislotwin_TWIP-Steel-FeMnC.yaml +++ b/examples/config/Phase_Dislotwin_TWIP-Steel-FeMnC.yaml @@ -6,7 +6,7 @@ b_sl: [2.56e-10] rho_mob_0: [1.0e+12] rho_dip_0: [1.0] v_0: [1.0e+4] -Q_s: [3.7e-19] +Q_sl: [3.7e-19] p_sl: [1.0] q_sl: [1.0] tau_0: [1.5e+8] diff --git a/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml b/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml index 5478aa869..e48d5437f 100644 --- a/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml +++ b/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml @@ -11,7 +11,7 @@ b_sl: [2.49e-10, 2.49e-10] rho_mob_0: [2.81e12, 2.8e+12] rho_dip_0: [1.0, 1.0] # not given v_0: [1.4e+3, 1.4e+3] -Q_s: [1.57e-19, 1.57e-19] # Delta_F +Q_sl: [1.57e-19, 1.57e-19] # Delta_F tau_0: [454.e+6, 454.e+6] p_sl: [0.325, 0.325] q_sl: [1.55, 1.55] diff --git a/src/phase_mechanical_plastic_dislotwin.f90 b/src/phase_mechanical_plastic_dislotwin.f90 index 6ecf9ee7a..4aa62bcb8 100644 --- a/src/phase_mechanical_plastic_dislotwin.f90 +++ b/src/phase_mechanical_plastic_dislotwin.f90 @@ -22,7 +22,6 @@ submodule(phase:plastic) dislotwin D = 1.0_pReal, & !< grain size p_sb = 1.0_pReal, & !< p-exponent in shear band velocity q_sb = 1.0_pReal, & !< q-exponent in shear band velocity - D_a = 1.0_pReal, & !< adjustment parameter to calculate minimum dipole distance i_tw = 1.0_pReal, & !< adjustment parameter to calculate MFP for twinning L_tw = 1.0_pReal, & !< Length of twin nuclei in Burgers vectors L_tr = 1.0_pReal, & !< Length of trans nuclei in Burgers vectors @@ -42,7 +41,7 @@ submodule(phase:plastic) dislotwin b_sl, & !< absolute length of Burgers vector [m] for each slip system b_tw, & !< absolute length of Burgers vector [m] for each twin system b_tr, & !< absolute length of Burgers vector [m] for each transformation system - Q_s,& !< activation energy for glide [J] for each slip system + Q_sl,& !< activation energy for glide [J] for each slip system v_0, & !< dislocation velocity prefactor [m/s] for each slip system dot_N_0_tw, & !< twin nucleation rate [1/m³s] for each twin system dot_N_0_tr, & !< trans nucleation rate [1/m³s] for each trans system @@ -55,7 +54,8 @@ submodule(phase:plastic) dislotwin s, & !< s-exponent in trans nucleation rate tau_0, & !< strength due to elements in solid solution gamma_char, & !< characteristic shear for twins - B !< drag coefficient + B, & !< drag coefficient + d_caron !< distance of spontaneous annhihilation real(pReal), allocatable, dimension(:,:) :: & h_sl_sl, & !< components of slip-slip interaction matrix h_sl_tw, & !< components of slip-twin interaction matrix @@ -206,7 +206,7 @@ module function plastic_dislotwin_init() result(myPlasticity) rho_dip_0 = pl%get_as1dFloat('rho_dip_0', requiredSize=size(N_sl)) prm%v_0 = pl%get_as1dFloat('v_0', requiredSize=size(N_sl)) prm%b_sl = pl%get_as1dFloat('b_sl', requiredSize=size(N_sl)) - prm%Q_s = pl%get_as1dFloat('Q_s', requiredSize=size(N_sl)) + prm%Q_sl = pl%get_as1dFloat('Q_sl', requiredSize=size(N_sl)) prm%i_sl = pl%get_as1dFloat('i_sl', requiredSize=size(N_sl)) prm%p = pl%get_as1dFloat('p_sl', requiredSize=size(N_sl)) prm%q = pl%get_as1dFloat('q_sl', requiredSize=size(N_sl)) @@ -214,9 +214,8 @@ module function plastic_dislotwin_init() result(myPlasticity) prm%B = pl%get_as1dFloat('B', requiredSize=size(N_sl), & defaultVal=[(0.0_pReal, i=1,size(N_sl))]) - prm%D_a = pl%get_asFloat('D_a') - prm%D_0 = pl%get_asFloat('D_0') - prm%Q_cl = pl%get_asFloat('Q_cl') + prm%D_0 = pl%get_asFloat('D_0') + prm%Q_cl = pl%get_asFloat('Q_cl') prm%ExtendedDislocations = pl%get_asBool('extend_dislocations',defaultVal = .false.) prm%omitDipoles = pl%get_asBool('omit_dipoles',defaultVal = .false.) @@ -231,12 +230,13 @@ module function plastic_dislotwin_init() result(myPlasticity) rho_dip_0 = math_expand(rho_dip_0, N_sl) prm%v_0 = math_expand(prm%v_0, N_sl) prm%b_sl = math_expand(prm%b_sl, N_sl) - prm%Q_s = math_expand(prm%Q_s, N_sl) + prm%Q_sl = math_expand(prm%Q_sl, N_sl) prm%i_sl = math_expand(prm%i_sl, N_sl) prm%p = math_expand(prm%p, N_sl) prm%q = math_expand(prm%q, N_sl) prm%tau_0 = math_expand(prm%tau_0, N_sl) prm%B = math_expand(prm%B, N_sl) + prm%d_caron = pl%get_asFloat('D_a') * prm%b_sl ! sanity checks if ( prm%D_0 <= 0.0_pReal) extmsg = trim(extmsg)//' D_0' @@ -245,14 +245,15 @@ module function plastic_dislotwin_init() result(myPlasticity) if (any(rho_dip_0 < 0.0_pReal)) extmsg = trim(extmsg)//' rho_dip_0' if (any(prm%v_0 < 0.0_pReal)) extmsg = trim(extmsg)//' v_0' if (any(prm%b_sl <= 0.0_pReal)) extmsg = trim(extmsg)//' b_sl' - if (any(prm%Q_s <= 0.0_pReal)) extmsg = trim(extmsg)//' Q_s' + if (any(prm%Q_sl <= 0.0_pReal)) extmsg = trim(extmsg)//' Q_sl' if (any(prm%i_sl <= 0.0_pReal)) extmsg = trim(extmsg)//' i_sl' if (any(prm%B < 0.0_pReal)) extmsg = trim(extmsg)//' B' + if (any(prm%d_caron < 0.0_pReal)) extmsg = trim(extmsg)//' d_caron(D_a,b_sl)' if (any(prm%p<=0.0_pReal .or. prm%p>1.0_pReal)) extmsg = trim(extmsg)//' p_sl' if (any(prm%q< 1.0_pReal .or. prm%q>2.0_pReal)) extmsg = trim(extmsg)//' q_sl' else slipActive rho_mob_0 = emptyRealArray; rho_dip_0 = emptyRealArray - allocate(prm%b_sl,prm%Q_s,prm%v_0,prm%i_sl,prm%p,prm%q,prm%B,source=emptyRealArray) + allocate(prm%b_sl,prm%Q_sl,prm%v_0,prm%i_sl,prm%p,prm%q,prm%B,source=emptyRealArray) allocate(prm%forestProjection(0,0),prm%h_sl_sl(0,0)) endif slipActive @@ -631,7 +632,7 @@ module subroutine dislotwin_dotState(Mp,T,ph,en) integer :: i real(pReal) :: & f_unrotated, & - rho_dip_distance, & + d_hat, & v_cl, & !< climb velocity tau, & sigma_cl, & !< climb stress @@ -639,15 +640,14 @@ module subroutine dislotwin_dotState(Mp,T,ph,en) real(pReal), dimension(param(ph)%sum_N_sl) :: & dot_rho_dip_formation, & dot_rho_dip_climb, & - rho_dip_distance_min, & dot_gamma_sl real(pReal), dimension(param(ph)%sum_N_tw) :: & dot_gamma_tw real(pReal), dimension(param(ph)%sum_N_tr) :: & dot_gamma_tr - associate(prm => param(ph), stt => state(ph), & - dot => dotState(ph), dst => dependentState(ph)) + + associate(prm => param(ph), stt => state(ph), dot => dotState(ph), dst => dependentState(ph)) f_unrotated = 1.0_pReal & - sum(stt%f_tw(1:prm%sum_N_tw,en)) & @@ -656,8 +656,6 @@ module subroutine dislotwin_dotState(Mp,T,ph,en) call kinetics_sl(Mp,T,ph,en,dot_gamma_sl) dot%gamma_sl(:,en) = abs(dot_gamma_sl) - rho_dip_distance_min = prm%D_a*prm%b_sl - slipState: do i = 1, prm%sum_N_sl tau = math_tensordot(Mp,prm%P_sl(1:3,1:3,i)) @@ -665,14 +663,14 @@ module subroutine dislotwin_dotState(Mp,T,ph,en) dot_rho_dip_formation(i) = 0.0_pReal dot_rho_dip_climb(i) = 0.0_pReal else significantSlipStress - rho_dip_distance = 3.0_pReal*prm%mu*prm%b_sl(i)/(16.0_pReal*PI*abs(tau)) - rho_dip_distance = math_clip(rho_dip_distance, right = dst%Lambda_sl(i,en)) - rho_dip_distance = math_clip(rho_dip_distance, left = rho_dip_distance_min(i)) + d_hat = 3.0_pReal*prm%mu*prm%b_sl(i)/(16.0_pReal*PI*abs(tau)) + d_hat = math_clip(d_hat, right = dst%Lambda_sl(i,en)) + d_hat = math_clip(d_hat, left = prm%d_caron(i)) - dot_rho_dip_formation(i) = 2.0_pReal*(rho_dip_distance-rho_dip_distance_min(i))/prm%b_sl(i) & + dot_rho_dip_formation(i) = 2.0_pReal*(d_hat-prm%d_caron(i))/prm%b_sl(i) & * stt%rho_mob(i,en)*abs(dot_gamma_sl(i)) - if (dEq(rho_dip_distance,rho_dip_distance_min(i))) then + if (dEq(d_hat,prm%d_caron(i))) then dot_rho_dip_climb(i) = 0.0_pReal else ! Argon & Moffat, Acta Metallurgica, Vol. 29, pg 293 to 299, 1981 @@ -685,17 +683,17 @@ module subroutine dislotwin_dotState(Mp,T,ph,en) * (exp(abs(sigma_cl)*prm%b_sl(i)**3.0_pReal/(kB*T)) - 1.0_pReal) dot_rho_dip_climb(i) = 4.0_pReal*v_cl*stt%rho_dip(i,en) & - / (rho_dip_distance-rho_dip_distance_min(i)) + / (d_hat-prm%d_caron(i)) endif endif significantSlipStress enddo slipState dot%rho_mob(:,en) = abs(dot_gamma_sl)/(prm%b_sl*dst%Lambda_sl(:,en)) & - dot_rho_dip_formation & - - 2.0_pReal*rho_dip_distance_min/prm%b_sl * stt%rho_mob(:,en)*abs(dot_gamma_sl) + - 2.0_pReal*prm%d_caron/prm%b_sl * stt%rho_mob(:,en)*abs(dot_gamma_sl) dot%rho_dip(:,en) = dot_rho_dip_formation & - - 2.0_pReal*rho_dip_distance_min/prm%b_sl * stt%rho_dip(:,en)*abs(dot_gamma_sl) & + - 2.0_pReal*prm%d_caron/prm%b_sl * stt%rho_dip(:,en)*abs(dot_gamma_sl) & - dot_rho_dip_climb call kinetics_tw(Mp,T,dot_gamma_sl,ph,en,dot_gamma_tw) @@ -885,7 +883,7 @@ pure subroutine kinetics_sl(Mp,T,ph,en, & significantStress: where(tau_eff > tol_math_check) stressRatio = tau_eff/prm%tau_0 StressRatio_p = stressRatio** prm%p - BoltzmannRatio = prm%Q_s/(kB*T) + BoltzmannRatio = prm%Q_sl/(kB*T) v_wait_inverse = prm%v_0**(-1.0_pReal) * exp(BoltzmannRatio*(1.0_pReal-StressRatio_p)** prm%q) v_run_inverse = prm%B/(tau_eff*prm%b_sl) From f96b0371ac27ee38331613cbbf3a4d18b80b3405 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 23 Jul 2021 21:48:40 +0200 Subject: [PATCH 27/46] proper output name/format --- PRIVATE | 2 +- src/phase_mechanical_plastic_kinehardening.f90 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PRIVATE b/PRIVATE index 174ecac2d..347932db3 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 174ecac2d3ab7596bdb60184d6bb9e1a52cb7378 +Subproject commit 347932db368ec5c0d9e9092ef106c225605d830a diff --git a/src/phase_mechanical_plastic_kinehardening.f90 b/src/phase_mechanical_plastic_kinehardening.f90 index 880b128a9..f1c9b0332 100644 --- a/src/phase_mechanical_plastic_kinehardening.f90 +++ b/src/phase_mechanical_plastic_kinehardening.f90 @@ -359,11 +359,11 @@ module subroutine plastic_kinehardening_results(ph,group) case ('xi') if(prm%sum_N_sl>0) call results_writeDataset(stt%xi,group,trim(prm%output(o)), & 'resistance against plastic slip','Pa') - case ('tau_b') !ToDo: chi + case ('chi') if(prm%sum_N_sl>0) call results_writeDataset(stt%chi,group,trim(prm%output(o)), & 'back stress','Pa') case ('sgn(gamma)') - if(prm%sum_N_sl>0) call results_writeDataset(stt%sgn_gamma,group,trim(prm%output(o)), & ! ToDo: could be int + if(prm%sum_N_sl>0) call results_writeDataset(int(stt%sgn_gamma),group,trim(prm%output(o)), & 'sense of shear','1') case ('chi_0') if(prm%sum_N_sl>0) call results_writeDataset(stt%chi_0,group,trim(prm%output(o)), & From 2d1d99542c4ab6e341c3b66bf8370e7224088f89 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 23 Jul 2021 21:51:51 +0200 Subject: [PATCH 28/46] takeover from original paper --- .../config/Phase_DisloUCLA_Tungsten.config | 42 ------------------- examples/config/Phase_Dislotungsten_W.yaml | 26 ++++++++++++ 2 files changed, 26 insertions(+), 42 deletions(-) delete mode 100644 examples/config/Phase_DisloUCLA_Tungsten.config create mode 100644 examples/config/Phase_Dislotungsten_W.yaml diff --git a/examples/config/Phase_DisloUCLA_Tungsten.config b/examples/config/Phase_DisloUCLA_Tungsten.config deleted file mode 100644 index 1eef32577..000000000 --- a/examples/config/Phase_DisloUCLA_Tungsten.config +++ /dev/null @@ -1,42 +0,0 @@ -[Tungsten] -elasticity hooke -plasticity disloucla - -(output) edge_density -(output) dipole_density -(output) shear_rate_slip -(output) accumulated_shear_slip -(output) resolved_stress_slip -(output) threshold_stress_slip - -grainsize 2.7e-5 # Average grain size [m] 2.0e-5 -SolidSolutionStrength 0.0 # Strength due to elements in solid solution - -### Dislocation glide parameters ### -#per family -Nslip 12 -slipburgers 2.72e-10 # Burgers vector of slip system [m] -rhoedge0 1.0e12 # Initial edge dislocation density [m/m**3] -rhoedgedip0 1.0 # Initial edged dipole dislocation density [m/m**3] -Qedge 2.61154e-19 # Activation energy for dislocation glide [J], 1.63 eV -v0 1 # Initial glide velocity [m/s] -p_slip 0.86 # p-exponent in glide velocity -q_slip 1.69 # q-exponent in glide velocity -tau_peierls 2.03e9 # peierls stress [Pa] - -#mobility law -kink_height 2.567e-10 # kink height sqrt(6)/3*lattice_parameter [m] -omega 9.1e11 # attemp frequency (from kMC paper) [s^(-1)] -kink_width 29.95e-10 # kink pair width ~ 11 b (kMC paper) [m] -dislolength 78e-10 # dislocation length (ideally lambda) [m] initial value 11b -friction_coeff 8.3e-5 # friction coeff. B [Pa*s] - -#hardening -dipoleformationfactor 0 # to have hardening due to dipole formation off -CLambdaSlip 10.0 # Adj. parameter controlling dislocation mean free path -D0 4.0e-5 # Vacancy diffusion prefactor [m**2/s] -Qsd 4.5e-19 # Activation energy for climb [J] -Catomicvolume 1.0 # Adj. parameter controlling the atomic volume [in b] -Cedgedipmindistance 1.0 # Adj. parameter controlling the minimum dipole distance [in b] -interaction_slipslip 0.009 0.72 0.009 0.05 0.05 0.06 0.09 -nonschmid_coefficients 0.938 0.71 4.43 0.0 0.0 0.0 diff --git a/examples/config/Phase_Dislotungsten_W.yaml b/examples/config/Phase_Dislotungsten_W.yaml new file mode 100644 index 000000000..38cf2d4e4 --- /dev/null +++ b/examples/config/Phase_Dislotungsten_W.yaml @@ -0,0 +1,26 @@ +type: dislotungsten + +N_sl: [12] + +rho_mob_0: [1.0e+9] +rho_dip_0: [1.0] + +nu_a: [9.1e+11] +b_sl: [2.72e-10] +Delta_H_kp,0: [2.61154e-19] # 1.63 eV, Delta_H0 + +tau_Peierls: [2.03e+9] +p_sl: [0.86] +q_sl: [1.69] +h: [2.566e-10] +w: [2.992e-09] +B: [8.3e-5] +D_a: 1.0 # d_edge + +# climb (disabled) +D_0: 0.0 +Q_cl: 0.0 +V_cl: [0.0] + +h_sl-sl: [0.009, 0.72, 0.009, 0.05, 0.05, 0.06, 0.09] +a_nonSchmid: [0.938, 0.71, 4.43] From c46813657f38e0a898bba78eb2d78fc71dfc1d60 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 23 Jul 2021 21:56:34 +0200 Subject: [PATCH 29/46] better to understand --- ...phase_mechanical_plastic_dislotungsten.f90 | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/phase_mechanical_plastic_dislotungsten.f90 b/src/phase_mechanical_plastic_dislotungsten.f90 index 6ca8e440e..0fc0076fc 100644 --- a/src/phase_mechanical_plastic_dislotungsten.f90 +++ b/src/phase_mechanical_plastic_dislotungsten.f90 @@ -56,7 +56,7 @@ submodule(phase:plastic) dislotungsten type :: tDisloTungstendependentState real(pReal), dimension(:,:), allocatable :: & Lambda_sl, & - threshold_stress + tau_pass end type tDisloTungstendependentState !-------------------------------------------------------------------------------------------------- @@ -246,8 +246,8 @@ module function plastic_dislotungsten_init() result(myPlasticity) plasticState(ph)%atol(startIndex:endIndex) = pl%get_asFloat('atol_gamma',defaultVal=1.0e-6_pReal) if(any(plasticState(ph)%atol(startIndex:endIndex) < 0.0_pReal)) extmsg = trim(extmsg)//' atol_gamma' - allocate(dst%Lambda_sl(prm%sum_N_sl,Nmembers), source=0.0_pReal) - allocate(dst%threshold_stress(prm%sum_N_sl,Nmembers), source=0.0_pReal) + allocate(dst%Lambda_sl(prm%sum_N_sl,Nmembers), source=0.0_pReal) + allocate(dst%tau_pass(prm%sum_N_sl,Nmembers), source=0.0_pReal) end associate @@ -380,8 +380,8 @@ module subroutine dislotungsten_dependentState(ph,en) associate(prm => param(ph), stt => state(ph),dst => dependentState(ph)) dislocationSpacing = sqrt(matmul(prm%forestProjection,stt%rho_mob(:,en)+stt%rho_dip(:,en))) - dst%threshold_stress(:,en) = prm%mu*prm%b_sl & - * sqrt(matmul(prm%h_sl_sl,stt%rho_mob(:,en)+stt%rho_dip(:,en))) + dst%tau_pass(:,en) = prm%mu*prm%b_sl & + * sqrt(matmul(prm%h_sl_sl,stt%rho_mob(:,en)+stt%rho_dip(:,en))) dst%Lambda_sl(:,en) = prm%D/(1.0_pReal+prm%D*dislocationSpacing/prm%i_sl) @@ -416,7 +416,7 @@ module subroutine plastic_dislotungsten_results(ph,group) if(prm%sum_N_sl>0) call results_writeDataset(dst%Lambda_sl,group,trim(prm%output(o)), & 'mean free path for slip','m') case('tau_pass') - if(prm%sum_N_sl>0) call results_writeDataset(dst%threshold_stress,group,trim(prm%output(o)), & + if(prm%sum_N_sl>0) call results_writeDataset(dst%tau_pass,group,trim(prm%output(o)), & 'threshold stress for slip','Pa') end select enddo outputsLoop @@ -456,8 +456,7 @@ pure subroutine kinetics(Mp,T,ph,en, & StressRatio_p,StressRatio_pminus1, & dvel, vel, & tau_pos,tau_neg, & - t_n, t_k, dtk,dtn, & - needsGoodName ! ToDo: @Karo: any idea? + t_n, t_k, dtk,dtn integer :: j associate(prm => param(ph), stt => state(ph), dst => dependentState(ph)) @@ -475,13 +474,12 @@ pure subroutine kinetics(Mp,T,ph,en, & dot_gamma_0 => stt%rho_mob(:,en)*prm%b_sl*prm%v_0, & effectiveLength => dst%Lambda_sl(:,en) - prm%w) - significantPositiveTau: where(abs(tau_pos)-dst%threshold_stress(:,en) > tol_math_check) - StressRatio = (abs(tau_pos)-dst%threshold_stress(:,en))/prm%tau_Peierls + significantPositiveTau: where(abs(tau_pos)-dst%tau_pass(:,en) > tol_math_check) + StressRatio = (abs(tau_pos)-dst%tau_pass(:,en))/prm%tau_Peierls StressRatio_p = StressRatio** prm%p StressRatio_pminus1 = StressRatio**(prm%p-1.0_pReal) - needsGoodName = exp(-BoltzmannRatio*(1-StressRatio_p) ** prm%q) - t_n = prm%b_sl/(needsGoodName*prm%omega*effectiveLength) + t_n = prm%b_sl/(exp(-BoltzmannRatio*(1-StressRatio_p) ** prm%q)*prm%omega*effectiveLength) t_k = effectiveLength * prm%B /(2.0_pReal*prm%b_sl*tau_pos) vel = prm%h/(t_n + t_k) @@ -492,7 +490,7 @@ pure subroutine kinetics(Mp,T,ph,en, & end where significantPositiveTau if (present(ddot_gamma_dtau_pos)) then - significantPositiveTau2: where(abs(tau_pos)-dst%threshold_stress(:,en) > tol_math_check) + significantPositiveTau2: where(abs(tau_pos)-dst%tau_pass(:,en) > tol_math_check) dtn = -1.0_pReal * t_n * BoltzmannRatio * prm%p * prm%q * (1.0_pReal-StressRatio_p)**(prm%q - 1.0_pReal) & * (StressRatio)**(prm%p - 1.0_pReal) / prm%tau_Peierls dtk = -1.0_pReal * t_k / tau_pos @@ -505,13 +503,12 @@ pure subroutine kinetics(Mp,T,ph,en, & end where significantPositiveTau2 endif - significantNegativeTau: where(abs(tau_neg)-dst%threshold_stress(:,en) > tol_math_check) - StressRatio = (abs(tau_neg)-dst%threshold_stress(:,en))/prm%tau_Peierls + significantNegativeTau: where(abs(tau_neg)-dst%tau_pass(:,en) > tol_math_check) + StressRatio = (abs(tau_neg)-dst%tau_pass(:,en))/prm%tau_Peierls StressRatio_p = StressRatio** prm%p StressRatio_pminus1 = StressRatio**(prm%p-1.0_pReal) - needsGoodName = exp(-BoltzmannRatio*(1-StressRatio_p) ** prm%q) - t_n = prm%b_sl/(needsGoodName*prm%omega*effectiveLength) + t_n = prm%b_sl/(exp(-BoltzmannRatio*(1-StressRatio_p) ** prm%q)*prm%omega*effectiveLength) t_k = effectiveLength * prm%B /(2.0_pReal*prm%b_sl*tau_pos) vel = prm%h/(t_n + t_k) @@ -522,7 +519,7 @@ pure subroutine kinetics(Mp,T,ph,en, & end where significantNegativeTau if (present(ddot_gamma_dtau_neg)) then - significantNegativeTau2: where(abs(tau_neg)-dst%threshold_stress(:,en) > tol_math_check) + significantNegativeTau2: where(abs(tau_neg)-dst%tau_pass(:,en) > tol_math_check) dtn = -1.0_pReal * t_n * BoltzmannRatio * prm%p * prm%q * (1.0_pReal-StressRatio_p)**(prm%q - 1.0_pReal) & * (StressRatio)**(prm%p - 1.0_pReal) / prm%tau_Peierls dtk = -1.0_pReal * t_k / tau_neg From 2a78174547b473f1d96ff5916ad5e805c2f53c88 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 23 Jul 2021 22:04:39 +0200 Subject: [PATCH 30/46] standard names in source code --- examples/config/Phase_Dislotungsten_W.yaml | 2 +- ...phase_mechanical_plastic_dislotungsten.f90 | 36 +++++++++---------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/examples/config/Phase_Dislotungsten_W.yaml b/examples/config/Phase_Dislotungsten_W.yaml index 38cf2d4e4..bf8796cfa 100644 --- a/examples/config/Phase_Dislotungsten_W.yaml +++ b/examples/config/Phase_Dislotungsten_W.yaml @@ -16,7 +16,7 @@ h: [2.566e-10] w: [2.992e-09] B: [8.3e-5] D_a: 1.0 # d_edge - + # climb (disabled) D_0: 0.0 Q_cl: 0.0 diff --git a/src/phase_mechanical_plastic_dislotungsten.f90 b/src/phase_mechanical_plastic_dislotungsten.f90 index 0fc0076fc..e7cf32080 100644 --- a/src/phase_mechanical_plastic_dislotungsten.f90 +++ b/src/phase_mechanical_plastic_dislotungsten.f90 @@ -18,7 +18,7 @@ submodule(phase:plastic) dislotungsten Q_cl = 1.0_pReal !< activation energy for dislocation climb real(pReal), allocatable, dimension(:) :: & b_sl, & !< magnitude of Burgers vector [m] - D_a, & + d_caron, & !< distance of spontaneous annhihilation i_sl, & !< Adj. parameter for distance between 2 forest dislocations f_at, & !< factor to calculate atomic volume tau_Peierls, & !< Peierls stress @@ -172,7 +172,6 @@ module function plastic_dislotungsten_init() result(myPlasticity) prm%D_0 = pl%get_asFloat('D_0') prm%Q_cl = pl%get_asFloat('Q_cl') prm%f_at = pl%get_asFloat('f_at') * prm%b_sl**3.0_pReal - prm%D_a = pl%get_asFloat('D_a') * prm%b_sl prm%dipoleformation = .not. pl%get_asBool('no_dipole_formation', defaultVal = .false.) @@ -191,7 +190,7 @@ module function plastic_dislotungsten_init() result(myPlasticity) prm%B = math_expand(prm%B, N_sl) prm%i_sl = math_expand(prm%i_sl, N_sl) prm%f_at = math_expand(prm%f_at, N_sl) - prm%D_a = math_expand(prm%D_a, N_sl) + prm%d_caron = pl%get_asFloat('D_a') * prm%b_sl ! sanity checks if ( prm%D_0 <= 0.0_pReal) extmsg = trim(extmsg)//' D_0' @@ -202,12 +201,13 @@ module function plastic_dislotungsten_init() result(myPlasticity) if (any(prm%b_sl <= 0.0_pReal)) extmsg = trim(extmsg)//' b_sl' if (any(prm%Q_s <= 0.0_pReal)) extmsg = trim(extmsg)//' Q_s' if (any(prm%tau_Peierls < 0.0_pReal)) extmsg = trim(extmsg)//' tau_Peierls' - if (any(prm%D_a <= 0.0_pReal)) extmsg = trim(extmsg)//' D_a or b_sl' + if (any(prm%B < 0.0_pReal)) extmsg = trim(extmsg)//' B' + if (any(prm%d_caron < 0.0_pReal)) extmsg = trim(extmsg)//' d_caron(D_a,b_sl)' if (any(prm%f_at <= 0.0_pReal)) extmsg = trim(extmsg)//' f_at or b_sl' else slipActive rho_mob_0= emptyRealArray; rho_dip_0 = emptyRealArray - allocate(prm%b_sl,prm%D_a,prm%i_sl,prm%f_at,prm%tau_Peierls, & + allocate(prm%b_sl,prm%d_caron,prm%i_sl,prm%f_at,prm%tau_Peierls, & prm%Q_s,prm%v_0,prm%p,prm%q,prm%B,prm%h,prm%w,prm%omega, & source = emptyRealArray) allocate(prm%forestProjection(0,0)) @@ -316,8 +316,6 @@ module subroutine dislotungsten_dotState(Mp,T,ph,en) ph, & en - real(pReal) :: & - VacancyDiffusion real(pReal), dimension(param(ph)%sum_N_sl) :: & dot_gamma_pos, dot_gamma_neg,& tau_pos,& @@ -325,38 +323,36 @@ module subroutine dislotungsten_dotState(Mp,T,ph,en) v_cl, & dot_rho_dip_formation, & dot_rho_dip_climb, & - dip_distance + d_hat - associate(prm => param(ph), stt => state(ph),& - dot => dotState(ph), dst => dependentState(ph)) + associate(prm => param(ph), stt => state(ph), dot => dotState(ph), dst => dependentState(ph)) call kinetics(Mp,T,ph,en,& dot_gamma_pos,dot_gamma_neg, & tau_pos_out = tau_pos,tau_neg_out = tau_neg) dot%gamma_sl(:,en) = (dot_gamma_pos+dot_gamma_neg) ! ToDo: needs to be abs - VacancyDiffusion = prm%D_0*exp(-prm%Q_cl/(kB*T)) where(dEq0(tau_pos)) ! ToDo: use avg of pos and neg dot_rho_dip_formation = 0.0_pReal dot_rho_dip_climb = 0.0_pReal else where - dip_distance = math_clip(3.0_pReal*prm%mu*prm%b_sl/(16.0_pReal*PI*abs(tau_pos)), & - prm%D_a, & ! lower limit - dst%Lambda_sl(:,en)) ! upper limit - dot_rho_dip_formation = merge(2.0_pReal*dip_distance* stt%rho_mob(:,en)*abs(dot%gamma_sl(:,en))/prm%b_sl, & ! ToDo: ignore region of spontaneous annihilation + d_hat = math_clip(3.0_pReal*prm%mu*prm%b_sl/(16.0_pReal*PI*abs(tau_pos)), & + prm%d_caron, & ! lower limit + dst%Lambda_sl(:,en)) ! upper limit + dot_rho_dip_formation = merge(2.0_pReal*d_hat* stt%rho_mob(:,en)*abs(dot%gamma_sl(:,en))/prm%b_sl, & ! ToDo: ignore region of spontaneous annihilation 0.0_pReal, & prm%dipoleformation) - v_cl = (3.0_pReal*prm%mu*VacancyDiffusion*prm%f_at/(2.0_pReal*pi*kB*T)) & - * (1.0_pReal/(dip_distance+prm%D_a)) - dot_rho_dip_climb = (4.0_pReal*v_cl*stt%rho_dip(:,en))/(dip_distance-prm%D_a) ! ToDo: Discuss with Franz: Stress dependency? + v_cl = (3.0_pReal*prm%mu*prm%D_0*exp(-prm%Q_cl/(kB*T))*prm%f_at/(2.0_pReal*PI*kB*T)) & + * (1.0_pReal/(d_hat+prm%d_caron)) + dot_rho_dip_climb = (4.0_pReal*v_cl*stt%rho_dip(:,en))/(d_hat-prm%d_caron) ! ToDo: Discuss with Franz: Stress dependency? end where dot%rho_mob(:,en) = abs(dot%gamma_sl(:,en))/(prm%b_sl*dst%Lambda_sl(:,en)) & ! multiplication - dot_rho_dip_formation & - - (2.0_pReal*prm%D_a)/prm%b_sl*stt%rho_mob(:,en)*abs(dot%gamma_sl(:,en)) ! Spontaneous annihilation of 2 single edge dislocations + - (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_mob(:,en)*abs(dot%gamma_sl(:,en)) ! Spontaneous annihilation of 2 edges dot%rho_dip(:,en) = dot_rho_dip_formation & - - (2.0_pReal*prm%D_a)/prm%b_sl*stt%rho_dip(:,en)*abs(dot%gamma_sl(:,en)) & ! Spontaneous annihilation of a single edge dislocation with a dipole constituent + - (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_dip(:,en)*abs(dot%gamma_sl(:,en)) & ! Spontaneous annihilation of an edge with a dipole - dot_rho_dip_climb end associate From 527fd306e27b4f7731474ce9d945644f9a3ca2f2 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 23 Jul 2021 22:25:06 +0200 Subject: [PATCH 31/46] change of behavior - gamma (state) increases monotoneously - region of spontaneous annihilation is ignored in dipole formation --- src/phase_mechanical_plastic_dislotungsten.f90 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/phase_mechanical_plastic_dislotungsten.f90 b/src/phase_mechanical_plastic_dislotungsten.f90 index e7cf32080..4f86b23b1 100644 --- a/src/phase_mechanical_plastic_dislotungsten.f90 +++ b/src/phase_mechanical_plastic_dislotungsten.f90 @@ -331,16 +331,16 @@ module subroutine dislotungsten_dotState(Mp,T,ph,en) dot_gamma_pos,dot_gamma_neg, & tau_pos_out = tau_pos,tau_neg_out = tau_neg) - dot%gamma_sl(:,en) = (dot_gamma_pos+dot_gamma_neg) ! ToDo: needs to be abs + dot%gamma_sl(:,en) = abs(dot_gamma_pos+dot_gamma_neg) - where(dEq0(tau_pos)) ! ToDo: use avg of pos and neg + where(dEq0(tau_pos)) ! ToDo: use avg of +/- dot_rho_dip_formation = 0.0_pReal dot_rho_dip_climb = 0.0_pReal else where - d_hat = math_clip(3.0_pReal*prm%mu*prm%b_sl/(16.0_pReal*PI*abs(tau_pos)), & + d_hat = math_clip(3.0_pReal*prm%mu*prm%b_sl/(16.0_pReal*PI*abs(tau_pos)), & ! ToDo: use avg of +/- prm%d_caron, & ! lower limit dst%Lambda_sl(:,en)) ! upper limit - dot_rho_dip_formation = merge(2.0_pReal*d_hat* stt%rho_mob(:,en)*abs(dot%gamma_sl(:,en))/prm%b_sl, & ! ToDo: ignore region of spontaneous annihilation + dot_rho_dip_formation = merge(2.0_pReal*(d_hat-prm%d_caron)*stt%rho_mob(:,en)*dot%gamma_sl(:,en)/prm%b_sl, & 0.0_pReal, & prm%dipoleformation) v_cl = (3.0_pReal*prm%mu*prm%D_0*exp(-prm%Q_cl/(kB*T))*prm%f_at/(2.0_pReal*PI*kB*T)) & @@ -348,11 +348,11 @@ module subroutine dislotungsten_dotState(Mp,T,ph,en) dot_rho_dip_climb = (4.0_pReal*v_cl*stt%rho_dip(:,en))/(d_hat-prm%d_caron) ! ToDo: Discuss with Franz: Stress dependency? end where - dot%rho_mob(:,en) = abs(dot%gamma_sl(:,en))/(prm%b_sl*dst%Lambda_sl(:,en)) & ! multiplication + dot%rho_mob(:,en) = dot%gamma_sl(:,en)/(prm%b_sl*dst%Lambda_sl(:,en)) & ! multiplication - dot_rho_dip_formation & - - (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_mob(:,en)*abs(dot%gamma_sl(:,en)) ! Spontaneous annihilation of 2 edges + - (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_mob(:,en)*dot%gamma_sl(:,en) ! Spontaneous annihilation of 2 edges dot%rho_dip(:,en) = dot_rho_dip_formation & - - (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_dip(:,en)*abs(dot%gamma_sl(:,en)) & ! Spontaneous annihilation of an edge with a dipole + - (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_dip(:,en)*dot%gamma_sl(:,en) & ! Spontaneous annihilation of an edge with a dipole - dot_rho_dip_climb end associate @@ -373,7 +373,7 @@ module subroutine dislotungsten_dependentState(ph,en) dislocationSpacing - associate(prm => param(ph), stt => state(ph),dst => dependentState(ph)) + associate(prm => param(ph), stt => state(ph), dst => dependentState(ph)) dislocationSpacing = sqrt(matmul(prm%forestProjection,stt%rho_mob(:,en)+stt%rho_dip(:,en))) dst%tau_pass(:,en) = prm%mu*prm%b_sl & From d4ffc778c2d491f7930c488197bda23f56c2d071 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 24 Jul 2021 07:09:35 +0200 Subject: [PATCH 32/46] easier to read removed comment regarding use of dot_state in kinetics_t(w/r). Data stored in dotState is not reliable, FPI integrator for writes to it and Runge-Kutta calls the dot state function at different time steps --- src/phase_mechanical_plastic_dislotwin.f90 | 243 +++++++++++---------- 1 file changed, 123 insertions(+), 120 deletions(-) diff --git a/src/phase_mechanical_plastic_dislotwin.f90 b/src/phase_mechanical_plastic_dislotwin.f90 index 4aa62bcb8..1d6fadd13 100644 --- a/src/phase_mechanical_plastic_dislotwin.f90 +++ b/src/phase_mechanical_plastic_dislotwin.f90 @@ -517,7 +517,7 @@ module subroutine dislotwin_LpAndItsTangent(Lp,dLp_dMp,Mp,T,ph,en) integer :: i,k,l,m,n real(pReal) :: & f_unrotated,StressRatio_p,& - BoltzmannRatio, & + E_kB_T, & ddot_gamma_dtau, & tau real(pReal), dimension(param(ph)%sum_N_sl) :: & @@ -587,7 +587,7 @@ module subroutine dislotwin_LpAndItsTangent(Lp,dLp_dMp,Mp,T,ph,en) shearBandingContribution: if(dNeq0(prm%v_sb)) then - BoltzmannRatio = prm%E_sb/(kB*T) + E_kB_T = prm%E_sb/(kB*T) call math_eigh33(eigValues,eigVectors,Mp) ! is Mp symmetric by design? do i = 1,6 @@ -597,8 +597,8 @@ module subroutine dislotwin_LpAndItsTangent(Lp,dLp_dMp,Mp,T,ph,en) significantShearBandStress: if (abs(tau) > tol_math_check) then StressRatio_p = (abs(tau)/prm%xi_sb)**prm%p_sb - dot_gamma_sb = sign(prm%v_sb*exp(-BoltzmannRatio*(1-StressRatio_p)**prm%q_sb), tau) - ddot_gamma_dtau = abs(dot_gamma_sb)*BoltzmannRatio* prm%p_sb*prm%q_sb/ prm%xi_sb & + dot_gamma_sb = sign(prm%v_sb*exp(-E_kB_T*(1-StressRatio_p)**prm%q_sb), tau) + ddot_gamma_dtau = abs(dot_gamma_sb)*E_kB_T*prm%p_sb*prm%q_sb/prm%xi_sb & * (abs(tau)/prm%xi_sb)**(prm%p_sb-1.0_pReal) & * (1.0_pReal-StressRatio_p)**(prm%q_sb-1.0_pReal) @@ -649,58 +649,58 @@ module subroutine dislotwin_dotState(Mp,T,ph,en) associate(prm => param(ph), stt => state(ph), dot => dotState(ph), dst => dependentState(ph)) - f_unrotated = 1.0_pReal & - - sum(stt%f_tw(1:prm%sum_N_tw,en)) & - - sum(stt%f_tr(1:prm%sum_N_tr,en)) + f_unrotated = 1.0_pReal & + - sum(stt%f_tw(1:prm%sum_N_tw,en)) & + - sum(stt%f_tr(1:prm%sum_N_tr,en)) - call kinetics_sl(Mp,T,ph,en,dot_gamma_sl) - dot%gamma_sl(:,en) = abs(dot_gamma_sl) + call kinetics_sl(Mp,T,ph,en,dot_gamma_sl) + dot%gamma_sl(:,en) = abs(dot_gamma_sl) - slipState: do i = 1, prm%sum_N_sl - tau = math_tensordot(Mp,prm%P_sl(1:3,1:3,i)) + slipState: do i = 1, prm%sum_N_sl + tau = math_tensordot(Mp,prm%P_sl(1:3,1:3,i)) - significantSlipStress: if (dEq0(tau) .or. prm%omitDipoles) then - dot_rho_dip_formation(i) = 0.0_pReal - dot_rho_dip_climb(i) = 0.0_pReal - else significantSlipStress - d_hat = 3.0_pReal*prm%mu*prm%b_sl(i)/(16.0_pReal*PI*abs(tau)) - d_hat = math_clip(d_hat, right = dst%Lambda_sl(i,en)) - d_hat = math_clip(d_hat, left = prm%d_caron(i)) - - dot_rho_dip_formation(i) = 2.0_pReal*(d_hat-prm%d_caron(i))/prm%b_sl(i) & - * stt%rho_mob(i,en)*abs(dot_gamma_sl(i)) - - if (dEq(d_hat,prm%d_caron(i))) then + significantSlipStress: if (dEq0(tau) .or. prm%omitDipoles) then + dot_rho_dip_formation(i) = 0.0_pReal dot_rho_dip_climb(i) = 0.0_pReal - else - ! Argon & Moffat, Acta Metallurgica, Vol. 29, pg 293 to 299, 1981 - sigma_cl = dot_product(prm%n0_sl(1:3,i),matmul(Mp,prm%n0_sl(1:3,i))) - b_d = merge(24.0_pReal*PI*(1.0_pReal - prm%nu)/(2.0_pReal + prm%nu) & - * (prm%Gamma_sf(1) + prm%Gamma_sf(2) * T) / (prm%mu*prm%b_sl(i)), & - 1.0_pReal, & - prm%ExtendedDislocations) - v_cl = 2.0_pReal*prm%omega*b_d**2.0_pReal*exp(-prm%Q_cl/(kB*T)) & - * (exp(abs(sigma_cl)*prm%b_sl(i)**3.0_pReal/(kB*T)) - 1.0_pReal) + else significantSlipStress + d_hat = 3.0_pReal*prm%mu*prm%b_sl(i)/(16.0_pReal*PI*abs(tau)) + d_hat = math_clip(d_hat, right = dst%Lambda_sl(i,en)) + d_hat = math_clip(d_hat, left = prm%d_caron(i)) - dot_rho_dip_climb(i) = 4.0_pReal*v_cl*stt%rho_dip(i,en) & - / (d_hat-prm%d_caron(i)) - endif - endif significantSlipStress - enddo slipState + dot_rho_dip_formation(i) = 2.0_pReal*(d_hat-prm%d_caron(i))/prm%b_sl(i) & + * stt%rho_mob(i,en)*abs(dot_gamma_sl(i)) - dot%rho_mob(:,en) = abs(dot_gamma_sl)/(prm%b_sl*dst%Lambda_sl(:,en)) & - - dot_rho_dip_formation & - - 2.0_pReal*prm%d_caron/prm%b_sl * stt%rho_mob(:,en)*abs(dot_gamma_sl) + if (dEq(d_hat,prm%d_caron(i))) then + dot_rho_dip_climb(i) = 0.0_pReal + else + ! Argon & Moffat, Acta Metallurgica, Vol. 29, pg 293 to 299, 1981 + sigma_cl = dot_product(prm%n0_sl(1:3,i),matmul(Mp,prm%n0_sl(1:3,i))) + b_d = merge(24.0_pReal*PI*(1.0_pReal - prm%nu)/(2.0_pReal + prm%nu) & + * (prm%Gamma_sf(1) + prm%Gamma_sf(2) * T) / (prm%mu*prm%b_sl(i)), & + 1.0_pReal, & + prm%ExtendedDislocations) + v_cl = 2.0_pReal*prm%omega*b_d**2.0_pReal*exp(-prm%Q_cl/(kB*T)) & + * (exp(abs(sigma_cl)*prm%b_sl(i)**3.0_pReal/(kB*T)) - 1.0_pReal) - dot%rho_dip(:,en) = dot_rho_dip_formation & - - 2.0_pReal*prm%d_caron/prm%b_sl * stt%rho_dip(:,en)*abs(dot_gamma_sl) & - - dot_rho_dip_climb + dot_rho_dip_climb(i) = 4.0_pReal*v_cl*stt%rho_dip(i,en) & + / (d_hat-prm%d_caron(i)) + endif + endif significantSlipStress + enddo slipState - call kinetics_tw(Mp,T,dot_gamma_sl,ph,en,dot_gamma_tw) - dot%f_tw(:,en) = f_unrotated*dot_gamma_tw/prm%gamma_char + dot%rho_mob(:,en) = abs(dot_gamma_sl)/(prm%b_sl*dst%Lambda_sl(:,en)) & + - dot_rho_dip_formation & + - 2.0_pReal*prm%d_caron/prm%b_sl * stt%rho_mob(:,en)*abs(dot_gamma_sl) - call kinetics_tr(Mp,T,dot_gamma_sl,ph,en,dot_gamma_tr) - dot%f_tr(:,en) = f_unrotated*dot_gamma_tr + dot%rho_dip(:,en) = dot_rho_dip_formation & + - 2.0_pReal*prm%d_caron/prm%b_sl * stt%rho_dip(:,en)*abs(dot_gamma_sl) & + - dot_rho_dip_climb + + call kinetics_tw(Mp,T,dot_gamma_sl,ph,en,dot_gamma_tw) + dot%f_tw(:,en) = f_unrotated*dot_gamma_tw/prm%gamma_char + + call kinetics_tr(Mp,T,dot_gamma_sl,ph,en,dot_gamma_tr) + dot%f_tr(:,en) = f_unrotated*dot_gamma_tr end associate @@ -865,7 +865,7 @@ pure subroutine kinetics_sl(Mp,T,ph,en, & tau, & stressRatio, & StressRatio_p, & - BoltzmannRatio, & + Q_kB_T, & v_wait_inverse, & !< inverse of the effective velocity of a dislocation waiting at obstacles (unsigned) v_run_inverse, & !< inverse of the velocity of a free moving dislocation (unsigned) dV_wait_inverse_dTau, & @@ -874,33 +874,34 @@ pure subroutine kinetics_sl(Mp,T,ph,en, & tau_eff !< effective resolved stress integer :: i + associate(prm => param(ph), stt => state(ph), dst => dependentState(ph)) - tau = [(math_tensordot(Mp,prm%P_sl(1:3,1:3,i)),i = 1, prm%sum_N_sl)] + tau = [(math_tensordot(Mp,prm%P_sl(1:3,1:3,i)),i = 1, prm%sum_N_sl)] - tau_eff = abs(tau)-dst%tau_pass(:,en) + tau_eff = abs(tau)-dst%tau_pass(:,en) - significantStress: where(tau_eff > tol_math_check) - stressRatio = tau_eff/prm%tau_0 - StressRatio_p = stressRatio** prm%p - BoltzmannRatio = prm%Q_sl/(kB*T) - v_wait_inverse = prm%v_0**(-1.0_pReal) * exp(BoltzmannRatio*(1.0_pReal-StressRatio_p)** prm%q) - v_run_inverse = prm%B/(tau_eff*prm%b_sl) + significantStress: where(tau_eff > tol_math_check) + stressRatio = tau_eff/prm%tau_0 + StressRatio_p = stressRatio** prm%p + Q_kB_T = prm%Q_sl/(kB*T) + v_wait_inverse = prm%v_0**(-1.0_pReal) * exp(Q_kB_T*(1.0_pReal-StressRatio_p)** prm%q) + v_run_inverse = prm%B/(tau_eff*prm%b_sl) - dot_gamma_sl = sign(stt%rho_mob(:,en)*prm%b_sl/(v_wait_inverse+v_run_inverse),tau) + dot_gamma_sl = sign(stt%rho_mob(:,en)*prm%b_sl/(v_wait_inverse+v_run_inverse),tau) - dV_wait_inverse_dTau = -1.0_pReal * v_wait_inverse * prm%p * prm%q * BoltzmannRatio & - * (stressRatio**(prm%p-1.0_pReal)) & - * (1.0_pReal-StressRatio_p)**(prm%q-1.0_pReal) & - / prm%tau_0 - dV_run_inverse_dTau = -1.0_pReal * v_run_inverse/tau_eff - dV_dTau = -1.0_pReal * (dV_wait_inverse_dTau+dV_run_inverse_dTau) & - / (v_wait_inverse+v_run_inverse)**2.0_pReal - ddot_gamma_dtau = dV_dTau*stt%rho_mob(:,en)*prm%b_sl - else where significantStress - dot_gamma_sl = 0.0_pReal - ddot_gamma_dtau = 0.0_pReal - end where significantStress + dV_wait_inverse_dTau = -1.0_pReal * v_wait_inverse * prm%p * prm%q * Q_kB_T & + * (stressRatio**(prm%p-1.0_pReal)) & + * (1.0_pReal-StressRatio_p)**(prm%q-1.0_pReal) & + / prm%tau_0 + dV_run_inverse_dTau = -1.0_pReal * v_run_inverse/tau_eff + dV_dTau = -1.0_pReal * (dV_wait_inverse_dTau+dV_run_inverse_dTau) & + / (v_wait_inverse+v_run_inverse)**2.0_pReal + ddot_gamma_dtau = dV_dTau*stt%rho_mob(:,en)*prm%b_sl + else where significantStress + dot_gamma_sl = 0.0_pReal + ddot_gamma_dtau = 0.0_pReal + end where significantStress end associate @@ -943,34 +944,35 @@ pure subroutine kinetics_tw(Mp,T,dot_gamma_sl,ph,en,& integer :: i,s1,s2 + associate(prm => param(ph), stt => state(ph), dst => dependentState(ph)) - do i = 1, prm%sum_N_tw - tau(i) = math_tensordot(Mp,prm%P_tw(1:3,1:3,i)) - isFCC: if (prm%fccTwinTransNucleation) then - s1=prm%fcc_twinNucleationSlipPair(1,i) - s2=prm%fcc_twinNucleationSlipPair(2,i) - if (tau(i) < dst%tau_r_tw(i,en)) then ! ToDo: correct? - Ndot0=(abs(dot_gamma_sl(s1))*(stt%rho_mob(s2,en)+stt%rho_dip(s2,en))+& - abs(dot_gamma_sl(s2))*(stt%rho_mob(s1,en)+stt%rho_dip(s1,en)))/& ! ToDo: MD: it would be more consistent to use shearrates from state - (prm%L_tw*prm%b_sl(i))*& - (1.0_pReal-exp(-prm%V_cs/(kB*T)*(dst%tau_r_tw(i,en)-tau(i)))) ! P_ncs - else - Ndot0=0.0_pReal - end if - else isFCC - Ndot0=prm%dot_N_0_tw(i) - endif isFCC - enddo + do i = 1, prm%sum_N_tw + tau(i) = math_tensordot(Mp,prm%P_tw(1:3,1:3,i)) + isFCC: if (prm%fccTwinTransNucleation) then + s1=prm%fcc_twinNucleationSlipPair(1,i) + s2=prm%fcc_twinNucleationSlipPair(2,i) + if (tau(i) < dst%tau_r_tw(i,en)) then ! ToDo: correct? + Ndot0=(abs(dot_gamma_sl(s1))*(stt%rho_mob(s2,en)+stt%rho_dip(s2,en))+& + abs(dot_gamma_sl(s2))*(stt%rho_mob(s1,en)+stt%rho_dip(s1,en)))/& + (prm%L_tw*prm%b_sl(i))*& + (1.0_pReal-exp(-prm%V_cs/(kB*T)*(dst%tau_r_tw(i,en)-tau(i)))) + else + Ndot0=0.0_pReal + end if + else isFCC + Ndot0=prm%dot_N_0_tw(i) + endif isFCC + enddo - significantStress: where(tau > tol_math_check) - StressRatio_r = (dst%tau_hat_tw(:,en)/tau)**prm%r - dot_gamma_tw = prm%gamma_char * dst%V_tw(:,en) * Ndot0*exp(-StressRatio_r) - ddot_gamma_dtau = (dot_gamma_tw*prm%r/tau)*StressRatio_r - else where significantStress - dot_gamma_tw = 0.0_pReal - ddot_gamma_dtau = 0.0_pReal - end where significantStress + significantStress: where(tau > tol_math_check) + StressRatio_r = (dst%tau_hat_tw(:,en)/tau)**prm%r + dot_gamma_tw = prm%gamma_char * dst%V_tw(:,en) * Ndot0*exp(-StressRatio_r) + ddot_gamma_dtau = (dot_gamma_tw*prm%r/tau)*StressRatio_r + else where significantStress + dot_gamma_tw = 0.0_pReal + ddot_gamma_dtau = 0.0_pReal + end where significantStress end associate @@ -1009,36 +1011,37 @@ pure subroutine kinetics_tr(Mp,T,dot_gamma_sl,ph,en,& Ndot0, & stressRatio_s, & ddot_gamma_dtau - integer :: i,s1,s2 + + associate(prm => param(ph), stt => state(ph), dst => dependentState(ph)) - do i = 1, prm%sum_N_tr - tau(i) = math_tensordot(Mp,prm%P_tr(1:3,1:3,i)) - isFCC: if (prm%fccTwinTransNucleation) then - s1=prm%fcc_twinNucleationSlipPair(1,i) - s2=prm%fcc_twinNucleationSlipPair(2,i) - if (tau(i) < dst%tau_r_tr(i,en)) then ! ToDo: correct? - Ndot0=(abs(dot_gamma_sl(s1))*(stt%rho_mob(s2,en)+stt%rho_dip(s2,en))+& - abs(dot_gamma_sl(s2))*(stt%rho_mob(s1,en)+stt%rho_dip(s1,en)))/& ! ToDo: MD: it would be more consistent to use shearrates from state - (prm%L_tr*prm%b_sl(i))*& - (1.0_pReal-exp(-prm%V_cs/(kB*T)*(dst%tau_r_tr(i,en)-tau(i)))) ! P_ncs - else - Ndot0=0.0_pReal - end if - else isFCC - Ndot0=prm%dot_N_0_tr(i) - endif isFCC - enddo + do i = 1, prm%sum_N_tr + tau(i) = math_tensordot(Mp,prm%P_tr(1:3,1:3,i)) + isFCC: if (prm%fccTwinTransNucleation) then + s1=prm%fcc_twinNucleationSlipPair(1,i) + s2=prm%fcc_twinNucleationSlipPair(2,i) + if (tau(i) < dst%tau_r_tr(i,en)) then ! ToDo: correct? + Ndot0=(abs(dot_gamma_sl(s1))*(stt%rho_mob(s2,en)+stt%rho_dip(s2,en))+& + abs(dot_gamma_sl(s2))*(stt%rho_mob(s1,en)+stt%rho_dip(s1,en)))/& + (prm%L_tr*prm%b_sl(i))*& + (1.0_pReal-exp(-prm%V_cs/(kB*T)*(dst%tau_r_tr(i,en)-tau(i)))) + else + Ndot0=0.0_pReal + end if + else isFCC + Ndot0=prm%dot_N_0_tr(i) + endif isFCC + enddo - significantStress: where(tau > tol_math_check) - StressRatio_s = (dst%tau_hat_tr(:,en)/tau)**prm%s - dot_gamma_tr = dst%V_tr(:,en) * Ndot0*exp(-StressRatio_s) - ddot_gamma_dtau = (dot_gamma_tr*prm%s/tau)*StressRatio_s - else where significantStress - dot_gamma_tr = 0.0_pReal - ddot_gamma_dtau = 0.0_pReal - end where significantStress + significantStress: where(tau > tol_math_check) + StressRatio_s = (dst%tau_hat_tr(:,en)/tau)**prm%s + dot_gamma_tr = dst%V_tr(:,en) * Ndot0*exp(-StressRatio_s) + ddot_gamma_dtau = (dot_gamma_tr*prm%s/tau)*StressRatio_s + else where significantStress + dot_gamma_tr = 0.0_pReal + ddot_gamma_dtau = 0.0_pReal + end where significantStress end associate From 6f906647eb1198d6563851089f274d01b73a2daa Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 24 Jul 2021 09:10:16 +0200 Subject: [PATCH 33/46] documenting hex --- PRIVATE | 2 +- .../mechanical/plastic/phenopowerlaw_Mg.yaml} | 33 ++++++++++++------- .../mechanical/plastic/phenopowerlaw_Ti.yaml | 5 ++- 3 files changed, 26 insertions(+), 14 deletions(-) rename examples/config/{Phase_Phenopowerlaw_Magnesium.yaml => phase/mechanical/plastic/phenopowerlaw_Mg.yaml} (65%) diff --git a/PRIVATE b/PRIVATE index 347932db3..020cf0621 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 347932db368ec5c0d9e9092ef106c225605d830a +Subproject commit 020cf06218fc4f14cb55ae0527972d12a57343bc diff --git a/examples/config/Phase_Phenopowerlaw_Magnesium.yaml b/examples/config/phase/mechanical/plastic/phenopowerlaw_Mg.yaml similarity index 65% rename from examples/config/Phase_Phenopowerlaw_Magnesium.yaml rename to examples/config/phase/mechanical/plastic/phenopowerlaw_Mg.yaml index 4d4b9eb8e..b29075173 100644 --- a/examples/config/Phase_Phenopowerlaw_Magnesium.yaml +++ b/examples/config/phase/mechanical/plastic/phenopowerlaw_Mg.yaml @@ -1,20 +1,29 @@ -N_sl: [3, 3, 0, 6, 0, 6] -N_tw: [6, 0, 0, 6] -h_0_tw-tw: 50.0e+6 -h_0_sl-sl: 500.0e+6 -h_0_tw-sl: 150.0e+6 -h_sl-sl: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -h_tw-tw: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -h_sl-tw: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -h_tw-sl: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -output: [xi_sl, xi_tw] type: phenopowerlaw -xi_0_sl: [10.e+6, 55.e+6, 0., 60.e+6, 0., 60.e+6] +references: + - F. Wang et al., + Acta Materialia 80:77-93, 2014, + https://doi.org/10.1016/j.actamat.2014.07.048 + +output: [xi_sl, xi_tw] + +N_sl: [3, 3, 0, 6, 0, 6] # basal, 1. prism, -, 1. pyr, -, 2. pyr +N_tw: [6, 0, 6] # tension, -, compression + +xi_0_sl: [10.e+6, 55.e+6, 0., 60.e+6, 0., 60.e+6] xi_inf_sl: [40.e+6, 135.e+6, 0., 150.e+6, 0., 150.e+6] -xi_0_tw: [40.e+6, 0., 0., 60.e+6] +xi_0_tw: [40.e+6, 0., 60.e+6] + a_sl: 2.25 dot_gamma_0_sl: 0.001 dot_gamma_0_tw: 0.001 n_sl: 20 n_tw: 20 f_sat_sl-tw: 10.0 + +h_0_sl-sl: 500.0e+6 +h_0_tw-tw: 50.0e+6 +h_0_tw-sl: 150.0e+6 +h_sl-sl: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +h_tw-tw: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +h_tw-sl: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +h_sl-tw: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] diff --git a/examples/config/phase/mechanical/plastic/phenopowerlaw_Ti.yaml b/examples/config/phase/mechanical/plastic/phenopowerlaw_Ti.yaml index 5e05206df..804cf4541 100644 --- a/examples/config/phase/mechanical/plastic/phenopowerlaw_Ti.yaml +++ b/examples/config/phase/mechanical/plastic/phenopowerlaw_Ti.yaml @@ -7,14 +7,17 @@ references: Acta Materialia 132:598-610, 2017, https://doi.org/10.1016/j.actamat.2017.05.015 output: [gamma_sl] -N_sl: [3, 3, 0, 0, 12] + +N_sl: [3, 3, 0, 0, 12] # basal, 1. prism, -, -, 2. pyr n_sl: 20 a_sl: 2.0 dot_gamma_0_sl: 0.001 h_0_sl-sl: 200.e+6 + # C. Zambaldi et al.: xi_0_sl: [349.e+6, 150.e+6, 0.0, 0.0, 1107.e+6] xi_inf_sl: [568.e+6, 150.e+7, 0.0, 0.0, 3420.e+6] # L. Wang et al. : # xi_0_sl: [127.e+6, 96.e+6, 0.0, 0.0, 240.e+6] + h_sl-sl: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] From 931dc9955752ec99759c2aa36f9c137ee5ca0b89 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 24 Jul 2021 11:21:07 +0200 Subject: [PATCH 34/46] not used climb formulation was updated a while ago --- PRIVATE | 2 +- .../config/phase/mechanical/plastic/dislotwin_IF-steel.yaml | 1 - src/phase_mechanical_plastic_dislotwin.f90 | 5 +---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/PRIVATE b/PRIVATE index 020cf0621..c656b6f08 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 020cf06218fc4f14cb55ae0527972d12a57343bc +Subproject commit c656b6f08489756c9ee6a6e1a62858c8b7836f10 diff --git a/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml b/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml index e48d5437f..362797d0b 100644 --- a/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml +++ b/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml @@ -19,6 +19,5 @@ i_sl: [23.3, 23.3] D_a: 7.4 # C_anni B: [0.001, 0.001] h_sl-sl: [0.1, 0.72, 0.1, 0.053, 0.053, 0.073, 0.137, 0.72, 0.72, 0.053, 0.053, 0.053, 0.053, 0.073, 0.073, 0.073, 0.073, 0.073, 0.073, 0.137, 0.073, 0.073, 0.137, 0.073] -D_0: 4.0e-05 Q_cl: 5.4e-19 # no recovery! D: 40.e-6 # estimated diff --git a/src/phase_mechanical_plastic_dislotwin.f90 b/src/phase_mechanical_plastic_dislotwin.f90 index 1d6fadd13..2cc6f4af8 100644 --- a/src/phase_mechanical_plastic_dislotwin.f90 +++ b/src/phase_mechanical_plastic_dislotwin.f90 @@ -16,7 +16,6 @@ submodule(phase:plastic) dislotwin real(pReal) :: & mu = 1.0_pReal, & !< equivalent shear modulus nu = 1.0_pReal, & !< equivalent shear Poisson's ratio - D_0 = 1.0_pReal, & !< prefactor for self-diffusion coefficient Q_cl = 1.0_pReal, & !< activation energy for dislocation climb omega = 1.0_pReal, & !< frequency factor for dislocation climb D = 1.0_pReal, & !< grain size @@ -214,7 +213,6 @@ module function plastic_dislotwin_init() result(myPlasticity) prm%B = pl%get_as1dFloat('B', requiredSize=size(N_sl), & defaultVal=[(0.0_pReal, i=1,size(N_sl))]) - prm%D_0 = pl%get_asFloat('D_0') prm%Q_cl = pl%get_asFloat('Q_cl') prm%ExtendedDislocations = pl%get_asBool('extend_dislocations',defaultVal = .false.) @@ -230,7 +228,7 @@ module function plastic_dislotwin_init() result(myPlasticity) rho_dip_0 = math_expand(rho_dip_0, N_sl) prm%v_0 = math_expand(prm%v_0, N_sl) prm%b_sl = math_expand(prm%b_sl, N_sl) - prm%Q_sl = math_expand(prm%Q_sl, N_sl) + prm%Q_sl = math_expand(prm%Q_sl, N_sl) prm%i_sl = math_expand(prm%i_sl, N_sl) prm%p = math_expand(prm%p, N_sl) prm%q = math_expand(prm%q, N_sl) @@ -239,7 +237,6 @@ module function plastic_dislotwin_init() result(myPlasticity) prm%d_caron = pl%get_asFloat('D_a') * prm%b_sl ! sanity checks - if ( prm%D_0 <= 0.0_pReal) extmsg = trim(extmsg)//' D_0' if ( prm%Q_cl <= 0.0_pReal) extmsg = trim(extmsg)//' Q_cl' if (any(rho_mob_0 < 0.0_pReal)) extmsg = trim(extmsg)//' rho_mob_0' if (any(rho_dip_0 < 0.0_pReal)) extmsg = trim(extmsg)//' rho_dip_0' From d6ce721a2516d1bbb8aa7f3253ae49bc0d061aff Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 24 Jul 2021 12:10:59 +0200 Subject: [PATCH 35/46] need to check type of leaf otherwise, using a [list] where a scalar is expected results in a crash, not in a meaningful error message --- src/YAML_types.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/YAML_types.f90 b/src/YAML_types.f90 index 45907fbae..e11be1275 100644 --- a/src/YAML_types.f90 +++ b/src/YAML_types.f90 @@ -849,7 +849,7 @@ function tNode_get_byKey_as1dFloat(self,k,defaultVal,requiredSize) result(nodeAs if (self%contains(k)) then node => self%get(k) - select type(self) + select type(node) class is(tList) list => node%asList() nodeAs1dFloat = list%as1dFloat() From f22f30e05da9008998a6c9316c470c8ac621c93e Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 24 Jul 2021 14:27:00 +0200 Subject: [PATCH 36/46] same functionality as for 1D --- src/YAML_types.f90 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/YAML_types.f90 b/src/YAML_types.f90 index e11be1275..8f81923a8 100644 --- a/src/YAML_types.f90 +++ b/src/YAML_types.f90 @@ -872,11 +872,12 @@ end function tNode_get_byKey_as1dFloat !-------------------------------------------------------------------------------------------------- !> @brief Access by key and convert to float array (2D) !-------------------------------------------------------------------------------------------------- -function tNode_get_byKey_as2dFloat(self,k,defaultVal) result(nodeAs2dFloat) +function tNode_get_byKey_as2dFloat(self,k,defaultVal,requiredShape) result(nodeAs2dFloat) class(tNode), intent(in), target :: self character(len=*), intent(in) :: k real(pReal), intent(in), dimension(:,:), optional :: defaultVal + integer, intent(in), dimension(2), optional :: requiredShape real(pReal), dimension(:,:), allocatable :: nodeAs2dFloat @@ -898,6 +899,10 @@ function tNode_get_byKey_as2dFloat(self,k,defaultVal) result(nodeAs2dFloat) call IO_error(143,ext_msg=k) endif + if (present(requiredShape)) then + if (any(requiredShape /= shape(nodeAs2dFloat))) call IO_error(146,ext_msg=k) + endif + end function tNode_get_byKey_as2dFloat From db07ee2113dc58b44b7aaf2c01d70d95bb955222 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 24 Jul 2021 14:35:17 +0200 Subject: [PATCH 37/46] supported by recent compilers --- src/HDF5_utilities.f90 | 56 +++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/HDF5_utilities.f90 b/src/HDF5_utilities.f90 index 638b74c0e..c5086ab81 100644 --- a/src/HDF5_utilities.f90 +++ b/src/HDF5_utilities.f90 @@ -549,7 +549,7 @@ subroutine HDF5_read_real1(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & ! ToDo: Fortran 2018 size(shape(A)) = rank(A) + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -589,7 +589,7 @@ subroutine HDF5_read_real2(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -629,7 +629,7 @@ subroutine HDF5_read_real3(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -669,7 +669,7 @@ subroutine HDF5_read_real4(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -709,7 +709,7 @@ subroutine HDF5_read_real5(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -749,7 +749,7 @@ subroutine HDF5_read_real6(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -789,7 +789,7 @@ subroutine HDF5_read_real7(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -831,7 +831,7 @@ subroutine HDF5_read_int1(dataset,loc_id,datasetName,parallel) integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -871,7 +871,7 @@ subroutine HDF5_read_int2(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -911,7 +911,7 @@ subroutine HDF5_read_int3(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -951,7 +951,7 @@ subroutine HDF5_read_int4(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -991,7 +991,7 @@ subroutine HDF5_read_int5(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1031,7 +1031,7 @@ subroutine HDF5_read_int6(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1071,7 +1071,7 @@ subroutine HDF5_read_int7(dataset,loc_id,datasetName,parallel) logical, intent(in), optional :: parallel !< dataset is distributed over multiple processes integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id, aplist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1114,7 +1114,7 @@ subroutine HDF5_write_real1(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1155,7 +1155,7 @@ subroutine HDF5_write_real2(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1196,7 +1196,7 @@ subroutine HDF5_write_real3(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1237,7 +1237,7 @@ subroutine HDF5_write_real4(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1279,7 +1279,7 @@ subroutine HDF5_write_real5(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1320,7 +1320,7 @@ subroutine HDF5_write_real6(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1361,7 +1361,7 @@ subroutine HDF5_write_real7(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1403,7 +1403,7 @@ subroutine HDF5_write_int1(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1444,7 +1444,7 @@ subroutine HDF5_write_int2(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1485,7 +1485,7 @@ subroutine HDF5_write_int3(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1526,7 +1526,7 @@ subroutine HDF5_write_int4(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1567,7 +1567,7 @@ subroutine HDF5_write_int5(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1608,7 +1608,7 @@ subroutine HDF5_write_int6(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) @@ -1649,7 +1649,7 @@ subroutine HDF5_write_int7(dataset,loc_id,datasetName,parallel) integer :: hdferr integer(HID_T) :: dset_id, filespace_id, memspace_id, plist_id - integer(HSIZE_T), dimension(size(shape(dataset))) :: & + integer(HSIZE_T), dimension(rank(dataset)) :: & myStart, & myShape, & !< shape of the dataset (this process) totalShape !< shape of the dataset (all processes) From d87b10bfe76ece429c450ad8fc56a7ff0a6295d3 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 24 Jul 2021 15:03:26 +0200 Subject: [PATCH 38/46] symbolic names --- src/material.f90 | 16 ++++++++++----- src/phase.f90 | 24 ++++++++++------------- src/phase_mechanical.f90 | 4 ++-- src/phase_mechanical_plastic_nonlocal.f90 | 4 ++-- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/material.f90 b/src/material.f90 index cd8a320fa..652cc30fb 100644 --- a/src/material.f90 +++ b/src/material.f90 @@ -8,6 +8,7 @@ module material use prec use config use results + use math use IO use rotations use discretization @@ -19,8 +20,12 @@ module material type :: tRotationContainer type(Rotation), dimension(:), allocatable :: data end type + type :: tTensorContainer + real(pReal), dimension(:,:,:), allocatable :: data + end type - type(tRotationContainer), dimension(:), allocatable :: material_orientation0 + + type(tRotationContainer), dimension(:), allocatable :: material_O_0 integer, dimension(:), allocatable, public, protected :: & homogenization_Nconstituents !< number of grains in each homogenization @@ -41,8 +46,9 @@ module material integer, dimension(:,:,:), allocatable, public, protected :: & ! (constituent,IP,elem) material_phaseMemberAt !TODO: remove public :: & + tTensorContainer, & tRotationContainer, & - material_orientation0, & + material_O_0, & material_init contains @@ -152,15 +158,15 @@ subroutine parse() enddo - allocate(material_orientation0(materials%length)) + allocate(material_O_0(materials%length)) do ma = 1, materials%length material => materials%get(ma) constituents => material%get('constituents') - allocate(material_orientation0(ma)%data(constituents%length)) + allocate(material_O_0(ma)%data(constituents%length)) do co = 1, constituents%length constituent => constituents%get(co) - call material_orientation0(ma)%data(co)%fromQuaternion(constituent%get_as1dFloat('O',requiredSize=4)) + call material_O_0(ma)%data(co)%fromQuaternion(constituent%get_as1dFloat('O',requiredSize=4)) enddo enddo diff --git a/src/phase.f90 b/src/phase.f90 index d90f41ccc..effe189d3 100644 --- a/src/phase.f90 +++ b/src/phase.f90 @@ -26,12 +26,8 @@ module phase real(pReal), allocatable, dimension(:) :: phase_rho type(tRotationContainer), dimension(:), allocatable :: & - phase_orientation0, & - phase_orientation - - type :: tTensorContainer - real(pReal), dimension(:,:,:), allocatable :: data - end type + phase_O_0, & + phase_O type :: tNumerics integer :: & @@ -364,7 +360,7 @@ subroutine phase_init allocate(phase_lattice(phases%length)) allocate(phase_cOverA(phases%length),source=-1.0_pReal) allocate(phase_rho(phases%length)) - allocate(phase_orientation0(phases%length)) + allocate(phase_O_0(phases%length)) do ph = 1,phases%length phase => phases%get(ph) @@ -374,20 +370,20 @@ subroutine phase_init if (any(phase_lattice(ph) == ['hP','tI'])) & phase_cOverA(ph) = phase%get_asFloat('c/a') phase_rho(ph) = phase%get_asFloat('rho',defaultVal=0.0_pReal) - allocate(phase_orientation0(ph)%data(count(material_phaseID==ph))) + allocate(phase_O_0(ph)%data(count(material_phaseID==ph))) enddo do ce = 1, size(material_phaseID,2) ma = discretization_materialAt((ce-1)/discretization_nIPs+1) do co = 1,homogenization_Nconstituents(material_homogenizationID(ce)) ph = material_phaseID(co,ce) - phase_orientation0(ph)%data(material_phaseEntry(co,ce)) = material_orientation0(ma)%data(co) + phase_O_0(ph)%data(material_phaseEntry(co,ce)) = material_O_0(ma)%data(co) enddo enddo - allocate(phase_orientation(phases%length)) + allocate(phase_O(phases%length)) do ph = 1,phases%length - phase_orientation(ph)%data = phase_orientation0(ph)%data + phase_O(ph)%data = phase_O_0(ph)%data enddo call mechanical_init(materials,phases) @@ -577,10 +573,10 @@ subroutine crystallite_orientations(co,ip,el) ph = material_phaseID(co,(el-1)*discretization_nIPs + ip) en = material_phaseEntry(co,(el-1)*discretization_nIPs + ip) - call phase_orientation(ph)%data(en)%fromMatrix(transpose(math_rotationalPart(mechanical_F_e(ph,en)))) + call phase_O(ph)%data(en)%fromMatrix(transpose(math_rotationalPart(mechanical_F_e(ph,en)))) if (plasticState(material_phaseAt(1,el))%nonlocal) & - call plastic_nonlocal_updateCompatibility(phase_orientation,material_phaseAt(1,el),ip,el) + call plastic_nonlocal_updateCompatibility(phase_O,material_phaseAt(1,el),ip,el) end subroutine crystallite_orientations @@ -602,7 +598,7 @@ function crystallite_push33ToRef(co,ce, tensor33) ph = material_phaseID(co,ce) en = material_phaseEntry(co,ce) - T = matmul(phase_orientation0(ph)%data(en)%asMatrix(),transpose(math_inv33(phase_F(co,ce)))) ! ToDo: initial orientation correct? + T = matmul(phase_O_0(ph)%data(en)%asMatrix(),transpose(math_inv33(phase_F(co,ce)))) ! ToDo: initial orientation correct? crystallite_push33ToRef = matmul(transpose(T),matmul(tensor33,T)) diff --git a/src/phase_mechanical.f90 b/src/phase_mechanical.f90 index c972ed3cd..0c1a99c55 100644 --- a/src/phase_mechanical.f90 +++ b/src/phase_mechanical.f90 @@ -265,7 +265,7 @@ module subroutine mechanical_init(materials,phases) do ph = 1, phases%length do en = 1, count(material_phaseID == ph) - phase_mechanical_Fp0(ph)%data(1:3,1:3,en) = phase_orientation0(ph)%data(en)%asMatrix() ! Fp reflects initial orientation (see 10.1016/j.actamat.2006.01.005) + phase_mechanical_Fp0(ph)%data(1:3,1:3,en) = phase_O_0(ph)%data(en)%asMatrix() ! Fp reflects initial orientation (see 10.1016/j.actamat.2006.01.005) phase_mechanical_Fp0(ph)%data(1:3,1:3,en) = phase_mechanical_Fp0(ph)%data(1:3,1:3,en) & / math_det33(phase_mechanical_Fp0(ph)%data(1:3,1:3,en))**(1.0_pReal/3.0_pReal) phase_mechanical_Fi0(ph)%data(1:3,1:3,en) = math_I3 @@ -935,7 +935,7 @@ subroutine crystallite_results(group,ph) call results_writeDataset(phase_mechanical_S(ph)%data,group//'/mechanical/','S', & 'second Piola-Kirchhoff stress','Pa') case('O') - selected_rotations = select_rotations(phase_orientation(ph)%data) + selected_rotations = select_rotations(phase_O(ph)%data) call results_writeDataset(selected_rotations,group//'/mechanical',output_constituent(ph)%label(ou),& 'crystal orientation as quaternion','q_0 (q_1 q_2 q_3)') call results_addAttribute('lattice',phase_lattice(ph),group//'/mechanical/'//output_constituent(ph)%label(ou)) diff --git a/src/phase_mechanical_plastic_nonlocal.f90 b/src/phase_mechanical_plastic_nonlocal.f90 index 9510d0b81..f7941c7e5 100644 --- a/src/phase_mechanical_plastic_nonlocal.f90 +++ b/src/phase_mechanical_plastic_nonlocal.f90 @@ -1402,8 +1402,8 @@ module subroutine plastic_nonlocal_updateCompatibility(orientation,ph,i,e) forall(s1 = 1:ns) my_compatibility(:,s1,s1,n) = 0.0_pReal elseif (prm%chi_GB >= 0.0_pReal) then !* GRAIN BOUNDARY - if (any(dNeq(phase_orientation0(ph)%data(en)%asQuaternion(), & - phase_orientation0(neighbor_phase)%data(neighbor_me)%asQuaternion())) .and. & + if (any(dNeq(phase_O_0(ph)%data(en)%asQuaternion(), & + phase_O_0(neighbor_phase)%data(neighbor_me)%asQuaternion())) .and. & plasticState(neighbor_phase)%nonlocal) & forall(s1 = 1:ns) my_compatibility(:,s1,s1,n) = sqrt(prm%chi_GB) else From eef7b8f0a94bd842fe254b6c6e6794f4f042eb91 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 24 Jul 2021 15:16:30 +0200 Subject: [PATCH 39/46] nothing to select anymore --- src/phase_mechanical.f90 | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/phase_mechanical.f90 b/src/phase_mechanical.f90 index 0c1a99c55..006133258 100644 --- a/src/phase_mechanical.f90 +++ b/src/phase_mechanical.f90 @@ -902,7 +902,6 @@ subroutine crystallite_results(group,ph) integer, intent(in) :: ph integer :: ou - real(pReal), allocatable, dimension(:,:) :: selected_rotations call results_closeGroup(results_addGroup(group//'/mechanical')) @@ -935,8 +934,7 @@ subroutine crystallite_results(group,ph) call results_writeDataset(phase_mechanical_S(ph)%data,group//'/mechanical/','S', & 'second Piola-Kirchhoff stress','Pa') case('O') - selected_rotations = select_rotations(phase_O(ph)%data) - call results_writeDataset(selected_rotations,group//'/mechanical',output_constituent(ph)%label(ou),& + call results_writeDataset(to_quaternion(phase_O(ph)%data),group//'/mechanical',output_constituent(ph)%label(ou),& 'crystal orientation as quaternion','q_0 (q_1 q_2 q_3)') call results_addAttribute('lattice',phase_lattice(ph),group//'/mechanical/'//output_constituent(ph)%label(ou)) if (any(phase_lattice(ph) == ['hP', 'tI'])) & @@ -948,19 +946,21 @@ subroutine crystallite_results(group,ph) contains !-------------------------------------------------------------------------------------------------- -!> @brief Convert orientation for output: ToDo: implement in HDF5/results +!> @brief Convert orientation array to quaternion array !-------------------------------------------------------------------------------------------------- - function select_rotations(dataset) + function to_quaternion(dataset) type(rotation), dimension(:), intent(in) :: dataset - real(pReal), dimension(4,size(dataset,1)) :: select_rotations - integer :: en + real(pReal), dimension(4,size(dataset,1)) :: to_quaternion - do en = 1, size(dataset,1) - select_rotations(:,en) = dataset(en)%asQuaternion() - enddo + integer :: i - end function select_rotations + + do i = 1, size(dataset,1) + to_quaternion(:,i) = dataset(i)%asQuaternion() + enddo + + end function to_quaternion end subroutine crystallite_results From 59d09d708edd2d4ef6709b6e418427b7a158ffbd Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 24 Jul 2021 17:18:31 +0200 Subject: [PATCH 40/46] string array support for attributes --- src/HDF5_utilities.f90 | 91 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 84 insertions(+), 7 deletions(-) diff --git a/src/HDF5_utilities.f90 b/src/HDF5_utilities.f90 index c5086ab81..c981fad53 100644 --- a/src/HDF5_utilities.f90 +++ b/src/HDF5_utilities.f90 @@ -71,6 +71,7 @@ module HDF5_utilities module procedure HDF5_addAttribute_str module procedure HDF5_addAttribute_int module procedure HDF5_addAttribute_real + module procedure HDF5_addAttribute_str_array module procedure HDF5_addAttribute_int_array module procedure HDF5_addAttribute_real_array end interface HDF5_addAttribute @@ -270,7 +271,7 @@ end subroutine HDF5_closeGroup !-------------------------------------------------------------------------------------------------- -!> @brief check whether a group or a dataset exists +!> @brief Check whether a group or a dataset exists. !-------------------------------------------------------------------------------------------------- logical function HDF5_objectExists(loc_id,path) @@ -280,6 +281,7 @@ logical function HDF5_objectExists(loc_id,path) integer :: hdferr character(len=:), allocatable :: p + if (present(path)) then p = trim(path) else @@ -298,7 +300,7 @@ end function HDF5_objectExists !-------------------------------------------------------------------------------------------------- -!> @brief adds a string attribute to the path given relative to the location +!> @brief Add a string attribute to the path given relative to the location. !-------------------------------------------------------------------------------------------------- subroutine HDF5_addAttribute_str(loc_id,attrLabel,attrValue,path) @@ -313,6 +315,7 @@ subroutine HDF5_addAttribute_str(loc_id,attrLabel,attrValue,path) character(len=:,kind=C_CHAR), allocatable,target :: attrValue_ type(c_ptr), target, dimension(1) :: ptr + if (present(path)) then p = trim(path) else @@ -326,6 +329,7 @@ subroutine HDF5_addAttribute_str(loc_id,attrLabel,attrValue,path) if(hdferr < 0) error stop 'HDF5 error' call h5tcopy_f(H5T_STRING, type_id, hdferr) if(hdferr < 0) error stop 'HDF5 error' + call h5aexists_by_name_f(loc_id,trim(p),attrLabel,attrExists,hdferr) if(hdferr < 0) error stop 'HDF5 error' if (attrExists) then @@ -336,6 +340,7 @@ subroutine HDF5_addAttribute_str(loc_id,attrLabel,attrValue,path) if(hdferr < 0) error stop 'HDF5 error' call h5awrite_f(attr_id, type_id, c_loc(ptr(1)), hdferr) if(hdferr < 0) error stop 'HDF5 error' + call h5aclose_f(attr_id,hdferr) if(hdferr < 0) error stop 'HDF5 error' call h5tclose_f(type_id,hdferr) @@ -347,7 +352,7 @@ end subroutine HDF5_addAttribute_str !-------------------------------------------------------------------------------------------------- -!> @brief adds a integer attribute to the path given relative to the location +!> @brief Add an integer attribute to the path given relative to the location. !-------------------------------------------------------------------------------------------------- subroutine HDF5_addAttribute_int(loc_id,attrLabel,attrValue,path) @@ -361,6 +366,7 @@ subroutine HDF5_addAttribute_int(loc_id,attrLabel,attrValue,path) logical :: attrExists character(len=:), allocatable :: p + if (present(path)) then p = trim(path) else @@ -369,6 +375,7 @@ subroutine HDF5_addAttribute_int(loc_id,attrLabel,attrValue,path) call h5screate_f(H5S_SCALAR_F,space_id,hdferr) if(hdferr < 0) error stop 'HDF5 error' + call h5aexists_by_name_f(loc_id,trim(p),attrLabel,attrExists,hdferr) if(hdferr < 0) error stop 'HDF5 error' if (attrExists) then @@ -379,6 +386,7 @@ subroutine HDF5_addAttribute_int(loc_id,attrLabel,attrValue,path) if(hdferr < 0) error stop 'HDF5 error' call h5awrite_f(attr_id, H5T_NATIVE_INTEGER, attrValue, int([1],HSIZE_T), hdferr) if(hdferr < 0) error stop 'HDF5 error' + call h5aclose_f(attr_id,hdferr) if(hdferr < 0) error stop 'HDF5 error' call h5sclose_f(space_id,hdferr) @@ -388,7 +396,7 @@ end subroutine HDF5_addAttribute_int !-------------------------------------------------------------------------------------------------- -!> @brief adds a integer attribute to the path given relative to the location +!> @brief Add a real attribute to the path given relative to the location. !-------------------------------------------------------------------------------------------------- subroutine HDF5_addAttribute_real(loc_id,attrLabel,attrValue,path) @@ -402,6 +410,7 @@ subroutine HDF5_addAttribute_real(loc_id,attrLabel,attrValue,path) logical :: attrExists character(len=:), allocatable :: p + if (present(path)) then p = trim(path) else @@ -410,6 +419,7 @@ subroutine HDF5_addAttribute_real(loc_id,attrLabel,attrValue,path) call h5screate_f(H5S_SCALAR_F,space_id,hdferr) if(hdferr < 0) error stop 'HDF5 error' + call h5aexists_by_name_f(loc_id,trim(p),attrLabel,attrExists,hdferr) if(hdferr < 0) error stop 'HDF5 error' if (attrExists) then @@ -420,6 +430,7 @@ subroutine HDF5_addAttribute_real(loc_id,attrLabel,attrValue,path) if(hdferr < 0) error stop 'HDF5 error' call h5awrite_f(attr_id, H5T_NATIVE_DOUBLE, attrValue, int([1],HSIZE_T), hdferr) if(hdferr < 0) error stop 'HDF5 error' + call h5aclose_f(attr_id,hdferr) if(hdferr < 0) error stop 'HDF5 error' call h5sclose_f(space_id,hdferr) @@ -429,7 +440,67 @@ end subroutine HDF5_addAttribute_real !-------------------------------------------------------------------------------------------------- -!> @brief adds a integer attribute to the path given relative to the location +!> @brief Add a string array attribute to the path given relative to the location. +!-------------------------------------------------------------------------------------------------- +subroutine HDF5_addAttribute_str_array(loc_id,attrLabel,attrValue,path) + + integer(HID_T), intent(in) :: loc_id + character(len=*), intent(in) :: attrLabel + character(len=*), intent(in), dimension(:) :: attrValue + character(len=*), intent(in), optional :: path + + integer(HID_T) :: attr_id, space_id, filetype_id, memtype_id + integer :: hdferr + logical :: attrExists + character(len=:), allocatable :: p + type(C_PTR) :: f_ptr + character(len=:), allocatable, dimension(:), target :: attrValue_ + + + if (present(path)) then + p = trim(path) + else + p = '.' + endif + + attrValue_ = attrValue + + call h5tcopy_f(H5T_C_S1,filetype_id,hdferr) + if(hdferr < 0) error stop 'HDF5 error' + call h5tset_size_f(filetype_id, int(len(attrValue_)+1,C_SIZE_T),hdferr) + if(hdferr < 0) error stop 'HDF5 error' + call h5tcopy_f(H5T_FORTRAN_S1, memtype_id, hdferr) + if(hdferr < 0) error stop 'HDF5 error' + call h5tset_size_f(memtype_id, int(len(attrValue_),C_SIZE_T), hdferr) + if(hdferr < 0) error stop 'HDF5 error' + call h5screate_simple_f(1,shape(attrValue_,kind=HSIZE_T),space_id, hdferr) + if(hdferr < 0) error stop 'HDF5 error' + + call h5aexists_by_name_f(loc_id,trim(p),attrLabel,attrExists,hdferr) + if (attrExists) then + call h5adelete_by_name_f(loc_id, trim(p), attrLabel, hdferr) + if(hdferr < 0) error stop 'HDF5 error' + endif + call h5acreate_by_name_f(loc_id,trim(p),trim(attrLabel),filetype_id,space_id,attr_id,hdferr) + if(hdferr < 0) error stop 'HDF5 error' + f_ptr = c_loc(attrValue_) + call h5awrite_f(attr_id, memtype_id, f_ptr, hdferr) + if(hdferr < 0) error stop 'HDF5 error' + + call h5tclose_f(memtype_id,hdferr) + if(hdferr < 0) error stop 'HDF5 error' + call h5tclose_f(filetype_id,hdferr) + if(hdferr < 0) error stop 'HDF5 error' + call h5aclose_f(attr_id,hdferr) + if(hdferr < 0) error stop 'HDF5 error' + call h5sclose_f(space_id,hdferr) + if(hdferr < 0) error stop 'HDF5 error' + +end subroutine HDF5_addAttribute_str_array + + +!-------------------------------------------------------------------------------------------------- +!> @brief Add an integer array attribute to the path given relative to the location. !-------------------------------------------------------------------------------------------------- subroutine HDF5_addAttribute_int_array(loc_id,attrLabel,attrValue,path) @@ -444,6 +515,7 @@ subroutine HDF5_addAttribute_int_array(loc_id,attrLabel,attrValue,path) logical :: attrExists character(len=:), allocatable :: p + if (present(path)) then p = trim(path) else @@ -454,6 +526,7 @@ subroutine HDF5_addAttribute_int_array(loc_id,attrLabel,attrValue,path) call h5screate_simple_f(1, array_size, space_id, hdferr, array_size) if(hdferr < 0) error stop 'HDF5 error' + call h5aexists_by_name_f(loc_id,trim(p),attrLabel,attrExists,hdferr) if(hdferr < 0) error stop 'HDF5 error' if (attrExists) then @@ -464,6 +537,7 @@ subroutine HDF5_addAttribute_int_array(loc_id,attrLabel,attrValue,path) if(hdferr < 0) error stop 'HDF5 error' call h5awrite_f(attr_id, H5T_NATIVE_INTEGER, attrValue, array_size, hdferr) if(hdferr < 0) error stop 'HDF5 error' + call h5aclose_f(attr_id,hdferr) if(hdferr < 0) error stop 'HDF5 error' call h5sclose_f(space_id,hdferr) @@ -473,7 +547,7 @@ end subroutine HDF5_addAttribute_int_array !-------------------------------------------------------------------------------------------------- -!> @brief adds a real attribute to the path given relative to the location +!> @brief Add a real array attribute to the path given relative to the location. !-------------------------------------------------------------------------------------------------- subroutine HDF5_addAttribute_real_array(loc_id,attrLabel,attrValue,path) @@ -488,6 +562,7 @@ subroutine HDF5_addAttribute_real_array(loc_id,attrLabel,attrValue,path) logical :: attrExists character(len=:), allocatable :: p + if (present(path)) then p = trim(path) else @@ -498,6 +573,7 @@ subroutine HDF5_addAttribute_real_array(loc_id,attrLabel,attrValue,path) call h5screate_simple_f(1, array_size, space_id, hdferr, array_size) if(hdferr < 0) error stop 'HDF5 error' + call h5aexists_by_name_f(loc_id,trim(p),attrLabel,attrExists,hdferr) if(hdferr < 0) error stop 'HDF5 error' if (attrExists) then @@ -508,6 +584,7 @@ subroutine HDF5_addAttribute_real_array(loc_id,attrLabel,attrValue,path) if(hdferr < 0) error stop 'HDF5 error' call h5awrite_f(attr_id, H5T_NATIVE_DOUBLE, attrValue, array_size, hdferr) if(hdferr < 0) error stop 'HDF5 error' + call h5aclose_f(attr_id,hdferr) if(hdferr < 0) error stop 'HDF5 error' call h5sclose_f(space_id,hdferr) @@ -517,7 +594,7 @@ end subroutine HDF5_addAttribute_real_array !-------------------------------------------------------------------------------------------------- -!> @brief set link to object in results file +!> @brief Set link to object in results file. !-------------------------------------------------------------------------------------------------- subroutine HDF5_setLink(loc_id,target_name,link_name) From b3f5e1223235043c9c736130058b1b564d19f194 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 24 Jul 2021 11:43:14 +0200 Subject: [PATCH 41/46] using burgers vector of tw/tr system seems to make more sense here otherwise twinning will not work in many cases. Matching number is only required for nucleation of tw/tr --- PRIVATE | 2 +- src/phase_mechanical_plastic_dislotwin.f90 | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/PRIVATE b/PRIVATE index c656b6f08..5049664c5 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit c656b6f08489756c9ee6a6e1a62858c8b7836f10 +Subproject commit 5049664c5cac3cc1571c7b61f3345f1ba8d627f6 diff --git a/src/phase_mechanical_plastic_dislotwin.f90 b/src/phase_mechanical_plastic_dislotwin.f90 index 2cc6f4af8..4242d0e7a 100644 --- a/src/phase_mechanical_plastic_dislotwin.f90 +++ b/src/phase_mechanical_plastic_dislotwin.f90 @@ -205,7 +205,7 @@ module function plastic_dislotwin_init() result(myPlasticity) rho_dip_0 = pl%get_as1dFloat('rho_dip_0', requiredSize=size(N_sl)) prm%v_0 = pl%get_as1dFloat('v_0', requiredSize=size(N_sl)) prm%b_sl = pl%get_as1dFloat('b_sl', requiredSize=size(N_sl)) - prm%Q_sl = pl%get_as1dFloat('Q_sl', requiredSize=size(N_sl)) + prm%Q_sl = pl%get_as1dFloat('Q_sl', requiredSize=size(N_sl)) prm%i_sl = pl%get_as1dFloat('i_sl', requiredSize=size(N_sl)) prm%p = pl%get_as1dFloat('p_sl', requiredSize=size(N_sl)) prm%q = pl%get_as1dFloat('q_sl', requiredSize=size(N_sl)) @@ -758,19 +758,17 @@ module subroutine dislotwin_dependentState(T,ph,en) dst%tau_pass(:,en) = prm%mu*prm%b_sl* sqrt(matmul(prm%h_sl_sl,stt%rho_mob(:,en)+stt%rho_dip(:,en))) !* threshold stress for growing twin/martensite - if(prm%sum_N_tw == prm%sum_N_sl) & - dst%tau_hat_tw(:,en) = Gamma/(3.0_pReal*prm%b_tw) & - + 3.0_pReal*prm%b_tw*prm%mu/(prm%L_tw*prm%b_sl) ! slip Burgers here correct? - if(prm%sum_N_tr == prm%sum_N_sl) & - dst%tau_hat_tr(:,en) = Gamma/(3.0_pReal*prm%b_tr) & - + 3.0_pReal*prm%b_tr*prm%mu/(prm%L_tr*prm%b_sl) & ! slip Burgers here correct? - + prm%h*prm%delta_G/ (3.0_pReal*prm%b_tr) + dst%tau_hat_tw(:,en) = Gamma/(3.0_pReal*prm%b_tw) & + + 3.0_pReal*prm%b_tw*prm%mu/(prm%L_tw*prm%b_tw) + dst%tau_hat_tr(:,en) = Gamma/(3.0_pReal*prm%b_tr) & + + 3.0_pReal*prm%b_tr*prm%mu/(prm%L_tr*prm%b_tr) & + + prm%h*prm%delta_G/(3.0_pReal*prm%b_tr) dst%V_tw(:,en) = (PI/4.0_pReal)*prm%t_tw*dst%Lambda_tw(:,en)**2.0_pReal dst%V_tr(:,en) = (PI/4.0_pReal)*prm%t_tr*dst%Lambda_tr(:,en)**2.0_pReal - x0 = prm%mu*prm%b_tw**2.0_pReal/(Gamma*8.0_pReal*PI)*(2.0_pReal+prm%nu)/(1.0_pReal-prm%nu) ! ToDo: In the paper, this is the Burgers vector for slip and is the same for twin and trans + x0 = prm%mu*prm%b_tw**2.0_pReal/(Gamma*8.0_pReal*PI)*(2.0_pReal+prm%nu)/(1.0_pReal-prm%nu) ! ToDo: In the paper, this is the Burgers vector for slip dst%tau_r_tw(:,en) = prm%mu*prm%b_tw/(2.0_pReal*PI)*(1.0_pReal/(x0+prm%x_c_tw)+cos(pi/3.0_pReal)/x0) x0 = prm%mu*prm%b_tr**2.0_pReal/(Gamma*8.0_pReal*PI)*(2.0_pReal+prm%nu)/(1.0_pReal-prm%nu) ! ToDo: In the paper, this is the Burgers vector for slip From e56f2e09a46ff105524946ac0ca8e9232d707ec7 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 26 Jul 2021 10:22:53 +0200 Subject: [PATCH 42/46] trivial and never used even the more commoly used fucntions for 3x3 matrices are not all in use --- src/math.f90 | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/math.f90 b/src/math.f90 index 36fe91bac..a48f44b93 100644 --- a/src/math.f90 +++ b/src/math.f90 @@ -545,19 +545,6 @@ pure function math_symmetric33(m) end function math_symmetric33 -!-------------------------------------------------------------------------------------------------- -!> @brief symmetrize a 6x6 matrix -!-------------------------------------------------------------------------------------------------- -pure function math_symmetric66(m) - - real(pReal), dimension(6,6) :: math_symmetric66 - real(pReal), dimension(6,6), intent(in) :: m - - math_symmetric66 = 0.5_pReal * (m + transpose(m)) - -end function math_symmetric66 - - !-------------------------------------------------------------------------------------------------- !> @brief skew part of a 3x3 matrix !-------------------------------------------------------------------------------------------------- From ce4052a49d9da97e75c68d78083beed8a81166b7 Mon Sep 17 00:00:00 2001 From: Test User Date: Mon, 26 Jul 2021 13:30:08 +0200 Subject: [PATCH 43/46] [skip ci] updated version information after successful test of v3.0.0-alpha4-141-g18dbda784 --- python/damask/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/VERSION b/python/damask/VERSION index 026bbcf9f..e1c11a09b 100644 --- a/python/damask/VERSION +++ b/python/damask/VERSION @@ -1 +1 @@ -v3.0.0-alpha4-137-gb69b85754 +v3.0.0-alpha4-141-g18dbda784 From 93814054d51f6ccc465f51208a874ca2216e79e9 Mon Sep 17 00:00:00 2001 From: Test User Date: Mon, 26 Jul 2021 15:02:14 +0200 Subject: [PATCH 44/46] [skip ci] updated version information after successful test of v3.0.0-alpha4-171-g6a9c892d7 --- python/damask/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/VERSION b/python/damask/VERSION index 026bbcf9f..c4c59cb81 100644 --- a/python/damask/VERSION +++ b/python/damask/VERSION @@ -1 +1 @@ -v3.0.0-alpha4-137-gb69b85754 +v3.0.0-alpha4-171-g6a9c892d7 From 04ab83a11fa0d56cb689b8d7f1a1b2d6481abdab Mon Sep 17 00:00:00 2001 From: Test User Date: Mon, 26 Jul 2021 18:16:19 +0200 Subject: [PATCH 45/46] [skip ci] updated version information after successful test of v3.0.0-alpha4-182-gac6d31b1f --- python/damask/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/VERSION b/python/damask/VERSION index e1c11a09b..13d57229b 100644 --- a/python/damask/VERSION +++ b/python/damask/VERSION @@ -1 +1 @@ -v3.0.0-alpha4-141-g18dbda784 +v3.0.0-alpha4-182-gac6d31b1f From 835c9b80024ac6878c878f6efaa1afc7e7c01888 Mon Sep 17 00:00:00 2001 From: Test User Date: Mon, 26 Jul 2021 19:54:00 +0200 Subject: [PATCH 46/46] [skip ci] updated version information after successful test of v3.0.0-alpha4-194-g012f09caa --- python/damask/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/VERSION b/python/damask/VERSION index e1c11a09b..c76dacadf 100644 --- a/python/damask/VERSION +++ b/python/damask/VERSION @@ -1 +1 @@ -v3.0.0-alpha4-141-g18dbda784 +v3.0.0-alpha4-194-g012f09caa