From 2bb6f74de9b3568a18bc46dacc9a3efe7a6d1b25 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 27 Sep 2019 14:07:03 -0700 Subject: [PATCH 001/233] use new data structure --- src/plastic_nonlocal.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index 8d1a30a70..e52dd54d1 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -948,8 +948,8 @@ subroutine plastic_nonlocal_dependentState(Fe, Fp, ip, el) neighbor_rhoTotal(1,:,n) = sum(abs(rho_neighbor(:,edg)),2) neighbor_rhoTotal(2,:,n) = sum(abs(rho_neighbor(:,scr)),2) - connection_latticeConf(1:3,n) = matmul(invFe, mesh_ipCoordinates(1:3,neighbor_ip,neighbor_el) & - - mesh_ipCoordinates(1:3,ip,el)) + connection_latticeConf(1:3,n) = matmul(invFe, discretization_IPcoords(1:3,neighbor_el+neighbor_ip-1) & + - discretization_IPcoords(1:3,el+neighbor_ip-1)) normal_latticeConf = matmul(transpose(invFp), IPareaNormal(1:3,n,ip,el)) if (math_inner(normal_latticeConf,connection_latticeConf(1:3,n)) < 0.0_pReal) & ! neighboring connection points in opposite direction to face normal: must be periodic image connection_latticeConf(1:3,n) = normal_latticeConf * IPvolume(ip,el)/IParea(n,ip,el) ! instead take the surface normal scaled with the diameter of the cell From 114f21e8f782f669e33d281d638f29a78854735c Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 27 Sep 2019 14:07:34 -0700 Subject: [PATCH 002/233] setter for current nodal coordinates --- src/discretization.f90 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/discretization.f90 b/src/discretization.f90 index 81413e9b8..4e60ed54a 100644 --- a/src/discretization.f90 +++ b/src/discretization.f90 @@ -30,7 +30,8 @@ module discretization public :: & discretization_init, & discretization_results, & - discretization_setIPcoords + discretization_setIPcoords, & + discretization_setNodeCoords contains @@ -92,4 +93,17 @@ subroutine discretization_setIPcoords(IPcoords) end subroutine discretization_setIPcoords + +!-------------------------------------------------------------------------------------------------- +!> @brief stores current IP coordinates +!-------------------------------------------------------------------------------------------------- +subroutine discretization_setNodeCoords(NodeCoords) + + real(pReal), dimension(:,:), intent(in) :: NodeCoords + + discretization_NodeCoords = NodeCoords + +end subroutine discretization_setNodeCoords + + end module discretization From 8fd9341e39304fcb239b23d2a43bc0fbb30930fa Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 27 Sep 2019 14:23:19 -0700 Subject: [PATCH 003/233] not needed --- src/constitutive.f90 | 1 - src/crystallite.f90 | 1 - src/damage_nonlocal.f90 | 1 - src/material.f90 | 1 - 4 files changed, 4 deletions(-) diff --git a/src/constitutive.f90 b/src/constitutive.f90 index 77054dda3..ee907eeb1 100644 --- a/src/constitutive.f90 +++ b/src/constitutive.f90 @@ -13,7 +13,6 @@ module constitutive use results use HDF5_utilities use lattice - use mesh use discretization use plastic_none use plastic_isotropic diff --git a/src/crystallite.f90 b/src/crystallite.f90 index 7443d4dc7..a31b22db9 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -16,7 +16,6 @@ module crystallite use numerics use rotations use math - use mesh use FEsolving use material use constitutive diff --git a/src/damage_nonlocal.f90 b/src/damage_nonlocal.f90 index 73056d3c9..0a8a3c867 100644 --- a/src/damage_nonlocal.f90 +++ b/src/damage_nonlocal.f90 @@ -10,7 +10,6 @@ module damage_nonlocal use config use crystallite use lattice - use mesh use source_damage_isoBrittle use source_damage_isoDuctile use source_damage_anisoBrittle diff --git a/src/material.f90 b/src/material.f90 index 68f71ea2a..78aa9fed6 100644 --- a/src/material.f90 +++ b/src/material.f90 @@ -11,7 +11,6 @@ module material use results use IO use debug - use mesh use numerics use rotations use discretization From 032b65fe6568cfbc0d4bb1fd22f026e3abfd423e Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 27 Sep 2019 14:33:56 -0700 Subject: [PATCH 004/233] not needed --- src/homogenization.f90 | 1 - src/plastic_nonlocal.f90 | 1 - 2 files changed, 2 deletions(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index c7675ccba..64edf95cc 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -15,7 +15,6 @@ module homogenization use constitutive use crystallite use FEsolving - use mesh use discretization use thermal_isothermal use thermal_adiabatic diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index e52dd54d1..db5e3f097 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -9,7 +9,6 @@ module plastic_nonlocal use IO use math use debug - use mesh use material use lattice use rotations From 13c62b890be27b1a32de1f1406185842165ac518 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 27 Sep 2019 14:34:34 -0700 Subject: [PATCH 005/233] module name should reflect file name --- src/CPFEM2.f90 | 4 +++- src/grid/DAMASK_grid.f90 | 2 +- src/grid/grid_damage_spectral.f90 | 2 +- src/grid/grid_mech_FEM.f90 | 2 +- src/grid/grid_mech_spectral_basic.f90 | 2 +- src/grid/grid_mech_spectral_polarisation.f90 | 2 +- src/grid/grid_thermal_spectral.f90 | 2 +- src/grid/spectral_utilities.f90 | 2 +- src/mesh_grid.f90 | 4 ++-- 9 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index 7e7949ec8..04a829163 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -11,7 +11,6 @@ module CPFEM2 use FEsolving use math use rotations - use mesh use material use lattice use IO @@ -25,6 +24,9 @@ module CPFEM2 use crystallite #ifdef FEM use FEM_Zoo + use mesh +#else + use mesh_grid #endif implicit none diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 71d95187b..f875d5941 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -15,7 +15,7 @@ program DAMASK_spectral use config use debug use math - use mesh + use mesh_grid use CPFEM2 use FEsolving use numerics diff --git a/src/grid/grid_damage_spectral.f90 b/src/grid/grid_damage_spectral.f90 index bdd9a6b89..3a6fe2181 100644 --- a/src/grid/grid_damage_spectral.f90 +++ b/src/grid/grid_damage_spectral.f90 @@ -12,7 +12,7 @@ module grid_damage_spectral use prec use spectral_utilities - use mesh + use mesh_grid use damage_nonlocal use numerics use damage_nonlocal diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 59252a674..baf3e59e1 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -21,7 +21,7 @@ module grid_mech_FEM use DAMASK_interface use spectral_utilities use discretization - use mesh + use mesh_grid use math implicit none diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index b7b43eeef..f0c564035 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -20,7 +20,7 @@ module grid_mech_spectral_basic use config use numerics use homogenization - use mesh + use mesh_grid use CPFEM2 use debug diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 3f730cc3b..0ceaac572 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -20,7 +20,7 @@ module grid_mech_spectral_polarisation use config use numerics use homogenization - use mesh + use mesh_grid use CPFEM2 use debug diff --git a/src/grid/grid_thermal_spectral.f90 b/src/grid/grid_thermal_spectral.f90 index 2977faf2b..04b3ace66 100644 --- a/src/grid/grid_thermal_spectral.f90 +++ b/src/grid/grid_thermal_spectral.f90 @@ -12,7 +12,7 @@ module grid_thermal_spectral use prec use spectral_utilities - use mesh + use mesh_grid use thermal_conduction use material use numerics diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index aeaf748c3..d7c738205 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -11,7 +11,7 @@ module spectral_utilities use prec use math use IO - use mesh + use mesh_grid use numerics use debug use config diff --git a/src/mesh_grid.f90 b/src/mesh_grid.f90 index bfeb7ce86..9a1e0e457 100644 --- a/src/mesh_grid.f90 +++ b/src/mesh_grid.f90 @@ -4,7 +4,7 @@ !> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH !> @brief Parse geometry file to set up discretization and geometry for nonlocal model !-------------------------------------------------------------------------------------------------- -module mesh +module mesh_grid #include use PETScsys @@ -477,4 +477,4 @@ end function IPneighborhood ! !end function mesh_nodesAroundCentres -end module mesh +end module mesh_grid From e311c913b84ee51f74d7336a5daf1ed88eaf10cb Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 27 Sep 2019 14:44:28 -0700 Subject: [PATCH 006/233] avoid public variable without write protection --- src/grid/spectral_utilities.f90 | 18 +++++++++--------- src/mesh_grid.f90 | 8 ++------ 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index d7c738205..bf462cf1c 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -1027,7 +1027,8 @@ end function utilities_getFreqDerivative subroutine utilities_updateIPcoords(F) real(pReal), dimension(3,3,grid(1),grid(2),grid3), intent(in) :: F - integer :: i, j, k, m, ierr + real(pReal), dimension(3, grid(1),grid(2),grid3) :: IPcoords + integer :: i, j, k, ierr real(pReal), dimension(3) :: step, offset_coords real(pReal), dimension(3,3) :: Favg @@ -1040,8 +1041,8 @@ subroutine utilities_updateIPcoords(F) do k = 1, grid3; do j = 1, grid(2); do i = 1, grid1Red if (any(cNeq(xi1st(1:3,i,j,k),cmplx(0.0,0.0,pReal)))) & - vectorField_fourier(1:3,i,j,k) = vectorField_fourier(1:3,i,j,k)/ & - sum(conjg(-xi1st(1:3,i,j,k))*xi1st(1:3,i,j,k)) + vectorField_fourier(1:3,i,j,k) = vectorField_fourier(1:3,i,j,k) & + / sum(conjg(-xi1st(1:3,i,j,k))*xi1st(1:3,i,j,k)) enddo; enddo; enddo call fftw_mpi_execute_dft_c2r(planVectorBack,vectorField_fourier,vectorField_real) vectorField_real = vectorField_real * wgt @@ -1059,15 +1060,14 @@ subroutine utilities_updateIPcoords(F) call MPI_Bcast(offset_coords,3,MPI_DOUBLE,0,PETSC_COMM_WORLD,ierr) if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords') offset_coords = matmul(Favg,step/2.0_pReal) - offset_coords - m = 1 + do k = 1,grid3; do j = 1,grid(2); do i = 1,grid(1) - mesh_ipCoordinates(1:3,1,m) = vectorField_real(1:3,i,j,k) & - + offset_coords & - + matmul(Favg,step*real([i,j,k+grid3Offset]-1,pReal)) - m = m+1 + IPcoords(1:3,i,j,k) = vectorField_real(1:3,i,j,k) & + + offset_coords & + + matmul(Favg,step*real([i,j,k+grid3Offset]-1,pReal)) enddo; enddo; enddo - call discretization_setIPcoords(reshape(mesh_ipCoordinates,[3,grid(1)*grid(2)*grid3])) + call discretization_setIPcoords(reshape(IPcoords,[3,grid(1)*grid(2)*grid3])) end subroutine utilities_updateIPcoords diff --git a/src/mesh_grid.f90 b/src/mesh_grid.f90 index 9a1e0e457..618c661a5 100644 --- a/src/mesh_grid.f90 +++ b/src/mesh_grid.f90 @@ -20,10 +20,7 @@ module mesh_grid implicit none private - - real(pReal), dimension(:,:,:), allocatable, public :: & - mesh_ipCoordinates !< IP x,y,z coordinates (after deformation!) - + integer, dimension(3), public, protected :: & grid !< (global) grid integer, public, protected :: & @@ -92,9 +89,8 @@ subroutine mesh_init(ip,el) homogenizationAt = homogenizationAt(product(grid(1:2))*grid3Offset+1: & product(grid(1:2))*(grid3Offset+grid3)) ! reallocate/shrink in case of MPI - mesh_ipCoordinates = IPcoordinates(myGrid,mySize,grid3Offset) call discretization_init(homogenizationAt,microstructureAt, & - reshape(mesh_ipCoordinates,[3,product(myGrid)]), & + reshape(IPcoordinates(myGrid,mySize,grid3Offset),[3,product(myGrid)]), & Nodes(myGrid,mySize,grid3Offset)) FEsolving_execElem = [1,product(myGrid)] ! parallel loop bounds set to comprise all elements From fc6b603e3d0a3e8513de19de4083e70346f02f7a Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 27 Sep 2019 14:48:51 -0700 Subject: [PATCH 007/233] names reflect functionality --- src/mesh_grid.f90 | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/mesh_grid.f90 b/src/mesh_grid.f90 index 618c661a5..3aaa52e89 100644 --- a/src/mesh_grid.f90 +++ b/src/mesh_grid.f90 @@ -90,8 +90,8 @@ subroutine mesh_init(ip,el) product(grid(1:2))*(grid3Offset+grid3)) ! reallocate/shrink in case of MPI call discretization_init(homogenizationAt,microstructureAt, & - reshape(IPcoordinates(myGrid,mySize,grid3Offset),[3,product(myGrid)]), & - Nodes(myGrid,mySize,grid3Offset)) + reshape(IPcoordinates0(myGrid,mySize,grid3Offset),[3,product(myGrid)]), & + Nodes0(myGrid,mySize,grid3Offset)) FEsolving_execElem = [1,product(myGrid)] ! parallel loop bounds set to comprise all elements allocate(FEsolving_execIP(2,product(myGrid)),source=1) ! parallel loop bounds set to comprise the only IP @@ -264,15 +264,15 @@ end subroutine readGeom !--------------------------------------------------------------------------------------------------- -!> @brief Calculate position of IPs/cell centres (pretend to be an element) +!> @brief Calculate undeformed position of IPs/cell centres (pretend to be an element) !--------------------------------------------------------------------------------------------------- -function IPcoordinates(grid,geomSize,grid3Offset) +function IPcoordinates0(grid,geomSize,grid3Offset) integer, dimension(3), intent(in) :: grid ! grid (for this process!) real(pReal), dimension(3), intent(in) :: geomSize ! size (for this process!) integer, intent(in) :: grid3Offset ! grid(3) offset - real(pReal), dimension(3,1,product(grid)) :: ipCoordinates + real(pReal), dimension(3,1,product(grid)) :: ipCoordinates0 integer :: & a,b,c, & @@ -281,22 +281,22 @@ function IPcoordinates(grid,geomSize,grid3Offset) i = 0 do c = 1, grid(3); do b = 1, grid(2); do a = 1, grid(1) i = i + 1 - IPcoordinates(1:3,1,i) = geomSize/real(grid,pReal) * (real([a,b,grid3Offset+c],pReal) -0.5_pReal) + IPcoordinates0(1:3,1,i) = geomSize/real(grid,pReal) * (real([a,b,grid3Offset+c],pReal) -0.5_pReal) enddo; enddo; enddo -end function IPcoordinates +end function IPcoordinates0 !--------------------------------------------------------------------------------------------------- -!> @brief Calculate position of nodes (pretend to be an element) +!> @brief Calculate position of undeformed nodes (pretend to be an element) !--------------------------------------------------------------------------------------------------- -pure function nodes(grid,geomSize,grid3Offset) +pure function nodes0(grid,geomSize,grid3Offset) integer, dimension(3), intent(in) :: grid ! grid (for this process!) real(pReal), dimension(3), intent(in) :: geomSize ! size (for this process!) integer, intent(in) :: grid3Offset ! grid(3) offset - real(pReal), dimension(3,product(grid+1)) :: nodes + real(pReal), dimension(3,product(grid+1)) :: nodes0 integer :: & a,b,c, & @@ -305,10 +305,10 @@ pure function nodes(grid,geomSize,grid3Offset) n = 0 do c = 0, grid3; do b = 0, grid(2); do a = 0, grid(1) n = n + 1 - nodes(1:3,n) = geomSize/real(grid,pReal) * real([a,b,grid3Offset+c],pReal) + nodes0(1:3,n) = geomSize/real(grid,pReal) * real([a,b,grid3Offset+c],pReal) enddo; enddo; enddo -end function nodes +end function nodes0 !-------------------------------------------------------------------------------------------------- From cc54139daefc24323d748bae299a64549ac046fb Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 27 Sep 2019 14:54:02 -0700 Subject: [PATCH 008/233] no need for being compatible --- src/mesh_grid.f90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mesh_grid.f90 b/src/mesh_grid.f90 index 3aaa52e89..26e017aa5 100644 --- a/src/mesh_grid.f90 +++ b/src/mesh_grid.f90 @@ -90,7 +90,7 @@ subroutine mesh_init(ip,el) product(grid(1:2))*(grid3Offset+grid3)) ! reallocate/shrink in case of MPI call discretization_init(homogenizationAt,microstructureAt, & - reshape(IPcoordinates0(myGrid,mySize,grid3Offset),[3,product(myGrid)]), & + IPcoordinates0(myGrid,mySize,grid3Offset), & Nodes0(myGrid,mySize,grid3Offset)) FEsolving_execElem = [1,product(myGrid)] ! parallel loop bounds set to comprise all elements @@ -272,7 +272,7 @@ function IPcoordinates0(grid,geomSize,grid3Offset) real(pReal), dimension(3), intent(in) :: geomSize ! size (for this process!) integer, intent(in) :: grid3Offset ! grid(3) offset - real(pReal), dimension(3,1,product(grid)) :: ipCoordinates0 + real(pReal), dimension(3,product(grid)) :: ipCoordinates0 integer :: & a,b,c, & @@ -281,7 +281,7 @@ function IPcoordinates0(grid,geomSize,grid3Offset) i = 0 do c = 1, grid(3); do b = 1, grid(2); do a = 1, grid(1) i = i + 1 - IPcoordinates0(1:3,1,i) = geomSize/real(grid,pReal) * (real([a,b,grid3Offset+c],pReal) -0.5_pReal) + IPcoordinates0(1:3,i) = geomSize/real(grid,pReal) * (real([a,b,grid3Offset+c],pReal) -0.5_pReal) enddo; enddo; enddo end function IPcoordinates0 @@ -296,7 +296,7 @@ pure function nodes0(grid,geomSize,grid3Offset) real(pReal), dimension(3), intent(in) :: geomSize ! size (for this process!) integer, intent(in) :: grid3Offset ! grid(3) offset - real(pReal), dimension(3,product(grid+1)) :: nodes0 + real(pReal), dimension(3,product(grid+1)) :: nodes0 integer :: & a,b,c, & From 5ba6b6c244cefc8f738690cf0185ac2f6f031813 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 27 Sep 2019 15:02:36 -0700 Subject: [PATCH 009/233] name reflects planned functionality: should update node and cell center coordinates --- src/grid/grid_mech_FEM.f90 | 4 ++-- src/grid/grid_mech_spectral_basic.f90 | 4 ++-- src/grid/grid_mech_spectral_polarisation.f90 | 4 ++-- src/grid/spectral_utilities.f90 | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index baf3e59e1..a479319c3 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -201,7 +201,7 @@ subroutine grid_mech_FEM_init F = spread(spread(spread(math_I3,3,grid(1)),4,grid(2)),5,grid3) endif restartRead materialpoint_F0 = reshape(F_lastInc, [3,3,1,product(grid(1:2))*grid3]) ! set starting condition for materialpoint_stressAndItsTangent - call utilities_updateIPcoords(F) + call utilities_updateCoords(F) call utilities_constitutiveResponse(P_current,temp33_Real,C_volAvg,devNull, & ! stress field, stress avg, global average of stiffness and (min+max)/2 F, & ! target F 0.0_pReal, & ! time increment @@ -326,7 +326,7 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat endif call CPFEM_age ! age state and kinematics - call utilities_updateIPcoords(F) + call utilities_updateCoords(F) C_volAvgLastInc = C_volAvg diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index f0c564035..54190cc30 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -170,7 +170,7 @@ subroutine grid_mech_spectral_basic_init endif restartRead materialpoint_F0 = reshape(F_lastInc, [3,3,1,product(grid(1:2))*grid3]) ! set starting condition for materialpoint_stressAndItsTangent - call Utilities_updateIPcoords(reshape(F,shape(F_lastInc))) + call Utilities_updateCoords(reshape(F,shape(F_lastInc))) call Utilities_constitutiveResponse(P,temp33_Real,C_volAvg,C_minMaxAvg, & ! stress field, stress avg, global average of stiffness and (min+max)/2 reshape(F,shape(F_lastInc)), & ! target F 0.0_pReal, & ! time increment @@ -300,7 +300,7 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi endif call CPFEM_age ! age state and kinematics - call utilities_updateIPcoords(F) + call utilities_updateCoords(F) C_volAvgLastInc = C_volAvg C_minMaxAvgLastInc = C_minMaxAvg diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 0ceaac572..e0f12c9ee 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -183,7 +183,7 @@ subroutine grid_mech_spectral_polarisation_init endif restartRead materialpoint_F0 = reshape(F_lastInc, [3,3,1,product(grid(1:2))*grid3]) ! set starting condition for materialpoint_stressAndItsTangent - call Utilities_updateIPcoords(reshape(F,shape(F_lastInc))) + call Utilities_updateCoords(reshape(F,shape(F_lastInc))) call Utilities_constitutiveResponse(P,temp33_Real,C_volAvg,C_minMaxAvg, & ! stress field, stress avg, global average of stiffness and (min+max)/2 reshape(F,shape(F_lastInc)), & ! target F 0.0_pReal, & ! time increment @@ -324,7 +324,7 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa endif call CPFEM_age ! age state and kinematics - call utilities_updateIPcoords(F) + call utilities_updateCoords(F) C_volAvgLastInc = C_volAvg C_minMaxAvgLastInc = C_minMaxAvg diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index bf462cf1c..f19434415 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -157,7 +157,7 @@ module spectral_utilities utilities_constitutiveResponse, & utilities_calculateRate, & utilities_forwardField, & - utilities_updateIPcoords, & + utilities_updateCoords, & FIELD_UNDEFINED_ID, & FIELD_MECH_ID, & FIELD_THERMAL_ID, & @@ -1024,7 +1024,7 @@ end function utilities_getFreqDerivative ! using integration in Fourier space. Similar as in mesh.f90, but using data already defined for ! convolution !-------------------------------------------------------------------------------------------------- -subroutine utilities_updateIPcoords(F) +subroutine utilities_updateCoords(F) real(pReal), dimension(3,3,grid(1),grid(2),grid3), intent(in) :: F real(pReal), dimension(3, grid(1),grid(2),grid3) :: IPcoords @@ -1069,6 +1069,6 @@ subroutine utilities_updateIPcoords(F) call discretization_setIPcoords(reshape(IPcoords,[3,grid(1)*grid(2)*grid3])) -end subroutine utilities_updateIPcoords +end subroutine utilities_updateCoords end module spectral_utilities From 970d172160f77b637a4e1a50e235404787661fd9 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 27 Sep 2019 17:52:01 -0700 Subject: [PATCH 010/233] correct message --- python/damask/dadf5.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index b2bd1b16e..278a499e7 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -298,7 +298,7 @@ class DADF5(): f[k] path.append(k) except KeyError as e: - print('unable to locate constituents dataset: '+ str(e)) + print('unable to locate {} dataset: {}'.format(o,str(e))) return path From 3206ee04bc44f04e7b682bc9fa44fad923776ea3 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 27 Sep 2019 20:38:02 -0700 Subject: [PATCH 011/233] nodal displacements for grid solver currently for non-MPI only --- processing/post/DADF5_vtk_cells.py | 10 +++- python/damask/dadf5.py | 14 +++++- src/grid/spectral_utilities.f90 | 58 ++++++++++++++++++++++- src/mesh_grid.f90 | 74 ------------------------------ 4 files changed, 77 insertions(+), 79 deletions(-) diff --git a/processing/post/DADF5_vtk_cells.py b/processing/post/DADF5_vtk_cells.py index 6d1e8e340..0b8fd07de 100755 --- a/processing/post/DADF5_vtk_cells.py +++ b/processing/post/DADF5_vtk_cells.py @@ -88,7 +88,7 @@ for filename in options.filenames: results.set_visible('constituents', False) results.set_visible('materialpoints',True) - for label in options.mat: + for label in options.mat: for p in results.iter_visible('mat_physics'): if p != 'generic': for m in results.iter_visible('materialpoints'): @@ -113,7 +113,13 @@ for filename in options.filenames: if results.structured: writer = vtk.vtkXMLRectilinearGridWriter() - + results.set_visible('constituents', False) + results.set_visible('materialpoints',False) + x = results.get_dataset_location('u_n') + vtk_data.append(numpy_support.numpy_to_vtk(num_array=results.read_dataset(x,0),deep=True,array_type=vtk.VTK_DOUBLE)) + vtk_data[-1].SetName('u') + rGrid.GetPointData().AddArray(vtk_data[-1]) + dirname = os.path.abspath(os.path.join(os.path.dirname(filename),options.dir)) if not os.path.isdir(dirname): os.mkdir(dirname,0o755) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 278a499e7..f7b065271 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -289,7 +289,13 @@ class DADF5(): """Returns the location of all active datasets with given label.""" path = [] with h5py.File(self.filename,'r') as f: - for i in self.iter_visible('increments'): + for i in self.iter_visible('increments'): + k = '/'.join([i,'geometry',label]) + try: + f[k] + path.append(k) + except KeyError as e: + print('unable to locate geometry dataset: {}'.format(str(e))) for o,p in zip(['constituents','materialpoints'],['con_physics','mat_physics']): for oo in self.iter_visible(o): for pp in self.iter_visible(p): @@ -313,7 +319,11 @@ class DADF5(): if len(shape) == 1: shape = shape +(1,) dataset = np.full(shape,np.nan) for pa in path: - label = pa.split('/')[2] + label = pa.split('/')[2] + + if (pa.split('/')[1] == 'geometry'): + dataset = np.array(f[pa]) + continue p = np.where(f['mapping/cellResults/constituent'][:,c]['Name'] == str.encode(label))[0] if len(p)>0: diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index f19434415..6a2dcfe6f 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -24,7 +24,6 @@ module spectral_utilities include 'fftw3-mpi.f03' logical, public :: cutBack = .false. !< cut back of BVP solver in case convergence is not achieved or a material point is terminally ill - integer, public, parameter :: maxPhaseFields = 2 integer, public :: nActiveFields = 0 !-------------------------------------------------------------------------------------------------- @@ -1068,6 +1067,63 @@ subroutine utilities_updateCoords(F) enddo; enddo; enddo call discretization_setIPcoords(reshape(IPcoords,[3,grid(1)*grid(2)*grid3])) + call discretization_setNodeCoords(reshape(NodeCoords(IPcoords,Favg),[3,(grid(1)+1)*(grid(2)+1)*(grid3+1)])) + + contains + + function nodeCoords(IPcoords,Favg) + real(pReal), dimension(:,:,:,:), intent(in) :: IPcoords + real(pReal), dimension(3,3), intent(in) :: Favg + + real(pReal), dimension(3,size(IPcoords,2)+1,size(IPcoords,3)+1,size(IPcoords,3)+1) :: nodeCoords + real(pReal), dimension(3,size(IPcoords,2)+2,size(IPcoords,3)+2,size(IPcoords,3)+2) :: IPCoords_wrapped + + integer :: & + i,j,k,n + integer, dimension(3) :: & + shift, & + lookup, & + me + integer, dimension(3,8) :: & + neighbor = reshape([ & + 0, 0, 0, & + 1, 0, 0, & + 1, 1, 0, & + 0, 1, 0, & + 0, 0, 1, & + 1, 0, 1, & + 1, 1, 1, & + 0, 1, 1 ], [3,8]) + + do k = grid3offset,grid3offset+grid3+1 + do j = 0,grid(2)+1 + do i = 0,grid(1)+1 + if (k==0 .or. k==grid(3)+1 .or. & ! z skin + j==0 .or. j==grid(2)+1 .or. & ! y skin + i==0 .or. i==grid(1)+1 ) then ! x skin + me = [i,j,k] ! me on skin + shift = sign(abs(grid+1-2*me)/(grid+1),grid+1-2*me) + lookup = me-1+shift*grid + IPCoords_wrapped(1:3,i+1,j+1,k+1) = IPcoords(1:3,lookup(1)+1,lookup(2)+1,lookup(3)+1) & + - matmul(Favg, real(shift,pReal)*geomSize) + else + IPCoords_wrapped(1:3,i+1,j+1,k+1) = IPCoords(1:3,i,j,k) + endif + enddo; enddo; enddo + + + nodeCoords = 0.0_pReal + do k = 0,grid3; do j = 0,grid(2); do i = 0,grid(1) + do n = 1,8 + nodeCoords(1:3,i+1,j+1,k+1) = nodeCoords(1:3,i+1,j+1,k+1) & + + IPCoords_wrapped(1:3,i+1+neighbor(1,n), & + j+1+neighbor(2,n), & + k+1+neighbor(3,n) ) + enddo + enddo; enddo; enddo + nodeCoords = nodeCoords/8.0_pReal + + end function nodeCoords end subroutine utilities_updateCoords diff --git a/src/mesh_grid.f90 b/src/mesh_grid.f90 index 26e017aa5..a69c9b807 100644 --- a/src/mesh_grid.f90 +++ b/src/mesh_grid.f90 @@ -399,78 +399,4 @@ pure function IPneighborhood(grid) end function IPneighborhood -!!-------------------------------------------------------------------------------------------------- -!!> @brief builds mesh of (distorted) cubes for given coordinates (= center of the cubes) -!!-------------------------------------------------------------------------------------------------- -!function mesh_nodesAroundCentres(gDim,Favg,centres) result(nodes) -! -! real(pReal), intent(in), dimension(:,:,:,:) :: & -! centres -! real(pReal), dimension(3,size(centres,2)+1,size(centres,3)+1,size(centres,4)+1) :: & -! nodes -! real(pReal), intent(in), dimension(3) :: & -! gDim -! real(pReal), intent(in), dimension(3,3) :: & -! Favg -! real(pReal), dimension(3,size(centres,2)+2,size(centres,3)+2,size(centres,4)+2) :: & -! wrappedCentres -! -! integer :: & -! i,j,k,n -! integer, dimension(3), parameter :: & -! diag = 1 -! integer, dimension(3) :: & -! shift = 0, & -! lookup = 0, & -! me = 0, & -! iRes = 0 -! integer, dimension(3,8) :: & -! neighbor = reshape([ & -! 0, 0, 0, & -! 1, 0, 0, & -! 1, 1, 0, & -! 0, 1, 0, & -! 0, 0, 1, & -! 1, 0, 1, & -! 1, 1, 1, & -! 0, 1, 1 ], [3,8]) -! -!!-------------------------------------------------------------------------------------------------- -!! initializing variables -! iRes = [size(centres,2),size(centres,3),size(centres,4)] -! nodes = 0.0_pReal -! wrappedCentres = 0.0_pReal -! -!!-------------------------------------------------------------------------------------------------- -!! building wrappedCentres = centroids + ghosts -! wrappedCentres(1:3,2:iRes(1)+1,2:iRes(2)+1,2:iRes(3)+1) = centres -! do k = 0,iRes(3)+1 -! do j = 0,iRes(2)+1 -! do i = 0,iRes(1)+1 -! if (k==0 .or. k==iRes(3)+1 .or. & ! z skin -! j==0 .or. j==iRes(2)+1 .or. & ! y skin -! i==0 .or. i==iRes(1)+1 ) then ! x skin -! me = [i,j,k] ! me on skin -! shift = sign(abs(iRes+diag-2*me)/(iRes+diag),iRes+diag-2*me) -! lookup = me-diag+shift*iRes -! wrappedCentres(1:3,i+1, j+1, k+1) = & -! centres(1:3,lookup(1)+1,lookup(2)+1,lookup(3)+1) & -! - matmul(Favg, real(shift,pReal)*gDim) -! endif -! enddo; enddo; enddo -! -!!-------------------------------------------------------------------------------------------------- -!! averaging -! do k = 0,iRes(3); do j = 0,iRes(2); do i = 0,iRes(1) -! do n = 1,8 -! nodes(1:3,i+1,j+1,k+1) = & -! nodes(1:3,i+1,j+1,k+1) + wrappedCentres(1:3,i+1+neighbor(1,n), & -! j+1+neighbor(2,n), & -! k+1+neighbor(3,n) ) -! enddo -! enddo; enddo; enddo -! nodes = nodes/8.0_pReal -! -!end function mesh_nodesAroundCentres - end module mesh_grid From c71374a3f38f51e31cf6dcee7206448c89ace675 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 28 Sep 2019 18:04:00 -0700 Subject: [PATCH 012/233] do not write nodes shared over several processes - probably useful only for grid solver, FEM have connectivity matrix anyway - name could be improved (in fact, the index is the last not-shared node) --- src/discretization.f90 | 21 ++++++++++++++++++--- src/mesh_grid.f90 | 5 ++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/discretization.f90 b/src/discretization.f90 index 4e60ed54a..3438c6d20 100644 --- a/src/discretization.f90 +++ b/src/discretization.f90 @@ -26,6 +26,9 @@ module discretization discretization_NodeCoords0, & discretization_IPcoords, & discretization_NodeCoords + + integer :: & + discretization_sharedNodesBegin public :: & discretization_init, & @@ -38,7 +41,9 @@ contains !-------------------------------------------------------------------------------------------------- !> @brief stores the relevant information in globally accesible variables !-------------------------------------------------------------------------------------------------- -subroutine discretization_init(homogenizationAt,microstructureAt,IPcoords0,NodeCoords0) +subroutine discretization_init(homogenizationAt,microstructureAt,& + IPcoords0,NodeCoords0,& + sharedNodesBegin) integer, dimension(:), intent(in) :: & homogenizationAt, & @@ -46,6 +51,8 @@ subroutine discretization_init(homogenizationAt,microstructureAt,IPcoords0,NodeC real(pReal), dimension(:,:), intent(in) :: & IPcoords0, & NodeCoords0 + integer, optional, intent(in) :: & + sharedNodesBegin write(6,'(/,a)') ' <<<+- discretization init -+>>>' @@ -61,6 +68,12 @@ subroutine discretization_init(homogenizationAt,microstructureAt,IPcoords0,NodeC discretization_NodeCoords0 = NodeCoords0 discretization_NodeCoords = NodeCoords0 + if(present(sharedNodesBegin)) then + discretization_sharedNodesBegin = sharedNodesBegin + else + discretization_sharedNodesBegin = size(discretization_NodeCoords0,2) + endif + end subroutine discretization_init @@ -73,10 +86,12 @@ subroutine discretization_results call HDF5_closeGroup(results_addGroup(trim('current/geometry'))) - u = discretization_NodeCoords - discretization_NodeCoords0 + u = discretization_NodeCoords (1:3,:discretization_sharedNodesBegin) & + - discretization_NodeCoords0(1:3,:discretization_sharedNodesBegin) call results_writeDataset('current/geometry',u,'u_n','nodal displacements','m') - u = discretization_IPcoords - discretization_IPcoords0 + u = discretization_IPcoords & + - discretization_IPcoords0 call results_writeDataset('current/geometry',u,'u_c','cell center displacements','m') #endif end subroutine discretization_results diff --git a/src/mesh_grid.f90 b/src/mesh_grid.f90 index a69c9b807..ca25e34d4 100644 --- a/src/mesh_grid.f90 +++ b/src/mesh_grid.f90 @@ -91,7 +91,10 @@ subroutine mesh_init(ip,el) call discretization_init(homogenizationAt,microstructureAt, & IPcoordinates0(myGrid,mySize,grid3Offset), & - Nodes0(myGrid,mySize,grid3Offset)) + Nodes0(myGrid,mySize,grid3Offset),& + merge((grid(1)+1) * (grid(2)+1) * (grid3+1),& ! write bottom layer + (grid(1)+1) * (grid(2)+1) * grid3,& ! do not write bottom layer (is top of rank-1) + worldrank<1)) FEsolving_execElem = [1,product(myGrid)] ! parallel loop bounds set to comprise all elements allocate(FEsolving_execIP(2,product(myGrid)),source=1) ! parallel loop bounds set to comprise the only IP From e04b074f3c602be8ca73d18057584658b1c9e72f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 28 Sep 2019 18:30:16 -0700 Subject: [PATCH 013/233] easier to read --- src/grid/spectral_utilities.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 6a2dcfe6f..391d2699c 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -1058,12 +1058,12 @@ subroutine utilities_updateCoords(F) if (grid3Offset == 0) offset_coords = vectorField_real(1:3,1,1,1) call MPI_Bcast(offset_coords,3,MPI_DOUBLE,0,PETSC_COMM_WORLD,ierr) if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords') - offset_coords = matmul(Favg,step/2.0_pReal) - offset_coords + offset_coords = offset_coords - matmul(Favg,step/2.0_pReal) do k = 1,grid3; do j = 1,grid(2); do i = 1,grid(1) IPcoords(1:3,i,j,k) = vectorField_real(1:3,i,j,k) & - + offset_coords & - + matmul(Favg,step*real([i,j,k+grid3Offset]-1,pReal)) + + matmul(Favg,step*real([i,j,k+grid3Offset]-1,pReal)) & + - offset_coords enddo; enddo; enddo call discretization_setIPcoords(reshape(IPcoords,[3,grid(1)*grid(2)*grid3])) From 8e5fd7c5e87091beed543fc27554fe81db15d7ee Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 29 Sep 2019 09:54:20 -0700 Subject: [PATCH 014/233] nodal discplacements for MPI needs improvement with respect to readability and placement of origin --- src/grid/spectral_utilities.f90 | 110 +++++++++++++++----------------- 1 file changed, 51 insertions(+), 59 deletions(-) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 391d2699c..97eb6207d 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -1027,9 +1027,29 @@ subroutine utilities_updateCoords(F) real(pReal), dimension(3,3,grid(1),grid(2),grid3), intent(in) :: F real(pReal), dimension(3, grid(1),grid(2),grid3) :: IPcoords - integer :: i, j, k, ierr + real(pReal), dimension(3, grid(1),grid(2),grid3+2) :: IPfluct_padded ! Fluctuations of cell center displacement (padded along z for MPI) + real(pReal), dimension(3, grid(1)+1,grid(2)+1,grid3+1) :: nodeCoords + integer :: & + i,j,k,n, & + rank_t, & + rank_b, & + c, r, & + ierr + integer, dimension(MPI_STATUS_SIZE) :: & + s real(pReal), dimension(3) :: step, offset_coords real(pReal), dimension(3,3) :: Favg + integer, dimension(3) :: me + integer, dimension(3,8) :: & + neighbor = reshape([ & + 0, 0, 0, & + 1, 0, 0, & + 1, 1, 0, & + 0, 1, 0, & + 0, 0, 1, & + 1, 0, 1, & + 1, 1, 1, & + 0, 1, 1 ], [3,8]) !-------------------------------------------------------------------------------------------------- ! integration in Fourier space @@ -1053,13 +1073,42 @@ subroutine utilities_updateCoords(F) if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords') !-------------------------------------------------------------------------------------------------- - ! add average to fluctuation and put (0,0,0) on (0,0,0) + ! add average to fluctuation and put (0,0,0) on (0,0,0): MD: Needs improvement, edge should be on zero step = geomSize/real(grid, pReal) if (grid3Offset == 0) offset_coords = vectorField_real(1:3,1,1,1) call MPI_Bcast(offset_coords,3,MPI_DOUBLE,0,PETSC_COMM_WORLD,ierr) if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords') offset_coords = offset_coords - matmul(Favg,step/2.0_pReal) + + !-------------------------------------------------------------------------------------------------- + ! calculate nodal displacements + IPfluct_padded(1:3,1:grid(1),1:grid(2),2:grid3+1) = vectorField_real(1:3,1:grid(1),1:grid(2),1:grid3) + c = product(shape(nodeCoords(:,:,:,1))) + rank_t = modulo(worldrank+1,worldsize) + rank_b = modulo(worldrank-1,worldsize) + call MPI_Isend(IPfluct_padded(:,:,:,2), c,MPI_DOUBLE,rank_b,0,PETSC_COMM_WORLD,r,ierr) + call MPI_Irecv(IPfluct_padded(:,:,:,grid3+2),c,MPI_DOUBLE,rank_t,0,PETSC_COMM_WORLD,r,ierr) + call MPI_Wait(r,s,ierr) + call MPI_Isend(IPfluct_padded(:,:,:,grid3+1),c,MPI_DOUBLE,rank_t,0,PETSC_COMM_WORLD,r,ierr) + call MPI_Irecv(IPfluct_padded(:,:,:,1), c,MPI_DOUBLE,rank_b,0,PETSC_COMM_WORLD,r,ierr) + call MPI_Wait(r,s,ierr) + + nodeCoords = 0.0_pReal + do k = 0,grid3; do j = 0,grid(2); do i = 0,grid(1) + do n = 1,8 + me = [i+neighbor(1,n),j+neighbor(2,n),k+neighbor(3,n)] + nodeCoords(1:3,i+1,j+1,k+1) = nodeCoords(1:3,i+1,j+1,k+1) & + + IPfluct_padded(1:3,modulo(me(1)-1,grid(1))+1,modulo(me(2)-1,grid(2)) +1,me(3)+1) & + +matmul(Favg,geomSize/real(grid, pReal)*(real([me(1),me(2),me(3)+grid3Offset],pReal)-0.5_pReal)) + enddo + enddo; enddo; enddo + nodeCoords = nodeCoords/8.0_pReal + + call discretization_setNodeCoords(reshape(NodeCoords,[3,(grid(1)+1)*(grid(2)+1)*(grid3+1)])) + + !-------------------------------------------------------------------------------------------------- + ! calculate cell center displacements do k = 1,grid3; do j = 1,grid(2); do i = 1,grid(1) IPcoords(1:3,i,j,k) = vectorField_real(1:3,i,j,k) & + matmul(Favg,step*real([i,j,k+grid3Offset]-1,pReal)) & @@ -1067,64 +1116,7 @@ subroutine utilities_updateCoords(F) enddo; enddo; enddo call discretization_setIPcoords(reshape(IPcoords,[3,grid(1)*grid(2)*grid3])) - call discretization_setNodeCoords(reshape(NodeCoords(IPcoords,Favg),[3,(grid(1)+1)*(grid(2)+1)*(grid3+1)])) - contains - - function nodeCoords(IPcoords,Favg) - real(pReal), dimension(:,:,:,:), intent(in) :: IPcoords - real(pReal), dimension(3,3), intent(in) :: Favg - - real(pReal), dimension(3,size(IPcoords,2)+1,size(IPcoords,3)+1,size(IPcoords,3)+1) :: nodeCoords - real(pReal), dimension(3,size(IPcoords,2)+2,size(IPcoords,3)+2,size(IPcoords,3)+2) :: IPCoords_wrapped - - integer :: & - i,j,k,n - integer, dimension(3) :: & - shift, & - lookup, & - me - integer, dimension(3,8) :: & - neighbor = reshape([ & - 0, 0, 0, & - 1, 0, 0, & - 1, 1, 0, & - 0, 1, 0, & - 0, 0, 1, & - 1, 0, 1, & - 1, 1, 1, & - 0, 1, 1 ], [3,8]) - - do k = grid3offset,grid3offset+grid3+1 - do j = 0,grid(2)+1 - do i = 0,grid(1)+1 - if (k==0 .or. k==grid(3)+1 .or. & ! z skin - j==0 .or. j==grid(2)+1 .or. & ! y skin - i==0 .or. i==grid(1)+1 ) then ! x skin - me = [i,j,k] ! me on skin - shift = sign(abs(grid+1-2*me)/(grid+1),grid+1-2*me) - lookup = me-1+shift*grid - IPCoords_wrapped(1:3,i+1,j+1,k+1) = IPcoords(1:3,lookup(1)+1,lookup(2)+1,lookup(3)+1) & - - matmul(Favg, real(shift,pReal)*geomSize) - else - IPCoords_wrapped(1:3,i+1,j+1,k+1) = IPCoords(1:3,i,j,k) - endif - enddo; enddo; enddo - - - nodeCoords = 0.0_pReal - do k = 0,grid3; do j = 0,grid(2); do i = 0,grid(1) - do n = 1,8 - nodeCoords(1:3,i+1,j+1,k+1) = nodeCoords(1:3,i+1,j+1,k+1) & - + IPCoords_wrapped(1:3,i+1+neighbor(1,n), & - j+1+neighbor(2,n), & - k+1+neighbor(3,n) ) - enddo - enddo; enddo; enddo - nodeCoords = nodeCoords/8.0_pReal - - end function nodeCoords - end subroutine utilities_updateCoords end module spectral_utilities From 56c0f30687e6ec4818581dffac60c7e90d6fb14e Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 29 Sep 2019 10:34:55 -0700 Subject: [PATCH 015/233] tried to send to much data --- src/grid/spectral_utilities.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 97eb6207d..1905d68c7 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -1083,7 +1083,7 @@ subroutine utilities_updateCoords(F) !-------------------------------------------------------------------------------------------------- ! calculate nodal displacements IPfluct_padded(1:3,1:grid(1),1:grid(2),2:grid3+1) = vectorField_real(1:3,1:grid(1),1:grid(2),1:grid3) - c = product(shape(nodeCoords(:,:,:,1))) + c = product(shape(IPfluct_padded(:,:,:,1))) rank_t = modulo(worldrank+1,worldsize) rank_b = modulo(worldrank-1,worldsize) call MPI_Isend(IPfluct_padded(:,:,:,2), c,MPI_DOUBLE,rank_b,0,PETSC_COMM_WORLD,r,ierr) From ad75ebd973f321381e3fe0e7ff4bcdf38959b4f3 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 29 Sep 2019 11:26:57 -0700 Subject: [PATCH 016/233] polishing --- src/grid/spectral_utilities.f90 | 46 ++++++++++++++++++++------------- src/mesh_grid.f90 | 2 +- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 1905d68c7..bb1c70f90 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -1051,8 +1051,9 @@ subroutine utilities_updateCoords(F) 1, 1, 1, & 0, 1, 1 ], [3,8]) + step = geomSize/real(grid, pReal) !-------------------------------------------------------------------------------------------------- - ! integration in Fourier space + ! integration in Fourier space to get fluctuations of cell center discplacements tensorField_real = 0.0_pReal tensorField_real(1:3,1:3,1:grid(1),1:grid(2),1:grid3) = F call utilities_FFTtensorForward() @@ -1070,43 +1071,51 @@ subroutine utilities_updateCoords(F) ! average F if (grid3Offset == 0) Favg = real(tensorField_fourier(1:3,1:3,1,1,1),pReal)*wgt call MPI_Bcast(Favg,9,MPI_DOUBLE,0,PETSC_COMM_WORLD,ierr) - if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords') + if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Bcast') !-------------------------------------------------------------------------------------------------- ! add average to fluctuation and put (0,0,0) on (0,0,0): MD: Needs improvement, edge should be on zero step = geomSize/real(grid, pReal) if (grid3Offset == 0) offset_coords = vectorField_real(1:3,1,1,1) call MPI_Bcast(offset_coords,3,MPI_DOUBLE,0,PETSC_COMM_WORLD,ierr) - if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords') + if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Bcast') offset_coords = offset_coords - matmul(Favg,step/2.0_pReal) !-------------------------------------------------------------------------------------------------- - ! calculate nodal displacements + ! pad cell center fluctuations along z-direction (needed when running MPI simulation) IPfluct_padded(1:3,1:grid(1),1:grid(2),2:grid3+1) = vectorField_real(1:3,1:grid(1),1:grid(2),1:grid3) - c = product(shape(IPfluct_padded(:,:,:,1))) + c = product(shape(IPfluct_padded(:,:,:,1))) !< amount of data to transfer rank_t = modulo(worldrank+1,worldsize) rank_b = modulo(worldrank-1,worldsize) + + ! send bottom layer to process below call MPI_Isend(IPfluct_padded(:,:,:,2), c,MPI_DOUBLE,rank_b,0,PETSC_COMM_WORLD,r,ierr) + if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Isend') call MPI_Irecv(IPfluct_padded(:,:,:,grid3+2),c,MPI_DOUBLE,rank_t,0,PETSC_COMM_WORLD,r,ierr) - call MPI_Wait(r,s,ierr) - call MPI_Isend(IPfluct_padded(:,:,:,grid3+1),c,MPI_DOUBLE,rank_t,0,PETSC_COMM_WORLD,r,ierr) - call MPI_Irecv(IPfluct_padded(:,:,:,1), c,MPI_DOUBLE,rank_b,0,PETSC_COMM_WORLD,r,ierr) + if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Irecv') call MPI_Wait(r,s,ierr) + ! send top layer to process above + if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Wait') + call MPI_Isend(IPfluct_padded(:,:,:,grid3+1),c,MPI_DOUBLE,rank_t,0,PETSC_COMM_WORLD,r,ierr) + if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Isend') + call MPI_Irecv(IPfluct_padded(:,:,:,1), c,MPI_DOUBLE,rank_b,0,PETSC_COMM_WORLD,r,ierr) + if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Irecv') + call MPI_Wait(r,s,ierr) + + !-------------------------------------------------------------------------------------------------- + ! calculate nodal displacements nodeCoords = 0.0_pReal do k = 0,grid3; do j = 0,grid(2); do i = 0,grid(1) - do n = 1,8 + average: do n = 1,8 me = [i+neighbor(1,n),j+neighbor(2,n),k+neighbor(3,n)] - nodeCoords(1:3,i+1,j+1,k+1) = nodeCoords(1:3,i+1,j+1,k+1) & - + IPfluct_padded(1:3,modulo(me(1)-1,grid(1))+1,modulo(me(2)-1,grid(2)) +1,me(3)+1) & - +matmul(Favg,geomSize/real(grid, pReal)*(real([me(1),me(2),me(3)+grid3Offset],pReal)-0.5_pReal)) - enddo + nodeCoords(1:3,i+1,j+1,k+1) = nodeCoords(1:3,i+1,j+1,k+1) & + + IPfluct_padded(1:3,modulo(me(1)-1,grid(1))+1,modulo(me(2)-1,grid(2))+1,me(3)+1) & + + matmul(Favg,step*(real([me(1),me(2),me(3)+grid3Offset],pReal)-0.5_pReal)) + enddo average enddo; enddo; enddo nodeCoords = nodeCoords/8.0_pReal - - call discretization_setNodeCoords(reshape(NodeCoords,[3,(grid(1)+1)*(grid(2)+1)*(grid3+1)])) - - + !-------------------------------------------------------------------------------------------------- ! calculate cell center displacements do k = 1,grid3; do j = 1,grid(2); do i = 1,grid(1) @@ -1115,7 +1124,8 @@ subroutine utilities_updateCoords(F) - offset_coords enddo; enddo; enddo - call discretization_setIPcoords(reshape(IPcoords,[3,grid(1)*grid(2)*grid3])) + call discretization_setNodeCoords(reshape(NodeCoords,[3,(grid(1)+1)*(grid(2)+1)*(grid3+1)])) + call discretization_setIPcoords (reshape(IPcoords, [3,grid(1)*grid(2)*grid3])) end subroutine utilities_updateCoords diff --git a/src/mesh_grid.f90 b/src/mesh_grid.f90 index ca25e34d4..d09e01793 100644 --- a/src/mesh_grid.f90 +++ b/src/mesh_grid.f90 @@ -60,7 +60,7 @@ subroutine mesh_init(ip,el) integer(C_INTPTR_T) :: & devNull, z, z_offset - write(6,'(/,a)') ' <<<+- mesh init -+>>>' + write(6,'(/,a)') ' <<<+- mesh_grid init -+>>>' call readGeom(grid,geomSize,microstructureAt,homogenizationAt) From d47dff9dd87c70b721c7efab5c404c80982aa615 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 29 Sep 2019 14:18:21 -0700 Subject: [PATCH 017/233] typo --- src/discretization.f90 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/discretization.f90 b/src/discretization.f90 index 3438c6d20..e95747b8d 100644 --- a/src/discretization.f90 +++ b/src/discretization.f90 @@ -28,7 +28,7 @@ module discretization discretization_NodeCoords integer :: & - discretization_sharedNodesBegin + discretization_sharedNodesBeginn public :: & discretization_init, & @@ -43,7 +43,7 @@ contains !-------------------------------------------------------------------------------------------------- subroutine discretization_init(homogenizationAt,microstructureAt,& IPcoords0,NodeCoords0,& - sharedNodesBegin) + sharedNodesBeginn) integer, dimension(:), intent(in) :: & homogenizationAt, & @@ -52,7 +52,7 @@ subroutine discretization_init(homogenizationAt,microstructureAt,& IPcoords0, & NodeCoords0 integer, optional, intent(in) :: & - sharedNodesBegin + sharedNodesBeginn write(6,'(/,a)') ' <<<+- discretization init -+>>>' @@ -69,9 +69,9 @@ subroutine discretization_init(homogenizationAt,microstructureAt,& discretization_NodeCoords = NodeCoords0 if(present(sharedNodesBegin)) then - discretization_sharedNodesBegin = sharedNodesBegin + discretization_sharedNodesBeginn = sharedNodesBeginn else - discretization_sharedNodesBegin = size(discretization_NodeCoords0,2) + discretization_sharedNodesBeginn = size(discretization_NodeCoords0,2) endif end subroutine discretization_init @@ -86,8 +86,8 @@ subroutine discretization_results call HDF5_closeGroup(results_addGroup(trim('current/geometry'))) - u = discretization_NodeCoords (1:3,:discretization_sharedNodesBegin) & - - discretization_NodeCoords0(1:3,:discretization_sharedNodesBegin) + u = discretization_NodeCoords (1:3,:discretization_sharedNodesBeginn) & + - discretization_NodeCoords0(1:3,:discretization_sharedNodesBeginn) call results_writeDataset('current/geometry',u,'u_n','nodal displacements','m') u = discretization_IPcoords & From fd3f8e2cc798d431d87b407a90b14bd855c4d007 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 29 Sep 2019 15:57:57 -0700 Subject: [PATCH 018/233] fixed precision even if compiler flag is not set --- src/discretization.f90 | 2 +- src/results.f90 | 2 +- src/rotations.f90 | 76 +++++++++++++++++++++--------------------- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/discretization.f90 b/src/discretization.f90 index e95747b8d..dfcad48a3 100644 --- a/src/discretization.f90 +++ b/src/discretization.f90 @@ -68,7 +68,7 @@ subroutine discretization_init(homogenizationAt,microstructureAt,& discretization_NodeCoords0 = NodeCoords0 discretization_NodeCoords = NodeCoords0 - if(present(sharedNodesBegin)) then + if(present(sharedNodesBeginn)) then discretization_sharedNodesBeginn = sharedNodesBeginn else discretization_sharedNodesBeginn = size(discretization_NodeCoords0,2) diff --git a/src/results.f90 b/src/results.f90 index 0304fd30b..9958afaf1 100644 --- a/src/results.f90 +++ b/src/results.f90 @@ -68,7 +68,7 @@ subroutine results_init write(6,'(a)') ' https://doi.org/10.1007/s40192-018-0118-7' resultsFile = HDF5_openFile(trim(getSolverJobName())//'.hdf5','w',.true.) - call HDF5_addAttribute(resultsFile,'DADF5-version',0.2) + call HDF5_addAttribute(resultsFile,'DADF5-version',0.2_pReal) call HDF5_addAttribute(resultsFile,'DADF5-major',0) call HDF5_addAttribute(resultsFile,'DADF5-minor',2) call HDF5_addAttribute(resultsFile,'DAMASK',DAMASKVERSION) diff --git a/src/rotations.f90 b/src/rotations.f90 index 7e642ce27..e042cff21 100644 --- a/src/rotations.f90 +++ b/src/rotations.f90 @@ -381,18 +381,18 @@ pure function qu2om(qu) result(om) qq = qu(1)**2-sum(qu(2:4)**2) - om(1,1) = qq+2.0*qu(2)**2 - om(2,2) = qq+2.0*qu(3)**2 - om(3,3) = qq+2.0*qu(4)**2 + om(1,1) = qq+2.0_pReal*qu(2)**2 + om(2,2) = qq+2.0_pReal*qu(3)**2 + om(3,3) = qq+2.0_pReal*qu(4)**2 - om(1,2) = 2.0*(qu(2)*qu(3)-qu(1)*qu(4)) - om(2,3) = 2.0*(qu(3)*qu(4)-qu(1)*qu(2)) - om(3,1) = 2.0*(qu(4)*qu(2)-qu(1)*qu(3)) - om(2,1) = 2.0*(qu(3)*qu(2)+qu(1)*qu(4)) - om(3,2) = 2.0*(qu(4)*qu(3)+qu(1)*qu(2)) - om(1,3) = 2.0*(qu(2)*qu(4)+qu(1)*qu(3)) + om(1,2) = 2.0_pReal*(qu(2)*qu(3)-qu(1)*qu(4)) + om(2,3) = 2.0_pReal*(qu(3)*qu(4)-qu(1)*qu(2)) + om(3,1) = 2.0_pReal*(qu(4)*qu(2)-qu(1)*qu(3)) + om(2,1) = 2.0_pReal*(qu(3)*qu(2)+qu(1)*qu(4)) + om(3,2) = 2.0_pReal*(qu(4)*qu(3)+qu(1)*qu(2)) + om(1,3) = 2.0_pReal*(qu(2)*qu(4)+qu(1)*qu(3)) - if (P < 0.0) om = transpose(om) + if (P < 0.0_pReal) om = transpose(om) end function qu2om @@ -413,13 +413,13 @@ pure function qu2eu(qu) result(eu) chi = sqrt(q03*q12) degenerated: if (dEq0(chi)) then - eu = merge([atan2(-P*2.0*qu(1)*qu(4),qu(1)**2-qu(4)**2), 0.0_pReal, 0.0_pReal], & - [atan2( 2.0*qu(2)*qu(3),qu(2)**2-qu(3)**2), PI, 0.0_pReal], & + eu = merge([atan2(-P*2.0_pReal*qu(1)*qu(4),qu(1)**2-qu(4)**2), 0.0_pReal, 0.0_pReal], & + [atan2( 2.0_pReal*qu(2)*qu(3),qu(2)**2-qu(3)**2), PI, 0.0_pReal], & dEq0(q12)) else degenerated - chiInv = 1.0/chi + chiInv = 1.0_pReal/chi eu = [atan2((-P*qu(1)*qu(3)+qu(2)*qu(4))*chi, (-P*qu(1)*qu(2)-qu(3)*qu(4))*chi ), & - atan2( 2.0*chi, q03-q12 ), & + atan2( 2.0_pReal*chi, q03-q12 ), & atan2(( P*qu(1)*qu(3)+qu(2)*qu(4))*chi, (-P*qu(1)*qu(2)+qu(3)*qu(4))*chi )] endif degenerated where(eu<0.0_pReal) eu = mod(eu+2.0_pReal*PI,[2.0_pReal*PI,PI,2.0_pReal*PI]) @@ -492,11 +492,11 @@ pure function qu2ho(qu) result(ho) omega = 2.0 * acos(math_clip(qu(1),-1.0_pReal,1.0_pReal)) if (dEq0(omega)) then - ho = [ 0.0, 0.0, 0.0 ] + ho = [ 0.0_pReal, 0.0_pReal, 0.0_pReal ] else ho = qu(2:4) - f = 0.75 * ( omega - sin(omega) ) - ho = ho/norm2(ho)* f**(1.0/3.0) + f = 0.75_pReal * ( omega - sin(omega) ) + ho = ho/norm2(ho)* f**(1.0_pReal/3.0_pReal) end if end function qu2ho @@ -579,7 +579,7 @@ function om2ax(om) result(ax) ax(4) = acos(math_clip(t,-1.0_pReal,1.0_pReal)) if (dEq0(ax(4))) then - ax(1:3) = [ 0.0, 0.0, 1.0 ] + ax(1:3) = [ 0.0_pReal, 0.0_pReal, 1.0_pReal ] else call dgeev('N','V',3,om_,3,Wr,Wi,devNull,3,VR,3,work,size(work,1),ierr) if (ierr /= 0) call IO_error(0,ext_msg='Error in om2ax: DGEEV return not zero') @@ -704,19 +704,19 @@ pure function eu2ax(eu) result(ax) real(pReal) :: t, delta, tau, alpha, sigma - t = tan(eu(2)*0.5) - sigma = 0.5*(eu(1)+eu(3)) - delta = 0.5*(eu(1)-eu(3)) + t = tan(eu(2)*0.5_pReal) + sigma = 0.5_pReal*(eu(1)+eu(3)) + delta = 0.5_pReal*(eu(1)-eu(3)) tau = sqrt(t**2+sin(sigma)**2) - alpha = merge(PI, 2.0*atan(tau/cos(sigma)), dEq(sigma,PI*0.5_pReal,tol=1.0e-15_pReal)) + alpha = merge(PI, 2.0_pReal*atan(tau/cos(sigma)), dEq(sigma,PI*0.5_pReal,tol=1.0e-15_pReal)) if (dEq0(alpha)) then ! return a default identity axis-angle pair ax = [ 0.0_pReal, 0.0_pReal, 1.0_pReal, 0.0_pReal ] else ax(1:3) = -P/tau * [ t*cos(delta), t*sin(delta), sin(sigma) ] ! passive axis-angle pair so a minus sign in front ax(4) = alpha - if (alpha < 0.0) ax = -ax ! ensure alpha is positive + if (alpha < 0.0_pReal) ax = -ax ! ensure alpha is positive end if end function eu2ax @@ -737,7 +737,7 @@ pure function eu2ro(eu) result(ro) elseif(dEq0(ro(4))) then ro = [ 0.0_pReal, 0.0_pReal, P, 0.0_pReal ] else - ro(4) = tan(ro(4)*0.5) + ro(4) = tan(ro(4)*0.5_pReal) end if end function eu2ro @@ -786,8 +786,8 @@ pure function ax2qu(ax) result(qu) if (dEq0(ax(4))) then qu = [ 1.0_pReal, 0.0_pReal, 0.0_pReal, 0.0_pReal ] else - c = cos(ax(4)*0.5) - s = sin(ax(4)*0.5) + c = cos(ax(4)*0.5_pReal) + s = sin(ax(4)*0.5_pReal) qu = [ c, ax(1)*s, ax(2)*s, ax(3)*s ] end if @@ -807,7 +807,7 @@ pure function ax2om(ax) result(om) c = cos(ax(4)) s = sin(ax(4)) - omc = 1.0-c + omc = 1.0_pReal-c om(1,1) = ax(1)**2*omc + c om(2,2) = ax(2)**2*omc + c @@ -825,7 +825,7 @@ pure function ax2om(ax) result(om) om(3,1) = q + s*ax(2) om(1,3) = q - s*ax(2) - if (P > 0.0) om = transpose(om) + if (P > 0.0_pReal) om = transpose(om) end function ax2om @@ -853,14 +853,14 @@ pure function ax2ro(ax) result(ro) real(pReal), intent(in), dimension(4) :: ax real(pReal), dimension(4) :: ro - real(pReal), parameter :: thr = 1.0E-7 + real(pReal), parameter :: thr = 1.0e-7_pReal if (dEq0(ax(4))) then ro = [ 0.0_pReal, 0.0_pReal, P, 0.0_pReal ] else ro(1:3) = ax(1:3) ! we need to deal with the 180 degree case - ro(4) = merge(IEEE_value(ro(4),IEEE_positive_inf),tan(ax(4)*0.5 ),abs(ax(4)-PI) < thr) + ro(4) = merge(IEEE_value(ro(4),IEEE_positive_inf),tan(ax(4)*0.5_pReal),abs(ax(4)-PI) < thr) end if end function ax2ro @@ -877,8 +877,8 @@ pure function ax2ho(ax) result(ho) real(pReal) :: f - f = 0.75 * ( ax(4) - sin(ax(4)) ) - f = f**(1.0/3.0) + f = 0.75_pReal * ( ax(4) - sin(ax(4)) ) + f = f**(1.0_pReal/3.0_pReal) ho = ax(1:3) * f end function ax2ho @@ -956,10 +956,10 @@ pure function ro2ax(ro) result(ax) if (.not. IEEE_is_finite(ta)) then ax = [ ro(1), ro(2), ro(3), PI ] elseif (dEq0(ta)) then - ax = [ 0.0, 0.0, 1.0, 0.0 ] + ax = [ 0.0_pReal, 0.0_pReal, 1.0_pReal, 0.0_pReal ] else - angle = 2.0*atan(ta) - ta = 1.0/norm2(ro(1:3)) + angle = 2.0_pReal*atan(ta) + ta = 1.0_pReal/norm2(ro(1:3)) ax = [ ro(1)/ta, ro(2)/ta, ro(3)/ta, angle ] end if @@ -978,10 +978,10 @@ pure function ro2ho(ro) result(ho) real(pReal) :: f if (dEq0(norm2(ro(1:3)))) then - ho = [ 0.0, 0.0, 0.0 ] + ho = [ 0.0_pReal, 0.0_pReal, 0.0_pReal ] else - f = merge(2.0*atan(ro(4)) - sin(2.0*atan(ro(4))),PI, IEEE_is_finite(ro(4))) - ho = ro(1:3) * (0.75_pReal*f)**(1.0/3.0) + f = merge(2.0_pReal*atan(ro(4)) - sin(2.0_pReal*atan(ro(4))),PI, IEEE_is_finite(ro(4))) + ho = ro(1:3) * (0.75_pReal*f)**(1.0_pReal/3.0_pReal) end if end function ro2ho From 0e3b09adc1e962e2e1b6a3641ca478da4c1ce551 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 30 Sep 2019 14:12:15 -0700 Subject: [PATCH 019/233] negative eigenvalues are not possible left/right Cauchy-Green Deformation Tensors are positive definit https://de.wikipedia.org/wiki/Deformationsgradient --- python/damask/dadf5.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 1a09c7a56..7363f3da1 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -575,10 +575,6 @@ class DADF5(): R_inv = np.transpose(np.matmul(U,Vh),(0,2,1)) # transposed rotation of polar decomposition U = np.matmul(R_inv,defgrad['data']) # F = RU (D,V) = np.linalg.eigh((U+np.transpose(U,(0,2,1)))*.5) # eigen decomposition (of symmetric(ed) matrix) - - neg = np.where(D < 0.0) # find negative eigenvalues ... - D[neg[0],neg[1]] = D[neg[0],neg[1]]* -1 # ... flip value ... - V[neg[0],:,neg[1]] = V[neg[0],:,neg[1]]* -1 # ... and vector d = operator['V#ln'](D) a = np.matmul(V,np.einsum('ij,ikj->ijk',d,V)) @@ -589,7 +585,7 @@ class DADF5(): 'meta' : { 'Unit' : defgrad['meta']['Unit'], 'Description' : 'Strain tensor ln(V){} ({})'.format(defgrad['label'],defgrad['meta']['Description']), - 'Creator' : 'dadf5.py:add_deviator v{}'.format(version) + 'Creator' : 'dadf5.py:add_strain_tensor v{}'.format(version) } } From e96eb55edd226383b20eb21506a26db039707bcb Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 30 Sep 2019 14:28:58 -0700 Subject: [PATCH 020/233] calculate different strain tensors --- python/damask/dadf5.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 7363f3da1..c326002dc 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -554,7 +554,7 @@ class DADF5(): self.__add_generic_pointwise(calculation,requested,pass_through) - def add_strain_tensor(self,t,ord,defgrad='F'): #ToDo: Use t and ord + def add_strain_tensor(self,t,ord,defgrad='F'): """ Adds the a strain tensor. @@ -570,21 +570,28 @@ class DADF5(): 'V#Green':lambda V: np.broadcast_to(np.ones(3),[V.shape[0],3]) - 1.0/V**2, 'U#Green':lambda U: U**2 - np.broadcast_to(np.ones(3),[U.shape[0],3]), } + if t.lower() in ['l','left']: + stretch = 'V' + elif t.lower() in ['r','right']: + stretch = 'U' + else: + raise KeyError (U,S,Vh) = np.linalg.svd(defgrad['data']) # singular value decomposition R_inv = np.transpose(np.matmul(U,Vh),(0,2,1)) # transposed rotation of polar decomposition - U = np.matmul(R_inv,defgrad['data']) # F = RU - (D,V) = np.linalg.eigh((U+np.transpose(U,(0,2,1)))*.5) # eigen decomposition (of symmetric(ed) matrix) + s = np.matmul(R_inv,defgrad['data']) if stretch == 'U' else \ + np.matmul(defgrad['data'],R_inv) + (D,V) = np.linalg.eigh((s+np.transpose(s,(0,2,1)))*.5) # eigen decomposition (of symmetric(ed) matrix) - d = operator['V#ln'](D) + d = operator[stretch+'#'+{0:'ln',1:'Biot',2:'Green'}[ord]](D) a = np.matmul(V,np.einsum('ij,ikj->ijk',d,V)) return { 'data' : a, - 'label' : 'ln(V)({})'.format(defgrad['label']), + 'label' : 'epsilon_{}^{}({})'.format(stretch,ord,defgrad['label']), 'meta' : { 'Unit' : defgrad['meta']['Unit'], - 'Description' : 'Strain tensor ln(V){} ({})'.format(defgrad['label'],defgrad['meta']['Description']), + 'Description' : 'Strain tensor of {} ({})'.format(defgrad['label'],defgrad['meta']['Description']), 'Creator' : 'dadf5.py:add_strain_tensor v{}'.format(version) } } From 62fb4d2ea978f2dd963b3e2081dbf368bf7dd8fa Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 1 Oct 2019 14:30:09 -0700 Subject: [PATCH 021/233] polishing --- python/damask/dadf5.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index c326002dc..43871742d 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -543,7 +543,7 @@ class DADF5(): 'label' : kwargs['label'], 'meta' : { 'Unit' : kwargs['unit'], - 'Description' : '{}'.format(kwargs['description']), + 'Description' : '{} (formula: {})'.format(kwargs['description'],kwargs['formula']), 'Creator' : 'dadf5.py:add_calculation v{}'.format(version) } } @@ -580,7 +580,7 @@ class DADF5(): (U,S,Vh) = np.linalg.svd(defgrad['data']) # singular value decomposition R_inv = np.transpose(np.matmul(U,Vh),(0,2,1)) # transposed rotation of polar decomposition s = np.matmul(R_inv,defgrad['data']) if stretch == 'U' else \ - np.matmul(defgrad['data'],R_inv) + np.matmul(defgrad['data'],R_inv) # compute either left or right stretch (D,V) = np.linalg.eigh((s+np.transpose(s,(0,2,1)))*.5) # eigen decomposition (of symmetric(ed) matrix) d = operator[stretch+'#'+{0:'ln',1:'Biot',2:'Green'}[ord]](D) From 0b29d081092256933d822512e561ba072e5a038b Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 3 Oct 2019 19:02:17 +0200 Subject: [PATCH 022/233] bump to DADF5 v0.3 contains displacements (for grid solver) --- python/damask/dadf5.py | 8 ++++---- src/results.f90 | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 43871742d..8303f167f 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -29,7 +29,7 @@ class DADF5(): """ with h5py.File(filename,'r') as f: - if f.attrs['DADF5-major'] != 0 or f.attrs['DADF5-minor'] != 2: + if f.attrs['DADF5-major'] != 0 or f.attrs['DADF5-minor'] <= 2: raise TypeError('Unsupported DADF5 version {} '.format(f.attrs['DADF5-version'])) self.structured = 'grid' in f['geometry'].attrs.keys() @@ -49,17 +49,17 @@ class DADF5(): self.con_physics = [] for c in self.constituents: self.con_physics += f['/'.join([self.increments[0],'constituent',c])].keys() - self.con_physics = list(set(self.con_physics)) # make unique + self.con_physics = list(set(self.con_physics)) # make unique self.mat_physics = [] for m in self.materialpoints: self.mat_physics += f['/'.join([self.increments[0],'materialpoint',m])].keys() - self.mat_physics = list(set(self.mat_physics)) # make unique + self.mat_physics = list(set(self.mat_physics)) # make unique self.visible= {'increments': self.increments, 'constituents': self.constituents, 'materialpoints': self.materialpoints, - 'constituent': range(self.Nconstituents), # ToDo: stupid naming + 'constituent': range(self.Nconstituents), # ToDo: stupid naming 'con_physics': self.con_physics, 'mat_physics': self.mat_physics} diff --git a/src/results.f90 b/src/results.f90 index 9958afaf1..d13a36fde 100644 --- a/src/results.f90 +++ b/src/results.f90 @@ -68,9 +68,9 @@ subroutine results_init write(6,'(a)') ' https://doi.org/10.1007/s40192-018-0118-7' resultsFile = HDF5_openFile(trim(getSolverJobName())//'.hdf5','w',.true.) - call HDF5_addAttribute(resultsFile,'DADF5-version',0.2_pReal) + call HDF5_addAttribute(resultsFile,'DADF5-version',0.3_pReal) call HDF5_addAttribute(resultsFile,'DADF5-major',0) - call HDF5_addAttribute(resultsFile,'DADF5-minor',2) + call HDF5_addAttribute(resultsFile,'DADF5-minor',3) call HDF5_addAttribute(resultsFile,'DAMASK',DAMASKVERSION) call get_command(commandLine) call HDF5_addAttribute(resultsFile,'call',trim(commandLine)) From b8a1a5bb7d9b0a116599fe69214b35c9901574e1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 3 Oct 2019 20:23:49 +0200 Subject: [PATCH 023/233] v 0.2 is ok, not sure what the future brings so better check --- python/damask/dadf5.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 8303f167f..b5e06713f 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -29,7 +29,7 @@ class DADF5(): """ with h5py.File(filename,'r') as f: - if f.attrs['DADF5-major'] != 0 or f.attrs['DADF5-minor'] <= 2: + if f.attrs['DADF5-major'] != 0 or not 2 <= f.attrs['DADF5-minor'] <= 3: raise TypeError('Unsupported DADF5 version {} '.format(f.attrs['DADF5-version'])) self.structured = 'grid' in f['geometry'].attrs.keys() From edcb8f9c4ddb7a93c350013f2821d9a34fd1495d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 18 Oct 2019 12:55:15 +0200 Subject: [PATCH 024/233] name change in development --- processing/post/DADF5_vtk_cells.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/processing/post/DADF5_vtk_cells.py b/processing/post/DADF5_vtk_cells.py index 700ce4404..bb11a8eed 100755 --- a/processing/post/DADF5_vtk_cells.py +++ b/processing/post/DADF5_vtk_cells.py @@ -128,7 +128,7 @@ for filename in options.filenames: x = results.get_dataset_location('u_n') vtk_data.append(numpy_support.numpy_to_vtk(num_array=results.read_dataset(x,0),deep=True,array_type=vtk.VTK_DOUBLE)) vtk_data[-1].SetName('u') - rGrid.GetPointData().AddArray(vtk_data[-1]) + grid.GetPointData().AddArray(vtk_data[-1]) dirname = os.path.abspath(os.path.join(os.path.dirname(filename),options.dir)) if not os.path.isdir(dirname): From 47ba7d49b57f100ab16decc6170872836103d2bc Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 18 Oct 2019 20:39:00 +0200 Subject: [PATCH 025/233] allow to use the same label twice in a function --- python/damask/dadf5.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 809c1db98..6bcc0d78a 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -563,7 +563,7 @@ class DADF5(): formula = kwargs['formula'] for d in re.findall(r'#(.*?)#',formula): - formula = re.sub('#{}#'.format(d),"kwargs['{}']['data']".format(d),formula) + formula = formula.replace('#{}#'.format(d),"kwargs['{}']['data']".format(d)) return { 'data' : eval(formula), @@ -575,7 +575,7 @@ class DADF5(): } } - requested = [{'label':d,'arg':d} for d in re.findall(r'#(.*?)#',formula)] # datasets used in the formula + requested = [{'label':d,'arg':d} for d in set(re.findall(r'#(.*?)#',formula))] # datasets used in the formula pass_through = {'formula':formula,'label':label,'unit':unit,'description':description} self.__add_generic_pointwise(calculation,requested,pass_through) From 1a34a6f7b50d1ea6c5da8ce373b34c94d15ca485 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 18 Oct 2019 20:41:39 +0200 Subject: [PATCH 026/233] some useful tensor operations --- python/damask/dadf5.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 6bcc0d78a..54d92be40 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -626,6 +626,46 @@ class DADF5(): requested = [{'label':defgrad,'arg':'defgrad'}] self.__add_generic_pointwise(strain_tensor,requested,{'t':t,'ord':ord}) + + + def add_principal_components(self,x): + """Adds principal components of symmetric tensor.""" + def principal_components(x): + + return { + 'data' : np.linalg.eigvalsh((x['data']+np.transpose(x['data'],(0,2,1)))*.5)[:,::-1], # eigenvalues (of symmetric(ed) matrix) + 'label' : 'lambda_{}'.format(x['label']), + 'meta' : { + 'Unit' : x['meta']['Unit'], + 'Description' : 'Pricipal components of {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator' : 'dadf5.py:add_principal_components v{}'.format(version) + } + } + + requested = [{'label':x,'arg':'x'}] + + self.__add_generic_pointwise(principal_components,requested) + + + def add_maximum_shear(self,x): + """Adds maximum shear components of symmetric tensor.""" + def maximum_shear(x): + + w = np.linalg.eigvalsh((x['data']+np.transpose(x['data'],(0,2,1)))*.5) # eigenvalues (of symmetric(ed) matrix) + + return { + 'data' : (w[:,2] - w[:,0])*0.5, + 'label' : 'max_shear({})'.format(x['label']), + 'meta' : { + 'Unit' : x['meta']['Unit'], + 'Description' : 'Maximum shear component of of {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator' : 'dadf5.py:add_maximum_shear v{}'.format(version) + } + } + + requested = [{'label':x,'arg':'x'}] + + self.__add_generic_pointwise(maximum_shear,requested) def __add_generic_pointwise(self,func,datasets_requested,extra_args={}): From 3336cfc3da46973afb62e1559ac8c5908d5e8105 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 18 Oct 2019 20:50:03 +0200 Subject: [PATCH 027/233] better have tensor functions available allows in-memory evaluation of results --- python/damask/__init__.py | 6 +++++- python/damask/dadf5.py | 10 ++++------ python/damask/mechanics.py | 23 +++++++++++++++++++++++ 3 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 python/damask/mechanics.py diff --git a/python/damask/__init__.py b/python/damask/__init__.py index ed6747a93..8f1e64937 100644 --- a/python/damask/__init__.py +++ b/python/damask/__init__.py @@ -6,6 +6,7 @@ with open(os.path.join(os.path.dirname(__file__),'VERSION')) as f: name = 'damask' +# classes from .environment import Environment # noqa from .asciitable import ASCIItable # noqa @@ -14,8 +15,11 @@ from .colormaps import Colormap, Color # noqa from .orientation import Symmetry, Lattice, Rotation, Orientation # noqa from .dadf5 import DADF5 # noqa -#from .block import Block # only one class from .geom import Geom # noqa from .solver import Solver # noqa from .test import Test # noqa from .util import extendableOption # noqa + +# functions in modules +from . import mechanics + diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 54d92be40..ba81fa605 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -7,6 +7,7 @@ import numpy as np from . import util from . import version +from . import mechanics # ------------------------------------------------------------------ class DADF5(): @@ -379,10 +380,8 @@ class DADF5(): Resulting tensor is symmetrized as the Cauchy stress should be symmetric. """ def Cauchy(F,P): - sigma = np.einsum('i,ijk,ilk->ijl',1.0/np.linalg.det(F['data']),P['data'],F['data']) - sigma = (sigma + np.transpose(sigma,(0,2,1)))*0.5 # enforce symmetry return { - 'data' : sigma, + 'data' : mechanics.Cauchy(F['data']),P['data']), 'label' : 'sigma', 'meta' : { 'Unit' : P['meta']['Unit'], @@ -529,13 +528,12 @@ class DADF5(): def add_deviator(self,x): """Adds the deviator of a tensor.""" def deviator(x): - d = x['data'] - if not np.all(np.array(d.shape[1:]) == np.array([3,3])): + if not np.all(np.array(x['data'].shape[1:]) == np.array([3,3])): raise ValueError return { - 'data' : d - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[d.shape[0],3,3]),np.trace(d,axis1=1,axis2=2)/3.0), + 'data' : mechanics.deviator(x['data']), 'label' : 'dev({})'.format(x['label']), 'meta' : { 'Unit' : x['meta']['Unit'], diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py new file mode 100644 index 000000000..5f8dbc02d --- /dev/null +++ b/python/damask/mechanics.py @@ -0,0 +1,23 @@ +import numpy as np + +def Cauchy(F,P): + if np.shape(F) == np.shape(P) == (3,3): + sigma = 1.0/np.linalg.det(F) * np.dot(F,P) + return (sigma+sigma.T)*0.5 + else: + sigma = np.einsum('i,ijk,ilk->ijl',1.0/np.linalg.det(F),P,F) + return (sigma + np.transpose(sigma,(0,2,1)))*0.5 + + +def deviator(x): + if np.shape(x) == (3,3): + return x - np.eye(3)*np.trace(x)/3.0 + else: + return d - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[d.shape[0],3,3]),np.trace(d,axis1=1,axis2=2)/3.0) + + +def spherical(x): + if np.shape(x) == (3,3): + return np.trace(x)/3.0 + else: + return np.trace(x,axis1=1,axis2=2)/3.0 From b119d2fefaef2191fe576fd99f21c5955e3eabb4 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 18 Oct 2019 20:51:15 +0200 Subject: [PATCH 028/233] Fortran submodule support in older cmake is broken better use even 3.14 and above https://www.scivision.dev/fortran-2008-submodule-cmake --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c9bbea04..3d53000d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ ######################################################################################## # Compiler options for building DAMASK -cmake_minimum_required (VERSION 3.6.0 FATAL_ERROR) +cmake_minimum_required (VERSION 3.10.0 FATAL_ERROR) #--------------------------------------------------------------------------------------- # Find PETSc from system environment From 5858d03a6bcc4c92c59266263487fc02b596acd5 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 18 Oct 2019 20:55:39 +0200 Subject: [PATCH 029/233] prospector complaints for stupid reasons --- python/damask/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/__init__.py b/python/damask/__init__.py index 8f1e64937..f876d1417 100644 --- a/python/damask/__init__.py +++ b/python/damask/__init__.py @@ -21,5 +21,5 @@ from .test import Test # noqa from .util import extendableOption # noqa # functions in modules -from . import mechanics +from . import mechanics # noqa From dc9aca571002a9c7197379a2345cad160ee0bd54 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 18 Oct 2019 20:56:38 +0200 Subject: [PATCH 030/233] copy and paste error/invalid syntax --- python/damask/dadf5.py | 2 +- python/damask/mechanics.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index ba81fa605..a50eb44f8 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -381,7 +381,7 @@ class DADF5(): """ def Cauchy(F,P): return { - 'data' : mechanics.Cauchy(F['data']),P['data']), + 'data' : mechanics.Cauchy(F['data'],P['data']), 'label' : 'sigma', 'meta' : { 'Unit' : P['meta']['Unit'], diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index 5f8dbc02d..dad601701 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -13,7 +13,7 @@ def deviator(x): if np.shape(x) == (3,3): return x - np.eye(3)*np.trace(x)/3.0 else: - return d - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[d.shape[0],3,3]),np.trace(d,axis1=1,axis2=2)/3.0) + return x - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[x.shape[0],3,3]),np.trace(x,axis1=1,axis2=2)/3.0) def spherical(x): From bd7b5ad27b5c7303b5c2573bf63d859f16eaf4d3 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 18 Oct 2019 21:46:44 +0200 Subject: [PATCH 031/233] old python2.7 scripts with only a loose connection to DAMASK if needed, simply take them from an old release version --- processing/misc/gwyddion_filter.py | 66 ------------------- processing/misc/vtk_fromGwyddion.py | 98 ----------------------------- 2 files changed, 164 deletions(-) delete mode 100755 processing/misc/gwyddion_filter.py delete mode 100755 processing/misc/vtk_fromGwyddion.py diff --git a/processing/misc/gwyddion_filter.py b/processing/misc/gwyddion_filter.py deleted file mode 100755 index d5b1e39f0..000000000 --- a/processing/misc/gwyddion_filter.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python2.7 -# -*- coding: UTF-8 no BOM -*- - -import os,string,scipy -import numpy as np -import damask -from optparse import OptionParser - -scriptName = os.path.splitext(os.path.basename(__file__))[0] -scriptID = ' '.join([scriptName,damask.version]) - -parser = OptionParser(option_class=damask.extendableOption, usage='%prog options [file[s]]', description = """ -Apply filter(s) to Gwyddion data. -""" + string.replace(scriptID,'\n','\\n') -) - -for option in ['opening', - 'closing', - 'erosion', - 'dilation', - 'average', - 'median', - ]: - parser.add_option('-%s'%option[0], '--%s'%option, dest=option, type='int', - help = 'stencil size for %s filter'%option) - parser.set_default(option, 0) - -(options, filenames) = parser.parse_args() - - -# ------------------------------------------ read Gwyddion data --------------------------------------- - -for file in filenames: - filters = '' - header = [] - with open(file,'r') as f: - for line in f: - pieces = line.split() - if pieces[0] != '#': break - if pieces[1] == 'Width:': width = float(pieces[2]) - if pieces[1] == 'Height:': height = float(pieces[2]) - header.append(line.lstrip('#').strip()) - - elevation = np.loadtxt(file)#*1e6 - - if options.opening > 0: - elevation = scipy.ndimage.morphology.grey_opening(elevation,options.opening) - filters += '_opening%i'%options.opening - if options.closing > 0: - elevation = scipy.ndimage.morphology.grey_closing(elevation,options.closing) - filters += '_closing%i'%options.closing - if options.erosion > 0: - elevation = scipy.ndimage.morphology.grey_erosion(elevation,options.erosion) - filters += '_erosion%i'%options.erosion - if options.dilation > 0: - elevation = scipy.ndimage.morphology.grey_dilation(elevation,options.dilation) - filters += '_dilation%i'%options.dilation - if options.average > 0: - elevation = scipy.ndimage.filters.uniform_filter(elevation,options.average) - filters += '_avg%i'%options.average - if options.median > 0: - elevation = scipy.ndimage.filters.median_filter(elevation,options.median) - filters += '_median%i'%options.median - - np.savetxt(os.path.splitext(file)[0]+filters+os.path.splitext(file)[1],elevation,header='\n'.join(header)) - diff --git a/processing/misc/vtk_fromGwyddion.py b/processing/misc/vtk_fromGwyddion.py deleted file mode 100755 index e64bf4393..000000000 --- a/processing/misc/vtk_fromGwyddion.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python2.7 -# -*- coding: UTF-8 no BOM -*- - -import os,string,vtk -import numpy as np -import damask -from optparse import OptionParser - -scriptName = os.path.splitext(os.path.basename(__file__))[0] -scriptID = ' '.join([scriptName,damask.version]) - -scalingFactor = { \ - 'm': { - 'm': 1e0, - 'mm': 1e-3, - 'µm': 1e-6, - }, - 'mm': { - 'm': 1e+3, - 'mm': 1e0, - 'µm': 1e-3, - }, - 'µm': { - 'm': 1e+6, - 'mm': 1e+3, - 'µm': 1e0, - }, - } - -parser = OptionParser(option_class=damask.extendableOption, usage='%prog options [file[s]]', description = """ -Produce VTK rectilinear grid from Gwyddion dataset exported as text. -""" + string.replace(scriptID,'\n','\\n') -) - -parser.add_option('-s', '--scaling', dest='scaling', type='float', - help = 'scaling factor for elevation data [auto]') - -parser.set_defaults(scaling = 0.0) - -(options, filenames) = parser.parse_args() - - -# ------------------------------------------ read Gwyddion data --------------------------------------- - -for file in filenames: - with open(file,'r') as f: - for line in f: - pieces = line.split() - if pieces[0] != '#': break - if len(pieces) < 2: continue - if pieces[1] == 'Width:': - width = float(pieces[2]) - lateralunit = pieces[3] - if pieces[1] == 'Height:': - height = float(pieces[2]) - lateralunit = pieces[3] - if pieces[1] == 'Value' and pieces[2] == 'units:': - elevationunit = pieces[3] - - if options.scaling == 0.0: - options.scaling = scalingFactor[lateralunit][elevationunit] - - elevation = np.loadtxt(file)*options.scaling - - grid = vtk.vtkRectilinearGrid() - grid.SetDimensions(elevation.shape[1],elevation.shape[0],1) - - xCoords = vtk.vtkDoubleArray() - for x in np.arange(0.0,width,width/elevation.shape[1],'d'): - xCoords.InsertNextValue(x) - yCoords = vtk.vtkDoubleArray() - for y in np.arange(0.0,height,height/elevation.shape[0],'d'): - yCoords.InsertNextValue(y) - zCoords = vtk.vtkDoubleArray() - zCoords.InsertNextValue(0.0) - - grid.SetXCoordinates(xCoords) - grid.SetYCoordinates(yCoords) - grid.SetZCoordinates(zCoords) - - vector = vtk.vtkFloatArray() - vector.SetName("elevation"); - vector.SetNumberOfComponents(3); - vector.SetNumberOfTuples(np.prod(elevation.shape)); - for i,z in enumerate(np.ravel(elevation)): - vector.SetTuple3(i,0,0,z) - - grid.GetPointData().AddArray(vector) - - writer = vtk.vtkXMLRectilinearGridWriter() - writer.SetDataModeToBinary() - writer.SetCompressorTypeToZLib() - writer.SetFileName(os.path.splitext(file)[0]+'.vtr') - if vtk.VTK_MAJOR_VERSION <= 5: - writer.SetInput(grid) - else: - writer.SetInputData(grid) - writer.Write() From f4a0a5cfe5ba92de809f3ed721a2a810f2cba1d1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 18 Oct 2019 22:03:31 +0200 Subject: [PATCH 032/233] substitute error introduced when enabling MSC.Marc --- processing/post/DADF5_vtk_cells.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/processing/post/DADF5_vtk_cells.py b/processing/post/DADF5_vtk_cells.py index bb11a8eed..1f5cc6686 100755 --- a/processing/post/DADF5_vtk_cells.py +++ b/processing/post/DADF5_vtk_cells.py @@ -42,7 +42,7 @@ for filename in options.filenames: results = damask.DADF5(filename) if results.structured: # for grid solvers use rectilinear grid - grid = vtk.vtkRectilineagrid() + grid = vtk.vtkRectilinearGrid() coordArray = [vtk.vtkDoubleArray(), vtk.vtkDoubleArray(), vtk.vtkDoubleArray(), @@ -120,7 +120,7 @@ for filename in options.filenames: vtk_data[-1].SetName('1_'+x[0].split('/',1)[1]) grid.GetCellData().AddArray(vtk_data[-1]) - writer = vtk.vtkXMLRectilineagridWriter() if results.structured else \ + writer = vtk.vtkXMLRectilinearGridWriter() if results.structured else \ vtk.vtkXMLUnstructuredGridWriter() results.set_visible('constituents', False) From 5f0a48fae72b918bd776b5d36ca44d816c2cdc95 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 08:51:51 +0200 Subject: [PATCH 033/233] enhanced and documented --- python/damask/mechanics.py | 66 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index dad601701..8ff154295 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -1,6 +1,18 @@ import numpy as np def Cauchy(F,P): + """ + Calculate Cauchy stress from 1st Piola-Kirchhoff stress and deformation gradient. + + Resulting tensor is symmetrized as the Cauchy stress needs to be symmetric. + + Parameters + ---------- + F : numpy.array of shape (x,3,3) or (3,3) + Deformation gradient. + P : numpy.array of shape (x,3,3) or (3,3) + 1st Piola-Kirchhoff. + """ if np.shape(F) == np.shape(P) == (3,3): sigma = 1.0/np.linalg.det(F) * np.dot(F,P) return (sigma+sigma.T)*0.5 @@ -9,15 +21,65 @@ def Cauchy(F,P): return (sigma + np.transpose(sigma,(0,2,1)))*0.5 -def deviator(x): +def deviatoric_part(x): + """ + Calculate deviatoric part of a tensor. + + Parameters + ---------- + x : numpy.array of shape (x,3,3) or (3,3) + Tensor. + """ if np.shape(x) == (3,3): return x - np.eye(3)*np.trace(x)/3.0 else: return x - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[x.shape[0],3,3]),np.trace(x,axis1=1,axis2=2)/3.0) -def spherical(x): +def spherical_part(x): + """ + Calculate spherical(hydrostatic) part of a tensor. + + A single scalar is returned, i.e. the hydrostatic part is not mapped on the 3rd order identity matrix. + + Parameters + ---------- + x : numpy.array of shape (x,3,3) or (3,3) + Tensor. + """ if np.shape(x) == (3,3): return np.trace(x)/3.0 else: return np.trace(x,axis1=1,axis2=2)/3.0 + + +def Mises_stress(sigma): + """ + Calculate the Mises equivalent of a stress tensor. + + Parameters + ---------- + sigma : numpy.array of shape (x,3,3) or (3,3) + Symmetric stress tensor. + """ + s = deviatoric_part(sigma) + if np.shape(sigma) == (3,3): + return np.sqrt(3.0/2.0*np.trace(s)) + else: + return np.sqrt(np.einsum('ijk->i',s)*3.0/2.0) + + +def Mises_strain(epsilon): + """ + Calculate the Mises equivalent of a strain tensor. + + Parameters + ---------- + sigma : numpy.array of shape (x,3,3) or (3,3) + Symmetric strain tensor. + """ + s = deviatoric_part(epsilon) + if np.shape(epsilon) == (3,3): + return np.sqrt(2.0/3.0*np.trace(s)) + else: + return np.sqrt(2.0/3.0*np.einsum('ijk->i',s)) From e51f6cee722c2dc391a26151ac244b2f608d5f26 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 09:47:26 +0200 Subject: [PATCH 034/233] improved handling of string types for HDF5 - convert bytes to string when reading - convert string to bytes when writing --- python/damask/dadf5.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index a50eb44f8..3a88d68c0 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -401,22 +401,16 @@ class DADF5(): """Adds the equivalent Mises stress or strain of a tensor.""" def Mises(x): - if x['meta']['Unit'] == b'Pa': #ToDo: Should we use this? Then add_Cauchy and add_strain_tensors also should perform sanity checks - factor = 3.0/2.0 + if x['meta']['Unit'] == 'Pa': #ToDo: Should we use this? Then add_Cauchy and add_strain_tensors also should perform sanity checks t = 'stress' - elif x['meta']['Unit'] == b'1': - factor = 2.0/3.0 + elif x['meta']['Unit'] == '1': t = 'strain' else: print(x['meta']['Unit']) raise ValueError - - d = x['data'] - dev = d - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[d.shape[0],3,3]),np.trace(d,axis1=1,axis2=2)/3.0) - #dev_sym = (dev + np.einsum('ikj',dev))*0.5 # ToDo: this is not needed (only if the input is not symmetric, but then the whole concept breaks down) return { - 'data' : np.sqrt(np.einsum('ijk->i',dev**2)*factor), + 'data' : mechanics.Mises_strain(x['data']) if t=='strain' else mechanics.Mises_stress(x['data']), 'label' : '{}_vM'.format(x['label']), 'meta' : { 'Unit' : x['meta']['Unit'], @@ -699,7 +693,7 @@ class DADF5(): for d in datasets_requested: loc = f[group+'/'+d['label']] data = loc[()] - meta = {k:loc.attrs[k] for k in loc.attrs.keys()} + meta = {k:loc.attrs[k].decode() for k in loc.attrs.keys()} datasets_in[d['arg']] = {'data': data, 'meta' : meta, 'label' : d['label']} todo.append({'in':{**datasets_in,**extra_args},'func':func,'group':group,'results':results}) @@ -712,7 +706,7 @@ class DADF5(): with h5py.File(self.filename,'a') as f: # write to file dataset_out = f[result['group']].create_dataset(result['label'],data=result['data']) for k in result['meta'].keys(): - dataset_out.attrs[k] = result['meta'][k] + dataset_out.attrs[k] = result['meta'][k].encode() N_not_calculated-=1 if N_added < len(todo): # add more jobs From b31de5d0f6c5a594f5a1a22770f5914994a01772 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 12:54:16 +0200 Subject: [PATCH 035/233] outsourcing tensor math to mechanics class strain calculation is generalize to arbitrary order and simplified: No need for svd, F^T F/F F^T does the job. --- python/damask/dadf5.py | 373 +++++++++++++++++++++---------------- python/damask/mechanics.py | 146 +++++++++++---- 2 files changed, 324 insertions(+), 195 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 3a88d68c0..b92a53830 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -360,7 +360,7 @@ class DADF5(): def cell_coordinates(self): - """Initial coordinates of the cell centers.""" + """Return initial coordinates of the cell centers.""" if self.structured: delta = self.size/self.grid*0.5 z, y, x = np.meshgrid(np.linspace(delta[2],self.size[2]-delta[2],self.grid[2]), @@ -375,62 +375,72 @@ class DADF5(): def add_Cauchy(self,P='P',F='F'): """ - Adds Cauchy stress calculated from 1st Piola-Kirchhoff stress and deformation gradient. + Add Cauchy stress calculated from 1. Piola-Kirchhoff stress and deformation gradient. - Resulting tensor is symmetrized as the Cauchy stress should be symmetric. + Parameters + ---------- + P : str, optional + Label of the dataset containing the 1. Piola-Kirchhoff stress. Default value is ‘P’. + F : str, optional + Label of the dataset containing the deformation gradient. Default value is ‘F’. """ - def Cauchy(F,P): - return { - 'data' : mechanics.Cauchy(F['data'],P['data']), - 'label' : 'sigma', - 'meta' : { - 'Unit' : P['meta']['Unit'], - 'Description' : 'Cauchy stress calculated from {} ({}) '.format(P['label'],P['meta']['Description'])+\ - 'and deformation gradient {} ({})'.format(F['label'],F['meta']['Description']), - 'Creator' : 'dadf5.py:add_Cauchy v{}'.format(version) + def __add_Cauchy(F,P): + + return { + 'data': mechanics.Cauchy(F['data'],P['data']), + 'label': 'sigma', + 'meta': { + 'Unit': P['meta']['Unit'], + 'Description': 'Cauchy stress calculated from {} ({}) '.format(P['label'],P['meta']['Description'])+\ + 'and deformation gradient {} ({})'.format(F['label'],F['meta']['Description']), + 'Creator': 'dadf5.py:add_Cauchy v{}'.format(version) } - } + } requested = [{'label':F,'arg':'F'}, {'label':P,'arg':'P'} ] - self.__add_generic_pointwise(Cauchy,requested) + self.__add_generic_pointwise(__add_Cauchy,requested) def add_Mises(self,x): - """Adds the equivalent Mises stress or strain of a tensor.""" - def Mises(x): - - if x['meta']['Unit'] == 'Pa': #ToDo: Should we use this? Then add_Cauchy and add_strain_tensors also should perform sanity checks - t = 'stress' - elif x['meta']['Unit'] == '1': - t = 'strain' - else: - print(x['meta']['Unit']) - raise ValueError + """ + Add the equivalent Mises stress or strain of a symmetric tensor. + + Parameters + ---------- + x : str + Label of the dataset containing a symmetric stress or strain tensor + """ + def __add_Mises(x): - return { - 'data' : mechanics.Mises_strain(x['data']) if t=='strain' else mechanics.Mises_stress(x['data']), - 'label' : '{}_vM'.format(x['label']), - 'meta' : { - 'Unit' : x['meta']['Unit'], - 'Description' : 'Mises equivalent {} of {} ({})'.format(t,x['label'],x['meta']['Description']), - 'Creator' : 'dadf5.py:add_Mises_stress v{}'.format(version) + return { + 'data': mechanics.Mises_strain(x) if t=='strain' else mechanics.Mises_stress(x), + 'label': '{}_vM'.format(x['label']), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': 'Mises equivalent {} of {} ({})'.format(t,x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_Mises v{}'.format(version) } - } + } requested = [{'label':x,'arg':'x'}] - self.__add_generic_pointwise(Mises,requested) + self.__add_generic_pointwise(__add_Mises,requested) def add_norm(self,x,ord=None): """ - Adds norm of vector or tensor. + Add the norm of vector or tensor. - See numpy.linalg.norm manual for details. + Parameters + ---------- + x : str + Label of the dataset containing a vector or tensor. + ord : {non-zero int, inf, -inf, ‘fro’, ‘nuc’}, optional + Order of the norm. inf means numpy’s inf object. For details refer to numpy.linalg.norm. """ - def norm(x,ord): + def __add_norm(x,ord): o = ord if len(x['data'].shape) == 2: @@ -444,220 +454,258 @@ class DADF5(): else: raise ValueError - return { - 'data' : np.linalg.norm(x['data'],ord=o,axis=axis,keepdims=True), - 'label' : '|{}|_{}'.format(x['label'],o), - 'meta' : { - 'Unit' : x['meta']['Unit'], - 'Description' : '{}-Norm of {} {} ({})'.format(ord,t,x['label'],x['meta']['Description']), - 'Creator' : 'dadf5.py:add_norm v{}'.format(version) + return { + 'data': np.linalg.norm(x['data'],ord=o,axis=axis,keepdims=True), + 'label': '|{}|_{}'.format(x['label'],o), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': '{}-Norm of {} {} ({})'.format(ord,t,x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_norm v{}'.format(version) } } requested = [{'label':x,'arg':'x'}] - self.__add_generic_pointwise(norm,requested,{'ord':ord}) + self.__add_generic_pointwise(__add_norm,requested,{'ord':ord}) def add_absolute(self,x): - """Adds absolute value.""" - def absolute(x): + """ + Add absolute value. - return { - 'data' : np.abs(x['data']), - 'label' : '|{}|'.format(x['label']), - 'meta' : { - 'Unit' : x['meta']['Unit'], - 'Description' : 'Absolute value of {} ({})'.format(x['label'],x['meta']['Description']), - 'Creator' : 'dadf5.py:add_abs v{}'.format(version) + Parameters + ---------- + x : str + Label of the dataset containing a scalar, vector, or tensor. + """ + def __add_absolute(x): + + return { + 'data': np.abs(x['data']), + 'label': '|{}|'.format(x['label']), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': 'Absolute value of {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_abs v{}'.format(version) } } requested = [{'label':x,'arg':'x'}] - self.__add_generic_pointwise(absolute,requested) + self.__add_generic_pointwise(__add_absolute,requested) def add_determinant(self,x): - """Adds the determinant component of a tensor.""" - def determinant(x): + """ + Add the determinant of a tensor. + + Parameters + ---------- + x : str + Label of the dataset containing a tensor. + """ + def __add_determinant(x): - return { - 'data' : np.linalg.det(x['data']), - 'label' : 'det({})'.format(x['label']), - 'meta' : { - 'Unit' : x['meta']['Unit'], - 'Description' : 'Determinant of tensor {} ({})'.format(x['label'],x['meta']['Description']), - 'Creator' : 'dadf5.py:add_determinant v{}'.format(version) + return { + 'data': np.linalg.det(x['data']), + 'label': 'det({})'.format(x['label']), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': 'Determinant of tensor {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_determinant v{}'.format(version) } - } + } requested = [{'label':x,'arg':'x'}] - self.__add_generic_pointwise(determinant,requested) + self.__add_generic_pointwise(__add_determinant,requested) def add_spherical(self,x): - """Adds the spherical component of a tensor.""" - def spherical(x): + """ + Add the spherical (hydrostatic) part of a tensor. + + Parameters + ---------- + x : str + Label of the dataset containing a tensor. + """ + def __add_spherical(x): if not np.all(np.array(x['data'].shape[1:]) == np.array([3,3])): raise ValueError - return { - 'data' : np.trace(x['data'],axis1=1,axis2=2)/3.0, - 'label' : 'sph({})'.format(x['label']), - 'meta' : { - 'Unit' : x['meta']['Unit'], - 'Description' : 'Spherical component of tensor {} ({})'.format(x['label'],x['meta']['Description']), - 'Creator' : 'dadf5.py:add_spherical v{}'.format(version) + return { + 'data': mechanics.spherical_part(x), + 'label': 'p_{}'.format(x['label']), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': 'Spherical component of tensor {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_spherical v{}'.format(version) } } requested = [{'label':x,'arg':'x'}] - self.__add_generic_pointwise(spherical,requested) + self.__add_generic_pointwise(__add_spherical,requested) def add_deviator(self,x): - """Adds the deviator of a tensor.""" - def deviator(x): + """ + Add the deviatoric part of a tensor. + + Parameters + ---------- + x : str + Label of the dataset containing a tensor. + """ + def __add_deviator(x): if not np.all(np.array(x['data'].shape[1:]) == np.array([3,3])): raise ValueError - return { - 'data' : mechanics.deviator(x['data']), - 'label' : 'dev({})'.format(x['label']), - 'meta' : { - 'Unit' : x['meta']['Unit'], - 'Description' : 'Deviator of tensor {} ({})'.format(x['label'],x['meta']['Description']), - 'Creator' : 'dadf5.py:add_deviator v{}'.format(version) + return { + 'data': mechanics.deviator(x['data']), + 'label': 's_{}'.format(x['label']), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': 'Deviator of tensor {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_deviator v{}'.format(version) } } requested = [{'label':x,'arg':'x'}] - self.__add_generic_pointwise(deviator,requested) + self.__add_generic_pointwise(__add_deviator,requested) def add_calculation(self,formula,label,unit='n/a',description=None,vectorized=True): """ - General formula. - - Works currently only for vectorized expressions + Add result of a general formula. + Parameters + ---------- + formula : str + Formula, refer to datasets by ‘#Label#‘. + label : str + Label of the dataset containing the result of the calculation. + unit : str, optional + Physical unit of the result. + description : str, optional + Human readable description of the result. + vectorized : bool, optional + Indicate whether the formula is written in vectorized form. """ if vectorized is not True: raise NotImplementedError - def calculation(**kwargs): + def __add_calculation(**kwargs): formula = kwargs['formula'] for d in re.findall(r'#(.*?)#',formula): formula = formula.replace('#{}#'.format(d),"kwargs['{}']['data']".format(d)) - return { - 'data' : eval(formula), - 'label' : kwargs['label'], - 'meta' : { - 'Unit' : kwargs['unit'], - 'Description' : '{} (formula: {})'.format(kwargs['description'],kwargs['formula']), - 'Creator' : 'dadf5.py:add_calculation v{}'.format(version) + return { + 'data': eval(formula), + 'label': kwargs['label'], + 'meta': { + 'Unit': kwargs['unit'], + 'Description': '{} (formula: {})'.format(kwargs['description'],kwargs['formula']), + 'Creator': 'dadf5.py:add_calculation v{}'.format(version) } } - requested = [{'label':d,'arg':d} for d in set(re.findall(r'#(.*?)#',formula))] # datasets used in the formula + requested = [{'label':d,'arg':d} for d in set(re.findall(r'#(.*?)#',formula))] # datasets used in the formula pass_through = {'formula':formula,'label':label,'unit':unit,'description':description} - self.__add_generic_pointwise(calculation,requested,pass_through) + self.__add_generic_pointwise(__add_calculation,requested,pass_through) - def add_strain_tensor(self,t,ord,defgrad='F'): + def add_strain_tensor(self,F='F',t='U',ord=0): """ - Adds the a strain tensor. + Add strain tensor calculated from a deformation gradient. - Albrecht Bertram: Elasticity and Plasticity of Large Deformations An Introduction (3rd Edition, 2012), p. 102. + For details refer to damask.mechanics.strain_tensor + + Parameters + ---------- + F : str, optional + Label of the dataset containing the deformation gradient. Default value is ‘F’. + t : {‘V’, ‘U’}, optional + Type of the polar decomposition, ‘V’ for right stretch tensor and ‘U’ for left stretch tensor. + Defaults value is ‘U’. + ord : float, optional + Order of the strain calculation. Default value is ‘0.0’. """ - def strain_tensor(defgrad,t,ord): + def __add_strain_tensor(F,t,ord): - operator = { - 'V#ln': lambda V: np.log(V), - 'U#ln': lambda U: np.log(U), - 'V#Biot': lambda V: np.broadcast_to(np.ones(3),[V.shape[0],3]) - 1.0/V, - 'U#Biot': lambda U: U - np.broadcast_to(np.ones(3),[U.shape[0],3]), - 'V#Green':lambda V: np.broadcast_to(np.ones(3),[V.shape[0],3]) - 1.0/V**2, - 'U#Green':lambda U: U**2 - np.broadcast_to(np.ones(3),[U.shape[0],3]), - } - if t.lower() in ['l','left']: - stretch = 'V' - elif t.lower() in ['r','right']: - stretch = 'U' - else: - raise KeyError - - (U,S,Vh) = np.linalg.svd(defgrad['data']) # singular value decomposition - R_inv = np.transpose(np.matmul(U,Vh),(0,2,1)) # transposed rotation of polar decomposition - s = np.matmul(R_inv,defgrad['data']) if stretch == 'U' else \ - np.matmul(defgrad['data'],R_inv) # compute either left or right stretch - (D,V) = np.linalg.eigh((s+np.transpose(s,(0,2,1)))*.5) # eigen decomposition (of symmetric(ed) matrix) - - d = operator[stretch+'#'+{0:'ln',1:'Biot',2:'Green'}[ord]](D) - a = np.matmul(V,np.einsum('ij,ikj->ijk',d,V)) - - return { - 'data' : a, - 'label' : 'epsilon_{}^{}({})'.format(stretch,ord,defgrad['label']), - 'meta' : { - 'Unit' : defgrad['meta']['Unit'], - 'Description' : 'Strain tensor of {} ({})'.format(defgrad['label'],defgrad['meta']['Description']), - 'Creator' : 'dadf5.py:add_strain_tensor v{}'.format(version) + return { + 'data': mechanics.strain_tensor(F['data'],t,ord), + 'label': 'epsilon_{}^{}({})'.format(t,ord,F['label']), + 'meta': { + 'Unit': F['meta']['Unit'], + 'Description': 'Strain tensor of {} ({})'.format(F['label'],F['meta']['Description']), + 'Creator': 'dadf5.py:add_strain_tensor v{}'.format(version) } } - requested = [{'label':defgrad,'arg':'defgrad'}] + requested = [{'label':F,'arg':'F'}] - self.__add_generic_pointwise(strain_tensor,requested,{'t':t,'ord':ord}) + self.__add_generic_pointwise(__add_strain_tensor,requested,{'t':t,'ord':ord}) def add_principal_components(self,x): - """Adds principal components of symmetric tensor.""" - def principal_components(x): + """ + Add principal components of symmetric tensor. + + The principal components are sorted in descending order, each repeated according to its multiplicity. + + Parameters + ---------- + x : str + Label of the dataset containing a symmetric tensor. + """ + def __add_principal_components(x): - return { - 'data' : np.linalg.eigvalsh((x['data']+np.transpose(x['data'],(0,2,1)))*.5)[:,::-1], # eigenvalues (of symmetric(ed) matrix) - 'label' : 'lambda_{}'.format(x['label']), - 'meta' : { - 'Unit' : x['meta']['Unit'], - 'Description' : 'Pricipal components of {} ({})'.format(x['label'],x['meta']['Description']), - 'Creator' : 'dadf5.py:add_principal_components v{}'.format(version) + return { + 'data': mechanics.principal_components(x), + 'label': 'lambda_{}'.format(x['label']), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': 'Pricipal components of {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_principal_components v{}'.format(version) } } requested = [{'label':x,'arg':'x'}] - self.__add_generic_pointwise(principal_components,requested) + self.__add_generic_pointwise(__add_principal_components,requested) def add_maximum_shear(self,x): - """Adds maximum shear components of symmetric tensor.""" - def maximum_shear(x): + """ + Add maximum shear components of symmetric tensor. - w = np.linalg.eigvalsh((x['data']+np.transpose(x['data'],(0,2,1)))*.5) # eigenvalues (of symmetric(ed) matrix) + Parameters + ---------- + x : str + Label of the dataset containing a symmetric tensor. + """ + def __add_maximum_shear(x): - return { - 'data' : (w[:,2] - w[:,0])*0.5, - 'label' : 'max_shear({})'.format(x['label']), - 'meta' : { - 'Unit' : x['meta']['Unit'], - 'Description' : 'Maximum shear component of of {} ({})'.format(x['label'],x['meta']['Description']), - 'Creator' : 'dadf5.py:add_maximum_shear v{}'.format(version) + return { + 'data': mechanics.maximum_shear(x), + 'label': 'max_shear({})'.format(x['label']), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': 'Maximum shear component of of {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_maximum_shear v{}'.format(version) } } requested = [{'label':x,'arg':'x'}] - self.__add_generic_pointwise(maximum_shear,requested) + self.__add_generic_pointwise(__add_maximum_shear,requested) def __add_generic_pointwise(self,func,datasets_requested,extra_args={}): @@ -666,13 +714,12 @@ class DADF5(): Parameters ---------- - func : function - Function that calculates a new dataset from one or more datasets per HDF5 group. - datasets_requested : list of dictionaries - Details of the datasets to be used: label (in HDF5 file) and arg (argument to which the data is parsed in func). - extra_args : dictionary, optional - Any extra arguments parsed to func. - + func : function + Function that calculates a new dataset from one or more datasets per HDF5 group. + datasets_requested : list of dictionaries + Details of the datasets to be used: label (in HDF5 file) and arg (argument to which the data is parsed in func). + extra_args : dictionary, optional + Any extra arguments parsed to func. """ def job(args): """Call function with input data + extra arguments, returns results + group.""" diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index 8ff154295..5236e261d 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -2,84 +2,166 @@ import numpy as np def Cauchy(F,P): """ - Calculate Cauchy stress from 1st Piola-Kirchhoff stress and deformation gradient. + Return Cauchy stress calculated from 1. Piola-Kirchhoff stress and deformation gradient. Resulting tensor is symmetrized as the Cauchy stress needs to be symmetric. Parameters ---------- F : numpy.array of shape (x,3,3) or (3,3) - Deformation gradient. + Deformation gradient. P : numpy.array of shape (x,3,3) or (3,3) - 1st Piola-Kirchhoff. + 1. Piola-Kirchhoff stress. """ if np.shape(F) == np.shape(P) == (3,3): sigma = 1.0/np.linalg.det(F) * np.dot(F,P) - return (sigma+sigma.T)*0.5 else: - sigma = np.einsum('i,ijk,ilk->ijl',1.0/np.linalg.det(F),P,F) - return (sigma + np.transpose(sigma,(0,2,1)))*0.5 + sigma = np.einsum('i,ijk,ilk->ijl',1.0/np.linalg.det(F),P,F) + return symmetric(sigma) + + +def strain_tensor(F,t,ord): + """ + Return strain tensor calculated from deformation gradient. + + For details refer to Albrecht Bertram: Elasticity and Plasticity of Large Deformations: + An Introduction (3rd Edition, 2012), p. 102. + + Parameters + ---------- + F : numpy.array of shape (x,3,3) or (3,3) + Deformation gradient. + t : {‘V’, ‘U’} + Type of the polar decomposition, ‘V’ for right stretch tensor and ‘U’ for left stretch tensor. + ord : float + Order of the strain + """ + F_expanded = F if len(F.shape) == 3 else F.reshape(1,3,3) + + if t == 'U': + B = np.matmul(F_expanded,transpose(F_expanded)) + U,n = np.linalg.eigh(symmetric(B)) + l = np.log(U) if ord == 0 else U**ord - np.broadcast_to(np.ones(3),[U.shape[0],3]) + elif t == 'V': + C = np.matmul(transpose(F_expanded),F_expanded) + V,n = np.linalg.eigh(symmetric(C)) + l = np.log(V) if ord == 0 else np.broadcast_to(np.ones(3),[V.shape[0],3]) - 1.0/V**ord + + epsilon = np.matmul(n,np.einsum('ij,ikj->ijk',l,n)) + + return epsilon.reshape((3,3)) if np.shape(F) == (3,3) else \ + epsilon def deviatoric_part(x): """ - Calculate deviatoric part of a tensor. + Return deviatoric part of a tensor. Parameters ---------- x : numpy.array of shape (x,3,3) or (3,3) - Tensor. + Tensor. """ - if np.shape(x) == (3,3): - return x - np.eye(3)*np.trace(x)/3.0 - else: - return x - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[x.shape[0],3,3]),np.trace(x,axis1=1,axis2=2)/3.0) + return x - np.eye(3)*spherical_part(x) if np.shape(x) == (3,3) else \ + x - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[x.shape[0],3,3]),spherical_part(x)) def spherical_part(x): """ - Calculate spherical(hydrostatic) part of a tensor. + Return spherical (hydrostatic) part of a tensor. - A single scalar is returned, i.e. the hydrostatic part is not mapped on the 3rd order identity matrix. + A single scalar is returned, i.e. the hydrostatic part is not mapped on the 3rd order identity + matrix. Parameters ---------- x : numpy.array of shape (x,3,3) or (3,3) - Tensor. + Tensor. """ - if np.shape(x) == (3,3): - return np.trace(x)/3.0 - else: - return np.trace(x,axis1=1,axis2=2)/3.0 + + return np.trace(x)/3.0 if np.shape(x) == (3,3) else \ + np.trace(x,axis1=1,axis2=2)/3.0 def Mises_stress(sigma): """ - Calculate the Mises equivalent of a stress tensor. + Return the Mises equivalent of a stress tensor. Parameters ---------- sigma : numpy.array of shape (x,3,3) or (3,3) - Symmetric stress tensor. + Symmetric stress tensor. """ s = deviatoric_part(sigma) - if np.shape(sigma) == (3,3): - return np.sqrt(3.0/2.0*np.trace(s)) - else: - return np.sqrt(np.einsum('ijk->i',s)*3.0/2.0) + return np.sqrt(3.0/2.0*np.trace(s)) if np.shape(sigma) == (3,3) else \ + np.sqrt(3.0/2.0*np.einsum('ijk->i',s)) def Mises_strain(epsilon): """ - Calculate the Mises equivalent of a strain tensor. + Return the Mises equivalent of a strain tensor. Parameters ---------- - sigma : numpy.array of shape (x,3,3) or (3,3) - Symmetric strain tensor. + epsilon : numpy.array of shape (x,3,3) or (3,3) + Symmetric strain tensor. """ s = deviatoric_part(epsilon) - if np.shape(epsilon) == (3,3): - return np.sqrt(2.0/3.0*np.trace(s)) - else: - return np.sqrt(2.0/3.0*np.einsum('ijk->i',s)) + return np.sqrt(2.0/3.0*np.trace(s)) if np.shape(epsilon) == (3,3) else \ + np.sqrt(2.0/3.0*np.einsum('ijk->i',s)) + + +def symmetric(x): + """ + Return the symmetrized tensor. + + Parameters + ---------- + x : numpy.array of shape (x,3,3) or (3,3) + Tensor. + """ + return (x+transpose(x))*0.5 + + +def maximum_shear(x): + """ + Return the maximum shear component of a symmetric tensor. + + Parameters + ---------- + x : numpy.array of shape (x,3,3) or (3,3) + Symmetric tensor. + """ + w = np.linalg.eigvalsh(symmetric(x)) # eigenvalues in ascending order + return (w[2] - w[0])*0.5 if np.shape(epsilon) == (3,3) else \ + (w[:,2] - w[:,0])*0.5 + + +def principal_components(x): + """ + Return the principal components of a symmetric tensor. + + The principal components (eigenvalues) are sorted in descending order, each repeated according to + its multiplicity. + + Parameters + ---------- + x : numpy.array of shape (x,3,3) or (3,3) + Symmetric tensor. + """ + w = np.linalg.eigvalsh(symmetric(x)) # eigenvalues in ascending order + return w[::-1] if np.shape(epsilon) == (3,3) else \ + w[:,::-1] + + +def transpose(x): + """ + Return the transpose of a tensor. + + Parameters + ---------- + x : numpy.array of shape (x,3,3) or (3,3) + Tensor. + """ + return x.T if np.shape(x) == (3,3) else \ + np.transpose(x,(0,2,1)) From a665d5726d291e5a324e8f5bbf03d6208ccbdb85 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 13:10:46 +0200 Subject: [PATCH 036/233] polishing --- python/damask/dadf5.py | 19 +++++++++++-- python/damask/mechanics.py | 57 +++++++++++++++++++++----------------- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index b92a53830..59b3f0c4e 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -327,7 +327,7 @@ class DADF5(): """ Dataset for all points/cells. - If more than one path is given, the dataset is composed of the individual contributions + If more than one path is given, the dataset is composed of the individual contributions. """ with h5py.File(self.filename,'r') as f: shape = (self.Nmaterialpoints,) + np.shape(f[path[0]])[1:] @@ -383,6 +383,7 @@ class DADF5(): Label of the dataset containing the 1. Piola-Kirchhoff stress. Default value is ‘P’. F : str, optional Label of the dataset containing the deformation gradient. Default value is ‘F’. + """ def __add_Cauchy(F,P): @@ -410,10 +411,12 @@ class DADF5(): Parameters ---------- x : str - Label of the dataset containing a symmetric stress or strain tensor + Label of the dataset containing a symmetric stress or strain tensor. + """ def __add_Mises(x): + t = 'strain' if x['Unit'] == '1' else 'stress' return { 'data': mechanics.Mises_strain(x) if t=='strain' else mechanics.Mises_stress(x), 'label': '{}_vM'.format(x['label']), @@ -439,6 +442,7 @@ class DADF5(): Label of the dataset containing a vector or tensor. ord : {non-zero int, inf, -inf, ‘fro’, ‘nuc’}, optional Order of the norm. inf means numpy’s inf object. For details refer to numpy.linalg.norm. + """ def __add_norm(x,ord): @@ -477,6 +481,7 @@ class DADF5(): ---------- x : str Label of the dataset containing a scalar, vector, or tensor. + """ def __add_absolute(x): @@ -503,6 +508,7 @@ class DADF5(): ---------- x : str Label of the dataset containing a tensor. + """ def __add_determinant(x): @@ -529,6 +535,7 @@ class DADF5(): ---------- x : str Label of the dataset containing a tensor. + """ def __add_spherical(x): @@ -558,6 +565,7 @@ class DADF5(): ---------- x : str Label of the dataset containing a tensor. + """ def __add_deviator(x): @@ -594,7 +602,8 @@ class DADF5(): description : str, optional Human readable description of the result. vectorized : bool, optional - Indicate whether the formula is written in vectorized form. + Indicate whether the formula is written in vectorized form. Default is ‘True’. + """ if vectorized is not True: raise NotImplementedError @@ -636,6 +645,7 @@ class DADF5(): Defaults value is ‘U’. ord : float, optional Order of the strain calculation. Default value is ‘0.0’. + """ def __add_strain_tensor(F,t,ord): @@ -664,6 +674,7 @@ class DADF5(): ---------- x : str Label of the dataset containing a symmetric tensor. + """ def __add_principal_components(x): @@ -690,6 +701,7 @@ class DADF5(): ---------- x : str Label of the dataset containing a symmetric tensor. + """ def __add_maximum_shear(x): @@ -720,6 +732,7 @@ class DADF5(): Details of the datasets to be used: label (in HDF5 file) and arg (argument to which the data is parsed in func). extra_args : dictionary, optional Any extra arguments parsed to func. + """ def job(args): """Call function with input data + extra arguments, returns results + group.""" diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index 5236e261d..9b6112eb4 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -12,6 +12,7 @@ def Cauchy(F,P): Deformation gradient. P : numpy.array of shape (x,3,3) or (3,3) 1. Piola-Kirchhoff stress. + """ if np.shape(F) == np.shape(P) == (3,3): sigma = 1.0/np.linalg.det(F) * np.dot(F,P) @@ -34,23 +35,22 @@ def strain_tensor(F,t,ord): t : {‘V’, ‘U’} Type of the polar decomposition, ‘V’ for right stretch tensor and ‘U’ for left stretch tensor. ord : float - Order of the strain + Order of the strain. + """ - F_expanded = F if len(F.shape) == 3 else F.reshape(1,3,3) - if t == 'U': - B = np.matmul(F_expanded,transpose(F_expanded)) - U,n = np.linalg.eigh(symmetric(B)) - l = np.log(U) if ord == 0 else U**ord - np.broadcast_to(np.ones(3),[U.shape[0],3]) + B = np.matmul(F,transpose(F)) + U,n = np.linalg.eigh(B) + lmd = np.log(U) if ord == 0 else \ + U**ord - (np.broadcast_to(np.ones(3),[U.shape[0],3]) if len(F.shape) == 3 else np.ones(3)) elif t == 'V': - C = np.matmul(transpose(F_expanded),F_expanded) - V,n = np.linalg.eigh(symmetric(C)) - l = np.log(V) if ord == 0 else np.broadcast_to(np.ones(3),[V.shape[0],3]) - 1.0/V**ord - - epsilon = np.matmul(n,np.einsum('ij,ikj->ijk',l,n)) - - return epsilon.reshape((3,3)) if np.shape(F) == (3,3) else \ - epsilon + C = np.matmul(transpose(F),F) + V,n = np.linalg.eigh(C) + lmd = np.log(V) if ord == 0 else \ + - 1.0/V**ord + (np.broadcast_to(np.ones(3),[V.shape[0],3]) if len(F.shape) == 3 else np.ones(3)) + + return np.dot(n,np.dot(np.diag(l),n.T)) if np.shape(F) == (3,3) else \ + np.matmul(n,np.einsum('ij,ikj->ijk',lmd,n)) def deviatoric_part(x): @@ -60,7 +60,8 @@ def deviatoric_part(x): Parameters ---------- x : numpy.array of shape (x,3,3) or (3,3) - Tensor. + Tensor of which the deviatoric part is computed. + """ return x - np.eye(3)*spherical_part(x) if np.shape(x) == (3,3) else \ x - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[x.shape[0],3,3]),spherical_part(x)) @@ -76,9 +77,9 @@ def spherical_part(x): Parameters ---------- x : numpy.array of shape (x,3,3) or (3,3) - Tensor. + Tensor of which the hydrostatic part is computed. + """ - return np.trace(x)/3.0 if np.shape(x) == (3,3) else \ np.trace(x,axis1=1,axis2=2)/3.0 @@ -90,7 +91,8 @@ def Mises_stress(sigma): Parameters ---------- sigma : numpy.array of shape (x,3,3) or (3,3) - Symmetric stress tensor. + Symmetric stress tensor of which the von Mises equivalent is computed. + """ s = deviatoric_part(sigma) return np.sqrt(3.0/2.0*np.trace(s)) if np.shape(sigma) == (3,3) else \ @@ -104,7 +106,8 @@ def Mises_strain(epsilon): Parameters ---------- epsilon : numpy.array of shape (x,3,3) or (3,3) - Symmetric strain tensor. + Symmetric strain tensor of which the von Mises equivalent is computed. + """ s = deviatoric_part(epsilon) return np.sqrt(2.0/3.0*np.trace(s)) if np.shape(epsilon) == (3,3) else \ @@ -118,7 +121,8 @@ def symmetric(x): Parameters ---------- x : numpy.array of shape (x,3,3) or (3,3) - Tensor. + Tensor of which the symmetrized values are computed. + """ return (x+transpose(x))*0.5 @@ -130,10 +134,11 @@ def maximum_shear(x): Parameters ---------- x : numpy.array of shape (x,3,3) or (3,3) - Symmetric tensor. + Symmetric tensor of which the maximum shear is computed. + """ w = np.linalg.eigvalsh(symmetric(x)) # eigenvalues in ascending order - return (w[2] - w[0])*0.5 if np.shape(epsilon) == (3,3) else \ + return (w[2] - w[0])*0.5 if np.shape(x) == (3,3) else \ (w[:,2] - w[:,0])*0.5 @@ -147,10 +152,11 @@ def principal_components(x): Parameters ---------- x : numpy.array of shape (x,3,3) or (3,3) - Symmetric tensor. + Symmetric tensor of which the principal compontents are computed. + """ w = np.linalg.eigvalsh(symmetric(x)) # eigenvalues in ascending order - return w[::-1] if np.shape(epsilon) == (3,3) else \ + return w[::-1] if np.shape(x) == (3,3) else \ w[:,::-1] @@ -161,7 +167,8 @@ def transpose(x): Parameters ---------- x : numpy.array of shape (x,3,3) or (3,3) - Tensor. + Tensor of which the transpose is computer. + """ return x.T if np.shape(x) == (3,3) else \ np.transpose(x,(0,2,1)) From 64731369e3ec5b12fa5918a571544885e965361a Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 16:02:48 +0200 Subject: [PATCH 037/233] general definition for strain tensors --- python/damask/dadf5.py | 12 ++++++------ python/damask/mechanics.py | 38 ++++++++++++++++++++++---------------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 59b3f0c4e..0d62c9f8e 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -630,7 +630,7 @@ class DADF5(): self.__add_generic_pointwise(__add_calculation,requested,pass_through) - def add_strain_tensor(self,F='F',t='U',ord=0): + def add_strain_tensor(self,F='F',t='U',m=0): """ Add strain tensor calculated from a deformation gradient. @@ -643,15 +643,15 @@ class DADF5(): t : {‘V’, ‘U’}, optional Type of the polar decomposition, ‘V’ for right stretch tensor and ‘U’ for left stretch tensor. Defaults value is ‘U’. - ord : float, optional + m : float, optional Order of the strain calculation. Default value is ‘0.0’. """ - def __add_strain_tensor(F,t,ord): + def __add_strain_tensor(F,t,m): return { - 'data': mechanics.strain_tensor(F['data'],t,ord), - 'label': 'epsilon_{}^{}({})'.format(t,ord,F['label']), + 'data': mechanics.strain_tensor(F['data'],t,m), + 'label': 'epsilon_{}^{}({})'.format(t,m,F['label']), 'meta': { 'Unit': F['meta']['Unit'], 'Description': 'Strain tensor of {} ({})'.format(F['label'],F['meta']['Description']), @@ -661,7 +661,7 @@ class DADF5(): requested = [{'label':F,'arg':'F'}] - self.__add_generic_pointwise(__add_strain_tensor,requested,{'t':t,'ord':ord}) + self.__add_generic_pointwise(__add_strain_tensor,requested,{'t':t,'m':m}) def add_principal_components(self,x): diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index 9b6112eb4..c89d16918 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -21,12 +21,12 @@ def Cauchy(F,P): return symmetric(sigma) -def strain_tensor(F,t,ord): +def strain_tensor(F,t,m): """ Return strain tensor calculated from deformation gradient. - For details refer to Albrecht Bertram: Elasticity and Plasticity of Large Deformations: - An Introduction (3rd Edition, 2012), p. 102. + For details refer to https://en.wikipedia.org/wiki/Finite_strain_theory and + https://de.wikipedia.org/wiki/Verzerrungstensor Parameters ---------- @@ -34,23 +34,29 @@ def strain_tensor(F,t,ord): Deformation gradient. t : {‘V’, ‘U’} Type of the polar decomposition, ‘V’ for right stretch tensor and ‘U’ for left stretch tensor. - ord : float + m : float Order of the strain. - """ + """ + F_ = F.reshape((1,3,3)) if F.shape == (3,3) else F if t == 'U': - B = np.matmul(F,transpose(F)) - U,n = np.linalg.eigh(B) - lmd = np.log(U) if ord == 0 else \ - U**ord - (np.broadcast_to(np.ones(3),[U.shape[0],3]) if len(F.shape) == 3 else np.ones(3)) + B = np.matmul(F_,transpose(F_)) + w,n = np.linalg.eigh(B) elif t == 'V': - C = np.matmul(transpose(F),F) - V,n = np.linalg.eigh(C) - lmd = np.log(V) if ord == 0 else \ - - 1.0/V**ord + (np.broadcast_to(np.ones(3),[V.shape[0],3]) if len(F.shape) == 3 else np.ones(3)) - - return np.dot(n,np.dot(np.diag(l),n.T)) if np.shape(F) == (3,3) else \ - np.matmul(n,np.einsum('ij,ikj->ijk',lmd,n)) + C = np.matmul(transpose(F_),F_) + w,n = np.linalg.eigh(C) + + if m > 0.0: + eps = 1.0/(2.0*abs(m)) * (+ np.matmul(n,np.einsum('ij,ikj->ijk',w**m,n)) + - np.broadcast_to(np.ones(3),[F_.shape[0],3])) + elif m < 0.0: + eps = 1.0/(2.0*abs(m)) * (- np.matmul(n,np.einsum('ij,ikj->ijk',w**m,n)) + + np.broadcast_to(np.ones(3),[F_.shape[0],3])) + else: + eps = np.matmul(n,np.einsum('ij,ikj->ijk',0.5*np.log(w),n)) + + return eps.reshape((3,3)) if np.shape(F) == (3,3) else \ + eps def deviatoric_part(x): From 3de605d7822a020ddd86840ae7c706c4b4e93840 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 16:06:01 +0200 Subject: [PATCH 038/233] better name --- src/results.f90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/results.f90 b/src/results.f90 index 36b122776..471f994d6 100644 --- a/src/results.f90 +++ b/src/results.f90 @@ -304,18 +304,18 @@ subroutine results_writeTensorDataset_real(group,dataset,label,description,SIuni real(pReal), intent(in), dimension(:,:,:) :: dataset integer :: i - logical :: T + logical :: transposed_ integer(HID_T) :: groupHandle real(pReal), dimension(:,:,:), allocatable :: dataset_transposed if(present(transposed)) then - T = transposed + transposed_ = transposed else - T = .true. + transposed_ = .true. endif - if(T) then + if(transposed_) then if(size(dataset,1) /= size(dataset,2)) call IO_error(0,ext_msg='transpose non-symmetric tensor') allocate(dataset_transposed,mold=dataset) do i=1,size(dataset_transposed,3) From 603973e963b0a32b607808675bb0b802d8ec1b86 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 19:55:00 +0200 Subject: [PATCH 039/233] correct output for multipe integration points --- src/crystallite.f90 | 20 ++++++++++---------- src/material.f90 | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/crystallite.f90 b/src/crystallite.f90 index f3459c0d7..f93cb4355 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -1055,16 +1055,16 @@ subroutine crystallite_results real(pReal), allocatable, dimension(:,:,:) :: select_tensors integer :: e,i,c,j - allocate(select_tensors(3,3,count(material_phaseAt==instance)*homogenization_maxNgrains)) + allocate(select_tensors(3,3,count(material_phaseAt==instance)*homogenization_maxNgrains*discretization_nIP)) j=0 do e = 1, size(material_phaseAt,2) - do i = 1, homogenization_maxNgrains !ToDo: this needs to be changed for varying Ngrains - do c = 1, size(material_phaseAt,1) - if (material_phaseAt(c,e) == instance) then - j = j + 1 - select_tensors(1:3,1:3,j) = dataset(1:3,1:3,c,i,e) - endif + do i = 1, discretization_nIP + do c = 1, size(material_phaseAt,1) !ToDo: this needs to be changed for varying Ngrains + if (material_phaseAt(c,e) == instance) then + j = j + 1 + select_tensors(1:3,1:3,j) = dataset(1:3,1:3,c,i,e) + endif enddo enddo enddo @@ -1082,12 +1082,12 @@ subroutine crystallite_results type(rotation), allocatable, dimension(:) :: select_rotations integer :: e,i,c,j - allocate(select_rotations(count(material_phaseAt==instance)*homogenization_maxNgrains)) + allocate(select_rotations(count(material_phaseAt==instance)*homogenization_maxNgrains*discretization_nIP)) j=0 do e = 1, size(material_phaseAt,2) - do i = 1, homogenization_maxNgrains !ToDo: this needs to be changed for varying Ngrains - do c = 1, size(material_phaseAt,1) + do i = 1, discretization_nIP + do c = 1, size(material_phaseAt,1) !ToDo: this needs to be changed for varying Ngrains if (material_phaseAt(c,e) == instance) then j = j + 1 select_rotations(j) = dataset(c,i,e) diff --git a/src/material.f90 b/src/material.f90 index 78aa9fed6..2212fbe28 100644 --- a/src/material.f90 +++ b/src/material.f90 @@ -135,7 +135,7 @@ module material material_homogenizationMemberAt !< position of the element within its homogenization instance integer, dimension(:,:), allocatable, public, protected :: & ! (constituent,elem) material_phaseAt !< phase ID of each element - integer, dimension(:,:,:), allocatable, public, protected :: & ! (constituent,ip,elem) + integer, dimension(:,:,:), allocatable, public, protected :: & ! (constituent,elem) material_phaseMemberAt !< position of the element within its phase instance ! END NEW MAPPINGS From a77b0fe64493ccb7a2ad0532452a664fff1c80bd Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 22:18:48 +0200 Subject: [PATCH 040/233] tests without spectralOut --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 214c69be8..33c145fe7 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 214c69be8b51adb39eb7ad25b139727c8b98afce +Subproject commit 33c145fe78d26d339a35c378dc99103c1325d7e0 From 18bd80b09c0670013d52ed4f4c6423d068953698 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 23:01:57 +0200 Subject: [PATCH 041/233] use fixed test --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 33c145fe7..9b7981c6c 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 33c145fe78d26d339a35c378dc99103c1325d7e0 +Subproject commit 9b7981c6cba9d8110b88cf00abd730e25136c69b From 15d9cdee573c6f6dae518be14fb7d78b33735da3 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 23:04:50 +0200 Subject: [PATCH 042/233] get rid of spectralOut --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 9b7981c6c..93d2192c6 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 9b7981c6cba9d8110b88cf00abd730e25136c69b +Subproject commit 93d2192c67a06ee6be95ff249ab8c4cb34f71d2d From 6ef00a926648129af57b54830097c153cd458e0d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 23:13:23 +0200 Subject: [PATCH 043/233] run all tests again --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 93d2192c6..ebe26d80a 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 93d2192c67a06ee6be95ff249ab8c4cb34f71d2d +Subproject commit ebe26d80a86c99a7f50aef72675c623e4510a562 From 65eb4e364ff992b4b6306c71e83c85e30f5b0115 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 21:04:09 +0200 Subject: [PATCH 044/233] phasing out postResults --- src/constitutive.f90 | 24 ++------ src/plastic_disloUCLA.f90 | 66 ---------------------- src/plastic_dislotwin.f90 | 90 ------------------------------ src/plastic_kinematichardening.f90 | 70 ----------------------- 4 files changed, 6 insertions(+), 244 deletions(-) diff --git a/src/constitutive.f90 b/src/constitutive.f90 index ee907eeb1..c7736fd19 100644 --- a/src/constitutive.f90 +++ b/src/constitutive.f90 @@ -128,16 +128,16 @@ subroutine constitutive_init thisSize => plastic_phenopowerlaw_sizePostResult case (PLASTICITY_KINEHARDENING_ID) plasticityType outputName = PLASTICITY_KINEHARDENING_label - thisOutput => plastic_kinehardening_output - thisSize => plastic_kinehardening_sizePostResult + thisOutput => null() + thisSize => null() case (PLASTICITY_DISLOTWIN_ID) plasticityType outputName = PLASTICITY_DISLOTWIN_label - thisOutput => plastic_dislotwin_output - thisSize => plastic_dislotwin_sizePostResult + thisOutput => null() + thisSize => null() case (PLASTICITY_DISLOUCLA_ID) plasticityType outputName = PLASTICITY_DISLOUCLA_label - thisOutput => plastic_disloucla_output - thisSize => plastic_disloucla_sizePostResult + thisOutput => null() + thisSize => null() case (PLASTICITY_NONLOCAL_ID) plasticityType outputName = PLASTICITY_NONLOCAL_label thisOutput => plastic_nonlocal_output @@ -744,18 +744,6 @@ function constitutive_postResults(S, Fi, ipc, ip, el) constitutive_postResults(startPos:endPos) = & plastic_phenopowerlaw_postResults(Mp,instance,of) - case (PLASTICITY_KINEHARDENING_ID) plasticityType - constitutive_postResults(startPos:endPos) = & - plastic_kinehardening_postResults(Mp,instance,of) - - case (PLASTICITY_DISLOTWIN_ID) plasticityType - constitutive_postResults(startPos:endPos) = & - plastic_dislotwin_postResults(Mp,temperature(ho)%p(tme),instance,of) - - case (PLASTICITY_DISLOUCLA_ID) plasticityType - constitutive_postResults(startPos:endPos) = & - plastic_disloucla_postResults(Mp,temperature(ho)%p(tme),instance,of) - case (PLASTICITY_NONLOCAL_ID) plasticityType constitutive_postResults(startPos:endPos) = & plastic_nonlocal_postResults (material_phaseAt(ipc,el),instance,of) diff --git a/src/plastic_disloUCLA.f90 b/src/plastic_disloUCLA.f90 index 83c96e1ff..48dc12f15 100644 --- a/src/plastic_disloUCLA.f90 +++ b/src/plastic_disloUCLA.f90 @@ -18,11 +18,6 @@ module plastic_disloUCLA implicit none private - - integer, dimension(:,:), allocatable, target, public :: & - plastic_disloUCLA_sizePostResult !< size of each post result output - character(len=64), dimension(:,:), allocatable, target, public :: & - plastic_disloUCLA_output !< name of each post result output real(pReal), parameter, private :: & kB = 1.38e-23_pReal !< Boltzmann constant in J/Kelvin @@ -106,7 +101,6 @@ module plastic_disloUCLA plastic_disloUCLA_dependentState, & plastic_disloUCLA_LpAndItsTangent, & plastic_disloUCLA_dotState, & - plastic_disloUCLA_postResults, & plastic_disloUCLA_results private :: & kinetics @@ -148,10 +142,6 @@ subroutine plastic_disloUCLA_init() if (iand(debug_level(debug_constitutive),debug_levelBasic) /= 0) & write(6,'(a16,1x,i5,/)') '# instances:',Ninstance - allocate(plastic_disloUCLA_sizePostResult(maxval(phase_Noutput),Ninstance),source=0) - allocate(plastic_disloUCLA_output(maxval(phase_Noutput),Ninstance)) - plastic_disloUCLA_output = '' - allocate(param(Ninstance)) allocate(state(Ninstance)) allocate(dotState(Ninstance)) @@ -289,8 +279,6 @@ subroutine plastic_disloUCLA_init() end select if (outputID /= undefined_ID) then - plastic_disloUCLA_output(i,phase_plasticityInstance(p)) = outputs(i) - plastic_disloUCLA_sizePostResult(i,phase_plasticityInstance(p)) = prm%sum_N_sl prm%outputID = [prm%outputID, outputID] endif @@ -304,7 +292,6 @@ subroutine plastic_disloUCLA_init() call material_allocatePlasticState(p,NipcMyPhase,sizeState,sizeDotState,0, & prm%sum_N_sl,0,0) - plasticState(p)%sizePostResults = sum(plastic_disloUCLA_sizePostResult(:,phase_plasticityInstance(p))) !-------------------------------------------------------------------------------------------------- ! locally defined state aliases and initialization of state0 and aTolState @@ -472,59 +459,6 @@ subroutine plastic_disloUCLA_dependentState(instance,of) end subroutine plastic_disloUCLA_dependentState -!-------------------------------------------------------------------------------------------------- -!> @brief return array of constitutive results -!-------------------------------------------------------------------------------------------------- -function plastic_disloUCLA_postResults(Mp,T,instance,of) result(postResults) - - real(pReal), dimension(3,3), intent(in) :: & - Mp !< Mandel stress - real(pReal), intent(in) :: & - T !< temperature - integer, intent(in) :: & - instance, & - of - - real(pReal), dimension(sum(plastic_disloUCLA_sizePostResult(:,instance))) :: & - postResults - - integer :: & - o,c - real(pReal), dimension(param(instance)%sum_N_sl) :: & - gdot_pos,gdot_neg - - c = 0 - - associate(prm => param(instance), stt => state(instance), dst => dependentState(instance)) - - outputsLoop: do o = 1,size(prm%outputID) - select case(prm%outputID(o)) - - case (rho_mob_ID) - postResults(c+1:c+prm%sum_N_sl) = stt%rho_mob(1:prm%sum_N_sl,of) - case (rho_dip_ID) - postResults(c+1:c+prm%sum_N_sl) = stt%rho_dip(1:prm%sum_N_sl,of) - case (dot_gamma_sl_ID) - call kinetics(Mp,T,instance,of,gdot_pos,gdot_neg) - postResults(c+1:c+prm%sum_N_sl) = gdot_pos + gdot_neg - case (gamma_sl_ID) - postResults(c+1:c+prm%sum_N_sl) = stt%gamma_sl(1:prm%sum_N_sl, of) - case (Lambda_sl_ID) - postResults(c+1:c+prm%sum_N_sl) = dst%Lambda_sl(1:prm%sum_N_sl, of) - case (thresholdstress_ID) - postResults(c+1:c+prm%sum_N_sl) = dst%threshold_stress(1:prm%sum_N_sl,of) - - end select - - c = c + prm%sum_N_sl - - enddo outputsLoop - - end associate - -end function plastic_disloUCLA_postResults - - !-------------------------------------------------------------------------------------------------- !> @brief writes results to HDF5 output file !-------------------------------------------------------------------------------------------------- diff --git a/src/plastic_dislotwin.f90 b/src/plastic_dislotwin.f90 index 4e085478f..6bbf87060 100644 --- a/src/plastic_dislotwin.f90 +++ b/src/plastic_dislotwin.f90 @@ -20,11 +20,6 @@ module plastic_dislotwin implicit none private - - integer, dimension(:,:), allocatable, target, public :: & - plastic_dislotwin_sizePostResult !< size of each post result output - character(len=64), dimension(:,:), allocatable, target, public :: & - plastic_dislotwin_output !< name of each post result output real(pReal), parameter :: & kB = 1.38e-23_pReal !< Boltzmann constant in J/Kelvin @@ -167,7 +162,6 @@ module plastic_dislotwin plastic_dislotwin_dependentState, & plastic_dislotwin_LpAndItsTangent, & plastic_dislotwin_dotState, & - plastic_dislotwin_postResults, & plastic_dislotwin_results contains @@ -213,10 +207,6 @@ subroutine plastic_dislotwin_init if (iand(debug_level(debug_constitutive),debug_levelBasic) /= 0) & write(6,'(a16,1x,i5,/)') '# instances:',Ninstance - - allocate(plastic_dislotwin_sizePostResult(maxval(phase_Noutput),Ninstance),source=0) - allocate(plastic_dislotwin_output(maxval(phase_Noutput),Ninstance)) - plastic_dislotwin_output = '' allocate(param(Ninstance)) allocate(state(Ninstance)) @@ -507,8 +497,6 @@ subroutine plastic_dislotwin_init end select if (outputID /= undefined_ID) then - plastic_dislotwin_output(i,phase_plasticityInstance(p)) = outputs(i) - plastic_dislotwin_sizePostResult(i,phase_plasticityInstance(p)) = outputSize prm%outputID = [prm%outputID, outputID] endif @@ -524,8 +512,6 @@ subroutine plastic_dislotwin_init call material_allocatePlasticState(p,NipcMyPhase,sizeState,sizeDotState,0, & prm%sum_N_sl,prm%sum_N_tw,prm%sum_N_tr) - plasticState(p)%sizePostResults = sum(plastic_dislotwin_sizePostResult(:,phase_plasticityInstance(p))) - !-------------------------------------------------------------------------------------------------- ! locally defined state aliases and initialization of state0 and aTolState @@ -936,82 +922,6 @@ subroutine plastic_dislotwin_dependentState(T,instance,of) end subroutine plastic_dislotwin_dependentState -!-------------------------------------------------------------------------------------------------- -!> @brief return array of constitutive results -!-------------------------------------------------------------------------------------------------- -function plastic_dislotwin_postResults(Mp,T,instance,of) result(postResults) - - real(pReal), dimension(3,3),intent(in) :: & - Mp !< 2nd Piola Kirchhoff stress tensor in Mandel notation - real(pReal), intent(in) :: & - T !< temperature at integration point - integer, intent(in) :: & - instance, & - of - - real(pReal), dimension(sum(plastic_dislotwin_sizePostResult(:,instance))) :: & - postResults - - integer :: & - o,c,j - - associate(prm => param(instance), stt => state(instance), dst => dependentState(instance)) - - c = 0 - - do o = 1,size(prm%outputID) - select case(prm%outputID(o)) - - case (rho_mob_ID) - postResults(c+1:c+prm%sum_N_sl) = stt%rho_mob(1:prm%sum_N_sl,of) - c = c + prm%sum_N_sl - case (rho_dip_ID) - postResults(c+1:c+prm%sum_N_sl) = stt%rho_dip(1:prm%sum_N_sl,of) - c = c + prm%sum_N_sl - case (dot_gamma_sl_ID) - call kinetics_slip(Mp,T,instance,of,postResults(c+1:c+prm%sum_N_sl)) - c = c + prm%sum_N_sl - case (gamma_sl_ID) - postResults(c+1:c+prm%sum_N_sl) = stt%gamma_sl(1:prm%sum_N_sl,of) - c = c + prm%sum_N_sl - case (Lambda_sl_ID) - postResults(c+1:c+prm%sum_N_sl) = dst%Lambda_sl(1:prm%sum_N_sl,of) - c = c + prm%sum_N_sl - case (resolved_stress_slip_ID) - do j = 1, prm%sum_N_sl - postResults(c+j) = math_mul33xx33(Mp,prm%P_sl(1:3,1:3,j)) - enddo - c = c + prm%sum_N_sl - case (threshold_stress_slip_ID) - postResults(c+1:c+prm%sum_N_sl) = dst%tau_pass(1:prm%sum_N_sl,of) - c = c + prm%sum_N_sl - - case (f_tw_ID) - postResults(c+1:c+prm%sum_N_tw) = stt%f_tw(1:prm%sum_N_tw,of) - c = c + prm%sum_N_tw - case (Lambda_tw_ID) - postResults(c+1:c+prm%sum_N_tw) = dst%Lambda_tw(1:prm%sum_N_tw,of) - c = c + prm%sum_N_tw - case (resolved_stress_twin_ID) - do j = 1, prm%sum_N_tw - postResults(c+j) = math_mul33xx33(Mp,prm%P_tw(1:3,1:3,j)) - enddo - c = c + prm%sum_N_tw - case (tau_hat_tw_ID) - postResults(c+1:c+prm%sum_N_tw) = dst%tau_hat_tw(1:prm%sum_N_tw,of) - c = c + prm%sum_N_tw - - case (f_tr_ID) - postResults(c+1:c+prm%sum_N_tr) = stt%f_tr(1:prm%sum_N_tr,of) - c = c + prm%sum_N_tr - end select - enddo - - end associate - -end function plastic_dislotwin_postResults - - !-------------------------------------------------------------------------------------------------- !> @brief writes results to HDF5 output file !-------------------------------------------------------------------------------------------------- diff --git a/src/plastic_kinematichardening.f90 b/src/plastic_kinematichardening.f90 index f2183327c..2a3dc4640 100644 --- a/src/plastic_kinematichardening.f90 +++ b/src/plastic_kinematichardening.f90 @@ -19,11 +19,6 @@ module plastic_kinehardening implicit none private - integer, dimension(:,:), allocatable, target, public :: & - plastic_kinehardening_sizePostResult !< size of each post result output - character(len=64), dimension(:,:), allocatable, target, public :: & - plastic_kinehardening_output !< name of each post result output - enum, bind(c) enumerator :: & undefined_ID, & @@ -90,7 +85,6 @@ module plastic_kinehardening plastic_kinehardening_LpAndItsTangent, & plastic_kinehardening_dotState, & plastic_kinehardening_deltaState, & - plastic_kinehardening_postResults, & plastic_kinehardening_results contains @@ -127,10 +121,6 @@ subroutine plastic_kinehardening_init if (iand(debug_level(debug_constitutive),debug_levelBasic) /= 0) & write(6,'(a16,1x,i5,/)') '# instances:',Ninstance - allocate(plastic_kinehardening_sizePostResult(maxval(phase_Noutput),Ninstance),source=0) - allocate(plastic_kinehardening_output(maxval(phase_Noutput),Ninstance)) - plastic_kinehardening_output = '' - allocate(param(Ninstance)) allocate(state(Ninstance)) allocate(dotState(Ninstance)) @@ -247,8 +237,6 @@ subroutine plastic_kinehardening_init end select if (outputID /= undefined_ID) then - plastic_kinehardening_output(i,phase_plasticityInstance(p)) = outputs(i) - plastic_kinehardening_sizePostResult(i,phase_plasticityInstance(p)) = prm%totalNslip prm%outputID = [prm%outputID , outputID] endif @@ -263,7 +251,6 @@ subroutine plastic_kinehardening_init call material_allocatePlasticState(p,NipcMyPhase,sizeState,sizeDotState,sizeDeltaState, & prm%totalNslip,0,0) - plasticState(p)%sizePostResults = sum(plastic_kinehardening_sizePostResult(:,phase_plasticityInstance(p))) !-------------------------------------------------------------------------------------------------- ! locally defined state aliases and initialization of state0 and aTolState @@ -446,63 +433,6 @@ subroutine plastic_kinehardening_deltaState(Mp,instance,of) end subroutine plastic_kinehardening_deltaState -!-------------------------------------------------------------------------------------------------- -!> @brief return array of constitutive results -!-------------------------------------------------------------------------------------------------- -function plastic_kinehardening_postResults(Mp,instance,of) result(postResults) - - real(pReal), dimension(3,3), intent(in) :: & - Mp !< Mandel stress - integer, intent(in) :: & - instance, & - of - - real(pReal), dimension(sum(plastic_kinehardening_sizePostResult(:,instance))) :: & - postResults - - integer :: & - o,c,i - real(pReal), dimension(param(instance)%totalNslip) :: & - gdot_pos,gdot_neg - - c = 0 - - associate(prm => param(instance), stt => state(instance)) - - outputsLoop: do o = 1,size(prm%outputID) - select case(prm%outputID(o)) - - case (crss_ID) - postResults(c+1:c+prm%totalNslip) = stt%crss(:,of) - case(crss_back_ID) - postResults(c+1:c+prm%totalNslip) = stt%crss_back(:,of) - case (sense_ID) - postResults(c+1:c+prm%totalNslip) = stt%sense(:,of) - case (chi0_ID) - postResults(c+1:c+prm%totalNslip) = stt%chi0(:,of) - case (gamma0_ID) - postResults(c+1:c+prm%totalNslip) = stt%gamma0(:,of) - case (accshear_ID) - postResults(c+1:c+prm%totalNslip) = stt%accshear(:,of) - case (shearrate_ID) - call kinetics(Mp,instance,of,gdot_pos,gdot_neg) - postResults(c+1:c+prm%totalNslip) = gdot_pos+gdot_neg - case (resolvedstress_ID) - do i = 1, prm%totalNslip - postResults(c+i) = math_mul33xx33(Mp,prm%Schmid(1:3,1:3,i)) - enddo - - end select - - c = c + prm%totalNslip - - enddo outputsLoop - - end associate - -end function plastic_kinehardening_postResults - - !-------------------------------------------------------------------------------------------------- !> @brief writes results to HDF5 output file !-------------------------------------------------------------------------------------------------- From da79949c2a4c620508bc808ca2fc8952d5b9d40b Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 19 Oct 2019 22:23:02 +0200 Subject: [PATCH 045/233] old python2 script, not needed for DADF5 --- processing/post/mentat_colorMap.py | 150 ----------------------------- 1 file changed, 150 deletions(-) delete mode 100755 processing/post/mentat_colorMap.py diff --git a/processing/post/mentat_colorMap.py b/processing/post/mentat_colorMap.py deleted file mode 100755 index 7f5c67123..000000000 --- a/processing/post/mentat_colorMap.py +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env python2.7 -# -*- coding: UTF-8 no BOM -*- - -import os -import sys -from optparse import OptionParser - -import damask - - -scriptName = os.path.splitext(os.path.basename(__file__))[0] -scriptID = ' '.join([scriptName,damask.version]) - -# ----------------------------- -def outMentat(cmd,locals): - if cmd[0:3] == '(!)': - exec(cmd[3:]) - elif cmd[0:3] == '(?)': - cmd = eval(cmd[3:]) - py_mentat.py_send(cmd) - else: - py_mentat.py_send(cmd) - return - - - -# ----------------------------- -def outStdout(cmd,locals): - if cmd[0:3] == '(!)': - exec(cmd[3:]) - elif cmd[0:3] == '(?)': - cmd = eval(cmd[3:]) - print(cmd) - else: - print(cmd) - return - - - -# ----------------------------- -def output(cmds,locals,dest): - for cmd in cmds: - if isinstance(cmd,list): - output(cmd,locals,dest) - else: - {\ - 'Mentat': outMentat,\ - 'Stdout': outStdout,\ - }[dest](cmd,locals) - return - - - -# ----------------------------- -def colorMap(colors,baseIdx=32): - cmds = [ "*color %i %f %f %f"%(idx+baseIdx,color[0],color[1],color[2]) - for idx,color in enumerate(colors) ] - return cmds - - -# ----------------------------- -# MAIN FUNCTION STARTS HERE -# ----------------------------- - -parser = OptionParser(option_class=damask.extendableOption, -usage="%prog [options] predefinedScheme | (lower_h,s,l upper_h,s,l)", description = """ -Changes the color map in MSC.Mentat. - -Interpolates colors between "lower_hsl" and "upper_hsl". - -""", version = scriptID) - -parser.add_option("-i","--inverse", action = "store_true", - dest = "inverse", - help = "invert legend") -parser.add_option( "--palette", action = "store_true", - dest = "palette", - help = "output plain rgb palette integer values (0-255)") -parser.add_option( "--palettef", action = "store_true", - dest = "palettef", - help = "output plain rgb palette float values (0.0-1.0)") -parser.add_option("-p", "--port", type = "int", - dest = "port", - metavar ='int', - help = "Mentat connection port [%default]") -parser.add_option("-b", "--baseindex", type = "int", - metavar ='int', - dest = "baseIdx", - help = "base index of colormap [%default]") -parser.add_option("-n", "--colorcount", type = "int", - metavar ='int', - dest = "colorcount", - help = "number of colors [%default]") -parser.add_option("-v", "--verbose", action="store_true", - dest = "verbose", - help = "write Mentat command stream also to STDOUT") - -parser.set_defaults(port = 40007) -parser.set_defaults(baseIdx = 32) -parser.set_defaults(colorcount = 32) -parser.set_defaults(inverse = False) -parser.set_defaults(palette = False) -parser.set_defaults(palettef = False) -parser.set_defaults(verbose = False) - -msg = [] - -(options, colors) = parser.parse_args() - -if len(colors) == 0: - parser.error('missing color information') - -elif len(colors) == 1: - theMap = damask.Colormap(predefined = colors[0]) - -elif len(colors) == 2: - theMap = damask.Colormap(damask.Color('HSL',map(float, colors[0].split(','))), - damask.Color('HSL',map(float, colors[1].split(','))) ) - -else: - theMap = damask.Colormap() - -if options.inverse: - theMap = theMap.invert() - -if options.palettef: - print(theMap.export(format='raw',steps=options.colorcount)) -elif options.palette: - for theColor in theMap.export(format='list',steps=options.colorcount): - print('\t'.join(map(lambda x: str(int(255*x)),theColor))) -else: # connect to Mentat and change colorMap - sys.path.append(damask.solver.Marc().libraryPath()) - try: - import py_mentat - print('waiting to connect...') - py_mentat.py_connect('',options.port) - print('connected...') - mentat = True - except: - sys.stderr.write('warning: no valid Mentat release found\n') - mentat = False - - outputLocals = {} - cmds = colorMap(theMap.export(format='list',steps=options.colorcount),options.baseIdx) - if mentat: - output(['*show_table']+cmds+['*show_model *redraw'],outputLocals,'Mentat') - py_mentat.py_disconnect() - - if options.verbose: - output(cmds,outputLocals,'Stdout') From fe94718bcd2d27f509f69a5d3bf7f7075cc8a8e0 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 10:32:14 +0200 Subject: [PATCH 046/233] avoid accessing null-pointer --- src/constitutive.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/constitutive.f90 b/src/constitutive.f90 index c7736fd19..cc9bb2e99 100644 --- a/src/constitutive.f90 +++ b/src/constitutive.f90 @@ -148,7 +148,7 @@ subroutine constitutive_init write(FILEUNIT,'(/,a,/)') '['//trim(config_name_phase(ph))//']' if (knownPlasticity) then write(FILEUNIT,'(a)') '(plasticity)'//char(9)//trim(outputName) - if (phase_plasticity(ph) /= PLASTICITY_NONE_ID) then + if (associated(thisOutput)) then OutputPlasticityLoop: do o = 1,size(thisOutput(:,ins)) if(len_trim(thisOutput(o,ins)) > 0) & write(FILEUNIT,'(a,i4)') trim(thisOutput(o,ins))//char(9),thisSize(o,ins) From 8f315836b087969005541b307195d54e5c59e68b Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 10:42:45 +0200 Subject: [PATCH 047/233] easier to use if end time is included: --- python/damask/dadf5.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 0d62c9f8e..426b83ebb 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -103,7 +103,7 @@ class DADF5(): def __time_to_inc(self,start,end): selected = [] for i,time in enumerate(self.times): - if start <= time < end: + if start <= time <= end: selected.append(self.increments[i]) return selected @@ -117,7 +117,7 @@ class DADF5(): start : float start time (included) end : float - end time (exclcuded) + end time (included) """ self.__manage_visible(self.__time_to_inc(start,end),'increments','set') @@ -132,7 +132,7 @@ class DADF5(): start : float start time (included) end : float - end time (exclcuded) + end time (included) """ self.__manage_visible(self.__time_to_inc(start,end),'increments','add') @@ -147,7 +147,7 @@ class DADF5(): start : float start time (included) end : float - end time (exclcuded) + end time (included) """ self.__manage_visible(self.__time_to_inc(start,end),'increments','del') From f00f6952c057040f871f113135b51e18273a4276 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 11:00:10 +0200 Subject: [PATCH 048/233] selecting by increment is a common task https://www.python.org/dev/peps/pep-0257/ The docstring is a phrase ending in a period. It prescribes the function or method's effect as a command ("Do this", "Return that"), not as a description; e.g. don't write "Returns the pathname ...". --- python/damask/dadf5.py | 65 +++++++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 426b83ebb..a71855168 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -91,7 +91,7 @@ class DADF5(): valid = [e for e_ in [glob.fnmatch.filter(getattr(self,what),s) for s in choice] for e in e_] existing = set(self.visible[what]) - + if action == 'set': self.visible[what] = valid elif action == 'add': @@ -110,7 +110,7 @@ class DADF5(): def set_by_time(self,start,end): """ - Sets active time increments based on start and end time. + Set active increments based on start and end time. Parameters ---------- @@ -125,7 +125,7 @@ class DADF5(): def add_by_time(self,start,end): """ - Adds to active time increments based on start and end time. + Add to active increments based on start and end time. Parameters ---------- @@ -140,7 +140,7 @@ class DADF5(): def del_by_time(self,start,end): """ - Delets from active time increments based on start and end time. + Delete from active increments based on start and end time. Parameters ---------- @@ -151,11 +151,56 @@ class DADF5(): """ self.__manage_visible(self.__time_to_inc(start,end),'increments','del') + + + def set_by_increment(self,start,end): + """ + Set active time increments based on start and end increment. + + Parameters + ---------- + start : int + start increment (included) + end : int + end increment (included) + + """ + self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','set') + + + def add_by_increment(self,start,end): + """ + Add to active time increments based on start and end increment. + + Parameters + ---------- + start : int + start increment (included) + end : int + end increment (included) + + """ + self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','add') + + + def del_by_increment(self,start,end): + """ + Delet from active time increments based on start and end increment. + + Parameters + ---------- + start : int + start increment (included) + end : int + end increment (included) + + """ + self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','del') def iter_visible(self,what): """ - Iterates over visible items by setting each one visible. + Iterate over visible items by setting each one visible. Parameters ---------- @@ -177,7 +222,7 @@ class DADF5(): def set_visible(self,what,datasets): """ - Sets active groups. + Set active groups. Parameters ---------- @@ -193,7 +238,7 @@ class DADF5(): def add_visible(self,what,datasets): """ - Adds to active groups. + Add to active groups. Parameters ---------- @@ -209,7 +254,7 @@ class DADF5(): def del_visible(self,what,datasets): """ - Removes from active groupse. + Delete from active groupse. Parameters ---------- @@ -268,7 +313,7 @@ class DADF5(): def list_data(self): - """Gives information on all active datasets in the file.""" + """Return information on all active datasets in the file.""" message = '' with h5py.File(self.filename,'r') as f: for i in self.iter_visible('increments'): @@ -288,7 +333,7 @@ class DADF5(): def get_dataset_location(self,label): - """Returns the location of all active datasets with given label.""" + """Return the location of all active datasets with given label.""" path = [] with h5py.File(self.filename,'r') as f: for i in self.iter_visible('increments'): From b593dfbfd9e33c34165cbc2bce0e68088c8b38c1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 11:34:05 +0200 Subject: [PATCH 049/233] better layout --- python/damask/dadf5.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index a71855168..d5a99b988 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -326,7 +326,8 @@ class DADF5(): group = '/'.join([i,o[:-1],oo,pp]) # o[:-1]: plural/singular issue for d in f[group].keys(): try: - message+=' {} ({})\n'.format(d,f['/'.join([group,d])].attrs['Description'].decode()) + dataset = f['/'.join([group,d])] + message+=' {} / ({}): {}\n'.format(d,dataset.attrs['Unit'].decode(),dataset.attrs['Description'].decode()) except KeyError: pass return message From 11993a3ad14a024b1bc2c529a510a689c62e1135 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 12:01:20 +0200 Subject: [PATCH 050/233] phasing out crystallite output some outputs are still needed for a few remaining tests. --- src/crystallite.f90 | 39 ++------------------------------------- 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/src/crystallite.f90 b/src/crystallite.f90 index f93cb4355..cbd9fe305 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -331,14 +331,10 @@ subroutine crystallite_init do r = 1,size(config_crystallite) do o = 1,crystallite_Noutput(r) select case(crystallite_outputID(o,r)) - case(phase_ID,texture_ID) - mySize = 1 - case(orientation_ID,grainrotation_ID) + case(orientation_ID) mySize = 4 - case(defgrad_ID,fe_ID,fp_ID,fi_ID,lp_ID,li_ID,p_ID,s_ID) + case(defgrad_ID,fp_ID,p_ID) mySize = 9 - case(elasmatrix_ID) - mySize = 36 case(neighboringip_ID,neighboringelement_ID) mySize = nIPneighbors case default @@ -894,22 +890,10 @@ function crystallite_postResults(ipc, ip, el) do o = 1,crystallite_Noutput(crystID) mySize = 0 select case(crystallite_outputID(o,crystID)) - case (phase_ID) - mySize = 1 - crystallite_postResults(c+1) = real(material_phaseAt(ipc,el),pReal) ! phaseID of grain - case (texture_ID) - mySize = 1 - crystallite_postResults(c+1) = real(material_texture(ipc,ip,el),pReal) ! textureID of grain case (orientation_ID) mySize = 4 crystallite_postResults(c+1:c+mySize) = crystallite_orientation(ipc,ip,el)%asQuaternion() - case (grainrotation_ID) - rot = material_orientation0(ipc,ip,el)%misorientation(crystallite_orientation(ipc,ip,el)) - mySize = 4 - crystallite_postResults(c+1:c+mySize) = rot%asAxisAngle() - crystallite_postResults(c+4) = inDeg * crystallite_postResults(c+4) ! angle in degree - ! remark: tensor output is of the form 11,12,13, 21,22,23, 31,32,33 ! thus row index i is slow, while column index j is fast. reminder: "row is slow" @@ -917,37 +901,18 @@ function crystallite_postResults(ipc, ip, el) mySize = 9 crystallite_postResults(c+1:c+mySize) = & reshape(transpose(crystallite_partionedF(1:3,1:3,ipc,ip,el)),[mySize]) - case (fe_ID) - mySize = 9 - crystallite_postResults(c+1:c+mySize) = & - reshape(transpose(crystallite_Fe(1:3,1:3,ipc,ip,el)),[mySize]) case (fp_ID) mySize = 9 crystallite_postResults(c+1:c+mySize) = & reshape(transpose(crystallite_Fp(1:3,1:3,ipc,ip,el)),[mySize]) - case (fi_ID) - mySize = 9 - crystallite_postResults(c+1:c+mySize) = & - reshape(transpose(crystallite_Fi(1:3,1:3,ipc,ip,el)),[mySize]) case (lp_ID) mySize = 9 crystallite_postResults(c+1:c+mySize) = & reshape(transpose(crystallite_Lp(1:3,1:3,ipc,ip,el)),[mySize]) - case (li_ID) - mySize = 9 - crystallite_postResults(c+1:c+mySize) = & - reshape(transpose(crystallite_Li(1:3,1:3,ipc,ip,el)),[mySize]) case (p_ID) mySize = 9 crystallite_postResults(c+1:c+mySize) = & reshape(transpose(crystallite_P(1:3,1:3,ipc,ip,el)),[mySize]) - case (s_ID) - mySize = 9 - crystallite_postResults(c+1:c+mySize) = & - reshape(crystallite_S(1:3,1:3,ipc,ip,el),[mySize]) - case (elasmatrix_ID) - mySize = 36 - crystallite_postResults(c+1:c+mySize) = reshape(constitutive_homogenizedC(ipc,ip,el),[mySize]) case(neighboringelement_ID) mySize = nIPneighbors crystallite_postResults(c+1:c+mySize) = 0.0_pReal From 5910ab1719fc3ee5169303fca1672cd8f7279e09 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 12:45:14 +0200 Subject: [PATCH 051/233] don't rely on spectralOut --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index ebe26d80a..24efc0ecd 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit ebe26d80a86c99a7f50aef72675c623e4510a562 +Subproject commit 24efc0ecd4eacad452ef039a65de583a7cc20152 From 4cae607733cafa208b43ffb0c11f74fe29c4e0e7 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 12:47:09 +0200 Subject: [PATCH 052/233] intermediate step for postResults removal --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 24efc0ecd..9086affb8 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 24efc0ecd4eacad452ef039a65de583a7cc20152 +Subproject commit 9086affb82ef5b6f9b5a097c28177db0b515218e From 51ed4d68e6241a287bbde362d5ce97d815c705d2 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 13:13:48 +0200 Subject: [PATCH 053/233] more info --- python/damask/dadf5.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index d5a99b988..733f06a1c 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -316,8 +316,8 @@ class DADF5(): """Return information on all active datasets in the file.""" message = '' with h5py.File(self.filename,'r') as f: - for i in self.iter_visible('increments'): - message+='\n{}\n'.format(i) + for s,i in enumerate(self.iter_visible('increments')): + message+='\n{} ({}s)\n'.format(i,self.times[s]) for o,p in zip(['constituents','materialpoints'],['con_physics','mat_physics']): for oo in self.iter_visible(o): message+=' {}\n'.format(oo) From f93336b07262730d8d369c477908848a1426d983 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 13:21:51 +0200 Subject: [PATCH 054/233] postResults for isotropic not needed anymore --- PRIVATE | 2 +- src/constitutive.f90 | 7 ++--- src/crystallite.f90 | 1 - src/plastic_isotropic.f90 | 63 +-------------------------------------- 4 files changed, 4 insertions(+), 69 deletions(-) diff --git a/PRIVATE b/PRIVATE index 9086affb8..a0caa709e 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 9086affb82ef5b6f9b5a097c28177db0b515218e +Subproject commit a0caa709eb9289374c36e50dc27746ac0031dedb diff --git a/src/constitutive.f90 b/src/constitutive.f90 index cc9bb2e99..464a85858 100644 --- a/src/constitutive.f90 +++ b/src/constitutive.f90 @@ -120,8 +120,8 @@ subroutine constitutive_init thisSize => null() case (PLASTICITY_ISOTROPIC_ID) plasticityType outputName = PLASTICITY_ISOTROPIC_label - thisOutput => plastic_isotropic_output - thisSize => plastic_isotropic_sizePostResult + thisOutput => null() + thisSize => null() case (PLASTICITY_PHENOPOWERLAW_ID) plasticityType outputName = PLASTICITY_PHENOPOWERLAW_label thisOutput => plastic_phenopowerlaw_output @@ -736,9 +736,6 @@ function constitutive_postResults(S, Fi, ipc, ip, el) instance = phase_plasticityInstance(material_phaseAt(ipc,el)) plasticityType: select case (phase_plasticity(material_phaseAt(ipc,el))) - case (PLASTICITY_ISOTROPIC_ID) plasticityType - constitutive_postResults(startPos:endPos) = & - plastic_isotropic_postResults(Mp,instance,of) case (PLASTICITY_PHENOPOWERLAW_ID) plasticityType constitutive_postResults(startPos:endPos) = & diff --git a/src/crystallite.f90 b/src/crystallite.f90 index cbd9fe305..8cc30db28 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -879,7 +879,6 @@ function crystallite_postResults(ipc, ip, el) crystID, & mySize, & n - type(rotation) :: rot crystID = microstructure_crystallite(discretization_microstructureAt(el)) diff --git a/src/plastic_isotropic.f90 b/src/plastic_isotropic.f90 index 18b6f8e86..9beb2262b 100644 --- a/src/plastic_isotropic.f90 +++ b/src/plastic_isotropic.f90 @@ -20,11 +20,6 @@ module plastic_isotropic implicit none private - integer, dimension(:,:), allocatable, target, public :: & - plastic_isotropic_sizePostResult !< size of each post result output - character(len=64), dimension(:,:), allocatable, target, public :: & - plastic_isotropic_output !< name of each post result output - enum, bind(c) enumerator :: & undefined_ID, & @@ -74,7 +69,6 @@ module plastic_isotropic plastic_isotropic_LpAndItsTangent, & plastic_isotropic_LiAndItsTangent, & plastic_isotropic_dotState, & - plastic_isotropic_postResults, & plastic_isotropic_results contains @@ -110,10 +104,6 @@ subroutine plastic_isotropic_init if (iand(debug_level(debug_constitutive),debug_levelBasic) /= 0) & write(6,'(a16,1x,i5,/)') '# instances:',Ninstance - allocate(plastic_isotropic_sizePostResult(maxval(phase_Noutput),Ninstance),source=0) - allocate(plastic_isotropic_output(maxval(phase_Noutput),Ninstance)) - plastic_isotropic_output = '' - allocate(param(Ninstance)) allocate(state(Ninstance)) allocate(dotState(Ninstance)) @@ -151,7 +141,7 @@ subroutine plastic_isotropic_init ! sanity checks extmsg = '' if (prm%aTol_gamma <= 0.0_pReal) extmsg = trim(extmsg)//' aTol_gamma' - if (prm%xi_0 < 0.0_pReal) extmsg = trim(extmsg)//' xi_0' + if (prm%xi_0 < 0.0_pReal) extmsg = trim(extmsg)//' xi_0' if (prm%dot_gamma_0 <= 0.0_pReal) extmsg = trim(extmsg)//' dot_gamma_0' if (prm%n <= 0.0_pReal) extmsg = trim(extmsg)//' n' if (prm%a <= 0.0_pReal) extmsg = trim(extmsg)//' a' @@ -180,8 +170,6 @@ subroutine plastic_isotropic_init end select if (outputID /= undefined_ID) then - plastic_isotropic_output(i,phase_plasticityInstance(p)) = outputs(i) - plastic_isotropic_sizePostResult(i,phase_plasticityInstance(p)) = 1 prm%outputID = [prm%outputID, outputID] endif @@ -195,7 +183,6 @@ subroutine plastic_isotropic_init call material_allocatePlasticState(p,NipcMyPhase,sizeState,sizeDotState,0, & 1,0,0) - plasticState(p)%sizePostResults = sum(plastic_isotropic_sizePostResult(:,phase_plasticityInstance(p))) !-------------------------------------------------------------------------------------------------- ! locally defined state aliases and initialization of state0 and aTolState @@ -382,54 +369,6 @@ subroutine plastic_isotropic_dotState(Mp,instance,of) end subroutine plastic_isotropic_dotState -!-------------------------------------------------------------------------------------------------- -!> @brief return array of constitutive results -!-------------------------------------------------------------------------------------------------- -function plastic_isotropic_postResults(Mp,instance,of) result(postResults) - - real(pReal), dimension(3,3), intent(in) :: & - Mp !< Mandel stress - integer, intent(in) :: & - instance, & - of - - real(pReal), dimension(sum(plastic_isotropic_sizePostResult(:,instance))) :: & - postResults - - real(pReal) :: & - norm_Mp !< norm of the Mandel stress - integer :: & - o,c - - associate(prm => param(instance), stt => state(instance)) - - if (prm%dilatation) then - norm_Mp = sqrt(math_mul33xx33(Mp,Mp)) - else - norm_Mp = sqrt(math_mul33xx33(math_deviatoric33(Mp),math_deviatoric33(Mp))) - endif - - c = 0 - - outputsLoop: do o = 1,size(prm%outputID) - select case(prm%outputID(o)) - - case (xi_ID) - postResults(c+1) = stt%xi(of) - c = c + 1 - case (dot_gamma_ID) - postResults(c+1) = prm%dot_gamma_0 & - * (sqrt(1.5_pReal) * norm_Mp /(prm%M * stt%xi(of)))**prm%n - c = c + 1 - - end select - enddo outputsLoop - - end associate - -end function plastic_isotropic_postResults - - !-------------------------------------------------------------------------------------------------- !> @brief writes results to HDF5 output file !-------------------------------------------------------------------------------------------------- From b96bd71b09955994d04545f91a182756e573dec0 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 12:06:10 +0200 Subject: [PATCH 055/233] postResults not needed anymore --- src/constitutive.f90 | 8 +--- src/plastic_phenopowerlaw.f90 | 78 ----------------------------------- 2 files changed, 2 insertions(+), 84 deletions(-) diff --git a/src/constitutive.f90 b/src/constitutive.f90 index 464a85858..a571355a1 100644 --- a/src/constitutive.f90 +++ b/src/constitutive.f90 @@ -124,8 +124,8 @@ subroutine constitutive_init thisSize => null() case (PLASTICITY_PHENOPOWERLAW_ID) plasticityType outputName = PLASTICITY_PHENOPOWERLAW_label - thisOutput => plastic_phenopowerlaw_output - thisSize => plastic_phenopowerlaw_sizePostResult + thisOutput => null() + thisSize => null() case (PLASTICITY_KINEHARDENING_ID) plasticityType outputName = PLASTICITY_KINEHARDENING_label thisOutput => null() @@ -737,10 +737,6 @@ function constitutive_postResults(S, Fi, ipc, ip, el) plasticityType: select case (phase_plasticity(material_phaseAt(ipc,el))) - case (PLASTICITY_PHENOPOWERLAW_ID) plasticityType - constitutive_postResults(startPos:endPos) = & - plastic_phenopowerlaw_postResults(Mp,instance,of) - case (PLASTICITY_NONLOCAL_ID) plasticityType constitutive_postResults(startPos:endPos) = & plastic_nonlocal_postResults (material_phaseAt(ipc,el),instance,of) diff --git a/src/plastic_phenopowerlaw.f90 b/src/plastic_phenopowerlaw.f90 index 48b49c3af..b8f5c8306 100644 --- a/src/plastic_phenopowerlaw.f90 +++ b/src/plastic_phenopowerlaw.f90 @@ -17,11 +17,6 @@ module plastic_phenopowerlaw implicit none private - - integer, dimension(:,:), allocatable, target, public :: & - plastic_phenopowerlaw_sizePostResult !< size of each post result output - character(len=64), dimension(:,:), allocatable, target, public :: & - plastic_phenopowerlaw_output !< name of each post result output enum, bind(c) enumerator :: & @@ -100,7 +95,6 @@ module plastic_phenopowerlaw plastic_phenopowerlaw_init, & plastic_phenopowerlaw_LpAndItsTangent, & plastic_phenopowerlaw_dotState, & - plastic_phenopowerlaw_postResults, & plastic_phenopowerlaw_results contains @@ -137,10 +131,6 @@ subroutine plastic_phenopowerlaw_init if (iand(debug_level(debug_constitutive),debug_levelBasic) /= 0) & write(6,'(a16,1x,i5,/)') '# instances:',Ninstance - allocate(plastic_phenopowerlaw_sizePostResult(maxval(phase_Noutput),Ninstance),source=0) - allocate(plastic_phenopowerlaw_output(maxval(phase_Noutput),Ninstance)) - plastic_phenopowerlaw_output = '' - allocate(param(Ninstance)) allocate(state(Ninstance)) allocate(dotState(Ninstance)) @@ -306,8 +296,6 @@ subroutine plastic_phenopowerlaw_init end select if (outputID /= undefined_ID) then - plastic_phenopowerlaw_output(i,phase_plasticityInstance(p)) = outputs(i) - plastic_phenopowerlaw_sizePostResult(i,phase_plasticityInstance(p)) = outputSize prm%outputID = [prm%outputID, outputID] endif @@ -322,7 +310,6 @@ subroutine plastic_phenopowerlaw_init call material_allocatePlasticState(p,NipcMyPhase,sizeState,sizeDotState,0, & prm%totalNslip,prm%totalNtwin,0) - plasticState(p)%sizePostResults = sum(plastic_phenopowerlaw_sizePostResult(:,phase_plasticityInstance(p))) !-------------------------------------------------------------------------------------------------- ! locally defined state aliases and initialization of state0 and aTolState @@ -473,71 +460,6 @@ subroutine plastic_phenopowerlaw_dotState(Mp,instance,of) end subroutine plastic_phenopowerlaw_dotState -!-------------------------------------------------------------------------------------------------- -!> @brief return array of constitutive results -!-------------------------------------------------------------------------------------------------- -function plastic_phenopowerlaw_postResults(Mp,instance,of) result(postResults) - - real(pReal), dimension(3,3), intent(in) :: & - Mp !< Mandel stress - integer, intent(in) :: & - instance, & - of - - real(pReal), dimension(sum(plastic_phenopowerlaw_sizePostResult(:,instance))) :: & - postResults - - integer :: & - o,c,i - real(pReal), dimension(param(instance)%totalNslip) :: & - gdot_slip_pos,gdot_slip_neg - - c = 0 - - associate(prm => param(instance), stt => state(instance)) - - outputsLoop: do o = 1,size(prm%outputID) - select case(prm%outputID(o)) - - case (resistance_slip_ID) - postResults(c+1:c+prm%totalNslip) = stt%xi_slip(1:prm%totalNslip,of) - c = c + prm%totalNslip - case (accumulatedshear_slip_ID) - postResults(c+1:c+prm%totalNslip) = stt%gamma_slip(1:prm%totalNslip,of) - c = c + prm%totalNslip - case (shearrate_slip_ID) - call kinetics_slip(Mp,instance,of,gdot_slip_pos,gdot_slip_neg) - postResults(c+1:c+prm%totalNslip) = gdot_slip_pos+gdot_slip_neg - c = c + prm%totalNslip - case (resolvedstress_slip_ID) - do i = 1, prm%totalNslip - postResults(c+i) = math_mul33xx33(Mp,prm%Schmid_slip(1:3,1:3,i)) - enddo - c = c + prm%totalNslip - - case (resistance_twin_ID) - postResults(c+1:c+prm%totalNtwin) = stt%xi_twin(1:prm%totalNtwin,of) - c = c + prm%totalNtwin - case (accumulatedshear_twin_ID) - postResults(c+1:c+prm%totalNtwin) = stt%gamma_twin(1:prm%totalNtwin,of) - c = c + prm%totalNtwin - case (shearrate_twin_ID) - call kinetics_twin(Mp,instance,of,postResults(c+1:c+prm%totalNtwin)) - c = c + prm%totalNtwin - case (resolvedstress_twin_ID) - do i = 1, prm%totalNtwin - postResults(c+i) = math_mul33xx33(Mp,prm%Schmid_twin(1:3,1:3,i)) - enddo - c = c + prm%totalNtwin - - end select - enddo outputsLoop - - end associate - -end function plastic_phenopowerlaw_postResults - - !-------------------------------------------------------------------------------------------------- !> @brief writes results to HDF5 output file !-------------------------------------------------------------------------------------------------- From 872c85112fc4d9f966e68c6e7c2bd9a13a626e9a Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 14:01:42 +0200 Subject: [PATCH 056/233] bugfix, Lp not available anymore for crystallite --- src/crystallite.f90 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/crystallite.f90 b/src/crystallite.f90 index 8cc30db28..c35237b9d 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -904,10 +904,6 @@ function crystallite_postResults(ipc, ip, el) mySize = 9 crystallite_postResults(c+1:c+mySize) = & reshape(transpose(crystallite_Fp(1:3,1:3,ipc,ip,el)),[mySize]) - case (lp_ID) - mySize = 9 - crystallite_postResults(c+1:c+mySize) = & - reshape(transpose(crystallite_Lp(1:3,1:3,ipc,ip,el)),[mySize]) case (p_ID) mySize = 9 crystallite_postResults(c+1:c+mySize) = & From 2ee3fb4159d925c36d142fa67736f0340295a6ae Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 17:36:17 +0200 Subject: [PATCH 057/233] bugfix: need to remove postResults output --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index a0caa709e..a6d4eca1f 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit a0caa709eb9289374c36e50dc27746ac0031dedb +Subproject commit a6d4eca1f9a9aee35f1c7d2e557547040cb5ecb9 From 0b4605361b9300cb710bcc8bfc7048b934a2e969 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 18:44:59 +0200 Subject: [PATCH 058/233] plotv only needed for postResults --- PRIVATE | 2 +- src/DAMASK_marc.f90 | 34 ---------------------------------- src/IO.f90 | 5 ----- 3 files changed, 1 insertion(+), 40 deletions(-) diff --git a/PRIVATE b/PRIVATE index a6d4eca1f..0f2f42481 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit a6d4eca1f9a9aee35f1c7d2e557547040cb5ecb9 +Subproject commit 0f2f42481fa082e596ff4a63bb57e2aa0ad812fc diff --git a/src/DAMASK_marc.f90 b/src/DAMASK_marc.f90 index 09a1c83c8..8ef118fed 100644 --- a/src/DAMASK_marc.f90 +++ b/src/DAMASK_marc.f90 @@ -363,37 +363,3 @@ subroutine uedinc(inc,incsub) call CPFEM_results(inc,cptim) end subroutine uedinc - - -!-------------------------------------------------------------------------------------------------- -!> @brief sets user defined output variables for Marc -!> @details select a variable contour plotting (user subroutine). -!-------------------------------------------------------------------------------------------------- -subroutine plotv(v,s,sp,etot,eplas,ecreep,t,m,nn,layer,ndi,nshear,jpltcd) - use prec - use mesh - use IO - use homogenization - - implicit none - integer, intent(in) :: & - m, & !< element number - nn, & !< integration point number - layer, & !< layer number - ndi, & !< number of direct stress components - nshear, & !< number of shear stress components - jpltcd !< user variable index - real(pReal), dimension(*), intent(in) :: & - s, & !< stress array - sp, & !< stresses in preferred direction - etot, & !< total strain (generalized) - eplas, & !< total plastic strain - ecreep, & !< total creep strain - t !< current temperature - real(pReal), intent(out) :: & - v !< variable - - if (jpltcd > materialpoint_sizeResults) call IO_error(700,jpltcd) ! complain about out of bounds error - v = materialpoint_results(jpltcd,nn,mesh_FEasCP('elem', m)) - -end subroutine plotv diff --git a/src/IO.f90 b/src/IO.f90 index 5d96e67d2..c16d1979c 100644 --- a/src/IO.f90 +++ b/src/IO.f90 @@ -734,11 +734,6 @@ subroutine IO_error(error_ID,el,ip,g,instance,ext_msg) case (602) msg = 'invalid selection for debug' -!------------------------------------------------------------------------------------------------- -! DAMASK_marc errors - case (700) - msg = 'invalid materialpoint result requested' - !------------------------------------------------------------------------------------------------- ! errors related to the grid solver case (809) From a2e4917d3bc5d4d59545d6e9e4a0a4897b591293 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 13:54:09 +0200 Subject: [PATCH 059/233] not needed for DADF5 --- processing/pre/abq_addUserOutput.py | 167 --------------------------- processing/pre/marc_addUserOutput.py | 164 -------------------------- 2 files changed, 331 deletions(-) delete mode 100755 processing/pre/abq_addUserOutput.py delete mode 100755 processing/pre/marc_addUserOutput.py diff --git a/processing/pre/abq_addUserOutput.py b/processing/pre/abq_addUserOutput.py deleted file mode 100755 index 6df80ee82..000000000 --- a/processing/pre/abq_addUserOutput.py +++ /dev/null @@ -1,167 +0,0 @@ -#!/usr/bin/env python2.7 -# -*- coding: UTF-8 no BOM -*- - -import sys,os,re -from optparse import OptionParser -import damask - -scriptName = os.path.splitext(os.path.basename(__file__))[0] -scriptID = ' '.join([scriptName,damask.version]) - -# ----------------------------- -def ParseOutputFormat(filename,what,me): - format = {'outputs':{},'specials':{'brothers':[]}} - - outputmetafile = filename+'.output'+what - try: - myFile = open(outputmetafile) - except: - print('Could not open file %s'%outputmetafile) - raise - else: - content = myFile.readlines() - myFile.close() - - tag = '' - tagID = 0 - for line in content: - if re.match("\s*$",line) or re.match("#",line): # skip blank lines and comments - continue - m = re.match("\[(.+)\]",line) # look for block indicator - if m: # next section - tag = m.group(1) - tagID += 1 - format['specials']['brothers'].append(tag) - if tag == me or (me.isdigit() and tagID == int(me)): - format['specials']['_id'] = tagID - format['outputs'] = [] - tag = me - else: # data from section - if tag == me: - (output,length) = line.split() - output.lower() - if length.isdigit(): - length = int(length) - if re.match("\((.+)\)",output): # special data, (e.g. (Ngrains) - format['specials'][output] = length - elif length > 0: - format['outputs'].append([output,length]) - return format - - -parser = OptionParser(option_class=damask.extendableOption, usage='%prog [option(s)] Abaqus.Inputfile(s)', description = """ -Transfer the output variables requested in the material.config to -properly labelled user-defined variables within the Abaqus input file (*.inp). - -Requires the files -.output -that are written during the first run of the model. - -Specify which user block format you want to apply by stating the homogenization, crystallite, and phase identifiers. -Or have an existing set of user variables copied over from another *.inp file. - -""", version = scriptID) - -parser.add_option('-m', dest='number', type='int', metavar = 'int', - help='maximum requested User Defined Variable [%default]') -parser.add_option('--homogenization', dest='homog', metavar = 'string', - help='homogenization name or index [%default]') -parser.add_option('--crystallite', dest='cryst', metavar = 'string', - help='crystallite identifier name or index [%default]') -parser.add_option('--phase', dest='phase', metavar = 'string', - help='phase identifier name or index [%default]') -parser.add_option('--use', dest='useFile', metavar = 'string', - help='optionally parse output descriptors from '+ - 'outputXXX files of given name') -parser.add_option('--option', dest='damaskOption', metavar = 'string', - help='Add DAMASK option to input file, e.g. "periodic x z"') - -parser.set_defaults(number = 0, - homog = '1', - cryst = '1', - phase = '1') - -(options, files) = parser.parse_args() - -if not files: - parser.error('no file(s) specified.') - -me = { 'Homogenization': options.homog, - 'Crystallite': options.cryst, - 'Constitutive': options.phase, - } - - -for myFile in files: - damask.util.report(scriptName,myFile) - if options.useFile is not None: - formatFile = os.path.splitext(options.useFile)[0] - else: - formatFile = os.path.splitext(myFile)[0] - myFile = os.path.splitext(myFile)[0]+'.inp' - if not os.path.lexists(myFile): - print('{} not found'.format(myFile)) - continue - - print('Scanning format files of: {}'.format(formatFile)) - - if options.number < 1: - outputFormat = {} - - for what in me: - outputFormat[what] = ParseOutputFormat(formatFile,what,me[what]) - if '_id' not in outputFormat[what]['specials']: - print("'{}' not found in <{}>".format(me[what],what)) - print('\n'.join(map(lambda x:' '+x,outputFormat[what]['specials']['brothers']))) - sys.exit(1) - - UserVars = ['HomogenizationCount'] - for var in outputFormat['Homogenization']['outputs']: - if var[1] > 1: - UserVars += ['%i_%s'%(i+1,var[0]) for i in range(var[1])] - else: - UserVars += ['%s'%(var[0]) for i in range(var[1])] - - UserVars += ['GrainCount'] - - for grain in range(outputFormat['Homogenization']['specials']['(ngrains)']): - UserVars += ['%i_CrystalliteCount'%(grain+1)] - for var in outputFormat['Crystallite']['outputs']: - if var[1] > 1: - UserVars += ['%i_%i_%s'%(grain+1,i+1,var[0]) for i in range(var[1])] - else: - UserVars += ['%i_%s'%(grain+1,var[0]) for i in range(var[1])] - - UserVars += ['%i_ConstitutiveCount'%(grain+1)] - for var in outputFormat['Constitutive']['outputs']: - if var[1] > 1: - UserVars += ['%i_%i_%s'%(grain+1,i+1,var[0]) for i in range(var[1])] - else: - UserVars += ['%i_%s'%(grain+1,var[0]) for i in range(var[1])] - -# Now change *.inp file(s) - print('Adding labels to: {}'.format(myFile)) - inFile = open(myFile) - input = inFile.readlines() - inFile.close() - output = open(myFile,'w') - thisSection = '' - if options.damaskOption is not None: - output.write('$damask {0}\n'.format(options.damaskOption)) - for line in input: - #Abaqus keyword line begins with: *keyword, argument1, ... - m = re.match('([*]\w+)\s',line) - if m: - lastSection = thisSection - thisSection = m.group(1) - if (lastSection.upper() == '*DEPVAR' and thisSection.upper() == '*USER'): # Abaqus keyword can be upper or lower case - if options.number > 0: - output.write('{}\n'.format(options.number)) # Abaqus needs total number of SDVs in the line after *Depvar keyword - else: - output.write('{}\n'.format(len(UserVars))) - - for i in range(len(UserVars)): - output.write('%i,"%i%s","%i%s"\n'%(i+1,0,UserVars[i],0,UserVars[i])) #index,output variable key,output variable description - if (thisSection.upper() != '*DEPVAR' or not re.match('\s*\d',line)): - output.write(line) - output.close() diff --git a/processing/pre/marc_addUserOutput.py b/processing/pre/marc_addUserOutput.py deleted file mode 100755 index 94b6c3503..000000000 --- a/processing/pre/marc_addUserOutput.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: UTF-8 no BOM -*- - -import sys,os,re -from optparse import OptionParser -import damask - -scriptName = os.path.splitext(os.path.basename(__file__))[0] -scriptID = ' '.join([scriptName,damask.version]) - -# ----------------------------- -def ParseOutputFormat(filename,what,me): - format = {'outputs':{},'specials':{'brothers':[]}} - - outputmetafile = filename+'.output'+what - try: - myFile = open(outputmetafile) - except: - print('Could not open file %s'%outputmetafile) - raise - else: - content = myFile.readlines() - myFile.close() - - tag = '' - tagID = 0 - for line in content: - if re.match("\s*$",line) or re.match("#",line): # skip blank lines and comments - continue - m = re.match("\[(.+)\]",line) # look for block indicator - if m: # next section - tag = m.group(1) - tagID += 1 - format['specials']['brothers'].append(tag) - if tag == me or (me.isdigit() and tagID == int(me)): - format['specials']['_id'] = tagID - format['outputs'] = [] - tag = me - else: # data from section - if tag == me: - (output,length) = line.split() - output.lower() - if length.isdigit(): - length = int(length) - if re.match("\((.+)\)",output): # special data, (e.g. (Ngrains) - format['specials'][output] = length - elif length > 0: - format['outputs'].append([output,length]) - return format - -parser = OptionParser(option_class=damask.extendableOption, usage='%prog [option(s)] Marc.Inputfile(s)', description = """ -Transfer the output variables requested in the material.config to -properly labelled user-defined variables within the Marc input file (*.dat). - -Requires the files -.output -that are written during the first run of the model. - -Specify which user block format you want to apply by stating the homogenization, crystallite, and phase identifiers. -Or have an existing set of user variables copied over from another *.dat file. - -""", version = scriptID) - -parser.add_option('-m', dest='number', type='int', metavar = 'int', - help='maximum requested User Defined Variable [%default]') -parser.add_option('--homogenization', dest='homog', metavar = 'string', - help='homogenization name or index [%default]') -parser.add_option('--crystallite', dest='cryst', metavar = 'string', - help='crystallite identifier name or index [%default]') -parser.add_option('--phase', dest='phase', metavar = 'string', - help='phase identifier name or index [%default]') -parser.add_option('--use', dest='useFile', metavar = 'string', - help='optionally parse output descriptors from '+ - 'outputXXX files of given name') -parser.add_option('--option', dest='damaskOption', metavar = 'string', - help='Add DAMASK option to input file, e.g. "periodic x z"') - -parser.set_defaults(number = 0, - homog = '1', - cryst = '1', - phase = '1') - -(options, files) = parser.parse_args() - -if not files: - parser.error('no file(s) specified.') - -me = { 'Homogenization': options.homog, - 'Crystallite': options.cryst, - 'Constitutive': options.phase, - } - - -for myFile in files: - damask.util.report(scriptName,myFile) - if options.useFile is not None: - formatFile = os.path.splitext(options.useFile)[0] - else: - formatFile = os.path.splitext(myFile)[0] - myFile = os.path.splitext(myFile)[0]+'.dat' - if not os.path.lexists(myFile): - print('{} not found'.format(myFile)) - continue - - print('Scanning format files of: {}'.format(formatFile)) - - if options.number < 1: - outputFormat = {} - - for what in me: - outputFormat[what] = ParseOutputFormat(formatFile,what,me[what]) - if '_id' not in outputFormat[what]['specials']: - print("'{}' not found in <{}>".format(me[what],what)) - print('\n'.join(map(lambda x:' '+x,outputFormat[what]['specials']['brothers']))) - sys.exit(1) - - UserVars = ['HomogenizationCount'] - for var in outputFormat['Homogenization']['outputs']: - if var[1] > 1: - UserVars += ['%i_%s'%(i+1,var[0]) for i in range(var[1])] - else: - UserVars += ['%s'%(var[0]) for i in range(var[1])] - - UserVars += ['GrainCount'] - - for grain in range(outputFormat['Homogenization']['specials']['(ngrains)']): - UserVars += ['%i_CrystalliteCount'%(grain+1)] - for var in outputFormat['Crystallite']['outputs']: - if var[1] > 1: - UserVars += ['%i_%i_%s'%(grain+1,i+1,var[0]) for i in range(var[1])] - else: - UserVars += ['%i_%s'%(grain+1,var[0]) for i in range(var[1])] - - UserVars += ['%i_ConstitutiveCount'%(grain+1)] - for var in outputFormat['Constitutive']['outputs']: - if var[1] > 1: - UserVars += ['%i_%i_%s'%(grain+1,i+1,var[0]) for i in range(var[1])] - else: - UserVars += ['%i_%s'%(grain+1,var[0]) for i in range(var[1])] - -# Now change *.dat file(s) - print('Adding labels to: {}'.format(myFile)) - inFile = open(myFile) - input = inFile.readlines() - inFile.close() - output = open(myFile,'w') - thisSection = '' - if options.damaskOption is not None: - output.write('$damask {0}\n'.format(options.damaskOption)) - for line in input: - m = re.match('(\w+)\s',line) - if m: - lastSection = thisSection - thisSection = m.group(1) - if (lastSection == 'post' and thisSection == 'parameters'): - if options.number > 0: - for i in range(options.number): - output.write('%10i%10i\n'%(-i-1,0)) - else: - for i in range(len(UserVars)): - output.write('%10i%10i%s\n'%(-i-1,0,UserVars[i])) - if (thisSection != 'post' or not re.match('\s*\-',line)): - output.write(line) - output.close() From 56937509b1f1c27e00792c5d5039c900b5583584 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 19:28:37 +0200 Subject: [PATCH 060/233] even less postResults --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 0f2f42481..d5b572ae8 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 0f2f42481fa082e596ff4a63bb57e2aa0ad812fc +Subproject commit d5b572ae84c299aa9d4af100ba09acd14e4ef596 From 61712f59b95b3383cf716640d5dde17c68d74725 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 20 Oct 2019 23:54:53 +0200 Subject: [PATCH 061/233] old, undocumented scripts do not exist anymore --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index df5a10f60..2ccb6f06d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -506,7 +506,6 @@ Processing: stage: createDocumentation script: - cd $DAMASKROOT/processing/pre - - rm abq_addUserOutput.py marc_addUserOutput.py - $DAMASKROOT/PRIVATE/documenting/scriptHelpToWiki.py --debug *.py - cd $DAMASKROOT/processing/post - rm vtk2ang.py DAD*.py From ac0149e55e5a744cca7cf28e94e5a63b906ea0c6 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 21 Oct 2019 11:48:35 +0200 Subject: [PATCH 062/233] not needed (is initialized to 0) --- src/damage_none.f90 | 1 - src/homogenization_mech_RGC.f90 | 1 - src/homogenization_mech_isostrain.f90 | 1 - src/homogenization_mech_none.f90 | 1 - src/plastic_none.f90 | 2 -- src/thermal_isothermal.f90 | 1 - 6 files changed, 7 deletions(-) diff --git a/src/damage_none.f90 b/src/damage_none.f90 index 5ffdba030..62d2cc0eb 100644 --- a/src/damage_none.f90 +++ b/src/damage_none.f90 @@ -30,7 +30,6 @@ subroutine damage_none_init myhomog: if (damage_type(homog) == DAMAGE_NONE_ID) then NofMyHomog = count(material_homogenizationAt == homog) damageState(homog)%sizeState = 0 - damageState(homog)%sizePostResults = 0 allocate(damageState(homog)%state0 (0,NofMyHomog)) allocate(damageState(homog)%subState0(0,NofMyHomog)) allocate(damageState(homog)%state (0,NofMyHomog)) diff --git a/src/homogenization_mech_RGC.f90 b/src/homogenization_mech_RGC.f90 index 0ae0f4c18..61a1997cd 100644 --- a/src/homogenization_mech_RGC.f90 +++ b/src/homogenization_mech_RGC.f90 @@ -160,7 +160,6 @@ module subroutine mech_RGC_init + size(['avg constitutive work ','average penalty energy']) homogState(h)%sizeState = sizeState - homogState(h)%sizePostResults = 0 allocate(homogState(h)%state0 (sizeState,NofMyHomog), source=0.0_pReal) allocate(homogState(h)%subState0(sizeState,NofMyHomog), source=0.0_pReal) allocate(homogState(h)%state (sizeState,NofMyHomog), source=0.0_pReal) diff --git a/src/homogenization_mech_isostrain.f90 b/src/homogenization_mech_isostrain.f90 index c1eba821c..cdc078925 100644 --- a/src/homogenization_mech_isostrain.f90 +++ b/src/homogenization_mech_isostrain.f90 @@ -63,7 +63,6 @@ module subroutine mech_isostrain_init NofMyHomog = count(material_homogenizationAt == h) homogState(h)%sizeState = 0 - homogState(h)%sizePostResults = 0 allocate(homogState(h)%state0 (0,NofMyHomog)) allocate(homogState(h)%subState0(0,NofMyHomog)) allocate(homogState(h)%state (0,NofMyHomog)) diff --git a/src/homogenization_mech_none.f90 b/src/homogenization_mech_none.f90 index d5b24e5d1..3e7998d88 100644 --- a/src/homogenization_mech_none.f90 +++ b/src/homogenization_mech_none.f90 @@ -29,7 +29,6 @@ module subroutine mech_none_init NofMyHomog = count(material_homogenizationAt == h) homogState(h)%sizeState = 0 - homogState(h)%sizePostResults = 0 allocate(homogState(h)%state0 (0,NofMyHomog)) allocate(homogState(h)%subState0(0,NofMyHomog)) allocate(homogState(h)%state (0,NofMyHomog)) diff --git a/src/plastic_none.f90 b/src/plastic_none.f90 index fa913df4c..a4979bb2c 100644 --- a/src/plastic_none.f90 +++ b/src/plastic_none.f90 @@ -40,8 +40,6 @@ subroutine plastic_none_init NipcMyPhase = count(material_phaseAt == p) * discretization_nIP call material_allocatePlasticState(p,NipcMyPhase,0,0,0, & 0,0,0) - plasticState(p)%sizePostResults = 0 - enddo end subroutine plastic_none_init diff --git a/src/thermal_isothermal.f90 b/src/thermal_isothermal.f90 index 0271813e2..f06239944 100644 --- a/src/thermal_isothermal.f90 +++ b/src/thermal_isothermal.f90 @@ -31,7 +31,6 @@ subroutine thermal_isothermal_init if (thermal_type(homog) /= THERMAL_isothermal_ID) cycle NofMyHomog = count(material_homogenizationAt == homog) thermalState(homog)%sizeState = 0 - thermalState(homog)%sizePostResults = 0 allocate(thermalState(homog)%state0 (0,NofMyHomog), source=0.0_pReal) allocate(thermalState(homog)%subState0(0,NofMyHomog), source=0.0_pReal) allocate(thermalState(homog)%state (0,NofMyHomog), source=0.0_pReal) From 578cbf9bbfb2a26a84e226b6b60e115afafbdc85 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 21 Oct 2019 18:06:16 +0200 Subject: [PATCH 063/233] bugfixes: - vonMises calculation was wrong - wrong type of data used in some add_XXX --- python/damask/dadf5.py | 11 ++++++----- python/damask/mechanics.py | 8 ++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 733f06a1c..562051384 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -462,9 +462,10 @@ class DADF5(): """ def __add_Mises(x): - t = 'strain' if x['Unit'] == '1' else 'stress' + t = 'strain' if x['meta']['Unit'] == '1' else \ + 'stress' return { - 'data': mechanics.Mises_strain(x) if t=='strain' else mechanics.Mises_stress(x), + 'data': mechanics.Mises_strain(x['data']) if t=='strain' else mechanics.Mises_stress(x['data']), 'label': '{}_vM'.format(x['label']), 'meta': { 'Unit': x['meta']['Unit'], @@ -589,7 +590,7 @@ class DADF5(): raise ValueError return { - 'data': mechanics.spherical_part(x), + 'data': mechanics.spherical_part(x['data']), 'label': 'p_{}'.format(x['label']), 'meta': { 'Unit': x['meta']['Unit'], @@ -725,7 +726,7 @@ class DADF5(): def __add_principal_components(x): return { - 'data': mechanics.principal_components(x), + 'data': mechanics.principal_components(x['data']), 'label': 'lambda_{}'.format(x['label']), 'meta': { 'Unit': x['meta']['Unit'], @@ -752,7 +753,7 @@ class DADF5(): def __add_maximum_shear(x): return { - 'data': mechanics.maximum_shear(x), + 'data': mechanics.maximum_shear(x['data']), 'label': 'max_shear({})'.format(x['label']), 'meta': { 'Unit': x['meta']['Unit'], diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index c89d16918..1e91ccbb7 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -101,8 +101,8 @@ def Mises_stress(sigma): """ s = deviatoric_part(sigma) - return np.sqrt(3.0/2.0*np.trace(s)) if np.shape(sigma) == (3,3) else \ - np.sqrt(3.0/2.0*np.einsum('ijk->i',s)) + return np.sqrt(3.0/2.0*(np.sum(s**2.0))) if np.shape(sigma) == (3,3) else \ + np.sqrt(3.0/2.0*np.einsum('ijk->i',s**2.0)) def Mises_strain(epsilon): @@ -116,8 +116,8 @@ def Mises_strain(epsilon): """ s = deviatoric_part(epsilon) - return np.sqrt(2.0/3.0*np.trace(s)) if np.shape(epsilon) == (3,3) else \ - np.sqrt(2.0/3.0*np.einsum('ijk->i',s)) + return np.sqrt(3.0/2.0*(np.sum(s**2.0))) if np.shape(epsilon) == (3,3) else \ + np.sqrt(3.0/2.0*np.einsum('ijk->i',s**2.0)) def symmetric(x): From 2d08eb68b12c9506c5a03a0d255cf9a9f07943db Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 23 Oct 2019 14:39:52 +0200 Subject: [PATCH 064/233] bugfix for (3x3) version of Cauchy --- python/damask/mechanics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index 1e91ccbb7..351feec50 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -15,7 +15,7 @@ def Cauchy(F,P): """ if np.shape(F) == np.shape(P) == (3,3): - sigma = 1.0/np.linalg.det(F) * np.dot(F,P) + sigma = 1.0/np.linalg.det(F) * np.dot(P,F.T) else: sigma = np.einsum('i,ijk,ilk->ijl',1.0/np.linalg.det(F),P,F) return symmetric(sigma) From 894b646283b6dc7e8284099f8e41d0986b7ada5c Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Wed, 23 Oct 2019 15:03:24 +0200 Subject: [PATCH 065/233] corrected name of U,V; fixed Mises_strain factor from 3/2 to 2/3; --- python/damask/mechanics.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index 351feec50..03ae2b2b6 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -33,7 +33,7 @@ def strain_tensor(F,t,m): F : numpy.array of shape (x,3,3) or (3,3) Deformation gradient. t : {‘V’, ‘U’} - Type of the polar decomposition, ‘V’ for right stretch tensor and ‘U’ for left stretch tensor. + Type of the polar decomposition, ‘V’ for left stretch tensor and ‘U’ for right stretch tensor. m : float Order of the strain. @@ -116,8 +116,8 @@ def Mises_strain(epsilon): """ s = deviatoric_part(epsilon) - return np.sqrt(3.0/2.0*(np.sum(s**2.0))) if np.shape(epsilon) == (3,3) else \ - np.sqrt(3.0/2.0*np.einsum('ijk->i',s**2.0)) + return np.sqrt(2.0/3.0*(np.sum(s**2.0))) if np.shape(epsilon) == (3,3) else \ + np.sqrt(2.0/3.0*np.einsum('ijk->i',s**2.0)) def symmetric(x): From 60a19c020db55cfb0a1c1040c017c607f5a1968f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 23 Oct 2019 21:17:56 +0200 Subject: [PATCH 066/233] cleaning --- src/CPFEM.f90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CPFEM.f90 b/src/CPFEM.f90 index 32098b109..e549df30d 100644 --- a/src/CPFEM.f90 +++ b/src/CPFEM.f90 @@ -178,19 +178,19 @@ subroutine CPFEM_general(mode, parallelExecution, ffn, ffn1, temperature_inp, dt if (iand(mode, CPFEM_RESTOREJACOBIAN) /= 0_pInt) & CPFEM_dcsde = CPFEM_dcsde_knownGood - !*** age results and write restart data if requested + !*** age results if (iand(mode, CPFEM_AGERESULTS) /= 0_pInt) then - crystallite_F0 = crystallite_partionedF ! crystallite deformation (_subF is perturbed...) + crystallite_F0 = crystallite_partionedF ! crystallite deformation crystallite_Fp0 = crystallite_Fp ! crystallite plastic deformation crystallite_Lp0 = crystallite_Lp ! crystallite plastic velocity crystallite_Fi0 = crystallite_Fi ! crystallite intermediate deformation crystallite_Li0 = crystallite_Li ! crystallite intermediate velocity crystallite_S0 = crystallite_S ! crystallite 2nd Piola Kirchhoff stress - forall ( i = 1:size(plasticState )) plasticState(i)%state0 = plasticState(i)%state ! copy state in this lenghty way because: A component cannot be an array if the encompassing structure is an array + forall (i = 1:size(plasticState)) plasticState(i)%state0 = plasticState(i)%state do i = 1, size(sourceState) do mySource = 1,phase_Nsources(i) - sourceState(i)%p(mySource)%state0 = sourceState(i)%p(mySource)%state ! copy state in this lenghty way because: A component cannot be an array if the encompassing structure is an array + sourceState(i)%p(mySource)%state0 = sourceState(i)%p(mySource)%state enddo; enddo if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0_pInt) then write(6,'(a)') '<< CPFEM >> aging states' From 90a47f0e31f24765b9b775ee66d09f8b0065f83a Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 23 Oct 2019 21:51:09 +0200 Subject: [PATCH 067/233] MSC.Marc does not work with -O Intel MPSS is missing in that case. This is probably due to some of the linker options in include_linux64 --- .../2018.1/Marc_tools/include_linux64 | 20 +++------------ .../2018/Marc_tools/include_linux64 | 20 +++------------ .../2019/Marc_tools/include_linux64 | 25 +++++-------------- 3 files changed, 12 insertions(+), 53 deletions(-) diff --git a/installation/mods_MarcMentat/2018.1/Marc_tools/include_linux64 b/installation/mods_MarcMentat/2018.1/Marc_tools/include_linux64 index 538434ad0..10a796e47 100644 --- a/installation/mods_MarcMentat/2018.1/Marc_tools/include_linux64 +++ b/installation/mods_MarcMentat/2018.1/Marc_tools/include_linux64 @@ -546,15 +546,15 @@ fi # DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3 -DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O0 $I8FFLAGS -I$MARC_SOURCE/common \ +DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ -qopenmp -qopenmp-threadprivate=compat\ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" -DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O1 $I8FFLAGS -I$MARC_SOURCE/common \ +DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ -qopenmp -qopenmp-threadprivate=compat\ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" -DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias -O2 $I8FFLAGS -I$MARC_SOURCE/common \ +DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ -qopenmp -qopenmp-threadprivate=compat\ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" @@ -572,20 +572,6 @@ then $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM" fi - # DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3 - DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ - -qopenmp -qopenmp-threadprivate=compat\ - $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" - DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ - -qopenmp -qopenmp-threadprivate=compat\ - $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" - DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ - -qopenmp -qopenmp-threadprivate=compat\ - $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" - FORTLOWT="$FORTLOW" FORTRANT="$FORTRAN" diff --git a/installation/mods_MarcMentat/2018/Marc_tools/include_linux64 b/installation/mods_MarcMentat/2018/Marc_tools/include_linux64 index d3151ac6c..694dccee3 100644 --- a/installation/mods_MarcMentat/2018/Marc_tools/include_linux64 +++ b/installation/mods_MarcMentat/2018/Marc_tools/include_linux64 @@ -546,15 +546,15 @@ fi # DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3 -DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O0 $I8FFLAGS -I$MARC_SOURCE/common \ +DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \ -qopenmp -qopenmp-threadprivate=compat\ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" -DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O1 $I8FFLAGS -I$MARC_SOURCE/common \ +DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \ -qopenmp -qopenmp-threadprivate=compat\ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" -DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias -O2 $I8FFLAGS -I$MARC_SOURCE/common \ +DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \ -qopenmp -qopenmp-threadprivate=compat\ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" @@ -572,20 +572,6 @@ then $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM" fi - # DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3 - DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \ - -qopenmp -qopenmp-threadprivate=compat\ - $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" - DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \ - -qopenmp -qopenmp-threadprivate=compat\ - $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" - DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018 -DDAMASKVERSION=$DAMASKVERSION \ - -qopenmp -qopenmp-threadprivate=compat\ - $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" - FORTLOWT="$FORTLOW" FORTRANT="$FORTRAN" diff --git a/installation/mods_MarcMentat/2019/Marc_tools/include_linux64 b/installation/mods_MarcMentat/2019/Marc_tools/include_linux64 index 290055ed3..6d630bd1d 100644 --- a/installation/mods_MarcMentat/2019/Marc_tools/include_linux64 +++ b/installation/mods_MarcMentat/2019/Marc_tools/include_linux64 @@ -554,16 +554,16 @@ fi # DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3 -DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O0 $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ +DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ + -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2019 -DDAMASKVERSION=$DAMASKVERSION \ -qopenmp -qopenmp-threadprivate=compat\ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" -DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -O1 $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ +DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ + -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2019 -DDAMASKVERSION=$DAMASKVERSION \ -qopenmp -qopenmp-threadprivate=compat\ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" -DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias -O2 $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ +DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ + -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2019 -DDAMASKVERSION=$DAMASKVERSION \ -qopenmp -qopenmp-threadprivate=compat\ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" @@ -579,19 +579,6 @@ then $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM" fi - # DAMASK compiler calls: additional flags are in line 2 OpenMP flags in line 3 - DFORTLOWMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ - -qopenmp -qopenmp-threadprivate=compat\ - $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" - DFORTRANMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ - -qopenmp -qopenmp-threadprivate=compat\ - $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" - DFORTHIGHMP="$FCOMP -c -implicitnone -stand f08 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB -fno-alias $I8FFLAGS -I$MARC_SOURCE/common \ - -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMarc4DAMASK=2018.1 -DDAMASKVERSION=$DAMASKVERSION \ - -qopenmp -qopenmp-threadprivate=compat\ - $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD" FORTLOWT="$FORTLOW" FORTRANT="$FORTRAN" From e1d820bff19011ce0caff8c257525d07f5f913fc Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 23 Oct 2019 22:04:50 +0200 Subject: [PATCH 068/233] does not support restart --- src/mesh/DAMASK_FEM.f90 | 185 ++++++++++++++++++---------------------- 1 file changed, 85 insertions(+), 100 deletions(-) diff --git a/src/mesh/DAMASK_FEM.f90 b/src/mesh/DAMASK_FEM.f90 index 3602bd068..c56302da0 100644 --- a/src/mesh/DAMASK_FEM.f90 +++ b/src/mesh/DAMASK_FEM.f90 @@ -3,7 +3,7 @@ !> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH !> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH !> @brief Driver controlling inner and outer load case looping of the FEM solver -!> @details doing cutbacking, forwarding in case of restart, reporting statistics, writing +!> @details doing cutbacking, reporting statistics, writing !> results !-------------------------------------------------------------------------------------------------- program DAMASK_FEM @@ -58,7 +58,6 @@ program DAMASK_FEM fileUnit = 0, & !< file unit for reading load case and writing results myStat, & statUnit = 0, & !< file unit for statistics output - lastRestartWritten = 0, & !< total increment No. at which last restart information was written stagIter, & component character(len=6) :: loadcase_string @@ -164,9 +163,6 @@ program DAMASK_FEM loadCases(currentLoadCase)%logscale = 1 case('freq','frequency','outputfreq') ! frequency of result writings loadCases(currentLoadCase)%outputfrequency = IO_intValue(line,chunkPos,i+1) - case('r','restart','restartwrite') ! frequency of writing restart information - loadCases(currentLoadCase)%restartfrequency = & - max(0,IO_intValue(line,chunkPos,i+1)) case('guessreset','dropguessing') loadCases(currentLoadCase)%followFormerTrajectory = .false. ! do not continue to predict deformation along former trajectory @@ -246,8 +242,6 @@ program DAMASK_FEM if (loadCases(currentLoadCase)%outputfrequency < 1) errorID = 836 ! non-positive result frequency write(6,'(2x,a,i5)') 'output frequency: ', & loadCases(currentLoadCase)%outputfrequency - write(6,'(2x,a,i5,/)') 'restart frequency: ', & - loadCases(currentLoadCase)%restartfrequency if (errorID > 0) call IO_error(error_ID = errorID, ext_msg = loadcase_string) ! exit with error message enddo checkLoadcases @@ -293,117 +287,108 @@ program DAMASK_FEM endif timeinc = timeinc * real(subStepFactor,pReal)**real(-cutBackLevel,pReal) ! depending on cut back level, decrease time step - skipping: if (totalIncsCounter <= interface_restartInc) then ! not yet at restart inc? - time = time + timeinc ! just advance time, skip already performed calculation - guess = .true. - else skipping - stepFraction = 0 ! fraction scaled by stepFactor**cutLevel - subStepLooping: do while (stepFraction < subStepFactor**cutBackLevel) - remainingLoadCaseTime = loadCases(currentLoadCase)%time+time0 - time - time = time + timeinc ! forward target time - stepFraction = stepFraction + 1 ! count step - + 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 + !-------------------------------------------------------------------------------------------------- ! report begin of new step - write(6,'(/,a)') ' ###########################################################################' - write(6,'(1x,a,es12.5'//& - ',a,'//IO_intOut(inc)//',a,'//IO_intOut(loadCases(currentLoadCase)%incs)//& - ',a,'//IO_intOut(stepFraction)//',a,'//IO_intOut(subStepFactor**cutBackLevel)//& - ',a,'//IO_intOut(currentLoadCase)//',a,'//IO_intOut(size(loadCases))//')') & - 'Time', time, & - 's: Increment ', inc, '/', loadCases(currentLoadCase)%incs,& - '-', stepFraction, '/', subStepFactor**cutBackLevel,& - ' of load case ', currentLoadCase,'/',size(loadCases) - write(incInfo,& - '(a,'//IO_intOut(totalIncsCounter)//& - ',a,'//IO_intOut(sum(loadCases%incs))//& - ',a,'//IO_intOut(stepFraction)//& - ',a,'//IO_intOut(subStepFactor**cutBackLevel)//')') & - 'Increment ',totalIncsCounter,'/',sum(loadCases%incs),& - '-',stepFraction, '/', subStepFactor**cutBackLevel - flush(6) + write(6,'(/,a)') ' ###########################################################################' + write(6,'(1x,a,es12.5'//& + ',a,'//IO_intOut(inc)//',a,'//IO_intOut(loadCases(currentLoadCase)%incs)//& + ',a,'//IO_intOut(stepFraction)//',a,'//IO_intOut(subStepFactor**cutBackLevel)//& + ',a,'//IO_intOut(currentLoadCase)//',a,'//IO_intOut(size(loadCases))//')') & + 'Time', time, & + 's: Increment ', inc, '/', loadCases(currentLoadCase)%incs,& + '-', stepFraction, '/', subStepFactor**cutBackLevel,& + ' of load case ', currentLoadCase,'/',size(loadCases) + write(incInfo,& + '(a,'//IO_intOut(totalIncsCounter)//& + ',a,'//IO_intOut(sum(loadCases%incs))//& + ',a,'//IO_intOut(stepFraction)//& + ',a,'//IO_intOut(subStepFactor**cutBackLevel)//')') & + 'Increment ',totalIncsCounter,'/',sum(loadCases%incs),& + '-',stepFraction, '/', subStepFactor**cutBackLevel + flush(6) !-------------------------------------------------------------------------------------------------- ! forward fields + do field = 1, nActiveFields + select case (loadCases(currentLoadCase)%fieldBC(field)%ID) + case(FIELD_MECH_ID) + call FEM_mech_forward (& + guess,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(field)) + + end select + enddo + +!-------------------------------------------------------------------------------------------------- +! solve fields + stagIter = 0 + stagIterate = .true. + do while (stagIterate) do field = 1, nActiveFields select case (loadCases(currentLoadCase)%fieldBC(field)%ID) case(FIELD_MECH_ID) - call FEM_mech_forward (& - guess,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(field)) + solres(field) = FEM_mech_solution (& + incInfo,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(field)) - end select - enddo - -!-------------------------------------------------------------------------------------------------- -! 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_mech_solution (& - incInfo,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(field)) + end select - end select + if(.not. solres(field)%converged) exit ! no solution found - if(.not. solres(field)%converged) exit ! no solution found - - enddo - stagIter = stagIter + 1 - stagIterate = stagIter < stagItMax & - .and. all(solres(:)%converged) & - .and. .not. all(solres(:)%stagConverged) ! stationary with respect to staggered iteration - enddo - + enddo + stagIter = stagIter + 1 + stagIterate = stagIter < stagItMax & + .and. all(solres(:)%converged) & + .and. .not. all(solres(:)%stagConverged) ! stationary with respect to staggered iteration + enddo + ! check solution - cutBack = .False. - if(.not. all(solres(:)%converged .and. solres(:)%stagConverged)) then ! no solution found - if (cutBackLevel < maxCutBack) then ! do cut back - write(6,'(/,a)') ' cut back detected' - cutBack = .True. - stepFraction = (stepFraction - 1) * subStepFactor ! adjust to new denominator - cutBackLevel = cutBackLevel + 1 - time = time - timeinc ! rewind time - timeinc = timeinc/2.0_pReal - else ! default behavior, exit if spectral solver does not converge - call IO_warning(850) - call quit(-1*(lastRestartWritten+1)) ! quit and provide information about last restart inc written - endif - else - guess = .true. ! start guessing after first converged (sub)inc - timeIncOld = timeinc + cutBack = .False. + if(.not. all(solres(:)%converged .and. solres(:)%stagConverged)) then ! no solution found + if (cutBackLevel < maxCutBack) then ! do cut back + write(6,'(/,a)') ' cut back detected' + cutBack = .True. + stepFraction = (stepFraction - 1) * subStepFactor ! adjust to new denominator + cutBackLevel = cutBackLevel + 1 + time = time - timeinc ! rewind time + timeinc = timeinc/2.0_pReal + else ! default behavior, exit if spectral solver does not converge + call IO_warning(850) + call quit(1) ! quit endif - if (.not. cutBack) then - if (worldrank == 0) write(statUnit,*) totalIncsCounter, time, cutBackLevel, & - solres%converged, solres%iterationsNeeded ! write statistics about accepted solution - endif - enddo subStepLooping - - cutBackLevel = max(0, cutBackLevel - 1) ! try half number of subincs next inc - - if (all(solres(:)%converged)) then - convergedCounter = convergedCounter + 1 - write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report converged inc - ' increment ', totalIncsCounter, ' converged' else - notConvergedCounter = notConvergedCounter + 1 - write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report non-converged inc - ' increment ', totalIncsCounter, ' NOT converged' - endif; flush(6) - - if (mod(inc,loadCases(currentLoadCase)%outputFrequency) == 0) then ! at output frequency - write(6,'(1/,a)') ' ... writing results to file ......................................' - call CPFEM_results(totalIncsCounter,time) + guess = .true. ! start guessing after first converged (sub)inc + timeIncOld = timeinc endif - if ( loadCases(currentLoadCase)%restartFrequency > 0 & ! writing of restart info requested ... - .and. mod(inc,loadCases(currentLoadCase)%restartFrequency) == 0) then ! ... and at frequency of writing restart information - restartWrite = .true. ! set restart parameter for FEsolving - lastRestartWritten = inc ! first call to CPFEM_general will write + if (.not. cutBack) then + if (worldrank == 0) write(statUnit,*) totalIncsCounter, time, cutBackLevel, & + solres%converged, solres%iterationsNeeded ! write statistics about accepted solution endif + enddo subStepLooping + + cutBackLevel = max(0, cutBackLevel - 1) ! try half number of subincs next inc + + if (all(solres(:)%converged)) then + convergedCounter = convergedCounter + 1 + write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report converged inc + ' increment ', totalIncsCounter, ' converged' + else + notConvergedCounter = notConvergedCounter + 1 + write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report non-converged inc + ' increment ', totalIncsCounter, ' NOT converged' + endif; flush(6) + + if (mod(inc,loadCases(currentLoadCase)%outputFrequency) == 0) then ! at output frequency + write(6,'(1/,a)') ' ... writing results to file ......................................' + call CPFEM_results(totalIncsCounter,time) + endif - endif skipping enddo incLooping From dfe65e406dbe0dd3fb60ec5ea994f1db1d41aa09 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 23 Oct 2019 22:09:11 +0200 Subject: [PATCH 069/233] restart for commercial FE solvers untested better no code than unreliable code. If functionality is needed, implement it without the use of publicly writeable variables --- src/FEsolving.f90 | 74 +++++---------------------------------------- src/IO.f90 | 19 +++++------- src/mesh_abaqus.f90 | 2 +- src/mesh_marc.f90 | 6 ++-- 4 files changed, 19 insertions(+), 82 deletions(-) diff --git a/src/FEsolving.f90 b/src/FEsolving.f90 index 63026b3a6..491044b0e 100644 --- a/src/FEsolving.f90 +++ b/src/FEsolving.f90 @@ -5,17 +5,13 @@ !-------------------------------------------------------------------------------------------------- module FEsolving use prec - use debug use IO use DAMASK_interface implicit none private - logical, public :: & -#if defined(Marc4DAMASK) || defined(Abaqus) - restartRead = .false., & !< restart information to continue calculation from saved state -#endif + logical, public :: & restartWrite = .false., & !< write current state to enable restart terminallyIll = .false. !< at least one material point is terminally ill @@ -27,8 +23,6 @@ module FEsolving #if defined(Marc4DAMASK) || defined(Abaqus) logical, public, protected :: & symmetricSolver = .false. !< use a symmetric FEM solver (only Abaqus) - character(len=1024), public :: & - modelName !< needs description logical, dimension(:,:), allocatable, public :: & calcMode !< do calculation or simply collect when using ping pong scheme @@ -40,86 +34,32 @@ contains #if defined(Marc4DAMASK) || defined(Abaqus) !-------------------------------------------------------------------------------------------------- -!> @brief determine whether a symmetric solver is used and whether restart is requested -!> @details restart information is found in input file in case of FEM solvers, in case of spectal -!> solver the information is provided by the interface module +!> @brief determine whether a symmetric solver is used !-------------------------------------------------------------------------------------------------- subroutine FE_init integer, parameter :: & FILEUNIT = 222 - integer :: j - character(len=65536) :: tag, line + character(len=pStringLen) :: tag, line integer, allocatable, dimension(:) :: chunkPos write(6,'(/,a)') ' <<<+- FEsolving init -+>>>' - modelName = getSolverJobName() - call IO_open_inputFile(FILEUNIT,modelName) + call IO_open_inputFile(FILEUNIT) rewind(FILEUNIT) do - read (FILEUNIT,'(a1024)',END=100) line + read (FILEUNIT,'(a256)',END=100) line chunkPos = IO_stringPos(line) - tag = IO_lc(IO_stringValue(line,chunkPos,1)) ! extract key + tag = IO_lc(IO_stringValue(line,chunkPos,1)) select case(tag) case ('solver') - read (FILEUNIT,'(a1024)',END=100) line ! next line + read (FILEUNIT,'(a256)',END=100) line ! next line chunkPos = IO_stringPos(line) symmetricSolver = (IO_intValue(line,chunkPos,2) /= 1) - case ('restart') - read (FILEUNIT,'(a1024)',END=100) line ! next line - chunkPos = IO_stringPos(line) - restartWrite = iand(IO_intValue(line,chunkPos,1),1) > 0 - restartRead = iand(IO_intValue(line,chunkPos,1),2) > 0 - case ('*restart') - do j=2,chunkPos(1) - restartWrite = (IO_lc(IO_StringValue(line,chunkPos,j)) == 'write') .or. restartWrite - restartRead = (IO_lc(IO_StringValue(line,chunkPos,j)) == 'read') .or. restartRead - enddo - if(restartWrite) then - do j=2,chunkPos(1) - restartWrite = (IO_lc(IO_StringValue(line,chunkPos,j)) /= 'frequency=0') .and. restartWrite - enddo - endif end select enddo 100 close(FILEUNIT) - if (restartRead) then -#ifdef Marc4DAMASK - call IO_open_logFile(FILEUNIT) - rewind(FILEUNIT) - do - read (FILEUNIT,'(a1024)',END=200) line - chunkPos = IO_stringPos(line) - if ( IO_lc(IO_stringValue(line,chunkPos,1)) == 'restart' & - .and. IO_lc(IO_stringValue(line,chunkPos,2)) == 'file' & - .and. IO_lc(IO_stringValue(line,chunkPos,3)) == 'job' & - .and. IO_lc(IO_stringValue(line,chunkPos,4)) == 'id' ) & - modelName = IO_StringValue(line,chunkPos,6) - enddo -#else - call IO_open_inputFile(FILEUNIT,modelName) - rewind(FILEUNIT) - do - read (FILEUNIT,'(a1024)',END=200) line - chunkPos = IO_stringPos(line) - if (IO_lc(IO_stringValue(line,chunkPos,1))=='*heading') then - read (FILEUNIT,'(a1024)',END=200) line - chunkPos = IO_stringPos(line) - modelName = IO_StringValue(line,chunkPos,1) - endif - enddo -#endif - 200 close(FILEUNIT) - endif - - if (iand(debug_level(debug_FEsolving),debug_levelBasic) /= 0) then - write(6,'(a21,l1)') ' restart writing: ', restartWrite - write(6,'(a21,l1)') ' restart reading: ', restartRead - if (restartRead) write(6,'(a,/)') ' restart Job: '//trim(modelName) - endif - end subroutine FE_init #endif diff --git a/src/IO.f90 b/src/IO.f90 index 5d96e67d2..d5ab35825 100644 --- a/src/IO.f90 +++ b/src/IO.f90 @@ -207,27 +207,26 @@ end function IO_open_binary !-------------------------------------------------------------------------------------------------- !> @brief opens FEM input file for reading located in current working directory to given unit !-------------------------------------------------------------------------------------------------- -subroutine IO_open_inputFile(fileUnit,modelName) +subroutine IO_open_inputFile(fileUnit) integer, intent(in) :: fileUnit !< file unit - character(len=*), intent(in) :: modelName !< model name, in case of restart not solver job name integer :: myStat character(len=1024) :: path #if defined(Abaqus) integer :: fileType - + fileType = 1 ! assume .pes - path = trim(modelName)//inputFileExtension(fileType) ! attempt .pes, if it exists: it should be used + path = trim(getSolverJobName())//inputFileExtension(fileType) ! attempt .pes, if it exists: it should be used open(fileUnit+1,status='old',iostat=myStat,file=path,action='read',position='rewind') if(myStat /= 0) then ! if .pes does not work / exist; use conventional extension, i.e.".inp" fileType = 2 - path = trim(modelName)//inputFileExtension(fileType) + path = trim(getSolverJobName())//inputFileExtension(fileType) open(fileUnit+1,status='old',iostat=myStat,file=path,action='read',position='rewind') endif if (myStat /= 0) call IO_error(100,el=myStat,ext_msg=path) - path = trim(modelName)//inputFileExtension(fileType)//'_assembly' + path = trim(getSolverJobName())//inputFileExtension(fileType)//'_assembly' open(fileUnit,iostat=myStat,file=path) if (myStat /= 0) call IO_error(100,el=myStat,ext_msg=path) if (.not.abaqus_assembleInputFile(fileUnit,fileUnit+1)) call IO_error(103) ! strip comments and concatenate any "include"s @@ -258,10 +257,8 @@ subroutine IO_open_inputFile(fileUnit,modelName) fname = trim(line(9+scan(line(9:),'='):)) inquire(file=fname, exist=fexist) if (.not.(fexist)) then - !$OMP CRITICAL (write2out) - write(6,*)'ERROR: file does not exist error in abaqus_assembleInputFile' - write(6,*)'filename: ', trim(fname) - !$OMP END CRITICAL (write2out) + write(6,*)'ERROR: file does not exist error in abaqus_assembleInputFile' + write(6,*)'filename: ', trim(fname) createSuccess = .false. return endif @@ -285,7 +282,7 @@ subroutine IO_open_inputFile(fileUnit,modelName) end function abaqus_assembleInputFile #elif defined(Marc4DAMASK) - path = trim(modelName)//inputFileExtension + path = trim(getSolverJobName())//inputFileExtension open(fileUnit,status='old',iostat=myStat,file=path) if (myStat /= 0) call IO_error(100,el=myStat,ext_msg=path) #endif diff --git a/src/mesh_abaqus.f90 b/src/mesh_abaqus.f90 index 1bbb008d6..15332b3fb 100644 --- a/src/mesh_abaqus.f90 +++ b/src/mesh_abaqus.f90 @@ -454,7 +454,7 @@ subroutine mesh_init(ip,el) myDebug = (iand(debug_level(debug_mesh),debug_levelBasic) /= 0) - call IO_open_inputFile(FILEUNIT,modelName) ! parse info from input file... + call IO_open_inputFile(FILEUNIT) ! parse info from input file... if (myDebug) write(6,'(a)') ' Opened input file'; flush(6) noPart = hasNoPart(FILEUNIT) call mesh_abaqus_count_nodesAndElements(FILEUNIT) diff --git a/src/mesh_marc.f90 b/src/mesh_marc.f90 index 66906207a..7430ad4b9 100644 --- a/src/mesh_marc.f90 +++ b/src/mesh_marc.f90 @@ -201,9 +201,9 @@ subroutine inputRead(elem,node0_elem,connectivity_elem,microstructureAt,homogeni character(len=64), dimension(:), allocatable :: & nameElemSet integer, dimension(:,:), allocatable :: & - mapElemSet !< list of elements in elementSet + mapElemSet !< list of elements in elementSet - inputFile = IO_read_ASCII(trim(modelName)//trim(InputFileExtension)) + inputFile = IO_read_ASCII(trim(getSolverJobName())//trim(InputFileExtension)) call inputRead_fileFormat(fileFormatVersion, & inputFile) call inputRead_tableStyles(initialcondTableStyle,hypoelasticTableStyle, & @@ -214,7 +214,7 @@ subroutine inputRead(elem,node0_elem,connectivity_elem,microstructureAt,homogeni call inputRead_NnodesAndElements(nNodes,nElems,& inputFile) - call IO_open_inputFile(FILEUNIT,modelName) ! ToDo: It would be better to use fileContent + call IO_open_inputFile(FILEUNIT) ! ToDo: It would be better to use fileContent call inputRead_mapElemSets(nameElemSet,mapElemSet,& FILEUNIT) From 52190382ac3e4bdc8c70d29fc8039156f9110d61 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 23 Oct 2019 22:38:17 +0200 Subject: [PATCH 070/233] cleaning --- src/grid/DAMASK_grid.f90 | 3 ++- src/grid/spectral_utilities.f90 | 9 +++++---- src/mesh/FEM_mech.f90 | 2 +- src/mesh/FEM_utilities.f90 | 2 -- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index f875d5941..573cba13e 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -76,7 +76,8 @@ program DAMASK_spectral myStat, & statUnit = 0, & !< file unit for statistics output lastRestartWritten = 0, & !< total increment # at which last restart information was written - stagIter + stagIter, & + nActiveFields = 0 character(len=6) :: loadcase_string character(len=1024) :: & incInfo diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index bb1c70f90..8f47f03ac 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -24,7 +24,6 @@ module spectral_utilities include 'fftw3-mpi.f03' logical, public :: cutBack = .false. !< cut back of BVP solver in case convergence is not achieved or a material point is terminally ill - integer, public :: nActiveFields = 0 !-------------------------------------------------------------------------------------------------- ! field labels information @@ -38,11 +37,13 @@ module spectral_utilities !-------------------------------------------------------------------------------------------------- ! grid related information information - real(pReal), public :: wgt !< weighting factor 1/Nelems + real(pReal), protected, public :: wgt !< weighting factor 1/Nelems + integer, protected, public :: grid1Red !< grid(1)/2 + real(pReal), protected, public, dimension(3) :: scaledGeomSize !< scaled geometry size for calculation of divergence !-------------------------------------------------------------------------------------------------- ! variables storing information for spectral method and FFTW - integer, public :: grid1Red !< grid(1)/2 + real (C_DOUBLE), public, dimension(:,:,:,:,:), pointer :: tensorField_real !< real representation (some stress or deformation) of field_fourier complex(C_DOUBLE_COMPLEX),public, dimension(:,:,:,:,:), pointer :: tensorField_fourier !< field on which the Fourier transform operates real(C_DOUBLE), public, dimension(:,:,:,:), pointer :: vectorField_real !< vector field real representation for fftw @@ -53,7 +54,7 @@ module spectral_utilities complex(pReal), private, dimension(:,:,:,:), allocatable :: xi1st !< wave vector field for first derivatives complex(pReal), private, dimension(:,:,:,:), allocatable :: xi2nd !< wave vector field for second derivatives real(pReal), private, dimension(3,3,3,3) :: C_ref !< mechanic reference stiffness - real(pReal), protected, public, dimension(3) :: scaledGeomSize !< scaled geometry size for calculation of divergence (Basic, Basic PETSc) + !-------------------------------------------------------------------------------------------------- ! plans for FFTW diff --git a/src/mesh/FEM_mech.f90 b/src/mesh/FEM_mech.f90 index eca81ab36..3a19f67c7 100644 --- a/src/mesh/FEM_mech.f90 +++ b/src/mesh/FEM_mech.f90 @@ -62,7 +62,7 @@ module FEM_mech contains !-------------------------------------------------------------------------------------------------- -!> @brief allocates all neccessary fields and fills them with data, potentially from restart info +!> @brief allocates all neccessary fields and fills them with data !-------------------------------------------------------------------------------------------------- subroutine FEM_mech_init(fieldBC) diff --git a/src/mesh/FEM_utilities.f90 b/src/mesh/FEM_utilities.f90 index 70d347b2f..1303f0df8 100644 --- a/src/mesh/FEM_utilities.f90 +++ b/src/mesh/FEM_utilities.f90 @@ -77,7 +77,6 @@ module FEM_utilities real(pReal) :: time = 0.0_pReal !< length of increment integer :: incs = 0, & !< number of increments outputfrequency = 1, & !< frequency of result writes - restartfrequency = 0, & !< frequency of restart writes logscale = 0 !< linear/logarithmic time inc flag logical :: followFormerTrajectory = .true. !< follow trajectory of former loadcase integer, allocatable :: faceID(:) @@ -145,7 +144,6 @@ subroutine utilities_constitutiveResponse(timeinc,P_av,forwardData) call materialpoint_stressAndItsTangent(.true.,timeinc) ! calculate P field - restartWrite = .false. ! reset restartWrite status cutBack = .false. ! reset cutBack status P_av = sum(sum(materialpoint_P,dim=4),dim=3) * wgt ! average of P From 67228b46a65e404cbb2000a0edd1252a66a460ee Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 23 Oct 2019 22:50:01 +0200 Subject: [PATCH 071/233] modularize --- src/grid/grid_mech_spectral_basic.f90 | 10 ++++-- src/grid/grid_mech_spectral_polarisation.f90 | 6 ++-- src/grid/spectral_utilities.f90 | 34 ++++++++++++-------- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 54190cc30..f27079137 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -190,7 +190,8 @@ subroutine grid_mech_spectral_basic_init call MPI_File_close(fileUnit,ierr) endif restartRead2 - call utilities_updateGamma(C_minMaxAvg,.true.) + call utilities_updateGamma(C_minMaxAvg) + call utilities_saveReferenceStiffness end subroutine grid_mech_spectral_basic_init @@ -222,8 +223,11 @@ function grid_mech_spectral_basic_solution(incInfoIn,timeinc,timeinc_old,stress_ !-------------------------------------------------------------------------------------------------- ! update stiffness (and gamma operator) S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg) - if (num%update_gamma) call utilities_updateGamma(C_minMaxAvg,restartWrite) - + if (num%update_gamma) then + call utilities_updateGamma(C_minMaxAvg) + if(restartWrite) call utilities_saveReferenceStiffness + endif + !-------------------------------------------------------------------------------------------------- ! set module wide available data params%stress_mask = stress_BC%maskFloat diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index e0f12c9ee..a5cfcb012 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -203,7 +203,8 @@ subroutine grid_mech_spectral_polarisation_init call MPI_File_close(fileUnit,ierr) endif restartRead2 - call utilities_updateGamma(C_minMaxAvg,.true.) + call utilities_updateGamma(C_minMaxAvg) + call utilities_saveReferenceStiffness C_scale = C_minMaxAvg S_scale = math_invSym3333(C_minMaxAvg) @@ -238,7 +239,8 @@ function grid_mech_spectral_polarisation_solution(incInfoIn,timeinc,timeinc_old, ! update stiffness (and gamma operator) S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg) if (num%update_gamma) then - call utilities_updateGamma(C_minMaxAvg,restartWrite) + call utilities_updateGamma(C_minMaxAvg) + if(restartWrite) call utilities_saveReferenceStiffness C_scale = C_minMaxAvg S_scale = math_invSym3333(C_minMaxAvg) endif diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 8f47f03ac..74060920b 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -158,12 +158,11 @@ module spectral_utilities utilities_calculateRate, & utilities_forwardField, & utilities_updateCoords, & + utilities_saveReferenceStiffness, & FIELD_UNDEFINED_ID, & FIELD_MECH_ID, & FIELD_THERMAL_ID, & FIELD_DAMAGE_ID - private :: & - utilities_getFreqDerivative contains @@ -390,27 +389,18 @@ end subroutine utilities_init !> @details Sets the current reference stiffness to the stiffness given as an argument. !> If the gamma operator is precalculated, it is calculated with this stiffness. !> In case of an on-the-fly calculation, only the reference stiffness is updated. -!> Also writes out the current reference stiffness for restart. !--------------------------------------------------------------------------------------------------- -subroutine utilities_updateGamma(C,saveReference) +subroutine utilities_updateGamma(C) real(pReal), intent(in), dimension(3,3,3,3) :: C !< input stiffness to store as reference stiffness - logical , intent(in) :: saveReference !< save reference stiffness to file for restart complex(pReal), dimension(3,3) :: temp33_complex, xiDyad_cmplx real(pReal), dimension(6,6) :: A, A_inv integer :: & i, j, k, & - l, m, n, o, & - fileUnit + l, m, n, o logical :: err C_ref = C - if (saveReference .and. worldrank == 0) then - write(6,'(/,a)') ' writing reference stiffness to file' - flush(6) - fileUnit = IO_open_jobFile_binary('C_ref','w') - write(fileUnit) C_ref; close(fileUnit) - endif if(.not. num%memory_efficient) then gamma_hat = cmplx(0.0_pReal,0.0_pReal,pReal) ! for the singular point and any non invertible A @@ -1130,4 +1120,22 @@ subroutine utilities_updateCoords(F) end subroutine utilities_updateCoords + +!--------------------------------------------------------------------------------------------------- +!> @brief Write out the current reference stiffness for restart. +!--------------------------------------------------------------------------------------------------- +subroutine utilities_saveReferenceStiffness + + integer :: & + fileUnit + + if (worldrank == 0) then + write(6,'(/,a)') ' writing reference stiffness to file' + flush(6) + fileUnit = IO_open_jobFile_binary('C_ref','w') + write(fileUnit) C_ref; close(fileUnit) + endif + +end subroutine utilities_saveReferenceStiffness + end module spectral_utilities From 534073358e500e189add08f4158f9eea4f100d93 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 23 Oct 2019 23:06:47 +0200 Subject: [PATCH 072/233] arguments are better than public variables --- src/CPFEM2.f90 | 6 ++++-- src/grid/grid_mech_FEM.f90 | 2 +- src/grid/grid_mech_spectral_basic.f90 | 8 ++++---- src/grid/grid_mech_spectral_polarisation.f90 | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index 04a829163..757abc9d4 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -122,8 +122,10 @@ end subroutine CPFEM_init !-------------------------------------------------------------------------------------------------- !> @brief forwards data after successful increment !-------------------------------------------------------------------------------------------------- -subroutine CPFEM_age - +subroutine CPFEM_age(restartWrite) + + logical :: restartWrite + integer :: i, ph, homog, mySource character(len=32) :: rankStr, PlasticItem, HomogItem integer(HID_T) :: fileHandle, groupPlastic, groupHomog diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index a479319c3..6b5b635bf 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -325,7 +325,7 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat call HDF5_closeFile(fileHandle) endif - call CPFEM_age ! age state and kinematics + call CPFEM_age(restartWrite) ! age state and kinematics call utilities_updateCoords(F) C_volAvgLastInc = C_volAvg diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index f27079137..9eab82775 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -303,7 +303,7 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi call HDF5_closeFile(fileHandle) endif - call CPFEM_age ! age state and kinematics + call CPFEM_age(restartWrite) ! age state and kinematics call utilities_updateCoords(F) C_volAvgLastInc = C_volAvg @@ -314,13 +314,13 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi !-------------------------------------------------------------------------------------------------- ! calculate rate for aim - if (deformation_BC%myType=='l') then ! calculate F_aimDot from given L and current F + if (deformation_BC%myType=='l') then ! calculate F_aimDot from given L and current F F_aimDot = & F_aimDot + deformation_BC%maskFloat * matmul(deformation_BC%values, F_aim_lastInc) - elseif(deformation_BC%myType=='fdot') then ! F_aimDot is prescribed + elseif(deformation_BC%myType=='fdot') then ! F_aimDot is prescribed F_aimDot = & F_aimDot + deformation_BC%maskFloat * deformation_BC%values - elseif (deformation_BC%myType=='f') then ! aim at end of load case is prescribed + elseif (deformation_BC%myType=='f') then ! aim at end of load case is prescribed F_aimDot = & F_aimDot + deformation_BC%maskFloat * (deformation_BC%values - F_aim_lastInc)/loadCaseTime endif diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index a5cfcb012..ce7306510 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -325,7 +325,7 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa call HDF5_closeFile(fileHandle) endif - call CPFEM_age ! age state and kinematics + call CPFEM_age(restartWrite) ! age state and kinematics call utilities_updateCoords(F) C_volAvgLastInc = C_volAvg From a90e48175cda7942ecf4360fe83a067d8a2c1014 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 23 Oct 2019 23:10:26 +0200 Subject: [PATCH 073/233] hopefully nonlocalfcc stops failing --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 214c69be8..7d195ce3b 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 214c69be8b51adb39eb7ad25b139727c8b98afce +Subproject commit 7d195ce3b159f75cff59329a5149a78fc24e4048 From 0483fc7b3f421d911c172e0ce7a8e9aed6f93f15 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 06:16:42 +0200 Subject: [PATCH 074/233] small functions with one task are better --- src/CPFEM2.f90 | 91 ++++++++++---------- src/grid/grid_mech_FEM.f90 | 15 ++-- src/grid/grid_mech_spectral_basic.f90 | 17 ++-- src/grid/grid_mech_spectral_polarisation.f90 | 20 +++-- 4 files changed, 75 insertions(+), 68 deletions(-) diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index 757abc9d4..db22748ce 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -35,7 +35,8 @@ module CPFEM2 public :: & CPFEM_age, & CPFEM_initAll, & - CPFEM_results + CPFEM_results, & + CPFEM_restartWrite contains @@ -120,15 +121,11 @@ end subroutine CPFEM_init !-------------------------------------------------------------------------------------------------- -!> @brief forwards data after successful increment +!> @brief Forward data after successful increment. !-------------------------------------------------------------------------------------------------- -subroutine CPFEM_age(restartWrite) - - logical :: restartWrite +subroutine CPFEM_age - integer :: i, ph, homog, mySource - character(len=32) :: rankStr, PlasticItem, HomogItem - integer(HID_T) :: fileHandle, groupPlastic, groupHomog + integer :: i, homog, mySource if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0) & write(6,'(a)') '<< CPFEM >> aging states' @@ -153,46 +150,52 @@ subroutine CPFEM_age(restartWrite) damageState (homog)%state0 = damageState (homog)%state enddo - if (restartWrite) then - if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0) & - write(6,'(a)') '<< CPFEM >> writing restart variables of last converged step to hdf5 file' - - write(rankStr,'(a1,i0)')'_',worldrank - fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','a') - - call HDF5_write(fileHandle,crystallite_F0, 'convergedF') - call HDF5_write(fileHandle,crystallite_Fp0, 'convergedFp') - call HDF5_write(fileHandle,crystallite_Fi0, 'convergedFi') - call HDF5_write(fileHandle,crystallite_Lp0, 'convergedLp') - call HDF5_write(fileHandle,crystallite_Li0, 'convergedLi') - call HDF5_write(fileHandle,crystallite_S0, 'convergedS') - - groupPlastic = HDF5_addGroup(fileHandle,'PlasticPhases') - do ph = 1,size(phase_plasticity) - write(PlasticItem,*) ph,'_' - call HDF5_write(groupPlastic,plasticState(ph)%state0,trim(PlasticItem)//'convergedStateConst') - enddo - call HDF5_closeGroup(groupPlastic) - - groupHomog = HDF5_addGroup(fileHandle,'HomogStates') - do homog = 1, material_Nhomogenization - write(HomogItem,*) homog,'_' - call HDF5_write(groupHomog,homogState(homog)%state0,trim(HomogItem)//'convergedStateHomog') - enddo - call HDF5_closeGroup(groupHomog) - - call HDF5_closeFile(fileHandle) - restartWrite = .false. - endif - - if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0) & - write(6,'(a)') '<< CPFEM >> done aging states' - end subroutine CPFEM_age !-------------------------------------------------------------------------------------------------- -!> @brief triggers writing of the results +!> @brief Store DAMASK restart data. +!-------------------------------------------------------------------------------------------------- +subroutine CPFEM_restartWrite + + integer :: ph, homog + character(len=32) :: rankStr, PlasticItem, HomogItem + integer(HID_T) :: fileHandle, groupPlastic, groupHomog + + if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0) & + write(6,'(a)') '<< CPFEM >> writing restart variables of last converged step to hdf5 file' + + write(rankStr,'(a1,i0)')'_',worldrank + fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','a') + + call HDF5_write(fileHandle,crystallite_F0, 'convergedF') + call HDF5_write(fileHandle,crystallite_Fp0, 'convergedFp') + call HDF5_write(fileHandle,crystallite_Fi0, 'convergedFi') + call HDF5_write(fileHandle,crystallite_Lp0, 'convergedLp') + call HDF5_write(fileHandle,crystallite_Li0, 'convergedLi') + call HDF5_write(fileHandle,crystallite_S0, 'convergedS') + + groupPlastic = HDF5_addGroup(fileHandle,'PlasticPhases') + do ph = 1,size(phase_plasticity) + write(PlasticItem,*) ph,'_' + call HDF5_write(groupPlastic,plasticState(ph)%state0,trim(PlasticItem)//'convergedStateConst') + enddo + call HDF5_closeGroup(groupPlastic) + + groupHomog = HDF5_addGroup(fileHandle,'HomogStates') + do homog = 1, material_Nhomogenization + write(HomogItem,*) homog,'_' + call HDF5_write(groupHomog,homogState(homog)%state0,trim(HomogItem)//'convergedStateHomog') + enddo + call HDF5_closeGroup(groupHomog) + + call HDF5_closeFile(fileHandle) + +end subroutine CPFEM_restartWrite + + +!-------------------------------------------------------------------------------------------------- +!> @brief Trigger writing of results. !-------------------------------------------------------------------------------------------------- subroutine CPFEM_results(inc,time) diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 6b5b635bf..f470249aa 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -301,10 +301,11 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat call DMDAVecGetArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr); CHKERRQ(ierr) if (cutBack) then - C_volAvg = C_volAvgLastInc ! QUESTION: where is this required? + C_volAvg = C_volAvgLastInc else - !-------------------------------------------------------------------------------------------------- - ! restart information for spectral solver + call CPFEM_age ! age state and kinematics + call utilities_updateCoords(F) + if (restartWrite) then write(6,'(/,a)') ' writing converged results for restart';flush(6) @@ -323,10 +324,10 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') call HDF5_closeFile(fileHandle) - + + call CPFEM_restartWrite + restartWrite = .false. endif - call CPFEM_age(restartWrite) ! age state and kinematics - call utilities_updateCoords(F) C_volAvgLastInc = C_volAvg @@ -358,7 +359,7 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat F_lastInc = F ! winding F forward materialpoint_F0 = reshape(F_lastInc, [3,3,1,product(grid(1:2))*grid3]) ! set starting condition for materialpoint_stressAndItsTangent - + endif !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 9eab82775..bee07a80b 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -279,11 +279,12 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) if (cutBack) then - C_volAvg = C_volAvgLastInc ! QUESTION: where is this required? - C_minMaxAvg = C_minMaxAvgLastInc ! QUESTION: where is this required? + C_volAvg = C_volAvgLastInc + C_minMaxAvg = C_minMaxAvgLastInc else - !-------------------------------------------------------------------------------------------------- - ! restart information for spectral solver + call CPFEM_age ! age state and kinematics + call utilities_updateCoords(F) + if (restartWrite) then write(6,'(/,a)') ' writing converged results for restart';flush(6) @@ -301,11 +302,11 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi call HDF5_write(fileHandle,C_minMaxAvg, 'C_minMaxAvg') call HDF5_closeFile(fileHandle) + + call CPFEM_restartWrite + restartWrite = .false. endif - - call CPFEM_age(restartWrite) ! age state and kinematics - call utilities_updateCoords(F) - + C_volAvgLastInc = C_volAvg C_minMaxAvgLastInc = C_minMaxAvg diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index ce7306510..200c902c9 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -296,15 +296,16 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa character(len=32) :: rankStr call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) - F => FandF_tau( 0: 8,:,:,:) - F_tau => FandF_tau( 9:17,:,:,:) + F => FandF_tau(0: 8,:,:,:) + F_tau => FandF_tau(9:17,:,:,:) if (cutBack) then - C_volAvg = C_volAvgLastInc ! QUESTION: where is this required? - C_minMaxAvg = C_minMaxAvgLastInc ! QUESTION: where is this required? + C_volAvg = C_volAvgLastInc + C_minMaxAvg = C_minMaxAvgLastInc else - !-------------------------------------------------------------------------------------------------- - ! restart information for spectral solver + call CPFEM_age ! age state and kinematics + call utilities_updateCoords(F) + if (restartWrite) then write(6,'(/,a)') ' writing converged results for restart';flush(6) @@ -323,11 +324,11 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') call HDF5_closeFile(fileHandle) + + call CPFEM_restartWrite + restartWrite = .false. endif - call CPFEM_age(restartWrite) ! age state and kinematics - call utilities_updateCoords(F) - C_volAvgLastInc = C_volAvg C_minMaxAvgLastInc = C_minMaxAvg @@ -357,6 +358,7 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa F_lastInc = reshape(F, [3,3,grid(1),grid(2),grid3]) ! winding F forward F_tau_lastInc = reshape(F_tau, [3,3,grid(1),grid(2),grid3]) ! winding F_tau forward materialpoint_F0 = reshape(F_lastInc, [3,3,1,product(grid(1:2))*grid3]) ! set starting condition for materialpoint_stressAndItsTangent + endif !-------------------------------------------------------------------------------------------------- From 50769b52a58288421ae71202359572f215486320 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 06:32:46 +0200 Subject: [PATCH 075/233] don't continue if calculation did not converge --- src/grid/DAMASK_grid.f90 | 13 +------------ src/mesh/DAMASK_FEM.f90 | 11 ----------- src/numerics.f90 | 6 ------ src/quit.f90 | 1 - 4 files changed, 1 insertion(+), 30 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 573cba13e..5af6e4430 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -70,8 +70,6 @@ program DAMASK_spectral currentLoadcase = 0, & !< current load case inc, & !< current increment in current load case totalIncsCounter = 0, & !< total # of increments - convergedCounter = 0, & !< # of converged increments - notConvergedCounter = 0, & !< # of non-converged increments fileUnit = 0, & !< file unit for reading load case and writing results myStat, & statUnit = 0, & !< file unit for statistics output @@ -508,7 +506,7 @@ program DAMASK_spectral !-------------------------------------------------------------------------------------------------- ! check solution for either advance or retry - if ( (continueCalculation .or. all(solres(:)%converged .and. solres(:)%stagConverged)) & ! don't care or did converge + if ( (all(solres(:)%converged .and. solres(:)%stagConverged)) & ! converged .and. .not. solres(1)%termIll) then ! and acceptable solution found timeIncOld = timeinc cutBack = .false. @@ -537,11 +535,9 @@ program DAMASK_spectral cutBackLevel = max(0, cutBackLevel - 1) ! try half number of subincs next inc if (all(solres(:)%converged)) then - convergedCounter = convergedCounter + 1 write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report converged inc ' increment ', totalIncsCounter, ' converged' else - notConvergedCounter = notConvergedCounter + 1 write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report non-converged inc ' increment ', totalIncsCounter, ' NOT converged' endif; flush(6) @@ -579,16 +575,9 @@ program DAMASK_spectral !-------------------------------------------------------------------------------------------------- ! report summary of whole calculation write(6,'(/,a)') ' ###########################################################################' - write(6,'(1x,'//IO_intOut(convergedCounter)//',a,'//IO_intOut(notConvergedCounter + convergedCounter)//',a,f5.1,a)') & - convergedCounter, ' out of ', & - notConvergedCounter + convergedCounter, ' (', & - real(convergedCounter, pReal)/& - real(notConvergedCounter + convergedCounter,pReal)*100.0_pReal, ' %) increments converged!' - flush(6) call MPI_file_close(fileUnit,ierr) close(statUnit) - if (notConvergedCounter > 0) call quit(2) ! error if some are not converged call quit(0) ! no complains ;) end program DAMASK_spectral diff --git a/src/mesh/DAMASK_FEM.f90 b/src/mesh/DAMASK_FEM.f90 index c56302da0..3d4c332a0 100644 --- a/src/mesh/DAMASK_FEM.f90 +++ b/src/mesh/DAMASK_FEM.f90 @@ -53,8 +53,6 @@ program DAMASK_FEM currentFace = 0, & inc, & !< current increment in current load case totalIncsCounter = 0, & !< total # of increments - convergedCounter = 0, & !< # of converged increments - notConvergedCounter = 0, & !< # of non-converged increments fileUnit = 0, & !< file unit for reading load case and writing results myStat, & statUnit = 0, & !< file unit for statistics output @@ -375,11 +373,9 @@ program DAMASK_FEM cutBackLevel = max(0, cutBackLevel - 1) ! try half number of subincs next inc if (all(solres(:)%converged)) then - convergedCounter = convergedCounter + 1 write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report converged inc ' increment ', totalIncsCounter, ' converged' else - notConvergedCounter = notConvergedCounter + 1 write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report non-converged inc ' increment ', totalIncsCounter, ' NOT converged' endif; flush(6) @@ -398,15 +394,8 @@ program DAMASK_FEM !-------------------------------------------------------------------------------------------------- ! report summary of whole calculation write(6,'(/,a)') ' ###########################################################################' - write(6,'(1x,'//IO_intOut(convergedCounter)//',a,'//IO_intOut(notConvergedCounter + convergedCounter)//',a,f5.1,a)') & - convergedCounter, ' out of ', & - notConvergedCounter + convergedCounter, ' (', & - real(convergedCounter, pReal)/& - real(notConvergedCounter + convergedCounter,pReal)*100.0_pReal, ' %) increments converged!' - flush(6) close(statUnit) - if (notConvergedCounter > 0) call quit(2) ! error if some are not converged call quit(0) ! no complains ;) end program DAMASK_FEM diff --git a/src/numerics.f90 b/src/numerics.f90 index 0f63f87ab..6776ec178 100644 --- a/src/numerics.f90 +++ b/src/numerics.f90 @@ -82,9 +82,6 @@ module numerics &-damage_snes_type ngmres & &-thermal_snes_type ngmres ', & petsc_options = '' - logical, protected, public :: & - continueCalculation = .false. !< false:exit if BVP solver does not converge, true: continue calculation despite BVP solver not converging - #endif !-------------------------------------------------------------------------------------------------- @@ -259,8 +256,6 @@ subroutine numerics_init err_stress_tolrel = IO_floatValue(line,chunkPos,2) case ('err_stress_tolabs') err_stress_tolabs = IO_floatValue(line,chunkPos,2) - case ('continuecalculation') - continueCalculation = IO_intValue(line,chunkPos,2) > 0 case ('petsc_options') petsc_options = trim(line(chunkPos(4):)) case ('err_curl_tolabs') @@ -354,7 +349,6 @@ subroutine numerics_init !-------------------------------------------------------------------------------------------------- ! spectral parameters #ifdef Grid - write(6,'(a24,1x,L8)') ' continueCalculation: ',continueCalculation write(6,'(a24,1x,es8.1)') ' err_stress_tolAbs: ',err_stress_tolAbs write(6,'(a24,1x,es8.1)') ' err_stress_tolRel: ',err_stress_tolRel write(6,'(a24,1x,es8.1)') ' err_div_tolAbs: ',err_div_tolAbs diff --git a/src/quit.f90 b/src/quit.f90 index 5f492de36..146071600 100644 --- a/src/quit.f90 +++ b/src/quit.f90 @@ -42,7 +42,6 @@ subroutine quit(stop_id) dateAndTime(7) if (stop_id == 0 .and. ierr == 0 .and. error == 0) stop 0 ! normal termination - if (stop_id == 2 .and. ierr == 0 .and. error == 0) stop 2 ! not all incs converged stop 1 ! error (message from IO_error) end subroutine quit From c0c0831c927a2d5a85e9a4d16dc393f3e00e77ac Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 06:37:28 +0200 Subject: [PATCH 076/233] multiple keyword are more confusing then helpful --- src/grid/DAMASK_grid.f90 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 5af6e4430..249555048 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -85,7 +85,7 @@ program DAMASK_spectral type(tSolutionState), allocatable, dimension(:) :: solres integer(MPI_OFFSET_KIND) :: fileOffset integer(MPI_OFFSET_KIND), dimension(:), allocatable :: outputSize - integer, parameter :: maxByteOut = 2147483647-4096 !< limit of one file output write https://trac.mpich.org/projects/mpich/ticket/1742 + integer, parameter :: maxByteOut = 2147483647-4096 !< limit of one file output write https://trac.mpich.org/projects/mpich/ticket/1742 integer, parameter :: maxRealOut = maxByteOut/pReal integer(pLongInt), dimension(2) :: outputIndex PetscErrorCode :: ierr @@ -157,11 +157,11 @@ program DAMASK_spectral chunkPos = IO_stringPos(line) do i = 1, chunkPos(1) ! reading compulsory parameters for loadcase select case (IO_lc(IO_stringValue(line,chunkPos,i))) - case('l','velocitygrad','velgrad','velocitygradient','fdot','dotf','f') + case('l','fdot','dotf','f') N_def = N_def + 1 case('t','time','delta') N_t = N_t + 1 - case('n','incs','increments','steps','logincs','logincrements','logsteps') + case('n','incs','increments','logincs','logincrements') N_n = N_n + 1 end select enddo @@ -182,7 +182,7 @@ program DAMASK_spectral readIn: do i = 1, chunkPos(1) select case (IO_lc(IO_stringValue(line,chunkPos,i))) - case('fdot','dotf','l','velocitygrad','velgrad','velocitygradient','f') ! assign values for the deformation BC matrix + case('fdot','dotf','l','f') ! assign values for the deformation BC matrix temp_valueVector = 0.0_pReal if (IO_lc(IO_stringValue(line,chunkPos,i)) == 'fdot'.or. & ! in case of Fdot, set type to fdot IO_lc(IO_stringValue(line,chunkPos,i)) == 'dotf') then @@ -199,7 +199,7 @@ program DAMASK_spectral newLoadCase%deformation%maskLogical = transpose(reshape(temp_maskVector,[ 3,3])) ! logical mask in 3x3 notation newLoadCase%deformation%maskFloat = merge(ones,zeros,newLoadCase%deformation%maskLogical)! float (1.0/0.0) mask in 3x3 notation newLoadCase%deformation%values = math_9to33(temp_valueVector) ! values in 3x3 notation - case('p','pk1','piolakirchhoff','stress', 's') + case('p','stress', 's') temp_valueVector = 0.0_pReal do j = 1, 9 temp_maskVector(j) = IO_stringValue(line,chunkPos,i+j) /= '*' ! true if not an asterisk @@ -210,9 +210,9 @@ program DAMASK_spectral newLoadCase%stress%values = math_9to33(temp_valueVector) case('t','time','delta') ! increment time newLoadCase%time = IO_floatValue(line,chunkPos,i+1) - case('n','incs','increments','steps') ! number of increments + case('n','incs','increments') ! number of increments newLoadCase%incs = IO_intValue(line,chunkPos,i+1) - case('logincs','logincrements','logsteps') ! number of increments (switch to log time scaling) + case('logincs','logincrements') ! number of increments (switch to log time scaling) newLoadCase%incs = IO_intValue(line,chunkPos,i+1) newLoadCase%logscale = 1 case('freq','frequency','outputfreq') ! frequency of result writings From 2652c5358bc95c73360e295b8c5b31f0dd5c9319 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 11:59:12 +0200 Subject: [PATCH 077/233] tests do not use aliases anymore --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 7d195ce3b..751fa67c4 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 7d195ce3b159f75cff59329a5149a78fc24e4048 +Subproject commit 751fa67c4ab4824385d8c497f6ae9bd7506a04b0 From c1cf64bf00f3637b151000ee77d13dfee1c99737 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 12:15:22 +0200 Subject: [PATCH 078/233] was not used/tested --- src/DAMASK_abaqus.f | 1 - src/DAMASK_marc.f90 | 3 +-- src/IO.f90 | 19 ------------------- 3 files changed, 1 insertion(+), 22 deletions(-) diff --git a/src/DAMASK_abaqus.f b/src/DAMASK_abaqus.f index 7a43f688e..e2c56a06e 100644 --- a/src/DAMASK_abaqus.f +++ b/src/DAMASK_abaqus.f @@ -21,7 +21,6 @@ module DAMASK_interface implicit none private character(len=4), dimension(2), parameter, public :: INPUTFILEEXTENSION = ['.pes','.inp'] - character(len=4), parameter, public :: LOGFILEEXTENSION = '.log' public :: & DAMASK_interface_init, & diff --git a/src/DAMASK_marc.f90 b/src/DAMASK_marc.f90 index 09a1c83c8..58c5349c6 100644 --- a/src/DAMASK_marc.f90 +++ b/src/DAMASK_marc.f90 @@ -41,8 +41,7 @@ module DAMASK_interface implicit none private - character(len=4), parameter, public :: InputFileExtension = '.dat' - character(len=4), parameter, public :: LogFileExtension = '.log' + character(len=4), parameter, public :: INPUTFILEEXTENSION = '.dat' public :: & DAMASK_interface_init, & diff --git a/src/IO.f90 b/src/IO.f90 index d5ab35825..d5f0efd4e 100644 --- a/src/IO.f90 +++ b/src/IO.f90 @@ -37,7 +37,6 @@ module IO #if defined(Marc4DAMASK) || defined(Abaqus) public :: & IO_open_inputFile, & - IO_open_logFile, & IO_countContinuousIntValues, & IO_continuousIntValues, & #if defined(Abaqus) @@ -288,24 +287,6 @@ subroutine IO_open_inputFile(fileUnit) #endif end subroutine IO_open_inputFile - - -!-------------------------------------------------------------------------------------------------- -!> @brief opens existing FEM log file for reading to given unit. File is named after solver job -!! name and located in current working directory -!-------------------------------------------------------------------------------------------------- -subroutine IO_open_logFile(fileUnit) - - integer, intent(in) :: fileUnit !< file unit - - integer :: myStat - character(len=1024) :: path - - path = trim(getSolverJobName())//LogFileExtension - open(fileUnit,status='old',iostat=myStat,file=path,action='read',position='rewind') - if (myStat /= 0) call IO_error(100,el=myStat,ext_msg=path) - -end subroutine IO_open_logFile #endif From 176f6028cd91aa73ab563e277225da98184c393d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 13:06:42 +0200 Subject: [PATCH 079/233] CPFE2 writes current variables (like grid solvers) --- src/CPFEM2.f90 | 20 ++++++++++---------- src/grid/DAMASK_grid.f90 | 1 + src/grid/grid_mech_FEM.f90 | 3 +-- src/grid/grid_mech_spectral_basic.f90 | 3 +-- src/grid/grid_mech_spectral_polarisation.f90 | 3 +-- src/grid/spectral_utilities.f90 | 6 +++--- 6 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index db22748ce..b80c3733b 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -162,30 +162,30 @@ subroutine CPFEM_restartWrite character(len=32) :: rankStr, PlasticItem, HomogItem integer(HID_T) :: fileHandle, groupPlastic, groupHomog - if (iand(debug_level(debug_CPFEM), debug_levelBasic) /= 0) & - write(6,'(a)') '<< CPFEM >> writing restart variables of last converged step to hdf5 file' + + write(6,'(a)') 'Writing current constitutive variables for restart to file';flush(6) write(rankStr,'(a1,i0)')'_',worldrank fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','a') - call HDF5_write(fileHandle,crystallite_F0, 'convergedF') - call HDF5_write(fileHandle,crystallite_Fp0, 'convergedFp') - call HDF5_write(fileHandle,crystallite_Fi0, 'convergedFi') - call HDF5_write(fileHandle,crystallite_Lp0, 'convergedLp') - call HDF5_write(fileHandle,crystallite_Li0, 'convergedLi') - call HDF5_write(fileHandle,crystallite_S0, 'convergedS') + call HDF5_write(fileHandle,crystallite_partionedF, 'convergedF') + call HDF5_write(fileHandle,crystallite_Fp, 'convergedFp') + call HDF5_write(fileHandle,crystallite_Fi, 'convergedFi') + call HDF5_write(fileHandle,crystallite_Lp, 'convergedLp') + call HDF5_write(fileHandle,crystallite_Li, 'convergedLi') + call HDF5_write(fileHandle,crystallite_S, 'convergedS') groupPlastic = HDF5_addGroup(fileHandle,'PlasticPhases') do ph = 1,size(phase_plasticity) write(PlasticItem,*) ph,'_' - call HDF5_write(groupPlastic,plasticState(ph)%state0,trim(PlasticItem)//'convergedStateConst') + call HDF5_write(groupPlastic,plasticState(ph)%state,trim(PlasticItem)//'convergedStateConst') enddo call HDF5_closeGroup(groupPlastic) groupHomog = HDF5_addGroup(fileHandle,'HomogStates') do homog = 1, material_Nhomogenization write(HomogItem,*) homog,'_' - call HDF5_write(groupHomog,homogState(homog)%state0,trim(HomogItem)//'convergedStateHomog') + call HDF5_write(groupHomog,homogState(homog)%state,trim(HomogItem)//'convergedStateHomog') enddo call HDF5_closeGroup(groupHomog) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 249555048..a217b0cbc 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -472,6 +472,7 @@ program DAMASK_spectral case(FIELD_DAMAGE_ID); call grid_damage_spectral_forward end select enddo + restartWrite = .false. !-------------------------------------------------------------------------------------------------- ! solve fields diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index f470249aa..1af44c65d 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -307,7 +307,7 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat call utilities_updateCoords(F) if (restartWrite) then - write(6,'(/,a)') ' writing converged results for restart';flush(6) + write(6,'(a)') 'Writing current solver data for restart to file';flush(6) write(rankStr,'(a1,i0)')'_',worldrank fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') @@ -326,7 +326,6 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat call HDF5_closeFile(fileHandle) call CPFEM_restartWrite - restartWrite = .false. endif C_volAvgLastInc = C_volAvg diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index bee07a80b..79c46b07f 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -286,7 +286,7 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi call utilities_updateCoords(F) if (restartWrite) then - write(6,'(/,a)') ' writing converged results for restart';flush(6) + write(6,'(a)') 'Writing current solver data for restart to file';flush(6) write(rankStr,'(a1,i0)')'_',worldrank fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') @@ -304,7 +304,6 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi call HDF5_closeFile(fileHandle) call CPFEM_restartWrite - restartWrite = .false. endif C_volAvgLastInc = C_volAvg diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 200c902c9..21d16369b 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -307,7 +307,7 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa call utilities_updateCoords(F) if (restartWrite) then - write(6,'(/,a)') ' writing converged results for restart';flush(6) + write(6,'(a)') 'Writing current solver data for restart to file';flush(6) write(rankStr,'(a1,i0)')'_',worldrank fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') @@ -326,7 +326,6 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa call HDF5_closeFile(fileHandle) call CPFEM_restartWrite - restartWrite = .false. endif C_volAvgLastInc = C_volAvg diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 74060920b..87543b68c 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -1130,10 +1130,10 @@ subroutine utilities_saveReferenceStiffness fileUnit if (worldrank == 0) then - write(6,'(/,a)') ' writing reference stiffness to file' - flush(6) + write(6,'(a)') 'Writing current reference stiffness for restart to file';flush(6) fileUnit = IO_open_jobFile_binary('C_ref','w') - write(fileUnit) C_ref; close(fileUnit) + write(fileUnit) C_ref + close(fileUnit) endif end subroutine utilities_saveReferenceStiffness From 71def397d5c3070e856c70678ef421df1d1ada0e Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 13:14:40 +0200 Subject: [PATCH 080/233] no need to age before writing restart data --- src/grid/grid_mech_FEM.f90 | 6 ++++-- src/grid/grid_mech_spectral_basic.f90 | 6 ++++-- src/grid/grid_mech_spectral_polarisation.f90 | 9 +++++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 1af44c65d..9169cbc32 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -303,8 +303,7 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat if (cutBack) then C_volAvg = C_volAvgLastInc else - call CPFEM_age ! age state and kinematics - call utilities_updateCoords(F) + if (restartWrite) then write(6,'(a)') 'Writing current solver data for restart to file';flush(6) @@ -327,6 +326,9 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat call CPFEM_restartWrite endif + + call CPFEM_age ! age state and kinematics + call utilities_updateCoords(F) C_volAvgLastInc = C_volAvg diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 79c46b07f..e5d35a5fa 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -282,8 +282,7 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi C_volAvg = C_volAvgLastInc C_minMaxAvg = C_minMaxAvgLastInc else - call CPFEM_age ! age state and kinematics - call utilities_updateCoords(F) + if (restartWrite) then write(6,'(a)') 'Writing current solver data for restart to file';flush(6) @@ -306,6 +305,9 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi call CPFEM_restartWrite endif + call CPFEM_age ! age state and kinematics + call utilities_updateCoords(F) + C_volAvgLastInc = C_volAvg C_minMaxAvgLastInc = C_minMaxAvg diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 21d16369b..ac60d7155 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -303,9 +303,7 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa C_volAvg = C_volAvgLastInc C_minMaxAvg = C_minMaxAvgLastInc else - call CPFEM_age ! age state and kinematics - call utilities_updateCoords(F) - + if (restartWrite) then write(6,'(a)') 'Writing current solver data for restart to file';flush(6) @@ -327,7 +325,10 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa call CPFEM_restartWrite endif - + + call CPFEM_age ! age state and kinematics + call utilities_updateCoords(F) + C_volAvgLastInc = C_volAvg C_minMaxAvgLastInc = C_minMaxAvg From 7c0bb2fdf8daef3d69f0ee3105282d8891de35e8 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 13:37:40 +0200 Subject: [PATCH 081/233] consistent description --- src/CPFEM2.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index b80c3733b..612662611 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -154,7 +154,7 @@ end subroutine CPFEM_age !-------------------------------------------------------------------------------------------------- -!> @brief Store DAMASK restart data. +!> @brief Write current constitutive variables for restart to file. !-------------------------------------------------------------------------------------------------- subroutine CPFEM_restartWrite From 0bc432661862b8343b59e254365c81b147f8060c Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 13:46:36 +0200 Subject: [PATCH 082/233] better have one function per task --- src/grid/DAMASK_grid.f90 | 20 ++--- src/grid/grid_mech_FEM.f90 | 79 ++++++++++++-------- src/grid/grid_mech_spectral_basic.f90 | 70 +++++++++-------- src/grid/grid_mech_spectral_polarisation.f90 | 74 ++++++++++-------- 4 files changed, 139 insertions(+), 104 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index a217b0cbc..6ab24b246 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -119,23 +119,23 @@ program DAMASK_spectral ! assign mechanics solver depending on selected type select case (trim(config_numerics%getString('spectral_solver',defaultVal='basic'))) case ('basic') - mech_init => grid_mech_spectral_basic_init - mech_forward => grid_mech_spectral_basic_forward - mech_solution => grid_mech_spectral_basic_solution + mech_init => grid_mech_spectral_basic_init + mech_forward => grid_mech_spectral_basic_forward + mech_solution => grid_mech_spectral_basic_solution case ('polarisation') if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) & call IO_warning(42, ext_msg='debug Divergence') - mech_init => grid_mech_spectral_polarisation_init - mech_forward => grid_mech_spectral_polarisation_forward - mech_solution => grid_mech_spectral_polarisation_solution + mech_init => grid_mech_spectral_polarisation_init + mech_forward => grid_mech_spectral_polarisation_forward + mech_solution => grid_mech_spectral_polarisation_solution case ('fem') if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) & call IO_warning(42, ext_msg='debug Divergence') - mech_init => grid_mech_FEM_init - mech_forward => grid_mech_FEM_forward - mech_solution => grid_mech_FEM_solution + mech_init => grid_mech_FEM_init + mech_forward => grid_mech_FEM_forward + mech_solution => grid_mech_FEM_solution case default call IO_error(error_ID = 891, ext_msg = config_numerics%getString('spectral_solver')) @@ -472,7 +472,7 @@ program DAMASK_spectral case(FIELD_DAMAGE_ID); call grid_damage_spectral_forward end select enddo - restartWrite = .false. + if (restartWrite .and. .not. cutBack) restartWrite = .false. !-------------------------------------------------------------------------------------------------- ! solve fields diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 9169cbc32..592266f3f 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -71,7 +71,8 @@ module grid_mech_FEM public :: & grid_mech_FEM_init, & grid_mech_FEM_solution, & - grid_mech_FEM_forward + grid_mech_FEM_forward, & + grid_mech_FEM_restartWrite contains @@ -292,10 +293,8 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat real(pReal), dimension(3,3), intent(in) :: & rotation_BC PetscErrorCode :: ierr - integer(HID_T) :: fileHandle - character(len=32) :: rankStr - PetscScalar, pointer, dimension(:,:,:,:) :: & - u_current,u_lastInc + PetscScalar, pointer, dimension(:,:,:,:) :: & + u_current,u_lastInc call DMDAVecGetArrayF90(mech_grid,solution_current,u_current,ierr); CHKERRQ(ierr) call DMDAVecGetArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr); CHKERRQ(ierr) @@ -303,30 +302,7 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat if (cutBack) then C_volAvg = C_volAvgLastInc else - - - if (restartWrite) then - write(6,'(a)') 'Writing current solver data for restart to file';flush(6) - - write(rankStr,'(a1,i0)')'_',worldrank - fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') - - call HDF5_write(fileHandle,F_aim, 'F_aim') - call HDF5_write(fileHandle,F_aim_lastInc, 'F_aim_lastInc') - call HDF5_write(fileHandle,F_aimDot, 'F_aimDot') - call HDF5_write(fileHandle,F, 'F') - call HDF5_write(fileHandle,F_lastInc, 'F_lastInc') - call HDF5_write(fileHandle,u_current, 'u') - call HDF5_write(fileHandle,u_lastInc, 'u_lastInc') - - call HDF5_write(fileHandle,C_volAvg, 'C_volAvg') - call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') - - call HDF5_closeFile(fileHandle) - - call CPFEM_restartWrite - endif - + if (restartWrite) call grid_mech_FEM_restartWrite call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) @@ -368,14 +344,51 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat F_aim = F_aim_lastInc + F_aimDot * timeinc call VecAXPY(solution_current,timeinc,solution_rate,ierr); CHKERRQ(ierr) - call DMDAVecRestoreArrayF90(mech_grid,solution_current,u_current,ierr) - CHKERRQ(ierr) - call DMDAVecRestoreArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr) - CHKERRQ(ierr) + call DMDAVecRestoreArrayF90(mech_grid,solution_current,u_current,ierr);CHKERRQ(ierr) + call DMDAVecRestoreArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr);CHKERRQ(ierr) end subroutine grid_mech_FEM_forward +!-------------------------------------------------------------------------------------------------- +!> @brief Write current solver and constitutive data for restart to file +!-------------------------------------------------------------------------------------------------- +subroutine grid_mech_FEM_restartWrite() + + PetscErrorCode :: ierr + PetscScalar, dimension(:,:,:,:), pointer :: u_current,u_lastInc + integer(HID_T) :: fileHandle + character(len=32) :: rankStr + + call DMDAVecGetArrayF90(mech_grid,solution_current,u_current,ierr); CHKERRQ(ierr) + call DMDAVecGetArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr); CHKERRQ(ierr) + + write(6,'(a)') 'Writing current solver data for restart to file';flush(6) + + write(rankStr,'(a1,i0)')'_',worldrank + fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') + + call HDF5_write(fileHandle,F_aim, 'F_aim') + call HDF5_write(fileHandle,F_aim_lastInc, 'F_aim_lastInc') + call HDF5_write(fileHandle,F_aimDot, 'F_aimDot') + call HDF5_write(fileHandle,F, 'F') + call HDF5_write(fileHandle,F_lastInc, 'F_lastInc') + call HDF5_write(fileHandle,u_current, 'u') + call HDF5_write(fileHandle,u_lastInc, 'u_lastInc') + + call HDF5_write(fileHandle,C_volAvg, 'C_volAvg') + call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') + + call HDF5_closeFile(fileHandle) + + call CPFEM_restartWrite + + call DMDAVecRestoreArrayF90(mech_grid,solution_current,u_current,ierr);CHKERRQ(ierr) + call DMDAVecRestoreArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr);CHKERRQ(ierr) + +end subroutine grid_mech_FEM_restartWrite + + !-------------------------------------------------------------------------------------------------- !> @brief convergence check !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index e5d35a5fa..3feeac46d 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -75,10 +75,9 @@ module grid_mech_spectral_basic public :: & grid_mech_spectral_basic_init, & grid_mech_spectral_basic_solution, & - grid_mech_spectral_basic_forward - private :: & - converged, & - formResidual + grid_mech_spectral_basic_forward, & + grid_mech_spectral_basic_restartWrite + contains @@ -272,9 +271,6 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi rotation_BC PetscErrorCode :: ierr PetscScalar, dimension(:,:,:,:), pointer :: F - - integer(HID_T) :: fileHandle - character(len=32) :: rankStr call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) @@ -282,29 +278,7 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi C_volAvg = C_volAvgLastInc C_minMaxAvg = C_minMaxAvgLastInc else - - - if (restartWrite) then - write(6,'(a)') 'Writing current solver data for restart to file';flush(6) - - write(rankStr,'(a1,i0)')'_',worldrank - fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') - - call HDF5_write(fileHandle,F_aim, 'F_aim') - call HDF5_write(fileHandle,F_aim_lastInc,'F_aim_lastInc') - call HDF5_write(fileHandle,F_aimDot, 'F_aimDot') - call HDF5_write(fileHandle,F, 'F') - call HDF5_write(fileHandle,F_lastInc, 'F_lastInc') - - call HDF5_write(fileHandle,C_volAvg, 'C_volAvg') - call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') - call HDF5_write(fileHandle,C_minMaxAvg, 'C_minMaxAvg') - - call HDF5_closeFile(fileHandle) - - call CPFEM_restartWrite - endif - + call grid_mech_spectral_basic_restartWrite call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) @@ -345,6 +319,42 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi end subroutine grid_mech_spectral_basic_forward +!-------------------------------------------------------------------------------------------------- +!> @brief Write current solver and constitutive data for restart to file +!-------------------------------------------------------------------------------------------------- +subroutine grid_mech_spectral_basic_restartWrite() + + PetscErrorCode :: ierr + PetscScalar, dimension(:,:,:,:), pointer :: F + integer(HID_T) :: fileHandle + character(len=32) :: rankStr + + call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) + + write(6,'(a)') 'Writing current solver data for restart to file';flush(6) + + write(rankStr,'(a1,i0)')'_',worldrank + fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') + + call HDF5_write(fileHandle,F_aim, 'F_aim') + call HDF5_write(fileHandle,F_aim_lastInc,'F_aim_lastInc') + call HDF5_write(fileHandle,F_aimDot, 'F_aimDot') + call HDF5_write(fileHandle,F, 'F') + call HDF5_write(fileHandle,F_lastInc, 'F_lastInc') + + call HDF5_write(fileHandle,C_volAvg, 'C_volAvg') + call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') + call HDF5_write(fileHandle,C_minMaxAvg, 'C_minMaxAvg') + + call HDF5_closeFile(fileHandle) + + call CPFEM_restartWrite + + call DMDAVecRestoreArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) + +end subroutine grid_mech_spectral_basic_restartWrite + + !-------------------------------------------------------------------------------------------------- !> @brief convergence check !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index ac60d7155..7d3e664f7 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -81,10 +81,8 @@ module grid_mech_spectral_polarisation public :: & grid_mech_spectral_polarisation_init, & grid_mech_spectral_polarisation_solution, & - grid_mech_spectral_polarisation_forward - private :: & - converged, & - formResidual + grid_mech_spectral_polarisation_forward, & + grid_mech_spectral_polarisation_restartWrite contains @@ -292,9 +290,6 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa integer :: i, j, k real(pReal), dimension(3,3) :: F_lambda33 - integer(HID_T) :: fileHandle - character(len=32) :: rankStr - call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) F => FandF_tau(0: 8,:,:,:) F_tau => FandF_tau(9:17,:,:,:) @@ -303,29 +298,7 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa C_volAvg = C_volAvgLastInc C_minMaxAvg = C_minMaxAvgLastInc else - - if (restartWrite) then - write(6,'(a)') 'Writing current solver data for restart to file';flush(6) - - write(rankStr,'(a1,i0)')'_',worldrank - fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') - - call HDF5_write(fileHandle,F_aim, 'F_aim') - call HDF5_write(fileHandle,F_aim_lastInc, 'F_aim_lastInc') - call HDF5_write(fileHandle,F_aimDot, 'F_aimDot') - call HDF5_write(fileHandle,F, 'F') - call HDF5_write(fileHandle,F_lastInc, 'F_lastInc') - call HDF5_write(fileHandle,F_tau, 'F_tau') - call HDF5_write(fileHandle,F_tau_lastInc, 'F_tau_lastInc') - - call HDF5_write(fileHandle,C_volAvg, 'C_volAvg') - call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') - - call HDF5_closeFile(fileHandle) - - call CPFEM_restartWrite - endif - + call grid_mech_spectral_polarisation_restartWrite call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) @@ -335,7 +308,7 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa F_aimDot = merge(stress_BC%maskFloat*(F_aim-F_aim_lastInc)/timeinc_old, 0.0_pReal, guess) F_aim_lastInc = F_aim - !-------------------------------------------------------------------------------------------------- + !----------------------------------------------------------------------------------------------- ! calculate rate for aim if (deformation_BC%myType=='l') then ! calculate F_aimDot from given L and current F F_aimDot = & @@ -387,6 +360,45 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa end subroutine grid_mech_spectral_polarisation_forward +!-------------------------------------------------------------------------------------------------- +!> @brief Write current solver and constitutive data for restart to file +!-------------------------------------------------------------------------------------------------- +subroutine grid_mech_spectral_polarisation_restartWrite() + + PetscErrorCode :: ierr + PetscScalar, dimension(:,:,:,:), pointer :: FandF_tau, F, F_tau + integer(HID_T) :: fileHandle + character(len=32) :: rankStr + + call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) + F => FandF_tau(0: 8,:,:,:) + F_tau => FandF_tau(9:17,:,:,:) + + write(6,'(a)') 'Writing current solver data for restart to file';flush(6) + + write(rankStr,'(a1,i0)')'_',worldrank + fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') + + call HDF5_write(fileHandle,F_aim, 'F_aim') + call HDF5_write(fileHandle,F_aim_lastInc, 'F_aim_lastInc') + call HDF5_write(fileHandle,F_aimDot, 'F_aimDot') + call HDF5_write(fileHandle,F, 'F') + call HDF5_write(fileHandle,F_lastInc, 'F_lastInc') + call HDF5_write(fileHandle,F_tau, 'F_tau') + call HDF5_write(fileHandle,F_tau_lastInc, 'F_tau_lastInc') + + call HDF5_write(fileHandle,C_volAvg, 'C_volAvg') + call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') + + call HDF5_closeFile(fileHandle) + + call CPFEM_restartWrite + + call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) + +end subroutine grid_mech_spectral_polarisation_restartWrite + + !-------------------------------------------------------------------------------------------------- !> @brief convergence check !-------------------------------------------------------------------------------------------------- From 3d44e7598ef29c71d83e1a5be0e16bc4fc501b09 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 13:56:48 +0200 Subject: [PATCH 083/233] works only for MSC.Marc --- src/FEsolving.f90 | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/FEsolving.f90 b/src/FEsolving.f90 index 491044b0e..9598ddda9 100644 --- a/src/FEsolving.f90 +++ b/src/FEsolving.f90 @@ -22,7 +22,7 @@ module FEsolving #if defined(Marc4DAMASK) || defined(Abaqus) logical, public, protected :: & - symmetricSolver = .false. !< use a symmetric FEM solver (only Abaqus) + symmetricSolver = .false. !< use a symmetric FEM solver logical, dimension(:,:), allocatable, public :: & calcMode !< do calculation or simply collect when using ping pong scheme @@ -31,36 +31,36 @@ module FEsolving contains - #if defined(Marc4DAMASK) || defined(Abaqus) !-------------------------------------------------------------------------------------------------- !> @brief determine whether a symmetric solver is used !-------------------------------------------------------------------------------------------------- subroutine FE_init - - integer, parameter :: & - FILEUNIT = 222 - character(len=pStringLen) :: tag, line - integer, allocatable, dimension(:) :: chunkPos write(6,'(/,a)') ' <<<+- FEsolving init -+>>>' - - call IO_open_inputFile(FILEUNIT) - rewind(FILEUNIT) - do - read (FILEUNIT,'(a256)',END=100) line - chunkPos = IO_stringPos(line) - tag = IO_lc(IO_stringValue(line,chunkPos,1)) - select case(tag) - case ('solver') + +#if defined(Marc4DAMASK) + block + integer, parameter :: FILEUNIT = 222 + character(len=pStringLen) :: line + integer, allocatable, dimension(:) :: chunkPos + call IO_open_inputFile(FILEUNIT) + rewind(FILEUNIT) + do + read (FILEUNIT,'(a256)',END=100) line + chunkPos = IO_stringPos(line) + if(IO_lc(IO_stringValue(line,chunkPos,1)) == 'solver') then read (FILEUNIT,'(a256)',END=100) line ! next line chunkPos = IO_stringPos(line) symmetricSolver = (IO_intValue(line,chunkPos,2) /= 1) - end select - enddo - 100 close(FILEUNIT) + endif + enddo +100 close(FILEUNIT) + end block +#endif end subroutine FE_init #endif + end module FEsolving From aace0d3fae87c84bc812fad1d2091e77429158e2 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 22:20:50 +0200 Subject: [PATCH 084/233] including fixed tests --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 751fa67c4..b04c068a0 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 751fa67c4ab4824385d8c497f6ae9bd7506a04b0 +Subproject commit b04c068a080a6424c3f655a11de3cfe2d73f9fdc From 9db5cbb667eb0dd2d6855822cf6ab1569ba8e074 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 24 Oct 2019 22:50:30 +0200 Subject: [PATCH 085/233] trying to get rid of a global "restartWrite" variable --- src/grid/grid_mech_FEM.f90 | 7 ++++--- src/grid/grid_mech_spectral_basic.f90 | 10 +++++----- src/grid/grid_mech_spectral_polarisation.f90 | 5 ++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 592266f3f..8d5e5eddc 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -302,7 +302,7 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat if (cutBack) then C_volAvg = C_volAvgLastInc else - if (restartWrite) call grid_mech_FEM_restartWrite + call grid_mech_FEM_restartWrite call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) @@ -360,6 +360,8 @@ subroutine grid_mech_FEM_restartWrite() integer(HID_T) :: fileHandle character(len=32) :: rankStr + if(.not. restartWrite) return + call DMDAVecGetArrayF90(mech_grid,solution_current,u_current,ierr); CHKERRQ(ierr) call DMDAVecGetArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr); CHKERRQ(ierr) @@ -564,7 +566,7 @@ subroutine formJacobian(da_local,x_local,Jac_pre,Jac,dummy,ierr) PetscScalar,dimension(24,24) :: K_ele PetscScalar,dimension(9,24) :: BMatFull PetscInt :: i, ii, j, jj, k, kk, ctr, ele - PetscInt,dimension(3) :: rows + PetscInt,dimension(3),parameter :: rows = [0, 1, 2] PetscScalar :: diag PetscObject :: dummy MatNullSpace :: matnull @@ -621,7 +623,6 @@ subroutine formJacobian(da_local,x_local,Jac_pre,Jac,dummy,ierr) !-------------------------------------------------------------------------------------------------- ! applying boundary conditions - rows = [0, 1, 2] diag = (C_volAvg(1,1,1,1)/delta(1)**2.0_pReal + & C_volAvg(2,2,2,2)/delta(2)**2.0_pReal + & C_volAvg(3,3,3,3)/delta(3)**2.0_pReal)*detJ diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 3feeac46d..fb720e994 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -78,7 +78,6 @@ module grid_mech_spectral_basic grid_mech_spectral_basic_forward, & grid_mech_spectral_basic_restartWrite - contains !-------------------------------------------------------------------------------------------------- @@ -222,10 +221,7 @@ function grid_mech_spectral_basic_solution(incInfoIn,timeinc,timeinc_old,stress_ !-------------------------------------------------------------------------------------------------- ! update stiffness (and gamma operator) S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg) - if (num%update_gamma) then - call utilities_updateGamma(C_minMaxAvg) - if(restartWrite) call utilities_saveReferenceStiffness - endif + if (num%update_gamma) call utilities_updateGamma(C_minMaxAvg) !-------------------------------------------------------------------------------------------------- ! set module wide available data @@ -328,6 +324,8 @@ subroutine grid_mech_spectral_basic_restartWrite() PetscScalar, dimension(:,:,:,:), pointer :: F integer(HID_T) :: fileHandle character(len=32) :: rankStr + + if(.not. restartWrite) return call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) @@ -347,6 +345,8 @@ subroutine grid_mech_spectral_basic_restartWrite() call HDF5_write(fileHandle,C_minMaxAvg, 'C_minMaxAvg') call HDF5_closeFile(fileHandle) + + if (num%update_gamma) call utilities_saveReferenceStiffness call CPFEM_restartWrite diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 7d3e664f7..d36cdb0c7 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -238,7 +238,6 @@ function grid_mech_spectral_polarisation_solution(incInfoIn,timeinc,timeinc_old, S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg) if (num%update_gamma) then call utilities_updateGamma(C_minMaxAvg) - if(restartWrite) call utilities_saveReferenceStiffness C_scale = C_minMaxAvg S_scale = math_invSym3333(C_minMaxAvg) endif @@ -369,6 +368,8 @@ subroutine grid_mech_spectral_polarisation_restartWrite() PetscScalar, dimension(:,:,:,:), pointer :: FandF_tau, F, F_tau integer(HID_T) :: fileHandle character(len=32) :: rankStr + + if(.not. restartWrite) return call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) F => FandF_tau(0: 8,:,:,:) @@ -392,6 +393,8 @@ subroutine grid_mech_spectral_polarisation_restartWrite() call HDF5_closeFile(fileHandle) + if (num%update_gamma) call utilities_saveReferenceStiffness + call CPFEM_restartWrite call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) From 378729f5c4ff764d25a46003f2006ce4f811ea00 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 25 Oct 2019 00:42:59 +0200 Subject: [PATCH 086/233] clearer structure --- src/grid/DAMASK_grid.f90 | 15 ++++++++------- src/grid/grid_mech_FEM.f90 | 3 --- src/grid/grid_mech_spectral_basic.f90 | 6 ++---- src/grid/grid_mech_spectral_polarisation.f90 | 5 +---- 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 6ab24b246..36c0e2dfe 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -73,7 +73,6 @@ program DAMASK_spectral fileUnit = 0, & !< file unit for reading load case and writing results myStat, & statUnit = 0, & !< file unit for statistics output - lastRestartWritten = 0, & !< total increment # at which last restart information was written stagIter, & nActiveFields = 0 character(len=6) :: loadcase_string @@ -95,6 +94,8 @@ program DAMASK_spectral mech_forward procedure(grid_mech_spectral_basic_solution), pointer :: & mech_solution + procedure(grid_mech_spectral_basic_restartWrite), pointer :: & + mech_restartWrite external :: & quit @@ -122,6 +123,7 @@ program DAMASK_spectral mech_init => grid_mech_spectral_basic_init mech_forward => grid_mech_spectral_basic_forward mech_solution => grid_mech_spectral_basic_solution + mech_restartWrite => grid_mech_spectral_basic_restartWrite case ('polarisation') if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) & @@ -129,13 +131,15 @@ program DAMASK_spectral mech_init => grid_mech_spectral_polarisation_init mech_forward => grid_mech_spectral_polarisation_forward mech_solution => grid_mech_spectral_polarisation_solution - + mech_restartWrite => grid_mech_spectral_polarisation_restartWrite + case ('fem') if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) & call IO_warning(42, ext_msg='debug Divergence') mech_init => grid_mech_FEM_init mech_forward => grid_mech_FEM_forward mech_solution => grid_mech_FEM_solution + mech_restartWrite => grid_mech_FEM_restartWrite case default call IO_error(error_ID = 891, ext_msg = config_numerics%getString('spectral_solver')) @@ -528,7 +532,7 @@ program DAMASK_spectral call IO_warning(850) call MPI_File_close(fileUnit,ierr) close(statUnit) - call quit(-1*(lastRestartWritten+1)) ! quit and provide information about last restart inc written + call quit(0) ! quit endif enddo subStepLooping @@ -561,10 +565,7 @@ program DAMASK_spectral fileOffset = fileOffset + sum(outputSize) ! forward to current file position call CPFEM_results(totalIncsCounter,time) endif - if (mod(inc,loadCases(currentLoadCase)%restartFrequency) == 0) then ! at frequency of writing restart information - restartWrite = .true. ! set restart parameter for FEsolving - lastRestartWritten = inc ! QUESTION: first call to CPFEM_general will write? - endif + if (mod(inc,loadCases(currentLoadCase)%restartFrequency) == 0) call mech_restartWrite endif skipping diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 8d5e5eddc..1c22d9986 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -302,7 +302,6 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat if (cutBack) then C_volAvg = C_volAvgLastInc else - call grid_mech_FEM_restartWrite call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) @@ -360,8 +359,6 @@ subroutine grid_mech_FEM_restartWrite() integer(HID_T) :: fileHandle character(len=32) :: rankStr - if(.not. restartWrite) return - call DMDAVecGetArrayF90(mech_grid,solution_current,u_current,ierr); CHKERRQ(ierr) call DMDAVecGetArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr); CHKERRQ(ierr) diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index fb720e994..2b935c77a 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -221,7 +221,7 @@ function grid_mech_spectral_basic_solution(incInfoIn,timeinc,timeinc_old,stress_ !-------------------------------------------------------------------------------------------------- ! update stiffness (and gamma operator) S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg) - if (num%update_gamma) call utilities_updateGamma(C_minMaxAvg) + if(num%update_gamma) call utilities_updateGamma(C_minMaxAvg) !-------------------------------------------------------------------------------------------------- ! set module wide available data @@ -274,7 +274,7 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi C_volAvg = C_volAvgLastInc C_minMaxAvg = C_minMaxAvgLastInc else - call grid_mech_spectral_basic_restartWrite + call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) @@ -324,8 +324,6 @@ subroutine grid_mech_spectral_basic_restartWrite() PetscScalar, dimension(:,:,:,:), pointer :: F integer(HID_T) :: fileHandle character(len=32) :: rankStr - - if(.not. restartWrite) return call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index d36cdb0c7..2a12eeeb8 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -297,7 +297,6 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa C_volAvg = C_volAvgLastInc C_minMaxAvg = C_minMaxAvgLastInc else - call grid_mech_spectral_polarisation_restartWrite call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) @@ -368,8 +367,6 @@ subroutine grid_mech_spectral_polarisation_restartWrite() PetscScalar, dimension(:,:,:,:), pointer :: FandF_tau, F, F_tau integer(HID_T) :: fileHandle character(len=32) :: rankStr - - if(.not. restartWrite) return call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) F => FandF_tau(0: 8,:,:,:) @@ -393,7 +390,7 @@ subroutine grid_mech_spectral_polarisation_restartWrite() call HDF5_closeFile(fileHandle) - if (num%update_gamma) call utilities_saveReferenceStiffness + if(num%update_gamma) call utilities_saveReferenceStiffness call CPFEM_restartWrite From eb4cad17b5d5a4003a11e251451b14dd9ac113d2 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 25 Oct 2019 00:53:48 +0200 Subject: [PATCH 087/233] avoid public variables --- src/FEsolving.f90 | 1 - src/grid/DAMASK_grid.f90 | 1 - 2 files changed, 2 deletions(-) diff --git a/src/FEsolving.f90 b/src/FEsolving.f90 index 9598ddda9..38788a065 100644 --- a/src/FEsolving.f90 +++ b/src/FEsolving.f90 @@ -12,7 +12,6 @@ module FEsolving private logical, public :: & - restartWrite = .false., & !< write current state to enable restart terminallyIll = .false. !< at least one material point is terminally ill integer, dimension(:,:), allocatable, public :: & diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 36c0e2dfe..09e46aec7 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -476,7 +476,6 @@ program DAMASK_spectral case(FIELD_DAMAGE_ID); call grid_damage_spectral_forward end select enddo - if (restartWrite .and. .not. cutBack) restartWrite = .false. !-------------------------------------------------------------------------------------------------- ! solve fields From cf8b16c066bd25eb476ce2d7324e2d6054811421 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 25 Oct 2019 07:16:03 +0200 Subject: [PATCH 088/233] better have one function per task but separating ageing and forward for the solver is not trivial due to guessing --- src/CPFEM2.f90 | 2 +- src/grid/grid_mech_FEM.f90 | 17 +++++++++++---- src/grid/grid_mech_spectral_basic.f90 | 23 +++++++++++++++----- src/grid/grid_mech_spectral_polarisation.f90 | 22 ++++++++++++++++--- src/grid/spectral_utilities.f90 | 2 +- 5 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index 612662611..8e91e79a4 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -163,7 +163,7 @@ subroutine CPFEM_restartWrite integer(HID_T) :: fileHandle, groupPlastic, groupHomog - write(6,'(a)') 'Writing current constitutive variables for restart to file';flush(6) + write(6,'(a)') ' writing constitutive data required for restart to file';flush(6) write(rankStr,'(a1,i0)')'_',worldrank fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','a') diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 1c22d9986..7f1401fe2 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -302,9 +302,7 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat if (cutBack) then C_volAvg = C_volAvgLastInc else - call CPFEM_age ! age state and kinematics - call utilities_updateCoords(F) - + call grid_mech_FEM_age C_volAvgLastInc = C_volAvg F_aimDot = merge(stress_BC%maskFloat*(F_aim-F_aim_lastInc)/timeinc_old, 0.0_pReal, guess) @@ -349,6 +347,17 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat end subroutine grid_mech_FEM_forward +!-------------------------------------------------------------------------------------------------- +!> @brief Age +!-------------------------------------------------------------------------------------------------- +subroutine grid_mech_FEM_age() + + call CPFEM_age ! age state and kinematics + call utilities_updateCoords(F) + +end subroutine grid_mech_FEM_age + + !-------------------------------------------------------------------------------------------------- !> @brief Write current solver and constitutive data for restart to file !-------------------------------------------------------------------------------------------------- @@ -362,7 +371,7 @@ subroutine grid_mech_FEM_restartWrite() call DMDAVecGetArrayF90(mech_grid,solution_current,u_current,ierr); CHKERRQ(ierr) call DMDAVecGetArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr); CHKERRQ(ierr) - write(6,'(a)') 'Writing current solver data for restart to file';flush(6) + write(6,'(a)') ' writing solver data required for restart to file';flush(6) write(rankStr,'(a1,i0)')'_',worldrank fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 2b935c77a..63f03e0ac 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -274,10 +274,7 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi C_volAvg = C_volAvgLastInc C_minMaxAvg = C_minMaxAvgLastInc else - - call CPFEM_age ! age state and kinematics - call utilities_updateCoords(F) - + call grid_mech_spectral_basic_age C_volAvgLastInc = C_volAvg C_minMaxAvgLastInc = C_minMaxAvg @@ -315,6 +312,22 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi end subroutine grid_mech_spectral_basic_forward +!-------------------------------------------------------------------------------------------------- +!> @brief Age +!-------------------------------------------------------------------------------------------------- +subroutine grid_mech_spectral_basic_age() + + PetscErrorCode :: ierr + PetscScalar, dimension(:,:,:,:), pointer :: F + + call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) + call CPFEM_age ! age state and kinematics + call utilities_updateCoords(F) + call DMDAVecRestoreArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) + +end subroutine grid_mech_spectral_basic_age + + !-------------------------------------------------------------------------------------------------- !> @brief Write current solver and constitutive data for restart to file !-------------------------------------------------------------------------------------------------- @@ -327,7 +340,7 @@ subroutine grid_mech_spectral_basic_restartWrite() call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) - write(6,'(a)') 'Writing current solver data for restart to file';flush(6) + write(6,'(a)') ' writing solver data required for restart to file';flush(6) write(rankStr,'(a1,i0)')'_',worldrank fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 2a12eeeb8..8360f1f1e 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -297,8 +297,7 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa C_volAvg = C_volAvgLastInc C_minMaxAvg = C_minMaxAvgLastInc else - call CPFEM_age ! age state and kinematics - call utilities_updateCoords(F) + call grid_mech_spectral_polarisation_age C_volAvgLastInc = C_volAvg C_minMaxAvgLastInc = C_minMaxAvg @@ -358,6 +357,23 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa end subroutine grid_mech_spectral_polarisation_forward +!-------------------------------------------------------------------------------------------------- +!> @brief Age +!-------------------------------------------------------------------------------------------------- +subroutine grid_mech_spectral_polarisation_age() + + PetscErrorCode :: ierr + PetscScalar, dimension(:,:,:,:), pointer :: FandF_tau, F + + call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) + F => FandF_tau(0: 8,:,:,:) + call CPFEM_age ! age state and kinematics + call utilities_updateCoords(F) + call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) + +end subroutine grid_mech_spectral_polarisation_age + + !-------------------------------------------------------------------------------------------------- !> @brief Write current solver and constitutive data for restart to file !-------------------------------------------------------------------------------------------------- @@ -372,7 +388,7 @@ subroutine grid_mech_spectral_polarisation_restartWrite() F => FandF_tau(0: 8,:,:,:) F_tau => FandF_tau(9:17,:,:,:) - write(6,'(a)') 'Writing current solver data for restart to file';flush(6) + write(6,'(a)') ' writing solver data required for restart to file';flush(6) write(rankStr,'(a1,i0)')'_',worldrank fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 87543b68c..1f52d6ed3 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -1130,7 +1130,7 @@ subroutine utilities_saveReferenceStiffness fileUnit if (worldrank == 0) then - write(6,'(a)') 'Writing current reference stiffness for restart to file';flush(6) + write(6,'(a)') ' writing reference stiffness data required for restart to file';flush(6) fileUnit = IO_open_jobFile_binary('C_ref','w') write(fileUnit) C_ref close(fileUnit) From 07d837931386ac7de4115f58e662318b68798e9a Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 25 Oct 2019 07:55:23 +0200 Subject: [PATCH 089/233] further untangling --- src/grid/DAMASK_grid.f90 | 6 ++++++ src/grid/grid_mech_FEM.f90 | 6 +++--- src/grid/grid_mech_spectral_basic.f90 | 6 +++--- src/grid/grid_mech_spectral_polarisation.f90 | 21 ++++++++++---------- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 09e46aec7..6f65973d0 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -94,6 +94,8 @@ program DAMASK_spectral mech_forward procedure(grid_mech_spectral_basic_solution), pointer :: & mech_solution + procedure(grid_mech_spectral_basic_age), pointer :: & + mech_age procedure(grid_mech_spectral_basic_restartWrite), pointer :: & mech_restartWrite @@ -123,6 +125,7 @@ program DAMASK_spectral mech_init => grid_mech_spectral_basic_init mech_forward => grid_mech_spectral_basic_forward mech_solution => grid_mech_spectral_basic_solution + mech_age => grid_mech_spectral_basic_age mech_restartWrite => grid_mech_spectral_basic_restartWrite case ('polarisation') @@ -131,7 +134,9 @@ program DAMASK_spectral mech_init => grid_mech_spectral_polarisation_init mech_forward => grid_mech_spectral_polarisation_forward mech_solution => grid_mech_spectral_polarisation_solution + mech_age => grid_mech_spectral_polarisation_age mech_restartWrite => grid_mech_spectral_polarisation_restartWrite + case ('fem') if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) & @@ -139,6 +144,7 @@ program DAMASK_spectral mech_init => grid_mech_FEM_init mech_forward => grid_mech_FEM_forward mech_solution => grid_mech_FEM_solution + mech_age => grid_mech_FEM_age mech_restartWrite => grid_mech_FEM_restartWrite case default diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 7f1401fe2..0d4cda158 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -72,6 +72,7 @@ module grid_mech_FEM grid_mech_FEM_init, & grid_mech_FEM_solution, & grid_mech_FEM_forward, & + grid_mech_FEM_age, & grid_mech_FEM_restartWrite contains @@ -331,9 +332,7 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat endif call VecCopy(solution_current,solution_lastInc,ierr); CHKERRQ(ierr) - F_lastInc = F ! winding F forward - materialpoint_F0 = reshape(F_lastInc, [3,3,1,product(grid(1:2))*grid3]) ! set starting condition for materialpoint_stressAndItsTangent - + F_lastInc = F ! winding F forward endif !-------------------------------------------------------------------------------------------------- @@ -352,6 +351,7 @@ end subroutine grid_mech_FEM_forward !-------------------------------------------------------------------------------------------------- subroutine grid_mech_FEM_age() + materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 63f03e0ac..cf4816848 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -76,6 +76,7 @@ module grid_mech_spectral_basic grid_mech_spectral_basic_init, & grid_mech_spectral_basic_solution, & grid_mech_spectral_basic_forward, & + grid_mech_spectral_basic_age, & grid_mech_spectral_basic_restartWrite contains @@ -294,12 +295,10 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi F_aimDot + deformation_BC%maskFloat * (deformation_BC%values - F_aim_lastInc)/loadCaseTime endif - Fdot = utilities_calculateRate(guess, & F_lastInc,reshape(F,[3,3,grid(1),grid(2),grid3]),timeinc_old, & math_rotate_backward33(F_aimDot,rotation_BC)) - F_lastInc = reshape(F, [3,3,grid(1),grid(2),grid3]) ! winding F forward - materialpoint_F0 = reshape(F_lastInc, [3,3,1,product(grid(1:2))*grid3]) ! set starting condition for materialpoint_stressAndItsTangent + F_lastInc = reshape(F,[3,3,grid(1),grid(2),grid3]) ! winding F forward endif !-------------------------------------------------------------------------------------------------- @@ -321,6 +320,7 @@ subroutine grid_mech_spectral_basic_age() PetscScalar, dimension(:,:,:,:), pointer :: F call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) + materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) call DMDAVecRestoreArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 8360f1f1e..c06b8eec3 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -82,6 +82,7 @@ module grid_mech_spectral_polarisation grid_mech_spectral_polarisation_init, & grid_mech_spectral_polarisation_solution, & grid_mech_spectral_polarisation_forward, & + grid_mech_spectral_polarisation_age, & grid_mech_spectral_polarisation_restartWrite contains @@ -318,17 +319,14 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa F_aimDot + deformation_BC%maskFloat * (deformation_BC%values - F_aim_lastInc)/loadCaseTime endif - - Fdot = utilities_calculateRate(guess, & - F_lastInc,reshape(F,[3,3,grid(1),grid(2),grid3]),timeinc_old, & - math_rotate_backward33(F_aimDot,rotation_BC)) - F_tauDot = utilities_calculateRate(guess, & - F_tau_lastInc,reshape(F_tau,[3,3,grid(1),grid(2),grid3]), timeinc_old, & - math_rotate_backward33(F_aimDot,rotation_BC)) - F_lastInc = reshape(F, [3,3,grid(1),grid(2),grid3]) ! winding F forward - F_tau_lastInc = reshape(F_tau, [3,3,grid(1),grid(2),grid3]) ! winding F_tau forward - materialpoint_F0 = reshape(F_lastInc, [3,3,1,product(grid(1:2))*grid3]) ! set starting condition for materialpoint_stressAndItsTangent - + Fdot = utilities_calculateRate(guess, & + F_lastInc,reshape(F,[3,3,grid(1),grid(2),grid3]),timeinc_old, & + math_rotate_backward33(F_aimDot,rotation_BC)) + F_tauDot = utilities_calculateRate(guess, & + F_tau_lastInc,reshape(F_tau,[3,3,grid(1),grid(2),grid3]), timeinc_old, & + math_rotate_backward33(F_aimDot,rotation_BC)) + F_lastInc = reshape(F, [3,3,grid(1),grid(2),grid3]) ! winding F forward + F_tau_lastInc = reshape(F_tau,[3,3,grid(1),grid(2),grid3]) ! winding F_tau forward endif !-------------------------------------------------------------------------------------------------- @@ -367,6 +365,7 @@ subroutine grid_mech_spectral_polarisation_age() call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) F => FandF_tau(0: 8,:,:,:) + materialpoint_F0 = reshape(F,[3,3,1,product(grid(1:2))*grid3]) call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) From 10f2c53256753b51c424c531ee6bb97247f5771d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 25 Oct 2019 08:30:12 +0200 Subject: [PATCH 090/233] clearly distiguish - DAMASK as a materialpoint model (CPFEM, not fitting name) - solver --- src/grid/DAMASK_grid.f90 | 9 ++++++--- src/grid/grid_mech_FEM.f90 | 4 ---- src/grid/grid_mech_spectral_basic.f90 | 4 ---- src/grid/grid_mech_spectral_polarisation.f90 | 7 +------ 4 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 6f65973d0..7ffa8fcd7 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -137,7 +137,6 @@ program DAMASK_spectral mech_age => grid_mech_spectral_polarisation_age mech_restartWrite => grid_mech_spectral_polarisation_restartWrite - case ('fem') if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) & call IO_warning(42, ext_msg='debug Divergence') @@ -518,6 +517,8 @@ program DAMASK_spectral if ( (all(solres(:)%converged .and. solres(:)%stagConverged)) & ! converged .and. .not. solres(1)%termIll) then ! and acceptable solution found + call mech_age + call CPFEM_age timeIncOld = timeinc cutBack = .false. guess = .true. ! start guessing after first converged (sub)inc @@ -570,8 +571,10 @@ program DAMASK_spectral fileOffset = fileOffset + sum(outputSize) ! forward to current file position call CPFEM_results(totalIncsCounter,time) endif - if (mod(inc,loadCases(currentLoadCase)%restartFrequency) == 0) call mech_restartWrite - + if (mod(inc,loadCases(currentLoadCase)%restartFrequency) == 0) then + call mech_restartWrite + call CPFEM_restartWrite + endif endif skipping enddo incLooping diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 0d4cda158..edcc9810c 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -303,7 +303,6 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat if (cutBack) then C_volAvg = C_volAvgLastInc else - call grid_mech_FEM_age C_volAvgLastInc = C_volAvg F_aimDot = merge(stress_BC%maskFloat*(F_aim-F_aim_lastInc)/timeinc_old, 0.0_pReal, guess) @@ -352,7 +351,6 @@ end subroutine grid_mech_FEM_forward subroutine grid_mech_FEM_age() materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) - call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) end subroutine grid_mech_FEM_age @@ -388,8 +386,6 @@ subroutine grid_mech_FEM_restartWrite() call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') call HDF5_closeFile(fileHandle) - - call CPFEM_restartWrite call DMDAVecRestoreArrayF90(mech_grid,solution_current,u_current,ierr);CHKERRQ(ierr) call DMDAVecRestoreArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr);CHKERRQ(ierr) diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index cf4816848..6aa56ef76 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -275,7 +275,6 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi C_volAvg = C_volAvgLastInc C_minMaxAvg = C_minMaxAvgLastInc else - call grid_mech_spectral_basic_age C_volAvgLastInc = C_volAvg C_minMaxAvgLastInc = C_minMaxAvg @@ -321,7 +320,6 @@ subroutine grid_mech_spectral_basic_age() call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) - call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) call DMDAVecRestoreArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) @@ -358,8 +356,6 @@ subroutine grid_mech_spectral_basic_restartWrite() call HDF5_closeFile(fileHandle) if (num%update_gamma) call utilities_saveReferenceStiffness - - call CPFEM_restartWrite call DMDAVecRestoreArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index c06b8eec3..792b89fce 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -297,9 +297,7 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa if (cutBack) then C_volAvg = C_volAvgLastInc C_minMaxAvg = C_minMaxAvgLastInc - else - call grid_mech_spectral_polarisation_age - + else C_volAvgLastInc = C_volAvg C_minMaxAvgLastInc = C_minMaxAvg @@ -366,7 +364,6 @@ subroutine grid_mech_spectral_polarisation_age() call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) F => FandF_tau(0: 8,:,:,:) materialpoint_F0 = reshape(F,[3,3,1,product(grid(1:2))*grid3]) - call CPFEM_age ! age state and kinematics call utilities_updateCoords(F) call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) @@ -406,8 +403,6 @@ subroutine grid_mech_spectral_polarisation_restartWrite() call HDF5_closeFile(fileHandle) if(num%update_gamma) call utilities_saveReferenceStiffness - - call CPFEM_restartWrite call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) From fca288ae8a585070c91efcf7331fd80a9bcd5a18 Mon Sep 17 00:00:00 2001 From: navyanthkusam Date: Fri, 25 Oct 2019 14:47:36 +0200 Subject: [PATCH 091/233] performance improvement this mapping is faster for large volumes --- python/damask/dadf5.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 562051384..163f4f30d 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -388,7 +388,7 @@ class DADF5(): p = np.where(f['mapping/cellResults/constituent'][:,c]['Name'] == str.encode(label))[0] if len(p)>0: - u = (f['mapping/cellResults/constituent'][p,c]['Position']) + u = (f['mapping/cellResults/constituent']['Position'][p,c]) a = np.array(f[pa]) if len(a.shape) == 1: a=a.reshape([a.shape[0],1]) From b733bd3038dd48461c0580de9ccd9b1bd633f485 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 25 Oct 2019 13:30:20 +0200 Subject: [PATCH 092/233] polar decomposition --- python/damask/mechanics.py | 91 +++++++++++++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 12 deletions(-) diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index 03ae2b2b6..b210ee3e8 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -8,9 +8,9 @@ def Cauchy(F,P): Parameters ---------- - F : numpy.array of shape (x,3,3) or (3,3) + F : numpy.array of shape (:,3,3) or (3,3) Deformation gradient. - P : numpy.array of shape (x,3,3) or (3,3) + P : numpy.array of shape (:,3,3) or (3,3) 1. Piola-Kirchhoff stress. """ @@ -30,7 +30,7 @@ def strain_tensor(F,t,m): Parameters ---------- - F : numpy.array of shape (x,3,3) or (3,3) + F : numpy.array of shape (:,3,3) or (3,3) Deformation gradient. t : {‘V’, ‘U’} Type of the polar decomposition, ‘V’ for left stretch tensor and ‘U’ for right stretch tensor. @@ -65,7 +65,7 @@ def deviatoric_part(x): Parameters ---------- - x : numpy.array of shape (x,3,3) or (3,3) + x : numpy.array of shape (:,3,3) or (3,3) Tensor of which the deviatoric part is computed. """ @@ -82,7 +82,7 @@ def spherical_part(x): Parameters ---------- - x : numpy.array of shape (x,3,3) or (3,3) + x : numpy.array of shape (:,3,3) or (3,3) Tensor of which the hydrostatic part is computed. """ @@ -96,7 +96,7 @@ def Mises_stress(sigma): Parameters ---------- - sigma : numpy.array of shape (x,3,3) or (3,3) + sigma : numpy.array of shape (:,3,3) or (3,3) Symmetric stress tensor of which the von Mises equivalent is computed. """ @@ -111,7 +111,7 @@ def Mises_strain(epsilon): Parameters ---------- - epsilon : numpy.array of shape (x,3,3) or (3,3) + epsilon : numpy.array of shape (:,3,3) or (3,3) Symmetric strain tensor of which the von Mises equivalent is computed. """ @@ -126,7 +126,7 @@ def symmetric(x): Parameters ---------- - x : numpy.array of shape (x,3,3) or (3,3) + x : numpy.array of shape (:,3,3) or (3,3) Tensor of which the symmetrized values are computed. """ @@ -139,7 +139,7 @@ def maximum_shear(x): Parameters ---------- - x : numpy.array of shape (x,3,3) or (3,3) + x : numpy.array of shape (:,3,3) or (3,3) Symmetric tensor of which the maximum shear is computed. """ @@ -157,7 +157,7 @@ def principal_components(x): Parameters ---------- - x : numpy.array of shape (x,3,3) or (3,3) + x : numpy.array of shape (:,3,3) or (3,3) Symmetric tensor of which the principal compontents are computed. """ @@ -172,9 +172,76 @@ def transpose(x): Parameters ---------- - x : numpy.array of shape (x,3,3) or (3,3) - Tensor of which the transpose is computer. + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the transpose is computed. """ return x.T if np.shape(x) == (3,3) else \ np.transpose(x,(0,2,1)) + + +def rotational_part(x): + """ + Return the rotational part of a tensor. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the rotational part is computed. + + """ + return __polar_decomposition(x,'R') + + +def left_stretch(x): + """ + Return the left stretch of a tensor. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the left stretch is computed. + + """ + return __polar_decomposition(x,'V') + + +def right_stretch(x): + """ + Return the right stretch of a tensor. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the right stretch is computed. + + """ + return __polar_decomposition(x,'U') + + +def __polar_decomposition(x,requested): + """ + Singular value decomposition. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the singular values are computed. + requested : list of str + Requested outputs: ‘R’ for the rotation tensor, + ‘V’ for left stretch tensor and ‘U’ for right stretch tensor. + + """ + u, s, vh = np.linalg.svd(x) + R = np.dot(u,vh) if np.shape(x) == (3,3) else \ + np.einsum('ijk,ikl->ijl',u,vh) + + output = [] + if 'R' in requested: + output.append(R) + if 'V' in requested: + output.append(np.dot(x,R.T) if np.shape(x) == (3,3) else np.einsum('ijk,ilk->ijl',x,R)) + if 'U' in requested: + output.append(np.dot(R.T,x) if np.shape(x) == (3,3) else np.einsum('ikj,ikl->ijl',R,x)) + + return tuple(output) From ab4a98fb53e9ee98cadfed32cc817b6b7e2f762a Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 28 Oct 2019 13:17:05 +0100 Subject: [PATCH 093/233] make use of HDF5 and structure data --- src/CPFEM2.f90 | 40 ++++++------ src/grid/grid_mech_FEM.f90 | 48 ++++++++------- src/grid/grid_mech_spectral_basic.f90 | 45 ++++++++------ src/grid/grid_mech_spectral_polarisation.f90 | 65 +++++++++++--------- 4 files changed, 107 insertions(+), 91 deletions(-) diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index 8e91e79a4..a606856c1 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -93,24 +93,24 @@ subroutine CPFEM_init fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5') - call HDF5_read(fileHandle,crystallite_F0, 'convergedF') - call HDF5_read(fileHandle,crystallite_Fp0,'convergedFp') - call HDF5_read(fileHandle,crystallite_Fi0,'convergedFi') - call HDF5_read(fileHandle,crystallite_Lp0,'convergedLp') - call HDF5_read(fileHandle,crystallite_Li0,'convergedLi') - call HDF5_read(fileHandle,crystallite_S0, 'convergedS') + call HDF5_read(fileHandle,crystallite_F0, 'F') + call HDF5_read(fileHandle,crystallite_Fp0,'Fp') + call HDF5_read(fileHandle,crystallite_Fi0,'Fi') + call HDF5_read(fileHandle,crystallite_Lp0,'Lp') + call HDF5_read(fileHandle,crystallite_Li0,'Li') + call HDF5_read(fileHandle,crystallite_S0, 'S') - groupPlasticID = HDF5_openGroup(fileHandle,'PlasticPhases') + groupPlasticID = HDF5_openGroup(fileHandle,'constituent') do ph = 1,size(phase_plasticity) write(PlasticItem,*) ph,'_' - call HDF5_read(groupPlasticID,plasticState(ph)%state0,trim(PlasticItem)//'convergedStateConst') + call HDF5_read(groupPlasticID,plasticState(ph)%state0,trim(PlasticItem)//'omega_plastic') enddo call HDF5_closeGroup(groupPlasticID) - groupHomogID = HDF5_openGroup(fileHandle,'HomogStates') + groupHomogID = HDF5_openGroup(fileHandle,'materialpoint') do homog = 1, material_Nhomogenization write(HomogItem,*) homog,'_' - call HDF5_read(groupHomogID,homogState(homog)%state0, trim(HomogItem)//'convergedStateHomog') + call HDF5_read(groupHomogID,homogState(homog)%state0, trim(HomogItem)//'omega_homogenization') enddo call HDF5_closeGroup(groupHomogID) @@ -168,24 +168,24 @@ subroutine CPFEM_restartWrite write(rankStr,'(a1,i0)')'_',worldrank fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','a') - call HDF5_write(fileHandle,crystallite_partionedF, 'convergedF') - call HDF5_write(fileHandle,crystallite_Fp, 'convergedFp') - call HDF5_write(fileHandle,crystallite_Fi, 'convergedFi') - call HDF5_write(fileHandle,crystallite_Lp, 'convergedLp') - call HDF5_write(fileHandle,crystallite_Li, 'convergedLi') - call HDF5_write(fileHandle,crystallite_S, 'convergedS') + call HDF5_write(fileHandle,crystallite_partionedF,'F') + call HDF5_write(fileHandle,crystallite_Fp, 'Fp') + call HDF5_write(fileHandle,crystallite_Fi, 'Fi') + call HDF5_write(fileHandle,crystallite_Lp, 'Lp') + call HDF5_write(fileHandle,crystallite_Li, 'Li') + call HDF5_write(fileHandle,crystallite_S, 'S') - groupPlastic = HDF5_addGroup(fileHandle,'PlasticPhases') + groupPlastic = HDF5_addGroup(fileHandle,'constituent') do ph = 1,size(phase_plasticity) write(PlasticItem,*) ph,'_' - call HDF5_write(groupPlastic,plasticState(ph)%state,trim(PlasticItem)//'convergedStateConst') + call HDF5_write(groupPlastic,plasticState(ph)%state,trim(PlasticItem)//'omega_plastic') enddo call HDF5_closeGroup(groupPlastic) - groupHomog = HDF5_addGroup(fileHandle,'HomogStates') + groupHomog = HDF5_addGroup(fileHandle,'materialpoint') do homog = 1, material_Nhomogenization write(HomogItem,*) homog,'_' - call HDF5_write(groupHomog,homogState(homog)%state,trim(HomogItem)//'convergedStateHomog') + call HDF5_write(groupHomog,homogState(homog)%state,trim(HomogItem)//'omega_homogenization') enddo call HDF5_closeGroup(groupHomog) diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index edcc9810c..b50b52885 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -97,7 +97,7 @@ subroutine grid_mech_FEM_init 1.0_pReal, 1.0_pReal, 1.0_pReal, 1.0_pReal], [4,8]) PetscErrorCode :: ierr integer :: rank - integer(HID_T) :: fileHandle + integer(HID_T) :: fileHandle, groupHandle character(len=1024) :: rankStr real(pReal), dimension(3,3,3,3) :: devNull PetscScalar, pointer, dimension(:,:,:,:) :: & @@ -188,15 +188,16 @@ subroutine grid_mech_FEM_init 'reading values of increment ', interface_restartInc, ' from file' write(rankStr,'(a1,i0)')'_',worldrank - fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5') + fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5') + groupHandle = HDF5_openGroup(fileHandle,'solver') - call HDF5_read(fileHandle,F_aim, 'F_aim') - call HDF5_read(fileHandle,F_aim_lastInc,'F_aim_lastInc') - call HDF5_read(fileHandle,F_aimDot, 'F_aimDot') - call HDF5_read(fileHandle,F, 'F') - call HDF5_read(fileHandle,F_lastInc, 'F_lastInc') - call HDF5_read(fileHandle,u_current, 'u') - call HDF5_read(fileHandle,u_lastInc, 'u_lastInc') + call HDF5_read(groupHandle,F_aim, 'F_aim') + call HDF5_read(groupHandle,F_aim_lastInc,'F_aim_lastInc') + call HDF5_read(groupHandle,F_aimDot, 'F_aimDot') + call HDF5_read(groupHandle,F, 'F') + call HDF5_read(groupHandle,F_lastInc, 'F_lastInc') + call HDF5_read(groupHandle,u_current, 'u') + call HDF5_read(groupHandle,u_lastInc, 'u_lastInc') elseif (interface_restartInc == 0) then restartRead F_lastInc = spread(spread(spread(math_I3,3,grid(1)),4,grid(2)),5,grid3) ! initialize to identity @@ -216,9 +217,12 @@ subroutine grid_mech_FEM_init restartRead2: if (interface_restartInc > 0) then write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') & 'reading more values of increment ', interface_restartInc, ' from file' - call HDF5_read(fileHandle,C_volAvg, 'C_volAvg') - call HDF5_read(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') + call HDF5_read(groupHandle,C_volAvg, 'C_volAvg') + call HDF5_read(groupHandle,C_volAvgLastInc,'C_volAvgLastInc') + + call HDF5_closeGroup(groupHandle) call HDF5_closeFile(fileHandle) + endif restartRead2 end subroutine grid_mech_FEM_init @@ -363,7 +367,7 @@ subroutine grid_mech_FEM_restartWrite() PetscErrorCode :: ierr PetscScalar, dimension(:,:,:,:), pointer :: u_current,u_lastInc - integer(HID_T) :: fileHandle + integer(HID_T) :: fileHandle, groupHandle character(len=32) :: rankStr call DMDAVecGetArrayF90(mech_grid,solution_current,u_current,ierr); CHKERRQ(ierr) @@ -373,18 +377,20 @@ subroutine grid_mech_FEM_restartWrite() write(rankStr,'(a1,i0)')'_',worldrank fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') + groupHandle = HDF5_addGroup(fileHandle,'solver') - call HDF5_write(fileHandle,F_aim, 'F_aim') - call HDF5_write(fileHandle,F_aim_lastInc, 'F_aim_lastInc') - call HDF5_write(fileHandle,F_aimDot, 'F_aimDot') - call HDF5_write(fileHandle,F, 'F') - call HDF5_write(fileHandle,F_lastInc, 'F_lastInc') - call HDF5_write(fileHandle,u_current, 'u') - call HDF5_write(fileHandle,u_lastInc, 'u_lastInc') + call HDF5_write(groupHandle,F_aim, 'F_aim') + call HDF5_write(groupHandle,F_aim_lastInc,'F_aim_lastInc') + call HDF5_write(groupHandle,F_aimDot, 'F_aimDot') + call HDF5_write(groupHandle,F, 'F') + call HDF5_write(groupHandle,F_lastInc, 'F_lastInc') + call HDF5_write(groupHandle,u_current, 'u') + call HDF5_write(groupHandle,u_lastInc, 'u_lastInc') - call HDF5_write(fileHandle,C_volAvg, 'C_volAvg') - call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') + call HDF5_write(groupHandle,C_volAvg, 'C_volAvg') + call HDF5_write(groupHandle,C_volAvgLastInc,'C_volAvgLastInc') + call HDF5_closeGroup(groupHandle) call HDF5_closeFile(fileHandle) call DMDAVecRestoreArrayF90(mech_grid,solution_current,u_current,ierr);CHKERRQ(ierr) diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 6aa56ef76..c3f538680 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -94,8 +94,8 @@ subroutine grid_mech_spectral_basic_init PetscScalar, pointer, dimension(:,:,:,:) :: & F ! pointer to solution data PetscInt, dimension(worldsize) :: localK - integer(HID_T) :: fileHandle - integer :: fileUnit + integer(HID_T) :: fileHandle, groupHandle + integer :: fileUnit character(len=1024) :: rankStr write(6,'(/,a)') ' <<<+- grid_mech_spectral_basic init -+>>>' @@ -150,18 +150,19 @@ subroutine grid_mech_spectral_basic_init ! init fields call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) ! places pointer on PETSc data - restartRead: if (interface_restartInc > 0) then + restartRead: if (interface_restartInc > 0) then write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') & ' reading values of increment ', interface_restartInc, ' from file' write(rankStr,'(a1,i0)')'_',worldrank - fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5') + fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5') + groupHandle = HDF5_openGroup(fileHandle,'solver') - call HDF5_read(fileHandle,F_aim, 'F_aim') - call HDF5_read(fileHandle,F_aim_lastInc,'F_aim_lastInc') - call HDF5_read(fileHandle,F_aimDot, 'F_aimDot') - call HDF5_read(fileHandle,F, 'F') - call HDF5_read(fileHandle,F_lastInc, 'F_lastInc') + call HDF5_read(groupHandle,F_aim, 'F_aim') + call HDF5_read(groupHandle,F_aim_lastInc,'F_aim_lastInc') + call HDF5_read(groupHandle,F_aimDot, 'F_aimDot') + call HDF5_read(groupHandle,F, 'F') + call HDF5_read(groupHandle,F_lastInc, 'F_lastInc') elseif (interface_restartInc == 0) then restartRead F_lastInc = spread(spread(spread(math_I3,3,grid(1)),4,grid(2)),5,grid3) ! initialize to identity @@ -179,8 +180,10 @@ subroutine grid_mech_spectral_basic_init restartRead2: if (interface_restartInc > 0) then write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') & 'reading more values of increment ', interface_restartInc, ' from file' - call HDF5_read(fileHandle,C_volAvg, 'C_volAvg') - call HDF5_read(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') + call HDF5_read(groupHandle,C_volAvg, 'C_volAvg') + call HDF5_read(groupHandle,C_volAvgLastInc,'C_volAvgLastInc') + + call HDF5_closeGroup(groupHandle) call HDF5_closeFile(fileHandle) call MPI_File_open(PETSC_COMM_WORLD, trim(getSolverJobName())//'.C_ref', & @@ -333,7 +336,7 @@ subroutine grid_mech_spectral_basic_restartWrite() PetscErrorCode :: ierr PetscScalar, dimension(:,:,:,:), pointer :: F - integer(HID_T) :: fileHandle + integer(HID_T) :: fileHandle, groupHandle character(len=32) :: rankStr call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) @@ -342,17 +345,19 @@ subroutine grid_mech_spectral_basic_restartWrite() write(rankStr,'(a1,i0)')'_',worldrank fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') + groupHandle = HDF5_addGroup(fileHandle,'solver') - call HDF5_write(fileHandle,F_aim, 'F_aim') - call HDF5_write(fileHandle,F_aim_lastInc,'F_aim_lastInc') - call HDF5_write(fileHandle,F_aimDot, 'F_aimDot') - call HDF5_write(fileHandle,F, 'F') - call HDF5_write(fileHandle,F_lastInc, 'F_lastInc') + call HDF5_write(groupHandle,F_aim, 'F_aim') + call HDF5_write(groupHandle,F_aim_lastInc,'F_aim_lastInc') + call HDF5_write(groupHandle,F_aimDot, 'F_aimDot') + call HDF5_write(groupHandle,F, 'F') + call HDF5_write(groupHandle,F_lastInc, 'F_lastInc') - call HDF5_write(fileHandle,C_volAvg, 'C_volAvg') - call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') - call HDF5_write(fileHandle,C_minMaxAvg, 'C_minMaxAvg') + call HDF5_write(groupHandle,C_volAvg, 'C_volAvg') + call HDF5_write(groupHandle,C_volAvgLastInc,'C_volAvgLastInc') + call HDF5_write(groupHandle,C_minMaxAvg, 'C_minMaxAvg') + call HDF5_closeGroup(groupHandle) call HDF5_closeFile(fileHandle) if (num%update_gamma) call utilities_saveReferenceStiffness diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 792b89fce..4c3f2de72 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -102,8 +102,8 @@ subroutine grid_mech_spectral_polarisation_init F, & ! specific (sub)pointer F_tau ! specific (sub)pointer PetscInt, dimension(worldsize) :: localK - integer(HID_T) :: fileHandle - integer :: fileUnit + integer(HID_T) :: fileHandle, groupHandle + integer :: fileUnit character(len=1024) :: rankStr write(6,'(/,a)') ' <<<+- grid_mech_spectral_polarisation init -+>>>' @@ -156,23 +156,24 @@ subroutine grid_mech_spectral_polarisation_init !-------------------------------------------------------------------------------------------------- ! init fields call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) ! places pointer on PETSc data - F => FandF_tau( 0: 8,:,:,:) - F_tau => FandF_tau( 9:17,:,:,:) + F => FandF_tau(0: 8,:,:,:) + F_tau => FandF_tau(9:17,:,:,:) restartRead: if (interface_restartInc > 0) then write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') & ' reading values of increment ', interface_restartInc, ' from file' write(rankStr,'(a1,i0)')'_',worldrank - fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5') + fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5') + groupHandle = HDF5_openGroup(fileHandle,'solver') - call HDF5_read(fileHandle,F_aim, 'F_aim') - call HDF5_read(fileHandle,F_aim_lastInc,'F_aim_lastInc') - call HDF5_read(fileHandle,F_aimDot, 'F_aimDot') - call HDF5_read(fileHandle,F, 'F') - call HDF5_read(fileHandle,F_lastInc, 'F_lastInc') - call HDF5_read(fileHandle,F_tau, 'F_tau') - call HDF5_read(fileHandle,F_tau_lastInc,'F_tau_lastInc') + call HDF5_read(groupHandle,F_aim, 'F_aim') + call HDF5_read(groupHandle,F_aim_lastInc,'F_aim_lastInc') + call HDF5_read(groupHandle,F_aimDot, 'F_aimDot') + call HDF5_read(groupHandle,F, 'F') + call HDF5_read(groupHandle,F_lastInc, 'F_lastInc') + call HDF5_read(groupHandle,F_tau, 'F_tau') + call HDF5_read(groupHandle,F_tau_lastInc,'F_tau_lastInc') elseif (interface_restartInc == 0) then restartRead F_lastInc = spread(spread(spread(math_I3,3,grid(1)),4,grid(2)),5,grid3) ! initialize to identity @@ -192,8 +193,10 @@ subroutine grid_mech_spectral_polarisation_init restartRead2: if (interface_restartInc > 0) then write(6,'(/,a,'//IO_intOut(interface_restartInc)//',a)') & ' reading more values of increment ', interface_restartInc, ' from file' - call HDF5_read(fileHandle,C_volAvg, 'C_volAvg') - call HDF5_read(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') + call HDF5_read(groupHandle,C_volAvg, 'C_volAvg') + call HDF5_read(groupHandle,C_volAvgLastInc,'C_volAvgLastInc') + + call HDF5_closeGroup(groupHandle) call HDF5_closeFile(fileHandle) call MPI_File_open(PETSC_COMM_WORLD, trim(getSolverJobName())//'.C_ref', & @@ -362,7 +365,7 @@ subroutine grid_mech_spectral_polarisation_age() PetscScalar, dimension(:,:,:,:), pointer :: FandF_tau, F call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) - F => FandF_tau(0: 8,:,:,:) + F => FandF_tau(0:8,:,:,:) materialpoint_F0 = reshape(F,[3,3,1,product(grid(1:2))*grid3]) call utilities_updateCoords(F) call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) @@ -377,7 +380,7 @@ subroutine grid_mech_spectral_polarisation_restartWrite() PetscErrorCode :: ierr PetscScalar, dimension(:,:,:,:), pointer :: FandF_tau, F, F_tau - integer(HID_T) :: fileHandle + integer(HID_T) :: fileHandle, groupHandle character(len=32) :: rankStr call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) @@ -387,19 +390,21 @@ subroutine grid_mech_spectral_polarisation_restartWrite() write(6,'(a)') ' writing solver data required for restart to file';flush(6) write(rankStr,'(a1,i0)')'_',worldrank - fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') + fileHandle = HDF5_openFile(trim(getSolverJobName())//trim(rankStr)//'.hdf5','w') + groupHandle = HDF5_addGroup(fileHandle,'solver') - call HDF5_write(fileHandle,F_aim, 'F_aim') - call HDF5_write(fileHandle,F_aim_lastInc, 'F_aim_lastInc') - call HDF5_write(fileHandle,F_aimDot, 'F_aimDot') - call HDF5_write(fileHandle,F, 'F') - call HDF5_write(fileHandle,F_lastInc, 'F_lastInc') - call HDF5_write(fileHandle,F_tau, 'F_tau') - call HDF5_write(fileHandle,F_tau_lastInc, 'F_tau_lastInc') + call HDF5_write(groupHandle,F_aim, 'F_aim') + call HDF5_write(groupHandle,F_aim_lastInc,'F_aim_lastInc') + call HDF5_write(groupHandle,F_aimDot, 'F_aimDot') + call HDF5_write(groupHandle,F, 'F') + call HDF5_write(groupHandle,F_lastInc, 'F_lastInc') + call HDF5_write(groupHandle,F_tau, 'F_tau') + call HDF5_write(groupHandle,F_tau_lastInc,'F_tau_lastInc') - call HDF5_write(fileHandle,C_volAvg, 'C_volAvg') - call HDF5_write(fileHandle,C_volAvgLastInc,'C_volAvgLastInc') + call HDF5_write(groupHandle,C_volAvg, 'C_volAvg') + call HDF5_write(groupHandle,C_volAvgLastInc,'C_volAvgLastInc') + call HDF5_closeGroup(groupHandle) call HDF5_closeFile(fileHandle) if(num%update_gamma) call utilities_saveReferenceStiffness @@ -483,13 +488,13 @@ subroutine formResidual(in, FandF_tau, & integer :: & i, j, k, e - F => FandF_tau(1:3,1:3,1,& + F => FandF_tau(1:3,1:3,1,& XG_RANGE,YG_RANGE,ZG_RANGE) - F_tau => FandF_tau(1:3,1:3,2,& + F_tau => FandF_tau(1:3,1:3,2,& XG_RANGE,YG_RANGE,ZG_RANGE) - residual_F => residuum(1:3,1:3,1,& + residual_F => residuum(1:3,1:3,1,& X_RANGE, Y_RANGE, Z_RANGE) - residual_F_tau => residuum(1:3,1:3,2,& + residual_F_tau => residuum(1:3,1:3,2,& X_RANGE, Y_RANGE, Z_RANGE) F_av = sum(sum(sum(F,dim=5),dim=4),dim=3) * wgt From 8de6fcfc2450f2073c1d495be9dd2c3ae7b8f673 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 28 Oct 2019 13:29:32 +0100 Subject: [PATCH 094/233] unifying names --- src/CPFEM2.f90 | 6 +++--- src/grid/DAMASK_grid.f90 | 2 +- src/grid/grid_mech_FEM.f90 | 3 ++- src/grid/grid_mech_spectral_basic.f90 | 3 ++- src/grid/grid_mech_spectral_polarisation.f90 | 3 ++- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index a606856c1..64c33703a 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -33,7 +33,7 @@ module CPFEM2 private public :: & - CPFEM_age, & + CPFEM_forward, & CPFEM_initAll, & CPFEM_results, & CPFEM_restartWrite @@ -123,7 +123,7 @@ end subroutine CPFEM_init !-------------------------------------------------------------------------------------------------- !> @brief Forward data after successful increment. !-------------------------------------------------------------------------------------------------- -subroutine CPFEM_age +subroutine CPFEM_forward integer :: i, homog, mySource @@ -150,7 +150,7 @@ subroutine CPFEM_age damageState (homog)%state0 = damageState (homog)%state enddo -end subroutine CPFEM_age +end subroutine CPFEM_forward !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 7ffa8fcd7..397a53c13 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -481,6 +481,7 @@ program DAMASK_spectral case(FIELD_DAMAGE_ID); call grid_damage_spectral_forward end select enddo + call CPFEM_forward !-------------------------------------------------------------------------------------------------- ! solve fields @@ -518,7 +519,6 @@ program DAMASK_spectral if ( (all(solres(:)%converged .and. solres(:)%stagConverged)) & ! converged .and. .not. solres(1)%termIll) then ! and acceptable solution found call mech_age - call CPFEM_age timeIncOld = timeinc cutBack = .false. guess = .true. ! start guessing after first converged (sub)inc diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index b50b52885..f7a0d796f 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -338,6 +338,8 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat F_lastInc = F ! winding F forward endif + materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) + !-------------------------------------------------------------------------------------------------- ! update average and local deformation gradients F_aim = F_aim_lastInc + F_aimDot * timeinc @@ -354,7 +356,6 @@ end subroutine grid_mech_FEM_forward !-------------------------------------------------------------------------------------------------- subroutine grid_mech_FEM_age() - materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) call utilities_updateCoords(F) end subroutine grid_mech_FEM_age diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index c3f538680..46ef3145b 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -302,6 +302,8 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi math_rotate_backward33(F_aimDot,rotation_BC)) F_lastInc = reshape(F,[3,3,grid(1),grid(2),grid3]) ! winding F forward endif + + materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) !-------------------------------------------------------------------------------------------------- ! update average and local deformation gradients @@ -322,7 +324,6 @@ subroutine grid_mech_spectral_basic_age() PetscScalar, dimension(:,:,:,:), pointer :: F call DMDAVecGetArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) - materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) call utilities_updateCoords(F) call DMDAVecRestoreArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 4c3f2de72..9c54b75d6 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -330,6 +330,8 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa F_tau_lastInc = reshape(F_tau,[3,3,grid(1),grid(2),grid3]) ! winding F_tau forward endif + materialpoint_F0 = reshape(F,[3,3,1,product(grid(1:2))*grid3]) + !-------------------------------------------------------------------------------------------------- ! update average and local deformation gradients F_aim = F_aim_lastInc + F_aimDot * timeinc @@ -366,7 +368,6 @@ subroutine grid_mech_spectral_polarisation_age() call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) F => FandF_tau(0:8,:,:,:) - materialpoint_F0 = reshape(F,[3,3,1,product(grid(1:2))*grid3]) call utilities_updateCoords(F) call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) From d1f719d3cfa3048cd1cce92b30811dfb5d9de38f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 28 Oct 2019 13:36:36 +0100 Subject: [PATCH 095/233] separation of "age" and "forward" not useful --- src/grid/DAMASK_grid.f90 | 12 ++++++------ src/grid/grid_mech_FEM.f90 | 6 +++--- src/grid/grid_mech_spectral_basic.f90 | 6 +++--- src/grid/grid_mech_spectral_polarisation.f90 | 11 +++++------ 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 397a53c13..46f78ed71 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -94,8 +94,8 @@ program DAMASK_spectral mech_forward procedure(grid_mech_spectral_basic_solution), pointer :: & mech_solution - procedure(grid_mech_spectral_basic_age), pointer :: & - mech_age + procedure(grid_mech_spectral_basic_updateCoords), pointer :: & + mech_updateCoords procedure(grid_mech_spectral_basic_restartWrite), pointer :: & mech_restartWrite @@ -125,7 +125,7 @@ program DAMASK_spectral mech_init => grid_mech_spectral_basic_init mech_forward => grid_mech_spectral_basic_forward mech_solution => grid_mech_spectral_basic_solution - mech_age => grid_mech_spectral_basic_age + mech_updateCoords => grid_mech_spectral_basic_updateCoords mech_restartWrite => grid_mech_spectral_basic_restartWrite case ('polarisation') @@ -134,7 +134,7 @@ program DAMASK_spectral mech_init => grid_mech_spectral_polarisation_init mech_forward => grid_mech_spectral_polarisation_forward mech_solution => grid_mech_spectral_polarisation_solution - mech_age => grid_mech_spectral_polarisation_age + mech_updateCoords => grid_mech_spectral_polarisation_updateCoords mech_restartWrite => grid_mech_spectral_polarisation_restartWrite case ('fem') @@ -143,7 +143,7 @@ program DAMASK_spectral mech_init => grid_mech_FEM_init mech_forward => grid_mech_FEM_forward mech_solution => grid_mech_FEM_solution - mech_age => grid_mech_FEM_age + mech_updateCoords => grid_mech_FEM_updateCoords mech_restartWrite => grid_mech_FEM_restartWrite case default @@ -518,7 +518,7 @@ program DAMASK_spectral if ( (all(solres(:)%converged .and. solres(:)%stagConverged)) & ! converged .and. .not. solres(1)%termIll) then ! and acceptable solution found - call mech_age + call mech_updateCoords timeIncOld = timeinc cutBack = .false. guess = .true. ! start guessing after first converged (sub)inc diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index f7a0d796f..41b087805 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -72,7 +72,7 @@ module grid_mech_FEM grid_mech_FEM_init, & grid_mech_FEM_solution, & grid_mech_FEM_forward, & - grid_mech_FEM_age, & + grid_mech_FEM_updateCoords, & grid_mech_FEM_restartWrite contains @@ -354,11 +354,11 @@ end subroutine grid_mech_FEM_forward !-------------------------------------------------------------------------------------------------- !> @brief Age !-------------------------------------------------------------------------------------------------- -subroutine grid_mech_FEM_age() +subroutine grid_mech_FEM_updateCoords() call utilities_updateCoords(F) -end subroutine grid_mech_FEM_age +end subroutine grid_mech_FEM_updateCoords !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 46ef3145b..042e29928 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -76,7 +76,7 @@ module grid_mech_spectral_basic grid_mech_spectral_basic_init, & grid_mech_spectral_basic_solution, & grid_mech_spectral_basic_forward, & - grid_mech_spectral_basic_age, & + grid_mech_spectral_basic_updateCoords, & grid_mech_spectral_basic_restartWrite contains @@ -318,7 +318,7 @@ end subroutine grid_mech_spectral_basic_forward !-------------------------------------------------------------------------------------------------- !> @brief Age !-------------------------------------------------------------------------------------------------- -subroutine grid_mech_spectral_basic_age() +subroutine grid_mech_spectral_basic_updateCoords() PetscErrorCode :: ierr PetscScalar, dimension(:,:,:,:), pointer :: F @@ -327,7 +327,7 @@ subroutine grid_mech_spectral_basic_age() call utilities_updateCoords(F) call DMDAVecRestoreArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) -end subroutine grid_mech_spectral_basic_age +end subroutine grid_mech_spectral_basic_updateCoords !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 9c54b75d6..28a7a2e9d 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -82,7 +82,7 @@ module grid_mech_spectral_polarisation grid_mech_spectral_polarisation_init, & grid_mech_spectral_polarisation_solution, & grid_mech_spectral_polarisation_forward, & - grid_mech_spectral_polarisation_age, & + grid_mech_spectral_polarisation_updateCoords, & grid_mech_spectral_polarisation_restartWrite contains @@ -361,17 +361,16 @@ end subroutine grid_mech_spectral_polarisation_forward !-------------------------------------------------------------------------------------------------- !> @brief Age !-------------------------------------------------------------------------------------------------- -subroutine grid_mech_spectral_polarisation_age() +subroutine grid_mech_spectral_polarisation_updateCoords() PetscErrorCode :: ierr - PetscScalar, dimension(:,:,:,:), pointer :: FandF_tau, F + PetscScalar, dimension(:,:,:,:), pointer :: FandF_tau call DMDAVecGetArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) - F => FandF_tau(0:8,:,:,:) - call utilities_updateCoords(F) + call utilities_updateCoords(FandF_tau(0:8,:,:,:)) call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) -end subroutine grid_mech_spectral_polarisation_age +end subroutine grid_mech_spectral_polarisation_updateCoords !-------------------------------------------------------------------------------------------------- From ed8834e371cb711eb5515e2798e24fbe28fa828d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 28 Oct 2019 13:38:30 +0100 Subject: [PATCH 096/233] maybe we can do some guessing for CPFEM .. --- src/CPFEM2.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index 64c33703a..5e8aad95e 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -122,6 +122,7 @@ end subroutine CPFEM_init !-------------------------------------------------------------------------------------------------- !> @brief Forward data after successful increment. +! ToDo: Any guessing for the current states possible? !-------------------------------------------------------------------------------------------------- subroutine CPFEM_forward From c47f516769f7663e408b4eb597bec51a553631aa Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 28 Oct 2019 21:16:43 +0100 Subject: [PATCH 097/233] do not correct fluctuations --- src/grid/spectral_utilities.f90 | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 1f52d6ed3..2fb0ac822 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -1028,7 +1028,7 @@ subroutine utilities_updateCoords(F) ierr integer, dimension(MPI_STATUS_SIZE) :: & s - real(pReal), dimension(3) :: step, offset_coords + real(pReal), dimension(3) :: step real(pReal), dimension(3,3) :: Favg integer, dimension(3) :: me integer, dimension(3,8) :: & @@ -1063,14 +1063,6 @@ subroutine utilities_updateCoords(F) if (grid3Offset == 0) Favg = real(tensorField_fourier(1:3,1:3,1,1,1),pReal)*wgt call MPI_Bcast(Favg,9,MPI_DOUBLE,0,PETSC_COMM_WORLD,ierr) if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Bcast') - - !-------------------------------------------------------------------------------------------------- - ! add average to fluctuation and put (0,0,0) on (0,0,0): MD: Needs improvement, edge should be on zero - step = geomSize/real(grid, pReal) - if (grid3Offset == 0) offset_coords = vectorField_real(1:3,1,1,1) - call MPI_Bcast(offset_coords,3,MPI_DOUBLE,0,PETSC_COMM_WORLD,ierr) - if(ierr /=0) call IO_error(894, ext_msg='update_IPcoords/MPI_Bcast') - offset_coords = offset_coords - matmul(Favg,step/2.0_pReal) !-------------------------------------------------------------------------------------------------- ! pad cell center fluctuations along z-direction (needed when running MPI simulation) @@ -1111,8 +1103,7 @@ subroutine utilities_updateCoords(F) ! calculate cell center displacements do k = 1,grid3; do j = 1,grid(2); do i = 1,grid(1) IPcoords(1:3,i,j,k) = vectorField_real(1:3,i,j,k) & - + matmul(Favg,step*real([i,j,k+grid3Offset]-1,pReal)) & - - offset_coords + + matmul(Favg,step*real([i,j,k+grid3Offset]-1,pReal)) enddo; enddo; enddo call discretization_setNodeCoords(reshape(NodeCoords,[3,(grid(1)+1)*(grid(2)+1)*(grid3+1)])) From f451d19c1ef09eb8c92a90a634c622d3dd3b55ee Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 28 Oct 2019 21:27:57 +0100 Subject: [PATCH 098/233] forall is obsolete some calculation simplified --- src/grid/spectral_utilities.f90 | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 2fb0ac822..42dd3c899 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -773,10 +773,11 @@ subroutine utilities_fourierScalarGradient() integer :: i, j, k - vectorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) - forall(k = 1:grid3, j = 1:grid(2), i = 1:grid1Red) & - vectorField_fourier(1:3,i,j,k) = scalarField_fourier(i,j,k)*xi1st(1:3,i,j,k) - + vectorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) ! ToDo check padding and set only affected values to zero + do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red + vectorField_fourier(1:3,i,j,k) = scalarField_fourier(i,j,k)*xi1st(1:3,i,j,k) ! ToDo: no -conjg? + enddo; enddo; enddo + end subroutine utilities_fourierScalarGradient @@ -785,13 +786,13 @@ end subroutine utilities_fourierScalarGradient !-------------------------------------------------------------------------------------------------- subroutine utilities_fourierVectorDivergence() - integer :: i, j, k - - scalarField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) - forall(k = 1:grid3, j = 1:grid(2), i = 1:grid1Red) & - scalarField_fourier(i,j,k) = scalarField_fourier(i,j,k) & - + sum(vectorField_fourier(1:3,i,j,k)*conjg(-xi1st(1:3,i,j,k))) + integer :: i, j, k + scalarField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) ! ToDo check padding and set only affected values to zero + do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red + scalarField_fourier(i,j,k) = sum(vectorField_fourier(1:3,i,j,k)*conjg(-xi1st(1:3,i,j,k))) + enddo; enddo; enddo + end subroutine utilities_fourierVectorDivergence @@ -802,7 +803,7 @@ subroutine utilities_fourierVectorGradient() integer :: i, j, k, m, n - tensorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) + tensorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) ! ToDo check padding and set only affected values to zero do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red do m = 1, 3; do n = 1, 3 tensorField_fourier(m,n,i,j,k) = vectorField_fourier(m,i,j,k)*xi1st(n,i,j,k) @@ -817,14 +818,11 @@ end subroutine utilities_fourierVectorGradient !-------------------------------------------------------------------------------------------------- subroutine utilities_fourierTensorDivergence() - integer :: i, j, k, m, n + integer :: i, j, k - vectorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) + vectorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) ! ToDo check padding and set only affected values to zero do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red - do m = 1, 3; do n = 1, 3 - vectorField_fourier(m,i,j,k) = vectorField_fourier(m,i,j,k) & - + tensorField_fourier(m,n,i,j,k)*conjg(-xi1st(n,i,j,k)) - enddo; enddo + vectorField_fourier(:,i,j,k) = matmul(tensorField_fourier(:,:,i,j,k),conjg(-xi1st(:,i,j,k))) enddo; enddo; enddo end subroutine utilities_fourierTensorDivergence From 1ae33cf215702af1b2a566e0fd3714032b4eb83b Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 29 Oct 2019 09:15:35 +0100 Subject: [PATCH 099/233] avoid one loop and use filtered frequencies --- src/grid/spectral_utilities.f90 | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 42dd3c899..241251a50 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -428,7 +428,7 @@ end subroutine utilities_updateGamma !-------------------------------------------------------------------------------------------------- !> @brief forward FFT of data in field_real to field_fourier -!> @details Does an unweighted filtered FFT transform from real to complex +!> @details Does an unweighted FFT transform from real to complex !-------------------------------------------------------------------------------------------------- subroutine utilities_FFTtensorForward @@ -450,7 +450,7 @@ end subroutine utilities_FFTtensorBackward !-------------------------------------------------------------------------------------------------- !> @brief forward FFT of data in scalarField_real to scalarField_fourier -!> @details Does an unweighted filtered FFT transform from real to complex +!> @details Does an unweighted FFT transform from real to complex !-------------------------------------------------------------------------------------------------- subroutine utilities_FFTscalarForward @@ -473,7 +473,7 @@ end subroutine utilities_FFTscalarBackward !-------------------------------------------------------------------------------------------------- !> @brief forward FFT of data in field_real to field_fourier with highest freqs. removed -!> @details Does an unweighted filtered FFT transform from real to complex. +!> @details Does an unweighted FFT transform from real to complex. !-------------------------------------------------------------------------------------------------- subroutine utilities_FFTvectorForward @@ -1044,17 +1044,16 @@ subroutine utilities_updateCoords(F) !-------------------------------------------------------------------------------------------------- ! integration in Fourier space to get fluctuations of cell center discplacements tensorField_real = 0.0_pReal - tensorField_real(1:3,1:3,1:grid(1),1:grid(2),1:grid3) = F + tensorField_real(1:3,1:3,1:grid(1),1:grid(2),1:grid3) = F ! ToDo check padding and set only affected values to zero call utilities_FFTtensorForward() - call utilities_fourierTensorDivergence() - + + vectorField_fourier = cmplx(0.0,0.0,pReal) ! ToDo check padding and set only affected values to zero do k = 1, grid3; do j = 1, grid(2); do i = 1, grid1Red - if (any(cNeq(xi1st(1:3,i,j,k),cmplx(0.0,0.0,pReal)))) & - vectorField_fourier(1:3,i,j,k) = vectorField_fourier(1:3,i,j,k) & - / sum(conjg(-xi1st(1:3,i,j,k))*xi1st(1:3,i,j,k)) + if(any([i,j,k+grid3Offset] /= 1)) & + vectorField_fourier(1:3,i,j,k) = matmul(tensorField_fourier(1:3,1:3,i,j,k),xi2nd(1:3,i,j,k)) & + / sum(conjg(-xi2nd(1:3,i,j,k))*xi2nd(1:3,i,j,k)) * wgt enddo; enddo; enddo call fftw_mpi_execute_dft_c2r(planVectorBack,vectorField_fourier,vectorField_real) - vectorField_real = vectorField_real * wgt !-------------------------------------------------------------------------------------------------- ! average F From 402e681cf56380d8c96f3edc081efee5e44f432a Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 29 Oct 2019 16:18:58 +0100 Subject: [PATCH 100/233] initialization of arrays for fourier transform more reasonable - padding entries in real data array need to be zero - all values of the fourier data arrays are explicitly set --- src/grid/spectral_utilities.f90 | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 241251a50..b85e84c86 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -428,10 +428,12 @@ end subroutine utilities_updateGamma !-------------------------------------------------------------------------------------------------- !> @brief forward FFT of data in field_real to field_fourier -!> @details Does an unweighted FFT transform from real to complex +!> @details Does an unweighted FFT transform from real to complex. Extra padding entries are set +! to 0.0 !-------------------------------------------------------------------------------------------------- subroutine utilities_FFTtensorForward + tensorField_real(1:3,1:3,grid(1)+1:grid1Red*2,:,:) = cmplx(0.0,0.0,pReal) call fftw_mpi_execute_dft_r2c(planTensorForth,tensorField_real,tensorField_fourier) end subroutine utilities_FFTtensorForward @@ -450,10 +452,12 @@ end subroutine utilities_FFTtensorBackward !-------------------------------------------------------------------------------------------------- !> @brief forward FFT of data in scalarField_real to scalarField_fourier -!> @details Does an unweighted FFT transform from real to complex +!> @details Does an unweighted FFT transform from real to complex. Extra padding entries are set +! to 0.0 !-------------------------------------------------------------------------------------------------- subroutine utilities_FFTscalarForward + scalarField_real(grid(1)+1:grid1Red*2,:,:) = cmplx(0.0,0.0,pReal) call fftw_mpi_execute_dft_r2c(planScalarForth,scalarField_real,scalarField_fourier) end subroutine utilities_FFTscalarForward @@ -473,10 +477,12 @@ end subroutine utilities_FFTscalarBackward !-------------------------------------------------------------------------------------------------- !> @brief forward FFT of data in field_real to field_fourier with highest freqs. removed -!> @details Does an unweighted FFT transform from real to complex. +!> @details Does an unweighted FFT transform from real to complex. Extra padding entries are set +! to 0.0 !-------------------------------------------------------------------------------------------------- subroutine utilities_FFTvectorForward + vectorField_real(1:3,grid(1)+1:grid1Red*2,:,:) = cmplx(0.0,0.0,pReal) call fftw_mpi_execute_dft_r2c(planVectorForth,vectorField_real,vectorField_fourier) end subroutine utilities_FFTvectorForward @@ -773,7 +779,6 @@ subroutine utilities_fourierScalarGradient() integer :: i, j, k - vectorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) ! ToDo check padding and set only affected values to zero do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red vectorField_fourier(1:3,i,j,k) = scalarField_fourier(i,j,k)*xi1st(1:3,i,j,k) ! ToDo: no -conjg? enddo; enddo; enddo @@ -788,7 +793,6 @@ subroutine utilities_fourierVectorDivergence() integer :: i, j, k - scalarField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) ! ToDo check padding and set only affected values to zero do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red scalarField_fourier(i,j,k) = sum(vectorField_fourier(1:3,i,j,k)*conjg(-xi1st(1:3,i,j,k))) enddo; enddo; enddo @@ -803,7 +807,6 @@ subroutine utilities_fourierVectorGradient() integer :: i, j, k, m, n - tensorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) ! ToDo check padding and set only affected values to zero do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red do m = 1, 3; do n = 1, 3 tensorField_fourier(m,n,i,j,k) = vectorField_fourier(m,i,j,k)*xi1st(n,i,j,k) @@ -820,7 +823,6 @@ subroutine utilities_fourierTensorDivergence() integer :: i, j, k - vectorField_fourier = cmplx(0.0_pReal,0.0_pReal,pReal) ! ToDo check padding and set only affected values to zero do k = 1, grid3; do j = 1, grid(2); do i = 1,grid1Red vectorField_fourier(:,i,j,k) = matmul(tensorField_fourier(:,:,i,j,k),conjg(-xi1st(:,i,j,k))) enddo; enddo; enddo @@ -1043,16 +1045,18 @@ subroutine utilities_updateCoords(F) step = geomSize/real(grid, pReal) !-------------------------------------------------------------------------------------------------- ! integration in Fourier space to get fluctuations of cell center discplacements - tensorField_real = 0.0_pReal - tensorField_real(1:3,1:3,1:grid(1),1:grid(2),1:grid3) = F ! ToDo check padding and set only affected values to zero + tensorField_real(1:3,1:3,1:grid(1),1:grid(2),1:grid3) = F call utilities_FFTtensorForward() - vectorField_fourier = cmplx(0.0,0.0,pReal) ! ToDo check padding and set only affected values to zero do k = 1, grid3; do j = 1, grid(2); do i = 1, grid1Red - if(any([i,j,k+grid3Offset] /= 1)) & - vectorField_fourier(1:3,i,j,k) = matmul(tensorField_fourier(1:3,1:3,i,j,k),xi2nd(1:3,i,j,k)) & - / sum(conjg(-xi2nd(1:3,i,j,k))*xi2nd(1:3,i,j,k)) * wgt + if(any([i,j,k+grid3Offset] /= 1)) then + vectorField_fourier(1:3,i,j,k) = matmul(tensorField_fourier(1:3,1:3,i,j,k),xi2nd(1:3,i,j,k)) & + / sum(conjg(-xi2nd(1:3,i,j,k))*xi2nd(1:3,i,j,k)) * wgt + else + vectorField_fourier(1:3,i,j,k) = cmplx(0.0,0.0,pReal) + endif enddo; enddo; enddo + call fftw_mpi_execute_dft_c2r(planVectorBack,vectorField_fourier,vectorField_real) !-------------------------------------------------------------------------------------------------- From 0c6b7e1112d3a3c08ecfbe7e470106fd53c24cd5 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 29 Oct 2019 23:15:02 +0100 Subject: [PATCH 101/233] not nice, but working ... --- src/grid/DAMASK_grid.f90 | 2 +- src/grid/grid_mech_FEM.f90 | 7 +++---- src/grid/grid_mech_spectral_basic.f90 | 6 +++--- src/grid/grid_mech_spectral_polarisation.f90 | 8 ++++---- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 46f78ed71..0925e54bf 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -481,7 +481,7 @@ program DAMASK_spectral case(FIELD_DAMAGE_ID); call grid_damage_spectral_forward end select enddo - call CPFEM_forward + if(.not. cutBack) call CPFEM_forward !-------------------------------------------------------------------------------------------------- ! solve fields diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 41b087805..d81b071de 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -324,7 +324,6 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat F_aimDot = & F_aimDot + deformation_BC%maskFloat * (deformation_BC%values - F_aim_lastInc)/loadCaseTime endif - if (guess) then call VecWAXPY(solution_rate,-1.0_pReal,solution_lastInc,solution_current,ierr) @@ -335,11 +334,11 @@ subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformat endif call VecCopy(solution_current,solution_lastInc,ierr); CHKERRQ(ierr) - F_lastInc = F ! winding F forward + F_lastInc = F + + materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) endif - materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) - !-------------------------------------------------------------------------------------------------- ! update average and local deformation gradients F_aim = F_aim_lastInc + F_aimDot * timeinc diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 042e29928..d0952b1ca 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -300,10 +300,10 @@ subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTi Fdot = utilities_calculateRate(guess, & F_lastInc,reshape(F,[3,3,grid(1),grid(2),grid3]),timeinc_old, & math_rotate_backward33(F_aimDot,rotation_BC)) - F_lastInc = reshape(F,[3,3,grid(1),grid(2),grid3]) ! winding F forward + F_lastInc = reshape(F,[3,3,grid(1),grid(2),grid3]) + + materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) endif - - materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) !-------------------------------------------------------------------------------------------------- ! update average and local deformation gradients diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 28a7a2e9d..0d9f56af4 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -326,12 +326,12 @@ subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loa F_tauDot = utilities_calculateRate(guess, & F_tau_lastInc,reshape(F_tau,[3,3,grid(1),grid(2),grid3]), timeinc_old, & math_rotate_backward33(F_aimDot,rotation_BC)) - F_lastInc = reshape(F, [3,3,grid(1),grid(2),grid3]) ! winding F forward - F_tau_lastInc = reshape(F_tau,[3,3,grid(1),grid(2),grid3]) ! winding F_tau forward + F_lastInc = reshape(F, [3,3,grid(1),grid(2),grid3]) + F_tau_lastInc = reshape(F_tau,[3,3,grid(1),grid(2),grid3]) + + materialpoint_F0 = reshape(F,[3,3,1,product(grid(1:2))*grid3]) endif - materialpoint_F0 = reshape(F,[3,3,1,product(grid(1:2))*grid3]) - !-------------------------------------------------------------------------------------------------- ! update average and local deformation gradients F_aim = F_aim_lastInc + F_aimDot * timeinc From 1d2d7d1ea3c77ce5d190e0bb4db7c117e1625929 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 29 Oct 2019 23:24:12 +0100 Subject: [PATCH 102/233] remove public variables they make code unreadable and unmaintainable --- src/grid/DAMASK_grid.f90 | 9 +++++---- src/grid/grid_damage_spectral.f90 | 3 ++- src/grid/grid_mech_FEM.f90 | 4 +++- src/grid/grid_mech_spectral_basic.f90 | 4 +++- src/grid/grid_mech_spectral_polarisation.f90 | 6 ++++-- src/grid/grid_thermal_spectral.f90 | 3 ++- src/grid/spectral_utilities.f90 | 4 +--- 7 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 0925e54bf..24c9da274 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -60,7 +60,8 @@ program DAMASK_spectral remainingLoadCaseTime = 0.0_pReal !< remaining time of current load case logical :: & guess, & !< guess along former trajectory - stagIterate + stagIterate, & + cutBack = .false. integer :: & i, j, k, l, field, & errorID = 0, & @@ -472,13 +473,13 @@ program DAMASK_spectral select case(loadCases(currentLoadCase)%ID(field)) case(FIELD_MECH_ID) call mech_forward (& - guess,timeinc,timeIncOld,remainingLoadCaseTime, & + cutBack,guess,timeinc,timeIncOld,remainingLoadCaseTime, & deformation_BC = loadCases(currentLoadCase)%deformation, & stress_BC = loadCases(currentLoadCase)%stress, & rotation_BC = loadCases(currentLoadCase)%rotation) - case(FIELD_THERMAL_ID); call grid_thermal_spectral_forward - case(FIELD_DAMAGE_ID); call grid_damage_spectral_forward + case(FIELD_THERMAL_ID); call grid_thermal_spectral_forward(cutBack) + case(FIELD_DAMAGE_ID); call grid_damage_spectral_forward(cutBack) end select enddo if(.not. cutBack) call CPFEM_forward diff --git a/src/grid/grid_damage_spectral.f90 b/src/grid/grid_damage_spectral.f90 index 3a6fe2181..1fb91b49b 100644 --- a/src/grid/grid_damage_spectral.f90 +++ b/src/grid/grid_damage_spectral.f90 @@ -203,8 +203,9 @@ end function grid_damage_spectral_solution !-------------------------------------------------------------------------------------------------- !> @brief spectral damage forwarding routine !-------------------------------------------------------------------------------------------------- -subroutine grid_damage_spectral_forward +subroutine grid_damage_spectral_forward(cutBack) + logical, intent(in) :: cutBack integer :: i, j, k, cell DM :: dm_local PetscScalar, dimension(:,:,:), pointer :: x_scal diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index d81b071de..0c3844fcf 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -284,9 +284,11 @@ end function grid_mech_FEM_solution !> @details find new boundary conditions and best F estimate for end of current timestep !> possibly writing restart information, triggering of state increment in DAMASK, and updating of IPcoordinates !-------------------------------------------------------------------------------------------------- -subroutine grid_mech_FEM_forward(guess,timeinc,timeinc_old,loadCaseTime,deformation_BC,stress_BC,rotation_BC) +subroutine grid_mech_FEM_forward(cutBack,guess,timeinc,timeinc_old,loadCaseTime,& + deformation_BC,stress_BC,rotation_BC) logical, intent(in) :: & + cutBack, & guess real(pReal), intent(in) :: & timeinc_old, & diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index d0952b1ca..3dc978dc6 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -256,9 +256,11 @@ end function grid_mech_spectral_basic_solution !> @details find new boundary conditions and best F estimate for end of current timestep !> possibly writing restart information, triggering of state increment in DAMASK, and updating of IPcoordinates !-------------------------------------------------------------------------------------------------- -subroutine grid_mech_spectral_basic_forward(guess,timeinc,timeinc_old,loadCaseTime,deformation_BC,stress_BC,rotation_BC) +subroutine grid_mech_spectral_basic_forward(cutBack,guess,timeinc,timeinc_old,loadCaseTime,& + deformation_BC,stress_BC,rotation_BC) logical, intent(in) :: & + cutBack, & guess real(pReal), intent(in) :: & timeinc_old, & diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 0d9f56af4..c1b5d79c9 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -275,9 +275,11 @@ end function grid_mech_spectral_polarisation_solution !> @details find new boundary conditions and best F estimate for end of current timestep !> possibly writing restart information, triggering of state increment in DAMASK, and updating of IPcoordinates !-------------------------------------------------------------------------------------------------- -subroutine grid_mech_spectral_polarisation_forward(guess,timeinc,timeinc_old,loadCaseTime,deformation_BC,stress_BC,rotation_BC) +subroutine grid_mech_spectral_polarisation_forward(cutBack,guess,timeinc,timeinc_old,loadCaseTime,& + deformation_BC,stress_BC,rotation_BC) - logical, intent(in) :: & + logical, intent(in) :: & + cutBack, & guess real(pReal), intent(in) :: & timeinc_old, & diff --git a/src/grid/grid_thermal_spectral.f90 b/src/grid/grid_thermal_spectral.f90 index 04b3ace66..c7f886f13 100644 --- a/src/grid/grid_thermal_spectral.f90 +++ b/src/grid/grid_thermal_spectral.f90 @@ -203,8 +203,9 @@ end function grid_thermal_spectral_solution !-------------------------------------------------------------------------------------------------- !> @brief forwarding routine !-------------------------------------------------------------------------------------------------- -subroutine grid_thermal_spectral_forward +subroutine grid_thermal_spectral_forward(cutBack) + logical, intent(in) :: cutBack integer :: i, j, k, cell DM :: dm_local PetscScalar, dimension(:,:,:), pointer :: x_scal diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index b85e84c86..1a3aefa35 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -22,9 +22,7 @@ module spectral_utilities private include 'fftw3-mpi.f03' - - logical, public :: cutBack = .false. !< cut back of BVP solver in case convergence is not achieved or a material point is terminally ill - + !-------------------------------------------------------------------------------------------------- ! field labels information enum, bind(c) From 40507846c90d53465d2008e8bc857ebae3705ea2 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 30 Oct 2019 14:47:42 +0100 Subject: [PATCH 103/233] cell displacement are between nodes which start at (0,0,0) --- src/grid/spectral_utilities.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 1a3aefa35..b36820ec8 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -1102,7 +1102,7 @@ subroutine utilities_updateCoords(F) ! calculate cell center displacements do k = 1,grid3; do j = 1,grid(2); do i = 1,grid(1) IPcoords(1:3,i,j,k) = vectorField_real(1:3,i,j,k) & - + matmul(Favg,step*real([i,j,k+grid3Offset]-1,pReal)) + + matmul(Favg,step*real([i,j,k+grid3Offset]-0.5_pReal,pReal)) enddo; enddo; enddo call discretization_setNodeCoords(reshape(NodeCoords,[3,(grid(1)+1)*(grid(2)+1)*(grid3+1)])) From 368d4debdacac7a1f190f6052eb27662abaea4f2 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 30 Oct 2019 14:49:08 +0100 Subject: [PATCH 104/233] calculate average nodal position directly no need to average and have second memory access --- src/grid/spectral_utilities.f90 | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index b36820ec8..8b0e430f3 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -1089,14 +1089,13 @@ subroutine utilities_updateCoords(F) ! calculate nodal displacements nodeCoords = 0.0_pReal do k = 0,grid3; do j = 0,grid(2); do i = 0,grid(1) - average: do n = 1,8 + nodeCoords(1:3,i+1,j+1,k+1) = matmul(Favg,step*(real([i,j,k+grid3Offset],pReal))) + averageFluct: do n = 1,8 me = [i+neighbor(1,n),j+neighbor(2,n),k+neighbor(3,n)] nodeCoords(1:3,i+1,j+1,k+1) = nodeCoords(1:3,i+1,j+1,k+1) & - + IPfluct_padded(1:3,modulo(me(1)-1,grid(1))+1,modulo(me(2)-1,grid(2))+1,me(3)+1) & - + matmul(Favg,step*(real([me(1),me(2),me(3)+grid3Offset],pReal)-0.5_pReal)) - enddo average + + IPfluct_padded(1:3,modulo(me(1)-1,grid(1))+1,modulo(me(2)-1,grid(2))+1,me(3)+1)*0.125_pReal + enddo averageFluct enddo; enddo; enddo - nodeCoords = nodeCoords/8.0_pReal !-------------------------------------------------------------------------------------------------- ! calculate cell center displacements From 8a85123abc74a7fbcfbae37894e64f32db8e4863 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 30 Oct 2019 18:05:44 +0100 Subject: [PATCH 105/233] 4 space indent is python standard --- python/damask/mechanics.py | 374 ++++++++++++++++++------------------- 1 file changed, 187 insertions(+), 187 deletions(-) diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index b210ee3e8..436fbe091 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -1,247 +1,247 @@ import numpy as np def Cauchy(F,P): - """ - Return Cauchy stress calculated from 1. Piola-Kirchhoff stress and deformation gradient. + """ + Return Cauchy stress calculated from 1. Piola-Kirchhoff stress and deformation gradient. + + Resulting tensor is symmetrized as the Cauchy stress needs to be symmetric. - Resulting tensor is symmetrized as the Cauchy stress needs to be symmetric. - - Parameters - ---------- - F : numpy.array of shape (:,3,3) or (3,3) - Deformation gradient. - P : numpy.array of shape (:,3,3) or (3,3) - 1. Piola-Kirchhoff stress. + Parameters + ---------- + F : numpy.array of shape (:,3,3) or (3,3) + Deformation gradient. + P : numpy.array of shape (:,3,3) or (3,3) + 1. Piola-Kirchhoff stress. - """ - if np.shape(F) == np.shape(P) == (3,3): - sigma = 1.0/np.linalg.det(F) * np.dot(P,F.T) - else: - sigma = np.einsum('i,ijk,ilk->ijl',1.0/np.linalg.det(F),P,F) - return symmetric(sigma) + """ + if np.shape(F) == np.shape(P) == (3,3): + sigma = 1.0/np.linalg.det(F) * np.dot(P,F.T) + else: + sigma = np.einsum('i,ijk,ilk->ijl',1.0/np.linalg.det(F),P,F) + return symmetric(sigma) def strain_tensor(F,t,m): - """ - Return strain tensor calculated from deformation gradient. + """ + Return strain tensor calculated from deformation gradient. + + For details refer to https://en.wikipedia.org/wiki/Finite_strain_theory and + https://de.wikipedia.org/wiki/Verzerrungstensor - For details refer to https://en.wikipedia.org/wiki/Finite_strain_theory and - https://de.wikipedia.org/wiki/Verzerrungstensor - - Parameters - ---------- - F : numpy.array of shape (:,3,3) or (3,3) - Deformation gradient. - t : {‘V’, ‘U’} - Type of the polar decomposition, ‘V’ for left stretch tensor and ‘U’ for right stretch tensor. - m : float - Order of the strain. + Parameters + ---------- + F : numpy.array of shape (:,3,3) or (3,3) + Deformation gradient. + t : {‘V’, ‘U’} + Type of the polar decomposition, ‘V’ for left stretch tensor and ‘U’ for right stretch tensor. + m : float + Order of the strain. - """ - F_ = F.reshape((1,3,3)) if F.shape == (3,3) else F - if t == 'U': - B = np.matmul(F_,transpose(F_)) - w,n = np.linalg.eigh(B) - elif t == 'V': - C = np.matmul(transpose(F_),F_) - w,n = np.linalg.eigh(C) - - if m > 0.0: - eps = 1.0/(2.0*abs(m)) * (+ np.matmul(n,np.einsum('ij,ikj->ijk',w**m,n)) - - np.broadcast_to(np.ones(3),[F_.shape[0],3])) - elif m < 0.0: - eps = 1.0/(2.0*abs(m)) * (- np.matmul(n,np.einsum('ij,ikj->ijk',w**m,n)) - + np.broadcast_to(np.ones(3),[F_.shape[0],3])) - else: - eps = np.matmul(n,np.einsum('ij,ikj->ijk',0.5*np.log(w),n)) + """ + F_ = F.reshape((1,3,3)) if F.shape == (3,3) else F + if t == 'U': + B = np.matmul(F_,transpose(F_)) + w,n = np.linalg.eigh(B) + elif t == 'V': + C = np.matmul(transpose(F_),F_) + w,n = np.linalg.eigh(C) - return eps.reshape((3,3)) if np.shape(F) == (3,3) else \ - eps + if m > 0.0: + eps = 1.0/(2.0*abs(m)) * (+ np.matmul(n,np.einsum('ij,ikj->ijk',w**m,n)) + - np.broadcast_to(np.ones(3),[F_.shape[0],3])) + elif m < 0.0: + eps = 1.0/(2.0*abs(m)) * (- np.matmul(n,np.einsum('ij,ikj->ijk',w**m,n)) + + np.broadcast_to(np.ones(3),[F_.shape[0],3])) + else: + eps = np.matmul(n,np.einsum('ij,ikj->ijk',0.5*np.log(w),n)) + + return eps.reshape((3,3)) if np.shape(F) == (3,3) else \ + eps def deviatoric_part(x): - """ - Return deviatoric part of a tensor. - - Parameters - ---------- - x : numpy.array of shape (:,3,3) or (3,3) - Tensor of which the deviatoric part is computed. + """ + Return deviatoric part of a tensor. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the deviatoric part is computed. - """ - return x - np.eye(3)*spherical_part(x) if np.shape(x) == (3,3) else \ - x - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[x.shape[0],3,3]),spherical_part(x)) + """ + return x - np.eye(3)*spherical_part(x) if np.shape(x) == (3,3) else \ + x - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[x.shape[0],3,3]),spherical_part(x)) def spherical_part(x): - """ - Return spherical (hydrostatic) part of a tensor. - - A single scalar is returned, i.e. the hydrostatic part is not mapped on the 3rd order identity - matrix. + """ + Return spherical (hydrostatic) part of a tensor. - Parameters - ---------- - x : numpy.array of shape (:,3,3) or (3,3) - Tensor of which the hydrostatic part is computed. + A single scalar is returned, i.e. the hydrostatic part is not mapped on the 3rd order identity + matrix. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the hydrostatic part is computed. - """ - return np.trace(x)/3.0 if np.shape(x) == (3,3) else \ - np.trace(x,axis1=1,axis2=2)/3.0 + """ + return np.trace(x)/3.0 if np.shape(x) == (3,3) else \ + np.trace(x,axis1=1,axis2=2)/3.0 def Mises_stress(sigma): - """ - Return the Mises equivalent of a stress tensor. - - Parameters - ---------- - sigma : numpy.array of shape (:,3,3) or (3,3) - Symmetric stress tensor of which the von Mises equivalent is computed. + """ + Return the Mises equivalent of a stress tensor. + + Parameters + ---------- + sigma : numpy.array of shape (:,3,3) or (3,3) + Symmetric stress tensor of which the von Mises equivalent is computed. - """ - s = deviatoric_part(sigma) - return np.sqrt(3.0/2.0*(np.sum(s**2.0))) if np.shape(sigma) == (3,3) else \ - np.sqrt(3.0/2.0*np.einsum('ijk->i',s**2.0)) + """ + s = deviatoric_part(sigma) + return np.sqrt(3.0/2.0*(np.sum(s**2.0))) if np.shape(sigma) == (3,3) else \ + np.sqrt(3.0/2.0*np.einsum('ijk->i',s**2.0)) def Mises_strain(epsilon): - """ - Return the Mises equivalent of a strain tensor. - - Parameters - ---------- - epsilon : numpy.array of shape (:,3,3) or (3,3) - Symmetric strain tensor of which the von Mises equivalent is computed. + """ + Return the Mises equivalent of a strain tensor. + + Parameters + ---------- + epsilon : numpy.array of shape (:,3,3) or (3,3) + Symmetric strain tensor of which the von Mises equivalent is computed. - """ - s = deviatoric_part(epsilon) - return np.sqrt(2.0/3.0*(np.sum(s**2.0))) if np.shape(epsilon) == (3,3) else \ - np.sqrt(2.0/3.0*np.einsum('ijk->i',s**2.0)) + """ + s = deviatoric_part(epsilon) + return np.sqrt(2.0/3.0*(np.sum(s**2.0))) if np.shape(epsilon) == (3,3) else \ + np.sqrt(2.0/3.0*np.einsum('ijk->i',s**2.0)) def symmetric(x): - """ - Return the symmetrized tensor. - - Parameters - ---------- - x : numpy.array of shape (:,3,3) or (3,3) - Tensor of which the symmetrized values are computed. + """ + Return the symmetrized tensor. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the symmetrized values are computed. - """ - return (x+transpose(x))*0.5 + """ + return (x+transpose(x))*0.5 def maximum_shear(x): - """ - Return the maximum shear component of a symmetric tensor. - - Parameters - ---------- - x : numpy.array of shape (:,3,3) or (3,3) - Symmetric tensor of which the maximum shear is computed. + """ + Return the maximum shear component of a symmetric tensor. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Symmetric tensor of which the maximum shear is computed. - """ - w = np.linalg.eigvalsh(symmetric(x)) # eigenvalues in ascending order - return (w[2] - w[0])*0.5 if np.shape(x) == (3,3) else \ - (w[:,2] - w[:,0])*0.5 + """ + w = np.linalg.eigvalsh(symmetric(x)) # eigenvalues in ascending order + return (w[2] - w[0])*0.5 if np.shape(x) == (3,3) else \ + (w[:,2] - w[:,0])*0.5 def principal_components(x): - """ - Return the principal components of a symmetric tensor. - - The principal components (eigenvalues) are sorted in descending order, each repeated according to - its multiplicity. - - Parameters - ---------- - x : numpy.array of shape (:,3,3) or (3,3) - Symmetric tensor of which the principal compontents are computed. + """ + Return the principal components of a symmetric tensor. + + The principal components (eigenvalues) are sorted in descending order, each repeated according to + its multiplicity. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Symmetric tensor of which the principal compontents are computed. - """ - w = np.linalg.eigvalsh(symmetric(x)) # eigenvalues in ascending order - return w[::-1] if np.shape(x) == (3,3) else \ - w[:,::-1] + """ + w = np.linalg.eigvalsh(symmetric(x)) # eigenvalues in ascending order + return w[::-1] if np.shape(x) == (3,3) else \ + w[:,::-1] def transpose(x): - """ - Return the transpose of a tensor. - - Parameters - ---------- - x : numpy.array of shape (:,3,3) or (3,3) - Tensor of which the transpose is computed. + """ + Return the transpose of a tensor. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the transpose is computed. - """ - return x.T if np.shape(x) == (3,3) else \ - np.transpose(x,(0,2,1)) + """ + return x.T if np.shape(x) == (3,3) else \ + np.transpose(x,(0,2,1)) def rotational_part(x): - """ - Return the rotational part of a tensor. - - Parameters - ---------- - x : numpy.array of shape (:,3,3) or (3,3) - Tensor of which the rotational part is computed. + """ + Return the rotational part of a tensor. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the rotational part is computed. - """ - return __polar_decomposition(x,'R') + """ + return __polar_decomposition(x,'R') def left_stretch(x): - """ - Return the left stretch of a tensor. - - Parameters - ---------- - x : numpy.array of shape (:,3,3) or (3,3) - Tensor of which the left stretch is computed. + """ + Return the left stretch of a tensor. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the left stretch is computed. - """ - return __polar_decomposition(x,'V') + """ + return __polar_decomposition(x,'V') def right_stretch(x): - """ - Return the right stretch of a tensor. - - Parameters - ---------- - x : numpy.array of shape (:,3,3) or (3,3) - Tensor of which the right stretch is computed. + """ + Return the right stretch of a tensor. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the right stretch is computed. - """ - return __polar_decomposition(x,'U') + """ + return __polar_decomposition(x,'U') def __polar_decomposition(x,requested): - """ - Singular value decomposition. - - Parameters - ---------- - x : numpy.array of shape (:,3,3) or (3,3) - Tensor of which the singular values are computed. - requested : list of str - Requested outputs: ‘R’ for the rotation tensor, - ‘V’ for left stretch tensor and ‘U’ for right stretch tensor. + """ + Singular value decomposition. + + Parameters + ---------- + x : numpy.array of shape (:,3,3) or (3,3) + Tensor of which the singular values are computed. + requested : list of str + Requested outputs: ‘R’ for the rotation tensor, + ‘V’ for left stretch tensor and ‘U’ for right stretch tensor. - """ - u, s, vh = np.linalg.svd(x) - R = np.dot(u,vh) if np.shape(x) == (3,3) else \ - np.einsum('ijk,ikl->ijl',u,vh) - - output = [] - if 'R' in requested: - output.append(R) - if 'V' in requested: - output.append(np.dot(x,R.T) if np.shape(x) == (3,3) else np.einsum('ijk,ilk->ijl',x,R)) - if 'U' in requested: - output.append(np.dot(R.T,x) if np.shape(x) == (3,3) else np.einsum('ikj,ikl->ijl',R,x)) - - return tuple(output) + """ + u, s, vh = np.linalg.svd(x) + R = np.dot(u,vh) if np.shape(x) == (3,3) else \ + np.einsum('ijk,ikl->ijl',u,vh) + + output = [] + if 'R' in requested: + output.append(R) + if 'V' in requested: + output.append(np.dot(x,R.T) if np.shape(x) == (3,3) else np.einsum('ijk,ilk->ijl',x,R)) + if 'U' in requested: + output.append(np.dot(R.T,x) if np.shape(x) == (3,3) else np.einsum('ikj,ikl->ijl',R,x)) + + return tuple(output) From 6a0bb8be8eb11900e9fc629aff5ad07dd3f99d36 Mon Sep 17 00:00:00 2001 From: Test User Date: Wed, 30 Oct 2019 19:15:00 +0100 Subject: [PATCH 106/233] [skip ci] updated version information after successful test of v2.0.3-1023-g368d4deb --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 442097b29..f46b055b6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-957-gccbcc0d0 +v2.0.3-1023-g368d4deb From 1c10459a5a3ca8167caffdda61ea7d98e059816a Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 30 Oct 2019 21:09:17 +0100 Subject: [PATCH 107/233] also use fast operation order --- python/damask/dadf5.py | 2 +- src/mesh_marc.f90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 163f4f30d..7390724c8 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -396,7 +396,7 @@ class DADF5(): p = np.where(f['mapping/cellResults/materialpoint']['Name'] == str.encode(label))[0] if len(p)>0: - u = (f['mapping/cellResults/materialpoint'][p.tolist()]['Position']) + u = (f['mapping/cellResults/materialpoint']['Position'][p.tolist()]) a = np.array(f[pa]) if len(a.shape) == 1: a=a.reshape([a.shape[0],1]) diff --git a/src/mesh_marc.f90 b/src/mesh_marc.f90 index 7430ad4b9..e67d5e0d1 100644 --- a/src/mesh_marc.f90 +++ b/src/mesh_marc.f90 @@ -1,7 +1,7 @@ !-------------------------------------------------------------------------------------------------- !> @author Franz Roters, Max-Planck-Institut für Eisenforschung GmbH !> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH -!> @author Christoph Koords, Max-Planck-Institut für Eisenforschung GmbH +!> @author Christoph Kords, Max-Planck-Institut für Eisenforschung GmbH !> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH !> @brief Sets up the mesh for the solver MSC.Marc !-------------------------------------------------------------------------------------------------- From fb286af354ab03dbe1ad53585de3d22266a2dc51 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 31 Oct 2019 10:45:34 +0100 Subject: [PATCH 108/233] [skip sc] first draft --- processing/post/addCauchy.py | 57 +++----------------------- python/damask/__init__.py | 1 + python/damask/table.py | 77 ++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 52 deletions(-) create mode 100644 python/damask/table.py diff --git a/processing/post/addCauchy.py b/processing/post/addCauchy.py index 18c4ec215..9037567f8 100755 --- a/processing/post/addCauchy.py +++ b/processing/post/addCauchy.py @@ -1,11 +1,8 @@ #!/usr/bin/env python3 import os -import sys from optparse import OptionParser -import numpy as np - import damask @@ -37,53 +34,9 @@ parser.set_defaults(defgrad = 'f', (options,filenames) = parser.parse_args() -# --- loop over input files ------------------------------------------------------------------------- - -if filenames == []: filenames = [None] - for name in filenames: - try: - table = damask.ASCIItable(name = name, buffered = False) - except: - continue - damask.util.report(scriptName,name) - -# ------------------------------------------ read header ------------------------------------------ - - table.head_read() - -# ------------------------------------------ sanity checks ---------------------------------------- - - errors = [] - column = {} - - for tensor in [options.defgrad,options.stress]: - dim = table.label_dimension(tensor) - if dim < 0: errors.append('column {} not found.'.format(tensor)) - elif dim != 9: errors.append('column {} is not a tensor.'.format(tensor)) - else: - column[tensor] = table.label_index(tensor) - - if errors != []: - damask.util.croak(errors) - table.close(dismiss = True) - continue - -# ------------------------------------------ assemble header -------------------------------------- - - table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.labels_append(['{}_Cauchy'.format(i+1) for i in range(9)]) # extend ASCII header with new labels - table.head_write() - -# ------------------------------------------ process data ------------------------------------------ - - outputAlive = True - while outputAlive and table.data_read(): # read next data line of ASCII table - F = np.array(list(map(float,table.data[column[options.defgrad]:column[options.defgrad]+9])),'d').reshape(3,3) - P = np.array(list(map(float,table.data[column[options.stress ]:column[options.stress ]+9])),'d').reshape(3,3) - table.data_append(list(1.0/np.linalg.det(F)*np.dot(P,F.T).reshape(9))) # [Cauchy] = (1/det(F)) * [P].[F_transpose] - outputAlive = table.data_write() # output processed line - -# ------------------------------------------ output finalization ----------------------------------- - - table.close() # close input ASCII table (works for stdin) + table = damask.Table(name) + table.add_array('Cauchy',damask.mechanics.Cauchy(table.get_array(options.defgrad).reshape(-1,3,3), + table.get_array(options.stress).reshape(-1,3,3)).reshape(-1,9), + scriptID) + table.to_ASCII() diff --git a/python/damask/__init__.py b/python/damask/__init__.py index f876d1417..da699be29 100644 --- a/python/damask/__init__.py +++ b/python/damask/__init__.py @@ -9,6 +9,7 @@ name = 'damask' # classes from .environment import Environment # noqa from .asciitable import ASCIItable # noqa +from .table import Table # noqa from .config import Material # noqa from .colormaps import Colormap, Color # noqa diff --git a/python/damask/table.py b/python/damask/table.py new file mode 100644 index 000000000..81901c252 --- /dev/null +++ b/python/damask/table.py @@ -0,0 +1,77 @@ +import re + +import pandas as pd +import numpy as np + +class Table(): + """Read and write to ASCII tables""" + + def __init__(self,name): + self.name = name + with open(self.name) as f: + header,keyword = f.readline().split() + if keyword == 'header': + header = int(header) + else: + raise Exception + self.comments = [f.readline()[:-1] for i in range(header-1)] + labels_raw = f.readline().split() + self.data = pd.read_csv(f,delim_whitespace=True,header=None) + + labels_repeated = [l.split('_',1)[1] if '_' in l else l for l in labels_raw] + self.data.rename(columns=dict(zip([l for l in self.data.columns],labels_repeated)),inplace=True) + + self.shape = {} + for l in labels_raw: + tensor_column = re.search(':.*?_',l) + if tensor_column: + my_shape = tensor_column.group()[1:-1].split('x') + self.shape[l.split('_',1)[1]] = tuple([int(d) for d in my_shape]) + else: + vector_column = re.match('.*?_',l) + if vector_column: + self.shape[l.split('_',1)[1]] = (int(l.split('_',1)[0]),) + else: + self.shape[l]=(1,) + + self.labels = list(dict.fromkeys(labels_repeated)) + + + def get_array(self,label): + return self.data[label].to_numpy().reshape((-1,)+self.shape[label]) + + + def add_array(self,label,array,info): + if np.product(array.shape[1:],dtype=int) == 1: + self.comments.append('{}: {}'.format(label,info)) + + else: + self.comments.append('{} {}: {}'.format(label,array.shape[1:],info)) + + self.shape[label] = array.shape[1:] + self.labels.append(label) + size = np.product(array.shape[1:]) + new_data = pd.DataFrame(data=array.reshape(-1,size), + columns=[label for l in range(size)]) + self.data = pd.concat([self.data,new_data],axis=1) + + + def to_ASCII(self,name=None): + labels = [] + for l in self.labels: + if(self.shape[l] == (1,)): + labels.append('{}'.format(l)) + elif(len(self.shape[l]) == 1): + labels+=['{}_{}'.format(i+1,l)\ + for i in range(self.shape[l][0])] + else: + labels+=['{}:{}_{}'.format(i+1,'x'.join([str(d) for d in self.shape[l]]),l)\ + for i in range(np.product(self.shape[l]))] + + header = ['{} header'.format(len(self.comments)+1)]\ + + self.comments\ + + [' '.join(labels)] + + with open(name if name is not None else self.name,'w') as f: + for line in header: f.write(line+'\n') + self.data.to_csv(f,sep=' ',index=False,header=False) From 1b7a9fd9e912cb5ca236937995d6f6cb53b62111 Mon Sep 17 00:00:00 2001 From: Franz Roters Date: Thu, 31 Oct 2019 17:20:17 +0100 Subject: [PATCH 109/233] [skip ci] just one slip system family --- examples/ConfigFiles/Phase_Dislotwin_Tungsten.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/ConfigFiles/Phase_Dislotwin_Tungsten.config b/examples/ConfigFiles/Phase_Dislotwin_Tungsten.config index b780f5c59..30c04cb9a 100644 --- a/examples/ConfigFiles/Phase_Dislotwin_Tungsten.config +++ b/examples/ConfigFiles/Phase_Dislotwin_Tungsten.config @@ -14,7 +14,7 @@ SolidSolutionStrength 1.5e8 # Strength due to elements in solid solution ### Dislocation glide parameters ### #per family -Nslip 12 0 +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] From 2e834cc3c10260dbd500d83b56c64876191cbff9 Mon Sep 17 00:00:00 2001 From: Test User Date: Sat, 2 Nov 2019 22:45:34 +0100 Subject: [PATCH 110/233] [skip ci] updated version information after successful test of v2.0.3-1073-g6f3cb071 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f46b055b6..a5ac7d281 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-1023-g368d4deb +v2.0.3-1073-g6f3cb071 From 7a7eea47b54463ef0530149241972325d3f164a3 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 21 Nov 2019 19:46:05 +0100 Subject: [PATCH 111/233] correct handling of arrays all strains measures except for logarithmic had wrong off-diagonal components --- python/damask/mechanics.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index 436fbe091..476682380 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -48,10 +48,10 @@ def strain_tensor(F,t,m): if m > 0.0: eps = 1.0/(2.0*abs(m)) * (+ np.matmul(n,np.einsum('ij,ikj->ijk',w**m,n)) - - np.broadcast_to(np.ones(3),[F_.shape[0],3])) + - np.broadcast_to(np.eye(3),[F_.shape[0],3,3])) elif m < 0.0: eps = 1.0/(2.0*abs(m)) * (- np.matmul(n,np.einsum('ij,ikj->ijk',w**m,n)) - + np.broadcast_to(np.ones(3),[F_.shape[0],3])) + + np.broadcast_to(np.eye(3),[F_.shape[0],3,3])) else: eps = np.matmul(n,np.einsum('ij,ikj->ijk',0.5*np.log(w),n)) @@ -190,7 +190,7 @@ def rotational_part(x): Tensor of which the rotational part is computed. """ - return __polar_decomposition(x,'R') + return __polar_decomposition(x,'R')[0] def left_stretch(x): @@ -203,7 +203,7 @@ def left_stretch(x): Tensor of which the left stretch is computed. """ - return __polar_decomposition(x,'V') + return __polar_decomposition(x,'V')[0] def right_stretch(x): @@ -216,7 +216,7 @@ def right_stretch(x): Tensor of which the right stretch is computed. """ - return __polar_decomposition(x,'U') + return __polar_decomposition(x,'U')[0] def __polar_decomposition(x,requested): @@ -227,7 +227,7 @@ def __polar_decomposition(x,requested): ---------- x : numpy.array of shape (:,3,3) or (3,3) Tensor of which the singular values are computed. - requested : list of str + requested : iterable of str Requested outputs: ‘R’ for the rotation tensor, ‘V’ for left stretch tensor and ‘U’ for right stretch tensor. From a5ae82fe900ec3942451868c65c7db19acec9c04 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 21 Nov 2019 19:47:27 +0100 Subject: [PATCH 112/233] handle deprecation warning in python 3.8 --- python/damask/asciitable.py | 2 +- python/damask/test/test.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/python/damask/asciitable.py b/python/damask/asciitable.py index 59e285d6a..59982cb18 100644 --- a/python/damask/asciitable.py +++ b/python/damask/asciitable.py @@ -2,7 +2,7 @@ import os import sys import re import shlex -from collections import Iterable +from collections.abc import Iterable import numpy as np diff --git a/python/damask/test/test.py b/python/damask/test/test.py index e7f2da14a..3e43c1f01 100644 --- a/python/damask/test/test.py +++ b/python/damask/test/test.py @@ -1,10 +1,8 @@ -# -*- coding: UTF-8 no BOM -*- - import os,sys,shutil import logging,logging.config import damask import numpy as np -from collections import Iterable +from collections.abc import Iterable from optparse import OptionParser class Test(): From cf88c1f907519186ccf8d434b4aa888dd5a5918c Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 21 Nov 2019 19:49:46 +0100 Subject: [PATCH 113/233] correct syntax for integer comparison --- python/damask/solver/marc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/damask/solver/marc.py b/python/damask/solver/marc.py index 5e728545d..971b2226b 100644 --- a/python/damask/solver/marc.py +++ b/python/damask/solver/marc.py @@ -79,9 +79,9 @@ class Marc(Solver): exitnumber = -1 fid_out = open(outFile,'r') for line in fid_out: - if (string.find(line,'tress iteration') is not -1): + if (string.find(line,'tress iteration') != -1): print(line) - elif (string.find(line,'Exit number') is not -1): + elif (string.find(line,'Exit number') != -1): substr = line[string.find(line,'Exit number'):len(line)] exitnumber = int(substr[12:16]) From a3376a35b7cbbf9ceb4282726e6a1bb82dbb66aa Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 21 Nov 2019 20:00:28 +0100 Subject: [PATCH 114/233] testing mechanics module with pytest --- python/tests/test_mechanics.py | 135 +++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 python/tests/test_mechanics.py diff --git a/python/tests/test_mechanics.py b/python/tests/test_mechanics.py new file mode 100644 index 000000000..aeed1594a --- /dev/null +++ b/python/tests/test_mechanics.py @@ -0,0 +1,135 @@ +import numpy as np +from damask import mechanics + +class TestMechanics: + + n = 9 + c = np.random.randint(n) + + + def test_vectorize_Cauchy(self): + P = np.random.random((self.n,3,3)) + F = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.Cauchy(F,P)[self.c], + mechanics.Cauchy(F[self.c],P[self.c])) + + + def test_vectorize_strain_tensor(self): + F = np.random.random((self.n,3,3)) + t = ['V','U'][np.random.randint(0,2)] + m = np.random.random()*10. -5.0 + assert np.allclose(mechanics.strain_tensor(F,t,m)[self.c], + mechanics.strain_tensor(F[self.c],t,m)) + + + def test_vectorize_deviatoric_part(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.deviatoric_part(x)[self.c], + mechanics.deviatoric_part(x[self.c])) + + + def test_vectorize_spherical_part(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.spherical_part(x)[self.c], + mechanics.spherical_part(x[self.c])) + + + def test_vectorize_Mises_stress(self): + sigma = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.Mises_stress(sigma)[self.c], + mechanics.Mises_stress(sigma[self.c])) + + + def test_vectorize_Mises_strain(self): + epsilon = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.Mises_strain(epsilon)[self.c], + mechanics.Mises_strain(epsilon[self.c])) + + + def test_vectorize_symmetric(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.symmetric(x)[self.c], + mechanics.symmetric(x[self.c])) + + + def test_vectorize_maximum_shear(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.maximum_shear(x)[self.c], + mechanics.maximum_shear(x[self.c])) + + + def test_vectorize_principal_components(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.principal_components(x)[self.c], + mechanics.principal_components(x[self.c])) + + + def test_vectorize_transpose(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.transpose(x)[self.c], + mechanics.transpose(x[self.c])) + + + def test_vectorize_rotational_part(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.rotational_part(x)[self.c], + mechanics.rotational_part(x[self.c])) + + + def test_vectorize_left_stretch(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.left_stretch(x)[self.c], + mechanics.left_stretch(x[self.c])) + + + def test_vectorize_right_stretch(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.right_stretch(x)[self.c], + mechanics.right_stretch(x[self.c])) + + + def test_Cauchy(self): + """Ensure Cauchy stress is symmetrized 1. Piola-Kirchhoff stress for no deformation.""" + P = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.Cauchy(np.broadcast_to(np.eye(3),(self.n,3,3)),P), + mechanics.symmetric(P)) + + + def test_strain_tensor_no_rotation(self): + """Ensure that left and right stretch give same results for no rotation.""" + F = np.broadcast_to(np.eye(3),[self.n,3,3])*np.random.random((self.n,3,3)) + m = np.random.random()*20.0-10.0 + assert np.allclose(mechanics.strain_tensor(F,'U',m), + mechanics.strain_tensor(F,'V',m)) + + + def test_strain_tensor_rotation(self): + """Ensure that pure rotation results in no strain.""" + F = mechanics.rotational_part(np.random.random((self.n,3,3))) + t = ['V','U'][np.random.randint(0,2)] + m = np.random.random()*2.0 - 1.0 + assert np.allclose(mechanics.strain_tensor(F,t,m), + 0.0) + + + def test_spherical_deviatoric_part(self): + """Ensure that full tensor is sum of spherical and deviatoric part.""" + x = np.random.random((self.n,3,3)) + sph = np.broadcast_to(np.eye(3),(self.n,3,3))\ + * np.repeat(mechanics.spherical_part(x),9).reshape(self.n,3,3) + assert np.allclose(sph + mechanics.deviatoric_part(x), + x) + + + def test_symmetric(self): + """Ensure that a symmetric tensor is half of the sum of a tensor and its transpose.""" + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.symmetric(x)*2.0, + mechanics.transpose(x)+x) + + + def test_transpose(self): + """Ensure that a symmetric tensor equals its transpose.""" + x = mechanics.symmetric(np.random.random((self.n,3,3))) + assert np.allclose(mechanics.transpose(x), + x) From e0f3fe3cc0e3e35a90a9fd19205409f075cecff4 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 21 Nov 2019 21:01:01 +0100 Subject: [PATCH 115/233] ported from hand written test class --- python/tests/test_Rotation.py | 54 ++++++++++++++++++++++++++++++++++ python/tests/test_mechanics.py | 9 +++++- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 python/tests/test_Rotation.py diff --git a/python/tests/test_Rotation.py b/python/tests/test_Rotation.py new file mode 100644 index 000000000..c0834f9a8 --- /dev/null +++ b/python/tests/test_Rotation.py @@ -0,0 +1,54 @@ +import numpy as np +from damask import Rotation + +class TestRotation: + + n = 1000 + + def test_Eulers(self): + for r in range(self.n): + rot = Rotation.fromRandom() + assert np.allclose(rot.asQuaternion(), + Rotation.fromEulers(rot.asEulers()).asQuaternion()) + + + def test_AxisAngle(self): + for r in range(self.n): + rot = Rotation.fromRandom() + assert np.allclose(rot.asEulers(), + Rotation.fromAxisAngle(rot.asAxisAngle()).asEulers()) + + + def test_Matrix(self): + for r in range(self.n): + rot = Rotation.fromRandom() + assert np.allclose(rot.asAxisAngle(), + Rotation.fromMatrix(rot.asMatrix()).asAxisAngle()) + + + def test_Rodriques(self): + for r in range(self.n): + rot = Rotation.fromRandom() + assert np.allclose(rot.asMatrix(), + Rotation.fromRodrigues(rot.asRodrigues()).asMatrix()) + + + def test_Homochoric(self): + for r in range(self.n): + rot = Rotation.fromRandom() + assert np.allclose(rot.asRodrigues(), + Rotation.fromHomochoric(rot.asHomochoric()).asRodrigues()) + + + def test_Cubochoric(self): + for r in range(self.n): + rot = Rotation.fromRandom() + assert np.allclose(rot.asHomochoric(), + Rotation.fromCubochoric(rot.asCubochoric()).asHomochoric()) + + + def test_Quaternion(self): + for r in range(self.n): + rot = Rotation.fromRandom() + assert np.allclose(rot.asCubochoric(), + Rotation.fromQuaternion(rot.asQuaternion()).asCubochoric()) diff --git a/python/tests/test_mechanics.py b/python/tests/test_mechanics.py index aeed1594a..aab92bef3 100644 --- a/python/tests/test_mechanics.py +++ b/python/tests/test_mechanics.py @@ -3,7 +3,7 @@ from damask import mechanics class TestMechanics: - n = 9 + n = 1000 c = np.random.randint(n) @@ -133,3 +133,10 @@ class TestMechanics: x = mechanics.symmetric(np.random.random((self.n,3,3))) assert np.allclose(mechanics.transpose(x), x) + + + def test_Mises(self): + """Ensure that equivalent stress is 3/2 of equivalent strain.""" + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.Mises_stress(x)/mechanics.Mises_strain(x), + 1.5) From a26a5738dd24d80ddb3d9bb34d3304494ba94a73 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 21 Nov 2019 21:48:54 +0100 Subject: [PATCH 116/233] polishing --- python/tests/test_Rotation.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/python/tests/test_Rotation.py b/python/tests/test_Rotation.py index c0834f9a8..eb2694502 100644 --- a/python/tests/test_Rotation.py +++ b/python/tests/test_Rotation.py @@ -8,47 +8,47 @@ class TestRotation: def test_Eulers(self): for r in range(self.n): rot = Rotation.fromRandom() - assert np.allclose(rot.asQuaternion(), - Rotation.fromEulers(rot.asEulers()).asQuaternion()) + assert np.allclose(rot.asQuaternion(), + Rotation.fromEulers(rot.asEulers()).asQuaternion()) def test_AxisAngle(self): for r in range(self.n): rot = Rotation.fromRandom() - assert np.allclose(rot.asEulers(), - Rotation.fromAxisAngle(rot.asAxisAngle()).asEulers()) + assert np.allclose(rot.asEulers(), + Rotation.fromAxisAngle(rot.asAxisAngle()).asEulers()) def test_Matrix(self): for r in range(self.n): rot = Rotation.fromRandom() - assert np.allclose(rot.asAxisAngle(), - Rotation.fromMatrix(rot.asMatrix()).asAxisAngle()) + assert np.allclose(rot.asAxisAngle(), + Rotation.fromMatrix(rot.asMatrix()).asAxisAngle()) def test_Rodriques(self): for r in range(self.n): rot = Rotation.fromRandom() - assert np.allclose(rot.asMatrix(), - Rotation.fromRodrigues(rot.asRodrigues()).asMatrix()) + assert np.allclose(rot.asMatrix(), + Rotation.fromRodrigues(rot.asRodrigues()).asMatrix()) def test_Homochoric(self): for r in range(self.n): rot = Rotation.fromRandom() - assert np.allclose(rot.asRodrigues(), - Rotation.fromHomochoric(rot.asHomochoric()).asRodrigues()) + assert np.allclose(rot.asRodrigues(), + Rotation.fromHomochoric(rot.asHomochoric()).asRodrigues()) def test_Cubochoric(self): for r in range(self.n): rot = Rotation.fromRandom() - assert np.allclose(rot.asHomochoric(), - Rotation.fromCubochoric(rot.asCubochoric()).asHomochoric()) + assert np.allclose(rot.asHomochoric(), + Rotation.fromCubochoric(rot.asCubochoric()).asHomochoric()) def test_Quaternion(self): for r in range(self.n): rot = Rotation.fromRandom() - assert np.allclose(rot.asCubochoric(), - Rotation.fromQuaternion(rot.asQuaternion()).asCubochoric()) + assert np.allclose(rot.asCubochoric(), + Rotation.fromQuaternion(rot.asQuaternion()).asCubochoric()) From 77e410d7d141714d35e6d330051c87eeb66a48ed Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 22 Nov 2019 12:16:19 +0100 Subject: [PATCH 117/233] follow prospector rules --- python/damask/asciitable.py | 44 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/python/damask/asciitable.py b/python/damask/asciitable.py index 59982cb18..74bb97173 100644 --- a/python/damask/asciitable.py +++ b/python/damask/asciitable.py @@ -15,7 +15,7 @@ except NameError: # ------------------------------------------------------------------ class ASCIItable(): - """Read and write to ASCII tables""" + """Read and write to ASCII tables.""" tmpext = '_tmp' # filename extension for in-place access @@ -27,6 +27,7 @@ class ASCIItable(): labeled = True, # assume table has labels readonly = False, # no reading from file ): + """Read and write to ASCII tables.""" self.__IO__ = {'output': [], 'buffered': buffered, 'labeled': labeled, # header contains labels @@ -72,7 +73,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def _removeCRLF(self, string): - """Delete any carriage return and line feed from string""" + """Delete any carriage return and line feed from string.""" try: return string.replace('\n','').replace('\r','') except AttributeError: @@ -82,7 +83,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def _quote(self, what): - """Quote empty or white space-containing output""" + """Quote empty or white space-containing output.""" return '{quote}{content}{quote}'.format( quote = ('"' if str(what)=='' or re.search(r"\s",str(what)) else ''), content = what) @@ -103,7 +104,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def output_write(self, what): - """Aggregate a single row (string) or list of (possibly containing further lists of) rows into output""" + """Aggregate a single row (string) or list of (possibly containing further lists of) rows into output.""" if isinstance(what, (str, unicode)): self.__IO__['output'] += [what] else: @@ -143,7 +144,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def head_read(self): """ - Get column labels + Get column labels. by either reading the first row or, if keyword "head[*]" is present, the last line of the header @@ -154,7 +155,7 @@ class ASCIItable(): pass firstline = self.__IO__['in'].readline().strip() - m = re.search('(\d+)\s+head', firstline.lower()) # search for "head" keyword + m = re.search(r'(\d+)\s+head', firstline.lower()) # search for "head" keyword if m: # proper ASCIItable format @@ -194,7 +195,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def head_write(self, header = True): - """Write current header information (info + labels)""" + """Write current header information (info + labels).""" head = ['{}\theader'.format(len(self.info)+self.__IO__['labeled'])] if header else [] head.append(self.info) if self.__IO__['labeled']: @@ -205,7 +206,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def head_getGeom(self): - """Interpret geom header""" + """Interpret geom header.""" identifiers = { 'grid': ['a','b','c'], 'size': ['x','y','z'], @@ -247,7 +248,7 @@ class ASCIItable(): def labels_append(self, what, reset = False): - """Add item or list to existing set of labels (and switch on labeling)""" + """Add item or list to existing set of labels (and switch on labeling).""" if isinstance(what, (str, unicode)): self.tags += [self._removeCRLF(what)] else: @@ -261,7 +262,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def labels_clear(self): - """Delete existing labels and switch to no labeling""" + """Delete existing labels and switch to no labeling.""" self.tags = [] self.__IO__['labeled'] = False @@ -392,7 +393,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def info_append(self, what): - """Add item or list to existing set of infos""" + """Add item or list to existing set of infos.""" if isinstance(what, (str, unicode)): self.info += [self._removeCRLF(what)] else: @@ -403,7 +404,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def info_clear(self): - """Delete any info block""" + """Delete any info block.""" self.info = [] # ------------------------------------------------------------------ @@ -416,7 +417,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def data_skipLines(self, count): - """Wind forward by count number of lines""" + """Wind forward by count number of lines.""" for i in range(count): alive = self.data_read() @@ -426,7 +427,7 @@ class ASCIItable(): def data_read(self, advance = True, respectLabels = True): - """Read next line (possibly buffered) and parse it into data array""" + """Read next line (possibly buffered) and parse it into data array.""" self.line = self.__IO__['readBuffer'].pop(0) if len(self.__IO__['readBuffer']) > 0 \ else self.__IO__['in'].readline().strip() # take buffered content or get next data row from file @@ -446,9 +447,8 @@ class ASCIItable(): # ------------------------------------------------------------------ def data_readArray(self, labels = []): - """Read whole data of all (given) labels as numpy array""" - try: self.data_rewind() # try to wind back to start of data - except: pass # assume/hope we are at data start already... + """Read whole data of all (given) labels as numpy array.""" + self.data_rewind() if labels is None or labels == []: use = None # use all columns (and keep labels intact) @@ -480,7 +480,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def data_write(self, delimiter = '\t'): - """Write current data array and report alive output back""" + """Write current data array and report alive output back.""" if len(self.data) == 0: return True if isinstance(self.data[0],list): @@ -492,16 +492,16 @@ class ASCIItable(): def data_writeArray(self, fmt = None, delimiter = '\t'): - """Write whole numpy array data""" + """Write whole numpy array data.""" for row in self.data: try: output = [fmt % value for value in row] if fmt else list(map(repr,row)) - except: + except Exception: output = [fmt % row] if fmt else [repr(row)] try: self.__IO__['out'].write(delimiter.join(output) + '\n') - except: + except Exception: pass # ------------------------------------------------------------------ @@ -545,7 +545,7 @@ class ASCIItable(): grid, type = 'i', strict = False): - """Read microstructure data (from .geom format)""" + """Read microstructure data (from .geom format).""" def datatype(item): return int(item) if type.lower() == 'i' else float(item) From dac63f7d92b0e495643378cd5d8d6a0ea3ea715f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 22 Nov 2019 12:54:55 +0100 Subject: [PATCH 118/233] subfolders not needed --- python/damask/__init__.py | 2 +- python/damask/{test => }/test.py | 0 python/damask/test/__init__.py | 3 --- 3 files changed, 1 insertion(+), 4 deletions(-) rename python/damask/{test => }/test.py (100%) delete mode 100644 python/damask/test/__init__.py diff --git a/python/damask/__init__.py b/python/damask/__init__.py index f876d1417..f432ef056 100644 --- a/python/damask/__init__.py +++ b/python/damask/__init__.py @@ -2,7 +2,7 @@ import os with open(os.path.join(os.path.dirname(__file__),'VERSION')) as f: - version = f.readline()[1:-1] + version = f.readline()[1:-1] name = 'damask' diff --git a/python/damask/test/test.py b/python/damask/test.py similarity index 100% rename from python/damask/test/test.py rename to python/damask/test.py diff --git a/python/damask/test/__init__.py b/python/damask/test/__init__.py deleted file mode 100644 index a8d5d5034..000000000 --- a/python/damask/test/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Test functionality.""" - -from .test import Test # noqa From 6e0b2a4fab5465bca24bb8f367a6c439fd29cbcd Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 22 Nov 2019 13:16:08 +0100 Subject: [PATCH 119/233] following prospector rules --- python/damask/test.py | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/python/damask/test.py b/python/damask/test.py index 3e43c1f01..b1729548d 100644 --- a/python/damask/test.py +++ b/python/damask/test.py @@ -15,7 +15,7 @@ class Test(): variants = [] def __init__(self, **kwargs): - + """New test.""" defaults = {'description': '', 'keep': False, 'accept': False, @@ -118,22 +118,22 @@ class Test(): """Delete directory tree containing current results.""" try: shutil.rmtree(self.dirCurrent()) - except: + except FileNotFoundError: logging.warning('removal of directory "{}" not possible...'.format(self.dirCurrent())) try: os.mkdir(self.dirCurrent()) return True - except: + except FileExistsError: logging.critical('creation of directory "{}" failed.'.format(self.dirCurrent())) return False def prepareAll(self): - """Do all necessary preparations for the whole test""" + """Do all necessary preparations for the whole test.""" return True def prepare(self,variant): - """Do all necessary preparations for the run of each test variant""" + """Do all necessary preparations for the run of each test variant.""" return True @@ -205,9 +205,9 @@ class Test(): for source,target in zip(list(map(mapA,A)),list(map(mapB,B))): try: shutil.copy2(source,target) - except: + except FileNotFoundError: logging.critical('error copying {} to {}'.format(source,target)) - raise + raise FileNotFoundError def copy_Reference2Current(self,sourcefiles=[],targetfiles=[]): @@ -216,9 +216,9 @@ class Test(): for i,f in enumerate(sourcefiles): try: shutil.copy2(self.fileInReference(f),self.fileInCurrent(targetfiles[i])) - except: + except FileNotFoundError: logging.critical('Reference2Current: Unable to copy file "{}"'.format(f)) - raise + raise FileNotFoundError def copy_Base2Current(self,sourceDir,sourcefiles=[],targetfiles=[]): @@ -228,10 +228,10 @@ class Test(): for i,f in enumerate(sourcefiles): try: shutil.copy2(os.path.join(source,f),self.fileInCurrent(targetfiles[i])) - except: + except FileNotFoundError: logging.error(os.path.join(source,f)) logging.critical('Base2Current: Unable to copy file "{}"'.format(f)) - raise + raise FileNotFoundError def copy_Current2Reference(self,sourcefiles=[],targetfiles=[]): @@ -240,9 +240,9 @@ class Test(): for i,f in enumerate(sourcefiles): try: shutil.copy2(self.fileInCurrent(f),self.fileInReference(targetfiles[i])) - except: + except FileNotFoundError: logging.critical('Current2Reference: Unable to copy file "{}"'.format(f)) - raise + raise FileNotFoundError def copy_Proof2Current(self,sourcefiles=[],targetfiles=[]): @@ -251,9 +251,9 @@ class Test(): for i,f in enumerate(sourcefiles): try: shutil.copy2(self.fileInProof(f),self.fileInCurrent(targetfiles[i])) - except: + except FileNotFoundError: logging.critical('Proof2Current: Unable to copy file "{}"'.format(f)) - raise + raise FileNotFoundError def copy_Current2Current(self,sourcefiles=[],targetfiles=[]): @@ -261,9 +261,10 @@ class Test(): for i,f in enumerate(sourcefiles): try: shutil.copy2(self.fileInReference(f),self.fileInCurrent(targetfiles[i])) - except: + except FileNotFoundError: logging.critical('Current2Current: Unable to copy file "{}"'.format(f)) - raise + raise FileNotFoundError + def execute_inCurrentDir(self,cmd,streamIn=None,env=None): @@ -437,7 +438,7 @@ class Test(): stdTol = 1.0e-6, preFilter = 1.0e-9): """ - Calculate statistics of tables + Calculate statistics of tables. threshold can be used to ignore small values (a negative number disables this feature) """ @@ -490,7 +491,7 @@ class Test(): rtol = 1e-5, atol = 1e-8, debug = False): - """Compare multiple tables with np.allclose""" + """Compare multiple tables with np.allclose.""" if not (isinstance(files, Iterable) and not isinstance(files, str)): # check whether list of files is requested files = [str(files)] From fad679a9a5432ee5d2c8cf860f2fa562ebb77360 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 22 Nov 2019 15:18:29 +0100 Subject: [PATCH 120/233] need to catch IOError --- python/damask/asciitable.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python/damask/asciitable.py b/python/damask/asciitable.py index 74bb97173..13ca0116b 100644 --- a/python/damask/asciitable.py +++ b/python/damask/asciitable.py @@ -448,7 +448,10 @@ class ASCIItable(): def data_readArray(self, labels = []): """Read whole data of all (given) labels as numpy array.""" - self.data_rewind() + try: + self.data_rewind() # try to wind back to start of data + except IOError: + pass # assume/hope we are at data start already... if labels is None or labels == []: use = None # use all columns (and keep labels intact) From c00af5c402b497002a753688fe2847b1c336c76d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 22 Nov 2019 20:52:36 +0100 Subject: [PATCH 121/233] 4 space indents are common practice --- python/damask/geom.py | 726 +++++++++++++++++++++--------------------- 1 file changed, 362 insertions(+), 364 deletions(-) diff --git a/python/damask/geom.py b/python/damask/geom.py index 176d2bd12..5bf4f7750 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -10,380 +10,378 @@ from . import version class Geom(): - """Geometry definition for grid solvers.""" + """Geometry definition for grid solvers.""" - def __init__(self,microstructure,size,origin=[0.0,0.0,0.0],homogenization=1,comments=[]): - """ - New geometry definition from array of microstructures and size. + def __init__(self,microstructure,size,origin=[0.0,0.0,0.0],homogenization=1,comments=[]): + """ + New geometry definition from array of microstructures and size. - Parameters - ---------- - microstructure : numpy.ndarray - microstructure array (3D) - size : list or numpy.ndarray - physical size of the microstructure in meter. - origin : list or numpy.ndarray, optional - physical origin of the microstructure in meter. - homogenization : integer, optional - homogenization index. - comments : list of str, optional - comments lines. + Parameters + ---------- + microstructure : numpy.ndarray + microstructure array (3D) + size : list or numpy.ndarray + physical size of the microstructure in meter. + origin : list or numpy.ndarray, optional + physical origin of the microstructure in meter. + homogenization : integer, optional + homogenization index. + comments : list of str, optional + comments lines. - """ - self.__transforms__ = \ - self.set_microstructure(microstructure) - self.set_size(size) - self.set_origin(origin) - self.set_homogenization(homogenization) - self.set_comments(comments) - - - def __repr__(self): - """Basic information on geometry definition.""" - return util.srepr([ - 'grid a b c: {}'.format(' x '.join(map(str,self.get_grid ()))), - 'size x y z: {}'.format(' x '.join(map(str,self.get_size ()))), - 'origin x y z: {}'.format(' '.join(map(str,self.get_origin()))), - 'homogenization: {}'.format(self.get_homogenization()), - '# microstructures: {}'.format(len(np.unique(self.microstructure))), - 'max microstructure: {}'.format(np.nanmax(self.microstructure)), - ]) - - def update(self,microstructure=None,size=None,origin=None,rescale=False): - """ - Updates microstructure and size. - - Parameters - ---------- - microstructure : numpy.ndarray, optional - microstructure array (3D). - size : list or numpy.ndarray, optional - physical size of the microstructure in meter. - origin : list or numpy.ndarray, optional - physical origin of the microstructure in meter. - rescale : bool, optional - ignore size parameter and rescale according to change of grid points. - - """ - grid_old = self.get_grid() - size_old = self.get_size() - origin_old = self.get_origin() - unique_old = len(np.unique(self.microstructure)) - max_old = np.nanmax(self.microstructure) - - if size is not None and rescale: - raise ValueError('Either set size explicitly or rescale automatically') - - self.set_microstructure(microstructure) - self.set_origin(origin) - - if size is not None: - self.set_size(size) - elif rescale: - self.set_size(self.get_grid()/grid_old*self.size) - - message = ['grid a b c: {}'.format(' x '.join(map(str,grid_old)))] - if np.any(grid_old != self.get_grid()): - message[-1] = util.delete(message[-1]) - message.append(util.emph('grid a b c: {}'.format(' x '.join(map(str,self.get_grid()))))) - - message.append('size x y z: {}'.format(' x '.join(map(str,size_old)))) - if np.any(size_old != self.get_size()): - message[-1] = util.delete(message[-1]) - message.append(util.emph('size x y z: {}'.format(' x '.join(map(str,self.get_size()))))) - - message.append('origin x y z: {}'.format(' '.join(map(str,origin_old)))) - if np.any(origin_old != self.get_origin()): - message[-1] = util.delete(message[-1]) - message.append(util.emph('origin x y z: {}'.format(' '.join(map(str,self.get_origin()))))) - - message.append('homogenization: {}'.format(self.get_homogenization())) - - message.append('# microstructures: {}'.format(unique_old)) - if unique_old != len(np.unique(self.microstructure)): - message[-1] = util.delete(message[-1]) - message.append(util.emph('# microstructures: {}'.format(len(np.unique(self.microstructure))))) - - message.append('max microstructure: {}'.format(max_old)) - if max_old != np.nanmax(self.microstructure): - message[-1] = util.delete(message[-1]) - message.append(util.emph('max microstructure: {}'.format(np.nanmax(self.microstructure)))) - - return util.return_message(message) - - def set_comments(self,comments): - """ - Replaces all existing comments. - - Parameters - ---------- - comments : list of str - new comments. - - """ - self.comments = [] - self.add_comments(comments) - - def add_comments(self,comments): - """ - Appends comments to existing comments. - - Parameters - ---------- - comments : list of str - new comments. - - """ - self.comments += [str(c) for c in comments] if isinstance(comments,list) else [str(comments)] - - def set_microstructure(self,microstructure): - """ - Replaces the existing microstructure representation. - - Parameters - ---------- - microstructure : numpy.ndarray - microstructure array (3D). - - """ - if microstructure is not None: - if len(microstructure.shape) != 3: - raise ValueError('Invalid microstructure shape {}'.format(*microstructure.shape)) - elif microstructure.dtype not in np.sctypes['float'] + np.sctypes['int']: - raise TypeError('Invalid data type {} for microstructure'.format(microstructure.dtype)) - else: - self.microstructure = np.copy(microstructure) - - def set_size(self,size): - """ - Replaces the existing size information. - - Parameters - ---------- - size : list or numpy.ndarray - physical size of the microstructure in meter. - - """ - if size is None: - grid = np.asarray(self.microstructure.shape) - self.size = grid/np.max(grid) - else: - if len(size) != 3 or any(np.array(size)<=0): - raise ValueError('Invalid size {}'.format(*size)) - else: - self.size = np.array(size) - - def set_origin(self,origin): - """ - Replaces the existing origin information. - - Parameters - ---------- - origin : list or numpy.ndarray - physical origin of the microstructure in meter - - """ - if origin is not None: - if len(origin) != 3: - raise ValueError('Invalid origin {}'.format(*origin)) - else: - self.origin = np.array(origin) - - def set_homogenization(self,homogenization): - """ - Replaces the existing homogenization index. - - Parameters - ---------- - homogenization : integer - homogenization index - - """ - if homogenization is not None: - if not isinstance(homogenization,int) or homogenization < 1: - raise TypeError('Invalid homogenization {}'.format(homogenization)) - else: - self.homogenization = homogenization - - - def get_microstructure(self): - """Return the microstructure representation.""" - return np.copy(self.microstructure) - - def get_size(self): - """Return the physical size in meter.""" - return np.copy(self.size) - - def get_origin(self): - """Return the origin in meter.""" - return np.copy(self.origin) - - def get_grid(self): - """Return the grid discretization.""" - return np.array(self.microstructure.shape) - - def get_homogenization(self): - """Return the homogenization index.""" - return self.homogenization - - def get_comments(self): - """Return the comments.""" - return self.comments[:] - - def get_header(self): - """Return the full header (grid, size, origin, homogenization, comments).""" - header = ['{} header'.format(len(self.comments)+4)] + self.comments - header.append('grid a {} b {} c {}'.format(*self.get_grid())) - header.append('size x {} y {} z {}'.format(*self.get_size())) - header.append('origin x {} y {} z {}'.format(*self.get_origin())) - header.append('homogenization {}'.format(self.get_homogenization())) - return header + """ + self.__transforms__ = \ + self.set_microstructure(microstructure) + self.set_size(size) + self.set_origin(origin) + self.set_homogenization(homogenization) + self.set_comments(comments) - @classmethod - def from_file(cls,fname): - """ - Reads a geom file. - Parameters - ---------- - fname : str or file handle - geometry file to read. + def __repr__(self): + """Basic information on geometry definition.""" + return util.srepr([ + 'grid a b c: {}'.format(' x '.join(map(str,self.get_grid ()))), + 'size x y z: {}'.format(' x '.join(map(str,self.get_size ()))), + 'origin x y z: {}'.format(' '.join(map(str,self.get_origin()))), + 'homogenization: {}'.format(self.get_homogenization()), + '# microstructures: {}'.format(len(np.unique(self.microstructure))), + 'max microstructure: {}'.format(np.nanmax(self.microstructure)), + ]) - """ - with (open(fname) if isinstance(fname,str) else fname) as f: - f.seek(0) - header_length,keyword = f.readline().split()[:2] - header_length = int(header_length) - content = f.readlines() + def update(self,microstructure=None,size=None,origin=None,rescale=False): + """ + Updates microstructure and size. - if not keyword.startswith('head') or header_length < 3: - raise TypeError('Header length information missing or invalid') + Parameters + ---------- + microstructure : numpy.ndarray, optional + microstructure array (3D). + size : list or numpy.ndarray, optional + physical size of the microstructure in meter. + origin : list or numpy.ndarray, optional + physical origin of the microstructure in meter. + rescale : bool, optional + ignore size parameter and rescale according to change of grid points. - comments = [] - for i,line in enumerate(content[:header_length]): - items = line.lower().strip().split() - key = items[0] if len(items) > 0 else '' - if key == 'grid': - grid = np.array([ int(dict(zip(items[1::2],items[2::2]))[i]) for i in ['a','b','c']]) - elif key == 'size': - size = np.array([float(dict(zip(items[1::2],items[2::2]))[i]) for i in ['x','y','z']]) - elif key == 'origin': - origin = np.array([float(dict(zip(items[1::2],items[2::2]))[i]) for i in ['x','y','z']]) - elif key == 'homogenization': - homogenization = int(items[1]) - else: - comments.append(line.strip()) + """ + grid_old = self.get_grid() + size_old = self.get_size() + origin_old = self.get_origin() + unique_old = len(np.unique(self.microstructure)) + max_old = np.nanmax(self.microstructure) + + if size is not None and rescale: + raise ValueError('Either set size explicitly or rescale automatically') - microstructure = np.empty(grid.prod()) # initialize as flat array - i = 0 - for line in content[header_length:]: - items = line.split() - if len(items) == 3: - if items[1].lower() == 'of': - items = np.ones(int(items[0]))*float(items[2]) - elif items[1].lower() == 'to': - items = np.linspace(int(items[0]),int(items[2]), - abs(int(items[2])-int(items[0]))+1,dtype=float) - else: items = list(map(float,items)) - else: items = list(map(float,items)) + self.set_microstructure(microstructure) + self.set_origin(origin) + + if size is not None: + self.set_size(size) + elif rescale: + self.set_size(self.get_grid()/grid_old*self.size) + + message = ['grid a b c: {}'.format(' x '.join(map(str,grid_old)))] + if np.any(grid_old != self.get_grid()): + message[-1] = util.delete(message[-1]) + message.append(util.emph('grid a b c: {}'.format(' x '.join(map(str,self.get_grid()))))) + + message.append('size x y z: {}'.format(' x '.join(map(str,size_old)))) + if np.any(size_old != self.get_size()): + message[-1] = util.delete(message[-1]) + message.append(util.emph('size x y z: {}'.format(' x '.join(map(str,self.get_size()))))) + + message.append('origin x y z: {}'.format(' '.join(map(str,origin_old)))) + if np.any(origin_old != self.get_origin()): + message[-1] = util.delete(message[-1]) + message.append(util.emph('origin x y z: {}'.format(' '.join(map(str,self.get_origin()))))) + + message.append('homogenization: {}'.format(self.get_homogenization())) + + message.append('# microstructures: {}'.format(unique_old)) + if unique_old != len(np.unique(self.microstructure)): + message[-1] = util.delete(message[-1]) + message.append(util.emph('# microstructures: {}'.format(len(np.unique(self.microstructure))))) + + message.append('max microstructure: {}'.format(max_old)) + if max_old != np.nanmax(self.microstructure): + message[-1] = util.delete(message[-1]) + message.append(util.emph('max microstructure: {}'.format(np.nanmax(self.microstructure)))) + + return util.return_message(message) + + def set_comments(self,comments): + """ + Replaces all existing comments. + + Parameters + ---------- + comments : list of str + new comments. + + """ + self.comments = [] + self.add_comments(comments) - microstructure[i:i+len(items)] = items - i += len(items) + def add_comments(self,comments): + """ + Appends comments to existing comments. + + Parameters + ---------- + comments : list of str + new comments. + + """ + self.comments += [str(c) for c in comments] if isinstance(comments,list) else [str(comments)] + + def set_microstructure(self,microstructure): + """ + Replaces the existing microstructure representation. + + Parameters + ---------- + microstructure : numpy.ndarray + microstructure array (3D). + + """ + if microstructure is not None: + if len(microstructure.shape) != 3: + raise ValueError('Invalid microstructure shape {}'.format(*microstructure.shape)) + elif microstructure.dtype not in np.sctypes['float'] + np.sctypes['int']: + raise TypeError('Invalid data type {} for microstructure'.format(microstructure.dtype)) + else: + self.microstructure = np.copy(microstructure) + + def set_size(self,size): + """ + Replaces the existing size information. + + Parameters + ---------- + size : list or numpy.ndarray + physical size of the microstructure in meter. + + """ + if size is None: + grid = np.asarray(self.microstructure.shape) + self.size = grid/np.max(grid) + else: + if len(size) != 3 or any(np.array(size)<=0): + raise ValueError('Invalid size {}'.format(*size)) + else: + self.size = np.array(size) + + def set_origin(self,origin): + """ + Replaces the existing origin information. + + Parameters + ---------- + origin : list or numpy.ndarray + physical origin of the microstructure in meter + + """ + if origin is not None: + if len(origin) != 3: + raise ValueError('Invalid origin {}'.format(*origin)) + else: + self.origin = np.array(origin) + + def set_homogenization(self,homogenization): + """ + Replaces the existing homogenization index. + + Parameters + ---------- + homogenization : integer + homogenization index + + """ + if homogenization is not None: + if not isinstance(homogenization,int) or homogenization < 1: + raise TypeError('Invalid homogenization {}'.format(homogenization)) + else: + self.homogenization = homogenization + + + def get_microstructure(self): + """Return the microstructure representation.""" + return np.copy(self.microstructure) + + def get_size(self): + """Return the physical size in meter.""" + return np.copy(self.size) + + def get_origin(self): + """Return the origin in meter.""" + return np.copy(self.origin) + + def get_grid(self): + """Return the grid discretization.""" + return np.array(self.microstructure.shape) + + def get_homogenization(self): + """Return the homogenization index.""" + return self.homogenization + + def get_comments(self): + """Return the comments.""" + return self.comments[:] + + def get_header(self): + """Return the full header (grid, size, origin, homogenization, comments).""" + header = ['{} header'.format(len(self.comments)+4)] + self.comments + header.append('grid a {} b {} c {}'.format(*self.get_grid())) + header.append('size x {} y {} z {}'.format(*self.get_size())) + header.append('origin x {} y {} z {}'.format(*self.get_origin())) + header.append('homogenization {}'.format(self.get_homogenization())) + return header + + @classmethod + def from_file(cls,fname): + """ + Reads a geom file. + + Parameters + ---------- + fname : str or file handle + geometry file to read. + + """ + with (open(fname) if isinstance(fname,str) else fname) as f: + f.seek(0) + header_length,keyword = f.readline().split()[:2] + header_length = int(header_length) + content = f.readlines() + + if not keyword.startswith('head') or header_length < 3: + raise TypeError('Header length information missing or invalid') + + comments = [] + for i,line in enumerate(content[:header_length]): + items = line.lower().strip().split() + key = items[0] if len(items) > 0 else '' + if key == 'grid': + grid = np.array([ int(dict(zip(items[1::2],items[2::2]))[i]) for i in ['a','b','c']]) + elif key == 'size': + size = np.array([float(dict(zip(items[1::2],items[2::2]))[i]) for i in ['x','y','z']]) + elif key == 'origin': + origin = np.array([float(dict(zip(items[1::2],items[2::2]))[i]) for i in ['x','y','z']]) + elif key == 'homogenization': + homogenization = int(items[1]) + else: + comments.append(line.strip()) + + microstructure = np.empty(grid.prod()) # initialize as flat array + i = 0 + for line in content[header_length:]: + items = line.split() + if len(items) == 3: + if items[1].lower() == 'of': + items = np.ones(int(items[0]))*float(items[2]) + elif items[1].lower() == 'to': + items = np.linspace(int(items[0]),int(items[2]), + abs(int(items[2])-int(items[0]))+1,dtype=float) + else: items = list(map(float,items)) + else: items = list(map(float,items)) + microstructure[i:i+len(items)] = items + i += len(items) + + if i != grid.prod(): + raise TypeError('Invalid file: expected {} entries,found {}'.format(grid.prod(),i)) + + microstructure = microstructure.reshape(grid,order='F') + if not np.any(np.mod(microstructure.flatten(),1) != 0.0): # no float present + microstructure = microstructure.astype('int') + + return cls(microstructure.reshape(grid),size,origin,homogenization,comments) + + + def to_file(self,fname): + """ + Writes a geom file. + + Parameters + ---------- + fname : str or file handle + geometry file to write. + + """ + header = self.get_header() + grid = self.get_grid() + format_string = '%{}i'.format(1+int(np.floor(np.log10(np.nanmax(self.microstructure))))) if self.microstructure.dtype == int \ + else '%g' + np.savetxt(fname, + self.microstructure.reshape([grid[0],np.prod(grid[1:])],order='F').T, + header='\n'.join(header), fmt=format_string, comments='') + + def to_vtk(self,fname=None): + """ + Generates vtk file. + + Parameters + ---------- + fname : str, optional + vtk file to write. If no file is given, a string is returned. + + """ + grid = self.get_grid() + np.ones(3,dtype=int) + size = self.get_size() + origin = self.get_origin() + + coords = [ + np.linspace(0,size[0],grid[0]) + origin[0], + np.linspace(0,size[1],grid[1]) + origin[1], + np.linspace(0,size[2],grid[2]) + origin[2] + ] + + rGrid = vtk.vtkRectilinearGrid() + coordArray = [vtk.vtkDoubleArray(),vtk.vtkDoubleArray(),vtk.vtkDoubleArray()] + + rGrid.SetDimensions(*grid) + for d,coord in enumerate(coords): + for c in coord: + coordArray[d].InsertNextValue(c) + + rGrid.SetXCoordinates(coordArray[0]) + rGrid.SetYCoordinates(coordArray[1]) + rGrid.SetZCoordinates(coordArray[2]) + + ms = numpy_support.numpy_to_vtk(num_array=self.microstructure.flatten(order='F'), + array_type=vtk.VTK_INT if self.microstructure.dtype == int else vtk.VTK_FLOAT) + ms.SetName('microstructure') + rGrid.GetCellData().AddArray(ms) + + + if fname is None: + writer = vtk.vtkDataSetWriter() + writer.SetHeader('damask.Geom '+version) + writer.WriteToOutputStringOn() + else: + writer = vtk.vtkXMLRectilinearGridWriter() + writer.SetCompressorTypeToZLib() + writer.SetDataModeToBinary() + + ext = os.path.splitext(fname)[1] + if ext == '': + name = fname + '.' + writer.GetDefaultFileExtension() + elif ext == writer.GetDefaultFileExtension(): + name = fname + else: + raise ValueError("unknown extension {}".format(ext)) + writer.SetFileName(name) - if i != grid.prod(): - raise TypeError('Invalid file: expected {} entries,found {}'.format(grid.prod(),i)) - - microstructure = microstructure.reshape(grid,order='F') - if not np.any(np.mod(microstructure.flatten(),1) != 0.0): # no float present - microstructure = microstructure.astype('int') - - return cls(microstructure.reshape(grid),size,origin,homogenization,comments) + writer.SetInputData(rGrid) + writer.Write() - def to_file(self,fname): - """ - Writes a geom file. + if fname is None: return writer.GetOutputString() - Parameters - ---------- - fname : str or file handle - geometry file to write. - - """ - header = self.get_header() - grid = self.get_grid() - format_string = '%{}i'.format(1+int(np.floor(np.log10(np.nanmax(self.microstructure))))) if self.microstructure.dtype == int \ - else '%g' - np.savetxt(fname, - self.microstructure.reshape([grid[0],np.prod(grid[1:])],order='F').T, - header='\n'.join(header), fmt=format_string, comments='') - - - - def to_vtk(self,fname=None): - """ - Generates vtk file. - - Parameters - ---------- - fname : str, optional - vtk file to write. If no file is given, a string is returned. - - """ - grid = self.get_grid() + np.ones(3,dtype=int) - size = self.get_size() - origin = self.get_origin() - - coords = [ - np.linspace(0,size[0],grid[0]) + origin[0], - np.linspace(0,size[1],grid[1]) + origin[1], - np.linspace(0,size[2],grid[2]) + origin[2] - ] - - rGrid = vtk.vtkRectilinearGrid() - coordArray = [vtk.vtkDoubleArray(),vtk.vtkDoubleArray(),vtk.vtkDoubleArray()] - - rGrid.SetDimensions(*grid) - for d,coord in enumerate(coords): - for c in coord: - coordArray[d].InsertNextValue(c) - - rGrid.SetXCoordinates(coordArray[0]) - rGrid.SetYCoordinates(coordArray[1]) - rGrid.SetZCoordinates(coordArray[2]) - - ms = numpy_support.numpy_to_vtk(num_array=self.microstructure.flatten(order='F'), - array_type=vtk.VTK_INT if self.microstructure.dtype == int else vtk.VTK_FLOAT) - ms.SetName('microstructure') - rGrid.GetCellData().AddArray(ms) - - - if fname is None: - writer = vtk.vtkDataSetWriter() - writer.SetHeader('damask.Geom '+version) - writer.WriteToOutputStringOn() - else: - writer = vtk.vtkXMLRectilinearGridWriter() - writer.SetCompressorTypeToZLib() - writer.SetDataModeToBinary() - - ext = os.path.splitext(fname)[1] - if ext == '': - name = fname + '.' + writer.GetDefaultFileExtension() - elif ext == writer.GetDefaultFileExtension(): - name = fname - else: - raise ValueError("unknown extension {}".format(ext)) - writer.SetFileName(name) - - writer.SetInputData(rGrid) - writer.Write() - - if fname is None: return writer.GetOutputString() - - - def show(self): - """Show raw content (as in file).""" - f=StringIO() - self.to_file(f) - f.seek(0) - return ''.join(f.readlines()) + + def show(self): + """Show raw content (as in file).""" + f=StringIO() + self.to_file(f) + f.seek(0) + return ''.join(f.readlines()) From dfb95df68975b019040fb76ba4ced18db3c2c1fa Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 22 Nov 2019 21:48:41 +0100 Subject: [PATCH 122/233] migrating shell scripts to python class --- processing/pre/geom_clean.py | 10 ++----- processing/pre/geom_mirror.py | 20 +------------- python/damask/geom.py | 49 +++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 27 deletions(-) diff --git a/processing/pre/geom_clean.py b/processing/pre/geom_clean.py index aeafe4f09..7ee87fe0a 100755 --- a/processing/pre/geom_clean.py +++ b/processing/pre/geom_clean.py @@ -15,11 +15,6 @@ scriptName = os.path.splitext(os.path.basename(__file__))[0] scriptID = ' '.join([scriptName,damask.version]) -def mostFrequent(arr): - unique, inverse = np.unique(arr, return_inverse=True) - return unique[np.argmax(np.bincount(inverse))] - - #-------------------------------------------------------------------------------------------------- # MAIN #-------------------------------------------------------------------------------------------------- @@ -46,9 +41,8 @@ for name in filenames: geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) - damask.util.croak(geom.update(ndimage.filters.generic_filter( - geom.microstructure,mostFrequent, - size=(options.stencil,)*3).astype(geom.microstructure.dtype))) + damask.util.croak(geom.clean(options.stencil)) + geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) if name is None: diff --git a/processing/pre/geom_mirror.py b/processing/pre/geom_mirror.py index 67bd2366f..3f9755818 100755 --- a/processing/pre/geom_mirror.py +++ b/processing/pre/geom_mirror.py @@ -38,16 +38,6 @@ parser.set_defaults(reflect = False) (options, filenames) = parser.parse_args() -if options.directions is None: - parser.error('no direction given.') - -if not set(options.directions).issubset(validDirections): - invalidDirections = [str(e) for e in set(options.directions).difference(validDirections)] - parser.error('invalid directions {}. '.format(*invalidDirections)) - -limits = [None,None] if options.reflect else [-2,0] - - if filenames == []: filenames = [None] for name in filenames: @@ -55,15 +45,7 @@ for name in filenames: geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) - microstructure = geom.get_microstructure() - if 'z' in options.directions: - microstructure = np.concatenate([microstructure,microstructure[:,:,limits[0]:limits[1]:-1]],2) - if 'y' in options.directions: - microstructure = np.concatenate([microstructure,microstructure[:,limits[0]:limits[1]:-1,:]],1) - if 'x' in options.directions: - microstructure = np.concatenate([microstructure,microstructure[limits[0]:limits[1]:-1,:,:]],0) - - damask.util.croak(geom.update(microstructure,rescale=True)) + damask.util.croak(geom.mirror(options.directions,options.reflect)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) if name is None: diff --git a/python/damask/geom.py b/python/damask/geom.py index 5bf4f7750..640203be1 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -2,6 +2,7 @@ import os from io import StringIO import numpy as np +from scipy import ndimage import vtk from vtk.util import numpy_support @@ -385,3 +386,51 @@ class Geom(): self.to_file(f) f.seek(0) return ''.join(f.readlines()) + + + def mirror(self,directions,reflect=False): + """ + Mirror microstructure along given directions. + Parameters + ---------- + directions : iterable containing str + direction(s) along which the microstructure is mirrored. Valid entries are 'x', 'y', 'z'. + reflect : bool, optional + reflect (include) outermost layers. + """ + valid = {'x','y','z'} + if not all(isinstance(d, str) for d in directions): + raise TypeError('Directions are not of type str.') + elif not set(directions).issubset(valid): + raise ValueError('Invalid direction specified {}'.format(*set(directions).difference(valid))) + + limits = [None,None] if reflect else [-2,0] + ms = self.get_microstructure() + + if 'z' in directions: + ms = np.concatenate([ms,ms[:,:,limits[0]:limits[1]:-1]],2) + if 'y' in directions: + ms = np.concatenate([ms,ms[:,limits[0]:limits[1]:-1,:]],1) + if 'x' in directions: + ms = np.concatenate([ms,ms[limits[0]:limits[1]:-1,:,:]],0) + + return self.update(ms,rescale=True) + #self.add_comments('tbd') + + + def clean(self,stencil=3): + """ + Smooth microstructure by selecting most frequent index within given stencil at each location. + Parameters + ---------- + stencil : int, optional + size of smoothing stencil. + """ + def mostFrequent(arr): + unique, inverse = np.unique(arr, return_inverse=True) + return unique[np.argmax(np.bincount(inverse))] + + return self.update(ndimage.filters.generic_filter(self.microstructure, + mostFrequent, + size=(stencil,)*3).astype(self.microstructure.dtype)) + #self.add_comments('tbd') From 834cd43b665acaf5153a6e063c3c5429319e3d78 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 23 Nov 2019 08:06:26 +0100 Subject: [PATCH 123/233] intention not clear any ideas why __transforms__ was used? --- python/damask/geom.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/damask/geom.py b/python/damask/geom.py index 640203be1..6fb9af5a5 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -31,7 +31,6 @@ class Geom(): comments lines. """ - self.__transforms__ = \ self.set_microstructure(microstructure) self.set_size(size) self.set_origin(origin) From 2810531c97896497af351cc1e59fd5bc8eb138f4 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 23 Nov 2019 12:59:41 +0100 Subject: [PATCH 124/233] a test with reference results --- python/tests/conftest.py | 21 +++++++++ python/tests/reference/Geom/mirror.geom | 35 +++++++++++++++ python/tests/test_Geom.py | 59 +++++++++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 python/tests/conftest.py create mode 100644 python/tests/reference/Geom/mirror.geom create mode 100644 python/tests/test_Geom.py diff --git a/python/tests/conftest.py b/python/tests/conftest.py new file mode 100644 index 000000000..6145c66d5 --- /dev/null +++ b/python/tests/conftest.py @@ -0,0 +1,21 @@ +import os + +import pytest + +import damask + +def pytest_addoption(parser): + parser.addoption("--update", + action="store_true", + default=False) + +@pytest.fixture +def update(request): + """store current results as new reference results.""" + return request.config.getoption("--update") + +@pytest.fixture +def reference_dir_base(): + """directory containing reference results.""" + env = damask.Environment() + return os.path.join(env.rootDir(),'python','tests','reference') diff --git a/python/tests/reference/Geom/mirror.geom b/python/tests/reference/Geom/mirror.geom new file mode 100644 index 000000000..1bc4c8640 --- /dev/null +++ b/python/tests/reference/Geom/mirror.geom @@ -0,0 +1,35 @@ +4 header +grid a 14 b 5 c 6 +size x 1.4e-05 y 5e-06 z 6e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 1 2 2 22 2 1 + 1 1 6 26 2 2 5 25 5 2 2 26 6 1 + 1 1 10 30 2 2 9 29 9 2 2 30 10 1 + 1 1 14 34 2 2 13 33 13 2 2 34 14 1 + 1 1 18 38 2 2 17 37 17 2 2 38 18 1 + 1 1 3 23 2 2 2 22 2 2 2 23 3 1 + 1 1 7 27 2 2 6 26 6 2 2 27 7 1 + 1 1 11 31 2 2 10 30 10 2 2 31 11 1 + 1 1 15 35 2 2 14 34 14 2 2 35 15 1 + 1 1 19 39 2 2 18 38 18 2 2 39 19 1 + 1 1 4 24 2 2 3 23 3 2 2 24 4 1 + 1 1 8 28 2 2 7 27 7 2 2 28 8 1 + 1 1 12 32 2 2 11 31 11 2 2 32 12 1 + 1 1 16 36 2 2 15 35 15 2 2 36 16 1 + 1 1 20 40 2 2 19 39 19 2 2 40 20 1 + 1 1 5 25 2 2 4 24 4 2 2 25 5 1 + 1 1 9 29 2 2 8 28 8 2 2 29 9 1 + 1 1 13 33 2 2 12 32 12 2 2 33 13 1 + 1 1 17 37 2 2 16 36 16 2 2 37 17 1 + 1 1 21 41 2 2 20 40 20 2 2 41 21 1 + 1 1 4 24 2 2 3 23 3 2 2 24 4 1 + 1 1 8 28 2 2 7 27 7 2 2 28 8 1 + 1 1 12 32 2 2 11 31 11 2 2 32 12 1 + 1 1 16 36 2 2 15 35 15 2 2 36 16 1 + 1 1 20 40 2 2 19 39 19 2 2 40 20 1 + 1 1 3 23 2 2 2 22 2 2 2 23 3 1 + 1 1 7 27 2 2 6 26 6 2 2 27 7 1 + 1 1 11 31 2 2 10 30 10 2 2 31 11 1 + 1 1 15 35 2 2 14 34 14 2 2 35 15 1 + 1 1 19 39 2 2 18 38 18 2 2 39 19 1 diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py new file mode 100644 index 000000000..3c15d704e --- /dev/null +++ b/python/tests/test_Geom.py @@ -0,0 +1,59 @@ +import copy +import os + +import pytest +import numpy as np + +from damask import Geom + + +def geom_equal(a,b): + return np.all(a.get_microstructure() == b.get_microstructure()) and \ + np.all(a.get_size() == b.get_size()) and \ + np.all(a.get_grid() == b.get_grid()) + +@pytest.fixture +def default(): + """Simple geometry.""" + x=np.concatenate((np.ones(40,dtype=int), + np.arange(2,42), + np.ones(40,dtype=int)*2, + np.arange(1,41))).reshape((8,5,4)) + return Geom(x,[8e-6,5e-6,4e-6]) + +@pytest.fixture +def reference_dir(reference_dir_base): + """directory containing reference results.""" + return os.path.join(reference_dir_base,'Geom') + + +class TestGeom: + + def test_update(self,default): + modified = copy.deepcopy(default) + modified.update( + default.get_microstructure(), + default.get_size(), + default.get_origin() + ) + assert geom_equal(modified,default) + + + def test_write_read_str(self,default,tmpdir): + default.to_file(str(tmpdir.join('default.geom'))) + new = Geom.from_file(str(tmpdir.join('default.geom'))) + assert geom_equal(new,default) + + def test_write_read_file(self,default,tmpdir): + with open(tmpdir.join('default.geom'),'w') as f: + default.to_file(f) + with open(tmpdir.join('default.geom')) as f: + new = Geom.from_file(f) + assert geom_equal(new,default) + + def test_mirror(self,default,update,reference_dir): + modified = copy.deepcopy(default) + modified.mirror(['x','z']) + reference = os.path.join(reference_dir,'mirror.geom') + if update: modified.to_file(reference) + assert geom_equal(modified,Geom.from_file(reference)) From 510e4752fd7401a614fdaee2b65e89d19f6fdd98 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 23 Nov 2019 14:02:59 +0100 Subject: [PATCH 125/233] using parametrized tests for better coverage --- .../tests/reference/Geom/clean_stencil=1.geom | 25 ++++++ .../tests/reference/Geom/clean_stencil=2.geom | 25 ++++++ .../tests/reference/Geom/clean_stencil=3.geom | 25 ++++++ .../tests/reference/Geom/clean_stencil=4.geom | 25 ++++++ .../mirror_directions=x-y-z_reflect=True.geom | 85 +++++++++++++++++++ ...=> mirror_directions=x_reflect=False.geom} | 14 +-- .../mirror_directions=y-z_reflect=False.geom | 53 ++++++++++++ ...mirror_directions=z-x-y_reflect=False.geom | 53 ++++++++++++ python/tests/test_Geom.py | 21 ++++- 9 files changed, 311 insertions(+), 15 deletions(-) create mode 100644 python/tests/reference/Geom/clean_stencil=1.geom create mode 100644 python/tests/reference/Geom/clean_stencil=2.geom create mode 100644 python/tests/reference/Geom/clean_stencil=3.geom create mode 100644 python/tests/reference/Geom/clean_stencil=4.geom create mode 100644 python/tests/reference/Geom/mirror_directions=x-y-z_reflect=True.geom rename python/tests/reference/Geom/{mirror.geom => mirror_directions=x_reflect=False.geom} (65%) create mode 100644 python/tests/reference/Geom/mirror_directions=y-z_reflect=False.geom create mode 100644 python/tests/reference/Geom/mirror_directions=z-x-y_reflect=False.geom diff --git a/python/tests/reference/Geom/clean_stencil=1.geom b/python/tests/reference/Geom/clean_stencil=1.geom new file mode 100644 index 000000000..2fe5314fe --- /dev/null +++ b/python/tests/reference/Geom/clean_stencil=1.geom @@ -0,0 +1,25 @@ +4 header +grid a 8 b 5 c 4 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 + 1 1 6 26 2 2 5 25 + 1 1 10 30 2 2 9 29 + 1 1 14 34 2 2 13 33 + 1 1 18 38 2 2 17 37 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 5 25 2 2 4 24 + 1 1 9 29 2 2 8 28 + 1 1 13 33 2 2 12 32 + 1 1 17 37 2 2 16 36 + 1 1 21 41 2 2 20 40 diff --git a/python/tests/reference/Geom/clean_stencil=2.geom b/python/tests/reference/Geom/clean_stencil=2.geom new file mode 100644 index 000000000..f074fea56 --- /dev/null +++ b/python/tests/reference/Geom/clean_stencil=2.geom @@ -0,0 +1,25 @@ +4 header +grid a 8 b 5 c 4 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 1 2 2 2 1 1 + 1 1 1 2 2 2 2 1 + 1 1 1 6 2 2 2 5 + 1 1 1 10 2 2 2 9 + 1 1 1 14 2 2 2 13 + 1 1 1 2 2 2 2 1 + 1 1 1 2 2 2 2 1 + 1 1 1 6 2 2 2 5 + 1 1 1 10 2 2 2 9 + 1 1 1 14 2 2 2 13 + 1 1 1 3 2 2 2 2 + 1 1 1 3 2 2 2 2 + 1 1 1 7 2 2 2 6 + 1 1 1 11 2 2 2 10 + 1 1 1 15 2 2 2 14 + 1 1 1 4 2 2 2 3 + 1 1 1 4 2 2 2 3 + 1 1 1 8 2 2 2 7 + 1 1 1 12 2 2 2 11 + 1 1 1 16 2 2 2 15 diff --git a/python/tests/reference/Geom/clean_stencil=3.geom b/python/tests/reference/Geom/clean_stencil=3.geom new file mode 100644 index 000000000..63e1dce5a --- /dev/null +++ b/python/tests/reference/Geom/clean_stencil=3.geom @@ -0,0 +1,25 @@ +4 header +grid a 8 b 5 c 4 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 1 2 2 2 2 21 + 1 1 1 2 2 2 2 21 + 1 1 1 2 2 2 2 25 + 1 1 1 2 2 2 2 29 + 1 1 1 2 2 2 2 37 + 1 1 1 2 2 2 2 21 + 1 1 1 2 2 2 2 21 + 1 1 1 2 2 2 2 25 + 1 1 1 2 2 2 2 29 + 1 1 1 2 2 2 2 37 + 1 1 1 2 2 2 2 22 + 1 1 1 2 2 2 2 22 + 1 1 1 2 2 2 2 26 + 1 1 1 2 2 2 2 30 + 1 1 1 2 2 2 2 38 + 1 1 1 2 2 2 2 24 + 1 1 1 2 2 2 2 24 + 1 1 1 2 2 2 2 28 + 1 1 1 2 2 2 2 32 + 1 1 1 2 2 2 2 40 diff --git a/python/tests/reference/Geom/clean_stencil=4.geom b/python/tests/reference/Geom/clean_stencil=4.geom new file mode 100644 index 000000000..eef322d3f --- /dev/null +++ b/python/tests/reference/Geom/clean_stencil=4.geom @@ -0,0 +1,25 @@ +4 header +grid a 8 b 5 c 4 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 diff --git a/python/tests/reference/Geom/mirror_directions=x-y-z_reflect=True.geom b/python/tests/reference/Geom/mirror_directions=x-y-z_reflect=True.geom new file mode 100644 index 000000000..77ff709d7 --- /dev/null +++ b/python/tests/reference/Geom/mirror_directions=x-y-z_reflect=True.geom @@ -0,0 +1,85 @@ +4 header +grid a 16 b 10 c 8 +size x 1.6e-05 y 1e-05 z 8e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 21 1 2 2 22 2 1 1 + 1 1 6 26 2 2 5 25 25 5 2 2 26 6 1 1 + 1 1 10 30 2 2 9 29 29 9 2 2 30 10 1 1 + 1 1 14 34 2 2 13 33 33 13 2 2 34 14 1 1 + 1 1 18 38 2 2 17 37 37 17 2 2 38 18 1 1 + 1 1 18 38 2 2 17 37 37 17 2 2 38 18 1 1 + 1 1 14 34 2 2 13 33 33 13 2 2 34 14 1 1 + 1 1 10 30 2 2 9 29 29 9 2 2 30 10 1 1 + 1 1 6 26 2 2 5 25 25 5 2 2 26 6 1 1 + 1 1 2 22 2 2 1 21 21 1 2 2 22 2 1 1 + 1 1 3 23 2 2 2 22 22 2 2 2 23 3 1 1 + 1 1 7 27 2 2 6 26 26 6 2 2 27 7 1 1 + 1 1 11 31 2 2 10 30 30 10 2 2 31 11 1 1 + 1 1 15 35 2 2 14 34 34 14 2 2 35 15 1 1 + 1 1 19 39 2 2 18 38 38 18 2 2 39 19 1 1 + 1 1 19 39 2 2 18 38 38 18 2 2 39 19 1 1 + 1 1 15 35 2 2 14 34 34 14 2 2 35 15 1 1 + 1 1 11 31 2 2 10 30 30 10 2 2 31 11 1 1 + 1 1 7 27 2 2 6 26 26 6 2 2 27 7 1 1 + 1 1 3 23 2 2 2 22 22 2 2 2 23 3 1 1 + 1 1 4 24 2 2 3 23 23 3 2 2 24 4 1 1 + 1 1 8 28 2 2 7 27 27 7 2 2 28 8 1 1 + 1 1 12 32 2 2 11 31 31 11 2 2 32 12 1 1 + 1 1 16 36 2 2 15 35 35 15 2 2 36 16 1 1 + 1 1 20 40 2 2 19 39 39 19 2 2 40 20 1 1 + 1 1 20 40 2 2 19 39 39 19 2 2 40 20 1 1 + 1 1 16 36 2 2 15 35 35 15 2 2 36 16 1 1 + 1 1 12 32 2 2 11 31 31 11 2 2 32 12 1 1 + 1 1 8 28 2 2 7 27 27 7 2 2 28 8 1 1 + 1 1 4 24 2 2 3 23 23 3 2 2 24 4 1 1 + 1 1 5 25 2 2 4 24 24 4 2 2 25 5 1 1 + 1 1 9 29 2 2 8 28 28 8 2 2 29 9 1 1 + 1 1 13 33 2 2 12 32 32 12 2 2 33 13 1 1 + 1 1 17 37 2 2 16 36 36 16 2 2 37 17 1 1 + 1 1 21 41 2 2 20 40 40 20 2 2 41 21 1 1 + 1 1 21 41 2 2 20 40 40 20 2 2 41 21 1 1 + 1 1 17 37 2 2 16 36 36 16 2 2 37 17 1 1 + 1 1 13 33 2 2 12 32 32 12 2 2 33 13 1 1 + 1 1 9 29 2 2 8 28 28 8 2 2 29 9 1 1 + 1 1 5 25 2 2 4 24 24 4 2 2 25 5 1 1 + 1 1 5 25 2 2 4 24 24 4 2 2 25 5 1 1 + 1 1 9 29 2 2 8 28 28 8 2 2 29 9 1 1 + 1 1 13 33 2 2 12 32 32 12 2 2 33 13 1 1 + 1 1 17 37 2 2 16 36 36 16 2 2 37 17 1 1 + 1 1 21 41 2 2 20 40 40 20 2 2 41 21 1 1 + 1 1 21 41 2 2 20 40 40 20 2 2 41 21 1 1 + 1 1 17 37 2 2 16 36 36 16 2 2 37 17 1 1 + 1 1 13 33 2 2 12 32 32 12 2 2 33 13 1 1 + 1 1 9 29 2 2 8 28 28 8 2 2 29 9 1 1 + 1 1 5 25 2 2 4 24 24 4 2 2 25 5 1 1 + 1 1 4 24 2 2 3 23 23 3 2 2 24 4 1 1 + 1 1 8 28 2 2 7 27 27 7 2 2 28 8 1 1 + 1 1 12 32 2 2 11 31 31 11 2 2 32 12 1 1 + 1 1 16 36 2 2 15 35 35 15 2 2 36 16 1 1 + 1 1 20 40 2 2 19 39 39 19 2 2 40 20 1 1 + 1 1 20 40 2 2 19 39 39 19 2 2 40 20 1 1 + 1 1 16 36 2 2 15 35 35 15 2 2 36 16 1 1 + 1 1 12 32 2 2 11 31 31 11 2 2 32 12 1 1 + 1 1 8 28 2 2 7 27 27 7 2 2 28 8 1 1 + 1 1 4 24 2 2 3 23 23 3 2 2 24 4 1 1 + 1 1 3 23 2 2 2 22 22 2 2 2 23 3 1 1 + 1 1 7 27 2 2 6 26 26 6 2 2 27 7 1 1 + 1 1 11 31 2 2 10 30 30 10 2 2 31 11 1 1 + 1 1 15 35 2 2 14 34 34 14 2 2 35 15 1 1 + 1 1 19 39 2 2 18 38 38 18 2 2 39 19 1 1 + 1 1 19 39 2 2 18 38 38 18 2 2 39 19 1 1 + 1 1 15 35 2 2 14 34 34 14 2 2 35 15 1 1 + 1 1 11 31 2 2 10 30 30 10 2 2 31 11 1 1 + 1 1 7 27 2 2 6 26 26 6 2 2 27 7 1 1 + 1 1 3 23 2 2 2 22 22 2 2 2 23 3 1 1 + 1 1 2 22 2 2 1 21 21 1 2 2 22 2 1 1 + 1 1 6 26 2 2 5 25 25 5 2 2 26 6 1 1 + 1 1 10 30 2 2 9 29 29 9 2 2 30 10 1 1 + 1 1 14 34 2 2 13 33 33 13 2 2 34 14 1 1 + 1 1 18 38 2 2 17 37 37 17 2 2 38 18 1 1 + 1 1 18 38 2 2 17 37 37 17 2 2 38 18 1 1 + 1 1 14 34 2 2 13 33 33 13 2 2 34 14 1 1 + 1 1 10 30 2 2 9 29 29 9 2 2 30 10 1 1 + 1 1 6 26 2 2 5 25 25 5 2 2 26 6 1 1 + 1 1 2 22 2 2 1 21 21 1 2 2 22 2 1 1 diff --git a/python/tests/reference/Geom/mirror.geom b/python/tests/reference/Geom/mirror_directions=x_reflect=False.geom similarity index 65% rename from python/tests/reference/Geom/mirror.geom rename to python/tests/reference/Geom/mirror_directions=x_reflect=False.geom index 1bc4c8640..afb3bb5f8 100644 --- a/python/tests/reference/Geom/mirror.geom +++ b/python/tests/reference/Geom/mirror_directions=x_reflect=False.geom @@ -1,6 +1,6 @@ 4 header -grid a 14 b 5 c 6 -size x 1.4e-05 y 5e-06 z 6e-06 +grid a 14 b 5 c 4 +size x 1.4e-05 y 5e-06 z 4e-06 origin x 0.0 y 0.0 z 0.0 homogenization 1 1 1 2 22 2 2 1 21 1 2 2 22 2 1 @@ -23,13 +23,3 @@ homogenization 1 1 1 13 33 2 2 12 32 12 2 2 33 13 1 1 1 17 37 2 2 16 36 16 2 2 37 17 1 1 1 21 41 2 2 20 40 20 2 2 41 21 1 - 1 1 4 24 2 2 3 23 3 2 2 24 4 1 - 1 1 8 28 2 2 7 27 7 2 2 28 8 1 - 1 1 12 32 2 2 11 31 11 2 2 32 12 1 - 1 1 16 36 2 2 15 35 15 2 2 36 16 1 - 1 1 20 40 2 2 19 39 19 2 2 40 20 1 - 1 1 3 23 2 2 2 22 2 2 2 23 3 1 - 1 1 7 27 2 2 6 26 6 2 2 27 7 1 - 1 1 11 31 2 2 10 30 10 2 2 31 11 1 - 1 1 15 35 2 2 14 34 14 2 2 35 15 1 - 1 1 19 39 2 2 18 38 18 2 2 39 19 1 diff --git a/python/tests/reference/Geom/mirror_directions=y-z_reflect=False.geom b/python/tests/reference/Geom/mirror_directions=y-z_reflect=False.geom new file mode 100644 index 000000000..37d8ae18e --- /dev/null +++ b/python/tests/reference/Geom/mirror_directions=y-z_reflect=False.geom @@ -0,0 +1,53 @@ +4 header +grid a 8 b 8 c 6 +size x 8e-06 y 8.000000000000001e-06 z 6e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 + 1 1 6 26 2 2 5 25 + 1 1 10 30 2 2 9 29 + 1 1 14 34 2 2 13 33 + 1 1 18 38 2 2 17 37 + 1 1 14 34 2 2 13 33 + 1 1 10 30 2 2 9 29 + 1 1 6 26 2 2 5 25 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 15 35 2 2 14 34 + 1 1 11 31 2 2 10 30 + 1 1 7 27 2 2 6 26 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 16 36 2 2 15 35 + 1 1 12 32 2 2 11 31 + 1 1 8 28 2 2 7 27 + 1 1 5 25 2 2 4 24 + 1 1 9 29 2 2 8 28 + 1 1 13 33 2 2 12 32 + 1 1 17 37 2 2 16 36 + 1 1 21 41 2 2 20 40 + 1 1 17 37 2 2 16 36 + 1 1 13 33 2 2 12 32 + 1 1 9 29 2 2 8 28 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 16 36 2 2 15 35 + 1 1 12 32 2 2 11 31 + 1 1 8 28 2 2 7 27 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 15 35 2 2 14 34 + 1 1 11 31 2 2 10 30 + 1 1 7 27 2 2 6 26 diff --git a/python/tests/reference/Geom/mirror_directions=z-x-y_reflect=False.geom b/python/tests/reference/Geom/mirror_directions=z-x-y_reflect=False.geom new file mode 100644 index 000000000..5d7c23eb0 --- /dev/null +++ b/python/tests/reference/Geom/mirror_directions=z-x-y_reflect=False.geom @@ -0,0 +1,53 @@ +4 header +grid a 14 b 8 c 6 +size x 1.4e-05 y 8.000000000000001e-06 z 6e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 1 2 2 22 2 1 + 1 1 6 26 2 2 5 25 5 2 2 26 6 1 + 1 1 10 30 2 2 9 29 9 2 2 30 10 1 + 1 1 14 34 2 2 13 33 13 2 2 34 14 1 + 1 1 18 38 2 2 17 37 17 2 2 38 18 1 + 1 1 14 34 2 2 13 33 13 2 2 34 14 1 + 1 1 10 30 2 2 9 29 9 2 2 30 10 1 + 1 1 6 26 2 2 5 25 5 2 2 26 6 1 + 1 1 3 23 2 2 2 22 2 2 2 23 3 1 + 1 1 7 27 2 2 6 26 6 2 2 27 7 1 + 1 1 11 31 2 2 10 30 10 2 2 31 11 1 + 1 1 15 35 2 2 14 34 14 2 2 35 15 1 + 1 1 19 39 2 2 18 38 18 2 2 39 19 1 + 1 1 15 35 2 2 14 34 14 2 2 35 15 1 + 1 1 11 31 2 2 10 30 10 2 2 31 11 1 + 1 1 7 27 2 2 6 26 6 2 2 27 7 1 + 1 1 4 24 2 2 3 23 3 2 2 24 4 1 + 1 1 8 28 2 2 7 27 7 2 2 28 8 1 + 1 1 12 32 2 2 11 31 11 2 2 32 12 1 + 1 1 16 36 2 2 15 35 15 2 2 36 16 1 + 1 1 20 40 2 2 19 39 19 2 2 40 20 1 + 1 1 16 36 2 2 15 35 15 2 2 36 16 1 + 1 1 12 32 2 2 11 31 11 2 2 32 12 1 + 1 1 8 28 2 2 7 27 7 2 2 28 8 1 + 1 1 5 25 2 2 4 24 4 2 2 25 5 1 + 1 1 9 29 2 2 8 28 8 2 2 29 9 1 + 1 1 13 33 2 2 12 32 12 2 2 33 13 1 + 1 1 17 37 2 2 16 36 16 2 2 37 17 1 + 1 1 21 41 2 2 20 40 20 2 2 41 21 1 + 1 1 17 37 2 2 16 36 16 2 2 37 17 1 + 1 1 13 33 2 2 12 32 12 2 2 33 13 1 + 1 1 9 29 2 2 8 28 8 2 2 29 9 1 + 1 1 4 24 2 2 3 23 3 2 2 24 4 1 + 1 1 8 28 2 2 7 27 7 2 2 28 8 1 + 1 1 12 32 2 2 11 31 11 2 2 32 12 1 + 1 1 16 36 2 2 15 35 15 2 2 36 16 1 + 1 1 20 40 2 2 19 39 19 2 2 40 20 1 + 1 1 16 36 2 2 15 35 15 2 2 36 16 1 + 1 1 12 32 2 2 11 31 11 2 2 32 12 1 + 1 1 8 28 2 2 7 27 7 2 2 28 8 1 + 1 1 3 23 2 2 2 22 2 2 2 23 3 1 + 1 1 7 27 2 2 6 26 6 2 2 27 7 1 + 1 1 11 31 2 2 10 30 10 2 2 31 11 1 + 1 1 15 35 2 2 14 34 14 2 2 35 15 1 + 1 1 19 39 2 2 18 38 18 2 2 39 19 1 + 1 1 15 35 2 2 14 34 14 2 2 35 15 1 + 1 1 11 31 2 2 10 30 10 2 2 31 11 1 + 1 1 7 27 2 2 6 26 6 2 2 27 7 1 diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py index 3c15d704e..8171a9922 100644 --- a/python/tests/test_Geom.py +++ b/python/tests/test_Geom.py @@ -51,9 +51,24 @@ class TestGeom: new = Geom.from_file(f) assert geom_equal(new,default) - def test_mirror(self,default,update,reference_dir): + @pytest.mark.parametrize('directions,reflect',[ + (['x'], False), + (['x','y','z'],True), + (['z','x','y'],False), + (['y','z'], False)]) + def test_mirror(self,default,update,reference_dir,directions,reflect): modified = copy.deepcopy(default) - modified.mirror(['x','z']) - reference = os.path.join(reference_dir,'mirror.geom') + modified.mirror(directions,reflect) + tag = 'directions={}_reflect={}'.format('-'.join(directions),reflect) + reference = os.path.join(reference_dir,'mirror_{}.geom'.format(tag)) + if update: modified.to_file(reference) + assert geom_equal(modified,Geom.from_file(reference)) + + @pytest.mark.parametrize('stencil',[(1),(2),(3),(4)]) + def test_clean(self,default,update,reference_dir,stencil): + modified = copy.deepcopy(default) + modified.clean(stencil) + tag = 'stencil={}'.format(stencil) + reference = os.path.join(reference_dir,'clean_{}.geom'.format(tag)) if update: modified.to_file(reference) assert geom_equal(modified,Geom.from_file(reference)) From 4dc4442fae140ababe45fd782f3ded3d985cda49 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 23 Nov 2019 16:15:08 +0100 Subject: [PATCH 126/233] small DADF5 file for testing --- .../tests/reference/DADF5/12grains6x7x8.geom | 125 +++++++++++++++++ .../DADF5/12grains6x7x8_tensionY.hdf5 | Bin 0 -> 1935932 bytes python/tests/reference/DADF5/material.config | 129 ++++++++++++++++++ python/tests/reference/DADF5/tensionY.load | 1 + 4 files changed, 255 insertions(+) create mode 100644 python/tests/reference/DADF5/12grains6x7x8.geom create mode 100644 python/tests/reference/DADF5/12grains6x7x8_tensionY.hdf5 create mode 100644 python/tests/reference/DADF5/material.config create mode 100644 python/tests/reference/DADF5/tensionY.load diff --git a/python/tests/reference/DADF5/12grains6x7x8.geom b/python/tests/reference/DADF5/12grains6x7x8.geom new file mode 100644 index 000000000..7bb4a3e4d --- /dev/null +++ b/python/tests/reference/DADF5/12grains6x7x8.geom @@ -0,0 +1,125 @@ +68 header +geom_fromVoronoiTessellation 2.0.3-1073-g6f3cb071 + +[Grain1] +(gauss) phi1 358.98 Phi 65.62 phi2 24.48 +[Grain2] +(gauss) phi1 121.05 Phi 176.11 phi2 295.73 +[Grain3] +(gauss) phi1 43.79 Phi 113.76 phi2 345.90 +[Grain4] +(gauss) phi1 265.15 Phi 62.52 phi2 299.71 +[Grain5] +(gauss) phi1 221.23 Phi 26.54 phi2 207.05 +[Grain6] +(gauss) phi1 249.81 Phi 61.47 phi2 152.14 +[Grain7] +(gauss) phi1 332.45 Phi 99.16 phi2 345.34 +[Grain8] +(gauss) phi1 312.27 Phi 118.27 phi2 181.59 +[Grain9] +(gauss) phi1 303.10 Phi 48.21 phi2 358.03 +[Grain10] +(gauss) phi1 338.26 Phi 48.11 phi2 176.78 +[Grain11] +(gauss) phi1 115.17 Phi 56.54 phi2 223.84 +[Grain12] +(gauss) phi1 281.04 Phi 97.48 phi2 27.94 + +[Grain1] +crystallite 1 +(constituent) phase 1 texture 1 fraction 1.0 +[Grain2] +crystallite 1 +(constituent) phase 1 texture 2 fraction 1.0 +[Grain3] +crystallite 1 +(constituent) phase 1 texture 3 fraction 1.0 +[Grain4] +crystallite 1 +(constituent) phase 1 texture 4 fraction 1.0 +[Grain5] +crystallite 1 +(constituent) phase 1 texture 5 fraction 1.0 +[Grain6] +crystallite 1 +(constituent) phase 1 texture 6 fraction 1.0 +[Grain7] +crystallite 1 +(constituent) phase 1 texture 7 fraction 1.0 +[Grain8] +crystallite 1 +(constituent) phase 1 texture 8 fraction 1.0 +[Grain9] +crystallite 1 +(constituent) phase 1 texture 9 fraction 1.0 +[Grain10] +crystallite 1 +(constituent) phase 1 texture 10 fraction 1.0 +[Grain11] +crystallite 1 +(constituent) phase 1 texture 11 fraction 1.0 +[Grain12] +crystallite 1 +(constituent) phase 1 texture 12 fraction 1.0 + +grid a 6 b 7 c 8 +size x 0.75 y 0.875 z 1.0 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 9 3 3 10 9 9 + 9 1 1 1 9 9 + 9 11 1 1 7 9 + 7 11 11 7 7 7 + 7 11 11 7 7 7 +12 3 3 10 7 12 +12 3 3 10 10 12 +12 3 3 1 9 9 + 9 1 1 1 9 9 + 9 1 1 1 7 7 + 7 1 1 7 7 7 +12 12 3 7 7 7 +12 3 3 3 12 12 +12 3 3 3 12 12 +12 3 3 1 1 12 + 9 1 1 1 1 9 + 6 1 1 1 8 8 + 7 6 8 8 8 8 +12 12 8 8 8 12 +12 3 3 3 12 12 +12 3 3 3 12 12 + 5 6 6 6 1 12 + 6 6 6 6 8 8 + 6 6 6 8 8 8 + 8 6 8 8 8 8 +12 5 8 8 8 8 +12 5 5 8 8 12 + 5 5 5 3 12 12 + 5 5 6 6 6 5 + 6 6 6 6 6 6 + 6 6 6 6 8 8 + 4 4 6 8 8 8 + 4 4 2 2 2 8 + 5 5 5 2 2 2 + 5 5 5 5 2 5 + 5 5 5 10 10 5 + 6 6 6 6 10 4 + 4 4 11 11 2 4 + 4 4 11 2 2 4 + 4 4 2 2 2 2 + 5 5 5 2 2 2 + 5 5 5 10 10 5 + 5 5 10 10 10 9 + 4 11 11 11 10 9 + 4 4 11 11 11 4 + 4 4 11 11 2 4 + 4 4 2 2 2 2 + 5 5 2 2 2 2 + 5 5 10 10 10 10 + 9 10 10 10 10 9 + 9 11 11 10 9 9 + 4 11 11 11 9 9 + 4 11 11 11 7 7 + 4 4 11 2 7 7 +12 10 10 10 10 7 + 9 10 10 10 10 9 diff --git a/python/tests/reference/DADF5/12grains6x7x8_tensionY.hdf5 b/python/tests/reference/DADF5/12grains6x7x8_tensionY.hdf5 new file mode 100644 index 0000000000000000000000000000000000000000..61af6bbca6d8b74a2dc5f9d45ed16b5044278c02 GIT binary patch literal 1935932 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�Wr6m}$4jQQa_9!dNT4#GJt#M}r;4Sw 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

JmQrRbg=u>f^`0*&uhTE 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¥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࠹WgL}d!LH@Fm45{sCHP}viNxH9 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 z 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�ABvmS9A?$2<~;RXFY+IEL4Vx7W5 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�^~;ZVFL7-@Y(4_;=tT;F*V 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

eANn9?AmpybprI;$#duYn^`1g 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


-u=SaWc$Q@+wP3RUY`~tBQIO%Ns@I{u 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

^I4eypRw9Pu^^Y@j6dYoY` zcpdBE`;xvp18o_4m3UHCE#%zu+@60zoRRd)N@OG+Nc))U6pQ#Xfs#1ug7tjb{`W6= zus>2&am(!?c-6;g!XvMd_1-OWqlH*Uv*B4Zsa0sjYvA$Vi*Rx&< z{XFogHZDOw8|K_yn*#o?h?U}z@h8-$hz~l+z&}qycjj~W{WQs*YvBQe6877iA`SWK z^bfDiaUX1W6werB4(3>sQUgs^)#4EJGi|7MdH_RN)LvXusX?d;k@i=!*Agn|s{2eo z;54~7c;cf8@;V1&6W&6u-@DuO6>#n;^Q(+O9@CNW0jtx=C1%LV$>>d+{c(QoC z|KK=`yTl~(RY90P^Bu{P9>{y;&Cc6`AM?k&Qq2Q@&g-g3Sqr(7c#y&_=wYwj!wm|+ zRUA~X${qdt1nYiVhW*7bvDIM}YZ-Pt5zlYEQhkDazoK<^{T1+=Uc$4|5x(8Rly81- z&Cqi5y(FiA52JmKWneu<%dXR1_YmtLsZ<}0kvKC|>S*j0<4m1dcbGiu6>W*X%DnH-$FBj^50EIXw`01jp3*b1^?|tc+k3ab3TO>Fp-agR0@G z7hU0h!E+$3{tjP<0mFK>C-H0(c<-_2x1f4=hV?Z>@mQn{Q<`>dSf2%+bY|2ZE&)!# zS+~UV5SQY(?J<7HleEnga*?_#dscWe6c5+IWzQr2f@hN3Z(gGLmRj8j zMI6Y+OQkQ~#s}L&&c;inO1}y-CPL1}OROkszM@v}BpWZW2JlM5caXF368&OxX_Pwp zVdEusJRAHcq+I-mR`zev^*o;)k8<#OyBgk-<7th%b8__;BalY41mPKyZUaE#zU;` zAuhe**B5;P<9PAZto}=g2dMOe_JcNr`luy7Jp??s|0i>1_8NxX(D<&l+7bDgb0k0* zIE|{fRXt$WU#B+IuK<5)q#syV3q3Tt_H{_%zS;2nTFD##X$WzhFz1Y^ue=d&SXk|} zgZ*z`?XC21HleKfItrh75-R12=+bcL*|&$|JEuNF@9aCY{w?Ia4wgF~0{>x_qR)0) z#8Xog9&wUBl{|vJ$IcOe0beiBd!D2O)i)q zXXb@{q|Yahg+u;u$E{T(`Gp^Hp`I4dr{l)C_xljX`kCbhe$#;bO-!G3 zT-pd9E~vh0k8zLnuep?uxWKk@#?(B>FZZ!@Ix+5VRxGkA8yVk7zt|e|tWYycno)Z_-wtz81s1BnTOB8V^5yP$nVFv z?=QF;6@zu^%lT%j#KDKM`(LLTA`UyA`Yl)%_9ouuaJ36^zEgrpD{$Skm2t%ffb&Gr zggF->AJ=H`bT6(KZ)ra>8N4O9dy}F9_|x!9?xIV;fA?FB{eAq-bB&CgB(5toKj&>b zc(sH3W=K5N#cX&4kCoCz2}>E)DsiE_iQvPXh8g)~{tT;6e!t;ytk-TxG#8D;pON{)zf1VrqX(tN(1Ug#xj8kWn%xkUZ4@omrbyLVO zKgiRwtA+hmFt?(7jRh;Tk)NCFR1^sPbl!>oS-qNhSv$VqjW-K*6E4rsCqSPDp*#!U zdNV52(wJBMqJ+LD{Am_H))khwOIG@>W&9RB(W*~3MmV)@738ee!K`}blC6+ zh2Jdb5AoiF3bC5$h9?`lYt3jFH~ho=7u>{mK*zZwg<`mZ9dar($B z_8pa*WkToxL-CErfdBrjUbPz7bM#`l7oz6K7r8upBm_J@wKg_Z;Gd8SV#f>}kZtk$|bOL(2LMN ztIs6|0}my5^!A3Us3-DF5cBXL)Qv0gbsX^PF$;L~WahA24dl;W8^>ve zV;y?Dqs}RSVOdVBTeceVH`x!S9~zN|O?O@lo{Z#|A3lcu-Gis8-UrSx4^MPBh9IB) z_jq=hx$?~TCqhew6$ zux}D}#P1_;zV0`5-hlg)VXc1di|bBFcI_O&8SZ&u?<4fbhKGJ+J1aiQ2=nBdWjCjQ z-yZKOlg>o@?#{K3->gJEML@A;9{A9KH}~>G)M+hx+;(is8iwlko*))NV_&$8?@c%2 zMIR%^b-6cFdi#F)IRUKeC(YM(ag1cBHr_S&kAiP5M-2r?V}ELeK-o&U2*e>jeYpI< zuMbpbyf6iSPLfJrm4xeNC7pOa8^2@2(^8b>QF0!B(Q;kCRuX*J9{QLQyvFi=IB?$? zdD*wsuTSTK_Y@q%tpjkMgnPX9W31nuU$5rA0N!gQ+`L-Q4<~o>vEA-i*XVJ2_(J|p z`BpFi9---bp11ijtaY{L1W*S>_e2dU97X#N`?GBB!M+++yS@^`byH6qSUVFqGn;ss zEBGB7o_BwEiS??lv(E!O#>Pvm#@&vxs^C2~UMg+bf2uAc0eSep=OxO;%y(N1)$v|!*|=Y}`cLZ4b^VMm=<`qg zXW^gvPipVyopTK#XRH6DU zCGoEg04H1hC;cl+Tw*okZ1ta`cuLsnKPhg_>dBX(AGZ2W@XS+#yTHj-|4HAqkDT@l z{j=47QfkX>4L86a*y=xNY|2kFM4Z7^|4FF}gcWZFKd{w*j^b%$tN*0F{xA?R#&y~1 zKdE6kv9*rS8(aM+m31;|dM5g3tN)}nUA@L~TF0>0e^S!C=V#4^oUQ(oGI@OPgeUN` z)qjrSdCpe{2+xUjIo2Jm}<}jQ-i`KdHtB|1aCuA+G-W z`cEqPTNb?$a<=+U`tS>JpZm~1Tm9!Ko=a@?pLAo@makrjtJvy4sl*PgqYuFsZ1tbi zm+l)&LeW24{U?3K^2g`H&>LI*CvCmuo@fx{Z1tb?7oMkgThI?%{pTp2PPY0_DtO16 zg z{ajqspL+X$E4OF+&uI0%58F8hwr2n1{v1Dg4ucvwLBUJe2Kk1MC}HHh!^l~O(en<0 ze>C&&=Ojj2^CC?5bPEp-{absn|3`a6J##&4Q_0BrN-9cfimECaYKq?KUTW@ZR5Vma zx*9pzJkqzrp9`>`2U-3{K6)O6{qO(p=Rt0K{(UlomKeb?`tPsjL6-gPtN*w2Ak)!e zR6p*X0RfWkI0oVw`X8JMp>V3?&v}>spY=R?fB*XYmj?c&fq!Y>zl{cpKk)>#Dl?Qz z#<fT ztEK-zra#4wVHvtDVGZtyeg#h8UNBBnaKC#dhxz@5JjDhtv=5T z1>~oh_r(ns$aCw7_6g0yd4LuBjy%CW(ggvIM+a?@&t9=o`X%yZDUq$S?jax3`tGUF zHZMZ?&;KQ{e>UoTRYYz%;krBB?6Wz22=(=SnkQaYN{KGsK3NI!M*D+(nx4pW1b;Mn z13jpe@1OB=9z)6M_NzAr66#l~{4_;vtlKY0)n_e7z1PxdGj9hG>eMQ(S$7ms2Riq` zj&I0g`9%p-2d*V8hng*FM(UUp+OKZSM?PaHBlpeDV8UwuvPNsSDfAqfbc}`izMLQd zyO_14^o;QdR*@<4+q&vgny~I_x|e+P3*@`!?i0Lah&qnRzm_&E#XfP`?8cFOKUcpa zlpHtK`SDWMT(Ix=G@|YEJ>+ASa~&!XRAA^j=Yf(e)bF@f=2%edGNHsc&X-xQbG)g}ymKh4J`9(k7|>Swz|r=mXXXpU_U{76PF zg>NJuV{vGQ#MJqOI_CJJLCO~EmMdDi-RMVizd6@AK|-IJeOsKvm7z|$di$s&-}CXd zaWpfBp~Bp)K8)1Ayi1!MHGureoZ0nf?<~T8&PgGQNyu{rf3XUXL4L(f?7)d~Lxv^s zOn=u&7S6$>+i~f_51rrbm>gn+ebTb}VOQ7>OOd(0VnF4Hnq9;P`Q;D$|D0Gt(cw$g^T7$ywX(JA5mlR0WVDbtiPKK1T!|qeqFH znc=R8>pXCo_I5IO<7REz>j!42f1FaCDFpk;3i_G16LQVXAFZQ}k^jgF?(Ys}N+Z7( zSQL4K7d#Sevtgg(f(UbbChk24(1H#p$)p$G{H?NlP9+ zLmf?^tCy6`668B9$Aq{B6I%a$ZH=WpLnpm@WbzVtCokEu#wq~yL_deWeX+rLApiAr z7xt^?s_MkPTuZ1$(P{bK7EI~t`y_lV@_Maz@6P`jLg<09j+d^W{RxjP8fwT#Xin38 z-+=Z5^PZdvMqXDXS!+)e@)uQYdW#d$es|#>8!>z6KYx7YS>*Ze$6i$~#Xi!CG^Rh^ z3U!-i2TdQMPFiE1c2Z#^c%Y%6D0vy`J%Xj9S7JZvc0+CI74U;n_`xSQCqxGvebCT@ zJgc_zQ@cHoKT%saY>x5vIvnRQVz>2tY7-gwb=Z%M`me2#Up&DVZ~*7DI>!2WB}EV_ zbJ4ajI2To_;4#^K9L8nni_N8@>j~8;<5Rc@{P5)aPKy`Fm!Bz-h|NR(HM}q`T?2Y# z##HG~_e6cG{^diw$dB&dYu!F_j%wng8xPNUp$^H(VX!F%`h1-xeg=H8`NypDGrU$S?DA&lIvi{qpWXG7&iaLM_M1fya&%3@);RJrt?WJ%0`7F#NehcgvxD zeyq^Ze2hz;dwnfG@OrvCduYM01t~?kLlJqepIg=($G(R`^y&RKfOGR3t@-;guD7QM zH#@mt-s|t%uL!wQWZSZQebmRL>=fVvo>e!?#RDMUzEeM4zy!QBWxUmWZ=BbfQ=PdT z{%-hXo1g&fvgc-90`kHv?YX*{-H^+UH(YTD_Fr~5y1EhLKRJsG;kAy`$!eJ>8g@8Y zvDNJd^x*XFm-=D})CH%Hxl;vwo{>E0{MHHeJvwC#Pp4yFK;Qhj#A?)gNPWL;i*fWd ze6)1Id_p~SezZLtdjD>`LF*0nO;7&3xxd7gP`eWR#YfJ~SUleOYy<4)K~7LMryc6W z1{UsGh5OVGX#3p^<*<& zuEf5ouiU0-br?tW;K_Hr{jt9hq0EQ_f7=*yvo)AcZv;(oR)PP{p1AF8AN-d~XW33s z*yp5|XZV;9LX8=68nX`VC*8hrvl{yYuPbW~io>tVHRrirLH~n%Wu+te=&dJh&RHRT zIBB{){FfU;U4OFp`}bK4y)>niw<(lRr6*&pHaUZL?BfU*_^EDh{hTKFW0AD3%P-vT zMUAoVR-q2%q*0#V2h96bZQ^^61NU`~%XK!G7anJeH;qMItPm293&y_G*?ly?-SO`O|Z@`>J9HWv{8e z>lgSr`N4PM23$J}pKaa+e@}h)B=hNV#2fM92Ws3IYR$IWrFrmoLB-|VSD_!XtkWwL zyr54L4L)7)#s$xkkeRq{vc|&fC)gK~I%Fp)8A~Wp@8nmU=vPd5!)!U&72n{wN5Z(T zZsWwe{q{_Y`CVI~Z@9mi&&Skmf?rQadVOP}8O{YvyqPKD#*~)1+`c~yf7~bc_}Vz| z%x?3^s_RhS8WxoQ_6Fpdr^dyWJ77QY%bORGIHwq}I6BV<^L}E$ZG*?qkLpCRw}bHa zJll6!XK`N%i}%;^uSDD;_Pk#k|1SAdUbR)Q@V~@qxAv&S5sGf%}dOWIeM-i^f7<=&%7}((*8^MV_#j=%NJMQ zR2kt@Lh zQL7A;$-8Pps6A^AtjkBggB#u5+l=seZ|u6L)rg;O zJP1X7EOq;9^`s@>8%nLWl-mjOCfRSk9e(Rtxl~bbi3aDoRRY-GL?J3 z?eJkrzl@!^R1)!dcaOzJMU2zpJywO=;dh1iXdVansY1Gf9O?k+$wfdabvbR!4dJKdQI9sR#(f>zb7t`i z)U`B^UvN_k{=U_8LUsf6DRRk^KNUE`Gu8>(2O&-tnRKkp8|MMD!>oc9<9cS(g1@8v z_1Z%RB+<`C`Bqy#oYU>qU(Ej_oX|IWXL~6?&!;DM-71D%2__D-$HK2SC!~bxjPRpF z9QR{ShBcsV@!(t}&I@ky-1`ptx3jhjGekXFlK$fI8}RpLmj8}HLMeuxq%(NNI~u%HDt2}Xcs?L*FrfwKEDsd4-PD0!f0x!M zngjo>c{}NfImWAOUQ_W9;`v!z?dILEtH7Y+I_4OM$MWKGtKjd)-?W|U*#Pxggrc%A6Gx}x!Gqakw%=q_sY|&eb9sZK=jufjF-T#aeBev z0fiS_Ld2daJ*9K+YbE&LP{D-~WB6U2ao05-@Qlnv`S#<^49jYc>df(wd+yh`YXbe; z$$nT9gZ>7}(!Op^!1>5`&$bQ0t}dvy>JEdKu71+VVB!hQanQuo9XQ-Y^Baaxcep;u zNNOYG=FGi$k-*Pmr+2yu`$JK$sdubs)z4A0y$eK_KmTGR; zkMZ3hCazTvd$wP4+EL0B^CD!UR+Vd#&$5tV3q}zmra_k8; zf6t=1BIsX1_d<*NkaX*6xEnOXi%kQe6Z6RL8&T1x~}- zy5Wb*!B2+0JqsZh+h~+!0Kc;4{T#Xj`mk`A^a$)tb7fc| z3VIb>nD>j6w^@$ZG3Nx%`9t_!Th5L`3GhJRv`sS?q5rRZ08!FABnzvew=%u6%%Bg2GPDu zb*5n_(HmB&)TTv;)GTeXz%cazl$kcAKMK7O&{(s zSp++Ad~{Dz3jTil<(Z5tBkLTKgp9ec$L*IUecK3mO@V@zA^NE+kk_05T!#csxNgTh zzHNQJ<{;$Edrny~%;Sf|vlHbJKL~P<5tf8}Uuv&{5B$q`ejh6X*WJ#{Xf4OM(mT{s z4dL(Gb{bv?g#S`5p&}D8Kk6Mk^>iA}W4sGA{DSAWP-jj>Z&-`@>BOu(y8|#Tcl9e% zCqRDvj>X9);Mi8RYpx&Sw3_QH*6>5F{K=%!6*xLJNzeC&T}$-W`L|;pU*t89xsUei zx7po3jQCJ-r&*jPU||CMPl>_PMGf;nQS(>X(J5)+5~?ltWM z^APau$32%4u-@6XC`R`z{Q9W60A?R7sb8Vg!U%FnOnrrZ^`P@XFTO_ z-Z{@-V7d+JS?8OCO@ltyRu2y(;k>bmaf;hS@PJ0Y*Xal7cXL6i`LG$rCwZXN27ZvK zK0|R0^nOjecDW44v+yk*s86|QzUL9{*Wms-?l{~J z*SD68-F}4X`o8?E0{kv0Q`0g`1<#RsR-AnaaxM3Jjw9!=UIZ)cUTBW_i)+P_!~V#h z%q*HR1^P78SSZwtcxm~8w8>V1sPlTBw}1R=KQi~G8@Ky8t{5uR5gU$L?R{ywH-+t{nXbDZPoDmgv)uh{`9 zPx$*1eWbrGS~2XoY*+a%iE!jUSFxITu+GT{nOZJ`_-BRN{#^^<*Ry&9KP19_ ze$)sZTj$G^w#waRN+1_b%2{a&{Z!hdZ1*6LNWR;=*>(Ugna6ZxI?E+7&`RY zP3_n4yJeAM({S#9mgKv4d1T$-t-b5)4fwC41hn&M?NoDdyy^59ohkuFzCFw9hL%Z~7AJ ziwsYr_z|8l=^Z|!1U-ECm912cdHem^v0fYCr(;EeC*(l?m(5R?OmKqzew#3ECFJV| z)^fX}pNV!-oQ2ST@{1!p8komj<}}qtLI1X#ox7i4JS**4q915H7ssx2_DG$$-IOp{nnpSKH`9Q)zRhMsj=w4&LYvk4e^t`;P4A?Lx$dauxY)( z7D93UIyz${pOSY*iQmnJDIL4*UCK-NW13CSt0U0w(Xk;qBkNSr68X$qknf2TjT))n z^a)8@i1Ui2ejzLRcR_wW;T$o-dhe!rV$=lO2h9=m-WGDvp4BT_upZlTyCKjU-+M2a zo?HxhN<|Q@I5IEH3Av)Th)^9ioxSoV@QcXP6SQz$hyIPZgR+=Ucw2sqJfCBuv~SZ) z=;6|*`MqhDsKa=8+(b$fd>d3cex%;``542?bD_5bryCX=*C4dN&in}@&*jJ(%1JlH zI1I_TEl)x`zaU*nZVd4I7lf#qpubPGqGNgOz)Npqn#zFFctP#Bxu%4AzE|{qCgOR! z)#E1>V7zI+-dcSg!m3>7zI*}Z{ndNC#O?qm%k$=}!$z<-h2|&MS0bJf82@6V4(;dr zw@PLh-+?%eD#bvHq8K8Tb+ueOrCS+e2CA8y$pU<5p}pTr|2ppPvteQ%ut z&v5gewv<@Qv=HUy{Q`D)PDFI|gxAQY4f|Vj%|+hoMuJNco-aTbeBZEn9_Dek0`BO` zxbCLs65-R}*G^#@J{v-QvB>Za>LuyS!};l7zz2(z{LDRK34LVA<(r|vBjGq}<|){P z+N4J1<595BiHiBj(8ClFmkpx$-ATWYjG5~Y?=_2RTLBOM3`b6adG%LcoxzCz@@W)E za{+&;@%5+Lh?8w}V}2fheCc5DN>}7VMWbT`OEE5sPu!}s-wa-#d67RE@^h!%^tv%m z<>Wk7uR!~}hq}fEz+?9?^6)t6^T#ee3rO zy!+kqc~kwIK!T+cAV;b9LTUHW*NNMjCFU{vuW2*ze+`pzjq$<34KTA!IBTo zST}`js7*xsp+qOHO?rgRx<31hDCDojP0jEeJc?dKp1AX1ow1|+S+q6walTFrzX|#G zK-F0*;9ttE1Do;@Cv<*@@3Vp)x}Igf`-OOHEXVBAZmwAGB+A_zk-zp~n!jUy8{5;q z$_(rD^|}%R6s~I=`>Qwvc6BmyZjqV?#^wDRZ_W`sN2k_b;KzB8&8445=JyXzPovn>O!pAasge9RyI;&ST)dym6@Y73)J5#b?C!G@uUibMU zUsYcDYdz-o>${qD(oxUlc*w`G3-|Hlp?z>YcwkzK|Ef;lJo0g##(DS`&y#(RQqa$l zyhqxN(3|4-lfKn+u)g~_S>8UJQ1^yIH5#GED$nI#ZXjQ0XEVw7>N-Mg$>c7v$GGe> z+j7kj=N<&6%&BX_`hDft)F-ne@cgdTf#wT?a6WtCfrT$45RXYNh^c`5!}Y-f3Am21 z{9E2z;FDgpmjm^X`@Q?zy#v=F3tcywQxl&g>X0sSl-Q}%uv)f%LVur8&h`ls!_jqw>^sduS>XUzNe z9F~Wl&d%vReG=y;uYOW}Vh%r*V~#u$fu2|1KPacQ8u60)QvQ*7zh$}Ct|W|$b+Kv+ z3%vA9|1q-@?ccoU-uojGahliSFHRyCIEh0`#y`e&N%f$cHabZ&&r&iv99?7pANW z#rsvb{#N_+Z_f|@^W57DF@k?9F>v@(Xz)!-f+6c+9q9)SwGzlj3fP-*Au7O*zh_iqw!&)`7M@X+Yd_M>%qlA{8) z&(Ze*UCkEx+c(v@zdy%QzY%ayJk(^=D2Dq6dMe}5&j0AS)1%k<-MtFyA3dl2LjLdm z@80;C7aV~iFpMSBxJ#4fehv~oVGU^YG zQCvgzqkjAQcajdj|7NZF{W&@hDzNpZIrDda4idjVM=$$d{qvvscemwlz5JV=|Eu5d zzwrNWX@K3oN9VC9Ha}2x2?`GK{P#NgW&c}O`D^2UG_MZ*x$d+-^UgoB-&DEZ{`xQb z{i}}uCrH@sca+~X|Jcu{4)FR9#HH^4hu{0h`ET=6^&h((ouAn4cobKQ{BL_5ZO5zd z`)`Fg|Gnm&QN91O&ws=Nl+15^NdEEf-#kG5>%D*fOrifnzh~!x(fNS&$9_iDGU|8B zM+N`MPxkYT7nJ_qzpMZJ-KX+fK8mYe`tRGZ+xveK)_=L5|05n?=f{5*54bA+y`KNe zDdJy%|5F-Z=Yi3AcNyFK`hPke_(%48_s?~^=l!zw%Wcj?66@=;tT{@C|uJ9c{?#rr?y^B?g5dmQl3=CS&v|C-1C zr`XJYbf4@z!1~ijQ1!Q6jQ%D#)E8SVZvXcFOQSzu7$H|P^3Q1P@6XYA*X+;Vqy9QN zKmKktlHVEsxBWtuKMh9TleztmJ&yJ>+MbIV`dj-cV<<`z!gZrx{FBfBXrCtP&u>P# z^jr4#nI5r=+jO+Og$Ri<#>|c`QmmWn z<$1n=*ypahUpG`nZe~uESFURzH>X^eNm<`T4$d+U-8SI`*{hNLNHwX9+%^*aTlJ>7crWK$nP}Zh=qa2Nem1p`Z(8eas?RTGUc04d z-{Gnx4z{ZCCCht>&X&dsk=7O>e=ot0d0WiGGW6C}!4th>1UTr-GPW8nB=3*-NHR`w;F|*+SY$sE7Ht62?_kQu3Q}1*v^G^=x-b z3z?wF;tz=JBBjn=6}qn*$eqM|HSgXsvc_{``TLhGUom7toGC|8vf?tJUr9B4HbcbVW`zkgFX_*PNPHPW-ylW$MxY zM6qTQiQq2c+@*f@n$QcS%K`7OQehP~wI z?GMxT{AeLbQLCpC(-P)qvt_fgNd=kR?N<=GqL-{0^t&(J(L(eM)$~7}E@rCtM!lO+ zTtTihU$x$7*Gr=6>y$!1v=F`W>q(P&OPK9VAKm6;-y!Qe#xLK6{u3U*b58r#LSC0? zw+3*PFiPCFcPynV$T_p&@#9zal7|67B3f-NgA5o|s@Tn@Y0 zvorNXYC;!z?9spLIP~u?|KpomO&K|-E>yF!wuNjxw2H6%a2JWl-m`Da(FWqUy8M@I zZ5in`Yc`32{aZyzS?vkyBGCup0;E4RkhyUkGVN2#$rP((+W_=`dS9{YW!QgtTFOP4a^cz!7jY8%LmIZGU!ewGoj`;ObB;a^1Kyz%1PUl z14YK4T8PN>*t7YeU8HDtgZhH@22v9Kdar3p8EN%vny~@>C;c3^L=@kf4yN$Ee%wIb z-{DB-RVpX0&+P+-O?t^5)BK7%A6v-98Jn^<2^KSZng`eP=T(rQD-&}b8}t(MbLWl; z@U#+j(dFt^gGJ26aIcCBmKDUrPegXURWF$!R-7^ZZ3_|W61<@?hhc0|KX#LuBG`zKErY9XIYLSIa`C}v)G<%|5dTtQl!bbK5wdP!p6YQ5f{ErfOW^3}WF ziWuEHy@yo>?-2j|@t+3q{r>cEuYJD2ei*+j9fuM|(?LD0>h>LSU~t^jX+=Hc*@3YA z>x=3boBV}x?H={a!~OSj#A9m6BI0SxZPrVUdCL?@!oDKbd9I%a`%rd1yQ(G!_Ot6@ zmzqZ}dE)eux?9siDt`)jbRI2X_B}}zSn}`=Ns@DJnYXH!TwQsx={)TBbW)AZLfH~# zljf5BwVij!{FaCc$ATV`5&MG0?5blvXeLu*H`FuA+TmyCr`M1a)9u!K;a4?^it1H# z7f}q|@22c<`voa@pOv-lOc|;8ysA73 z{y%Rp&uvj+7jX?9+7Ox9K+Jq!RK|;xlWSVN+AClmdBRDb(_>&im$MEGfFEM|I4%~R zEh9E3ZYEB}eOFA4@~n>NB8|b{-&evuzl=XyZCYAJob;Xd6~KNjYySFT8`wouf8tfv ztqo*z&H|NGfpVfT^ICURX%8ur-x53ZbQKdbXHJ86$`K~%U091&R4a*J`TWG$+dagX z^PrJ#ZXIKwuy^VcwR+}Pfk*qI12sfu_Jsb)xjjU2ua(Bv^L5Ou&B}7Q(e;ch-Yhfr zWDW6q+%Px>`sA?L02%n*0#1Nuk}5th!+v8w7JUwBff!Gm?o_6PI#rOMVbKVzob?Mtm8 z{j*&jG+*x_=3@&(RnOKjsuwh+HapidC*Gb^GR~U&`_Qwmyxi7Zjs3!&^y$K*FixFMEip-tzG-Umr4Nor)65 ztBx{9`R!jEaBU?A8j5{>-tQsnotq!c;j3b}PpTaAFHdET<~*X_Mz@lCVbl6W9`_JG z+d;`@n<^%s*|0=Z@d%SM?M43%|5oC}b*ne3wugwtUFUVsuVNnMc^!?^ILer;d8{|x zvy~iGH3~Gq?;oG$oRh#&#e`iDzp{VPQN}`sUo<7Gl{ofHcw3EeeIMH?F#vx1+B#+Z z-LeK^ctE*Yw7-lL2*z8kdOXB=j__a{Zyg|?EtrjPip;{L)0 zrp0soc*tDQl$t1$a-8vbc(P%sODnmx>`r4!c@Np4cU+_8S{;)x$3|twta|3P9sjqW z{2IcoHK_6m`rGfQ+;8Pv$8>!2S{d(C&!}AE58LZsL-y@o^w#Ne53wA3?$8zCXAD=w z`G&DB^^BJcmG{l3hS;3b4iW~w2Ps+^_qrZ39l=WeK5Y2)RRDd!k~XW<9km^XnAH0 z@f}`8udM7LEjm}e1!dJSG2`YP`?ai|DNFt)w;;5JJkcpHD9!F6KcsXbzMZOL<{pbX z8yr-RIzE+K5jSfHXIPf)B>1oSCEKj!C3Q@A)N8|j^?F9`as3P3V>QG>RNNt?5dCM0 za{PE($7l>kFC@P8jNbl1x)H zdiefb#2WH+(ix-(r@SbzzMY6ATRgfCl??wB|Uy)<1<5x?T+-Ay7y*%fY z*UNNeAD6uc{~hLymiA7nV^XRFPDP!A|E2L)O%8jNr@e)pA)>U&?2ZELOk57ymc($(ikUn=iqV$9>mx0a=o z!SxLm{1WGxwvUHjCVc!rB70k(uXfr`E=MRn+qO21Og*x2`HYWenT%x$_ZAL(AREH< z^o4iqAVVT^Z>nugC(Aa!?+y>W$h2p^?r7=zK(@q(7+-p}kF>?_*fRzG$=T+@SoJ?- zECN@*SaRnW6LBv2p2_-F(!TAGS4~|HIZ^k?W0q1Cvwcs+(_N1bGwm;rPz?Ofp~2Kz z;Xx1K$XGA-d07>sR&OC(bvTtVldUvVg#Q`b7a|SK#|dx1>q(!f3ycrJQ!Tvg|v{OlcH*xdPwwPE4+U*}RLqxR&>5x%o+Q^NzGoRO1CE zeN02nZs4~mINmhNb^NL)@RWaLk$hXKR9b#tB zUmryKwi0n>r;otX9-^C(SkJPoVurLFmiO_%|B55>a$~MpQ95T=IJkL`?h>|j= zWXcegh$C|$GG!hzCR`U45_-<(`}ux;zx)2Jb^q40o^{{rdH#6%Bi7}*&UMZ{d%yN; z?{nUJ1263dZ9l9Zw1tAYma!cuRYFYn8OlK9(S+RW$VtdJz(N#j{|XPMZ@HEXx1+{z zUf+Tb>1Z`!1!jFGA>p7CvmM5_fqLl-2ht8C-_2TRESZL=mzqhVF+L6RKVL7z>kDC* zzkBa$2dc3wt|Cf4L_&t!f=@7h3XHN&?Z^A`sa%2UJZ%TsN;Vjl?Z`kPjFC-Bo|9mu z)juhR@#jc<<3UO6A7g|G&zv3&pkJeZ)RH25U>4QQAH?|Jc;ni4GXFkQq*KOTdSd`- zZWgRPx!(g*<|7 zWFj*6;hxL@YP-vEQ|w_6d@*&O>8Wdmo6MPgzh8`l&~>uXVd_TYICeWZxOM^c_5Hbv zi~2yX9+lkBhH>al5oddPxDiQum1aJDvw#-H#%oq=TVQ}ChQ7CZ9I~=bGnFzoB2h&y zHMYV9-2cb?+Ue~KIG^`J{ZCXrG7+7+Q-}3OurqsPggX)XeXOTXkc1uZ~M==#XjG!B(kr3_Hi zfV$33j&PMNpkemjFGr(V;6f$!#w5)IP;Y85ABky1uet2_enl^!hx3VtxUE{iix0Hd zh~way(^>Vjqyf#<7zh_UTR=%Egnhx6GeGjU$q|l>XDDyFTE`dbZ^^>G>T|7kVfN;u z4IhtmSS?9Pr+oDkt{-don^M&_8J?oz3vzf0@ryB8kc)J~a zDofl~ubPhJmX$es)F$C_&__=mtiL(Tm4mA>9VqQy1U7{Dl>(i?Cp}Qdx z4Mze#A7$~$g5IFp^tl7MNWzID_7nbld61{=5?3sIW}=k;n3nMxkXVYChH)1MJ%W~@K18%I9rizmVnrljZN`PslaGe19) zkc;M00wRpD{{1|3>%EdhEc7r2^(*V9gNkmZ#@M9-^hD^$#yxC5HfPg&@7N~7tj&Di z_sOr&c#i%Yb7nh|PD@HWR`L+p-FLP~$NHCgN_ONK_AgG{f8rdl|D%#sqJDTa1IaH1 z%>Q(mgbKNzX76$`fK*>HDp%tfs?68rD97L5;t^L$SWbWd6`|uD%Nda2KLw2YbCEc? zO!B+$1mK`_ST2f;1MLf>+3V@qaA&!B#=iXtDtwbbxq|<0Hy8CNSTq7k6^8bnQ_F;6 z!j~7vTXT_eL0?}39{+T_+5X+kiE#L7jibWESC9}oetx*99VOmAP)IkLilk_?Y|ywB96xt8B z**Khaqcb$}Z9rknf0pO4f8oxpcxOmxfx-$Rtrq5IpWN<3P+$W}-^bK!ffi6|V`}9@ zXBM2MnJha)my1&S%zAk7`XfUUAKbYU1OMcMPs{zChbI1)Bq{l>WB-nGlj)yK`<#QyaEaK3Qb#O<_;$6wELINCTl{(JoYte5UqJHD^B{Zve&L^W|5KOxpP&D$*Z-f_sg6?lTO&3u z{#zvf`te`&{6E)Cf$t2G;0mCeGHHLzo!nk_5bVg4i5akCvVw*uls*3@Bgt5y2ao3 zLr?$za{s&D`)-om|Jv#Q#B=ZG|0m@B?|V4^AC&vSzishMkD-5uQktLP-c}r{jga6ck(MS_yEdKu&|AgaFBf9)q!tb`W*y z86QQmGup_H=bNbuMyn!fnrF0#U~!mEjF!w59+K#@bdl+zj01DsLk$tA<^I*qu_6LK zzha*GqDO$SV?jw8owv{en|jg8LphY_!0p>h2`d={P(A1E_Tf-0vK=$n2p|bShOx7u$|a#-JG#>5 zEKLMGe}}C5JHFsU41av%o)J zG7tOld;--c1a}=XgLy&#b&H@IO3|Ef^9`~^r>4YT-{m4gmPU2hwy6$U%FWO=H&#JJ zDlOQy@CBLR>1f>w0+em1CmqM@W4%o7w0_bC7R=2h_qy33PgO-q+tdC?M=8UB@dOdb z;~w50Dpml=ckJiV0G4NaJJ@w;*UD*;a375^yvivac38mb)XVGz#7x4%U- z05zv_UGp<@LRF8vTiy#1;l0!@S-%ibAllyKuwoSeeshoN&LCs7O%x7JyNBmtUMjMU z<30P!Y@LfzmWb@zW=5%i7^<#GY0%X6f+rfseU9-EL2{<@`e$ud=v0|+`|9V5%rA=8 zxg9n|V%~Ww_pv_L4^^G!(kB2P17+T*ek5WsFQf`J!*yhOo_BjZi2=1d^$YWMM4<3x zlA^`(33>7+)s|5caTMGsqJ;C1o6)aahV`c5o2X(>Apv^ybq*c+ECa>i+>YE1p2#ts z*^7qU2W6N=d~DUg`$f9#&(GuvTYZ%i_Gzjp#pl}tlON$|$M@*DoH7E)9p!ngX-9y# z?}?7ZTLFkGay6R)*T+~BJkaqD_j4>h5V#zsM+D*Qw-3TTNWuD#=m(w>CSVqpomO{7 z3Egx`dV2ut&%zs7hr~(({AjFCO|=R_Nsfdhph3qF^{&uN1t^g5~TtYd}uz zV26z2Cp>FfEzmtKbIXah2f*!o^_ghAE@DK!SaB5rJ~8$#6*#(~k*5^rJx@C$*@ThF z2TSTO5mNLeR0QkKUFSu&2X^RiwvysiN;fDDos`JRu!LU@jc2FY2=Lgi(BXm`0SNlc z_oi@toN(Saujf=!U@ZMZXhk9rF5es&NLDAp%VUcy>Iqz@{#rrM+zPcVOp%_n^txpL#!q8}&x{ekqK96-Ab|ivX}u)N zu{Y6$)Yc+4F;_6nFnT&dZUq|aCH}rZ1OwUwn=*-}kQY1q>0z!Xy4Y*cEOGq?`ZG>^ z5s2ergFjb<12zbdP_C{`;S&xMFW&ST(P|=%@qL?3j_%0X%3xZAg9v2b^Y>TX<%8cu zpSH`@)=0TJac(159=_EGF8n1I-?O%1Pge*K#q6$A&KC@dxhbh5zui%Pee`brtD#7% zGpsNhL5h*)_D|b!%wYU@@#pA6l}RlW zB%8u8V_}XKIi0PmcbmX*mS5W?^w>^C{FiVi0;EoSXdCDziHMxmJJv>)u$#ksYjTJH z`*dQrE7k~*xZ1Ix%WVU@Ta89{uUjKqiSfsdUsaJM*EknHFSgT@+tPWn;$Z#w#POb9 zCzQ~7y@dLe8?1Nlx;p=a019$ZPLfLm2w!6?qzG_Et!XUocRUNq{=@?F06r|# zoQje0L>ro%lRg86=)@Pnp0>+GAc`qflk(WYJPRFU)vBVihu7}s)vCf2g-m2cDFHIJ z(`e^0{%}19^OO{0loCYEaiUoT^~aZKoFwxBK?_Yu0gS7O6IYtw_=o}VqFHwQK^Nql zS*#%AA&>Uu#L6?^{o0et!p)8SkJ5>}9VZVj2tQ%3cbL-zY3rT|vp_cJV;rw_BgQd7 z##t-fAHl#fVkY=v!58t!w~E<4cR^Xw^0OfrcN~jn9V|#NzFfGqtA#@ig_CQ(x6b!K z-(MDVT==1j;yf!|_naq!sj0p+>3MPBe(_7ToEIsb=njE9*SCl%dO z2+&Gg4Qg`^K!T>n&aID0K$gi!{kOSbC^}vCULE6@>E2M{+b>G!`#!U?4l5>56)1Q0 zNufF1O(AqFHWJ`SnfPf@jAv`I=k)VvBGIc0ou#_#?qJ)_)>@Gm0%2*N_=ZHWy-(d+ zWa4%~o*SM5KeRnj=>D;tM>{ux`hBm3N*4h_b9k){vAq3R^4Qw#0^orA+_hYF7oF3x#?Bi;c9Ge-g_TCB&4i#R}1rvyZUvaGKmD( z)IFv{_z0PX)lGDW?_F(82B#rEdj_bl~=!8^Fe!)j~nqI6I6SPWb}=# z4(giKkM0&G;`O@oWIfV`*~|r3lG`0kGA>sSEFY3v;dI>Z2{2Fkil!&T z1K@&>VaT&UD35ll*BIADYs1nE9(dn#m>D#`;yQ0x9OVxL{%C>fp25qxhuEOHfp9?u z+Xe4yhH+7BXT~3M*J8UuP-)DY-R6BOwRFjQ-R!gc!1<2%g9r&C)C@*PeIFKq-(lJ$ z+Sjb0K=dnV*HZ&z<{>jWKR^IZ3yPqa`vef3d&2SSPAEK5y>zfN!vGj#i~1JI-QmvD zTP}GC+!ih^$s1 ztddOqtiS@sZVbGWTfGho(P_P77*{LL?mFjV!vlKTGB3}butxo~X6MEa*&(`hf3tHK z=j)#yT$RJ?IwT*J$QWn`)=^V7RZ}L=bvlxZy(biAe-TBL@xFI!5bSmyilNS6`unGD zJHRz^KmO%#f7rU{w*L|4KkNa;ntYf?DY`zFJvf2+vp4zJ@P~6SpW>PJ!p<4VFg2}l zU|z>$dFR!WKiA;tn$6nmwgcLdEiLmSl?K}`+UpN7e;PX~*Aszpqh5N^AosU8(s{90 z$AeuJy?VNt)I*|x6umF#IANT>Co*v1(RUwsoSIcm&gYAG_uXW?deIr~Mb|JrZy>-3 z=bL0Ao=^Kup*l&u7cjrI>=TRdL9&l7MO{1WjM8c{cz!V$uJfDR6dK<#_$>1g zAw%fcoljShS_|6lZ-bk*143?!9 z_Ko@i4Z{|9{WAhAKH76?59SM|O`kkc6}92nvrQcyK26})dc#OLsDZp$4~Kuoe(++A zl&qnaJ%l$j9J|&i36>X|YH>{~^m#k(#Yv1CR=ea}Tf6bO`*jh5X}vct9k`;EKOY5x zVT>bzxoU`#bd1~k3K7Eht_8=p8bkI>ydqzS6Z&|^IalTJaX30tXS9m>582qB(pwW4 z#}r~3p37*U6OEx#lar=sU$6VQ0Nk%YfGtBzjTz&QV7-QEnJ@H&#tdJoyMY?_Z4rXv ztq>#ohxcsb_??rK;;j8n#*c`*eTy7B7wTfATWDL0*2 z>|7vrm(w;9+7HdY^PY(3$RcU__b2J62*605Zig^`d9xXk$ed;jJAOf$PtQk!YUg&# zI}!)j5?ZZ`RwP30#H}+08!kYmr+Dca_9uKT;zcTS9kr?cF__$OL3ZIvS$vW~Fv#C&7na#a0DY#>~) zyipW$$QrU_HFfA4ywPT!`OH1c!+F?Cvc5mU{%~XM56xBx_?#tuTy{MY%-!1$U)R41 zu9ZBsLNY{fi|5)}sdGgKV_j?wqs@RzANU6CP0=YeW*%wG$BdU3Pqd`rc<^gb)LkVz zXra@2?cNauGu1^`lE^|};9^LB2adblA`W=gM=F5SJ=KGrN6$f(XPHjw8-GOaV)=+0 zkCSrpV)F(b=e=jpeoOmAO1r(rcKSBfnOY|dsZYGVcVxvJMZH@;Qd$xQjWr3= z)pA5wOy&!z^;G~SqLjFltP^Uk$XObY_65TN*KL|t1UTq$d1fBlMWmKZ{?Q>9To+SJ z`h1cGgcpYetQIJufyrkj_83<~6Y^>ll)OPxJ?9`DvRe!>f zzG$4|Xtpk5e>wB&44#j7`;VeLoWF^FAPY1aYH+TtJ-n987#?koSuwAZAXQ1OEAKDi zeP4P|Fz4k4(N^}%!SkLdEjagJxS2aD=Vzv=!~B3QF8ah>9MAa$+I$P65l0;2>>9rh zxIvfln*7U9UFiDKH<~O+1bH5>FQ<-p!}P^>hud?#5Mgwe*d(13a_BD?{f6yR?1s>< zAZ#BQFElJK>=Few^65GwDFG#!2Lf8kZ}7 zd^yhzjtfF6KZf!7{oCn+C%bW6^zt2>%@YR*Cu)l4qLBR8;|J^bqAeHrBcaccLm?f?{LOqx`U=hM>oIA{d( zpFzJ$FTN^g5I&Z@@~O)hHm|r+A3(-Pd&FVw1CB55@M(T2w^D?7Y5U>raYMA{Mf??- z5?AOi^*PCc?bFO_aa9iUh48t&<6^zm5NP~3-61v-BHoxhf6Sl_{lp>}HoRYA0p-C$ z)~=v@T~8~=-ydlWbW1D_nIJV%lgw0X?^_YQrLkClg1L&+^?mJu^Il7MRfre7`2222 zpP&f}e&3q1Fdlxp-DclPXN`P?om~1)U4bS}o!X(XGS^b7pqLZjs1Jq9g?0ITxa~d z7Zs4F=)s`4jrj$8%fI@UEM#FlCf2YP^7LYT@<9`wL;)mPhU zh74b4_OTe6!6Rm*KZ5tmhPy|>wTS@JbAp!4i_R$dzMsZJOpYwcMxPkR_&{j=frtAs zZX}!bO*E1EymEbl3HB1_1-LLzc=Ran z_Y-Wdtos|@lYR_=3~odE7=CZq2v@zx520v(fAOXs*2CzpC7Q_24!MU?tClNUL32>% z>h&BibVKnFcfuCVx5WO`yNq$DZF2l9=Vl<-@Xattj*B8?iBkr1+n&fdSa-x5^Qdo) zPi${(Iv`1j92@gqU(ku~^O|$C0r%IJ^Wq8EU*!Cf>BM|9*j!t!R4@RhJNLEl@R$PM z-Q{_kO%rf=zEJj&od}##W)5#ZXaFZySoqUX6VO}X6eBxsg%U+avhU$>)T(3J6mtnM zJlpIa@iGXR9!h(rH{k|;yc73Urd+|6h`9vjs}-RK)BIx`(VI5?2k~zMP%W>!;Kd|G z_!;)bIvU6A@^Nm3gvSK<&euWwVy=rc9@IYe^ooStsoJ=ml09T-ZDo34yWrG)S={+J z0R14{l1UbpgPpE#-1)ookZWs4a5TdCgqM$=oyNTG;GIl$P23M*^!*Dd*EDUQqMbi~ zLwmD!-Z^?^h=B;xTeBQW!HUTK@sfz*q$Mc!r}QPzc>KY1?i)o}jMpWHiPl~WHTFeOh%nOLCUNU{hS4`uMF zblFhD{M*FwO!ucK0;DSnEjlKIAn{n0`72`bKu1sy<~-;EOHz_ntvJu-pTeBBTPqMn zC}+KOWzj{dyZdTFLKKi{Ui%5UT}0q`V1CX8^8{godyhmvB_Y|B>d-NH4|IS=;`xfb z9~|-+c06N31c7x^T5)q#MD|sI)8MWi$|JH$D>nv1vOWo|$WzRF(q&u#$8p|WH|5$^ z!;ypC&(9pUgMhd5Ag7ADA1wG*EQMkJUb|fSUZe6Ny6&(f)?nj z3OY}fQAN6Z{R?jmG<)9ZSQ_SIeYdhMbR|f@$1866oQ-y{+v(|K`7IW7&M3mx9rMdy zx*RvO@O*9vxc|<~HARZPzowjfG?CKB3?=VBA+T6&vp-pZ2v4>wo!WT88*H+Nqe=%kX*d@r5DIJKODBb>;Iy zJvEW!m9(yKS?iv55$3Ba!M$}CA7M;p#%r%VPzwEB|ME^2z1=lSV*L!Joigt70W=K$t64l1w91fcinWU&iR zd=cmKPJ1)F9wDD2VevQ)^P_W}JQv^(l8;&W3I`m3&u(w)FI+D@jGdQ;598swxQN^k z&Xbax(bB53*rN^ayj$Ha7U=MSx1%ck*dH%m5irGmXBQ(Cy&LX()+e6!VpoVClqMSw zT00q_Zs#4Q32a}77b=K_d1@&6Fyqm&^>9?-K|9u3y;JMr7-JKO_x%zN5STE3=@M}~ z%qj)}X5llmswttHh*FM#u7qcyh=tyqKcdK6WUts=4o`FXlh2c$$} zSoX4x0Pdt&dvtNW?r!?CC~CwHY==|#oA|opdxs|7vO9V((MWoo1LLZjylyP`r%aC~aM$9WvfN#eL(Y1ZR#P-SX(p>3%K2@=HXclK1N+s2UQH{E?3LJNTx0BD&zh#8H?<__UB(0F1PRB9DYZh>M>E`QW zIIcWJ>hs7P$4{X;Vdly7cODXpO7&ju+-F0vX(SbEE2z^(<$0 zJB+6pm*OU!UFQPPSrR$V4N4Q_erkM<2gf;&U!_@VHRJsJYYQaZ91gE) z^gJg#lpvk;lhZ{xb7bY|Tce5X^x75&-8}A#QBZeuUP8was4^&9^{izO>r=CZix^jz zg&&87WBxNC5M!S{Cxx!sUVRifVh*Pl2NbWyupzh7k`WAZ0n8hd`^8 zb|1EnoO-fvH;!3A)!tJEZbwbv*J!BuS=@=`tTv7GPn?Hry_2Y?`syT8RL< z%gID}<9q<98vgX|$9b*XV|jBYvHzl)JNwE$%O5mPJs(R}GJy>jd!>LWPgI}%{T!Vv zUVqK2vMJ&*)NMz8pmEq4u52(oq8@WbgdlIRuh`DtKNqs@!};|LXR@LU276E+V5~VV zYk{&ZF8xq><%Qng&Rdedit{bcy5sXi>`>w36QVsVE+D`hEO|?1YpsA=2?T~O?*GM_OdAgrON3Zq2ktoCr29{PuzD0>8Qo)m3Tg~ zT5)f+$^+5-#`BYugJ$3)Z(?keWCdCTo}L!Wdm{E5D8%A*9ZMz~9udUn+@D|S+T(s1 zo_i3Z;BI#$*6%x9g~y?K!eqZMQW9wwkJ6d5-UKS`_L;$a7Zk6c_45E;*A&`0Er<8Z zw$H2iW_~aldu4ZsvmzQ9Gz_fvAJj!pT$;9Ku>Sla$`+NUIm1DNc_qp)H<+LZ-yiRJF>wsZ3@RbQ9McWEJF^6C-dQ6wKgy0&$tumI;#&ptM>hLX!!?Nj|5h|e$Pf*11ZTw-vDb>IH{QGFl;-C=J`nu1Ei_H^!&U`P6 zJ7x{O)`xR+REgj?aN$MBS7-FAUuS)3P8-DtxVk~55qLe)jkAlu=Zxk*Y|H0xJjZl@ zL^wVO*X4KLzm5A|R8&yPPWclCvCCp(fYG0ww0VDJf zv`m`ty4r=-*z_>pXpxavCM9?vpMtffY|Q_LkGeXWo@4i})oE5q2N)L|rn2`E^f>K`_VsQ8PZjAgeVQxumKL?K9_S z{f@aJx-{nD4@e%JeQq)2fc^4=-Cr7=@%l2FjwQ0@_`v6nH&EUh-_zRD66OhSL`%#1S z<^$E?m<=3%S^uVp=2Z1Z6QAVblGd4F@A$zX&G#h8vii5S6P8bZ1!a5oSODrQiu$_# ziXG1Nu038PjRcv!6W#F`-v|3n$|hsJF?%LOc;cEb_%nGoc`^DT#XR|~y1*@w#FxAJ zTkyF9U1Ot~Rha~OEq~3MQ0{~DBEpjwMvdV)WBQYfTLj>?pX9@mC&NMZ1yTItV7d3%odr`!6i#x&7f~(SSv|WvREAZ%~=2P<_Mwf*8_s7=H5O zKDK$nQ#WQ@koS7Yt{lw6C_D8JFjwLGG70MsIsAOkg47G^Teq~}VYJhEitiTaA(^8? zAdYiq1y;d{Y!`!ayWf{%{MiXp5ZPGfKxV85 zm9!|#pt#3;&y{-`sQR(jwOXvttdDsr0t^g*!`(sNbuAK}*t)od02K&lMr*WJ6F|AU zzH$2*0h;2MXadDN(3yVq>l0JVkRcMi3gwP4-xznh1@p{`0!bVHJ@%lyf5s|%h8I>h z0&{C4^}wF0k2D1Hge0$cJpp4l5tbYW3Adf0u#d7wJ z@Pw9M0_YPpP{m@u!9m7Q)Vkjq^z;HIlKV{& z8^x0kyvy9^5yARC!uKvnKkPKU-lvR~y_RGIB5tCV7B-#nldkZ7!>~HFhyWQ(A>O5PQK}iTqji@lz&$OhEphF0n1su_22?Wq&a+#-8_^e6@*F+>3uVI zyTG5s8*l0Gd<;X3Sq$p&{Q?^Gt9Rr4K(H{szB5uDM#vq$!FwFf<`w1D;`w}Yx>)(G zUk|P4_fz<$8w2U*beC*@Q*^&fnLZBd%}+VIzzaC)Dvihh6YzlW@0t64hN zP09utoo-MZ$9VYaf$(5*buil5?-5ess|xCA2lr41+JNHW>!fLzN3HHu`k%&e6J^TL zBZ1#SL2zA7SxU+W6uKU-b&=|!_P%5Lma*Tt?og$yALNI89A!hA7=uvqFQILkcqgcs z?r*Qgd89k1&up$ zYxEa($TNZu&o5~R)M!F9s~ZyyUROzVj$9z-;YCd4%Y!nZsDsA(mT{OF`jOzTv--;m zHV!x!^kaKZkfL!A;*f>Tb~RPWXltlnp?`Jk67K&~`{Rfk-mhH$783Sw9LKGQpBM}G zMSNcLCG=@_=-ZkdiH@WRD7Pt`Zo&Ta$0OsCRYnguU}RU{bH@@sP~dBZ>t3jBeDb#t z##JSQ=6A2L{=|~>h8;iVjt&ZuNlLGUBlD_+i_bp!AkiaTha7Pp()DKKz9WJzD2j`U zcPI5WxRQ5GZshnwNXl^4p0_wYO_$avp27L~8hL6fPJ5L2lKw+cvi`{RHA<)OQ^XWB60LmYQ@!3yDVFbIt2^L4M)1iQJfP zd@Ebe5yR*3E} zp5t`CQ@k6x;q_*549~+uLh|5qJTGoG@_Rp;;*sXp2a;>W9;k@r{+m$_2aL0O$baIv za_h=Kvr>yZx+syddDGYjEw>lnx!mOgfy3XD{$SqB>TEK@g7Mk8cv^AyXFu3I^eI!l z*&Y7;IG}Nd_B4!?T)6!SpT`+{-kZCK?^TvJ8mRR3$D$7#$JNbBOktSx(oYR+=jWXp zDL+o*JijzAh3t1%koRC^db(wS_Hjx?+H^ZYoa7^WWgJ&tF;ePQ*wTdH<&;6=p0g-w z&G6RRbqy3q(f%zC>!IkLe&fHMhcaAJS5l`Fhb(mQ=5#hYD*L@m`#$g*Br1G&3&Xru zxQ*Y&WL+K{2G$ROsUbRY*vNP1J3q9GX}NQ}!q0;`?mb?EyEpW8Vq z9dssD={1RF07^M@Zp04TMaxrl=2s_WpgXzEsH9jEMQ-!Ww&8n>ubL#>Hs9d9VG2W9 zeh|Jt7<)xc@R}Y-*xgq+7|stzJl#?JZ9x5obriQ9i9j;ccG{N90Fh7JNr_WSfIpPE zXL|EoQJSM!lO6WQ4Oe2Sc4OXg(qHXaY26w0K-8Ji&`JwAQ|Qh=?6bppRheFLCw#xx zWtin+wF&xAvEzI4whpNJlz6+cxxsX3PVZsNH_6)l>C5a)_ z)4v?GAhSTe#aAEf;QajK&)SpWxIYwU`#O8>S}=;RF(Mseasrw4eLu-CPj&hdO!gMb zdl$K3zDWNqh`YU3-X7-&KlC5vJMPfHa&3vWD!ym6-RpgnBF_mic`s0&s#gmRZZ&%_jV;??qqjxMem4*IV4P1(F&{aH*EcH^8~w-D9Hst|m2OnCMmhb3 zclxq#07t@45<$!p&U=N}1d%#I;XrGMcZ3bhk}&IpvU#AZH(%2T;W*AkN$U_1=SzN_ z`E&kNzcFHca@?f&7d~&e#Q0E1!~@c`$|#Rw-jX8xtA_%|kyD}H9!5Se2FK{fE8_t^ z=&^GTcLtWP%UbUD0qoyZySC|mu6ZE|q@-2xB@8?TKJgqP34!RJZ_ZrC{?tcE%5l%S zJ&07)+%v%a#j+fVJKqw$5$S_8Zt-FK+;Qy2?^g)~IJSyS2a)j2KdUaB)6mwEdQI}r2>cK)qiw+BgcZEf9%`C{+aaepM?7m#!8ONzfparx z!36a%;pcGa5@j-`Wf!3#CD*>{+z=WG@yL;uUIOaj`n)4}T={pkTfKz)=!coryR9P) zU^9K_xOL3{ytMCkK5%{sdD4FfCEq^)wDhqb4I>v|>4ZTwr~MFg6})BXrCWm7J1KL4 znL{YZ@DQ0)wJyZ*UABw7(+u^01_$Xi2f&Km@ae*_CG_CBW|tGw0Qjy}iNrcCzzJ!A z?@4F~@;FTVLXIxszVCe@3WYLc1f=`P-sFjU}aQzIrNd9bHco6jk3UK|g zmq{|KS^@*$$`MaB#=L}x`}p;KuYQJXlMhG4!xljHQt@@)xFN`-7>nX$!Ru1y*wr1hOt{r4op)((VaRYDO8@Rq&VC@h` z)65X8o$5(`B0dcZ9du1Bu_Hhn2p)YXFbzr1k5Tj0&B4Hg`MJk$YjB@Hw=2KS&!D@n z$I_|Q+ELbLT|RBIMR?M2{>IVCK_u`x?B0#a$FK{vAFDE-qp z+&|u_>kh6ncEV!t7?<=6+B3oGb@p02GSkF$2uv2i@w37P)vh6A8dhB>q&p4lUmW9w zwMU>cj`DdH-!uqRNzvO@&cUHm>CH+-wWwZO{pOh~GstvN-9@3U4Xp&KEsr@YLW1VI zwd$ck^ev8{n`<@==cx1cGdvuD3a=lPQIyk=9dJ~uG;ECQvpW}-u&s>=X^Fzl~`HSb^ zN7?Ue@k)dyFSAm`^UR-4@}N9QD2$ET5cJ?Wyx8r-4SnOsM(A z2%Jc|II>r58s7YQ{-<+z4u*E~yZb$Vi!uz%M1LQhL6IiJ>N6SbsPwyT@I|9VU{LXU z(my_kP8$d*@w3m|ehR7){*2!fDw_6d0sQFj}L zko1KuQ}!_fbWePvd040!=0knmB4h_3K(ulf!>J`y@#%8uZM^}=&|UjUv|0eQeg!$1 z>>;qT_2;7HT!OZl)t^&xL+JRc??GanzNmiJE$`&bMsQYjdeV=-e~<3X&C`5KsI8CR zV;{o+1PgoUZ^YqxVo!4GIQWJD%_m!3#N*ViB>2D57(ywzPg}LpL(z};2N%9aG=dm! zNTuqr0U+$#bNYqw5>hDW+BB9N0Pz~5N$J=HkWo&0!*X&6n%}Ret}`sb+fe#Tr6EIT zcgV{^A4^;GQ?JhNdVdqdl!T~|YYhO^x1?kWZ10=xjr%Pw4&XeuX%8Egb9fN%N7MU5 zu-Tn;=BLyW@DA7CXlNfqqa$ZJgYLzm$h_tWt+58EnX6Dx3LJo;YqOj~7ne|mm6KOa z_h*=E-ZSWwvH;f{2HFyghv1`4r0>2nOW>$Ede*~k2;C%)p0j`Jjdo8kh=rm02O%bXy8iD>6@yj9yrlDA7HiI-}4rq3K zdG89>A(oJRzoId2EYAEo<#w+PopxeBA8xz|K9Q&LD^3m}O8r4gtE7xON@tw>ZsnGP=gx2HFbJnJlrPP*!A{A zI||*)lVs5kOW&|8sd;J3*AA(Aix6yeXWjPXxH)l9d#ddnOrr*zsM z%&kSIx4Y&vm}U?q_s&qqQXATH?BV=LZ0{t+)jS13c1ZI#3MNfynayugCoPK-ReGxKBXDpsR7({la zbiPX`uv|}+`MT$fK$hh}g&mD)klx#H$a{JY2+mCWPt$79Z<7V;AhH>>6Wx7a`&2us zxaBUyf#q!UoLbuT&mc+>*ES-kPD9C=gY4f^M}YBC_1A*4)A0Ux;BT4SIgkO8HNCjE zh;0A7lE3l{npJb5-9FTTB$iXkZkjGa#HU^5iG_oxpSL+9Onw>;#Jx4F<{kmAA;Y9y zcs>#hpW4~c92o9jG~c{fgN*IxqGB)4ATMUwWx?$>lsI2nec68z2!6Z?Ws!sEU>(by zJoY8n_;}_G^^GCKh-Pt7| z)bml7nGGT1CX-C`g$C-}eLNOwn}BZPv3n!=0B}|H?sCK9d{VY^;Gi6UnOE({gYPWB zlenU>2Kga)k^beGo5B(#dhKx&su@J(&YNG^RGd*&d_L7?LnG)ExqjY%VF3IGrAOm2 zt||vdJHCnk3>n_ME+2|8K9>g_d47Ee($G}nGAzNGj7?lBVG#G{?5};-d&r&ZfcmGk0aHZk1#JVh@g%J$|qNCy#{-H}VXD<^B2suKEd()sPp? zjOaioSDO1t1QyV@5x4sx8*})c;NWEU%P&A9=4o)By%*w~ayak&83d;>bai=Z9?2eZ zR*lIT16nbmhsJzIlF zZxqc{PR5`7$7tnO*E&pwbd3Y)AToqLF1uTp7x{1$lJw@_`# zLC15&G+l*fkV*M5@-19%#%I^}ggCuLeD2?F9rb+>-S{({`3m!$ue*MEKPwsm3Et1F z1sD%aPf~fj!}udBHR`FOSdHZ7?N6;^od5d9$L5t$2Rc8^yg`C-{ug~0mto={y8QF_ zi=%eaKxV@m^ILEP?Az2V=r2ygBV{RL-{*5+WOKp#xFSM#cSsMIat?CbD8)cie(^0&z^kT+QHo)Atd0F178viN|RpiI3L%Fb9njF2{Rr)F9H; z*EM~oXOK~C-{k*A(RIgD{eJO6Nh&QFZ7U;{jN*$^C>3R7uOgL{M97GuqJ$LL*$tV= zUdJwbk9*yV%*(w<+9|*1_wRjqJwBi3^E~Ig&pGe+IZa=h@$4pPJs}cb+{tXcJWlSV z;Tj+2j1IwdhlfQy18Bg^OP%-mKduuL-x8TI33;97v|ZcEar)HhOS&Z93C+9S5|-19 zRmZkI;U;!IXMX_qLI%NOt-Cd~m!l)VlPPi!2Zn2=EAB30uD7bS~{bkcK3f!IE+qk8ei4nCw<)F6{ zw>?aJ$@_=}F2CiYcCGA!^Dfp~7#n(lL$f0O+TTX3y~AJkme|u~Wfu>R`z)~I4>5`8 zABH9GD}vV#wqnxhZQXCSlk*e5x##23Bz!0t{$-v%0x=b>oAmd0!!YNza_(FT(MnZ` zAE7hwdQG0|j$ebYy_9V-kDS9fhQ_kj^DXF7qWo{S_B87MFtC^3$bjj#r_GBQBfv=J z^i=EW0xhAF);%0l_^F$uS1`grE9>5cffs`i)*j@No;M6pe>>K0n`%V|omKEdavEQ~ zX}F#*!GIK>Pnmu9N5CvxPQ&9z7vQH ziZDC=h1mIa`r@})ku6YoQShBL>C0;KPa|+gdHNP!jN0#5&ZWFS*{ zA>{EP(uXi1XGPM>VQ8cr*YVSB#nHJUo3H;(BiHiT_b&t)u%fybl9ES2ytc_TxxEW` z>Q$ckbWq^Rl3bs~CkFQZB}(MBLAd@YcTZ`@FgVCRjZe2C?{(spxV6kQN@ibqcyuKL zN+nHXR_?Jm;_WazZ7>ZM;%mk6ia8lcm1&$=mhU99mjOO(k`ve6M<8=)&e~j{8&ps0 z>u!HY0h^N>BBxeNVf13lN4wZT@UiaiO?Wy?`U!m;ls?{yiXPcErYENHc)Qz=GCl_U zT_t)m=iLYdhb477CwD>F#0BY>q;L7F$o)~}y$n>is8IEe*wtn3Vd*bOzi&e>t1mr8 zOf<7eKQQp26XTPgmx#r);H5}Msp_pRIP~=+_n<-#aGcam=6OazPKGf%uaF}ULUP3j#Myghx>u&JmEq{n%goiRNymQb{? zaijq?{gga3G$?rCMZl-(G!`7Tcp+k0M1jKtCENL0nK+R7X!TjsPK`g&RwBvh35K;H?SDy_0cw9u+^@#mx9!C*PDO0rH>qHagdR|?!ym6hWl??wN> z>Dv?4iHcc0(VD(2kU3a*Y0$b0e(*}x1WotA!P5^MDiRveJmv9-lOqKW&xUNsj$lF4 zz}f1%8>t}wZ~LCY944;y@ML8rbs{cbSf_rM1to`^O2hrg`LlZzAl2Ffo~a_o)HE8g z?BSVwu3HpLZd_#~7R3TZj&(L1q%U>W9W_0_N+zCEbZ1u!=|nY+zal!JELggHG5C~i z7aVUmqBHfh2ZU9yx@A`*e#}lkU#?2Qh~MLUAK$Q`{DfB9AImY2eQf1+=M)VF#%%+; zNIqdra=d@i+es1^JreA^S&nCtH#qrfj^oC)`uCj=Hsj%WfrGn=ectm(F4!@Yg2pk= zKYS;BxK&hpdS{4z-nBFowmhp7xvO~(ekS{K_}ar!MbR$UAs(x8MW7dg*A06ca5Z87 zXAaHt#Q!CR&ep~dJHF2}*1TGn3MG3!EAM{I#N&?4q3`cI@z3#Q)#m{$7+*JXM7*L4 z-1ka`9B}J_1D)#1I!+C!VVfhLM)rAg`PT$-@?N4+i#!|1J>BtAMaVs`75#-olkN*l zquc;5v&M$1NaU8Mrs@qPCG zi42rcy76}7jv)}}sLBi=&$GOcwMpPjGk$Wv;Pga!8uu{W{u5$nz_o#o(*N#_z`B8A zKL5;aP}JYW!&yRsi-xQ2U*wxY)2WB`RSJV(74cpDf;VaGQlP0qP4-2T~N&EHs-m~11}{V8v;2R@rLZKrPDGLd`kbQpp(UdG6yfwtj1wD z^YH%0d8Zc4u^;}kMt&Oq$fojDb1)#=Ga`CR#0WeY@~You)eS+qMPct7C=fP&clEL* z1`gKLHKpDg1cl05Q=bxsLHS3)(iMqT^p<#ES*13O!hYYDcN4quaFZx&+iQYX-)#yB zY3_oIm)ZxLzL0+L`&%|J$v)pVo9gE-9Rw}!CG{O-p23K}?X%T|Ex6It_xux~Y2=GI zz>&k6glPNJy?QkxU_Y5V*>$iRxc9T!{r^6Sb$Yx0?P8$zp?wC0V}ro;ExJxGY#8cv z-XDEz+KNn$RZNeQ)7a7di1X1d1}xv!)|8Vt0?BNWyZ>)L+AX-B84puHTDx`7XPkl7 zK_3=9^9CU+LO#-me6MpN>Pl6Lt;l{y==xKUXFs853`(GBOBJ-8UFt28SWo!0?PyL^Im!M&&UMPvdrR-|61r zN%*{9?C|Hj5jY^#JdzXHP3-vhb0e#%usrvz`k!A6BKIfoq!`fvJ&M_|c#m%x9!yJ7Ri&;hPEDrn#jeduSP(9u+b zrIUkjuk%CQ1OH)ou!rZ3PE8AHayW*_n@;1m_ZiE@b~9j6R4rRNVFcI(UHte-KjdXp zLyy|^R1meBc$_!OKtrzb()+gtL0;3@rHVvVH&bAV^;K+C{4v2FFtUZBnG4 zY}D-VusgXIPvxRb^|%;NQTpaYRm=!f=U41}cDx&O-u;->ucyE@@q3F)KN;9{BlXPs zhl60#KSH;?M#FzH-$n!FYk)^UXivBr3mL%EaYLJq4a>hC+j5SDnw@D+)?dm4k&n48 zgD)9q9W@)oq!pp*FxE%)9=4nwX&T&#mk3*L_T zVVz-4&LLgi)$z+D9LW51G?6v}CuDveyG!to<%upOiMv$j9MIBU*~UPPH!*@oJqF?6 z#%o#E>jqGApuEJmw;GOSDPQ7sWZ`h(N{)32bj+C67MncD!aFZ(vl3nMfV(hc*M$-W z{#zB6LcdP(4>SL629D7n+wxxY$!9cli*zX299si}muQksax5JE^C)HJDjm1lXIGh< zurMx6xABWo9*7;-^@RC^fpOa%nH^hbpw@F=Wor{1mT|IW#kI_#)XD`jHtRzC<;}k( zekKd93APD}w-?}KMfBneQin`mHRUkal?=2^wSNr$%fXdY=2Am`0;IO8&EJ@s!!Ncs z)7{(WP=DQ#SbN?AloPI=z1foq4ktF=Dyz;%OP~17A4t9b$HkL69`bQu9FaM&>T?zb z&ut5K?1+HiO|CM#XXdbfAz=P`-5fqS5GM`=#hC2>-U;KfKw_sr1f=MGf zmay0N1Z|SRd0S5>w^$Bl6}No5=M@hVnn$fd$@5Howb`o?>o@WD z+G|sA+W(5#BKdzCgs)$}O8lu&g27&`S|;Y?_lW8^cjC3%mwEsBv7lkl@lKCs7mTf4 zB{KfC2exzW`+jz@5ewFC%s8t_!8B+7y4F}0Z0%!6n>Wv4OTDZ6Tj?THeY^Gcj6^0V z{pEF;tt~`%@v`>4gpXcdEO^xONIZzX*{wG1oQ1;@XE&q^Mge26P^f@8hs*AGY#RA6 zhwI!80*-Dgztwe$I$0QC=fZs*M=o;&6{)LqWHr z*-v&Qu!v64R%?LdVLoTI=Gl_x8CJ89el5|7SENd|=8*3`6)^E8k$m?7`?bLh!^AI- zv*KQp=UKgCSy?0~Tz5{W;T+f|h@n&jw$y;OVcn zr{RCdT$`L=K~wTPv|K-p5~og-oeb}CCh>*KqI9miLl-E`Otu))d*EB~7Vu4P#LLg9 zf#T{E+_XwR-0cMmJoh?VKPjg`5sMn&^qz^qtN=sLg--k;CM)Vk?s4zJixST>U9hWd z!`6gzJ@9cw^pvn~1KPzLiaQ-d!K_8u`GG_h^f8CB-jnz%>P^5@#IY83ct3NX12~Su$*DRoUzA7Pj z)#Uq|LYr1(yS<4!bpJG7jZ0%}`7;TBG*(Ikc8q{#@wT8>#P3kLo!Bms`6r>85lZpI zFJFCEQ)sLGv zD-k-ovl^=Q7ELK1XW>k~#nSmj8n&-l_v}6Ki_y&ycLrA$zys;m?|I)bP_WX3{S6ll zE=p#GZMaDXlaPFgcsm-34>oSH5v+!fH7Fab!@^&wD=qK;pGcPGz*^z?z8a;&Vz%d98mI>fu5S44~MO2U?JC5&n`oUD9ba;B#8fFXumRu zYA#0Cx=&MA|7OBM1s7+SOfimx%$e;cJcj85*1AtH1y%?5DHQi*lX*>L^%YTxP)%gI z7a4PS@O1XA%uO^j-u6o=)v5-z9q+jK$&iJ&{S+si-q6uwENpuQ*{^l<16E-cd9dna zq(OZ$1L;ixZ^cP{DmsKG_SkVcXw*wvAM+bPDVOWnfoauHEx^sM?#sgWtGM#lHq)`C z@S?l2G7ER7a*qqv5_Ba~+>)d$P)slw69bvQg#HzvV z)M&>EJr+81KMXi&OveP7sRL^X-gpvCi2}6(ILjf}yW$lC!!$>Cp3|d&be2Qt11&m) zGR17Yg7HeStru!uk zr2yMEIRpyT|CgxN_07KVK`9u31>_?$w^&?ff*Rkds%i_k!o&vCohH9GL#5@)6v z58$i8prYlMszLr+pF&dz3xC(`+cYss$Id@$y)ga2;#vvyYHm`8fJp* zMekupqe6^HtMcw3yf+NC(YQBgp=AJWivp>zYHg z-86yypYxHQce<%CD+3bUV>{M4<>U5QF~wB`*NG&0Kakm$45H$tLwvilP@3wo>hG=u zuvUJeMUgvgV%A2C7P9IXQ z-Lq#)_lqvzlMo4Dujqk>g@(@&8ynGtF1- zZe0!r7Py{FR)_|_?`8@o2o7IuSNb)KJWuBy9hLr)BGi7p>UKv%CVW|@Fzl{Wgf&6) zNvnp5ep0|-D_td-Y}Ss1HFnu3SG#)^qbMG58$iKrEAO@_kab49UPqtSrNUvWf3X` zA$0}sbn4L_`0sWSr_cHZbo$!$g!>Q$3zFw3*(l2+xV@B#pM`&~cu-05nOeJgO9&p(j)|PU<<2rmBJdae_V(pM~8B)HhI_e;x@fG+U5 zBjjc&)dLQc=I;8?23&g2Xg&71AAiW*nA}yzg0auP>Utz-SQ5I};1^c|mG{^-TI;fK zl0B1avkD#0r{1^Rd4+}X^=F#tGr1sXHPVtw;#@gL|9SnH0l2fJTO@?|ciMNg7Yn;- zIImc0y4|W8Zp!`Bl_K%F)|O)jKHJmD96f{X<-{+ZDLurN+L{lt59`wWa~K%>v}Kza6w;q3M_9 z=5Jiy!$EDm9hn3_>1Y~nc~0^Pb;7%~gH(uruM#usIYGnya+~Ri4mEJENd5O=60gfI zT-_xmL`T@=+_}Mlg}QTn{>|6kgXJ1smp1ZVzaj!J4A2H(ch^DN6?f=Bp=}y3B+ug- z{or@p&Kjs!F>zcX&l4p7-_{&gI{pq1_$X)0!u#gylvk|EgK^QUT@v{uFXp#7N98c# zpPb;B&_6(jx_hO^ixg-W!uWgJSH2o@l%F@Ko3pS*`Grb_KOKugRn>B|$bMbCnl9&F z0D83+lt%<7*m_>g)h7J6E`#6ikL)D=OEK!IQS}`5Y+a_`|GfxL?R?q&DC-?Kc~TE* zh!Db;c9?@K(TCX-dj;kUyo7=c@BWIs&c)!^W0ChRC&S|*o~ENCb13ZkxBZej4O^?% zN@q}OV6}98Ss%eE?awSXDn6rQkS}FTJ2?lJ&r?lgJ>J86#nS^NQ4HKNnyXOv9}Tnw z=QZQQ=@>`63IgSw==NcpVE|HF3DmSV35}dbmZp&+l^jtEZ zqULBXS!YG%QRY=K8r*6-t8JG|hxv}MpP`8Zs5NeW!|zB9(2sb!@wl?^9+k@8(L+Z` zhQaGtRTjP&o$_g}dk;N%X9|4@&Mch%^-`MfJyu+^nBX6v!CzOm)waYBuF&e&yf=`K z_gMB3Cb{IJ*pi@wGvUj6&Uxx)wZsGC<~nb6Y6gl*n%1~{jfS=_kK9B^ zexqkxYUw7z<$7O~H&_ZMAWwWPqMCpLu! zh41irHRIvdv_#NW_K5Z;aol?5f|7D0$-DgF`I6LCfXmb`CG-G_IPd`oml`yNuKy}R5nmfF(=IiJTrCOh^(-I1hXpf}(- z8&UPKv3_I=?Bdx~!Gf$17JJYDng40A-z$X`v5_`!jvu8|ESuT@=q8AYBJBIg+y_E#O5 zkg_1)XU0{C-CIXj*Nqar$BiQfPA8M0>P7qCER$^fq0Csc*_;5ShaE3SlJ_#6ioUE( z@>)YuDy{xU3$P{QhqIzm7Ch+Iy0D`zA4}M~HuDqw6H!rn|KsySxKvUfqvoHD;rq&Z zneDOAGymBB5n1OKXHLn{);TO=_8$}bo`-wd?_Jwz_73; zFqPR61^(}WjnV!NPd_|vIcE3_M%g@0(a85&<4)lUZJxu~sF8sK9EI4<6ZFIAW)?VZ zSsO|5F2KKEpIq}J`MNd@ZGT~g!}$^tzi%z13dB<2iL9dhp?W6XPXAW>rKA(B9ckM*(}`c|T)$jRpTwmK&T=z+ zJ@C+6X!7Tg25jUR)HzH1prPDa-z`NfI93v8d-4nouZ*qVmT|QjYAK_io}Oi4UiS@W zi!&tt`k5zfY{5c)#(hb%u6)R~vn%Z+IGlfN?D@4PX&{;CBVA4MwET`-2i=a+@M3=0 zN=8gIFy%$_vkT^pL+ol*guut~7DlG$`J z2a==JlEjt!k7WeVzQ2R3X_`Ipfh67*&}EM!cwW;|A}(u^4$fCM$zLGfec{kEb7hMH zcCNGR7Rj$RnDRQXlXIAw?Zo}aAs*npQwf-6C5R=*^9 zztg<(_1g)5<0|bM`{6D!&zbUC@g?B_Ppd9E1-a5l|L)2!@2KU-V4O=FKFI>VwrxJw z$=~zJ#~k>hK=^-NSzOT*6ttQt%{AITM)d1!r4!#Lfsx4i<=aH+U@q#L%H?SwuYYrk zr(6YIxk90{I9X6n?>-eGF$U6Sj17WrjpH3X9)~h5Dh6|&jrU=(;7Grj4C{0aq&#rG z?H$txJIzDG50HFQW?uacl}G)cI>sANMEJ8ul$lOZ^TDWdwmJHA{|w43S?h3;`cuk^ zg7s6+2#>iSC-C->I!H>&b`E0i2Y%Oc<;{Z>)bC{HtZM8BE=i7x43lZ_J(Q(uweJBw zc`kqHENce81v`XRT6$ukH5>~fDjh!9eeXIoVOl^BrQH$ z?Cyuyw&$WHE2$Xq?BHL4^nMtuklb;UtaJCco>x_+A4GHh9$Inv0j-QIx`@Wu9sO^U{92f6hAw1m5eHL4fR|I2N zp=rkc9An-+FJ9Qrf@@lrR=*(p$*=sc zD;{4ON28Ury_r=M6y0s{D~~)+PP2SX9pRZ~$X}6Bk8H*ez1$TFS7=}(^*nq@w1Uhf zbv1TYX2I3vnp!X9$G~|ef1=xf@TIuuiYqo!(Q_5ke8_MN2K=WrO7}6~;;2%_kXsXG zsMK#CJV=A2xmTUmVTfmQzyHu$V#2w7S6kT$FZHbU;=1&&k={A$pHXb!UFD5&rs-hg#jIzma=kZuMUl znIFFVUcH{}wfpGH`}lwPR( zXq9maHeGtLhM({=^>mJhcwHm+D^Oi|XFxEHOS&*#^v+<+3gcJZ^Ar$G{$1ou@PE1z ztdPne_p4y=VByYw_*5=sxA_|dZMgolq)zlhZ?Juj2ALG3*BX>K4~uXk$zoat%F2=uq>gX(JHzhj!y`oCYf9R z^RP_+>(illdN^feWY`S;IlFk^&si!&KL72=`_q2L31#P82tU+tVSdns%-c>I zzgAcljCaJ|P|rt^_hK(yZbA6`8qj&}S1Ai7)5qE(6za%x`&?IB*$;wWpYC}{c-Eg4 z>t!S2`eApdlw~$~ujPjRsVn7N@RpTi(R9fSnqFLaWi#Q=i`pp_?j~_qs+XQk(}_Bu z-A=julkh`(_!HCFS5vXsd$(uh$A0+oNx1C8&1oPVO-?zz@*{Phl-j<48FapVJKMsa z3Plq?-v%5TgHqd=MjAH*d_PDx$*yfi?t9vXOp@2T^?+{A=3b6%+>cvs?qPwzYEvx( z!Y3bhc7Fec-1pme_DqyjP_QUua>WJm`}d9RwTjb|K<}6yiRWy_;@8=OV}wU2k?^vw z;yU7g2aGGvin3r?*`6WyLu0T^@FnByDdI24l*x~rRNSU$a^eKBCp}ABKXB3}$$a_u zw+qiVt?)T4Fw&7 zwGQ-=_wwu7-u0y3G1~IWjPM-g zLzGW)*pB1k=4;Z^`GogQcbefMc9pf7kFtX3y)1mwMoQh9@quF9hyk%bz<xRLV>EbgYD?ivOCC zUD;vjGtsB@KHzCqx>Sb0xqpq93KBfM>{X4l_82@pcFQSHYaGvlQD61%W9oOH8P>Yb4=2tGL$E$^DY? zFL7k8d4TV_Hg|-_&tOX7h2x9LRM@9}zS*7Fu|U0bF6uV5;MUtHer>J~HY%KsS!$vn zZ;ao5(};dh`f7hwmDsV+4ZpcslO7?NBUs^>G=mzh>Jq>8sgQU(MW(5R1sxV~DJ8kJ z@ZbH0d7;KW$lX@SWoAi1YYkyc^{_qkva+wP9oni-rur_d85 zLWQA3{xQE5GqB-zWy;|%HIUaL_JBXO5AFp{R1v z#MNN5Ip?P8(K>@v6Zf2To2g(ic`J-#mhj(PMoYHNRf8_8dd|A84|a=edJwjSig!D& z!gH^F5U4aUJ3;g@^Iruee3pe`spUt@abgeY4@aU5mr-H!Sqe|jn_&o-?}*koM))y7Eru6dVa`tXe|7S6(xM>iS zOEZSLM_5q%X{0QItq%O`SLwU{>I2`$fj174^X0$#Qp`QFKk>%?;*W`bak%2x$UQ|5 z6c)Phy(Nb5&R02IaWTeU~C&~HAm*V7@Jx~Y6{=t6z-}>P9bWO^&I0|lb8{iY( zLV;Erk@SAaY3Po7`rolH5vY1dy+f^h1{0sYTK6-J?DN_i;}%l{AAP30`~0*PQrK3R znG?T!?&TkY`C-D37IK-&$?S*PwQ%w>@fW&RGk5jH2V;4%G@J{cLE9KT&S6I?NVoaM zmXmti_$`fzHL6CW9c>Ol9KYEXHgs-(t!Y7YyJBl2dk*5A?(=5Stv}~DIKc1K4 z6;6f5b6PCml~%EONbWng-S)l_g6oc5i+s9kh=LX;JJ?^yj={;HJnkz)lc4-z$z3VG z8C}}7ggQ>pK<=~ai}a2XwBOG4SVMvZ=6&ZlRuetn>)LJwmisswq%8Sml_yD= z@bGP01|AO+yV0tqGfhox!ez|+-?UX}U?pv+m1~0dnU^Nf#?6AiU-&8F#Lnbha@rG5 z^fPk;F0;8rKd7(m({+VBPl1~7mxs$35a+U=GwfwED%6&WI>{0Hb0sZl%cpWYlpJq3 zPvVOTX02%R0m73%6R`2qjd2w2Zr7~bOU27;y6YOra|T7}%@mMz_{#+42C|#*mf;4A z4imCJr+R-@S|C=~{eBTF#sa~UzmgNk^IVVMIR5S`^HN-W7LBMoh+PfY;>03$EN7|8vf6tbFD;7! zSzikBf3W(I_KE@-oEZDOmE?cDRW&rOG@`(`+JBye7aM-yqwUI*gje7w8~uUsZ>dg*50ZH<` z6llS1`-q)P8Rs*?7PK7Ol)i)TnrsZ)LV5`=YRw(S$OXbjR+DeA$)R*W?+%-ZFw^` zQpaAwVerDN8)CE`Szft02uD8pm*e&j>+p@I)oHe zHhc&o@3qBxF-(>LW#?Ol!${pIfx9hX`KuOOCYGr3hCTvC;y#~KD;QW-ynZH()aRXB z2~De)%oqRN+AMy35H85FE|n1ep}@We^3HAy=yyG}g2F}xmv5eRL1dqY<&MfrF-E{& zvaqh{Ap`%se{MAVc?u&W*Ef8(>xNBhQ!aU57=)*Ch99{IA0Sw*jAP1zoM-)2XQcmM zUw_7zns=%N%Xc^Y4kz!mQllmNK?eib9R6*doSMS+*@o-6WS_gt4-Pjd4FZi8bUOFl zFbrJZ{9c8epXpoqU#oW!J!#8CPS!BE z-byI^bd~|zVjs`5lk=SYKCj2&PcvQ-k*#o9F$#y5*A+Y+VxY~Al^jx|Q|Q`i@%e^r zH+=2is>b)74)6ZEC7Vd_xG~S=Q%9IASko0cy-}nAc`ukqt+Qa_hxOwnQd_$rBJ0k> zXA5NBysemlEvX-_9zWE(ji(nxc(`@UZnHo?O=oQ!MK-`z8wB*-~EegW8F%7xu5UjqHJCI}2^S2><*1+uiyUCIzma za^ZbS@+Ip6CNKPVk3@?$i+Y#IIwt>F59vMbf+Gi?Us}#a_~64T)bovm|8j5{X;0Y$ z%U|p;^{^p2o@4Ev73AEh7hMiY?PP)V2kH7hT@C2}C(l14oQVxr5-NRSy5PFkKjBCq z@pbdw0jZHr>~3#%UHsSsHA2#x$}Y1Y`+9+Wlr-UoShIz@(FrdtSmmXQbORpG4b{%Q z&&0$vPII9{UBI>0^{SOI1)bZD{)u38;#%Imt@S-UFvZ;>+-J;!%72eIE-@(3ukS69 zSwZ-Ai{&RAryJ1bd*up4QlB$DJ#c%`sSEBmiwXY~CA>Vtt&1+CzIv^|_qBXZ56p;m z(}qZ%#U_>VLg~yHoLIk&_ur36*w|GmC)m-1zuY^s`eaC5Jmy|;reGP4cng=jTSIvJ zg1fk~EXUxl!Tn)zKY}x_?-DBZqL4hsy%V)T6j(3jvremq1rg=B>T;hNP&NGKI}5_^ zKY8G9rN1W8w?xcX^(;^@(&w#hWm_kz$VJNp68@IUjmD(p^MuzPkUH2oOM&m%U!PQv z{ejstI2haBn6Fa}- zZuczV8*88P&NB98V6x*==U<%DI6l|t%AwE=8|9{-^4%B&*1Bc?<{O4V^Hkzd>C6AO z8y4Sm`YDjCItj78&4m9+Yq-386a<5h3X86pLP^7F@y|GghUXiSS=xox7 zPk2&AO}%@-D?0JJImuJ|=c`KWAp7%OBzJb70RvnWSPAF2NFR(;hRX4eEm*5+)V_`Q zofEgW*`K5`u;=ENJF7QNBfp+#cgj*1v?b3Mb@2|uhP=%=zRAO&nB?oOe4GKcKh)%2 z9HfGx@ub(2z80eU{P*!e!w3vSahln-GO$H&=4XxAH0G^T6&|8=k-17VD`CY!a4cJU z!ZVHN(Ugvv?6xMlgxGoYUx%o0aOCg(-vrk^&fx3*IX(gwu#pU)WDq_0j;K2JX{;zL zIeS;28|?oZ%C%P~b~V+<+a+cgG|oLQ4L-zx?#FZOyVg^ISLwWWihT=;rY!BGQAglj zX_-doAL5sPEQ@%^OY~3j0dI7EcY)p6&9X@XgD@L^K7|v=)e2}`tfW&HbJ2#@| zVS7qn$|5>}=^EkT{ge@S9`mX2|EC-W@W~ z{k6Rt#M}h*$`|Rdmep#^M*QioAT`$6!wl&0Fz)a-qe9BV!Ked=2!B1L`SbC)5hx~I z17L)KZOm91mrc`TeoUvx(Z5}AG`VcgTZut%yF|PE#&;On6jG&B$v&q&cQ3n3@~&}m zu78T&x8Ri>^4o36clRl|t!q2Mz;=Tm_NiUd$fL_Iy4=1C9*dpdUVLg0{+RM?EbtqK zdtUmAlSEJO*8HN|LwV9K;#Z`R1icx%CH@KA-Y^QKnl{P{A&Oau5%MWtD8fn21$;lL`dct+-8Cwe;VYKTO{TKl?*$rXA zM5m>9nm5I3e2UZ|)O1whx#eWoICU|3d@sTO)_v6i zvd3%S@adak)-EjU-Fax@kpv9}?P8fe>sgrT7Qe*1EgzD8u2z%sApZ1RgsnYw0F~>d z=4fGbTxIV&|2~9)(hJv$3Vv4tU+<2ZGQk;K<*>E8iQrd$F{ghnq;4mX@cgf4Q8B#O zW0GnuMhCCJuKbT~!!Vv4xbS={15Q`Y>}@5y|6LsPWhQ3LD9pt()3|pO_P1X&Pya>y z>DyhlBHyO)QTXNes+YRqU$~b6ujU}QUtKZf5HWyvl1q4-c?Z#L{x6&1B?hWC?diT> zT?JX69!)Ncu#m#KZ+(^2fgkpWiQDnBaAo@2KUEt_KrXC1I_VRQ=sDdlhV7)GX|lxG zH}P~_XLee(pVWQNv{cp)t5?Gj?GpaT1WFhUZJ3qst5EbF6z-S2K zblY+DaW;r9`wDNIlA*uyp3m9$bI9rPr!*mP4*&h~$wkRRyc598dFzmkuI{%dZAqQ6 z_;_He_~y@K9!BR4*Y+sb%sdqz>XixKbBd0gd6@*VjR#_VNPRKrhPYGQn>jT4xLTCY zun;4DteEUh$wuFt(g1<_V%&eY{Ff>JXE&xulDdw7+}PSU4DM8vkWKB@s*X)^3)j!e9ym|UNb*#!#AcY0o8_M`Cd z!btG|;q97Rt^L%{1N$D9#Qm`(`G}PzZ@vn)nb8q8{PO?tL$-Q%TZ_i=+$_d7^ zKZRK7Q>pb*HwXXxr&%DJT!^A8gD*;wzG`tTo3bx&BK*3)r4fN~8L%Y8>)@822urr7 ze>9iOp<=a1WI_`KbThl`9+7@aGQ~y{BAXj=m8;i*pvO!Mt`P?pSDU)uX5xiR_|?xJSvq5UTu45(?#Ok zF_E1v|KfY#Zry_M4M!HZMQfib3z|di7f)Z@87e@!v#)R;H3w@*vy5Zpw8y!_GKsD!XaKg7uxg-sEXXuygFeH12QZlKiN?rd|5)noZSrkAkH#P zrva6$Sy#_oW|BU9sRsM+Fi&Kfa&PBNOfP|)FzrrIHM1HPZ6GrftUd->%%wBR&*J^!ee&2}a zdDh=|Cp^NE2HVEfmR%s=nmf?0Lh=vJQoYxwI!W8ss(NdJGb`2Kj;RwIe$AIFoY#Q@ z$F%r;JV+j~TfAdZyu1N#&L_&2M-v{{>9m7ctWG%5y78?K;hh!A)XjY(I!>KH%1(B| z57;%CGao_lYLn5%I4O@|__9HNMGGGT1VRl5+%>3R|7l&s8tE4NXYfJn=+p?zj?P{( zC;DmSeD%%O_Do|cr9IoHuM1p6r}ml?UF6X_LP6yOM;-i?!QMmihpWsi|NL5{z-rg` z{kjDAdY)PIPbYe`(){7Cnkfw2mytN?OZ0_@-*{R3tReY?vDO3bx<=nKKo zkgIe!vxVJSNQ&^R6jWqR-J|1wALFuqBruRAZ2C}uhv>>mZSL%fWZ`&#>5<^=G%&F< z_ViR|S+xGV?V%zgJRS1-cS ziw^7wTgjYIZjJaflV~XU&GBonCmh|-K-=}*=U;Fo_3;{nlh z?8rM>_~H=*pD#-ai7Tst9my)EbkbP(-{{4bYmPLKy4t(uAU6w*T1Jx1&*lT^ev$Ev z;2$XsEw-Wf0WAM^!*cywIx6lj=9as|K+XFaF=d3`PhGur-BdIS-?R@(4U)R-A@My* z0)&TAFCRG`AyNQAJD$H$m8HX<)3=uW+e*VA!|6{_kLXxiRPf)U00tgAdWU~%yb3nF zulx9e!a~_^3Q7hfFR2x?TjR|*(ba_T$yurtf`m=l_XIyWs7>WeU(O=@ALaCo+ms5? zZ`b{~@ax%l%ah5QakmKF=YCdp942!#_DNqECj9hto)n>egA5o+lifs(O9J!g>ZFic zb2yiCFz`|C9A4wvYwdEcko37|D=ity!XDHJHBBl;`4a;TtvsJ0yV}=^Pc;Tk49Ckl zt<3_S1CbXVc_hK^&3B_uRuKNQrLROb!G{j1;c5!L? zdG}eEdsHEbC5nX9clzX*YHF*5Ul;Nx)eEI?Ups)fBaxXJC2pAH+UC1)}1WrIvEfDWADwwx$3^g z;g6wGh9rq7gv=r{aV#^L=Xsvzd9IKQDYMKGHwg)qDLHnbNM$aeNP|LDqN2Q~`|f_O z_xfJX^Zfq#{rA3~%VnQ+_S*ZLz0cZvueJ7CYoA&==^dqc4I__v)6mCVj^P<|okfJ* z*k!GA=sofMQxy7W8I)RZr4yTcQAXEs)~hY7ph*c9l;-do?FiwuqEui?p>{S+qZ;KOcYOTp6$cGl(V!rxh&v^ zKfA6;&5vLgj=yX6#h(%J+2H2kizqHC< zE&JPWyEg5wEkxY!^EN_yrkRCUI%Q1K{+T+g!;JsqtE1(ZUngXDb}ZwXFURjx6MSY> z!kMas@69-?S*+_|6#-GH6D}L5(!K<2%Th`rPYbe8+q+ z?cLrn%s4ah*%wzrorzQ$ZLObU@-MlatG^QLJ?WaqzKI8T=K}kuC4zj8CHTZNvDrb-_*pyD@CF_c+;E;IA9{4Go>=#;Q4KVeoWeNUeG2;ok5Guvr^ zFn|2EPm`Rfm{1dL=Y5)e>mK&rjWQvLSWb6x-mPUK+U0SYLwo4ZBF^|wYAg8s4UE#r z_C|;6GCp3sYql&? z7<;O~iPonNu1n%3B24q{oRdSufQPN)GGN^Scx zCJ}aht;6B#yG7iyMK*1cQ2#yM?UfuU&mdJnl@5Mx8s+M@Bj7t*psPU%*=+FWmrDn#I*;_by&0qck)p} z4d7yv+P$ZC8NY8AurHN<3P05IW2h%)8ds*#KQmWEgb^qoc;I;D9`ub8t)IC#u$WprZ0<5;cY&D^&KbN04U42R%8hF zmVK*@*{|U)X1G(`oNQ*n?A>kTJ1FcYK$W&G-@6X(&S8gOuC2VRHkDp4;JwQr$#orw@qOk#`jNTY7)!x z;X4U+!nZIY7C-y+XTqFs`0?tFE6aG+T~?;qk`{a_F@xLn`!zh&)mFc|xfw6zn%W^u z9Q$^w{6_77KpA%9{AWQ2@&>FVnB+lSSAjk1QmTqhS;pO}zPgQGTgFv?wPGcjEjaqJ zr?7Ck9^b%dIrRD4a3-TT_i1S&%)iL)`0yh{KX23umATeqLN^3$W@9g7o2!0>Mxo2N zO!ApbVd8tGw#+)6Cbi%?-eaC0hp*!U>1?fQUah$BVDyeux)rRw>sfROe-Xw?7fc8UJ8n-q4i&UQL9NDY#G+VmVK!Tdexdxf9zd>=*lPu@G)t0*cR) zF=9I<^w3kMhV==oEAQH)ugi;=V&-9_l-h@TG1#SW5c5x_^cn0OVfHRAj`PxpPT*XO zFPRmIaA^-?1fMdejA8aA4ZT@Gi`cx5%SlSYoL`yewTymX3tsj;+FM}Pb=>3mwW>$% zEx6otP0X!*E7(ZxEpzsiQtVf`{+wcaJ+`&2#QU~IIo8phY2Hw|jQ3RE6Lulk)#1vf z7QeI>{0nWqkV;WK{%FWAy8BBD{xH#DXB%;BR}G-6ibx`hC$=%WK%z=uo~-moH;l_U)P1vk13|B)K#6 zggIkGk8P7FA?CU=*A;)h(T5Ky%Z+=VUcief?tVJvOt^R3-P!kc*92Y}{b8Ru(a&3o zSE%Ak#xS2as*dyXl5AV&TqXXG@V=XR4V zw`?9i_sCaGJMk`7o!6!u)3b=*%FmXn7MLR3Ed6{cJ}uzUg1{hprSxjSQ zSN+Yr2{BGxsCXulsAmVSf#U8GA{@`Kif-}AyVx#Lp0gyuhL4u%J73|N!k)Y7Jz-y6 zz`G3#&-8TM!hCoQlI@)cHz3t(oyLTCTI0t>K0%15+Vm#ECkXNMjg8l#=`;7Rm;6bw zd!`rhs}@UjPX{M48qR@fhc63wsg&G3HvJ|{-8P0 z%+Km&lzI_P%Xq&yuQXoVjMsiteE4my0Y7d?cly!o7JQq(jKWo(73_}Z@zW~&h1l8& z>)w%yYZztVT{_`Um$5TCkyCpJH^hd`#*hk5fR!2{{PdO{(#p2nt?T6rGrM?C3nUmJ zIpdNmc0vWPFCdg8Dy$8*msXsquKB|JeiH%QMHeoQPb<3YI|&W(jG=nwr;&l-SZZRl zDmtwjjqiT%10K>9&&Cv#k$mu)#J7-akZwOS%*o>j?&381=dSxgVV%Z=_MijY42ctX zQfUR_0Sk|HDo#RK?=dC!Wo2|^&tuHK&=n^AO)M7`G|;?)bN|M-To^$-tX4rburu7K zT_nU6=$(RQS$!;Ehx%=P$1!{4s}cV(RMrMmY`)0P4+KI^!sOAAT4zK*sUtC677Rc4 z?)kB~I~#JIw1q8edIQH4r~9{`&Zzgtw$s_Zp75ik{iVCR9V&6}-u`+?7p5}ZDVTHp z;Mv3_y^1|f=y~=HX`%iAVDt8#KW&`}q_Koo8kYW$FD20;ujPc|CHbCyA^E|j$+-6w zg+b`F$R#o+cOP_gf1>X|wig^uqCDc=&Vyp@Tc$0RyslYT#sTX@S6qMGt z)I0q+P#Rb8JCOsSuzgGV%FW1Fv?pFE#)?4`bv>GlT)&)2#EAwbZIRpmlEENvFF-37?M|~!~1;e>XTDe^w(WvEyqdYH@I?M#BM|bwf zBL_~I(ajh`@LoE!xHNqn**I+(DhFo6z>MibSvea>{WdN|7i0zLAqYZ0u@4yNIUx14yqN;=e7IK;YmZ``V5DiU zCQCvPjHm7+*@Zg;skhiGmOKtFv#pR%GdV-qprxK&pc;DIGcSF--3`9A-G8nYp@Gu! ze8Zh(@__S&Z9)&F6HNRFxq9`I8w6ed_^R!@6HHeeDjysQ0*Qr^`K4 zW!l+@?LF=W8M!@K+e8eI5m&mJ%2*E6PjflkH1>d1wi^c`{M=xHF)Cd(!~=FwhmNVy zML3{9mksi`m#o0A5(ol)k3NhR zMx)SaM*X0V{;*3rt7s~t9n!8h8r-<-3-m9cY>Q^W^$$ZbD< zMDI9clm)Yzta(EGuu85tV-Q*@nkVO?wS+7Y9oM}rf$+A$noFO@2D$F_9{h_f7&f08 z`z~G0g7*({3PQaDp_;CkG55F)vRvru&!Gy0Z(DJO8B^|PN||R`x7!Z|0{tG#)Bvd6 z=I0zPX@j;Yot35)2?TI64JEZCgVc{P*)`EXaA;?oNXxQD9%oGl0y+YKp8LF10_|DE zvDakmmO=n%q;9N|Qa#Y9e6eS~y)TUR7jdXKdLZ=+tBZwOnb1X#n?&sLhYqdhHcnB# zknxF2QX;|+#2g8a^MY{nf+u{FZPOFg+BBtN3PHe8S>9%Niw$|0-LA2q4hEx}@8V=v zQ{g$s8G*B|Cb0sRWPu)V|ysX9%f(Z6%Nf@fK%y32~%D^P-0=k|<)Qy_D3euWE@*A|pB9;Q2DgX{a<0L|xE~*xJb2p~eih0%-Cy^C!`y?V zC6DAmbfW5Ek+D4DNWIYi{;C5aPrQDAM;#!lA%)D>{ue;~y9y2H8=|IY*-qb72Q+#= zritOF0ZL9?qCQx!j8xyf;c=-72a-+Y(>+0Nl|;oplG9&221@m1`=onl!R@FG-OlP< zSeJb&E6?H#Q^VBqA_n51XxFTOIXHu!q6%kxX9%==J`=T2^as+a^tMv}FG`OsG$w9X znL*jlv#A-4JJ1I+VXUb7A{^O#w@3K0GpLiay(~#);PgS#{t|@?3~fGf3eXOQ!Z69c z_m`s3sbX`9jBH1wG5U?fH}3%grw^pumvuxo6MJc8#nM1$duZCr8b^>S+_BT+l?RN~ z(tA*_Isx0unF9)m4roT~^;3~^J`h_a>r?ka8Yo16QIaKCLb6{#mL{1n7$qJpqMf`5 z4-J1zpVfB;V@mVhc^^wS$`m3f@WTm8S1jzW%Z7lpC*khi5{i@}u54&>%OmxosOvr@ z!LZW&iMcaH4h3ZV2z_)i7glSY(fixkL38`2Lu4V5ALNv5L2C<)BO0sE0vy5SUC7tZ z=U*!g4(BH9G86@gxbqdOjWVda<-lyW3J>IxxC3PZGvJh8Q@6@EF&|$uiL?xnMIY3t z&Bi7j!GM=BbEiLsc#P_!ZW{(eM!Q$@+<*lN|Cx6>!Po`5q&}}6xMYEvw`({Yb;t#Y z@e~;z1qV=l5?|OR>H-f;xn>!I9l^_Nv12aC6E5`C4DYHj0I|-kg%{NxAmwyodnko6 zig*0zwUyxoc3M`fFWWk5Jf~j&gS1|UipPj;rl)((D^t+Zdg*$OK@+5tJvu%VSi*UM(P-tJIq>bo5z4}FPY}$(-Hu0Uf>(cs zOv9u*{CGht9zGp_CY%_?S%u<3>4m4DFi?RaQ=0fUdp+pI!W}k+_<*5S;){4#9wcvh zUv9( z@X=V0H4H*YBV8*!wCUi%V=Dis-xM~5_}2>^B++0N$F~{|Q_#28{M9NSiu~f!-D+M0 z0@t?Pwei1fQ5>(^QJgst%r1~TT8IOWO}4J-X>4V|<(==y9_yOHk22j>OT$2z|FAnI z=CKJ>?_agbedmWB9>Dh2Y!3xxJ?UdAz9H~o(C1RHjx9<%bp5hv1Tk(x6PB0Tb7A{S zF5lkjAo#>~M#4(n4&AWx-}C%cAkaMy+x5}J6uHh9(5dYV1+q8+gyKG72Z@g2%k%NKGX{a$OlbZsDPHChZFt}#bX`#&*<{|tbb;*i8qdxUPmv@#Ns(u07Y1Y>r~DIO}paFLkXTny_is3$PmW z)>vxN8djcp^pfYAqy9vl(eusL@bzkE$9y%QP<2=9lygRiw0!mf#WzVb+De@7`dSq_ zcv@=CtVtljUY2@A-z<t2D9rE zi~=4$$m-ILscSB|V5dU2AI+D&~2pq`i816lDwU0C!dlFeC5r* ze2?hEuje|dL5JOmbzytn^gd1KXOmi`WATPqf!jUw>0yX@jN0j?h&}4CxU&0RnG?Fy zANw_Y*#YU!RaCnQW`A9>{3r07pc0>c@eSGoy7=q=)SyD!2K&63UYCiDg&Qz?A6sC72HS=K)x z!!8Ris^gik?T*Ac^>X*5sscQ^yEoHnDiZ0(e(~LB?f{&=d*)Pp04d(h*Nc;If{)wI z?+7iBLs#CMRaNrLgccGdzSy7nnZ~GZx3QbuXf`nF-_}~b>JP5z4M(K2^?`%i&f(h! zKbU=Z;o#YdP@t`9yfUp3h*Yi| z5zDX({HXu1H}{h@GOF+1b3N4sWSaRmqtcwwCk`4$=bQehD~U0JrqK<>z8ARmP|*n$ zwaBz|QF@?YxA|$|lx#2&Jj&Wj$XS-|Q(sx<%!7TnK0#-jxgV2OlHSsi6XA-Ge6Ph zg}OdQeKtwb1B&xQtLF~}pt|p#k;`vRfJi|zIaO;mP=)>Fu+Pc>R&W~Cb+rIwLHF0q zxmF#JQGe+^t;T^U2b_w=SmM!Y>yMoU>(0nfZtOzipaW8jX*)Am>ViIK>QWoo}%g#eQ77E9cRh0m_Ps;?j>efhLEWBg1na=>I<3y4%hO zMDEU3Fa5AYa?E#MMVkA;mqVZWM>wnyX{uN3-jggyI8@#?LhS|5$j^rGiu=JzZN}`K zH4kuS$QQ7Vv`21vbv&9Yp(t!Az?k!80J?iOPk5h<9<&#w%TpW*M8SHdqZ$+GAkM`7 zjAz;aHa{P?KX6zdz8REx?>=M*&6l-Zq{OXISi5l4sm?IScrJdqk;Md^d%ygaiCEWJ zZ^YSkO`0O=+4?eej{rfj{ zt@aSJnpZ*d%oV2Uzoh(RS4H<%-KWYHyb*J=&6xa2fB4pC`+!5r7hTVHy-;~K7sAUd z>1gD9!0ed;i-Vj$u$h=-+|2d?X@RXgpAA>g;pNnJ?D0V)?pMX+Z^$5auJxI@WdM@V zctb?6+Ku|3j(2NvWy8huA4Za-%we)@E-?H^02-!FQdzMxgPDrOel9M1H08wLUv=a( zTD&9u*6Xz+vi`Oxc{t4pJ!ZMZ{ba@o-PQeYXojG}B`HHIDT2RV*`3|4o9%>9^-X@8 zYo2hsC4xeiAq?4gXeczr#-WuU*nNXfAH~VE6u!50KpK?nDb34a^R^} zK_q(Z1*uAdQJNjsNP8RsPh1YZRqF=hHfHX}D8dnGp%P3VvcMj>B&LB54>Z$v zLw6QuKxdR)-r==bz--L27#idYKUKa2n!WWvf3c;Y$85gPW#!XQR7M32v&PACY6Krf zFKhE=HUJ^7;fs~HCHi1`eUI?N0A$9O-^wqa4X^R3ZAq_<5gUshOSFn5DjxQajZ-&4 zZCgid121@@#6uj_PuO)p@YN`Bo~JM3Uc25OUT_R8zJEjhc-R-o{BjWr;mL-uujD?j zWaC(WJWbk{v=X$fIbUIU(-i-o9&oW)S`0J!SDJf({TB?E-^4T+TE{ z3!UL;sfRm;jxrmh%ADU{DleW%0{x=XbrG~(3JeW%$?vMgsb_DKKpo4e{Lu{wUFGb01i4$ZY6 zE{}%3*+rVhY-hB2hvh)}ooI+Hu4<&&9f(HVyBHIdB#}~p+C0?~4?NhEpWZ$lh%&hz z*-k!@g#narelRx!T8xf=S^5zSOIlkcv-5#y|7GueHPOLfE5btEcRmJ%y%}>^VDJZ% zlKWbVN`C0*$GtAJK0%0{(wVRNvkw}*n4FimRsfgYGR6i!G(_<{;`BjXL5OiEKmQD; zA)=B^43!vl2L(;qoM2&pRDTKaNy%BFp}4U3p?V(3Yq#Bo`Ug|wyHlBUPhkoKIg(>D ziZPI?_#%b%i96EH-@eJ-5e-Ayd`&8gNhtQ(r@q_yl<>@4#XBK@pffPjuQhW=0VItZ zeUfr0F@bl$-XH_W?uO>RxfBTp%?Ek!q`IL7U$F{pl}NZ5yf`kRcN(d`<14bWNrH0e z%dg0*jF6LxbXo6bNpv^-_P)@0QzVpUgQ#_ifNCIki|e5=a(lgh@ng3*dR{4T&i}3< zDs}yKB`Yrh-uRNyFscSX^HKo0^n@Nr*oOqYnm!Emv8S95>79U{=_4Gii#aerEf6p8 zSPNyeeyQ!`ISg*a*Tl~;>7gUs4)Q~dVIXeY@bfQ1u5_mF;y2TBL!yQi8q93_L6Dd)BC+T)vkjuQ?#F5c9{eTIuBpqIUyiU(Zg;i6oDMD z<(#l#cl2ZU``L9ukFiA~{JJX91Euyd6(%pY(03cj2f(Y3k?o9dhv1NEZ8d6>~i9de*jgAGN14Y7?2Q%pvq_)l@&59KQyE zWas6L$PNvpp%bn(w(<=Zk+xJat2zdi%#C@J_PFvvATvPq3!H-6bF4Acn;D8tQ z6CS1-tcdpM_}ec>v*1FxTmxsMGYIk3t(htCfKAsav7Ld=V9+9-7%Sxj-bt;S^^vCN zII=#2PMM-pY`2_!Z~DVf$|V*fPjkc;`;|ePSij&4!_X0KJ2(=&m(2HuKO|4q?)-el z8rpd{?8Dn^5taIbCbn7=h}X9}s(;!MU2Iq`dEVm#mxOQ6dXhOK*Nm=@n|c@F*h(3v z)(aa5DJQ?MD zAi4M6DOqoKWOi<=RAbf|J*eRF)$l)o92kFXC@yJ3Ou`vv{sbMw`&H8@$K?V%9`mnb zm5_xqRC6-I2ejZ-nSj;e8yR@Y(%c4quhkP@|;ab@^%-* z7cjh+SJ4f9n$fcEpzwqhro}5P#Qp}A*s;Pxdvm~KG2yQ_OcwA_?09p}st0g8zH9zo zYytFfzPt3ET0xire+e22hmOVmo^N?3@R3&DgzlOxtTjx?i4*&Byftak5uYxC1v7(% z3kw(IG`sL;h}%N!osK<+AG1Nnfb0-8MFf=H#Av2PLtvB8<%=j-BbzDv#M38PK>lf6 zN}9DTdd)oNFKU|!4DrotFZs+ssmn;Z^u}(G80;Nk)i#C4Z|W?pL#$EBnL$OB_ z>(+ZuE_WnCk@!QP$_J)2jQXqvJW)8OLaEI0Y?zVzqKib$!CS{a;?P+i=n$ZI%vxdw zhO8FkuF3k4Y{m1cq)G_R2?+&?&pD&_BYdfKCN4u5IG(z}At7ML4@4hut*JLl)jB;_AVm zyS*-mi{4lAj&cDEi~XcuIj9SIY+u1W#Tx~DX3cGTYyfFhQKtmXJHzeadzt~(-e`)h z`pss!C(>tcGWL^oLoE8TG(SIkB8C1HA+?$v%1HCA*-lLVD4I?4dKvU68mhIM zT|A_nk<6iLEqMoX^h5xgIeN|oO@6-Vxv@m_^G0eUOP3r>tvQR>F_|O2l&NbQvGQ;* z*+$Lnp);IG-M+{?5(^^suR7I@78#H2JAUS# z1oEE~+DH9DkiT?9PxIFpApIyXj-lBLC-q+%hZv|pif6BNxTym=eBsIBppO!i$?yKP z=x>L%SNJ>FR%U?9kY@Se)2fKfcXMfwSqZ%Rwv28(RYtQ1yuZ+$d9M`n?4RwybPOcdU^oe>>E0-nB=p~&C2O{xR3Vc$uoD?82^0!h;18dJwymn!3#rlvuC z814I5Dm5Deof9YWRYQ!BU`AO-+`C{@ZvEQT_L&FT!&?CtBZE=Vt;N%)Po4*X%lz-W z9!ElYo)PQxs0Z5gZrW<$jD+<|+waTu2BYA{gXb^_Lx?FSizO8V!t*C@V((2yAPQrS z7hZWmpv{_n$TTSnZpa%vNUMwi<{RnvwZ$S)mesMCw4c#H^?52?dnydw-ow9kUNjo^ z(!9YW8H~_C{eq;axeh!Fy2Y<;r-ybVurBduXG8tuyQZ|B05no@BiG$j8-!G^3y$v$ zK#2>S8`U$$aPwE-k^54Cz|Xl_*_%c1p&8~ISj>B+LvPO*B*+G!saq#xKTc*r(Dw(I zccdDk5Lxl78GaP7A}m@P^U)A}$I_SH+z13ro=4L6TqJORGnC}H9f+DU#N-7hRS;Xs zKA+U0K=i>cLY(gjp^y6Ue&@Cq#y~Ts*}Xkj1qn44DL*kWhCp)_JmH`MT$v8qH*I2w zF8;!fpQ?926Y<8@3V*qxx3x20)1_?@OWQa@vS%95e$;d_xEKYzJ|k@V9=f8HyY$zs ze?>x;Rr62B7x8Ggr>#Xi*dNNyWKgTeYa$scd#rB550PgIsf=GxM$?qW-zqz@;V@QF z!+FvHj$NXOQTyzN7&ZJy^2La8Doa^Gxjzu8K6)GI)8hmj-S5h^qFm#C=Lz~9Ik4KM2 zKw+WHm*F5Slt44rA-m%kh)|!*5`3YDbhl~}VhQbo{+Ly-FSe9&V&jOv2Al3aL0P~q#Q$q+~4d%4Ek zZ*pe`5zez!9^;&dRHLe9bDSHluE@mv8VH3PY(8!KiYCaLHV17_vO$ZHYkbizdr;KR zgU@f8SR;zb#de0hS@6~6K-E2EfQ)?taYF3-P@-PaL2CgGVC$~SzeDWT@S2Leee=Ws zjU@Z)`yUTQQs+2oqdow%S}Z%Y9S%c^zAps3Ju=```H+xcz9)RGOes6IM+vI0yHD`R zdV)s`edA+~K-ARQQ{~BEg0|Rsn@*$zq18?~&0iMQaDye^wBT0|O84N4YgNjDu5|k0 zo>B`qm_cLl*GX$gu$Yv1H(&2$0x*ZTv}F!8o>bVCn3R* zq<_NWGrKcNzW+(3lbss6pIDyME^2{=Z`X6jHRtHL>;|Vjx4t{iJ)Oe4OYaBkO=-@m~=Q7y3JZI z#rw#?&5Qkfx^J`~zpwaYO}Y&9KA~G~7!8Cdv&T6%ZxZso>MBdMi7Mid^JK~yTva;m z-uOJ=l@hYpO)e5CmVnMpRmMX5?@C|aJ4Ahz)&+c!sYLo*Fi=loZG&nd zz}3QJ-&J7+$yfZUs=ELPKBzPBf(2+R-xNwZkPBTSIc`5RWl{CX+AQNFfQG-~Z4?g6 zpaAv94pg&&P(C#{v+QDtC`G+`K8$;y$notHFDC+m#I<8OUg?j4O=yWvAq5Wu; z_)#BkwC*$eR|X+pIQ>Pr!mD5d=eedUsdUUi0<#xQX0ip6uHpt=pChXBtX(h7b%nuU zi-a~CS!7F6lqQ5#nDfg_z)J!7NGLk`x#xn-yvtXb5Nn7?V9P*OWBzgI*63iTX4J*oqNbpNzt6BFMbpjKp11T!r`%+q;>NG7AT*sjwOZ46!!7kO%cviu#c zPz%RFov%^n-X27sbu zr^(q3JESX@dG!i)0F*hr?oxkB*z1&e3?y8RfYqONWzv$`@MA+bs%tC=CC==uT%s|6 zQHh%uM;I@Hy4x0A2CXwNPFIDmj0T~ElA(o+O((dT@txk6WQTq|%e`c9Borpd{mR#+ z3HjfhIapHH1mMuMSmo>>loe0zlfj-1C%uMKoC6GjkIy)l+}i}^eb=75l^Ft7xcu$~ z!PmY~rRa7WBkY4_U&rx$Ao%$`C9B&STv1_ldm&4Q8uDqnAP{ey16#|kSFb${f|wq2 z#-T_eKhJFAf?*I~d@d)uHvN%>JLCCp`eD$2>$z}#z5z0L7vI?!?us({OAiQX>7wxq z>4id#x!^W(DL=v{6hvc^YFfMy{bDN3qD>YY0+*@L6;)7re{EuBd8Vs1>y`JZJPok)#|8IK zxI*RLFHhOkPs2NdvbPJ{oY6t2W>b}B4`g+@6g{})gnn5XSOv;nggstinpIyl;RSc1 zVaJRI(pwiPN{P|{E!kyh^9NSIcv40>lbo>63EkmQD@5p}H4MBi1Hr%SD=?va=>l=} zJ+!z@F7PIqpL%?i7^hRXp^REEVtwdvs_VWl+-wqZmX>fvqr#2&8C754xbV(>qEZKq z?_pzL&h5WF{E#>$A2VI+(aD)@PCf!>rPK`U1D1c=c@7 z7g=&>b1=w1YmOgnaOqbnYq`UN>-E{@6*q}328cR<;^C7YmliT~pZBUrl zvqO!)vf-EO_xcKDWB58TbLzx67vi8|sh?#wfmI(K_F_+GAV2bR?bz86_|E$3Y5A5L zO5mYtymd+rB8M9vY|?q4eb_$FX89Z_otnAXJZXsd_6&6mJW>LaKHIau8jVrh1}C90 z4uw^R_GsysK49Q09Q-oQ9qs!5HQ%XL1vNEFc}V2Aq9oA-ZoA+d@c$Ka<7|!!eDB$F zI_#SY`kX6SXg90@REDoD#+Cyi&_8HC&Ysxs784Utq7j93<%37s-2LEzvRjyQH4B6# zebKD^nFCg%k6va}JHm?OVJ(hKU&s&ma`teFBY0+#*LF)wf)5ir<#q31cvow|{nFbN zZq_s%Ii(N`H`}blWz1cH7cvi0c4k5-oV)}vYIH%gm3$XM>eb_#@ZI|J&3e~&X%Jt z*nvEfqHo$j`S!VZ59xzYJ-DmgrJDtPY~CpNmdF7r?w2lh&|Gk#-o1Jw-?ijTJqp#Ae+zrYJ2 zptE!3wV7-zKpO9oewjNeW%_AOdS;2Dk1bxxqwzpHtWyJYt@2>=Ect8M^)0!go#SE17%@*vy;o}u9XmUbS zUXCAreslqjud&~fcLYJ|*C$lc5QM&E?>;$EOxP{omJAhQ$_DQ;s&X@(NKm9dD$>Lj zgoYz@N{TWffO6XN+cv#Wr1=E%4y=fV07WCQnp1&DsVjYT_Q|}`&0Lc`evU!Nbt7qa zFK-@U4>2apc7L*~m7zaEoPHm;*kI`ztlX&1Wx_acArUA@%p@`riL{3UBT*44iKIl5 zpe9LdQTz>%Xh?j2UyzZu5&2XkQ$Np;-#7M>lSsth-(`Qp29Ce~lL&mJzf-cmv8hNZ zL9UJ={y~4^vk^JJpY{8v3c6r?f+Oshh^UCTu$ZW{xUjpFo4B)+sI=Jc{NLq&<9hrl zKt_`JeVar^@z0Gbe?uhFpV$1a^nbele`@FN*8Q%ToQ(YM2T=X#7YZ_uy^Mc9>zl}* zNB*5K5ct1;zmZdQCTwX)ntx!Lzgw>A8tfe884%*>@Avop-~Gk%2mkkt03XNT5Km{0 zFjpUcXU~vG4)-8O7f)BezdM)6|KIxkcbos|1rkZ@Xz=gq{x9}B+23_D|6MCV7bN<> zugYlu>4mP{|D+~HYHGjVV(UMCe~OW+_xywRPcQv@_y14-ztRJmYGClYtrmY8tn??H z`9nW{K$3sZZ=!enuW_ROCqv!!p9}SXf6~7zBQACR!2i;D~3<`3SA?f;G^`Ufw<=6}cg_uI+P|L=JJzTW?>l=uS=YgYO0qNc=Vv;$9tpW?^(sp*2Y_ekO~Bg)5%F7x9)fnsJQVlwzi{(i2L#m4xX zr{OIVize8ltNN}v0~36%>acdZoIZBU>cI0U9esSVTbkkQer_!4eXioJZYf-U?)CO$ zAq{+nHYsVh3JpeIP+H=U1i1XnLctp{D~xGwuk+v`16=P~&#_TVmhj`EM;|JEOIr5iuv6z*o{i(9X zcnfzuJL!WF*1zDsE@)+nJC8MP#?&)mr}^Y->gf05W?4!Oru>pP`LWY~-Pmb>F=WSS zJJ}oH6cy3A7i&zg%g*i5#}cLRH7BnGg=`7zgpI?5-v_`?rXJaqe}5M~so(q5Rs5G? zn30mq!3HH9d$;;{WNKN_#!%_4!=*iV#V>_Jo8=N%UD{uDcY8Q7nbCq^&j}iA>K_;n z+S;IOyU&4-RJLz0yc5UM{(&*NJA>NJR7dbqMnQu+hxg(?I{t<+PT|I#j2kq#@OG}r zk&BdAci2g0Q|sNhW9*g8_iF<9^)R|GM-V%nVn!a5Aj^&^x_{D9xWkJVP3%-SEX#wJ zC4PyvVCTiI{(LKO>W1hOyE6Lk;W9+&u#or&%;iDVdJZ3%VaWRIShMrqu zxTe=tQ3k=|_$5w8!{i<@EH1=Y=c2X@F1v$YdGs0aJW@3SXv<&&+bxbHMr&cM2CVPT z+)?@$#sg)Rxa!wc@Y>tb$3{2}{)I8#ySCqAIRx?h3hCp9LoE0o7<)TGK4ZV3j4fVvT_DfOKWXy$OOii+e?T-GmOVY{9EYz?fr1piE(hIR05mK2bqwsnhuY z+$!i0$97+5nqPZjf^Wze8mq_}U_tV)#Hlw8aaAf${+uZWjM=cr9mQwmNBVOtG4Ab_M~S^675t_$J3SFCO7@P|GB!H0qBzwYnCIa6u2Z{lC&fI7 z;?J~dgJQMcDE2ue7_vEt;h%C+_pV#2<4qsERm*tvu%#c?m;HM6aDI~~mptyOV%edZ zzK@Ge;JP2zK8ZXK#%9Q^zs;`JLNE@d+!b9h<{i#y!4BsZ;vzg;}Z5)?;`Esi$EDi+b>W8%SOow-UxIIrt+ z=Fh~it&{%`d+!;QRnxQ!qJW5^b-k+*RJlW?)$3W-J4mI z@R`9y5&EYVAaI}ebS0B6kmrwVwz?w;kN&}U{Z3Kc3u9K?x^GD+Q_cv9bYk@chMO3i z5)dhb?S=dKgD3>xW|Q7u7*=*|aer?u59||E$qbj|;Mw||8-cNzIF998tcR?I7Ygst z>to~W;9nS~6j>L%-zp(z@5T6rHYHT{XZs6-_?Ru}#}i?AXObAeQM>hD7)j2PE4-+_9lyjgS7pII%!hQ{SzPiJvpB`!V)j%0XvdxJfB4~7*Vu---@tJkc zev%=~JGk#19cB3!#*2SA=)0AeLFKeK>nlP}*=GL61P{p5_{J)E+$Z5YEbQx-2J0NI)^hVi3{;q;`@)QKWqL2;}<@$iwP$iepMS}q3fB*KZ4Nu9h81Q)*F35X@ljh($rC99=zWi^%fn{)fa$x=YhPPvjJtEf zhr$32#6(Q%Vz)t2{_V)Kmo!l+Rx3<|N*XH1?#SA&E2381wMug;Y0Th#HC?fv7y7Ss z&I?VL;H~8d=FC5q@RaU}oJ74L>h?_J_CJz>3IAJx=k>I)UGQe3T%a^0miDP>2&tjk z>V?+o1ZfP{Jkz6O#R5+!B@)-`W# zTo(r~xcBA#(!zMx%oqwGWlSjG+-y3a3h_G+>MV#Eq7G&=2o9+tBlpPrQdwne=#_O4 z-)xP8t*!y{@%A9b5_vN6iv@N*Ws;7L(ZF5j{=AQI(E#_`We30GM$L7db!SO>1{{1_ zwn165L1MDtncz7HRBKaQk-@+o8kSFsMZTT|`zBoR`>XVx%;& zcyv@+dRPUrCb${eLX=?g`dcf@ASGlv%YP!1$`m>R2E`?3O(1W{>=Ns&36>PcFmtdO zB2!ZqWrza_E?!-e+v{nH<27_4t*zqVrgM`s(Oe$ay2hBf%Vbd@mRB}+T@O0cOLkh) zn&YIk^^M^dmT<>8YIakTA$s54H>+?)2kM&&!^Y<<(77v9HiJ$L`mTG>w3r!Vh#A+~ zh>1O#Qi(3O%o<>_Z{;`fOaai2UOM(6$q7y_msCHEHbkm(kK$(yHQhhT@D2&ika{3H3NCh^$zy}IgGwp|Fn-w7z~cFJzHJ2gVMMLeK!jg z_)roPc;Sr&vMZinSpK*R)TMij4my3SVfY6l7hT5(kv=y3bg+9RMqL3Xw*8IazVLWR z;)XD)^q;P%k=TX$B7b8zE83+{+#wE|8x}gg-w;PRlPzilMw&flN>0NhVAyFEl|N;I z6^&#S0^_*ilfgJ$ zhc2FxBz~Y*ZGk}nu76<&^_~G^YGth5{7lM+WusivVEBDF=c!H^ z2{|wP@kEa;2?Lp@El(Ti;hAfNzn*{6!^rn(I}(ia;6?rHY}$7oyz^?jw`ZOM?O*dQ zUir=gcNWs`>FyK0*Q@|0hogU07i;o-@wT1rev03?k0D@Z@?|Kx>%-xTkuAeXmVJ9y=25EM>!kfJMgpbbvMK9GLzzy!dgI8 z+vHL3QWI?y51CiI)P%{cm!&^xIuJCDFt$Dn7Lo*B1v9eR;9%;7x;@?i z`Cr7|xK7#NL7{N9J4FhxBkJ{v-Y*4=V|uxmTdaU46{?&^%uOI{->6D&r~}5uF3U{z zI6%;`a4P-##!!5nx}`Q(0V1rZGz_8@@MytfQrn;jq`B<)-MFR%H8~yYe~9(wj##NT z2|H{-Ri!vTj*xjwF}lpmwz$v9LqIT35z-67nlDdI)C@m7NLRHuL89{Ww+q~12y^#n>6x@;Rb!mz&BH)M~O9Vu$= z=a@n-cMRv2OjCF@qQO~uUKPb%^JRv+b-+ujKKPY0@%=vfQ9ZklggR7xhfJ%v29=?V!oH8g^7a#{)-=^-V_me|^-^fWC4=eC^n)>>plOkkU z>nbzsQAFd?T8~~!dw9QZaNi=UHONR$ZYyT9M%Z_6A2K-y3xnGYzQL$?VdTA@6D@q2 z@CW^8uCxg2;p~fNpVdwDz@un6GAP>^vaW@cJZPc`O!|^c1xI`9(%t0N)fDI?6??mSPtDOX4Lh*0&H8m9;+OugE5^B ztKFXgs#I@y-z_zP#p}v{W=+(fyqA-=D~qs;lfLt$N(0E|Y0*%Rl}E)Y8kG;l@?d;P zxxPEg5DM4!``xNj#PesOe79dy1m#>~`#lBfz_Fh{r17RQ47VQl8+oLRV(G7Mv?m%v zpl&jYy{`@)*_ub^dR7-|Z>^~zlMU#V+1_rHk;Q`ReXC84v;_^coRh+W|CC-Qtk zvElHNY8Vmkad;NR!Kejkba8XFq0H$0yz#>BFD&r(1#RGXyc)zDD`GxMtfO3996wpl zszQ#`lZt>iMR*wFXA!Ty6I{n-Q> zcAtqC+!rIO8Dp$4f9>dl9}K)Wp}BVVt%fc}7la)O-=qsOx5{KXG<0FpP6w7`CS@?u z4d{8kO#vP-(ODU&D#2Fq8;xP5%AgS+(&6$|0QByb`95UQM?--|@8P?|x?~HH%<7vG zT(ds^ONEYvk)h}24VLvmE2~nveM$~}66m}859z}PiUt`5H4Df9o~tR_G%=sf>r|Bx z8z86-f6CGa!4ToZZ!2Q(+-mN``a^LPndGGkKcx$^t>g$xeO+iHKcv`Zs)M~T)no|< z4RDP%t@v5Wiw9L!L&%SLVXG?3zFJ#L*j6B;GkZuKls$a+N;+ubbMKVGf(T1Eefq}7 zE5D>*$>D=u%nvE_D`37(V{8T?9#%;d*8unJKl&&>AHeMRw~o?U8xV?>-KS}#37hQO)3*Ci|E%Xv3}cv0J+El&84;PJ}LzURCpy{WWvQdRP|5@Pe=_%Y8=tsE-== zs2LJcok04Uj_yWz9;7AR zRD&oz6R&`qYS{UeYAKmp6-Yj>IrScJz!kk=k%oI57{(`Q_Ga7|ZqRONk9}th%IDLM z*1j{w-;G@SU%u;rB7Kg6#CcJWnp@o-Cn<^?z7ZqgifSOw)*^X}Zh&-PdFP$ZOT#s) zc>nzUIbGO#y(+SpSr;T+Lfp3t>*6#&zt2a*nS7Vb4s!C8wmZdH2&7;CiurJZ5`yBRVR z=S&RH$mWPfw}3IsERK%75iy2s)BCS>2pHqEuc`sxQ5B$hmQmX7s{(ASq53qNO10 z^N%eiR=S2z>GnAI_8-9b@`_*?H*<*hTGLb|WM46F2!WAy>-^b7Q4Ki6Iv026&u7xk zyY=;#@)=>OB&8x-%>-luOD?fiNyD&{_SqzqCDJNI`Zw0l?W8D`hOG?kihCuVSXwQ zfTv+mqfw8y!)Jzm``F`#*nYP4yG8OJ(ql>MbN*fwut}C$e82af8pGNxFIPqEAZ)w) zLQ$GBc0sR`8VvK@>~q#y=$tl{Is*${+KGR44XgJ-m}bc z2FbVxl4`{s5PePF8meN4_JvmJsoDoHE0c=lAe%iVCW}^Vd9_;e)jQv{Tb}{+%^6Qe zyjmssxSWcS({ln-@ru-;Ib(P(JSY%2XN*T08iw4+j=-nzyLtYrDSVs%?KC89jBN^T zVNFTeIRE8sz`iOwVEK_#*GS;acg}B!^VmR()zu?yg#2Exv?Stc4RVQ-d(^M$AWiP! zmY3*Oynv1Hz5hFJ1;{?8*((>}0mj#rcu-CXx$kR8I zy4C%O`LEuhKYY{()nz_j4b-v2Y2m6Julvm~dY|4<8XHA>P$z{85J?b z^tVves1(E(kgKg;+CTtr`q7YH5?Cwtstwa9qLL>SPiE^MQp!@ojVU5-M)S;dtJ@nA zia#zq7sR*?23~!&Wxul>?C-``Gp{INZZ2i~h_MMUkQ%b(_yFXbBL&wdC_u&~d`Y#F z0;S^$f7{o|Bg?suz9$(R{EDZ2PX{S z_0q=eYwUBRM%&rhT(-FympnTE@0!N^_3g zz5SLN@=t#7)Gt(n#9J3eYlqcvsz2aeKiWeEmC$6Pw+uApP<*Al%o>^OqA9coH%aFJe=$AO z^rum+eJujpk8uvmr3s^wcY1{FSrT&SvoHQOu>(rR#H7VzGVo`osq~o#>cHKnSG3eRbK(}I6^cc1+YU$Mjna08NqlA1`!k{}pV2=6*@fVF*_2K9ky~V3U z9xxg7NGy_6h32CArQ=$%aO_ZL{)ajl+%qB>srH!#BZCjtTo;gl?XGVfPCgX}Q)gbM zyk-?VMQfe&YtjrjcRP2)tO!8Q^AoI&4DV|i5`Vo|x@HZ>e%Sl)*=u3s;%O@Pb867P zo_CmL(gxa=a|8QpmEbIwS@S@MIv$nzRiOIL5}el(>|#dgA*F8LO^Fm8*cX|ehmX`j zaq5u=H@z;h-tch<91?(A-oKB}G|2;fd$4#xtR(nm=ABZzp^lCLWl7eo`q=01lY5Jb z4HA45MP6Ujf+^0G>C?&j*fbdvKf~z+Y46KLIi3O7``OlW-qHi}hq_G*_lSL-Jti^n zyr$?Pxkll#<_xUd`80h)#<1e2d~sRWo|w0^yks9Nk@BOSc0;ZyR`+&Pe3RA1@+-mj zSHJFtnu`((wS;6IBguw1n_waCNq|KJ7xt$>He~cNJ;W z$fenJiD8Bnt|EjZQpq*bU|hJ?sskz`jC8IBzUP}u_lD>XQ<@3 z3O2Nz>k;i#!Uggz|3gJIL>lH%rqcVfH7`wdy4^t=J^A`$3X1$m>-RGGZgDx1${b%V zs-&COjCSsPNha2>*NR&XGOO!Cu_@IcySgs6($AfxGSCI=_+EU9xc>dYL9S%t`d~)m z*aK!w;Hl(G{T{6WwtIzVqfTfbSuK3(%!&a-^&brw%8|l^;KgHvgeZQVB>_%bDC_^& zR+A=9q($3JWNsD5(^W?;wH@VPS2y#H{JmnJ{)@ZGV6PY&JR4^hKWGdNWp@()T;ajk zy$?z#vUnivwMSJ|xFtx~l`*Ki6M#Kjo1A}*3!wMg`#fcx7GT@{r?h$40&dci+j+Ja z;e#(CFnUD?E>k;gFWsw+_M`>Dh@V;@()F~bDMl;En7f$)}LdHmF2Ct2X7g?TCsXD@*k?yjk;z7(R3 zW--|!oBBi{GHOZ4&XU;QEI9mb@Y5V=MWAc<&Utfi625%RCs7HeXMRuHR*J!1J^xWX z8#ZW698XU2(7*xyXhyknns}HwO?Ey>6MWQXbBmIQeKu>#^DiXW;O>fdVv3a&XjkxL z(25ZCgd%_BpVL7rB_--(gw&XN5dD>q*%`7pC9Q{Y;!PH_ruy*wdv?-aSZt{35XW_O zu#GRfobXr=w4Pk>`ErfGqpG>JGfOpd?gvMo(Al6{K=jRTpO$JIZ}B&l6LF)?6^c_o z`xK$fRnm9sEoNwFXnW7WZVOhsvuiH?wuag|N8Zj@D`+1ub|IzMVgw%Sig;&^LfvQg zsiF}Ma^l%GJz^iLQl9$7_%_IYIC?UlkUSeqRBZ1zfz!ABZ{`#C0JltHz#_d8w2d>z zSx$%o2UAaa(TNt)gpB{Jdbk}vHh)FU>?w~ua-(MNRfkE;c?q*hI8O5T_GV8@Gzs`J zV^WPIP2gq5%8AqEGN4){IGk;;NJ^vX5Bw^%NJ<~oVm`i1!cA0S)8Box@lpHXdoNiP zf%AA!t2?VAUVJZdE@?^-=PcTYL-+ci*Zz@q;gbqhdut8!3bW(KGcV?ocW~i7$+0T- z9s%4bPX4lg!wBOS8x)=p_SAMnJ9saFT?Mz0ZEl#rW#6`&J$FoCBJ9)i;^)SIXErg& zjjq;ct4Eq8Z$5~Z#S#{M_H4sV7t~pM7ywHrvfG|NA;C_L2ZK!oBpjfx+u6V08g{*i z(zhU6!lY5Ey2U+Ko$}VGE>+e+$%zOFJ<(r z;_LoHZNhQHK9y1`)jrY>Qk(Ha{*cQ$>CFR~ByExw272g^=k{5_JOf{jnt}x6yzW%& z`N#vqTOUvozmdjQvcA5y;il+$iT>Qq4L$UF8+BLfP8&&X*>-BBNB|n%3OYWQQ-Ct+ zr(q;T3ve-R{T!|Rr-o}{LP$)N5y<8bBd@A3!u2VmfrG?;LgB&V{JlwL827V6JJ0-0 zP4V)P*zW#0Qc~dff-&6|;7>{r4;*oXtjW*w3f#1K`0OO@zJy5<15Z=fQL7eGPRRv@ zZ8Ey}#yfdaXR`ws{qW^_ATM)5paDERDe-(+P6`~qchHL)NWd-AxPp>d z;{4Idfc5(W#;DVlbyy*n3ff2Z$`u{P+V~LNqnFJVItr54mXkD($9I`i+g0Sz`8-WaI*pKNc~ZvS#FFiJnJ$AlT^6R zP5$yi2`_9~xRdTdtBCQM{4|@l+kwgQDH97xS-f)~LCNd`J*X9QvnSAQ$8UXUkJ3>M zO`DHW)_t~uuj9V=yQ(GeK3!ASyGL3u{V9~s&_M?Vet)0|P9^-8>7{Mw ziW*fheMzQ7>6S8R3ZA}ppg|2byo<)ko7EuPC3ABQof+iIm&#rTKPJ+K#t`*rM|;K6wgIScjN84JCc#F8o6_Q=-!%z2 z^0r#M(pX+K!ozo722FMdG-1{zyspXXA6{^80(x;Bq0r1_ZKyR7j~r@tfx`K$t;^=KCfvpRJm{5u0jdV zZ#7v@t`ftoDMv)4GH4;rJ!WJ+n-(dLev1?1Py>_0+jm^<)CY#)$9rW0Suxn9DkgN2 z8y#Fi=sDN9(X{5v)hT^VL{r_`8^uz%8oDiGq(~YBldBCh5~Wag2XE4XmKjXjX1K0j zw}7Y{%`c*IOklj1Zj;7{KF(D<=KDZngOM8)GAv<+c=pT2jUzh54CL(UU8AiEy%%E# z@(Pu4K(;uj*v%AjWF(dEcoBa3j}LEsb}K@~L6xt^W+}mTy4A+S%K#tyIJJDZpos>L zui8&s6-LJtrl-O7Oi+9KW~J_TMs%ueJdmrU3cNDh?wQv5P}Y}r*>d*;Del|xF1b+= zj9`|QC?aHbqBpNvmnPgetj=U^i_p9MM>D*|H#uX$qcpnf-$Jd+bJV)j1}7!Sp)QG?fVi!?mp&d1)|% z<)*`h(-tro+8yIjD;e1VUkGvTQY`Qk>zo3t{ z-12n0LiB;@!&DEymp+P(+5V=@FarwYHCcLS4xr{apPoRR6L}!ux5lglZ{&LOvV|-# zZgq1E^-md`+SRlEgjXA#rSH>J$q3*!1$nbfJ87J?97)tf4cs>Mt@rIcN7!`JlTqN! z42kQ`E!&T!TA1{9PQye+9&W0ierWW{0#~vcEP0KT@LfbCCBYgCsp#7Kzrp~2%8YhaqZ|gSSbf?B;sdl)2*bak#{3*6#R>NI3 zLg#x^g&{)T;@#IrB9Q!b*8eFd9gOWW@~`pIhcEgONn6b2;ACD2*@1l*+{ttG{YlRa zmt(jc_aBo+m4x0i6n(a+d&n>;nNtLI$LVLx(&-ZUc)n7+sgi_Eo1!kf{p<`|;^$3n zUJ^&C*wWKK?@40*uXp3+ZK5dkHG@|xR0|0z1M|YKws1ja;yWLW0^aX*x-L0Jf^PAUCx-Q7Tuiw0`o*rf95m!TTiO>(HaN@*c`w-)WT_f}v< zcPHme;%LMc;wj zVxW-i$9!2z2bl+2M$e6LW9%8#+8W!BqyTAlmd84qP&rJoRy9@%o2T09_Jo;&ZO{g9 zdM7)2X3qB+jf>%XOzCzO7ABNbs@$!+3xC%b5Ir#3w+BV$qlB!8sxUfkuts33RJv0Tb>FD66Y|RMIMKU;;xUGOz)$q;9RW8;~$Upk&>%x`tXFO}y84iDDpQVP zlO~?Hn=5ib-xU4de~|4W&M}&-1aEd%_(>8TODw*pK3|hgWqz_q%p57Ef~MK6UE%g~ zmml@T4DgsKM#QE0V@(mee2vr42a*sCTkv@%b8K(g9V}pJ1%7>z4`NAFz<>5~5B*_v zc$4@<+b>B8M1)5Vi#F=v*Smw}gOWF0mCsURJ`I6c3+0^Rf zkUIyaJbzIa883(&yC5UDkspnf)X$qM@qzbZ#umRkUOXGQla8;`44!P;>=S#%5)L%! zUJ7`o2kN`rf^_fcVqA*-^p-Wk|I{y~CcB%Wg)sm4_uGWtcrAP673_wL8|NL` zB!J_amL=D1D~vxhqQZV?jHG7mdm=EE2J&LE-(MTQT=QZ}`Q_t9#&Fz;Rx-QL7*x9G zo~$bhVylK`uCt*aWMrjI+a47JtsRjr&SYaOe|UUC`H~I#3(vRd)CfYaqN>;NyE+hG z$;HHwunQOeJhrP7v<0Q`PZ1l$KIV}PqYmo&uOwL(hD)urUrBskJ|ab*Hz9koWl_?B z8K}5HGd(Xd04a(o{D<#0;}N=uYCiHP{^*@>pFZ0J!x9Mc)4M4wHzWhW?GY$(H&uoh)^5Zz{yI;F^25P@Q=BU&k0A1e) zgHs(%SaC1##o*>Kd_cMDTAs%Y?0glnF-bW<5W+iO-=Eox?Wan3E`A)v>*e#|1Gn$`^n20|z+qBKR&`P{a(>*YC{j6!m&Wc&KB|}lPfvd9x7uA;eOz_x z=*l2WENu0rGp$Ec|C?GD9LNw@q`U8d>NM;h@~P@=DZ|q9g?pOmI z5T5Ng0TY$=xCbQb_Pdec_wo4xYO!eu(y-M2DhW0?oYVAyb^i$Q)G{F^)*LafShTk}Np@%eTXTRfDW z=0}F%K&_fX64PMvhL8GdY#A0&k%p|=i8RHjDGn?+2ZO7odf}m6$h@Z~JF#*Qf{#5d z>SU`&isLr?MNj9TxY<{e?m!pvr{6!zTQLZCSg)7Y?{C13{IRFKu4H(ds>z*2+&|Iv z(NelD(Y_F?A#m$JfirAdd)&!T`iAkmo76NYbcHsRI+fwwVCfIPw{>9T?P9iCPcpbN zzmG5?>i0{2$vS+c40lQ|`wnjDz%bb@@we9}p+uXfv?g{GWJAL;cKVZvw9LI4okRlD zU)`ym-Q;G_TnX>z@GHUDL(wBmlS9ZCEx4s8aUR&^D&$!9lcCJ={`7shX*g$lEwhcS z4CjQL*&Wn7aL)4rBNq)B?yg>X;dOl!qA2ayo%fS*_;gX?ZJ}<&FHskEe4QlxyI}Lo zOQRsN#p(PbKQi+BnLIHz>_+-2p&Ld{&ETWPyA=1U2>I<-e@Ar;p;|WmJ^svjc&XT` z>b21X8p?4L3(dv27Uy@Yr+Nq-j;srJUM13w+ZKqsEKNeZp*oAu$x*m>^y5|jP%<84 zH*S~M-;K#*V>;IsCV|$@#OaeB@qGP|_eF7JG<2Dk@{a9B%X@;Vn~1Y!_6k0ulB5Bc zSS{Q>(bI(T_3?IZi0_Nj(OEpweg>jyE_A-P#VH?plvn{n;2Mc*?Jvy!}-t*T#znONjDe(?oa(F`Kbv@(=4lV zW=4@qkS6ry(HY>Jp|;=bIso?`3TQo+YsOpM0h^EA8O1d<0T%szGr(6FkQMAV0NYC^ zua5OLVX@r7$<6OZvCDHZG(LdP?{|u<6Oz*~Vm!TJ{ih5c^0ed#Uuefg;h@$kLjNDz zytMgD=m&{5z4=UH8S3&#si>~D<141JCJS3Kya@DUj#i(Buk-D{YU|4Ib=MZQ8TJnJ z)854xN_-!TlmfaR#HS&aS4ByX$bKdxOsFdNU$G}cS`SOOjrKI`8Ms8JKk*F5>fO>EzP4lhWgeQwO=M^ee-M8l zYZQ1a4_H?nBBO_bw%xQ+H%jxlU4F+w1}7eB8``2#C{?D&b2la9so53U^UU2ic}eZP zlqDICC{)r)63;Jf)(@(DRE{ADSCYK;bs+bMz@za)WZ((I_dSGt7<-g^*XBhTP8yXh z*;;pC)VU|U%I0Jk*RL6vjiA-58kl>$k_oBm^>FSGag;6#R0|+!yj7BaF{c7g=|s zm6+_n{jFr;Je-D!@bghnxfI@+Y)?iXnjn@Xu5P@e@a{$RU;6EmPxsPn6rNCs?h`*j zM%JU|8{QYXG245V;SCcp{t1Z*eQu*5%=z6%A%ct-3O}CRnCL>mp>scfGms%~Zq2@g zc)#rF7o>h)GTPnatDWrZLdv=vGde>5q}blbUU46Q6(@lP7RzQ7V&hP!Zy&{zOS_E! zxX-}SI7`2b(g18(Z}{Ha--MA7d(ZR``b}M&`AE{d6=>7mz{MQ{sQj@auVic*XC`h^ zI$Di`ZTF}?`$P)_?F<<;=NmvivnV;vnQ3J7S)>$D7zdk?+Rf3#_=v`*onj^Q=XJuL z@WKzz&>{+Qk6Lsfr>Hz$plXF}=FA;d-}i{58a?%0O!ef(;eFzJ|2X?r*xsS~am{G}1Bso-N6pi?aQu0xyvsOb zIZEG%nQMWmir<-=i1ts6+{mQ-MBG21Gq2iU94f<-qaPCX)qn9;&`{SXi0d`(y=_9q zgs+ifiVofQjPdQ;PlW!y(v~<)^MFXNp0>5p)`E=O%SUyLc66iC*58-JKDEHKASH7f z;{f_yTu%*tKaJNig#@qeA?}~Qs{is-3*dajb0wMq{MfOoYD+x7@X(L$Cf9K=?jY}+ zYiWUu1Xia*vIFRap??%BRkNK)>qmJTB0z|DQM zTlRM2b)ExWNKJ-=>XWJ$FA(KiL2-MW$Y><|+Lgn#8y9DGhAk5BcW}Aee#2uF5*IWm z`w0Cp7^3~cpw^AYKdYvkC+c5w5($lWAB9bq%Re!ClkrEl^j0g!ZgjmA)fKpf4D+h1 zTkjD1_r&0Ux@Q0xk3ZfK!9vu(zo=mnxRVSLbEA4k3P-_7-RYSe(Lb?*S~1~T-8iLW zxK8(B64ur0HuIb#>JRw&>^nwA<)6wf{Rg^H)_HI8E5d%9*c3|7ZBFEG70I}$M%aG_ zqtTztL^;E;U+p4w@>W{;#k|d{svKA1S*|cg&=(oU*pZPzD_RCCpYgZBa`DOKp8#__X`p54= z4#fc4T`*1;nVZHa%Rp{Xi*ev*yC!JF*b0(N&n$wz^kWQj$lQn7Y1B-((z1o9zx}F* zF8i-Zm=i1t;|d-n;#R9E)2?LXi!6H;N7y%Q=vQGm*8&Qrv~1*M;``eu=o9}ujl}8p zYnhhgP%5LA=nf2E+_sm`UQbM8-LE3Dkk&X%t-T|CINJi0yA_WuN)4b7 zY_TsS>hBqU)$GbU4!vB91x;Zs;J@QSS`wk(Z|i-783_H3$gA%;XEP2hds>)pQIX;6 zE1Ce4E2D5{*joQI<|YqPj2$K3 zk4RK5MzlZg#lD&Z&jI9Ie=NdG*atglsreH?wC{HLhdZm2U^d28vny{D=#F$5>K-N| zO||WYGojx*IGn0dKTpEVYNonkC!#!{H?s0989OdqN!_GM*#FufL$5!RK!01X@;YIk zUzfT%eTpVyX}`sEvR*eDa;WZM9Blzvs;{NGBmFoTN7XO#Wg7JhHO@1ej)VN|+k@w} zw!$^HduiD_iSd0la-WMB|0<3x$J6%`?LVU*nZn)zXTPS5Kc4GHW^&lM=Rb(?KV<7| zNA%B?I2XnbcUvIL>ZV}_VP8hVDW^&ni2h%GTUe@2*f;UU3UU7yD11c0TejMd^)~Vy zYee}k!|OWr&f_4bZEkKO)dKgV3WO}m`tkj1sgi>`W^ibccGnBSeoiU8_vNZ@hWPK% zt&{2{c-pn0;1J;-@p1HMJU%xM4>T3nBlkB$Sb3Ld=*JSITfEk$zcGZ@e@8DQ5$nt8 z;hjM@`kUd5aJuqOqWo>mw~Ie2hLBOOV~!(j9tiG-}#fTRsT6t&0Ky!S(1Foa^mXItOBuV~Wj8U&`a_2O(Lu1uYBfaqC?&_cn$WX!74>=2lRGde0&wfmnaOsn~w_+}U|Z+MA`o zbg~(yw(j=2c;E@@?Q;sW8Xv+vc_Ja=$@8!^JnXW7cMH7zboz_s;}SHu!(?KyGDMs+ z?EUmLY98j!Sa(_5HpBgyDJVq1Uf%2)EFR?T)xO4;S2GzqJ@NgYT^=~i1lelrihSD zJUO6}@7;J(29!1_cN9^-R7?s$I?p4u<=SH;(( zeA;)ZNy5K6Lo$xz&FaE89mVqn!GoapN$SJ3clAU(i*>I4_8f53XqGZw=|U-~XJg#V zLm+aut5r|69-l|La}!L-E4VrO)Z2P2V|-tAjL`p=?CUl0 z1|{fu;+S+Rc?kJS3ljFl%tM?GL+1D1W)KowHxgGULEkPO)@PfC(Kc=|njAY1MlVvd zXgQi8r6RgIsImmp9n}Tb*@lto>bkOY!aT_Oy*^mR*aCd(HX#igB}h3>f7?A{2v^ST zJ!3)mHyw4{><18(3eB5ojXKD%F z%3Kg|s2RfHUx!?HQszPBk7LXunHEr-QE)jMT7s3vjPfrx4I`Jm3w!SId0=9>Gq7{0 z37|pmaFARv%JhB^{xmj(Qf3kQeamB4zgaU}9X+5yS6GZ>Ii=|neM1;9balHA zp`WjhYTFAt%|L?uINcth0VqHE^c{C(GxB^tY0W}AhF4cl)C3Uzf3}OX(=8Z)hovd6 zOe31HesMOLk?{XJ?K|f>x{oG_K zHlKF93*AF<27(CxzN(FO`wiE6%#SUuX^?J)LoA$i^9@A&g=UU!*X<#EDZ+9bz8StehDBy^#iNNM?x=0QlHOcCCeUx!q&mJa8u=D;u^knV?h7apYB zx^qB@cWOzl9$Da)E zsv1s`3IE7_jIKq7s~mURKmT^CrX34bYR~W{lYy|VVeO%Y$$5 zJ%B0jn2qDWtxULuD23j zs>+cGPi~_8){Z8l5(?($$S}84JNF6QGz4f4El9XdD#3>NY4^k5hVV1#X9GvvJW$E} z$kDQGfh~0BGQAdxQRE5zb|egWt0cIVA~XxU#d(Z)Dpv zoMG?Wm4B-YIVGy%3=enUy#3uv#V#{Ir^C@$Lc|yAG!Hd-+co3(rvUErMEq|(z3ThY zP&0Tv4^MDL=#mwx7TH@<20WjlB4Bi@pSVzR=3H5%HT`SCwotV*X-x6L?Rb(*zEcndOICi?Aso z@;!-ozsy^<%C*G&mHO%4$HF}`koa(q-aVNCpb!n?@^Ws*IaXzHDx!V=$$xc7?;j=< ze%AlWb@HG5RDZFNY^AU`97fPtdHl`u^c```1n{B@sy@wT{ocm{^}|ILT=f1(8Y z&;I_u^056?_h0q@CQl>qe?Ir0@%i7y!}jm`_1|6ppYQLjY5&jq+vM+o`0w%L{8t`2 zkN@Cd`~Um>-|^q2*ZlA3_kZ!<{r~;`@A{o%@qbmn|5x5Y`Oq+ao1=k#ho#MrhPZhL z68k@)VIdx&|F8)D_jw2Z-{gDzclPApUH_lAGdFntndtsUcKv^BXZ~xy|4ZNhzsC3Y zx3T=c`A1@9l)UzE2};z@PUUa+1;NaPfbWN6a4NUI`sNpx1O1hWe(L@CG z)y+w$^|V^-K|>UN=N3x*zuU+4P{HzTp6psO@w=xN z)3(GoWeo57leWGD=Df*ozxsz_D&NjSR$Sp2B^c0<`OymLgQLYli1%trs`hco_JhJ7 zfs>i-zR>&dG~0T96mBb>saP*vf`H5UHfF0!P-?zURZKS)Ne-o(x~le|5Z+CpGs~@ z`Q{QR?5M~itt^4f*tspPK~^|?apP9gc1L)1Cbvm`w-;0@`*pF&EW_rp`tPh3uBgXy zt}#&T2o5cYrIEAZ!S$XcLw?y3SZrI-+_|^}sgkVqkG_IE{!R6&u2a}N{*!CKEw>+>0 zre;p+=V|+Kmv#FT`^^(z|4q%rNPijl^kdEl-i`)VbN+)zOTwWlTw$^%+81Y!Ge6#R zYYEzpmoInUSc3gB!Ix6wf*@bv>rmd$1F%B;K<~oLKCqRF9C>NB3|;%rotQ^&q-)<% z7;6`Uf5P|Nx_aLZ6|)-r9uj)Ec!$MX`YG|9jh~5UQx5_6bM`#SXHKK*8vS*S?qhg# z^KeqI#xi85v1~iG?2b3y9C}t*HUQoVLYs-g5F$6y&OKJ)PJV6=sumYi?n^aH?kguGE<69BJ0V;vHo zErHr`V_}Z!C4ibF&%5;}AvW_VV;_w_R20uj|BN(3ibP5hqslUP2iA}iF9-i06kUfS zm){pAloUzUw}hgo5Rw@ukrmk^d+)vXrVpbprd*K*|Y;5_>g?&Htm-3$}oXP+8g4c?7Tr%@caWi@?C9bKh^q3Ck3pn zYk70uQy}U~=!bXt`uJ^o?uGtCrnva(%2}n~k#KjDUGoPiDnu^jt(L3%fzo15DY~2FZG3>vFWl2MTn2SB`n_Xop|0X40n54;5Zg8rwxZq4w?L?p=~p z_;ix~-q1f+@_k61?KF=)=JBj{WZtm=Im;b}&g6NV*10*i-KT&Sqb1`jY6wV3mL&5R z+9N0TzT(uE30PN^)j%QjPQxfAXx!#O{GdY98chSdb7aY$m;7Gn{nriy>lEnsif$h# z>)+7z+V?@4FRcFgo|gDA61pQe7-LI4(CBb%0q-6vWH2=5el_vOOFL#FSO?uuRM_v_ zWTPQ8JSk)B*4Z-`A%+t~qs!@=h@z;ruI{=m) z(t>?CnDL-aJ?p7cR9It_Jt8aZgUSnL^MC#Z0gr7!nAXMZu=&WT*_mQe4;1ew2HAu! z%+f}a#NF{e-RcLI+tFz7^0tWOtN={>_>}8M*2}u}*m2!4FQC@X9CGds0(}`ZO=W*W zNU>e~ev9CszVz3NT8}8u=x`(Qyg?Ey4|Yk%hQvamflg<@f17Y>kIr^!aVngcKj?Q> z#sIXWii6`HE5fVl%>2eT0nn#$hB@ai1$>+ZrPwPdPde>|aP=h9|_%h>>l{S3YU&9a2i8e}}*iD7YqmNIxadU&f z%cG1Ur^6t-5@|+k^}sBfd!O8I3Ir)99{>K10?nSqKgJIGA^#5Rw?~asfTzgtV(qUa zc=+=DUjY*5{PLkbZ*Ou=w8qD+ukDsPiKSw>gR5k3{s#~L10n*ItAL!mDB02 zE0gbq-&2m<2!KN2(Kzp-Wbmz-opLAf*;`=DE6C^zwz(>k?{>RmV$iVofOrVl{ik8o zLF)X!xO0r3Gbqp(74dh^Yisb^EubV@s0W9X-i~~H9*uSXtuE6WQGvs;%TCH522GA` zvgK#CflpaiZy(<53#ZlP@&xKAaPH%x@cBRrw1nKa>fN3Q*Q@N`S&u4{^I+lfw4yQi zVEcbeHO5pBme?Vk>Iv{7s+TKEFcuy$-}T&o%O4#tb$?78qkzi5i||bo6tJcF#*yn5 zhCw#8$?R)(AUKfR`_kM7+I13YX-`lgJRq+!P(m4_3*|3K95uz+g0|V_$YCXkNwqSe zObW!`H(BB){LXc3lY_``08DkTi8Ramp=!Yh{f&>OHDZro!&TLL zxsOjl?4_iFSFXXhxc{Kc>Jtj&m#z%`nWcac&C8GbGThOlL8SUkc>tDh-hGy76O4bj zb{QBET)m=o_w~Gy7$`QV6z*s8h2Kl;tY^(^u`}c9rtA3>pdR0^b!?FWf(+TeJqwKB zwfWFBRzVe@RDADh5Angs*?-5B_fg>+eFS}Bvn?J_*}OXZG!&`Se2$G90x-0c z=O*_iVPO)V4V%4#Ew9Jp)br0L^uI)4|Bo(8RM|8sFC#lQftp@mW<=EsB zr#B=wQr?T!nxdRxyDsY`g71Of&+R3@^P}MAWandFtZcF#=+AXW5&D=^!xORCt0lD< zt3!q9UAm9^yMwWAv|}xw$sFr$+kbVJ^T*uHRksY2DDaH8Vn%U+0*BtevmIOW!ygC8OP7ryZy#DgKI*3UwRP0^=k5kc9F$=-H4pB1~|@EB5C0k8>0l&-=dholXSA-$*sp z;8TYAT=RT1_QaB%HHTl5dRM9+cKbOP1QizJ)#f#Jc%O03l!Mp|X!e{`@p?kolN^Ut(V-D7de||4={&eq=Ce@xR3YL(}Mr& zJ6chrpOJXSESd9qJj3k=~Z3?N781?mg*6Q9iE^ zx^-##X3dMq|g(P6unXuvU7h_OUn34$Uu}8~zx(QRVUa5OUosV23 z^Bxj@@uVr5VPV^DANw*lG6zT9#FWJ6*TEB=7n?|*@>)1T@NFn$W>|mQ!R`%83?bKC zwCr%_=5H~Yd#PZ__OAJUs}*p2MX)&%+{DRGaw^pUccs~^`;KbhswMb;#uJmHKIS2w@i&qHIx?xzJ zP4D()3gmG%?&BnV&%BKJN6ssO*mhMn^7{)bOxBiQQDgQ5o#O4UQw~ufN@&}OHAOve z+qbJ+=B6*)iRkftZ0G>G^X6x=$n)f}^Ic27LxJesMu8dpVesj95idr2!}WK1?`X~i zqt?^@*XqZpaF+RrOoyEprZ!*dzr^8*(j_|##2h`~{Ak%g1X=f%D^_+#?1|pAILoeJ zat^iGo)lJChLIz@4wN+t@R;a-WhZXhq%Vyydjo+ z-`0HTryJ>awEOH+RRS@+;#ZhJuQLApji3Im=@G`>w8BSt^gyGSm7Ny_*e0Y`Wb4Af zUY2*=#n=ybP92pGyB>lUs@+YGkbc=R+A8HH8^H^z#kIS8LZPQ*MUW-b7(y?})$S(G z(?Fv-5l?uKp7B)cpI7?O#U0zW`&Bq*%?$BaPetNLTlUONLn?Hohh*-xlLpaL*+(_H zMEA$_-j*y*!F_K}f2TAM-s$9Un5dzEX`4ags+Be7Tz+$zjXe?dxP)p2se!ni<$9VH z;hmhfe8tg~lAvWK`Dksy4|-%$p4?AXXLluw@PPpDASi{GX&7Z!RW zH9rFTl3i0o?ffvO?MTKj4;6OG6IM?sDDKXAf$PbJ(>2tWj28p*yGfHmwRxD;4h2)`rZ2g14*T%@YqufUPq7H07 zdv0O1$QrLRWuM|Bde=>$M!RK(=#F*61Cg>3!1-GA!t>xbpfTiYI`rEUTO$L+>G%ns znl%dwIBFw(g+w{?Ze^@%w)7ne2m&_W+LP60n0I(0aj)0_wTYE6D_QjdTu%^`=+lX?%2%Q+cI z`Z-3&YvK#K2Jj$#*Cbt(Gg#JNkUrDt4{UA^WO50Ao&H3p%g-H&#~OG8E_P{Ryk@59 zxnwfpyvATx1L-TeY?C+IcTk{63wb_2(Gmr1>ATDn|PUs8r_8oTuLAO284vu(qA zuM-&gx3H#^kiMPwXs9UZFE)H0eJIr#0eTV(x4ORZ!}`qM$_zh^FZ;;GCcHu3|E%ku4qPXf&vR?WI!rX@OB(Hz_4Nj}XqyK?`xfXL7x6&kS|R z+`hN1&4k~-XZJo1AU;y%9vga{m-aBoFSpacFc8ws>817C!%>j?k6}H@Lp#qZ`f7DI zXgGMy`)+m+rnj|TJ+;RXn|{^#sFObT%n`m^MS^FKt zS01&j+}#IvQ6c_Ks#VniFHqXjUX09oFgMNo<5#mirrhejRYZ78g->r!J<(A`5$=Qe z#eR?%{^&sQq813UllH_V66IH@T%n|o`{83Vn^$%UrA>~kepz>frQaIaHi!LyUFpX2 zKSbAQ?WGzE5uCr)w@X1~{Ul0QRd18Dc7hWQYu9t>?XfI1n88Jc3glweG*9V0$Upqj zq}$sII6}&3zq?BT_2%_}-rpo|ULI)jA^q1e&C?%#T?@gBtU47VT;AYFeeoZil_!{V zT|MVbc=@C0{9m6}9vE1|bo{*nEfnTbF8UM)!hOm)0Ug3S?i$0YnZ(~{ifm)LDfWucdL`wbt zcbsQ`I$KcS_ux!#=e6@#mU~RB>sJ_j{?CvtNHG>#Lw{-cTa!Lc)F{>Ksu6~;x^EL| z@&tK3Y1&{rI}oWZw(KE#!|&R_6K;}^1`%cNS+hexOH?ScOIr_9VIt<)^B6Q{j@qQe zM}?FWp0a&!ykH}zQK_G?4h(!T=)A<_hd#X7qlXC(4v(swY4)eUz=hO9oGyO&Y})Xh zY@iwJD@wAw!{a*hNjmGUzo!oqj+vE`cV>QCr+0L2~nYZ_5oKHx`8X zAi4fgbo8JVmV1Oa4}1;>+vlDC_7eXnXk^PTBT}!bU8nr`4Wq%^R6>N;KOX$Dc~|P5 z`y;cBylDo}y*b~FjVs%IA=-z9`Rg4wG~f9~Lh-&mmJZ{l-_yjmk*d47x0m>=KWhI8 zdE4XT?VY>=;F}&#q_zsG~KgVH<==?8ArGHn|M9W3u6W=d#G~qfYgx-6& z^_YbkZa;IpTD)Ewf@*7aPZB%~Xdme|CVA+*5K}_OWd&cWGDQ5|$3R(&*RdlP!ttMt z$-}E6RQP;QXwN}yU-&`q`&8zpBi!mpkiRY*1i|K4y)p>@MQigI&3jOwN~Mg=ra2O8 zm($|)`@>+r8J$?8V*nKVd$60{f(j20_d04G@I=YVqve(^x@cp1DZRNN4hB7V(Pz)es-x{`iZ;!qQ zqfu+LnFGf7MQ~*y>Ae|D4YN{{ecd2sB!_j3T?MN7SjCi<@P){!#nI2?(grTK3v5D)Cr87#gR4r~WG&I}V>m-oux zc)XuJa=$C-cMu8zgZ)(+GeKc6uK)4$|9wcdDS=~7kDl_P|?;$F2lEut0Sd zn{8@ubug7;FO#541=$YkpeyDlVD!_*CGl^`ut#K{{DCxAOdIol{)N0xEi;Y(Ya8OT z9j%D{`8N&)Q&7Vr&IcZ1T$s7H8_;e^PR%Fz9L&_tNS}KUS6!m5DTiX=PM*S|%yCDY zT0SVku|V{EUE4cW(l?uD&*tj1yCZc~^VX595ZEgHho{p;55)KS`{t8;eo@A0H_%{; zCd##5XOz{Ucr(k7YF;bMGkq?OMa3nS@}%CWITv)~eo{a~HAtVe)G+$sJJX& zwJ*mQTh<1wd?LlsR5cO*j8Q=9-Px00|B!w~Gf-jpWe`ejTRrM~$pZFfM`R}?1!Gg~ zoilq0?<{4i_IY34hV;kAL@dS_pdzSbDNQ_r+{e=*l$k++*f2+hYh>Mc9i=Uvil4`` zZ_^AC#cgpQL{+b@(GiEk`o27g_5uPZF3(rqGLMwCBswUAJZw&i>`Vn5OXb4T6eis54UT7WW zvW&o4=eX86TQi{lG##o-^2e4ZbU?J`KXg5!|7J(4BhaMP9KQO(1y7r5ez{EI%eUE& zZjI=A)gRZQE#60A^c#<+yxU&L`&mPxV6!Ih)U~c|CA@Pjqt9R)(cR8>7j(?GMWBCd z_1aZQck&*6sZAvRJdW9NY-}gKi(UH5fr@iz8}w?&T!sfWoxS{1t;Z9})F(b^5dAz5 z*5ENx6$0D7(20wF3rAu{a*-b4h{Vn9Pi=$(2+JD4myTVfuX*WlKYZLnOkm z`QeDf#oe}G*z3^VMe0;Ck#>?PP!%`_%WGEdM`818!)ZgySlpB#)o$8i8 zvk$BevzY8(qk#Wbu{e3s7gm=_)Q%SQoQ`BC{d=C%-_@t2Z=$Odd8{Lw0GH28-2T&Pj~v^| zt!_sL;r;s!bGL+vf2io_M8_15`?8HVU-vm+Pq@vvc%(f9-kG33Px41@eCv0wD})D| zHcP2|i-nBL5OWi-OBkp-Raq<{PG;Khh_;;UDSu-5ONGlb{On=XKzAu=}ql-zrX z`0Ka7tCWyBeWS8Ba#MK>Scf0r(!b&Y!V04!v}FF=%bu)P3J)n@p=t8s2=R~iozXhJ z`8x4^sEeO|$sGsFtz9E&mkjaNj6=<^ zP?*B25{@O)`{YLN`a_F3gFYjvha;9Y`pG2DZIs@~>&gCj@bK9B54Bhn5u3lfW}O88 z82@z_QCl$kQ_mNy?u6(0X)Ghi@7S3IGt)mOI(o+VPI0&& z%qFnWUYoQjm$ZbrJ`>5}OVj@?+ZJs0jJWp~VKhg7Q%7tOa%?%+_pj&)C z(i5a(ieBmP+oQVa$`K)g7ke(VeXuPiI$GMGE&oe0Zub2zJN-!lUQHJ6cX=8BcOE*J z4w+D)bL($O`ZF%DGRDuTzbzRjs#l+Rrx?TT>6mQ;dE|Z6+&KS`-;vrdHjV_{18?+i@Ntt%f(I``_4Y?fKvfUpURUL0BmXLM7 zxgx7U_@d;c$g>SbzBrQiO1pae5{e`>Jj&nVfiweSpC@;czTm~>@T%>8P`B(D@6!|x ztL2=TuejW?@WK0XEz(!euT6KD68(HI_THSgND`h<+hS#S)&tLFo$%9%P=swZ9b4;3 zT^uzHUK$vPg|Bx7H7`|M!p_OK{2iOz(c*+815+vS>y}TZm5@AQFHJwtLhp(bY?9_8 zIsQ1&*mz5L$r4k2lXoWmM+NzYV^6kByTV@6nWtN&SC#Y@m*ZO{z3`QD`c?_DUjN?j zNk2sJjFSP{?ujR|-dXak+xE!@85jLw2kvap0iIYaS zyjfd{g)s(>e#$H!B0B12>w+T7tU1nZm9$^qmJCG;uXYFqhJl0F&E#$5IhND&u3s*q zz)xeFmpvjWP!KlozKY=>3YR@y-~TuOr(QZ7TPFLS40D`Io1VqN*UZUupYJxXJgww1 z%pQZQrw^FM6MoN~)H2+>M9zVzdVEzK4F=UT(CIqqiT7-xO2UK_@pPa5pHrmIJvnFp zS2@NOZ>@`RD~ZOV3+BGCb^L?WPNL)O|N5K8zau`hW}(o{$td6!v)lWCE}ZNu z^}ArVHg**ZDQ_qI)j76JXvEYTdHLyc_842C&`nL#Uze@WZeM@EE20leclN5jE+oGC zy4^RAN@vI~iD5g?st#dVOIy9ZoyK4$b)mn6FWSlkesIReqJdm6hx}O|ywCPl_w%Y8 zhUdz=jsBp3p>EEY>QxG?@8p!O6!gHKKdi?c)J;(8*nfP%^r_I48SFHqP5ipUJGCw> z=wr|@-}n(fLojMNnWbQF4-XWr&&PKV-+7yu))&HGk_{IfDtJ%AW$jHn-f3CDv1{7r zD>;&3EQD3$F!6sRnCdPs%juxn&Kn+7b~PN3|244Y?F<^LPBiArWWTfW_`^EFV=NmY zZi;0j!<`r&ljH0zxX(FDxJNn#=cR8RV&o$GUq0{nXI32`KB^(8x1P**6bbQR9}UBN zcD-65lEc~X_+xk4MOb2@2akzdtM``7nCoYLX|`M?y6)^JL!QJTrSBsb&iwf7 zg{=1V?6*ms4$x}UwpGWXRNf(-!)(#ydl$X~Yp?9VsmP6W3&}(M7nWJ0X=MM3_t}bG zZwmh0RP<0bAQppVevZ%h1VDrH?p~?^72f@xXq9hN!WG*c^5;iGF=2b(zA@q>Du$~l zjI@&TNO1{QVxN-uP`yKfUznpS{V9WD=zmmAGq6JEZda4C=I)utX7)*w$8 zP<^l%DxPM6H>tCQw7Frp_(3Wuj+dO7U-(9I|hfexTfIV>}v#qQ;2|2h@1^a>Pl;9#+4P>hKePZ0aI!)Y3g~&!(>sJK?T;m(pti2bonWF%pHFR& zCOSd=wMJJkwF7z9}^5+tHudJ#Nm(+wam`Kl1 z-jLvheAzeJ-XDtt5nnl%RdQZJWQ<_m42+rRrV^!deU7O0SY>$TGLw%8VrxoImqfU0#?F8Ac zw5X?Qt6HIkAcLWEdHFdf2i9W zw~T&Qn>%X?ITw@p5{Wr%Q0UFSH7)z#y|@A-xRvj*Jy)>2lH`BvX7hZwsht{ zdeVQ!*E9Qd$K$69=Ih(k&*7h4Pl|#U>MBAm9(N17sj*Z4|-P~E1z=@hfAl} z6c$#0(C>;#aVT)#S9sc-ZfJ-==^l_nF z&scwm=|O>QR5d$GJSInljf4gUk~zWkT46I32<+T-;ULiqDMbTrUsiqL)#$)#HLV4t z7aG(0%d23EPMWeT*>57Dz|Y&s+%4pJxGoee{v~za zw~&3s6i;H;?l<;a0_6Om@6IbUJ9V*zdmFRlQLeheu15 z-LN9$W}D1?3VgBqR%}h`YojoGURyG`XNlF!Fm^5isvg_Hhl`4MQ*cMuMI|awd~Scq zSv(E@+Kn07wG9FLFJI@p?u7>4OBQcP-__6 zd4Jf=Ay6h%fsgFR(Ww1%+jQC*l?z>d@4BS|1t+*VWqqQ-tKeg{$~xh}99I)%qJMZ! zRX3hz@q;(n+7$+$LLfIOL#Oej5*|!Y8gAV|@;R8@=73iqdQ0j`d~66p!6)CB(nf+n z;aqg_LBgj@4S%;A6Ff`3C!x}8o(wO}`>wjHn1RVJNoIqee(0sOo=u)Z6Q z*$>$hM8iB`m(Ky)r%B0RaQkp}9m&7fTe;fj{;$iNul&d;i-evGzr5W;<`}>osiw|< z8d7)fT-r_g?n74-8R{xXU-5p0a(&qsN{De1;9`&M1tC+`L}!?7SI_JraT*cWRlO)o z?gjX3)6t(o^o_A;}ryJk!F_4aS9)}(a@Y0VqQd!GBE>u=G$8(hN)AHVNZ z^daXHz82=25&X#&I}{pwClbDVivMsW-WE!wfA2|HOv23JoXH;qpZES3TCDWb1Haw* z)t}~Z6wK5jKb>q%BIge*Di#Qi(cV$)F(&=j=67_KFL%a*>v*1}g{KkNru~%u(W3&6 zNhO=~2##elK8-rkVTVd3151O=USNB5+lt@WK(MYm_53ys6_`Vn>e)yi=C?zjW+FZU zQrdQ9-04UFn{W3_`}AG$z)IJ76YbVpLgvb zdF*zjP?QddU%TzMeRqNraIw2ab2B=FH-~+os;e8kR(cTIL;Cl+j1_$vc^ACsC1h-@PPGoi~SF_u2`=2H&ZWzI7)MJ2Wh_x-k__h8Cqg zbfrSYKvz-bR}bu1SX?XI6%K7)0_TTv!k|UC;pAtsZ=p5d(j(PD@UVUIY2lmyt&KOn`f&2e22KepHo^biz~Iasmoi`D{8H`ka+E75GrJo@6aD?28n5GP zTZ;tV=}8!IP@bMu8izl1IwiN$=WtBolr>-F7hDth*OmOT6<0JuHrAST!Q_LKCI|OX zT#gpWPIH>TeZ}U*o^E--V6y*yPUj?|#-VShJ`UnuK_UmKLm;hHTUa4I0?#Ls+23=G zA%_(0^}GW!7(lUGqd0Zl^PaNV44N&jt!)4D4Ro^Pk8Rl5gJYwvt;yrL$QRZ) zpWQYI`TqOlw-}B?*~1wlm&_q>HuBoPJ#GYEE=n=J+Bb$)U(=G@NPHMM{YLYw+F|z$ z`>8CSZag+|^7Wn8YxuH_=FaTrNl?4wuOekR4mwNsWc!PUh<_7$Jv(6pq8V2doax5! zAXF>%Y0jXl?f1N166b-!pVCe=J(zd!yNt|Q7RJ;tWzcs`l6lBkAEQr?!^Yl~FFQJh z;8B^?(;wC&uzpDWo)y~|I+t6WR92k9sFYX7SKZp-+>O8$3PTU-6f$z$SIb11P75vf ziAh-R+V5rz;}FmKBHF%s2;SG+U@meS0VSzpoF<%On91~Ch>6AwDrF8tQ|`7y@x=aJ zf1h=u{`mV}ABWR%GxPN&!*=pK;k*Zd#Aot%d~W@NF(~u=(fBy#1#o;Q@~ktN0xn&b zD?+S;$fo6ib>8Xumt_Ksz*ok9G$(%=C}oR!*nbiQB{QPi)Zh-G*71 z7U9phURML`pP$9W8TaF-^;=yjZaw%Wx%#22Lo3dk9Bw{EH%q=hUKU?|F~@A*cwIY4KDXf!K3qY8nT|Fx|fSoMo-cPG{pdKQ){IYr%!{3va6bo5ctzrbw29E%+($(dT1%^I)E0evBSuVy8NwUfA1zm*97 zF@o<{t#@W!9){b`S$h26je$@pAN%<;uR!&x!`}!px9BO~;152BLA=2GxcX53G`Z&` zt?c8*4p0mbI(6*%tiZ#XG%=cNT|iBezKWYC%bn1JAjx&qG0zkY>n-8g!Hz0FVAL@YUo` zWWV_w7&jG*DU$hSxLGtVc76caJO^)2y_kmCokf9%FLXfZ)|`@0&qr{ZPpYNezY)9= zbzw7S;V>joJe{l`kAaBKcx2j{BH%8I7icGQz}$xWHv2CP;^X`CX0MW`$-VT4zV`IB z1Alq${ifIv+!d5@n@eyMN7AVazGS_u5(K2TP-mddxcZIF`&xJ?{3A!kq94z>+I^A^ z?!m|*A)oWnmEO!4obi^#a6*Wwiy$wiRh`GEAGpebzc!ek4);;?Eh_yoE<;gslqyT-9u3(49k3KOOJS z-EH`YVe*KF^%vB7?(J|cts5NLzWaCXC3BrBrzOg@C-9oXpf%f{2k`c~`aOpJNxYwb z)rntu9O~65!`y2#uu<*rQhsJF1iS1hsgok{aqeB#*6hLF@I31z-B$eEyxX>qWfqU^ zT;OI6ZAH814qHaz=HcqIY$y5k8a#Ah@6HM9cM$&A;K3Ac69%!SEjI0?;GlH}e}}*< z&Y1IPo9yp{vS?b4Ik^Tz-KW1)KJ~*XS$W-a*ZI7)UsYI6To?1!KrLda#j_EB= z6Smwf4A~__LDrm44z&`q*yOV{KXFGNc>VrVbKI#O=en+Fra$WkmaA1wC8VBQEEMiN zFsQ3xky`&tTv2!k#^!qX)8IO(qJ$>M&@B&%B0OZJ&GbBUNPk+6DYDN z!RfT{BhVY+it?zPMD>iVBblb-U>dZ|^h-2}bIi;0gV2V*FL7~QsBFc9^#R}A$lM33 zC!PQPlKGEO-W}QsniI(G%2UPdcOORmXNsNQPhzp*@L4UpanSC%_@C|T5>Wj%?^oH} zh;|m+)dj>Un8jN6l~;Nem8D9>E(!L*su*Ruof2vTHN`7 zMisIbI5WKIEhguW4tnYGH)7N)AI5{nC}_Pb6qO`7i_UT*cS6WqhgaQxLT zW>*cr{X{32kM50joWY(`Q*YK0RpLGUft9b9j>V-A>`gof#>qAt?o z(6&Cg)L1_R4R2&LnH)x-t@>Js8^;*xr_c=QsLo)6`+!WYN;?!#d!jaN>%qH;E_#|( zH*sL_bE3=qBzz3iW<4b{4u^}kn2x;~0+tT~jn(A6)J!w=C~Kq0M$g-9rZa;BYb!Q^ zYv179a>n2JJp>_MvfDX$4ccLQ#DnNB+CAtH8v1qmb{0PPeSIo!c@hS%9yA;fBfpdH z+Fx5a1SLP1rz+w{V4Q(lr|a)1(u*BR>pD4uTdp$*I<$QQ$^EiIY0K90Nn!T!!XM8~Jg{Ftu6yW@sF9UEss(Rxyu!d45hk%x88 z^Y^1!>)UONrad_AcFgoPODjI*7Cq0$F^gXXM7i_125G0u z)#?AuK|X~59+*!kF=uE zzmPKC#Cgzue6_JVu@(c=l&CjmX28KZ@wHo04g5SHNgMaDA3qjfh?(f_!Qx}3*381K zC|dB}QQ^fIEC?6pe7vC*D^*h;ho{ezek$$f;vBh&X)YkykKp6%&c20P7i!=%KbzQW zP(QLv#JDou=|K+X=0o>PTe0-r!MS~_Gk9mQgYF}F&$Rs?hg1p9UyQMSx!r4F4wWmND`YO|O_z%?n|e@g%HD1@q7|#l8Q4-eXL01?Y5zA?tysr6 zX{J=Len5Fj|VSzR+sXcp(aB?9C4`rzIL zPGS1-dMt~0dFLbc!$|}6yqzSjts3SmT9ir@?_i7{WqA*WP8R(rSZ~D0c0sp>ofJHD zkG3$H=&!-CA4$c#$Q(@h*6p6u2IOV$`6%4h4{a}v!jBW&Xt?^VuEe|&+X7Q$j7Mf* z3O_Ur_|*W{aLN&;rhfcw7S;4}x(EL%tA!m6XvK{|ZFB{rGpPHlkeQF4=$QCLj_LFB zz|+0J#S>7A1#bhYM&`+U9>3eq_G#8a@ltj;gMUBHM@I4AxY2_QOvQrkWWB0gQ6h)v zmd)i)_avWg#pZA68l|c8P~UM@zJc&^s=?aD3mmiX=ym!%|F#;qXYpUwuEjo7eaF!E z_g^;#-SRAPywi&2!|IOqJ7zKT*kLDgiB`PNWlMLB#M!yS&W4`z1G+wDT4fC>gS{08 zlMi(^B5%$!))~SV4%46Z=IozEEy|WBtHOO?O;dC$r-<-H@fi*0xBXyS_h>4R#OFxN z4YaSNP)inCQtIxG@PZ zX{toUi0atmBIOY27O_!TuL(aHD==={MZs(GqpwZ(5u8Yk%`w=}2irKUmAUg9a6DK< zc;Hn(_ePNDh=J&XPN0mWLmx41kfab{N9S-EKzSbqB-|1(sHKH?`PM03l)mQBR@saF$r zEi<#`?xCQN^eftZKWFg6j`Or3U48I=$GvwxG7T6Zo4L9vdEoy(sq5kT8Hh@1e4M_e z3iZQPCkyZ$4BwZ#&otD8J4-k_)Ho>^m6~1sdTj<*XjtR|GyBLq(yY;cZ4G#3%Im^= zrvZrFb=e}bbp}@0*)J@qRN?yZyjz8(Lr{~FU(#P-_NT4y2vr zT>l2@dj%C|50W`Q>1J;oZ)BriqKIVY`Xr<)fBuha?>KC!9qiyFeeRwP(_2$_M}TK~ z^T^E^GMBmVd;^d64Bme*>f6N9PJHK^ixjRN%!)YPvO_Qj-5+dxvhZmV`XvIcowOK- zj=f<#kJiTUj$g-pDXUHhdvifRg>M{N9W<&ti5~yVxFhm%NgLe07ZG!?V+8X}Gnu<% zGjJmdBd4VX!Gi{tXTziYWFGQci$3~sl;l-OcdYLO-E-95`rl(%`#s24ckdLqJfP2d z+TI3ALGmXUdq$AzzhztHO-QBVB*-5;CcA@{5;q6^;(qQ zK77%bdmN=-Gi;D2bL}n`BnoY29LJ;^H3DMHQ-tT%yZS8Kz=zI#S1B8r=O{-tkkrmX zszA+fl?}=Fpb>|sXZvw_vvfT|n!pDHsw`r~Un` z4L*K2e}0nmCr(*x+bfMT@L5N2<6T8kf41+Z{MZKYQPZz3nc6X&4J=mDf7A(e@(;s` zkB{Tpi1TQP*%Sn}ip_W`wn4jv*GH$)5p3mHePjyR_+sJ2xo_IDDEfe&dAgw=9gYw4 z2Q!c3_nA$XLhg2gwZ#n~`;{@I=g`<%#5G0EOY}Wf{@4bVQyr5N-$yX@ewU=n)J<$J z3*B8MJBtGxSCoJ69KhFXwC8UwzXQFzrANKXjreA4`L!cI1&5BVS-72?#T!rhWQ?!% zLdx(D{aLLB{FwbD`m_Skhhmy`tb1nRw*Q}#J)M%Vfi8}m$ghNTJFgckyw zc_{cHx}(8`@YPNHcsN6}4?ZQT&1BCt;FfB;4}AUo(73~Nul~vm_{T-MzwoTY0NTsm z7q*O}3#+?Zz|~IpFUVQ)7RgIx`&259q zmi!WKvhLsY;-9=`%)yp&+fOu3H zi4tH@`J=o=s}WC~`}r;J2n8eS11~cYJbX1jQzt_7^TZuGp{;Fo1oMC@9hvVN zfHF4e^;q)iiNTdi{gCpuVA+Xv7TR+5f1~_dODS-3j4|B#9TK^ zL7%qP=Ew0y%*tXvC?-k4_Q9Ldw@LqXwS}FZV%7)clEJwlyXwig^Z1q99sQv2i*iw# zyw`SFS*rf|N(@PhxnlXa6i!xJyc5rB#FNn-=__Isq%ki)yG-;37xTKNb_AIlr;t%( zt5=Uwm9>%mZ%7>ERcR_;I1;IgKER^O@U` z9|(Wluq{uyyV47lyZ-CGaHavP<&%76@AN~Y=(b1|=2>{qwXo_-6Nw7ekxKocgmdvJa~3&?SLdb^KO8VBeEmZo-4W z>uF?^TZOGbbERL3N}!k3e!5?~3NYRM5&#d1<0kuBauhz5J%<@F`F2S)a0#9l-k$ld(wSOrt zr4z~-Iiu*djpJX=tv5CwBL3FBm5z?WHZap*+t)>Ke)3jK)Ko>qr+MAhb^SYsd6A`M*Q` z$lY*H!t}&A9!Qd0xx(E^=8*^|OH7QBIe>ps_+}=dxnA*Qv%yz*HYt8Kf~#lbDs(n%pF$|C4chwk+tW8t!*sv#j|K~RN!%}?zF3BIyf0t#& z_hw`LrV3sQ;uGw%6vJj(-HjMORPVA|Pe;iTjx>GJMu+`mSyG0Yr9+9Nr_wf;gGt*+REL zVD9xTJd6F;!KSj{Poll(6~TGy^Ij@=e!VVexMLJibr1gW9wngRKRS+!I4`e|RcE*= z`#m_X;`jWp9iJbyg6)aV2H`^Ta;*#>4Fa{*|8#Qoq75E?k+%n^AhYYN_Fdso)M}vo zMn8anQiJ0NUU^FSQ4m`Fpi4Yw?Dvg^DPYu_Dbl}*#qlF~&nGct-SFsRPCbsZGZ6)X@ zjmpaWqr$c7Sv;q+2gQi_oo$<;!u`n&WB-rq_HyUU9nd78D?=tvJ@NN^zFwR*_$&p- zb4kw)@cYAd{)qdo1rpfFS;kG1sgRM(y#C~DFS_hDHF5)==kXTjaa+|{3~%6L(Q^L^)MZrGKgc8Aq1bI%*0$0hMdhQb8=`aO|+68o=ceKmW^n*kKH zdx=}7v zKZ*_&E!=79CLsNtLUqJRG6-p^%Fvq=;18oInjy=Ag*TGNy0AU`_@cyS|7rYpNLRi2 zT-1ZCl$>R?>Zx$*V?*COu17vg?@BB1;79*zDY6qvS%tNfjx1gm=gJL!q@lsB7( z3hWOI!k}pO)E^HTNOFy;#eeES5__n7o<65S`Mllm_3sSSspzcTak~TQA7{*@$WtKt zd*mKEI}Ua?5$qc9ewJD9naGV8gxjiGM~`1+Lr{mGo?;6D^3~K<-BxJ_!>xV$-rpvo zGreKz(MKrI@pwA!mH{39#sB%@E|q~cyyxE%*2#eWYht#yb#NZCuFk&Ph7Fn5qK1EJ z5PX0AdUKboMXUyrCx`8|RI)R0}+Wsmb)?)}h43?I5-W@}(hchS{597V+Gq%$L8nJ!*&cRaJhcz7vr- zn?c=mfC8yk$_J)T(t*hCG7EA{M-5FgcZ$tpK znb!X6N$v3Cj#H%`-uI_#6Mt+uO~G}tC8>gQbXZOkjfgyzg5Fm6l?;#>kp19r-pXkj zIvr&m|5%X?NzX*;7fyD-uG_NZDMjtDpS5CoVM8DKdcGfZ|Hk+8N?&6LuBRv@ai_HX z$w2k8#E$MU2A+dmKc9>1?^{pbka};&2E%aq^YzyWprfh%HCC-1*E8iGnFtZlnh}?~ zB}NoHx7JwD4S&yRX<>KW$yD@B(8R)|jRB2v`5s)xH1zAc-oby)Y>44MpMK&d0pfkz zR8ESuLsawMy-zn1QTTfuW}6!Y8holsy^hc!=*0fyzNS><96Vv1Uc>-j;ilO@CmLee z5M^l5!^p+m=NHi%=dtr6O`T<_cuwiZpXC-z$cy!wzMt5IJhvnsqL>naGA_Y;C@2y< z@0@?0)yP11Lr$(CTheg9^xPzyuT-?Ll(Bl^OFr`C+p{T8a}+r_Z_ly6J_KndZ|~mE z9z)SnhCH^rx{*mlW7MUOWDvVw_f2js1!!#~Qbq0v(%LZQsrZ?Sw(LSSf1l=~1}~S@ ztP7)Pb9j)1+1VlRc30b}T{?!!cSfCU`rC!5cDg+;tH}^}VIf8P( zpWgCrBMm7jY+u?;%|*LcI6H^ejH0`eqKA!A2I1kv>oSevF{DJVN?kM9jkb@*Y)DKZ zgF{@o(5?kC=tkxWr8kbC{8Q~Zsg`W0dO9pu=R$yrUEbwhxQ><-6lHx!gNV$`&u?=u z#q(vV?T#1A(eXTu<{bs$sYo;D-I|T{3<$6y?UBNq1IcmltIX?RtRv%#{Nh7KzKARP z%Rwrvk|nQ(P_DfNJW%~=A9Mi^3koW89eGZ-hJT_SXQVr1o_-29sLu> z(6-UnkL_K$QD#u!X6j2a#8^*jxnO%OEBV^6s%Qj#viNrD#{w1g8Jgy9Pbxs}kHp!l zH;8%)W^6{80zbp!l!Mww(4Z1) zL;WjU$N%Y=F#a+Z?JGX+yUAq~#c!uJ-q0QbrHbU*53ysYQ!rueWMDTslE8a`Iz)!^ zM@f?bxQ@v*)v!EvWduFV%T|%;qN3K!uefkUq+>7Nuka9+l3)f=WtrKjR4T-FlGr{*=Afd)5 z1oxZQeWg3HNJN>(ecoQ;rhru040TqM4i&TX`+``m;1z=h-fz0BB6{I*VTr7SJ~RpVdlQSUIVrp_l{59 zSK%%aLNlH{*A8#o!gGhmdXdl`!M9W~3WVP> zWG(Wk2w9lzI(!js0`@xoha=-$=0FGkL?fvptem9|8H;}R_&m|OltJu7bkTU<%MC<0+Y;{5^e-M9_^c0Z zm}DTy#;;it$7m?g;IEkR|Ly$0rz`K)bijVag!3JEuHU2N!;<6J&e!hV^)uo)1=P#d zCs-Y#18a<5&k(SkFW_(J{lNe(bsFzwD;g4(opw2e*s$x`PBAO~4*2|Q?g#xzJ5;Y? z^x6Hy_q2dyjuy%AYUjnwGZu6ZymLi){A4Ej!oMTy@)QFmXeQo&_S2AC!Ikmgr);=+ zX(3ey&(kyBpjzD$-3BYm;<_6Hd(rz4F*JbhyVST$P(I$TtQ1Q#>g{xN?P2N-Ap!$> z0}b~Pb!jNHpcuD@VZ+ZM?yv)o2oU_+ph$t-23aJhGYa%x-1q9_vPCBH7v*9Gb+e=(?T0YtNCx0 zc%37o*&WQI1>33c@W?(6|504e-S)`LD7g!n{tOnC7wm(J`OeudCEkKM&!E(yDF(V} zGk;7C*H6E@Iuv*3QPBpeOB$WM`Do?3f1fqBKmKQF>*8!Nzp=1seb&b@B)PHpSlPO6 z^h0b_QAZvb{^`7uWv#}X8E^fpO7;kPaF$CWME7;(3>c^MV~t zC=Nlug$GkUAI6Y*lhp%vw{EoF#s2d73^JHcCrdYPp@4$^Xy&C4BS?2+C3mz78}faM z_He7>`93mh`&4Ax;jo3_m*(}Db0`*!seC|z<(}olK^Zz|x4!%AADV)^jf0kIupjg` z?^`+NjybfD?E>DI`%>lYws~SnM%L?>wX}9pAzj04bQ7*G3n-RMiAZ#zFVFvz4n2bF zxv@SmZ5jz6#5db-iR1mRtl7lh2WiNq*1Ba!?l6i|f2yhMPDX#CqF+qn-^q?V9+_#x z1mY4;X`)mY@;Mrz+b~H4F1zaa)af`dUDGGgiS4|4_Q^$8Z0B9hZ97N!LPcKXADm)o zd1#0Fmouq)qv)P_OO*MsA>a+tH`-K)=fs7KEtku5qnH264iab@NdB6-`;`^EiLBF<3K)GzhWV4L!y?#}HRy8+XZ?ZZs$u z%dL;|6LB6LO<#VJp*v{5z{1B76lJK%Q#4IQ{+f@M?(ya$Nky^1cldp4zxn+E2h9KQ zCeqmk-^S2?H@XtO+~`I#;%s+=7&5#gysE#)A%k(_mSx|b5#+s@SIBaB7>&6ZUbuOg zjKWPf3C`lW`MH*tdgt&tEVYi`D`(w>wmz8C6Ty7aJ{^);m`WUsjw$ak!sl?t*Rz3v zu2A=_RZ&+^hE}GYns)v1@D(}xX;x@3Kco&Y_^dt_=qTGZCvMZ9zoS_@sd;gAec2j zYm31gngS!`;*IWZw9Y2$x#KS~I2tgP#pcQI;F^TQERI)=iz}~-VZWT+aq@#Ke<5nT zBbwoM7S9*uzSZX%J_JVWJx8CU;kiQ2<(8W`UC8TJ;f_$eK95|Eo$y;jfy~V!7pc`F zsI^%4PI)%w;%FD@Gvof9|U$V8ylug|R{tU%H}JKl~TetpBeorGkSZuT=2M1lB;w z#q0W_2{^86HF?{*kdIDeL|kpXF^VkyN$n_T83O6|5AWAL!p)ikMAyGn=tkd58q0Ph zkiq8i7m?qm@cgf`I5WAB5mZMhPtnD7h?E_?^KN%)5Fbyiz*Tn=?0MGlB&eqkUg*Z( zY?y8V>pS<(@$s=BE%?TXKO#c)QTt}Ct++uVl)S%;+ zC+~5aks!~+iRXNMAMk$-EVIvQfpGQrE3f~*KKoT)t=DXY71MXW>i*-PCXyrH(XeV@ zTQzz&ntw&R49fP1;XJ=3XL;fwt{2pFcu4qQUQ3(QQS-3J?IfFR>=>M zki6YWqxk|8DPFyHJTJ2nPXEeC=QCh~qQt%yg%JX{Rh6G^b7+Toqg|VxV_vH~9c{UV z>mMH6hmwl1zZf>yE4w2g1O3)biHu`nJJzY(c>v#witGdJ&s5p)Q2ojWKjRLN3y$^s zeYqXfPaog!&`v}jYCYEk3Sh43?}z;TI{00=eG}K;i7YgtWkhuEV8CYqA<{-Y9Iw98 z?C(0whW<^V!Z{QIaDV$VN&M9g$=gK6w5UWh`t4?U0_Id*@2YB^b*95%+ReUpVmeYj zrZe6nfal#c)3j>V(~!zBxvw)9*|5&zo@;#x_NT>1n}z(_p>V)o#vA`#`xeIqy45K_ z9}CTKRG`Cz&`RScpAX2$=V?!K0|R)j?pKpErJ*a|pKxwtu2TAPS9eQYEwbOc!R*Fu z5=?D4bIPHh5A=LXc`a62fL9{z%0aweDYvfwck6T;1(Qij#=eDPlW zuP4KZJpc>UugU1Bg1@kjI29gmBNbnukAwc*l>G^8r-__1ajb6-8)_WVkCop)IOOu=#HUbE^e7C{~GESG2PDf4!i zx}o>tBOCj#2EWrf_&rkG`SKR&3LW~^Tw87Lor5H~JbESu7*Hv@w>28SPt{Ji^UYmi zgMwtsUn1VGJRKv=SowC)xFvDwh8qzzs)`!XB`MIvU+^dT5*@}>zqGdUWuo&&TXt{8 z@v4!4p`pJ94K*H7h+w^A!{0k|Tf-Rbu(RvYqfdct@K|eSoVHRgYA4i7?Zx>cKam2R zs#H3ts_bf+IGBN4<-$|et{w$m`$+AwEi}x3bYATb9!A4L=~b`8$%u7YP41i|6>daF zdLOZ8!q8N==ee0q#CQAd2Gdd^U z4$nRRHZkGP-JVrr2NU4Vn&nfUv7eqxmtyV<=t33;t4{aEGmszeq4n8C6gbd5Cqy>x zgDS&#Q7btb?k{QT^l^*@^Ms~PAyP#2)9t{cV{sqQ->3GGNf!w)s=E0SnN9&c`hT0I zsu{4A-tZ!Fpbg$8EAA@$N{8QBpB~MLVg6a)jq)-TzvJePiu^5Rf}2Ttr2fws+!vf7 z@kED=9RBLdu6mET_c%sgNjd}lG!=jS4RdNOPuC{oO%P#I(}^CRoisEgY_{(a_Fu`J z-GncXnGo0M{bZjI=GvLmr`L_is7rwWU#@o{^Y_!)JBt`-ZYnk00(0^8OZ>c>mHMFL zQ;AbE{<{VOF55_T4I_VtjH(CmOqk>q-JW>-9Yloeq&@T^qY%xncb+eGp;W%3JoCv6 zw0Mnw&S{PUS+l3w3jXdgzm)Cc0IFPYHRx>aFoOEQ>>Cky?% zM@GB64F0%6C!$r9W=JG5(C&CUzN#e(oan!2uoe2iU9_0{=yn=<``o>efWOD2_DGS{ zQzqscCS!sM65-9Wt_oiKJGVc@8xG_6M~Yq)ef9%>*G_XyPvhTlb zoLQOmING2k)-aq!hUlXAN54TQ5^ZZ^b;?PCvQx926+|>5zvl2@cfH#FXk|j%I0otVppI zo^==c1Tuz^kRyNjsTd~cIctWRua1XD*Y+p0T9eUxiyM2sJjQW&)1xn49XS5;E^xY@)Cx~e?KZx!QiG;VjYBuj zwnBJV&dEgs4(dv?PFrPy{XqWvZ6ps|mr>=}f3OAf*aJ-c1z@6wR+?4L5BnhF+U$#_ zZEbMn)Zf(H@fvipF*);&Z5zZHf7tuN33GzQU0M!GByet4?3A=&!E>(7r7OE?LCHsZ zjm;nvRo^b(yZo*X$}j!qEH2?Vz%tsYrm_b02|78EkF`O8cxd-7dk%^z*!*=&n*{r| z1u5*;V}aRHqej90TKHYR>@Hl*M0b)e)&2LV57-H+3JcrYfI6x@uzR=$1=ZKerrvCW zgpuxjI*uHav*w6Oq$&y21E#u}RxIe{eYVwNZ!N4AS!_Ls^K8$IZt_uX4}tp2y8I3J z+*%!M*>E`}4_ylzYy3DqhHNity>(befuJ$!k%Oy8(aNHpePMn#iV1Qaa`zrV86Q3b zoJgUf+u8R5#~DKq9C~lNvM(9tw}ftr)hj^l$=ISM$A{dxKw?|Y}v zr=XKc-DpHODoHwH1Z5dLTWRiRqIM_TH~m&0=)X~wPQdFU@S87C`BE(kiHX=Fh1chj ze-9V+CFbt8@~%j5ks$iki-G&Ne)#spy0sxWHDFzsQnWnDM7?@X4&>dz{BB_11@Q~5 z;MI#lBk{iT-icBdm2U$<&ecwS8xGpBhfAAsk_5U3imx2L#sYzi?Hs=?weZuv=*&tb z6Tk0%jrH30f#*TC7T4KUa1|=L^(CPeQJ??a%~ZnctXQFLXvRT$^Fc1Pc&_5*EjCKL zNi3iwir+vuUd>Z6i1L>#Lqu*9M@M%SJfxnUK9Wj8X9Bsto33eu8?mfDJv?7J-A!b& zAM0VBHB1K`?cl(-AODogRO`X`^Ol(j?Mk>v?A_hEiVgl_Ld#(Xi0GI3q=%bpD*C?b z^ft$Q%;mp$HXav(>ki5N7ZiRofTd~q@P$G<=-(f-U%$=|c#@dMZ8}Rrjs)&(m+VH+v)+9)GkyTspAAcn zAutizt9$u#CkFyJ@~i**iR*I~I)e_FBbvS(OmosKN2|(dlNSwHASPLSG63@#Qg3t( zPWm^3-2)qK{o?~@+*)|}KIUabFK?2MTIRsxC&u*DT@5g=@!Z|vTqPJ4Ncj5;vEfsJ zg@DFQA{rP}JM=s+18qOkQ}5l0=XIZWJ#_@@<4*U!`fgN+^J;dL$zi+OVVBf1zQ9*> zNV#!=Yah;&1RA;Km8`JfAX?@Oh+_XfKemmp6z97&OwM)~5+GM>lC!H1&sk6TDfGII z0fMs;59AKw{QUtpi7z2^NWN6eIfvut>vH}k_b!*A=t5+mp3Q=%8G8TjOq0-R+WwC0 zPmORnrz|<5YXIq|n5#v9Wuo9CH9@p04wziZ$a)uA5BCP9>)oZR;7sde)|}Z_bf~4j z^GhuYs$5#woy8!fu*jmL>K1OZRg$6e7`fH+?luH`n~sX7|pEug7a?3anzI{--X_sx@nmg$v~XV zr-{lF6u5O!_KLMZAFza5ieq_c$hmxN%O=7wQgb1{e)^gT{?Y0uKYvLA(Z~zckuGF3 z>GHw)I;#`uY30dH;5cgGRAy4;orjcGEG~{?XH|js?Fly0ysE&f^r2R?b`6eX$Q*v!92# z?4qG6ou1Wue-0z5*E{Xiy_gU>C#8QV^*!{L7qDL4B%^e_BO%T>K76vE(9rUUfzDoi z{F}Lv3RMxaZTyjakj87*yC2_+-j=iO|0af!*!)ibz4FZ18oxYn|wG#f!>TJp~qOSChS`H<~0wF4__)uo?s8-c@4Cx-3?3- z6_lC^#Citj03DZ)SIOw1Cf{*ddndZ~+9Y^~Cj;4tE6OQTDKIO%@4}3(aR|vS? z(4QB)FJvnVNk<^QnQwg{?+;D8U$w%5cAKH|=^FHPZCR)=yA`fA`{YSla8Pi8JV6l8 zear}ZUeb)~xu!QH775sYDI7VrAb{)E;#+xXV=;Z8VIE&-71ateMcvL9G-}c4_rk{_ ze_LTg_`2FS4-WFko#%eHodm%zort?lS>R>&Xsao?y zX^~dQxHa?n{-#<~rz>$%59`rxTmGH;XM*3yW;y21)iEFXb1rJojs>@lj$88g)xd8n z8Ki*qaUO5!Gz#Xpqobb2kMm$X9Q8v}hfNJi%IkmqM!5~V_SCr+*l|#VbgM!RexGd+ z;_44L#DZPkx=)@wsfC^I37ZT%n22<=`~<_h4=g69xCCFeg5OQi)sL~AKd{%vopZJg zBt&HTL~d|U+F{+X97KY+2fpsDuDIS^estr1TzHOfhv)qw{C8b(TkMy{^G8Fih#}hF zTH$0+nQIzPE&5&GrDlVU_ii`Wsf_ zcNpg{oEF1#hgvu=F8Gr-O%wBN713{A7XuV4tu7SnWFp$4q)KagADoFZS>He23Y`I! z#UTbYh_+w4`ToT=2()wGC1cD%7YEP&6M0I4+uJ2|v#+w?DxpA(^RyNY^nMQ@bup2r z(xX>7rr4iGJbtxDybWfhp0zsS_~&N4=wmbcHmK_Ua!eBIEtUzRJNu+aP#pDbRznT* z8%MI@XAacDcJVV&W4(A@wPj+8W;LFZddF;jqPrDfD0{pa^Zkr+Q_~MUZJ^)d{_xTh z4!Vt=^u#a*px%`G4cnXrjGbZ5)i$*-l=Vt!Y-1Vnyc(`idmHnHLrY@3n6vNr-ZKAt zbtCMTrV@2u4xqfBmp|TE$3jYC_HzNF97vteIa55E&i9rol`g2Qx`=YgAL2x4r# zVxF-eir(7NlukmEQ3+ePxEkTOM8=_8cd<_D>vnB2&hPMz$GITvzao-2l}#n}V0h;) zn|QwxxRpjeOBj7c?YDg^>PsRO%gAj%ImP{j5*2@H$AZm^G5n?6k|jho3R8 zSu?eRs5pRbiszD8|Cp#UM&XOo<_VB&^f>+MUp<@+3s`GiQ3=;pH=nT=C_@KygdY&Q zS#WW8k85-T3Ds<~{F~?72=@hf8?1*0a9nSd?p(n{>LTZ-PvP%TqJP-;7wX~hi}mYC zv6Y~u^i61Dv=mvq*lUdb!#r=7G!@UyP-d`1)bo++5L)W}8&SZgR&1ad@+JoqocF3GB)|oUK zu8vrhHh}74<>KGxGLd;5`(@!54$KMge;EvKfOG4@v_)j`I=`3?b&{(1K7?l*i7u?$kWiV>RVnm--nTs_1S-4L$PkGoc_&A`8`Cg*VeOmPDT>z zG>xMVcOjabH?iY01D*Hf%~}bvX6!5>ZiZy__ z<;zP2TR4g|$m)|nHFsnbSuOq0Ge~?75umNj`Ot&-x!45$OadafEnSV^V!<{s@k~Mw z6(m087*AvVA%3DfqVYEg6ngfUDC4>8rGe4Xfz^GmU2A!&QLzo)Rh`M`RINpk#}&@M z#CG++5K(R3OB|FsYj!X}o&@f{wzqzaU;+1uUICHL8o1OhnPHA~017Uf-DjLeQLNU> zvd2eL;Mncbk}y2)d&8IQ^byQ`CCpi}bH;)!hJr`N{xQzyBWykx!W3D54edbIE1M9rp<7f|e(_p_+Z0mQ--5=mB^!WTG z9t3sOR+k6&pv9L;)P{Zn%AD%YXxhnw#7%3yiDT}m?6lPfn`0CRJkr6AVUxgM?jGyJ zhOa2@Z9#NThn^%7#x;dHD=IUQDecLa^1Kwa|S&x-dzIdfj`LRb&#Bh77phVMlINBThm z*8Pp#OS78C++`GLDI20klbHys#C2 zkJZ>UYo##`MDHi@_n)i>O+i*g=Sn3+G?7C7jFg~1ukIY*S&8=}(U>rU-xr=^28SEw z>tQb3Sie)Ag!CS3eN!4?qP)hYiAU)i*x={b8uI%Gi28U_)~Q!Pa0~bpW4{9pNq-d1 zv!FC|@@hNQ@jfn6A0=YW^08KbVBCcPBzpgp$r#RCEj@dapz@Cct?eP+%nc1tud_dS zO-UsjlgYA;5-dZJJ0lt^`&dw0s*xLl`S_Zt5yw%#23RdBdbhxE04X^;eu$+rky(>C zy!_08wgVO=Vp8}VNPw z9ul${+xab-A7Kv1CE{sHo*vj==r3&z4S7=!J~A&KN2panCF77E-Lnj(-LZ*{E5q@F z&c1trI3DYkdUl##&;V+8T8AC5KXu;gb>SJl7vd~FcIHnGT>N2hj7z8iUT7bw*m zx4r}In-=#L#(G%g8`*E%YN(LJes{(Y*K7VbmHC-n9fbUEhDK*NRQSN;)eOXSuiEH! zm#e*#A@!n(>!KOv@=c@MRPgukR1X!M!}>Ir4v}hA%>VD)%laIKzlVIkNuP}E&ywoj z|F&ShcOQ@6`Je-sXL`Oq%GEppV(PY2=bCV_ym1Db_ncj0pypQs#(xm`G5 zFu^ZG0iC~VEdL!D1X~H++<=2L(3x{pYB-1WRmD~IL8Ea{Bc3=RDAY`+!_n88MuLJy6iEF+*JIx%`mYJE3E!n0~OwAt^B@;>jLBU5W%nxe^%Io{+x($+?`H9W+qejWAJ{t^_d7!e_+4xGud41 zA_WB8Mw1qcNFbv7dlxs}M^BlIub_eT4Lc52j2R`t%{Tf9e+fP40kviOVQddmh6UZ7 zg;@|EZirtgRB(8hn*MMDeiv@OoLjed5cHPSDArsw$agnbJdDpzjHA}?@+a?Msl0fV z(;KXR*iU`-dw_syMK;NwVi*=qW5g|U&}9Jpvo1h_%d%H0j;Lz#A@Sp4t6PbbFaeta$xm>BksRp`u?!(^c)FfrxpGyo}+@`I!5G^y`+rNndPOEKI zwqc!}{f`d4Gx&amdY|oxR2fC5_>B3u&m{r9$v>7+*@Lo-pN=^+5Ku7XTB#ylXJOW4 zfJP$~ns4482*vd^72!&*c-}$Cun~H%5~qNP(GS;G+Xf-9d>_J**(m409 zti+9XwAgEe3AabOUBfYkzVx(%bOD#mr5~v6Z7Cyx)tlQl!$iKKO{!m8#Be&W_4lYzvS#c^u~>@L>s z)ZW1L6%)C8sz8NT_Pfx*{SIX$gv0M^td& zNq@m+we5Y5YD)nDaefTajsIa>s;A84FO>>?>$#?lFzzjx7^L{GLwMMPu(uNc#|6muunAL?p?ngMEU1+=UWE>y{l<`^njNIi>q^`={RgLj$L1x zx{Ct)7k=*kcxVtPrUpHk|Htq}?mhp5%|=4^qS&;4GJH8e?RomO2RUCbyO;iifRagz zATq#&6lTFS>rYs=nD^0IR~xruY1#ef-v|kMVs*~EJ3<4?+SNFpGm5r8+mm{YkN`G~ z*1cOAdytVi@1bpzST=g-5ADQu7L0~IXwt-T)yp~uACYj{pBa(kTJnEvrF_LHey6LPSf9XnxZJs&+nfiXqGNtpZX+861zw)5P$r`L?7Khc9vNs8Y2NTV z5WxIIsOuFU3XrP&;^#^jaM)Tvu?}PU`za#Ip%3YhcKYA=H%A(B4OzHK`^^HWrfR*5 z8;I!mo4mB1lW8a=R{yFMZs$VN_j+d$LxBj{++9o}15|f~-}l4iT%rtrLqk0sF3S6U z<;CS(e(jN{p8{;?EYcPeuqUD-+iTeyvNMoT$Y1IoEE7Pzg`2Z&DDVhez7=6y?BdaP z2jk7!p<(yi$e#|lor_L;fGozx&ebY(FH}>}lV9DMoBD?Ev$nIUJ(moB64T1<-SSbX z?4flTHDic+%^*7&<7)>W%zOID2+Mpl#vbNxuOCA@c!Ks6?WRDLrEEjYx>2N2_r|JL1!HpV$puxo zjHVnW?>ZBK@v$=w7kPK%vS%2Nrg#n+Faz&5?^=NNH8d~m6dOkeh^q`cw^1;r%)H3% zV4&+C%|ge=y3m0G>u(3xj-c6*fz=0Bv!UbFld*6eB3eReNi{s_Xyv&?RVglCsGXRd z8u!5M>r4#(#I!JAAGgawraH!>Gg!iha9Uk0?YP*JD>Sq&ztYf}mkm#=)*oWx-?2Cp zB4}2biag@q{^Bnr!0wqjnG3-fUlO^T+KBOpk4xh(4>551F4A&C!#6sdI3=4yo2Mc} z-<<{?JZ#wh%$X|!==Y};*3%mP@zzKPFkZKVtTsef8C`+8NHWCv7w<&DY7xI zaGQbe*K;^ZpO|pAw118k91UCbrxY!7^u9hl|MPX&t+RCUtN*6tnt zojo=-%m&owsmr_R<#y{rI5~nmN z-AL>7lYlNR-b;&W)Rp_*oc*EwS&?@78B4Yju^Cb2q(5znYVOH}|9c6LV}`S2(^7wEo`GD4Urq+=b|c$~ zFZ&B*Mi9p??fc_TR74Fr{@kW%2n4nWom2}aL$H3r&}IL8WcRmi?yc}RvQ)XKRq+r1 zzsWY!|FC?@GBomamUB1K=biBlx{dGY?+`b)UMebAP@4^{8UiNks?!~e%X$T~g5E6V zp`9_$qY|>lQ2OdXv0faWF0G3Xytxzm6}7rVWy@~#^R7ebWw#L&{^efA+8S&(+-ha_ zE)2oM)VO~ZmYqGhvOev^=6rOG66CcwJB9{bC-1y%##mDF_Ruwa*#0D%n|X?Nqu5=V zV}uhUNVwx^s6`VMg?VJU_PKlYD+3{0vyo zeY;{RIEpIvM$tquK5BXWj`qE%5ky|y^6Q=y8;q+I{hPChNGN4=^1MVALYg1KO6CY4 zleRLXqe%gDJk5xhz<_|b1fhQzcRSuZwr{N~9nP8$5VWw&<=*(w&)X!~Fex*p5%!LV zB#meP$SI|v`-RJvyYTM}Ki=WA-;e^Iv$QrH?Pq}h)6cCttlFW~k24f*M#p73~o2(cI7B_LhHTTr<+#G? zpufJ^@gQKlE3vpb{1n^?9Ed?wo0E&;Yim)B?SiExXGF~51 z#`Z0iZgkL#ZjFq2OvB?XIEGjLVeG;8&BOLyB66JKb89nAM|;cn|KtA;m%BHV4b|f` zkK4^nGMSAGXdAnUy0EMwO!r^h&Nw>kd1vIzG@>D*>}gT#zcg$`%^EN^XR@;O zNd9ANpAVQf`rpZM^0PZtt; z#@?V?!9eb6N*Y1`uzXKbG$O~c4+^L=zYd+Eq1DIkifFIkHm()(agrq%*V^Wp|6o%b z^b*&qv}=-)l-HxjaV=fQAyKX|Fa_Ups-jW!FA8j)c@6q2M7WuD=+1;i6YYl_74Ec(d$@z%ii$bbn|>w+Le(XWtzTIf~yC_MJ|zq?rsfdi{$( z3CpicFTG)oKf?INyEE7Oah%{ZuWQ=HKMXTF|9ts{<$*r`2p7C03Q+anwFg^e$I&%C zUC%{~@AsSV?(Of!7`Aan!KGE*NL%IQ@iR9@(0b!dIt^>t(D-cr@K*yYKZ}(13XaP_ z{Jfuk@?-2X?zX9VjTZ%`b~zjkz;RUJJa@{GGwtwkRI6a<5gqO+Rxo$sdx{(jFP_8Y z?(`3u`CIULj=7MWly^T7>;u~m*_xA)#wzrAlW-S$5=z>_kMXfV>1$693*lBgx(<@w zxE-qUW0ZUe<6{Qr<0mq(op;-p`^U!-mkW9_tS{Hc!qbI0m1#RNVmvT+dyQpn8_JjR zlxi4gU!6|G#VL$63U^#QHA4g&zZrvR+;+}D-ZOk7#+DgrqRmMdzdr20b8#NWb%K>4 z))@{3$l)vz{I$o?^0nJX3NY^Una47p%0Rph>guBFyU`07yAuC7^dGhQzpPrRGl#SAJj#-SO_sZSj8ljk)I-@oHZkmDQ#deS@aQ9O) zpUA?Zvm>ZqWcda!b~|*tlV8t#8-j4x??(hNttEVBokx>@S0pUB#ET}VFnT;G-~2CD9?*O10EfWg5(GM6z;#c*9WwN{db5^kN94#hNEnqPLz zWD*lkDOR?rwZ%sL;Y6MNv1tQlxr=mFXrja+t zhG8Jk_Q$qoSXB{oY~is*A?_;vIAH6aF?8i|@lSu84U1g%+3>fMfqGs?bp9>G-HNN> zy>=`P=c8<=4sT$ggo+E(^%Z>}=IeaBG^Z8z5~?$7Txw9lsZZ7)Mq6RfXEgn$H3umh zUd?%gtKD`>&(v*?;jTupa$lx4*TNP#$1ai6Ec9inCpD0-9}exq^CP~sfT2lG$U|Z^ zS_&E}`YqfFAO6#U9#sz7dHv%p#jXKR-aS$ufvaxsR=Ac-WotlL<;fes>dMN9bpc(I zLvY-&m#pZIyO7k1O<&M2z+EyOdel3{P^fd4LkO-e$sU`p^1$mX#+7FCaDO-I?%*5S znL2_-q<37oj;q4!6j~%|HuuB+=1yVx;TE{S%NwxiXf5)$nmcq2Q}@r`rde${#X-G_ zCW4o2NZ{i9xmNNO3wDnSZZ$NlfsLp?V;FZ4^K6@cad2ZlsJr}edT^!{E_JoE-F#Am zq@LF7vo>jkjfXhr4YWAOWR=;otp>P@h}M%FWn5hjJGb+qdqxcuXoWmibNh;%$M?yX zMY4cZ+V$6~hJ=R0nTjLajX>d5Ie7i?0Dc~Q@6gB9b;ia7)6=-R9R7E0xqxXsWJXXt z_TR07z?*~IWn0-$Ard!Cu_PkhZ_GdP-%`;=)9#!R0(OI^4_()=r@({ccB7CP20Xd( zDuEY=8<$j5zdXA|hjpn@L)^F<qr#e{W7VC+ zjksTD@N-|eGbZt1Gj@YVS9nx075_*yc>L#CI>i2$tY?Cs7dob|Ex&DGLyn$cC*NJH zRzAn)pJn<1-I6tZK98Tvu4lY&xZlL#sRhs6cdRnDN**?7yw(l|KV5WIyyyU4GNSpI z4i6gtQgUN68=|DFvRf}>djH4%mHU%vD5^=^Z}(3Em>m?XZgRn0CzW3WsA83|#rkgn zl+*2yy*hR6dLKIMu(KQU#VWF{DQ9}iFD9Cr3YC0j*$;8qojau3TYz>nS59537LiIz z_{}-8?sg>M@a?p{Y#|GDgeg?utATYjeAz*r!ziQkI*H(cyM-^T z+G(^k8XA^&H#~npM%|K)dyn;W;jDc`ZF>;|>G#O$c>ktANFz;-H_(5d|J`+WxpI*6Bz{PXO{s@%;rs*NoNUt4S zo_u`~j>E&=#*QbFIE=Dd)e(JcKO1*%m+FReBC?vhI$T$fhFVWd@pLWY_2EdejkPF1 zq&JYabuz%2OY_~p-FCPb;uG~+j}Fr>7C(N%stKt}&W1LEY$)5PEqCn!5uN={3;K1_ zkxA~V@%@-)lj^+FvcZA^zly``Gw`#L(k&qtr`Zm|_lbveuxis_+Y!+pxXXaj&zHxw z=q&JjTEi}B=tXwL1t<6HPD5u*yrv#I5a8+l)+(WD3cT?vc(T~V0A?qXPd5^G{jSh& zG~>pq_5X}&IBRkD)!Pi}>es_a_fE{4TT@KPFR2xJh-u@~CsaGQuzluQe&EvJ-i1`` z**6md7%1LARkwFD6?(59PW>N6*By`5`-TyfQIS285n0)Lo%gmwviErHy=TZK*?SWz zAt4FL*YThF`r^-7=@O#xDto=g)9PhKO%AO!X2VMIitfK(xw*42jyVc?F1Z7CodubSm zez`*ZN*ONJ&r4Ii)q=T(9(%pHAf$ZHyQh{T6j{@B7O7}Rp<8zcON zbo`2`9!qcnW5%FEC8e?`WAr<99S0G9sIl8whD4+3Yc6vJdC7?EKXXBPZfB6#;u}b* zGDqtfG|aM=E^wX7;>#KTTnKVpr`dYo1TU_XIrrC@Be&6!`uyuokRtcN?V-9WQV{#Q zOk}-)YNO6@N)WA~BR(~W$Oky4M@Ql{qgkTj`G_ybeS~@9m10R=r^I$0a<7%MaQfd!5m3O+bA!4qeWFy+cQ%y)Kb%PXwc(KNY1`NFzER@f3(-w1dPlJL&%=+$OebS9`e!3; z=bV!ahus+0o}MAXC$Ws5@=yGcQ79|7%`6croU3=K{7Rtp!ECd0p)2xmTpPEl^G6PH zHp5D8&S>v>7dp-71A_8TtILHhKu*BNr53cC{qa1}D+SO|f84e-8d4I->-W|j5W&RIO2S+ey_L-&KkVR* z#BN*{v%4mRCdoey#q$=xAxq;=CH|g>;Ao?EfZ&a86ups_I_ilwet5`t1Q{XKi6KRu z*a)P5@6S7G@{dcUCdkCc$XwnbP9Z z@y-Tjg!`R-$rz)p@H+P=6DH_U4Aao@CNt!IS1gukqZ}RzjfBh45Rlxld7AFXh7q~tQl!uP2{6*ft@Mt=%5Qf|2ZZi8V|U4-xn_d z_D!?dzoO3Qh$`<=jH5gHSa9x`;xZBGH?mvRPlZ8CN2#@TayTlQZJ>MIVvVK`W@f6> zxuU#MhP23b8)WHspzmpa0Vr;oN%&4UpeGS7f!iXk=&(oDlm1{wq|-&*olLd@^(x)F z%k`nC(O_~b-^K$rRR$tV4UJK)%E2rDC_SN8oPy#LWj1JpO)~L3c85QO%4?A=#zr)0}e6@)rCTjISL4PFhLdqI@G(9^2&i|&joguT=uQ?u|!T9U~7?V=uh zqkQ{0G{Xn2EZ?#nwJ3*TJCz187E5$XPeP>nk`8!%y6mA8ZH|t&%q{tAra=7Hn9~QY z1pqW;w=##T^^|l z^U^`VqqWxI#3bnV53YNsECW3qz29xsZBZDR^>1!jb7UQm1fCZh5ciO^-J{Q?;I(U{ zz#Hp~W~fA&#Qe;WrTp%J!383+m%9@zDIE=txNT-mwHsmzZ+&gi;SSuFqoxvd+|e&( zuImN89?(L?e`7y68yYG^N8(hyfL1Dk?Y+x}ed| zQxqwRp5T8$w^X~L3@CTs$3*Wq!k%#j_vTM$WPZ?KM)$c8^n}uCrDw$r^|YEVxK&CaWrnBkN?A?NX08!8 z&plbRxq9WwWkNnI@Dgr?c=>?FR?YAQ6JzAp#ImNj?*l6;TvuplQ_#Z@naVPnAc#87 z#x13%15Xlvd%e%sN6~DlH0^)2z)W>n->tL|d`T;^dd3yrUlMqjZljMnV?AnoFS)|N z%&DNk^$3)obe-{Gm^KnS`C4-8aRijb`E~nb*&}ZX(e!KE5s-`1#s5gnhcSaf|J@cB z;5eKs=QrwryzJ+WhrM-%zw68uY0>VeT;Y|DXIl*FmH1~pI~oe3HJ0HcBf4-TTt!eL zF$}iI8~i`K%z?8BAEti4)Q6eVn7cbs58khvDxT{;3)2O{?J=bM=44wrW$4oo6!iAy zIi*%7u>X}=)u>Dc13Rxb?nXNSW5Gzit3O9lSO|*}X1i7Fm=sF|0 zqY=n%Ul3WcFMu%CTYkki3BcxEUEyHjg5G}_aJCs#2Kri+f5YoUcziZ{^($`#7`)63 zN@Q|Fe<}Z{QvVAgd>^@zYsZ1(?T6!_EU0yd}A5>gh^bbKPVe3_FoURb+ z5OaOEA{wv(Rzs?A9klg%R^ZCZb7(GPGsni*6GGCjpUTxVM9j*`4mo~BKyY0=JaFF# z8H-+I*yQ(w#)!JjdTH)xba$|5`l%OcRn-1@P}&y-oKrk! zp5%pArRSL2t`~t{ebQ=dmj@zjR=MA&_eIG^L}}DSJ$(^$iAG8lB|D*OsedfLhN_@>_Uv=MsYGKNV+E1_lu_37==1Qq{zzjaX`qi<0Xu+$i(oagX|YcEUdCa*c8w?D>~YYd3MaF6^q5;iQsfr=dOugEE3CT{G`(y0-m?Xj-g#wL{zc- zTNWA$?Q+yM+`Vbw#%=!gf~gHW^b9%H=@d?Kx;S*2 z|B$_qvp)o#|HB)7JQ%HH#IP6L3V`x~Q0~{KQX!-2iSC=b+Q2|wS@&En7?o2IF7_PM zhJ~Vq<`+$gs98k+>Z3odK-ju1FgYjzf{fRw#x3m-VO!{Ugv0v4iQf8$y8>k(YNLke zKNusKiqq@UMs`SRLNmCD{XE)jntyU{CJtO`dCN~4xq;*)f18b2)PU$@MMv?#ia`ob=OFOB5cKV#v+wSAxcS7bceVKWZ^Iia;%JmY#$0-n7Z&)MH z9Ruf=M0(!Xn}e66Ygb57449d-MVk+%q7wO|*Tp=%p+8`&BWEiFB077SV~c#yIc~af ziTM!lzBF%{uU!nP^_9lA=j@>>=HIQxcRq-tlQ)KY-5#E7YYG?YY9aLio-9YY2-I`W z@U{_z!j`OELRV-2>QgIO`&=9b2UnP6WA`#)oLS|R)3g{0y_ZW8;sR0Lm+jE|ee{Tr z>|3yZw>z3AFZ;>TY=-F5rk-c)xxz)$$oZXG7Zee){SD7^h4apcoP{$NI`l5MwhN2E z90!BXqjnb*Whn76i$(-4(wT(3iL!$qnsPEScSBKsseHz^Y5=6Gs?i4zc_SaE*XW&9 z5Zrm^?xY=)3FbdP=>;;l!se?y3cfLKG*45(Kw;nlUA<3k_sXUrCNf*0Zym14GG+wD zEl0qy`@4q@=(-`fG`dSePLZ$~X#1-&IS-V&Gaf#>D+M*g?c|gyH#9>#Z~Hk*2DJW# z8l`J_K*>nzYtKU$foJ`}jo35;peT)j2^g9>o7JuGi_b z3Ca-4X894C52o8UnYj}J(adpcRt_3Aq<)buaeyZX6*U<~D300yWy72D0-^>`Mr(>@ zYnXwFM_>s>ygMXp%Q4lqnF1>z;4)@-EmKohWj}Qh!~5nQT6Tx1o|y+tO^N z6QU1-inkV-C*{$#)$8|aGIc>?CEyjednxSvC#}BE>xJ?@c(6z9%b~dBl>HE*2l8W@ zV0HHmg>PaMi7#B^5ZxmI!5$w|U$4;=VXqpsl7J{<)755yQ zoM1m=Xzgo80i0o0ko{^K05n>=ZWaeZkVi&OA{Q0_VhN-f1f_;BCZ_~>Ca^PX7B5X|A!pbq;Pzpa^WZiu-+SS|+3M{tO zF8d?`K`Ok7dej5$w;f3r53+~+j)8#=O9PngKR@ScWD88yTtA->i@`aE_g*?f7~Mgb`8&?=?vgqI+ zOF*T^BF{~+x*^kEC%T94iIA?YN4|I04H2>z#gw^SfHcp*g)o{0b!22_v_Cwc=9|cw z{j+Xp+TKUyrMd?ktX?zrR!Kp8FwyZQGzAUt^}ev?6-DU_8s|3?-4NM)&@*=#5u}s3 zSS8b(4{7!`GpD2+pqA{1q0lKeRD0%%gwJa`;L5lmD8Fk8wr1|}To~!U*nh2gol+jS z!isCVKH4I_kyT!QYDMTTa#1pe!-HK$L8f^tLQ?6&1uAR1kd{!$qV%Obr) z-46@l%{zX&>?AMf)xmNTb4a{2LD$se=ml}qZyLIGqhN?)u1${K0X(7^UM|W9!I&Nw z_2?-xRF_tJ$M|3{98#TaY+Nk>s;RpwUxR(YR)U;%JHr%l{8l&gd%PVOCw)( zw3l>7;(M(VeECEjgUG_5w5&s6DK!}Rg&wtY_6dRa!td&?UX_CP(YN=zszPB+j*RP2 z<7HqCsE$dp35Dbn0voe3N^mwWHqCMcd*eE4kCkEwx=eelgVqxg`YFDCzvqf{w)#CklX(D{ZxGsUvO<>J zyMeJ8&Tz-$9Nn$1P)LmZov+O2OY&ZXY>)pA1M6RF>v`nGF!VTnSV+eTM&}bG+Dd)V zu@eE^SxFWk?x9dU7OzdpPnUnK{0>Ehk`2ZGWI`cdS}Anc%>zZ%`$db*gu+kVPbkYqQwcTEyBXS%a+C>%~z2@X7f376O zfZ?B-2SP1fQQFG$0Ko&Ez(x2n^q!>i>SZ|3xAsi+k*6!1dsA0# z)8>ql%nU|C23_HW+x_4KrF<~I%^56w%>cc5bXA^R#Tl(U;+y;fxi58wsG!r; zuw_yUO)VMF9!Swgj#7x}OLYmfKMg1TC&hp=96Ka)o0SM5+yJ2JmCUI=}RYwEO4W{739`(ekv15$K(;XwJ?1O*>DOBI{#4Y$kx zJ{}Rch{zu0e3BFSL}2It&M-FQgNPR^;ytfL&NT>bk+dEnY z$9aD$YF`h!qTMoM=3Zz86pL_LxXN1+7S@`PiA*5gT$j#`%F?U1XNZHM#}SM z@TrfRGuK@ctvB+%&@C*61KI`z)rdee<`}AJkIXhU#y#I)QI?VYCP z)0RZYVSN5}q0j>$>hlB)vC8q~_L1U~?e#4M8xP^I7HJWNe zO<0w;=afB=*RTZ3Qx`(l^)FG>FNsL%mLV~FUJI(+wwHdj5s_nd?3KdSSfJEdn{U&K zKzt8x4tfO;QP5=B(E>jwU{St7m&i{>Zi)srhX9Sn!P@W!TxrL=H`X*Aoo6d6<&NjHZQ)kAZqN03f0g^7U*qfRj&gX(0 zM=k~qUm&7Mp#_5p?#$Z=*AtmatC(`q;s}5((2U&A# zxz59Oh|(7yWMn%J@{fqKe?zTNyLr%(AEpP~_KFA7;2F3DiECsfg;r!b0p;sB5zhE7UF$? z$b+ZN@XDZa=aqYor<9@MPlHu&k}8UlFs{vgTmoFSZ7XG0eu=p~jXSSWPiiVjmx`xy_!M(rXNW=qn;rA}UM zylD)A)=_zMKeT}D{vY;_xyI05n?9fWBo4WgJ>_|4Nzw;8X737x*&@c`q;xY(2SomK z$DHZ1M@&{Xb445T;hBk8@eev3l3!u%s&1_VGg}PFA=h=$)N7`tkDO{G-fR!&_(4E3 z9~LFE*nGgTM&k_a&k%GtY2S+)_l2#SCw$#}3&7r`>Vmg}FQ^NtcaMyQAVNVw>wu>( zWb3~C=8@(PYrl$S6vM4hti&j}p7A+I`Ad14Ta18+SH@0@E*w1kU5P@_vO{-`m!6GB%k6yc3}V3f(g*%XNdzpi>)?tqdY(!+1b8x6df zU1oaii4u1yLM6_cL96ZPp*CJ0#B|z}-XydTFomIs%Ot(~m!j-rntC%BptlV+r`1La z5ph4eNj^o%p>u({{=vwV`E}9caW6ERJx~?>TL+>>dv5#Bc%#EUTb?@d1<<>mTmx5a zVWvCj+&5Wm*l$n`ByYC?k;FH*9*8BOeEZNsT{>s@L6dm*>#PgX-YlWz|IZ4l$pe3! zCFLQ&;yHYklyv6z6pqmM?^@s0T3EDts zt*2;(1`!>4%Y6Lh>ky!nTs%l2bQbpeb}Y}1>!Uka1~-1!7ywH}UBTd937meh!~RLl z1&S0ac<=5Rpdg1V@mKTCkjpH5`Gk4|O3q31bk}tQH~qZs)k_ILW`i}1Fn%P2x-Yh? z_a=Z(lFj{@lf^*il&jLkP-vx?E!aKxjD(8i(Ec|To<1wC=Shj z9uGHwiD!)w{k6KF_;p;~z)bza*YXl=)CPBYG#nHC0VF*eJ!nYric4YEir&&J$4L z!!*V@D`%9~^P7R`vI>$i+>KnhYmPki$SyAPUqmhUmup1tdw_Y`lcl5?F+`3&q-HO8 zLdzHRdnxa7fz*_YfwLeQ(o2TK7=opc&516-pZ71o;7Pgu>Vd zv9nzy|Ksh4r@lmKdzgJVVtK`e2rQY&{~g!20L8(Po8$+b;5LWmt@PnyFf`kH$ze8T@YP_l2e7JhUY)J}{f;?^cv)j?}8wPPw)F z!zqzQdMeFQU<^F`B!UnKU3a6f$s%*)alrfpQ8NI9HO=o?&{!k4p%zcCU(PVOH~sy9 zfCKC;s*4?eqK@)8IbvhAoq+kksq_`gA|Uedv4q~HLEjqlD|z$)@vykBTb<@dZ+lw) zDVatiPO7}4rpgz9U0@EWy8ED+mL!VaU6Sv)n{@9D!3S9z+drJhEP#hbKQCVV#D;c% z=OT*-W=Qfs>fEL$rxDA?k(sO*3o!4g&?;2$1d+MN!@8vW%Y&c2iQUv3m7Nc^-OcoZ z$DWT470{Nzz{dtBHh(V|5Mrb?9xz9Onm4~nFnPi?k$;@TCL+53IIG>!A%Ij*F}QJ% zMF;f@m9&QUngf^Yr^1J%@s`dflQ!q)iy<$c!^4u@9ZH-Uni}TKA-1tgSjgH9%>6|V zT{@tLTHaYRUAsrhH=x;|Ow|RM)!%38?KzLSO|}{%4BXJy*sEidv=tCrwQ#?yP6U>3 zgboCY7^C+`xu5s>NP+TEia&;SW^lUdQ^4)`P_U~tb((1L2C>1EuTqkv?|L`&-Zy3+ zXm2$8JabDQD{TpqgI8z62MAyqmr`_#Apto)5Gsf*vxasGt+Z{D zp3&MkG)X~l7waA3N< z@YqMR9PTG&Qn=kR1vbW_st2(c5W^Hg8>7r&t?)R*oJ<(WpLjpuqpAV+RTMwk`hyU5 z+3o7d7$?+y16#!!gHgfMk8@jVB`}rB?ZWWE9CQ^ZKAAE&A;o&V&XROqB*pHYmm-xjdEh3PqWChgL@E|6g!{_CwoT0zKN5qUe z4GrwRd4J&UHeu;?-p9NX9-v>aoT%quiL7%sS6AlUAdJ*dK<82p5NV_DPI68Y4sv|> zB~W3B29&M7XXtXEz3d!?Pn>q>m*z4wE5#=F|$6uQ zl!5h;(A@P%JxK83@wrIyh0lqfrWQG6jxb5>7MU0qDAp^COpq^xl~>X~6nc6r zMB&3CrUqryq`VVN7vlxLRb7;wL<(Snk(y7G&J1F;bAuBZbfUA*d%i~NuO5o``ex&jktbEV(ktikk zE3Xspb2I9o1dBIK!xUa{cvHqu=3Eh2`g6!_8u-DVXv%%Z)4HgDPMp6Y#1}NIL<369 z!x0sxsUJ?`0b&Il$utJ`K-A&l)bLY7_8H$9^!lAZPx4j8+2h4vPAy`__EZ6~ekCqm z;Uyq4-p|KI?kR%Ki-lRs?_uc8@z_rcWuz?V&leE5XdlLSF-Db4j)$>4O%h>rqfpU1YEsf?Z?TSFB>T!m>NrK>KcXy z9Lu)8S-BtpL3HnW7&2C74iXbB0Y2}8IP(n)xG?;=ob~|`aaEJoc1oFoSFuOixrI0= zRJ9wfr?yA=!c-$Gm%_j{y!x)duroR)=U8+=JsjSC2yS5-$%nHXTPb!2E&w-aNUzhZ zGcxhJX_Ctp1#CBSoCCWeP{8bp>c~e8IAznk$>wDYBAw@{57F3wwPs4b65V;|xMpE+ zourFi4$-yU<_rcea?8t(2W=p~g}JTVCry>LzDcD{w{h zerwx%kN8nDTj`aL#>s#VFwz{EbBDfTSC0JS@j@j6KYNnyx}f9&m$XofbPg(+)+*{M zfpr)Et(nyzBr0n|tE=dOR)el^4%{H|`SG!1nWX{1mu2ytljJ)|`kaZ|Ur<1^k8Hoz z(mKH5t4VB8uM`oVuWJ79@iMS>=F-2JWe#ynlUEe%?7{dGLl z*j(0hfd1Z;Fl(75I?8h8kI9x6vc~6TQ-`ckKw5Rh0LjPi{~9_H&}V|0U%Onl`lN+i zTJcKN3=^dF^tt_FUpy%P(wt}Swuko>@1I+Qx}gYGwR^b??x^Do&(rA%k{|N$B}FW; z6bKha5D5B)>8ATQgUy9QJ@_&V-I> zOcOHoiK*qf93fxQS@efu3(7#a!>k*~UdOhliL z@@@u0|GUY`_9Qci`$7?%+rx>9yrzZ4-A$mz@b-qVMlrAqwbnnC^##cyThWJfeCQE@ zXFpTV4@^EaKb~eK)q`ED<2QGSfNjp6Pp@jMkl%9JUu0kidRLe0>l+tI%dbZt=Hx?6|$+j7WA)pVQ_RYLX6;=WHCR5$SHlcr>{?>K(V$>podR zs&6(%m$%pC#Z&EYu+`vWej`P3=GemKU$1=*#9XM$FiG2?Vh-OPr zf=NOSTm-(8t4TPceRSs#&#VI|+b--juehM%wj+9)B;EKIx117PnKjb=*j-LV?g+Jm zCBo0sED^IQXWfGnalr67jWOCd3G!yAN;khCkv^RVU>uw(gQqa*(Yr?c5z9wV{6cJ>i9!>hooy22EI7WU=8tqySxl|ozeRIzk;mCCYTeWTX#&Q9=@`B`(DTe z9ZbMhS0pG$48O**yl~_Y;2r_D!bh{D@pf%@irr^ASYuVtQS#F#Fu5iUP1-CC{IB#Q z%Yb_(_z!=^Get)2u{V!Jd7IEor)E zjlayhwUFqCTcUWl%v9pYU5}T$xxdX=A>b)qC2*+IU^=(+X2IR{W{wy5mBcHXev? zXmh;P#5F(9a<0E+#=WEB{BtaH@h0~H34!}M*b8Ox{r(|6oa59H*}(YYn4iw>!Ld*s ztiiD$aOkEMt~eeQvJ*{@iyf=K(^;v5`HnBm%_nQ&jEX_zM`P&mvFEEiTw&T6{q(c8 zpAl*}#pwf-n`Ec4&c{m2x`|TQgvP$W^RMc7Ol4)B9mQ#!kaAI7!a@eKEWEunS)hg& z-|J9#v3?pC@Rn&VA2Y*J)e~-C&QQVI77S7jQ|e>&2?za#vla1(19UZktSa~(1Fxw) zwLYFr{_I(Agd)Co+}{2gy$Y$zDKRyMK_9=C^;^UHiV`MsAS|$3TMrMeTrB@)YC)Pt zVG!MyYlRk+awjnpxGxA8+xUNTH>|vlcdTIbPFaOxU!^ zmIFWbL6rj~4`^cp2I&k*y++s`bHIRY*%^F;BI^THuoOl!WfMAED2<=F{packqbi>L z)AiayuoP+i(XfVV3t-EvmjAhv;zdF)V>Rsre0`be(d8Gi_~D-iBpTJ^F;ipa$!#`G zEVMlJRW>^Z*2yqntsZd}e__eksdb7Gy8}Z6=X7BV>C->d)|JOBG~8>@7ZXhBnsdo3 zkjDGn?y_fWs$kd)-tS43fd3X6_WZ1Bfww%NZ;$BH$Fd^W##53EF?aqA4_i|FQq!yZ zY+qEc+`ajwOj11OyYjwg#}u)lHeolTbbeg*`>@TY4n6#6g@5tfJ#GAUU10TdB}J_1 zMR(%N5q+#>uixb606(tsc`56Ro)Y#6r@S?GN)LZmW$r-bCy#&4@?afDBG>_*Fv{9G zUCe@>a4Jn$21_@gj#zfnz%MJ%?97$Q;#>ObEE6O=oIL(LbCNc;d*#llm5OuNYW<@@ z`F;XEz@1q9GG7`W$+o${RR`Fm;te?*&MX+%NaGiNUJ3f!$%gOzu00aDqKc_lSYA5LE{vUwS1hJ~ zC5?At&&2z@|Ej-R$THH75XWY}q$Qu_mBHBJ4y%fnYGB=$r8Ss433y$SsPO4VN!&R6 z)suI%1dK06BrNc&H0GoK`~f#n0?%sJKH|k8iZy@yH(eJbgOQb&eh{*i#Z2rQzH?>i zVT0Wj8G~7a{aSk;Gs(B5u}6P1J0lA)oKm$bRVv;Hw;ZnT?d`^}`Cj#ZoK)JRX-Wec zo>Qn_C#OK6Y)2aVl#?x2M~XMzu88L+KaStnT9IU@*2Gy~H|FnG>EJ@$-^YY;E__4X zW{m5)9`-sQMd6p14wl_}k9|jg2cP{Ua=MSix9;!V9rxUHa0;p>hUd6C?#oL5Hcmwl zKNnx>pM5|An~%TT!-}h8Y4a>boIHXUk0H)@|D!m5P<4}$Y(O3J53GE5m_rvM6j%G8 zHW@7c=m7EL2RXcWfu>J%&9i$wEeNA`!+`Qe&C7^>H=wI)6 zTXP!I45(E7ENX~1B;K^?CB65jbR(nEp@LYjV)ZrB0A-v(w$P_oj~6@htzYz2B6l6XNb z-#GOSAFiz{8dm*L4bt*Kma_*74rz>az$8U(T;#ohI!^gfRZ8#)~Jh;q2dS zvr`zRC_7o#_+1NMc(p7(Lc*&Yj@{R!04!jNk=-xE6c>-bam@3l7G~0#?5aA8VOlCz zMJpB!@awJ#0u-t`7+ZLtsCl*^w*8dJdH#R%bB>0%lX~_zIZon}E!WStF&S*;u4KQAHUYo=Y&blwKm{l3fPhgF z-WKn-E=}(G4&0@tUpN@X33w|hUaSG zIaE$w&Mr)N{=W9H@d5(&yP{7h@D(Xv_|_lo$-#`P6GLyr# z`{2IGMY?2` zf6Ca$&yR9tNb$dWsEU2NPGQBVg?X3REHIy?Ds__;b^Q9(a{Z?vl318kx8A>%pXv;& zVSf^34RMQ??e3a7;`n!Q{UwVIP3!~FpTb%L!=*IbboqX&;1j0lHakp~m=c-oQCl@_ zob$!u%a=yDFvAzF&t}!tu{Jg%m48%b`0@It{J0S=JfNR&2mUj`W_{^(m*li?=81`~ z?U6$GmWNKhc%>v(B9bsckIP}1j8~k@TO}}3SDeACVN$s1YV9MR9|XLu@7edn_=7m9 zGy70>mj+fV`#pw`sfBg;|NhrtB87b{RZp;SQ^2Xr?+1L=62Th%8y35+W7ttTfhihm z1bwP{IS4BwHKsq(2+$D93Tsw?P~F_R0&zco1;VmT+HR+mZZN-Bp${ zAbASAFtmQBQaM?jR5tDKg@YR3-OerYq{c9j9J5r)s{~vwp>EHJix=ai3vP|slgIi$ zf0vM?QN%h~{FNxi6iDr`jupkp?5Rh@ecri5tBAea8(0<^#;{a&ntG}XLyVYU`eBYp zz|*%0{jc&_@u6le(P#Pc_|@ARc~6N1Y+_45W-^}@J9&6l_FKL@c2UVH@&9-`LAg6E(}*Ibnx(ZTaz_r^|76yByukoh>3mSw zMInPL2|k@Pr(IR=|C9Dfs#61-KL&q)4{WJ3yPqESe?;1Up6~q`GLpi&P3`v?mbcVj zFLat>uD{i#F&d7?XAQBx0S;oEvMRXB92xt=FQk3-UGN763I%LxvzMbsL=J2FHg)~7 z=w83R9oGTu6FZiq*6?qfgnRyYzG~kqiwVE$efY9V72Ea6>M}?>i>t)*J=S<2iOcTf zT{G;c`5wPKkm?T{AaN=zv0t*`6T|TKSk}FB#7nvkxSak=#aj{%}6|k zfLq>GP;nyR7psoJ^a)bFap|S)@f|&kEC&_)b= zu)rm=9{CQPK7$FQF|2P~{n0-kl6}=mLkP3ZUHq26Cx*LZXyv(y?5LA{Oxh&jxUPjE zH?xlbzGGwZC_`^Y{o;vJk3A{r`BKEC`vHKgsGihPRg3& z)Ap=tV<3f3JZff;VUxj4>Y@UJ)I1@o9UYvF08k-v4@<*`FAb8GKDHz!Rw)X@_S)54PshSmPum&d#$ z1^V88GRNDbweuU}t+4+heVz?&t3B>!!%9sy*hVhWm$bp)+XS#?JYK}ZX-%gd`%XAsQ)pZ zQA-z3Vf9Zw%_@YKo|u_cUX#V%O24So00M@-(+$->VaM3)Gh~Crwea|XU8m+OWlT&U z*WNZq2`^JTFcKxWt)5wJEzxP9h^EaD_8Vmw9umpA2< za8>WjASvPP{^5yCQKnr2c1)>-BPmYPpOBWr-Z@x2`k*0=mGZILI@${3;W87+ zzh98_ge=y#`mYICm)rU=H|&+V+HpFOp9DGl>3fTZKk_-S?{)i6rt2`wA-%hynnDQ| z;bgkB63c;$*YVWFd{oC>I(@(X0Y%IzH|z-0We!|QIaN4#Q61kG%KY+w{P~UG-^TJP zn9JDtO&|rLx{U zJw9c&GbBO6J2E7*PK0P<)jwD(c}VMx`kCihiDV3O7cVoeJYj|jOftPYG@*xIEbMQ$ zeyM^xJkkt#a@z{6F^I11hSeTNhmfl_*G%C>bQ@oT|w=2SLe6K$3tUh_WP# zq9`IpP(&rG1Q8Ue79|=$!K^5XVn8tff&t!SZ$0nr_Wk#cd(RkmjC0S=9-Ef0t80C0 zR@GOtX3biyXoQLqP7LnRF~xG+y#@O^9dW}I(Ziw7jLltg^=!(5u3J@yVeA^-J<7e^s~ebCl94p0bZSUc$|{ziab;H$Q9nU$Mh#7ht!w5 z!MC6>2sZB1#k%pqO=p-?afy!AC&_smOgFtG#7$5IpWBc7L$1nU1InU#xsUevd&kcE z$(**x^NzaP&9ln5x^^P4HA)__dKR#B4%uMSGhtDK{*u_Mv{rh>IT<9a`1VbV{vssV ztx#_7A%PY75`SjsT43en-JKZLOH4`I8io!agyQOI9_-M9$5|-_SqMsDuId7&dlWTn z9bLd@u~!twRu)w~mDa;iIx3?YW^_3A?32mkfYVXme^n6FLh!Ax&XZ22Xi>$U%$tW) z@U(8Q$5x0l=vRn6^-b2q-i@7Um%T^Z*$$N|D+_4hw6=-58>*W4K7YBu6~OIUmMjUA zGD2=>S^cn`1@e0=7G*W7hohgY^Il)7il?4AX59*+;OA;bZ?mwYqz|q=dQwLC{n2$S z&yXgbvOmlAnwcH#rTeLW>54UitiJMLPfolBi*8%G%@&0@&Ro{mY>nwAU-L;@u%S&z zYYX7G<=OEHb-*voO?gTIKDc{RJ_q2Prt2AoV$9L!nJq_-k4oZIyDjV=>suqKO$X?r z1I%#lobiXar@Tn)N!L{-HY?1zHzh0C#0;lRAN%4m!V7YsC*C1%h3PVW)NtBcpt5o6 zoBKxx+BYx{hF^MVj#RBX7{aYAFbgBj5Ei*%93S`P=Y^N%c!MPF`FzD3pO@$UmM?n4 zc#%nZk8*?suCQgBP+04M)|`8LR^^Ez{wm0@=WVhVqEoClDR}ITmm2FH5q`;p1Z#5x zSd~3-l-IpI=74{GZPT^_@B?fg2HgSop=v+AcijN7?Z~W8Jtl!eS=|O}pDLiyZWRsv zXan3LbD~?~I~zW0aDqeT=Tv*|@|V8H$z`~8P~}JIJPXb;FwIO*(#2luSo_Q7JyHC- zvG*c;w%9SgWZf%&dsJ@0Djb=niA&20=lFB9@!N>ayL!89@%}&w$X1j_QwsOV0$kxIVnx~YNnScfGt z-92ki8Vh05C$pzCoJ?@Hl?W?tKHh9%esnWd( zYUtp-oGW#l&PaQHI-|P83NPKC!Vt7X4L|vmN6#f}i{roC)v^vULFd$Tj~OSZ;h>rm zp-Qi8uzF3h#sc2z@J&{kP7i5b;XAQ`!2oUKl!%!tqu_N1z8u;|uZzYWl#6}j)x*PG zajOUJs-cM+UFRlJbup`zk(N;LawMgaU-k8JlX2R1_ao6M8t8)1^1GjuT+!*^e5GCB zh9t&|%~fyIzy?0AhQjt*;*WGM$NlT{&^sIbSGJuRSar@!TpI3kMrk8^0N^~W)#J0g z-;G@seGIe;GDZCww+_djG{NWCc)uSw^tF9xcJO$$j0S$aPl3*EgBn`1{N;BRf$#0? zY+v|SPN-uuM`p$ae79C$uEqs~vZ96e(jU=8A1<4Y9Vl1f2KhI=BU&d}rVRj+v8 zw98_}T#I{hZxvDR1>W9c5LTMobWsE^kwsx&dgZE9DLCs1X>PKe0hO|KoZ{Rji$r8u z#+J-M_&e@v-R)W*Ud5~9^ zB;P$YRn|DEZ*n#JFay@xe}1GYPXj4jaXj-W*B(8-*(Yan#S{lQ>QfofZ}E$-ptsgq{aMu!Nw!XY|@ zJ^f00W#2KQP_N|vgUrC=dT^g|fD5`_dV%MRGK7Ek@-f~v_eKw{-kXFw!zCINwIp64 zzruUUH=_zgWoyi$v5%JmL{TmHo*|Im_Je;G&Dq{K1{M*^uXd<&_yS%=u>e z&_fjOWq(`6_Z8v7!6Eaw2|X;6RTZ#?Srl`Lw!i3GOTm|n#;?8Q)5Gr1vOXKJi{fQd zO8gujY>;2bx*W5$tI)^AneoCyPFSF3+nT&-BkbPA7_u^50>|#P7|e07z_$`wPd@ly zgD0OQ*KMv=1aUBLQdFKre&qTl~H3EOEbR)(h4W3GVkB} z$`T8e)TDBlzcQX@s$q~n1w!~)M%dY*W6Oa~`+oZ3hC&IV6avghV!o@$SMP8hGgtAlkB*JJrti)W=pkQo0K zPP&l)^5i`abech6-y&NN>|-qUI=YV$i^*P-QhMZpT}#|6J=8pK4P(<=wkwQSJJDF_ z_!kds%X)sAJ5L9xHu-+1KV^W9^bND5(P`qUC*mHfs4MVHQ&4u5rv)AuFjqP2rGaj| z%U)l_p@Yw@ZO>CRHNYqRmhvDe4ODimOY2am8j3etAvRrOhWsRqcQ5HT#@VR{OC*60pJ1hAHGv(KV*dmOCoxyNI<31+^M zU^3$?fR_lpvUTuNLmd9Tk**1bNT3n%C0VV+>pIVK6!)v*C#eOdhDZ4Dhc3BjSQk51wd`^OfqgHq=*{nats*JA9Oz3C$QINq({br9>R`^{nzwB$k)87T|>4$Jl z?b>Ilx?(oC=GJNEs7y7a+-NGhJdlDa7S|)gAC9LI;~-h7u2B6vsdE~VsZGH6v zQ_Q)WY8N`Y^}Ae*Q1w%39!@iE8u`FSp8DBD9cRY8mw87L**9sOa4 z<9o|w_Y|5TuF6bhhaakFWy{jB4Yya}=gR^DjbHi3ko*QC4ziY?8TiBu> zbN)=yqI#JAbOl?RfEunH-N`GZXo?*Ub38B&)xp^VPHGW;YIyloz1?~1O<>u1d&&F` zew24)TItEWF=nzYyerOcfs3=EzTdDn#);)`Y>LE9kxRELC3uG;O8Ka!=ew65sdJCa zi1irbwQpa@^JrM$&2M*o3EiQExGUq_5w{rjX+Ha{Q_&i);0o8e&0vj>L>HX2kTgN7 z9EU?=?X6Kzao>fF{e~#;it)j~Yl7&(bI+qQukCPUag}7)RUKSv6ZWm~y&;Of=GN4~WdX6F-3oRNW^(QZp8M|4u4fAvg_9zN|jz>+x$<1N45r|FnEp4_ST zO(xO`FMh%K+{Hu$m6WbLuA6C!hV;^htVf)1_;~%$v%`|;Ctq?ikAOWIooHfrjIhF{ z^f&Xvtwqp%F7{4kD4%9@!`JJW1-kL`medhnW2}DvhoF_bA`;m@?mcJ@{fDlMdl4@Ow2=eVh&D0MTpb+Ar7G17G?RzeZ)Q9r@a_6EZCky1A`nG6x@_kv!*XS8R7l7BACr#BAo1kIslWd)Erec}L{m7e8p4p95JqzVG8SJFjg7SSQ^&NF~ zylLNaw#oC7o*L$y-9P;3yD6U4zItM)+7T=B6hGwJYm5BO)E;nWbw;VraHjK3X>{|Q zV^{roakO8~_vcGRTWomSHn3pif2LU{p4g3tfL zQ8VvMAtRJ;ykqsu$!65Jx0X}oMXL#BA1fGU>$XNr4-G%7l?%d`AD%H2D{{v1iJI#U z_PF8QL62g{4prn+e2FnY#1-93vGp^8^4}ZJhRK~2MDo|?w#z{IrEFA{opaJii@5vK zRYM*pzS(r`#|m96B>OYuI+HA}Z{I()(L^3a@2-nu64pa zPr4;j~sG|Ft4Ix}S6tp>~^T$AdE_TUD&bo0^1)YC*E=?9UYX*x;M4)D9BTb^w7)IuxvCJc&?!Dsq48y8(xM;Wh{G4F-2 zy1A(t+nYHDOxF`ycvIdCeeo@E++U@IswnyWa#1!2tyG&_tc0*fpupD9APQPUo?K&> zHru{>+idgVQ`$If>b#(Xx*;x8S~DXDcz7>k#}dH5&WOCW2b|@qwqWW~Q+%ZRi1^)n z0sKzC^ToCyLljgQJiZBVuBtm;QCxi3^qTWGnFJ%G`mpcLM!=1`Q$6)61d(Ej%gOGK z=J4$@$M%=xnBWOs%B^X6IjkEh_~xbdO1$P?1}X(y@dLe=D&YIabbN&YXFFz<5Fcxf zO$dFxZ-%z$AbnY#+$}2z=ND|;FY1KZM}vCpALt{SQvsgGAbn#lra^f3J9nJCIBv`B zSNe$j+571o#4AMd9q-kD_Q2-Omo^hdw&=X-Dm~>|6LjP;j(eo7(MFE8#hw(8?9_wTDavmNl0 z#x+5X?^Myi%&m4o6%DLVCauiKI+-IGe98MJokiIG6jt4fil-tExVgAK<~U{>EH)`* zai~fO88jYW@(9+SgNrUD7H3&w_F)I4?6yJbDsOGXO1o_N6jd8Y-U*GgCHQntmT zQ&O82|1?KAy_LM0pCwTx*Q*AVHVb^f>`v)CzGF;XFC*+?CWAcBX|E9S1wY^NYKV7e zW4q$X#xucO#wcz{$G0d5ClAb@+jaxeq`q<%vR;YMf^UOB?Y>juSnEvPv1J-!xHs$@ zchqHGtl=#keC;P6P8r`j(8Q;O&y0X&n@6AtNCy zuZc##vpHQ~>5M;~7yNuAECAbcE5EVdXpZQD6&6=@tU(2NTUtua=%8;)C1a%(G*O~w zo#b68e_ut;RXCOlJ*ws^+}I_FnWf_mO(iVxyB7g@M~xk@t*g{XoR%dDGx)GYq2CGB zKd(*E(iKBW2VX0ivwdr~*ch?SJ<}R%W}bJ`eQb`_2MO)Ey3-W*-LqKi1NxT9;WJ@y z+z{C^A5<&ZWr{~dR3d$%xNyVr{?uhB43UFc3(*1PJ^H_JJ^*}j>5=L)*cn~%lze`> zR~x7E>^OQhOcB-CpZhwvx~=_rvTj)eEAXQjs_YL}#GyyM%98GBBe}1&p%JzQn9Y8E zt@oHV=7=_bnE7rQj{YF|#(mfn%?Vy;fyeLR6?d%%iDrMi)9X^^*Vm>$Fg%!40iP1Ga0h$@KN4 zDK?px;VQE<#W&uZlbvu?!(U?51T!C)qUU#C=QFq3qQ2$_hW0N?jO`fj6?<`*;)jy- z5{sXhVrgRCZDA!<>{|Kaw)U_kN@OU%$-NJB=8)rR;e$%3E;(v=X{kN7Mk#TVQkGbz z;W(emQ6;q1qi`{&kt2HceW2WNwJSPxKvKNwkQ8dmc_m(X)&w|?dx3k+To84ycV)qy7*?%gHume%AimBe#OoAA)U|3M6xo<63Op~r(33BhZ^3Z zr&Ugxcz9ik6ottd&Fsxt;RxHixfe9H@&FzKU*|VENx>Ep=kj-sSzyDT`E~d0HSz1Z z`_vp(@Sl%JzBCrHz=hA32_O4mhB);v?OoAIhXgsMsQLmHxTLaxrEcB~eK_6}T-{3t z>z*3!m4L^`XpEnqgY^pqRV|cHewD^@{hBt6>$Sz(x67gH>2)EA)sl#(NvQD_;7xme zyleqnyQ#$SG~ikrZLWB{)W(BjPPduFVC0t$?s)1b3o;gKOAZ>LK>%I4Y->Wd0xfZ5@W}gImIPbT| zqRXC#C6Ah-u9G|#^WQX3Zee467P}0-s~X`)ez8Ldt=>;|o46r{d51+!BNAwXndhge zC^yhGPu7lGwz&9J+)8a5ZM4*y=VWDo8|prnpLr;L)4S-f%ba-!ch0dgLVqex7&PBR7gPvU@Z#`WW!O3MPlOfFqCFW19h2RldFZ8Q|Pb?b4U-njj}W z;rp+d6_H}t72iBaOCZJgnH`SEB8{fiH!gnSMjM1ctnAcq8f(Xr1w4bN=SdF(54vw* zowL3`4{u3REu`P8i7sr-Tf1Ws57K=xRI!f=X(Mw!GhfT(VExo=uBM}g4s3m!H~_fb zX`97S$K?>dslqk_cxA@7`}e$T@Q$YE>JpbI$bBNqe(H=aBEQK8A3ouZH?(f|IxA#_ zwB>J74Gf&K=+dcfm?INj7_Eznq|bYo0g02Vjv)KduZLTjbV*JeZc zQMECDtw~oj{`g#kZLJfotRatG4Rk{XBPKLQG8M6^_@>8A@{kt3GA#N>BLxQ%*_-Dr zAin>3H%z@2_@JrVi*uJKn2uQZk0AKr|An7r1m|C`&JMhPy~a8H{p#*&VL?F2d77WU z3c;_BZhx0!`VIX1^}m$`tSwBO7jD?=*IobaPrHBhpWnua4h;@p`1jh-n9%r$;J^Cb z!rzpIU;i6FZjMgo3qAOEzmxsdZx{OX!Vhgf{u}-GZ(0ldD;@B1`FmV%{58J+)&b&Q z>HuxM|Ni^Gmj!5b;P<#Z@T>p)w#I*q&)>j*^7U^Wp#L>{5rnSC-~IOYbpn3{|07$;S9g(rTv=$R&onPmWiQXJ~4&RWF<7` ze|=yPpbPKQ)BRl`)35RjbUkZ+jS!VzRsZ$E^{bYJ&+M>&;LG;QQ>P=?;2kEyJTxIV zJ|ZqLBKB`PaMKe6HuwS#WG$2kt{h1qnc)z{8Dy5P0tj^wi)R7m6;-9 zg1v_Si5s>dq|5nCTrg$DR?pdRb3_QKN(?*=!1ux)v;MAVij6g95H z#|}NHejs+W-RSJRjexNXBBVc84Vxz5zD(&?x1t=8l?oXwx=jg@wG|H&k0#;YeCU7i z@jRMvrl*gBh{oKwwa)%%vx@%rTqAu%>>l1;IZcO&xfT8q&m9oQkp`=r_tuEqbeh>R z#2FK($KM^ip^ucxj>IUcm?QFstxc<52qwrM!eU1pk+akRtkNZis0tFP0gQ2&6pl&f zXADFky;I>0Osa^KDZdscn1Ctcvdev6g`laAI=5q9X&|z!;ON_;MEsl2mS24Qo6q#` z*bltuh8IcbMj>YPHg8RL;9YrN(UTkEBvQ!(N8YSO7gDl=Q}0ndZZE2{5o=F(mG5shaHMI5Q!$v{|KG^tbvJB8k3Lx;xS<|;$kNei{f-b z(jAZrCa0dgzVS8z6K>&w=kLa%tN@Q_z40IIq+sSuAL9o6n-9w`J{c7`tp{{iG1Wok z=sxWY=pFlc|4o`&h)4@vA?f0XDb-auP1Fs@qo5@~(ZdW;oR_)lT@S)ki|kVKuSw`x zCOZ66j|&r5yQ^=O#9*>?bZ2gS5~?Y!-xkJTimAFj(PuIfFg0HEV^7xxqPR2x~@9c2Hg!jc8r_XFbwG!`UniHVE2~8{+W)H@M%Hfsw6-i{;_PRvrpe!cd zCryXVMPVYq$^G)SEl9FWPIC7E9G_$yh#H)WhvOJo;|bnrXi-ny*VPHo?9b2*Q+W9q!%onP@}GCWa`;XC?L+%PtX* zz?9Qm4-c4RAg3LBz7E4NNXp8iAHCnkVPfpS)h}DNB5FVDRlhM)OhyV+GY3OIR13MS zb8#zL+;URnf-4+n3@-A@nn?Z+K8nBiyszyGy$1UR)YY4P4jAO1Ea`n-udSsq@zP;~ z^mR8(J)oEOk<3Ps&lU{^+wdT=cVBz+VP8yKsnNRjJqvjq8N8)>k`Iwvf2Nvj3C5Iu z_8k?0S!k@tz0m)PJSM*S(P51!Od0Xf=$y<#?WZzzSz}Z&5m|c5qzL-we&hPxHaSRw z7&+h4D2Iv557$wJH~t5oj9+{n|I#JW^m_cz^E~wJ-amDTc$@4y@i`Yo)94Zg(Iuj7QdECB2Wivj5_Qem6&AdCNQXw3$iNUA_n+I535_oO=JVqhpUfzYu|-j8 zxUFM%NxL@an(a?c2{=AQduA#cFSeAfgRaf!z$%2k-GwO;?x5R|~CvL{haCV7ngNIi z$WX0?;~B)&kyUfHz<0?VcV{LSM06OOhwopvbY@26FmXswv9TWNv_dl8p01{qAw zhKty(UW*APlN0Vz?ufM4E=gmC#|2zT*{D*r9#ea$GbfCK5wSzmlugtElkz)WOKBux zs&|>`v~(yUOhzxpLEM&nv)Rt#(FV|&fAVozdcD(lG1!S^yZh6D7(`&9kQqihOn7SA zK6N+2#LjQwl@k$&B(?6v6qsS6QXlhY_+f(EL89trI3iuoHg8Y1#^lj^!NX4*&c_f^zp2F+>#OXviz{Cy&EPK zBK>!3g593>4{y8<^|Y``D#5Wc;^T)qThfv+<+x7u%km^dHdh|wtOuS|m%ew#ZTy3e z)`@3zss^fr`s6?O==kiYXf{;E)MT}i%}N=F zOfu%*qu>bkq2|ojdSUWHHxGO_10n*GJF}o4P)B-pe+mzRd1r;*w{w6~?|!LhhH(*d zRjj2W4BENH_{HU|h}2!3ZEOYYV);}|J_&Rw(o2`!WGf=9)d$Y(a>Zo9tin^HcucHW zdGT2UlwUq{_ATVglGmq2IT}DeY52%7nZ2=r^DoqsQw2TGvk?(CI{V1l3X?E&raK?_hut%-iGS81E3Sh zr#{;Yru@NY>n~lR*l&~$ip~2&mx${WKb1?l;Gg|dmnaWex83W=0ek*amxv97>n22ldnF5}B5Jgz4b+KXi$f&rhwhTpdN`_~W6ZJEx8cBQlN3%}@j5r}iZ? z$H_HVq)1I#P1YO}j-xAuxot4Ti?6gaBoIf0zgGIB?SRSePj{IuhIU-G#QW>w5Pb4G z8{6_(Xpe7A@|>BVUya>{8DG}n>bgeT((Nnl7DDd%*D z_VsPM>+XT6l_GUpc>^%<+$wy#X#$YfVj!BmJjM&E>h^(3}EF6OV z#&6BV-oGAGlvlF2R0kna)q#lH1bntH<73hVKSV-Fu_!$R{4krJFGK?{DMPs`+XwxV zhEKOvF8^&!T};%~P37&3MpTc->#iyVVnW#LfUg6Lr;)Gkdx}9nGfZ#2IpK?`rJZ7N zyWoAnAep^4Sov!Twa)%9LaF923_i!TI?>g z9>K0y{)u5fOzxLlVYU}^NjBe8vmg$Ul;ipRJkY=M7T?>gw($=>HPBr} zYU_>3s_oT^0>G1A{O23Kjfi-$Mmm`u+U4C#s&5qdpYAHB?887;cL*C>#Dd*=8Xq~; zz`PT@u3CJ010r{96*ZXg$7KCQ%B7QFPZ~aj*QiO28#oc6ll581XA>gC^Ou|!2Rm@_ z6~ysFdvb|(?>)R35%nT1Pqx9|B6rL87lVE(s0b8@rGtNO*0$~)w6ERAVLq32;HTYA z)vVis$g667O}0LmqD0L!TUd8Y<`68)p`NGl{`s8#m{{%Nq}~j=#ADMpZnFuIqMwg( zLwSO`d@L#o<|7(D40FcGER*1Go^cO$&IEn?TCMzI5ayAW8Qt|A@VQm_KjWG}CnGQ9 zDRw|V*zoyD)4>pEukq8uI{`nd%5#PQ{`BAtqsRR~ zQOLKUa;aX{+zC1wMcPxKa>}5EnDK5`UjsMzjTS5uHD$>l=p`&5g$+UGY)|s z(&!R3Lz180EEm!05~*j>H&qNcjV@8nJbq-t0{Tg#OT>Izo{akTKXi$f&kLQYS)&Rk z>@Ozw;D@IKBJQ9%qXW=h?Un47p?+AgxQ<0?n+hh%?Fy`IR%6QI8OkZnU|j4=-e%9$ z#bmSK#Ia8>{?oTD|F}OCuUAPK6%hh_Y)#O;Pa&8X$a}ondL90;L*f#_#EuDhPewJv zP)sUw9-?q3;<865s_eNYBDgrjHUz_be5ox_p*-~uKK(ZO>q|U9$60+xRm=Sm5v z=rfEHS3CRcYpXE%Ac})KAc|J*NkH{5m}ksbv--*bdqPt^eXUSN=@Z{Y6|mPlg_pfz`v^Dd=0QeX6bQO zb?`$pzB+O;fPSusBSJp_pDiuD%a_Brc5!dFdYz02$g>V#0lJWxxvX*!?0H?PK-Clc z)x{TF-;_Z;UW<7)*}yukarU7HbK87S1XHTMuJ~@ zV`KKtd#Q*xeWbXN9?J9GuRVA_5!3RqeH$7rF1i>K(#OA#y#^iosP*RUA<&1j>pHr< z!LN($KG0{Cfr!~heWM#zVafpoNka*+(|r8{<`KZ9=<*|4LASZ`pSj#z3++3&o;4S6 zzrLme_hB48Y`zp z_nO)I5Okh~4@JA`VemLShT}`nhVKY;?7;rwp`&hCEOOn%GU))&$-Ifz3%Y8ReE2{D z`1gvka3n}3*ZhionC9=!JmD#^H}&ypsQ8&___c_qx- z$Nb9kMHD6qu4S$hRfjmp4N`+A0^*}nb%F<=pXnUVs@)HMhvv(;^{>D${XX@~_ZaAH zV^X)#I^fy7Pb;t_8WHTzRt(*W#Khwgv9^8dFxA!JMEX4VnbJ-D`wF1`kdaxpYcP&< zhBoRkfnRDk+_$C*_;*PlQ)U?NG<>X7vc{`kxFX5{OLm4i(8>B>X6t4cpAQoy1|u{O z$vM=i(!SN-*7bXmY|)YG-*i$PbN-rpY(g7VGTD|g%koW)n) zdkXx28a{^g#~iPe+avPeoIurE(9b+suGY{nOk7x_x}ruMle>$;RRqB=y-;sa)du*d zq~$frzM$*ny#)+g5aA)vuv!9m(usXCY=Qn&$R{No2>vHM&vg%XxUYL@n-p50pWdFX z5a>vQac%ODKO6AC`pSbZz@FXXb3ZjfpOr4`RMQ18{nqHh^ecb z4+%d59a}4|HG2y5s5fhSZh|<+h24bR=cw09P<7}1Jj>1oX=Xfe@ zQiXo2lFid87>=pj{%5$00B@=Ydp`^I8DNWi9R_jc6DhB`HiLe83(2X=Lc5EV8}n@h zT~a{r>T*fw&%;J8I$#H5k38s+|OGKUA^8o|X}(4k-c8PSy0|%7AZ;{Or~QJcmwm%$|blXr+g~cmnmn z0~ML|Vlc7Xk*?euc$Ip*D3k>JNcz-=r_c{St9d*$gL$)fmS+kql^Zw8!YGC!LGZs*uMwckp*b^fb*6B35M7b*% zQxXB?X>^IYhse2k0dN{!qUB?57pR@4#Ep5rp3M4^WdiXEWjc<_Fs|LoLgwLo{wYEF zJy~#$pI}xQ+b<1vNi`MViduz_RhuoIJP5icB9+6e1mnSO(c^;-fw(J!d+C)-MHts7 zFPgJ}y$)X_T24m5ITW>ZO9oY7A0_A2;`5+Kif5A*R>xz-3gNmL8`y6-$db0yDH@Z9 zSDl*umh=Z7na4`0TuSD!9(Y)4=o<+0GHcYt1n?1NdgAJ*fC>M!B*GB<(y`^o>y85+ z{7=#Oivas*c9xlnDItQ`9dGn40uh49GC~ykmDTRZad_?uaUx8&H7OG2 zyLUqLW5A!h-n2~-{Fj{dL5-}S!wg(MBo$yhKTPS{z6Sgt@c^d2(pW_D2TdfI0#EW) z{M8E3f1yB;-V)H&fHm)uzr%Iyd-TN5ugA1}-e#Tpdck59B5F#5cdkrCq(o5aN?#~% zIL_S$k3S<72xh^j@rY3FjrA`Ao-eo>s@$D0Wtj8xi-rV5^e~D|f&IxEwX58*K@g|C z7uqko0TEj^YJ4|@dT`RK{ua=IgK>tIR-lv7a*OvZ2cEK@ZKW>5{UumS-V{iJajGhv zKMMD?q3G+-WB42mpG#kqZ;c^qMC>Knebm4Y41B}Ty#&T-)9XX-iW(3nB&`Y`0zU6p zQ9K0o>W&4ly?}LXz5j^YX3)bgR=bSWLiy39(VN7eU*Eo$AHWRj^b1|f$9KZ@%=xCw zRN?(Zq3-!qDF1fXbJ<$JkI8;nyaMc&Dp`2R0`&P@e8$*aXm?$&i1-)fiF75+ndwu-=#|e1bx@);uF36{yn_>qG;GRaO zH^{^E_^oYmE*)Io=thC}{RIC-I?5XejI0y0;nXe(Q3GVK) zW6H(TK=W-;WLE-&53>$5`l!QnDo2$~)qrWheL|j37v$6M#{FIDV4lgOAHC9Hu>JN* z2^KQI%bF% z7aM(61pOgF!Aw{+3DfdfuykEO-MLpx4v8#_P;VcBhre02U^h!{9rsv8LX zPf&l4lYS^{S5k%}Ou)URE~&>NVcMq_sKd4{B2qnw}A|RZ{w9v7rcr(ahLu2nLYq+nFV__YK!7YAr%{8MR@bSa< z8{Pq*^N)58`oK2bY4$UhdO;@JE^}S#1zfkIvB3d8C%jfbTqYHfh3|wMz@8*2^uT91 zEQ@LQFmK~eT;J}1i4UH~(!)XDe7PqnR?wfLdX?*DAUqxD-OC^ga;R>(tcMQl!?NmZ zo^B{CYbaAYj{?3$jn7#h#)W0!wWcI+e>rB$rc*LtS>XP`su{u>-^@3ZDZ{ulI@e9^ zgZd*f65GxI&lNf+ou9$y?7n^4`yJfRKt<9h1?(V0H@Yk=^$$M#K8cTtL71VLmC?Zv@Q1R83toerdo~DNqYnZ**@jch0WZ*af4(2C z8}-pgPH!!yylYYG;s;$l{(^CXV-o20aq8n)Xx|kXv-CrtlR6FS8XZ9gta5nyIUo$S zUFyvo=r*aowt*rB_TdT2uMmUfI}IQ4U%EupJzAE{2VqDWU83?HycXOEdPt*76sAp$ z{_8>aXmp91Bbs}J9dH_5A}e1P2^0ZNqf3;_IZNhjK%Z%JiIz{0hwIk_Hc7OE`?zJO z8|detcjm?^Xy23OR$n9Za6M;J>c!`>;C}er>v4j1^1H3!VBn5NZFKaw`Vq97=b4Jl zV4vcv{1aaSu}|MFhp<3!rvhth)vkd(&+W6@3Cj=BH_S<=KZ}6-#ojf9p#OQkSG=s3 zfICtcq^(9B5b>xn@!Ni=Kl2LjGu|Xj%jdD@&G&sTY!NvsCn0=8v1=Mrv!tb1-Ky=vjH!l{&SbV)a66F-?AO3U*iwq*;V6D z?>i%cH#1kt26%QwZ3?i1`LOlo<(>!N#+t{UcvKGewdds_pX1OU4V2w1f?)Y>_c15& zEYxFnbyc4WjC&eBu4TE#drKS;d1}Qj&W1=t9_VkcRREr(iCcozwRZB>%-*PzYoY#2 zY2KVL9+NlvC|-1hFsQ_i32X@F%UUj?}mhWfn8w9f>5V6FPHS;srO{M%= z{!4JP@}3qk$bo)3CtUw|6L87LcPyu2e4Ti>mSZjkk>ywCPlyA5i8_Zp-{3kleDLHF z?YGZN5w#*d??p4{Bw70O_6+d6JY(tA2kA1E2ltt%gC1_DPt$q`<0vG!tw<33kZ%Qg zr8__m!(TDh`vcEfWN)7iZr$1WsE{eZx5sCvA4!JrM&ItVV&Kzj?KqYQc)W1)Cbo^3 zZ20c>&;sh?ZdiJy0P43?JZSp?^nveEjEpO6i_!4ux;FCU&?7NS*vJg|mV%CTY&dky z9PZ10g5J2m1GcZ?UJCPrI~l;laGij9iteO5_6I%3?Q;*9(-AQ^RsPHk+Bc=5$o>%6 zt)M^h>xwOi*e|6YEeU>4_+h_339ye>P~FKU(BY?BR&i|xo)@JuE~i5~%Pvvv1^pzp zT=L5P1lN^{&KJ{4{)12P)%Twc+u35W#O8{|4)6ml267(^LV0?oFDjOPn5r|A`E4`k zVTg5$kQ{95MDGdWstCoTZ&|jdY9`F9L2-N5gTL4)q{`(4{qS?$WzI{Wt4t?1XRb_z zZTaClSG=Jg7VcK+E`s`34)cDx2<184?QRq;Y{%VEwd4i7TJnC|S+K*+iyG&@!m^l# z&&RFrMMhg-Tf61q1%`iVcwEAg&3v{o(azvsDmj4AF`|eB! z!giO4lyE2Dy>B=QOW^)@TGkg1LHM(9YiCC);JK;mKM#W4Y<8_zvyQ>Uvok8}nV^%0 z^s+ja1J4f(?2~ukIui9BE9^jT8M-afWPxYb8ohu}*hZk?6ZT7&NcpJrOG2QZG`d9S z@frPS*aq8`|I{U_qwc|_{1E1((Irw?t}E_YE-YXEsY}F)54ln9pr16lM5VZvT$=>_ zq|qf>KK8WfpW71B2zjsrP5LK^^T)#KVVu&Wf0EoMG7~lePLuvgKJ&EkRRFuuq<@ln zQln*VfYYRZ5?Wr3E&^~}n)FZN7atFr^iQIQs(c|3+L0#xlNjCna%2qJg(m%zEI%ez zmk#5ICjFC0N>&Zjf%G$)^iSg9Xzr3lz=tONlRWQyS)m*BfhPU)Hy>Y`^iT4vp(NXP zun$f8Cz;C-RQ?vm7ft#n$+N#>7? zZIJ++CjIj_pJJNyPoit%j4h8!rGswMq<@khYGMS8pnjV4Pa-^Q=jr{xlP3L>sGrK&5(GSH z(m%;UKj-!fP!CP|=Wjj}H0ht@Q{7Jw&VYSr(mx4NS<&bw=>Ih7pTuj$cRx=7PLuvg zK3ZH;_Xz5tN&h6*{|HQA13onApQN!yqUs=&r%C_(%_pBG{qwgD{MM!4>7TT^^gI2N zR+oOKf70sG@AOYvUHYB=Nvli0(?5Unp*YUI^Ro zV;IE30SYF?=gvm(oBR|d}v@|Z2Vv4h5tY0%}pFk z-0Z}X)Rk40HI&p;bu^ULYKLhA2dV0)EmXB|uz8_wuU{9SJr3gh3;%r_g!b?M{o^1^ zd;dO|L5eQ$`2F+eaS-dj-ufRM2N8f0zwHwo8WklL45vUsAhFx=)ramHOpgyR}+ydZl7wi zR|P*8OHYR^q>Jq%?yZ2hPOHZSDOZSd33zAne}ME>@gI5ipM4Rbt?jJeDhla(caM}l zR!3x3_2r3k5bv3MI#jhv1kx!-O^?he057A&eN`@q2r7~)R#AoYOS8*Asv%zM)!B05 z8^q%eZ5~doSqbrh@Mk*`AwK9XFQ}Uj@o!QjWc^V^*sdGRy6X<>;GBnLkF=r?@lM=i zWVH#z5pUw1B7h(GociWbI3iqi&(pig!?v6syZCEWOlf!3-50$cw(}MJdK3^M5+6<6 z$aaJHh1-$U(}3#~IyPIWL0UnC!%+^{f69J-{k(VrI`(a!A^l!=Oc59@u{#I*KdIfy zXCvbgrIYQ z%7k*QF{PlijosWHQ)TV$TzCp`5!IZ4GR;MZI5Syd)&kppQ&jWW$uu}tD7l|!_iv)I{3|VDN`pmL3zuS`wz!J`zyqf&belo)a|)=`7{af z2}k!pdL7s{W(c-*^}d#!yHxhAYR1z|_51)G~;eP!TQyN))j8{Je&u#^&pFm`{j%zKdT@;JKU z)`b96zUPARWP&s%uAWGXrvmxerjgj78;JTMP6hQasbbL{;a4}$!8luu#k7>edJlv4 z<~jR45N1b1>SBhl5`DGsL@6jQIVq>6z>f&UhxUayYQg;KsK0#=(0Oa>O&fVTBI@Xj z>109}hsq0%HA1l7^R+2XtDYOSZ$l|8Z`xo{Q{nZ_uCVTM?P&F64}x(K4F7l<)(gxg z9(ddfMWRx|q-V;qxco^%lWiod4GFtD2XK0! zz|$Gl*W?EMznZ~1abu{*M>>#?HFx(Nfv=ts#t$pS=r}@}uiRGB5nW7F|4?}2j3%t> zg_+m-+am%^uLJWPE!Z~y`r_za3rx6lQZect;M5Jy*?$UrD89@_Wdribw0K8{#s&5X zcMcQBVSVrAsZ0Dn-WzEj>tEyqX%(Co_I`);@OH+C;yGBqsFq7(2!?gpIibY9??C5H z5BA9g7|+WL#~-Eu-XHLu5`7Hvzm!5m#cvK9i{arszZW z+@Cn5bdSS2=qItcyjQZADD)&Cxd_4_@(qQ@zCwN45TB53&<^Q9x#N$0sxEuKkh6ey zqDUV<4e&GJZ8Gx%*iZXlvNP| zobF#Svmg55xb?;{cECkra@#>88Q6FDTwj$2c0o5!o_a6fC}Mhp!aWF^`Zm3=UlGzi zW7YZEAf1(vWKys*S`iaPHj7%bLpjUH(IXO|2a?46lEYve-&t!czqf!eeeKu<4$uRJ z(K*jdbpaQLrc*wF-j16{T5N@Kq2LPv>ohSllV-w*wk{S`I$O$P1Gsi&dDuDzc5ri$ ze2nRNOpwsNwYvrATyN|Q2h2ejaWxKe1Y9#<2FwlR)w1&r^uS-rOuP4uKtG$6mxB+K zyZcoHx1Yg;!;&;b9S}aq`PLzE8P-!b2tM8*1UUL;5fNGJ2KE-^P+Et=x^-kaHH7cgAZlbAo<;?tbn?qBbJv zR^|ll0J?h^->9{NoWFB&5r6FhPVbsSNB7V4tOG z=}T@t;43=&-IptXYn6m?>!_l;KOG{tL8_5U(04zK~<OPGJ&ek3UF6DJ?VxdwS`r-)R=Wh0hJrk*gq|8yY+WQ^789 zyl-iy2Y+B=1*c)_1xU-$vkvkEJ)qqh$64tPVN4Da9CA>;m^^NG5%d-BT*GM}c(1E3 z#||!#*V>0<@)fY}dxJw>ivv!D2NO0zx+ZbQnTQAxLoAxIu;x@Z;Qe+kzgfH*(9CJBx>O;A*kyZ=>{^-xVkeme^Da?0K2Y?~7Q!dSD@(M_dKQC3=H+lO5n%bA*aURT=z~ zvZpd^FwXZ!=9}ICez)$6@OusPlrV6)Ls|jRKqx3649d4BwY`OOEJ8w)I++H>e@JA{ z8$Q_oNn@xft24rccDL1&Gho+JTaIlV1p1qgWv$T#{Sy9NbIcC*d7K0e)L4Mt_)5{R zpA>?s!V%HP9t9y}!U0@SfTbU2Z7|>ygLrJN-xlIla!kVI1%~cGRB3Mg{a;b>fpN zK+m8mH%B9Nsh%!M7JL?k?_&?jaeVm2??}W~+`twlELR}Ft3jSf_^45hjTChLX z{L-Nj`q^bcllx5`;-OyE?CUl}gtuL8OWn{ed%xT8LC`mTat-X~4G{6emp)2}OCk2s z`E>7sU%yL^xi6r;vKiL{K2y;9hels_K>BNHv7}xG;CIoJCI2hzdkR*6r__geM0-v> z+iH76EYttea~JGN!h1R1{h$Y&cqHBB!M>}>p@n#BOyCYE9cVj=%C!o&i3@`r_v$`( zi2=sjtEFD+68M{E@^uB!D zU}rgKYwjt#fWD%A`YH#?h4+0*`ULzr#am>)7xVxFuOXWW(0TWL6PE+{Kf6l}GK&H4 z#P}kH7T9N$p<1^IzLHuV+f%qS0rhP!oD6h@cBsTT%GJc-SP;e`aUa0xIXFYN9>zuU z>i3=FppV}d(9K;3T--hCY4icgy^Yp>3V>r5QkOq_anYXVrfn~)eRAX)*QG_1UaBPVfsp*?MFJmu8PZ`PgYNb zM{j~Ozul`1k^>DPeeSCk$0k2WSHNp_9|t+)nen@P802X2rBTxku!9R;M7kvyKi-9% z*VsW%W+6rU2qJ{<=R77|0y<}|uDkpr9w?=fCQkwEdx%GbL$eu#d#{$9a{#5jshKxfZxRSLknN>TjYMVNOTE$2!sf#W=mx|Z<&NayHct`n^X z9Ev2V@triqs3 zqj0p+Jp{NuzuV<7mno#P@^jB7!g%QPxNKeXzgQ zBW}{wYPj4~FFDBr^kM#X3KjDZMBHvde#-~?Ke}+U(hJ~g7P=Pz$2|}qWvr(#1bXCy z-X?3pdlL6FZ(0xK9NE}25#)34+wA8D0Pn|Z78^?d?>QAECY?}kYt=4EBBaNsHu}gA z;Jp(;UB{PzFSj4xpVAV+<>b3*+cY#m9|pfV@*|z2H?xQa{9giDM z4xjH8LBD2q$pth>z`pvq%)4hy5aD%Xi?9dOU;EJaV-whu67@b$0Vod}m#U zgW&%c@*aH6WQRo+i`TwrR7Qj-?@*;?!22v~+1>Ln&+J^yypyyQ_TQ7ce7;$O9^;z6 zRRZ)J7J2vNy)rHzBE21v1DrlF-sQzGbr>6|QrHoQ02fsv&H zg-qQhCyD# z>_hpE17D9lKDeqL@P6&dBY8=ZV3s2#kwt1s%wda&%GiUQ%<@`)cnQko6SxLCKyReDrg8`y0bX5BQ4Iw^TqmRaO+|R`@|!fy zAL$|Ytra=ptRI4QpvdIk>pbNzf|7tgTVKk%)PwzhpEi)h3*~aHXXqjA zj6l2fkZl_1XHIo)ogc>&w9_iEegt|{j>u1gT`gZO;+l2`yn9;^=oOs7Pg~d_&teZ@ z*+HlD#)84mH#W~}2R`PDG&aY&!aP7kFYFVv^Df5AD+cg+aWU-i2{;Dj^l_RQ-Lo(* z3PI6gz)wvNKPwrS-={EH+3f&5a7lRe6^O$nupBqjq*Hq3r>FltE4fuY2 zHoNK)_>)`JuIRVPA|iE6#(=#G#5Mb}RcC@cYo(}MFVY0R-IKJq7WBa7pp6oJz_*&H zL*9KF;ODf_a%F>DCDea0^OHj5AE%cV$i^^F{F1S775Lel@+qo#6(Z>Pc(4}$t`)gX z9ozu8dw%TgXZ1qkQYm?N9RywkLUVb2|?&u7wd#1-CaK9!Ig z2zI6fcRqLocASRgjfx+XdyL<6S_5{?ZkR7&$_&y7m3@aH4TIPocmG6`93nczeQJU@ zEJC#Vkt&lPIPGEFns*cv8wDjVY_@}Wak7uG7~rdNHQ&rOI0h^+EIM%&=!al+F&#SK zr#SzPfi0jX?W9jc(mEg__u;_}58=I2+QtlxkR~xNTaZQpxK_O;wV43?JjX7Y2WbnU zkh^hP4a#k!AJSEWymgi3%tp#1!o|6Ly^yX?P%SIJ@EGX%t{$DDBZ12sg95sfTwxqN z)ilb1Z(H`W%|wDcCmJkenz@00`0W1UAL*6!&(?0$1bt%G;Ik{=9sK0MD4GC}ANIA@ z+uwt{Fp)QzYj}YDHB{sf1vwCN}U&O6@#MFi~i z^}^mW522mRLDtO}(pIb9Sx@eQ`kU4UZ-qEUf;cx!+?yuS;EG`dzzPT1xz)hepta_xM8sZq}+Don9LH$F#7bRBxn4g5u;szP;k2=pB zjsjdSYnk5}g>lii)#_Ps7Un7Mti`lKAq{6bBSHb>c0VJst^fJ-DQ&7KYtne-g z{D$O$s=6QP7IH^BA_-7lEnb`$5A#5QcC;@6#)UIm@z6uSH9N&V#w_3)hpAEZGq}$( zS*^td^#f8L-29>6vt=)qy+eq&o2QYOstDOlmh4&h-UBdF55XYUcP*g1cgFnqq zbuhl^$zfDhsxUvQP`Fuk0ugr^j1wuLT}Jx(!?d8c?(^!d;XZ)~ymy*JIKe-bY!{LH zkp^;w>F^aBn5WY`;QihQ^oNtSAK40ib?lCyEkR)SJ7!(QBZ1DayuwG@L63ZyS9$Wt z5D~?X(C=o3=ZQl-Y%^4d@V>?R-m?pk7W*V0DFdCJ+HSidXys7#e zpjTP;TgZ|E5b8hb!LBvmI8hGD@;=rz@0`$x~Kj0UJ z_lq2nY=7*6h?=5L{9nR&MHaSyo7V<^?dcUQJ(#~o5qO%#p+1{RY2pc(pS^vtKAqAJ zaM5yfQzpDOk;}_}6W~ZFz;$6Ol&3Rm?O}y=rPRH(e%Zi3Cv!ciufB-*%JVA~GtjeB z?5h{V-4kaoza1=r`3PTAT)iQTm#qa)vkk~ymYb!|B*cw+bERl*cEZXkrA`^aKgOMu z_K6I}>ql(hS&Y=c0)23wAA zaEI|)o#@aH_I>Es%Pl2PU)Iqj!4~ML9*XuSgPu@lj>*{#xPE`verP?6qgd3gbTd!L zLwJ9+@)eYClCuh10ROOM+kC^W({LO_0fp~0*yYrZbUQZy{pN%8hx)W}xzR)oMFrs0 z#D%!06X?A6!oQLR{P_#psm#2g{V{KUr{|T^#l~#M(}c z!T2g$Io!-J1-oaWEmC&?@{ms0zfA!;k5rYd`*GYAXU4XQOanOnAm#ZwPw1CDX(}xO z{CRaWlT;C^=H(im$=aGA z&r=tWFO+{+f49XR@Ks~^#q72Q_{n#aj2nOt*Y1sM9J7S}F+S{MHG*RuJ`O#{P=1HH zHY^tCv0-5QP6_s1jmyvIFz_Yy^0#;PAXm8p1&=(;5HY6k9+Mc*<9=9ry({3$=5BXe z58z#txGNe(_Tt%hT22%Q(+ecWgd_Go=5<0jxUYs8&%O5i8PDVe%+IKckh(L;F} zp!XLHcs6JOe!tkb3Lk=UA1+a5E0B*p_(bA!NNc}*uKz+I*zxgWjjh%oZ{qcC=L3G^ zmn?d25{3FZzN%hYa)DztD!0+y<_5bQrYGUzRxmDBlQt6J;6GEJO~_y64eK7)o|!y=d0pC&Sav?7PZN8DMnVDaxtjA296+8= zc1L%Vz!Nc4_9@V?t|mLKKSmgjs`#Zx)=W= zBfu}M3hR`p2c-WkOHn8TzVu7BmUuwtQcYs1;8I0FV^L_SBuzwm`L+F`<@-TblvsO^v)^=w(UJ%x+ zu@I{=;MeW>=ngHQdy_hwM6(L4Gn*^eX$6CPJ(f28am**h_q{9Cb4am3IDk z_}~Bhf5U;_kE0g+)pK&uPq|oOgpr-Cle2}h3q;ucQDkEXk#-h_*7kN5f0US+*x8sk zJ9@0tUx~|OUMctozcz;U_7=8g@Y$BXf8N5@i08-O%45H-kNtMNLN4LweO|u5zt1c1 z_t$*Cwa52cdwjpOcl5XRj{er(vA?vp(%+bs7ycLj{u%E3@V{~YUpz$rrLX@T_dla! z34~8i{vP+d=k3i+Z0*jQ8vQ(mp6}Q7gWrm;jYNeg* zM?c^H{1+W7bjg0B|Kov`diKArV`hGquh=j5-`Wd(_Ore0lE3fQpOE?A{`Q~YTky+I zzO3;1zkP@PP2j(j1Ha>&?pN#2f5QRqd0RVMlfTB%%l?y8{G-pL$d>-ZpZPDl^Jnt= zsp@C_f6MPbIUxT-AOBr`SM+=6FZo&N7JU5!{8FQT@n`>5|HVEr|B~AkyYssouh7L) z^HW||>S_JDcCY(?%kHf3{m*{?kseU4_{k6ZU-k6p?b!3&9e=dA@*eW9Yr1J4XxHYBBuF=P#vy-H?X0 znje4C_CJ4D{9T1#*MGt5&)a|b_s2O3Kko7Ts<5(O*g5o59#`5~d4Pg2`$zp9lmr4Z z6uPb4_>>ACuv|$a>=Vh8dq&|woeCq35 zyZeww!$je;&PMp@ufEz(NbWF>7rik?!wKDAWdhmsAw`A<+` z%r!P+dPt-e)z;S@THn`)lqrnw`UCw|EhF1640fRxuhz@jk5wRtkcW9Ed-_n;!r2fV z=>O&0lKOomT}Xr5p)x$L0_jktHf-vJe)$yee+n8#7%_EE7I&eR4R@!;=_`>=@CP+% zxX(S#VZS?K7!^}lXMQg0Li|x;9S!jnX!9~rt_=E}ra9){89R(FdTDvOT`~lffbj#g%9U1zsZBxh3 z&0UIfSxhzt$<`qQ(zw|!?NL;_yZ!XN;XbrxAKyrDcNy;CeQ51|wFYffvvg(w{+%tT zeO>yl58Y9YXK1@uihaMt`d&R!hsqE0(65yqMY);Onuq86(17ms-D9<-SoU?;(szei z6zqSU!C!n7)vNI@1uyp@s^^(b$HmL=8(NFD4;r<=mraT)Dx=7DVEV*4kRv8R6rki+ zijNL*wLI^wMGg6H*PPQFMd_}sOcmrlbXY}}LUg7SGiax`?#Zn|wtf68w9vkRmsIL400mGTIdV#c7gnM^jdh~-7i z)0+N1)IS%rbR&2ebqLSyzWEe8zK+gN*P8RV?r-%qPoy6 zyHj_czN$b~i;n9X2m27SqorY=<1o5zugqaK*@Xlhs3}vKD$xz|jb9p|{kDC2T{R#- zTP(;sO1rwyXv*zl)D)FyL#edy=9WHWV!#=;8{VHFV`H?puM4>^-Sl0eszf!t)v4fhvag2ww_ zcA>5ZX2X@oD-lJ`dcy~Dqlh=XV*zemK;T6pXrr6=K4@sZR_eJ`ch2!CTe4LQ!U8XOz#cFQKZ83AUU4Uk2?BC7t=~g zaLCh;rFFA4h~ysf{sr8ZlDzp~@_QemSEY&Bs$PbDM9lJ~OKVV+3>%2s2%`5mpQcsQ zju}%HQ@`kR;*LE_t4}$!B7?=nxp$|g*^yFwGx4ymM|&-zisi|1 zHv{~zF!c~#^`YswwFVE<%dlYo$G1T>HKz}3U%fwZfJ!$|Pt!MzOYyOBd2<5<`A3RJx}*|Qz+ zzk5~Kw+ot-=o)u+A@fo}70o9V=xOTg*P(BHNJ!cL;wtN5#4P&q z+J)XOG~dHW>fa3Vx4W4_seA-o^7w4H{Gbu9jp7fjl)Q-pH(a@9T_#;Z3gn`F-o^Q4f1*G%Lxju zB?xZ+{3vvyz83A0FP3h>BWRoO<}U-^+OgKF1zLXnPQ0M`a&^<;Ry64xzA+cx-(*J5 zdpETmZ^YcdiePyRrVJmW4dOrFY+8?-V{v~Sl8=T4g{K{L= zPMouE*W1zJ+X+D?8I&-%W0cRT9Jju-B;q{ z7bXGyCj4r_!Zi)J{?moQkNL@1$~sf{n`1w^HG1#rnZ6N}{Eer&oZNuRcPQ(Rvm{_f zC4>1*di_X|XOy2@KZ1lUi$Vja8}WEYl)%34*KnGe<~0Y;eiZ!99)Q=jTX_U#j+74E}mhtaKo2hTu1&!0O& z{j~zgFn*5DJcNqJ+p*nCA@PdS zo%ofzpsqd0hySy#fCRXo?J*Sa9^{M0cwb1ZaVIu4boYOh-HMLB*;{V>as+kfX{5g{ zXvaazI^Jm~JMs10!g(39R&;PKvfQz71aYS_U zjjsfJ6!}gE*S6!p$6;>12RiZVMmy`J>#fLaV5)$nWCW#(Fu&AYXvbLm>Aq@%PQ2K+ zxMobC6}@>P!_EZv4R5TY+6?%%iz{ts%<06N1+{Jsv$mqZT4KSeJAjYON9gXOcHHRv zIqPs_Cl+WrWxSBpiuPtMF@32XK`G4GmD{l$@8d972(|CTDef#sS)yB!zN3xlH^2`c zx4;(P5AFD2%)YEGDxG*=Q>(LHP%9dCF}TuyybhUPNlV+1-HW>H_&(9UufjBmmu;I$ zNAW>Ly=CQ>waBJd6>Y8VMTw(fr{~XAtI<(Qs=<&0qUUb$$;cU8SHEv5d*l3tIicekAU-Y%8Ll#f? z8Yx11QGMpNyUsmT*i$s}R9^Kc=2n#d&@h&Qq$Kj#4$)@ej8qMqu&*T4G}Fr~sTzxf z_)AB0t&`E$orhawb8ln4=$UNSDH00dEXp|nc@gDoRHAQlQ;>oPGre6w4km3o=8{7u zA(`FpH@$ltgT^Pnz7__2^0@GA160|V)p#Rk2hgwOOE)wo6^>%J_nB0&EgBP*@54KawLwVhf7=pV6km>Q66#N^7% z?WSedu>;K}uZzz8NR`X~mI3Im+EaygOotosn{Xcq;^a;I;o)BWFw1^)uzOe{t#bq^ zWYP>~QZ(YG&^0Hc?_I_7>;Yf)nDwJgafHPuts^KYmT1lRKdK~)`8nM<5e}THC zWL&vXvRgg0A3gs(c)_G`1bvseB>1ke0n^MCCSLiHgpa$t`V`e*I{owZ15J7$fxaJzD&6W=_u z&f3nm6*Z;jHcB#Tf84%4QyxT8or;_c$G>?M1i9))b99tML~vQ-Pz; zMsakgUT?B-9kRV!Xmh)x7Y)`^NDuH;;{&6m)2DJqah&PPWdWKLMDK6}jW_0Cmf%-R z7eRg;*z$=ju9s1!gy?7It93{-CePtOeJ^@?U~};1!`0YX0ZTXJj$$(Nar6D5b%?xO zx~yXp_?JUpa-I{barf)tgpsIGoE|9M^YKG1s=TsWDyFm-8E6_jQM0YaylhNL8$drC zTb)ZnM-q|Woa&7z!yHUg`50$RkkE1%J@2dYu}F4EZ(dO#6$N-WyyUIU!5;b?CvE|K z!aGueFPBCkO2r7*3x#!PYAIM`*YjRfvexY?Q)U%TJx*lUl|PD8&L3Xh8eWHVWJ(gQ z?dd}X8@(y6+^xpe+k&4?28?3g@;J+_hIPmf&fDEQ--{y3wmm4lSB1ZwOJv-1dlWaX zJAc2DE*Vj>-ARqQo`q*VUE(H!{90+JP()0`qNgVY&QF|4LLVufx?7ms#!G@M$>%`7 ztmhK6=Nyeebp;a#PQOV(>lXOK!}POpQQ%OzKlG1DIoR@OQ!Lt3eR?eGT{4ocUjMPW zFB^x-r)|0o{iCw*pn}|aq{)<|;4(Ub3i#t2xxP2Rp({3y$1fz|cL6C!7*6-2)}q|k zTn!_LW4bqCU1B44XtcLH(SH+n4IGi*2>t=Rf9CSuo)M(Ho?AZ=HDcyx+oMCK6Y#E! zT1&@t`%&IosoA5&$!Je~j;YtJZ0r$uoP`JaSGQ=h(OE1E?U2wF_03I1dNzgP>Uo*C z{j^hKFWld%B+KV)69ICiSG6T483{-1i%d?=#uMJ2M#a#-QfITBwS6(DJ=lGU_-+Jw z2zeRXOgCWN4}GsHCK7RN!n2W4{eINGF-PeB#}O2gbc)HD)PQ;QHy)@>NWtEIoz^du z`w{h#ezX2BBPb?l%2y(x0Y6ohbF&Rj!W&NT8QxXuN78ri2Ni>V%oYB2?Vi1jI4oIM zPG~S0Gx4LSRIvY9nh~x_pq~x}Oc5nF(r$=)0%at==s#F3&?*@%=$;AAyrt@eW(ILM!Q@Xpz39#A^znZ4YW!T+|Gq5XkZvVydum_(%UQfZu`*BU!R~b%>UU&q=Sh z7fr<)$tlfL;Rug?ANipDja!f)=jJ-pnt!*cw5baj5I7<*KZlIz*cGOWS>?7m;2lI$FE|`5#zY zxaRRFzN2KmaZ6Jj3U}tEv&-#8bQgB4ev?&&X$R+)wc-9-dtM3|TnBj`p`2?d`p~AA z>z_UmtHyTwGe0N9k7A>t=d5BA3Fwq>W2GqILq_IE1noBx^7wpdwNqpSGB32@I+dP= zY>$$+roGL=WIHX|48IaWMXssOP{qt{$7wzZXS+` zKry=NZHHKrP)E?Qi!(vFm?k+yUkRT7bbg;z-^0sj>a4BoyAR<1ee|8-k7&S$n{ITT z;<2df_-_Mu|uAhvk|Kitiv^JlX2BmO5Q~Kezd(rY{WN-^hd`2I(gMQFon|o|sXaFi~ILp1&E(Mi4?35C^m5F%=l(sfP z`}Hija<1nuqmyUoe29Z1NYS!AqVQ$|-V$e2+jJ)ZOXhoQAQ*uE{d!IFNx=Vki{mQy z(i`ypOEy-KSCaAdYsun{#C{ZH^+8^0t`X4a_|EbHBy=cUT^;EukHGZKgma(p26iZ6m&da2M|J4}TJ)hr;v?|O5*4kC! z(>LM)J|8EWciwjo$;^3-PKNs$^ezm{yOH25v_pP&zV**bcQfHlRwUx{&6PsN_#7D;s5G$sSSR; zU=`u#NUoyzS+LUYm2;_Ae*aPV|M@x9ou7Y7#4PtOmi+PayPW^E-?R`jNKKG5aWZnW zu>Z@x&5v`ue*k5LU&bb;c8-ud1Ds|yb2K#mvCH$L;lJ|xKR*ZjkHfqFs4x2CF=+Sa z`24fyfSdo9^SgQXPo(}Czh!^*`yccBZ_hzD`57O|{BOShJnwz=s?~pt^k4P)bNT-p zeE$`P^WTu~G(WNUFOv5ayZI#hCl{~(A)SBy=l6ZYzw*7@<6p)1zdZ+^*U6b#*}~4+ z@bGC1MchU)>jgSUK+=IF6p@h>EzRfWCXPsJ=PD`om@qucRjWQB z%!^F!xw<{YB((3^)r@cH;2#HzR2F@-LpEE^MDDoZgq<7M+Q#Ao@NN`8`_Pb#YS*t) z4u9s1cJzsKMTY6(l=V6rjt_<61EPF^#8eVeeZTPTrZ@>*(c)*b-V_1*H3MEeHS%~q z()+HFP&87>qpcP3CZmnv6qyfq+aoW1jga?J`ZzMRmOX+w03ULFmB&y|LIRc>?Dxfz z&_?Uiba|99*reBlIV_Ke(>_(7Bozjsg;@c`IVCbW+|u3eN$ZQ~+6KpSx(zW$|1rj_ zt$x_HGbFs|H3_wyIjLSC1M_CXJTvQXYi#A7*60&xjna-k>Mqh0$NQgmAJ#A@qgeTh z;!p=m#Fs9mqPS#&xl_XCFF!KGUSX2g<35v+PRO%m>6aw5CH3m%2Xj`a|7E~N_uD>L z`l<45>irtnsN}Or&p|Re>PFefUlD+wT4%^h9dJU#&0E7P3p{af2yu3Fkc6hiIn+K* zlMpG9^@+)Ac@z>Rn^2UcjlG&}*0$|X#|FEuKE1G=j6RAoGo>C9$MysLdmgap;(PDe z4UXCyqQSWO>dAf*Di-a`9Qy+EQGujSuRYz69$RhA8sW`&gI`Oe)G0rlDko;QXCoOU zCZ8L3Qa8q7h&?^`kq(ZE6LNj~(gtl@)uBT>2kTLJ?~jJhz`Xlm-$zP1Q^cI4@RZuh z6(3i-Zz`>0i-)NNa}xQ;h|6cble|_JA9(YT$23wI%Qsl&O{DuE`^&M{UuKig%lhv9 zuLnpdu<7>v#%gO6E}pvE56<&Zl)d;|d_NJd$49Rx?I@vO7J(Q6wzP?L}*&09f z6DWL)&Z4*S14_{!VE*l@{rCgWW2QWMm02wqNjpTWPG}(F<<7MR;c#9~2r^pIkR+oQ zqiUCmb0yGoy$=QjiUNqckWy`#+6a498+VBXk>H$BasGDTPp(Rxm6?_$c53L}nC32p ztBL8EZ7yD@Ua97l%Ly{#7X?#B3|SNZU1kZ11tNC{dA zkZYlYtG8mq@IzMdQgZ!yY&IiA?MM-WF77oAdhA6;4KMp2tfJP#A&(z1ytUH6=?@CO zL^ScEYB}vY2;`-MTY=8iftuF3x#DnmvA z$(x2x?zP8kg=kwtrVDa9eT5^b&jPj0PRsjLkr1bhN7TvlBy`WQ(IK|U5tkkG7?61& zf%FPLp5(LlLzgrhg-rFyNLp-!i7j6hU*5c}>?KB`=;PcBq6yGdt=^Y1Dw4Wvn86+ z1!*bM298Nsq3sdQns;Q$Nb-#V(bn4pT^m{Tb>O`Rrlr_*$xQehW`5lJ{RzzL8Ac@} zn*kTzqpZ|St}s4RgI>qi=-_tl`Zd#`Zg}%dbyv?}z?V=Aaf*nLwCwrt1Xn8@*z#EX zZPFR!>6{?7oDbvfm?EhR>mVwvyELyx`J;>bo$?>3yW{ip2VXp948nAem^_m>$Vhk1 z9pegFb9{bhB4HQLIm|K^H^<6y4%r&>yh{dq;hmcm5C;0=su)f8nLHiL-Zy=2S&uJ!Lk}7NfbUR_&sURQiNg zE(=$b_Sr~B>Ke?eZ?D_VIz~bhV)+@nrXBIi6u0IKeg|A~BCM?B%PCy{{d;rf9%!dy zc~&vQ0`q=&$T$*cfNw^(gtgqGse+)XG zi{GscK+)T8p3OSwi;H9GqQ2pMBl7!=v$J7{*#B_wt@~N9=|MLfcLTBFkgV569%lh;dEB zlMMKNz}KlNd(rD2cz1Cu|Pxy%3sfYbaui_ z({tMzXT5OZnSdh}3S>0P@Z^T-R};*X*YM`*lq;HFq&V?K55`}UJ-O>S2@M}VE_uz5 zg!InWlm@Jez{5<|qw*%k_+f>(#FtV}G+-{lCkOt|o1wyDwIhn?ef)JQ4S6+GyEuCT z!+F!>+@`5rl_Vtce7_V1oXr(poGMNY!1^KD)m{DWh)G~gGlh1Jy%rR( zYtzLw)S`>;_j%z=?~h52U5?mV$ne$YSnv~8y*^4)2y*SP@jIcz8@Cv$m>sk?!6CZE z>23MCcuzx3Q=}9b6;9sNTezWxw%UutGDly;kx{Nh;}hOEBqnw5M&J+iN6pf-au_$8 zSOFzCpGx}DK8Dz7KXkO7!a4q>E`D$QHTN?w8HFE>!+JLMcu({<4VySEbcG(dM(ON8 zdl%zfc;AswZPz{2a~1IJFk${NI1r2SthWvk*oKbB)U}FT_eBBQZ*HCdK5reQWGK2K zfhve~F)10ANc|Y8R!P_Zo7g7gbbww}R>^RC0rpw-nXI@mQ!rXJ(w=AEVSv_OCulPj zxuHF`yDR){$cSk}-K~dG7x46}>)SuwIE_Q)8=2@blIaD3X?BpLx|{IX!r94@PDrLCVsdDdh8iH-}3XvcE|-MoVZeV5OsBJx>^J0 z`Ppf2Qnc7cMoVlYUFld+6jCnPrE$&yhikJR7!;8~$B`Ga5wzr}qr1Ha`cix`dV zS$TZT*N~01wD|{xHmooT>1&)vG7`So9 z6tUN)7H5l)(OpTJOV1tc(2=<$z9oThd~eRzm3Ol$Dvy7cEbtKc(mT!-zDz7$mIP!v^w}|%1QcsPBLQq+Prs7a{!tMu6((D)CNDxFPYn>5RQ-J zat_3SKI}TUTq8jMJxQ8%mMK1Cbo=^Lye2M4%RHOLMn(sBHU#TD^+6IJ zHg}}Kc}E6q1y@e$TH#ya!J$Llu)h}kOh4m231u{HU9&^T6x(2>vdLCY#Avg+U@FcZ z(YnVAvBJEG*PVfT%TYhrH>A^>om9m>CxV2eN>3o!0H%ZsA>hYzktQOnL9Z5x^tp=o z;~mriYZ^mOV^~6uw<$M8Hs{h_8(Wak+dY$>jROXVtxB({=B7I8sm(ob#M%-M-}7vV zs|7u1SCUr;{EnwCn;X~@io|&CN45p{p)HT<^SbF>@FUuxne@}3$M$zej6K!DoM|(K zyuKIFq}h58vja-_(4oQh=oX+O$!ovvD-sgow3t47LISJLw&p1sS)jf*?@oGnD$aCj~|@wVoQ3gh~v~mgdBQFsP}8}(tb=r1t>%5%AgUN zo-r?84c`~tu;$aeL-8#Va7-6M$hFv!vNn&mT!eu0Sd>a96?tniG zY%iocPDU>3YfjTYUtE=S?OPj3LU(KXH9{T- zqJ~+&`OMHTba9ep>5LICTD;?-Yo$U)51T?eNBv!}kArS_?KV^N;$Tm3Q=%z;dF4^B ze>;r(wcvFumtZ~N@j5Y{Ts!oF_iN~+XC!*cE}A-T6@WgU9qnX*c08my1wG>wkjBHy zlvJCJq14o<{)kv29fE z)`kjhIAw+(UBADeS{sa>rOz&is*{mQgzvEiZDr)z+xEtKk0X|0b)9+y=bDDxW;&*H z2mE=Bx);fSi_UM%Py5A*s!Yr8HH|(^PsSFMHVGidR_3HYSWuanwHb9c=lZd=Qi*U zY_z?2zQcTOc{+~9?Xnb(vE!UiMfc`Lbvn?rP_dxIO=t!J8316DF63Cz15=VkyAwW&f_X5_~VVh zD9}HalULhD>6Ot^%NEW&FHcNXN}0XPD25L3G#jdRfIlxKxmSvUjLaxr3G_NTAdbdO z)`LSPcywZ)`Nnh?d}@Yez60z<_L$Cob2%F%t*Rm9qG61$g`acPRPjRmHsn~g0I!O7Ez)xUU`(kdJ1)^MJ%guNdhKw@gPJM)P2ibZu;}AO;t=~KJ`LKg4Dx|y=*pqY` ztK4dLZk;FM{`Rjnif_OVe{V_UTLFIbOR@odh9fc`G3`zpHbQ&Y7GJ988{s}~5vup6 z$jDt@vF+=OBKmTfvdIC~eUdry-^kCpAl-@7O?T>G{YZMLejNOTzM^QG4+LwpTXOI5 zd!#Uwc%!j8I!*^o>X+5L<0qqe(cCRl+g#A%Dt$bI{70{53cKho9z&NO3MeS zb7V9cM{|BtiXh&3eKig134heGhwaYyaU!Nt6*rM>BB5D)aZ?`554KTjidS_hJ>NF5&HG8s~scbS$=)=^_Ey*?^+A|g@tmd2IROl zhD>o7`gQ%wN3DS>fAsKfO>GLypB$fg-S|Xrj#&$M*9RUWBhC|ocZfL-|BIsQ4#fKV z!jhyNWhRw~5E-Q+rx1lCr6ik>y~&8I_$svQ6(W1DildBd+1}R{S+9^vn!o$|vp>4- z=iYms^PK0L_Z*P^Px)|2v-e!4~VT_csZV{ahWLRp}-7HrmOm$lP%qm^A0O z@^AUUTa%Px?*t3rsy_L!Sa=D-51W)8xNHWxMLJ&jmrvpxi`*TXE6Z}fWDFZ$5ggO} zlT^C9WD#7?@rYcm_XDeES1x(X2EcnC2fcC*3sjDZblOGi^rf+H(6pc>=&wk;vixR- zmPc(aEis!zL}XCeA%f2{g-pI7RU}T?T6MGIv=gcvI$Jq@|CW)(R^=#wem0aPtOq@$zt2utGq?v_dXS1mthKzE+4Gi zy#6tKk9YlbiNhVD4z2aC5*;AvSZ4gXNO$~uBhy&b_Zn88d>pwx;UK(E|86iv_VYwP zdpd#m)7oc&wO_IV;1EqA?pnDglvj52%1;EK&x{R=0KpB;=X8NLxa`qOUVL_Vs}-cu z8Mp7<FXUiTzR}c9+aOV86jSc_7dfvP3($Kk!)LAt9aj=RPk&h{&(a zE76M}6<*4jcf=1dWYCDg+7%{#aBRu5cY!CSxu-S|z8YvMwkc!W0lx-q6^Q1%hkDr| zobk4oA@-A-^DwC&xSPD&dY1U-ri-2xfn@&EyAz=ty0anBStUNGd&3^S{J48Kn%IS( zsF#kJ>^+oWw0=00qzb0&PS>4U_0Xz0FqgfQ=wdhjCT=C~`2f?4$DhugLHd5)Ke}gh zf#(8`^<@nf%#}WKVP@YFC~W!E$ThBpr*3k!UH*F;ICWmOGHtj6Qjv|J`QL~?ePks2 z^)#vLXt5C2jDLticPEyV*_AQr=v>G&?GDJd9%OMP`XPsnz}1EdeUxD3yt!O&fud@H z;#5x!FbJIFo$g$O3Zny;b6kjy7!pK2 zp)Mi$9=`m>ANKE?4sI^-WJ>P8jNAJL_9PJA{Ki>i^aJ4uwz{fY24^F&X5vYh=tXy| zum6)9*XskZ`Ij<>Y?naWLUiJhj|Os_3(w+Mr;l#gW*+C5{o(rwR!44fPtkP$`U*)L zcd|NPL&G5$bNb^MXl{NW^mX)zB>I3!q^@@w@$Z_w+nQwf#IdX__Jw2y&{F; zH=a8o*N;bcREXZf>|%B&I>{JrTF=|WBuRnp`{+oy#k<(JN4uP!@NawHU-9b(h`v=a zGCo>C;&)qM1k!Ibdvb)I|Ed;BDg6z;MEKa%8(J40*(-yFyFh@0h3VPAH(DVf}d-~SR-sW1RWE+#v9T_gC@m}D8!B0=UT zZoMI&dJoy{#J@RRKL$#}6E5mR2WT9b+DUh*O=yO zQvc_neL|kZyT4K-S#-QF*B$V7gv$;RV&=rZ zf0jTqAlDDyBiGCLn-fP^iSR(pn5yqX4>lZvxLZ%3P zChAsS_^VAzRwyvQ;~E-TGMdD`YWQJi#Z~vNCYa0G+I_527s1qY zQEQQW-zU12;>(485aw+WaNf}nJ11p@FWxf5R~fxAQD@111QVHVJ+p!ODCG~U{2J(f zt9C(x=o9IMi`l~EL{C2^Um{NQx^*fdywPDY5YF%@d9RQgW^cDOzGkBjyP{qQ=jkqi z2IJ8^Z$C-gEv9VwFaNO#GFMcT+H+dra30r) z`SNW@G33oSMdHd=sb8C2Ngm_B(#O-+Dgwd6N^9y^ls1^TTDH%#tKk~<8I=${L2;4R z{pX<;sNG7iI&W%^yI*Jvl&W6EJQjy+yGdp1putg}J0m+r!KE9}ttQ^Oy84?oG*e|xcFiY(c5&suYco^^L){krP^ z^WWgpmGAFE&ijLB_MW*6BU>IK= zET?e=lEy>}c?fPeYHj8kbWuW@M~LA*GQWj3u(88=uO}>~w^>^f-g|@9>H#y+Bh{@t z4Neb>LCPCJy&W5rfwQJ{^p=M^6(761S7VTNN7==-Yi^!}wxtN)*YTMKO9mA^z+22ktPVdS9qaea^+|WeU+;X?t$O zc;M3ueJ^hj`_iqrk;yE!8!sL(@nZ3Jg8RmEhigKeaM$lsKMjbTckPaQ^*vz`CZ?Ng zq)yud*UtaSzqOhpr&A`!DMe4bUH#f!m*BIFSBF2Nradk(SMFJ&kaeUY-y%&LE)=lH za;^}aWO&=HG7_gOS{ZQVxf&xi?Kk#jk~wy20_oRBt`l9~dN7d0r%LOS@~+1^fm+vg z(drMbP?#^uZ0hQOse44KNt< zl$84DB&jP{jb{ooyN9RLblp$9H-}?K#ap~-mY}%uz{kFooUc%Q`#Tb6FgeLHryJiz zf33B}0+OF_P5CcL?yD=>Ecx6xNxrMjRyEi&_&jQvvW{tL8^Ye#2is$#oUwR+c(Bd05sT4+sQGC{~9dXYVk^Oy9&4Uq-K4llK$Nw7rE}-U%eX8qR)X za|N3nRHwi>d-R!J9`Pi8l%mjQTf_~htKXhzF7;s7gAclp+{H2d zoag{ix+bTicV2^+A*%8#MOq+avB6O4n=uY32HzPW@$FIZG6y|!Z~R$3-vng>P++z5 z2VL_WxF#OTba=%I&J=%67a%yM`{dpa`io8|ej!bLyjTbIx5eg!JvRmx-+zZ4ok)K9 zc}E%V6!AcVYZ?BTWKN&k3&D``BQ8jOqT?XU zOY+?#JlkD0opJS_v3SLLDWGVsUKn1wj2v&$tURU(9~1CzT_!qzZ<~10q~v2f?yLEY zo77FnHNI=39Mgrk{C|g@>yUT2rzjwj!3nY)pKg-oGJ(fs|E~T^)rQ2)0?NA{lKgbm z`wKY)hYp6ET>HQjh*EjXHj-rC*<$-)xmjm>u+R(oW;}M%O(5yXOp2?MEKO}2M2pPE}>zEi-zltJ7~af(>}Ul40i3FkyMhu z=&Nz=yg+nfCAW)Hsb8E?bHm>N^^A+S={^tFSK_zcY|>rbOumn=|M=xAFT8<||9h&4 zo-ItW&eqNw+oS6rgK||;-(oc*;1k(vf^W{QpQ+=Q#P>(HDpZ{_htbQ0SHehq>)f0p zhs2*Ib{V&NvpVBg?3d9rhAWt_n4x2K-yZ1&_x+?JxO(EY?3tlWM(E+i_;zQD8SGL! zdDueI1jNKRwipwB`0$j6!#Tn?CbHvL23UO2qR(&O&t-Plvb*w($DifuY9|wIMRGnf zh38XC1@7Tq_IeQ~p+oQ{Qe&>^M=(T})P`&#_@0wJBdAaKhVF@w)gHgQ(DHY);7_6Jb~nj6Ut1Kv?PITlK|gl~)=e5C8{KM7 zOuRGp7%>U?lXyvEo!rw$1UFhX%s56I^#kRd0+r_d?x^SSSUM--8YqQR9#s=Q-+sYW zV6)U+*q2-PVAa(P|Kr}M>Br@a&8bD-MhOm1TW^aOB07CS;pSgVJl^P|G!x5lL>tm~ zRB4!v-^Tps93R+7UZ#(#6gOvJ5BF^TI+c9Z2j9e|t)u3ozQ;>zSc};EnX_)+wk8q1 z#aHHis45?p3r{DUkGTa5vs=Qdr>|kV%|YgF@}BKyS(c?@4PfkIAS<)dfAB-8wk`Ba zi=6g>&0l_#_cxrQ@!x73;Vn%jw0a45Jb37@@D?v|V2f$JpE2tI_CiU#--!Mkd3)V{ zA7OhC+@GhdX(a;#Sw-%G;Rc|8XJCH{;R*YPP3}k$98+z-sKr`E>Jh?gpJyH+JV1-G z#GN}X$H(1gbB>&|hzD!PccYW&_@;KCOvM$4%ukB*3SNXWoG;3Ii0*fU<)nx_!Jh=N zLdW?(mY~e$Sn5aSsi<2v4#+$_j+Xja=huFSAoTxl6()UgebE}h#zQjAj z;ggh?-Q+zBc5gP%C-@OjW!FXx_kl+uZ3j91T@Y3qg?KzQfqB#T+;0*Oik?pDzh`a% zlI+w1LtZ~rc-@mU^xO&dU!vQ+hs6IAY@RH#m5Xrh=%^Z9n-5gDumA0SK@HTc_{tsi zErH2;ZJP<%kF!~$U5%;%)+wqsIo&Y^=CcN0)jUm!zWKIon7kW#74GZ%2oGY6n0(Aj z<~VQ9(mfH*Zw-|xnN=4)Tcc>pae*L$hXqb$d^;ulkz?rc!v^}RP@c7V_hOk1Fnv$t zcO?H`;CEc+`?^I)IeNn9-OWG<2%UOpVdD)PGE83&rQO6}R@oUl;=i618~t|RwmbGf#8&ue3JQ+fZ;DeDSq-gt6vjm+7J z%^ej^6(qR&!GlizgEJmoT%nEZwuIja4mL+#io(h(OA47S2=z}3hLt0UKULm0yOYc{ z;*(pRA186?(wel{+vmFYX@o1QO(M@OH$kbQ;S3$sr6r@4umAm`BguH;w~m}A>LQb*#Zrk{nMvjVK~^~Or0 zct-`K7V;dFoYjY)-d|RhiCs({`McuCvKq)Dm4&$_-CoCl}zscbGlSpZM+)>@M$k*^9G|{d%mR4m^XgCzN_|P8cI9c_w&x8rSVvBylNk zk&p4?MTmLIWpq9FKctB`P!cDcL9t}^n;2CJ@hSo#2b3hdMHhpOd_v)x4_iG7`ASHywMH)ax(sE-&}%fN~z^`ZcQ|*sy7(O@q*MVdo2X=a=4c-|=WWd{SsKJHqPA&y$d#zTVs_|c)!KC|sr{U+9c79l z+wIksh(DfW5U!E4A^FAwLiQ75x^N_U`p;>n{bjMnQad;l}J}`VC~he4O*E zg*`kBi%t1;m()jDe=c0AGQ||exaYagbRg>W-`ARhE(C8DipmJzsC3_ZU7W<-*`BeI z`a!{@AH>uZO9o>Qmu@}8s%nlsm9Eb}5q~PN$d>Hi;)EP2bS2$>{`jxf=jz2K2MF4v zF5{C+{Dh#U1WPgDcRnp=o-2idi0|XO2ktw-o1uM?J1K`CvG94Mm;}+IUTA)j3U|bj z@P$GfKWj7=rhb5aZ>Xccu3)#Y2*L&Heq~0GyxzvG-3xR#@x?wZ!@)EY+;{d*_QAlL zSjXFDA5ZcHefsVaK~6VGo!YOp>upV1;!p=XCvSBB3fbiT!%fde!TSJ^LJ|)Z+sf1W8#hl(OmO&rl`2aU1;i;{5*Wc9V}~i*eVd-^46LmblFK8^jMxh zUi)bb+mAYRHQ0M&-=mhh!vuGl&vShGNc=lf{te2qgePtnyAp6}=Y9CP`FXMt$>(}a zZMTrt*ikiPiO zBCPLic9!s%1U=1A!#JrS5FF2>ciTG&{qH{28YND{rx=g^Lqz^R^}UQDtulq)ws%J* z9=2fSm7XbWXBs?Qsv64aqTr9~6Bfb(li)pmF!9>XVff7=R8X>SlEl;0q4tJp_?c<@ zqtCGlhy8R73e%H&w@DwOpDISDdZ>hFEpLh0z5tf2F7g8PRID>l=PUb6@}o!YygYQc0j7AX z{EEmrTtSjAQuZz&S5WXSn%)5154MQ-VLAuXJi147GpHcO;Hk*Ry8!!BJMMQ{QBm=| zy@1fUKcorbhlGQECjf!k5+R|71ALGp9N4ct@bx^xr@B}9-1=c;w$@6Di!1aaFd;Dw$ z09Ly8r<49iB_4W`C;m}ErRt>KKZQvs?_5U}2pxirsk-_JCnn+S=hm{fI1Ojdq)R0C zSD_83pGb;FjbBF4A(N(#HaAr`ofJB&s)&K z{NY%n9SvUX+VenZkb*-sp{}u(lVI?jBbX(22qF?O=D@~D5Gs7nKp#5|;_WD%+**w_ zJoLXZE>9tg!0oj#<5pC@`Zl{lj|NKhFQpdfsQ5niw$!dWlTa_%x#1wk5LD1-FohqP zgt0|#ZRf0M7<5ybo!(J{ZpN1m862O&Xx--MgLJ_JN%(a9zu3Q{(-3oKm;0lbH|U*A&92%xh2wq69}-hr@#PP( zwt2E2p7rWx^B*ZFn|=BBo6QSg(P;bkPB#^K#M9qXl${`@U+3gU(%0a8>GpdAn+BkI z3-9@sg9~_I`b~C-;sEHqYy73_Fb8&1CSTY>snEFn>2n8IfY39(EirQx4E&NfCQo^a zRZN<6(Wt2Lt!oP$X(;hVlDRH&caA}qzU z0QRYq!biubm@G?edMvpKo8-3QAFZ;#9$tCuZhgOX0JhX! z-4iaofbtPfZU%7=z?oMaXEh_{z_O5|g7qjBIIJR)v&cG6${F+vb*RWMjzeqTeenqR z@b*O2L5Z~Q$#)wEplYYL-W6Ct#@)Q-y~+dda?IoC<*+#j^{v;n+(8BRi;O!PITm1R z!>@r|PpQbTeq+EJJ1rb9`=}*yumOY{f|Ac`41muiw?I2$?+SjsT1Ujmzl&GCMw4@H zCciDONTxz?`|zuMj=c%BcZuYGfbE>=^Nj&f>@{ntrD6;C zlyhNGw6PxoY@X^B$B{mUhMeo^^r)bppjB$He*qL9I*u9THUg-){Lo#!Ou1OR_+eKF%DDFa?S;OvdG=7(AN($Nu$rc-kXEMz>>Ah zGAel65304?nk2gXQTuqOAut^XR2Ta{&PSPBD`$|tkarn=h@@7dZMbbryuuWoG;b&_ zVQ>K3_*S2}akpFIGlOgK6?H z^>CjWJWrQsX{$Pgd|WYXa&|4aCG8Gds{sv|3c8MF2@(^#HKuz|d=gIG9H}aC8G=7G zG{J1GNx0^s78cPp4Re*=w?~DmaOdHjU)8y$kUPP)=7>})z6va1pSGmItV6-BeeWq) z_r{oU>xD^hOXOb5v>$>W-ux-`rzatNriuMx%`{MWQg8Wvt-^u2TiZto9>Qz>krTU# zoic?*7~ZDA)_B^Znm!8dyY!3u}?~acgV@x0}W!yt$b`xlQoUCT5!l zBf;zF0E<2wf`?)TCJbI%t1v>}C}WT86#D6{W9(OI#Wv}sLn*E_V4p}&oeiU4ld+7Z zINKy#|Gvjt>%|Zl?JW^ly*>#~nm*q2nVp6obgDffnN@gI{K2U(x+%1i;EZ0+Li%Gg z=^NiA=gdKSoGZad#a|y9XG5*dnKiW!*Pe zW4(N8?&=iw{0=;Li}WE9e(-q<7}Fr(ELU|_3I$6mI*%KuO~N4y4i!#;A&~NDGrvRb zOZsjgPE}9CF^1|WJ<^vi)BCdD*wHDh^q~&a&$nRS-d0Tw9~x+OJ{rmNrr-&EOO?NT z3&6I+<@$9~D%R*fpDvxUBX#J@qXE|%p!(r6@$*{-h>ofBC5rHbG|p=yg|vP+w%z*A zj|arRpW5^;jPQipF2AO=PcMMjM~#Swzsb63L6Ip}j9`;~kn1zMdQfFd^v-YXhYXG% zA`{vlb3p>hQh~9)O|;A3jb?EZ~m~SDL4_2f+Cb>A-k*4vbXaMKdT-;gJ*{$8qvq zqi5ApYHX>eS$WlXYNeX8dI5fdP=?qT8EH zaFrqO+@mb_e#k5<1_215Q|Hs2vkx{S9ZMv|BK74QsTLVO7an4F{4Ujpu*72s~-bYlW z4G!!cfYmk^1v`RcOL4oCKD$sMPW5lwl~W6Fdw;&Ly%uU7qcKV3D4K>Uogs?20De#?6d^Lmc@$o*#yT*lka=h>a<|< z{NcGjPBf5o`0xBbDh0Lb``>W$O~Upqx=wBzhQUu(Kv|OTG1;w_YErF)A2RLR^Xps{ zIyuE@oY*%-=GYzxJ-@vTZ(mmXJg-25)S*i;Gt z;c@P@HFquzLG`X-x`&r0;oWX-l^w)iJZ3v`q|5gWMiJ8h_w^v&+R#En& zk_Qd+f*5^+-6{C7AW_)7h61@FQMY+3=COReQqgp87uM#79hMEEK?I%68-Mz4P*6Mn z{OiF!NZR(|UEkgor1c0#+$^GCgGy*4^F10+)_61S&WwSW=@W*QW9_)`tIux#t~rd# z;-^bS~`urSTYTNU{Xy**vv#b1;mpuW@Jb#~wj(5XBW}U#rUlf>KklVX? zat8groNQY6d;~gLjk&H=lYX~sE8Lqq@XTUZj14bo(`Wd06R*e&2=59Oq4Sym%czpW z$y<9s`I?=;gfazQogaN}vqZMDFki_+w)3Fu;lT-h0;|Ed4A&Ew4=Z@lrgXv#s!C>i zuk$nj)!2SJKQT)NCi9P8A`9p;6xVR`XFtf4@Lvo6Zw~ZXT^d}>sK8ktI&#xvx?&*hGw)!5}sr+TN-C2d^oZ?z1r3_Ns<+~-z40Z(t7Tm9S8 z4ZosC!g=_}I>yCkl80unColM8dE5wm=M+C^OWLt+Z}E{Ljnr8GJaK zxnfKm0mjPm=n>LhcIoGoxr1CAK6~~&m4}?qCwCHa)6am87{{u2-~?1@t$zKO-UEYa zpPtZ1Q9v)nv|)JLEXw|OtZUkJ1Rj;D{;?t7b@#o;CnmZ!K*F=tKYoylhzc-YRzqbvvn2?gEcKP z$T^q%2p_D9ByEv9=N8^+w4?4l)7#pLbLeiAu+xHV2DU`~_Q@?I=d&cocr&vbVrYc{ ziHuaR9Lw%q?47|Gt>uAr%_FeXP+yqWM1eXZu~&PEnLeOgZxZy1wq6HM+1Ydx+4C8-;!!Vf?pWM)k*^u;KFnSp zmZad{xh?mW$#=O{HvWt-A?{1MXYTNsA)pVDb?cELZpb1~qamHV!wnfV&+k`ZfW@s& zQxabMo_`@Z#@~uvUAL?)?$990m2)ybgo4`?Pp>TwQlPbXrz&qHIp0md!&FJ|TCDsRD{?l5vlxV>**5JX3ND6)^WR&M8Fy0_7^eXiP6>ypS zv^8}ePdu$&5X|es8&r?CtNt{oKj+w{)7K3xympdSPQ9?{B}dbsZWHSG8W_mhQczog z?`T3M4StI;I{zbf`g-$E1NyFZG*p+|sI`3#d)rOtez43y(*+_-C7bGmr8>T=e&DM4tImh2^aBLlU^8b zNJ?hf&`jh=hX5UZ3TACE>KH5_^u^)C-2MJB*z0$8?Z2ySI5>Ux4^?yyU!BstDnvH} z?X&e9K948hW{ZE({(C*JaPV&aiAo9>DI4vfte-_cPbz=hy%Dgxvix-^eGFD-9SaV7Rb1P0612g(S|pS%$}X+B<=A2cHi&+I1QO~`$zsZOhDe$o=)jYJ>be9 zWSu-u+_L3A-kV)Bc$Af!+i!UUt|ZnN%twvE;@RgXADXqJ)&7Te(dXuHA2}5D12gcu z=~UF#gb9%S@Jw*(T{mpxIww}!Nr7>D>ElAvGZ?q+-m}ZEM_|~|#Ga4bmx8;DmVjJ4 z(u=OMx86hA|6Q+fXTK5XAdTZ3Kd2LXBA7jX`&=-Q@Fat=RJF*!a%NbLi!~z<-*&!y{dm zlc6&c;Oc3T#3R!K+-Em>`D9a}G{R^_rGEx9v`lh>fUNU&ZNxcb3??6~vlJ?6!*m53 zDPwJNKAGk59s6fs!=>IC_4o;pxph?}?R_^4PIA$gZYK2krKaQB@(k8Lrw$4_j=MM}voeUM| zCS3&Ay_&(gk}bkqt0R!5Abjat(-_zdH7q}IZ^M|NE3`7=mnZ6eM=vtYfZ2Xs6nsW_ zg4OTMab`WBDDHbkzKD#QI2$PtL(V7fBb6yAXar6NDe?Vs9>QXNfhS-1YGIsP)PV0S z4RdziN!LCz#8$;IFy*t>WY`)JE%iA59#CHyiA4>uqeq_2rhnUOIEwmHA16X?_}vcR7V^nV5iA zn^fGkcXY#0+1a?j|ETcPe*Y2^2~%Egx-W3cX$0=hD{t9fJcyDP7Ze)H-odWJ(fJf- z8aBPV6F_}AjBnq!CrvBS@Tpe>?R0VpBznkydG=-otB!e&Gx!d{cmRFpXv+{>oj;cK z@c9s$h>P7Ch^mE{!stsSM`_sqx@G1+t6>bupB`e=reQQ)&X}5M3HTXo@eL21!87N* zc}9q=JCZ2<-Ku{WDw_Cp;@TE5V;ld(L#W$P^ ztRwrWU|3H3T8ZmVn4XTW$peY$?ZcKgD{*1!?y4*)e;P(6KEn$s;GA`n)9pk7hAQ4w z@fS}7b%&ts?qomiqSM3gUr=EFqh5SN-8>5Gda=CD?ZUk&;a0{;G}zr&5OVHZH+WVY z_YO4b1>pgH@0gY*9Px<#SFA|ES054?H3{E1%SR_yPR0prYtH~7AiGp*rV#miZ+BjnY9nJ0 z?zCH`PS(%kaPb|}DT6MwTi1PRBawG>d0nJbRJ$R^QTs~}V;{J3KV}p^)Pnq*i*qTb zDX1{l)o2q(gN!?`dG%TsF~`R5P@{MSz8LNfsoRzd@haZkb*<&7M{r&|LhyGobgwI`!0?FCy|CXFd&U1<2 zG-(*1L)I}e>)*26MS(K~!RIeF%;UdiCj$?ME<7*JlA9Drc!bAMJ-XA~Q01p!cJfOv zoD?gI@uxN8$+#DfTvaI8R_c4WAesh!u0yOTYZSOBY)YqCK95TKcm90;qzfy&vO*LH zA5nPp3DsP?;jExTm`8Ol&<7na+N#owfxUZn78_CU{eJzh_k`EZMF&U)Y@x!hQ+~fr zzMn_y)z+=P+q%%`S(3yLA~UXDy-v-I?S{Ttr6c%=Ld9C}8t;;3+RT zpSLrM89nOVIF-5GVI-Xf?}S62?7}YS_p>$pUDyjr=|j(wjx=MpdkUEnK*5f6JGZm> z(m*>tgTF6_0;`+ud-4*#I(R5Nqxn@AHrb|m%oE;1fg{Wtb-Teu(?wERx)*q_am=-t zHzA9}*T#He7nA=K@Bb{MfydI0O}u2>MoEQBaOInMoXVCoN=fNLtvO@S@8rAN#Uv%U zZ+An4k@?#TcYEPNuy@N2t|#d3vo2yK482Cy{p{@1QOJ@k%!c9W`)M(CG#JRrkj+woPbR z`qj5Mf`a@NN7(0*iR_|FaY-fdm%?p3e{=pe?7nQN^qTmKvE}3J{2OOr)1A-!mq`5e zhOfayXQ>*VQ-R^kK@<`f1YPI)@pl5)U$!@o=XOII!`QYbo>YkDNz~jx z{OUV#UDK5fqcCM%{gjdL=a+R|`FkDP@fm|$jN!gHWPPL}A4=pFGi90(NBsm0lpH#t zN$ZAVT}}6~g96NsIfbJ2GZ=Du=k)Z!Q5eg&`OO(Qg!ZLxkN+Hd3!j_=W75viP;#up zz-e{}n}<}&q@8FOBxUxd$+-+~Z87e2AXS`NWGwq<@6-eI5%*rRfq_^;b{gROK}USYu3{&4vXdEld5_i~F% zC9@D_~$ZbO?x5TSs zpiv7n%Py(^`|}!Vb=*qfFv`&WJ?d1T;fnv4y?OUaz?CgcE$jIVdMlq%Tz7v6&MI5G z8_EvDX!m@^>05)i*X>yI4WDtr@o=;0^JQ9Wxukp-QL4xQ}naj!kp**<~8)r(G_uy)=yf zIxW;S$o^LM^2J_gDFboYJ#&#SX7C1!*>IcA5F~63Hg8fGhSM7ozjQP&;(e9#tlcq{ zC=&X!&rmiSA|5$XL^&$4yn^%;C;t6FjP$kinG`sFef^&w|8g*at>1gg<0RvuTW0Stm;urKKwIHXXLQ1#CdMc%I~C{FKJ)se#XFLIISV- zT>GE^Z(p@IeCAp#%%&}0`$2d@W1X!$FVhg7iQi@Taa$eu*O{<#5q`LS=PFZG=r9)T zIka--Dh<1K6fh1xE&`^~&-(*&W{@rB^C&yt5SSO|>^NgVWZ43J!7<4}++aWx+9~l4 z`uZr+<}oxpIVoAO@O>D&n-2+%5Ps&M==Ie1R4FLs3An^I&Y=Igbiv1;hakHve?K!R zL$M#%^Sy@s0e&SlONyd zn8CZO*-Xxa_a^OI|N8;`Fz9CV{zzz9#1aW@%ec;Rd^ONL9Ve9wc>^YVCK~0q^l9`} z&p2rxal7dLezjDPk2USeYtKVLyN=T32g&e7e@HH#oU{7-!K95ni+K6t*@5z;Qe-U* z&=3AE2V`@s?W^{eBKNEJcGH9>`0}VTa`2~s*!|F))*rdJ!XeaPrIrL|e`Q*&l69hm z*n~`o|C%0Z2-PjBz<+7}>tD?0fs==NP}+}jJhtADv+sP~ zg&SIxju;d9ouf?WXdp)q_{^%E&I{}XcEbc)p({=J`S{rSDWXffdPQTg%%DN+j~tVB z65q8>KHEK?HIGkkFod0J@4|?PiTO_Acb*)MOL(i%4Z)+~Cbql#fOcVg z6%|s@q04ih72!8w%Vm#aPf?+Y_t$UBlzFt>griS#x=`|=*rpUBo5wG_^^`6kxGc8k zZ9{D@++}>E`fz762H$5J^9iD$l#kQFFEKPIw$^gBZ(PKaDpAhmy%iW!S!;K1dme;* z$PfxQsX&L3LX`?~?>x2fF}K9yp(UQ#IaN6y*}Q)^-G@l{7^pvahVa88Syk2hw4hNlhN7BS9+l!Z2t?T;YPd}${KeyjDo|j z%sQ9Jy*Db#7ZtHkC+Ct_jhUFQ1Oo0{74Vzw0yIEM);3$ zX~&yG%Z>O>iRK?DOu@XRAPxH}8g$Q#Oa%K=VBh+q1DQ4RD7{tR(Ro8RQmQ2Zl0WEJdlAG|$%dSM-2NVo_`!DGO;Vpq17$g}!P@uTmNu2NX zJYLDE=M<~y!UXQ^>+7D=fa}r%%SqpE_$?A2Td=nm%075mcCa?#=1gG^DOC#2=2oaa zEvCV`G@ss6M3<&BS&;PWm`Agn?5KLN3m;Z&V|_|^P21nA|M5R2{P`cZzT2K&IP>>! z+{L?1_(3h!nL-&rR%51M`WC{EM`Et<9~#2{9AAA-dr}J)9j{)N5Pu;c{bEvGY8X3? z^IL~o5r5Ik@TGOU2-Fo`9G9z}!CPK$l0~Kl;Z*LGaUr{5$UWc}_;c?N7G|AmILP%5 zem>s4GC}aK_fUj$m)S51DbUYV5PXh(x{x<4Uj{`z7Ctn>6JEbwsx)&Pf@$W_t!5-` zCbvUfY~tr2ayG4GZsV;5hs%GtV@TY;o5Lsa|Fxao#JuRd*77Q19ARYX5pIUZZwJqSw^+%cZs!=UPhr{~uOapPOxKD*7e@b-x2 zLKxv23FRwc-Oj_Ptk@c&ew~Ia)lP=&>?Kejop#Ejg78B3HCK0;ArP*A`flvNFy!59 zvOITu2v2>|d_PUbh3TKM*4Uy?ctTJ@`b^+3zPMws^_mI|vjw(9O8zW^#UCBrODQvW zPJG9%OYuXX&>@t$Yx^+N&*Dd$p@~|UO&H|4 zM)ZsgG3m|q(Ze`Rx4gXP5)GO9F7SQ3Qw*__W|yBt&fv48Xi?d-L(qSUmpkRzFvM@j zsmwVsgq?O-CcN@>AnX;*sjo{8t3tA{+G`i9Snl zbP_vF$}8+{^^S<94?{15_dt5kAhHR>yJ;S&g#(k{cM5pX@Ptz6;jF1)e9jynOW{`Toy-+Ng&>{wZR>znIo>~M#ITd#bA2Ox%x6vm^ArE0=)B{(`u;dh zA)!J`N|B6jX^@rVbgar=8IisBCP{^C*}F1Q*(+N)E|I;(hY!if2OlG)q0;aC{_XMT zy7%1sdC%wT{bo_;V5mSU%t?aGlUcy9=hJBY>>5fmoW8x?fv>asO4zHMYP3Fkims}# z9Iu<@{=~Vj8l8D;pY(tG%$l_9+0*mOMI2db^d)U!}^Fe_NbCvXi=mF`cww`Sb-{-#~>cbWuRm{=UraQ;epI8Zq=oFYSv<_k*Lbe=3OlZARkFXFJ@};xbx2D@TdS6UJO$fkl2;WftITKLkLy~a zU&=P+t+IejAZOyw*ixjx6 zcR|Weqt8_$HbaN`NIZVz^0_MBTB~Hx7-)Ccny&&m3qP@pd=?AJCoCW9EUY0)L!AE* zuKz49EQLJ!RE^}l^Zzx)lmLZJOS2XIYGnT*=vOB;;daTbkO4->X5O>FY!iFlw`Z`3KiYVq^DRm8=^? z@Rg_h{t_ynF@D`cr!xe;_>23l(T@NfB?s4a+#g)LqZe@X90_@)+?RaSfZuC;f#AF* z8J){G_43C5*Rs+<)A!h}KOGC{EyVTSf6o-2=NM5@XqJ`tK8b3uPrO;t7suiH-Zn!n z8e}|9>nV@nm#)xj)B>@Vm?{`0?y{Y9^%tBUU=a?pChqk{d=Td6m< zCrDL*yA{fv$M#T)J=;sbfef`$^`HZ{aUp}6lZ&lme_H?Gr~ z)q3-Np9E=dYWh6!d(UOq3^hDijZ*Du+4367KtuYtGE+E?%T2GEcH%hvc0wEf?z*QS z;hxotP>ph=R6_rPdpZS}1s`KoTgG+2hKo)gW#&Lr=Cs(>$N~u4she}iq#Nbl+N;=% z@jp`&xiNN@M#RyUby->-*QbhvxtTEjl6(HZ!z-6DHq&$MjrIx&C3ZP&8Do4z?b2bk zxql0wU~f@)`G;;4U`Z`Y!uFT{H*;5%0mdP#4?6DtwG8+VKkSdZ(VhDVw%Jxx>C9ngC_+^O)BV}rZO~kHMq#;P+AbiKcwu_QAS2Y!^+{$@! zLh2pB1DAUr&y0dYLrh8%iWpB6y0IuyJq8Zl=KRCty9B1+P#GsI!x0dD9Mjr>F|Y$G z&$3V8I+XHYZmky;uyF`TK(97D=5J@nJ?=5UcID*R%^l+?^V-Nu=gKi~WqMT2#AgXS zRKAfEKkEYC?o_Y4F^Vx}jtoa>$8q3#r}??`KPrfe+vSYcrh!N;jSWeR_bmp0oDk$3 zN4#CfcZLj)0dm2I2xfPD9dpmhyXn!W{5BuM(pF#bd0~@do)?FUIAK^c*vry}FU2-nr2ucgY}E)YD7v?OSxRki<4*Km|_j z!3QbQbAVLoR6Z>=kH-M{|Cm|EachY-{fX;y;Fyx(pH5uIlF=&b5~b@#(T&BC@1$}6 zMtZ1+r0^E`tLe3WVy6Pi%FBK17@wq#`nI;}I*&@<(>VJzl91irJsVdrzCT0!x2oK+ z0KSXX8cn2iqoOu%;{|gv=)Eo0Zll?VZ{-DO3X2>Q&N36>2jMkPxbV{;= z6r2OSaWV>v7z3LRPP;!dh4YMrrFXH{=0MfJ#m&pd@pagwpPl-OA!PD|$j=L8VC%fh zRQB~PIyYt!Xg9r=$~*0X(BegRk!Jk6F!qT5u@F8E zPN_fcNE*jjtd3H4txyY~ye;;&j2Hz|{eq0klO(jOFmoUZFH_I0iT41T( z#l1ZS2B_QJ-nW;4#?rx+2ag^g`qI?JFP$ssK>X~V`SfwHbz~=N`y%EhRR5InXuku} zSDblSe~kj=eVsI{-|_c#5sB+!Ls937c{?cC`)2BsYT-S@$`y!*(^4bJ>%lyu4Fi$&oIYI@LUI3_d> zdiwLk&tr~*X*c^lIgH^pWI&$#G-KcsIg;ZVelBWz<<*wve&m@ez4D;MT`D$@$CVx0W4%i{S+>@UuCK!+V~NT`XZ zNS9Qa0|GBt7CYB4e$DN-HoMt{gzLu{+%QHMyCyaDrWYY+P&h7m6xZu-`Hc#SVL46T zW2fC%u5v!aNAVN;IO?x`JCTL`SEDG)%|0w6Syfex{EGYVai6WN>1@bAd?Djs6zL5z zzT4(#2&h2wov>*vwlm3soBKauEZ^4q`Kzra5~2l5lz)nIAmE&w9wX)&=8nkK-Ti|x zd&vy(hSOvab^NfrX6GB!{B@b<)eb74?$3OB3}cR-lmA5wIM1V>K{u;~fJ`lY-)nXkEy=a1Gm^;C6eu-IwOTR~at- zI#Z1I)9jSLhTq4fgalN9vC5pJCG)CN6hPkWrL#NVjWYEfoXfsQ1{FK@{P9wGgN%O9 zrk3x)-+g4-FB#Q2pc3lOa8wK9qd&eLuf+G`dEfMN2!3Aci`O)79isr_W;0p^Y8QH9 zGF6ixO9nY**I5UH8j&N#<%{+l z>P4M59VZ14weE?WLft4n|L6nq85}1GMLUP{y~X2z&#GzQ^I>>vWeOFrOlXxR@Q}?s zI(MYd&j-A)@b9JLT0w&BWQe8&@(u0@`1j>DS-k4w7KG?BW{8=x71S_2 zx9cM2*iIi-oD^N4f=i1kT{Cyzf#NQEU*UyOa7F*BlrR3iIAZz4iqgiw!w)6|ujvvf zX#v~yN_Z^R>wt>$Rak~2IVJX9eH`dL*M9X4*MS^UwXZ)Xy#pP!T!o+ON5QS93jJSj z{KMbfE6M(93|M#uFdlJT0)Y?SO?CU)p`1^$4KK(m=%giE!~fUaTLhFw1<|a4e5GgO z6W>~Z$6nTUkKj>YK6P}~4cDzEei|?T#CD^%Md`5fwI#r|i%0I~*=RJBw6jZjVFel8 z3F6Mg{9jh9;mMd;jOhv=Pq%Ktd_u|H+l!T>;O7&S_oY~#(Fu}d(48@m%V2c*|MI;1 zaM!r^$ygLBWUeBJ&zZ`6*iC7b1V*6B(-&pa;AsX|$r}|4c>A$Ar*4x3c7Hl4|J}O> zEys70RBm`etEB_I}{`Bd3N7m6La3MH$ zV&Zx#a*aFDuw!Tibq?@YiS zOZa^47(le66ld%&SlPAR{yP_qJWlVG*vMT$k0WdDGrEt1qsg=`skk3kQjmWeRAYX2 zDR@UNl?2wE#JO$kdQkbRbhEUz8BksM-f=sFf<9_bi4vWQNYZ&r@&x8$6`7mQ2CGeh zfr+^;RcwD;bC0nyW1g4h&^3i&r*8DGKlH*!9M{p@d&~VI`z>;8!&4=2To-m>&9x5O znX}#}ABW<&?y^u$z8;n(^~lwPpB2F}q+?!L`g03FBkz{Ad}BA#4`eBLbA=4@qAU)+ zb*@JYLLA&hC#b+H<{rxt?KxnTO+yX{nMY+gZ&-?7k&sl%t^S`F!&ed9dF(Z|867 z0()ND+}(M!d&vAR+vRbD8n#-`;QO)VW)=@(qG0*``_IlXUFi3+#}7-KH-1o3n`Ui5 zh-qN%^21}8=g=Lq`v3ie(vP|A7Mn+-=|BH4ka1n1MbeE8+cz5takz-(Lshgx!QH#N z(cb8|OK0)fN%yLlprgc4qw%X;(-qM!>ZsT)0Y&K^0YoaMsf*RCzB2j;CjxSt?7@=t|{f0iEJ1oo9 z_h1;D8mT`h>of&4-qu`{&7*>TX1%mYr&jRje0;tcj_Z!>ZktZ*#eS*b-2=J2F>rk` zCnD5&32YNrR3x8W0qz%v!waw-vsI6~HHGUM+GpFBg7EpAKH_Zl*Mb5xEp4-Oj*Wv8 zGd0Z3^!R)%GMpa#odITvuiU6Bn7&>pLw1iS?YS}w(4 z?tMOv>!Jh&XpCEHHJXouM_S`Xf8u)3f3GQh&hsy_ z%)1n{klUZ-@^KL<2AdU}iX8^uHA>Ej7)^nw&zix#Ez{sg(Dl|q8wy|z;?ily{q_FZ z<19>Pdr*VzfybhMX26QmaQY407Yv^u&CHB0qS2S#miht1pprk$D)9Ui=1~F_9@kET zaSrw1$G7qCE2hxnKIWK1m6P3%zUV=F_Om-Z9-RSki>KIP1}I2es@pFWe?O+0569a% zhr!J3S#3s|DZGyS%#=00pUZpMHZJ;7a9&W+SJOiRE*awIOIN#5Lu~3M=dT&?cw6;@ z@4iKJdp1n2uW1ooh{~@!i21+MON_V9;yUd|-72dBd_Q+zQ>%reDS%e(z}`JWB+y(C z`t-t)9;6xEq-cWeA|{!CyBCtRJ7753QaC zpXW}V7sk(JTh}do3&+*lL4Vzn`*EE^lvPcOeHOg(5?j#uNI^N0`c91fi)huMLck+p z7?^+iPOtHC5-jB~8P_UfKW{4Jl<@=iPo%3XXaBXM1TXE0e=3+ydd8I>E{FNW6w>o= z(_^S0tIew^YY<)g*^sKik9p{=rPuB_e{&73yiq7R4i1l0^Zps4f~Xy6z|eN4fu9xE{q9Yu93)f0Em_k0Gp!wHVD?v?Q}i;b71oS%DH#H}mC=_> zBuMCO=LPU*W)N`?82vdtJOY%Gr1oT(;C|aLwTJ^($AQ+Frs@a^73A8-3GZj_K+4w{ z+S~3fqtTDL&G63oD5seI>(U@{{jm&HW=B9UQ;w#l3KbaG{HNi!Mgpt3 zbw+zzalNoTzUA^_2imLRp=+PGjQ&{WO&i`D0&P#NiVqzjp^y0;bJ>`m+TLg5+*CUP zX7er{&yAvjoYtpTcs1w1?oelidKwDYy0w^0SJj1l&pz{U#rZp{x9w{D&jz%glM7V* zTLuz2cfLB9&4H-Nv{}WNc~r1q@%66@3EkzXy`T|70zBr6GW&2JD^Dn_hJ@?XOy62U zt`=ka%y*#GN@WPJixshEGLEC^122*#alcpM$gV>b9hl#WlGE4M#T?bmhnKy6lE4IG zd0rttpPyBf3ln=fknjHYxiPNG=$zi?rpZ#=j|&;AalTDLT(-ig3Iy)=k~7MsC?ml4 zJHzx>AI!%av?!as#qvSp0-DrY6maA8fv*ubAMd|G=~5i(L6+e+q^}IjfT~8OAoB(a z8qzC>_hMc`L+9Uoo97({a}T4K+svjwjCEXLLf149Os-G<=Y#V&aIDT(VjR54Up#zl zvrmY*%<{6m=lzkNc z7w-6e&KS$(c9XybCmE~!oNlDD`MK%!-dQl^E~j10zKC=rnJpf_T0~#2yo{N9KMWcY zD~LS*Nx))fuJKEq1n2~Y+h5bKfF9nR9=Zb^C@}0#i&i+6gFOpUCIw+$S)0w`;9bmB z>7C@fBR7bWDw)09FbDSP)}yxaP%60Kx_X%zpU)nG!KViQ-uw65hE+SpfeB;8KBL+m z)U~6plD2OK*tW{|Pmn0+y8VsiPjpLY<-qMZb===?0>7CCXs3XHtt>e)ZyFeWJiRMW zl>!#~eg+$hjDxesTux)hh3tH$<*)S40QSG|3~e_BF+XuX!oanJ!seKRbui~totrAg zcV-H_Z`t-dh~r+WmwN)YBL%!;Q*b$T3D+4!3tw>JxUMJTXHMMe44_ld4Y-9lW8L4Qg90mgCgt@`8mE3FlX;Q3dEzsv2bH_P;UP`lf-Jk!S+kfRbtX8lJ&$EK@%7Y7y*e=^R-eTISQ_wB*^ zuP5=it=s=TL`{QGqnn)X#VA1Hi}TZQ%#lklKV#h7(SyPcC{EU6e#~A-K_7B0qLXiJ z`1&>$5$($ZmN%q^0rz%VZu&f~&o6QAb$^U?0W2=0>MIm5X=R`6U^)(pNVG$h>^&&z z;6LA+*k61Vrg*5&P|)c6GwT2C!fVpCa~>)j!2Zj-@IA#n4FQOlRB zSSMBaWT$k{G&rtlS>eb-0Xzmu>-pGTKcq$+5GcfT#HUSLh1|0soT`@deT0Ipg*;W9 z|Fek4$cg%884QCB_qb4@@F{S>!OI~P`<;Kxdi6Yh6mVttp~6UPN0w8+S@w;0qpBd8 zGh?)~z~GbG_k89>)M=JN<2?-In1*?2yJ0$^2YqzxoajInDf#! z@5=DQ{GFAWYk23S7O?6y=iKE(MW52%j|k&BMQm_e+~M6+OojPQ>CQ9o)4T2d)dYN!N;m87ShA7ta+@zH`cZ0PXJ!p7x z?$gy-AS1R}S%$x#6$4V2&FmtQ5pbmH#0&#+%aV%Qr73Xp75aT2Q?-Lq+lfae4ngA9KIBj(qYm z8nkeoT92s#%rYvuo???gYL%QzN?Jp(ORPdcyB58gH?iN~EyiOlE;?_v)S?6RcMGiW zSU#T+5v>=gsi49n|HPx7QjmB35<{zB4%kBFdNT!UNRHT={+5dQ_j>py`gjdma(E)P z&!ZH7H`Plj^VMi@=R1p1Jm&2*r+TU^H3ir`icaTrEe70H6TOtQY_NxIsQM`G>->~d zwjkxKp%-T@r~FiFP~9>ibGD=u1rCFa-an0L=|#eJCp-5Kl>FjW1dOJ`A?#~#Ts%C8+yLyXEkzBd}1j% zP=;Ln*B`y#SA$d%bA{*eI5ftS3ZuML8Q@mz&qfKN2#=|g7YJ$10&HC~?IE3O=v2_J zD0XfL(u?0brtuVi2Yc=KxbS$kuR5;2?602#(%rpg0Zv7D zP3*OY*L|~q*^utpN3Ss#cb_p<8gn}?EL>;q;V~`^rgI7bCj@8=E< zRdt~JUY9?|FyAHubxJ?LA>b5v>=VU~gbIfpnOlYjk+f^+ud-wuXI3BO7VyG#JS*Xs zD;rq;-|fPk`JD>32b4JlT{_W&<=WdH+?LV#VEU8Xn?pcjS^R;j00}7vNtkZF8bq23 zw=A{PKLE)cpU1!AI)n6oWnUg(y@Q(Sh13@;E5I{nbb^YxrM8=Y(ueOYqrFTdI^o-x zd*9>5k|at(qcU0Us(m=lOkCbt%N+sJ5lfl(Z2r$jSx<5Wts$CO<%9oqSEH&|3x?!9 z<%lwq*Ui^ig#wQD@!!Ye&<^C6F|lf-fJCPWHU8K6;G21Z@~6K~!0=zuyS52yh$-m= zdH-#!FVGT7ZV6ujLdiuRnnXH~{NBjGc7tW4upoI{vU?C%7My(~l0ZT?oU%Gs$_LQ} z;=BI=%qvWoN!&iCKn3i_l~bM+lE99c)=AQy6`)od!S(502jU$t;qb+A_^YSg`YwBh zfb=o+$L|^m`T5O+1>!ioIq-$Cv>(=o?Af==IS|*k+wD&kye5Hr_8WWXcdmfKUvwi~ z@g3;2!K-~6Ay_A1wf%06Z3q;;?z>ncO+p*y=VTH)G0*j2gX5*=2rxX`!q$tq!FSS8 zyDv|YfTPQeL)2+JX2u~c!eg)#g$~H*kh7N&SDw^U7Rw>PZAho{S&W3XhMR|I@b6Ud z-Obc_9EX$rz0{s40oj8{6y^9jJ=_W2zJ8ZgV z0!6@8L67T+OvL=RGOXhalsx$1q1p(rlE}-a$MNc0_e%|D?o5Ni%O@}P9HxL|`=JG2 z`EgL={QDOd)=isOxQLfn zv6bVv*QQ{qUWEd@_oVr=Zex2d+l!--Y{x zVlE3}opwpz4*i-b@OS;Axm_aGQ>QAvV!B8HLlfd84Zd-Zf7kxf3Ev)cj+K921K-bf z2ffhme9S#d{^omld4MKLe=>-F)^PhdE#|qBRY2FPD)5D8ph*G8KVPr!A3GL2f&K-_toT<>qF=P5WjwwV zL{3{(mK|#b8yaU1=I2t;Y5t<>gSamu;J{cWg1NNLXBrjvQ>(#%1<6N%ZxS#h<#_gR zkkO_ai%N1djyK#}we=rTPk>`D=(#mLuBhd<~-11ShF@m!hGsj~15`YmtnY80MA*mrZn*7YGTWGniBABVJ}bdoov9CSZkeAy@vW8bzj!U z@!@MC;blqCByv|={pg0j+ovC!3@QHafKrX^W_A=6o$2%SeWXhU>n$A9k412tsUH^n z`@?HM{~s6iNWdg$H9cXVgt>R;lRrzWxu#Izw89mV76rMQyr1X(OMoZS9Mb87RP=Ml zruwQR8C18c)#hNGfRpgXlv`yTa4VSpRfzez`BW|X8`%@c=)XPDOfM(VMSi&?jt3N! zc8f%tm)#7cPY;(}{X#_pI>7-fefHEl-yg2 z`YzHiE~wWbfr2?F*W>G;rYV1Y#qb%>z1w@iLAV%5Ppn-K5Xk{Fr_cU6hT{!u^>mrf z_G?JxW-ZT{IOg}a4tkAVFGVJ5CF~lQ^FCCVT-SJI9VBtiq?+qy0U!RxbjcgVK=SGN z#mo=cz_I(=ozKN<=-PQE?cJhvwT>OANQwJsv@VVh#kCB6;6Cxy(>g6FGx;%*74}wtdJs$uZo4WVzJl0cDr5!3U z_dcmn&gYNg)xTAD{F&uCkSzE3B!|f|^09WP=N{vYbt-BI1itjm zNm>{~Ly|i)lJNP+O24a4DH#D4->(!U+fzYuU{V}A?l-DH>WBGN%$0@~v{i4F<1r5C z;#rjx=vF|my~eKK;&#-Ykf7Rxzn?1yBG;a-3;~7lhj%#R$I$L1&y0FJ)@S(M!2Zg- z5nz88$&W=)fu%`1NcJItOxxelv3Pt~>OenZcS#4@Ed*7C9xWr|h<`smZVZB%HVLmd zT$h{Z+WVYRIfyQO{UthYFanrV9d+q!v2IpiQc%Sg$3Jcp(H(zqp74*F{|f5^uYB)+ zUG{t#*@7pt4_Ssl|04Be@*@&@`EDdU6<=r3HPvxZa|BR!TzdJ#oeHMYFI=E~N&=%^ z+sTUiR)CiGT07k+u8V%X=VltYjEbJA#7-O<0>*vMggXF^!+F2cc3{r&5`QNxhtmiU zsLVTm>kbv1Tx3V)++?&*AlZ4%Y7+HVx*Hxzr6A>+Y5RrF7BC}xIq3xUr^1i!O=}*& z{U;gsu(V@Tbm5qk?e*Z--~ww6eV6$pknA_xJ%#yj(J$aNci1G#-eF}}m`p)i^5Q%H zsWyW>qF-f~yQv6>z3ei;{;M;tSkL3@GFshdTHLo;4gBc%l0Rrq0^yfyr-zCdq_f8*_K|^Jv*KJPwyTZfq1Ue5!~V37 zjwF9%5>WhUi{Fg>S62r+i^2%C3#*g5kMeI*U{)#;y9mM19 z>Of}yVJgz|I{I~g-fM88^z^+eW|LrJ&DL%7_XMKm@jtf=pG152fiv6qxp)Idyj(E% zIc(&Wt+j^r@FgXj7Y<=P(>6C$URp*$lI~k&x2r*?z*qNv?3bmG>Dnab`S<)M==%@* z<^9TX$A)noU~j(JNKG8}%lf4bmjAHsZ=%oT8RjSaX^PWh2A0wLeW zFutFOd&}JT_iDJ1f8W`u2C;BUAJ8i(MGu_A(nizkQN5!`%{_jczbmopru1b2=C;4i z4N*lvgIsic`cV!TT=W*0&BFQQUzHLqtRM8fL%HI7e-hmcz#u+8pI=`iOy*y-09Ugz zO$I+II#-+joKB1kZgopjUWrrD?W4z8?71qz@p9Yj9QR33q#b&H$2l_cFyQ)O;*D3+ zbooE~FNcC^HK+Eyio_#{l;W|V1F(0a%I!g+eUPfCLU+#7bSAmBC%indt zBuLhmx=3}MK*uB-bPiQbBKymNCw6*JP}fscgYMa8kec(P<{&m%fU zBdlZaxfqjSj^BIWAD8mT39K`yomlC@=Y#GDs#+J;AYX5%b-ub{q4T)X537i$iw=6S-#WtS8LF* zaykyat`Zc>X0oI77yL$GzW+^q_H~@M z@5nJ#v%=?{>k(PD7uQ!pap%Tws}#jgj_*F`Q;T$U|EM|dU&rfVY^zx+(?R!p zVlbeu==c0~4j4$jUP8w64n#Ck^3t@ieT|hp1l%zX9%z_x?o9#Ocjo5udHp){{nYW~ z|F1DL-r@dqbu|MK@Hw$FxnhmZ1;P)%-&1PivS z8glR0mBL2=|2dv(h1d_Cc6YSBf%W(z3!_yr&NZl%XFAaSUkUoP7UIzkyw{M zhS#vD{koylmkBEM3>?*`OF(sAL&|&W98hAQU6GZ(hPWld9uDL8l|6YSRX45%C5q5Q zxZN#53JQ@k9banDKL=Wq|E~f6@H2d_630JI&uHBDx0Qh13_txlj^}_?F>m3&_&v2` zeOQWBT|+CsLS8-Qt3nPS`t}soGw7<&yimVTiM(jZx8B*UgH_GrGa}R|P~W+FZqp4jc>yGwVZ*_~MsQAwqYAX~-9mVG?nVavdo;?EAuX2VYW546} zD(91+6A5sf2~n-W`EqQj)eBu5N2!heM>igT=S`eFySP7f5Z529QtVuD-ktF7ic0$+ z${w2g9%4BHL=XPS-2DS)2SC1XURA}Eia<^`~Up3{vvPWuX|WGqlCqc}XT)FgRGCHy2HM@}4B;qt^6Pd^S!2Yn{tp1H`yD$mP>lj?!&|E{D9s<(${j1TI^wRCZ zW94W?d+V)PT@5Oed2;tIUPs2sVsxmmA`O@aM898nS`6kQIJx{cvw`46Hou2h@34?< z@~@m;2Clb@?-40bClX!_?R-7v1m~R=XL1y^iSXmQACRTe;ESQ?tebh);PrYJ=Sl%* zI97coX~RqzzWoU^bwuyM_vz1VZFfB&E^zM&yvdH4`;008;3iL ziSj7HyLk~taI$Q`MPt|vTK;?5pLoua(8=8|Wx3)3+s^|bF1`e4vsh2FA>jbeZ+vf% zh_xhQw=^Hrp0tC34pI>XCyfYO$N90CZz|AB$aGsI&>6nzOgfe*U`|ZN7ioF?aD|Sq ztrm_L$HDdd!kDrc7r3QA{Z!J{oZxp#uRO}^44XNRdK`P_P7s+J2A5|X32v{kkCnmp z@PbHwkA?j)B24O3(LGj2*bJLuc%>tu^6!X)H2b|_mQTe|qs@JUc6`c7ekU(@&f~Ry zl;s1WO5vTrfxznoTL{rGw#yy9V;2zPyP!jK2ucb3mU4$8Jmwl^J0HWWg1~ewLr+L4 z9IKQ6bdxZ0W^^ESdqV5u`%(-{?h>c5+QPHp8qB&Dx|{vc6~a}TyodRlCS>@U)2;SO zhNujFYD;@30lJc1<<>$BVQ3wgzqzCdH5UG8>(CfML96%`eIY9tE0PtR$Yn`1)tFA$ zW!xsT$a`g0d)#5g>B{{+lP1JvzFxX0$5fblU(stS(HwTPp4{W{&K;iI7B&#Cvw#~c zpWbDNK7^(*JonW`EMP37yGEqA0uei2(pTqY4Vf;6z7dVSMr5ma6(@+L!15=_LSKf= zpz76rwk=(2XgtU9?dcbDxGQ*~TzuLc+VQ?r)#r03V!s=Tt2|O83gCXb8|SR?bKGNS zOjIX?1C$14z9m8i#u-HS!WI_C(0c8#w}#p&2gNzw+d{@47X@Fo_(Cb+3kKX?uF!PP z59uLsQJ8z_y6<50Wn#TG>bgER2Na=t#sq^z=oFOuP2iwD+?x^XXX7A6P(s;uhlJ_E zr4AEnbd4Qsw@7RV305Z_xcu(TxFbbO^WKJyFYRHiPl}%W12LjZ;Tx+@Trx!Wo@ag( zHiwbh_bcv1*h49%msei=G=;uCa=LqioZ;_e+E8^b9U_C4Z>nX`725xDN~y}aP2_O9 zT_Qr=;TWyb;NGLLP&@RnV0x1q+`(pL9p-qOD8AdAzWclztRDO7#@cq5Fg>W%DD~PI zE>#}ww4&F8W&bK7ZM^~P{1{54CFsHaijvn8R}&yh?}62zGDpZ1kzaeBP8yyHDU(g& zvxn=YIjO;2?u0D=D!WIBKK%7PW^=vI4OY^YJDoQ&A~H`i=YFyEfR-k@I_f3y&{jIxcC_n7Jrk|Wcl6TQkBr;i7p%BF;&CNoYjSBiIECyigJaPKKGazl8lJa zb`>p2c{liP{OZ(7X&4kcXr1;{#|_p^>>enbXjO0^P6$gpWfgLV5**?KZ|<`a0Y`6b-8k$4pWN(OT4;@g zdq21B;AQZE+z*yt`ztXJ|4uUAi1YM@?oNI`nYMiiYjiRv96$F@lit=-5wt!1!~)A&mP^!asO;$DXiAlXqe#ES#l-~DPs(ZD=!}LJs*^r{@ppteTPq(pDROX_ z;oR78xdUw881YzyQVGKTP?Sgr7rCXV@Vd$o{&+ZpWNEF+WnObl=|$_KVTC^&gRg)?{I^ z>U?up7P_+h(_I{@Xlux=yC%W)-TtpsGcBOkE{3eX^5*cFLHs#(FAK;L6xnbv+7UV% z`f>hF6NP0KYw^0bqzI)vgEjSgro{eq4*HdPNLUL?0)Fdg$eZk66g;F!SaBW}3%zAZ zSaYwuTy@nXiljL{_TQHy)}(8gWvD)orahMTq!#(=1?RE*^cIknPblh!3G0IlV;2y^S3y+ zzZ`Zj-d)t2*4i9Oay8SO$uuP0+E1H-N6S=^L&Q0`R-0 zt@z>TWO)5i`fsX`1$52}QqFERfZdUAi|@9YL;6`o?w~84P-RE}x-@zbG#gWrmk&!5 zuP^rsiSSb%Y_F^6*+eMS`d~H{$CW!Ux4!p1ZyBiG?LR#!4EeEZ~Ui zPo;ccNn-uO;<*C+|NHZIaOAMc5VHyQek@)0fERum&Rc!cBP5OWTC#3h!q}RAeg85& zV#Y+SU(qcI3Lo-|7?3rE)Lp`R!_Qm7y)ogL(dA~){b-wUy|_J;qu)H_9;yQ4KVR^i zt+a*48BMpknq&#XnEUfCQ}*!BwPG5^*KzRDyZHR)US2Tg4}E&x`c>jMqv^v6CNEg} zxomDF*q4|$Kl1kRerFgG>ls>RBLnjvSBNU;8Nit6p1)6WuEE9kS9RLH#6!-HO}{;l zTS2MPgLAdJZoxs3bpN_1mXJsvp#3=IMg$bhRu1-hLA~|N?JIibP-Ttz)~Oqpp!^*_ zOD-idn3(rp*MT!h@Qc93=+!1W_&sA~=F*rXR5a9zR-UkhNw&+W-LG#G{`7SLVAvbV zo+ShsLNo{`_nm`N8@J%7&B?T)u4{yb?WM2M)roMbP(m!H$rFBi-F7zUiV<8>nQeac z*#qjMKXEIH4ulVxx_l!8`&sFbfZdWeA*oG<_*-!uM*iyjd(Ynh=3b-bygPJ|roa)AFY*Sd8t@{AC~rDchOF%W4ey~>hECVv)mPOP@BmX`wA~4B zA~{Rs*!fB~LSr(e$#qzmU@x!$#vbkjd13x1aV!Q#8?0^}D832v`d$t{`gxu(+PyjR zcTNW`o7ZWkaC#A`0!NLdpqG8I8_>k7ehVa*?kBh&?^a-{1De@1^458x{8>()tG(o;5 zVZHKClXx&9Hd5RxM&zkfJWTqn06C*SEPTByN>uckYZwH_!@FJm3-mnrIscrq3RY2s zbFXcTRaji1sM!1WGO12*@S6*p+A(+7uLxh2n%y8q4U~G?vE3cwzSCRIuTF@pS@7P> zPK6h0{N2X0j9@|FFNP9p3s^g|{rswgA?#V;v)t$D3$J-<{!;y6MqC}PKCix45Z@ z@^#lOo>@Qmren;2+~`2O``(JEf6Sr3+vGQ|=Z-`O-)sJ$dr8nHPCT|%O_9)}Ve^jK zHiu2EH>T&d)d+?YM<%7^Y~g$^r_eJRN1{pMKeMWGBch+`YbU4Y59h41KICm05{U+% zP8~B!gp^6^iZ)scDD{XgHS5P+$Y`_l^J>2ZY*Jge9LM^#Nra!y%++6)&_=qSb#$DF zXF>)$`RA?SpQeXXVT(@0BDwSrcR~^@k5`l7x}**T$dNzv_SwJ(N7+Bci(Z2P%|E?Z zbsb=L^8*nDTW^A56i51QZA^@F9^%XVX-@oCEp+!iG9?&Q;2$2jI4B^sT2}Mi0&<*} z`OIo+++!z zVpEa9f=E0xxXP32LRd;??CfW>Ar3Km-XfUIi3@ zJ0zj(BfH!uG;we)nL}@%Cxm;CT#1!(_8=sGCCc5kH>4-r-|?!;b? zv9SG`ZiLs!D+whtbGXn(-Kz%OiMq*AgXM%6$nn|m-q@-Qe0;J%I?%`*MilfeIAvNx zUA70Lb|p>X$zy{^ou79I!RY=_YKR=PxB9&88)HX^en0=xokqF!{@G4 zn>nZxO|vb`J|Qs=CGsY)x7Kj z+hq&8^r(HHixK;3N-jly4|?@8K`+RW!u_joAqw;BP8t%#i(pc(m(adkA9!-Wa%ZWq z7i2PiG?^#u4d1=Uj)kFN(8-0B-mr%Z8`N%1+zE8XI%%rQ{R!caq0PlhFxwfkb6%uj zpU;Ik7IKTTkM?v*vh3MVgd!YZyQM)Qzihp67y1lK0A+GGEG09vC!J&l} zJ1RmWU~kay_0foXxIIZ6I zfYIbB2zNhXe32FiC-un9fzjTWk6~=J=VlPhEO}AAyEh(7e_p4G^Gw0{x$n!@lC5#| zMbX*Hc~m(Ey1)NqUU10_CODr` zO4}3;>Dw>flNL0AX=Q#9)o;WgeCg$O(FI}=QISqX5R9ip^EB!1gh3ka(P#IRLh(E7 z7c5nm3)eoheWQ^GhD!@o?PQ}c_*VW^$>-TX=+Hmc%-t6aNlsSUm17>bOYu(98FpK2 zkSQ(KC*_9U{gCV{NhMW25?Am`eHyEm~`=#;+ z_(OpW4%)G$cuWw8n;qW82dQ=JKjhU1;(>=Nn@Ha5IQ(sH?p!NHUo07)C8meL_vMMK zWp4s;gp9o5Gx0E3ZkwfYZ*(h^c=c3_n52m(Eq8SbXh-2X;|D>sU!8E0(1(~D(I_n2 zUwA7)BM&A{Uk=+hWrJsEs-&e|ovT9|1NGA8NACv&P_-SCp_G zk1XL&#=Y5WpF(lAr_5dZize`y!`YlenYoam*ViNVgCCSuVqa(t3&S2eFKZ>L`oVXD zU&Mo6TEkOCBdbLsmRMUbthdi31i$VLo20)MiB~L^jF$HVNj385-izNFCb$;PJ7YnQnQ!U= z30VK<^D3&<0$4rCZ6CFuj&+(_&FCeaaikjB#SyBFU1XcAyE{U#p()Q38b()0N~~v( zUC_rW-fEj(%KPHx`m0?*W(N3Crt03Hx@@TLSf|$Yaz7-B`RZ0F_~MVOG0dtz_rvah z(Z%MONSv{=f{wwX!`Aut4V4$G)Z~UGTa;k z!?%Q&A6SaQ0-MKj-igIPs}6pFg1RJJ9Xy!W%o$0s|IZFAhK1wod6nAN5z$ysudhvi zJ`|^3FcjwJJp)0I%e%$_8*El~?5_S$H0G(A72=VLA6$_RKylHBO zT&0dP-mPcRScH;n0FKCth@Vf@#@o+1OmkRfLyuR=A^mxY z@O#wl&YMJkd}@?=s9!b_N_wxKhX6rp=}#-{`>(BB(zGNSY+CKJo~FlGD=8Et_q6g&OKN3qV)G?+GeM_MQ$60W`F z=<=+xfV9EaV@gj8z_Hv7C8JamD1Asp2htTlxwz2M?G(RuUvEH-Rysdy&0-iF%Q44F z!WTw9uf@X~g9R>+0^(phi(C!Y7JodzoY#*PIAG|3SHd5LeX-Wwdlvim6u^mNsfj3?J671Yk4TD|^-z{9sz^ zl}C?a0`Z6)<-Bo|Y-sCuOY8I%C+NU-?B&roKWOK@^u&GI5vI~C(sG3aVYk3b-B!P> zp>|Lgm;cIM+_S$a(mYcGdaw2Uc+#4H=@NrV6Heqp|B~#XkCOgSo_zBz;0+??i zcfm724-@JVqa+eG;bgy@W(_J`EZf<v61%G4SS1IRyz+zO3x^H@{c-kqv2 zT4GS@)0i>t{>rsmjVTZ2#L-8GCXsJX4cUbfpeb161_wpxJ2~2{m~)^)>v<6ZPC(&9k^!U=Aa1dqH%jY zte^|E0&mOu=7m6(eu7bawmV#2lLudxWU#KH?t;W5FO(%c-euD*fR{3~MZ$D)Axb_X zRAuf1-88G(PfUnF=h1?NQ+ht|^``q(L~n11qTa`Pe6hpXbIU%?toC?9sj*UHIRftH zd{Zf}=ZH%d_?<772kb zT*+H75#AJp6T9fX2=HaYJQYd^fIw#$Sk1+P2Lhpll2ZHttrINylC;jS5r74QRGPkP z`rz#+Nlk=XW_Uc6@`8|>8MJv@Ye&6ej-~6Iz~JeVkP9u)7H-#oCpO#QRT&d_z$9+A`(^wdSRp%nA9r95 z{P{LEC6==OQ+|fK>7p+m_qt87qoC>wf}S6KzjW~HWPAvY?&S(Rc+(GO3Y}Fg zusjXlbOd?d7c+rY715VG>qBsz&}p@pBukhp*gsQ7_J;9q5_dfl3&qUE6XMO3deFBr z3aPvMW8+&-CkHix@zABY&MTpLkcV44(6ihF_VWEoj63R&Nn3X9iHh@tHwn*yjP?ab%}dJx;s*4lSc&c|q%HznSHK%9&`yt`TR7SRs4`wPA z-)C&=fbEX^yK;T@#bZ+AVU;rlFnC(|u5!8-9E+FB{`A8h*Uhp;*hFYU#ydPSO2>TQ z_KeNxEi@@mt=71@$T1Q|Ua-GP-4Ki4N2cp`tW)&bQ@v?6vC}a0zxJhn?cwV0wW ztncEEStdL+ZlR%76Ne9n8MeOi%!AjTeOZVRw}r{&3Jy|qOQeCp51rv8Yk07vdGn2x zB>0(MXJ%T@4)5|l;AFlj7T<~b?0@S-5FT$;kxEI8!6v(04B~xGK#fHiji;LXpvf%F ze#f*REbuVfQZy$&PNnATZo4F z;P|zM)Ldx3aDU$`>I1N=f@7h{F%fIDy*#N#OoE(|sU71Kdtf@&G3|rlet5;QHap1M z7I#~my!I{B9F~ZSB^0t+V%2)TX5r#I_%-?Py`EQ*_`ZihCSj*3G&$9jvUPJLUfg%F zsA!!G^Qat44!w_rZ6wv@lkJh1WV!B1Tk(aIyWtiL8C1qW8N2Q+AxkUKrw79_COB6f1-J_z1&Jc6n_n9(H zh{98y5_UB&@?fT4qV%nFJDAWP-e{9$fDONeWGYXSVgG|4XTN5t!J#Y1FWr~0#Y=Q= zni^|7F>eWVQEY=BKK0^mRQX9a%pd!Kn=$MZTvJ!7th=%gHnixbPrdQOyFRw)7|?JbwGt)uAk=91wZo)LJo$giWi1!C?XQwO!iJV;`B=Ffk9 z4_s6}eCeBG1imfeCN#mZ2M*Qm`Y2}|h4b9*u*hRIRMEAJwzD6qCA;GLlw zzA!&s@Z>`jjCmLDDfPw|hE%>C+G7xlg%)qTY9R<=(!)1v&OWg?v?P1$DN-&h4t;m^ z>k%F(P(F!lx&$%TE-e(eCIq{>ZAlxsac~=rYUrJ-#*pRITGOU$Zus8ZWhM^O9r!fE za&@W=#s3`Ark2P~v3F*3?!E%B@k(&7(3K#U?F%{Vco?KlB73|eVug1WU zDarE8x8AseulrfUFf9~>^Da52-uUWw$-8td1+Z7s^BAM`F1QlM@jS1H8HO(Fjvce( z!UqIjrro>|3)7Yd6x=EzU{0B-=~G7=yk@@kfXHqP8>@~4DtxoS*B=?jwrwkb%I%zn zGydu@T}d@uE7$}k?X33OWTpx)dyXng#zw)`A1iXo<6*E#L)yzCM<3UHJ?RT4*GN1s zjc;n6C*j6rvFXdQ1yHf&3$iGr*ynj|>K!+Jk&x=pJI9k2km(>@YRIV=NMLsF5~YcS z1ANUQQd?c1w%+&z8|91-)LeZtxXKZBv2oHY3lzYo3@1fDP}XBvhO&Xbqkt6*4y1k{j}%A-QMD z!NUb!eb?C`el`j!PaiHA^LB;bA=Qh%k2>&U!i7X;ihXgRUOuOH-WAh7zPTnMtP39% z3-0sG_r%o}PyOeA(xeXM>pN56OFF%lU1mX;)vmeeftDxM^oZ=aC=-PDc6f~%(iFqR zZ`V`K&PBqBrCL~&vIkrCTE9(Ii-h3=Kcq}NT;W&l1~3261jtmX{5hiE3|h|Z*?ybi zHl~~t)REb9{Q^H z?0X|%OW7B5aG=x127Z3AMVE^;8WwwXiruR*#ofe_b(Q`t7364mc->6G=|uzvnQj8V79NfhhyTQchhfR~hUI&K9!oF?;4`~5!tg*A( zBbnY8Du7YWZRNpu!X*TKA~4{DL+@21{e$u1qbtYkDC?e#DQ9YgXbm8NcH{w(tEXd& zMleqUlQE1WxF&So@`tr~Ew!#0hv3c&Di_>neQ*XhzkU5$ASQOamvK(_#+~mI3a*L^q`RSJlOg%Q_RotV5KX>U!| zDZLonm|^;6GiCqXb5tWFPuXwdxk6{_yg336mksmWF^s{65uwiSHo~C8vmG<9-+SZ7 z!(kC_X!u(1St6i=7mBsYt*qSk*(|0S4(`Y%+l7( zFCX5&V8mOMMvHqc`uaAFYvOkn2l%t^$l&Xo#fROy0-!4C`JGFx5pd4NrQkkgUsP!L z=#`CRNgT%Z_*DC(8>Z#a8`{4$9}W+ERj!gG!}0B#WBb#EapOmeej{ExXl8A^Q+dn> zmM{v?4>QNXwOXtEqMQC$cJya<**0w$u|+W5{bK;Gx^zN7+B+ZaI7xlHQP>7kUfh0J zt*8rm2%8B)7G#`dlTUdSG!90^ihX4G9tv%<@ROn;f4oob;?WC1dN>|kdz(-3N9Lvp z3`ZW$hpDv5N4pPEB4O91&)vp)7-#zH*tk;k!K~m(B4vGlN67_)=o-rSO4%#N+o}jJ zHZmW|yGz+uw7sI&l9>-Gr<&J_vQqZjq$U~=D!m}jt1~^Xd%|F?-`x(SG%xr={1m6r zf(B$-4vvjfj)7g9+MlHb`$4neufHDo#z6m@Y(Zx%{a{~Z(I{%jfro+%dHbS#;QH|| zY?D$kP^^fPr}LUOTueUs!Qo*rc0J0vwWcTqJ|ccNzU7xK&I-NCk<2cITir{UO5@2m zIw7HHz^)ixx4e2%Inxwc^9$?k*&~A^cNFw|*ENL$$<4yxV-l40Vvk9t?3dUzn7DLD z-xfa<{S{1-lfwHuSp4)~+hdV1i>E)w3m~(Fvs|qFc34`}^|HQhHzs_G_o6y;ht$F7 zAm4-Q#`qoPaUrsdqU~_RfQ6)~*Y_2<65B zeMMEZ+x&~C&6r5i-vu!T-c$fVMU#w2g?JxSpt zy_4(cDb~luYga^>pPMe3NW|H z9Ny0TzGk874?U+8KhJa9!1Fr|iyN-S!cUFV z3vRAm%nF1kI#biQI}THe>S*137zDe&A9(!gL;>_^e3B4X5Csb}EFx~K#bGt-B+K3x zk#L76XIeg|H@@Jj-putb42oRh$wvfF_+zt0|4el#cF6Ff1Tpo5qD2W$j|ApHyVpW{ zxplmtbe5&#j%%U#Qur2ddS(w)s$G2LdesNJ3Ae9sE&Ia8&93(S!O`%sc(`p?G{rBR zWUqITEe3jR7vW*#&Vw2Xx-%mW5@8?LA%U&N(YQ*jdHBqH0@RIQ5EVHRhl8Ik)MrHQ zhu-Wajb0C;DE6SEPt*R-9g(STcvlCaF}GcyrW|__OwQj^cuDCc>0|PxK!a9h__M^1 z|Gc^=R#{0PU;L5|X$V{dDguG9LjVxyDU?7U5tJDT${RF)0AVXZ;?D&YWt^a={Id@a ziv69yN=+b8{{PAQ8(Vw*{!5_nlm1YuKiu>Ly=XtL*of#q{5+I9zn}H{qYo`0*-Ri_ zQC417Nk&0lO-Uv|)nCcSTV74!_x<1bfAa?Z%|Jy^|D8;rqWLG`${$1^{Qa8$MgOPt z|5H7G*Y0=8)Kt`e9zg%MU1+FU>Nx&9>znM~NB$u!6#n0z-^|C&U$}2282`mv|I}RH zFUBW2C^9xEBK%MK@AlgHm;ZM{WT;n6Y>4KtQyYZ;)U3pT?!!|KHmE zcb)%f1p+}qF6MV}{|~l1)t|Dt{*+3Q3j*_>tNE&bT7kLdA8Kc7VDS4}Z2ZUPZ#KfW z+JE@|X{CQt|9|@bl@>5IfY!h3>h!n5q`y@Dul)RlgoxL?8%I()Rwx z{r?I6cjM*1W&fXK{=dtc`1e7~|I-8irvG<&_x-*1pKbAgEoHR)=M%X6Prm=i_Fquo@72i4|IR1zm(Tj!|IVlWmyh)0f9I3` z%h$X1zw`b3+hzQRoc_)J{~DqC+k#Y7{|N5Yzfby?ZYBKF1Afc*Z$13q=@&stp1)#G z@QF^0iS-H<_`mfp0k0T=s5q}!zv%FPwGx5Qcw{`c>A3(kCB_*`|(#f>WTPo-Uo%7!77nFdqROCmh3%gOh1O5Jn2uT!hS37>7bT@F!Q3He* zYCyE7?e?ed3TQ0haSz`cHPmDIRM<^d5p8kRxwgn;jVjFgelo}_g7~H@h1=Ei5xtr4 zMd6*g$oKQOYJh@1C@-Q)I45d_4k?{pt~&?Nqhh-Hx(qsSs(d~^gH;mTx{{T-prV5G z*_}|mmLy`c6VS2Qu8v&KtzBj*C!_Y8m&VN|?7%VQsI4-*cBso~*s8753Jmtye}6q> zg<|xs4sGy>fc?TYq(lZ)bkNDURzT1g3D&%&+pW(C+V|73yGf8xz=0!f56YZD1W5?e zwpyXWgPYzQR?-9?rz|?aRxR{q%fa51%krq=&2u}}CKm8Em*eM>wF+um)4S8Vz=bNS zS`|MYG(eiZN1yBYS^y+uAvwxVM)96S0j%$BLFL1VWWD|Nh`P}?+M&oETKHd&z zdR??rCG1?d##Xd`Q>MKBB^6L)Z@a4dfrJXZxXT7j=ZMpD_saHoY)1wenG-&O%3yp+ z{?zv}K~TZ4lw_5|4CI&pU^G^FrI!DjAX?UYm|A*F39()MgMoNnP$Dr#6pb6YPJHoT zMce+tz|}S4iHH3*bb|lUJ^qYM;OgX~Ht+4shCqeqg zgnIm~y-T}|k^7HoO$r7ya%cQ^b7&)<7QTQpT)P2ZUGi@X0(}~*tA)3NPlhd8jq^-s zQ;uAf$^`G)9#a6kXCKWN3#%i|yRBjOE~=pC-;7d! z2&sd`o8A3cwkBZlL9@e|7}CEOl}gO^o)XnZ$zK@jzfoKNi-GDTWBc@nyAhl^lXEeP z7yZRxN%O@;IeI-nsv6Oa7?S`s6Dyd45wYtWz4W==sIWbk{(6r&qP!3fC>YcYB&Kd0 zR6?Dy)HDycKeZdt#oYgOPzjL5N3JSn*`Z3m(28xE*5Kr(2!Fi~HfX}g*sJjx8;CtB z$>E`veoh^_?NrKHw8gNzWKpF+g}M~L_QiTY9%9sV1jco zhdpSu*&On!+6J+tjocNDv<5$l(#~`Iv_{WG6Lw&GR?vSxPI0=5%zDDe(>$>x0WlDB-~2&gfJzpp$!nVRxJ=Qs6p~5@kM3 ze6N1@!{}ROWb>RMJ8z!~(&XWrd?TZTXfoQ88rD?NtMgAQMs}Ei;u$p`8F^h4lB&Ju zbLJK_vlz-WzC#^d0^|ER^`*dTQnp-`pAsrs%O3IdRYKMo3p=j75&;|^e?-x|HA8e; z2>Yog%>X3`d}hog3slj1zx-jD1;8C%Z5f`{$l@jMBlf%UAobf1;i_(V{Epbc_ zwLIC;suQXS(#)bKc@s6!9k9vr5)B!6lDa3%*$ojd3|3H)Uv00X@wJ%CHlH| z?galKeQ+ndaqY2{8H(*0QMDPB0bZYcLR2XEtgATf+Sg@Ja#Y*T)0(kb+8(rs^GjWIDAi03Mg^fsWY)t86lcA)1SJI^!J zlaS?X;wH@_3Lt8C@rY5H5>l|rxWstc9C+;Dc1>9)fw#1+cQ1XE1`;fPFj6}!l+O8# z3u%qyv)z&~L=0X&zcJW;nC|^}wFruJKDNP?EC3?7r>7_wD2Br(10e;FVbG-gDM}u6 zeH8wU5lKp7{M}hyl*7D5==7>Cy3{H18-uScFHU~yS4MK}afe>rS4ImB1HUma{x!Gt z5v}Du(=%c^=sIOnrC6OD_-XM6 zgYG_p)AilcM2mvPAjzGRM2~A?W||7q?I~x!IDbRp$klW5Vw;E-+Av-Wb?FcX2W?+U z1%_y%q4xvrey7CHW*1>e3I@+SGVdO9}SDVk#o$zsr_y5grX%< z68M9WM|a)U+Pey9-ykw*9To!g=nn>x8`9-Ft@MGK$$BQ6tvtAN$nn#hwLVJeyvA27 zrGiH23r5CSO%O~ux??xD3UK+%Uzcekj3$=f67+aj(QUEvH*BoJz}zOkw~LDelHK^< zJAb1`e=*uWd27nsKmc6SKh8G)*y3M|>fV1YatPN#H@JL9ikaBJUksS2GQRIt69uPI z?mL}l6a|uV@;@jT<&_U4ojRxj&fASS8;2O7CCQ}U82Q_2mK@-v$U)tid^u_oaQ_E` za34}|zl|Y!@a+&k!yF0xVk}vqiLysq(#*x)o2UVu`DI7CCUtaC;5kz@jUfW?xPh63 zK3Mk>kmS=fMfYlW83P?`K<0t=>Y_G1B=q@S#j#R)u+(BMl(VjhWL;#w4tGg|foyLl z5jkbl>GF~4N0&5OOegLXBOaR=mUYP-wcpt;~nnXG%`Ts zRW_}xhz?RV$=r8}UIv_8>7nV^q>eO(+Ri2L$)Mfy(|0Fr*ucdziE&EQhDfl{F(+-^ zniAhWr{3eM6-oeP+6e<$aGY{1*J6qh+878bVR<13R85@E|bB{#mjSn@esWztYv*5po7A_Gqz|QP)24l9d)eHYT(Tx zbj}wvKyOrq8P3G0p@~<#y)iv1sMcR(*E_{)q8x?M6u2%9X>BX>Ee0DdhL z?NLYMpwa@hbci>Joq%q0NPE~MZ%1M_v_WUt2;dacRe|sGL{vs+(jCoaNr_t&ma_S$ zCAeiq%~qPC16<}@N4}D^KzJsL)0njuI%9BktMm<3;Qc`S>TzdfaO`tUd6|PUVi-Q7 zx{t;LG})M)sr+mVPB9jY=Y2LtcN1*3)7I;w($&?&t#^qa`s#5vp#~E~b{Fb)m)H&D zb3?BDe5QaZ&K)d$MV3dadSeG#fgZTMH_U_al_`1&>3lYoT2Rh)Txqs>Zh$^q@0=}a zCV|h?X^XGFnxnpe;n??4~hEAh^3cfm^`IthZa;7qp_y;4s8G_xs02{h!VC+xe zu|iVQe=rEESv)%(L_%je74ApoYM``#Fpxad%(m5+2ri{oK4PTMlR+9A%)Ug_=1Wkf za?wSKpUTFT=XH_l?)&A`F1mn!dXHuNDlbwyT_!jLcA{xt!Q6wZyg(#r^}vVA5jWT8z@6u|*elcR@^v4ArxSFC=}D}Ww}mGhrO1yJfS!HJ?f z-RFv^w1c@wF@ma6NAZxH8|yhpy{^hjdojp}+LdVs;BZQ04@} z7tm?zdJ&M3vLvv*ni)O4T-qmOtq-1bHNEy)5kVtv7kzuvMFE}LidFkDLl9uMaFHr* zk$B@LQptM*^&2vW!+3s?2 zl)j?{z6kL%MbX-U4YN?S1fUNJys2YpgtSrnyWpkvJ67oFRM=)ZQ2=tkI$MyxStISG zdJEE$BDizo^~=*lB_xtv(;%>{h{n`)d{bwX8a$~0+O}?qU5Haa975(LiykK6gzDt*&5z1p&7j5S#8+k1CCeyZ&16G4pX2>P zC57%F>PgSC*r0+PIMFeG}54f4fhkIBIK$>sGlRS2LAnTYN6U{D<4$6-mqkCZm`Z|ZMDece!Gzae;VcDUB zel+{fYq(p0oT@Yt2`M$SX*K7Fu#_5*t227|cEKLhaq|rO>*)j4(bIcl^z_kQ#wL4Z zHhnPoJ&5n-c74z%<3Q}{Cn1gqyGO&-M&LR}Lytt90C+j2yZv^Y0P2~6aueEi;N%7k zO~af%5Y4%8^q_(XnigA^z;H2y_>8f`EdW^Ab4sW+w*e}X z3__jgHdNU*U!Iw0077%fM(GrKo=MS(LXrFv7mZhq2B2Bxt;%L51K@Nt?WXD-9n^aC zdzgc>KDbNuSbYB-2z3fH)(ZyKUzUhLzWQ!JfhjO&-u@+n;;*1KS@$r~(FIGw z^*1$U?SY&Q5Wwz;nb0vmViA!QYd*_?1 zdR{*8Kp=!=m6s1qOTQ|tX|(|K+b>bxfL8{!H?p)o-=o-VY7I)Q4*~dCCEIv6oP?g< z-ZR?w0DvoB%?>C$F$T;;!?y-H>fk4hd-t=`nyA(1zJ1I=eIT=yRh)@S5!HX35g4#g z1l_FZ3Jb3dK#KilIm^dNXiy`I!|<{akf1)}!c(dNI-F!n#syWtYShW3Vi^?_t}d`D za@vRzXPWb2nIs7bjJbTTuz(!3WN}JkJ&HjM|^2R2|Z*W1-Z!v#d zdR`ewZo8LXQBFB|VBz|uc1C4TAlLYdn5+ue>RS}Vv^RH2xVO_MPNF*`)H~{Af zdl^C&lmWS-U!>!x4l*1)VUVqjD-dwXxEx8h4O6S;zr{0q2f{4b3Ll&gW>p2c<*+Q^o=DJy{ z7YVWUPKomMYk;KduuAzbKZ<Tf-^o7sU2prXdrH9q^zVVFjeMRCcOfPMyQx$ZVZ4sOx6UEaci&x z(A2bxYk_Kw{SrwMTBuWVP50%L5pa8O=;DrP5}-P>E;W3Qgi6mnWwT{A2h^KCNi2lv z0Unj)hM*`tbS*&1&pONjTp0S%o>pQH-j*$>yuWIXzKb{}y-m>vf?A_P+CF+fbNZsv zIS~lzEo7t)--Ccvc*E~%krJXpYHc^t>)NsSWBPBi%7CUb*E9GBK;vT9bGbt)eoEi_ zMaCEP0h||avtCgHoNM{R@+)eT_}8XJg;&&o3)RADVgH?=(_SzAy3bCu>qjh$BBkFk zvn_-^qEOn)bd1{ujF8f7r1}d21m{eNUEXZsAYS$y7$DJoa@W@vbWP-p+1r z*{uqs&KV|1-&IBD6(3g<6m3A|rVC@GN;V*P_Fngff(=T{`jV4J76-mN_U}|QQU$W7 zwd#*@wpv;6FzmuPGf9dc+4J4V-eDuK z5!$wTFjx;5d}4VQcU&KF76xA@nFETR4X|mpB?5_o3AXFUM1j=fl4TI30G_Zg6wiI2 z_?PV0h3s{u&}n8uuy(nVzQPAbUbceFYz=$hQ0CebUYix?M`-HyE_OV`DR+~ z<@I0fPl_4#W=Put72O~8uLV@Vo`}-j0|F}OT%`1u!Zr2;Jg-DUfHi3m=kK1Qmoc^+p1lHL%GoHdAjocl1)MXR>fJ88xv< zpZw1Iv%Pw0kDHy<4q$2D#pK8LlXw^_NVp0*fX#N4sM!j};Bc0tt{7!rk?O0(!e4I> z($3e?vbmZ9uf>zW_0~p+_s07^2O}L+lyq!8=#nic)6)|9jg6JXWE}>rfYD0)%Zwo_ z@c6pHCb3_ZpsehS@>^FDxrDy^@7UxcZ2*4;uqz{hZ+ghx#njK^dz$uvbqdW)!B^mLB_U7jPL>4H<==P>&b&Q zx)6!c>zUd$D57stYJ#B!N=S*Pr10&yEKmRj<6zht9NKd@$oDb;M&;YJ#y=^dLv@wk zcFn93x5{48kqsrG`AZi3gA{jvg!ALHrc3mIwQE=McLxSgO#AA={b$M)JA^f@HOCm7 zC0_hlC=7t^^xU>4CIUd>o-K2LcJ^KHqBWl2wpc_HB_UF zld=)X?ZfK|V1?!A4;_l1K8*SR`EsWM=si`I_(jVUB#SeA=lG%mMw^Q?-ixWC+BI%$ znPr6Jgtz=OJIaHUl3Fw$Q)tK$$nn$}x99nZkPmFL2Bg==bHkO5K=@{(&$?}!(B1FCa_qi8A=QoR>_d7@|{f}Yh)mnG#Aipq>JP`4%1XSivbzA%Z>wFq9{MOhwW$z5wT3n zUYXao1*Fc0uNq!RgDlB(GS`p>$UELVJy)m?!V13%a>mKB zXzmVmwUZqudfhT|*V=wJP}_CKrglIQ=+JmNnT@F;DQz#|`XWElBtx-g^F4zR4#vqlBfOr(XoMv`ek zG$$Eszx_(;SI`GyW>1$)?|u`s&Hml2l|DqOu6$dilF%LRC2_1H_L!w+E0vWvH&nVFMG@{PwB5ITl2-_0eY*? zZT_9IPOuaobd~8b32-Jyy>L9N2Ue5ZL(eQeZhsm54d_IwBF1wdR6tP~P1U>=R-I!2 zH+sK`6C6Laf8-!KHS_AAY`z#l_pgD(c>B6wNFVX# z;DaD=7txNIpYr?fzVfAtlJ0hXAK9HBQqD2ddFxF{_cFWsr12_cKCf{_FH2q%ygSgK zcuPhT-6zop*(exL%DMPU%|;rrPo3viw~+=OR7IOPMQi}?Efc{6I!SPMsJ2ppS`w)< zA8V2@mj@e>(w(W&l3?Xk{t;SfN%U61aF2?=5%{JP1Cl&>(89pZjzgY2U^eM=hFZM^ z2rj%CnHVSpVp5zeSObO7PvzyLM~&vdjLGJSbDKGMe01{4!FdC;F%ws-=t2Uwh0ZWv z^3y>J8rffkXmo&f=(eIJMl!gkbN*S?3mHH(vi|UmMjH+2xhEZEywN^beZ<>A-J~4^ zv!ENx#qHzwT{T31S%b@Dy|z8nHsI?I8>Sa~6#(_jz<#561@vPYeiEWkvbOJN>AE%2 z*!#rd+A1d+G*>(F?m08~z-*-b{y8&};eGvew!#qPZ?dW{xn%})XsN&CWNCp#Rq^%` zL_*}Z%xi6w`Fd?ZzEQ<(V?@VV!MObr2P$2uBadGf2Q?8(MxlGQBCgCHckUYye82o~ zaoaWsgtC=bullQiVQvFmxlTpoSjeX6xSQhd?x`2yiqb~=FWr~zN!3BcTMs=PIwS#h zy;oIC8I=Ni4@b$L<7+0qlOVkgd1wX#$}|q?zEK8?SHXzr8wo)8Xe&VbgdJGaG-WY! zYNBKHLqB(hYN6B|t>`BqTA=sASkti(Ep)-L@v=@Y2QclyEqn%+;Il8|{a<%Ez_M;T zRl_L~B1vf8%%RZqaHrclvPh__CRuh-N*B$mtURGNqs$xIHnIQ4j`V#?v}+pRw#H(* zNwzL%(e9!j{H6hl{fczTcYSEDCT+RZB5aL{)-UiBvVUlw^dX=1c&~t1cJRwAxG4d7 zpwy62YHL+>>a5=s(MOZvbQ6+&3wE+Qc4-HH25@1 z*op)CsQ~+JzRg4$746DF8(YLcrhTkSS@&6w2&37=Gf7;&Drn&2_@3CfP3-GeT_O;r z7&?M>#=w7nVvk?AEJ#T{^d*mHnP^VJ2=u^wt9+OBNiaunIkrPq^ zv+asTBZ5jO%ir~Ra;gw2QFWO1QPu-|dz{vauqsNqCpEQ)hZE^X<;)1**@cP&d6|CB z3!>?h_A~p(43P^V%~pOp8Tek<)0s%Y96pQ(7b)LE?aKK*{LaQeltq7zxX%bY5>?WP z1xxLl&SXBb?)N~y@^P$MA04uipZE~QN|_h`q$^&(N(8&SGBBZ(h}d%uemTi*1?ueh zmoHXZfr0SPmk-EkfQn77)uC(5;Joi{>+oIXC_`J0@L7m5|9NAayeZWPl|F8gzgFE% zOgBEt=4?wuTuRx!&1tIWiADk8QJxJjJL1Rv(MuWy^PIJ`^N~gKr{Bc?U+lekIF?b{ zH!6|}g;df&6PZ&oq?|HlmdufP3Yq6wM5IWjk_J?ULZ%WdwlP)_a9$>xDT$@eXZ+U=XtK*?_BHpt&&w@aBX+v3JDDv^kZcX z{(43LXAd!*88rB%AX=OiBwF!DVZUCggxPy}+_UWDv9MJSqR!s#-`p$=X|d}xF8|mL zycs=VS>@|d{pn{8`6vxkop2ubF{*@{1^@8+g?B4x>Dj4lkk|!A<}S6@M;Bc$R8Gjc{mo}&?*WuKEoLv|qKVmXN_H1_NByXt z8#~LUFABB^7nicnFvDVkM%S5IBdE%86_<-*K%?Tuac8@a3Vtphs@{3EDKu0&$QG|Z zh9{Yr^?EA|A#jK(-o#H4SBQCkH1ku0jvI$O4bJJq4K*A2zbqQqd$+WUe1iTe@q;=k ziZH0_do>dM!W8`D8aPsg;#%h zrO>{6-A9|HgW%h>!EuO39YpSq748gFh7rE%#~n$^7;~8W@SLszwB%p(6|FynCLzGv zTBibk{f(vXxv7A#d*H^y{aToO%(+I;Mg^E|WK-KxMPaq*HYbTdvOj3Ob)8|7BtBp~ zD7AyEn=vY-2IXvFgwqr$<;*f3(17orquc)bFh)FfDou_w zf|RVc54Zi1f$?ucyKE#CVC29%iRd%p7#IF`Fsw%zm#d3f+C0@UT>HYx^^ckHjfF<) zQBOV?7Fn_SGuh9OyH%tNf1V(9m`%y6tR(Pa{nY-S_c`E)Z<@pNqilF-*-*xHg&cZ4 zKbvCrP#1!BZT-}(FN#`EV%F6~9RZ%gfA&lmb|`a%mk z62Irt)VlJU_Yj1|t|f{yvY-&n-^0II7G8c@B`Ux#i-JZ*&!1W_qP6nA5+xqZ^N8M}8SrKfCIGD`d626g^aMoSAt=?!Rl{s@x5!G92EQVYJvHzllAlv>$ zg_Ymbh07%t73`iHj6Tp)#HCFYa_K)*VM)VqM_8T$SZA-z7u=%&9~GGP^i%)V$B*U7 zKe#B4#bMIxf2E1xnhh>G&a<<4a!3RIBqi<G1_-#>irDjO;SBb%I^~a+pBSf)`ty$kROA|ti zou7Sa(1x$k%#@p(H9$xDDOmEUpysM|vAt^gsJZ+tH8WEcSE^LIn_I~sCHP)YiiHg9 zzi`t$-}MlBteWK(C+i>+T~T>^Y&F2xrdlrg>H!EezcTkXXcde-_^M;SLIq!%X}_Db zmq)cfKdj#{2;ltXi@EQPZ2-x}*tE|BTzHLN{Fs%A41C@DQj_VbGBlrT{IUA_ltSvC z^)rdHg7`JXF@S+4h>D%N#;ywehG?|W4CUzX4Z zQGp}Vww*Aq4=Hk0+RduI~2=E`9jO>H<> zSQDEM(jvoam2u$E&4(Y3C<7yQahn}bMh_|H(?>Nm;f%+sk z`ZWi^NH=^m=%W^<&JG*vc8a5Zu{QQyK8oUD_jY90?ZiEtUOGxNF?{zTJ#S~797^>r z^0VGC0-dO-vQI~TDm;EtUUj$R2tHdU7}c~w5)^e$j0lHnV@8(Zt5?^h@QKWau1$I? zplhN=Xl^en$_`M6e)C8|%^P&zp>6`Q-gg?T<^^z5)6*;3nu569G-@%3n;DHtXn{if z2Kcw*O5W$YGWc$&E`&cr0DK+BDLaP+q2N-4y_m}yh+1pKd`wpvzV@a*`W+w+&(#Ot zd501{Z0j7kq_rKGuNc3Oo)W`_vG4CbJU@Z&6tY`yckhMp@s~HFxQ}7_(YsChKlZ_T zh2f3)^`;=lRa5&~Mi{vlcJ$q{6v3RvH_u~T1<>BQV4RyKj}Nxr^AT7)0a+K<-3dNH z@VV&^Q@ch5==XN-=pI%B{?pwiDs`$@qv5ueee*FmkGq+Rihz$C49C~(2V?7`I-#FO(6F;#=-D43Qh!-N zcl^r_dvxO*hoE9plf%}XZpE4E^-cxW_&h+vhg&4CNPyBS~^(rsKW~tk> zaO%j)Jl*Z5p?LC(YV{~5tTn%`oe}q?o_}wGy=d^HLR=?PZ^kE0)POx3=U?hTt;t41 z{`-Fv(k{Qg5ShfD%@0s{MQ1Ukb*N_n3r>5G1SK>@Bnx0^a78 zMOVtC@#Ucqi5)Ej*T&2qJ;QVik`ttATQ{nM-t=SkOGjl9pOgi%Eh*#LH^O6^9Lav= zG2Qwq5gx1_zuKV0umzRqd*7+;+l^88BlTQg@S{FaQdup=2LnrCl*3ncU`fp3PqXEk zaF6z+=~$c&e1GEPQJbd(@9g`3wB{efvwACM_D`u{T=O7Zz)%BQKK$a<_^=x#*+zMc zKJEssVP&>yg|YgCNm>0=W^E8`l>P2YJ~i@7o$44>z=@-&==}p_tk`#}t;0kGWwe4H z-eFfqaU=A%S}d=Z?E;2U1)2e_;g**nqB^zH>*ui>Z)}^qb-ul9aV$J*N z5cFlE#MhhZuz9#pVaaw6a;eM5X{PT1nW)g?v^8YEn3*aAedTeSeUf;#AWI+T_V4V_ zd9o93&oGy5i%^7y_{I0LyLhq1SNG|C@e?q`W&L$y{eI}QjhkOBH?Pq8_&G&Dc3y$& zlu72~O-A%Rrnyh-)FfEMt&P6AryoWfU;D0mN*>@9Dt7QnC^H>vg_*BDKjqh! z;yr0Q{qEsG{CaGmPV&YyY-cL@SnoFpZ3UsrCzSdjZ2faPnJX0J+}Y6>8bZZxuCeEd zCX-NK`^Z&Ntsk1T(kD}!T5)o$apK^*_gKB;zQ)yl5^5`6-TU;r5Av}2KVqhOe^#puF&Dn1*#c`y3Xv~`xCt)r-0ZlKTjlOBD#Hqrx#Mc|U z&@?gP-DC3oH_K~`OC-qszk*Of8wI6u<9Dr2qLMnmpVV7{qp9I%zj zDDo2SURhaFb>HJo>3oSQ1 z6-;y)g^BIlJrDRM;8ttunxp-d`0d&4Y<9;k-2BP=(4^%kM1Qc{=DvRd?(Py@r$qYq zUMoFicD55+*-=~p$RxYvnDISw-T+glwMZ1lm0XRbqi^jg7>U7>5Q&D zI3&LOK&5s7He5)!c8{?MzizQs6e^zrBewEW=T7wC^7ms|4mAVNyri-Aaac3TWS&#X zwHk#N^=+5y_e}t=pI^&K{z`1JFWRCS*oAF_V^V&OqY&{Sn&FG^1T2LujUPQ$iQKkt zM?Z6P;m|tw8CK^}SbCu{K1SMSR<=}+U8+P$(T1#qS%1N(+v4u3@R^mEqy})OG>b4iv>9cb034x%ZWj3T+_E;5jzdp7Ik+*PK`p! z&r?RB#6GFv0?%gtRN&zTnUky4y71k@=asyxMnUOKbo9y`D%1|k1+bhRMe{qSPWSBY z#g_JnPiJT&aOw^tr)M%1(rzVCoyh%DM?R8V--{nwX3Y2Qr$BiamvYCIhxoMgm_~2+ zAZCfzJYSza4MI0O{z$)Qg+0gZ65k}0VEQp>YWdSaG~a$McEwF{j^mBznXywNz|OzL zqceaCM_K!GuLO)@&#i@aYnxv5da2D?KQRIWI%Tu2i5Vr{q^+|5}(fVX_1y%{UF>Ex#fi+1z+*!=rz<)@rP7vjfv$Xj)#v@ajUpRZI9O|BvkHBsV4rRcHz@#;9@0ah_?LZ z4C%zAMqB(&{GayNOoom4Z-3^^;cs4*xM8i_opno{$Z^m=zg=$>Otn@QvL2oQ%B+kM z3sz$0>zlEwc9QtM$7h*F;v@HsW12GYuTxgGc{~rR@bSkVSM#;HP+)HFIwiwVXxK6} z8zD6TF1HuXfl3t$C%(ExA13iE9Q# zOk^2Gp+s$Ck#ss0+}k{K4Qxj-I@-hWjC3!C+?%7hZ5;)UXKNIx52?_w$kI`uK8n>H zHHmN5^dIB zO_K2$V_$amBmOgMI=1m!O$A;L_hrow(kUgH{ zSFgF(2l@u7;5?YNGeB(=X&OtWcg%V*psxDo5HFcO*!Qh?RYZl|5AQgB(05e`Fe>SVH;Xp|a9ynOfVx<2b(4BLO4oJckb!W@&7!--UIJX8Dex$!7k^xb^w>d=dC zAM}Xnkmr+hI)dM=>UPCP(pbFCNIhdDD=z-|Rd&|Hq690lb!(X|AJ~ z^0J7r`4l;SIppE>6y{Or{=(h#j9j;Jhzq^sJ&J3D?iriQ_2QYcgRzP0Mqy#+5$~Qt zD)>EN)qYFt! z@l`5y2vTl8?6VbU2O4#oa>}lLOuCuAEtxuj&yH(GEoltFy2(%Rb|UTY(J13?@}EBR zJyrK*>$?g3bYZ5a&1DE`G%mUdn6$%;S%^v5o_@@g4m=dqIe`PT4XsfooU}E#z7a0kv>ieVtf42&?v)>@Vs=MSq3YiHj4M{QHjV zD>8l?J8B$wz1zrpg@+<{+VtbmI@2T%a{p-myo;+}gc8~C{J#yF|>gcc2_YzEg&Z$J6q1ZOLOl>YS^O)uMZO# zSpVl##o-|sbJx~%iEM+sdGJcs6f{%unu8(AH1<`=B$=M(LRmsJgVCd%GqTer?dHoV+}W z&1ybZTpWQ;Cp)Rt#6Q0)MA)4=H;Ttw_}!M&dda?(EW;-s+u)*6C!^Rv z9};nG`KqrINcqXFnx{1cJbb@ynr>_d*Pl{;XSn+@NA=PRZjwKrDNjF6u^xih^?#E4 zmMHK?KV;Ntx(^p)@9)|EYXTeUO82cW9D+LsFWj2C-3C^)G5<`GU*_8=f5WE9_gkbZ zXb}7BINlJ>wrPVGE)7R6|0Ltr_UqJFa{X=pVDc=46xBcDLQ&NqKEC)|M>Cn6 zKd#!@eWYp%W*n1Qmz;ahbJOhur{501c(f|(vT+j{+}$QtUNi*(8#K0_?(ISTtVV7r zg0F=NGakvfH6g=2#1m)zPm@H)5h zW?fDxK7CP5+0`?MS7>5}%5l^1?zaBbP-_aXD=VBS_b)@wi*bdSp9ay1rz>++!Zdj5 zd(=0aZG*`2(>sR>OL1y&agW8HL6jc8@#{jsG-N2Hbj6Age9gb&=iS?-$bUKT6HnJ5 zzCU0y{v~x9^cYe;OmC-v&C0L$J1=&~(|ZM)lq?<_=* z@Q~~N(T=UXay@7!#9(>iHx0IDQ08Zc9 z9TsmiBA2f)W4(lYzjUKKW^>0(t~vYiofo<4nX=0^Wntl zCaf+Ks{46s3M31fZBLWyXA9eVSoaRXSfg--*uExYvtRGpTrmapaks#*jv7Rvy!tgpeR3!$swOsE`tp)r_EE zZLR*(fwk{(pON_e==E)&8ePXUa*p_yk?`Z;I&w~MklsXc;xzEqE3_mEw?Rz2bd|kb zDGn)I(_3VHi+6nE;_d`agUw>uB;&1C(CB*>Bhdd4{g~e!_V_r6Cq|^rld`74ud20W zbT0)WDoU?EcP_z&tv)9|4h&*O&u`md;-BA7nwEtbOv274Ke;fO$u@uS^Mv5 zrDA7^^XqYPJz9Z!b(Zw6kd21Gfs8p<8(U_V+>JOftA6ky+_MpeK={@Vw z0dP=1uU6#TgsT&sQ5dJdqow(!%=R8U{_{@pukQn}>FxDT57|k5r1UT3{@h)KZ(7z*3{-cb_^NKk)Ra+h zSd#eOy=?+?o^FdA`&osovSrbe4_@Hz6OZ!b?oI(^Q>pYLl3$0~lvn+l7=Rw1v(5B1 z&7^)76kHZN3fsr|S|74czy-gcw$!02jNm!1cKv53O8>g57k_ya9+-0+V_=zpGoM+x zu4h(Z_1N8{MZynx6VtfA5`GwT$~KL|@d$u&#x^=``5_`D$stlAXr z#AHt5cgQp=dU+6oLXWBah?oW$Kjl}(C)z-GgNtkVgA(Lqg5+{;|(M~ zyH6hKy)+G)XDqImB#y!(Dbtz_D<{CT|7N&KI^mZOHIjOKyD+A$IwX(e$K@mAPmYrM z;-XyAHs@0moLT<;MS=Z2>X*J>yQ_@?zD9hK`n{!S;(jM-`;S4~vF7x{Z=`>&d%gte zUu=Wj)+avgJ6wW(+@_20YY=1YwN0gi$o*ev7?ib8;7k9jG_}zZ%vRjgSTsI}2RJ3; zZOQ!QtgXbUY}yJH6{`0BrypXlgz09HgKzPNW%!dFB!3+EefkNz;Up+*O+BbC+7B#S zcG7>@Qm}aX+WzCDKKUQ|SEV2RT``4!<9`-E`44@ne^Vn_&7f`LOXRE^{-N{rpY^G1 z?d<;1?0>Z`*gy4s{zqM~f9j?DTOa=I-#O~= zx&O6p3pZ){Pu&)K2S*QY_kZXi{a+-({=?q?cOABWYx~dk{}4|jzyHU5|9yP^yL8z8 zm0kbU-~a3OHWl6c4-@~t+57lE{@4FZC+9!w&^i2{I&A;j?*B^vZur!Hhu#0FfA_!b z{;%xrocO=W?*CbLP}0YjU*E;U%|=Yi#oNx=!_kr7$Jg7z=igNX|L3}c|6l4o{;PcQ zum1jD&olIz{|>wV)8GI9ruX=dWcmN_qxpLAP<0Lset2^zx9Fb*zFV|Z9q%ag@{1St z`W%N|`@}7unbSd4nYKP8-W}AGJ>Dt@#*+PaiZ8c$dZE?WLl2n}8rYUbH=A11pgU1P z?16U>M&<20{c^JvqIS7q)~95c(Xy>9@}xscQ{rR^%bX>zRRQyfXFQ!<$CY}IjD|C;D9*G~rXX&he(9^Elt^64P;r4sOeR9R6qA!NaNPfk=o0c-PX(GW{aq>La6{ zvA1b(KTtMr{dXE1Rz8+;LQfli7E5Jp8E`<0Kr4zur6)SQmvz`HO^2k=@C+-8KU^4g zy#Ljjtnc4gPUqvejF;ZFm;2wOfyV5woUuh36x%Ft^c?m_qFpSNI2VBDhkmMTrR$^p zHWhvu@?5S}B}FM2o=~lP?v&?E4`^im@u@vN468(=lT_}L{``3GS?LF{H`D8~Y?f%u z@z|L(EoFfZclAb>4Lcw=o2o#~NjfBqF&)$T76jT4i2wqRKipk2CRU$h2j8}ztv>8b z?3>MC&lOCA7tYe#GuK|he9mJ7iE8_igL603kNbgwzaJxp(BWCi!`pu*P2uf%uFzz! zOL)=5nCji2j}t3C?%SD418PBe!0I^~+0WxL|Eg0D)i$(ue^xSw!P1B)r~S{szHQYO zvQl(Nv^$a6#BYPePrh%sbI=iWy-Y^F1)K-Aq&KeZMKn0oGoqXOg$7q%XQdmqgU z7K}R@gOej&8<%oCk%iBlxA!m|DA4P0&L#|2cQ^FSypMt7e1RUZ$-X%Ae5-FnJ`GO9 zo?hPCM}s8K72ZTVAHUp{}SXDc2Jmi8ZK&0o>r(XXbz zO>H#Lm*3VkxFH16Uo^hhD5M0n+<~2~>K53hCf#=BI331hsXgNYhTxVu<4l+K0-lsx zmZR;S;73kM*;7b^IP(bEt}+^oZ9b6o_;Mtq#9UH4KHv$N=g&M|-Jyn7>3!?tkJ8~t z*At1?+k8Rwb%NyKb#^%RLs86-+aCk<+^VJrX%NP?BzB^g27jQg{^Vaz5MC#A;;@k$ z^1MIAzOG#iOAQ`{ixGdOR_3nM$u)<4Gb!)x8+*ZaZNvS}ikh(HbJSH4(w=*7E#KdA z8dQn(^^^V#>|TUAGValp@^XcCC^N_0KHTJsgVcx7bZt*~z!)R5OO6ih>6umE z^4;*vnMYzT}7}yUb4ZWo(8F`EzKgOG?<_&jvr%*0*+G=CRM|Ja9KrV zf1uzd%=zp()j|BZXoZJh`$sQ)vahn<Gnc-9h(e1`WKSmw!X3UESw=Em7X;HMpVWK7+Hb#>Ygz+|&K;*rZM7jN zehuaBTq60DBP!M98VywPH;e3yj|cawHU_I+N5iCeH(Qn6Qhnxhp;;5LGfVcydB#Em zP`$$8CJ~|txqT700$2jzyxY8d^B)?x%8SdESCHpgbhR`-;14G6U18-4xM8l9Zs@i!PbMSg&`?D9znj;3F{COdi`5wuuH@|fhllgS@#>H<9 zyMnRcXTp}M9~zL(ar=X9ydh+E_MG9?phNBTO*LM7d`Uff(2;k{0De&2o@;(m1ZKXL zye%Z}D7qXwuH8z54LLgkHmnQ+n_KQmluxnPQ?v*-3}N%+Q6R%lm<8 z!|C30KSH5if9K%dy@qhNE0ApFY**&x^Dsbm8t%ri>5T69=37@FwYsEUfa%;vx8nqjzK2#e^I-LQ=*`t{)p zG>|H*u3k&#_o(mlV*3vTz_ii8XhyvcPOk7A&iQ;E3lDthX_uixOk9Z3W-lpZfA%}_ z19^YQi#uZF+le5YP-;jKB!08wRv^>YNgBNAG>@}X^uQ~ux(i1b1MtJ#$&8GPLAW1j z%2_0@4*86ag#6eG?_HI)?2Gb-su~WFCvR=go?)|_9l;4Tche$y=rj-s<~{Ny$pTu< z%2KW#R)MW^>Q%=Qz43@Z^SUJ=I^!%N>qR(yLXif% zg_`>qh<&6(rNUF(VsYc8#7Gu;1g<=pzM=ZF7fOASygEQ|!t7k~Ba0Lhq9=RS!qLVH zZf(lBbl>6>o*_GOW5Q`5BQ^Bq(nlI();1_CxB1{m!{8$o4G+A1$SSs}ldMqee(4=;?Dr1<*KAi`HoPm)FhvsVn#vRwYSW((f| zc5NR_o_X-yf3GUYyUw-qh|}SCOv0BHtX2@FtdwChCx<*+w)a~O>q7?P?S=HmG>CWP zN*f?J)2m*fG3+HHa@Q@JDo;2A<@NpLroGzm;Q{~V1cEo-muy--Yw3l*Ugg+}Hao(; zB<={^Y&W=En|+JzB@GTf%76EEoZ#Nu$)~pd4gkiuPyGTN!QlQ=>yufYKF(AJpXVZY zBe=HfV3J2PK5v(m=r*>3t3Q`Mes+!l%bPU~79?-HdBEJHJw=0U?Ix#IBu2n;DZ`F3 zLuGiLb@{|W@Wkz0w&%-8yf@3_UVIoH1p7>0^7F>oyVK97MhW+8vmGiG39_&KHiE7>bll*zoLNbvKv<*`%u+%cr;;AinQ-mtbs zVf{CiGf-i1EupBE28>+nRYGJwRI9yg_G7&(41e4kCweggWEB$6DY&~q7n@l81=1hQ z!r<078~kv1_UbI9=_E#esaja0XN!DpbLs`;c@F+fQrGpT0sr^&T<#Uon0wPQEq=Qm z6jss{%$`Pqgy1nZw-aY~ zgLMJs-P4pvR5~|U`TC$Q=1S`F952#@+S$C{6=Yt1P;x1ct=$OkZ%SJ4r{j&EHc<{H zx1RtXk<0oH(=>=4Nv-|%hDLNO_Kt^gUVs)E7l%|eQ>giRF^=u11J>1;k2{d@D(r82 z$pzwG{qD->S-EdBMu%L^_C z3DX1L+2MzzL(|6uNxUBvFy$_`fl!CPmovFsvF)i@M$->ZjE`h<-0*`2E6q0dDLkRU zsKyDSB>6~iUiTK;^UUF9`y8X+9!q#1wDEP22px8<<`Xs+B)kP*?&&)j1m7I!wz+8ol=yNm!2@n3KcTb`{9PpTgGEk@21@?F zllT8jM7jR_`Ewd!D5NxYBv3aFKCWnKNU@`X+={9L9gRVFkEL8#_FfQt{hcnJ>}m+;GPb}FUry!QuoOx z&Hbjq{8$O&`tvlXvq+GA8hR3B)?KIgbcW;kolnoXw?~q7rOVaqWFE9X&!wR=bpRqZ zrk=eo<45!gxeeLuE@8S;e1aVDzwz^?tD1>F)@h#EDBx^^?K9Tb(i!5=c}4B=p5*}i zX(G4#DVcX9CZ?Zj+8&0XH58_uCw-y)F((K=jzK9KnRAN+G$^e|J8VwuWS((|{&LJ5 zUT7q8nX*OV@RwBH$2~sy*=dF^i=V{ls}qjjwmIPk%}l+-+5q^BUQ0M(k9$lc=jvN% zAg5>0T=0(Ia8;w(?KO)E-}h^JNAkGC`wbn&L1OMi-{!GW5Aj3p8tc5}U?Zg4b!PEb z>H|O1wVc8s8x%MoWK~4?&fJsSuoN;6x}Gd}c~>=p=*ar-2>W#oGV=c}%02VMwHvyQ zckL!TZtb5U1+q_kt&TzZ+$B}4)na4yPY;BII~RmA3E%N9Q2OEaiw0SW zakM9|x!_|w=ssJcvP5u;+oFhHMK=vroHXBiZpj)Mqh37!o|Fg`PSX0y6c>1D+Mgz+ zLx)x^>9e=5ScA-l@6Q^adZDKK!H@?p{2*C7aQnv$8uS(ycHbg=Cn5degNdQ@u+w`+ zs%SI^>HPp2?C$GzmIfs%MxE-QtO_IE_nXbX+m(NR?IFLu;VerY>82CA{fL zI~Qj=4Yt4Xn<`Ph0P+lGR8MLYyi|*GIBgt--qm+CWz^{497!z``K1Wk*I3t##ruKw z9oH(Boz9@*y;*YU0m02zN1R`MBJsu1)&C?g0v7U0-(D!$0#Um12DgJfFnh9Lcbov} zkLHF{?{&7Argq~vWN4ssi^QwB<#&Q7 zN(tYotk~8oa}LiTyo-5o2A;i1ijEO>0qtAmvc|{gpwrAhBe2&7yF#pL_}lz&&~`_H z+=mm$xSB08s*45|2^EavRN~JK+Gktx?BPM4JRRA>{y_2st|{SgeX_*`#6C=J`IO`X ztLFXqWeBdzj1j4Rb9?do-P2|_ z2Is7JzemgqYIDAGgc}|LW!;xae+j>6q*ZXgApFaCs)5$HIRrZk*n_ftz2GL>%^mwr zdcvK)=r$8FFBeqlUCn3n#0_q*${hsRVC87_(5Bn~@K{W9vnTUT7OP<;h2Ws2fy~1X zqDAmZ+CmN`#sqh@7;f(yb;0bG4RxCd9*g>pIG9-6V9kncn-VD-0yfhT9I^iiUX3^Su|{2w&b%@K+$y1iSUG z1wBsnguha7CO^^+jHX9c{UUfS#>rfWjre0eXL#j$?GUKQo*$N2G{6=f_xY91(O5?P zyYQUkpSaQZfnTg%(0I2ieQ}dMnEd^1PU-f+8}nbR#mPK)sld>}@iYyb!hIVi;(f6= zIlPKt#2j8<&`O9eh=mRQ3mb2c{-g#DUK%j5#*Txh7&3<(z*h`;e>i?JbmPBJC)$Ma^apU41~vJjTP-(l^qX3D~KRhMkw?OT(5RwjKmy?iiR>1 z!ka|nJlzhfLk0+)-_+s{eV4yj$vY=tu@~=w7sM`ADSKCP5*%gx$j+fz#}*!s%(@)9 zk_i5*T*{%x05mOC56lxBrI^jUR4nNQ_0^24iZiV7>OlL-R%1)plzFd8wwmPmLYw#@ zk{A0J)m3X`0wDNMYvRw6F!=kHUYpkykMo)#hk8ZnaN6e9$5d8#cv=x6u_eY3mMW;C z4hq)TSQ*XBLU3lA#G&uBPBQL)LoTptsp5zJv01+HIJmmEZEBT~3nX*}TkKS%!zR~V zDTm}8QTpue(n42jq#G6GjU`%hoG4M+;^XUu+O!TYKT1EWlMbI2|WgiWU zIBz5hx;mg*kkV=2#tX0_CaJ?S$`yGe@B7P=x`g$i6SA6%R?x^k?Cg=JhW3iQ=hkEf zfM$*}^H>A%zat8+j)bQUH7?$mIpTx$JU`!=5WahwO?~zp-5xviUFY2hKD1pIGPzJC z1PaMz8)A>SW8cx-Y~ScuFj^E;_M*^$D~)BU;3Bbe$QQfx4o!$FJ5n)o#S`<^NR(_~ zGJ*q*yFRQY{_}M0+?A+Xfq3bLoz_ogZxE+5WE#afLCRpz9=ReKIE;F%jwE*8Fz+GK z^2G!G2s-y#@o=K(o61ke41)1|lCp|A8L#2be}{BERX~rKX6j*Njlu77vla9`k$3fM z@xXh+-}p=|rk@ks;l8JtE5sX3Ym#?p_<6yP^;Tl@?}?7<-G>UHq^`cb);;9v(_Ii= zXw3FdNQ>;-SN#6$jwslP8hy$p_Ep(?+9-w0^D!qd|G}}-uw3md$n6nL-kbjQg86tj zx(Ijv={!J(OqaohL~|eL&_5DiE#eF{xi=5&*AIl7-<9>-`hVmaI5wJ-G}gQZ}-~*Z%iF=*S-B? zYD})EAKK6KwA=%B&6!H45k8P`SB>tFL+aRuN_p46x#C#5|7J>{7uL48ddIwvLMMsw zKn}vYfAi93Q&Nv3FSY4wbD}$jpE9eiGzmqgGzG^1f)9tewmq`36Dacf zow%0ZIq~|g-y(m#@rFU};1%LO!MS>G^lt~?VQjD(`r`#rhad2X2>ZdwsbyOxf)Bb= zj`lE;`Q7R8oAX?mj$piCn53`cfqJT}LWgthkRwEiDS*uHfkwBdVtl+I?e4pAL9a*< zkISiVCNCFC4`0i^PwJxMzrXWu3nMsle&V5iVmu1Z1+{DlGlTv2zQ_esMgp6;x(b~< zm%-!k!N@^#oF52eS`;`9PA@Mj#hAFmoo|L4oQKFbU1IsvO!@d;G z1Mu?RsiO(|g7LA~J((F&2WVPL*X4-!2k6nX;Ji4zny<@6D>Y|rC_N{(vh%FMUidXo?0N$5bJ1eBqxKwr^cis3+#7&ShvgpDnT5mSjnQsL2(A-Y z$-Gk`&UAMYF9x4z{kf z#_n3pEw0Na&~zh9JPFW7C~5)!TA4kJtj_oH11UR7gbx%u@lihg3@I9M4C{2M}8 zO(q<$rE>eDfmyQ7^wpl@Ey=HW^YWeRS9)NVyv{~T8vLSFq{+@hI{JGoc z0VojXYMejFkUJwlx#;dAMW0d}&kXSUP#hU5nluUyJ27X-ZETgc_K^(>LF z`gGp7e0LD?Rjq#XnfQ;Kdg`#{CRb=N_hi}P?uu7q%G(bTz3pA$g0hhW|CIj9{UiOI z279*#>}TeR$9osy@%aoFj7jgiElqS47B(H2lvbd_%D!LHeCKsh>OAez+X!dinfN9A z#2^G5##ikMPocrb1L4n=XNW%rzq+O-s0roMiqXdPAg#S zvn`oR3&O-Nhss_M9JO4es9R()U$0+fx3)ZX1xW9y&<%bY4m@}GGoHoKKu_1_T`}=P zo&iRko2!#>yl|e&gvl0DFIoO9mv_b;d}W7&3H}*6lRmlC&L8*~YS%?Lhr$b0P7hvs zIN1L*%l%C1*UVkFcg5Tz{GeS_xaD~`Y>Bh2C~kGengY?X{K&Jg;gDN)0m+9#DJ#|u zbo--5=nQw^@P4#CLYrFC;Q)6BRo4SIy)&kR==5rq!b5Uc8SXk8r5g|L<*Yold7NQI#@$XT$`k<9CJ?9&s$xhuf%2uv~G5qAS#%yt8Mp zcjbM-v&6m;*}Bpx1dl)DxLYIsHxj?`iV5Xudt%fOCsiO{6ZRI*De{v%hO2(tuNiVg zTiJ1wi**rrhfDqMkHE9QaYNwm0pfoyU)saZk-FWBMKAVa_b#Gz6D_$S+XL-iGF07P z@`M`Jh(AvWZ;F4i(>Vk}K{{qj&iGO|^5{8#?wO0m(p54huSgy%+o3LYBbe}&PiIZ8 z*d}8Ac-4)&4WXElDqpU&%@!th&j&A^qC=#3v$r(AHcZ;Qpj2&%Lf)gU#f6IJFr9_v zAP4d1S1pr1;nxXHOg{B@=a&Rz5!XszxI2h3wJbVe3#!|tDXcioeN>f)-L$RkU=}LnXC)`u@F}%BXzr9FH&c( z$AUfMVTdzwKuOy2Fn2;A%A`&lq>9mjQR_oGbjD!My_VLuo1Ac?c6r#*hxSk!pL;%$ z_>b;F-!xMcv5)Y4!%MDn@YeU+P{LY&TxHyE`JOEtR>pU;Y$SE0d=&%EXBAp-Ir*xp zu!%o(stp9hip#){*q#M8GVVPEd&F)Ql6vGw|Hiv<(x}RKVVn5x2s9s_{E!`a4*F_* z4(uoK{#hy^CS1}1F8IhZ(uB=n?*8Z5I2~g&+_TJ8N$`f~lJGW3g2!ba$=4>_GKB*= znu~|njnP2;&8=6v1Mp*?!r{9FA0FIzJ-A{y3RwSSY6W~f1COWKj(yy51owXXyFDX| z1_JSCCALqP9pV)NuI{2vrucRbba7tg3f zMS~(MrL3$nQaY3*NkoZAAtPj@jFeGAiL4aL$Vk)pS}DiMD6+C{u5sP#(!Ew`i1d4Y zfBA>!^*GP-obx{K^ZuN3${D*Gwbngto&p<Ck7r-vn<& zUyz~h_k-=(d(!z#y)nIi`zDPaVYq#dW%DAzhsF+BE5vV+`6Xp6nwX&{^m|U|S>ANO z-dDRHuPP*Y&aICt_q`xIc1F`Dx%o)E@#u)aV$>~M;&@(cbb~MSuUH&j>M#v)cO2#e zl3XE<`(5YYu}JjN-WGp4#0r*+#jmM~C-tUVBP|YOoe0^f9s8^aADo<`xvnf2^R+(N z?2bAKBJB;6JO5v|()7I?^`9l?JiI-&Ow$S*YMrDL9{S*9@o6WAS5t7bYjfij5-(^+ z-*vt^?TuR7Q*`UR;_&CESK+Jy56tOY(Hpd_CK&7@4^}~8XFvM zz=(O0!kS}oDCe@RPtVdFT`S)mena--{3&Nu4Y^06qjOVg4X$`=t79Cm&1H1HHnsYHdlZI=61_xM``cC3?(m=eGYg&ZvdWW=a(Px}Ug*C@`n57SufUR{=2^s_-Pzc_ zp6_8O6QZj+Lwz42at_^$+F0-3ox{guECg^-Ay z-=|=7#zn?1l;j6yCMmI|9yswqqx0quOUx2_?r}}@9^9&5f8i$KGdl~ugee_8j?KfR z1=Na@z@F2|zkA&QydBR(z976r)$1>6CsK*t;Xn4a3(vB&m=Rs6$d0yC2=>ox>(!w`qr-0qGa)s+W+1E?e-SIt< zpt;AC;(h!Ap0m@e=@W=Xr9aha6oSWg+ z(HICHWqSRnv7S)h>FHWW{CvWXq&-^C$$9NBjTkxWkJoGmeoi|`k?-IebqxAEF>HEr zESJ2~*~z6YYTIuhe|kfnW>yHfw&E+IH=c(TC7OFu2v5?b^6`K!$#>RreA3P6h{p4R zr&1ZrP!u$HE%%=AD(UB@w1sTRJycF_uv7-Dw_mL6pa)|2W|i7d(F`>Z2hHf(YGrcUi)41%OE)6>FlIIPv2!YaCQ%GjiMjy zynL$Q4B-V&W=QK!6Wn}TpzY#Sf?EX-atF|yJ+MdP?)43p0eE~-C*h&~X;ArVQTCp^ z3x#sETvsP+oL=``Wz)p`zM4mltVl&C{O`E)-c>}0G#a!$>>tU$j=b2oRiy6%1khCM zCV$!D#_nwQ3-_+!v%rmy$E65QBC=}UE#oYnuFj1+v(pi5PAi2^F1-qV+eC8o2tF*S z>i=#*{In8lkVEOkO|&q@ldS{iQQmV?$KMO*!Tt1GwwLQPWL%gNXd`^Yqh&)slq7Cq zPlQymSGqSAdQN2r5d6e`+F2ivP3mbea(9=zpT{Bf8{gi?grP!0?&SJ^I_U6n`QArf z(=eA<=J;2@1;o7vnth~$abJ#;ebdUbkj>cq@#l5o4=v(%pCIu6h7s@Ou*9u$3O>j{-# z1-zsR zc%e;dlB!tY4QR_&I&g>Z>YB1Kzm{GMfZRq~-ePkYR!)B?(u^ZIPvea9 z%g8<4;B_`QI689tLPboe(P;(KR-3%V7OR( zKiANOpmUh?;+jF^NekqtPkeSk+z<1qSA#2vALADMZ^I|zH?H&PHmO@(K$q74s*mN^ zVu{|~gOn62V4XO2Z)EE<6i28vMs4*5UyWkF+ zES&~R;{x6*Jz*HwxrSHg=N*ji->7^mlpC*~)Ne8(cHSpZMMb_V@MLF@wT0Yucy(%< z#PF0MuKF`^n-Vw$x6%XZq=}z*HdS_{i*uf7yN@3tJpXF> z1lds&uq{~aY#(?6o|W|`FuOca!|R8>BgwmX+Had-=@i_fhU>0Kz6OJ+eMTcC7!v^MQKPQ7%6Vr)S;r2-2)~l5N{@w=qvsRhs-tobA@2vwZ2#>^>rk=9> zSQt+EtFPX5%oD_{^)CEcavK7iwSB7>NIlq*U3!7MSN?9^DBhf4(w{GLZg;UYUdnD- zA9LCSl%nfYu8_RD#kOo?{vkJTyLoE!F851dI_tT3mvSCWW*#`W&P>5{kJ!rg|J#YN zWA2l%7Ovklcw&O%Hk@yKEuB*80&Ws2ii;PgVRa!(t(5H!yDz$|8+~;NrM@Qay;XA! zxbsbY46UX>*je4In)shL5)bU=*9AjNf@9>TD0>jf+G6G}5s7~;{nk27>KFUpPikLX z;fZcbbvrLv?uAMTkD5b1k+7{@#V(n=3-#arf*vIQYW(PS^Ik|Oa7=8hl58dOA6hKy z<*poprvcQQR)XhW_2?9~IuSjy^2g^Nu6coBaIIjuqaV!Pdd!`_WEzfXe!X5z@M`yQ z{(kYhL1Zq=&*D7VEy&b77vW;yhA`62?Ly+arS7cH?yMlZA|siV-57*z>OFUp&53?B zys37C;Dj7!c7}8@;h{Tj{!5u~2D=w=DPLL6ur$ix-k1e6PQ&@!C1&wAJWzil+i^A5bpX2^KYXIE!QtATu1q9;Ia*`hiQu5F?RY_J zK@Asuw2gFk?Lumh$0>_(FO=BV#Z0%KhBt4R2OJnWXxpfFXn&+LO3ACwZTRmZtp4#T zINY7=V=1SAT;veY6d58sZZtSI@=Ns8UOI}-wJLkKuyDWp2L;U?T~H9gePK4T4>z8i zKfjkF5&8Buw3@J(Ah9a{SNdKCNYsj-Hc6jAx|cy})2()7`S7m%64iztb}_q;Z0H5I z0D%WKmqzgW%5Sn)Jw~xF^q*YuPzER_*m*E0Otd!s@X1||0r|nz>y^F_0mrQVXIVuW zVcw|_}@tv>8q@fFn4)D9gi%`(bxG?ceS{(Aur9Dvp#e~@12i+SK z8SqJO$te5&5G-5m=XmA?4MKYp?}z>x!M~ew_J6Zx;hL)Io#SPnLFiD9TY)eIbssZ5 zo1-(4Z>y}|-*&Q2?$JvMW(+9lWweM!4?&1#sBQQS8Zg%KSog@&Nq;Qu{$64qX^nGo z%g=N{U_rLT3$s4Fx`Lyf_hmeGnCVLnd}P8)bAP>$XBe<_=F9NA{2{o%^XjdRa2gz% zU-sRRn~o-T&y^(~WugAt`|(HQyI|w4rqSBpPGF0qol{O3IhLXHpFLXh*+S^y}xhObrL?%d; zorK}rPRV+YF+ngrvsP1^0jy3Q*ZnvId@dJ_uQ<_Qkt-vEEkZ}yWYOc>hAcc~v_`Ep zkF2wF(AF`v57ms7#j;{zk-EI!x%x8`et2Ejtz^!Cr#oaSKc>VoFP=v=KS8fH@dv@U$2VWNbwjsK%zc)jJ= z$Dt)`7})cx*sY@$o|InQ_|}SwfxP<{Y+WgsCjM+sziS)%JiaNC$HB%6N7;facD3P< z`S0!VHzvW=q**WPN*xv`rEBI748c|-73JVvG%!_T&+04F@gA!sT~~{RIvRl))VE#0 zahIOx(n7kBe$kKbUaVCS>hx6$V^unhSfmo=xT~2eT?gYeA{RUE_ub z72mIyS-5nWf)-OPsk~;bxT5&okoP7wYIw&|=a;o&kz1IHZ}uc41ks@%lwtJ}LyibT6M1I%Dvo?Z~axbAxzhzeD7+{Bby` zl>DFL*Df&lGP(T83mV2Bi**m5rs2AG5G7hS3@&N1tKuhF@WDKG|Muis5DC(MQ4mGN zW|5VIqM_hI#_gV`oNah@!R;mQJPV&3{xQ%p){4@*`7HwRn8}(p^Sl zEXZHOr+4#w9jxH0c%2bO#hE{^v{Z^Is4PYA+&R~Zsc%I#iE*;g=Ec-Ok0Wgu{`ts< zk$aOsnGHMVaHRNj@H86sFe@3&rnhLrE|fuWD4ppPyC}N--Z?! z3@hEpxo^GYK60j_6{DF2UegJaAeR2>R_V?tVRNC%yStIvoNchbV=k|AGAOmWoaz(&w%ue+0OP(7^E1e?H-)zku$` z-+^zs;2}G{JwKR+8x*aNR7(;+wOTB8N9{219y68qVzXeMj-+whw>ogynXPr*mWnqO z1Uyr(Q1H$Dif%RSHWV(1E1F%##y3MrBvOHy0c3 z^m|?Pyif<@gJulE73d1rDdvFB98_ORc_N70DEfB50X9N@k5rl(_w zi9;)x%c@BHn%Xqmv1yJ4lIGfv-j>&aJD1IGA9X4o$eoV-r%yqyb*u5Zc^eM@M?X}y znvD$gXhY4&Hmo|BAbnJI6{(NkgJFi;-8?Riw^-=l*24@`W?UI_pVWqG0 z0b7VYDs{Iu$&!9*V{Lapr4iRr&FU>%sc;4vq0dBXoJ-zWJOxO7%I)G?8{)wfsGf&qQUrKon16Zj?g+tz;~9as`lADQyF4Ua0?GzSLu zf)u4lJ&g3ndLrQ2(0_CkCz?HN*eY4Dn#G);RWNa2o!wJGdj{CGU;A_aU>R)7RHgHM zYQn_+9I<$nDSUC_Dyu?+jj!cI;&;f9fq*1DAJ42unzC`e`co?GI$jc`yvTyDQOi_s zpRLACCHJ`a*Oox$e~lUA3yqj^=gE|+&JxY5*BaS*A?=j)s z(4)9!Dom!_4!A+=TpD36{B&J4j+7btKdBmm@C6mHPo%-$+-Z?;)(EB&wvhcfR zm~i{1F7OF4GuyqJf}vlR<(ieHKzY${lok-Ijk@-j#))7w(-hDg6xb4>*o5Qu~lI=iro7`eSTfvgW_H(@ba!YTq2E z%79&6_pguF4}qC@h2Udb8n~2CJ=-Zv$JyE|`zU%W+)**m9=op#c6_*{{Y`*E{D9?P zbN)ko$zrQ-`^E&niB#?NI~j29(P;al=R?q3^Qt5JJ`J{?x+iqu?+E_m3bPF{Wntov zKDOWJXZSDK{F2vZ3eoQu`>Ykoz~7az6tP|=Ooq)zdmLrJSjD=U+_51j%^xq@a)bs< zox0VHYw0LylkoVc3JbeMHf|J_}b@?YYWZ`5ADcw%zd(1r3bbR{11n z;=x%dk%bv1h%$s-L5bjvDP^-EaWHYvJtK_CNQ>`|*9n3(G|v;(w06v2f09 z#pQM9(Nc0eT*rI41b$4?cO3hTTEMq4@cKkW#jiOq#dTsG> z%>oM)?C1LA7-T<@bMsoKshB&~ys65If|tLoOWu3E4Xeex|7`fn!h`)Mi-Y#I;mu|1 zc{4&M!SJZG+NaxfXg6fA_Qxm-@a~S(k4m?QXSouogEcKil5=odv53J*3@k*MiX#uFbN+ zRBQ-$oh#0z;L;SX8kSWXdT)u4@c6|-!hNs@kDLXG zry)^NW2E?IX_GGKDMK)bliC*x0uJMLb2K9~2h@ zl5Tf3pjqkZ^&5~1#s`OlyZ(~?OV=v4-~CgCR?(kZtPj3}hn@b4L^+0vbmFm$Tj>~9Yh9&m+usS&?XrlC+dZd8R=H~b!d(a!>* ziu*e&+-l(upFzac-jTY^Dw}A~ixBvW<+FuKPmtqZ{GyCygLCy9p z(|u??Y<$Y$c^mmYICBGYJsab0^BxG>-G(B;4sEU^?u;y-s~uB%k72(qe&^rw29m$< zF5davg#CiL{=Fn#_)kP92X1F$*1;#On)3ZHw8!O=!ovpgo#dY!l~O8*hMA1>68!b< z=^k}DvGb|iz=B$na@g-0Yx~Wy5gDJ3QXcJ_!ZG(Ci}eTDICXoA@5T8q;1#>;jDTM~ z@@3vMf(r97`{1iy~q^mbUwGcBh5yWUE5w>Ske!s;v!zJUpJy& z=93}MLMlkf1jtzs`!HKJ*}2SBp{VA2bI(I1@UPfwuC=uh;{wlbU4$uAI&oHJyEYsD zUduk1ZO{+PbM0d~9N*&?3GsE(uc+W!yZiWm%h_4LG%pS+2VA z0fU-nwis@nLhoGHniW$l{E_9*7W<=a#fnfXF z#6CPT)uHbzD&U4o_kItqk9fRd-G6rLr|^voU36}iMf%!tukL!;5Bg2$PyJaMbpe9RaSBWrSzTwRMJq1IcyuG5fJ%{AW z$A+^d$44+gYSZpPV-{}7@c-V#-38jq=lLSnQ*d>n!vmY(bmV4594u~Pf*1eV!X%O} zORs*c*z}!_97C>Pha?pI{o@=d0?1DM+I(7&1BPPH!qVmMF-M~c61 zRNGBO-Uxx8Zidy2S|ZNocrKI+c@FhjKrn z-fIgoaQTU6Wma2y$Q;}H_2v8wY;Kr0XyzXSRTpkUKb;P+c6@-xgh;>L>nUj&Wht0y zE%dtHiH#u@>IrVnR18V^+fJ>e;|pQS3u#$B5M~xn}hok0vS^wy6WegTFxVOB$|c&;K4vNk!okHnOix**Nlrvrx8#*qLwcz_Aq! zlv4L97D?-YXqjS;SYl@`)!#EZo5skTUVfcNNbIaQ-KIZI!#AJeIwYl%F|>#~v{H+W zA6<-Drt1dCoH?-s$7OF}dk=ltvAHIU`pUTeo%jvYsF;Z(hHU)zQ`e*{=nL$rD=6P) z+=vSXNAc!%Dhx>GX49qFa9Dpud*)yjwl9uU38=gSp@#LFGK4;0_)H1UzD-k@-s!(n zllal{00ka9<$kz-$ALD>(}b<@^4+IsRMJn~eXZpY|5%Dp|6*$8cb*BSPCk-lnCA-k#R@mb`i%Id^fpM(-YMJXZa0P{tAwu zSKd80%lve#dFlRXn%L)SpiGhE>H+-hXXdc-2OS;as#15edSL0Ef>fs|Su^R7pfTC6UQgI3m_wUuwU(|h!*HxEBK2u_2ZO9huds+inYUuT_)U6Col-*XA z+u4My%Cpsn)TeMpiBt3^$-iQGk0cDZ_rs}&-T6uJ^?1NP?+Pmc53!Ns+-1WCLT4@TE!?>ln)Y+J~iO-%w{Az@Mn&Ew)23!|? zBtAEi3R5~`e-5l=1BdL@QElfce0}-e=GS-2fM(_0Qqb9i=NYFvMaVj3UBXcbgkOo( z*x*-os~>LEJc=o1*5eY}ULPd^(#M%=v!wMn3mCqi<8CWgV{^cbI0X%oHyIYK+q%68 z@2^=CT)t}xIqqJn_96M#S<1$v`VRe2zj0dl@@PE_-Q`=__n`ImDXWByi z+BE}EGiD&LjNk&w9A7R+O%-|_*Lrza`7QXRR(^l`lHi|DQX;(s|NLZ)zxhf0OWd6w zrIp{mK*GF=L#%Bh-l18X&3ZtE*aMM$l+|oVj~MW#+E$@?Y#OI;LMaGrU$tpr%?B*t z<`RD+KZRWz^Fvz5d)`00<9zb+ez339H9mAKWIwFZ=;#luA#0iiUqq6MIUiM#d0{dp>Es=3%k5uwQML!tymlM*ZDHW`r=d%KOO3&{-Sdu* zc6UJEg!}Vri!{==I+{1`a0-qanB`|XvT*}{?A<*sR0K-hHMdzh`mFK$8WPz9LjQjM z?h|6*(4*zqFNvR5qvX3-XLP^`+i|RDr{Rw(P3@uk4{s)g50k&Or zUt380*uxWh9$kJz#k3cCKKe{LTI84&s-NtEF@5@$096L+&e|O)CVlK>)4C1SEjnQ3 zxYFZ_J{ksnI3}y<_YkA}=6RK@*!b&0kt$Cn6$d~0#s}|UU{mlj_ELc!P+89>8o7jl z+|@U^a>#oR=DlKhhus0s%?)|3Ezodf$lx#Oh6Eftqq-*ZC>zVo+;s+-A#ysYhKXlFXXY^$<(GO=?I^SQ5OT{N1XZ0LBs zm*5dDi=zU>uh!>3z4VIw-Fe+$dFtU_kba%n`SU9s2WOn39`721Y(H!fGUG^=CZe$CknRwa_Xw)1q{#f=B{ zlk<{L5$8I1sRLxr8or+xq+x7=n7*!EIzHF%ide78M$r(7FP=LF@cvIf4f)LsbX@uJ z_l4{pSl3m%Q-nrGorhd|#8;4h`Sf>9`|3L2t9q>e4Eeu=1ROe#-%G`J;*~EC5uRXX zc@N( zuzdo6%sFY9;T`55jz*g$zS$0?tl_22aWS2p0;u4g^ufF zVbt7IXe;rTufj&Jh6D^?Zs@$tM{WiN@ZQxZSLucBdrIY#y>v8~7;VZX@v9%`-o8T} z&>1s+bVol8`>a0A4Bt#c8@Ek2eFWJUx{2a#l`w#}{(CLxP2!+Tq(nwOKk0*PEUP+5 zrQ^0;HOGcTNdHcQB$oxp4l-w4A-b8ImvfrGO34^$6@L4m>?>t9-eZ2gTdOjF7C+No z?5}$RB4M&yzjZaC^e?88@AfHN`;H9>a)fvM_-oTPv3@wZEhc5=Qv+sl3J7@-9Iks< zN;i{(^iBSA!@QK>`43ZyMF)S;Q6Xe$)Q+hhI2m~3&*9&6%(T(Gogp&@Ubpt#7L@4# zpSm5{K7VOA@R>4v4Kk6w?^wyT{cJLyLE2q$f{Gkraj85}bKa;_ULh`<~##bJ@0a+t?UyRHQ0O-i5>Ahk1^D z<-qMc>}1>CMEb+>JMJ{M(mIQdr>KQ(|@Nbv3TYbP3$iT?*wb;WYU`!mqY+Ny(Bpc+$>X zxP`>8rab4q&RjCLrSkgXtWQ0biPZG|RvG|zF?-7-Itw_q?!V=-yc$Eg+IoXD$^GG3 zezx&C?o?cwPJpEcLbJ2*!$BCAK$#XSlCpqrqb78@)4 ztdgIuAHWw%$qRpo|Fh`q<9q1c13Nh_HPi(ds3nvCcYNy@X!H+iRYa2Wa-Y-oAn&wZ zYyW7!S2A{gxE6nh;Jzy!>wIE*sHnWot!U^Z16Tc(Tf1ta2ZqvhR%j&Aar?D{iatF| z*k0uI;6`5u{MzqiJ*Y(`EqM0?C)tB+e)*otJa^ z(gW(eqNkk(=$PnH_0o^{4fd1i*yAl7;5ywDGevNnJ7?pJl?S&bE&-M{ zRz~Tl-OiXxBRp;~|Jp_AtpliW?bY_BK5%~rx=g^BmAJl z*D&KNopAMx2`xx-1jWzTEE^L|!Ll0H!6?Glm#@+P&md(0%cm-7k4{hE-_0RH_o_Q^ z1JBCC_Z8aFu+CqRYSIT9yuzcAiX*t!PWJ0rvr)X-xj{kQIm^ePcM#Q;Dg~F zy&IXJ=+!UL`Im_jr5w8Tn;4Llhupl!Ch*i0U#e_T2kMl?7R!--!*_3J-g|Mo54621 zD~^!43<)3QmW9ZSqUCAYBva-I*qdfG`P4Ge=3Gm0q#Xk)d=_NZy`jVNE0c^o-+Tz^ z;wz*b9D{}$rKAM8L5yr=82COPhuY(XH%5Yme!ytKao0ela9l|6I2pzI5fE&AZO1tQjI#JMplP9hX;{KEN zX(h4aFd`@Dx%Ol?xSbMI+W44;8jO$MBV%NwliBluuGSLvhHDAtzCb-4#*!ya|-pZD6C=t%KWry4UL zboYt4RkjmY@^7_LqDlv*(eFQmjCM3KcH2~8O3uA@`A;vc5qvEP;u6 zLsRuTi?}f+e(ce@#G}T5q3Z`C4OJ$P8MbNq$evE*N`0K9S>BG~nLkYyR#M>Vz^Xt6 zQcpZ>JgX5;>M4555~7o|a)IY@&N=RBCRUHMeLpWx>iBu3m3*EP*!lFt?v2`HUP4BG zkdz|XPld7X$8WtL+8f!}a&iQh&-}B!OZFoW?4lALn+g2olA(qjq%JcR+{GgG?iEie zN3t$Y;KqN!uC)Cf7}PtV?9bPZ?g|6V?W4V*7%jeIE15g<>zlrcw$dn8d{#2mvLg3z zt;?8DArn6bU$D>eAohv2TCBP|1g^1iQ?`LLSm#%6d|8D~^k`JQ^$sk2e6sFmYg!kK ziilTU+1rOcdzSfW9*V|23KEMy8<=3EHNf-l90PDtLD#B?4!Y3|Z_S1ZVBsxg%-(Pe zB#m^=ELslYCF9b3=Ie2AFzEMKT+$6vPflk1DWu_-{7lRFKQ#Qx{Y?B4sSlP(&3FIJ zrGvvy_Y)iM7Jzli+0i8@$(*pBQ?bi52QfN@pZi+XILr*}r5Dh;Krm6e!H(3+gADI& zbtV3BKzL}fBWD=$pQ`P5UBdw0hKvYxwU>~2_3hn(zf9QK?Kx9@ZGg;UvlP6H<7EDi z=#U@18$Qpz6F!wq!;p(Khk6zbmvz&kUbYUymRUh=iSrX!=(D8Z3Yibo6RUbln$*z> z&pUiuuh0ih?ln7<$$SnYcl(@o%B1@OQ?JZ+Qzr1q)_VrlGtuel&>ICC2CQoH;?;{7 zg1};%aQy$C4e*y@_5Tz~kG4?>|06^V^-bbBg+Kbmgn)P46F~&h4e< zJJ?Lv=TyAlv6}%vt)4tb?40=J{qWz3=depcVxOb=7>xQRyuX<=fd78iI{)h)hXH?? z&H?LgFbQ;1P$Ta=^kj!r70DAytEcW=3L~??WK$c9dg)N6Bovi>v;gL+BS*Xy#vse6 zz3H{?AR0xV=3!)zIYXk_f|d^5Al#JrK|79ya&bK=9t5Ak5z6J~rNb~i)pA<<4;|uM zCBy0Cg|H^$qQqamF_5y0sn>ish^)vBTnmBYuuDPZ(yNeecyyP3EAJ=`)waI`Px9_m z#8jX8^pg7fFY{T!aI#L^n#*lNFW~7$ZlglKF$j7T`Ta3brB$8edPWqipu%%-ZJlp7 zcswhv=_c{#Ig8enDK>(Mb#LD*A07t2uHfB$opgAUyWIHeL;-l58i!X&xV}=__W3Z#$qn?_t4-jD=fit< z&vv3&&pYw9;C7-PD@aaU=!10TeC>~aG;H#em&r67#m03%j+WA%f}7Qt-QX7{z7-CB zvv(f@Tvm;o*kn0@<7TVN?l*T}oYktHA)R*I*J1d0_EaD2P&0pKyo}8MS#siPfcGfI zsC;NKH^~JhyN}0XW|UStCAz=l=ve)3`l~qC4yhHs8wx_Kjy9VXMb*jfuC}mE{ar`#L;zurex1K0_yl~Htc~Z&WTKt< z_Sw=92COy@jox}?2$tyR%?J?v&v6AK(OPXf-Zpl2IpNL1+_ekO{NH~D=?X2S%CbJ3 zkGZ4F_>qDJ*4&b6-nAAI{xKVxn)jLQf6v5w?z)Hno@Kz`Dcht-oeA{P81$0n z>%^f31!`hwJ3hDj2fN<)fqFsl>xvn2&d(3kyg5ILI_CnMRz~DPUufmUpL~`e|hq`5v=kbF)s5O#no@e zlbw!d!&iZ5MbAzqz7tcvdBlJL1*d#+4hKx2yh!fSBTi&4p23%{j`}uqw2*vzfSi}8 z+IN-3W8@tz_n~o-`f`xHNSNSMHjL^~o1$Bom}WhpQgnm?CL1d+MY#`wZ|FB^k9Zo$ z1w`oktJ6`u$?Qz5FAHmqcdsiP{0xU#s}mro54nHl8Lt2S5SOmXKSSwfg3SE0hTmjA zMqcj<8%Bq~?&R0Dxji%}a^Tc{Bu@Oi_q+I~sw_<3OQY<0+6C++v6Ts==h0u+y^^Pv zCE(4!Nd=pU{%6Pawr4z~e)@0OrO~^2bO_oZ>|3)?0Pik-;Z-93=cf7hA8Q>4@%W=1 zH--zw;pm3+e;Zj{5Hi_$JEEM1Bhs$9|K@1;`AB!)y}V(V`x5w8r4fTd|RVZG$M8tMhbC9*Gx$r=rcAx*<*4`^eT;ghy<(6e#2!L1}f>`25Ua z5YylKVBeJql;QPPC=l+zD>LPNhMUO!F%0C5V)TOkRT;X&O;UKNN#;DXeH6WS@Qlg# zrbCT)(c|SL4w@fWI@|6;-q#!U1F3gIaE>x}X(i$Lk3Dc08qNT1gzBd|Hr9s*vuy$|JChL>J-GvkZct&De9<*62Ani4 zeaU`JaGgxwQe%2PwBC=_Dm*quCM4bXrmQfCYkoZ`7%nF|nJn`o)$6(;_7n5;?M50l z-rAhCjokA9v6SDP>BHb0)~t4!tYiME*Q94>J~UJ=Q}Hw<`Y0j(u4nZFD0jt7plf&> z*jF0-te9PJFKMAzi0E|$41Q>MqeA?T_2H(DwUcOT{2l0tM_o7;!R)dz>+Rphn( z?ZZQ`iYNcXr(-lQ`YkOux{i*on%OM|Pm_+phwXSY4zsX0dhNjN<6U5P zEwo+aivH3CSvTcd%Wd8Ch%PR9WN+N@PU-NJqLph??skv@9umCYLRE!*2;~6 zO-AG=t*azIJ7fRfgBmh#XQLnoS6?^i$ImQG^wRLy$1T6N5uDJ#b;aKC!7%JAJLlF@ zNQd}kEuj>rA~=w}O`%JV%omL)x)6155RLy^^UeF&IEXn7OpLd5!H`Oi=kiB1RJhLB zD@yQBkl(FeLXE>vqpv#WltBlDh@?MnvWj8V3a$LVN5-IRaF5E^`XSWJ(QCOBHV&}6 zk^U#P3yw0!EN^?#Fz?Fgbt@!B@I}PfQK7bBkT>2lVn%pmqhn5gG|tpQR$@eSQVrAcoOzTh-n?bS`<3X;^ft1 zLrHbb?>m*%@D};)sj2-K-F@fVsy!5B>8KgZ9{Pk2&ab~q+e7q8X?a%}axJK$8}Xv2 zj_41chflQH)Z(cxQr|bk(ZOEstU=+HLgP#6>zV=l|jR@HYZn##t6zxn}5p=9)=Y&B6UqaSrE4*o$riIEl?Z%jTT9LIW@9l zK>aHPcNx83%qS;wGWnBcgZYTQ?(_3N6_HlFc78AjcC}M;xg^-;$k;i!)_VA5yjT7~%Od{;0RH)uvGBtB+SAsTWk|gsF%)_rt~~=T4V= zsK+q(;Z|Kb6+)#f%tw9@z1DgmDeq@hSQuNV?PD^5Vy)@Fj(+YSb6#TxH`|fz!XA=eL>*odN9n-3oIe6LcD3UHexq?SS|7Mk<2^D6p8O+~9X{wg zihqCUY0+8P(5%(FdU4Yjek6UY-qjc!{J6nfuQ8Q_$*-P2qdOqa>zy4{4FS@>BUy*?!{*9LxLqrkng^D<}IPXNThh+9VAHlA;0`)}yH88MUI`@HwpRe{k_8(dn&v>75@= z^3%_}KR)a}HGysW`pLMg4y^w0d`@1R%y%+(O^Q0*2Tef>!-ohj@lXG5Ft61p3f|w; zal<$lxPBTr1rVKipjCZTurARfeSSRen>B$UPHJo1O53r7om|^v)`rE!TYet;*#kVa zn&*ZTM(~oUb5{F*qj=#=T6x%k9H8`1ib?U2IgI-yWyPw&}Vp3XlFZ0=C7UjPkLyA)CZTzazGAU@WF5-!c5eVoKZDdJMEn7~OFosuB? zLr*)alzkLT$SIepBl@v&S1Hc%&qHATvBYZ6a~2B3Z;=ajPs9$|`AZLd3I1?f@o7P* z8%iQugv1^)VRLI;sLU*x*ZF?6zLRSo%FmnXT_F2mG%0I^MXCJb#(S0nr6TaaO#{(=-l{;i?_uBi3iipuS6uJW(0Vc1WiQcNXfAZ7uD;s^KRer&WIGLm&9lt>V4@Gd zK{Gel^@D=1f=m}~*R>-4jde1Ag$ zU6h`1W~$VofP|R&=+_~b+@hiG`;>(;Zlzvyo)jE<8mm2dhUhH!JT3nb*#&F4R zAdk`@a#mkR|NETOl@wxj$`V{oKRti6^x#+c`Frr#T~hz@vq?&>9c046^7vnoW8Dz) ze{|6IXzHMR9mKbpi46mlG}QU_<4&w^0h|d`y#C+UaqwxM*8NTJ z&b`cf{a&(;!LxN`1{K|4v02Es-fkEqVrmts^(=6Z$mXqJQ1H{Lo5`ONT5*FQQ>%Y% z9W>a9v{((b;+t35L1TK8a9qmHuEm0iJ1h%7R@`Ev=ikYoRYkQZCNIagP(TCiFd_`%Y>4Ij$8rbakT!YBpb-O`|9!Qqmh?cPKewvg8l z$6tp7Mm$`D-7L5n-DRjx^lO6N&o=vWwBc9It*WaVYr$T6?doo|HoQ!=o@lV2gw!O? zPX-25bMHPs3FhW^h3WgKxTh*BbiD@~hXOx{cZ<~FCh-Qj2*Ur2=}fK5updP3 zyiwCFuL+KH5qYSam=Afov+kc-7zaKzy$-*58pdp9eh4S|NrHpp%^yYGpv0+`c=FOP zgdGqoHcO(zplsYPjm1H<^Z25*CXj~wive8YcM4$}=kij&(Q#-UnF~!hFoL@#FVp;q zUw*%*fYVsI8&b!bYYhm`7S|@3-QK~1u20z%WjhL1f2|UqUDAd<_TkZ@zIBj4Y4w7a z*hgc{ffqZ8&K*As#Jha&$2Ha&ddrC(>F?s+{PKuejHf3Gy(N17i2KLuRyt8IYQ;~_ ztE#QY-+8I&4u2hVecvrsqtu2*jkRA!tjYHlucof7Bs5sVU@_^)(tkK4= z=U=iQOH8Qtu|EZuX9a#g<=gr{iq1QptM8BFluF;yutFutDqBTa$C1nk8QFX9U9t%c zdu3*~tyD&J9Ldhg-kZ#l(DXaMzj@rxz2~0$p3m3&piV>E=ECL=AR4A1i(7=NeEr+r zT4n|8Z%P~fZ9Rgz`=TZaA1$E`$Fih1{B`Kh%^>yX3sqn-a`%V4q$M)r%MP!s#6oOr+GPRa=QacKMf9>*r+WcWTvN_rU3k2w#F5?)q!H|^v4jTJQTNuVW* zt`S|5rm1*-x&}GAKC)*!u#7bMEUVH~2EdU!-Yj6Y5bU+nZ>4PLLUSG60|j2Bj{SV< zaC-3^x{~>v=FaX;MEm+STUEgKxf8LR39USqIE#*7i^{)D;^z-Kv2=2$ zssO{JU53E>B~)+EHOxrXC!^kHTE3_Wo#ZG#vxD%5fUh5)BkzOFeN2GzeL{n~YkFS~X%A^~o?V(!#oP&H!) zTV}|4siR}3*$Y>YW^Lu3V4(&yoc6qYHy1{|F7kSv&&Pprz|OaepBE8Z+K&yn{~n?( z{U-x&N!{)5w}j32JUt*{QSAXuIPrryPWoq;r;zHM7eDT34iTCG7vUP`f~NH-Ya^8XvgJm0q2PSI^%sAO*N9|svq1Z7QBc|d)JvX#UG*@ z=^gw0Nd3kBc7f(Pi4O&)o`vc^nFB{@X<1LvOrs3ZP-)Y=LG<&V`hT)KGhnA4jsDs7 zaWE7lruch+#2e-w53Gwa5pM+7jY0KEp#Od~$X~n%?4)&LZ1E=k1{CXC4Njpy>H96H zLx@f?b=i4)dm5x&@M^01HV&f2M(FR4Eu#4b+9~lj+31%~&Wj-pk|$hvR=H5w4Oo{s z+$yc-086cHH8JXx94s@Vz zHaSOq^*;c1u|?=e`2BQ)6DH#3E5Mn)dx*wq1lbszA38<)xwP{F0R=I2NW(Rrs+QOl zYWn=Ukoe^n|JFFIgWJ&wR>`ER#Lln$IBgk4^0tK+SrR|U`p`5#C-wgkwDG{_&EDW8 zblRW{~qmJMOuLJHBp53AR_3q*?1gkj%T1<ZFjUtE!?SPA+BlYeuSFCoRtF*9=AL@yL} z@^7VSBZ=>#--*8(Cc3~c{;%c;zsC6RVtvI55_q;J_WrI0By?uf@!%nhG`D%Jy`0~I zC(dF;nk0VUq1k@;v3~?ewx*0*aWtd)nV3CgdBeb=^T=7l%|#&j`c3WO+7;xN7TEbv zp%GC_cy4t#Aha0XFIC#I2zVn|`wGhb&jEWXW-Yd()7N^X%49wOzmLxu?vi{g!2VVB z4Mn1pD1Kp{kvM{C`o3)2ST3O#Gm>-lv2{qURD#2`brCSzuhE7Y45G(19!3A1?m$_L zi>*gU{3B`g&*PFS@zYl=zVn8xfUia#Z|vAc&;e=61!2V{B*=I>^6iN_v|zB0q$-PG z^ab5Mp(jM2v&&;-UoY7&b)2QjHg%x?3+=AFZyiYDW7X9&5i7v7{qC<*1HN|Sex z-4e=SQ_bkGs6&-Mw?%bcR|3g9xh_g>ODJ>v67L|fhkx^ob-P9ykwnXG`Ws|@M)xv5 zGTF5R0?jVB!Lb!2b^n{=Uit>)GrF&wy0iw_a^!_fa#w*O#dj)8sY~enF`EF2+z}8q z^tpq5q7mIb?kf3R26n7v=gmp|>)1?Mr%uZVSk`eW)hTE~mqQpio5hELfk=PZ z(!WKpqWjl)WZx=kA7c5fz1D#CDGr}IN_f#9i^Y9jWPOUKEOZ0cmypF%O3qykBj8SQ z?})BT6WVv@*x72z5m4QETWh6c5$vD7Gv`e1M|qQG13qa$1AODtx>+^I{d~yn0?P^@ zswBWHSG$C~6!&;^`Hp}u8i`}zTLX%`WcyZTco=v@Ys8w8xP@Vghaxg(1?A3{QT=;d zkM6aeVHhQRFYCF53%`Tj0_!Gajn21A=uoRu9*f~9V9RHv(4cBY$$D4KY~Bx(`JFRb z_~9ZjE57Y#lD~pZo{fKgB&iVtd9=!k1w4oD6^~kZ)0mCvbm;u_Gu?V{a-~UDEh{M z)2DYX=SZDqg1awDaWo4xI-QEX1qnA(3wh2TlP$^cf3Ip=jjKutB(GMTLSt)r6z8 zHaz07m+%&c0``YK@_vX;T-lUzCH&uq!?OzaQo2C=aGk>6pNnXC(&X;pzG>w8%CehxzCf)wHXpbpCh@4zgL&o!@yCdGnYD0D4h;t zsWS09IuB|03XGr|I_8%%^OumLu}sFqyAMeAxYm;>!ZFrU@8+BeoCnV?j;&hG7uh4;SZ(vQZk<){E?lQf4|@SG}7Ysp?!If z)F;-zh`u8{?d9{M-H$+NaM>e2- zFS)m6J21k=@e_^Z)gZX`tFPj1a-H4P>36;meNOJiQEAYOKq@Lte>e<=9LpJ>5Pzwy zrBTUAz6+gSB77!XjmSFTFrD_B8dR5QmtD*`gPwoPyLV55a1z}<@Q8ONqEiYQ_*2#g z=0(4U6td*w88Kg@lrlXeQ3e*aU~E-;GvJ*dohNm4U%;*7_C zgae43JZaEGm4!CCo<7>~qz|wPUH5)m+XafZ)W99GpDi>h=(fA3QMs0pru?xfM7<`; zDtd4fS6gU4o&2JLSJ?p}K`z0=6&NKL%=xhWLhAjL2EZv+W!+&ti^RS7~|^rjpmmQZh)k#gb62sq@l-?AdL z5j}X)W2XCg7%(e5Y0+C=1Rs`vHr{SqK}Daw&NY?QqhAV66r8jeDa+=LjmA_03YxXH z7C)kY(H*IvCc5J8!53y;?;24<_mPE}ieYeP$H|*PzZSu5+m<28-WAk+C7ZQ(p&oT> z+P8EK)}YtELgxe5i7s2AUp$8Rcc!y3rl(g&fX^@4R*8j1H0O1>zV_)bVC|7*k|XzX z?JPapD)C=(E|l>*_B9~qjP$n_`!VukUoRDsd;>W4`YtdHETLWAtUdIN65fCW(&YW*(5$vVR`Dz)zg1oL7L~LacJ=;)+ySP3k^Yt~ezPVHbg)#H% zlv+zfFPie*;?oGIXE@zd(c6Sv{}U|dF(A*i>&k&WtBc^ib+Pj0pDRen`Q_eq%0~1E z6g-Kjs6o&z=x6??O3=F$RJ*#lgc??Z#cmQl{>JCOIZ29*=y&1iKV#$^_}PLT!GFdV z0SCLl`1Pz66!F}Ar^Ts8B=%N8B`2f?4W9OE|6@`KP8Rf^6<#FY^BHL%L*gIPhYk0m z$p01pU`|veI)&~$FHwWGMZm<);vYr)#kNY`%$XYvNcUt9Go?0pE=|dZ3zAj9*VCx+ z%I76C7{-15JkcwjIhI$M7t)A!(=_nqT^I)8zEWTKn#pyP57h9Z6~tBEkSjvdh)(z% z;#IK4Xlah2RETihqBmt+j+v1@<+mI_;gwDLnh(#hpYH=}-@}eqSag9v`rDk(Hx|(h zLoaXfff>RJu%-^H5T1nnSLW=@2rByA712%X#-SHUd=rFYtEuc{JoDQ3Tl%i9zn?~n+!P`)j8o{A+_U-HdZVbSR}}o8 zIQJRnVSFS9Rrm6cB0(SU&i=WUPdH(B)87G*=+lfQg;lhOj^I(n?1nSp0ROS4sJ|h4 z%;YPDHzhZwQR6x1_!eQJ_X^?Ue%7CXcCLtgu{7!fR)4R>NHlkWUm~gU*33j7v+sxH z64AkQpZ{>vm1zp?7_&M3_6*^lLK0*{&Jdl#5$Yld(pRntXH7qRBpt~(`oskN=>;Vl zYS!Rw7r4+-bi|eDYFq4qTlC;GIvm1wWKC*{%xBH1SrHmV(<7HI-&3AJypmi`4A0Gj zuOI9EY=5Vq>x~?2zASyB^nNR~_Yt1;to5<) zRP%(#7OwI?MMvWFtO7puYT|d~nYe?AKr`3kC6yz~C|Xq2ea%I9oWTvl%ca+pY z9OGUH%^<0?<2gTNiT>k7zFLsf1GM_UzU0=AUa(tTaP(+j7kHd{FKO@MB6`~IFaIC0 ztLfuszGe_UYEXFBO1DN#9+!gd`;QlG~rH_b(e`3O%aMTxx* zG{K#!i__@e={IhXW%EGThbAgbB9CxdPyc(T&<|?2ebOI%?*fIM0@WGciEi^%-jjQF z>;_hxYyP-^K+5+Z)^7OShP-j`{_@!aErDB(yq*E#l5?H?ue z)>He^hbn+ex*jk0^Cjea{;1?zqPrHej5mH-+lcfUPkeA9^`B{9^$Q||2X6?>_NA;M zdCIG##X3}vQl-rXyT8>S?G(0VS@K-#2c$W~R0vN{V&=*xmyO&db4TQeKUM2D*ob}D z1%~?e}d2@wQ%^tR#9J=|D4A{d+`DAg3_3 z(?185_4*FzME8NslgC*P`*wlfDU8=Bdl%8%xu%20#LnoT^Lry?rjS;{R@t|_5tJhy z@Zvy81z4PX#U_2sVY{?qK4w1VbxMk*?ve?;la`g>R-F*3@1 z60}O<77cMLs!a0UBmaHrRjJNEr<)s6IZ3>lQN3^LS6&wgdE%80iQNcl$>ndIokk5X z=x7Mx3WT_BF>Mna5Q7ewyiM$U@B}||)kUJqOuQAhZ)YZYypUD?%%>0R*>&!RTvHdA z;#E6xd-oC&5Uu#>J1~v1I*LN)PZB;YgCahGYZP^6-x0~znL%nw|9*;^6aM4fJ(aPA zZ1jSqf3Xquf%4<=&cEEdK+&)58M=-|RDEn#a@QlW4>Kel-M==4INTq5v~>_pL&V|g zD&Gv+j0s@d$vF>X;+Qy-JTj5Qq>QCfBXB>UE6U z5ujQpo*skVU5eYIwWt&Pm}$a|=)7BP(;q$gyLk@)#aX|j*G=P2^o`B*xY zav5!MU2;FfJ^+%e_rEJhDFnxk_s>U{bfLZbX#@Eqr;wkxKxN~rIV9&bz0gQF{n8S> zXzGYrw3~}w*}`cCu>7(XxwuN^E36A0@Sg7nUh_Q+9@}}qg;%v9DxwSdFqW%VKAu84 z1&WI2M@WC$F1v0Sys`SoJHH2>hDbHW z2;|nk#%d9rK;r~w_p%F_lQY@DahmXAlI2&F6jVFW%Rd+Yxq8o{x=E^q5)Y#9&T=%R zLDL|2D%R!^>3^NlG)?&RY7!Mx8M?aNE+yycWM>SueIfNBo9KYOL{dn9*Lrgg(Nk0} z|K{ND1&M0OCxRU(0L%U}w*2+eV6MeHdy!%stutKo79u+36!XK(l3t}C?=HKy_UA7^ zFG}WY+L0-AL~v?X2gN*4AB_~d#oG%4o>O0%BYm{f2?l(!U*O z4%Dg+y_iMq6BK1%^=H6cUlXGevVZ2=&ph8LH2@C1wAaiwEd=h57b@n%y3l1esn@JU z$hrXjqy8lEw(e&?vqk0r*ba+q@~?~8F0&e z*rn^~G;rE=yTyp?ABK|7Yen}bQQpTm>HTJ9AU8Nr`O(rBu=OKW;_!hf6nvIK;l=kk z&|)b0j^;=&kZ9{1h$8xnfcWxM;gV_a=JRCQH_CBz*|Gf0d%PVUu!L6_cMxu|?nt?o_GdC@M~Fv2Vzn3Od2;OW@SFe% zGxjrrJC@O?_CKS9(*xkk&G2WlgkPb_OD--=>_SO*v@e#qvG$o!^SUt3?oBWeW3Ok6!q=Kmb~t(vCN$*hH zB>D@XcG=U$gx~kgz6+9>2)E04{QHVVFR+<%9-=3lgD@2vW7Yd<5SH>mn1A;;>c5m% z*+g`>&dk{{6$cF4PNvEvIJtG1(8pQ>zq}#E!XbU@obBy&zlCDX5fl0t7MC zyID3&1Kw^Pzq*fO$SkH|nL3f^j_#K32oEVG=b-;MpF(s=3sE*|oM#BPL3!}L>7jYR z>XNS2OYY~Q-4csS^aN0^8w=4pxr~^9+-_6L832u;zHTXrkAZml$pEX>F2otzmdU0> z`lp&=vV}==Ncn79+BL$v-Ros*2)i|lh}@`y#(4&aJ-06uJ+X{vL@3mBiN1=4DbM%9 z(R^^y7#-ce(uMv~v5XsOO_8~z|Aq)Rjn++Xl^GD7$8LQglw>(e&U*wZo)>0-qNtm) z!rvvtHS8k&?8pGHHLs`L-I@zH?%H4EPU%A5SeA?$)2Glq;rA7W3xwadebL4})Pb0W zgxs$-%%T=rJq?8&gp-LauYW+jjItU(%T9`u=Zd=;Xnm#tnA%C3Sv~7Q3~a}3r0)}s zX;?l|mgv1sNEM3kFm$4b)S;@;2eW9aFMLlm(HH#U{U}sgHx8z?OHW@cB6A$Q7)ny# zrz5r6JzwUCp2xHN@W-D{go9-^x|x+U2ee15mRJb?bH?9(NQTVGy8I>hLGYm&P|Imv zwz6j#xqMC8D{W19`SW`Mc-S9braYezqp-?EFcUFLMs1iW~f^*6Bq5 zq%Q^v`H}f?%j(aTA_zYpFdd)&V+pYyd;o6_43PO`aw@cj1t6>b(7~byUFf^e*jo?2 zDb)Bv@py(x;}p6fIP+AQ^o2uhyZ;6abfA(`U1A4XW|4{-jcg*BU$^P< z_HxP3CDh}?8C$-Wa9_u1rw?@HgF9ym%H7hs(9ANMsAbv|;levAyV~ZE#*CNU*At!S z!|t)0gR!&d)cCE949yuJ>OQkz-a8JUsgqQu8R-uesI`s!&O}<>X%vUu$ehrQ)lc%Y zJ)oTCP@z)g9EfUlQ(508yygh6-A__C_I6)#=07(BPJVf#)4gK?WVZk1GA8`kPctF$ zk4veDaqMhAHJAk8$E#z-V?ChgS=cu^!fWyVS0a}tC0+yN+;OSW%wZ%V6s5yhf*hOpr#GR?I zFnUu6W~Kfc5PQ^xbfTNXe-aM=%1pY^MG{9*RBK7@7w$xjhWOwd;T-;*58RIGXc2ylaacy|Xcytx=0ZJmyhz;Nm$=jLX)4+$suxUUJqfDJDSH|V zd%*p^(<0V2bHK~S%q)MEaK`oS0w0zMKW1X+XeBZOzUPf(1nVzyDSB7%KAgz5RjcmrAd4=1NhPg7QDA^ZJ1c-~xq{h@d^;?-g3_JzJOq zVLrlF#tnLby?_DdYmo_%6MjEKuV5OaxC+V%HjSY~1}Q$tr-YOCXfaT|N3KKRbN>3V z1t6iKuU)h}i3I#<`6HL-K;-t(*PKLeNzd_$d6nGHr_PNE0kS^FtM4-1yiex-=6p*z zVf7GoT>JNI%6SrKZ5;A+_}&d1LQOtMX3qho`x`A(J4ij`G3(EzyMySJ*;!_xqlCLS zZkMx8c(%j9_H<|IBD&EO^yk*qOf+zA+Ox}$aD(Pu+ULZ2K>e-bU()Z9zB%{qI<-Z@ z6ZK3Bf3_V&928{}-GnP}xa=nE^lTc)#KtPA2`}sCjg6rUcdvP7 zgGsbbH#m`U^d-o;8}p<@c>ypkiL38;H;H;~#-`Uy&VelcE6YE`dI7bXXp~9A1n7Ps z6Hs%D@cc1ZOv_5+h@lrV<|mi$eHuh>g0-JpXS5?5X7T@&tUmzHe((l&4`*lH4atTGrZZl?6l6i4O_auB|mq3Tvt*gmgLrCQ1 z>RsDAZ76>sIKS~tEogP%6Wg9_L#@jXIFAzEFYAfs>HgYb^i=;{(r1q)bhN;zhx%77 zs?OJ36n#7mF0tyybM72RBJX#xmHAI1PfP2{+`DDKdw)T}JE8|+5ByJ1m~#r{zdFtI zp2RJCk$;;kT`yoe7bLElI{|W=z2aC%UwFVUu&9!E2w9B&O5v_*Ln;H321iuL9H_+4 zyC3aoM;ViMy)AiHfaR?DPD=X`bY0+L%l~;Kz4a5%U!5XzLGzRC4apoagW4ks4yT6D zZ@R6ANj&W+wcV}hPtXTYKVew%MW7uuqOF=H@fGlS{E9@+)e+=T%#adeyM$C%yAuMU zKcGg63oZG3DnYA}q2Wf(5*i+qIQ+GC1W*gee@L5cM8o~9uR{}ufzO&m(O=SE|Co2e zpLKi%b*fxf8ada1cAe*$kWawq^XSV$vHi=afR`~pS$TlW-O^zizmyA32y(QIeI)uK z{jv5%52BA#`Fd>M?>Th2(?)HtLMLL<*tjd?Jd2{%vyKFlK4Ws&zn?-J#J@l6aHM}Q z0A4lkpcfJ;0R4PxqIEyIkeXDLDUa$D+IYE@#@H*xOTf&)-WAfc6!h$Cn55!BT^W!~6GLD7!^D z`t!{xG<$qhH@kBVSyXD=I(oVjjTS~c-n>KfgarXMd_@0_&UzTO*DV5do(o69!-r6O z4&Ro0K^x+3ocEZ$PzT-~u#RqxYeVNp%>ESbTLGn|?>}Rg5p-XW%I5bcq7MoBE~3#} zi`=chs1}kq{63j;Kp#Z%odY^oqCAq3=5DP=S~n+w$N@*qgG4_@{eFF$s(21$o^#hJ z*_=WHd%mvd$ymZ4V56EBQW1@J|g#x_7 zPEPtwA%{f&-77@Tt#Vq--a@hyQF;4o?Iv-{oooqO4Knxp*MgXA6z4MPkMMN*kud=3 zaw0iAQ}aQ>_*uR?TU{u0qA9dOc?wPPvWq{YB5UCs$PlmQY%rR=Rd(KhWYT+i;o91B0)xN0h5|A#LUm zO2dIEWbXa_Y)Jnc`VvJS+-gncfRCMDuHczNmgkHsA8t;ABN_~IC}JF-#%L3ogG*@A z*!vRWavCbJ>t{A2yz%wtS#z{EdcfO4R~+Cz2PzDz%bds@(}p1W@5;Le(U{Y@L8Ikq z(3QgESJM@Qk9oY_S1e%y|2;20ru0q>7QD@8I_P2weft>T*qeB`k(;q$O)CSl1<ru_bFyYdx14 zq?_Ml3~bfHGDQl>9}>+W4>zlo-@0T@m|x1=em~~TT*4A^YG(Jxp7Z;ZPTtKLu!DnJ+J)3F9AWsxX~R19V7zGN^X{vo zEmUwzJ^o7D3Qjf*IXFw$!AhCWogNzZAWiGu#)E%Ma86423Hee>s1UiIrS-2V21ku) zD@9%L)##_=ul>E?w}0UbtZy7Km)*aWm;?3^D8^$UcIPQ?cJlCFO${o6e6FaQ- zq+xB?xEUDD^GFq5-Kba)F4Bi%Dj^51{ECLQr#ZDv|9ZmRp;^YW;~FqH-I22Nmj?`s zY(4FDF%-+(bvzf;84CYfs^QhlH-!!X=bu>aamLF9E$8}d&ES-LZgzQKGVIgyYfogg z#1ii{l$M5_@YaI7Y;U?5ej%6+RBzkErsq@vYx*}~qc(+RQIaF3w$~EWhlkPfebZ7KOmivjv!A~mZcVuswpZ2$ z%V{L2X!fdMd*1Mu=&LuDU5YsB#AXdGw~M3WxfHO+d;&Lvh&41hU;g;9V-&RZXKIWd zv4i!2|4G#5T*lqK^#(!Fwy?&>Iq~kvFucwo{GvD|7>|mPBZ-o2VeifvpYI>U@IR{Z zQ@dL1p#6>N#V_tru>TEbp3i{**m1C+PW`<&rrYsJwYbF}-Y=-m1RXbU029w9<$hP( zzt)#rzM_GVOxv(|I=~MaBw2)=wXk{U<>Pr8iSX?t-xxk4ip{sTV5FA}CM1{iz#(D$ zj>c%$c%KYeN#TyM3eR;jvzsjHH_7|o3FW5bjhM<*-1PgNM^ zUp2*Lc0&Vqr<38iOM;RyKTNSz-mSeHGFEsanTo;asVTl^LX|rf;RSz{-_uxN_rhAb zx4So!uVa?hsjPev3tSRb90=?6@QoX9O-6>}q2F<123=8OyzR@Ys-tazo5O!m#;h3Q zyRMz0daKvrnK1LoLoOcJmiB(3sIfKtC;cVuRK7Z96cmi9K4}AA48=%e#wf^GIu$&Y zY6T~5S3MaxqJim-KdHAqZUwzQ6gIE~gyPnO!T9AYYrMmg;c+RwIh0YmEXwvw5WX9+ zQDz@AgY3i8PBt8gu!qiOoyP1Iq+lJSWB{h(u;AMaE(aV}Amr#^nhLFbN^-@gbnqdnaIV)g3Q+X<3kA=E z+W1yS?QE%h7))gpT(G5ah3X#JT#mi6cx-3`=~S9Qwx-(?ztZJ!*1|w>ZD|Vpr}uAL zQ)Al$KJ>rH=>PS3M1kwQ%^_ zq1W28MmWo`Rp9Gd3N*iN@t5bJ8GhgSa+y0*3-6wg$p{m&z@bk zz|LZC83u1y!4S%_&+5<$D-Rz%arL=1Jbd+CxI}vtv`rqp74L2f*K2OyMLVtW#muh_ z&Z)ML>PgA^>)XEAQ?W)z@4W?Fn%sAwTG$qAv~vzw{FQ)f>0WOCG##*CLgt~y(g*NZ z&foH(4?6I_?%${GhhBv01LKoB)33w*0o$*)B-9~Iy`xL2uM=+N$QpcvYBQX@r z7P#?nLyB9aCayg)Rnjq(0PDIhv;9gi$1yf8_II|;@q`o^CYfr6<>Q0;rGkxMV6Wnn z_cZ}fZr_K_Z9^+);y)5Ie9#=9i7=hrcD8|GsXIfTWIuoh3e55!{AU7#Y6tHa>@dgY zWW*GD%Z=fhXmE*>&=t7ln!%SJP z-C{erU}fq0C?9#nF}5_&IoyLNSGsHtc0ium)g zeZN@r_$~0E>3tkd`#EvE!Y+H~YZ~}zEMEw7?-^X@=qB5u6$jf{beaT1?BVyR3b~^$ z>NvNYKX6#U0eYX_aru`>7?z5>5yBnl3b!V{3O7+-g0Iak$m(b+;v4KgUnE;Wc#-;{ys}Qxvc*t6|Fv3Lp5L zO5pCaiveC{f?*FueBk24{2oKwICw}aG~J%n0^VsTchHzN#J~1C3#SO0!~1r8?5_W; z@Woq~Uz()e!rJRpTv-gBunyBpHaIE5`{SHCmNTC4imQ~+qes#3K~!WAzr6|+tsYV3 zIIaXKDEBv|3Ms=bnjY2j+MZZqm09nSwg+xaACJk2HG#D+1DmQ0nc;hhS~YD=6KL6R z_JLYg9DKUMYxa&x8V22S7PMrdhuI-4=G+>h(9}H8+`@|v3nZL!ou1Riwy8#Onax`G z-o0_D9&bx%IrLOu&-^tEi_TDmPR7HdX|^d#vjAH>>puEa*AlAVp&wBUlfhru*bnfK z=Vg6RrDDsehbcyFpNjjb!H`k)eKECQ`Qf zX)Ksy+dZ2CN8if8*0)kr%kHMImA18f(c2r2E_~PebHozMs;$*FJ9}VBzwm?hPs}k+ zQSsnPO@=!BhHoOXEuoQ9`6sH6?%4Y5J+@>Q3ux*u`27CCTX30XQ2)mlMf_Fd;(cv- zRZP32l#?iF3xBTFswa{oK-RyD-Z|uv2;CEoSM6cEis`bRRx(lBLJC3U9VcF0#ipTt zV+>x7P{v~>#hKq4bM4>w@Z^#m{%JHgWa;LBO_~(a^#k&-4C^Hn$ zqANt~Thz*Am%>FHoog!amDUXF%4X(O{)~f^+x7Rosa)~LH{G|+HebLga4vCu+6jjR zO1G4VUci%u?M)nRWW8F$s=nu5!fncy?2317@j}>5+0X!GykUQzh2>fbTtBp{Uhj-4 ze$!R{a<79eW>R}Lpr2xj-+nJWE_BBSrrl#|*v?mkY}&Uoif=1p!$-y3l#QDB`F!WG z_ct`KYYFFRWc&bz@JptcDQe?1`s^qFAx$j4OYG<)a+Fzcesk@ssz7-0fs{l5y%RKD zWwHrbH^T)s)#~3OO<>EqkIuVvb8IvMi5xuGk!0vE(i`mr)`he~gzKd=+S4q-K ze$g4e6sc^=UkQWKHk(VWSLNW@hhWMRh%J0dPH_(ed=Q!mU4MqIhi?oXPuBZuN`OhU&s!-HIh#;2ByUx$2lOm{D?YGW5^_}~dUNE^Gxn7ru@M=NAyC!gA5-+YnBJEz^@mwgw5#>JAL z9p9Ta`wK>pi(y@pg2DkG4>Yw^k~M-tpQ5;$ekkDCcOSXloi~D)DL2$5gFNwvUq3H3oO6aES+-x8rtR=_$j)w7;*ZoH%3FO9 zxd(T>x#p*0Z2_}o7p?EF+To0P>DE?%bGXf+R8spP9N$lW+10tn5=Yr5O`n|ihF2rK zWXtYaVsUMk;lEx!FfL#&Qr9gO-lTf-s@qW*GNs%~ZdtX&TGEv2COKzeBG+XqMq3gW zG&@gKDEY%!?<~=y4^`l;!3)cVE(&-~l(%+wtrA>v5J~TdNQQ4OT`D(ZmBOpMDJh%F z@_3|yzUNh@A{JGXJz9QP9v`x>q`&*l847bPgh;@ILru?};>?TLzJ zsz+|X*E#C`T69i$rG<}QCCmnn`FMSM=Wz}`cxfW~=7|QZ@ryN2SlyJVX^Efc(NlxQ zk*BSy=TqQx>Tc#;!TPx7j@HWiCtEeP-)%wyYIQMJ(MQ(DPkkZR>uaOpCj_97$PR0U zze?~vi?#y83aLAYT?)~!l7}Ay=MaNa3OvO3Y-%vf7Pma~{aLkr77r$eI_U>ksmtffURD2Dm^vma@KZ=8QpFH^8+|L0` zC-!|^36;S8d1ZO+3m0H{%)pM`v*z%_OhEq)#|Rv2)4KQOdlT5#7wK zneVOP=vAGcR^#@#^>xvF*Ip|U|5ID5|4D__{@MR#LJBk#Go;gKJqr&QsBO`+x!~A3@1u!p7vN~+T)~siZm?}ip2}0w6;rbW zUcF1{2}?&m-`8%n#ww4WktqgVkV9G9;Fm}geEX`MM$gOwcCBVhNo81Lk&Xl(V?zsQ zt*%0UWFQF3eCo@{zha5oZWgb4?KFdYXX$TQeznBKF$Q%)p62kN?+c;*{rBO!@696~ z%hvFPM^o?>4@(?t`o{P#i#7ZuP_zHGVi>Nx`ND!TAPfiHUajKN<;0VmY<0E33d?Y2 zOa42;f#=2jMlRIE!NIvu4tsxNXll=&!T;G3Z&|3&Qq35`ld!@+bo?6p`(Fy@HoHC! zicBz+EfR%muFSS}@w^&w(zNVg3W~#B^bNwtO}#FEi^QFd}>AMCiGloZrkN# z40D}7j~%$}3J+Y1cw8*4i3b-Bnw<4=gHHD@h1qPy!vhv#Da^$Vu#;&_QShz?P7Csi ziDq$x+uElN?O-&+4Y4142RVFUwv~#T`~%|m&E*UQJY?`Je?I;4Pd#|xMXSAhcruJV ztE{jmob0!QrD-pRrSRq8;>EW)CNKh(1lu`!Lc>banuTRIyfm+M=2MhA)M%>Kzy9bv zy!6J;&wGjZA?imj3@z`#HTvw({VzNquYscyZ-g|w@6;xuBjo`bHTV`zT87}ibHmJ= zTHdfEG?lK;!4j4~k3M?E%mSN~1nw}Uw}AcEq&w68B*CRoKGp|uHn5FlA%5bCCQh8~b-YPf#| zTVu|cvS(b|9`J1PTZe~b_h77Xgg?_i8QeE;Rw}Q-1{bcgxgPlhFc&wya?33<3}!2f zf~x}|&-wX7^}#}rXMz84btUqyv2q zWENRUn&O6#Y@o_$0R7BD&;Qd5#ao+-QRWZjVc)?A7lOO5U>Pxk&D%+rp>pW7jO~dy z=(4qomODWPGciiKJ2t9d8I2Y*E^TT2$x2uHS|r5m5`!N#TKzEN`@jkf8Vk(msIqnK zr!_p?y*6Q}Wr4Ld{Rd^t;^ADLQwvY91^y?*66&#L4Fg1uy|J{kz<;*9Jl-d`zy?S4 z5#Pa39PQqHu;q^hR5|!Z_WT)hT<9PCL(|$49^U#F(Q+;hatE-<8!xC}@i>*8FLTXs zMV7}{h@t|fiOK1CzRwU(Yg+JwlWzE{YX$GLry3OJkSr?GSHY6G_j>A8m0(ArSWvuG zG8|Vd+re_=BxGuQ^T|+16$h<}zb+Tq0TbVUSLz}AIA^Y9=bg+Ocz&Tad#9!qW@?k@ z@YS-0@m&L1^8J?B++C^qk!n0N1)pENDzU=DTCS%iW~^We<(tUI2A23muKv){6?0fs ztw50%a3517cAcb)8?A}F#{coPv=t6|=leEyc?WzUbk$%$HWI35j)k-+yTa3o6&tmh zmbk*b{qep4S7_U-qT=)37DtrR=_)h?<9H)eDbdeX(CDk|*vmF|9QCK@K->pwIKFn~ zLFW4;c$_)u{_2`J+%al{;@UtwLW!=fp*?mfWFhCObA92Ze+F^?$x0k-|Ylb+pKCh)# z!37>Vkv>gl<%zS$1&!ovuVD8b?sKYEmvQT}dLNxdB}_LbKvN%|3@J90elUvvtr69x zdhzv?Jfr>j zuYKM=kXn=oE%#L<=ePsdaXI66>K`F^eOZm}tEDVF|K(U?!K^pDm!YrVe#sHr>egNS zzzboxkLg0W)hS3-5q10fBUw1$bd2tSO(bj+(CK9U761?5;b_R1KL^d3+tvJ(0-#?k zbFi<`J5uf z%MKr-N@q%sWLVQM%QI_Y2K~5Xi_((paV!PuaQR^jzYOM|SUBKG@}%<$4=EinBW01H zwW~Ee*wVM>Wvmh2{<$d?oNf*Gm)^cIWu63kZQ3s>UbMsQ-B-)K)QzxO)7ir#T{bu* zAm#Jfd*u5sjH8LmPkey3-WjS#wA+ z)+BX4LmC_Ag;*#qVjdEE!wLRsUKw``G{qFdU!q#nonXZ0g>}Jhf6TPv9d(A%4hPZh zso9FRfR^u?`6%z&P}w7UidbeisB`x1;~f$(|4YQcg=l*$bH}rN{;e>S zuAQ$u;O7k=zCL`oM9>B+`pbH?&dT6(+0FL-Bg&_j8}?+@EvqbKZnI!5dA1AJp)_D|}Ph z=*IIWQ{hi`TKBE70p$e8Rgp-zG=1m6{zFSxOX*ZH?XM2;q8+Wr`cO%%Y`V2Qq1R;%pU%J^<@_43 z{_Zlrji&>QAE-6rq|Jl?l*>=dvswx(USC-mXty*;T13kldN%PYw$6BleDJItgb z$`z|j65-4G>V!3KiaD0yaXzKX$JT#a0_rjv9i%0=VjC$tiES?Ouqnl=@^`#8eEN1- zdhk&cM#uas;5oSwrkPNf=N93PT~3N}zWBrtliw*jV|X?fwvJhZI3N+sS3t)n#mXI< zS0u%LW}L-hs7DQY2JK)9w?!v~$a(D4TiU_nKfSOJ@#Jqci6*cl`>vFaf)}>TBd3SAxGjXf^fc z%0m*lzA_CO0CTk8-C^hRz~*1Q>>hCN!M>3y7OA$nWB0sTj#2Ju!+MkAEMrbDjGCwJ zfsbq+WE*ANtAA<&lLmj1_+@B9M&J2O)d~~nU+=qj&pi>-?|rKJ=YkJLmf-CoxoVAR z+jWrLqSAt&X;!UarX9v3yV1*k>lz&Xs`_D$MH8dA{O-9NpB6M>Un0~jXkp98^I|Se zDq*o`i&TO^9kZ@$za;AI3-^y{cx5eyVmnLc7t?k9p$bhkca2jnR4&;fi@EIw1Ghct z2iiihh{2<_m)rfI-b}HLWvM@G_%)S3Qe%bnxxKF7UowDUH;grewAHZnp|Cf{na!Y4 zC$r|iplqm?aR1AdIsq*2WTMuGWQc7Svoq{7NMgUjFb_zQigoeN`pqFvn0j*NPM)$W zd`PH^d0*$o`#~e$NMcU(_uuzio;&82=Wf zrgXwsPv;n2e(Z~pjI8xo1bJgpLYLRNH_Tvr(HYujw0_vHP`-$F{&}#tdh3#^y#}^F zTH#P_V-DxpbEbxWt7E=V35^lWF4#sai-52|D5jhdMU)%##;!bit*|<+4gEhZT_2k8 z#ZJj|aL2LbLM7|XMqP3{*gKRvz}>6~o1P~>KL5)G4%#1KBZQ}5blu}t#0?jCV!U8` z^p-1@zOe9;_pmigsk1e?WaEMPr#cL#elLP^8(agLJ+@f2Qd5Mzvo)lwQ(GLHw#IUg z{ylPU!Wlkqtn4DRxWGqsl$N&|e4qqD=32fl6Q=QQW^T^d2NHJ_!Dak<9b0ofd7Rc3 zR>mHzczCd2)<#pN98|WD)m^ndYs&>&+p`GoyL}$!yiJJ9B-Mwmw8_u;@9JR^W|xMY z{~E$9gP67i<|6oIyyg5!S68U?_OIL;Ii81#XuW9Pae-u^%j;hxBQWvxPj~00JfMFM z5&XNE1d|l3M*nGi>!S$N?YjFe32HqVP707IfL{`nBn4?4AW8D6?{11;`{=5Tm4qtn z;rY*Te=2u0u+R4oY3#5HNb9Q}am{YD!|8NaFY9`~K7^+i{cCL>{waIK(9wi~omdtUd))diCY z5jW23a)+Tu4CZ*h6hdB^I+;ha024n>Ngdwrg7vBBtXPmMVRO5&d}(B;(=|4F-*j3>taa~whbi|-q z^7VJ!FxWm{IU9kWzm~R+Sube9;OjoA%$NG1c)eCyvXS=#t@Jk3vgt_N0Gg;yOd8N?1310YNq`nq?^M}+1E@CUa z{;+>6|3RgyFZ^<-C)e_Y1vaH!&isQc5MJeeJm6?p1kLoi(c;rU$SXua{e8g#(;BT^ zxpF4}4hXf)CM4Kked}*__<~(w&NmLjWpM|{sn6&4@+Sck{I}%5SmOk}Q2{NPPd+4> zeMwR4wbj?3=^5!;3$ecVPh+}_nZ)5qll?tJ_wnl04OK)i0`FE7Y)dI8D zbb5M4)eElvn(LH%?1+6{4hrCX5eTOX9Zt=2X=3tie_kx`TEbTqoBeVXM2utDkEs;z zb8vDGplOx$fD{K`IA#s;&lm0e`PR%Ge%8$jY(1%mQLxdl<=aO>+ebiX!^9QqWMo-! z!}~=ZEI10j>A-#XY~$c5ky0pH6texdiy!uU5hsmpF~K;G?TglMNx%r{v=|EqE9gui zzr+~a1EdJ>UJc=9SGOhH zI5r!tfallrygL~h5=qz`P!U{Ew}sQmY;49z8GA0RY3KJq0|wfBnVwHn#lk5_O`;tO zV9n$w=V?1zcq#wFS=Qs4Q0G^T-Ld<2@T9Tc^h^18%=MhyPg@b(_Ypt9D32LqNyB5_ zmFOtO)y`?26k~}62U2-_Z!CljQHRB2DC}U(E0#)+>vWj4{@1b!K5Hm1*wft^7KW__ z^76kiI}e3_(dkZ{jerj=SqgrhREEqa#l{QT!l8p4PcXMk3A`6|@Ia%}3|?06J9s%p zfPF1G4jYdw;5!ldSHAIKa4v3H_kE-W?BKbw$Gi}XowsUiYG822l$?{-_0~hMgffFe zaHkN?39dhl(zk?eg-4&5G&y0de3LhXe&sbOUktj)E($%#hiixJ)r}O)FhQgK+K~xsxFJXF5OmfIuZQ_>SWnwy zw=TJHnOwBR4mTfRd$#I=<&YnHppYhs>AqD^j1_dn7*>8ioo3I+>wovp+(ZsAj_k{H zY_=4}Ibil1R5(CpzJw#^-z8!j^c>kk4X#jVR85z%!xzu{q%Jk8abv(B*kdTo5AvL- zBDr`Z7pA?o4ffh}h8xV^6p~umF`BhY)!&c0K$XnWVmtkd*r}6NR@L$1(8($#dB)Te zx+vGZ$x=9n?KIYWU47>cQ&RT}=ALB1vy(rv%M;GPfbaC~`l;tIlBCm1ErDw z-QlstD5(a21b2AAzC|0E+qClVit12o>^*Djx$=2wwn-v%rrYAK6E20NRZsSJ9@xN9 zj>QWfIL~2~cjH?`w{4(+QNc@%$z*7pa&cOFC>fH(N(~##Q$jQ2n+belrZ8z=`CCXO z9~9(iE|$Dr3K69lWsjf~B-za_%BC1!H6_(j*Q`P)l$#!de~2U z*l!TsP!g+wkqF(8Xlk>8sf*^h-1ptE;n+|$n&cQv*ps@Z%gqbQC0YqIo>ImFs@>ld z*n7hnN|$|B##|V1-Ge2?${eNz>3ALTP{zvcKL6c{_Z3ttUJ5I>fLNCA876K*GWNdX zEA6ta11vRq=k~Ei5BreG?2@$Z02_(II}~g=kRU5PAs%A~1)s_Zl*;I1-mmM;pY+

t?4UlnUOKXCTwYCAnFiDEN+;AIaB7Qd~#N##MORBHJe zUJE##(=YOj=P0a6Utu_6UpE@ci?$hwq)nuNPex z%TMcbP|vBGi@n+r3)6o~Qk;%|!6Y$szy5kbX^vZ)E6f*QzQDI%OXtHdF}0~qIXo{r ze@O15$m1~VCE1ipkZd7bqWs3~D{KWnyo^;hA9Kd6gU|~a88gT?JDEVwp9ueMk{{8c zv&ZPhzoqZC;q^D=(bLt6u9)c8B6-!+aOf{KK-B8L2Dci|R<-Fw!JCRp|7%Y9S` z*-SPmdFey2o8Na&72wx_Mn>GP>uE5?@#qEh`;9=DvZUXxC4~Ff((Z1FH)S!lOM)i7 zCJylOsqBk;MRJ&EbdD2PDu({wmQMVkwSxRHT?h3^`0vd4f_`khIo$X?$}y?Jiud(d zeB{T!=WhGJi~ZNEFqWss7FovCvG>jsdHT#YSoS$18w!zP=+oUEwjpSWb@()FdB4V= z2MV}n9M(**onmjtN4B_M?+^m<^W43D;R`K?2lk?{tB``*1G~}0E%ni^ z2v$h(d=g8u$Jku%?$~~J$5v-rgB*@JVm)Vf$&a^1z=&ZD?E5EU=)N{*Z*7PB+l_Cg zk6h7$v6im;lvSR1y`KRZB)GRsFDG6vq;DJQ%YS z{M{;6Wd_Uat1C-=La?j9{OgK;=fT~NbPlNJ_>?fW8%CoDcr$ zU^&&7Hr;q$4bm$;E&6XNvS-rOZA@F-A@W&)=5$8rSs}os1HXLHjLj_pQ9q5a1t@@ zg7de6CS9=?*PhiCkq1MP%42=ZHxyxhN9y%PBLXZ`zaSSGMS#zv#O-U?i(rqHTg`q4 z9=}fSgqX5GsIa3y1_b(Y{iCVhZLz z2xcc#=%Dsk!q<`uT434d?RuH^S+to{%Q`iqhJLR}DK?}_;Vp-f_Pdv~z}rtppZuy~ z16&a?NtLZcbowG!VDGFcdVMr;#r+czeBfqE?)oYU7z;aG&0pFfj(v(zwztHhUHLSb)+3}W-sQBG0<~h zjhDX&(I*Cbk>z24T!3D8Ob;Kj?=5WTP?1B|x!$&BrmCV!A$6%TH(3;AygqT9R|Bve zShBuvQ9^s`0(2p@%3wo}rqf!93w3vp6we7)VO8_}c&PFzKh&?&d)L-9$)R==%5w;2OBa!835nB zBt5OU7SLHpI$4scfkGS9M|6DYk;-Dsb((8h;Gc5Yiz-bGG+eAy6@zo0Fm;i;U78?) zEcIC&r79AQJiYxkQveh~`w62W2>>rK_1Eqb5FoyKwwon@T&XABGuWiTLgzq{Jhv*M z>0c0x|0IYkSIRmpADV;W9KIy=IVGgA{M_%gs2-RKcO<)&t%$UE%^X{!mC)N?5gyHw zdg#4gy4Q*GipY&3#KAK}30>@`QyNp&Lw87ez(9*4czfTVUfN0rHH;lK+*h(hBZ+PL zOpfQ!lh{9GSeYS6r^N6kRu?d^zms+e*K-f{*gUe(LC1Q1a!qmls(DcpjOp(!%g(w} zH_8okl1Re#%hbW&5zw;5>9H#Sme@nDvY2>KsCHkch(#cQd zX`r@DqLyt=M8*sPZ zj`Gt656ceu9%7P0=V)vrie*^P-NuEEN-kB9I($shMNSA%7rE+)%}AkiBW@w} z0_;1^mEVoTQS!~LFf=OyR=fn{uAGntGo{DQyjYb6Rce{>-AOv&RONx<@}u!y!mjP$ zVpPSq`}Eq zWmm2^fIM<7+P~bSM~T#l#W`l`XrqVzKKpC>vQ(829oQ#>YBfOOTGzKUWK| z>utRhq~$<;my4RJvmp}5NuVpv(n1OSG?Zpa03~n`mPFn8(Y&}K!^JFdV6L3B`%n>p znLMxXDnov-H?QjQIzk+EdW;R;Qvx7q{LK~XSZ$EAZEcv$AOq;Tc3Peul|xs{{6lj2 z6@k#Sc$25qaqwt~>a)}lIbd}wq6~;CqTSm)e;mnU?MnH0X>{9TdNz;0QyPhUw<+a zQK7nseJ-m4kUVyGptwQ<9rmgsQKFPY6@w9O@>~kw_eom8GI1jW8wBVJ-sz*M&aV7~ zN18x9?4_Aw6hF9rxfrY8*GI=qVyS)~)dEX?6<;qZ2?B9`{?r3q1GFdB5*_TI1xDQ4 zIFbkgK>oM(rk|4*5+cE-^)cKJTY5a(l$Qe0ti~zn)y??nW zWPpZ@D60C51(68<58nNFL3GQThhu~wfwC@CdVZGWK_j~X(fOZr(7>Oa*K(s$;7aE% zxoW5!$|A`yQMe`tuE&QD>&0^;E{A`g{s{>Imb1onSGDC(G70;GTYco(N3fx`)B?{qlrE4^^8?Q1CZ{cA zi#mLdY0_J30f*NmMxTX^!FpQT+@mdhbZ%vGwi=QU`+aMei65QqJ9^>Uswv_tKlzM%(-72l^oIQ%(?>_0Q}jsz7T~px@+N{d4?#9x@E2UpDQZ^x%xlq$0HyzZokRUT_XU_s?=7`(8+_j zmJ!QmRO+bN!#>>x;{%^egk*6}Ug^u}&wciH^vJtL@dYfmErJ2Cqd3psLPGikiV3*#x+YZr8FQp+~AY zyUV7)`ls+-FrH84q+Hgn^%q2^-XzTVJ4%3LSAT=9Vi}M)S`qTKNF1n&tk?%gNFqln z@i4n?HFRXFaI=h-6ors^GVUB!2fsKcxHsc9KsEe8rFTLS7;R)q5ef20T;1i;p;Tco z!{_>=j8qK}b>E(@k&y?b-^ZOTR7FvHfWcfS8$gB4uiBcwDgsr-uVWuB8h}jcILU}+ zBIs!WVz(+v zUKviMgi?Zu#&RRP;KK0-4)}~f!ue8qrqu~*2 zZ(N~6RC5#bO|%9mBX^YI@-qT@SUk4RT}6pJvAcH?$c#{$yS!Wse%{)BA`Orl6hoqe zfsN_opL-LAj4FE`s-xuz-9Ll%Lg2&8S7rJciv&sk!N^D33i!$_+VxNUvfyB5NV>^S zAB{RCn&!TdLKg#8hHpIkK&ZVv@`&~`5nR#h?<1tH5k|*99TNLML=+bEzPT2Xz`rR^ zE%)sj;VaWWiTb@QLQmRFku7ZlpkrR7`&dO8d2-kH2@A`imd^SYeL?bor>s7Fpiveu zsXGmYv+VSq4~l0e2|EdL>a}9$aentZL)?^;EQrxQd&~Bf3V5Di+Vt+4E(*BB`TL8J zBzi=3@o+1>3i7&rPVB@jZBU!(KfUNC8T-mn2WUfoY7ZG3O*L6kXq-~Q3=h?@~;Cj0?D zi5e(c{PS|fs0Fz5LBN&5Q4<|kdn!QlTMoFTtEbkETHx=;PgGw$qlxO2^v7dJ<-rf1 zg|4S-7Raqq%qchI95{FsIb2>sf&MO&bEoW6gITgHX7tSzMRzV96ox1uncr78pS=G| zuzNY_{gz%9yiKsrzKrY1q{AyjElp9}&{1XE30)v28E$&_*GX_*nSN=PTo&oM5PI%V zXe05;gVs+n0;qX9>l`(OEMWO^Ga-~w4Os6nHeP3C0l{3uMqHE{DDQCvzJ@>v*qq%H z_&%%=N>og^pqDceHKkq$L64Prj-sVIdSmx)T2L zs5E-of5Nf%wHo+WBfM_$eTU$1;$M8fmMkioyWw9^aT;i)eL8p<3INud%%1jI0g>d_ z#0aFHMhk~M2FPy_(4OVxZ|n#1;JW&3S7Om=R2b#X6I@L|Dh8^{|M9FH7K%t){CT6g zlde4nf))1L@<&p+QP1ODorMpID63|bZ^HzjAgZ_z&)aFiUOriffGqi zP4_{Xa-82*7iFKz)dVx}%?e+t38=UivBoRPtH% zD2M1ta3kyM@|^`aFkq4Aee#ky$QO$5A2BvVXOoZqGYextNx9bH^LseW#CJI>8OhcDkl!)0KcSvOLSv^jlU}3#Ev~@$2GTQ8fSAyt^4F0=vp3u?EPS zeCh3Luqrrf@^DfN`Ln7pUM3R(g9_@m7Atg7W8JG?U6MSAS>D!^NW%{@NA)s5 z)?si1uPE7ba-*9BMlM%+d`4Ko1yhY;MWCzH)B28F4a^;7qZqG|MLtGXZppslMd4=d zsLEav1IEXNCe9nUDb0=2WdW^<*H?#JBFO2s zUS$~;N3VoVjW!cx(X-jzSjh$%bi;lnq~!2wZyy-g4!JCgRJ%_ZXFJKDqh<9UOL6{u z^Jkr(lqz6gnm^8n`%ohf4Juaxl+f#%Qv^jk&KdA8|JxN&Lm6U+--nA*fkx#$CQT_- zbXmpOZ9PC5oqxL9Ylic(-*S0*BRZgGFTW)=juuI(JXLhb(F1G6zweh8>!4YqI}_h& zXn;Vew=B*PHK%%b3C?2ygX(`gA*)X0D*8q#rztX*0d5~w0dl0**4j2?w z-TQY=9ld>~etvk75v+-l1()w?q1F0Gkuji-{?hg*7=Oim6N1fL$q8+=s;<%a-B}Z` zD-^_AU3lI5gSSZ{VOs;diw;(7wAVz@XS4mkJsBn-^B?oE+ZyOgpS@)0lm_}S_^eNL zaF}pa(8N>1{Esv zfo@z@h~xdsC!RRBa?_@F#<`&d!*)5&C(Co}x<`}&b4j$rJ!x)~ULx#p<%kIA{n6rG zpQ4PeaAk0&q*0+q+wm)Pe)LVV&X}`3I$}?`IqJ2A1g3> z?|DS%hA!F*?5(|_YyhUjqN>{TWl;U+jXOJ=a%iVm;ekbo9?Ji7(w;Lf>TLsJxAJ9(<#&Jt+WD3M0(s3MuRI?m$HS|CJ0 zUw9%?7P-aAPoAfSXjE6{CdG^vYAl&}aMel>rQV7Byz4_iMX$o`=b z710lpMmlXCwO_)t(CI))xv6MHK;3tjjXCPY5JjHLUDKWZ)B8Fg>E6F8Y4pRA?m@>JNzhcGyE9L|->Z5`KGFzC zeJ^u0u>Y`F4cvklCc%J zdLisA5EdD4Bv@-9)`aSDuiFA3G-|><&Rh+>QcYX46*>a;8%{p3We@~8=aXas?k8S2 z&H3|fwLM7O$}Y*TwM572B64p~sGuz2#wjtVh&r-Ih6_!PpyYL@Gx|St(MCykdYZEi zqS3j%mSTMbDGt>uzF3h4IZK1Kl$8b`Sjk>`~0b1AzL? z+{8mXM*x+b>ZyQc6_k>)71#Vi5hQ+?J9hn&9{SAOJnez!-`RhgroB7>I+E~?aW{z$ zT;kSX%?`Wm%j&I0rg^OxUy zWQHya`CVM+GDWu+(v~D~9_)Hq)$G6w#e{wq#)k0cI%kyz>UDK6>-jgL=kFOLA59$l zF$<84v&`|GT1BM6kbhuu_YBgAOG!3&RKw>9mV8lohUYg7W*mI?&LFd!`7(A#^gsgd zC7b>qR=|Vfp~Ht~#wg*-?x#&T6}0@#!X;yn88e?LmBkK5AXPV zz>Jc|T(fpxDB?csxi>4=nsdaZp+&cQF259rTPHWwotVKl=gF zgURAU<3|*%XL&OdWr9)EL3m?>m=1ED^3|#sxYiYNKZH1Nom5TBvV8>GYt> z3gK`0xQ=9tF=FdHJJN7V4iLqYQv_bV>{JCU;gek-0LUrj8q-?Es*fl|c6IXIS@*!jus8vn6RHSCHUFBg26d7o0l+#WWF*{b`OhyiTBf?qvYSlpNBs=zL|1 zXMxtI72PcH`cu|khp2wMB)IzRm%QJ;IvD=7P~A`n&{xHyqn8Ic(XY!pDSSVaQI%#% z*o7rt!1dd|$|hD4#V1d-ZsY#{tJCRC9bb7tdaUe0p(*ZD;r?<+uy^WJ0oBWs$+6Y~NK2SBpYwzy66(JHu($9O+ACXa$^6HUt`_$*9={=p#?Pq| zg}j)N43`E~8P2t}{L*N24S`)l)s52#QV1tQq~L*-y;3} z#PZ(WVEdV|u|0hh^@5ds=rBa<k`u;=ZEz2)9) zV`p9YBL#aU&J1}Wg)jTXY9zV^~3AHG8+ zpo6|qg;bQKhykxm!KG_yYQWz15o?mL4!R^?8e5L@6Ti>=q`RyJmfBs;v#0B#ash`1 zW-2Lgc9YG>^`aWEqoVxI+GvDg`wZ$T0*PRZdA`A*R~~3R3fxukG)9Rx(q|*j6T!!S z4A+4Cg_S$o#$V$H<6a~gl)eNI zrjT{-Kkm5PYIh0euiXmPj^RA@k}HuC&-bi!z;OH4k6lb$?a4SI< zN$k`1>nKQpc8)nirF$YkY_4&(4(GihqdyImaG%7XQcR~u1W>~_v7C53deigCID3u= z%GHy}lU&q5S;@<@Oj24X(%GL+NJ|~;I2(*~-ev$(r@c1+cIYE1fn0OEK&GwGh$6yxWh`0{Ar76lw#ixVb@sX@)9fBZ%)amqD10C>%=hB7S zs;VH(;f6U8M^#M`fdOu&XHe&gET7jU&0bUe}tfk@l zGy3bU)T^4{94A}N!bbx7F6RDEluH!U=7bjLzLEfAXDT;xpR1x@dzn`c7)24UTiIUY zTM6*`NdSv9ri#W^<8B{j6-E7I`+X8)L@-a2TrSqD3_ATO%bQM`A@SGGMPo>uk!wyf zy|6t5Y0XZHUi3Bq(A|*s#`UXr$IM4?eeQEhpF6l-F_a~ab$zyXEm6XqOGgqhXZ*{| zS|g$>>pqc2&b~K>4E!a7+cu7jltbxzP53S{2={Q^|^<6>i=| z0>{S8o%Sk-&hspLr##XDR!cWyen*@F3aM4IrfDW<`z66=pwt}ord+MJFU0Ex(P9IbJEdW5&pCBzT@3CC>KofbySB1o(>Q~?!MUcK)F zgwW3Mrh9b4!XQF!_1na4MX<1(XZD|dwsnk!$SjO7;*~?gVG4+5Rm4h+QUbYL+tv&+ zkU(Ea$lS1LMbI@(!KCOcfj$;!XQo-ZPCA-<1H7#9Q(P z!fJrUggeT}NCB-`?9Lx;5ySVxTc%OYae(c_&9N{Jc_brCbCar73@G38F|#Y0qk**puWI$ZCf%^=yxtbulJ&vOR<#m~p& z8_Q?U%7Vs`D_=OebWy>p*0_d!DR4R<$+k{j4Q%h+XS4lhh%$$+#qfKpgR_0%i%sIP zpvA(ffj@0n&x7x;AP+;R-IyHWh;+!#C#oQuPguck zi-TUWso*R3ac*!|JN`dDE4;k^^gcvK>1l-bn^;hb8hcQ?f(r1b8G7~%=NDKw9e;A3 zM9rkrWB1>wfJRH6kS922ZNE=q?sOU)6T73lSgrvw6}mk-ael5Y<%-E&A(UQDb8lsX z4^@A*-2IP-|6Mb@+a`p(%q$9YaqiY*_V-`E1~Sab_;&*6f!kZsJ6!xap!TivyAk{x zkCVSAp+~60Nr0R{4*@244~!H zM;b=BZ+Y)uBJH9cI#J6sQtzw^BHb?@j%`)|N>8(5|6wvcZ5f@1;iUTzZ#S*@t;2EhUe@5IIkLy2mfz#u#ti3 zC0CwB^x!IInuroGkNDFb|4{?M!JjMEnW|{?$@Ig^AEc4YF)#nOqcouMO_)ZQ_*qoX z_R^w~M;En=bjO5C@B;CDFL$3kZN$v2YxtH|9TnfC{2o6-K)P09Oer}!ppVu@#_gK{ zIN}x3m(|V-ROg1LA3RY)axU-BSCko|(_?zvCLR*NMDBvv)Q%*2iRz1WIm{6SN%9}h zqb6wO-c_m6KgK|0|A)ebJab?p<~_B1M+!7a88-B`2q0y;8Llcu3&cLM1>G$0{Lxmp49J3pxXKiQRBM~(yul6u*NA4qJqt=nby^SM&C)zf2Va&)m^Xa|3)N1 zzP_%-;u``eZ%~w7|Dp+`*r=Wc+vuTy=W%8^$237#DEzuB%ZtwopBvu9>p*c9X4d&L z^Mum6q&bpxe!P+31tnvgCTgcNEpR+hLs(999(*vW3dTc(-wmG@MXMGQ^Q>xefQ7aq zy3Jn}rQA4oHd2Ed5&u{<(7k0xgFEgTRl|5c+*5|p`&Uk(`qmDKq*fX9QkPA&MM4A= zN8X{NgGy-a{mHdkca2biP?pYFGV$&c&Zx^X=T)gtA=LwdlI3zW=5c~M_z!tK3(ny71T z0Q-|_fEv0_#0ooW0fqNB4<1q)1D2<2e$iJrf!@u1r(X)2z0YjKRh}2=pzOcx6cUpf zfX973UEmfGt%`KKldI#jb_ieA@qx zT@Xbh8J~4sJ> zs#)Rong(ilu>6UgO&Rq*2&PuE#p_n#cP9DH>HwODUfynR?10}gG5PD@7P z=V0kMatk>QAm7YcX?xKG3H>7r{_bmrI)!iDx1{F*9In@FsJd`}y)cFAl7u2CopMuf zrRPCM+xp_0>><)m^h$EI7epL?4$w_p&rhH0^q>BLK{H1)u73@ON+6Ru@V_fatZ6j? zo1!tN)Q#mpwO91E{3&(Bm?Xj;IbebWT#v6)@5-X*%`w{7Gqk`C<4o3zCnn%-94oZ> zssc(cbafa`Jt5p4x)#5P`(hp^J4Zi-64CL5lIXA(lBl7>g6zU95xjrFqa;A54@if$ zzI-KnN?01_bpyggB<4?LX1_^9UF&bUiR|J?yjC>3u|W%v+*NRSx@`dB_h-K!P8S8` zLq)t3nFdIU@&rp}kQQ324NV4FqTqtza-FDx5qQGwxtuF(2HJYonX7Yn!NtQYhyEo) zz$K~bv55ES6#F+HxzNvx5^Grv9^uaic2Agk?WGk^gn;0?5k7uERzh~-dJ6<&_ne;Q z=V$?=bK%yWdwRg2S*xJ%hzxR_oA)$(ZVcS5oRgkSX`)X5HjOC?8AKwU6n_7U8hYuF z-QE5~6N!mU%Sn*S;CnRL?(J@=p<63QzVrxaq7(PIR?LoRfQbdtOXs3VLHf-H^>6qz z(PipoKR!C#_bUm1WUWgM6)tj!-S!p& zpG(pXe<J$TwV~H5oCixakJFd)fO{fK953eN5N$j=X&$FA$hn*tcl-!1 zh@G6z%q`bMfs4egl488R74>U|&Si|SQQqoTfpg(&vwV#+7PttS$h6a6Q#wHoyr=N#u!xWb+ebh4G~wKrL1;n_ z=WB;2XTu_;f#)#OB4w8WGIamZ|9+1M{vZN~)JG&o`gdIVWP!De#gdw}Ip98-FD7tc3235d zS^c&lD4o;OA+C}lv7t{gQy`wlR5UtYPrUE>?dN^Y?|;tw{?F(0p5Np7 zJa+rC_PW3KwXW;Cu63iP-dkZ-437Y)j<36=yK zL9SQu(`3zD14cB&zjl-yi+GL-?Bgq%N5-Z-`H%$p0rhyHDUjQq*e|0B`Kzb$k*SdH zn)moX=npLt=fm^7{H`>q^zzy^?Xx^%A9`E6xMcy!pznG<93x0N%Woc;(<9I9^mW!6 zlYee_>aO6cOcq zppb_=&UUK>ih7XGE?JuT8S>(GeqNzs1u`x*G%{Ath~c@qxocY(il4IQu7`7Bhkx{Ewo9@&Dk@L~6nxue-aZ z{_)Cw`}@_}QcsUU%K?s`KN{f|>%;GMqlX25zy3>Uz)(-ieDH?thwggVo?3_OXIL45 z-kyGg|Mv9`@(x?+`G@TdzGn^o`ak%wGBwj3wBTX8iy5-pL7N`@;k4u5(!YOmYT&PU zprre^U)S~g&pbf=B@b}+`}g~QEe&w;z_4Gw9Ko?r`)_d+rg!Uw?ZBYvEAWf4oc@>SgdV>zB7U3k*f- zBPap z*O`*PH5>DXbnw?ddR$;?fN^B+XU%}I18pMHG>BStAFqGLLP8&%oO$Yz9;4sbwk=5( z^_LprPtt?*2pzWFXZ0>yX8gw6fm?g6kbe+;w=%_m;2ABq$LM-8Q&ct0t+TC|yc zaN_wfZ}HP>iJFAAcxm}|W(b*ijny#gur{IWHK(SazL0JytSZ!9MLhFcVuezc6UwFJ zr_E*;hPp4w7q8?`!d5KT5*t`kpewHfh=RZFD5V zD!ey-Uvnt2FS3Zec}0PtZl2$Cu_=n7Wk-naPzfVtd(-FUDsVAWuFJ1@;TVP!PlWw~ zT_WD&8CK@jUHdg-$OM5!&%NfV685Dr#LClxVGH^#eccj6o^KUO=bEWcXz`A%y~*AT zYu!HQJ4;uSliEf#!s`SX*7K%aOV)%k^s%vXPwtB)es!$wgm_(sPMYa`(;>`GJ zBlgoJBbrQz5I>YF*mcqm|B4iX^S$l2{!+Itlmz3?r&{yW(PwGe`EL-J?ih0Tm zC3tLSU{wG^3mk5|_GArN7rEg6`O^jrE$JJY>K4w>_ePFW8%QON#*f$PUe;r%?<(Gb zPSFg@{KLI|?ZNgb-@dLQ3^n~#%L%`@KjFEsr=(~N>J+IX3AUSj){)f`T`Q~QBw;7{ zH_O-BGOU>+xA|{aOS^jn!t@nsKR+gcH1isW1#{CJ8!w@ggPnAdC%F8A!4qjr_uT_zESWn(?@DeL8U~ax_ zCgJ2I*6i5_oz*hQ84g}z`_^_`JDNo#ICzQrShHx~qa5PJ!AqQYeuXS?oWZq-aZ}WP zZi9V!y5+5{`FUN2GBVh(_LVI&Chf_zxsMGQDq@#jafl#8SGG+~aC2e!thTnWyd}<6$6i~c{bI5qizW6wfUlget$) ztd@`VTh)r6^6D{k;-vc4l~#oEICbp->M5v>yZc|RcVejQ}2AS z!VNe487g%Bt$lOt2(9e#~S@$G&vtaIi8_vcnlfZ`uRui`Oyr! zT8OLF%#YA~cSf&%yPTnaT{{rMAIos!=~vrdR%8V|)fju&?++#Pg*Rtw+Du{hk7^(F z=`hrerOOfy1`^73!om`3_~|WM?dCP^;MIcG>!tyO{wXzT^{-_NyEAA>V;y+u+p9f1 zg6JnggVCF3&ak;6qDC%>W+-OCD=V9D!dlU*H}k6%L$9+wF3A(iu;wlKV7dfyp(Q4J zL~I#4LUeYy#p*xdNu*AmE3#rSEZJ-QQjM{Molued)E4`U+Y8P|C8WdtwPa zp>@U{)Gg8;4#!S^@nPuKrPpU#uO?K^NE?|R;PEo-o&F(=p^M%RNE}{G*ij0?hd$dd ztoMgA4$r~-vP=9%{~c ziT@LxgINOp`(G(C)M=5Nj$<^TP2ZfzD==s1n+IFDhaF5Z za&ipv1x~@I-zI@S4<0%4QFS@KhkaAu(c>Wu+j~*ZRK;Y%4)1X054L9Lde zS;I5_e(2w^BhM@ZI4|9kR`G+Lo5O1Cm1#o7?OL^PG~`F0e{7b6zjNRTXu7cAdMtQi zz%xkk${NB-JUUj(3GFyZrb%eg+H~ZEl zW7t_6QRT)w-ZoQVZp>Ojb%)RA%~oZo&is3eL_HYRqVjbY*JcpP?(xc{UP~Fe$%~r* z0Q^tFbpqd~6M9@*Mo1F)+@@}q$fN*<-7R0_d>QSxDUDh2%#5K7%#o6SvkuY_849xg)v@CNm;jPVGYK0i^>=EQrKY= z_cPtGzRVB7joM|}%NY9A-lSiX!C&HcY@No2Fc0kbRtnU0R8wwJcT4nK82T}H-{Gt% zW=xe`?25FGZbKvo!lD9|8VITBSqwIS>4?>UJSe>!jjiL7Y z%`B4ukKg0_V)xdTP?sJajx~b)Y&QSww$6j0x|0T4cA66U?t=lDH{g?#+Uh^fVt(Jg z@Q3Rd2SOzpELr*k?S+G0m;`}82Qrrl#d;H3J683W5^%PK*L9mCew#U+a?SB2RL?;_ z5nm66?)^I70&xf@o_i)z*Wa95%24yo&WXGZA?(gIiJe8B3|ljI-pFtZhF)OuCRIC- z&?f~yynF}z%K4LxlwgPVmVWR39zZCr8R1$B;cqvZObi}{GSuq_dw2VW66&PP2RD3E zGF4U9W=`POz56CaYzZe6U#q%MF8H^JKDhBQ_&j5xO!22MT-Sg{*xD0K*!@rVs*Bvg&+TvA+rghlpBEmfjwW>8OuM}8ZVa70$KqK6 z;td~eg|;)`y#vb<$9Jz_SSlNzIo|@$Yu3wzZHOaO;o*vs9#@9;b1m%AiDIb7jd3j( z!K*Dh%xkMK9<}u`;~zqwTaQO3h=89j$$9V7fIK@$sWqcb zFNx5`N{{Q;IU!yYSROpfj-i!vPDpoy_Xe(A<&MC6$w#+0ZUKMZnto>4^<+XHNwF%M z4{b%g|@iyQA-8 zF~6%sJp8yYiLmwd7Tl169+t8Ntr+N;15d!XX;)qprxkhEP9Vr@9=qWkmUn zmcP!zI5!?#e|?ZA+o~Q--ekeBF3u?DI}Dud-}(hq(g-c1U(!5ipH1oWMdHApEw2l5 z641|-pcxjW;5DUJALT{_Ar4$V>*e`WLW}$uDft}zlGza(%fcD9>IM0$lOgx{t}$E0 z6@F1HE9HZ6=fE>(t=UPTPWbIfL!$}%))IPOxxCmI*k$Ud2irGzFzk9ycL@vdr|%`t znM>fuyhPl2mJdV4E#p~v0(>aOb3glrHF)*vbBkc$&prCgIuvpo5j`Wb0z4Q!A|Q4Z z!&2iiU9>3!^YX?~Cno{t{@48-qaqoKKix@w4zBxLWB2t%D;VlZzVHdP#6RH~<|Vc` zJ52Cn)}MHZwb_Y_R}K8h!Aq?1MjdxHXA(|cV!!-(;c*}MlY^J&eFAb*iou^8yhOWS zsGI%`yv@N&oOqnVxSB*XESau%kEVs=c^?!{oneUC;CLklXCW?nU^3V0R43xOkuUUa zbc5f{9eAbF=gmY&Kha#&fqAHcKIpc_3p}E+tM`E)Guop*_)9S4InPf?@cF?me>&Z; z4rcmlr)Ty*9>-8$wGSk^_%W20(EiJ#qL~z~ih-PHRYD)I+Ri)1o1tiJx6%!X%v%mT zxdqyFU6uw6D?97zH*xUiiGgsZr@lBBRXO9mJNzk9U8Ats0rnGl^=GaZ!>XB(Q(FlB zm?s_meTog@2mbG!4}o*H{IWB%!JqtH>dA+oX4oQM7sbp0e`Y$^IIDrbHn;hlY{xwQqEI|}1Nf7BqrNQ(Cp@OsH)eO5st`(MWBLZ!C_+nciS2thc)w2t zHx%eGtZ577;-w)!c63*xh9BZdlZ3Vh;1#%*L@V@?z5;pKoq>%BmL7cC5F%`qrF_k zfd7}SNZfkpnFG(19`)jzaV$dL-2O;ACV^0ROpo73`1#D(jjGELht@2b*YhEXP^xEC zo^*qU6GdJYMnRvga!R?Ez@Mj#q>{J84!G{t<;tyM*q$~S-)@6HB@SDzcm$lsYZ9_X zV4iBT8##41`15q?`jRi;g_vD+8r%^KT~|N#_`yU%eHZGtufVwItuA}tgSeUlPfhYn z#eJ8?GwlBH8cWR)2TIrc$Pxyhywvj_VTXCR&#riGJNVG_`9{7gj#wx6s2`i<%dj@6 zd%11}e;)d^EL#frf1N3nu)?^VO?Z;31iqE4>DbZ@JCEG@WOY6G|H62#LtoH;;o^!E z1L!m1NmN`!I74qqpIuaoczcb zm%3yJj6*-7DmIHd68?l|n3vc#IX}m8Xa9+p=!Wc_6*IC3Coj=I7H+uFxSnwG61%V@ zVQmxS9K6K3R-`JOjea{F<@H_W$FL8NuDKzwn$W#58Tz_Gh$l6}$m9^@Xjfkz@`md86sb3)x+kT!E0__IVd za_`2K3}q{!bMXQ6$#Z{JRbL{ZgTM42?O(~TrAKZ*RT0Q@Pgc>m{R=riHs zIT7$DYdv4Hs}tnjB^y-4fJfN6{ONeud`7C6)P`j&nNe{L8T`ECy6y$hLdYT%`vy`sFWDabF`ybTG3e*8VYrl}yG z%zJjvCT{0WkX zGaEYuc8Ec4>GC0LHtcZY&1JS*z@J5aeOn7KPdQ1|d8|nI6P{sSVlBL7b}tD$#=%SU z9Ut5K^59htUZQ(7DektcKk*V3EqFw+8FCI@VjK3p=^BIlDhDr7qHEPEd~sb4UgE@) zF}~QzC}9f2lgpT8wCfOR{JDdBSAmyS)fo1~nKFV)Pl_kxY7u&J?4lD>FkW)60!3ar zG8wP?^@9+<(0hy)_QxY`>lSepd*aCihgQjrTq#fJIk8X68nOP75;T|<5XdaD)NvOv zS495ObXi3(>@WS@2nGH~Mm})+^2~z8 zvGo{7-`=;K@3C&^vST?)x)W+%){B`ui07U=dj|hN9Qq-F&bIab zTq;kfnl<}8PJ<`K@}^BF0RFz_%J~}l44w5T@Y2E{LTmAEUOULQEag4d&tkp4PI~R- zPl#i4Ppub>1n-pFScYLe#g0z8YAq0kJjTKk6U*V}TIb(-MuPvD)2=5e#HA)Pr9<2y zFQ0fYS|7Z`fhYO0?Stoc90^U{uUDD`KD1&5W>XIr^?~ek7r`&$C(l z82U`CuhDplbzX<+9{yPHZT*p+iUi=iqSIt43LfxqS$%j`455PK#w}V0oIdV{UYQ}z zZ~yf3MgZbf*{RZxQp1rC*)rluICzzP_K~nI$59d-K@`1AQv?(|6DOxT{gj|X`OpJ~_2^udS6 zHieyZ#rVbUFx$`+z_4ZqJLGLfoEg7|obC=|*cxN=_SoR>omW1zYe61-=+1}<&|9g8 z_n2b5ekcx@BZ2sKbVgqLLg>dt=yp+B6vpcx@#s(Ay5+2Z7Q>QR?sM}J_-&$M+59|Q zZ}e3iqm7QZ&V*A9Wr#mF3)yY{41UfpKKWA_dV9UYTt))?$(wUd^EU45hMDwb@H8C| z{z3IR+FLa!N45e-=ae!RJM3>7A2aG22_Al*Tzxqm`bzRTbw)B8@#j61@ohLUtHKlWRp`D$ZwK?J{hxJX_ru?vj?6A7 z$9+t5J7Am&{>-rFRmFZM{dU6gO*epZGxvziE5Nr2*9$aQ=)dvj`Yc!QCkLJlL%hU# zHmBIF3p~leOYE&ZydZt9dp?i=L0zhFR^YFS(-0|oP(EWN@3(WO~^TTiCvT0 z_o)za4qoEK6UQBRUX*VR*=zc4g2e=FLXY|(tgsgPxh0s|azvj|oEZDsDqEFMzZ8qI z`N1b;?PWz*?U@F({vVo;C6Pz+o3uX@^UAmJZnw{SGA~P3`3jVLtfpM26_yX~UmlUK zy&4h3Jbuj^{_>jw_{ue!_sZaS|DbP6MlxaI$75DD>k&FCI-p=0`j3k$77dAIIPtK= zd-eO0EC}oH{EgYE9)zBE^|tJO*t5j5kA^nVguTnPj5ieVZ(qxLc*M~W*GX4NyXJ&-@x_yFX26pm?<~C>>kNsFo97pKApg@= z)zFChqF0A|9SddHejaf1$GJc?JbBlKqt&*Vz* zUS5;5Mk4Irk6SO&4fmg-G-cYW07CgW^Ry}g=ZU1n5=U^syRmC%^>@)CRd2nD1!8)KUZk?KQD53Jl#|U%)r=r$Y?rg+y)hX9D zP+^2}FQ|%fM0;8!;4HiRWbqd0tv2JP{@o}-8OhK1*$Da0tLMz7ArBE!v~$(xXxtyytRE@h zm+aXNM{5I-_ggMFtq{EWMVWGW3_W+&w{G7E|8nCuIrI+gPv>v8AB^X0Rm18QMKYXt zHkq?>#_d90>1|9~>IKA~)=OD)#-shpJGUFlEE(D>KlTp3lbSviaN_~k+y)X;%9Uhy#TacHD;jPo&4F05r4)RR_e{OqKu%Q(Clo@C8;4}6&&4iod zeZZdwGKCC(;kqs^zL)ipSLDD`JMEpRd65~z4))P@@&!*So(UYk0rSWSzJ?$T7l!pK zK`PH5^6^Hes$k!g%^ertEr^#B9rp4^L9W+sq;M72E%v=Ub2IW-#PEfm4)}B9(GAjT zpqKiYd3$T%FS>d%>OJ63(--w!zQ}hQZOoC9zaRh(f?@(TP9sZ~k_VszKI%Dr1mHxO> z7W-z?&eSMid{xxqB>C)^kVm^eR0U(-+SvZ2P9}I#`DATyf)_K_wQ2niJa>!Y6IGft z9(gy*$=`*!LzqvC-p$ua5+ig#r>I95^xRfr`^h9g$@}fi zX0gmT4m=?N)m*-9ri7LI$x1#B@nlVz*%TGv?8?&TQ&dJAC3PrgjV+l*}!2hn;K!GT9tLd>vyv<320 z!R7(0zWneyfBf7K{y-n_fXA0?u|PtdKfwB^fqYi%-WbcZh_kHyn{>582}P_Hbxweu*9n{U ztb{$b8tZ;J3;CFq27~z+mu*W5msaEY9C-TnY2|a*>Je7tCR_hC;KRkA`Cp^{iBf#B z_{=Q>?88*wZW;@IbJV{%6e48t~#5T9j&`DK>t%(a!sbKd)SXjuyC63&$NskviaS(jxKr3`tu!JQH|;xmhi zCHB{V=j#gp*T)cNzDYXH=8k9R#kxPGlVLBNlUCh)kwB=vbT>;u;LLnq?pO$YbKuDe z+Tt{IiYewj@2M}xfG3-r#I}EpVOpn1PA^yvdlT6fyg&@=@o`n^pOUez9(!Y-!ez|Y zJ6;W#yoWsK&I_y0(2syT_0|~kVBqB4G6CSv6Lk|Gbtf>aF)NODzC?cJ{WL0lD*AtD zQoYp#I9;R`Evbe+CZFf^S_9s8?2jmKfZg6Yvqk0-@`@aIQiZ#0pCHzHpF#y7-! zQgaOWGh$%1mI82!&n`P5jQiuj^ULHnFR?3&T1#$$KRI}b78uL8Edn2M@Dlw%z)~P> zJ=Q7z$V;r&m3}e$>(Txnd5K+Ey_jcke~N>bSlS<0ZP&q{9K6JdhqL~Z9=YSosT~+c zj`~mfyUMDWZ=p|)`cLYxD&L+%kaN_3QXl!KBJi*-aB|dtQn`D!9N_~Vj`~m9?Y6G- z9pK@p|D-Z{-`nse{;B?xdK#*^>>T`rqyCe=HFu>&b^M>|KZo&f)_+o|=ljd1V*i_? z{*#(0^2OvH^vO~GNp-dzn)DX@!%_c9J=s4pQ8EeZ%73i?r1nzX$KN0x;;8?mM4#jz zdk_2^^`FCdIO{)YyOZO&4}mv0>OW}{E!EV0z|UF#>88b_5QqLb>OX0d$<)1&q(9Yv z(#KyUO!WqSj`~lkA=&X`1n_gze-7i}tpB9aryLmnJ>gIFpOi~^{QiaD3y%6vO0vgS zfgAmE)PGW^YLdM-0uM+1C%wG?ev~EfbJTy*Z`Qmzwh{es)PD}+;jI6p1!dH{JfR#;2K&r$zL-LopP&%yn2)PK?qYWHr}Le5eDN%frbK9`2; za@2ngu>asx2!&H6L+4%oFY9^u{{DXbTLXV<;BO85zoG$pe$3I*jK!$m(zs^i zg#FL?*KTT+%3z({!1b%w8t1xX_eM4l)IZ#?F^)yP=K2%;_^}R5Ymmn7<<;g4h3X3D zy-I}2<9nEN1^dd~ZChk@RS9)=T%qV^MdTwbsarE68MmHEYJ1)zZ*)=O*N;!gb8Q*5 zCHWrCR|%T*K32v)WW}0-^L%p<=jN)cKfM_BnFX?I*~s_IvkNF5DTX>5&wE*)7c%s_ ziB`Mb07vE03ukl`2_-piaeJUQ>h%j=)VQy}Ikj(}8#AR*&wkuGj|=&ot=$XWYziWj zLmB_b66}+n>(a9`j%Hfhd<+*X3PGMIP-tv}4nsX#v7=}#@(qu+tzMFdJi1H%f?aGm z)JO36`8z8iU#oje?rk`sKORz9AgGQ0t{!8#;`|oR!iS0LBar`cnSC=?iJ?Vh(!3@h zKXffu&g@Pkp|;A~URsTF3Sp(4{>ZnoADz26b1dYIo(>yFBmdm1ko;l=@(0Fuvj?U{ z5mBW#9+&DMFC71*<`D8ty>pcBpF)0U#{3KOjF&TRN{@>B?6I%ACm?`SCSo5zEw_fB z2l-!a!?B~?8Mj#l{#qN6kCA@3ROYBWLt9NWvQ$N##O&9qo11YC>}JEpom|K>dy4sH z3PC^TdynS6iYF}buO^@DOc`3n^jrNTXj2p*T*f%Kpy>?hit_xtmk-NPs_mmUZ_TD_L6i$ zy*jQj>KF_ABo+&%PxeP1%6!|WUgXOwGM{u!*TnbyXk^t+M1I^cTUtjF?Gt>sAB-?Y zp404v?A6+>qXk2s`1o|xFXUYgykd^e6N5c9TYA`_ zt|Yi^!O0-VrwEAb2!-E7e0M!m4ZSJJFDbhLoV(NX$E})<`obyHPGg*39HChBS{-?v zrTPt&qXO!2)>(|~MP7~fe5J(K^@M$lzJKtY7S@F!T~ktV&SvdMT?1w0X(nbC%063$ zIz1I5pKy#9HR~ah4?8v#)8TG3K|V?Uy@sAULuDnE*2UoSbe;FPps5Tsatz4lF))mJr$eK zzT}O?NGD^4HADWPq9J&rPxqRmZd7b*CF&|z zTYnU;7zjqa-a&5aHtZ)>T+N~*ni0Kw(x==dlu+tr$IlcvqmKPb>g{vLOHMX#XjcM1 zY>n7pe87#NCpVfamYFc@=kZl9cp?d1*=fIiH0tqvSL(D}1zwzt?0t&51J>xA<8~{M zKOVU|BoO&m$J*N-iBYI4d>m|`3O#h*x0m%szU}JUSqp??2>nZ_t!%CnL&=RyJ#i9w zlS*X;yA4rc}ytI>kUNhEKCAV8sES73wF53 zDao=D`&-u!FxhL8z{CB*I!$g2rFugs1-!?~wLO)`1%EF-;92YI$WXd!M9zIRa88$6 za5tXNqCel~PPao|O^m#li2d^e>%2lHz~8M$Y`>Tadsr*LmvzVo`*~}8C#Ax#pIe+1 z^964deQMTPhVwv^vJR=cBR{HG{6urW7Ig$l>d&=MuVJ=Rr0jJv{H{gFCJ_4Z*+^=| z!WddBK5a%Z zn$@x|ISu<8EDLiN2WGeZgPR)rTp9LxeC^zB`1QwR^)vm7@DqN6Q&W+@Kc23%kzYRm5 zd$}uTtO20}n&Z?ZoG>3v+}XA@J>bTvT?G)hW<=0H*@;y->b}TXO$XtdV z;dV#V6#IA9V*Da612DgDI4oACiv93%lF`}11hlHiQGFx9BF2hd*s zdCY4G*w115tN&;h?86u~OmFdG+;k00*5NtPYy;svHA;Ta!`VsUzCPf`?jJk(QJ1WA zQP3h1e*H$FFenjxM5{LE;=1%Zfp-QX?u06E)S9yk?J{y*SKUB9UgXS$gA*}dpUO7B zdKP$|7*{A4V?GU5_--j5Lg*F484(McJDj<%V6f-@F%NqZfRWj>LSD|+HG%g zR_UP*^~9=}k`O|T&}BVK$G(95ZMlM(-~+W|G9R_VFuvn#(%#{|mZ$`}NMavY+Mn}8sM?JWgXL3V1_IEw~XDS_yCbW^u)vOm@3_Z*7@7V_KK%68yQF46cZOd7?B_>cKgMn0(;w1@G4GH28oWLo_8E9@{w&N3qSmE+ zC6ghayYT9zSlH7|_b=zMPtJOFz+GP#etj@mPwFM^OVwsn)mp?qCjJXT4&%C73DsQKS_+xfif4V#3p0f)0G8y0!jQwR41b@Gz#5}jR#r~wtjizFM zoZG(f;>C0D!{T}E`-?rGwgphW=WVX)gx3 z*;3=JgZ1+vjJ>*d1oqEQOjY3l{^eqBs%Kmo^TR9DQY_)`ulVgGoH0MT=1<_?ZHYR` zX~m9 zcEm6EuYvrrDb?Vw9$9PlSHw$-iErmc;J#X4r&l$@4w{RK@9xL`R@1(o96q%7V_jI2 z44%B%T0@O=V_5oQm-d{3zc;2D=qD{@Xg80sr|)?&?DR>2ypteL7PR+$XT?xUPy8r& ziE%!E?DDmG$S*!R^JM|*H17t@J^Bi~q-$H8F@GKQ?Ykp|R$^RM#4}enVtyaB=#9Bl zCZV6cZcD9&-r8zB>Rl0!y*pj^tqT4gWo0kE(w<@O(`(qIvx1>M3SBnrG$pj`N2}&{ zXn$aDdQt)GbmK>NdfOZj-=hcc|SYN)Ga^&ZqW-4B0%daN;E2iiaBS;3ow{U@NmEc9_*o?-$Iq27|{}8ZhiZ9dR_qHTYcfTgS@;dvad}(iV>~5 zvZlli^YW!y8@&Y7KdcySKYcOcSe^mTdbuFN-n@F<6eHAyi98rvf$u@0kKK(4%}4t! z@j4=x0vRf*Z+=4(>KaaK5Ru)86P){OCq|$?fqHT5N-XT+tA_f>;t0&MOB;EOVc)kN z<_jfYpDp{NoVgR`_qhXi$Gt=Q=}kLbPVrP(X3pDet5&5))gUcl~65q=YpT|Ffr3t zLjP(Hq`t?2S306hqn+Rv3hrCStcSci)b94;K+NygL%t{^qW_9UD;el*b$Uo_-j3x)XjaM<3{106jd{z7{)xI+RkrcT%R{6K})P%Ua-JTLb5OLHN6{@wGxd z+*h#c4>#0Bv&=O}1o5Z2wp*DOn658XN63TyGY zbY7*}72t23(<$Q(y*2oh_O3yF!D-VmJ5;~}%xk9&hKNH_6y)e*@S|xdZ67DX@3!cg z&yNEiYF?NyFc12f?Yzn4awehnm1<0`f_{v~9`Bq2{z+4`UgLrG<|4J{F~0O!=YrYC zaGktuJ8oN}{njh8;w!;}$tRQUOTx~Rv!ar|gCCTO@`F{;exM`nn<)JKWxdl2eYCGy zUT|9ndht}3vOccGu?dTNWkA-kbx!Kw0Jyb#x1J-2F2mj&w7Hk(u|!u_{p z^7Z6_*X54KMf77GeOCX{m_XRanfi1|9@y1Nvw@io_Jj(EcJ6(R@oVzD3UlGgl^zJc}z#mQBwn6HZJ zy=!k^U2s=oUBPVNObycVjRJqPq&QzUg`cu`lEhT79;^Rmk`jhEWYRHziSfax?-P34 zHW&wM`s%0~SrJxp+0XLjSidK}nf2i*^?6Ia9j<6r7)LGI@~Ev6as!qrE!UvVeEzmy8@3Zj1{-=MFH(7%4` z8OzP^_ff3I$Aix;*%qEII%v-l-3Fm6r!bjZNc4J<9x4a}Z8vdRgac`g(c2$~rC+YA? z)QS7WO*{eld85RMUtk}?6`O8#0FQ@P{%Ldg`=jnPd9LW6d#C+7JLDM-eKTxyhrj3Y z-YdV4b~n-oOhw^eyyv~vPJ()#D}||sEroZ=@YYTF6@S13taOth=={Go2lTo6n-zg z=gy~@koQX|9XN{q=L%%lrh|7IDsN>p!++;A7rr$_{$gdQ+_V(f(ZT6g(i9+X(l}|0 zaiJ$p?GSr`^?QHByd$RQr&GwXa6J006*7n(kR@y*p4#*+j)bbty0P;V#@BB7)JIl!(kuvCOy!XPeJ}f*FM(<*WE*< zhP=b~O-#;kbb8{8^<(DDi9xtu(XhB>2HZH0DXqs}3BMLo*|g^r#TLY|&QJk>sTWcL-czZ$_~BpiwJe}{gFOMvH__zk4DVx4Zi>dn46 zz`r?1NK*!Nf@5?099>rtD*bzad@$CHwO6d8wwVytuEolEWub%)eKu9g!I(mc5zO_N% z0e1R`J6^z($gDnBg8HT~rG%)8NSv#PvEV)lJm<8-9Ha5Mpuz^X>G1cF**wKKcR-gP z?tj;9igm(qFSo&X{*zAlz+~`%_{TfOYxNlR!SF@f9>fx=!PrMN3;KB}_;!s0?D=+- z=dEMlfzHRyXU)KG{+$;mYQxWVm^?isj(L2cS;6{f*pF?X*d?6Lp<75+{<}Q$Cx8!K%bTq1(ND;W5#w0E|6GM{RI3G^dvZtKLMIvL3s=RCHUJ)L=j)GN zxiFMjfQwcF{CB`^vdt^t@sCci*bcuRyPJnxhJ4%XW!1|O{Vi{c8CaK96iJEofM-gw&rG|GaZ%Wi zUW4akP?mb}fi^f-^iW|{yDaW!iq7lE%N`6h=In|K^B`ZEvOouQfYgqot}ocoKM9Ge z_yxa~77x2NSl6sQ>QM3kc-p`Ha8N$v>UZW#G(kUM55`K*K;FQ>-7{qrlCm48IuH2C|W zoec+?vF`5azaLtMabXu7ot%Sps?NaL)^qSvm$dGUY{YqW6PGQoM}NmwSn@?cp0DAw z|2gsn+ngf0WuXtL3uE&HA=mc^Xj%dM4)b%*39QC>j+4223emr2Tsi+N==am&vs;&F z6KcVef%0T?LLC>`V;2nkqm?RiuF0XU@Pv!Wc-Yq)1D%i{^do=HIF;81b$JOVAFLpl zFCJYnmcw-?+&;_u&IivCa5yV^U6W9oCWq^(AU=Mr(xdSieiJ$Oe6g_$c-TM*{T-MqU+YF_Pod+QgZ2B)X*p$gv2MO?_`s9)#yR+D zN~2fBBA#Dfv7`w1ZK^R!Gc*Lx9}?E++yguf4rf!%5m!e~vJch{z`oPcL{oH=i6BM0{IpJ!uIZnAhiEGZN;h3 zTYdA(RYuU8Kt$~5^XMnz=c@;{=;!EnzUlRo2urNsvx=g2K?P|;+A(e(O$)2 zv7m7R;z`f@`W>*l6?KUm;D@49Wt_CmVv@e%Io%gYxhr$H;`Q%gTp!wCTnfyHkOu zB-VRFB>a7vp3G%D2aGB>_{Q`e=6Os0j1y^V@fsMQp@*`I*ImU zHi(;wCLn(s__${){7c9A(2N_H-xKea?NI@awtJqzt08sce!o{1FR;(O)n>9@)9yVIh4zT`qT#pKg17YU9RZe_-vbO-m3Dyyp8bjs$Yc%DSyuex`@Q~&IIdMVcH{DHDl^Wdkl&2snq!TS~2US;Q?@1KWiawwnBs^QY0zbR+4QS-|tqbRbAm z0q0%vZl4uITy1&EZ&5q)>CcTKHl?`Xyrq}2MoJR;zg4hzHSFi1WXt}uSP#B1Nj{Pb ze~}Yrxi12qSMTn|>tVirba4ElMG1sbv52H0&B9T;JVi1b6q|opE$BSyEoeu^TUXSym^?Hf9>L%-iUd{d)e~ozR1^| z+L0UIfcTcud3?tW`d?_6!has?OP7xL#<)GdfJY^yVy-ddllRGVzlq1VuY0Px0{*pt>(c~3 z$VUYn{#uoY^GZ&7Tyv2Jd#~Q1sSp1Zy0dQ2?j(jfG)FD;HF$1Sm(v|Qhmx+0lACV? zUboPBT-`oR-AUaD9# zEb)ul*VERaZawSgHxG=LK$86V1n^bsMo05|;GeI>Bhp-OpT68uAMyMQdTr*W%p}M! zOgG$m9QdUljcz>ye%|jbc62j%VBz1?d0TVg*{XzDfX_E8PP^f>-__@%0W4^o|IN9d18dmnS+b;CLPWJ|N2cx8;cr zT~C1ejbH@DO9`SzF=Az)_d-0{d7>z$-aq>I$LCHDU*~uCimbnSPP?$x@9U@z+5129 zif`zQIqix=?>&az58J2w z@CW|M>+ia1?jc*JsGcFe819GDj)!rz=8F8$^KiS-n|{BS$ou^|Y{&h!zyCGdPSo!A zdzQm+i+=*}zsaBfiU&CF_n+}V)4JdK`^`Q7O>X{gnEz!O;N*b`Lp{53_=|#TP;ij< zzt^K1{wERqmHoC3Uw3GJ`e*h_yZ!d-zwP%wIUxT{Kh9~t!z?d4WIw~Vg|E>-eCPRJ z{QY@c|2B`6583VTyu)e7!?^0)fB$Q^UC+?_30}i3h7td3y#5srymtPrkI_T^{hJ5= z{@$#A4XgOyze`RY7@iL#hU{m!$6>$wuln9B&U1nr{r=Iv%ZJ`S@E@}0At3A_`yR%_ zY45{$|5aZ9iU&CP@t?&5hQ9x(=YJLb{e7RmHNeROzpa6yWo|LS<)uk5#U=(4$24$qIjTMhcVz#sc=@~XlC;r85A{~ztA zjHD=02&0Gp@K0X+Gg zt<~0FYwxw6PT()UTQ3vW)`B`m`>>;LYsi(Zs-LMX zt)$?LV8EA+9oX-FxqkWC7Gja=w&P<-4SAX9Kf~*3D>>{-f__N5_OUEMWsu9 z*Y6^WWio>6aR0Lw@+6jzs$%#q877)WUnSQrz0_Rq&_!g*4Rd#Qw354HE55fqsb-45 z2$&mWUm@O8oKluUe}%W{Io1zbNkilyJVvD5LNwd1huFnn&Be~khw9WjgzN*!X_uS04@$R+c>+~KW zJ&P`~O*VIDRBJ2YmQGl$?pnocB$2WGBd(HB>EabCwp~QOcFVWPA6v=wZdcomS5=IR z9l!Xfy;n$@nI2z0=_0ZpPA}ezQg(gDJ zKhHRpdXKGQ_RQ{3-IiEObh_12%3!~@#hnX=C@J|D|g-;D1ddk=C2OFw8K?H+!|w(wje#-2^KZ*H~{4c#S5b8-Dg z>kro5f6_vdWfvBd^Iat3_BY2J`_xL#dtUt??0sicl*`tpm?dK*3aB882~d*229z8m z=bUrSAUS6c5Cj2HPy`VK6%{CQ4oZ@sl0gvc21QBY)Vb%Jxp%&`=FY5{Z`RC@;fLMr z`@YpxJ3f2w>Rs)*czj|6wcw}DVQ8w_x|YAY9#ZI<&xO1lha7PRXGzaFuql~aJV-MF zISSX<83pP=-l~wkczqlk?WrK$l5j>lQuSbY{7m32pCmTt>N>r*rZbp;UR?nLtm0o_$vUVPV67oyA zx(CpZpfvqgr6H6jo-E>K)d%KR!j-jU7T^;3Szj~aI3zyaaFf`qLXu-PTS7mZf%cxp z?i!l~xG6gSQLud+DEnSrE-0))Q=-wHVKq%)I2a#$LT>@~Tq;oKzng^!h*KoR_3lT}fqpb-UNJrbO(92^2vKP{gygKHAPnb2S zsD1zuFX#%LJUE2bRIkLeMfSm3zXdJni+PARz@+3;I)H@AS`sK6hEVY-xq+$7KJZQr zKzVQGK}UpLfU0=_v79*SmP0XwbWR(`n0@Sns9Lov2e5oTI8;}-jpZ{S#$UF*t_l_M z$Hx3xXolLcnEOKY^T1{}-4n2D5RK@XG;nJSp*!S3i@FSbASYcaFpj@})G%nM>HYxn zIjfas=0Ak?%fDYbmDC3mm$V~z-p|AL@?hGt=>zB!xvBjK$q;&`a^m@VTpx5l{}p%< z&yRuMRqWK`0es$`zxzAcA>_@?cr&ZK4+J7_JnF>bm)z5cF{T+rYbjfow0MV*<^`SX zGN(QmU^`fSy>1>x4vdAHY!4t!#tS=yt_-1l4jxlfN_{}L9G<=KWFByT@qJIf51>BI ziiTVKL+Eo#S7v)v9~53Xx#;j}9*&T)9{Zg*fPOX@?_aSULWY&M_|2d8!9pu*XiEP) zxFy?@DpYnNU85Oe=BaG7duWKa(Rl)lzg0chn3@Nt!j2tupF5Fubo`^ZFLzK^k`Yz1 z<^%-(P?8#IpNF;SD=8~`yU?6Qvg_J~+sGn%_1R9}3GjZWLFDV52ktVehk=G&=;X2f zSkveXG{n>hJ1r)_;gIO_k)e5zBnj=}mg+)=;;e-1raQ~AbeM+>nV%qN4C4B8fw7+2&?aR9; zoX{v5r9J^ca`{%@S~2}<1jLi82GHKSmi@Au@6l-YB!6us=1;B6_RSC2eq_1t|0+L# zI^LyI$?6UvPUrD2>FRwjD)jsef5|*pEmxHJ2o9o2nJr7=4J_Z1zicnu=!3KprlLta zKdqDT87F%?QF%3Y`M5(S62H9g>uUG}DCsn-w^hyq)o&XLgUtcdEq=bBRt(F>m#3d+ zuzcLImocQm{C$_oI{v6=0A19rJQ%G%gw~l~N`B7ogX;@&H@tfA^IGeS%r6Ge*{kNp zyqAX1@aglU5_)|QB!B!8UBx^U&t5d5!SeaW>mBjD;Sh>7DUgpseIT~{Ii4ENui-*J zbsx5mayy<2Fwzd8lNx7BicN2lMSLh@eER_3k;L_whUohw8X*VEQsyHC??LJ%m`d z+o^N${Ao_jD(uGew_lDt^}t~Ov5Qe|oWt^4dF|W0brjYwNwS~$Sbx0CnYuYw1`sF3 z{fI2dA(XjNb2=mtKTqRfWPPy(-trB2p3WbGYI?mQ!RZFXmbsQWShIj?cd+O_Drtt# znQtxyH;sYu`zR^{k4ChYhuK&3`2u=1Cpj4PdL9~mj@V~m{dTk5Mcw^q2pNn}b)=~E z!F;P;&NKTKuqfP{y15J6my&dSA+<)7XX~v|l)ivELA^L1Dn>i7@MI_~;bm zMr)dn)Xpo*J^xMs>DxS&eP<(JyMR9Q%G(?m7S+_XCKRI3V3y}DL;}2yk9M_ANd$h5 z+%W^JpQ5g$*UDx)kudL=TTFfynwv}Z-g|Qb`W}i`N)FG%@r?AekC(d8hVJhoLUlUw zpmUL|G@5|-OeBuCIzKxzuG`ZI}O@JF;c2Yv-U3lU@m77iW z2z^cByFZ8LFJnP?s-qeO6I%vXpV-|8!rVNil}pGo_SJP4P{SRH- zt`l%GI$k-a58Eeg!es5mF60-RK9n+HD4c_4yW%BDqbDH7 z*jqTDdmj3)+~$6TI#Hvef)y22Hp=?sxuoke0o>{Kb*1m-!T()Za`Hwe(zB&!Hetv@ zyI6J73^09P-cg>e#_M~@e!(JzzYCfCtaYDSyNyC?*PAWy`syirI}$K|9)VZ+>4RP9 zH-$ueuwf4Ra71v3(QN_@Ra>nCu>BG27c*dN96;~#e`!8QA3~3;j!`Li^}$<33mq0r7PEm(Dzb5md5BlSiP@D#e~2Ag)`A7NqYbp{QgDfkMW5B-7xh5 z!#<$e_3FuJ7q)-LMalx>2ax`w@A=Qq4Ix31E{coTK166;cxVvZ3?ubN9iEqsflym` z^~$+M#Bx92#rN6;G*2zb{WGu`^eHcDtF(@RgU*)5x08)%oQ>JP=Jf(HHhoff0LO9r z$cnC7eHa7%NU~V9>y3z)Hqk=o;Q~6am}lfkp988_Xk1biNNwvbKqhE(JKiil^df1lyia6h?5{r@fam>azz>8`7Ov#K5jLPgWZ({ zGR##ipl>0l&D1dlaYk%Ct2qrwmom6{$I}J0`*9xc&e#?>t6rif#WoH>_Y|xuyBg7_ zD*G=4zXg=>%c-AAw*_?W)41Q>ISyCHTaK?6H6X@e>1v0(1$5NV#6|e)T{xn5!6E3@ zLxgNtJ;Sm7mGZS}j?*T?c)8LF>6yEDKmBCDjU)MJGL|VT1KXF&np?~F))K)`W~q|+ zD+dmax_Z9%c!W;tI~5q?^_?+K;Ai)!Cx*SpBdLq=Br`UGenWy-pQXV9y2b>EICq~ne3cEF zVRg@*);~h$Nxit(@cKHYEW6ERBO#i9l9J^^E_6SQ%NY+YKxH|>B?Nr^my1cQ<-=$= zzI|xmUN0_k{3GBr=w{!ulMF6-cE^_3fT$Bi?SAJTbT!;g;C1l z$WAowvAL`ka2Lh-6*mCB?n1@0_W+JRbkxUE*%`V}r7*QaBu5Tn?qXG_3Y&n>HcII= z7@rX`PG;XI=|p3LDLG}iZbj?n5`*&(Ponk^`h;Z?wQ@nCj8Ct}!5{P<&twYCydqtI8Qzeofu=qE4+gL&;Yir@DzT7-5R& zQ4VQD5@J0`PLCGQq<9rww^$3D8>a2p^?3|#Nc(>UR<~T0n}1&boYN42m?%2GLdnB9k80*Tmz0 z8(QlR`qd22iN0mYyPGa|?W0sB*3Xt_NlMS?@54S#{~G6oN62dieqpkHd2joBny#M$~>Lhh#W$0rkx3 zuW}}2LSeY|ea_?gNW7Hix85oNdR=e13=q`=dr4Vfj~O zUg(>yOa?;a^MFSNdC<7qN1XLi0lF=yaz`1@t{?hM!Gd~YDbAy|no}I|xptg5aSvuPrvN_FBAc3;uqF)o0n` zTuDGa!S+%0kkE3Q()x{^H|~-|8@ab5%0alDh|+eD#$q5Ax9-W~)WDZv@zH(7NNosc85+AG|;0 z&ul62KO{-_@1XrhK6n>NqTQc&j355jTmH2VZmj&U{-66N_Ts1h{9F5L+<$%MU*EI* z^}#Ca?ObFe{PlJ`{NLZl|JQw=CH|~y{d0u>_T8nwK59k&`|X6_y7Ov{hpno{^a!9g}+GhkC*=_=l@(cIo>n4f5&xmS5p^jr~g{F z`J*59AByrfz0Axl99{5_P%x!gEM1Jv{;2Z&G4Ma>{qOr}|Dy@^KkgU(<1sw$e@;Jb ztN-itwyOM}qqp>5>;CW4`(OKsoBz2#l;!`^{m;JXJ4tr_gVX=C=SFk?C+PmyKAist z=}z{iF8(LU``><3=`TN%{txN==Rg0kj`&ZyYaRX5GyRY3%l}y3{}|_Q`@-ew#-e2H zXlHz0&f3M)%F)7t#nsKl+!g;6?XSPTJ=x!%|9t%zyQ)uz@!FC6*K2LNgF)*@(j?uF zKs3VtQctu$1hr1f&8*T9;lbvq9Tqdz$VK`7Tbt|7kj1sn_)4KIG=w(4Ix$Xw?z{e+ zebof`wlJZpdCnbeZ4ve!k#$A9E0Nsn14i&om(w6aiU=2^V`x%*-N9G#%`vC>SVT9| z^p))k2fR|INmP1CfS_WZ)^}+HSiGfC`R$|&MAxRb&_D4&)1@X$xwhe`P;WP<@~|NAQGB(Bcia?(+f`B< zQiq_W;i{3Roj6|ZY8mvuL;#(B#)X?+j_9!Zg`&g4PVl<(RQhd#BpND>Y{_>gf`9ov zRkE-4aLDiu#V?{I3Qsz%pV(`Pme1zN*enphX~R3?Y7+shO1=kc=Q#qk`Thgrmx9n{ z!sC;j#_FgwFjrCaJQ0fPf?2fhhC^uC!+L2EcW^P-X8Go z@|2PH9(6f5PVt(TbI1UNDf)c8nxT&FMJ#jl9V0>&Q*r82?=|%G*(iSR3}%86!u@ZsG$12|1QWYL?NU=w~bVM)cDjt5m zrVZl)1ccA0_5#h9uU)rg3^68p5=?d=;yr>lgxK+=(&ZA^q@Qu?z9b_ zw0kZI7qwp0Y>aXPgJsa0v$xFA(PL|*bRGmamU5)I0MqA?ed2szrURmf&{LpO08n#0`1P$g5t3UTcrVy{LS})SZeeT?N}q{1ajwk*owN>=I)vrfYp1ETbQ82||8Q$HcQQDa9wzaNA>uf=le|dX2%T0RT+X-FK(nzvbV zBq^gHD&o!oX*VJSF7QVDP`v>fBY}2i*_KeI+I7#~K>^91_^31YkpMn*W38hF_|;}e zL~teq6-TlDBT8uZ6H%fya0@E z=@w--;Q7#=EFc*?`AtM*` z@yT-J7hW&mj(TTy?T9^urV0!0dP9Kv!c3W4a(G?3F-jHo?x@6&be8p(7?hMR7$}y9 z!1wby{%343zq$+kiKkW3B{JO;*Yz!+hv=IOiQ&duVa8O>F2-5oEgZo#MA*QePM|fH=ij}I3c25dK=7)9_ zmtea=ZxS=Dq)UL1gk2ABpRz!#`@7HfGMOL;(jKwgJ6FNDJ1HX=&*y3ssU3&7Cps=H z?N?>#48EqnOUS29p}X&$Sw}y%JI^IpES(78ZEnb9=V*em>C?524SGV}Bc1JQE{>4= zt5bbgnFvqgV`Y40tzffhXfXiyWta@PJX{@Qgfe};b`Wvi;^w`|FC17;&pbKi-)tKV zqblz0H;9HveC_QS@drMruOma;mxl=Rto!zG(_RNHBfAS#Y!0Y2YxZpHA!T^V)i3Rj z`F)zp+I4M_0LZ}mrtfqp7}3W)i^b=AopM>yF4`Z7R4Ky;QZ5j|?|j)0nJc#FK&o?) zF2504SPo!_BNzc2JT2eC{vy|ML!W(v0DY>pI|uFOL_KWln>`Gs#0hWq5P~>G-;dvrWkrT_K+~eOoVr~_{30KJ7hZB_jRDv z1iiDHPgkPygI#P6t2RRf`1sR6-T~JUd`zko-qM7?Ig3XAixU3Gz$5tf$*;Ii0|niy zWgx<`P^_PBy)z6>@3W)Q*FgKds)%uyRlvF}Yl!kT0fY|$hc>2jt(jN-dj)e;kV%J3eEcV^#?*-V(G+90U|U+-R>EzQh>8+J1-0A;C>>{jyY?(sG}2si}7U-2(a;* zH`(qp0kUQJ`)FtVA&=ugL!PGvqUtg^ON#rrt+okJXY%Thre_-LeNo<3J58xy`bd%6v$*&Q z5w6Sh(HS!Vm{nPv-P5B2gJJH&%^xD+iuVUYt26?v__TJbcoV?nO^5Eg$>_jn!FFH23|N<6Pn(qz?8$q9mal3@|t*WD4R2*8hvbvzMFhLr&mva4}oC`CmgI8AwS zc6jMPW8MAbA>lxzGC6LCq61Ohqwv8jOrMshbs}RW0V?;tt!kL|gUDTv#e6eD;qAza zJbM=dRH>vBZ-M>0V$Zuy9^`_ybLcgvPw9e}{5_6WSEfYfWcUophjHFNfL$*h>ltsU z$V`-Q1nR!}e)?l22Ymd%b8=rt5HuKfy69s%`*3Yc_DV?sW8F`&EnWw>F8`r4`;YTj zqey*UbQ9pDh?f1fI{~U>TfU#Ii2}CEhh$#snS$l*v)P@|K5*+zt+1Xi5e}GX8I-P= zA-{*mE?BV0qX*KKtXkMFzwzi!cEfn1*MR@jRx$yMXS81Is&E9Ky{xvQdbZHLZUm`d3?4}=m$x$M7cZCzSc_m=o zS$wLr(iI8ci>GnYlZHWqG?6}x4?opw(JN!za-&@2bNhQG#Q5yZ%ABPts$EJ6-#a0T zA`R#+e8G0!B>uE52}=-6zhSv%78r!2A23KWzjlKYtb3x9%LtH}8k6+k2d-!RDi`T~ z;t#fiRP_Nhfr!g(|DkPucf?#L@oN*?jd;=rJohCG;W8)3cN4)&u)!-;Wq;^9H>E4Q-rAb&uG`6csCIcp>^$sxjWoM*pjuPrtxKhxn69iJtnOQao z1Tf9H=f^dL>oqEkDoitmz%O=OM8;YZ3=Y{*ai7w`_&>8a7SG42|Ls@??)Ma0S#$2| zxGcCI;pZUlh(O#a{#1onzkHABa4zGxfadMOcE24y6wDgCqVg)<09brH!VDyv=$4zHr@2SkHhd>DTfgXlj z4fIX5{^Ezb0yYi&$ZqHm;DqI{Y*N`K6&jVf#@c2JSK8X}j z`=QKR%IIiw=AqG1?7tp{G330!aa@}e$puAAxWqYeFHbWLy3?d~?w4_a4KAJhO%oy* zMG98<_cmy<40jU|R62CRKeb++LS9U}3rla+${!@9JXz{&R?q zUB(MVES~hZ{cMBcFP~NHdrN>V3ian10R)(EGX#oVF7WP4pfVjzBJ5+~ z>Oh@g@V1}ovnw7)BVa9CQA`1@X&p>=7#4zVQ@MAI^}(o4d)~|!!S-hzpV}&;>z;oMP6qTmn3c`J66`^`eTh{9&hnC!}(+k5Vh^!R*pm0a_|m zbX+ryM)ooh2IAgpU99ql$XS!0H@JgQ(HPV2%s?gNXT~Ob3d?ij%%?|*&6r>9Wg0DS z6cF`CUWL>dbI@XXvisO8I}neE-Y0ki$K7tlY_nPVXg13?DcUIpZRwn57QSqZXhnTa zq~#D`xXaP{9*%dZRLe&hRMeq&k#gf}nJE~U{8CuWV}bimtFJQu!FP8``Y3I0pz=C& zx)=AAdpla%xX;NOMc9$^hGTs2q2`RVF3ty}vGjRAJ|u&xiP4RHO5VT_5hDGz(GYUJ zMH^niaola^A=As_H}QUv=b!Rt{Lx!gj&^2oSF|}5tel7K;ia~dTcTJ$lI&ulgLI^! z=o};ehT$~;nliG5gR0=WS3UJ7wm(Tu?;9xPZ@?>?cj4>&{)mceYL!Vz2DZkUriyzB z5JU3z#phi_hzcspuVZk7`BDYLa3?FI*{!2LZs&#MemB3pg#Cq!*qHHgdMA)()HjX0 zYKabCX+8S|_i^lJPYW-1B|!R%*2<4~J_~$9yUv8zLEp)uomOIT5MD{Ju{!IG(gc;n zPjV8$^M{NRhom=6`{mB$+kw39z^gCIeKDe;mb+JGBipf{=ig2W8jyAEG27xxB9qAaC2*3U@A zO|yKA7ryc&TrZ+^gh8&!Lk{Y3aN5(mWxui^6dSt-rwS3lo9xBYi*K;qSo4-xZwN-z zVp44`<`#${NVm-SHO_B5IlRS!?bvtex{|_cF5nVHmFe*LCTy&WM#Ue{1uc<{@-|f> z#Hkm*l=HVoR?#bbmcRHRo?%BvPUGwJih?ym{lnv3EGH@NnAm)eb$-mh)h{@-Y++ z3YRpz6tD%pnAcJ2TsV$1DfRLzu>#%izco64Ttzv)2l$Jcso|DZvcC!DJMX6h(^HRe zobmQIpS@-n%qm{DuJ?|BN9QgDPm9_idfU8j2;*lxqo0)~mG-dMt|Mu6!UmmBay}~B zZ37V_I^O!&K5LQNcg;K}fSbSkMXy+QbYJJt#fa4?C^ise%dH3me?z<9%-lq)u7`zOsezRLy9iRF}ttZ~WPScJttB5ylCxJ(^m5u|I8J z4zIBfjezzK)S7v$0kFNqc9b$C0zEhKOIyNn_^js5)8gAMC@1UA-Gx>M=zdhon3sXi z$5yL6v1^L}1yhdik7K*YPioeDT{#rWlEd%Tu}h#FDZ%s0r~OeFc+~yG{OYQF$wj>60XLC)xIs7Kof~+WCOV60ARwoMq*9ME4`kKcHSBfXH6v+2ROR-*PI4X9(%MU>t zkJlLA7Art&MePo?4kM(d+jJog%gvh~ZskNQk4DRf2{Z=*d2jgnZu~X^zL^V><~=Nk z`knvV-zSJLZ2a@7-8Xq88^U?x4V69oT$3v6|KbbPl7-E6I35U=V_%9nMF74>&kW?_ z6Or#{TAOJ$8Fa2B>~v_8ADE0?8%~QM!t*zahh-ldBfbEopu)2_KViY{7u}%@CG%nT z6EObaUAN-8Z9)M3YZC?(n&F6Pt8(+>BUOk=^sGw_bO#lJT(2LNpZEv+%N{d_B9+xk z-(Mkp9N#B8o_Y$QYwNo@7E#{PZ%t-H?=k~=7|o4E6*k}tYkSU(qdA{eq0 zWs`jTh)~er5p>N;3Eez%wOuvU2=O2Jm3~1r3~m=`YEWW6on3UayX=AeDXda|{t|`~yXOJjp z#BpvML*DJ{ZDx?P6cer}%nu}T2VLwFg3vJ`&n8!lzqOv-9{GX&82?G(=vxBeC{ik@ zI>Sc|8QyVUXFZ~ck|V2Re`CL#Z~IIwnoACB%h-3Gdgly82jbRnuq>jccu!{Zk^nAG zjI%0gaGu_r;I})<64l6Lir)quL}}XdNX-bJ-h%P{4UJ()Xf7 zptmld{QO)CnNvP55Kag|x6~sd*e;r(ad~q_tqh!>jrpo1jN|wvzo)49oe8wLwl>Ww zX+edZNjPadBe1@kF9RFw)Tn^*3J19l`k%6%qzF>fd^ZpMKLZp_~A*^we{; zSs35t9_wmkR71z()k=d7T|%6h{8uD?Y9N)5@23+nzZxDt*jzPmLUgImwKv)<5m~A6 zBai+7B-rFr=7{MV*36|4f${3sYa~>jzdT{GXWK7GJq&4R3w5L~`=WJug4A!EPY9?j zV|6=V0#?bVf0@iAL4Y`?N!eLdluc@VFAC@D7U_vaZ5Y2$R}9!b-Q$iJ4$Ne4(fOnA zS^R=hPds35{pr*z9U_q59UM$3358166T($NQP4Yk_?UQ$8_+&&Nzcaq-FCN1nl0A% zL55Y~7glc2Z*$1#Rc<(JZafw0x1|RD(H}FlMnpLJiCxw>4Ey7U6y66Zah>JVY~I`e zmP^e*83sQB{K)^DehbH8hhuN#zUB!Ak$`uk2k6~^P3c)g*{~zhqTStSg6-iTLq_zd zwmGB?9C)Uk>5Lvm9w%E`wnGj#W<7W??v=SHy0-ZYjWpJaOup3*cj7J4#k+iIpFcYwpNVe@q%R%d>7M-W z4%n{V9QPW!hwV@3-JZ`HK9TUsm(--^s4i4cxYX?-Dx$T`rjR9^Pl(ZHi;0rcf=rWP ztrOlZ=(#k*`q~|Qt_*Lt_Xms%Cj{er%fAwUV*Wwbyqgc0UkohH^|pdgUq`)cau;MX zbZw729%sLt2*DxH0fiG^vviS!q7SD}-8?>Jg?3)c&GpYCz*Rj(=XQ)YoUTZf9;%Io ziq;!0@y}F&#p>bF@M;^R+uM0U4cnh5V^`gU#}l`;Ev-@$1>zZ#DdKBecr;e^JGn+3^atdx zE@7OY_(|+kZks&%F{}{r%)|}xD{qv!kNJb69y!McjC-S^9&>x+JZp=fAhGxp4?IhM zq_svX4|(Dwbw6I{pc|VT<|#P;Z1221NUQ6Oo@Gs4o6T`SGr|Mz!{uSH-*VG$v>(qS zVeYOq=3DuJ$GX)q_ON_d)v2V(0_@qPjD!ZgKu!I3$5(7O=;hA~S#FYmBC&$-y+R0S zg{d|Tl7zsq5ILKmXsn-_ZZhQ9e~lX63F;FGfme>Y9D)Uw@XUahWdi5>PujegL|DJ# zF5UMCvO0)nIb;S&E_lH0aNeQ&+#V=-OFq6A>p4>2KxByoAQxM+Byn~DnLHOaeK{Lc zn7r1t-0hEs&i?usB98NrSwD(dwp|cM?42;}I1jLy{<+YhgyYXH^~3v?2@ubFcS{n- zDaJp43SS{{wQYl*L5F#)MM&&h&hPn2dOq>+l(RU$KGa1HaT z`M3eA+q*D)-d;_ymQfPQe?=V0j4(v~mvYYi!1AMZx5w+-xI1vi-d%3b@Pc<&>(%Ot zT+s*NS3+*p1fVTWosY)xj!mn@W4azEBo-}lp88-QGS$*Zxapt|H)$s<1r3S7R5s9? zb50wAix;nH-y&urSrN zaO9ICl;plvUa%wrkNo#^mPhW$m$$*{%qs(w6H9$}r>;4)t{gpIV2taPIil|VWM##9TA`&MLOW-b&;p6&Q`c*D;9)`Ao}p!q zoZ?*~WHCM%ySMjdAeQS@nWRHQuKq|Xa3pm&&kntg5Ym1u>xsT!7_FdW$Mq%|cArQm zPc(bJ**=Sc4=93d#2?`E{`MaDeM@N?*D1YAk3PhD#t;|aERmIhvg+Na&(SBN7hZE8 z-1!V)joC5ao;jw^W%tj|G0x&6zf*O(&m6e-yrRt{(S;%tX}w?AA74L~B`JaJ&>4Ek zlC7hWDB1eVSk)6JWG71gWx31+*g43ANwFVH@|3ZCaoZW)QyTh_)Or$>XQ%I^s%ycw zS2Iy2_X&`ChE{bM*BigvuMcb5siIWJ@&%yuL#49K_HS6sfsUz^V;#p|^;Z(gq&}#D zw{WcME8GhHK@!?KsEg0<^w;>2hx4nyE22*RA=hEYD~I`e0->t+TxRipXPAu{>H1pg zf^H-x9rVNdTP)5jOWa?zKr^m-$4tNRpxW#-x^NpCI73brdN2k1Q^Qwp$1#36q|_QU z-R6PR?n&7y?^8n#yO=IqHE=;*<#+X~F#g%oa9k}{!~|(O`k$4Xw1#IV?>TYSnE}n~ z({(Xjc-4K+K zInHIA9~6{@>pgdTBEv|G8+0* zBp}yfbQA9fu#i5NPsel>%|BB-@5U2|ZoWP5_({tQIM&$lu_icAJAHgg4Cj%eUQOv9 zTrq)U-cxjWw9aT{&X77vRRc+^w@_8qJ5r5AE zuQw4GKYKn|n!)kzIbjk7tKv{ld;PO|}2?7rP zoXYy=K8Pd6#xY#N0~Lv;=m;lcejT9`I*sF8@4GhjBI<$Y@kYZTvL`yQ;5-ra^1VGW z-n=UHT7?LwUXlqKOS^y^Z9#gXu@Q`z@eC;&1tZgHzJvF$z6XxIF4Do{*=cq0BX&Ae zWqZ`r>!=kZZ1jAWG|@ps$NCx~mgmeU?=C@UW1x1)j#7`012L8*2}h5kC~DD8Llnnx zqdR38sIh%6({*R{W%WgNcCsPk34-wc+5Q7HI3HwaB{0T<^UsOZUuNLC3s@m7?apjb zNDlhuR}^Z3^D4CR&$0c|ifCJR@4)-DIA61Q4TOMi>dUng7B2YrtS1)lg&l*^;(mr0 z1tREw*++f<3qPU{nbxjS^hN@lsYSf%D!^$xlN^oXZQhEBhrhA?DK*Lp(HOS}uFWg? zk3U(W`D->WS=ac{hKG=fusjjA^Do(QsL3GqbK#^BE&7P<^iJ0xMo$=Xx-P(wit`C3 zzV+LG*pG8YUvsL0;G#6ejPZ9*R5sZ1V&{T7*rh1U9>#QLdQvz-W@HCfsP?%m-w#FN znI5@fdt1l+y9yD+f)Ovl#4klO6j^ix zC)h{3g8~n;Xb#5DldV5rUB~>2&+qr8!~24aTsvf%!Zne@9N~#vy&lS9I;Ajr9`8#z zWl5+_^+ZkkF3NRSIKWTe%tv=axPWIpLQn$hRr1urjbyAJRmXZnTi>{#Qt#gtzSjOo zW9EtB33Veh+j4kJ9@9tFN{@r*nK3@sWRtf1jt6iLM?Aj%+#Y>Mo!4NQA;1hdX-X)L zQ%~+K<9#v15-ptjj;Kk;Htja+nFx(Q!glLWHEG2a?EUY`0gD zqA|3~`Y^o4ba^_$X-U>d0QWA|7f6Z%d6Dl8z6YpalY3-Jdg|L0SahrTn3&-AO?~SvKV|WC5M~} zgN1MaOx;zuU5@e3nLUR?)tIHh+kWumuggwwDy1YiXP*_?n?j>O+J*gv8n^#<0|JD1 zX|$a&3Pc${xxGDfTu^`*ztBZJGl;xC%XJsW1&6u5x365l`_yRqR7Le1p|pr*E~3~U zu~^3K)WC7K2kF~4!B~E-Td!<{V?8~n_+d|iYz*?dyuldvH4vSNe6m)K^N>E&a@HYK z?npjk?h9Wj{+-#rG^IJ_V7Pg9LG;5zEPn;sXKFs;I_k%SI=)6%M9xx3RyV5ysnrKZ z=XiP1o~oxBY)nL`j-(Nwmyv|{C$^kk&ra6eCGp#`e6)V=#hK1z?M!E-5$0Cxpa zLtk;nqnVbK=9MN-px!>UQ^z_EwsIwGk7NC+mnL^^6*GhO4u)IhjXG%X((edLO;6;; zzIbaV&R?_Z`cKK=_~ORHfPE5m5$N0QK@Kup&+pNsq&_rY0FtkIRE}Z1TEJ~7^PR&N zBCh2b)cm{vABOgaKVAq%7oja!AM3lVRNwhQT<0llt&VrA3IV-%yKI3dOAxgo=X?ro zD0ch+`zWqkS%D#*4tr0gfxkS&+B3;NG+qcAdV^!jMArd-MM_htV`w+ zy)pI|ZJNU_?YN%1L@hKIV*%Tpp+b&ap=h%;+b&op1Ra&iJDGy(rz+x6r0fPMYW z8T;rMXbv~{arC!0>gp;?yETIGia?AAn>WUXU8D=)$|*=oF11?vi7#4HOID~o?gB@1 z&TkWNzRvQ>fwXh@d~($j3b}SMxbBrqQy|nC2(63Z8Yi*eVpQ8;w!!mhqU$AY+6BYw zj3~oXDZX&#IOm%ZuOo1^;^Q>|T=%plR;2B^seo9jYa+Z#laW>$Jq07H6?j)rojwvp zfcG~`gDzqD;jh(y%!v1iC~%CKylb{ar)*{VI&$40hw&bD9LCRTG_Q=uc4>j^8840Z zcC3iEgQL$iP#aB8MG4wq+~d7kFhoVf`AAAVNeXKzh&ARAq&dfke*fyptvqrST=tYw z6k*(ZqvOt-9mj9LHtpAgCOqbdkDM!O;k680jr4fJgZ;$=qf(6+9Dnt2+>~Kl353f{ zj^Rl*hKTHAhMz@G2;xnasFT2YvE4o~VP>lcEQ4|@;$ph!%;%Cq%qr47jj%=nwM-Ywv0Z(>n0R%{+5^4U=WgUX6prjEKSw*0y8+{SlK%Y|XZQy8 z6*?AT9267E=vfjE6}44AbCD}_^ID7TkKl&(rv8*eIPdp+tw}oJx;qL1PPI#C9MN0_ z-X2;L2qnD-tGvJ9Jj-sn%gaGHexeMb*!ZoFTJ|#;*e08!8lkqA_5=eos~|l01lRR8 z6fB$chz6k2Qxs+Pz!~>J31cwF=e<@Q%C^}%O8{;@#(@*qU%2@?7)ayuk(Y02B$@4W zLXRfh8CjzYfazY$uXVhxdlThacT-$IsP3v#3elu-%Q zEUeFeQV2ost$fn@@VdlbJp58jV+85;K^gOoH}O7~O+VI6FZ9B{a3lB^-dC5?QrZ|Y z4PW>Amhf?W07+{D&ELnSLDh-*X;Jzd3>QB>wK0y6cZcH@6U7-c#giYxYu$m&{Jb-J z+!x^iWvuYbz%crK=EvEtlhfe%S%FfK^&=cuU*>CPoQB{~3a74?IoKl~@-Wh_8mY6s zR17&igLVfEvUi^ALbCf_bNPub!X80sD;=>B#JwGyeqC+}rXC!*-u+@2kw04PYy5B< zUG;0z7;dYFG!DBe>&_u4-6NwgeRc_X$)~Zh{C*D&slM~CBNrf2FT6Iwb_9Ni9Iu@t zTY|%U3CA0|M$pj5bQY3zA2?pnaNwO$3s}mfMR_O>ftErOfrDxZ1z#Bs2xJ+8FU(Py zF{TS();;;gVtxeB_m5Q%_AkNZua<{?e;Prh65MAk9ih1G?V2caBDMo&6;@$PV6_-X7(IG3r0s?o_c}f z|0S+{PbZtfv+tCi(CHya$>yHh!?c7x?nrd2ntBg+i0nQ!K?}gR$S-1-Hv%&Yqc=ww zmO!7X`-W)P2m-f&bMN=xLNW~IEzce{!i(L-?8iBWfosI~W#En_bV}P_@uml!PhiT? z4Y36%8jIc2O*;x5ClYuJB&H#8B{7OJ`UB8J)aVxTO#@dYSFReGgC1Xp$CBTwk&09@ zcMInXI@d7l@mRPMX_?fr{xVqvgG;TKn&yU4U?aze9gfqmxR{mnKJf!2b&9Ec-ZKrm zlx`-wXU@Scz8Erm3^CG-AJ~Xem_cFoXwdUmCwi${Q~BLs5tJn9&8QCIb@cGb?=hK% z!)+#KE{T4CW{Go78JDMl*R`WRxnd5U8tqouWaj$#Pb#ZYoO+}^O z`}+qz_jBLR`#$G+&v~A60$WirYwU@ED;EMTYT5tjBl|G@ViseqfrFCntIwCNB^S)u+@pDUXCS zYkLlQ99uk$$N%l(ZF=2?Vb`8-PA2bTk;5;zkVC`GzkKFhp3j5xo2z@ICh7Ps;gsDz zXCIh$uU{{sNBSx#ZwOBN+XJ^l#)U%H^3XN;@|vV$y-@%4R>m18vJd}sY<7;MgF&Jw ztxk&vsePX$HnC}VEM%Xbh4xciW21fXf?7TJyT8=)$?1iQ`l5m3N<5sC&lA4CtQQw|5`7s5!y4c^2|6K2z)QSs+JDbruwSx8+Z`BtI*5k3>`T^ZUZTs zT#$K0BUAoRBbdzKJUaPb2OHwze(&R<=~Rx9s%$SDWlSh1hmV7(jho)gW;!U8wn^^U z$b+2E!WYh2({XWH$4;52zS!~Y>_f4P26$VVO||{m1GEaymLY8(_8LWA8adhv!imSa zt-?s(GTK?qX#qN99H_ecd>Ic8d?V@6XnUBAdb>4RFfzZ7yI;go`Qh9Wg2bEW!CuYC^E#hEw5sEWaRHFiVAxv@I zw|FTYe(-yJ@<&?_glZn#7VAF_s%U;hseul9w{x4z9N6I6Q^4|bVt|Q3l8~kh8-lwQ zq$$4|1WcR4v0{%<-Q*U#j1VUDsN5q%65` zSzcM_#cn!QG$)4BlnMUG{W|m5g#nZIFF3XTN8*rKXNEa-6c!Bq&AhO_3a@M#Ex)>g zoYQK_Kk7tdPIuQ%}QNlBd*1_1W-kYfNsRBLfcIpdijg+})evVqE5JDx@GFr`T)ZI^Hrp4kvTuvc>!`!s0F zWuOi9E#`YkcyrUH*U>c?bvfUgd*|5m|%(mTW3>Y?@p-)?|VSX3iy@*ND2T`hk z&#br#zu8H8hRm{2TDK!KM}YLN`JJ?nLh$*Ojkxg=Q98;V3!a@cWkc@d_GbpK7?3er zz+ua=VWaK4581J!a6#?nhT|J6FL-v#HMy2nudHg z0*@=4WP{|^%D3gK2;W%3qD~P!te`!xET|@ZMMc(pidC+{_t(Aj6?P62-+xVTEWH(H zszamB26Dl(m7t9~4ch~Up6y@9gPGmYYSmZiSpIoo(&u$ILFnPJ`0DH?u60Ox_*z)a1c?N>_>MPa4kMT-onF z-wh78CS5ri*9ca=Q3q10J-vz&EFm-{M zE3uQr<-Hx+u!W909v1QXrk>)jihn7lC+cC(NQCk9yjk}) zLoW+`#zEwoRu{i69nOnCY>!>bgN!GaqN}{=_`_&dH{r=pITdeFXx0Spa$lQ) z9Ud&c=T_D6iH1uPG?Sfs9^sv3e~UG}dYxRoXT ziAHeDcIVu{-!*i&lDpJcjxh)mk#<;T-j0)RjatH##_@FbS_dX~6eddbh3^)!AjW?v z`q>34NFUk$$9j|oCeA+IXE_`cyz_&Zm)Z|pMn?Ez!lOJ69X%9xhmMU$AFNOD4dtjb|yUP)#LuR+r8%r@Rx?S&EMZJvx&sb;_nj@hwEWRTTmi<6%BT8o^`Sn<6%(7!n5(@xg{!wu|ZeH zVepuRV=W3+6%wRmqdIf zart?4vf3X`4`jc+d6u8V(_3FVT7N&G!%Cs(haPEz;GA)hy+Wb`ZwhYj+O9EZ_lwGCISU`A1wO_jwzZKVJOZ$D9ki zXd}sYWIgs>^I;#@#)fBkTjit67%;<}ZhN4?Ci&>oBWH_8K~h>@)+x0dwc}7(l;FH0 zC3n;I+;+UFa^~?~TQ2PXp2+t1rJzMq14G*qi!}qNXISZtj zkhdd1AX$kG^U_Szc65wF^l8amo&-0H{=C>3Bun_=v{ug=(nn>%{_8>SfD09=j-wfB zbkwLe)5|1yLwnJrs1wY9!rym$jJL2sA?JQkPx2_7IreKo*4iq}{72u{P57#5teJ^W zO&c0~l3k;Hg$rtOY}K4JvOe#HJwE~)a)y3hd#1;L0pr@H$3|=rN#iq(An~F$wfRrU zrAmysaP@}3o?$E(WSS?QYD52G?=`8nxR5Wj;?N#v8vbk?2&FdA;L8^~KE;v=oSJCb zsNF@uttwcrewzztr`i_F{iDFGzDJ*L?&*dj1C;f0(2A;SG^7N}X!x=4tn>>X^4%K! zpIDLpopHZD@87+@1Czc@dV~v)<2{y=`tu*7a7~tPLMWXDH*9}DHgcpwZ=RIQjyp8i zFu=~&9^hbIS#bQx6$7w%eCgG)6w;q}`3W)PwBz4r%E=0c#z`Ma2WFHQ2h7V>N;zh* zK%!dqK=EWJJf!C&9w&Wpqq?+K7!7k!Z0qNmmC5}ebm5I@*V{qZ*|4B~WXpTJxBU+7 z+sbi_Vy!{OS{>NP|E8QU(U!IoRux9i}cl06EGM z=JynM@H4!kbHIs?>Ta=bZ9aLxf4rA>kGnKM_&NUt_H#X8yl#Ooo$%Gf{GUNjzxIHh z+S;j{2jg(3Yt{4CD|EOjZ5^g6{0TO^IFt5CxD5^Co2VV@$8q8hg)>d!@}~02%2$;v zaLGIMSLX{ALY~MRrHRsE^OiGyEwdcVsHwD3s(G6l56Pggu=}cO`Y;|pa*8Bvltv)J-Oc^`(-}}20rGA z%=-jVo5iB;R(If;(dYu3nK67hZznT-g7oLL*;Fi7$AY90`vcZMg^}<(iu)pHu>4<8 zbYU$AJ0+^JRP6^qV={Isp@8(2w%Zq|8x?p1-!r$6{Zs6Ap-z`~Z zj)SL^_Ul_d>4!?CQzPz`gOG5zc`1wFq0Bw&Eo)T9G4P(ar8?O^w)~3^T3lkmQ#JOC zpfME=+_oKyGNM6?#v8Y1OUIB~yL!4lrXL*cc29qc8H5|XlLa9b9ccN7O4HUF$9|t{ zbqkhrAa%Lz=Yl*IymtA}V3OMjo4yBW-=3pE=B4JvQe7O>v|#-S>g+0;7AJ%xaNVToLa0%5|m}caBd_hh=h!ek5RZDcR?DjEGP)zrhI-O4+-twv9v*=(rGZyw_^T|x(UoMyP4K}je`2xjw8n(abc$2 zX{_Co^ka2hxqd}>7no}aoM&ukK}i{`=WHVJcZvDEt=U|-c;B^4*^Ui7sgA6Y-3*v2 zZCKi;!Ungi+Do`eD4oE;FXi^duP8XQqIU_6tk1CD{rTnVI-x*fQ9$#dZlI(YHF;XJ zqK({hFSQsN{#CO2Q2c-1I=8H<-~=5k9DQ7u$4?Ny?4^ss=@eWd&al<-=fcz1H9-Xg zPr29fc|$H;;CQO!^q(WmIK)2@n&3!yywS}AOUd^#P_jKh;SPenao^#!pF42zHjQXG z0n-0;!tDMjNrKParG`r$v%sR>d!q0#!PS6YB4g?_;Crlhr)`LXA0Db)($gJ)*v1>H z^GQEymSAS(W6=(bPj=DMkr~H3-#Zeb>PF$HvZCz2v!Uwnoek*+u&*EONWNa zzZL999Bi6U#tFRvsLzjm6-M62Ww_ z;8o_4uS3Zs-}I~5yM9wA`1{+NQO|XOuLkwaV!;+18`|o8Y$XlvryAVwDB!|FYQZCY z(x=^ZGJ9S9o^}lS`|o7&rg4msRX%e4_b9C3<|;{$^|^G)c4N;gDrB!q;_Z7)gUh#< zbvzRu!>^~S{N4QeVJ>swlMQc3KW?kEf7Tm1aGze0G!+|l zk1lmSZ>$p*)Q7KY>!$&}oN09;>+BJ(7Sz+!4>sD$dzAl@zU~#PJg+}*$BS8l-zLOK zzr7XvuMg5k;n{My+StMZ=?jnDqaCQQzBsfmp7d>J2UrTGe&AqC@3jEexqevt=&bhX z*g=r_w8wUpdk4A*wQ0Z89!J@i`rr4jvUknkl})3OU9AAJ5nc{j|0EM?qwW&!Gde% zh8nY1s3e~w%*t}10b~AocR?Np_l|oVIX2r5%X%Cpn&t-KouZ7UrFmlXjk(Zgk#q<}`Yjt&*c)l+n`Ggf0r{#u>Vk-+_ zTXaRz$yXfA{UA}*NAi|OHnw?c#4_RDNbgTSI|kOs3XVDi*TS(wZ>@Kka8X9|@NGT? zCdwFnyv4HSVpjINC11=+pyXu8#g{o8q}<44DjjD)z!d?%Rmx0g))oJmn>+|}2@;0o zj5cKQmp8aL5vcuOI-iN9d*)?zALQca3GMtxErpiFI&0Tw86b~xdRhp z7CoXCn{zSTtW_}hQ6bbi+dSQMm#oh`xIrcP2UX@%k@rJP*i~P$CAxhI_j~bY9?~em z)r{`uvpPAjOjy6wD6<&nin12$BDw*mV&zn+iX;fHvyR+!As2m)K!;vXJV->pwNe|K z!Z{r?&)JVtsAHX-J``Alx)~!;jsw{seK5f3_`V|46XIwx#);1`W1**iLo~R`{CO)x zdxM9i(&9SrMuLTbRa_Kr3R}*LmBiFf;f_B=?0-AUkt%rT$MxYiAbwrL|88^{E|j{k zHGJ~+F+pJ&bg15o@9|c z{gE}!8x-k~`ETo$1tbps9;%bOc!q+;Rc;;e*SK(S;Ar3VB+}FZo@ssihzgmjB3SQo=g!*+d?%>rqkDpa>7A@{aT0ga?K`AL zPIiK-eg4x~>2A>ZXU(P=w4#gd11nj=fAm(^hpvj@0^@m9vrXF+%HLgXQmR^tZV~a+ zp)Xmm@6#Wh%bg{7xY7B+9a6Vjm)8^PX%-8OW~^-X`ZuVSPThA2o`Is`YmqbDDU@Ae zV5$0c3i&kUg$ja;5UjGUCQ28;4ao&v8FEEfI#u%BZ;a@$WIW=ZFyr97>%zr@*#&q% z)KNh6>T?*nE~_ucp28b<^8DA-PT`9OtP`njWmvJ=#%_^!9$ZRG?Xev!#ra-^S2Rf- z+xwW+$~x~P2(vxA=e9vU-VAYW(l`(Yk9g^=3FJ9ElfUW~G#X^Be|)#4X#%&t)gFkt zNWoF+ckUg+BbJO5n#607e$VO~&943Hg6Q?C2Eq$l@%ZVc?3hC|6e@Zjw)i>WC51AL zt^9O2R1@=YTk!@~e98H2Ee+IY>Vo%sZYlejw&2yW zZM=t8G!(sX*xa7*TCRBRyJ0CZN5cAsw0!dfh96K^w&}}9e1GB37I5Q&J}YC7TUsZ? zpDjr^_PYz-t)5&mEZvGxN=2b>MtiaQRsYHdgpYCC+c_Sg3WQmG~o|ja7cz>Y%1S^3;9xhynaQ)l6iY6Z^F6IZl8Ca z)ij0Pr8gtB0*Z0RyO|*MyZK<(@%O>WdBs>RqjC7+DABL*mx;+VzJ$JUai+LJ0osj+ zY)wB91)oeND>a9vup(Gy--I0vHeHtdy^gF;=$e|s59d44_NlY< zO&U*^m2?q3C+*Iw-7V-|u}|dAFB*mhv(M?1dwlfcBh5FnX^?P7t~po z!H~ezON&yt5VJn|n&$;FpW$GX&!a6}u+=tlmd~geRa$j;_cdswPrliJSP>VTe_X0r z#HN8-)Z$eSD<|-DIU(7x6ufogUgq*AT-dZ{&$)9hoe)vpSn=o<`R;YK3R0YAq602s zj2|O;fcLIxfv?HA=-x0FCPD|XrV+@K{;@kG+1p41ip+Us@0osYkx9$WHsj}wg*B6rF5*Z(DO;n~K!w^Pae zD_T9F^_gHhW~cWCHIL5QjD6B+smJVm--YM;4S^$?Idm>HIN{ z4!L(<%z8e(M34^VQ*ie@iOaNQc1thsB7K9OJ}*jZCcI^<#xwrWc8tucvN*JD98Vl) zN+^981q~Bn$=||5Fmw9rnUq2@cfm()v*2x#2MD2L1;lc&Id(X81IbH7toG2d?;nJ7 zE9(}X2$rNwig#)p1HVw(d%MxNOHPcSWo!ewKE;OKYh@a;3H70&4lu2v(HTU7|6S| z%w8d{4!%V7P~2>}Xv#jDJrd8vzFZO8)knG5yQzdFC{P4q{6W(7SsWBHbbfx(lL4j| z0`%pUGJ#{fbgK!8Upeosi(<{nk>}<#dO_?BQ2b83Ur|zqXNHQ_>>|1+m1jpnUms6~ zsJM6hQhd31uyc!FjASDG@egsG9-YE{vgXs_LJa&Ey)uqpryf?jUE06?3>SA!@crjg z!9>SjKa!@jxcE%q-V^svZf#(8>mBLC$)MAv!bM@m4u`W_i(nP4;&E6L2P@hsJ?ftr5Ok_5 zLhuv={s^VbyW_&Z$(;}G3MSM-Lz6Q9N3zbr@(;Ve=rPewqTMd)KQ0<-NjfE%mcYmS zeWFS!9L$`j$yjSk?xA`XH>A{=5XO_-bh%{;xBmL&>hiG+&2MI>CJtsmdyDn1>xO0M zyg;V!9*OV0=e8_5!uJYTJGcJ!$jBn|YAkG~n&RPt{C`iQ$4R`XUb{rUZVKJE_Nt>{ zIbIZGc-FqpfuOWC$#%ee$V&(ZeRX}Nf~V8y+4Jz>nbJ}isv&6u~Q0dA!3tW72SQ0JkJykZy=|2S&uy*S0i3<+;RyqFJnCdY5K zWOGmvldVz}7;wRF^}?ODOfWVO`YSKdhgOn3vODH#;i`G?{qa{^4AR-r*1oVG9YyOV zHz{%Pu)f3VS6)Rxzv>a5)y6^A-+w{4mzxY!3EvEPV^l#QX$i^#rQoe=%Px;-CWn>f<;4kbYXRFom8`RgXz1@5>J%_?G%I<=gIn0Vxup|R_^zyf={SjBExooaQLUvY5L;gy zFOdTZ?efn{#Y?f-{{1ccexjEY|7mFMMBYcJRjZTm%mopt}t4p6_Vc(=)bL(_wk@Zf5AW9NfUw z*ec_m0--V4O;3iWu+y@-!}2*DlJ~pU9}J(sGY-4yF)f2V8FSf}d#T_) zTI`}6+y%itbD6~&%{Vr|iCyMG!yBop3a3cClFk^yif18)%Ea?_7Ah6w^`{P@~9qS4kW& z;AzBw=jJ8)H?(rdcQKpqcjzf(zwi>iO8BAu=C#3*WdGdjdl8ycT#Oc$`)@Sf$%O{J zivLQqi_y?!Z%`KD8@221+!ufH63QL+Qj6E+;ngdmFScbw!Jb>U!fQBFD6{lf{4n8} zKhkFcE54Ruc=2ZDv!-m2GO)hp;#!JM480MH0ituAeR=hRWfJIAvp6{pIcO==yVd@4 z9HdT|`dH~H4J{A+{uxicd!Eg?!+ZQlz0t;s zTKJOiRh^}_J+>6Iwo#P-c7qEhHfOBh1Qpbcw_I7iy$edI4*AzR-=QU|D&*}Nl3z3U z-5y!Xh3W7u+xPp@ph`CDU~LVlgLr*y(p=n$?Qz4ueF%Td2n*}96zqhCN7 z4t_O`Xh!{+!I$$N)6g0mk9{Y+#X(PZ$>mNO$jkX`^eUgg@%1-Pwjl-G*1cHtE{O}< zvxB&NWFAV)PqXLx;$1)!G$=Kmeuw;azIQSY(@_87+y~uaE{OX&v5z4QIJqzW)>9_% z$ib=qY7S6v(}@nx-b5~}(1`2xjqQZ?yGsrCiIBXOXPH5;Lo=4UWLNE|Cv%0uHlLsT zz=hRs_PyJ;j)6Dj^494-AUHOyRwO}i^wGNHq%0*SZd{YO>!%YJ%O#30S5osKPgpv1 zu$F^4S<|9I%syCqTt@qqJrhnO^~uVwVxS78RB&ZiEhxw}ZjZRc#R9`6uY+xvxHbH3 ztRunep5V79)|VB7h!?z6|&ef~l5Y7$E9XOxgXV51-s)oz|1AhkC6g z!r2$N_`OWh@BBd~^3A(|d&qMmR!%>rI~Tx8`qh8=Z%IB&)N6F300WBhg;@CO=A+d!_-2QQI&aP`*7L&B&+`w8I@sZ#h<3w`}t6sP!yctREj#AjZfy0cp95>@l)nxD!lMnof#2Pfcr`} zEPSl<3ie#c?+YH7!s_Y#F=t%{o*y_-e`lf|1VXoK_Yq!a>!~Plm++{0lDeK}PjK<% z$qVngy$j%1zbx2Aaxi3b-rT#xL|>us^Uc#JCcH@AGo!JWf$br&5tosNN<#&h9HG;0F^|_KL)R-_0fdMDM~9b^*9aM5XH$b8x}^<0-%D z8IWe`(@>VkfZQ(K;E=8L}zy66y7N=nICkZ6s->X$*=OrgTyV4 zSz*B?7^wYmQPJGn(P^tG))We+EOMx5p2GTn z*Z9TUiqR(JiSbXNeCRmeK@A)z!kp;We~Jh`{|gp=Hn%Dc7=8C=RFd+M-@f7Hg$GgK z@;mA6G>L=Fdyja=5gx@ZT3k6ITY*DYgx4<_%!D=S$?;PD<+#}_qVOE?Mfl0>bvWal z44-?{mkUs{@#KFQON@OIVN!pBuan^OvTt$U?;fN>REd}Wu7(LL=RUSPGw~63yINE( zCAeCU+I_8P0Tr4}^4DIu(gnl!0xBeXnla?PLe@xGFaCAmJ*s@mCH>Gc{#uWa`{^I+ zg}2H5ix#+VG2eFz(rSBG3q_GS34>oYp3HsQuuR$Jr8~j-3Hv~uht0TsqJU9F>JHlT z42K3t9)K;nr0zh+6t)(74&8DtL1pV6G^@)7v#(!kR}L4W_NOJCGHl|L=K3!03`v5c zCMsI>$8&I5;18!uiSh9I9M5kh`CqP|FN@GgUMqi8(YY$V2)m6RAIr9U1BY*j{(PfY zge7uSQHx1l%kj0#WQS@3#D2Ke*7qU@x2i9iT(T<$5+1vM{6Amq*jDKEmb_0^u$q18 z%0g6Ld&5P0MLw8(@tjL-D!`Pd=i`Q_h`;@WW{p@*BsgW|YQ}r#qj$=I7<=j?IKbrN zYZ#fr$43M$my>*5iF0|FY)vsz9iK}SXS{*u&F=TrcNe2&t#!35$=6N&E?~9)cm>^c zhZ~P=$VC_Xp(_79iLmU zqci{ZLNb?(2ePl=Cm;H&dkHvv7{` z7UaSXl_x_1rVKPH7GN9}sDrT9;agu!xp;ABeJ(?Xi5LFpKL2`_i?lTgqWRIq;H5g2 zr9gOiv8=AkQ*(0OKYn<-l-zfgl%*$|=rQo2;YL>jO`@BoCn?34adBIw&#`DvCdqfi z?tN*cmv8MW2BWiWKu_eL{wENHBu`sh(UeVaHjs_`Z~Vvuw?4GF_?m=rI@SAxQ4z5wTDRUO zJiM~q)kbU4OPHO1p?KAUJmeEMv9C~yg0<|nYhTDd{PI*!@-@+KC~-e-#okfa-aG!} zka-*4kFzQ2bs)ON-D?^zmraMDw-BgV$XdieDfAf z%97|%`s)|SP78AYbJl7}vf6OIcTVr+l?+&{9RKaAPc>S7j~dxHJ^`K_wc^mVY`AA2 zOHqs%#w(i2FGtO%8#F38pc>vWxVjeQR|-rn$g$6FdEpR2gj9@-1^ z%Ba_M=f~lVqWK2V-iLTpzFbCKViF6PPg+!3Nd5cwf%&O6T$o*1yYxXvBkXfnk#d^o z<4Zz9w%lo>;k1a%7RN8WFj{lcB~Xvd!yTmllQ+7J?q8htsjZttw?*G--UZO%mbl`- zOC*2wBfVZ}yGa9-wt74}#OQ(KdW%n9C+WDm>8n9E_QL+a6qdHfIQTQ#SAWP2L2JtS ztnhXoo)g*gbZ!Ni|9z&v_g|rvlmOOlNsLN5%h0M!dFn{lL zqU&^Tt1)Tq9tF=~$E+XLWL}X&@W_lK1GvumMf_Pv z-P*$_Lt5{3&}sOR+U%D?be%r}FIJZky^o{Bv5BRwq<;J&xG(TJgZQ8}uc@L{;rO53 z3IhKTyk5A_CX4K!5*_Ab1<`BHPj}ON{)L8Gvw{BnN7-QVV(R->QlB*ba4}%lmsVVE zA6GH5lL4Q?Dp{g>Rp?$+ zbE@WKXUixU)~;=Ki*3Vvdv<>OSyBfYRQFQ5RgL}C0-pl5b756izVnA2Z1^ed`Z2Muu5dL_$eeaf5oPTU5Cr*k1)+=0hxNNOKPO)y* z-GK=R85~wPt;Ghmlw_f;{xJGq*Szy$h=w27ksf15h@YV2bC0tU2R5u?%36PF#Xl?j zZW^s;z&gX7dk%|Kqk#I%>+jPOaEMGfUZTqejo%|H9W94(m7Sr04q4}7RgU@y**{$t z9R9WwWX|;cPbx?Fd*NjG_WpLFBlbT!?(0svytF)SEk<)JlVwhhEEmCVB6|i&8c9hnfI88b$fZes->UHO3-( z|Izstc6CxTI9_T#?MCLA%Qvp3MIZ1(UVNI)?S3A{X`JBvNg;Ya>7&`_KM_61=bJa1 zFEtSS-2gPATRJYmIqyyOMbGrwLnl&*K73>CqD%jcgW;BwujezvaG!u))4hBi-kCEl zlr*G+6>DXI+Pt_J9jvCm6R@t2dGS(b?H^n|mSi#r0a7QsO^o z%cgk#A?Lkg>V>!YI3&D|&Kfnnfu?k$iX-oNm}MzT!*V(-%5>UeH9&k6?sfBI3+h3^ z{z{oX(cLbuI(F+W(G@C;o_QeR)C)BYJAUwybLxC%`b+rBN4SSh=X+Ys!#{g@2RACv zp}zOm)0c$5L>6Uv9!qP4O^KDWb+bh0HGknhZUYTF{jao05nbiJF59ZH%j3X*Z{N1We({@$&^j>$*!E-oeYjF}bf>&Usb&G1onC-K60RnwwtM6c(& zbH2&q<7{X-wN=HK=<=eMJzJ;2Zp8@$-KGUZM_75*_t<{v8Z7%yfVxSN)O)ZpRBz}GLrkHwIGvK_MwUbz5 zB@Vg>GbImjVWaTM?EysJeo`XmgdjPmj$6ea2UZh*)ye1f%gO&rZu>j)M4r^8MLPQP zd95fC9>@}qWx##!`|r7#l{hikbxH5X1ble*VsEb@(K!}MRlV{a#xn55wDU?w1EMhd)MvPRIS8^ z>9Y+9d_)fuozxFRPku78`ftX6WPR-CM$B_)SadjdgBe->4_^B_PjBIXZq$yar@C7) zdQp<{)x8V|S#iQuyRaIA4vH0I6I^{`s_X1Y_&~B_$i->$y*8$-rS2s7l7Y1C|Hrog z|2qG>iX6Ds-MF`4a~tW?{eHTL=vjSDd8|`^E75q_zUEA_J~3A=9iSazgF{XBl$D|74#43zQz}yRJiHXKO2-O!xP|#&i1%78lX*b3nn-Z?V15z2dNzn8i4t z_P;`zFTwcNUae(WGY_eD@=F6qzVH2f&#W~>*A`*g92zyR5$qoJPqtg~IwSS{%NaCSE3dLSpmdPb$TPrW^^2SN%ZKo;fH_ia-*SlQoz1>hBR2WC2Kfr@i_Q?P;~H$ zibktwLAhdrtDhIdX$HQf!*Qo2Vyz^q&+d&RGL7brAbc1h*U zY+WztnkIUAk$92cBtbK8dWbf|yPK?v{_h8S&2x08gS(Yl%yUwY+weG(-?o(l>tvg= z6o@{6s?xUMIq{ENS}3w^>o1~PKK6CmD1w9X-3Lv`oN(-1>DoS^Lj~Qs%JnvS{ZNsk z+q{(E4>yh9q>%W2Vh-qv={dLIw;PO>R^n4?PB*VPmR*Ivs(Snz39n1L*}H#$;HOkY zR{a*DgU_?*6Q~>|^;q49+sg?r8YOL9%*RF{;R}7_;#N8K1Tj z-;Lnj*fJ>&%x;w3kWt-+v05gEQsjPN5}mJKI#7in&z{mwawnirXii?4+(!zW%TK2U z6Wlo0q`N|&=-#JVx*ri=09#W2t?@Dr6j}Kl`Q_Y-l%Dp2X%csmJ<1Z^FRnq~*Zp5y zmvAB0;bq=l@;*jqr$v4C4x=15uJ6tO;U&ted>jeBogC_v6r36bTjShCrnAJq)Es|BDnC@uGIPh8wRrJlA+Is@rCcpS~oiyj`bwgh`*wNQ*xrz zd=}xOrghO3zC_2lLDcqU#srR*{u+=Z^@5Rgn;*&Crs3)=tD`C{6kJ}Wb>>`Q7s-22 z=iNNT1?fx`ITq2G9}fw8w#<$L#|N_${(pYmAKK>#WVK_%`kd@a8Vmm1jm`bsz`;;5 z>N;(D3|qJUwEIts3R)k6tEo%-LG-_hmZ6YAc$^r;ctiBX>K4}wcWBNGR}g~a|4UmaU48)=~F{5(K$8afJb9=&D1VU9l zlwAUUZEL$czDXprmS5`=UZ?trKYbHfpU3yjCU!b=fVPkB98COxBK)h5mG`&dzlNpF zWu)E>z1>-xr#L9;eg9Qm-5740+gmCXNrf)Q0jb27OfWOAzmy(62pvWLS=JrkK<GN2y?>0wi8L3atF8?>iBlY=D&n9dBBlYiy!z!~L4*j6| zM>A(+d=N_cqjcX!aG>t_z5FDi3!Ju}O}i4?j;HQ^bq@H=g5pmr%Y&UcsO6L4DbX>8 zE!r!xluD=|5e{8bCPW|Z{`~i&_Cc5$E-phi4m^)}z;93L>q>2-e3|0yn4zDuzEp4s zj2!F+*0ghQ&pe*dkH#_NDO4&HBvRq{p6<5Q>-%BRaPIc?I0&zN{W-Z83H~ey)LlXN zr?vKyxyf)cN51*M*Leh=y_(+3U4G9&nY}lwTYrwB#5~!@pLdY=*|Iil+awcK)E?rc z5*_1-Tb8o>?r^|z-?|$rq<)YsdrjkLLmTPCUgdgKUcoo>vVSDfMRtTR;n+)+rnK5YxPGQ)CXVc%v(>Jw)Ai(kiLd=6INgRL4bVUPlLabb zlO7YIV|eJ*eytCAW0;%x_n-Ja;#=70xYM5K{V45+ccxYk!t|>m#-mFdkdrj7v)V#@ z=rTU`-&5MqI_;Je0i0-a_2&3=981Y_47 z!r!KQ@mxovurHm|4==vj7n#@voRh%|gYI*o+u`TsTR&;UPxQpJK!^v1Yo(0?np;rQ z^WQ&TuL(3~&6>=m6MfXRomH6wz1Y$?xLd29g7G#JONC^*;YP8zZpU#_|5E4q#uNY4 zpOZxoT!y*eGc3RtS=5aEUTf;)f+tW~L3b>g)EQs9#=34%rlFgEuzSi71>YT4Is4xL zsfU$b*`97r{6MPxSA2}=@Ic5RE%O`E--PIuZ5?}uzs30ZXl@f&tbRkTcm)-5D#nzT z8qx6G!P$FSJPOVTzGu{Y?gBCSplicgT=*({*foEe2Is#$8@|>`@-A)%>;gucacXDc zj)2e!yfgpww(^ip@H@T5X4hgGuA6sc!}vQ2ez-KOwX(JgTFnw$?a2DD-EJm|nh^i{ z@anvvg&eqkxxA+Lc`L3oKb*cyngKq$U-PtkD$uh^S)k(U1gOkAcx3%W;xj!g*=ia~ z{P0pXPNud*w|=;D=K_BkSi4zVYM^kzuT@ObkJ^k|Sj$ue2tJ2Dstrgr>I6~g3#uE) zedO_oZB}R-1zRp{J7`G!2J<_tsETBr{kOU{h!P#zT6I1}53)Z0f={=f;Jw2mb|=5x zyf}dcuP+zBYa-w4;zK`qi~rXH?L0gxDfsP0$L|fZU9ePd)z(?!?>{6_vnjoa=&?WN zgtlMcK%V%O56&NGFjUrL<EH@EOqGsy6#2+r5l-~RCLeX@7&aWF z2MAHECy7oyLinDHD-|L?pA=HG?<-l@nrJKxJ8YKD3H>42W zaq^*?$ePtd@Zfp!sj(GfXyZBf(B$zLHYQ#_`1%JGZXN9QUwN7dIgVMjw{&O_$_{<{ zV;K+fmdD7(v@~OQyUb`rzywCideE!GI>E!s_tBFZH01i;lYYFN_&g5f>KyUw0!`m4 z<7Giy5Ie0JL2Vp_WN-KG^_MyDY~~T|(jOX}Ed1UinBI=xQVM4UsVq`2clzK$<6y!8 z1KoOpV>3Tx)=v-|^S#nv!QwF??u?6HBGJ9C9W~&+BYbsBvUk%F6*|0p#P=e@!yy#yi*z?J3+a=o%F?P4kyel4r=Y2;je|VDo zPvjpF+XHlPdUjdB!l)gm2HoBD362%J8~py1O8iXJ{{0I%V<=^7{JrHQ6{?4C{yK!2fGJeFXayg+zXUtmRH(J1I`f4)W0(aZvh{y`h;I5V<9$T} z`R>Ooer|41phBpE>1F&$;#bjzPR)@);CN1){_ewpRfFH>5?<24NVfOw8Il!nE88J8 z!zOy{YpR7DqEDAHpGh679wYVjO;%RuWGWjJ*o~lw~f9XOt>G& zO&tpx1nzQ*$zL4~#AJ9U?I-cHDfR5LAzm96ChsnLMB;_Mf>Hey76)C{3%qNY9V7Dx zeLQ27sGv9K8_^-s4?eamPJ6&0#HKxQesi6~uT8@(6yi5inEMs>I;3V#MjlJn3YjOyr^bl>e!O|1Hx+aS@#?z!{V-FuZG|F< zJJk!OW6eW2U@z-L*R!XAYtj2-lLc+azAdWVAupC~N`1F+p zjj@FRLVTJFGUsve>d1n)yyPNC&A&cLcW1&3?}^O*iaspZD)me# z`P+FiHSq3jVehKbJWMg4FkEd!`g0_wY8`wrfeO-w#uLpI;CX$Nwp*A92?jo~avp=w zds#33_G)szPO&2V_YhyRScJ^JrdAB2O??f?V2%rpp`qkVX5+^(G-oTnH!7vV z`9&k@`v0Toy2G*jzpzRaiey9?S*h%u^*Bbhtn9rvue~A?va$&g2}ww@lE+6Xt1^qM z2493UD1?5`?@!lzU9abTKI7cyocq4d`5CPG!w()-mr4BkPUd6rQmM*L)6Ls4|^Q3C(6`Yn&%O_8$9dr8|kUd>Hg^_;N&`dE; z;i89MC3-!c#x=s}JGO}Y=>3510shwrTi6SXVBc85@72xUrxcjNia$QNa{tXT{&Y^j z*jSu%}cK;mlyGRdBj-{^QjcLMRN`WmnZL^2?)|(nU@AcxB&nqoBDUdvFL4=sc z@pUQYVo4r0WEjcQKv|Dj8MNO&5nG0Rsd;OVP_~BGSDfG#$XLVmDptF?Nm+q+c959MJyBLM*v&JVHURMStl(n_(4wvF&cf**70 z`N%Te?KM0tg7(XlS~K3MeP%SixelLhFl*tv*oF%q_v4x4C481*E;c3Q7Gr}Lm-pdo zHJGJ#iVF4BGOU5A;F?~=8qw0p7yCo#>D5xzI0PkDF&Tb&)uiZNJpEYsvV_?(UNd;- zfY8VYRy(i98TMivXL!xeJ3BRu_on%$DSRBmEX?Klchpy~O|oFOeUu+Cju!vZm8&b* zXD3y)zDs?$)lq-flLTLiYgZhfsTsk(C)7*7Q=Pys+dfV^wnpFtqx7U1B7Qv`Tol*1 zu!6M-I1CRwn82_l65SF}_Z7;n%1v(U$CH1N|Bxvr__e)MHr}2in3rf2b-mC8uA+CV zHG#k_`=9SKw32>@QAsIMs;aDDCaxo*gB}DgY2}mh`e-wLaz|Bru=XK7QryYU4=uQl z^`P!QF~WE5p1fg8ZYD;>&Zu&qrIz4lIR2JoF2k}ee!GYW-dON#(08-TYdCq^2RXTg zCOrG2uZrH^dYt-{4nx**6MjSc)jy~cK3N4n!0ekRr}r%Rv(m*>6~F_uz~-y?f0Oq1V?OJpY3vJigD7W+#V>WMyn z_7OJ&F02NtRhHoYtab;pjeScaSF?sIrY>~IjZI+nC6Wd1@~eao{Icg(VTkD9YqUQvjZ#|}eX_R=+0iW}_3&yaM zqaPPoeO9oMR}a_j5qV_ZUnO}F0{3=?B)sg5?!#FnutIIuW!&T*^Fg^|qu7e!nIa>i z^nFr{K~<$>80UCvCqL-*4%51DN0yByay(Y`HifLt-_^f91;`{2_ z({lp}9pGB@db%^A=P!;dG8LG>&t0ovz599?e>i2mP5)pFyZG3QImLDb6J)qCkQ%mz z&sINjP-$(#2RME|xu^69@Bd?BsgwK!H$A7(BuDrkuAesAeI1jFCH-;f)?&YpndIE` zsiQB#3h$m~e4DU_zw3GVUWw4jCM7@hN~~VRgy@eP{>|8n8%GI-n&~X#>J`7v>)^xK zOn2BBC!(GhnEP^^@8K}+(wZnm?M~paPvhr~68rgNC7tnWLO16}vm&0yPWW{(?>)r5 zdhxK7>v|m_%lOa31=7`2Bbe27>XaBD`i@WgCifHj8A;h$Mu!u;hxhG2E)cx`&vcb4 zA&)1p$FVLYbH`Q*UB^l0vTMC~eaea8(CB5{>G@T^@S`Kx;u*f%+Y%G_cnF7AIe~lU znrrg<34WW{pR-10u>|i+A{xjD-CSy`TN%ePQ8yp3b~FFphyNF$@mQKTUlYOnW8B2~ z5@NnoyCyh+3w!gA#(x{e&zybZtVHNlEY-XIo+5C#Z$PHKqWJ_yp470b!@r8r&4#V{ zRrcaCdIxDF2%cPN-S#tVb{L~!qBM2PoWMEpkV964o`$lVQ<_hE3>zb@XoV5^PM%BD z*!eIb&+UI{@tS!Nllx)26H44iC!4kZI1@M_k!k0`_V#Ctobu+mZpI~imj2S&Scb3o z?x8chKeh=y>D#vFi7Yc1#|vtIEuwzNC8)YT!Dtan={*hXgfB+;i@NcM&e!MtZ@^=$@%3HB{i`aOxqUEFX3CxPkPndiAHBM($`oL_8c%Cc%^~pqiV^ToIBXgF( zy^}V}8IhydJiV^9bjb|X#aojqPw)yn9Q`C(eW&q9#xgxnwTO4~F=xEI-h~-@Y7@gA zi9VN}%Y*QxNvzoU!jRRoWxVm>V-AVCjo4{>%}<8x)7b6$^yd5gQ@E^)^nZ5)r}6Or z&N6-_cns{zFQs&&yRb?2)3Jw#R|p>~VY6_epZWsLcI3?x`qH1>x&MweVV4dI{2H{K z#(WsPYudO8o4Q?=j0T|Z7@ zXd5KvcCnRi#r!^@&${=sV;biXU^z}lTExHIs`@GTvy@$L)8DZIhTs{LEWG#*_md%`qg5uexEU;m#0 z!c6(JL~k5e#cdkD^n4-uD+9g3uPzY!B{0mgyB*wurC5liaU@S;Q}hXP{^e`9lDod` z22V3SyBxp$-CA0IJu#p9LvY!c=)+r>WAoA7{Syzc4+^Z}$6`vc z+LImI2aMP7Hpc3=ZTAU2QCPNwadaNhiQWG(|D)Mqv83;MVzK3 zL~OmF8>?wP*-((Zg8z5CgiM#{W7S3~zn2zS!6hiKTGK2%#&`y8>slkHvCQP1AyI<& zK6s^5UqN~X{}cL~=KIA(T;STJywfic79hhR_xIBZE_6_4gQml**Oxom|0pT2BwT?LNW$DxYPJ4-@`*fl0^YhpAW6PR*JRX-QAviR)>k%BnX=kdW9lqI{+1_E(gr_$e9?T+qWq%*qQf&LL5R-p^YfQV> zU>R%EN9+%lVru>h)HmYRa82v9lEJHMc=cN@N=u1myz4th=k!t??vwC}lRl~yKi#p? zs7T?(B1mb+dJUg{GOqnluo=G* z|MI5}R)@F#>|%~tZow(Vbo8HSe8)@~O1ChVJD4Q5os2m45EHbZ^@KiV4+ymkuxE?i?7r*9K@Pb}|G5Ifc_pXcVf`t3y{nun*nd5#zn>9(u#I*l<)7k& zAKt3-U=dF*uEqQ*hQ@Fif7CEfb*OCwi~DDwaJpg~=lOeHIGMn!pI+QmNFnrTbL=PI za61uo0EtUO_x#pyeXj)h)Xz;gc^%EEPn7j|)xX;lDa3o;Qn#&@l>3gEaSo9vqHbYU zbk+JV>T9rrW6#s$Wy-MOFLi&IeigBwHlpR~{y$f-tl-dgTuLcc$n||lOZFl5*I{9m!@m>@ zs?_=z(YA)i%9qp+^L@ZRF|;=pu&!bUet4ZHkL|?|Ovj%6&wUxk8Y99e3P!L`k0O6l zkB;NS0I&=6)5Ex=tCquQqF->xaPhet@qYHdJ^NVK=>ul;>3jz5Hu3j&TgRVIdvF@2 z*&=qgWxO)|_f$XgD7GES4I?Kf@JpuZe}xx^@k25ay4h1>n689zGmG&G7W%%lIU)H2 zW*F0R=so=^)eZrCzD^dTfr3Ll?V~g<2#g(mBuIteeR>46BUUQ_#v^|qI-1&Pk;6C>pcRu4AOPgZ+fj@dl89; zD)T2W4tBc_F9=+x^i8{hZ@3pXPz{Zmja$Z}Hzu~0j}yK>4QoYI7bfuZ-X9*-jl(#f z>JwWTk1?!F_n;(u5aDOxnbUpr)D+=Q5MGf>@C3EYZ!WdvEaG(R(|0-gpJSF=KTFAL zSMWE~Kj>WP2^|}!s~|NK!G{i0SMJPwj7iK%Jjk*pbn9Dr1tA1K{5rYUuX8B`|8ZZL z!BQ5X*Iz$Sc9Xsfqu#t^{9}gTb;tI9<0RtOaoUjS&kM^q&vI4J-5bqVq0;4cGVN(> zssF1$H%`Ps#vqZ(A|hYbc&?K|)B$v4%2L}1{kg;$9ankcdv0rytf;A{up446GET(3 zdR1L*AOEu_7(ea&2gSqF7`65-T|?q`J)aWS^>UxaA87uxn#v=5eKvpn$$Rh|3%#T9 z$gh3{-}n9IN5nXV$@hB&Hq))(YPYy=ZFE1z3fMR%I<2O$nf?3tx(OaWF@HoVB6S)! z8jIA>CivesM%y($Qg&hHtdHsLkgwwB5?u~Z9G}7rh06A3W|nbJ@0%ax+ncZqTYr^v z%+pvc?fG%xpOd&*p2OUB<~06!JVRfEcs~!83&ZDXcJ0 zalQgA<4gD*XR(PEtmNPmk=F#D|4~!@JLdc~TrTEur-4^9G2bfRpthwBKOBG4{K{?{ z?k}VMs*LclpLpSRZ1hMe_CU^pwBS&KooL$(-=oS27oD}Z~nJG+Q#92C9Vg=WgJgf3F$mvVf_G+xm$ntzhObrN*NZH}&8Sm4{I8?(PxaL1&z#$^IOA5%Lf}tQC`0>)V8Tc zcQE%-EehGvT8z~7azVnb6iZB3?M^UQ!_S^|JknaQhF9!42REasq6R+KVDs00L3T(PM*l!}MWBy}?~Zp87*&Wm z!0^wdzXnbC%dVoYzj>E8PS z+IO(<4hd!_0!Q`cf7Guw`GEB=+3&e?uVQN)XQ)1D_u@P}vrJ)Dgg?>#T`KFz5sYTD zQq-Vp93QXy_-L(i>!~Em&HLn;EzG(C+76Sy2L)r3QmKxnER?b*h?_$@B zzv4Q3()`*oemCA;@_^+C7J1s_p2sPIhe^Zk+(X=}{MyF7(Kp604erE-YT`c3Jp4~5 zvU3gJ|Jc7U*s~dbVL&TPwqA=byCq(|t<;RqJ*9X(%k>@ejQdYK_Q)N~ttGD0l(G(E z_h@*w98`wcPEhCP-CV;{%i;QIV!aY`U--YxYQ`t82yMAr*5YL5RDz$@nsJkFk$ z-!ZYZv@?hI7hyTn3_f~`wb&+?`+aasW~HsHGG;W?E=fYMx59G zm%?HD2HZ33(A=rk$M|I3cGHuv@7U%+NwUThH!$fU>B;nkDvW{O!bXl%h*`81F-XU* z;m1^#qBRwX_&#r%C;6ud*Q;@7m>HR9mkUa{6nh zxxDVP$ohVn=o4;f;lzFTHIkSUu0D;aUGAcz0|68H0!t31rX zOkLR6PuIQ5g%#YR)R8xndkWK=pW9OUu#8ub9jv8GY{IPL*pA;O`Z5+jxn-1y{FLky z$F)yHep-}}*o+bRX|?~ljz;KnjN|8{o7$ACc=G*|F;q>H*s1;RXIqHxA*a14>+$Om z_ILED{qsG77sx`{#4b05D~$xQ5TOZAJVkf3;s5=P5*LlzVb3uk{b>Hy_bWJq<=&6u z?tM;!7 zX~1}@w{oi66}WnwWO(pk`@y2288&Jz;eXVc{}IwM8;?1l3) zZgBO+D<*0|3zV{WM>+7I4#YG4K4$Ic1A_+-yPrMlfHI%#y2!JW;E-#|1eo*v^Ea`bmVhlH;c8lCq6&ScrA?i2w?ZYBFXqo_9$RbN++^!I>+(#zS$Z4M)m zq6TL(AumXNpuZTWpA6BS#VYbq!9dn|@mgcg2c@yWK2aVN1e){NNfF9dk@0EYmQ6nm zWG{C}ZSRCXM6Y-j`Ta6NTCUz&x(5ExP)c%krA>p$lKjwc-$2MJ+85C_aT%q@KifUa z6bSp+@5f%(jX)YfvozYrwV-p3cIeNNBI05?o6f9k2(pVZ^Q}}$=%IVpws%w(IN8;V zJo#Y(4U19qjxvUj60T5tDv)ppC%vKjCEyH~KRX{u#2itJp~&ZF`c_ES?ERC!8~!jg zBe|UR$p$I5{yaWjl@IX-`#AXB9iYOa^J@4C@%g3+c~QF~3@Az-+Kq~VP&abnJ(3fM zthEUU38*2dxoSmmSr@RAkT`v8Odat=idGE^Pnj79 z&>-t&6QbiXKu(G{9IirVM{W~txGv&Z&DVN34 zCpY;1YM%MlH5aH^3$5-WcZWaa-~Ni2g@KGvSjzhnU$AR^=1c!p68!!ZzLLEthw9h9 zSbpYX2G;0r72Q(V&^Z<9nNe&C7WLJS7!SxIfvKTNwz&LbpDfpB%M4 ze6cF}E?edU#V~X#r0FvHJ#WiE^V|;*TrdJz8$_w#kz!Hn54TjP8Fg9Hp?1iEk_wUF zsCA&w`av6%Ht^3a&n6jc)F?F&mhZKqYd>|d1i&v?uePG zd^d9{13Klk2VFz_;Hg6E>p!X95ZC`)#f{bvq7vS-eyIpW4pbVIM{j!}-(0!q6%xABH@wtH9tgS% zl~ngrozUZqH0QatK$w5*`IKtn222N4#oUh|Ymd+1b$*)|HqaDoX{R zRCc$4F9CL-w84Lq#Tekm5mhRh6bCQ~=@~KJ5P`*E%XxFJ9Ej7Cjo7E@2G2m(%z&Ol&ILO}Hucrrate@BNvmCn zb1D?hx8>Hk8zKs+sD1}}JLGk@HuC7Y0g_Rm&bzdyf}$29)a)5TflR5LcX_!&>FTvR zu?2ga(0SaAL}EV%Cq5l^_KwSe{L~{R{;Lked8ZQ;GvWrS*_+n5o+B9SH#ToD4TRD} z&5ryKZy@W=D{kWau5`V&n{H;v6gt;Vq_!r}q6QJ&m7%&^C`#BFb7*jc`@=U&ZS72f zuJznODt;$0e=s0$*CYT2j*J{w<%mEjyp#sYQ}#$BnCkhwr8`WUw5&!r+N0oN#b~V) zY2dNKh)npu!M<PC7^9*iLgfM=y{hPT|CR|la>sW= zSHlU!ShNm*DKD zXwO<5_&)Y$+qbyEM4q}wVWtb7fF51I|1aW}~t{iY@txfv&!yQcczBb--mVtPeUip~?H>h%*N{H&RL6^M#YqXUO zfup}pt!HHDA{pa}hmJ?g;kvm<0Q;CSA}?wFO8v~9rtvQ?Y<_UXf=h}N$kOEtmI^_^W>o)##b`#$o{)(L+2qa-7$U{p3) zrnz20LS)7oKN8-YLs{2o9goHOqh6hii2|{kFgme)cy{43kSR1a(Ou_5N@C@=r1xEh zKaJ)1v*|!|du`-o85lLrk;iA6qV8^g-BEJdrLKM1Q3SNQ4K1)Vv$dGYe}JUy+7? z^A7~B=Jb+$@?7{HnJAvo=?~-1WARfDY)~q-ZJ2R43BJ|O|7P_!L|fH~cTzWlfT7^h z^VW}k5GJczR5)Xb*69j!3XYN>vh~8hKd*COV8gj>x1R*nv@0q;AI;FZs-1=IcRz5M zg0~0Pv{2IU{kee~Nl3{-&}O(<9lR(7&hH5Npln0oiep-{h$}3rk9qOScFdFiLwuWvW*g zdV07tuZ$!^dYbX$cipydTtV@jal9qs?Ab95GqeTC-$Hb6C@s)YUN?i)#}OdUDsM3M z&J!K>U^+|I;{b^ZOPm(dUMTBW&k^bT9FXch8=fV85q%+7&6*`X_p(lTK})NTI9LYz zPRh7LRIIK_#FQ5@d$GM|Q(=WVISp9!6C+{#`4-pJeoG`^W_@YOJR8{WpKUJ~CE{O0 zPR!)VNZ5CupEQO$!ks%ZrVN!w(e}4jp@%HZQ2Kx0AF96hM(4hL{^a!11-!x{*43~3 zpt#3ILFaRGAgK2=+lS+qK{*qC|q{8U+_T3pM5vJk}re+FF` z;kcn>J8g%)TT)C&J=KQwlLp%4GJa@X<`u7dgeq`rf1Kv3_D6lM4^&X>+9CEEeDAGx z{E;B_GcxJGELcrVI3w643!}5t_iS(Stqo$(%zkK5>Qp!ybZkr!Yq5c?d8>fH z4kaX%+V|UD)gFE)j?wVUNTK3KJojP^GvMRrY4>&_-`xJ$SsnJu9#ZJ3J~b731J?%M zKmHHlh)Y9nCqcy#xeY6oHonkDxf5pA3Hyv7>j@j_<8c$@PGf3L{wxay>=Qn{dFKnA z&4yp&Bn;p`weh2JQ$CQC>3C3fG7!{XEQGe+_e1f=-{1V0NJ9VW29{OotWe7GCAN?A zBxLN0v!)ki!kq(YcPs8XL3vfR3`?99%6yxXy>`(FhTKYu<2)Tua#>}-V6QLwd``%UE$LE(E+s2TVKrz@IV!6KRT=@?BTi= z??6M4C7O6pVwQW?3;ErOb8a}Q2U8C|_E4VoLlyRigayL1pvvM~kw8@zRI!v($MYJ( zd}fyYLt{TgUiG!k=g=jv`&9DEWIzO!Y5H?qJQ<5bsJpqweH_tv^97+HO?xCXvv}}{ ziW4ffp~G zt+xwAUd&1CQbqQlUUvOc<8UBKf6DJ0RgeT(cQIz@k z<+^y+!cmT-L(0Kd-sr%k1jEJ!A9V1Na(^$lg8rc5sh?zis3GOg?YC!c0=emOew2hi zoMSxMmSX4%eTD6(CJy<-f7a58Y^mOersL!+U%oH8@RQ|mu&@^@n)9$tQ8|vZi$5#H z%y}WYx07=dPcngTYeIhFrW&Gq*u+T_wb5C%CJ_5GLKP*sd0~|~4j|N(ky@GR05!DL zmqH>)h-b8#jHl2ZT932s-z4@kh11@Df5h^j`_80Ab(143DVUwd!|Y)$&YYW^&jAWl zqPGU#dPAFK(gx?6G4u`8v%0UCAqt5%kqftd;9Swd)%OhMsIsP2D4He<{(EUyZQ1M& z+18h?IJ)^jx#EGgITJUKS`Iu??_!0b|26GU-wZ}J*=es-8vT%#<&zHwO?82z{L3yQ z1qn6!6zWcf--J)DBZt3$0g$)^MKn|OVCU7tzoPX9K*#sbY@pp5UA*5!J8K^TX2N9m z8W#;wK+?XU67C@AxE)?fcJVUOOFs~KwI&}z`t>S@r0hZ7SLmp4O(4iN?xe>`I1u0S zSIqKJAiP0wUvFtTA$qc8IzC!Yq|MQz?X^gPfdf1zW50W%sP^&RY1?er|0L%2?*x0W zDtNJeXp{u&ea8acJh6pS-CM;mlP*xfmVBs{P6Pd+Ni*O6>xr(Pp(-6W^9BBay8oV* zcq6`QDRc5qIq+s()9DbCCtPEzZa#d#7j_uS4>c5f!u10(Rmur2&>{MU$^X6=B5SCZ zYwtJ)Zdh`Ag@YezxjlU5dObCwX8)%6Ml=g5zt6A~(VIdY73np`;fIDzeTIG=G=XKO z;{2O}wn$~uw09~p8Z{J{%wK=zfXe3^hKSZE@~>c&?5A)-pX&u0%_q}9=-1lpq=g%# ztL9hv7&##Mlj}0?iS?^ELD8Qc9)eiq1Pe7F266g)JGW(RfZngBx%_muL0@D(ylzc0 zM){gO?hXn!A=7usCD_Id;x}ktk5t(r7A1j;^d2tY*3_O8TIh|AciYqF<5!TE-|1ub ze)*wGTz*WXdT;1HEi8V5*q3u+KTlOiXTWx`hXD(#4t(tVM(4fh4g5wC){HuuaEDh| zUPJ06=sZlbjQXmGrp`-Rm^pZ$(?eCmOn1G(_CuUMsn`qUxGs`1$1>r@ANMAE4iDh< zT$Z`V;SD~vLIE95-5|vJ@QtqD{xGC}Csm%w4$=IJ2#AX^Km_32puS>_j1Gqm;irvI zGcyI5_Cz*(7L;1JN9PGUSCkmuAFx4Qg3mwi<#>RPZe+FIwlipcHI;lc5sWxxSB-eQ zIbn4JJiDu1;^{L<>dv=AH66Sa;m3_ZHbae$UN9JW zml*o9K6ioW?O@A^*CEK@jaP&RRTf0C4@P@fDItrIS1+mkUBS$u#<=#RDoVVut^b-$ z51c-$u38raqL0d)_itrLqmG&n(H|@CEja9!1 zBK`djb~tmz;4X7YJm;SfB=&~#Y=^u#Iy$=;yICJfSaPQAIc?>DB-z04WL0UjmFv@S z$=D3tITEt^NJ|bqlA8HI((ppNi`Tol`>lXZ{V=)hX%!UP6!zbVIwy3v;u3>TrV8ry zTA`sHONVO|`F~X?BVp9w9`#_Y6DsvvnO+l$goOEoZxeU@(5e48m**Pg5gFI!TowMV zv*^hC0M=O&f$KktUG5cy>or|$Zv)a{x7SkPmrnqUmnau?{30Qd{gak1ul?brXj1}f zS0vi(dQbnf+7I@>kQ_D1_d(ZGzW#jS?~i7xS)O6bUg%!a01;jaz|77_zI4a{8B+H4 z%YN}kac)T_#YYX$n@(y;J9>9u{X(rARqunU%D5?Z_nV_F3B3l5Xg98l;0lU(b2%lrUfzNE3WV=7MgD*Izu!9tIR8GB?BO zqtRE7pV#_465y55FU()S2)#N?C#W_fjRZR9KW2oRqQlL>RYAdpKxT96{`O%56e=gy z@OV)IQG4{bE}Q5g-PW`AN{rVb{gqu0MS~yEE1fvO^hq1)eLVCI(z8JxPkv+%vpW1T z-k9$(%fkkCG0)uiLJpyYTm|Z7 zx*+(fbW05dgdp?jd^ejkS44NuFC|yi8O{f8C5w{W5Z7P=e~&A%?wg}h-92XTdP`DH z_@*3S3sSh(eq^2awP;}_zfv*#9WkBi)#ZdBGDB@Yz z9z0o@2^R)0EJ?39!}qYl59w(#V3=>>Q0(OlR3(UJfZhbzGPJ>!3)1DdG#ZN(GHV_6VBpl$Ab&mG0_WnZ8S zmju0*l^r8C4@9^fZo0(VL(Z=}QM(aS6f|0_aV^pjC}Q@xB~tSMT~4=Le}W^F*Z7F7 znGZzVC9jXWdE==-1Ty4(54baN&&|t z4z`>Ge*5vne0y#*q4BAEPCXNt5~~)MI31yC7cE@KK^j?2i&A%=Sey7|xAu47JTw~YuoHU%FQz^H*GRqjM-A>FIRA$jxBxe?kMG>ooOIrI{bK<;mvTt9J>7#hdR66 zKxvgb{pT+pL* zG!;a8l@=1lWxzB3_1>i0rtitFOpd7(J?8pHYXiDl+w71y<*TnBSNWh zK1Bbl|5Bg$Hx+#pr1vp0eK->wJ^Rd2k39&geP*C-?zz^n*~a5L9QQWe$Y6$=5qmY*t7sy6*vl ziU9QNKKds*WP{ArncgXpGT?FFi%MmpzI}+7Ja2Z17e@7L_>SkAz*~_xN3UO2=xAl% zilvtiI-wZ; zd!puCH1BiG1>LLtp!C)37TDdmI`}hC4P114Spz?NqC4F1R-s%QTI?R{oD;SOk+{ug zH{W|9*_F?#8Y}MTx8+&(ngSPeLyU%k>#_%0Q5s)fvm)^G%q6Y#LTmUT?(r|9*9B!t zH*fN@5zjM3&v-@N3AssMWV?ID5a|S+O}KQ9IESy)LLV+fBFCcOcRp)2(D>htT_LtC zSl?r9bWCtXapp=f0g;hNt)sf~+Kv-?^V#A-Yg-tyP+E7m80ifIO7(g}dio%>fqLBy z-4Vt6#GVEzZBPv7T+o)y0vYNJyYN8X*@+8u?EJb#v8z?%xtYi+V+; zm-{2YH}qw-*A+(;Oed<#6LT5uab17$Q^6U*I_F;PTn-qUr(JYgmWPn!JF#)>mrI0(1ULd*@Kb* zCgz{2k9J$5ujeaFmCMoruda$D404d1!K8csOC?D7@cUwQhYHfQT3BLW*y>cy6_>0)83A+8m3$MIVU5?XRiH>UbbxD(a=sr~u^KC4MjXatgd7 zA1NQb9S#A-KPvw!cpwYjx#@+bFvygCoU{2L03}U4eji3-0LzT!Zy*07cm-uP5~Ac` z$SjiI?Y3F~G~Ngde|aSn&acgyyfV82qdgbB$HK$VW2UOY?2t$}GU;S#%n*VED?bxH z-4T!(|LdRpb3^n=%;98~iw;p|yesx~Q5Ui58jbed&H}CU?WvdZen?C*VKJ*y6PS3t z)2l!EqJa5(MFBF#u;2FOVq2jfShl-<+#K>lN=&V$LY_aB>|M$8ubBEF8L}#Aj-E{5 z|4pSt8%6Ltf~`moD5;>Br$G1&qXBB$be3OBB>~UJUr&BK41*7Mu5X}Z5)v3&)c5Dq zKwspg{(dqbA%+^$LA@`;^St~N)$ob9y_fY$19I}GayH%Ja6Iz(O_pt5BsexQWbe4@W_JNAR99q1i zjxMAfUJl|rjLf42j2fo0;G^n>M|&8+8|E{Ah85IN9p@#RNF60$PWRQAIzgO+#?@t( zvQS7#y!>rMR1(5N^9R8jiPxA>x-)!Dx>^(Y-Tox6b`_co^>h-g}HsNz9r&5N$PhxkqH6TCrbI~lt87(qB=g65w-Zg4Hmee4u8ezZY^-=L)75q zv}#=wq`aH3UVk|V(Xgo>NmEgQv0@I5j@V!nIvUe&HXIlD*r_P84goO3~^pc_t6JWAG(QUTTj%w^OL5A(+(j=HQVV$ zQ(|4b{;g6tpdH}@-4^bdkXLY)`|?E%uz4EibX3C(?8rhCP9~^A4?noNQY(W|$dk*P zqX7htP|?Z0?|?R=kB!`k+7BbanC;e{JvwOl?vq7t4iso8P!$Gpf|>D+Ec1>da3^wW zPi2!C9Y`N#UYZC5Gq<<>10Q_gEc2x(Ox~>{@tpK;r0b;Hr`Wx;o-~Qs})Lq;u^d znagsBPt(7*sKy`q#+n*DPne;9zrwG%=er@sxLVY1??u!pKQ2;KxTCOzH!Xs(nZRoi zqAR%17s$6l7nQzvLLZsdyUax&__coL+aR|oY8bd&(4iQDm>dH|o6`l8Tjtomep8SpUgXa}*_7WwOkl(14A~@&3?lBvK4J#{9?m|UR2&-V4SFTF2 zQ5ImpA*S%G$_mQYFPytw?FdSxUp0%*N&xBWhK=w85|H_8H0;sshw|%{x6S&p!0f)= zd4c;D;5L>zFt1MRXsa^?sil$XhQwBiP@#v$;YF6l!^FY#pIu&4N zIxt^+)E?PytX@uLC}3a}_6r4-@^PN@Gz& zM*}p~B7a}#ZVVh}-#gHx7Xu|5>b%bLZpc8xo|}xQ!%Xe)iMe&Vp@>wbMQQEO4T znIXi5t?k=yZUFT!>3BUn{eeGG@%|feO(dBo(z_wxg4A=((k#}Lkl?=K>NqG-+s8HPG<5y}F|L5hMlnr-OH>|R^^dJ+qN?u)vRZ;^PKLfi@E<;LgCO$WO zA8NqWOI6Aqv93^5XSFf=HX68vmaKR8JEBJ{8Vyl$?nr>s;O+-E2lU*gzCqS97bJNS z69=6%;E0IpTgwo4qHh*AsNs4M=p>ZHzIa%JfV?8)^5gxBPbv1o->zy&PX|@V9$FZ4J zbsHkpcTe(#-&MmJ{=UD`U6NZkKXH^@2p)SMyK^&cstIs*>ti#ETEa|C|RXVd322!7g-)Pi4` z1LS`wtox$tiQdIWYj{450c)$_Sb_J3=x4$!p@NwYg@nmwb58^1J@fuG)YCVqfT*`HW{ePqtGW zPvsBgoHVXss_|6%kYGVEcVTk7z1FNI%T-k?dS?cOBe;vhHJQKWbbMr3Kd%+##_*{M zm0+2gFG(kB8_#-Ee6yW19K$^*Q7+6ykIFuoydw8uHM7 z*7}-vwKT!LW^DPPyVpoMMKipLeCnhXWfQ-_sn$1MlrD~kI5TTQS=jd&?|nC@ z`Kb}g<_EkC%4OBN%t-;;Y9yeX`8eUtNpW?!>gT#;Urj|;#xD~WPYUCBmM9;wkI=5if{W?fE=s+%cv;!?5DMvZJl*#* zAvL?a{l)owLMZ`mN604yGbkcm@hvTiF%%Ksi;jD|LTX;G+2tjx9!)7M$>$G#9A3k- zs!KCj=>WxiZ1_C?ba0KxHtt__=jm#m#FY=k@P*bi89#R6rOTvnsa46NluBH+)mN!3Lg_GbR<3!4T(frD*_}Y0!bu&k}3;Hb%pK^A+eIA{(PY! zts?T7NKX6x!+s}l(UM5SzdvPvbGx0t|0fah`hSq-k2Dj>FvMqPSYXH>c|juQcU!+d zMigs`gQZA>vb>_aiky<7hKii8`fe3(FGUTd-}%4G|CaUpTY!e7`8%0JL-$X@^*@Y6 z`g@uG3;%cN|EGTb?%nU2X=!NxG{E$CTA8_lsCS5eP?&$<{y*uz$Ln`J|6DzZ6ts6|XqdmZNQBScKyUxBXc6C#oxA*f z_Wv1NLhiqf`|m#gTaS`L=%4!k?~OanpSt<})Jo_DiQ~_=B-4LJ;fDD?=(xq$`1e(; z{Kw~SG16(vf8_odrGHcZfBgT-2$&gD?0)yvUgg^*@#UPrLW; zc=@IOGhSK$QOSSWJqH_GBN`F|VJ-iD&iqsEU;3XY@;4zU|H^e` z{&zXWzjB`E|GV73_fEv(zsvot?*AIl{2f6Wntv3x=x@#cA}i^iC*Ze!|DK2cr};&c zDDzkCN!}sRpF&8Up9`C@YU1t=_6!+F z_D|2B{HX!Ls=`ga*2);=-|73EK@*d6ryOWLDPgRqfsZ7=9i}cceWZV-1f8k9hac$~ z5r3cB6UEJGfSRnj(OcDwpffZrBf!ZPt$Zb(%7p=jR@>Bv<*o+W+r<+ix1``$oW$0) zOjW!u==u6!hZI^!Bv?bc21+yJtmn*kz^3lgxkasxQ2cn-aNv^zJ{h;-ZsxZG2SuOV z`XYAN-qjm;UQQes8|6P0I;r8$`-OLTSIn?>(ZsB3!)n+Z^2j5=N&Qw_2p|SMm>9I^l;+%X{o^TCy{CPdfZ+EpSEPKBR z809x0;vaqDy_K~FPd%n@WOk;9uX&mWbD1gl5jO^wGft7!o}JuE-^7X!#O8WSZ>vB^ zdbC6Pc~LmZ`?ha?8Yc|@!|_-qiDKI$h9>7`H}j~eVBbF+G_&{7y1o%ddtSK$1qm(` z{)fZSbgo{ncdQuWrOV?gNe|vh^IrnjabU)XN0sc%X1tr7U+KXug0c?}-8GsO2D(mN zCEs;Y=wOj_<^85j$Z_a;P`SAzY^9DqW<0M3^E}ZCA~s5(wJM|UKyl@nb%k8ZD-a5%ZXaW zW1G#vG&=Idpq~D}9EbLtD;sn+!gHU>$9U^)|K+f0td43Cu^D$aMm}Bf7Qw$99AD?k z4{#fTOj|QszJwI0FOr=Jj<-FZUJa^}MyrP^qR|yrC~I_eg5bbGVg8_Mtb$$j9)q9U z$Ev40B}Y_@Rlu*)TjRF9BYttew`xh*4&=pzUN?8yAivz#2(PTxh=*X zzdw9gz!_=>whF16=4kD4>x*Es9o5_*V{>F@K(z?Eifl;NaPd?OI+MZQZN7ea2Ri}zJa^s7PD#=n+%u_VE z?dq_+$9TGJmkW&B4I$p<&_UllV6R`rqWNE*Jxt3 zPR&9mqbvwGXUdj6RKYbi{Hv~4s9@U0fwnc#n_$(-`$;Py5;D_Gm4s>ZBm zjZwrdD_$*YU>cB4n{l^8$;3S?r=KXo`eOqv#ZMJ+vKQLqyA3g}=>7|vYAs0LF5GC_ zpoOibXKd~^Z-HKg^9LM7Oi*laPH8E0xq9e^UYvUHGTGUqs$e0JIB`nlRt$faA~IL~ zh;tkHN~U-J{MMvF8TsS)A31m31Yb3L(cF2`2G-G*oIfXEgJP)>(w6E*AjH1w*T|9u zww~KR9P&;Mf;j13prSI?3F+4qf0M(iXf5%`UJ6{S*!sA3mo;8D&Z=6-c7VGKT(0vL z7ML|XJ=R-l4hqdz7M4oQQK2%pHsLZGY<;#fD5hX7YL$Ph3Vp7RV#$x4YAuyOYUKDf zV|Eo>AaA&FEY1peizz}XU-iMW#q6HVDS7ZK`NL6lk8VUH3SrRWGcgRCOmK0x|8EXq zm9F8|gx!!akQ(2#V*~iA8U5yPR&<mQD+t=)=eWb|;maJ%%3i2{6U`NLsf{3dlt?vLbweu{XK-Z0tI zl<``Pz{hHu%*Vbm2PH9ROZ)A>)jH^T*+u@+K}lE~m5FHHrj5R@LI=0FNT82|XehzK zXm-!-6Yj<^a^UPKw=Qll{)b~5_u&e9-8C@#V-N47t_@DVi~G&do{Q8``&0=-RBnEg ze=G{yS^jW%Qj#|x9%TesmOHlc*eJsIlE7EH7$bbf9JU}s*gMS@!^C&0=2*q=FgEC} z2BJa@Myu2}V*a)}Z9*#CI2C)6d}vw>?!0K(88r#u{PN;8|5t1AFDFh!Ecbb{yb*q0 zJ517_wEmZ)agtIlqK67F%mn4qQm0IL6Rcr$#U^Cq7O8c6w8Rw+|}WN$<6 zJn4jYl$6Ok0yRKxN9SVYYfYTeBrj!~o1lIB2~l5BBPiGydYQJ|9Mu|1KPP}a7%;Me zMYJL6`bCO2d}0K1Rm(wIe{C#N4F7o4PZoxoSyg}9sp8SA_BXHl$r9&F{<^%%lMkM( zM2AVQGsDvToZT<4SOfpggK@5e-p8c2(wC~r!P^;@O}@f<$U^_^>6->w*j7n4IWVt* zeILb&4F+X#dWGgnTL?D@W|$Y+DVQL&-+HYThdrEq`b@a~oh|AoRg}FmPykczDH&m^ zDemFidCZJe5vqPUE$-k_#KUq8`$ zvs19xLr`JPL=VGtd0SY&so+i*dd^r;4cJ-h81BSxjCakg+{(o?a6*D%eJ5ER&jbnV z+$m^-btC@wlDHkwM&LnKClQ-GV%Z_`( z)_MdvksveItN8LEK!?}C?4A;Y-7<5%t;%2vw98zM#SipgLMDKoCQJtoB^YE>1nFQd zrFDBonmRtE?uCIrKjo7YLa&19HA8ujiy0F6r%h*==Ej zANWMKsQn;Aav87vZGH1AMXQ)X>pq%vA=V47GNRm8+d(JS`RhR{~bFzQia zfj?VIZro0^hEu_elS{M4=yRBdO>9&j`lD>Wx-eK{&J|PZ!8%QNU;D~{{LBQSj(>O* z4Gy>=<;s=O4nxe(5Ig_tz9^_&^v@DWUGx}wrw1y_A zT`#E(+G>Sg_A#y;%M=1EoItWO4c7g`5ft2RI$YyHnNymqqdSx_OXd$J&X1hnTQj!_ zvwzvI4z=Hap1yxLu-X;=Oy9m4l-npZqcWRO^hNP6f}@*Q?UT?o`VbdZy491{9L+cx zkl?tn)V%v~oB{5Q|G0jZUIk)BEPit^-7M}_`jG+$;*Uz0Y?S(!$&Sa2We?_P_&wGT52yq5MW+ zse~Ps{$%8DK5X5-(*TR-K72VkYk;D(Ch2c>8UVS_XvOlI5GFG;&Qk-IFp|*z+NB)aw+f5<`*dA#Q?{33P06g#A;4`Aukt!AzB zXDPV%l;tyq8GX>;vsU5QNdX4m+w{e^D9|IYFB;fXfQ>h9gULA#Q1Z!JQUYa=$d;Ux z3KB(QCFk@v1|#H%N9MNulIqYHPTT1>D*-Vy#%D}(wQ&uj?Bc}@MnJLrD$CTWN1QuJ zvKMOBLof0#wKt!%fY0{$LZE(sHO)Z6sIhiG+2Tx9CjEO$c&2cjL3!8^0)MCr2v7~N zCu5N%qJJGcdoj5)rcNC0Z#;cEVUP`VqN+wrZH=I5rStVZV%q z2@LV>ER)z* z2t`)!#Kp=@A=gi#O!BBAJeaDm6A2~OakuX6Jltyz@7|oe-`T1PuReQ!UwNmB6g!>R zEv)ts^>MR?ErI6m*Q}VZ+at%Fxg?W2%CKfD%eOsGipg&pAME|reW&`0<0woiUT64u}qeTeuau7QKJ(}xPgHQ++wu)J%h6KJ-y>hC4SXS-(T(=b^h z)I7kZyN}ZdDy5646Kjm1PuYIp#8Z9THnaY1kERmlt&9>j3icdn<%^~aFJYS@SHZE!Nf6}ET>_o%Kqfb_oVd0GI*Eu#a+C=S=<`%I5 zo!GL0OEOmARC(GU#MKegTs_4NLXAP2^qKQnloD9Ri8DToP{OTA%xNnsHt?;|jQhZ# zGN?Q;-~4@08D-2KwY-jW0802k`NLrwI9_qIIF4$A_KmBD0$nUX>5_-=-3baBX2*QE z&Pvz^d*gNA?>T{EM`;-w*%-ffNhn*18H48Y8x2gM=5V0X;%bSzII%u-yK~fE9PO-M zt|d0VLS7tuJ^cy=`LzRYFNzrey}uWA8_5jd(C5xbc|D9%tlXaSQ5Ph~8A*z(q+s^k zTZh37!f-4&NnTn+7++G;BU4XI=qtsX<`otB*d~ z&&m4tJOJQs*myEx&2(G&~d1PiNqws61FCwkV zP%fyiQNU#ajW?=>T0W?tosIA$ZJ7$3+0q^{m#75=v%8`%=BPqPtTC5Mkt&YI7@spO zF@=C*6X&wFD!C|PyjI325&Q(4YqI=m>&UR*kS5{+ zfuDEGw0kfBo>3p;^4g#avqg*=1Fv}Sjk8w7q!=G`lXCW_?9+rx35hl-JeoKd!MBcf zNCSo{4y@jKK^gK2#G;0b*rDT9%DNpJIZ&R4j>Wr18_o>`rWrlb2BwUHk**qTwAAT% zpF1P~V{30DTYK5y)%1$QvH<}+Z5q4tG7SaSN_mVpbnAnCx&(a=4F%#RlW5D@RDmue z>0!2k63l+_xp?{mF~6~nR2o=mfD@!_&$1JNFtIsj(^CdW6-&2Skk^OccSqd$8&pA> ztyzg?K^NsMIBV9#7y|!kq2$5)is&qS$EW0p0jPf5?s@Tz6?C1djm`7XMvVoZW7}-_ zfV|}s(=^!#dOHQ5tWlJL)yz+s<^`oO_Q;V<1s5nFk{0C=>_!27l|7LL2lerItf1D; zLs~GJ-F1F9g9x_mif!Se7lCi9T8}a4T7&(I5WfB}Em-w1YlT}`2di$^QvA}a;qm3z z(>=oq@I?5YeZY_c3fdt>jmZM0)`}HZGV9|Ir%>-@W_{qvaC3Ab*@NuL?S>vE9mrHO zmh@oO!S71hG3X};f1g~g}A=<=Lb}GEa!&?=;i*b&f0YAXZX zn&2Y_!2c>u?U5D*f{*+f@UWxceE-`}LNlPE^8MrfyNb}=JtFWuVgnAoko-9$XAZr) zsH;1#iXyEuGfhw>52P#T<|Y-}z_~L9Kh=2j;pr;Dd%q?O&}>)YX4X<=ICCpL=%GVTTn5nhn8D4wy32 z3~|_{$^Y616EK_ccXJ#wfwvuX8}dGw;Id~j&qfvvpmTRzeT7W}bmtbm*;q8N{#jt& zlA1m2u)OvqNW&gNo*#%@RI|rjg)2t9Gn-&p%VXEYyK2C?=%nN{wFw3MbK|Or`65+w zeNjvYG4G8OEwIE8_a~h_hU8!ge8SI_RuecP>iV1Gbi9FdrjHi1bziB7F8@sCDcIBy zz|98CtYwLBYs{dEkG5yeK?O)$I%=XtyjSim`jE&jWd<32AqA$Xh9FfZdg5cc5gu^K z53Ow^!vpi-FS?KQKq%nZMh#&Ja1=hl<5HyrXXnQnW241sp&vIwAXvVvGt$)#Rr{NWiaL`e|1<4U|7Rl^)DR!c!-HB^oMjf#$g@Lv;D7 zu(5C5t8Z6S@$EYK?BTmxAkuay&8A%)oC^KwM6ao%s7NG#o-GAdwXCbF47Z1|evTVy zf)upAWxc>YZwNoFVpoj{>VsYU`s?{~WLzXm-n`JW1tw0NlHOyr4N}!(*p15VFs%LI zTC4MNz{~g)_j4-2!)%!i76cEK&S3gJwh2Vnt@@EgAeU5&M)Ao_P|ZEFr#M{;yY4(3 ztnJdlSF`;`XHW}er-t(cYSeIQ!|k=5uhqc$%cqo~DmB!F=ZEgQxxhzGTPFh#7dX+D zB6X-_D-plpu1hCn3;r5;<9{}e)g2hLg+a5TQaD7NK`&cL^NX?+gs3Qr^ zHIB`nTycU|H#tj(0?c5|+UARn0cLpqgf~St)(I-k-0pk(&;s(Fee*f*V~Qy{Umnm+ z>EdwU*xJ%FTc9D=nfEu(ky*N+y~7rIyezxzJZ+))d%3gTX&Xr8n)t{>*cJOVTR-|u zcp}e>cfXoP2|H8Y5#v0x8W%gqyxMkaLVJ$Fq$R=AIFr8Z0xMvVS;{y=-~cNtZ9gH0ec&enW4`&&M3v+vv(Ya{e(*5#Ra=Ej}rCM`+%yRCzCJURmE4w=_`0U%|LEhq3|^?K-t3<-N1dn$dBHoy?kT*tNNQ} zZt#u|N*JhErQqtVfokSDvI@RG$bA8MQBp2!U?`jv@?g6*Xe{5ml{8=pWdg%gZ#p5! zWZl)8Ub+sVkDp*>@Zp4&4{tKw%jsjh@13>sYaPI!@fhQIosFo~I(=SHP6xh|)M_hQ zjo}VQ*e^zD6TG7Ba;YgzA6oiKO6zXu0Hya`)T>M_xOK3}{KgDmL0su}n_I@j`Oa(u ziKZm*R$YvDF(u)ERY22`Q9YP)irFbFFNF`boZyg_mx2iKu!Et~0G5UaeNq9y{%z4o z0#STHEg-Fy(Er)`Gwqrb@Y|~Ogk>WISIP>Xzm`!3i*Fw$*Uu{9IsU5yKc~hd0b|IZ6TpaivocunAi6ia7lj~UQ z)Uj9NbYBaX8IqZ$-c`;k;-Ri!rCegYxjOKI>QIOjM#*J{XWeyx=r+$^51kC~TZ$Zi z*=h+8AuCs2t`f)1Cb|O8E|4*$e(Xn&-WGtq!TF`(&5-FmKelF83$$vpcEm3m!9DIr zW0@zE@Z=d49r1oHH1CL-OffcuAi=#F8hg9EDIk6ThwIn5vG3djb)$7}jt+j!6+!UInE~#5$Zpu4Jx$&xKtno2U;=mCGrEUz zSjrzaWjta6$y-OSC%Y@aVWGOZD0cqMhj$vDJF``L>vFrHC*2*+aR^c1s}l zc&?jBjaH~`oLX`&SVw`jD?QdvR#Bk&5fP+*6|r7&TO{8l(&@9_aPkoAFSqsB%FjSS zpXs3Wr$8H|x<9;GH=qTQN5+TVbZg<8g6mV;gN*^L$6p<0m&LCR!E58$W#Nn$SG2f- zJ=~yw>M#;51+3@3`CST>!io%rlwy5FpnYPUcz|{@yyEF7dPTFDIDh@= zSLnTzi1^2fc54VUqT79MnZX_dsB;4>EqusrdDO5`Vl6zaK3n))Vl7s-$n0TxX#$-> z=5P9!Eg_=R?^Ld)4&0i(oo-R0kHuOG6H4X!=ofFXb(w000o7WSiBr57$n7-$qgxWz z{M0VFNcfd~H>X)&CK-VAgWD$4W&2>^V z5{$_Z{Sgi!Ym0%g^egaIBnr7J=W|>eIx|5olArC@N`y&pdgvd<+f2?-$$G z-@GJQVc>I!HsnM~9!rWafXo1ugtG)+`%%FmfJ&`yFa0{Rm28J4(iX1y-PGzGKkVKf zG*!ZKG3FbU9m;TF?nM%Z8W-@dyp#XHX%Clk4K|kh+XBt&sAJADHgNrNbO(K|J!YRL zPi)Ju#K4W~E5E-W{Ch0)W!JP+v2Xi}5Yea1AQdzg$3WoI*pQ0{6zM@^>U%+s)>gP& zAiDjRrYcz8Go9nimH^eq{O-s5eaUj;<=>TMwxBrc9{s*`%J{74yqZYgC$b*pbZOzn zaq^d_;Ff*-WRMo$qKc1cT^3Nak}_k zv!kCL`fdylt`}E<3>Al*FmV-(Pik}wB#9wAlrO*0GK3xN+inyltE1FR+|hNsyeO~q zc7o-g0J>ie-*$~h4BJMF3a{QXLA#H;OgDVp0+Wko3s(qUJM43Dk--eaEep-huQr3i z?XOf4HBDiC|3j-7`{`;`W?BXBliN{#Q#outwF*UF(O-Wg3>feJI@aMf8DdRykMvw5 z)X&{kP5${nf&o&z*CB+!}oyilOO$H zo-{?qG^JCeZTqXAW!I7=zmjpybYiDpxf-6RR1?w8w}+vZFFbE7ZARylYmeS|B8N5Y z3<2RTvJlR8$MwMf@r5>G|kYAp&~Ad{A?Mz8U%kPj^$tAz+1o z9h>FKM!aPJ0&?~x&I$ofvr5*A5|tj%-+Rb^7!yvf(<Y5OyP`pySv_AL-^1lGGH2Kh}`7q zyjkLR*6hb?oTAEV=!ool`C^SAV$1G>Y_3KSm0Gl>u+kC_O?}!$_<>-5t>*^@1vyZs z`#H+{S_<6zg8h!#DPg{)`Q&h(DMlUZ`slxNg)Am>s`Mc6LQSgtzGHpL;KkSz*LuI9p$QpwU`v?%!Z@=7y6puJFrRUQ02BpVl9qmT(y3%zmvPcX<=g zjeosuUxOX&du8v|IHr!Dvs#;G%T>WlP<`E-MNM#B`QpDKrU~hO3_3?-G%;tval(Je z2FzP=G*{aQ^PbTAWW*c8JBJw2*T<}&yk>Fri5V*lQAmC**eP{Aqb*;~du#xtND~{1$=BqZhXh*yy9eq_!W0(*&~ntA#l&$>4Uo{OJNa8O)R0 zkMOjSklXsgT>VD{FJl3r-=8G0l{0_9_k>+>RtH)d9qmgOZe0@v3~F>4_|XHK^FB_ z?b;F9X#qz|HC9&*5bxV~$;+Q2&A~J4!7lwBM!124Ga)zJ4oUYeiCqEmfZ!_^#Yy8@jjgq6XcpYE990VZ&~{W@&% zmLVp{%-*9n(Lq_aF4Dyl64-E4eo9?|8-7$crb<5JLWu>XwLLx>5L?1ufBC&3@T@g7 zwmb5bd{+4YEVoHv-`#zW_O?r*w^AK@P_QmuxTABvZKn*5jau}~%FDqz@k=L$cgUbm z=qG(!4m)tZctJ68tsPWq%KLnF)`zf=T%!b970iAc@m=VuDVkbdTa30aNBdht&bpeC zcyU_rDo2n4bZxRf-=!gmJt=}0uJRH4aduyA)LXv=UT9r9m`-a0!eomywHb_s>dL1a~pPX2YMqt1k#%d#F4?eXG zHEwK*xIp{srW&&_c+k_|IWr~*A80MQUK9JnKJUIqpHnY`pe&Y@l_>>gS>eN-nNmnk z+9bX02tS-SEVV(YTOH2m4RYaE8rXCC)(6g8{K#PO{w1%NBFbIJ)p|K5ie(kIPfs4> z#DSH$d8TAexNy~fTeA!kRtwpAjRac34mz*he{f@fkkJNpsEyfe`kG$_9aJyP@7kn= zetWIXN^Y>gH{Y+eZaHR%-y_zYVWc;NPYgpXB0mj~BjK6F*EJUK^+%3Lmxd)YWxtJH zPgaD!D=P`E*(ZFNhV7CQbS1Kw$RYzWzf#)Izm zvT&Bsl=|hM2$a=I8M|k0fU;Rehr~#EwES?%O6;~hDx12L3!d5pW89S&2iYh%ymTmP z->*%O8Fs;ulH>xXax^~HY?MLo&q9)ynPu>q55tp^kK(98nb~lV*w2vjHedTT?G{-1 zs-n5+vLY5*TDj?7|nsM!5z^?6z$EQ%9)nKUJhC%5!esE>2NNj_!9Nhn?KsnAFB8A$Rf8^Pr`)4JWn~EOrX68$? z>?(Uu7qav5IBN)=ImKU-m$WgyU~NVi*&JUuS()jl+ToWOOd9YdK_2sDkYmDhb?~=> zMmAPU?9CE4%o_86k9i!=GljVz=Xfx^?91`$T#xInvbkT#iivl>l{_S#i=c%!S&r7= zSkOeLcyES$RfQlL{>y}egiG77dAH0maU#Y_S0GHQS-b;hd8kS?W zozigAH%Yv~T^+wRl^+^xH3R>^rP%Y_6gXS8pg+w;_`~!Tl3xlE{wn>TF0K!T$TG{F zNVd>K=hb5lEDe0fTYh&8&hn$F>iTTu(v4`S@Mv{GqX@3F#|9kb+5j`7=AC2F!Wbk% zn?ZBI0>r76s{^B~LF(vWTk|;spfH!PtrSqOWA8_aTklQKVJi#MOJj4Sz4lAy)US;= zo?L%xnj{Vf*fvV|MfX+#OK6|AHPvRPJ@~kFhdB zmG6fZ?sJ(U-#Xa|=Ed^r`Q}h1;iYo2_=*<7r^yn6vYGrR*&v|#opFZbv+A^!ar~Ivt8w!1S(ZBN2Pp`fQ;M*U)JN2P<(mLdqBbr1C!(D&Juc} zv0&i#yjcYDk7Ng|5c9(O#S4QMr1_Bc)^)2+!cP&;y5@>~rvk)olYM&?=E!~bIYlPO zbL2?nT6)V-T8#1KD`;~WgPJ41?r4j3LJHNmr?{manPwwWGADbn<)LNdxt}k=!Yuys z%t#5|FS2a^Ins?@pDs+i%O&FbJWt@NjTnQ`ZRPdllulSvSH+lHSdUyvRVO!w^&*uq zLD0c*3?7c7@=>!+aNhm$oze0>Jx~b_yFD9iY3Ono>15KKIoi4pj zSS=-RiL$dEQ}5{9D=Y5BH1*ho7r|rTN2@4$hqe<2#FNH?i|cV4ok8d7ieB_@A1va3 z_yt1LO$Y1v+c1So!zYie8~82d{ByKx@p-7mZF74nOy%jiuxO3Kfk(O*_@9*FCVy+a zQQ>Cvp0xe3Eo2ND!|LiD$#+6ii0P%ep?X~N==GpoVlSRA96zCTkP5O@)M%p(qoA9u zk#7=QjzmnWyWdYXVaiQ&CELRE0LeF6(ub*LT6?5y@LO8fwvC-&rqHUn-OyaO!?7HVRvHz2cgVmLq?mXl0dJ zGk(83$aHWI6@E~fmEIC@>2*g^wvk?!VLE+(!mg-hynL*_$7(wjSk`m?daN)CGYSzb z8h+(Crf{`!?{pI$oIR)H8AOF&r;k^%NR7h#AU#t%|1xY78DD-|*MyHFFSAo?zQ8h7 z>BxDnHVn*d+P#Qf5PiaJ++*@N+V~fJ$hrRo%ywMe)@j^^Ew3K$t$xx4($ zae?L85l<>4UZ1wPm}ws=M?PI45=CzVumlFIPvG2idroXr^H|6`TF&tb543yh_P z^@66C*vU;{RJ_OK^OUUHjwTnaZl=}MLv6qqi-nmU?YQ19o~ilEFs%8WGHaIF3%*Hx+eC@>1K*op+h^U5<4@XMo0#ii)30DPKAB>i zqW^G(`3=#&pS=NH);I_&A2=(LT?Z-EnyqD4C8+c4CZ*_6H}0o@Yb23B4rMJ&>svn! zL*3}$vm+ryd|pqwuVV+O_@Qvmp1|Ghh&q9%TByTtdrq4@gotNV6Lqht^Ar_73aE{z zUu?(OEF)t&pE1~ydQ)Q5pcA$n>zlp*v7qJwO~_BK>FeK;lY zyf#sOb6hFsBSOEfh$^vcZpMknPq#hrpn_j^bM#e0KR@?Z6h3Mw$L$l|rZd}`kvdv? z&fkFw^Qy@@ma3y5{m}bNIuR!?qv^qW7MW&LI!7{0A?$}Zhp4rl{wQq!^gaAg!ULR- zklvd<--Jt{jV3pK4MX{aGTYj7y&&zaziq;sigf`>svkAl@#bjDlv#{oR6}%du3_Ks7S18HXM}OaA6X zh5Ny#p`qf$^}Vnk-FCGM&*elaOolh(&&pp@O(s-O<>WE>W=X{BPBx}tpLu{0@!VIZ zDx2`z5&yparD4cgh}D%#?uG9U;sJObWY~rL_J6_Q}^YA_Kd=2Z`M(nR9#z$O4I?9QPlj;T2>v`Jo zYj@Gm5~1G%zcM&KZzi5EZWghFNmOi%Td3S$+>YXnC3M+bRM<7ByQ|Nx7udqD*yzVo zab`oy)BUg8P^2xti$vt_*cz{|PV`Uyxznfo5GrO?aj<`U(1sq|XXBm_^OxOBs^E#R zP9R%4ScbaSqv3|aHOy}a{Z4qfkB!j(UuiG-a)|lq#+l&A)wOk4wudcN{6{aE8<5ud zg*SpZ`RYR^-cHO~)H`vlW0csJGnK{Q)DO<BSG_I??_?c)QEUC?;$= zve{3mAD9CfH+c~Ehbz+1qa8+Jc>BcR+ov8NZTX`biM`DzAn+a&);B`cyl(5yhPJHgL%BygA6tzDUmmRa{ zhXS6FLvcTbVdAh)@%T_L(2w#@Di~2Q+j}aMy1gA&NtvX!3sND!VCUqiJH4TtBa=PX04+XNpR@%#kwYL^jkSkp-AsQKMdP5Ik}0STq$oHFJC}`L^R@QV?Gs9bvz%f-bin?}hdgUy{_eQn8+T z>+8e4?I<~Zz4glXVc<`jAa5h|=ZAaX_4XrF+^Y0IAeopyylPJ`3KQi&o!)4?!?qXH zKkT0838Z3ee#2u2uXfC3Vl=L#r$U}(WZQcppHw-ib~A#Ci2_&CE4ACvHuOCE1vV<+ z#`86Mi1E3Te*q2?@@U)$fu@IEn6K$XwNp;*k}pOv zKx0E&QEopxGS5vptY5x!i*rI{8v48x4n(f@m}OnluRd{_W4>VTR)1Y%gqN$Bl;mkba`4& zuMzgO+l9w9b)ZD_{yfW%M7(l`BDUi`{b2QNx^bAOf79AeuE(x)pvOmvtJzDV=tj+V zJFnLd{_7pBqjxuev40Qyli*G~Q*>Txg=jzi_51zfM*T2DbMv13{RVJ&Ig*;;*om`! zybiCsMzMH)wMe&FKYYsG{rJPZ2H-f5I2+HC;C?(frZ5*iO5CxaPAjA$fBn zyl|~KcWtTzQ;!ZeP>FnxR5L?sQ{wq~bIlCD4MWo0`5U92y%2q{N%xr-6&1x)T)z_b zjrvfbK|Q7c{AXuWMrJxNOAhDRzK)`S%hFK$mVRJoQH_1Kp#h{Sgtk10?L^Dnv%PkG zqZnbms{4~>KWG3KkS`VNr|JOLds8BF`*1XKP|OaI*9d0@8xEvBdc3nLZWk3J9!t2Y68i1T6%p4wIt*ml?E;7OdVyAX zJXj=)ikjyOnih20(Z6!TGiGA_C1K+lX{*o++kbUuj3iT0D0RW}gk?LXn)^L6`P2YE zcWyY&`mO^L27_-|O^+gT(3?{-HvKRWIDCCsv=L?%yp289ccPw_VId!3KeN6C`g`o| zhq+HzgLH=L;oJDV7kU#NIRC!S@#xP{tli%qkg&BMk~X)RoXcr|iv#a-wS+n`-!Q4h z;mat>-W2Sa)9wd>kKR!mog3h&%)Exq&kl^aBO<&^ zVQPK{?sYgiptWuc^OH5X*yZ}6dbjcBub1lK;U4dWC6>D=STdDS_n{ka(>}SF}~}OE)?P zJ@RQw9tX{(uWT{l4UozH;;sLUyJ)=k*ia}#4_bJye=R`7`TlMfcqn2OQC=&dc=yG- zD7~kkq^q?X^{?)maXU8-w=&M@e4ej^0@D3e&5?KU=%)%!_WW*a(0l^(dE>y~L=t)G zKL%L^_16UZJD@f~VfE85^|&WnSkaQ&i*>-+ZF`(0}v>)2}_`;YYxha7ItbKTc)Ugve+=R^Mf z!rJ(6;({Mg=+)+rrgL5Jej5bt39Cb%Z=$<~+NL0APj;K5+XpnBkDwaGbiwP6-HTj) zwb(5#*P15T0G6%~O16&`;7?vK{8rYD&ei97ol~a4ePE+0qbBJ;A5iN3B|3rkn5o@^ zD-GCCsrSB?whv`1z4+_M|G(Im%Kb<71Ku+^yGDw&8!lx3E}sdh#nw0M^3v5)@VmMy z$-wag()sRxe&<;iEQy4#TL`Gb=J7bL+}Bee)fzh)n(zTjdvzWbSayNQ#Xa6!3w1cJ zA=ApAPWsov4EI~)?>EIaFZ>qohISpNuOXaucs%q@r(5w9&@cxwdEWnk1G`(DC)2vX z;9JP^jYD-doHWL5OvvczmISSB0HqTs+LhP^b@X|s5X^_iNJ)T+G01xQi&uab1 zN4cZ}bmuvG@KHVeUG2bWh@pKYVDREC6uh)8aw{bMeZ_3Ev~UmJ`;-Jn!>2*M+nHNx zO(RUS1e_XXDa2j@fySk=!tueK>oK#xkMWs_VdID0bA7bY}d8eNJZ zKU*KpPb`@%GByI7+Dj?(FF=NaC%+q2b>lgr3`-L~4Klp9*Ztk!2>W+RENs^-z_-;R zJ9e`7U}eO~k#etTFb?#KDYbeF8*A;X0|N6UoKP>zG_cc($+&fp7I+6J)a z64;kHXjqP?>j#M_1Cs9|JvCJe(p{le-j(f%jn*l&%683 z&E!l|D&ZIM+IM+uhi{nm6c^ISs=4Yg(E}fAw{wt9FxBCtPjHp?jj;fPFO#8T?JX*nRn_ z+r5hu(0o_NRD|?*u6%3egDe|RGyi;5(LgVjpGuBNCj7%_?C5u=Gatyg{U?j#Q(a(x zP^S2uc^%pc9J#4qGX-D#rg!Qxen9QeA-%se-Ozg@be_6Yi)M$mivMjP&wuaxmjUSy zc=Yb}Dx(`+u-_+Rf@yCZey|-Ex=P|#cI$?xWtTdEd8+UMmwW?qd)z^>`@MLy+r_3D>)y?V7FaKKy~)bIIP1wOufgn3F@t_y*f||IpGT{_kfb^=9?N2c%Ms z$A^o$!1`lUYx$j&1pIbw4 z{bjkL6X!T^99Hdg;VHvs0k16h!{4L-oOaiNhf~n~W6fDJl3#n=cTC3q=py%2Po>@A ze1m0IqmNI;4Z%%*IZE34agcxJ5?!{Y49DNE+DI%lBkkAm6UE7-Kc!UGU7#HYC$)pg zEP184ni$Q(xX_I8+APAntAo&At+1x$TrW6nQ~kDq@CSdsMtnYR@)0Fpdbb{IZ2+Aw zmW}5Ke?c>2<$aBz2XCogI@c344SMu+>{=R)a3*c({Sl{pbdX7V>N?(yTem)!;0l?B zx@|*^oP3RtSd$^-#aM_8Y^N3V&h(&%P3gUKyJ^_GoSYN$r~xXzFRQK$7ND{pOZt3G zHB(y`WRx*Mm} zM>t|h{mRZbayp6QEi{MJsRYgC;sHS+nXc14$e3*q=y!Pvizsc*MHWh zGBY>-=Rf;@PoL`Fbh`ds-{-&81^aisl>b&2>|g!-e_j{N=JvnYCFbaVw#$F3kMkez z{jYUfSpSo5i-o0?vzy~T^^pEgl3@Q~@Bga~+dnj4{$2OwpWB;}2{PI8c_kZl)f6Wi>9=p|TogGXMtJu1k+c;ZU?RNKYvvmJA6~X_$?jVsc z{IBc$f35fUuky*i`uYESo{7=@Ut#xu_xJz5={^3_#r|)8NtEFe>%2~Z*$~R39q(Ph z!lq;Qv1j4gDA6?T%~0ztjvq zq<}Iu$y`*SK)g6lp(uMGIz3M;pm|}66$_L5kMiDt)#XvSC&5&pUHrrBb;||p)73-Q z#07zi;LO^u839o7qsDBmf&xptecdf@C{TA9&Iv6g;Pse~wY6#?cxgl6^3KU9aM}sTw@Zl#}!QC&PltP z*?`l;V1#*D7@Ut&_1t!o0y|dL2ba%L;L_qD+faUTt}(<^O7V;}vhRp@`4Hre*1LP3 zy(8-=UXd*du<`@Q9aGqSL>*Z!KUfe97cfDsTnK#?*>?RUsG_w)sPN8U^A$ z`rSW1Pl1lsSHC-)BT(P#teCu#36?zVK0bTO2JfTcGv-TFusX6=sI)l{f*hP2?(q47 zro>E-=SeGgnCR%>uR{SAPDTcPTM9UqjXphWn}k>IeknHjb^`yJX_nbJ`9P6FeRSu?pqc_{K`Anb&y7UyN9g3vDI%BAPO`*V0rp)oQr|LL-o~`~) zr7>`R9pvf!;|OUoR2IFHROp;*R+r^8#}*&iCJ943oJsMhvr&(QGCOlc<_8oIom;-m zK1PA+U1O864}&qs%j2%8A=?)bnUYgS*D3K9K%QQTc2aN)5sw`h4ZJP`|7 z|K_(Bvg>}hy@&XZvC+MR$u`s%`+Wg=4&Juw*Rn*OrSlgjJ44}gGXKJZ3shhg zmpqZTHyq+68-m|C1%P@RqpH?lSKMCz+U0Q+1%BUWxW^n#f$>_6#4Rpf@Y*IdK{ml0 zHcbg-Fzq&j^v@m)7mca#^QL2d>>ejP*~e#8svnL|pQzfg3SY!ayi-G_RTTK@Ch15= z_D!%{yel!<2bdGi?GYS{!M`c)5vieyX2WmDj`0QcdPgJF=dw`Ag(ushtA zznRQwr+}4oBBM)kR5%kk`6}U#7bvIMrS0>x!qV+|T9Ls%XnMU$I;DdGZeuC=d)`xE zuiv@PJ;&W)EAu{I3kDaYOP-0hwiiaj&cxhNF)9oy71=P;8pFLYaqfMA?jUBuQ9plK z1yt`wsP7~1)hKp}#rY`(gm>wD_7&B_H4oNuRkNC6+~wtiiM3&1nzgR$;u$Ig$#>bS z3wgnCqzHFkq%8zZb6_K#7e06KC=UKefn$7PNn#}wczf`>#FKtY?D6T(J5=b6@O{HE zmMAxfFWQhPB10uQ8oj*@+%9-Tkz6R4x56ThOYJ^~%)qCaqA}7$0XtTz!{ZnVoa_oO zPp}FCjc3|9Hu*N_Ez2gU5*~~9lX)`QrKoUD#hK;Hsw)=CZ2Y3*ppPHBN4no~+2O;T zXG1p7P=PDj&4u#?h1@5(Q2*_@Ct$pX2Z@=CRcX9~?I~=4!ea#f(xmh3l za3sq}YQP11tQo@nd39j;s?n1rlD|^RMXO8)De!&aorlp8TL{>YeoWmm5?=LQk{MpH zgPzxa_uV>9_N!WF!!JJ_T=!1T$l{(p#x=ipa}bb%fT<`B5n>lc%^tCXWZzlZb)UX- z3J04kc5$|BA4oOfljgPEg)G?uG|DDah{py)Jk$GY9`L?v zU+MW`f0(FjJ;3)#2SmmMCjTx`;FW`JS>P24wAH@RNUpgI@7+ykoCG65DEfGL^s(>N z%p&5ghQ!X!70XItG+My+(qP@yk<*|*$S)wP=LhneR=KB^DUhoq-emHO0{c%EX6&}} z1ty-7y+Yfg;Z1fXyEAV%^f1mV1dur07}WklXstPJDhavTD&T=!73}^yq;+AQF);tZ z9SZE*WV(4nA_bgw+!Bk{3PcxGEA9)&)u6m`a{3{8?$D>HE#aC}@bIZ!N$&T;r#c%4 ztEaVz4$L~P5YaQxIA^PU{tc?q^1+woMKEqL+k4PT-!B@+y;)P#i z_oll0DnQ0x?jQ06@#LOflA;8O)9o`yKHf1qi_%qbUu9f1(a}xPt6SU>UDYa0`9D)& zBA?&*iWdb8_t=KBpVUG>%litnB|h+b#U%6Q%_~r4^=;Qb_MKHSy;{-H6XxcMD_bjE zaD{<(o7|-!nD3x4ijp|pNAX=S_Mw2+a*=m;FAWM$|%Q{kv;#>tA~azJ}Cw$W%M0v^mPJvzhZgI4xmlx_MbP_n6p zuJIcM_$J0rC%A`T!KE`rG+V9UQ;mexP>va}UfvK9rA>vY+a2XTHS9{?!Kkxl6J5eW!4)wlo#) z`s56h7#%}n6p+m>(twaBEiWPh195UZufvM?P5Kvg+QCr@P>Xpyv$|cezO_O5tEwN$ zvU}Jty$eA4@W`oVvR`&<-$vgpJbo)BZP#=HKEIbKMSv$>Q+fxf027QNpo za71*&(L5tF5KD7T2$hqEU)x(dLNz_nbAEQQ@CX$crcS;Hm9WM$)MLJdb|FaDdWelv z#s@bu|JdMAPWEfLdZmrnDfRPM`&XqH4BD0WJc1z%4|0n$g&TO_`bABVWP%eERZxxY zmLV>lN)|j+;ST=i9@j(`UqZRFPnotjQNVVujQ(IR1u9+VLN3vIWAUi~rTHaSWbbI> zvXqQOZo4ceT1zUtFL~qq)hrMXI0RbRXqw?e&u3)}`M!8XJD(@hlmfh>St)DDdsT8A zx|?;(54lDxIJ|1Tuz8bNi+w2311fv@)lQVyC;97GN}ma+`*~5E4#}WfCi7J>ISp8( zOFO7jK!Givj1;s8&iwi<>tK;8JMO9yt<|{d0BzbYO)vAPLk#}rw~{3L{%zNJTW${w zn%&hXH*E`aV;vrk!(BkvE{LA5kpfqPpO}k`P=HD5wR@$gKSZe<-5qKl1aF>K2aBs{ zVL!vcQ*ESPn91MQd-gm6gS_*^%KwCMrgpTLpv>@Ed%J}J#@7^lFSoB@B9 zflv@0)i+HolqdILFYl*ScEht{Zo0)J-tF|?$3El@1S`>urL7j$sIX@FPEeEqT5fqH zQ%v$k*So~hZzOMQo0iZ%m>mr?Vt#@g?iXQ)nt%1<_m;@}UNd9A5*7A@XKjA=%moW$ zX+Q2w^MFsA99J@i9e~T}UZQ(31+;#`W8)7L5YfhSt1lcuD^=^^Y-1=~{o=%{d(8z( z2NP^Akmq?QeaCk@rw{sG`TD!*^9AH0r1#~Dm&aDKF8!E!PT)(oYmxL>3~NLDA8RD&7O@wB{9)f5D4Sc9V+nUwM8C1r(C zVqc?Mtot`66a2f^OD1$%I1cQ)D%!u@8y7b0kcjL)4~>5hs=p<6-t)nRI*@&V%qJ6L zm)ksWa_V#0^;L4O(x4^EV3Go~4wpTbiJb<=kE9+JjE7sIwuZM}8h{&rqm+82H8P!7 z;_*67{5hK6$Gyl1UcD+*)Lw6bM;!w{@{;$C_T73TwTJ=^8M&j|NnKW*mF2su9}KzI zsGln*+#&sm*o|$bR#-bxS)?RLg^Bat?M5yZ@R#FKP_?TwI)(iDHO}siA&%n=Uw%?R zV0GZ0b3O$UgqSlfc!$9WjnUa}Hw+2hS@*3k%@{TQDI%*b?cq{VYoOvnakf1 z0O|YYH`R>0BI}XV@5N*t6{p={>bEH%Hx*0ap!G+NB3=HyuPxB0(fh*8Q#YVf`zvm9 zf(lo(wjGXk(uSAr4MT&`p1|0jJ$hQi7IOMt2(Hdk!26K3!J07A&n-w)qF4wBPyAVA zI^zy|-FT0%bOvH(Ut9mRa|F-ZA6jguxS>(8l*oo-?wBYOGF#c|3Zf%_YPJwRHhZ~6 z+4vX*EOOIy?<8GCPJ}leln{K{y;OTlHV(KL#r|w|p@N@-Wq3+w0RC~Z%{@j5fZyRS z4^Yw~z-4EA$QjZPct2=Klp%dw$Crz@4^{fX<9yz*oJaC#KYPhAuPPY3GQY;lv6Hyi zSSi*vb^-75jE!~-Mc(JBBB%C-qs6{b%`2o1GAo!x z9gq`*D;>T21^9e`VFaq2REF7%S z^pl3&4U%`OrS2wo^Zbv0Q#j}b<#g)e)>yMSe;*5;sS7rg0vgQke!Obws6oo3s0 z@M-zfm{F=GL{)28pqmA*eg5eB#cC24Cxv>ANFTTL`p#p6cS6ZM)x=LV-cc~nA0Q?? zjO)_j4DOVsc@Pmu*BhW7?!3AsxWU5ul_mlqMDYtRk(+G16`JFS^cK#}SmwIdH?e7Rl zuiWjKbg7_oXYGyZedbWa6?;pi!W}QpbQm}9^8o|KUn_EP6i`=rRr~8Psn7T)zOFqM zPHaDx>#;Tr45hzCMg9sxCiy|*GlU0-?&(}G4|7A0-k7(lT~7E@k4tT?!W4{}@1{AD z_+mOSAmL2!oYZ^+bTh#`VQz zY(6l2Mp1pkIXegtmeLQ)B>Rm^RL`s#=Rlal-OnY`gme~HAyO)R%eIh~+E=)3pc5eIO-?T{2o>L9(H0*lpCbL7t4U%98t z2OS5x8Fn#iAym^DbXR47q0RDbBaCcbN9{C>kFIF!Id*igQw@etB6q4d!fq-< z{!qUsymi0W7F9-ppC@YtXRmPrVZEl0Rc=r`6o+W(U zr@yuXUHeh$gOHA7hC7Jpweqnpi^1aRyPJDRe_>ucd{R7t^vzouBX?X5!olmkQI!Mk zKtr?j!>pqlkS`9e2U3@Fi%(jcNV_4AdWigo`>dc4{ZmFO!Vhe6emD7$y0a!uZe*79 zPyQE+s-H#iA|)cJ_1?*g*isin^I)$N+FjzS$tC`A_#Q z7}z3pVEd>9S?AOZdWH6b6j*sLKF1nx4eOK|=|ew+fWqm%1%sssxT299d(V#wpV@EH ziewsKAZ7JAV~HCyS2oZ`Kd^)j$>)=T1aHi$)?XMW{y6G3C%olv5ZDW3W;@)|!MGOt zgo4Egq}^WbEGIzvrq}G#GD7aKpY61CiJcztv~vgl_+q|=tYfLntX0xBjid{tq-41Z4rrg6S= zfC~;g%?>M4;RJ`q&qoJr@q}T9o5ck)G%_6C*RVYlzD=y@@p?-5XKkO&TRJG<(is|m z!Y&-1=sYsNW*!3pH*VcI5t&Y!C1hN43w#5#2&I(guUsk1~se%HmKQgrP zZp9QYZWyGM&T+$&LnTbM-DICebWP%35?(aVAx)E~e2U5UIi8H~%iYZmIV#)VI1_*VTXiJm4e`hCQ8C=3W0#=+ z(Ji&ZixH66ZoU5UY6z}A;mBZ-pn_qBcyN`!7sPwc97%X-52d=79roGygJajlKc;^%1|ChZ8ry9xKN3{XPAG_3fp4vQ}o&$`^;^`sIVA)1|6j=CeyPo@~h zc`XcAnY+PS7zKv6B{H9OQsC30vZ9^8C~&Q4mZ>k!58sUhN|tx%fnRGcpZKCGs;m_3 zvL}7_Nhu~*$5VFr!lUp9+;PI4dwZ+JkGO%lub6RD0qFyE&khw{qX1X!nr9`(E+}GX zT_aII`i9s!-F*@fD6;+bXonFM6l4xWZ|YFP2m1?KT&!GhqITr|XNC|I7rpBfKFJKgypDb0quqaH3DYZjV0-m0i5JsO$kb z37XpVJA7bNQ18%Rf)Av%k0h=o^}R)GZSunkTR7_4P`~4xD;6{*-d}&$3Y&KfH4BpZ zKJ2#nlX8m(JPkY`@+342c9}-053bY48$9+4=SV)aZt(iX>_Gg7vL=0K@-i0byyK~L zF@#BxzF`V;IJn&T^kRna2|;!>ZeIx>&Ghuv7xoXPKzFIr|Ia-aFp!vZT0{DQwr59& zuJ#jNLW(P=`o231j=%+u*P`%oL;S4jnLrc`u9|pxj0$SqFPGC}d_X{!i~i)O0c@zY zP%c|_L9e{6ebdvcH5QWS(x9y=PXH3Pl3T%RTbi2pR&R;L?~xr)YJJ`wV*lK2h6s^tZK zIBhl+9J@9YgzlHG#*=wLwc`VSxUY{fOVW;8o&|zp8UI0~Np_1e80`Hd3CRun>q5Li5 ztw(p|P+3SsvGjB#WMnHy8;4tCpxk2F!)el2u+0VJl0N>__H@mJd#;%D_dENB!63Nv zYBcHlk{;+v9>3#;zDATzm3w_nKKz z%pOx*{7CT6`Fqzk^Zum3$4W!_7iyQWQ$F`^M64rnXq>#UkAWUl^K2(JDp29xs+_Yj zjTUYU45>ItwTF=V;rdQFK_J>u?5P<}-e=20o!Lpkk11X;aOhWrjrXWq-u%!)BTj{s z9e+JAk~`O@pPQ@`dn_XJfGW;2^F6IJHpHkV*Ok}LPosfSP+=*Fs}jy8>Gy<(9@*tG z$kh~pPHz=0Lsv}6oXq&E=j{Mg{UvbJf#9fXOsNg4=A+UFXlTdHjxS3a(2EFbp9+Q6 zs+WJ*d`W!mIG5B%{P6G>{gaFi*YN!Hj>Bih%yC9ePa`AG9!J)cTHYu4Cv<9L{b31T zSfjhMHyc90{m}Qv>Jg!^dXsL$$7h6ZseMV^Ncg11H#60BCZVwDQTP!n2YVcz53Q{| zzU-tlCp_{Mly!-Mqh$o>!jB`BmVQ?bBV=KXJ!~v z+s7{F>j1ArJ@hy4bHs1P%rz>+zR*7=Am2#%x|Ca@uq7OSDJ#wNR=A?Jec12`q61y0 zUKuJt>fnCbz3bAFY*BC*iY=cA!+j%v{AO&(duy=q-6H-cv)J?K*gFceTX9U*%3Q-& zCrw|OzjZ}v?`cVk2zTi5O$}or^QP{vH8ng&A#iHt%t@QLP`nxi!9T7=q9oVpx&Sh- zdbjV7Y(Z*x)lCVk1bvs zh2zdD@sS1YD6ARXCvk`PbM=V+4+Daq&)N(~Gt< zpUf|8h6G2zSPSQ-lUq6&6!1*l%UJ()EGVb&bNuaJ3LM=b6-0NL%rC4KlGidvLTb$3 zVYjopv1K*3!_Z6@D|udARweaf$723e#nA{j`#7LA`_VO+PT^ z|Lyv4HU$zTMAjuyqk(VN;0(j4HSYXMlc8|UAKef6zv3eN>dYDE3Du-%yv>}&@xsIo zy?d;ML(mFTCpjlVN&PFnv~4!th46^Wx%BC0BO$Xn)@!xI2Y)SonipaSh4E0Usd7~+ zR6OLr;B0UXlruYDtmykf{pY_*e;*Rv{Kt}eMhPF0CZp&ZcaH+UQ1tby&{HV*TToV& zHw^Qv&K`O>9tjE?E7$)c-j9rFN6VyG!%k)lJ{({K4@QquI|X!+?$9n3UxGI_TmF6$ zOz`+=g}qi+QjH*P-Lr^=d_4^7l#^L#_Cx2IABH{zA0Bg%i09lD0gpU;1GUdPL4sd% zKp#a4J%0PkvtOaWpFXB9BP7l`hgEd4QoPVUw$wUaK@RF)>$P~@H$Zi-naC8NFr?2%Y5SWvS@Hy#|h1kcTodhycGR=keh5kD_!7UY;(!9wzb-OttS zQSp@)SMM7NsKwm7xiy90&2`R^r(Sr&uTcGlbpLqN-78>jr|t_Y{_~?rKm|sv3jY_S z+UR?bvhJz2J18IzhmMT`n09ket4O`b`(tmPNAgGfv$h&#XMdQkQa=>^%L5a(jf~E% ziN!V1%=Nzro|m5v4{wgsf?W}Lx_T;ZaGN{dW@^R?84G^Vy(4}5r5sila_0b+nQUE@ z*{@)t^UF82RGqL)xM?M7_{%& zjuk{uAYz9qOk|L`O2D&soHZW!;PiIwre9&?`xkS3f9ecCDWhX1hs^c*XNz)vJT}7o zZfUonenYfuv=C5Y@y42;{P!Lc-mk?a%r9?>ykGM*YX(;jRQo<+FGx*7b~N z&Xm>*?0X1*SlV2)e9a5eTQcbuq(VXajrI8MH_o`6`GD)_CsNmg4z1LYK4mjX>(rKC zM%S&mt06C3apnih{C%SP8PS{D(?{ase5KdxgsDi#KGt{4yDAB}XYz zHUeHs|g=bE-|bBgRJwwvX%AX(k>`% zag43abBCPMjg{gX9ec76#dv-fOUrr~NeVWpRAm{!J!2-4{)~e2!O= z`LeW;#F{YLXc(HbijsO{0j}96XAdbyV11lvWneFvTW#{(nMQcBoikHPf^7lt^x#12 zHz_x4IN^4`8{*J}TSg^|%nQWovkQBT@0liA) zkPV~`UfrKk+7cZOEDIZ)VxmKc9+5C})~u?!uPI~ zVZJrx8i_e^)jRc`c%sSstE%VLspI*ZNjg5W6zDf||6xJ$2BZAoTZv{@a=t2Lp*z_K zFX`^?ix*FX+iMd9j$2TnOjMmN)<+X4L!BR`MxZ2KB-AZ6ONw2z5)eP zkE4#@TOiN+Vvg{c-)i6fgMThKA1Wxi`3h`Po*a1U;eX|>s3vf<&UI~HI?jO$F%W#9_bK62T#8Ze)OhzXS>34Zs znz}cL1R`A=&CV?aB48@YP|Nko4dp_QhrA^>1u48|0()VcXNOTtNllpng50XFnS*X}k;d&;AD;u*6 z@|}{nKI##Ii4V3`*mn72xFy9;pq9*=RGw5FP9lC-{^v-&p$V!e*y`so$Dq8j=cjF4 zanPnTdasA@3BB9A-v2)03;gSj^barxfKy9i^fS#c6kfGV=AI{fy6JJDbp*GvxKL{7 zx?S*R{Y1Fq-#~0_Hmtk+(GW`MqJn$m2p*eeb=hoZjK`y=zv*6GkA52Sx&~r)SolS$ zq?F*xROaK4lu180DLqf6DmcNXk9;yb!e&@jFgqLhG6WBNn>A7+{CuWIFYm`xQ{=Li z6b&-=Y{i6GHpP# z)BJg<4;9k$UB(%ndq5qV&pokMQMf%^ZrvMoPYihB`2HO6zgk?|ruQ^yRU_#($;qgNt-U?lQ-Y4TFZMwHc!^vf)*7D8Ye0zGkkEue2LXs z)fC7_E)BXXEg+tUTZWPJJ4+`l51d#a&&9=bhq5aeyD?( z{xZcPgKZ>NdQ&KhkK_x~5u7l-|M-S@W(QzcKGDPF6b2sK9qiQS{7|W+USm@nnSX_? zuJmORo`k2wbGh6YMHfD9r&VyrFvqB%#ywG>{J#1*C*jpM+p_2#a^wYKBjK?nUn7FV+T)k>ax?o*p(nfO6?jh=@2 zV3IeM#73L1bvh#F4W9H1YGxQRbo#{ECq}Ssg#C)z0V+6s`MUMzMh{S?9UP*~It^>n z-c2OiUVt65C!PhpAoyGAXbT%X6>dB!*N|+B!EN_F6Kw8YMftZ6&;D^?$Bnz*DC{P7 zo*s?!7~13u;-+iut>;6aLVm1KBUJ-miwsZ2+fyJwp?<@Af}d9&%ofbM>67o?y0(n8 z2ZFY1&*X1YZ(Mz)Zu^t)T4P0PkN92F0d=7*qPt&3;}N(wIoqoD= zeLHzSCaJg2>b;3dtfekNcVu`@v{V?_ zHEu1~&MSwnY#%*kP^W_Zfj@a^(wdNLTb|sOs|!xkYQ-CR-Earrt;+{V|8{cJ@a2v? z3Iuz3?3jNP0xt&Ll|8?Nft<0Mn8jODxcaD9uY~YODaR>Pnhta9Son7B72(z0W%9h+ zH%Gw1+KFv#tAt-;9Ze}EJZ+HIrSG(*UcfdSRT(A{40Z$0g04$RqtrXWr~I6xzJGu1 z>6GAy_o&X9)lL3L8x>Xe>URL#-}Sb&kMx!1YDZ-Q)5v)e2Y>TqRl=j3b=G)VW(wt3 z-sDQ|^~NX#5C3Wsr)?8-EDO|VRJC;w8`E%u^$NZFyPd8;&F>ezm1G^Qmi&?-60Zt& zH#+`IhrytHbKj`zCH!SnTt>a80XN~#?|<~&J--b1aCo}FmCv+6%48ms)UslpXlaYw zcgQ⁡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

NV*<7PGZ?`gAoni@$5 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�&~hN{=i6K|{H&4wgS?$lK?U4SI&29` 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 +[none] +mech none +ngrains 1 + + +[Grain1] +(gauss) phi1 358.98 Phi 65.62 phi2 24.48 +[Grain2] +(gauss) phi1 121.05 Phi 176.11 phi2 295.73 +[Grain3] +(gauss) phi1 43.79 Phi 113.76 phi2 345.90 +[Grain4] +(gauss) phi1 265.15 Phi 62.52 phi2 299.71 +[Grain5] +(gauss) phi1 221.23 Phi 26.54 phi2 207.05 +[Grain6] +(gauss) phi1 249.81 Phi 61.47 phi2 152.14 +[Grain7] +(gauss) phi1 332.45 Phi 99.16 phi2 345.34 +[Grain8] +(gauss) phi1 312.27 Phi 118.27 phi2 181.59 +[Grain9] +(gauss) phi1 303.10 Phi 48.21 phi2 358.03 +[Grain10] +(gauss) phi1 338.26 Phi 48.11 phi2 176.78 +[Grain11] +(gauss) phi1 115.17 Phi 56.54 phi2 223.84 +[Grain12] +(gauss) phi1 281.04 Phi 97.48 phi2 27.94 + + +[Grain1] +crystallite 1 +(constituent) phase 1 texture 1 fraction 1.0 +[Grain2] +crystallite 1 +(constituent) phase 1 texture 2 fraction 1.0 +[Grain3] +crystallite 1 +(constituent) phase 1 texture 3 fraction 1.0 +[Grain4] +crystallite 1 +(constituent) phase 1 texture 4 fraction 1.0 +[Grain5] +crystallite 1 +(constituent) phase 1 texture 5 fraction 1.0 +[Grain6] +crystallite 1 +(constituent) phase 1 texture 6 fraction 1.0 +[Grain7] +crystallite 1 +(constituent) phase 2 texture 7 fraction 1.0 +[Grain8] +crystallite 1 +(constituent) phase 2 texture 8 fraction 1.0 +[Grain9] +crystallite 1 +(constituent) phase 2 texture 9 fraction 1.0 +[Grain10] +crystallite 1 +(constituent) phase 2 texture 10 fraction 1.0 +[Grain11] +crystallite 1 +(constituent) phase 2 texture 11 fraction 1.0 +[Grain12] +crystallite 1 +(constituent) phase 2 texture 12 fraction 1.0 + + +[pheno_fcc] +elasticity hooke +plasticity phenopowerlaw + +(output) orientation # quaternion +(output) F # deformation gradient tensor +(output) Fe # elastic deformation gradient tensor +(output) Fp # plastic deformation gradient tensor +(output) P # first Piola-Kichhoff stress tensor +(output) Lp # plastic velocity gradient tensor + + +lattice_structure fcc +Nslip 12 # per family +Ntwin 0 # per family + +c11 106.75e9 +c12 60.41e9 +c44 28.34e9 + +gdot0_slip 0.001 +n_slip 20 +tau0_slip 31e6 # per family +tausat_slip 63e6 # per family +a_slip 2.25 +h0_slipslip 75e6 +interaction_slipslip 1 1 1.4 1.4 1.4 1.4 +atol_resistance 1 + +[pheno_bcc] +elasticity hooke +plasticity phenopowerlaw + +(output) orientation # quaternion +(output) F # deformation gradient tensor +(output) Fe # elastic deformation gradient tensor +(output) Fp # plastic deformation gradient tensor +(output) P # first Piola-Kichhoff stress tensor +(output) Lp # plastic velocity gradient tensor + + +lattice_structure bcc +Nslip 12 # per family + +c11 106.75e9 +c12 60.41e9 +c44 28.34e9 + +gdot0_slip 0.001 +n_slip 20 +tau0_slip 31e6 # per family +tausat_slip 63e6 # per family +a_slip 2.25 +h0_slipslip 75e6 +interaction_slipslip 1 1 1.4 1.4 1.4 1.4 +atol_resistance 1 + + +[dummy] diff --git a/python/tests/reference/DADF5/tensionY.load b/python/tests/reference/DADF5/tensionY.load new file mode 100644 index 000000000..9332144d8 --- /dev/null +++ b/python/tests/reference/DADF5/tensionY.load @@ -0,0 +1 @@ +fdot * 0 0 0 1.0e-3 0 0 0 * stress 0 * * * * * * * 0 time 20 incs 40 freq 4 From e3f819562136fb3f0f5f344a912778581dce5817 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 23 Nov 2019 17:08:36 +0100 Subject: [PATCH 127/233] no not change line endings --- .gitattributes | 2 +- .../DADF5/12grains6x7x8_tensionY.hdf5 | Bin 1935932 -> 1935952 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 2f356076d..8d1f26a78 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,8 +3,8 @@ # always use LF, even if the files are edited on windows, they need to be compiled/used on unix * text eol=lf -installation/mods_Abaqus/abaqus_v6_windows.env eol=crlf # Denote all files that are truly binary and should not be modified. *.png binary *.jpg binary *.cae binary +*.hdf5 binary diff --git a/python/tests/reference/DADF5/12grains6x7x8_tensionY.hdf5 b/python/tests/reference/DADF5/12grains6x7x8_tensionY.hdf5 index 61af6bbca6d8b74a2dc5f9d45ed16b5044278c02..caafce4784e2e9e3f29f8bd6dcad4e338a238153 100644 GIT binary patch delta 2240 zcmZXUeNa?o6vpS?{b1MqV3)m1;3^9%No87qP-@tejH@6Tv<0h(IO-olNQ^|II1*!& z+GIniS7)>|vnD{0Xm|_xNN19om_oCNY6c~Qp<$-UMq~JxdfxZMa%cMMJQrF6);$E`&B=s$w6u_M-{cI|#y=hcC^wI+?D@>YL#KJ97 zugv_((!)pi8?~x=kmX*H6g|&Xa#f1)i=_Urb&}d|mqm%{HDM@`?I2Y5B|Skp^kmGN?zB)3!YtT%3-ArU3((0(_CpfXQ;h-nw6~4U42F_4ziS! zIzS>2km}CUIv-a=dFx$LM450#7r>pMWFu#E@f}!FnJ?7{Bm{)?{Bom@D?<8q1t~&O(u@Jz5z>t`A_KS1t*%&##+c z6akDPBLaBDrwGVieZMKd753^#2M^%ro}LGXPMKi_0rmOrklDu-^|@r26l_s8YVqdL z|6Uq3w@%@0>f#&2bI?V6OI;kBZ`qd3Wp=40WDdJov)dvnP#34mNx`P5Kn>KrY-tXn zfuHtT@*c-&HCv+>@j{}J<`gR$iOk+*R#yV9lM1bKV)+ANI9zSjFvtf;QET_UN{T@4 z)CfiW9e>SQ_#U$5Ewt^<=f%Wscn{dLRIjwz>T`Ih#WuT^YOB+(q3VwyMa}mrcHVqK z8&K?6_ZgIt>vlq!{?V=-!%lCw2H{pLDMASPND;!d1ws)*Uwn9VAxEeQzvIQ3aXx%Y zWe80$TH?Mu(3p8c@PTQiM{{>s@z11kp9XiMM%X3LJ?Bg7Uk(ZDAMwivfqv~aYR|3 zfwMT#-S=P!?f53Q6oaSg9(S8-7V+NOZbEe3c54y+qizji*YBhV(JLLZAia#e8yW1FPnc>Wm)D3?}#&HK2-E)%KJx+=^S58EVy5Phen-q7% z**+DCKP(#6v+VZxeV1lN^}d0nKN__?TP_Wl?NWnUi_Z^QGrD#O! zPl!9R9yl2d>qsuPY~QiD*fM0nmcjb3J#!m!xIFCjgskJAt#g4#)S@3w>iwk1`o4vp zS?fGploq z05N0Du+z;LTeI>9hs^1B5wK}Z8nwo#De*^ZB%+M*hg-zJQSa~bIqX?~@qT}v@Av(E z-RJw|Gt$w}-_f9NE8kYyYxv48wkX#U_EOQ*qWrdJ#R@O$y>7p*zjoC%GsQo3KE5yF zFAJR4DZ-giA;?Yp=elYkUMZ4`ib8{cay-_hI}rb5r4V9ald!OnT{Q_KA}ik_Jl)Pe zOSSq57P%$3^gJVaTL_e?VRkXfx3eWlRCAcrtw;Q@EUJgi%2bXo_2?)57r$4>MqU(^ zpZNBGLnm$KBD7U!+$pvytl*pu@DPB<5fA{!5fESw3h|sST{U+AZy(?Sh;w=_jP-iZ zLA2XNMTj4|tPgSrM37BiAqP%M10u@fJ;_Bq`qEtX(jWTR^Xz-S;p{tX&&P(H8Q32O zV-+)Z8~XEj8bH4=u>JQ8-)}BA zBtj$(TagGs?JIAvR&&?cVD;~2eIwS$bIfV6`8M)mDBp%ALSz@(oaAih$c370luxZ(Xr^+Y#kRGJ?aQ_wejR(Lp*c-J=$K2w6U7c`R3cF0T?rjTCHX`%QZ!{}L z=UxXuA!-lG0EO6bL_XqTKc0{;ZswM7Z}rPT?x>?hgXC%lWy++EZn#P1@J)G>k-a}8 zU%1DDSJEbA>?GXCU>b0dLw)_`uQbBFQ|2Vx!Ad9Lh7_k3_lK}k#SOgTls;seesLZz z;4erSra)}z37WY^!l{;%)>yEMS##}LpZJlxzRk9EA+;^XP z0{wN3TL`dA@4EY(|DjtxbrX8_q?^#C2W~=-J#=f)y)$kVJv!sQUCf@@;2Ap3W0o#@ z2z@T$(W2M=?a`o*&nMlyM~gnZNafi@55~Z9cjxC1fB<1Q!bN9>U&}U{>DRDTW|50#`88~>uJ>!$B9ne%i$3%d nTYGLgu`T7LYuSeL)79+Rd@2)L`LpT77TB_y*g|iv4rcueq$Z(K From eb80a82e05104c299c4b509ad86383498077480c Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 23 Nov 2019 18:58:44 +0100 Subject: [PATCH 128/233] first idea how to test pointwise operations --- python/tests/test_DADF5.py | 67 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 python/tests/test_DADF5.py diff --git a/python/tests/test_DADF5.py b/python/tests/test_DADF5.py new file mode 100644 index 000000000..6dbd5bef7 --- /dev/null +++ b/python/tests/test_DADF5.py @@ -0,0 +1,67 @@ +import shutil +import os + +import pytest +import numpy as np + +from damask import DADF5 +from damask import mechanics + +@pytest.fixture +def default(tmp_path,reference_dir): + """Small DADF5 file for testing.""" + fname = '12grains6x7x8_tensionY.hdf5' + shutil.copy(os.path.join(reference_dir,fname),tmp_path) + f = DADF5(os.path.join(tmp_path,fname)) + f.set_by_time(20.0,20.0) + return f + +@pytest.fixture +def reference_dir(reference_dir_base): + """directory containing reference results.""" + return os.path.join(reference_dir_base,'DADF5') + + +class TestDADF5: + + def test_add_deviator(self,default): + default.add_deviator('P') + loc = {'P' :default.get_dataset_location('P'), + 's_P':default.get_dataset_location('s_P')} + in_memory = mechanics.deviatoric_part(default.read_dataset(loc['P'],0)) + in_file = default.read_dataset(loc['s_P'],0) + assert np.allclose(in_memory,in_file) + + def test_add_Cauchy(self,default): + default.add_Cauchy('P','F') + loc = {'F': default.get_dataset_location('F'), + 'P': default.get_dataset_location('P'), + 'sigma':default.get_dataset_location('sigma')} + in_memory = mechanics.Cauchy(default.read_dataset(loc['F'],0), + default.read_dataset(loc['P'],0)) + in_file = default.read_dataset(loc['sigma'],0) + assert np.allclose(in_memory,in_file) + + def test_add_absolute(self,default): + default.add_absolute('Fe') + loc = {'Fe': default.get_dataset_location('Fe'), + '|Fe|': default.get_dataset_location('|Fe|')} + in_memory = np.abs(default.read_dataset(loc['Fe'],0)) + in_file = default.read_dataset(loc['|Fe|'],0) + assert np.allclose(in_memory,in_file) + + def test_add_determinant(self,default): + default.add_determinant('Lp') + loc = {'Lp': default.get_dataset_location('Lp'), + 'det(Lp)': default.get_dataset_location('det(Lp)')} + in_memory = np.linalg.det(default.read_dataset(loc['Lp'],0)) + in_file = default.read_dataset(loc['det(Lp)'],0) + assert np.allclose(in_memory,in_file) + + def test_add_spherical(self,default): + default.add_spherical('P') + loc = {'P': default.get_dataset_location('P'), + 'p_P': default.get_dataset_location('p_P')} + in_memory = mechanics.spherical_part(default.read_dataset(loc['P'],0)) + in_file = default.read_dataset(loc['p_P'],0) + assert np.allclose(in_memory,in_file) From 3be1caa4efd1174767e5ef47a8eb1c3459890c07 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 23 Nov 2019 19:21:41 +0100 Subject: [PATCH 129/233] read_dataset has at least two dimensions --- python/tests/test_DADF5.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/python/tests/test_DADF5.py b/python/tests/test_DADF5.py index 6dbd5bef7..c022bd171 100644 --- a/python/tests/test_DADF5.py +++ b/python/tests/test_DADF5.py @@ -51,17 +51,17 @@ class TestDADF5: assert np.allclose(in_memory,in_file) def test_add_determinant(self,default): - default.add_determinant('Lp') - loc = {'Lp': default.get_dataset_location('Lp'), - 'det(Lp)': default.get_dataset_location('det(Lp)')} - in_memory = np.linalg.det(default.read_dataset(loc['Lp'],0)) - in_file = default.read_dataset(loc['det(Lp)'],0) + default.add_determinant('P') + loc = {'P': default.get_dataset_location('P'), + 'det(P)': default.get_dataset_location('det(P)')} + in_memory = np.linalg.det(default.read_dataset(loc['P'],0)).reshape(-1,1) + in_file = default.read_dataset(loc['det(P)'],0) assert np.allclose(in_memory,in_file) def test_add_spherical(self,default): default.add_spherical('P') loc = {'P': default.get_dataset_location('P'), 'p_P': default.get_dataset_location('p_P')} - in_memory = mechanics.spherical_part(default.read_dataset(loc['P'],0)) + in_memory = mechanics.spherical_part(default.read_dataset(loc['P'],0)).reshape(-1,1) in_file = default.read_dataset(loc['p_P'],0) assert np.allclose(in_memory,in_file) From 406ae2989740df90bc25a556a3096ed48740e891 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 23 Nov 2019 19:22:18 +0100 Subject: [PATCH 130/233] adopting rename in mechanics --- python/damask/dadf5.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 7390724c8..60f993bf9 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -620,7 +620,7 @@ class DADF5(): raise ValueError return { - 'data': mechanics.deviator(x['data']), + 'data': mechanics.deviatoric_part(x['data']), 'label': 's_{}'.format(x['label']), 'meta': { 'Unit': x['meta']['Unit'], From 928a5c2e559ac6aaf338c0941190bac646b1ac4d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 06:29:00 +0100 Subject: [PATCH 131/233] better use fixtures --- python/tests/test_Rotation.py | 47 ++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/python/tests/test_Rotation.py b/python/tests/test_Rotation.py index eb2694502..72956c013 100644 --- a/python/tests/test_Rotation.py +++ b/python/tests/test_Rotation.py @@ -1,54 +1,55 @@ +import pytest import numpy as np + from damask import Rotation + +n = 1000 + +@pytest.fixture +def default(): + """A set of n random rotations.""" + return [Rotation.fromRandom() for r in range(n)] + class TestRotation: - - n = 1000 - def test_Eulers(self): - for r in range(self.n): - rot = Rotation.fromRandom() + def test_Eulers(self,default): + for rot in default: assert np.allclose(rot.asQuaternion(), Rotation.fromEulers(rot.asEulers()).asQuaternion()) - def test_AxisAngle(self): - for r in range(self.n): - rot = Rotation.fromRandom() + def test_AxisAngle(self,default): + for rot in default: assert np.allclose(rot.asEulers(), Rotation.fromAxisAngle(rot.asAxisAngle()).asEulers()) - def test_Matrix(self): - for r in range(self.n): - rot = Rotation.fromRandom() + def test_Matrix(self,default): + for rot in default: assert np.allclose(rot.asAxisAngle(), Rotation.fromMatrix(rot.asMatrix()).asAxisAngle()) - def test_Rodriques(self): - for r in range(self.n): - rot = Rotation.fromRandom() + def test_Rodriques(self,default): + for rot in default: assert np.allclose(rot.asMatrix(), Rotation.fromRodrigues(rot.asRodrigues()).asMatrix()) - def test_Homochoric(self): - for r in range(self.n): - rot = Rotation.fromRandom() + def test_Homochoric(self,default): + for rot in default: assert np.allclose(rot.asRodrigues(), Rotation.fromHomochoric(rot.asHomochoric()).asRodrigues()) - def test_Cubochoric(self): - for r in range(self.n): - rot = Rotation.fromRandom() + def test_Cubochoric(self,default): + for rot in default: assert np.allclose(rot.asHomochoric(), Rotation.fromCubochoric(rot.asCubochoric()).asHomochoric()) - def test_Quaternion(self): - for r in range(self.n): - rot = Rotation.fromRandom() + def test_Quaternion(self,default): + for rot in default: assert np.allclose(rot.asCubochoric(), Rotation.fromQuaternion(rot.asQuaternion()).asCubochoric()) From bb73a08cf4c39a7c6d1e604e0c2f7170d89efc13 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 07:26:21 +0100 Subject: [PATCH 132/233] better encapsulation for results operations, do not rely directly on HDF5 module --- src/discretization.f90 | 5 +---- src/mesh_marc.f90 | 4 +++- src/results.f90 | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/discretization.f90 b/src/discretization.f90 index dfcad48a3..873148666 100644 --- a/src/discretization.f90 +++ b/src/discretization.f90 @@ -6,9 +6,6 @@ module discretization use prec use results -#if defined(PETSc) || defined(DAMASK_HDF5) - use HDF5_utilities -#endif implicit none private @@ -84,7 +81,7 @@ subroutine discretization_results #if defined(PETSc) || defined(DAMASK_HDF5) real(pReal), dimension(:,:), allocatable :: u - call HDF5_closeGroup(results_addGroup(trim('current/geometry'))) + call results_closeGroup(results_addGroup(trim('current/geometry'))) u = discretization_NodeCoords (1:3,:discretization_sharedNodesBeginn) & - discretization_NodeCoords0(1:3,:discretization_sharedNodesBeginn) diff --git a/src/mesh_marc.f90 b/src/mesh_marc.f90 index e67d5e0d1..51b9465b3 100644 --- a/src/mesh_marc.f90 +++ b/src/mesh_marc.f90 @@ -119,15 +119,17 @@ subroutine mesh_init(ip,el) reshape(connectivity_cell,[elem%NcellNodesPerCell,elem%nIPs*nElems]),& node0_cell,ip_reshaped) +!-------------------------------------------------------------------------------------------------- +! geometry information required by the nonlocal CP model call geometry_plastic_nonlocal_setIPvolume(IPvolume(elem,node0_cell,connectivity_cell)) unscaledNormals = IPareaNormal(elem,nElems,connectivity_cell,node0_cell) call geometry_plastic_nonlocal_setIParea(norm2(unscaledNormals,1)) call geometry_plastic_nonlocal_setIPareaNormal(unscaledNormals/spread(norm2(unscaledNormals,1),1,3)) call geometry_plastic_nonlocal_results - end subroutine mesh_init + !-------------------------------------------------------------------------------------------------- !> @brief Writes all information needed for the DADF5 geometry !-------------------------------------------------------------------------------------------------- diff --git a/src/results.f90 b/src/results.f90 index 471f994d6..93355b6c4 100644 --- a/src/results.f90 +++ b/src/results.f90 @@ -50,6 +50,7 @@ module results results_addIncrement, & results_addGroup, & results_openGroup, & + results_closeGroup, & results_writeDataset, & results_setLink, & results_addAttribute, & @@ -120,6 +121,7 @@ subroutine results_addIncrement(inc,time) end subroutine results_addIncrement + !-------------------------------------------------------------------------------------------------- !> @brief open a group from the results file !-------------------------------------------------------------------------------------------------- @@ -144,6 +146,18 @@ integer(HID_T) function results_addGroup(groupName) end function results_addGroup +!-------------------------------------------------------------------------------------------------- +!> @brief close a group +!-------------------------------------------------------------------------------------------------- +subroutine results_closeGroup(group_id) + + integer(HID_T), intent(in) :: group_id + + call HDF5_closeGroup(group_id) + +end subroutine results_closeGroup + + !-------------------------------------------------------------------------------------------------- !> @brief set link to object in results file !-------------------------------------------------------------------------------------------------- From a6a6519678bdc86524045771cbcac022e965873e Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 07:44:17 +0100 Subject: [PATCH 133/233] more local data handling --- src/CPFEM2.f90 | 2 +- src/geometry_plastic_nonlocal.f90 | 2 +- src/grid/DAMASK_grid.f90 | 9 +-------- src/mesh_grid.f90 | 9 +++++++++ 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index 5e8aad95e..7123602f8 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -57,10 +57,10 @@ subroutine CPFEM_initAll call config_init call math_init call rotations_init - call mesh_init call lattice_init call HDF5_utilities_init call results_init + call mesh_init call material_init call constitutive_init call crystallite_init diff --git a/src/geometry_plastic_nonlocal.f90 b/src/geometry_plastic_nonlocal.f90 index 88634c245..408306b2b 100644 --- a/src/geometry_plastic_nonlocal.f90 +++ b/src/geometry_plastic_nonlocal.f90 @@ -122,7 +122,7 @@ subroutine geometry_plastic_nonlocal_results integer, dimension(:), allocatable :: shp -#if defined(DAMASK_HDF5) +#if defined(PETSc) || defined(DAMASK_HDF5) call results_openJobFile writeVolume: block diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 24c9da274..e83cf3283 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -27,7 +27,6 @@ program DAMASK_spectral use grid_mech_FEM use grid_damage_spectral use grid_thermal_spectral - use HDF5_utilities use results use rotations @@ -319,15 +318,9 @@ program DAMASK_spectral enddo close(fileUnit) - call results_openJobFile - call HDF5_closeGroup(results_addGroup('geometry')) - call results_addAttribute('grid',grid,'geometry') - call results_addAttribute('size',geomSize,'geometry') - call results_closeJobFile - !-------------------------------------------------------------------------------------------------- ! doing initialization depending on active solvers - call Utilities_init() + call Utilities_init do field = 1, nActiveFields select case (loadCases(1)%ID(field)) case(FIELD_MECH_ID) diff --git a/src/mesh_grid.f90 b/src/mesh_grid.f90 index d09e01793..2b337f047 100644 --- a/src/mesh_grid.f90 +++ b/src/mesh_grid.f90 @@ -14,6 +14,7 @@ module mesh_grid use IO use debug use numerics + use results use discretization use geometry_plastic_nonlocal use FEsolving @@ -99,6 +100,14 @@ subroutine mesh_init(ip,el) FEsolving_execElem = [1,product(myGrid)] ! parallel loop bounds set to comprise all elements allocate(FEsolving_execIP(2,product(myGrid)),source=1) ! parallel loop bounds set to comprise the only IP +!-------------------------------------------------------------------------------------------------- +! store geometry information for post processing + call results_openJobFile + call results_closeGroup(results_addGroup('geometry')) + call results_addAttribute('grid',grid,'geometry') + call results_addAttribute('size',geomSize,'geometry') + call results_closeJobFile + !-------------------------------------------------------------------------------------------------- ! geometry information required by the nonlocal CP model call geometry_plastic_nonlocal_setIPvolume(reshape([(product(mySize/real(myGrid,pReal)),j=1,product(myGrid))], & From 50b48b8bf7ecb7f75250c51d7550ae0d09c1e43b Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 07:48:55 +0100 Subject: [PATCH 134/233] IP neighbourhood deprecated trivial for grid and, hence, not written out. Test for marc/abaqus/mesh would make more sense --- .gitlab-ci.yml | 7 ------ src/crystallite.f90 | 52 ++------------------------------------------- src/mesh_marc.f90 | 2 +- 3 files changed, 3 insertions(+), 58 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2ccb6f06d..47cb2810c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -308,13 +308,6 @@ nonlocal_densityConservation: - master - release -Spectral_ipNeighborhood: - stage: grid - script: Spectral_ipNeighborhood/test.py - except: - - master - - release - RGC_DetectChanges: stage: grid script: RGC_DetectChanges/test.py diff --git a/src/crystallite.f90 b/src/crystallite.f90 index c35237b9d..ca6b737a2 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -22,10 +22,6 @@ module crystallite use discretization use lattice use plastic_nonlocal - use geometry_plastic_nonlocal, only: & - nIPneighbors => geometry_plastic_nonlocal_nIPneighbors, & - IPneighborhood => geometry_plastic_nonlocal_IPneighborhood - use HDF5_utilities use results implicit none @@ -90,21 +86,11 @@ module crystallite enum, bind(c) enumerator :: undefined_ID, & - phase_ID, & - texture_ID, & orientation_ID, & - grainrotation_ID, & defgrad_ID, & - fe_ID, & fp_ID, & - fi_ID, & - lp_ID, & - li_ID, & p_ID, & - s_ID, & - elasmatrix_ID, & - neighboringip_ID, & - neighboringelement_ID + elasmatrix_ID end enum integer(kind(undefined_ID)),dimension(:,:), allocatable :: & crystallite_outputID !< ID of each post result output @@ -279,36 +265,14 @@ subroutine crystallite_init do o = 1, size(str) crystallite_output(o,c) = str(o) outputName: select case(str(o)) - case ('phase') outputName - crystallite_outputID(o,c) = phase_ID - case ('texture') outputName - crystallite_outputID(o,c) = texture_ID case ('orientation') outputName crystallite_outputID(o,c) = orientation_ID - case ('grainrotation') outputName - crystallite_outputID(o,c) = grainrotation_ID case ('defgrad','f') outputName ! ToDo: no alias (f only) crystallite_outputID(o,c) = defgrad_ID - case ('fe') outputName - crystallite_outputID(o,c) = fe_ID case ('fp') outputName crystallite_outputID(o,c) = fp_ID - case ('fi') outputName - crystallite_outputID(o,c) = fi_ID - case ('lp') outputName - crystallite_outputID(o,c) = lp_ID - case ('li') outputName - crystallite_outputID(o,c) = li_ID case ('p','firstpiola','1stpiola') outputName ! ToDo: no alias (p only) crystallite_outputID(o,c) = p_ID - case ('s','tstar','secondpiola','2ndpiola') outputName ! ToDo: no alias (s only) - crystallite_outputID(o,c) = s_ID - case ('elasmatrix') outputName - crystallite_outputID(o,c) = elasmatrix_ID - case ('neighboringip') outputName ! ToDo: this is not a result, it is static. Should be written out by mesh - crystallite_outputID(o,c) = neighboringip_ID - case ('neighboringelement') outputName ! ToDo: this is not a result, it is static. Should be written out by mesh - crystallite_outputID(o,c) = neighboringelement_ID case default outputName call IO_error(105,ext_msg=trim(str(o))//' (Crystallite)') end select outputName @@ -335,8 +299,6 @@ subroutine crystallite_init mySize = 4 case(defgrad_ID,fp_ID,p_ID) mySize = 9 - case(neighboringip_ID,neighboringelement_ID) - mySize = nIPneighbors case default mySize = 0 end select @@ -908,16 +870,6 @@ function crystallite_postResults(ipc, ip, el) mySize = 9 crystallite_postResults(c+1:c+mySize) = & reshape(transpose(crystallite_P(1:3,1:3,ipc,ip,el)),[mySize]) - case(neighboringelement_ID) - mySize = nIPneighbors - crystallite_postResults(c+1:c+mySize) = 0.0_pReal - forall (n = 1:mySize) & - crystallite_postResults(c+n) = real(IPneighborhood(1,n,ip,el),pReal) - case(neighboringip_ID) - mySize = nIPneighbors - crystallite_postResults(c+1:c+mySize) = 0.0_pReal - forall (n = 1:mySize) & - crystallite_postResults(c+n) = real(IPneighborhood(2,n,ip,el),pReal) end select c = c + mySize enddo @@ -945,7 +897,7 @@ subroutine crystallite_results do p=1,size(config_name_phase) group = trim('current/constituent')//'/'//trim(config_name_phase(p))//'/generic' - call HDF5_closeGroup(results_addGroup(group)) + call results_closeGroup(results_addGroup(group)) do o = 1, size(output_constituent(p)%label) select case (output_constituent(p)%label(o)) diff --git a/src/mesh_marc.f90 b/src/mesh_marc.f90 index 51b9465b3..f640baa72 100644 --- a/src/mesh_marc.f90 +++ b/src/mesh_marc.f90 @@ -69,7 +69,7 @@ subroutine mesh_init(ip,el) microstructureAt, & homogenizationAt integer:: & - Nnodes !< total number of nodes in mesh + Nnodes !< total number of nodes in mesh real(pReal), dimension(:,:), allocatable :: & ip_reshaped From f30cbde99e27ff2d8fce711599d824eb347dd0e8 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 08:04:40 +0100 Subject: [PATCH 135/233] use first constituent as default --- python/damask/dadf5.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 60f993bf9..84168cd94 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -369,7 +369,7 @@ class DADF5(): return f[self.get_dataset_location('orientation')[0]].attrs['Lattice'].astype('str') # np.bytes_ to string - def read_dataset(self,path,c): + def read_dataset(self,path,c=0): """ Dataset for all points/cells. From c9b19444930d7ea9a9f6db6cf1d15535f7c459d9 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 08:50:27 +0100 Subject: [PATCH 136/233] handling of derived datatypes/structs currently required for orientation --- processing/post/DADF5_postResults.py | 4 ++-- python/damask/dadf5.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/processing/post/DADF5_postResults.py b/processing/post/DADF5_postResults.py index 0db018173..a16ef147c 100755 --- a/processing/post/DADF5_postResults.py +++ b/processing/post/DADF5_postResults.py @@ -65,7 +65,7 @@ for filename in options.filenames: x = results.get_dataset_location(label) if len(x) == 0: continue - array = results.read_dataset(x,0) + array = results.read_dataset(x,0,plain=True) d = int(np.product(np.shape(array)[1:])) data = np.concatenate((data,np.reshape(array,[np.product(results.grid),d])),1) @@ -80,7 +80,7 @@ for filename in options.filenames: x = results.get_dataset_location(label) if len(x) == 0: continue - array = results.read_dataset(x,0) + array = results.read_dataset(x,0,plain=True) d = int(np.product(np.shape(array)[1:])) data = np.concatenate((data,np.reshape(array,[np.product(results.grid),d])),1) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 84168cd94..69b19fefd 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -369,7 +369,7 @@ class DADF5(): return f[self.get_dataset_location('orientation')[0]].attrs['Lattice'].astype('str') # np.bytes_ to string - def read_dataset(self,path,c=0): + def read_dataset(self,path,c=0,plain=False): """ Dataset for all points/cells. @@ -402,7 +402,7 @@ class DADF5(): a=a.reshape([a.shape[0],1]) dataset[p,:] = a[u,:] - return dataset + return dataset if not plain else dataset.view(('float64',len(dataset.dtype.names))) def cell_coordinates(self): From 6060abb3752b01fbf5d7efbe98ea0856ed4fc29b Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 08:52:46 +0100 Subject: [PATCH 137/233] cleaning --- processing/pre/geom_clean.py | 3 --- processing/pre/geom_mirror.py | 2 -- python/damask/geom.py | 8 ++++++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/processing/pre/geom_clean.py b/processing/pre/geom_clean.py index 7ee87fe0a..50f3657b2 100755 --- a/processing/pre/geom_clean.py +++ b/processing/pre/geom_clean.py @@ -5,9 +5,6 @@ import sys from io import StringIO from optparse import OptionParser -from scipy import ndimage -import numpy as np - import damask diff --git a/processing/pre/geom_mirror.py b/processing/pre/geom_mirror.py index 3f9755818..77ec1f4d7 100755 --- a/processing/pre/geom_mirror.py +++ b/processing/pre/geom_mirror.py @@ -5,8 +5,6 @@ import sys from io import StringIO from optparse import OptionParser -import numpy as np - import damask diff --git a/python/damask/geom.py b/python/damask/geom.py index 6fb9af5a5..6dfcda013 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -311,8 +311,8 @@ class Geom(): """ header = self.get_header() grid = self.get_grid() - format_string = '%{}i'.format(1+int(np.floor(np.log10(np.nanmax(self.microstructure))))) if self.microstructure.dtype == int \ - else '%g' + format_string = '%g' if self.microstructure in np.sctypes['float'] else \ + '%{}i'.format(1+int(np.floor(np.log10(np.nanmax(self.microstructure))))) np.savetxt(fname, self.microstructure.reshape([grid[0],np.prod(grid[1:])],order='F').T, header='\n'.join(header), fmt=format_string, comments='') @@ -390,12 +390,14 @@ class Geom(): def mirror(self,directions,reflect=False): """ Mirror microstructure along given directions. + Parameters ---------- directions : iterable containing str direction(s) along which the microstructure is mirrored. Valid entries are 'x', 'y', 'z'. reflect : bool, optional reflect (include) outermost layers. + """ valid = {'x','y','z'} if not all(isinstance(d, str) for d in directions): @@ -420,10 +422,12 @@ class Geom(): def clean(self,stencil=3): """ Smooth microstructure by selecting most frequent index within given stencil at each location. + Parameters ---------- stencil : int, optional size of smoothing stencil. + """ def mostFrequent(arr): unique, inverse = np.unique(arr, return_inverse=True) From e20477099e3429dbff74817952642ef352266d7b Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 09:46:46 +0100 Subject: [PATCH 138/233] no crystallite output --- src/crystallite.f90 | 106 ++--------------------------------------- src/homogenization.f90 | 4 +- 2 files changed, 5 insertions(+), 105 deletions(-) diff --git a/src/crystallite.f90 b/src/crystallite.f90 index ca6b737a2..bbf92d40f 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -26,14 +26,6 @@ module crystallite implicit none private - character(len=64), dimension(:,:), allocatable :: & - crystallite_output !< name of each post result output - integer, public, protected :: & - crystallite_maxSizePostResults !< description not available - integer, dimension(:), allocatable, public, protected :: & - crystallite_sizePostResults !< description not available - integer, dimension(:,:), allocatable :: & - crystallite_sizePostResult !< description not available real(pReal), dimension(:,:,:), allocatable, public :: & crystallite_dt !< requested time increment of each grain @@ -199,13 +191,6 @@ subroutine crystallite_init allocate(crystallite_requested(cMax,iMax,eMax), source=.false.) allocate(crystallite_todo(cMax,iMax,eMax), source=.false.) allocate(crystallite_converged(cMax,iMax,eMax), source=.true.) - allocate(crystallite_output(maxval(crystallite_Noutput), & - size(config_crystallite))) ; crystallite_output = '' - allocate(crystallite_outputID(maxval(crystallite_Noutput), & - size(config_crystallite)), source=undefined_ID) - allocate(crystallite_sizePostResults(size(config_crystallite)),source=0) - allocate(crystallite_sizePostResult(maxval(crystallite_Noutput), & - size(config_crystallite)), source=0) num%subStepMinCryst = config_numerics%getFloat('substepmincryst', defaultVal=1.0e-3_pReal) num%subStepSizeCryst = config_numerics%getFloat('substepsizecryst', defaultVal=0.25_pReal) @@ -252,33 +237,6 @@ subroutine crystallite_init integrateState => integrateStateRKCK45 end select - - - do c = 1, size(config_crystallite) -#if defined(__GFORTRAN__) - str = ['GfortranBug86277'] - str = config_crystallite(c)%getStrings('(output)',defaultVal=str) - if (str(1) == 'GfortranBug86277') str = [character(len=65536)::] -#else - str = config_crystallite(c)%getStrings('(output)',defaultVal=[character(len=65536)::]) -#endif - do o = 1, size(str) - crystallite_output(o,c) = str(o) - outputName: select case(str(o)) - case ('orientation') outputName - crystallite_outputID(o,c) = orientation_ID - case ('defgrad','f') outputName ! ToDo: no alias (f only) - crystallite_outputID(o,c) = defgrad_ID - case ('fp') outputName - crystallite_outputID(o,c) = fp_ID - case ('p','firstpiola','1stpiola') outputName ! ToDo: no alias (p only) - crystallite_outputID(o,c) = p_ID - case default outputName - call IO_error(105,ext_msg=trim(str(o))//' (Crystallite)') - end select outputName - enddo - enddo - allocate(output_constituent(size(config_phase))) do c = 1, size(config_phase) #if defined(__GFORTRAN__) @@ -291,43 +249,13 @@ subroutine crystallite_init #endif enddo - - do r = 1,size(config_crystallite) - do o = 1,crystallite_Noutput(r) - select case(crystallite_outputID(o,r)) - case(orientation_ID) - mySize = 4 - case(defgrad_ID,fp_ID,p_ID) - mySize = 9 - case default - mySize = 0 - end select - crystallite_sizePostResult(o,r) = mySize - crystallite_sizePostResults(r) = crystallite_sizePostResults(r) + mySize - enddo - enddo - - crystallite_maxSizePostResults = & - maxval(crystallite_sizePostResults(microstructure_crystallite),microstructure_active) - - !-------------------------------------------------------------------------------------------------- ! write description file for crystallite output if (worldrank == 0) then call IO_write_jobFile(FILEUNIT,'outputCrystallite') - - do r = 1,size(config_crystallite) - if (any(microstructure_crystallite(discretization_microstructureAt) == r)) then - write(FILEUNIT,'(/,a,/)') '['//trim(config_name_crystallite(r))//']' - do o = 1,crystallite_Noutput(r) - write(FILEUNIT,'(a,i4)') trim(crystallite_output(o,r))//char(9),crystallite_sizePostResult(o,r) - enddo - endif - enddo - + write(FILEUNIT,'(/,a,/)') '[not supported anymore]' close(FILEUNIT) endif - call config_deallocate('material.config/phase') call config_deallocate('material.config/crystallite') @@ -831,49 +759,21 @@ function crystallite_postResults(ipc, ip, el) ip, & !< integration point index ipc !< grain index - real(pReal), dimension(1+crystallite_sizePostResults(microstructure_crystallite(discretization_microstructureAt(el))) + & + real(pReal), dimension(1+ & 1+plasticState(material_phaseAt(ipc,el))%sizePostResults + & sum(sourceState(material_phaseAt(ipc,el))%p(:)%sizePostResults)) :: & crystallite_postResults integer :: & o, & c, & - crystID, & mySize, & n - crystID = microstructure_crystallite(discretization_microstructureAt(el)) crystallite_postResults = 0.0_pReal - crystallite_postResults(1) = real(crystallite_sizePostResults(crystID),pReal) ! header-like information (length) + crystallite_postResults(1) = 0.0_pReal ! header-like information (length) c = 1 - do o = 1,crystallite_Noutput(crystID) - mySize = 0 - select case(crystallite_outputID(o,crystID)) - case (orientation_ID) - mySize = 4 - crystallite_postResults(c+1:c+mySize) = crystallite_orientation(ipc,ip,el)%asQuaternion() - -! remark: tensor output is of the form 11,12,13, 21,22,23, 31,32,33 -! thus row index i is slow, while column index j is fast. reminder: "row is slow" - - case (defgrad_ID) - mySize = 9 - crystallite_postResults(c+1:c+mySize) = & - reshape(transpose(crystallite_partionedF(1:3,1:3,ipc,ip,el)),[mySize]) - case (fp_ID) - mySize = 9 - crystallite_postResults(c+1:c+mySize) = & - reshape(transpose(crystallite_Fp(1:3,1:3,ipc,ip,el)),[mySize]) - case (p_ID) - mySize = 9 - crystallite_postResults(c+1:c+mySize) = & - reshape(transpose(crystallite_P(1:3,1:3,ipc,ip,el)),[mySize]) - end select - c = c + mySize - enddo - crystallite_postResults(c+1) = real(plasticState(material_phaseAt(ipc,el))%sizePostResults,pReal) ! size of constitutive results c = c + 1 if (size(crystallite_postResults)-c > 0) & diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 64edf95cc..cf0455d4f 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -262,7 +262,7 @@ subroutine homogenization_init materialpoint_sizeResults = 1 & ! grain count + 1 + thermal_maxSizePostResults & + damage_maxSizePostResults & - + homogenization_maxNgrains * (1 + crystallite_maxSizePostResults & ! crystallite size & crystallite results + + homogenization_maxNgrains * (1 & ! crystallite size + 1 + constitutive_plasticity_maxSizePostResults & ! constitutive size & constitutive results + constitutive_source_maxSizePostResults) allocate(materialpoint_results(materialpoint_sizeResults,discretization_nIP,discretization_nElem)) @@ -618,7 +618,7 @@ subroutine materialpoint_postResults thePos = thePos + 1 grainLooping :do g = 1,myNgrains - theSize = 1 + crystallite_sizePostResults(myCrystallite) + & + theSize = 1 + & 1 + plasticState (material_phaseAt(g,e))%sizePostResults + & sum(sourceState(material_phaseAt(g,e))%p(:)%sizePostResults) materialpoint_results(thePos+1:thePos+theSize,i,e) = crystallite_postResults(g,i,e) ! tell crystallite results From 97474e05a86882aa2bfc4a325a7291aaadc5f717 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 11:00:47 +0100 Subject: [PATCH 139/233] not needed anymore --- .../Polycrystal/material.config | 12 -------- src/config.f90 | 30 ++++++++----------- src/crystallite.f90 | 1 - src/material.f90 | 19 ------------ 4 files changed, 13 insertions(+), 49 deletions(-) diff --git a/examples/SpectralMethod/Polycrystal/material.config b/examples/SpectralMethod/Polycrystal/material.config index 4570941aa..e47c2142c 100644 --- a/examples/SpectralMethod/Polycrystal/material.config +++ b/examples/SpectralMethod/Polycrystal/material.config @@ -5,18 +5,6 @@ [SX] mech none -#-------------------# - -#-------------------# -[almostAll] -(output) orientation # quaternion -(output) grainrotation # deviation from initial orientation as axis (1-3) and angle in degree (4) -(output) F # deformation gradient tensor -(output) Fe # elastic deformation gradient tensor -(output) Fp # plastic deformation gradient tensor -(output) P # first Piola-Kichhoff stress tensor -(output) Lp # plastic velocity gradient tensor - #-------------------# #-------------------# diff --git a/src/config.f90 b/src/config.f90 index e66b85d2d..00b473767 100644 --- a/src/config.f90 +++ b/src/config.f90 @@ -85,6 +85,7 @@ subroutine config_init case (trim('crystallite')) call parse_materialConfig(config_name_crystallite,config_crystallite,line,fileContent(i+1:)) if (verbose) write(6,'(a)') ' Crystallite parsed'; flush(6) + deallocate(config_crystallite) case (trim('homogenization')) call parse_materialConfig(config_name_homogenization,config_homogenization,line,fileContent(i+1:)) @@ -102,27 +103,25 @@ subroutine config_init call IO_error(160,ext_msg='') if (.not. allocated(config_microstructure) .or. size(config_microstructure) < 1) & call IO_error(160,ext_msg='') - if (.not. allocated(config_crystallite) .or. size(config_crystallite) < 1) & - call IO_error(160,ext_msg='') if (.not. allocated(config_phase) .or. size(config_phase) < 1) & call IO_error(160,ext_msg='') if (.not. allocated(config_texture) .or. size(config_texture) < 1) & call IO_error(160,ext_msg='') - inquire(file='numerics.config', exist=fileExists) - if (fileExists) then - write(6,'(/,a)') ' reading numerics.config'; flush(6) - fileContent = IO_read_ASCII('numerics.config') - call parse_debugAndNumericsConfig(config_numerics,fileContent) - endif + inquire(file='numerics.config', exist=fileExists) + if (fileExists) then + write(6,'(/,a)') ' reading numerics.config'; flush(6) + fileContent = IO_read_ASCII('numerics.config') + call parse_debugAndNumericsConfig(config_numerics,fileContent) + endif - inquire(file='debug.config', exist=fileExists) - if (fileExists) then - write(6,'(/,a)') ' reading debug.config'; flush(6) - fileContent = IO_read_ASCII('debug.config') - call parse_debugAndNumericsConfig(config_debug,fileContent) - endif + inquire(file='debug.config', exist=fileExists) + if (fileExists) then + write(6,'(/,a)') ' reading debug.config'; flush(6) + fileContent = IO_read_ASCII('debug.config') + call parse_debugAndNumericsConfig(config_debug,fileContent) + endif contains @@ -295,9 +294,6 @@ subroutine config_deallocate(what) case('material.config/microstructure') deallocate(config_microstructure) - case('material.config/crystallite') - deallocate(config_crystallite) - case('material.config/homogenization') deallocate(config_homogenization) diff --git a/src/crystallite.f90 b/src/crystallite.f90 index bbf92d40f..672bd2112 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -257,7 +257,6 @@ subroutine crystallite_init close(FILEUNIT) endif call config_deallocate('material.config/phase') - call config_deallocate('material.config/crystallite') !-------------------------------------------------------------------------------------------------- ! initialize diff --git a/src/material.f90 b/src/material.f90 index 2212fbe28..e86ba98e1 100644 --- a/src/material.f90 +++ b/src/material.f90 @@ -116,7 +116,6 @@ module material phase_Noutput, & !< number of '(output)' items per phase phase_elasticityInstance, & !< instance of particular elasticity of each phase phase_plasticityInstance, & !< instance of particular plasticity of each phase - crystallite_Noutput, & !< number of '(output)' items per crystallite setting homogenization_Ngrains, & !< number of grains in each homogenization homogenization_Noutput, & !< number of '(output)' items per homogenization homogenization_typeInstance, & !< instance of particular type of each homogenization @@ -245,9 +244,6 @@ subroutine material_init call material_parseMicrostructure() if (iand(myDebug,debug_levelBasic) /= 0) write(6,'(a)') ' Microstructure parsed'; flush(6) - call material_parseCrystallite() - if (iand(myDebug,debug_levelBasic) /= 0) write(6,'(a)') ' Crystallite parsed'; flush(6) - call material_parseHomogenization() if (iand(myDebug,debug_levelBasic) /= 0) write(6,'(a)') ' Homogenization parsed'; flush(6) @@ -547,21 +543,6 @@ subroutine material_parseMicrostructure end subroutine material_parseMicrostructure -!-------------------------------------------------------------------------------------------------- -!> @brief parses the crystallite part in the material configuration file -!-------------------------------------------------------------------------------------------------- -subroutine material_parseCrystallite - - integer :: c - - allocate(crystallite_Noutput(size(config_crystallite)),source=0) - do c=1, size(config_crystallite) - crystallite_Noutput(c) = config_crystallite(c)%countKeys('(output)') - enddo - -end subroutine material_parseCrystallite - - !-------------------------------------------------------------------------------------------------- !> @brief parses the phase part in the material configuration file !-------------------------------------------------------------------------------------------------- From 02df55b9bde2d94c2caacf4a4a9ecac8f5dd7e35 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 11:18:41 +0100 Subject: [PATCH 140/233] bugfix casting to plain array works only (and makes sense only) for a derived type --- python/damask/dadf5.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 69b19fefd..d879946eb 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -401,8 +401,11 @@ class DADF5(): if len(a.shape) == 1: a=a.reshape([a.shape[0],1]) dataset[p,:] = a[u,:] - - return dataset if not plain else dataset.view(('float64',len(dataset.dtype.names))) + + if plain and dataset.dtype.names is not None: + return dataset.view(('float64',len(dataset.dtype.names))) + else: + return dataset def cell_coordinates(self): From 127a29ab1acae64acb8f1aa014183b5ea6f738af Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 13:42:19 +0100 Subject: [PATCH 141/233] cleaning --- src/plastic_nonlocal.f90 | 41 +++++++++++----------------------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index e7e4e713d..155818810 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -81,7 +81,6 @@ module plastic_nonlocal rho_dip_edg_ID, & rho_dip_scr_ID, & rho_forest_ID, & - shearrate_ID, & resolvedstress_back_ID, & resistance_ID, & rho_dot_sgl_ID, & @@ -498,8 +497,6 @@ subroutine plastic_nonlocal_init outputID = merge(rho_dip_scr_ID,undefined_ID,prm%totalNslip>0) case ('rho_forest') outputID = merge(rho_forest_ID,undefined_ID,prm%totalNslip>0) - case ('shearrate') - outputID = merge(shearrate_ID,undefined_ID,prm%totalNslip>0) case ('resolvedstress_back') outputID = merge(resolvedstress_back_ID,undefined_ID,prm%totalNslip>0) case ('resistance') @@ -1515,7 +1512,10 @@ subroutine plastic_nonlocal_dotState(Mp, Fe, Fp, Temperature, & ph = material_phaseAt(1,el) instance = phase_plasticityInstance(ph) - associate(prm => param(instance),dst => microstructure(instance),dot => dotState(instance),stt => state(instance)) + associate(prm => param(instance), & + dst => microstructure(instance), & + dot => dotState(instance), & + stt => state(instance)) ns = totalNslip(instance) tau = 0.0_pReal @@ -1665,11 +1665,11 @@ subroutine plastic_nonlocal_dotState(Mp, Fe, Fp, Temperature, & endif enteringFlux: if (considerEnteringFlux) then - forall (s = 1:ns, t = 1:4) - neighbor_v(s,t) = plasticState(np)%state(iV (s,t,neighbor_instance),no) - neighbor_rhoSgl(s,t) = max(plasticState(np)%state(iRhoU(s,t,neighbor_instance),no), & + forall (s = 1:ns, t = 1:4) + neighbor_v(s,t) = plasticState(np)%state(iV (s,t,neighbor_instance),no) + neighbor_rhoSgl(s,t) = max(plasticState(np)%state(iRhoU(s,t,neighbor_instance),no), & 0.0_pReal) - endforall + endforall where (neighbor_rhoSgl * IPvolume(neighbor_ip,neighbor_el) ** 0.667_pReal < prm%significantN & .or. neighbor_rhoSgl < prm%significantRho) & @@ -1860,12 +1860,7 @@ subroutine plastic_nonlocal_dotState(Mp, Fe, Fp, Temperature, & #endif plasticState(p)%dotState = IEEE_value(1.0_pReal,IEEE_quiet_NaN) else - forall (s = 1:ns, t = 1:4) - plasticState(p)%dotState(iRhoU(s,t,instance),o) = rhoDot(s,t) - plasticState(p)%dotState(iRhoB(s,t,instance),o) = rhoDot(s,t+4) - endforall - forall (s = 1:ns, c = 1:2) & - plasticState(p)%dotState(iRhoD(s,c,instance),o) = rhoDot(s,c+8) + dot%rho(:,o) = pack(rhoDot,.true.) forall (s = 1:ns) & dot%accumulatedshear(s,o) = sum(gdot(s,1:4)) endif @@ -2045,7 +2040,6 @@ function plastic_nonlocal_postResults(ph,instance,of) result(postResults) rhoSgl, & rhoDotSgl !< evolution rate of single dislocation densities (positive/negative screw and edge without dipoles) real(pReal), dimension(param(instance)%totalNslip,4) :: & - gdot, & !< shear rates v !< velocities real(pReal), dimension(param(instance)%totalNslip,2) :: & rhoDotDip !< evolution rate of dipole dislocation densities (screw and edge dipoles) @@ -2059,22 +2053,13 @@ associate(prm => param(instance),dst => microstructure(instance),stt=>state(inst forall (s = 1:ns, t = 1:4) rhoSgl(s,t+4) = plasticState(ph)%State(iRhoB(s,t,instance),of) - v(s,t) = plasticState(ph)%State(iV(s,t,instance),of) + v(s,t) = plasticState(ph)%State(iV(s,t,instance),of) rhoDotSgl(s,t+4) = plasticState(ph)%dotState(iRhoB(s,t,instance),of) endforall forall (s = 1:ns, c = 1:2) rhoDotDip(s,c) = plasticState(ph)%dotState(iRhoD(s,c,instance),of) endforall -!* Calculate shear rate - -forall (t = 1:4) & - gdot(1:ns,t) = rhoSgl(1:ns,t) * prm%burgers(1:ns) * v(1:ns,t) - - -!* calculate limits for stable dipole height - - outputsLoop: do o = 1,size(param(instance)%outputID) select case(param(instance)%outputID(o)) @@ -2122,10 +2107,6 @@ outputsLoop: do o = 1,size(param(instance)%outputID) postResults(cs+1:cs+ns) = stt%rho_forest(:,of) cs = cs + ns - case (shearrate_ID) - postResults(cs+1:cs+ns) = sum(gdot,2) - cs = cs + ns - case (resolvedstress_back_ID) postResults(cs+1:cs+ns) = dst%tau_back(:,of) cs = cs + ns @@ -2233,7 +2214,7 @@ function getRho(instance,of,ip,el) getRho = reshape(state(instance)%rho(:,of),[prm%totalNslip,10]) - ! ensure mobile densities (not for imm, they have a sign) + ! ensure positive densities (not for imm, they have a sign) getRho(:,mob) = max(getRho(:,mob),0.0_pReal) getRho(:,dip) = max(getRho(:,dip),0.0_pReal) From 8186be6293de991047a9acfbbbc6ad20397f2d28 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 14:27:24 +0100 Subject: [PATCH 142/233] compress functionality should be part of the geom class automated decision is base on heuristic whether compression is memory efficient --- processing/pre/geom_clean.py | 5 +-- processing/pre/geom_mirror.py | 5 +-- processing/pre/geom_pack.py | 41 ++---------------------- processing/pre/geom_unpack.py | 5 +-- python/damask/geom.py | 60 +++++++++++++++++++++++++++++++---- 5 files changed, 59 insertions(+), 57 deletions(-) diff --git a/processing/pre/geom_clean.py b/processing/pre/geom_clean.py index 50f3657b2..65700ab61 100755 --- a/processing/pre/geom_clean.py +++ b/processing/pre/geom_clean.py @@ -42,7 +42,4 @@ for name in filenames: geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(name) + geom.to_file(sys.stdout if name is None else name) diff --git a/processing/pre/geom_mirror.py b/processing/pre/geom_mirror.py index 77ec1f4d7..f27b7eb66 100755 --- a/processing/pre/geom_mirror.py +++ b/processing/pre/geom_mirror.py @@ -46,7 +46,4 @@ for name in filenames: damask.util.croak(geom.mirror(options.directions,options.reflect)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(name) + geom.to_file(sys.stdout if name is None else name) diff --git a/processing/pre/geom_pack.py b/processing/pre/geom_pack.py index 786a40b95..e927c006f 100755 --- a/processing/pre/geom_pack.py +++ b/processing/pre/geom_pack.py @@ -33,42 +33,5 @@ for name in filenames: damask.util.croak(geom) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - - compressType = None - former = start = -1 - reps = 0 - - if name is None: - f = sys.stdout - else: - f= open(name,'w') - - for current in geom.microstructure.flatten('F'): - if abs(current - former) == 1 and (start - current) == reps*(former - current): - compressType = 'to' - reps += 1 - elif current == former and start == former: - compressType = 'of' - reps += 1 - else: - if compressType is None: - f.write('\n'.join(geom.get_header())+'\n') - elif compressType == '.': - f.write('{}\n'.format(former)) - elif compressType == 'to': - f.write('{} to {}\n'.format(start,former)) - elif compressType == 'of': - f.write('{} of {}\n'.format(reps,former)) - - compressType = '.' - start = current - reps = 1 - - former = current - - if compressType == '.': - f.write('{}\n'.format(former)) - elif compressType == 'to': - f.write('{} to {}\n'.format(start,former)) - elif compressType == 'of': - f.write('{} of {}\n'.format(reps,former)) + + geom.to_file(sys.stdout if name is None else name,pack=True) diff --git a/processing/pre/geom_unpack.py b/processing/pre/geom_unpack.py index 2a2d54130..58bd5de87 100755 --- a/processing/pre/geom_unpack.py +++ b/processing/pre/geom_unpack.py @@ -34,7 +34,4 @@ for name in filenames: damask.util.croak(geom) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(name) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/python/damask/geom.py b/python/damask/geom.py index 6dfcda013..61d7c64a4 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -299,7 +299,7 @@ class Geom(): return cls(microstructure.reshape(grid),size,origin,homogenization,comments) - def to_file(self,fname): + def to_file(self,fname,pack=None): """ Writes a geom file. @@ -307,15 +307,63 @@ class Geom(): ---------- fname : str or file handle geometry file to write. + pack : bool, optional + compress geometry with 'x of y' and 'a to b'. """ header = self.get_header() grid = self.get_grid() - format_string = '%g' if self.microstructure in np.sctypes['float'] else \ - '%{}i'.format(1+int(np.floor(np.log10(np.nanmax(self.microstructure))))) - np.savetxt(fname, - self.microstructure.reshape([grid[0],np.prod(grid[1:])],order='F').T, - header='\n'.join(header), fmt=format_string, comments='') + + if pack is None: + plain = grid.prod()/np.unique(self.microstructure).size < 250 + else: + plain = not pack + + if plain: + format_string = '%g' if self.microstructure in np.sctypes['float'] else \ + '%{}i'.format(1+int(np.floor(np.log10(np.nanmax(self.microstructure))))) + np.savetxt(fname, + self.microstructure.reshape([grid[0],np.prod(grid[1:])],order='F').T, + header='\n'.join(header), fmt=format_string, comments='') + else: + if isinstance(fname,str): + f = open(fname,'w') + else: + f = fname + + compressType = None + former = start = -1 + reps = 0 + for current in self.microstructure.flatten('F'): + if abs(current - former) == 1 and (start - current) == reps*(former - current): + compressType = 'to' + reps += 1 + elif current == former and start == former: + compressType = 'of' + reps += 1 + else: + if compressType is None: + f.write('\n'.join(self.get_header())+'\n') + elif compressType == '.': + f.write('{}\n'.format(former)) + elif compressType == 'to': + f.write('{} to {}\n'.format(start,former)) + elif compressType == 'of': + f.write('{} of {}\n'.format(reps,former)) + + compressType = '.' + start = current + reps = 1 + + former = current + + if compressType == '.': + f.write('{}\n'.format(former)) + elif compressType == 'to': + f.write('{} to {}\n'.format(start,former)) + elif compressType == 'of': + f.write('{} of {}\n'.format(reps,former)) + def to_vtk(self,fname=None): """ From 816e86ae5fa5240bfae20b75ce305aa19564bb11 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 15:13:26 +0100 Subject: [PATCH 143/233] phasing out python shell scripts --- processing/pre/geom_rescale.py | 19 ++++--------------- python/damask/geom.py | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/processing/pre/geom_rescale.py b/processing/pre/geom_rescale.py index e84c7597b..84ac9e793 100755 --- a/processing/pre/geom_rescale.py +++ b/processing/pre/geom_rescale.py @@ -55,20 +55,9 @@ for name in filenames: np.array([o*float(n.lower().replace('x','')) if n.lower().endswith('x') \ else float(n) for o,n in zip(size,options.size)],dtype=float) - damask.util.croak(geom.update(microstructure = - ndimage.interpolation.zoom( - geom.microstructure, - new_grid/grid, - output=geom.microstructure.dtype, - order=0, - mode='nearest', - prefilter=False, - ) if np.any(new_grid != grid) \ - else None, - size = new_size)) + geom.scale(new_grid) + damask.util.croak(geom.update(microstructure = None, + size = new_size)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(name) + geom.to_file(sys.stdout if name is None else name) diff --git a/python/damask/geom.py b/python/damask/geom.py index 61d7c64a4..872445459 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -467,6 +467,29 @@ class Geom(): #self.add_comments('tbd') + def scale(self,grid): + """ + Scale microstructure to new grid + + Parameters + ---------- + grid : iterable of int + new grid dimension + + """ + return self.update( + ndimage.interpolation.zoom( + self.microstructure, + grid/self.get_grid(), + output=self.microstructure.dtype, + order=0, + mode='nearest', + prefilter=False + ) + ) + #self.add_comments('tbd') + + def clean(self,stencil=3): """ Smooth microstructure by selecting most frequent index within given stencil at each location. From b2cdabd0094c07e291a0b6f93437fa0a711a2de2 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 18:21:05 +0100 Subject: [PATCH 144/233] getting rid of shell scripts --- processing/pre/geom_canvas.py | 5 +---- processing/pre/geom_clean.py | 3 --- processing/pre/geom_mirror.py | 2 -- processing/pre/geom_renumber.py | 13 ++----------- processing/pre/geom_rescale.py | 4 +--- processing/pre/geom_rotate.py | 5 +---- processing/pre/geom_vicinityOffset.py | 5 +---- python/damask/geom.py | 17 +++++++++++++++-- 8 files changed, 21 insertions(+), 33 deletions(-) diff --git a/processing/pre/geom_canvas.py b/processing/pre/geom_canvas.py index a44065dd2..e1093d33b 100755 --- a/processing/pre/geom_canvas.py +++ b/processing/pre/geom_canvas.py @@ -71,7 +71,4 @@ for name in filenames: damask.util.croak(geom.update(canvas,origin=origin+offset*size/old,rescale=True)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(name) + geom.to_file(sys.stdout if name is None else name) diff --git a/processing/pre/geom_clean.py b/processing/pre/geom_clean.py index 65700ab61..153d1eebd 100755 --- a/processing/pre/geom_clean.py +++ b/processing/pre/geom_clean.py @@ -37,9 +37,6 @@ for name in filenames: damask.util.report(scriptName,name) geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) - damask.util.croak(geom.clean(options.stencil)) - geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name) diff --git a/processing/pre/geom_mirror.py b/processing/pre/geom_mirror.py index f27b7eb66..ff47cb88b 100755 --- a/processing/pre/geom_mirror.py +++ b/processing/pre/geom_mirror.py @@ -42,8 +42,6 @@ for name in filenames: damask.util.report(scriptName,name) geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) - damask.util.croak(geom.mirror(options.directions,options.reflect)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name) diff --git a/processing/pre/geom_renumber.py b/processing/pre/geom_renumber.py index 2eee189e1..df817b1fc 100755 --- a/processing/pre/geom_renumber.py +++ b/processing/pre/geom_renumber.py @@ -32,15 +32,6 @@ for name in filenames: damask.util.report(scriptName,name) geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) - - renumbered = np.empty(geom.get_grid(),dtype=geom.microstructure.dtype) - for i, oldID in enumerate(np.unique(geom.microstructure)): - renumbered = np.where(geom.microstructure == oldID, i+1, renumbered) - - damask.util.croak(geom.update(renumbered)) + damask.util.croak(self.renumber) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(name) + geom.to_file(sys.stdout if name is None else name) diff --git a/processing/pre/geom_rescale.py b/processing/pre/geom_rescale.py index 84ac9e793..8f5276b9d 100755 --- a/processing/pre/geom_rescale.py +++ b/processing/pre/geom_rescale.py @@ -56,8 +56,6 @@ for name in filenames: else float(n) for o,n in zip(size,options.size)],dtype=float) geom.scale(new_grid) - damask.util.croak(geom.update(microstructure = None, - size = new_size)) + damask.util.croak(geom.update(microstructure = None,size = new_size)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name) diff --git a/processing/pre/geom_rotate.py b/processing/pre/geom_rotate.py index c2a4af04b..6cca99caf 100755 --- a/processing/pre/geom_rotate.py +++ b/processing/pre/geom_rotate.py @@ -95,7 +95,4 @@ for name in filenames: damask.util.croak(geom.update(microstructure,origin=origin-(np.asarray(microstructure.shape)-grid)/2*size/grid,rescale=True)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(name) + geom.to_file(sys.stdout if name is None else name) diff --git a/processing/pre/geom_vicinityOffset.py b/processing/pre/geom_vicinityOffset.py index 3a4853121..0b86adfb9 100755 --- a/processing/pre/geom_vicinityOffset.py +++ b/processing/pre/geom_vicinityOffset.py @@ -82,7 +82,4 @@ for name in filenames: geom.microstructure + offset,geom.microstructure))) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(name) + geom.to_file(sys.stdout if name is None else name) diff --git a/python/damask/geom.py b/python/damask/geom.py index 872445459..e544765a4 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -504,7 +504,20 @@ class Geom(): unique, inverse = np.unique(arr, return_inverse=True) return unique[np.argmax(np.bincount(inverse))] - return self.update(ndimage.filters.generic_filter(self.microstructure, + return self.update(ndimage.filters.generic_filter( + self.microstructure, mostFrequent, - size=(stencil,)*3).astype(self.microstructure.dtype)) + size=(stencil,)*3 + ).astype(self.microstructure.dtype) + ) + #self.add_comments('tbd') + + + def renumber(self): + """Renumber sorted microstructure indices to 1,...,N.""" + renumbered = np.empty(self.get_grid(),dtype=self.microstructure.dtype) + for i, oldID in enumerate(np.unique(self.microstructure)): + renumbered = np.where(self.microstructure == oldID, i+1, renumbered) + + return self.update(renumbered)) #self.add_comments('tbd') From c9f9f7c681e6e6ae841c9956dd3cf1dc0b5d2874 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 19:02:19 +0100 Subject: [PATCH 145/233] pack causes trouble with tests .. --- processing/pre/geom_addPrimitive.py | 5 +---- processing/pre/geom_canvas.py | 4 ++-- processing/pre/geom_clean.py | 2 +- processing/pre/geom_fromDREAM3D.py | 2 +- processing/pre/geom_fromMinimalSurface.py | 5 +---- processing/pre/geom_fromOsteonGeometry.py | 5 +---- processing/pre/geom_fromScratch.py | 5 +---- processing/pre/geom_fromTable.py | 5 +---- processing/pre/geom_fromVoronoiTessellation.py | 5 +---- processing/pre/geom_grainGrowth.py | 5 +---- processing/pre/geom_mirror.py | 2 +- processing/pre/geom_renumber.py | 2 +- processing/pre/geom_rescale.py | 2 +- processing/pre/geom_rotate.py | 2 +- processing/pre/geom_translate.py | 5 +---- processing/pre/geom_vicinityOffset.py | 2 +- python/damask/geom.py | 2 +- 17 files changed, 18 insertions(+), 42 deletions(-) diff --git a/processing/pre/geom_addPrimitive.py b/processing/pre/geom_addPrimitive.py index 3e147e24d..f33ba27b1 100755 --- a/processing/pre/geom_addPrimitive.py +++ b/processing/pre/geom_addPrimitive.py @@ -132,7 +132,4 @@ for name in filenames: damask.util.croak(geom.update(np.where(mask,geom.microstructure,fill))) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(name) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_canvas.py b/processing/pre/geom_canvas.py index e1093d33b..edd5fe622 100755 --- a/processing/pre/geom_canvas.py +++ b/processing/pre/geom_canvas.py @@ -61,7 +61,7 @@ for name in filenames: canvas = np.full(new,options.fill if options.fill is not None else np.nanmax(geom.microstructure)+1,geom.microstructure.dtype) - l = np.clip( offset, 0,np.minimum(old +offset,new)) + l = np.clip( offset, 0,np.minimum(old +offset,new)) # noqa r = np.clip( offset+old,0,np.minimum(old*2+offset,new)) L = np.clip(-offset, 0,np.minimum(new -offset,old)) R = np.clip(-offset+new,0,np.minimum(new*2-offset,old)) @@ -71,4 +71,4 @@ for name in filenames: damask.util.croak(geom.update(canvas,origin=origin+offset*size/old,rescale=True)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_clean.py b/processing/pre/geom_clean.py index 153d1eebd..8883c1b2a 100755 --- a/processing/pre/geom_clean.py +++ b/processing/pre/geom_clean.py @@ -39,4 +39,4 @@ for name in filenames: geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) damask.util.croak(geom.clean(options.stencil)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_fromDREAM3D.py b/processing/pre/geom_fromDREAM3D.py index 5d41e05b9..b20749b45 100755 --- a/processing/pre/geom_fromDREAM3D.py +++ b/processing/pre/geom_fromDREAM3D.py @@ -155,4 +155,4 @@ for name in filenames: homogenization=options.homogenization,comments=header) damask.util.croak(geom) - geom.to_file(os.path.splitext(name)[0]+'.geom') + geom.to_file(os.path.splitext(name)[0]+'.geom',pack=False) diff --git a/processing/pre/geom_fromMinimalSurface.py b/processing/pre/geom_fromMinimalSurface.py index ab42ce5af..bb6859b54 100755 --- a/processing/pre/geom_fromMinimalSurface.py +++ b/processing/pre/geom_fromMinimalSurface.py @@ -89,7 +89,4 @@ geom=damask.Geom(microstructure,options.size, comments=[scriptID + ' ' + ' '.join(sys.argv[1:])]) damask.util.croak(geom) -if name is None: - sys.stdout.write(str(geom.show())) -else: - geom.to_file(name) +geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_fromOsteonGeometry.py b/processing/pre/geom_fromOsteonGeometry.py index 146bf216c..499a8867f 100755 --- a/processing/pre/geom_fromOsteonGeometry.py +++ b/processing/pre/geom_fromOsteonGeometry.py @@ -145,7 +145,4 @@ geom = damask.Geom(microstructure.reshape(grid), homogenization=options.homogenization,comments=header) damask.util.croak(geom) -if name is None: - sys.stdout.write(str(geom.show())) -else: - geom.to_file(name) +geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_fromScratch.py b/processing/pre/geom_fromScratch.py index bfb294080..89fd27be5 100755 --- a/processing/pre/geom_fromScratch.py +++ b/processing/pre/geom_fromScratch.py @@ -63,7 +63,4 @@ geom = damask.Geom(microstructure=np.full(options.grid,options.fill,dtype=dtype) comments=scriptID + ' ' + ' '.join(sys.argv[1:])) damask.util.croak(geom) -if name is None: - sys.stdout.write(str(geom.show())) -else: - geom.to_file(name) +geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_fromTable.py b/processing/pre/geom_fromTable.py index aa37451c7..f513c4834 100755 --- a/processing/pre/geom_fromTable.py +++ b/processing/pre/geom_fromTable.py @@ -152,7 +152,4 @@ for name in filenames: homogenization=options.homogenization,comments=header) damask.util.croak(geom) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(os.path.splitext(name)[0]+'.geom') + geom.to_file(sys.stdout if name is None else os.path.splitext(name)[0]+'.geom',pack=False) diff --git a/processing/pre/geom_fromVoronoiTessellation.py b/processing/pre/geom_fromVoronoiTessellation.py index 9d4573c2c..28e215f85 100755 --- a/processing/pre/geom_fromVoronoiTessellation.py +++ b/processing/pre/geom_fromVoronoiTessellation.py @@ -302,7 +302,4 @@ for name in filenames: homogenization=options.homogenization,comments=header) damask.util.croak(geom) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(os.path.splitext(name)[0]+'.geom') + geom.to_file(sys.stdout if name is None else os.path.splitext(name)[0]+'.geom',pack=False) diff --git a/processing/pre/geom_grainGrowth.py b/processing/pre/geom_grainGrowth.py index b31fc13f2..bdf8d8efe 100755 --- a/processing/pre/geom_grainGrowth.py +++ b/processing/pre/geom_grainGrowth.py @@ -172,7 +172,4 @@ for name in filenames: damask.util.croak(geom.update(microstructure[0:grid_original[0],0:grid_original[1],0:grid_original[2]])) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(name) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_mirror.py b/processing/pre/geom_mirror.py index ff47cb88b..cca0a4e10 100755 --- a/processing/pre/geom_mirror.py +++ b/processing/pre/geom_mirror.py @@ -44,4 +44,4 @@ for name in filenames: geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) damask.util.croak(geom.mirror(options.directions,options.reflect)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_renumber.py b/processing/pre/geom_renumber.py index df817b1fc..1e28ca921 100755 --- a/processing/pre/geom_renumber.py +++ b/processing/pre/geom_renumber.py @@ -34,4 +34,4 @@ for name in filenames: geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) damask.util.croak(self.renumber) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_rescale.py b/processing/pre/geom_rescale.py index 8f5276b9d..55c2e57a2 100755 --- a/processing/pre/geom_rescale.py +++ b/processing/pre/geom_rescale.py @@ -58,4 +58,4 @@ for name in filenames: geom.scale(new_grid) damask.util.croak(geom.update(microstructure = None,size = new_size)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_rotate.py b/processing/pre/geom_rotate.py index 6cca99caf..977e00b65 100755 --- a/processing/pre/geom_rotate.py +++ b/processing/pre/geom_rotate.py @@ -95,4 +95,4 @@ for name in filenames: damask.util.croak(geom.update(microstructure,origin=origin-(np.asarray(microstructure.shape)-grid)/2*size/grid,rescale=True)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_translate.py b/processing/pre/geom_translate.py index 4b91920ae..2d4279821 100755 --- a/processing/pre/geom_translate.py +++ b/processing/pre/geom_translate.py @@ -58,7 +58,4 @@ for name in filenames: damask.util.croak(geom.update(substituted,origin=geom.get_origin()+options.origin)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - if name is None: - sys.stdout.write(str(geom.show())) - else: - geom.to_file(name) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_vicinityOffset.py b/processing/pre/geom_vicinityOffset.py index 0b86adfb9..e30779d31 100755 --- a/processing/pre/geom_vicinityOffset.py +++ b/processing/pre/geom_vicinityOffset.py @@ -82,4 +82,4 @@ for name in filenames: geom.microstructure + offset,geom.microstructure))) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/python/damask/geom.py b/python/damask/geom.py index e544765a4..e2dcd9bcb 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -519,5 +519,5 @@ class Geom(): for i, oldID in enumerate(np.unique(self.microstructure)): renumbered = np.where(self.microstructure == oldID, i+1, renumbered) - return self.update(renumbered)) + return self.update(renumbered) #self.add_comments('tbd') From 3e8518d861e68146f31fecc9c13c90634125858d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 19:25:01 +0100 Subject: [PATCH 146/233] following prospector guidelines --- processing/pre/geom_fromDREAM3D.py | 12 ++++++------ processing/pre/geom_renumber.py | 4 +--- processing/pre/geom_rescale.py | 5 ++--- python/damask/geom.py | 2 +- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/processing/pre/geom_fromDREAM3D.py b/processing/pre/geom_fromDREAM3D.py index b20749b45..159793cd8 100755 --- a/processing/pre/geom_fromDREAM3D.py +++ b/processing/pre/geom_fromDREAM3D.py @@ -86,7 +86,7 @@ for name in filenames: * inFile[os.path.join(group_geom,'SPACING')][...] grid = inFile[os.path.join(group_geom,'DIMENSIONS')][...] origin = inFile[os.path.join(group_geom,'ORIGIN')][...] - except: + except KeyError: errors.append('Geometry data ({}) not found'.format(group_geom)) @@ -98,13 +98,13 @@ for name in filenames: try: quats = np.reshape(inFile[dataset][...],(np.product(grid),4)) rot = [damask.Rotation.fromQuaternion(q,True,P=+1) for q in quats] - except: + except KeyError: errors.append('Pointwise orientation (quaternion) data ({}) not readable'.format(dataset)) dataset = os.path.join(group_pointwise,options.phase) try: phase = np.reshape(inFile[dataset][...],(np.product(grid))) - except: + except KeyError: errors.append('Pointwise phase data ({}) not readable'.format(dataset)) microstructure = np.arange(1,np.product(grid)+1,dtype=int).reshape(grid,order='F') @@ -116,7 +116,7 @@ for name in filenames: dataset = os.path.join(group_pointwise,options.microstructure) try: microstructure = np.transpose(inFile[dataset][...].reshape(grid[::-1]),(2,1,0)) # convert from C ordering - except: + except KeyError: errors.append('Link between pointwise and grain average data ({}) not readable'.format(dataset)) group_average = os.path.join(rootDir,options.basegroup,options.average) @@ -124,13 +124,13 @@ for name in filenames: dataset = os.path.join(group_average,options.quaternion) try: rot = [damask.Rotation.fromQuaternion(q,True,P=+1) for q in inFile[dataset][...][1:]] # skip first entry (unindexed) - except: + except KeyError: errors.append('Average orientation data ({}) not readable'.format(dataset)) dataset = os.path.join(group_average,options.phase) try: phase = [i[0] for i in inFile[dataset][...]][1:] # skip first entry (unindexed) - except: + except KeyError: errors.append('Average phase data ({}) not readable'.format(dataset)) if errors != []: diff --git a/processing/pre/geom_renumber.py b/processing/pre/geom_renumber.py index 1e28ca921..b1db6ed13 100755 --- a/processing/pre/geom_renumber.py +++ b/processing/pre/geom_renumber.py @@ -5,8 +5,6 @@ import sys from io import StringIO from optparse import OptionParser -import numpy as np - import damask @@ -32,6 +30,6 @@ for name in filenames: damask.util.report(scriptName,name) geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) - damask.util.croak(self.renumber) + damask.util.croak(geom.renumber) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_rescale.py b/processing/pre/geom_rescale.py index 55c2e57a2..b1a15593c 100755 --- a/processing/pre/geom_rescale.py +++ b/processing/pre/geom_rescale.py @@ -2,11 +2,10 @@ import os import sys -import numpy as np - from io import StringIO from optparse import OptionParser -from scipy import ndimage + +import numpy as np import damask diff --git a/python/damask/geom.py b/python/damask/geom.py index e2dcd9bcb..69dfa9ec3 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -469,7 +469,7 @@ class Geom(): def scale(self,grid): """ - Scale microstructure to new grid + Scale microstructure to new grid. Parameters ---------- From 406ca39b2c12f65dd154613c693ec1cfa5545fd2 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Nov 2019 21:23:43 +0100 Subject: [PATCH 147/233] ASCII table unable to handle inhomogeneous situations --- processing/post/DADF5_postResults.py | 50 ++++++++++++++-------------- processing/post/DADF5_vtk_cells.py | 1 - 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/processing/post/DADF5_postResults.py b/processing/post/DADF5_postResults.py index a16ef147c..88e4d777a 100755 --- a/processing/post/DADF5_postResults.py +++ b/processing/post/DADF5_postResults.py @@ -59,35 +59,35 @@ for filename in options.filenames: data = np.concatenate((data,coords),1) header+=' 1_pos 2_pos 3_pos' + results.set_visible('materialpoints',False) + results.set_visible('constituents', True) for label in options.con: - for p in results.iter_visible('con_physics'): - for c in results.iter_visible('constituents'): - x = results.get_dataset_location(label) - if len(x) == 0: - continue - array = results.read_dataset(x,0,plain=True) - d = int(np.product(np.shape(array)[1:])) - data = np.concatenate((data,np.reshape(array,[np.product(results.grid),d])),1) - - if d>1: - header+= ''.join([' {}_{}'.format(j+1,label) for j in range(d)]) - else: - header+=' '+label + x = results.get_dataset_location(label) + if len(x) == 0: + continue + array = results.read_dataset(x,0,plain=True) + d = np.product(np.shape(array)[1:]) + data = np.concatenate((data,np.reshape(array,[np.product(results.grid),d])),1) + if d>1: + header+= ''.join([' {}_{}'.format(j+1,label) for j in range(d)]) + else: + header+=' '+label + + results.set_visible('constituents', False) + results.set_visible('materialpoints',True) for label in options.mat: - for p in results.iter_visible('mat_physics'): - for m in results.iter_visible('materialpoints'): - x = results.get_dataset_location(label) - if len(x) == 0: - continue - array = results.read_dataset(x,0,plain=True) - d = int(np.product(np.shape(array)[1:])) - data = np.concatenate((data,np.reshape(array,[np.product(results.grid),d])),1) + x = results.get_dataset_location(label) + if len(x) == 0: + continue + array = results.read_dataset(x,0,plain=True) + d = np.product(np.shape(array)[1:]) + data = np.concatenate((data,np.reshape(array,[np.product(results.grid),d])),1) - if d>1: - header+= ''.join([' {}_{}'.format(j+1,label) for j in range(d)]) - else: - header+=' '+label + if d>1: + header+= ''.join([' {}_{}'.format(j+1,label) for j in range(d)]) + else: + header+=' '+label dirname = os.path.abspath(os.path.join(os.path.dirname(filename),options.dir)) if not os.path.isdir(dirname): diff --git a/processing/post/DADF5_vtk_cells.py b/processing/post/DADF5_vtk_cells.py index 1f5cc6686..9cd982e50 100755 --- a/processing/post/DADF5_vtk_cells.py +++ b/processing/post/DADF5_vtk_cells.py @@ -74,7 +74,6 @@ for filename in options.filenames: results.set_visible('materialpoints',False) results.set_visible('constituents', True) for label in options.con: - for p in results.iter_visible('con_physics'): if p != 'generic': for c in results.iter_visible('constituents'): From 67c8d3899d010718f44a82c439d7133104acb7d6 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 25 Nov 2019 08:44:44 +0100 Subject: [PATCH 148/233] crystallite output fully removed --- PRIVATE | 2 +- examples/ConfigFiles/Crystallite_All.config | 9 --------- src/homogenization.f90 | 4 +--- src/material.f90 | 13 +++---------- 4 files changed, 5 insertions(+), 23 deletions(-) delete mode 100644 examples/ConfigFiles/Crystallite_All.config diff --git a/PRIVATE b/PRIVATE index a3a88933c..8fa92908b 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit a3a88933cbb92b81d481305ce93374917baf3980 +Subproject commit 8fa92908b841341395a8b13180bd6bcae2ad1659 diff --git a/examples/ConfigFiles/Crystallite_All.config b/examples/ConfigFiles/Crystallite_All.config deleted file mode 100644 index 2e9bafa73..000000000 --- a/examples/ConfigFiles/Crystallite_All.config +++ /dev/null @@ -1,9 +0,0 @@ -[all] -(output) orientation # quaternion -(output) grainrotation # deviation from initial orientation as axis (1-3) and angle in degree (4) in crystal reference coordinates -(output) F # deformation gradient tensor -(output) Fe # elastic deformation gradient tensor -(output) Fp # plastic deformation gradient tensor -(output) P # first Piola-Kichhoff stress tensor -(output) S # second Piola-Kichhoff stress tensor -(output) Lp # plastic velocity gradient tensor diff --git a/src/homogenization.f90 b/src/homogenization.f90 index cf0455d4f..a62f94820 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -592,15 +592,13 @@ subroutine materialpoint_postResults thePos, & theSize, & myNgrains, & - myCrystallite, & g, & !< grain number i, & !< integration point number e !< element number - !$OMP PARALLEL DO PRIVATE(myNgrains,myCrystallite,thePos,theSize) + !$OMP PARALLEL DO PRIVATE(myNgrains,thePos,theSize) elementLooping: do e = FEsolving_execElem(1),FEsolving_execElem(2) myNgrains = homogenization_Ngrains(material_homogenizationAt(e)) - myCrystallite = microstructure_crystallite(discretization_microstructureAt(e)) IpLooping: do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e) thePos = 0 diff --git a/src/material.f90 b/src/material.f90 index e86ba98e1..2f70fe97b 100644 --- a/src/material.f90 +++ b/src/material.f90 @@ -120,8 +120,7 @@ module material homogenization_Noutput, & !< number of '(output)' items per homogenization homogenization_typeInstance, & !< instance of particular type of each homogenization thermal_typeInstance, & !< instance of particular type of each thermal transport - damage_typeInstance, & !< instance of particular type of each nonlocal damage - microstructure_crystallite !< crystallite setting ID of each microstructure ! DEPRECATED !!!! + damage_typeInstance !< instance of particular type of each nonlocal damage real(pReal), dimension(:), allocatable, public, protected :: & thermal_initialT, & !< initial temperature per each homogenization @@ -273,9 +272,6 @@ subroutine material_init allocate(temperatureRate (material_Nhomogenization)) do m = 1,size(config_microstructure) - if(microstructure_crystallite(m) < 1 .or. & - microstructure_crystallite(m) > size(config_crystallite)) & - call IO_error(150,m,ext_msg='crystallite') if(minval(microstructure_phase(1:microstructure_Nconstituents(m),m)) < 1 .or. & maxval(microstructure_phase(1:microstructure_Nconstituents(m),m)) > size(config_phase)) & call IO_error(150,m,ext_msg='phase') @@ -294,9 +290,8 @@ subroutine material_init enddo write(6,'(/,a14,18x,1x,a11,1x,a12,1x,a13)') 'microstructure','crystallite','constituents' do m = 1,size(config_microstructure) - write(6,'(1x,a32,1x,i11,1x,i12)') config_name_microstructure(m), & - microstructure_crystallite(m), & - microstructure_Nconstituents(m) + write(6,'(1x,a32,1x,i12)') config_name_microstructure(m), & + microstructure_Nconstituents(m) if (microstructure_Nconstituents(m) > 0) then do c = 1,microstructure_Nconstituents(m) write(6,'(a1,1x,a32,1x,a32,1x,f7.4)') '>',config_name_phase(microstructure_phase(c,m)),& @@ -496,7 +491,6 @@ subroutine material_parseMicrostructure character(len=65536) :: & tag - allocate(microstructure_crystallite(size(config_microstructure)), source=0) allocate(microstructure_Nconstituents(size(config_microstructure)), source=0) allocate(microstructure_active(size(config_microstructure)), source=.false.) @@ -508,7 +502,6 @@ subroutine material_parseMicrostructure do m=1, size(config_microstructure) microstructure_Nconstituents(m) = config_microstructure(m)%countKeys('(constituent)') - microstructure_crystallite(m) = config_microstructure(m)%getInt('crystallite') enddo microstructure_maxNconstituents = maxval(microstructure_Nconstituents) From 6d25506204f8ce12b417a765c1c73b86b1d3a570 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 25 Nov 2019 09:28:59 +0100 Subject: [PATCH 149/233] test for new pack functionality --- python/tests/test_Geom.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py index 8171a9922..041e1a01f 100644 --- a/python/tests/test_Geom.py +++ b/python/tests/test_Geom.py @@ -51,6 +51,16 @@ class TestGeom: new = Geom.from_file(f) assert geom_equal(new,default) + def test_pack(self,default,tmpdir): + default.to_file(tmpdir.join('default.geom'),pack=True) + new = Geom.from_file(tmpdir.join('default.geom')) + assert geom_equal(new,default) + + def test_plain(self,default,tmpdir): + default.to_file(tmpdir.join('default.geom'),pack=False) + new = Geom.from_file(tmpdir.join('default.geom')) + assert geom_equal(new,default) + @pytest.mark.parametrize('directions,reflect',[ (['x'], False), (['x','y','z'],True), From b757f02649f2fe2a5ffe67fa9e07b05c75f3aff9 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 25 Nov 2019 12:04:57 +0100 Subject: [PATCH 150/233] avoid repetitions --- python/tests/test_Geom.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py index 041e1a01f..1d1c32992 100644 --- a/python/tests/test_Geom.py +++ b/python/tests/test_Geom.py @@ -51,13 +51,9 @@ class TestGeom: new = Geom.from_file(f) assert geom_equal(new,default) - def test_pack(self,default,tmpdir): - default.to_file(tmpdir.join('default.geom'),pack=True) - new = Geom.from_file(tmpdir.join('default.geom')) - assert geom_equal(new,default) - - def test_plain(self,default,tmpdir): - default.to_file(tmpdir.join('default.geom'),pack=False) + @pytest.mark.parametrize('pack',[True,False]) + def test_pack(self,default,tmpdir,pack): + default.to_file(tmpdir.join('default.geom'),pack=pack) new = Geom.from_file(tmpdir.join('default.geom')) assert geom_equal(new,default) From 476569390a6e16990464426833b2de0a4244c4a3 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 25 Nov 2019 13:47:14 +0100 Subject: [PATCH 151/233] enable use of path objects, strings, and opened files --- python/damask/geom.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/python/damask/geom.py b/python/damask/geom.py index 69dfa9ec3..1c9e10cd1 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -250,11 +250,15 @@ class Geom(): geometry file to read. """ - with (open(fname) if isinstance(fname,str) else fname) as f: - f.seek(0) - header_length,keyword = f.readline().split()[:2] - header_length = int(header_length) - content = f.readlines() + try: + f = open(fname) + except TypeError: + f = fname + + f.seek(0) + header_length,keyword = f.readline().split()[:2] + header_length = int(header_length) + content = f.readlines() if not keyword.startswith('head') or header_length < 3: raise TypeError('Header length information missing or invalid') @@ -320,15 +324,15 @@ class Geom(): plain = not pack if plain: - format_string = '%g' if self.microstructure in np.sctypes['float'] else \ + format_string = '%g' if self.microstructure.dtype in np.sctypes['float'] else \ '%{}i'.format(1+int(np.floor(np.log10(np.nanmax(self.microstructure))))) np.savetxt(fname, self.microstructure.reshape([grid[0],np.prod(grid[1:])],order='F').T, header='\n'.join(header), fmt=format_string, comments='') else: - if isinstance(fname,str): + try: f = open(fname,'w') - else: + except TypeError: f = fname compressType = None From af78aaf2f15da98303a56111b5301169de9fbf0f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 25 Nov 2019 14:01:40 +0100 Subject: [PATCH 152/233] testing rescale --- .../reference/Geom/scale_grid=10-10-10.geom | 105 ++++++++++++++ .../reference/Geom/scale_grid=10-11-10.geom | 115 +++++++++++++++ .../reference/Geom/scale_grid=10-13-10.geom | 135 ++++++++++++++++++ .../reference/Geom/scale_grid=10-20-2.geom | 45 ++++++ .../reference/Geom/scale_grid=5-4-20.geom | 85 +++++++++++ .../reference/Geom/scale_grid=8-10-12.geom | 125 ++++++++++++++++ python/tests/test_Geom.py | 27 +++- 7 files changed, 633 insertions(+), 4 deletions(-) create mode 100644 python/tests/reference/Geom/scale_grid=10-10-10.geom create mode 100644 python/tests/reference/Geom/scale_grid=10-11-10.geom create mode 100644 python/tests/reference/Geom/scale_grid=10-13-10.geom create mode 100644 python/tests/reference/Geom/scale_grid=10-20-2.geom create mode 100644 python/tests/reference/Geom/scale_grid=5-4-20.geom create mode 100644 python/tests/reference/Geom/scale_grid=8-10-12.geom diff --git a/python/tests/reference/Geom/scale_grid=10-10-10.geom b/python/tests/reference/Geom/scale_grid=10-10-10.geom new file mode 100644 index 000000000..43587a615 --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=10-10-10.geom @@ -0,0 +1,105 @@ +4 header +grid a 10 b 10 c 10 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 diff --git a/python/tests/reference/Geom/scale_grid=10-11-10.geom b/python/tests/reference/Geom/scale_grid=10-11-10.geom new file mode 100644 index 000000000..e12fc64fc --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=10-11-10.geom @@ -0,0 +1,115 @@ +4 header +grid a 10 b 11 c 10 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 diff --git a/python/tests/reference/Geom/scale_grid=10-13-10.geom b/python/tests/reference/Geom/scale_grid=10-13-10.geom new file mode 100644 index 000000000..cbe4afc00 --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=10-13-10.geom @@ -0,0 +1,135 @@ +4 header +grid a 10 b 13 c 10 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 diff --git a/python/tests/reference/Geom/scale_grid=10-20-2.geom b/python/tests/reference/Geom/scale_grid=10-20-2.geom new file mode 100644 index 000000000..6b1888f17 --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=10-20-2.geom @@ -0,0 +1,45 @@ +4 header +grid a 10 b 20 c 2 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 diff --git a/python/tests/reference/Geom/scale_grid=5-4-20.geom b/python/tests/reference/Geom/scale_grid=5-4-20.geom new file mode 100644 index 000000000..043683f6a --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=5-4-20.geom @@ -0,0 +1,85 @@ +4 header +grid a 5 b 4 c 20 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 2 2 2 21 + 1 6 2 2 25 + 1 14 2 2 33 + 1 18 2 2 37 + 1 2 2 2 21 + 1 6 2 2 25 + 1 14 2 2 33 + 1 18 2 2 37 + 1 2 2 2 21 + 1 6 2 2 25 + 1 14 2 2 33 + 1 18 2 2 37 + 1 2 2 2 21 + 1 6 2 2 25 + 1 14 2 2 33 + 1 18 2 2 37 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 5 2 2 24 + 1 9 2 2 28 + 1 17 2 2 36 + 1 21 2 2 40 + 1 5 2 2 24 + 1 9 2 2 28 + 1 17 2 2 36 + 1 21 2 2 40 + 1 5 2 2 24 + 1 9 2 2 28 + 1 17 2 2 36 + 1 21 2 2 40 + 1 5 2 2 24 + 1 9 2 2 28 + 1 17 2 2 36 + 1 21 2 2 40 diff --git a/python/tests/reference/Geom/scale_grid=8-10-12.geom b/python/tests/reference/Geom/scale_grid=8-10-12.geom new file mode 100644 index 000000000..5cfe66aba --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=8-10-12.geom @@ -0,0 +1,125 @@ +4 header +grid a 8 b 10 c 12 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 + 1 1 2 22 2 2 1 21 + 1 1 6 26 2 2 5 25 + 1 1 6 26 2 2 5 25 + 1 1 10 30 2 2 9 29 + 1 1 10 30 2 2 9 29 + 1 1 14 34 2 2 13 33 + 1 1 14 34 2 2 13 33 + 1 1 18 38 2 2 17 37 + 1 1 18 38 2 2 17 37 + 1 1 2 22 2 2 1 21 + 1 1 2 22 2 2 1 21 + 1 1 6 26 2 2 5 25 + 1 1 6 26 2 2 5 25 + 1 1 10 30 2 2 9 29 + 1 1 10 30 2 2 9 29 + 1 1 14 34 2 2 13 33 + 1 1 14 34 2 2 13 33 + 1 1 18 38 2 2 17 37 + 1 1 18 38 2 2 17 37 + 1 1 3 23 2 2 2 22 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 19 39 2 2 18 38 + 1 1 3 23 2 2 2 22 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 19 39 2 2 18 38 + 1 1 3 23 2 2 2 22 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 19 39 2 2 18 38 + 1 1 3 23 2 2 2 22 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 19 39 2 2 18 38 + 1 1 4 24 2 2 3 23 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 20 40 2 2 19 39 + 1 1 4 24 2 2 3 23 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 20 40 2 2 19 39 + 1 1 4 24 2 2 3 23 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 20 40 2 2 19 39 + 1 1 4 24 2 2 3 23 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 20 40 2 2 19 39 + 1 1 5 25 2 2 4 24 + 1 1 5 25 2 2 4 24 + 1 1 9 29 2 2 8 28 + 1 1 9 29 2 2 8 28 + 1 1 13 33 2 2 12 32 + 1 1 13 33 2 2 12 32 + 1 1 17 37 2 2 16 36 + 1 1 17 37 2 2 16 36 + 1 1 21 41 2 2 20 40 + 1 1 21 41 2 2 20 40 + 1 1 5 25 2 2 4 24 + 1 1 5 25 2 2 4 24 + 1 1 9 29 2 2 8 28 + 1 1 9 29 2 2 8 28 + 1 1 13 33 2 2 12 32 + 1 1 13 33 2 2 12 32 + 1 1 17 37 2 2 16 36 + 1 1 17 37 2 2 16 36 + 1 1 21 41 2 2 20 40 + 1 1 21 41 2 2 20 40 diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py index 1d1c32992..69492136d 100644 --- a/python/tests/test_Geom.py +++ b/python/tests/test_Geom.py @@ -58,10 +58,12 @@ class TestGeom: assert geom_equal(new,default) @pytest.mark.parametrize('directions,reflect',[ - (['x'], False), - (['x','y','z'],True), - (['z','x','y'],False), - (['y','z'], False)]) + (['x'], False), + (['x','y','z'],True), + (['z','x','y'],False), + (['y','z'], False) + ] + ) def test_mirror(self,default,update,reference_dir,directions,reflect): modified = copy.deepcopy(default) modified.mirror(directions,reflect) @@ -78,3 +80,20 @@ class TestGeom: reference = os.path.join(reference_dir,'clean_{}.geom'.format(tag)) if update: modified.to_file(reference) assert geom_equal(modified,Geom.from_file(reference)) + + @pytest.mark.parametrize('grid',[ + ((10,11,10)), + ([10,13,10]), + (np.array((10,10,10))), + (np.array((8, 10,12))), + (np.array((5, 4, 20))), + (np.array((10,20,2)) ) + ] + ) + def test_scale(self,default,update,reference_dir,grid): + modified = copy.deepcopy(default) + modified.scale(grid) + tag = 'grid={}'.format('-'.join([str(x) for x in grid])) + reference = os.path.join(reference_dir,'scale_{}.geom'.format(tag)) + if update: modified.to_file(reference) + assert geom_equal(modified,Geom.from_file(reference)) From 592878d3644c646b11561b3ddc4de9208ffd8c09 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 25 Nov 2019 17:29:13 +0100 Subject: [PATCH 153/233] need to invoke function --- processing/pre/geom_renumber.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/processing/pre/geom_renumber.py b/processing/pre/geom_renumber.py index b1db6ed13..6e51062a5 100755 --- a/processing/pre/geom_renumber.py +++ b/processing/pre/geom_renumber.py @@ -30,6 +30,6 @@ for name in filenames: damask.util.report(scriptName,name) geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) - damask.util.croak(geom.renumber) + damask.util.croak(geom.renumber()) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) geom.to_file(sys.stdout if name is None else name,pack=False) From 217a901edd5c6f69a8fca6a504f7247072b5717f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 25 Nov 2019 21:44:58 +0100 Subject: [PATCH 154/233] PRIVATE fixed --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 8fa92908b..66d562c75 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 8fa92908b841341395a8b13180bd6bcae2ad1659 +Subproject commit 66d562c755cd9aa4bbb8280c509383014acd52db From 81c739192a499ea40b60f18e355b3e9922bab4d0 Mon Sep 17 00:00:00 2001 From: Test User Date: Tue, 26 Nov 2019 02:14:29 +0100 Subject: [PATCH 155/233] [skip ci] updated version information after successful test of v2.0.3-1097-ga7fca4df --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a5ac7d281..1a1650364 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-1073-g6f3cb071 +v2.0.3-1097-ga7fca4df From 845cfc34ecc09fdb4e78c2a9c6378157b9cf0fe9 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 26 Nov 2019 14:26:25 +0100 Subject: [PATCH 156/233] similar logic as in geom class - filename is not part of the object - transparent handling of files, strings, and path-like objects for file IO --- processing/post/addCauchy.py | 2 +- python/damask/table.py | 70 +++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/processing/post/addCauchy.py b/processing/post/addCauchy.py index 9037567f8..3a0e14da7 100755 --- a/processing/post/addCauchy.py +++ b/processing/post/addCauchy.py @@ -39,4 +39,4 @@ for name in filenames: table.add_array('Cauchy',damask.mechanics.Cauchy(table.get_array(options.defgrad).reshape(-1,3,3), table.get_array(options.stress).reshape(-1,3,3)).reshape(-1,9), scriptID) - table.to_ASCII() + table.to_ASCII(name) diff --git a/python/damask/table.py b/python/damask/table.py index 81901c252..e77ae2b9c 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -5,36 +5,39 @@ import numpy as np class Table(): """Read and write to ASCII tables""" - - def __init__(self,name): - self.name = name - with open(self.name) as f: - header,keyword = f.readline().split() - if keyword == 'header': - header = int(header) + + def __init__(self,fname): + try: + f = open(fname) + except TypeError: + f = fname + + header,keyword = f.readline().split() + if keyword == 'header': + header = int(header) + else: + raise Exception + self.comments = [f.readline()[:-1] for i in range(header-1)] + labels_raw = f.readline().split() + self.data = pd.read_csv(f,delim_whitespace=True,header=None) + + labels_repeated = [l.split('_',1)[1] if '_' in l else l for l in labels_raw] + self.data.rename(columns=dict(zip([l for l in self.data.columns],labels_repeated)),inplace=True) + + self.shape = {} + for l in labels_raw: + tensor_column = re.search(':.*?_',l) + if tensor_column: + my_shape = tensor_column.group()[1:-1].split('x') + self.shape[l.split('_',1)[1]] = tuple([int(d) for d in my_shape]) else: - raise Exception - self.comments = [f.readline()[:-1] for i in range(header-1)] - labels_raw = f.readline().split() - self.data = pd.read_csv(f,delim_whitespace=True,header=None) - - labels_repeated = [l.split('_',1)[1] if '_' in l else l for l in labels_raw] - self.data.rename(columns=dict(zip([l for l in self.data.columns],labels_repeated)),inplace=True) - - self.shape = {} - for l in labels_raw: - tensor_column = re.search(':.*?_',l) - if tensor_column: - my_shape = tensor_column.group()[1:-1].split('x') - self.shape[l.split('_',1)[1]] = tuple([int(d) for d in my_shape]) + vector_column = re.match('.*?_',l) + if vector_column: + self.shape[l.split('_',1)[1]] = (int(l.split('_',1)[0]),) else: - vector_column = re.match('.*?_',l) - if vector_column: - self.shape[l.split('_',1)[1]] = (int(l.split('_',1)[0]),) - else: - self.shape[l]=(1,) - - self.labels = list(dict.fromkeys(labels_repeated)) + self.shape[l]=(1,) + + self.labels = list(dict.fromkeys(labels_repeated)) def get_array(self,label): @@ -56,7 +59,7 @@ class Table(): self.data = pd.concat([self.data,new_data],axis=1) - def to_ASCII(self,name=None): + def to_ASCII(self,fname): labels = [] for l in self.labels: if(self.shape[l] == (1,)): @@ -72,6 +75,9 @@ class Table(): + self.comments\ + [' '.join(labels)] - with open(name if name is not None else self.name,'w') as f: - for line in header: f.write(line+'\n') - self.data.to_csv(f,sep=' ',index=False,header=False) + try: + f = open(fname,'w') + except TypeError: + f = fname + for line in header: f.write(line+'\n') + self.data.to_csv(f,sep=' ',index=False,header=False) From 925a4f73d649eee0276e102e0c95da2c119d18fa Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 26 Nov 2019 20:32:54 +0100 Subject: [PATCH 157/233] staticmethod better suited than class method a classmethod changes the class, i.e. it assigns attributes and gives them specific values. a staticmethod does not alter the class https://www.geeksforgeeks.org/class-method-vs-static-method-python --- python/damask/geom.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/damask/geom.py b/python/damask/geom.py index 1c9e10cd1..32ea2ed89 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -239,8 +239,8 @@ class Geom(): header.append('homogenization {}'.format(self.get_homogenization())) return header - @classmethod - def from_file(cls,fname): + @staticmethod + def from_file(fname): """ Reads a geom file. @@ -300,7 +300,7 @@ class Geom(): if not np.any(np.mod(microstructure.flatten(),1) != 0.0): # no float present microstructure = microstructure.astype('int') - return cls(microstructure.reshape(grid),size,origin,homogenization,comments) + return Geom(microstructure.reshape(grid),size,origin,homogenization,comments) def to_file(self,fname,pack=None): From 5661f60552e25ffe19ce2bb505e9b2a8404bad76 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 26 Nov 2019 21:36:24 +0100 Subject: [PATCH 158/233] fname seems to be the common name --- python/damask/dadf5.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index d879946eb..5ecc8e619 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -18,17 +18,17 @@ class DADF5(): """ # ------------------------------------------------------------------ - def __init__(self,filename): + def __init__(self,fname): """ Opens an existing DADF5 file. Parameters ---------- - filename : str + fname : str name of the DADF5 file to be openend. """ - with h5py.File(filename,'r') as f: + with h5py.File(fname,'r') as f: if f.attrs['DADF5-major'] != 0 or not 2 <= f.attrs['DADF5-minor'] <= 3: raise TypeError('Unsupported DADF5 version {} '.format(f.attrs['DADF5-version'])) @@ -64,7 +64,7 @@ class DADF5(): 'con_physics': self.con_physics, 'mat_physics': self.mat_physics} - self.filename = filename + self.fname = fname def __manage_visible(self,datasets,what,action): @@ -298,7 +298,7 @@ class DADF5(): groups = [] - with h5py.File(self.filename,'r') as f: + with h5py.File(self.fname,'r') as f: for i in self.iter_visible('increments'): for o,p in zip(['constituents','materialpoints'],['con_physics','mat_physics']): for oo in self.iter_visible(o): @@ -315,7 +315,7 @@ class DADF5(): def list_data(self): """Return information on all active datasets in the file.""" message = '' - with h5py.File(self.filename,'r') as f: + with h5py.File(self.fname,'r') as f: for s,i in enumerate(self.iter_visible('increments')): message+='\n{} ({}s)\n'.format(i,self.times[s]) for o,p in zip(['constituents','materialpoints'],['con_physics','mat_physics']): @@ -336,7 +336,7 @@ class DADF5(): def get_dataset_location(self,label): """Return the location of all active datasets with given label.""" path = [] - with h5py.File(self.filename,'r') as f: + with h5py.File(self.fname,'r') as f: for i in self.iter_visible('increments'): k = '/'.join([i,'geometry',label]) try: @@ -358,14 +358,14 @@ class DADF5(): def get_constituent_ID(self,c=0): """Pointwise constituent ID.""" - with h5py.File(self.filename,'r') as f: + with h5py.File(self.fname,'r') as f: names = f['/mapping/cellResults/constituent']['Name'][:,c].astype('str') return np.array([int(n.split('_')[0]) for n in names.tolist()],dtype=np.int32) def get_crystal_structure(self): # ToDo: extension to multi constituents/phase """Info about the crystal structure.""" - with h5py.File(self.filename,'r') as f: + with h5py.File(self.fname,'r') as f: return f[self.get_dataset_location('orientation')[0]].attrs['Lattice'].astype('str') # np.bytes_ to string @@ -375,7 +375,7 @@ class DADF5(): If more than one path is given, the dataset is composed of the individual contributions. """ - with h5py.File(self.filename,'r') as f: + with h5py.File(self.fname,'r') as f: shape = (self.Nmaterialpoints,) + np.shape(f[path[0]])[1:] if len(shape) == 1: shape = shape +(1,) dataset = np.full(shape,np.nan,dtype=np.dtype(f[path[0]])) @@ -418,7 +418,7 @@ class DADF5(): ) return np.concatenate((x[:,:,:,None],y[:,:,:,None],y[:,:,:,None]),axis = 3).reshape([np.product(self.grid),3]) else: - with h5py.File(self.filename,'r') as f: + with h5py.File(self.fname,'r') as f: return f['geometry/x_c'][()] @@ -798,7 +798,7 @@ class DADF5(): todo = [] # ToDo: It would be more memory efficient to read only from file when required, i.e. do to it in pool.add_task for group in self.groups_with_datasets([d['label'] for d in datasets_requested]): - with h5py.File(self.filename,'r') as f: + with h5py.File(self.fname,'r') as f: datasets_in = {} for d in datasets_requested: loc = f[group+'/'+d['label']] @@ -813,7 +813,7 @@ class DADF5(): N_not_calculated = len(todo) while N_not_calculated > 0: result = results.get() - with h5py.File(self.filename,'a') as f: # write to file + with h5py.File(self.fname,'a') as f: # write to file dataset_out = f[result['group']].create_dataset(result['label'],data=result['data']) for k in result['meta'].keys(): dataset_out.attrs[k] = result['meta'][k].encode() From 2d96136a0d9fb305a0bd43ce11e00077c9d900d1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 26 Nov 2019 22:53:46 +0100 Subject: [PATCH 159/233] more general constructor for Table reading from file is just one case (now handled by static method). General constructor needs data and header information as dictionary. Works only with python 3.7 where dict keeps the insertion order. Earlier python versions/other implementations might fail. --- processing/post/addCauchy.py | 15 +++++-- python/damask/table.py | 82 ++++++++++++++++++++++++------------ 2 files changed, 66 insertions(+), 31 deletions(-) diff --git a/processing/post/addCauchy.py b/processing/post/addCauchy.py index 3a0e14da7..788f1b580 100755 --- a/processing/post/addCauchy.py +++ b/processing/post/addCauchy.py @@ -1,6 +1,8 @@ #!/usr/bin/env python3 import os +import sys +from io import StringIO from optparse import OptionParser import damask @@ -34,9 +36,14 @@ parser.set_defaults(defgrad = 'f', (options,filenames) = parser.parse_args() +if filenames == []: filenames = [None] + for name in filenames: - table = damask.Table(name) - table.add_array('Cauchy',damask.mechanics.Cauchy(table.get_array(options.defgrad).reshape(-1,3,3), - table.get_array(options.stress).reshape(-1,3,3)).reshape(-1,9), + damask.util.report(scriptName,name) + + table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) + table.add_array('Cauchy', + damask.mechanics.Cauchy(table.get_array(options.defgrad).reshape(-1,3,3), + table.get_array(options.stress).reshape(-1,3,3)).reshape(-1,9), scriptID) - table.to_ASCII(name) + table.to_ASCII(sys.stdout if name is None else name) diff --git a/python/damask/table.py b/python/damask/table.py index e77ae2b9c..6c5103bc9 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -4,9 +4,42 @@ import pandas as pd import numpy as np class Table(): - """Read and write to ASCII tables""" - - def __init__(self,fname): + """Store spreadsheet-like data.""" + + def __init__(self,array,headings,comments=None): + """ + New spreadsheet data. + + Parameters + ---------- + array : numpy.ndarray + Data. + headings : dict + Column headings. Labels as keys and shape as tuple. Example 'F':(3,3) for a deformation gradient. + comments : iterable of str, optional + Additional, human-readable information + + """ + self.data = pd.DataFrame(data=array) + + d = {} + i = 0 + for label in headings: + for components in range(np.prod(headings[label])): + d[i] = label + i+=1 + + self.data.rename(columns=d,inplace=True) + + if comments is None: + self.comments = [] + else: + self.comments = [c for c in comments] + + self.headings = headings + + @staticmethod + def from_ASCII(fname): try: f = open(fname) except TypeError: @@ -17,43 +50,38 @@ class Table(): header = int(header) else: raise Exception - self.comments = [f.readline()[:-1] for i in range(header-1)] - labels_raw = f.readline().split() - self.data = pd.read_csv(f,delim_whitespace=True,header=None) - - labels_repeated = [l.split('_',1)[1] if '_' in l else l for l in labels_raw] - self.data.rename(columns=dict(zip([l for l in self.data.columns],labels_repeated)),inplace=True) - - self.shape = {} + comments = [f.readline()[:-1] for i in range(header-1)] + labels_raw = f.readline().split() + labels = [l.split('_',1)[1] if '_' in l else l for l in labels_raw] + + headings = {} for l in labels_raw: tensor_column = re.search(':.*?_',l) if tensor_column: my_shape = tensor_column.group()[1:-1].split('x') - self.shape[l.split('_',1)[1]] = tuple([int(d) for d in my_shape]) + headings[l.split('_',1)[1]] = tuple([int(d) for d in my_shape]) else: vector_column = re.match('.*?_',l) if vector_column: - self.shape[l.split('_',1)[1]] = (int(l.split('_',1)[0]),) + headings[l.split('_',1)[1]] = (int(l.split('_',1)[0]),) else: - self.shape[l]=(1,) + headings[l]=(1,) - self.labels = list(dict.fromkeys(labels_repeated)) + return Table(np.loadtxt(f),headings,comments) def get_array(self,label): - return self.data[label].to_numpy().reshape((-1,)+self.shape[label]) + return self.data[label].to_numpy().reshape((-1,)+self.headings[label]) def add_array(self,label,array,info): - if np.product(array.shape[1:],dtype=int) == 1: + if np.prod(array.shape[1:],dtype=int) == 1: self.comments.append('{}: {}'.format(label,info)) - else: self.comments.append('{} {}: {}'.format(label,array.shape[1:],info)) - self.shape[label] = array.shape[1:] - self.labels.append(label) - size = np.product(array.shape[1:]) + self.headings[label] = array.shape[1:] if len(array.shape) > 1 else (1,) + size = np.prod(array.shape[1:],dtype=int) new_data = pd.DataFrame(data=array.reshape(-1,size), columns=[label for l in range(size)]) self.data = pd.concat([self.data,new_data],axis=1) @@ -61,15 +89,15 @@ class Table(): def to_ASCII(self,fname): labels = [] - for l in self.labels: - if(self.shape[l] == (1,)): + for l in self.headings: + if(self.headings[l] == (1,)): labels.append('{}'.format(l)) - elif(len(self.shape[l]) == 1): + elif(len(self.headings[l]) == 1): labels+=['{}_{}'.format(i+1,l)\ - for i in range(self.shape[l][0])] + for i in range(self.headings[l][0])] else: - labels+=['{}:{}_{}'.format(i+1,'x'.join([str(d) for d in self.shape[l]]),l)\ - for i in range(np.product(self.shape[l]))] + labels+=['{}:{}_{}'.format(i+1,'x'.join([str(d) for d in self.headings[l]]),l)\ + for i in range(np.prod(self.headings[l],dtype=int))] header = ['{} header'.format(len(self.comments)+1)]\ + self.comments\ From 31d3958ca6d43b63270c6755def366fbe4824d02 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 26 Nov 2019 22:55:38 +0100 Subject: [PATCH 160/233] using fast new Table class more a proof-of-concept since shell scripts are deprecated. The detailed error handling of the former scripts is not implemented, i.e. the user need to ensure that the files exist and the data has the correct shape --- processing/post/addDeterminant.py | 66 ++++---------------------- processing/post/addDeviator.py | 79 +++++-------------------------- 2 files changed, 22 insertions(+), 123 deletions(-) diff --git a/processing/post/addDeterminant.py b/processing/post/addDeterminant.py index 14f0321be..090b9224a 100755 --- a/processing/post/addDeterminant.py +++ b/processing/post/addDeterminant.py @@ -4,20 +4,13 @@ import os import sys from optparse import OptionParser -import damask +import numpy as np +import damask scriptName = os.path.splitext(os.path.basename(__file__))[0] scriptID = ' '.join([scriptName,damask.version]) -def determinant(m): - return +m[0]*m[4]*m[8] \ - +m[1]*m[5]*m[6] \ - +m[2]*m[3]*m[7] \ - -m[2]*m[4]*m[6] \ - -m[1]*m[3]*m[8] \ - -m[0]*m[5]*m[7] - # -------------------------------------------------------------------- # MAIN @@ -43,52 +36,11 @@ if options.tensor is None: if filenames == []: filenames = [None] for name in filenames: - try: - table = damask.ASCIItable(name = name, - buffered = False) - except: continue - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) -# ------------------------------------------ read header ------------------------------------------ - - table.head_read() - -# ------------------------------------------ sanity checks ---------------------------------------- - - items = { - 'tensor': {'dim': 9, 'shape': [3,3], 'labels':options.tensor, 'column': []}, - } - errors = [] - remarks = [] - - for type, data in items.items(): - for what in data['labels']: - dim = table.label_dimension(what) - if dim != data['dim']: remarks.append('column {} is not a {}...'.format(what,type)) - else: - items[type]['column'].append(table.label_index(what)) - table.labels_append('det({})'.format(what)) # extend ASCII header with new labels - - if remarks != []: damask.util.croak(remarks) - if errors != []: - damask.util.croak(errors) - table.close(dismiss = True) - continue - -# ------------------------------------------ assemble header -------------------------------------- - - table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.head_write() - -# ------------------------------------------ process data ------------------------------------------ - - outputAlive = True - while outputAlive and table.data_read(): # read next data line of ASCII table - for type, data in items.items(): - for column in data['column']: - table.data_append(determinant(list(map(float,table.data[column: column+data['dim']])))) - outputAlive = table.data_write() # output processed line - -# ------------------------------------------ output finalization ----------------------------------- - - table.close() # close input ASCII table (works for stdin) + table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) + for tensor in options.tensor: + table.add_array('det({})'.format(tensor), + np.linalg.det(table.get_array(tensor).reshape(-1,3,3)), + scriptID) + table.to_ASCII(sys.stdout if name is None else name) diff --git a/processing/post/addDeviator.py b/processing/post/addDeviator.py index c9aeaacfd..c0bb77e6b 100755 --- a/processing/post/addDeviator.py +++ b/processing/post/addDeviator.py @@ -2,6 +2,7 @@ import os import sys +from io import StringIO from optparse import OptionParser import damask @@ -9,17 +10,6 @@ import damask scriptName = os.path.splitext(os.path.basename(__file__))[0] scriptID = ' '.join([scriptName,damask.version]) -oneThird = 1.0/3.0 - -def deviator(m,spherical = False): # Careful, do not change the value of m, its intent(inout)! - sph = oneThird*(m[0]+m[4]+m[8]) - dev = [ - m[0]-sph, m[1], m[2], - m[3], m[4]-sph, m[5], - m[6], m[7], m[8]-sph, - ] - return dev,sph if spherical else dev - # -------------------------------------------------------------------- # MAIN @@ -49,58 +39,15 @@ if options.tensor is None: if filenames == []: filenames = [None] for name in filenames: - try: - table = damask.ASCIItable(name = name, buffered = False) - except: - continue - damask.util.report(scriptName,name) - -# ------------------------------------------ read header ------------------------------------------ - - table.head_read() - -# ------------------------------------------ sanity checks ---------------------------------------- - - items = { - 'tensor': {'dim': 9, 'shape': [3,3], 'labels':options.tensor, 'active':[], 'column': []}, - } - errors = [] - remarks = [] - column = {} - - for type, data in items.items(): - for what in data['labels']: - dim = table.label_dimension(what) - if dim != data['dim']: remarks.append('column {} is not a {}.'.format(what,type)) - else: - items[type]['active'].append(what) - items[type]['column'].append(table.label_index(what)) - - if remarks != []: damask.util.croak(remarks) - if errors != []: - damask.util.croak(errors) - table.close(dismiss = True) - continue - -# ------------------------------------------ assemble header -------------------------------------- - - table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - for type, data in items.items(): - for label in data['active']: - table.labels_append(['{}_dev({})'.format(i+1,label) for i in range(data['dim'])] + \ - (['sph({})'.format(label)] if options.spherical else [])) # extend ASCII header with new labels - table.head_write() - -# ------------------------------------------ process data ------------------------------------------ - - outputAlive = True - while outputAlive and table.data_read(): # read next data line of ASCII table - for type, data in items.items(): - for column in data['column']: - table.data_append(deviator(list(map(float,table.data[column: - column+data['dim']])),options.spherical)) - outputAlive = table.data_write() # output processed line - -# ------------------------------------------ output finalization ----------------------------------- - - table.close() # close input ASCII table (works for stdin) + damask.util.report(scriptName,name) + + table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) + for tensor in options.tensor: + table.add_array('dev({})'.format(tensor), + damask.mechanics.deviatoric_part(table.get_array(tensor).reshape(-1,3,3)).reshape((-1,9)), + scriptID) + if options.spherical: + table.add_array('sph({})'.format(tensor), + damask.mechanics.spherical_part(table.get_array(tensor).reshape(-1,3,3)), + scriptID) + table.to_ASCII(sys.stdout if name is None else name) From 882a11c5f874b2491c88753c80b8cba69970f2f1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 27 Nov 2019 08:43:20 +0100 Subject: [PATCH 161/233] get labels without shape information --- python/damask/table.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/damask/table.py b/python/damask/table.py index 6c5103bc9..7df642d02 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -69,10 +69,11 @@ class Table(): return Table(np.loadtxt(f),headings,comments) - def get_array(self,label): return self.data[label].to_numpy().reshape((-1,)+self.headings[label]) + def get_labels(self): + return [label for label in self.headings] def add_array(self,label,array,info): if np.prod(array.shape[1:],dtype=int) == 1: @@ -86,7 +87,6 @@ class Table(): columns=[label for l in range(size)]) self.data = pd.concat([self.data,new_data],axis=1) - def to_ASCII(self,fname): labels = [] for l in self.headings: From eb033e11b29522ccf9ad634ed6bbd52c8452eaf1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 27 Nov 2019 08:44:38 +0100 Subject: [PATCH 162/233] polishing --- processing/post/addCauchy.py | 4 ++-- processing/post/addDeterminant.py | 8 +++----- processing/post/addDeviator.py | 12 +++++------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/processing/post/addCauchy.py b/processing/post/addCauchy.py index 788f1b580..ad29792a6 100755 --- a/processing/post/addCauchy.py +++ b/processing/post/addCauchy.py @@ -35,7 +35,6 @@ parser.set_defaults(defgrad = 'f', ) (options,filenames) = parser.parse_args() - if filenames == []: filenames = [None] for name in filenames: @@ -45,5 +44,6 @@ for name in filenames: table.add_array('Cauchy', damask.mechanics.Cauchy(table.get_array(options.defgrad).reshape(-1,3,3), table.get_array(options.stress).reshape(-1,3,3)).reshape(-1,9), - scriptID) + scriptID+' '+' '.join(sys.argv[1:])) + table.to_ASCII(sys.stdout if name is None else name) diff --git a/processing/post/addDeterminant.py b/processing/post/addDeterminant.py index 090b9224a..e38261bf6 100755 --- a/processing/post/addDeterminant.py +++ b/processing/post/addDeterminant.py @@ -27,14 +27,11 @@ parser.add_option('-t','--tensor', help = 'heading of columns containing tensor field values') (options,filenames) = parser.parse_args() +if filenames == []: filenames = [None] if options.tensor is None: parser.error('no data column specified.') -# --- loop over input files ------------------------------------------------------------------------- - -if filenames == []: filenames = [None] - for name in filenames: damask.util.report(scriptName,name) @@ -42,5 +39,6 @@ for name in filenames: for tensor in options.tensor: table.add_array('det({})'.format(tensor), np.linalg.det(table.get_array(tensor).reshape(-1,3,3)), - scriptID) + scriptID+' '+' '.join(sys.argv[1:])) + table.to_ASCII(sys.stdout if name is None else name) diff --git a/processing/post/addDeviator.py b/processing/post/addDeviator.py index c0bb77e6b..7807c7f5d 100755 --- a/processing/post/addDeviator.py +++ b/processing/post/addDeviator.py @@ -30,13 +30,10 @@ parser.add_option('-s','--spherical', help = 'report spherical part of tensor (hydrostatic component, pressure)') (options,filenames) = parser.parse_args() +if filenames == []: filenames = [None] if options.tensor is None: - parser.error('no data column specified...') - -# --- loop over input files ------------------------------------------------------------------------- - -if filenames == []: filenames = [None] + parser.error('no data column specified...') for name in filenames: damask.util.report(scriptName,name) @@ -45,9 +42,10 @@ for name in filenames: for tensor in options.tensor: table.add_array('dev({})'.format(tensor), damask.mechanics.deviatoric_part(table.get_array(tensor).reshape(-1,3,3)).reshape((-1,9)), - scriptID) + scriptID+' '+' '.join(sys.argv[1:])) if options.spherical: table.add_array('sph({})'.format(tensor), damask.mechanics.spherical_part(table.get_array(tensor).reshape(-1,3,3)), - scriptID) + scriptID+' '+' '.join(sys.argv[1:])) + table.to_ASCII(sys.stdout if name is None else name) From ab83dc2ebc91a44589f03040775ce11e38fe3952 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 27 Nov 2019 08:45:01 +0100 Subject: [PATCH 163/233] use central facilities --- processing/post/addMises.py | 80 +++++++------------------------------ 1 file changed, 14 insertions(+), 66 deletions(-) diff --git a/processing/post/addMises.py b/processing/post/addMises.py index be11b0f1c..9bc560f2d 100755 --- a/processing/post/addMises.py +++ b/processing/post/addMises.py @@ -2,10 +2,8 @@ import os import sys +from io import StringIO from optparse import OptionParser -from collections import OrderedDict - -import numpy as np import damask @@ -13,15 +11,6 @@ import damask scriptName = os.path.splitext(os.path.basename(__file__))[0] scriptID = ' '.join([scriptName,damask.version]) -def Mises(what,tensor): - - dev = tensor - np.trace(tensor)/3.0*np.eye(3) - symdev = 0.5*(dev+dev.T) - return np.sqrt(np.sum(symdev*symdev.T)* - { - 'stress': 3.0/2.0, - 'strain': 2.0/3.0, - }[what.lower()]) # -------------------------------------------------------------------- # MAIN @@ -47,62 +36,21 @@ parser.set_defaults(strain = [], (options,filenames) = parser.parse_args() if options.stress is [] and options.strain is []: - parser.error('no data column specified...') - -# --- loop over input files ------------------------------------------------------------------------- + parser.error('no data column specified...') if filenames == []: filenames = [None] for name in filenames: - try: - table = damask.ASCIItable(name = name, - buffered = False) - except: continue - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) -# ------------------------------------------ read header ------------------------------------------ - - table.head_read() - -# ------------------------------------------ sanity checks ---------------------------------------- - - items = OrderedDict([ - ('strain', {'dim': 9, 'shape': [3,3], 'labels':options.strain, 'active':[], 'column': []}), - ('stress', {'dim': 9, 'shape': [3,3], 'labels':options.stress, 'active':[], 'column': []}) - ]) - errors = [] - remarks = [] - - for type, data in items.items(): - for what in data['labels']: - dim = table.label_dimension(what) - if dim != data['dim']: remarks.append('column {} is not a {}...'.format(what,type)) - else: - items[type]['active'].append(what) - items[type]['column'].append(table.label_index(what)) - table.labels_append('Mises({})'.format(what)) # extend ASCII header with new labels - - if remarks != []: damask.util.croak(remarks) - if errors != []: - damask.util.croak(errors) - table.close(dismiss = True) - continue - -# ------------------------------------------ assemble header -------------------------------------- - - table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.head_write() - -# ------------------------------------------ process data ------------------------------------------ - - outputAlive = True - while outputAlive and table.data_read(): # read next data line of ASCII table - for type, data in items.items(): - for column in data['column']: - table.data_append(Mises(type, - np.array(table.data[column:column+data['dim']],'d').reshape(data['shape']))) - outputAlive = table.data_write() # output processed line - -# ------------------------------------------ output finalization ----------------------------------- - - table.close() # close input ASCII table (works for stdin) + table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) + for strain in options.strain: + table.add_array('Mises({})'.format(strain), + damask.mechanics.Mises_strain(damask.mechanics.symmetric(table.get_array(strain).reshape(-1,3,3))), + scriptID+' '+' '.join(sys.argv[1:])) + for stress in options.stress: + table.add_array('Mises({})'.format(stress), + damask.mechanics.Mises_stress(damask.mechanics.symmetric(table.get_array(stress).reshape(-1,3,3))), + scriptID+' '+' '.join(sys.argv[1:])) + + table.to_ASCII(sys.stdout if name is None else name) From 9ad74745c15a43fe5cb0c884ac82ca74cde9047c Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 27 Nov 2019 08:48:41 +0100 Subject: [PATCH 164/233] missing import detected by prospector --- processing/post/addDeterminant.py | 1 + 1 file changed, 1 insertion(+) diff --git a/processing/post/addDeterminant.py b/processing/post/addDeterminant.py index e38261bf6..4c3f9d260 100755 --- a/processing/post/addDeterminant.py +++ b/processing/post/addDeterminant.py @@ -2,6 +2,7 @@ import os import sys +from io import StringIO from optparse import OptionParser import numpy as np From 96714089b19b3f38e247d06c79d075521c5b7d2e Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 27 Nov 2019 09:58:58 +0100 Subject: [PATCH 165/233] documented and tested handling of multi-dimensional data more precise regex expressions. get_array can handle individual components --- python/damask/table.py | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/python/damask/table.py b/python/damask/table.py index 7df642d02..bad2a60c3 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -40,6 +40,13 @@ class Table(): @staticmethod def from_ASCII(fname): + """ + Create table from ASCII file. + + The first line needs to indicate the number of subsequent header lines as 'n header'. + Vector data labels are indicated by '1_x, 2_x, ..., n_x'. + Tensor data labels are indicated by '3x3:1_x, 3x3:2_x, ..., 3x3:9_x'. + """ try: f = open(fname) except TypeError: @@ -50,29 +57,34 @@ class Table(): header = int(header) else: raise Exception - comments = [f.readline()[:-1] for i in range(header-1)] - labels_raw = f.readline().split() - labels = [l.split('_',1)[1] if '_' in l else l for l in labels_raw] + comments = [f.readline()[:-1] for i in range(header-1)] + labels = f.readline().split() headings = {} - for l in labels_raw: - tensor_column = re.search(':.*?_',l) + for label in labels: + tensor_column = re.search(r'[0-9,x]*?:[0-9]*?_',label) if tensor_column: - my_shape = tensor_column.group()[1:-1].split('x') - headings[l.split('_',1)[1]] = tuple([int(d) for d in my_shape]) + my_shape = tensor_column.group().split(':',1)[0].split('x') + headings[label.split('_',1)[1]] = tuple([int(d) for d in my_shape]) else: - vector_column = re.match('.*?_',l) + vector_column = re.match(r'[0-9]*?_',label) if vector_column: - headings[l.split('_',1)[1]] = (int(l.split('_',1)[0]),) + headings[label.split('_',1)[1]] = (int(label.split('_',1)[0]),) else: - headings[l]=(1,) + headings[label]=(1,) return Table(np.loadtxt(f),headings,comments) def get_array(self,label): - return self.data[label].to_numpy().reshape((-1,)+self.headings[label]) + """Return data as array.""" + if re.match(r'[0-9]*?_',label): + idx,key = label.split('_',1) + return self.data[key].to_numpy()[:,int(idx)-1] + else: + return self.data[label].to_numpy().reshape((-1,)+self.headings[label]) def get_labels(self): + """Return the labels of all columns.""" return [label for label in self.headings] def add_array(self,label,array,info): From 39734ef53cc81438ff69f84cfc87e89ec270fa0c Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 27 Nov 2019 10:56:29 +0100 Subject: [PATCH 166/233] alter data allows to access multiple columns ('f') and individual components ('1_f') --- python/damask/table.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/python/damask/table.py b/python/damask/table.py index bad2a60c3..2e426d6fb 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -83,6 +83,16 @@ class Table(): else: return self.data[label].to_numpy().reshape((-1,)+self.headings[label]) + def set_array(self,label,array): + """Set data.""" + if re.match(r'[0-9]*?_',label): + idx,key = label.split('_',1) + iloc = self.data.columns.get_loc(key).tolist().index(True) + int(idx) -1 + self.data.iloc[:,iloc] = array + else: + self.data[label] = array + + def get_labels(self): """Return the labels of all columns.""" return [label for label in self.headings] From 76c357737854fac8824fe798067fa8807d514ed9 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 27 Nov 2019 12:03:35 +0100 Subject: [PATCH 167/233] pandas.DataFrame needs to be a 2nd order array --- python/damask/table.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/table.py b/python/damask/table.py index 2e426d6fb..3cd6ed330 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -90,7 +90,7 @@ class Table(): iloc = self.data.columns.get_loc(key).tolist().index(True) + int(idx) -1 self.data.iloc[:,iloc] = array else: - self.data[label] = array + self.data[label] = array.reshape(self.data[label].shape) def get_labels(self): From 7d4b982c736f63f532d26bd7b67a1dcc155ff5b9 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 27 Nov 2019 12:08:23 +0100 Subject: [PATCH 168/233] make information on modifications mandatory --- processing/post/scaleData.py | 59 ++++++------------------------------ python/damask/table.py | 7 ++++- 2 files changed, 15 insertions(+), 51 deletions(-) diff --git a/processing/post/scaleData.py b/processing/post/scaleData.py index 5b03f8e07..90eaeb0cc 100755 --- a/processing/post/scaleData.py +++ b/processing/post/scaleData.py @@ -35,58 +35,17 @@ parser.set_defaults(label = [], ) (options,filenames) = parser.parse_args() - -if len(options.label) != len(options.factor): - parser.error('number of column labels and factors do not match.') - -# --- loop over input files ------------------------------------------------------------------------- - if filenames == []: filenames = [None] +if len(options.label) != len(options.factor): + parser.error('number of column labels and factors do not match.') + for name in filenames: - try: - table = damask.ASCIItable(name = name, - buffered = False) - except: continue - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) -# ------------------------------------------ read header ------------------------------------------ + table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) + for i,label in enumerate(options.label): + table.set_array(label,table.get_array(label)*float(options.factor[i]), + scriptID+' '+' '.join(sys.argv[1:])) - table.head_read() - - errors = [] - remarks = [] - columns = [] - dims = [] - factors = [] - - for what,factor in zip(options.label,options.factor): - col = table.label_index(what) - if col < 0: remarks.append('column {} not found...'.format(what,type)) - else: - columns.append(col) - factors.append(float(factor)) - dims.append(table.label_dimension(what)) - - if remarks != []: damask.util.croak(remarks) - if errors != []: - damask.util.croak(errors) - table.close(dismiss = True) - continue - -# ------------------------------------------ assemble header --------------------------------------- - - table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.head_write() - -# ------------------------------------------ process data ------------------------------------------ - - outputAlive = True - while outputAlive and table.data_read(): # read next data line of ASCII table - for col,dim,factor in zip(columns,dims,factors): # loop over items - table.data[col:col+dim] = factor * np.array(table.data[col:col+dim],'d') - outputAlive = table.data_write() # output processed line - -# ------------------------------------------ output finalization ----------------------------------- - - table.close() # close ASCII tables + table.to_ASCII(sys.stdout if name is None else name) diff --git a/python/damask/table.py b/python/damask/table.py index 3cd6ed330..0c9f3ac40 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -83,8 +83,13 @@ class Table(): else: return self.data[label].to_numpy().reshape((-1,)+self.headings[label]) - def set_array(self,label,array): + def set_array(self,label,array,info): """Set data.""" + if np.prod(array.shape[1:],dtype=int) == 1: + self.comments.append('{}: {}'.format(label,info)) + else: + self.comments.append('{} {}: {}'.format(label,array.shape[1:],info)) + if re.match(r'[0-9]*?_',label): idx,key = label.split('_',1) iloc = self.data.columns.get_loc(key).tolist().index(True) + int(idx) -1 From cee095b58ed19a2b45fdcd76b7b138a659b94b34 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 27 Nov 2019 12:19:37 +0100 Subject: [PATCH 169/233] better use centralized code --- processing/post/addPK2.py | 54 ++++++------------------------------ processing/post/scaleData.py | 3 +- python/damask/mechanics.py | 21 +++++++++++++- 3 files changed, 29 insertions(+), 49 deletions(-) diff --git a/processing/post/addPK2.py b/processing/post/addPK2.py index f38753619..45afdbcd1 100755 --- a/processing/post/addPK2.py +++ b/processing/post/addPK2.py @@ -2,10 +2,9 @@ import os import sys +from io import StringIO from optparse import OptionParser -import numpy as np - import damask @@ -36,53 +35,16 @@ parser.set_defaults(defgrad = 'f', ) (options,filenames) = parser.parse_args() - -# --- loop over input files ------------------------------------------------------------------------- - if filenames == []: filenames = [None] for name in filenames: - try: - table = damask.ASCIItable(name = name, - buffered = False) - except: continue - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) -# ------------------------------------------ read header ------------------------------------------ + table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) - table.head_read() + table.add_array('S', + damask.mechanics.PK2(table.get_array(options.defgrad).reshape(-1,3,3), + table.get_array(options.stress).reshape(-1,3,3)).reshape(-1,9), + scriptID+' '+' '.join(sys.argv[1:])) -# ------------------------------------------ sanity checks ---------------------------------------- - - errors = [] - column = {} - - for tensor in [options.defgrad,options.stress]: - dim = table.label_dimension(tensor) - if dim < 0: errors.append('column {} not found.'.format(tensor)) - elif dim != 9: errors.append('column {} is not a tensor.'.format(tensor)) - else: - column[tensor] = table.label_index(tensor) - - if errors != []: - damask.util.croak(errors) - table.close(dismiss = True) - continue - -# ------------------------------------------ assemble header -------------------------------------- - - table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.labels_append(['{}_S'.format(i+1) for i in range(9)]) # extend ASCII header with new labels - table.head_write() - -# ------------------------------------------ process data ------------------------------------------ - outputAlive = True - while outputAlive and table.data_read(): # read next data line of ASCII table - F = np.array(list(map(float,table.data[column[options.defgrad]:column[options.defgrad]+9])),'d').reshape(3,3) - P = np.array(list(map(float,table.data[column[options.stress ]:column[options.stress ]+9])),'d').reshape(3,3) - table.data_append(list(np.dot(np.linalg.inv(F),P).reshape(9))) # [S] =[P].[F-1] - outputAlive = table.data_write() # output processed line - -# ------------------------------------------ output finalization ----------------------------------- - - table.close() # close input ASCII table (works for stdin) + table.to_ASCII(sys.stdout if name is None else name) diff --git a/processing/post/scaleData.py b/processing/post/scaleData.py index 90eaeb0cc..ad57f4b7e 100755 --- a/processing/post/scaleData.py +++ b/processing/post/scaleData.py @@ -2,10 +2,9 @@ import os import sys +from io import StringIO from optparse import OptionParser -import numpy as np - import damask diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index 476682380..5503d7048 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -19,7 +19,26 @@ def Cauchy(F,P): else: sigma = np.einsum('i,ijk,ilk->ijl',1.0/np.linalg.det(F),P,F) return symmetric(sigma) - + + +def PK2(F,P): + """ + Return 2. Piola-Kirchhoff stress calculated from 1. Piola-Kirchhoff stress and deformation gradient. + + Parameters + ---------- + F : numpy.array of shape (:,3,3) or (3,3) + Deformation gradient. + P : numpy.array of shape (:,3,3) or (3,3) + 1. Piola-Kirchhoff stress. + + """ + if np.shape(F) == np.shape(P) == (3,3): + S = np.dot(np.linalg.inv(F),P) + else: + S = np.einsum('ijk,ikl->ijl',np.linalg.inv(F),P) + return S + def strain_tensor(F,t,m): """ From a8016d64bbce73cb3e44e08bc3e6ec2768506855 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 27 Nov 2019 12:31:32 +0100 Subject: [PATCH 170/233] simplified --- processing/post/shiftData.py | 62 ++++++------------------------------ 1 file changed, 10 insertions(+), 52 deletions(-) diff --git a/processing/post/shiftData.py b/processing/post/shiftData.py index 69a9696fa..591e68c5d 100755 --- a/processing/post/shiftData.py +++ b/processing/post/shiftData.py @@ -2,10 +2,9 @@ import os import sys +from io import StringIO from optparse import OptionParser -import numpy as np - import damask @@ -35,58 +34,17 @@ parser.set_defaults(label = [], ) (options,filenames) = parser.parse_args() - -if len(options.label) != len(options.offset): - parser.error('number of column labels and offsets do not match.') - -# --- loop over input files ------------------------------------------------------------------------- - if filenames == []: filenames = [None] +if len(options.label) != len(options.offset): + parser.error('number of column labels and offsets do not match.') + for name in filenames: - try: - table = damask.ASCIItable(name = name, - buffered = False) - except: continue - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) -# ------------------------------------------ read header ------------------------------------------ + table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) + for i,label in enumerate(options.label): + table.set_array(label,table.get_array(label)+float(options.offset[i]), + scriptID+' '+' '.join(sys.argv[1:])) - table.head_read() - - errors = [] - remarks = [] - columns = [] - dims = [] - offsets = [] - - for what,offset in zip(options.label,options.offset): - col = table.label_index(what) - if col < 0: remarks.append('column {} not found...'.format(what,type)) - else: - columns.append(col) - offsets.append(float(offset)) - dims.append(table.label_dimension(what)) - - if remarks != []: damask.util.croak(remarks) - if errors != []: - damask.util.croak(errors) - table.close(dismiss = True) - continue - -# ------------------------------------------ assemble header --------------------------------------- - - table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.head_write() - -# ------------------------------------------ process data ------------------------------------------ - - outputAlive = True - while outputAlive and table.data_read(): # read next data line of ASCII table - for col,dim,offset in zip(columns,dims,offsets): # loop over items - table.data[col:col+dim] = offset + np.array(table.data[col:col+dim],'d') - outputAlive = table.data_write() # output processed line - -# ------------------------------------------ output finalization ----------------------------------- - - table.close() # close ASCII tables + table.to_ASCII(sys.stdout if name is None else name) From 80002e6cfdfda0ca56e51ab7ad2abdadbfb05d93 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 27 Nov 2019 13:19:58 +0100 Subject: [PATCH 171/233] proper capitalization --- python/tests/conftest.py | 4 ++-- python/tests/test_DADF5.py | 2 +- python/tests/test_Geom.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 6145c66d5..a0504c499 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -11,11 +11,11 @@ def pytest_addoption(parser): @pytest.fixture def update(request): - """store current results as new reference results.""" + """Store current results as new reference results.""" return request.config.getoption("--update") @pytest.fixture def reference_dir_base(): - """directory containing reference results.""" + """Directory containing reference results.""" env = damask.Environment() return os.path.join(env.rootDir(),'python','tests','reference') diff --git a/python/tests/test_DADF5.py b/python/tests/test_DADF5.py index 5e86272bd..5a6478f03 100644 --- a/python/tests/test_DADF5.py +++ b/python/tests/test_DADF5.py @@ -18,7 +18,7 @@ def default(tmp_path,reference_dir): @pytest.fixture def reference_dir(reference_dir_base): - """directory containing reference results.""" + """Directory containing reference results.""" return os.path.join(reference_dir_base,'DADF5') diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py index 69492136d..bc3a3e751 100644 --- a/python/tests/test_Geom.py +++ b/python/tests/test_Geom.py @@ -23,7 +23,7 @@ def default(): @pytest.fixture def reference_dir(reference_dir_base): - """directory containing reference results.""" + """Directory containing reference results.""" return os.path.join(reference_dir_base,'Geom') From ca92400c2f55627349c1f23eb9e52b759e7ce038 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 28 Nov 2019 05:52:23 +0100 Subject: [PATCH 172/233] polishing columns is the term used py pandas --- python/damask/table.py | 84 +++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 22 deletions(-) diff --git a/python/damask/table.py b/python/damask/table.py index 0c9f3ac40..2eacef58e 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -6,7 +6,7 @@ import numpy as np class Table(): """Store spreadsheet-like data.""" - def __init__(self,array,headings,comments=None): + def __init__(self,array,columns,comments=None): """ New spreadsheet data. @@ -14,8 +14,8 @@ class Table(): ---------- array : numpy.ndarray Data. - headings : dict - Column headings. Labels as keys and shape as tuple. Example 'F':(3,3) for a deformation gradient. + columns : dict + Column labels and shape. Example 'F':(3,3) for a deformation gradient. comments : iterable of str, optional Additional, human-readable information @@ -24,8 +24,8 @@ class Table(): d = {} i = 0 - for label in headings: - for components in range(np.prod(headings[label])): + for label in columns: + for components in range(np.prod(columns[label])): d[i] = label i+=1 @@ -36,7 +36,7 @@ class Table(): else: self.comments = [c for c in comments] - self.headings = headings + self.columns = columns @staticmethod def from_ASCII(fname): @@ -46,6 +46,12 @@ class Table(): The first line needs to indicate the number of subsequent header lines as 'n header'. Vector data labels are indicated by '1_x, 2_x, ..., n_x'. Tensor data labels are indicated by '3x3:1_x, 3x3:2_x, ..., 3x3:9_x'. + + Parameters + ---------- + fname : file, str, or pathlib.Path + Filename or file for reading. + """ try: f = open(fname) @@ -60,20 +66,20 @@ class Table(): comments = [f.readline()[:-1] for i in range(header-1)] labels = f.readline().split() - headings = {} + columns = {} for label in labels: tensor_column = re.search(r'[0-9,x]*?:[0-9]*?_',label) if tensor_column: my_shape = tensor_column.group().split(':',1)[0].split('x') - headings[label.split('_',1)[1]] = tuple([int(d) for d in my_shape]) + columns[label.split('_',1)[1]] = tuple([int(d) for d in my_shape]) else: vector_column = re.match(r'[0-9]*?_',label) if vector_column: - headings[label.split('_',1)[1]] = (int(label.split('_',1)[0]),) + columns[label.split('_',1)[1]] = (int(label.split('_',1)[0]),) else: - headings[label]=(1,) + columns[label]=(1,) - return Table(np.loadtxt(f),headings,comments) + return Table(np.loadtxt(f),columns,comments) def get_array(self,label): """Return data as array.""" @@ -81,10 +87,22 @@ class Table(): idx,key = label.split('_',1) return self.data[key].to_numpy()[:,int(idx)-1] else: - return self.data[label].to_numpy().reshape((-1,)+self.headings[label]) + return self.data[label].to_numpy().reshape((-1,)+self.columns[label]) def set_array(self,label,array,info): - """Set data.""" + """ + Modify data in the spreadsheet. + + Parameters + ---------- + label : str + Label for the new data + array : np.ndarray + New data + info : str + Human-readable information about the new data + + """ if np.prod(array.shape[1:],dtype=int) == 1: self.comments.append('{}: {}'.format(label,info)) else: @@ -97,34 +115,56 @@ class Table(): else: self.data[label] = array.reshape(self.data[label].shape) - def get_labels(self): """Return the labels of all columns.""" - return [label for label in self.headings] + return [label for label in self.columns] def add_array(self,label,array,info): + """ + Add data to the spreadsheet. + + Parameters + ---------- + label : str + Label for the new data + array : np.ndarray + New data + info : str + Human-readable information about the new data + + """ if np.prod(array.shape[1:],dtype=int) == 1: self.comments.append('{}: {}'.format(label,info)) else: self.comments.append('{} {}: {}'.format(label,array.shape[1:],info)) - self.headings[label] = array.shape[1:] if len(array.shape) > 1 else (1,) + self.columns[label] = array.shape[1:] if len(array.shape) > 1 else (1,) size = np.prod(array.shape[1:],dtype=int) new_data = pd.DataFrame(data=array.reshape(-1,size), columns=[label for l in range(size)]) self.data = pd.concat([self.data,new_data],axis=1) def to_ASCII(self,fname): + """ + Store as plain text file. + + Parameters + ---------- + fname : file, str, or pathlib.Path + Filename or file for reading. + + """ + labels = [] - for l in self.headings: - if(self.headings[l] == (1,)): + for l in self.columns: + if(self.columns[l] == (1,)): labels.append('{}'.format(l)) - elif(len(self.headings[l]) == 1): + elif(len(self.columns[l]) == 1): labels+=['{}_{}'.format(i+1,l)\ - for i in range(self.headings[l][0])] + for i in range(self.columns[l][0])] else: - labels+=['{}:{}_{}'.format(i+1,'x'.join([str(d) for d in self.headings[l]]),l)\ - for i in range(np.prod(self.headings[l],dtype=int))] + labels+=['{}:{}_{}'.format(i+1,'x'.join([str(d) for d in self.columns[l]]),l)\ + for i in range(np.prod(self.columns[l],dtype=int))] header = ['{} header'.format(len(self.comments)+1)]\ + self.comments\ From 76a15068931a225a92e53ebe52bff2f33c157a5f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 28 Nov 2019 20:18:54 +0100 Subject: [PATCH 173/233] small improvements bugfix: writing correct labels (now consistent with readin) error handling for inconsistent initialization --- python/damask/table.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/python/damask/table.py b/python/damask/table.py index 0c9f3ac40..04a073cce 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -13,7 +13,7 @@ class Table(): Parameters ---------- array : numpy.ndarray - Data. + Data as two dimensional array headings : dict Column headings. Labels as keys and shape as tuple. Example 'F':(3,3) for a deformation gradient. comments : iterable of str, optional @@ -29,6 +29,9 @@ class Table(): d[i] = label i+=1 + if i != self.data.shape[1]: + raise IndexError('Mismatch between array shape and headings') + self.data.rename(columns=d,inplace=True) if comments is None: @@ -123,7 +126,7 @@ class Table(): labels+=['{}_{}'.format(i+1,l)\ for i in range(self.headings[l][0])] else: - labels+=['{}:{}_{}'.format(i+1,'x'.join([str(d) for d in self.headings[l]]),l)\ + labels+=['{}:{}_{}'.format('x'.join([str(d) for d in self.headings[l]]),i+1,l)\ for i in range(np.prod(self.headings[l],dtype=int))] header = ['{} header'.format(len(self.comments)+1)]\ From 9b4252da68628d6f3bf5644882cdee51bf35087c Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 29 Nov 2019 16:53:40 +0100 Subject: [PATCH 174/233] smart handling of leading zeros --- processing/post/DADF5_postResults.py | 5 ++++- processing/post/DADF5_vtk_cells.py | 6 ++++-- processing/post/DADF5_vtk_points.py | 5 ++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/processing/post/DADF5_postResults.py b/processing/post/DADF5_postResults.py index a16ef147c..ab68fc76b 100755 --- a/processing/post/DADF5_postResults.py +++ b/processing/post/DADF5_postResults.py @@ -47,6 +47,8 @@ for filename in options.filenames: coords = np.concatenate((z[:,:,:,None],y[:,:,:,None],x[:,:,:,None]),axis = 3) + N_digits = int(np.floor(np.log10(int(results.increments[-1][3:]))))+1 + N_digits = 5 # hack to keep test intact for i,inc in enumerate(results.iter_visible('increments')): print('Output step {}/{}'.format(i+1,len(results.increments))) @@ -92,5 +94,6 @@ for filename in options.filenames: dirname = os.path.abspath(os.path.join(os.path.dirname(filename),options.dir)) if not os.path.isdir(dirname): os.mkdir(dirname,0o755) - file_out = '{}_{}.txt'.format(os.path.splitext(os.path.split(filename)[-1])[0],inc) + file_out = '{}_{}.txt'.format(os.path.splitext(os.path.split(filename)[-1])[0], + inc[3:].zfill(N_digits)) np.savetxt(os.path.join(dirname,file_out),data,header=header,comments='') diff --git a/processing/post/DADF5_vtk_cells.py b/processing/post/DADF5_vtk_cells.py index 1f5cc6686..58cb9771f 100755 --- a/processing/post/DADF5_vtk_cells.py +++ b/processing/post/DADF5_vtk_cells.py @@ -66,7 +66,7 @@ for filename in options.filenames: for i in f['/geometry/T_c']: grid.InsertNextCell(vtk.VTK_HEXAHEDRON,8,i-1) - + N_digits = int(np.floor(np.log10(int(results.increments[-1][3:]))))+1 for i,inc in enumerate(results.iter_visible('increments')): print('Output step {}/{}'.format(i+1,len(results.increments))) vtk_data = [] @@ -133,7 +133,9 @@ for filename in options.filenames: dirname = os.path.abspath(os.path.join(os.path.dirname(filename),options.dir)) if not os.path.isdir(dirname): os.mkdir(dirname,0o755) - file_out = '{}_{}.{}'.format(os.path.splitext(os.path.split(filename)[-1])[0],inc,writer.GetDefaultFileExtension()) + file_out = '{}_inc{}.{}'.format(os.path.splitext(os.path.split(filename)[-1])[0], + inc[3:].zfill(N_digits), + writer.GetDefaultFileExtension()) writer.SetCompressorTypeToZLib() writer.SetDataModeToBinary() diff --git a/processing/post/DADF5_vtk_points.py b/processing/post/DADF5_vtk_points.py index 87c1ad93e..9265cc3a0 100755 --- a/processing/post/DADF5_vtk_points.py +++ b/processing/post/DADF5_vtk_points.py @@ -52,6 +52,7 @@ for filename in options.filenames: Polydata.SetVerts(Vertices) Polydata.Modified() + N_digits = int(np.floor(np.log10(int(results.increments[-1][3:]))))+1 for i,inc in enumerate(results.iter_visible('increments')): print('Output step {}/{}'.format(i+1,len(results.increments))) vtk_data = [] @@ -111,7 +112,9 @@ for filename in options.filenames: dirname = os.path.abspath(os.path.join(os.path.dirname(filename),options.dir)) if not os.path.isdir(dirname): os.mkdir(dirname,0o755) - file_out = '{}_{}.{}'.format(os.path.splitext(os.path.split(filename)[-1])[0],inc,writer.GetDefaultFileExtension()) + file_out = '{}_inc{}.{}'.format(os.path.splitext(os.path.split(filename)[-1])[0], + inc[3:].zfill(N_digits), + writer.GetDefaultFileExtension()) writer.SetCompressorTypeToZLib() writer.SetDataModeToBinary() From dc3fc8f70cbd0fdb24af2d57d9bae294edba7366 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 29 Nov 2019 17:00:48 +0100 Subject: [PATCH 175/233] do not clutter with leading zeros --- python/damask/dadf5.py | 7 ++++--- src/results.f90 | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index d879946eb..ee497a9ae 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -30,7 +30,7 @@ class DADF5(): """ with h5py.File(filename,'r') as f: - if f.attrs['DADF5-major'] != 0 or not 2 <= f.attrs['DADF5-minor'] <= 3: + if f.attrs['DADF5-major'] != 0 or not 2 <= f.attrs['DADF5-minor'] <= 4: raise TypeError('Unsupported DADF5 version {} '.format(f.attrs['DADF5-version'])) self.structured = 'grid' in f['geometry'].attrs.keys() @@ -40,8 +40,9 @@ class DADF5(): self.size = f['geometry'].attrs['size'] r=re.compile('inc[0-9]+') - self.increments = [i for i in f.keys() if r.match(i)] - self.times = [round(f[i].attrs['time/s'],12) for i in self.increments] + increments_unsorted = {int(i[3:]):i for i in f.keys() if r.match(i)} + self.increments = [increments_unsorted[i] for i in sorted(increments_unsorted)] + self.times = [round(f[i].attrs['time/s'],12) for i in self.increments] self.Nmaterialpoints, self.Nconstituents = np.shape(f['mapping/cellResults/constituent']) self.materialpoints = [m.decode() for m in np.unique(f['mapping/cellResults/materialpoint']['Name'])] diff --git a/src/results.f90 b/src/results.f90 index 471f994d6..e77600d82 100644 --- a/src/results.f90 +++ b/src/results.f90 @@ -68,9 +68,9 @@ subroutine results_init write(6,'(a)') ' https://doi.org/10.1007/s40192-017-0084-5' resultsFile = HDF5_openFile(trim(getSolverJobName())//'.hdf5','w',.true.) - call HDF5_addAttribute(resultsFile,'DADF5-version',0.3_pReal) + call HDF5_addAttribute(resultsFile,'DADF5-version',0.4_pReal) call HDF5_addAttribute(resultsFile,'DADF5-major',0) - call HDF5_addAttribute(resultsFile,'DADF5-minor',3) + call HDF5_addAttribute(resultsFile,'DADF5-minor',4) call HDF5_addAttribute(resultsFile,'DAMASK',DAMASKVERSION) call get_command(commandLine) call HDF5_addAttribute(resultsFile,'call',trim(commandLine)) @@ -110,7 +110,7 @@ subroutine results_addIncrement(inc,time) real(pReal), intent(in) :: time character(len=pStringLen) :: incChar - write(incChar,'(i5.5)') inc ! allow up to 99999 increments + write(incChar,'(i10)') inc call HDF5_closeGroup(results_addGroup(trim('inc'//trim(adjustl(incChar))))) call results_setLink(trim('inc'//trim(adjustl(incChar))),'current') call HDF5_addAttribute(resultsFile,'time/s',time,trim('inc'//trim(adjustl(incChar)))) From a4fdad78a4ae0548ad83e2e72efcf9fa7b909d65 Mon Sep 17 00:00:00 2001 From: Test User Date: Fri, 29 Nov 2019 19:04:38 +0100 Subject: [PATCH 176/233] [skip ci] updated version information after successful test of v2.0.3-1111-g374980da --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 1a1650364..6464fe0a4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-1097-ga7fca4df +v2.0.3-1111-g374980da From e2b13a5ca3bb10042edc591edf994ecd3bae80d8 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 29 Nov 2019 19:32:18 +0100 Subject: [PATCH 177/233] using de-facto standard naming --- processing/post/DADF5_postResults.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/processing/post/DADF5_postResults.py b/processing/post/DADF5_postResults.py index ab68fc76b..1d05289cb 100755 --- a/processing/post/DADF5_postResults.py +++ b/processing/post/DADF5_postResults.py @@ -94,6 +94,6 @@ for filename in options.filenames: dirname = os.path.abspath(os.path.join(os.path.dirname(filename),options.dir)) if not os.path.isdir(dirname): os.mkdir(dirname,0o755) - file_out = '{}_{}.txt'.format(os.path.splitext(os.path.split(filename)[-1])[0], - inc[3:].zfill(N_digits)) + file_out = '{}_inc{}.txt'.format(os.path.splitext(os.path.split(filename)[-1])[0], + inc[3:].zfill(N_digits)) np.savetxt(os.path.join(dirname,file_out),data,header=header,comments='') From 4185fcb4c3f3c8505dfae9ca2d0386668337a195 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 29 Nov 2019 21:40:54 +0100 Subject: [PATCH 178/233] adjust to new naming --- python/damask/dadf5.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index ee497a9ae..77ac5458b 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -166,7 +166,7 @@ class DADF5(): end increment (included) """ - self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','set') + self.__manage_visible(['inc{}'.format(i) for i in range(start,end+1)],'increments','set') def add_by_increment(self,start,end): @@ -181,7 +181,7 @@ class DADF5(): end increment (included) """ - self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','add') + self.__manage_visible(['inc{}'.format(i) for i in range(start,end+1)],'increments','add') def del_by_increment(self,start,end): @@ -196,7 +196,7 @@ class DADF5(): end increment (included) """ - self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','del') + self.__manage_visible(['inc{}'.format(i) for i in range(start,end+1)],'increments','del') def iter_visible(self,what): From 354c0123a1bb84f40443b03992c569e71201ead1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 30 Nov 2019 08:40:59 +0100 Subject: [PATCH 179/233] backward compatibility --- python/damask/dadf5.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 77ac5458b..7dddabfd4 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -30,7 +30,9 @@ class DADF5(): """ with h5py.File(filename,'r') as f: - if f.attrs['DADF5-major'] != 0 or not 2 <= f.attrs['DADF5-minor'] <= 4: + self.DADF5-major = f.attrs['DADF5-major'] + self.DADF5-minor = f.attrs['DADF5-minor'] + if self.DADF5-major != 0 or not 2 <= self.DADF5-minor <= 4: raise TypeError('Unsupported DADF5 version {} '.format(f.attrs['DADF5-version'])) self.structured = 'grid' in f['geometry'].attrs.keys() @@ -166,7 +168,10 @@ class DADF5(): end increment (included) """ - self.__manage_visible(['inc{}'.format(i) for i in range(start,end+1)],'increments','set') + if self.DADF5-minor >= 4: + self.__manage_visible([ 'inc{}'.format(i) for i in range(start,end+1)],'increments','set') + else: + self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','set') def add_by_increment(self,start,end): @@ -181,7 +186,10 @@ class DADF5(): end increment (included) """ - self.__manage_visible(['inc{}'.format(i) for i in range(start,end+1)],'increments','add') + if self.DADF5-minor >= 4: + self.__manage_visible([ 'inc{}'.format(i) for i in range(start,end+1)],'increments','add') + else: + self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','add') def del_by_increment(self,start,end): @@ -196,7 +204,10 @@ class DADF5(): end increment (included) """ - self.__manage_visible(['inc{}'.format(i) for i in range(start,end+1)],'increments','del') + if self.DADF5-minor >= 4: + self.__manage_visible([ 'inc{}'.format(i) for i in range(start,end+1)],'increments','del') + else: + self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','del') def iter_visible(self,what): From 8f77843b0f207ecf731d0f79e730cb4573c4ec99 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 30 Nov 2019 09:01:37 +0100 Subject: [PATCH 180/233] improved naming - clearer variable names - no '-' in attributes - single source of truth --- python/damask/dadf5.py | 17 +++++++++++------ src/results.f90 | 7 +++---- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 7dddabfd4..d03617752 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -30,9 +30,14 @@ class DADF5(): """ with h5py.File(filename,'r') as f: - self.DADF5-major = f.attrs['DADF5-major'] - self.DADF5-minor = f.attrs['DADF5-minor'] - if self.DADF5-major != 0 or not 2 <= self.DADF5-minor <= 4: + try: + self.version_major = f.attrs['DADF5_version_major'] + self.version_minor = f.attrs['DADF5_version_minor'] + except KeyError: + self.version_major = f.attrs['DADF5-major'] + self.version_minor = f.attrs['DADF5-minor'] + + if self.version_major != 0 or not 2 <= self.version_minor <= 4: raise TypeError('Unsupported DADF5 version {} '.format(f.attrs['DADF5-version'])) self.structured = 'grid' in f['geometry'].attrs.keys() @@ -168,7 +173,7 @@ class DADF5(): end increment (included) """ - if self.DADF5-minor >= 4: + if self.version_minor >= 4: self.__manage_visible([ 'inc{}'.format(i) for i in range(start,end+1)],'increments','set') else: self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','set') @@ -186,7 +191,7 @@ class DADF5(): end increment (included) """ - if self.DADF5-minor >= 4: + if self.version_minor >= 4: self.__manage_visible([ 'inc{}'.format(i) for i in range(start,end+1)],'increments','add') else: self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','add') @@ -204,7 +209,7 @@ class DADF5(): end increment (included) """ - if self.DADF5-minor >= 4: + if self.version_minor >= 4: self.__manage_visible([ 'inc{}'.format(i) for i in range(start,end+1)],'increments','del') else: self.__manage_visible(['inc{:05d}'.format(i) for i in range(start,end+1)],'increments','del') diff --git a/src/results.f90 b/src/results.f90 index e77600d82..a6b01790d 100644 --- a/src/results.f90 +++ b/src/results.f90 @@ -68,10 +68,9 @@ subroutine results_init write(6,'(a)') ' https://doi.org/10.1007/s40192-017-0084-5' resultsFile = HDF5_openFile(trim(getSolverJobName())//'.hdf5','w',.true.) - call HDF5_addAttribute(resultsFile,'DADF5-version',0.4_pReal) - call HDF5_addAttribute(resultsFile,'DADF5-major',0) - call HDF5_addAttribute(resultsFile,'DADF5-minor',4) - call HDF5_addAttribute(resultsFile,'DAMASK',DAMASKVERSION) + call HDF5_addAttribute(resultsFile,'DADF5_version_major',0) + call HDF5_addAttribute(resultsFile,'DADF5_version_minor',4) + call HDF5_addAttribute(resultsFile,'DAMASK_version',DAMASKVERSION) call get_command(commandLine) call HDF5_addAttribute(resultsFile,'call',trim(commandLine)) call HDF5_closeGroup(results_addGroup('mapping')) From 5a792ad09d7380a910fec286c8be17abacb99c54 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 30 Nov 2019 14:30:13 +0100 Subject: [PATCH 181/233] updated tests --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 66d562c75..633a2d1ba 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 66d562c755cd9aa4bbb8280c509383014acd52db +Subproject commit 633a2d1ba8c1f96c0362a35af407304228934b0d From d93fb12e8c7e636ba10b47f8d69494fe68f1eef6 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 30 Nov 2019 14:36:54 +0100 Subject: [PATCH 182/233] remove extra output current implementation was not very general, no separation of different dislocation types. if output is needed, re-implemenation is straight forward --- src/plastic_nonlocal.f90 | 110 --------------------------------------- 1 file changed, 110 deletions(-) diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index 155818810..e963ffe3c 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -86,17 +86,6 @@ module plastic_nonlocal rho_dot_sgl_ID, & rho_dot_sgl_mobile_ID, & rho_dot_dip_ID, & - rho_dot_gen_edge_ID, & - rho_dot_gen_screw_ID, & - rho_dot_sgl2dip_edge_ID, & - rho_dot_sgl2dip_screw_ID, & - rho_dot_ann_ath_ID, & - rho_dot_ann_the_edge_ID, & - rho_dot_ann_the_screw_ID, & - rho_dot_edgejogs_ID, & - rho_dot_flux_mobile_ID, & - rho_dot_flux_edge_ID, & - rho_dot_flux_screw_ID, & velocity_edge_pos_ID, & velocity_edge_neg_ID, & velocity_screw_pos_ID, & @@ -181,18 +170,6 @@ module plastic_nonlocal tau_Back end type tNonlocalMicrostructure - type, private :: tOutput !< container type for storage of output results - real(pReal), dimension(:,:), allocatable, private :: & - rhoDotEdgeJogs - real(pReal), dimension(:,:,:), allocatable, private :: & - rhoDotFlux, & - rhoDotMultiplication, & - rhoDotSingle2DipoleGlide, & - rhoDotAthermalAnnihilation, & - rhoDotThermalAnnihilation - end type tOutput - - type, private :: tNonlocalState real(pReal), pointer, dimension(:,:) :: & rho, & ! < all dislocations @@ -222,7 +199,6 @@ module plastic_nonlocal type(tParameters), dimension(:), allocatable, private :: param !< containers of constitutive parameters (len Ninstance) - type(tOutput), dimension(:), allocatable, private :: results type(tNonlocalMicrostructure), dimension(:), allocatable, private :: microstructure integer(kind(undefined_ID)), dimension(:,:), allocatable, private :: & @@ -288,7 +264,6 @@ subroutine plastic_nonlocal_init allocate(dotState(maxNinstances)) allocate(deltaState(maxNinstances)) allocate(microstructure(maxNinstances)) - allocate(results(maxNinstances)) allocate(plastic_nonlocal_sizePostResult(maxval(phase_Noutput), maxNinstances), source=0) allocate(plastic_nonlocal_output(maxval(phase_Noutput), maxNinstances)) @@ -304,7 +279,6 @@ subroutine plastic_nonlocal_init dot => dotState(phase_plasticityInstance(p)), & stt => state(phase_plasticityInstance(p)), & del => deltaState(phase_plasticityInstance(p)), & - res => results(phase_plasticityInstance(p)), & dst => microstructure(phase_plasticityInstance(p)), & config => config_phase(p)) @@ -507,28 +481,6 @@ subroutine plastic_nonlocal_init outputID = merge(rho_dot_sgl_mobile_ID,undefined_ID,prm%totalNslip>0) case ('rho_dot_dip') outputID = merge(rho_dot_dip_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dot_gen_edge') - outputID = merge(rho_dot_gen_edge_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dot_gen_screw') - outputID = merge(rho_dot_gen_screw_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dot_sgl2dip_edge') - outputID = merge(rho_dot_sgl2dip_edge_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dot_sgl2dip_screw') - outputID = merge(rho_dot_sgl2dip_screw_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dot_ann_ath') - outputID = merge(rho_dot_ann_ath_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dot_ann_the_edge') - outputID = merge(rho_dot_ann_the_edge_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dot_ann_the_screw') - outputID = merge(rho_dot_ann_the_screw_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dot_edgejogs') - outputID = merge(rho_dot_edgejogs_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dot_flux_mobile') - outputID = merge(rho_dot_flux_mobile_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dot_flux_edge') - outputID = merge(rho_dot_flux_edge_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dot_flux_screw') - outputID = merge(rho_dot_flux_screw_ID,undefined_ID,prm%totalNslip>0) case ('velocity_edge_pos') outputID = merge(velocity_edge_pos_ID,undefined_ID,prm%totalNslip>0) case ('velocity_edge_neg') @@ -646,13 +598,6 @@ subroutine plastic_nonlocal_init allocate(dst%tau_Threshold(prm%totalNslip,NofMyPhase),source=0.0_pReal) allocate(dst%tau_Back(prm%totalNslip,NofMyPhase),source=0.0_pReal) - - allocate(res%rhoDotFlux(prm%totalNslip,8,NofMyPhase),source=0.0_pReal) - allocate(res%rhoDotMultiplication(prm%totalNslip,2,NofMyPhase),source=0.0_pReal) - allocate(res%rhoDotSingle2DipoleGlide(prm%totalNslip,2,NofMyPhase),source=0.0_pReal) - allocate(res%rhoDotAthermalAnnihilation(prm%totalNslip,2,NofMyPhase),source=0.0_pReal) - allocate(res%rhoDotThermalAnnihilation(prm%totalNslip,2,NofMyPhase),source=0.0_pReal) - allocate(res%rhoDotEdgeJogs(prm%totalNslip,NofMyPhase),source=0.0_pReal) end associate @@ -1817,14 +1762,6 @@ subroutine plastic_nonlocal_dotState(Mp, Fe, Fp, Temperature, & + rhoDotSingle2DipoleGlide & + rhoDotAthermalAnnihilation & + rhoDotThermalAnnihilation - - results(instance)%rhoDotFlux(1:ns,1:8,o) = rhoDotFlux(1:ns,1:8) - results(instance)%rhoDotMultiplication(1:ns,1:2,o) = rhoDotMultiplication(1:ns,[1,3]) - results(instance)%rhoDotSingle2DipoleGlide(1:ns,1:2,o) = rhoDotSingle2DipoleGlide(1:ns,9:10) - results(instance)%rhoDotAthermalAnnihilation(1:ns,1:2,o) = rhoDotAthermalAnnihilation(1:ns,9:10) - results(instance)%rhoDotThermalAnnihilation(1:ns,1:2,o) = rhoDotThermalAnnihilation(1:ns,9:10) - results(instance)%rhoDotEdgeJogs(1:ns,o) = 2.0_pReal * rhoDotThermalAnnihilation(1:ns,1) - #ifdef DEBUG if (iand(debug_level(debug_constitutive),debug_levelExtensive) /= 0 & @@ -2128,53 +2065,6 @@ outputsLoop: do o = 1,size(param(instance)%outputID) postResults(cs+1:cs+ns) = sum(rhoDotDip,2) cs = cs + ns - case (rho_dot_gen_edge_ID) - postResults(cs+1:cs+ns) = results(instance)%rhoDotMultiplication(1:ns,1,of) - cs = cs + ns - - case (rho_dot_gen_screw_ID) - postResults(cs+1:cs+ns) = results(instance)%rhoDotMultiplication(1:ns,2,of) - cs = cs + ns - - case (rho_dot_sgl2dip_edge_ID) - postResults(cs+1:cs+ns) = results(instance)%rhoDotSingle2DipoleGlide(1:ns,1,of) - cs = cs + ns - - case (rho_dot_sgl2dip_screw_ID) - postResults(cs+1:cs+ns) = results(instance)%rhoDotSingle2DipoleGlide(1:ns,2,of) - cs = cs + ns - - case (rho_dot_ann_ath_ID) - postResults(cs+1:cs+ns) = results(instance)%rhoDotAthermalAnnihilation(1:ns,1,of) & - + results(instance)%rhoDotAthermalAnnihilation(1:ns,2,of) - cs = cs + ns - - case (rho_dot_ann_the_edge_ID) - postResults(cs+1:cs+ns) = results(instance)%rhoDotThermalAnnihilation(1:ns,1,of) - cs = cs + ns - - case (rho_dot_ann_the_screw_ID) - postResults(cs+1:cs+ns) = results(instance)%rhoDotThermalAnnihilation(1:ns,2,of) - cs = cs + ns - - case (rho_dot_edgejogs_ID) - postResults(cs+1:cs+ns) = results(instance)%rhoDotEdgeJogs(1:ns,of) - cs = cs + ns - - case (rho_dot_flux_mobile_ID) - postResults(cs+1:cs+ns) = sum(results(instance)%rhoDotFlux(1:ns,1:4,of),2) - cs = cs + ns - - case (rho_dot_flux_edge_ID) - postResults(cs+1:cs+ns) = sum(results(instance)%rhoDotFlux(1:ns,1:2,of),2) & - + sum(results(instance)%rhoDotFlux(1:ns,5:6,of)*sign(1.0_pReal,rhoSgl(1:ns,5:6)),2) - cs = cs + ns - - case (rho_dot_flux_screw_ID) - postResults(cs+1:cs+ns) = sum(results(instance)%rhoDotFlux(1:ns,3:4,of),2) & - + sum(results(instance)%rhoDotFlux(1:ns,7:8,of)*sign(1.0_pReal,rhoSgl(1:ns,7:8)),2) - cs = cs + ns - case (velocity_edge_pos_ID) postResults(cs+1:cs+ns) = v(1:ns,1) cs = cs + ns From c7d675a1e9345dc6a9243ff7b1f9b2f695726fdb Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 30 Nov 2019 16:03:18 +0100 Subject: [PATCH 183/233] not needed anymore --- src/crystallite.f90 | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/src/crystallite.f90 b/src/crystallite.f90 index 672bd2112..a17213f9e 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -76,17 +76,6 @@ module crystallite crystallite_todo, & !< flag to indicate need for further computation crystallite_localPlasticity !< indicates this grain to have purely local constitutive law - enum, bind(c) - enumerator :: undefined_ID, & - orientation_ID, & - defgrad_ID, & - fp_ID, & - p_ID, & - elasmatrix_ID - end enum - integer(kind(undefined_ID)),dimension(:,:), allocatable :: & - crystallite_outputID !< ID of each post result output - type :: tOutput !< new requested output (per phase) character(len=65536), allocatable, dimension(:) :: & label @@ -136,15 +125,10 @@ subroutine crystallite_init c, & !< counter in integration point component loop i, & !< counter in integration point loop e, & !< counter in element loop - o = 0, & !< counter in output loop - r, & cMax, & !< maximum number of integration point components iMax, & !< maximum number of integration points eMax, & !< maximum number of elements - myNcomponents, & !< number of components at current IP - mySize - - character(len=65536), dimension(:), allocatable :: str + myNcomponents !< number of components at current IP write(6,'(/,a)') ' <<<+- crystallite init -+>>>' @@ -763,10 +747,7 @@ function crystallite_postResults(ipc, ip, el) sum(sourceState(material_phaseAt(ipc,el))%p(:)%sizePostResults)) :: & crystallite_postResults integer :: & - o, & - c, & - mySize, & - n + c crystallite_postResults = 0.0_pReal From 07fb915a7e55125059f4f8f4ffa1b5837d0bba5c Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 1 Dec 2019 08:27:56 +0100 Subject: [PATCH 184/233] postResults not needed anymore --- src/CPFEM.f90 | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/CPFEM.f90 b/src/CPFEM.f90 index e549df30d..9bf8c547c 100644 --- a/src/CPFEM.f90 +++ b/src/CPFEM.f90 @@ -275,7 +275,6 @@ subroutine CPFEM_general(mode, parallelExecution, ffn, ffn1, temperature_inp, dt if (iand(debug_level(debug_CPFEM), debug_levelExtensive) /= 0_pInt) & write(6,'(a,i8,1x,i2)') '<< CPFEM >> calculation for elFE ip ',elFE,ip call materialpoint_stressAndItsTangent(updateJaco, dt) ! calculate stress and its tangent - call materialpoint_postResults() !* parallel computation and calulation not yet done @@ -284,7 +283,6 @@ subroutine CPFEM_general(mode, parallelExecution, ffn, ffn1, temperature_inp, dt write(6,'(a,i8,a,i8)') '<< CPFEM >> calculation for elements ',FEsolving_execElem(1),& ' to ',FEsolving_execElem(2) call materialpoint_stressAndItsTangent(updateJaco, dt) ! calculate stress and its tangent (parallel execution inside) - call materialpoint_postResults() CPFEM_calc_done = .true. endif From df4b642400470b5d81b2be36f203481b8bad6c44 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 1 Dec 2019 08:33:04 +0100 Subject: [PATCH 185/233] polishing --- src/plastic_nonlocal.f90 | 61 ++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index e963ffe3c..82a2ad122 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -546,60 +546,59 @@ subroutine plastic_nonlocal_init dot%rho_sgl_mob_edg_neg => plasticState(p)%dotState (1*prm%totalNslip+1: 2*prm%totalNslip,:) del%rho_sgl_mob_edg_neg => plasticState(p)%deltaState (1*prm%totalNslip+1: 2*prm%totalNslip,:) - stt%rho_sgl_mob_scr_pos => plasticState(p)%state (2*prm%totalNslip+1: 3*prm%totalNslip,:) - dot%rho_sgl_mob_scr_pos => plasticState(p)%dotState (2*prm%totalNslip+1: 3*prm%totalNslip,:) - del%rho_sgl_mob_scr_pos => plasticState(p)%deltaState (2*prm%totalNslip+1: 3*prm%totalNslip,:) + stt%rho_sgl_mob_scr_pos => plasticState(p)%state (2*prm%totalNslip+1: 3*prm%totalNslip,:) + dot%rho_sgl_mob_scr_pos => plasticState(p)%dotState (2*prm%totalNslip+1: 3*prm%totalNslip,:) + del%rho_sgl_mob_scr_pos => plasticState(p)%deltaState (2*prm%totalNslip+1: 3*prm%totalNslip,:) - stt%rho_sgl_mob_scr_neg => plasticState(p)%state (3*prm%totalNslip+1: 4*prm%totalNslip,:) - dot%rho_sgl_mob_scr_neg => plasticState(p)%dotState (3*prm%totalNslip+1: 4*prm%totalNslip,:) - del%rho_sgl_mob_scr_neg => plasticState(p)%deltaState (3*prm%totalNslip+1: 4*prm%totalNslip,:) + stt%rho_sgl_mob_scr_neg => plasticState(p)%state (3*prm%totalNslip+1: 4*prm%totalNslip,:) + dot%rho_sgl_mob_scr_neg => plasticState(p)%dotState (3*prm%totalNslip+1: 4*prm%totalNslip,:) + del%rho_sgl_mob_scr_neg => plasticState(p)%deltaState (3*prm%totalNslip+1: 4*prm%totalNslip,:) stt%rhoSglImmobile => plasticState(p)%state (4*prm%totalNslip+1: 8*prm%totalNslip,:) dot%rhoSglImmobile => plasticState(p)%dotState (4*prm%totalNslip+1: 8*prm%totalNslip,:) - del%rhoSglImmobile => plasticState(p)%deltaState (4*prm%totalNslip+1: 8*prm%totalNslip,:) + del%rhoSglImmobile => plasticState(p)%deltaState (4*prm%totalNslip+1: 8*prm%totalNslip,:) - stt%rho_sgl_imm_edg_pos => plasticState(p)%state (4*prm%totalNslip+1: 5*prm%totalNslip,:) - dot%rho_sgl_imm_edg_pos => plasticState(p)%dotState (4*prm%totalNslip+1: 5*prm%totalNslip,:) + stt%rho_sgl_imm_edg_pos => plasticState(p)%state (4*prm%totalNslip+1: 5*prm%totalNslip,:) + dot%rho_sgl_imm_edg_pos => plasticState(p)%dotState (4*prm%totalNslip+1: 5*prm%totalNslip,:) del%rho_sgl_imm_edg_pos => plasticState(p)%deltaState (4*prm%totalNslip+1: 5*prm%totalNslip,:) - stt%rho_sgl_imm_edg_neg => plasticState(p)%state (5*prm%totalNslip+1: 6*prm%totalNslip,:) - dot%rho_sgl_imm_edg_neg => plasticState(p)%dotState (5*prm%totalNslip+1: 6*prm%totalNslip,:) + stt%rho_sgl_imm_edg_neg => plasticState(p)%state (5*prm%totalNslip+1: 6*prm%totalNslip,:) + dot%rho_sgl_imm_edg_neg => plasticState(p)%dotState (5*prm%totalNslip+1: 6*prm%totalNslip,:) del%rho_sgl_imm_edg_neg => plasticState(p)%deltaState (5*prm%totalNslip+1: 6*prm%totalNslip,:) - stt%rho_sgl_imm_scr_pos => plasticState(p)%state (6*prm%totalNslip+1: 7*prm%totalNslip,:) - dot%rho_sgl_imm_scr_pos => plasticState(p)%dotState(6*prm%totalNslip+1: 7*prm%totalNslip,:) - del%rho_sgl_imm_scr_pos => plasticState(p)%deltaState(6*prm%totalNslip+1: 7*prm%totalNslip,:) + stt%rho_sgl_imm_scr_pos => plasticState(p)%state (6*prm%totalNslip+1: 7*prm%totalNslip,:) + dot%rho_sgl_imm_scr_pos => plasticState(p)%dotState (6*prm%totalNslip+1: 7*prm%totalNslip,:) + del%rho_sgl_imm_scr_pos => plasticState(p)%deltaState (6*prm%totalNslip+1: 7*prm%totalNslip,:) - stt%rho_sgl_imm_scr_neg => plasticState(p)%state (7*prm%totalNslip+1: 8*prm%totalNslip,:) - dot%rho_sgl_imm_scr_neg => plasticState(p)%dotState(7*prm%totalNslip+1: 8*prm%totalNslip,:) - del%rho_sgl_imm_scr_neg => plasticState(p)%deltaState(7*prm%totalNslip+1: 8*prm%totalNslip,:) + stt%rho_sgl_imm_scr_neg => plasticState(p)%state (7*prm%totalNslip+1: 8*prm%totalNslip,:) + dot%rho_sgl_imm_scr_neg => plasticState(p)%dotState (7*prm%totalNslip+1: 8*prm%totalNslip,:) + del%rho_sgl_imm_scr_neg => plasticState(p)%deltaState (7*prm%totalNslip+1: 8*prm%totalNslip,:) stt%rhoDip => plasticState(p)%state (8*prm%totalNslip+1:10*prm%totalNslip,:) dot%rhoDip => plasticState(p)%dotState (8*prm%totalNslip+1:10*prm%totalNslip,:) - del%rhoDip => plasticState(p)%deltaState (8*prm%totalNslip+1:10*prm%totalNslip,:) + del%rhoDip => plasticState(p)%deltaState (8*prm%totalNslip+1:10*prm%totalNslip,:) - stt%rho_dip_edg => plasticState(p)%state (8*prm%totalNslip+1: 9*prm%totalNslip,:) - dot%rho_dip_edg => plasticState(p)%dotState (8*prm%totalNslip+1: 9*prm%totalNslip,:) - del%rho_dip_edg => plasticState(p)%deltaState (8*prm%totalNslip+1: 9*prm%totalNslip,:) + stt%rho_dip_edg => plasticState(p)%state (8*prm%totalNslip+1: 9*prm%totalNslip,:) + dot%rho_dip_edg => plasticState(p)%dotState (8*prm%totalNslip+1: 9*prm%totalNslip,:) + del%rho_dip_edg => plasticState(p)%deltaState (8*prm%totalNslip+1: 9*prm%totalNslip,:) stt%rho_dip_scr => plasticState(p)%state (9*prm%totalNslip+1:10*prm%totalNslip,:) dot%rho_dip_scr => plasticState(p)%dotState (9*prm%totalNslip+1:10*prm%totalNslip,:) - del%rho_dip_scr => plasticState(p)%deltaState (9*prm%totalNslip+1:10*prm%totalNslip,:) + del%rho_dip_scr => plasticState(p)%deltaState (9*prm%totalNslip+1:10*prm%totalNslip,:) - stt%accumulatedshear => plasticState(p)%state (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) - dot%accumulatedshear => plasticState(p)%dotState (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) - del%accumulatedshear => plasticState(p)%deltaState (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) + stt%accumulatedshear => plasticState(p)%state (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) + dot%accumulatedshear => plasticState(p)%dotState (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) + del%accumulatedshear => plasticState(p)%deltaState (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) plasticState(p)%aTolState(10*prm%totalNslip + 1:11*prm%totalNslip ) = prm%aTolShear - plasticState(p)%slipRate => plasticState(p)%dotState(10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) - plasticState(p)%accumulatedSlip => plasticState(p)%state (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) + plasticState(p)%slipRate => plasticState(p)%dotState (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) + plasticState(p)%accumulatedSlip => plasticState(p)%state(10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) - stt%rho_forest => plasticState(p)%state (11*prm%totalNslip + 1:12*prm%totalNslip ,1:NofMyPhase) - stt%v => plasticState(p)%state (12*prm%totalNslip + 1:16*prm%totalNslip ,1:NofMyPhase) + stt%rho_forest => plasticState(p)%state (11*prm%totalNslip + 1:12*prm%totalNslip ,1:NofMyPhase) + stt%v => plasticState(p)%state (12*prm%totalNslip + 1:16*prm%totalNslip ,1:NofMyPhase) allocate(dst%tau_Threshold(prm%totalNslip,NofMyPhase),source=0.0_pReal) - allocate(dst%tau_Back(prm%totalNslip,NofMyPhase),source=0.0_pReal) + allocate(dst%tau_Back(prm%totalNslip,NofMyPhase), source=0.0_pReal) end associate - if (NofMyPhase > 0) call stateInit(p,NofMyPhase) plasticState(p)%state0 = plasticState(p)%state From afad2f2dcee891c3bfa850dbd7a1ce00eb0a1920 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 1 Dec 2019 08:39:30 +0100 Subject: [PATCH 186/233] short and consistent naming --- src/plastic_nonlocal.f90 | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index 82a2ad122..ae85dfe56 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -86,10 +86,10 @@ module plastic_nonlocal rho_dot_sgl_ID, & rho_dot_sgl_mobile_ID, & rho_dot_dip_ID, & - velocity_edge_pos_ID, & - velocity_edge_neg_ID, & - velocity_screw_pos_ID, & - velocity_screw_neg_ID, & + v_edg_pos_ID, & + v_edg_neg_ID, & + v_scr_pos_ID, & + v_scr_neg_ID, & accumulatedshear_ID end enum @@ -482,13 +482,13 @@ subroutine plastic_nonlocal_init case ('rho_dot_dip') outputID = merge(rho_dot_dip_ID,undefined_ID,prm%totalNslip>0) case ('velocity_edge_pos') - outputID = merge(velocity_edge_pos_ID,undefined_ID,prm%totalNslip>0) + outputID = merge(v_edg_pos_ID,undefined_ID,prm%totalNslip>0) case ('velocity_edge_neg') - outputID = merge(velocity_edge_neg_ID,undefined_ID,prm%totalNslip>0) + outputID = merge(v_edg_neg_ID,undefined_ID,prm%totalNslip>0) case ('velocity_screw_pos') - outputID = merge(velocity_screw_pos_ID,undefined_ID,prm%totalNslip>0) + outputID = merge(v_scr_pos_ID,undefined_ID,prm%totalNslip>0) case ('velocity_screw_neg') - outputID = merge(velocity_screw_neg_ID,undefined_ID,prm%totalNslip>0) + outputID = merge(v_scr_neg_ID,undefined_ID,prm%totalNslip>0) case ('accumulatedshear','accumulated_shear') outputID = merge(accumulatedshear_ID,undefined_ID,prm%totalNslip>0) end select @@ -2064,19 +2064,19 @@ outputsLoop: do o = 1,size(param(instance)%outputID) postResults(cs+1:cs+ns) = sum(rhoDotDip,2) cs = cs + ns - case (velocity_edge_pos_ID) + case (v_edg_pos_ID) postResults(cs+1:cs+ns) = v(1:ns,1) cs = cs + ns - case (velocity_edge_neg_ID) + case (v_edg_neg_ID) postResults(cs+1:cs+ns) = v(1:ns,2) cs = cs + ns - case (velocity_screw_pos_ID) + case (v_scr_pos_ID) postResults(cs+1:cs+ns) = v(1:ns,3) cs = cs + ns - case (velocity_screw_neg_ID) + case (v_scr_neg_ID) postResults(cs+1:cs+ns) = v(1:ns,4) cs = cs + ns From 33c090d2ac50a3ebd8c599ef87fd1d8ddf64fdb5 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 1 Dec 2019 08:55:24 +0100 Subject: [PATCH 187/233] pointers for better readability --- src/plastic_nonlocal.f90 | 42 ++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index ae85dfe56..a5e0e751a 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -189,7 +189,11 @@ module plastic_nonlocal rho_dip_scr, & rho_forest, & accumulatedshear, & - v + v, & + v_edg_pos, & + v_edg_neg, & + v_scr_pos, & + v_scr_neg end type tNonlocalState type(tNonlocalState), allocatable, dimension(:), private :: & @@ -595,6 +599,10 @@ subroutine plastic_nonlocal_init stt%rho_forest => plasticState(p)%state (11*prm%totalNslip + 1:12*prm%totalNslip ,1:NofMyPhase) stt%v => plasticState(p)%state (12*prm%totalNslip + 1:16*prm%totalNslip ,1:NofMyPhase) + stt%v_edg_pos => plasticState(p)%state (12*prm%totalNslip + 1:13*prm%totalNslip ,1:NofMyPhase) + stt%v_edg_neg => plasticState(p)%state (13*prm%totalNslip + 1:14*prm%totalNslip ,1:NofMyPhase) + stt%v_scr_pos => plasticState(p)%state (14*prm%totalNslip + 1:15*prm%totalNslip ,1:NofMyPhase) + stt%v_scr_neg => plasticState(p)%state (15*prm%totalNslip + 1:16*prm%totalNslip ,1:NofMyPhase) allocate(dst%tau_Threshold(prm%totalNslip,NofMyPhase),source=0.0_pReal) allocate(dst%tau_Back(prm%totalNslip,NofMyPhase), source=0.0_pReal) @@ -1159,7 +1167,7 @@ subroutine plastic_nonlocal_LpAndItsTangent(Lp, dLp_dMp, & of = material_phasememberAt(1,ip,el) instance = phase_plasticityInstance(ph) - associate(prm => param(instance),dst=>microstructure(instance)) + associate(prm => param(instance),dst=>microstructure(instance),stt=>state(instance)) ns = prm%totalNslip !*** shortcut to state variables @@ -1210,11 +1218,8 @@ subroutine plastic_nonlocal_LpAndItsTangent(Lp, dLp_dMp, & 2 , Temperature, instance, of) enddo endif - - - !*** store velocity in state - forall (t = 1:4) & - plasticState(ph)%state(iV(1:ns,t,instance),of) = v(1:ns,t) + + stt%v(:,of) = pack(v,.true.) !*** Bauschinger effect forall (s = 1:ns, t = 5:8, rhoSgl(s,t) * v(s,t-4) < 0.0_pReal) & @@ -1975,8 +1980,6 @@ function plastic_nonlocal_postResults(ph,instance,of) result(postResults) real(pReal), dimension(param(instance)%totalNslip,8) :: & rhoSgl, & rhoDotSgl !< evolution rate of single dislocation densities (positive/negative screw and edge without dipoles) - real(pReal), dimension(param(instance)%totalNslip,4) :: & - v !< velocities real(pReal), dimension(param(instance)%totalNslip,2) :: & rhoDotDip !< evolution rate of dipole dislocation densities (screw and edge dipoles) @@ -1989,7 +1992,6 @@ associate(prm => param(instance),dst => microstructure(instance),stt=>state(inst forall (s = 1:ns, t = 1:4) rhoSgl(s,t+4) = plasticState(ph)%State(iRhoB(s,t,instance),of) - v(s,t) = plasticState(ph)%State(iV(s,t,instance),of) rhoDotSgl(s,t+4) = plasticState(ph)%dotState(iRhoB(s,t,instance),of) endforall forall (s = 1:ns, c = 1:2) @@ -2065,19 +2067,19 @@ outputsLoop: do o = 1,size(param(instance)%outputID) cs = cs + ns case (v_edg_pos_ID) - postResults(cs+1:cs+ns) = v(1:ns,1) + postResults(cs+1:cs+ns) = stt%v_edg_pos(:,of) cs = cs + ns case (v_edg_neg_ID) - postResults(cs+1:cs+ns) = v(1:ns,2) + postResults(cs+1:cs+ns) = stt%v_edg_neg(:,of) cs = cs + ns case (v_scr_pos_ID) - postResults(cs+1:cs+ns) = v(1:ns,3) + postResults(cs+1:cs+ns) = stt%v_scr_pos(:,of) cs = cs + ns case (v_scr_neg_ID) - postResults(cs+1:cs+ns) = v(1:ns,4) + postResults(cs+1:cs+ns) = stt%v_scr_neg(:,of) cs = cs + ns case(accumulatedshear_ID) @@ -2163,6 +2165,18 @@ subroutine plastic_nonlocal_results(instance,group) case (rho_forest_ID) call results_writeDataset(group,stt%rho_forest, 'rho_forest',& 'forest density','1/m²') + case (v_edg_pos_ID) + call results_writeDataset(group,stt%v_edg_pos, 'v_edg_pos',& + 'positive edge velocity','m/s') + case (v_edg_neg_ID) + call results_writeDataset(group,stt%v_edg_neg, 'v_edg_neg',& + 'negative edge velocity','m/s') + case (v_scr_pos_ID) + call results_writeDataset(group,stt%v_scr_pos, 'v_scr_pos',& + 'positive srew velocity','m/s') + case (v_scr_neg_ID) + call results_writeDataset(group,stt%v_scr_neg, 'v_scr_neg',& + 'negative screw velocity','m/s') end select enddo outputsLoop end associate From 1cf1da5bccc6ae909967dc6ef88897820ab18a29 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 1 Dec 2019 09:35:44 +0100 Subject: [PATCH 188/233] consistent naming --- src/plastic_disloUCLA.f90 | 2 +- src/plastic_nonlocal.f90 | 23 +++++++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/plastic_disloUCLA.f90 b/src/plastic_disloUCLA.f90 index 48dc12f15..0a8a3b0ee 100644 --- a/src/plastic_disloUCLA.f90 +++ b/src/plastic_disloUCLA.f90 @@ -480,7 +480,7 @@ subroutine plastic_disloUCLA_results(instance,group) call results_writeDataset(group,stt%rho_dip,'rho_dip',& 'dislocation dipole density''1/m²') case (dot_gamma_sl_ID) - call results_writeDataset(group,stt%gamma_sl,'dot_gamma_sl',& + call results_writeDataset(group,stt%gamma_sl,'dot_gamma_sl',& ! this is not dot!! 'plastic shear','1') case (Lambda_sl_ID) call results_writeDataset(group,dst%Lambda_sl,'Lambda_sl',& diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index a5e0e751a..b4665566b 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -90,7 +90,7 @@ module plastic_nonlocal v_edg_neg_ID, & v_scr_pos_ID, & v_scr_neg_ID, & - accumulatedshear_ID + gamma_ID end enum type, private :: tParameters !< container type for internal constitutive parameters @@ -188,7 +188,7 @@ module plastic_nonlocal rho_dip_edg, & rho_dip_scr, & rho_forest, & - accumulatedshear, & + gamma, & v, & v_edg_pos, & v_edg_neg, & @@ -494,7 +494,7 @@ subroutine plastic_nonlocal_init case ('velocity_screw_neg') outputID = merge(v_scr_neg_ID,undefined_ID,prm%totalNslip>0) case ('accumulatedshear','accumulated_shear') - outputID = merge(accumulatedshear_ID,undefined_ID,prm%totalNslip>0) + outputID = merge(gamma_ID,undefined_ID,prm%totalNslip>0) end select if (outputID /= undefined_ID) then @@ -513,7 +513,7 @@ subroutine plastic_nonlocal_init 'rhoSglEdgePosImmobile ','rhoSglEdgeNegImmobile ', & 'rhoSglScrewPosImmobile','rhoSglScrewNegImmobile', & 'rhoDipEdge ','rhoDipScrew ', & - 'accumulatedshear ' ]) * prm%totalNslip !< "basic" microstructural state variables that are independent from other state variables + 'gamma ' ]) * prm%totalNslip !< "basic" microstructural state variables that are independent from other state variables sizeDependentState = size([ 'rhoForest ']) * prm%totalNslip !< microstructural state variables that depend on other state variables sizeState = sizeDotState + sizeDependentState & + size([ 'velocityEdgePos ','velocityEdgeNeg ', & @@ -590,9 +590,9 @@ subroutine plastic_nonlocal_init dot%rho_dip_scr => plasticState(p)%dotState (9*prm%totalNslip+1:10*prm%totalNslip,:) del%rho_dip_scr => plasticState(p)%deltaState (9*prm%totalNslip+1:10*prm%totalNslip,:) - stt%accumulatedshear => plasticState(p)%state (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) - dot%accumulatedshear => plasticState(p)%dotState (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) - del%accumulatedshear => plasticState(p)%deltaState (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) + stt%gamma => plasticState(p)%state (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) + dot%gamma => plasticState(p)%dotState (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) + del%gamma => plasticState(p)%deltaState (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) plasticState(p)%aTolState(10*prm%totalNslip + 1:11*prm%totalNslip ) = prm%aTolShear plasticState(p)%slipRate => plasticState(p)%dotState (10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) plasticState(p)%accumulatedSlip => plasticState(p)%state(10*prm%totalNslip + 1:11*prm%totalNslip ,1:NofMyPhase) @@ -1803,7 +1803,7 @@ subroutine plastic_nonlocal_dotState(Mp, Fe, Fp, Temperature, & else dot%rho(:,o) = pack(rhoDot,.true.) forall (s = 1:ns) & - dot%accumulatedshear(s,o) = sum(gdot(s,1:4)) + dot%gamma(s,o) = sum(gdot(s,1:4)) endif end associate @@ -2082,8 +2082,8 @@ outputsLoop: do o = 1,size(param(instance)%outputID) postResults(cs+1:cs+ns) = stt%v_scr_neg(:,of) cs = cs + ns - case(accumulatedshear_ID) - postResults(cs+1:cs+ns) = stt%accumulatedshear(:,of) + case(gamma_ID) + postResults(cs+1:cs+ns) = stt%gamma(:,of) cs = cs + ns end select @@ -2177,6 +2177,9 @@ subroutine plastic_nonlocal_results(instance,group) case (v_scr_neg_ID) call results_writeDataset(group,stt%v_scr_neg, 'v_scr_neg',& 'negative screw velocity','m/s') + case(gamma_ID) + call results_writeDataset(group,stt%gamma,'gamma',& + 'plastic shear','1') end select enddo outputsLoop end associate From bb152a171a6a76ce030b76ec304c50601e2712f6 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 1 Dec 2019 10:32:45 +0100 Subject: [PATCH 189/233] consistent naming among plasticity laws --- src/plastic_disloUCLA.f90 | 6 +++--- src/plastic_dislotwin.f90 | 6 +++--- src/plastic_nonlocal.f90 | 25 ++++++++++++++----------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/plastic_disloUCLA.f90 b/src/plastic_disloUCLA.f90 index 0a8a3b0ee..29ef0fcc9 100644 --- a/src/plastic_disloUCLA.f90 +++ b/src/plastic_disloUCLA.f90 @@ -30,7 +30,7 @@ module plastic_disloUCLA dot_gamma_sl_ID, & gamma_sl_ID, & Lambda_sl_ID, & - thresholdstress_ID + tau_pass_ID end enum type, private :: tParameters @@ -274,7 +274,7 @@ subroutine plastic_disloUCLA_init() case ('mfp','mfp_slip') outputID = merge(Lambda_sl_ID,undefined_ID,prm%sum_N_sl>0) case ('threshold_stress','threshold_stress_slip') - outputID = merge(thresholdstress_ID,undefined_ID,prm%sum_N_sl>0) + outputID = merge(tau_pass_ID,undefined_ID,prm%sum_N_sl>0) end select @@ -485,7 +485,7 @@ subroutine plastic_disloUCLA_results(instance,group) case (Lambda_sl_ID) call results_writeDataset(group,dst%Lambda_sl,'Lambda_sl',& 'mean free path for slip','m') - case (thresholdstress_ID) + case (tau_pass_ID) call results_writeDataset(group,dst%threshold_stress,'tau_pass',& 'threshold stress for slip','Pa') end select diff --git a/src/plastic_dislotwin.f90 b/src/plastic_dislotwin.f90 index 6bbf87060..1f731a891 100644 --- a/src/plastic_dislotwin.f90 +++ b/src/plastic_dislotwin.f90 @@ -33,7 +33,7 @@ module plastic_dislotwin gamma_sl_ID, & Lambda_sl_ID, & resolved_stress_slip_ID, & - threshold_stress_slip_ID, & + tau_pass_ID, & edge_dipole_distance_ID, & f_tw_ID, & Lambda_tw_ID, & @@ -477,7 +477,7 @@ subroutine plastic_dislotwin_init outputID = merge(Lambda_sl_ID,undefined_ID,prm%sum_N_sl > 0) outputSize = prm%sum_N_sl case ('tau_pass') - outputID= merge(threshold_stress_slip_ID,undefined_ID,prm%sum_N_sl > 0) + outputID= merge(tau_pass_ID,undefined_ID,prm%sum_N_sl > 0) outputSize = prm%sum_N_sl case ('f_tw') @@ -948,7 +948,7 @@ subroutine plastic_dislotwin_results(instance,group) case (Lambda_sl_ID) call results_writeDataset(group,dst%Lambda_sl,'Lambda_sl',& 'mean free path for slip','m') - case (threshold_stress_slip_ID) + case (tau_pass_ID) call results_writeDataset(group,dst%tau_pass,'tau_pass',& 'passing stress for slip','Pa') diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index b4665566b..63ade72db 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -82,7 +82,7 @@ module plastic_nonlocal rho_dip_scr_ID, & rho_forest_ID, & resolvedstress_back_ID, & - resistance_ID, & + tau_pass_ID, & rho_dot_sgl_ID, & rho_dot_sgl_mobile_ID, & rho_dot_dip_ID, & @@ -166,7 +166,7 @@ module plastic_nonlocal type, private :: tNonlocalMicrostructure real(pReal), allocatable, dimension(:,:) :: & - tau_Threshold, & + tau_pass, & tau_Back end type tNonlocalMicrostructure @@ -478,7 +478,7 @@ subroutine plastic_nonlocal_init case ('resolvedstress_back') outputID = merge(resolvedstress_back_ID,undefined_ID,prm%totalNslip>0) case ('resistance') - outputID = merge(resistance_ID,undefined_ID,prm%totalNslip>0) + outputID = merge(tau_pass_ID,undefined_ID,prm%totalNslip>0) case ('rho_dot_sgl') outputID = merge(rho_dot_sgl_ID,undefined_ID,prm%totalNslip>0) case ('rho_dot_sgl_mobile') @@ -604,7 +604,7 @@ subroutine plastic_nonlocal_init stt%v_scr_pos => plasticState(p)%state (14*prm%totalNslip + 1:15*prm%totalNslip ,1:NofMyPhase) stt%v_scr_neg => plasticState(p)%state (15*prm%totalNslip + 1:16*prm%totalNslip ,1:NofMyPhase) - allocate(dst%tau_Threshold(prm%totalNslip,NofMyPhase),source=0.0_pReal) + allocate(dst%tau_pass(prm%totalNslip,NofMyPhase),source=0.0_pReal) allocate(dst%tau_Back(prm%totalNslip,NofMyPhase), source=0.0_pReal) end associate @@ -851,7 +851,7 @@ subroutine plastic_nonlocal_dependentState(Fe, Fp, ip, el) endif forall (s = 1:ns) & - dst%tau_threshold(s,of) = prm%mu * prm%burgers(s) & + dst%tau_pass(s,of) = prm%mu * prm%burgers(s) & * sqrt(dot_product(sum(abs(rho),2), myInteractionMatrix(1:ns,s))) @@ -968,7 +968,7 @@ subroutine plastic_nonlocal_dependentState(Fe, Fp, ip, el) .or. .not. iand(debug_level(debug_constitutive),debug_levelSelective) /= 0)) then write(6,'(/,a,i8,1x,i2,1x,i1,/)') '<< CONST >> nonlocal_microstructure at el ip ',el,ip write(6,'(a,/,12x,12(e10.3,1x))') '<< CONST >> rhoForest', stt%rho_forest(:,of) - write(6,'(a,/,12x,12(f10.5,1x))') '<< CONST >> tauThreshold / MPa', dst%tau_threshold(:,of)*1e-6 + write(6,'(a,/,12x,12(f10.5,1x))') '<< CONST >> tauThreshold / MPa', dst%tau_pass(:,of)*1e-6 write(6,'(a,/,12x,12(f10.5,1x),/)') '<< CONST >> tauBack / MPa', dst%tau_back(:,of)*1e-6 endif #endif @@ -1198,7 +1198,7 @@ subroutine plastic_nonlocal_LpAndItsTangent(Lp, dLp_dMp, & ! edges call plastic_nonlocal_kinetics(v(1:ns,1), dv_dtau(1:ns,1), dv_dtauNS(1:ns,1), & - tau(1:ns), tauNS(1:ns,1), dst%tau_Threshold(1:ns,of), & + tau(1:ns), tauNS(1:ns,1), dst%tau_pass(1:ns,of), & 1, Temperature, instance, of) v(1:ns,2) = v(1:ns,1) dv_dtau(1:ns,2) = dv_dtau(1:ns,1) @@ -1214,7 +1214,7 @@ subroutine plastic_nonlocal_LpAndItsTangent(Lp, dLp_dMp, & else do t = 3,4 call plastic_nonlocal_kinetics(v(1:ns,t), dv_dtau(1:ns,t), dv_dtauNS(1:ns,t), & - tau(1:ns), tauNS(1:ns,t), dst%tau_Threshold(1:ns,of), & + tau(1:ns), tauNS(1:ns,t), dst%tau_pass(1:ns,of), & 2 , Temperature, instance, of) enddo endif @@ -2049,8 +2049,8 @@ outputsLoop: do o = 1,size(param(instance)%outputID) postResults(cs+1:cs+ns) = dst%tau_back(:,of) cs = cs + ns - case (resistance_ID) - postResults(cs+1:cs+ns) = dst%tau_Threshold(:,of) + case (tau_pass_ID) + postResults(cs+1:cs+ns) = dst%tau_pass(:,of) cs = cs + ns case (rho_dot_sgl_ID) @@ -2129,7 +2129,7 @@ subroutine plastic_nonlocal_results(instance,group) character(len=*) :: group integer :: o - associate(prm => param(instance), stt => state(instance)) + associate(prm => param(instance),dst => microstructure(instance),stt=>state(instance)) outputsLoop: do o = 1,size(prm%outputID) select case(prm%outputID(o)) case (rho_sgl_mob_edg_pos_ID) @@ -2180,6 +2180,9 @@ subroutine plastic_nonlocal_results(instance,group) case(gamma_ID) call results_writeDataset(group,stt%gamma,'gamma',& 'plastic shear','1') + case (tau_pass_ID) + call results_writeDataset(group,dst%tau_pass,'tau_pass',& + 'passing stress for slip','Pa') end select enddo outputsLoop end associate From 05aa38cc718d4dc8b462e651975f21fb6dde9471 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 1 Dec 2019 15:05:49 +0100 Subject: [PATCH 190/233] using short names --- src/math.f90 | 4 ++++ src/plastic_nonlocal.f90 | 32 ++++++++++++++++---------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/math.f90 b/src/math.f90 index 5a3a5f467..7eba379d2 100644 --- a/src/math.f90 +++ b/src/math.f90 @@ -840,6 +840,7 @@ end function math_Voigt66to3333 !-------------------------------------------------------------------------------------------------- !> @brief action of a quaternion on a vector (rotate vector v with Q) +!> @details deprecated !-------------------------------------------------------------------------------------------------- pure function math_qRot(Q,v) @@ -1329,6 +1330,7 @@ end function math_areaTriangle !-------------------------------------------------------------------------------------------------- !> @brief rotate 33 tensor forward +!> @details deprecated !-------------------------------------------------------------------------------------------------- pure function math_rotate_forward33(tensor,R) @@ -1342,6 +1344,7 @@ end function math_rotate_forward33 !-------------------------------------------------------------------------------------------------- !> @brief rotate 33 tensor backward +!> @details deprecated !-------------------------------------------------------------------------------------------------- pure function math_rotate_backward33(tensor,R) @@ -1355,6 +1358,7 @@ end function math_rotate_backward33 !-------------------------------------------------------------------------------------------------- !> @brief rotate 3333 tensor C'_ijkl=g_im*g_jn*g_ko*g_lp*C_mnop +!> @details deprecated !-------------------------------------------------------------------------------------------------- pure function math_rotate_forward3333(tensor,R) diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index 63ade72db..0f0e3aa3a 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -453,31 +453,31 @@ subroutine plastic_nonlocal_init do i=1, size(outputs) outputID = undefined_ID select case(trim(outputs(i))) - case ('rho_sgl_edge_pos_mobile') + case ('rho_sgl_edge_pos_mob') outputID = merge(rho_sgl_mob_edg_pos_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_edge_neg_mobile') + case ('rho_sgl_edge_neg_mob') outputID = merge(rho_sgl_mob_edg_neg_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_screw_pos_mobile') + case ('rho_sgl_screw_pos_mob') outputID = merge(rho_sgl_mob_scr_pos_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_screw_neg_mobile') + case ('rho_sgl_screw_neg_mob') outputID = merge(rho_sgl_mob_scr_neg_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_edge_pos_immobile') + case ('rho_sgl_edge_pos_imm') outputID = merge(rho_sgl_imm_edg_pos_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_edge_neg_immobile') + case ('rho_sgl_edge_neg_imm') outputID = merge(rho_sgl_imm_edg_neg_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_screw_pos_immobile') + case ('rho_sgl_screw_pos_imm') outputID = merge(rho_sgl_imm_scr_pos_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_screw_neg_immobile') + case ('rho_sgl_screw_neg_imm') outputID = merge(rho_sgl_imm_scr_neg_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dip_edge') + case ('rho_dip_edg') outputID = merge(rho_dip_edg_ID,undefined_ID,prm%totalNslip>0) - case ('rho_dip_screw') + case ('rho_dip_scr') outputID = merge(rho_dip_scr_ID,undefined_ID,prm%totalNslip>0) case ('rho_forest') outputID = merge(rho_forest_ID,undefined_ID,prm%totalNslip>0) case ('resolvedstress_back') outputID = merge(resolvedstress_back_ID,undefined_ID,prm%totalNslip>0) - case ('resistance') + case ('tau_pass') outputID = merge(tau_pass_ID,undefined_ID,prm%totalNslip>0) case ('rho_dot_sgl') outputID = merge(rho_dot_sgl_ID,undefined_ID,prm%totalNslip>0) @@ -485,15 +485,15 @@ subroutine plastic_nonlocal_init outputID = merge(rho_dot_sgl_mobile_ID,undefined_ID,prm%totalNslip>0) case ('rho_dot_dip') outputID = merge(rho_dot_dip_ID,undefined_ID,prm%totalNslip>0) - case ('velocity_edge_pos') + case ('v_edg_pos') outputID = merge(v_edg_pos_ID,undefined_ID,prm%totalNslip>0) - case ('velocity_edge_neg') + case ('v_edg_neg') outputID = merge(v_edg_neg_ID,undefined_ID,prm%totalNslip>0) - case ('velocity_screw_pos') + case ('v_scr_pos') outputID = merge(v_scr_pos_ID,undefined_ID,prm%totalNslip>0) - case ('velocity_screw_neg') + case ('v_scr_neg') outputID = merge(v_scr_neg_ID,undefined_ID,prm%totalNslip>0) - case ('accumulatedshear','accumulated_shear') + case ('gamma') outputID = merge(gamma_ID,undefined_ID,prm%totalNslip>0) end select From 2b3b26087f795b00f8bda8ec731a1684193bc3cc Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 1 Dec 2019 20:07:16 +0100 Subject: [PATCH 191/233] consistent names --- PRIVATE | 2 +- .../Phase_Nonlocal_Aluminum.config | 67 +++++-------------- .../ConfigFiles/Phase_Nonlocal_Nickel.config | 41 +++++------- src/plastic_nonlocal.f90 | 16 ++--- 4 files changed, 42 insertions(+), 84 deletions(-) diff --git a/PRIVATE b/PRIVATE index 633a2d1ba..1d177aa3f 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 633a2d1ba8c1f96c0362a35af407304228934b0d +Subproject commit 1d177aa3f080eacf9fca568070707f04cd7058d6 diff --git a/examples/ConfigFiles/Phase_Nonlocal_Aluminum.config b/examples/ConfigFiles/Phase_Nonlocal_Aluminum.config index 6406a47c0..fd18aa719 100644 --- a/examples/ConfigFiles/Phase_Nonlocal_Aluminum.config +++ b/examples/ConfigFiles/Phase_Nonlocal_Aluminum.config @@ -4,58 +4,23 @@ elasticity hooke plasticity nonlocal /nonlocal/ -(output) rho -(output) rho_edge -(output) rho_screw -(output) rho_sgl -(output) rho_sgl_edge_pos -(output) rho_sgl_edge_neg -(output) rho_sgl_screw_pos -(output) rho_sgl_screw_neg -(output) rho_sgl_edge_pos_mobile -(output) rho_sgl_edge_neg_mobile -(output) rho_sgl_screw_pos_mobile -(output) rho_sgl_screw_neg_mobile -(output) rho_sgl_edge_pos_immobile -(output) rho_sgl_edge_neg_immobile -(output) rho_sgl_screw_pos_immobile -(output) rho_sgl_screw_neg_immobile -(output) rho_dip_edge -(output) rho_dip_screw +(output) rho_sgl_mob_edg_pos +(output) rho_sgl_imm_edg_pos +(output) rho_sgl_mob_edg_neg +(output) rho_sgl_imm_edg_neg +(output) rho_sgl_mob_scr_pos +(output) rho_sgl_imm_scr_pos +(output) rho_sgl_mob_scr_neg +(output) rho_sgl_imm_scr_neg +(output) rho_dip_edg +(output) rho_dip_scr (output) rho_forest -(output) delta -(output) delta_sgl -(output) delta_dip -(output) shearrate -(output) resolvedstress -(output) resolvedstress_back -(output) resolvedstress_external -(output) resistance -(output) rho_dot -(output) rho_dot_sgl -(output) rho_dot_sgl_mobile -(output) rho_dot_dip -(output) rho_dot_gen_edge -(output) rho_dot_gen_screw -(output) rho_dot_sgl2dip_edge -(output) rho_dot_sgl2dip_screw -(output) rho_dot_ann_ath -(output) rho_dot_ann_the -(output) rho_dot_ann_the_edge -(output) rho_dot_ann_the_screw -(output) rho_dot_edgejogs -(output) rho_dot_flux -(output) rho_dot_flux_mobile -(output) rho_dot_flux_edge -(output) rho_dot_flux_screw -(output) velocity_edge_pos -(output) velocity_edge_neg -(output) velocity_screw_pos -(output) velocity_screw_neg -(output) maximumDipoleHeight_edge -(output) maximumDipoleHeight_screw -(output) accumulated_shear -(output) dislocationstress +(output) gamma +(output) tau_pass +(output) v_edg_pos +(output) v_edg_neg +(output) v_scr_pos +(output) v_scr_neg lattice_structure fcc Nslip 12 # number of slip systems diff --git a/examples/ConfigFiles/Phase_Nonlocal_Nickel.config b/examples/ConfigFiles/Phase_Nonlocal_Nickel.config index 3420b4246..3cba4d975 100644 --- a/examples/ConfigFiles/Phase_Nonlocal_Nickel.config +++ b/examples/ConfigFiles/Phase_Nonlocal_Nickel.config @@ -3,31 +3,24 @@ elasticity hooke plasticity nonlocal /nonlocal/ - -(output) rho -(output) rho_sgl_mobile -(output) rho_sgl_immobile -(output) rho_sgl_edge_pos -(output) rho_sgl_edge_neg -(output) rho_sgl_screw_pos -(output) rho_sgl_screw_neg -(output) rho_dip_edge -(output) rho_dip_screw +(output) rho_sgl_mob_edg_pos +(output) rho_sgl_imm_edg_pos +(output) rho_sgl_mob_edg_neg +(output) rho_sgl_imm_edg_neg +(output) rho_sgl_mob_scr_pos +(output) rho_sgl_imm_scr_pos +(output) rho_sgl_mob_scr_neg +(output) rho_sgl_imm_scr_neg +(output) rho_dip_edg +(output) rho_dip_scr (output) rho_forest -(output) accumulatedshear -(output) shearrate -(output) resolvedstress -(output) resistance -(output) velocity_edge_pos -(output) rho_dot_gen -(output) rho_dot_sgl2dip_edge -(output) rho_dot_sgl2dip_screw -(output) rho_dot_ann_ath -(output) rho_dot_ann_the_edge -(output) rho_dot_ann_the_screw -(output) rho_dot_edgejogs -(output) rho_dot_flux_edge -(output) rho_dot_flux_screw +(output) gamma +(output) tau_pass +(output) v_edg_pos +(output) v_edg_neg +(output) v_scr_pos +(output) v_scr_neg + lattice_structure fcc Nslip 12 # number of slip systems per family diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index 0f0e3aa3a..c2400494c 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -453,21 +453,21 @@ subroutine plastic_nonlocal_init do i=1, size(outputs) outputID = undefined_ID select case(trim(outputs(i))) - case ('rho_sgl_edge_pos_mob') + case ('rho_sgl_mob_edg_pos') outputID = merge(rho_sgl_mob_edg_pos_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_edge_neg_mob') + case ('rho_sgl_mob_edg_neg') outputID = merge(rho_sgl_mob_edg_neg_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_screw_pos_mob') + case ('rho_sgl_mob_scr_pos') outputID = merge(rho_sgl_mob_scr_pos_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_screw_neg_mob') + case ('rho_sgl_mob_scr_neg') outputID = merge(rho_sgl_mob_scr_neg_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_edge_pos_imm') + case ('rho_sgl_imm_edg_pos') outputID = merge(rho_sgl_imm_edg_pos_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_edge_neg_imm') + case ('rho_sgl_imm_edg_neg') outputID = merge(rho_sgl_imm_edg_neg_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_screw_pos_imm') + case ('rho_sgl_imm_scr_pos') outputID = merge(rho_sgl_imm_scr_pos_ID,undefined_ID,prm%totalNslip>0) - case ('rho_sgl_screw_neg_imm') + case ('rho_sgl_imm_scr_neg') outputID = merge(rho_sgl_imm_scr_neg_ID,undefined_ID,prm%totalNslip>0) case ('rho_dip_edg') outputID = merge(rho_dip_edg_ID,undefined_ID,prm%totalNslip>0) From 5d524e128310f9c2e6ac5a1b02907317ee052184 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 2 Dec 2019 08:55:09 +0100 Subject: [PATCH 192/233] tests for nonlocal updated in PRIVATE --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 1d177aa3f..524e86c11 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 1d177aa3f080eacf9fca568070707f04cd7058d6 +Subproject commit 524e86c117d816e3bd873eed7663e258a6f2e139 From f85ee7d7fb1b454c2920784a955213b9965345f5 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 2 Dec 2019 12:39:44 +0100 Subject: [PATCH 193/233] plasticity is postResults-free --- src/constitutive.f90 | 87 ++---------------------------------------- src/homogenization.f90 | 5 +-- 2 files changed, 6 insertions(+), 86 deletions(-) diff --git a/src/constitutive.f90 b/src/constitutive.f90 index a571355a1..4067c026a 100644 --- a/src/constitutive.f90 +++ b/src/constitutive.f90 @@ -36,7 +36,6 @@ module constitutive private integer, public, protected :: & - constitutive_plasticity_maxSizePostResults, & constitutive_plasticity_maxSizeDotState, & constitutive_source_maxSizePostResults, & constitutive_source_maxSizeDotState @@ -72,8 +71,7 @@ subroutine constitutive_init integer, dimension(:,:), pointer :: thisSize character(len=64), dimension(:,:), pointer :: thisOutput character(len=32) :: outputName !< name of output, intermediate fix until HDF5 output is ready - logical :: knownPlasticity, knownSource, nonlocalConstitutionPresent - nonlocalConstitutionPresent = .false. + logical :: knownSource !-------------------------------------------------------------------------------------------------- ! initialized plasticity @@ -111,64 +109,11 @@ subroutine constitutive_init call IO_write_jobFile(FILEUNIT,'outputConstitutive') PhaseLoop: do ph = 1,material_Nphase activePhase: if (any(material_phaseAt == ph)) then - ins = phase_plasticityInstance(ph) - knownPlasticity = .true. ! assume valid - plasticityType: select case(phase_plasticity(ph)) - case (PLASTICITY_NONE_ID) plasticityType - outputName = PLASTICITY_NONE_label - thisOutput => null() - thisSize => null() - case (PLASTICITY_ISOTROPIC_ID) plasticityType - outputName = PLASTICITY_ISOTROPIC_label - thisOutput => null() - thisSize => null() - case (PLASTICITY_PHENOPOWERLAW_ID) plasticityType - outputName = PLASTICITY_PHENOPOWERLAW_label - thisOutput => null() - thisSize => null() - case (PLASTICITY_KINEHARDENING_ID) plasticityType - outputName = PLASTICITY_KINEHARDENING_label - thisOutput => null() - thisSize => null() - case (PLASTICITY_DISLOTWIN_ID) plasticityType - outputName = PLASTICITY_DISLOTWIN_label - thisOutput => null() - thisSize => null() - case (PLASTICITY_DISLOUCLA_ID) plasticityType - outputName = PLASTICITY_DISLOUCLA_label - thisOutput => null() - thisSize => null() - case (PLASTICITY_NONLOCAL_ID) plasticityType - outputName = PLASTICITY_NONLOCAL_label - thisOutput => plastic_nonlocal_output - thisSize => plastic_nonlocal_sizePostResult - case default plasticityType - knownPlasticity = .false. - end select plasticityType write(FILEUNIT,'(/,a,/)') '['//trim(config_name_phase(ph))//']' - if (knownPlasticity) then - write(FILEUNIT,'(a)') '(plasticity)'//char(9)//trim(outputName) - if (associated(thisOutput)) then - OutputPlasticityLoop: do o = 1,size(thisOutput(:,ins)) - if(len_trim(thisOutput(o,ins)) > 0) & - write(FILEUNIT,'(a,i4)') trim(thisOutput(o,ins))//char(9),thisSize(o,ins) - enddo OutputPlasticityLoop - endif - endif SourceLoop: do s = 1, phase_Nsources(ph) - knownSource = .true. ! assume valid + knownSource = .true. ! assume valid sourceType: select case (phase_source(s,ph)) - case (SOURCE_thermal_dissipation_ID) sourceType - ins = source_thermal_dissipation_instance(ph) - outputName = SOURCE_thermal_dissipation_label - thisOutput => source_thermal_dissipation_output - thisSize => source_thermal_dissipation_sizePostResult - case (SOURCE_thermal_externalheat_ID) sourceType - ins = source_thermal_externalheat_instance(ph) - outputName = SOURCE_thermal_externalheat_label - thisOutput => source_thermal_externalheat_output - thisSize => source_thermal_externalheat_sizePostResult case (SOURCE_damage_isoBrittle_ID) sourceType ins = source_damage_isoBrittle_instance(ph) outputName = SOURCE_damage_isoBrittle_label @@ -206,7 +151,6 @@ subroutine constitutive_init endif mainProcess constitutive_plasticity_maxSizeDotState = 0 - constitutive_plasticity_maxSizePostResults = 0 constitutive_source_maxSizeDotState = 0 constitutive_source_maxSizePostResults = 0 @@ -223,8 +167,6 @@ subroutine constitutive_init ! determine max size of state and output constitutive_plasticity_maxSizeDotState = max(constitutive_plasticity_maxSizeDotState, & plasticState(ph)%sizeDotState) - constitutive_plasticity_maxSizePostResults = max(constitutive_plasticity_maxSizePostResults, & - plasticState(ph)%sizePostResults) constitutive_source_maxSizeDotState = max(constitutive_source_maxSizeDotState, & maxval(sourceState(ph)%p(:)%sizeDotState)) constitutive_source_maxSizePostResults = max(constitutive_source_maxSizePostResults, & @@ -706,42 +648,21 @@ function constitutive_postResults(S, Fi, ipc, ip, el) ipc, & !< component-ID of integration point ip, & !< integration point el !< element - real(pReal), dimension(plasticState(material_phaseAt(ipc,el))%sizePostResults + & - sum(sourceState(material_phaseAt(ipc,el))%p(:)%sizePostResults)) :: & + real(pReal), dimension(sum(sourceState(material_phaseAt(ipc,el))%p(:)%sizePostResults)) :: & constitutive_postResults real(pReal), intent(in), dimension(3,3) :: & Fi !< intermediate deformation gradient real(pReal), intent(in), dimension(3,3) :: & S !< 2nd Piola Kirchhoff stress - real(pReal), dimension(3,3) :: & - Mp !< Mandel stress integer :: & startPos, endPos integer :: & - ho, & !< homogenization - tme, & !< thermal member position i, of, instance !< counter in source loop constitutive_postResults = 0.0_pReal - Mp = matmul(matmul(transpose(Fi),Fi),S) - ho = material_homogenizationAt(el) - tme = thermalMapping(ho)%p(ip,el) - - startPos = 1 - endPos = plasticState(material_phaseAt(ipc,el))%sizePostResults - - of = material_phasememberAt(ipc,ip,el) - instance = phase_plasticityInstance(material_phaseAt(ipc,el)) - - plasticityType: select case (phase_plasticity(material_phaseAt(ipc,el))) - - case (PLASTICITY_NONLOCAL_ID) plasticityType - constitutive_postResults(startPos:endPos) = & - plastic_nonlocal_postResults (material_phaseAt(ipc,el),instance,of) - - end select plasticityType + endPos = 0 SourceLoop: do i = 1, phase_Nsources(material_phaseAt(ipc,el)) startPos = endPos + 1 diff --git a/src/homogenization.f90 b/src/homogenization.f90 index a62f94820..618c2faf8 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -262,9 +262,8 @@ subroutine homogenization_init materialpoint_sizeResults = 1 & ! grain count + 1 + thermal_maxSizePostResults & + damage_maxSizePostResults & - + homogenization_maxNgrains * (1 & ! crystallite size - + 1 + constitutive_plasticity_maxSizePostResults & ! constitutive size & constitutive results - + constitutive_source_maxSizePostResults) + + homogenization_maxNgrains * ( 1 & ! crystallite size + + 1 + constitutive_source_maxSizePostResults) allocate(materialpoint_results(materialpoint_sizeResults,discretization_nIP,discretization_nElem)) write(6,'(/,a)') ' <<<+- homogenization init -+>>>' From 2969a53338d11efec1f026835afc1afdac911172 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 2 Dec 2019 12:54:45 +0100 Subject: [PATCH 194/233] not used/needed anymore --- src/plastic_nonlocal.f90 | 137 --------------------------------------- 1 file changed, 137 deletions(-) diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index c2400494c..23bfb50aa 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -215,7 +215,6 @@ module plastic_nonlocal plastic_nonlocal_dotState, & plastic_nonlocal_deltaState, & plastic_nonlocal_updateCompatibility, & - plastic_nonlocal_postResults, & plastic_nonlocal_results private :: & @@ -1956,142 +1955,6 @@ subroutine plastic_nonlocal_updateCompatibility(orientation,i,e) end subroutine plastic_nonlocal_updateCompatibility -!-------------------------------------------------------------------------------------------------- -!> @brief return array of constitutive results -!-------------------------------------------------------------------------------------------------- -function plastic_nonlocal_postResults(ph,instance,of) result(postResults) - - integer, intent(in) :: & - ph, & - instance, & - of - - real(pReal), dimension(sum(plastic_nonlocal_sizePostResult(:,instance))) :: & - postResults - - integer :: & - ns, & !< short notation for the total number of active slip systems - c, & !< character of dislocation - cs, & !< constitutive result index - o, & !< index of current output - t, & !< type of dislocation - s !< index of my current slip system - - real(pReal), dimension(param(instance)%totalNslip,8) :: & - rhoSgl, & - rhoDotSgl !< evolution rate of single dislocation densities (positive/negative screw and edge without dipoles) - real(pReal), dimension(param(instance)%totalNslip,2) :: & - rhoDotDip !< evolution rate of dipole dislocation densities (screw and edge dipoles) - - -ns = param(instance)%totalNslip - -cs = 0 - -associate(prm => param(instance),dst => microstructure(instance),stt=>state(instance),dot => dotState(instance)) - -forall (s = 1:ns, t = 1:4) - rhoSgl(s,t+4) = plasticState(ph)%State(iRhoB(s,t,instance),of) - rhoDotSgl(s,t+4) = plasticState(ph)%dotState(iRhoB(s,t,instance),of) -endforall -forall (s = 1:ns, c = 1:2) - rhoDotDip(s,c) = plasticState(ph)%dotState(iRhoD(s,c,instance),of) -endforall - -outputsLoop: do o = 1,size(param(instance)%outputID) - select case(param(instance)%outputID(o)) - - case (rho_sgl_mob_edg_pos_ID) - postResults(cs+1:cs+ns) = stt%rho_sgl_mob_edg_pos(:,of) - cs = cs + ns - - case (rho_sgl_imm_edg_pos_ID) - postResults(cs+1:cs+ns) = stt%rho_sgl_imm_edg_pos(:,of) - cs = cs + ns - - case (rho_sgl_mob_edg_neg_ID) - postResults(cs+1:cs+ns) = stt%rho_sgl_mob_edg_neg(:,of) - cs = cs + ns - - case (rho_sgl_imm_edg_neg_ID) - postResults(cs+1:cs+ns) = stt%rho_sgl_imm_edg_neg(:,of) - cs = cs + ns - - case (rho_dip_edg_ID) - postResults(cs+1:cs+ns) = stt%rho_dip_edg(:,of) - cs = cs + ns - - case (rho_sgl_mob_scr_pos_ID) - postResults(cs+1:cs+ns) = stt%rho_sgl_mob_scr_pos(:,of) - cs = cs + ns - - case (rho_sgl_imm_scr_pos_ID) - postResults(cs+1:cs+ns) = stt%rho_sgl_imm_scr_pos(:,of) - cs = cs + ns - - case (rho_sgl_mob_scr_neg_ID) - postResults(cs+1:cs+ns) = stt%rho_sgl_mob_scr_neg(:,of) - cs = cs + ns - - case (rho_sgl_imm_scr_neg_ID) - postResults(cs+1:cs+ns) = stt%rho_sgl_imm_scr_neg(:,of) - cs = cs + ns - - case (rho_dip_scr_ID) - postResults(cs+1:cs+ns) = stt%rho_dip_scr(:,of) - cs = cs + ns - - case (rho_forest_ID) - postResults(cs+1:cs+ns) = stt%rho_forest(:,of) - cs = cs + ns - - case (resolvedstress_back_ID) - postResults(cs+1:cs+ns) = dst%tau_back(:,of) - cs = cs + ns - - case (tau_pass_ID) - postResults(cs+1:cs+ns) = dst%tau_pass(:,of) - cs = cs + ns - - case (rho_dot_sgl_ID) - postResults(cs+1:cs+ns) = sum(rhoDotSgl(1:ns,1:4),2) & - + sum(rhoDotSgl(1:ns,5:8)*sign(1.0_pReal,rhoSgl(1:ns,5:8)),2) - cs = cs + ns - - case (rho_dot_sgl_mobile_ID) - postResults(cs+1:cs+ns) = sum(rhoDotSgl(1:ns,1:4),2) - cs = cs + ns - - case (rho_dot_dip_ID) - postResults(cs+1:cs+ns) = sum(rhoDotDip,2) - cs = cs + ns - - case (v_edg_pos_ID) - postResults(cs+1:cs+ns) = stt%v_edg_pos(:,of) - cs = cs + ns - - case (v_edg_neg_ID) - postResults(cs+1:cs+ns) = stt%v_edg_neg(:,of) - cs = cs + ns - - case (v_scr_pos_ID) - postResults(cs+1:cs+ns) = stt%v_scr_pos(:,of) - cs = cs + ns - - case (v_scr_neg_ID) - postResults(cs+1:cs+ns) = stt%v_scr_neg(:,of) - cs = cs + ns - - case(gamma_ID) - postResults(cs+1:cs+ns) = stt%gamma(:,of) - cs = cs + ns - - end select -enddo outputsLoop -end associate -end function plastic_nonlocal_postResults - - !-------------------------------------------------------------------------------------------------- !> @brief returns copy of current dislocation densities from state !> @details raw values is rectified From 8189b50509962ce4a68bd1fbc85054a121e06c76 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 2 Dec 2019 12:58:23 +0100 Subject: [PATCH 195/233] same functionality but tested --- src/math.f90 | 27 --------------------------- src/plastic_nonlocal.f90 | 15 ++++++--------- 2 files changed, 6 insertions(+), 36 deletions(-) diff --git a/src/math.f90 b/src/math.f90 index 7eba379d2..6b83e17a3 100644 --- a/src/math.f90 +++ b/src/math.f90 @@ -838,33 +838,6 @@ pure function math_Voigt66to3333(m66) end function math_Voigt66to3333 -!-------------------------------------------------------------------------------------------------- -!> @brief action of a quaternion on a vector (rotate vector v with Q) -!> @details deprecated -!-------------------------------------------------------------------------------------------------- -pure function math_qRot(Q,v) - - real(pReal), dimension(4), intent(in) :: Q - real(pReal), dimension(3), intent(in) :: v - real(pReal), dimension(3) :: math_qRot - real(pReal), dimension(4,4) :: T - integer :: i, j - - do i = 1,4 - do j = 1,i - T(i,j) = Q(i) * Q(j) - enddo - enddo - - math_qRot = [-v(1)*(T(3,3)+T(4,4)) + v(2)*(T(3,2)-T(4,1)) + v(3)*(T(4,2)+T(3,1)), & - v(1)*(T(3,2)+T(4,1)) - v(2)*(T(2,2)+T(4,4)) + v(3)*(T(4,3)-T(2,1)), & - v(1)*(T(4,2)-T(3,1)) + v(2)*(T(4,3)+T(2,1)) - v(3)*(T(2,2)+T(3,3))] - - math_qRot = 2.0_pReal * math_qRot + v - -end function math_qRot - - !-------------------------------------------------------------------------------------------------- !> @brief rotation matrix from Bunge-Euler (3-1-3) angles (in radians) !> @details deprecated diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index 23bfb50aa..5469515dc 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -1836,8 +1836,6 @@ subroutine plastic_nonlocal_updateCompatibility(orientation,i,e) ns, & ! number of active slip systems s1, & ! slip system index (me) s2 ! slip system index (my neighbor) - real(pReal), dimension(4) :: & - absoluteMisorientation ! absolute misorientation (without symmetry) between me and my neighbor real(pReal), dimension(2,totalNslip(phase_plasticityInstance(material_phaseAt(1,e))),& totalNslip(phase_plasticityInstance(material_phaseAt(1,e))),& nIPneighbors) :: & @@ -1848,7 +1846,7 @@ subroutine plastic_nonlocal_updateCompatibility(orientation,i,e) nThresholdValues logical, dimension(totalNslip(phase_plasticityInstance(material_phaseAt(1,e)))) :: & belowThreshold - type(rotation) :: rot + type(rotation) :: mis Nneighbors = nIPneighbors ph = material_phaseAt(1,e) @@ -1914,18 +1912,17 @@ subroutine plastic_nonlocal_updateCompatibility(orientation,i,e) !* Finally the smallest compatibility value is decreased until the sum is exactly equal to one. !* All values below the threshold are set to zero. else - rot = orientation(1,i,e)%misorientation(orientation(1,neighbor_i,neighbor_e)) - absoluteMisorientation = rot%asQuaternion() + mis = orientation(1,i,e)%misorientation(orientation(1,neighbor_i,neighbor_e)) mySlipSystems: do s1 = 1,ns neighborSlipSystems: do s2 = 1,ns my_compatibility(1,s2,s1,n) = math_inner(prm%slip_normal(1:3,s1), & - math_qRot(absoluteMisorientation, prm%slip_normal(1:3,s2))) & + mis%rotate(prm%slip_normal(1:3,s2))) & * abs(math_inner(prm%slip_direction(1:3,s1), & - math_qRot(absoluteMisorientation, prm%slip_direction(1:3,s2)))) + mis%rotate(prm%slip_direction(1:3,s2)))) my_compatibility(2,s2,s1,n) = abs(math_inner(prm%slip_normal(1:3,s1), & - math_qRot(absoluteMisorientation, prm%slip_normal(1:3,s2)))) & + mis%rotate(prm%slip_normal(1:3,s2)))) & * abs(math_inner(prm%slip_direction(1:3,s1), & - math_qRot(absoluteMisorientation, prm%slip_direction(1:3,s2)))) + mis%rotate(prm%slip_direction(1:3,s2)))) enddo neighborSlipSystems my_compatibilitySum = 0.0_pReal From be099e38c2fcc451b6774ebe3da1b053d899e0f6 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 2 Dec 2019 16:22:27 +0100 Subject: [PATCH 196/233] might be of use --- src/rotations.f90 | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/rotations.f90 b/src/rotations.f90 index e042cff21..cd4a64547 100644 --- a/src/rotations.f90 +++ b/src/rotations.f90 @@ -64,6 +64,7 @@ module rotations procedure, public :: asRodrigues procedure, public :: asMatrix !------------------------------------------ + procedure, public :: fromQuaternion procedure, public :: fromEulers procedure, public :: fromAxisAngle procedure, public :: fromMatrix @@ -157,6 +158,18 @@ end function asHomochoric !--------------------------------------------------------------------------------------------------- ! Initialize rotation from different representations !--------------------------------------------------------------------------------------------------- +subroutine fromQuaternion(self,qu) + + class(rotation), intent(out) :: self + real(pReal), dimension(4), intent(in) :: qu + + if (dNeq(norm2(qu),1.0)) & + call IO_error(402,ext_msg='fromQuaternion') + + self%q = qu + +end subroutine fromQuaternion +!--------------------------------------------------------------------------------------------------- subroutine fromEulers(self,eu,degrees) class(rotation), intent(out) :: self From 83453d10ef25e079c562faed6082e3e13e7fe9bf Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 2 Dec 2019 16:37:22 +0100 Subject: [PATCH 197/233] use rotation class for consistent handling of rotations --- src/grid/DAMASK_grid.f90 | 24 ++++++++++-------------- src/grid/spectral_utilities.f90 | 3 ++- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index e83cf3283..d71dcac18 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -28,7 +28,6 @@ program DAMASK_spectral use grid_damage_spectral use grid_thermal_spectral use results - use rotations implicit none @@ -78,7 +77,6 @@ program DAMASK_spectral character(len=6) :: loadcase_string character(len=1024) :: & incInfo - type(rotation) :: R type(tLoadCase), allocatable, dimension(:) :: loadCases !< array of all load cases type(tLoadCase) :: newLoadCase type(tSolutionState), allocatable, dimension(:) :: solres @@ -189,6 +187,7 @@ program DAMASK_spectral newLoadCase%ID(field) = FIELD_DAMAGE_ID endif damageActive + call newLoadCase%rot%fromEulers(real([0.0,0.0,0.0],pReal)) readIn: do i = 1, chunkPos(1) select case (IO_lc(IO_stringValue(line,chunkPos,i))) case('fdot','dotf','l','f') ! assign values for the deformation BC matrix @@ -244,14 +243,13 @@ program DAMASK_spectral do j = 1, 3 temp_valueVector(j) = IO_floatValue(line,chunkPos,i+k+j) enddo - call R%fromEulers(temp_valueVector(1:3),degrees=(l==1)) - newLoadCase%rotation = R%asMatrix() + call newLoadCase%rot%fromEulers(temp_valueVector(1:3),degrees=(l==1)) case('rotation','rot') ! assign values for the rotation matrix temp_valueVector = 0.0_pReal do j = 1, 9 temp_valueVector(j) = IO_floatValue(line,chunkPos,i+j) enddo - newLoadCase%rotation = math_9to33(temp_valueVector) + call newLoadCase%rot%fromMatrix(math_9to33(temp_valueVector)) end select enddo readIn @@ -295,14 +293,12 @@ program DAMASK_spectral endif enddo; write(6,'(/)',advance='no') enddo - if (any(abs(matmul(newLoadCase%rotation, & - transpose(newLoadCase%rotation))-math_I3) > & - reshape(spread(tol_math_check,1,9),[ 3,3]))& - .or. abs(math_det33(newLoadCase%rotation)) > & - 1.0_pReal + tol_math_check) errorID = 846 ! given rotation matrix contains strain - if (any(dNeq(newLoadCase%rotation, math_I3))) & + if (any(abs(matmul(newLoadCase%rot%asMatrix(), & + transpose(newLoadCase%rot%asMatrix()))-math_I3) > & + reshape(spread(tol_math_check,1,9),[ 3,3]))) errorID = 846 ! given rotation matrix contains strain + if (any(dNeq(newLoadCase%rot%asMatrix(), math_I3))) & write(6,'(2x,a,/,3(3(3x,f12.7,1x)/))',advance='no') 'rotation of loadframe:',& - transpose(newLoadCase%rotation) + transpose(newLoadCase%rot%asMatrix()) if (newLoadCase%time < 0.0_pReal) errorID = 834 ! negative time increment write(6,'(2x,a,f12.6)') 'time: ', newLoadCase%time if (newLoadCase%incs < 1) errorID = 835 ! non-positive incs count @@ -469,7 +465,7 @@ program DAMASK_spectral cutBack,guess,timeinc,timeIncOld,remainingLoadCaseTime, & deformation_BC = loadCases(currentLoadCase)%deformation, & stress_BC = loadCases(currentLoadCase)%stress, & - rotation_BC = loadCases(currentLoadCase)%rotation) + rotation_BC = loadCases(currentLoadCase)%rot%asMatrix()) case(FIELD_THERMAL_ID); call grid_thermal_spectral_forward(cutBack) case(FIELD_DAMAGE_ID); call grid_damage_spectral_forward(cutBack) @@ -488,7 +484,7 @@ program DAMASK_spectral solres(field) = mech_solution (& incInfo,timeinc,timeIncOld, & stress_BC = loadCases(currentLoadCase)%stress, & - rotation_BC = loadCases(currentLoadCase)%rotation) + rotation_BC = loadCases(currentLoadCase)%rot%asMatrix()) case(FIELD_THERMAL_ID) solres(field) = grid_thermal_spectral_solution(timeinc,timeIncOld) diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 8b0e430f3..5107bd900 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -10,6 +10,7 @@ module spectral_utilities use prec use math + use rotations use IO use mesh_grid use numerics @@ -90,7 +91,7 @@ module spectral_utilities end type tBoundaryCondition type, public :: tLoadCase - real(pReal), dimension (3,3) :: rotation = math_I3 !< rotation of BC + type(rotation) :: rot !< rotation of BC type(tBoundaryCondition) :: stress, & !< stress BC deformation !< deformation BC (Fdot or L) real(pReal) :: time = 0.0_pReal !< length of increment From 8a9d3f8d6d48d579714b39d5901a44e70c732797 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 2 Dec 2019 20:06:58 +0100 Subject: [PATCH 198/233] avoid code duplication --- src/grid/DAMASK_grid.f90 | 4 +-- src/grid/grid_mech_FEM.f90 | 13 ++++----- src/grid/grid_mech_spectral_basic.f90 | 21 ++++++++------- src/grid/grid_mech_spectral_polarisation.f90 | 28 +++++++++++--------- src/grid/spectral_utilities.f90 | 3 ++- src/math.f90 | 14 ---------- src/rotations.f90 | 2 +- 7 files changed, 38 insertions(+), 47 deletions(-) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index d71dcac18..51c97456b 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -465,7 +465,7 @@ program DAMASK_spectral cutBack,guess,timeinc,timeIncOld,remainingLoadCaseTime, & deformation_BC = loadCases(currentLoadCase)%deformation, & stress_BC = loadCases(currentLoadCase)%stress, & - rotation_BC = loadCases(currentLoadCase)%rot%asMatrix()) + rotation_BC = loadCases(currentLoadCase)%rot) case(FIELD_THERMAL_ID); call grid_thermal_spectral_forward(cutBack) case(FIELD_DAMAGE_ID); call grid_damage_spectral_forward(cutBack) @@ -484,7 +484,7 @@ program DAMASK_spectral solres(field) = mech_solution (& incInfo,timeinc,timeIncOld, & stress_BC = loadCases(currentLoadCase)%stress, & - rotation_BC = loadCases(currentLoadCase)%rot%asMatrix()) + rotation_BC = loadCases(currentLoadCase)%rot) case(FIELD_THERMAL_ID) solres(field) = grid_thermal_spectral_solution(timeinc,timeIncOld) diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 0c3844fcf..be79af835 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -242,7 +242,8 @@ function grid_mech_FEM_solution(incInfoIn,timeinc,timeinc_old,stress_BC,rotation timeinc_old !< time increment of last successful increment type(tBoundaryCondition), intent(in) :: & stress_BC - real(pReal), dimension(3,3), intent(in) :: rotation_BC + type(rotation), intent(in) :: & + rotation_BC type(tSolutionState) :: & solution !-------------------------------------------------------------------------------------------------- @@ -254,7 +255,7 @@ function grid_mech_FEM_solution(incInfoIn,timeinc,timeinc_old,stress_BC,rotation !-------------------------------------------------------------------------------------------------- ! update stiffness (and gamma operator) - S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg) + S = utilities_maskedCompliance(rotation_BC%asMatrix(),stress_BC%maskLogical,C_volAvg) !-------------------------------------------------------------------------------------------------- ! set module wide available data params%stress_mask = stress_BC%maskFloat @@ -297,7 +298,7 @@ subroutine grid_mech_FEM_forward(cutBack,guess,timeinc,timeinc_old,loadCaseTime, type(tBoundaryCondition), intent(in) :: & stress_BC, & deformation_BC - real(pReal), dimension(3,3), intent(in) :: & + type(rotation), intent(in) :: & rotation_BC PetscErrorCode :: ierr PetscScalar, pointer, dimension(:,:,:,:) :: & @@ -482,7 +483,7 @@ subroutine formResidual(da_local,x_local, & trim(incInfo), ' @ Iteration ', itmin, '≤',totalIter+1, '≤', itmax if (iand(debug_level(debug_spectral),debug_spectralRotation) /= 0) & write(6,'(/,a,/,3(3(f12.7,1x)/))',advance='no') & - ' deformation gradient aim (lab) =', transpose(math_rotate_backward33(F_aim,params%rotation_BC)) + ' deformation gradient aim (lab) =', transpose(params%rotation_BC%rotTensor2(F_aim,active=.true.)) write(6,'(/,a,/,3(3(f12.7,1x)/))',advance='no') & ' deformation gradient aim =', transpose(F_aim) flush(6) @@ -498,7 +499,7 @@ subroutine formResidual(da_local,x_local, & x_elem(ctr,1:3) = x_scal(0:2,i+ii,j+jj,k+kk) enddo; enddo; enddo ii = i-xstart+1; jj = j-ystart+1; kk = k-zstart+1 - F(1:3,1:3,ii,jj,kk) = math_rotate_backward33(F_aim,params%rotation_BC) + transpose(matmul(BMat,x_elem)) + F(1:3,1:3,ii,jj,kk) = params%rotation_BC%rotTensor2(F_aim,active=.true.) + transpose(matmul(BMat,x_elem)) enddo; enddo; enddo call DMDAVecRestoreArrayF90(da_local,x_local,x_scal,ierr);CHKERRQ(ierr) @@ -506,7 +507,7 @@ subroutine formResidual(da_local,x_local, & ! evaluate constitutive response call Utilities_constitutiveResponse(P_current,& P_av,C_volAvg,devNull, & - F,params%timeinc,params%rotation_BC) + F,params%timeinc,params%rotation_BC%asMatrix()) call MPI_Allreduce(MPI_IN_PLACE,terminallyIll,1,MPI_LOGICAL,MPI_LOR,PETSC_COMM_WORLD,ierr) !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 3dc978dc6..74b56db61 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -212,7 +212,8 @@ function grid_mech_spectral_basic_solution(incInfoIn,timeinc,timeinc_old,stress_ timeinc_old !< time increment of last successful increment type(tBoundaryCondition), intent(in) :: & stress_BC - real(pReal), dimension(3,3), intent(in) :: rotation_BC + type(rotation), intent(in) :: & + rotation_BC type(tSolutionState) :: & solution !-------------------------------------------------------------------------------------------------- @@ -224,7 +225,7 @@ function grid_mech_spectral_basic_solution(incInfoIn,timeinc,timeinc_old,stress_ !-------------------------------------------------------------------------------------------------- ! update stiffness (and gamma operator) - S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg) + S = utilities_maskedCompliance(rotation_BC%asMatrix(),stress_BC%maskLogical,C_volAvg) if(num%update_gamma) call utilities_updateGamma(C_minMaxAvg) !-------------------------------------------------------------------------------------------------- @@ -269,7 +270,7 @@ subroutine grid_mech_spectral_basic_forward(cutBack,guess,timeinc,timeinc_old,lo type(tBoundaryCondition), intent(in) :: & stress_BC, & deformation_BC - real(pReal), dimension(3,3), intent(in) :: & + type(rotation), intent(in) :: & rotation_BC PetscErrorCode :: ierr PetscScalar, dimension(:,:,:,:), pointer :: F @@ -299,9 +300,9 @@ subroutine grid_mech_spectral_basic_forward(cutBack,guess,timeinc,timeinc_old,lo F_aimDot + deformation_BC%maskFloat * (deformation_BC%values - F_aim_lastInc)/loadCaseTime endif - Fdot = utilities_calculateRate(guess, & - F_lastInc,reshape(F,[3,3,grid(1),grid(2),grid3]),timeinc_old, & - math_rotate_backward33(F_aimDot,rotation_BC)) + Fdot = utilities_calculateRate(guess, & + F_lastInc,reshape(F,[3,3,grid(1),grid(2),grid3]),timeinc_old, & + rotation_BC%rotTensor2(F_aimDot,active=.true.)) F_lastInc = reshape(F,[3,3,grid(1),grid(2),grid3]) materialpoint_F0 = reshape(F, [3,3,1,product(grid(1:2))*grid3]) @@ -311,7 +312,7 @@ subroutine grid_mech_spectral_basic_forward(cutBack,guess,timeinc,timeinc_old,lo ! update average and local deformation gradients F_aim = F_aim_lastInc + F_aimDot * timeinc F = reshape(Utilities_forwardField(timeinc,F_lastInc,Fdot, & ! estimate of F at end of time+timeinc that matches rotated F_aim on average - math_rotate_backward33(F_aim,rotation_BC)),[9,grid(1),grid(2),grid3]) + rotation_BC%rotTensor2(F_aim,active=.true.)),[9,grid(1),grid(2),grid3]) call DMDAVecRestoreArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) end subroutine grid_mech_spectral_basic_forward @@ -446,7 +447,7 @@ subroutine formResidual(in, F, & trim(incInfo), ' @ Iteration ', itmin, '≤',totalIter, '≤', itmax if (iand(debug_level(debug_spectral),debug_spectralRotation) /= 0) & write(6,'(/,a,/,3(3(f12.7,1x)/))',advance='no') & - ' deformation gradient aim (lab) =', transpose(math_rotate_backward33(F_aim,params%rotation_BC)) + ' deformation gradient aim (lab) =', transpose(params%rotation_BC%rotTensor2(F_aim,active=.true.)) write(6,'(/,a,/,3(3(f12.7,1x)/))',advance='no') & ' deformation gradient aim =', transpose(F_aim) flush(6) @@ -456,7 +457,7 @@ subroutine formResidual(in, F, & ! evaluate constitutive response call utilities_constitutiveResponse(residuum, & ! "residuum" gets field of first PK stress (to save memory) P_av,C_volAvg,C_minMaxAvg, & - F,params%timeinc,params%rotation_BC) + F,params%timeinc,params%rotation_BC%asMatrix()) call MPI_Allreduce(MPI_IN_PLACE,terminallyIll,1,MPI_LOGICAL,MPI_LOR,PETSC_COMM_WORLD,ierr) !-------------------------------------------------------------------------------------------------- @@ -471,7 +472,7 @@ subroutine formResidual(in, F, & tensorField_real(1:3,1:3,1:grid(1),1:grid(2),1:grid3) = residuum ! store fPK field for subsequent FFT forward transform call utilities_FFTtensorForward ! FFT forward of global "tensorField_real" err_div = Utilities_divergenceRMS() ! divRMS of tensorField_fourier for later use - call utilities_fourierGammaConvolution(math_rotate_backward33(deltaF_aim,params%rotation_BC)) ! convolution of Gamma and tensorField_fourier, with arg + call utilities_fourierGammaConvolution(params%rotation_BC%rotTensor2(deltaF_aim,active=.true.)) ! convolution of Gamma and tensorField_fourier call utilities_FFTtensorBackward ! FFT backward of global tensorField_fourier !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index c1b5d79c9..5c5a9f10c 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -14,6 +14,7 @@ module grid_mech_spectral_polarisation use DAMASK_interface use HDF5_utilities use math + use rotations use spectral_utilities use IO use FEsolving @@ -222,12 +223,13 @@ function grid_mech_spectral_polarisation_solution(incInfoIn,timeinc,timeinc_old, ! input data for solution character(len=*), intent(in) :: & incInfoIn - real(pReal), intent(in) :: & + real(pReal), intent(in) :: & timeinc, & !< time increment of current solution timeinc_old !< time increment of last successful increment type(tBoundaryCondition), intent(in) :: & stress_BC - real(pReal), dimension(3,3), intent(in) :: rotation_BC + type(rotation), intent(in) :: & + rotation_BC type(tSolutionState) :: & solution !-------------------------------------------------------------------------------------------------- @@ -239,7 +241,7 @@ function grid_mech_spectral_polarisation_solution(incInfoIn,timeinc,timeinc_old, !-------------------------------------------------------------------------------------------------- ! update stiffness (and gamma operator) - S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg) + S = utilities_maskedCompliance(rotation_BC%asMatrix(),stress_BC%maskLogical,C_volAvg) if (num%update_gamma) then call utilities_updateGamma(C_minMaxAvg) C_scale = C_minMaxAvg @@ -288,7 +290,7 @@ subroutine grid_mech_spectral_polarisation_forward(cutBack,guess,timeinc,timeinc type(tBoundaryCondition), intent(in) :: & stress_BC, & deformation_BC - real(pReal), dimension(3,3), intent(in) ::& + type(rotation), intent(in) :: & rotation_BC PetscErrorCode :: ierr PetscScalar, dimension(:,:,:,:), pointer :: FandF_tau, F, F_tau @@ -324,10 +326,10 @@ subroutine grid_mech_spectral_polarisation_forward(cutBack,guess,timeinc,timeinc Fdot = utilities_calculateRate(guess, & F_lastInc,reshape(F,[3,3,grid(1),grid(2),grid3]),timeinc_old, & - math_rotate_backward33(F_aimDot,rotation_BC)) + rotation_BC%rotTensor2(F_aimDot,active=.true.)) F_tauDot = utilities_calculateRate(guess, & F_tau_lastInc,reshape(F_tau,[3,3,grid(1),grid(2),grid3]), timeinc_old, & - math_rotate_backward33(F_aimDot,rotation_BC)) + rotation_BC%rotTensor2(F_aimDot,active=.true.)) F_lastInc = reshape(F, [3,3,grid(1),grid(2),grid3]) F_tau_lastInc = reshape(F_tau,[3,3,grid(1),grid(2),grid3]) @@ -338,7 +340,7 @@ subroutine grid_mech_spectral_polarisation_forward(cutBack,guess,timeinc,timeinc ! update average and local deformation gradients F_aim = F_aim_lastInc + F_aimDot * timeinc F = reshape(utilities_forwardField(timeinc,F_lastInc,Fdot, & ! estimate of F at end of time+timeinc that matches rotated F_aim on average - math_rotate_backward33(F_aim,rotation_BC)),& + rotation_BC%rotTensor2(F_aim,active=.true.)),& [9,grid(1),grid(2),grid3]) if (guess) then F_tau = reshape(Utilities_forwardField(timeinc,F_tau_lastInc,F_taudot), & @@ -349,8 +351,8 @@ subroutine grid_mech_spectral_polarisation_forward(cutBack,guess,timeinc,timeinc F_lambda33 = math_mul3333xx33(S_scale,matmul(F_lambda33, & math_mul3333xx33(C_scale,& matmul(transpose(F_lambda33),& - F_lambda33)-math_I3))*0.5_pReal)& - + math_I3 + F_lambda33)-math_I3))*0.5_pReal) & + + math_I3 F_tau(1:9,i,j,k) = reshape(F_lambda33,[9])+F(1:9,i,j,k) enddo; enddo; enddo endif @@ -514,7 +516,7 @@ subroutine formResidual(in, FandF_tau, & trim(incInfo), ' @ Iteration ', itmin, '≤',totalIter, '≤', itmax if (iand(debug_level(debug_spectral),debug_spectralRotation) /= 0) & write(6,'(/,a,/,3(3(f12.7,1x)/))',advance='no') & - ' deformation gradient aim (lab) =', transpose(math_rotate_backward33(F_aim,params%rotation_BC)) + ' deformation gradient aim (lab) =', transpose(params%rotation_BC%rotTensor2(F_aim,active=.true.)) write(6,'(/,a,/,3(3(f12.7,1x)/))',advance='no') & ' deformation gradient aim =', transpose(F_aim) flush(6) @@ -533,7 +535,7 @@ subroutine formResidual(in, FandF_tau, & !-------------------------------------------------------------------------------------------------- ! doing convolution in Fourier space call utilities_FFTtensorForward - call utilities_fourierGammaConvolution(math_rotate_backward33(polarBeta*F_aim,params%rotation_BC)) + call utilities_fourierGammaConvolution(params%rotation_BC%rotTensor2(polarBeta*F_aim,active=.true.)) call utilities_FFTtensorBackward !-------------------------------------------------------------------------------------------------- @@ -544,14 +546,14 @@ subroutine formResidual(in, FandF_tau, & ! evaluate constitutive response call utilities_constitutiveResponse(residual_F, & ! "residuum" gets field of first PK stress (to save memory) P_av,C_volAvg,C_minMaxAvg, & - F - residual_F_tau/polarBeta,params%timeinc,params%rotation_BC) + F - residual_F_tau/polarBeta,params%timeinc,params%rotation_BC%asMatrix()) call MPI_Allreduce(MPI_IN_PLACE,terminallyIll,1,MPI_LOGICAL,MPI_LOR,PETSC_COMM_WORLD,ierr) !-------------------------------------------------------------------------------------------------- ! stress BC handling F_aim = F_aim - math_mul3333xx33(S, ((P_av - params%stress_BC))) ! S = 0.0 for no bc err_BC = maxval(abs((1.0_pReal-params%stress_mask) * math_mul3333xx33(C_scale,F_aim & - -math_rotate_forward33(F_av,params%rotation_BC)) + & + -params%rotation_BC%rotTensor2(F_av)) + & params%stress_mask * (P_av-params%stress_BC))) ! mask = 0.0 for no bc ! calculate divergence tensorField_real = 0.0_pReal diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 5107bd900..7b826033b 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -104,7 +104,8 @@ module spectral_utilities end type tLoadCase type, public :: tSolutionParams !< @todo use here the type definition for a full loadcase - real(pReal), dimension(3,3) :: stress_mask, stress_BC, rotation_BC + real(pReal), dimension(3,3) :: stress_mask, stress_BC + type(rotation) :: rotation_BC real(pReal) :: timeinc real(pReal) :: timeincOld end type tSolutionParams diff --git a/src/math.f90 b/src/math.f90 index 6b83e17a3..bac2f8192 100644 --- a/src/math.f90 +++ b/src/math.f90 @@ -1315,20 +1315,6 @@ pure function math_rotate_forward33(tensor,R) end function math_rotate_forward33 -!-------------------------------------------------------------------------------------------------- -!> @brief rotate 33 tensor backward -!> @details deprecated -!-------------------------------------------------------------------------------------------------- -pure function math_rotate_backward33(tensor,R) - - real(pReal), dimension(3,3) :: math_rotate_backward33 - real(pReal), dimension(3,3), intent(in) :: tensor, R - - math_rotate_backward33 = matmul(transpose(R),matmul(tensor,R)) - -end function math_rotate_backward33 - - !-------------------------------------------------------------------------------------------------- !> @brief rotate 3333 tensor C'_ijkl=g_im*g_jn*g_ko*g_lp*C_mnop !> @details deprecated diff --git a/src/rotations.f90 b/src/rotations.f90 index cd4a64547..a4a0bac88 100644 --- a/src/rotations.f90 +++ b/src/rotations.f90 @@ -163,7 +163,7 @@ subroutine fromQuaternion(self,qu) class(rotation), intent(out) :: self real(pReal), dimension(4), intent(in) :: qu - if (dNeq(norm2(qu),1.0)) & + if (dNeq(norm2(qu),1.0_pReal)) & call IO_error(402,ext_msg='fromQuaternion') self%q = qu From f5292019e5820c0f7f9a3f43c342560e12e66368 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 2 Dec 2019 20:23:50 +0100 Subject: [PATCH 199/233] use rotation class --- src/grid/grid_mech_FEM.f90 | 7 ++-- src/grid/grid_mech_spectral_basic.f90 | 7 ++-- src/grid/grid_mech_spectral_polarisation.f90 | 7 ++-- src/grid/spectral_utilities.f90 | 26 ++++++++------- src/math.f90 | 35 -------------------- 5 files changed, 23 insertions(+), 59 deletions(-) diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index be79af835..e87e02d09 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -207,8 +207,7 @@ subroutine grid_mech_FEM_init call utilities_updateCoords(F) call utilities_constitutiveResponse(P_current,temp33_Real,C_volAvg,devNull, & ! stress field, stress avg, global average of stiffness and (min+max)/2 F, & ! target F - 0.0_pReal, & ! time increment - math_I3) ! no rotation of boundary condition + 0.0_pReal) ! time increment call DMDAVecRestoreArrayF90(mech_grid,solution_current,u_current,ierr) CHKERRQ(ierr) call DMDAVecRestoreArrayF90(mech_grid,solution_lastInc,u_lastInc,ierr) @@ -255,7 +254,7 @@ function grid_mech_FEM_solution(incInfoIn,timeinc,timeinc_old,stress_BC,rotation !-------------------------------------------------------------------------------------------------- ! update stiffness (and gamma operator) - S = utilities_maskedCompliance(rotation_BC%asMatrix(),stress_BC%maskLogical,C_volAvg) + S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg) !-------------------------------------------------------------------------------------------------- ! set module wide available data params%stress_mask = stress_BC%maskFloat @@ -507,7 +506,7 @@ subroutine formResidual(da_local,x_local, & ! evaluate constitutive response call Utilities_constitutiveResponse(P_current,& P_av,C_volAvg,devNull, & - F,params%timeinc,params%rotation_BC%asMatrix()) + F,params%timeinc,params%rotation_BC) call MPI_Allreduce(MPI_IN_PLACE,terminallyIll,1,MPI_LOGICAL,MPI_LOR,PETSC_COMM_WORLD,ierr) !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 74b56db61..36caabf90 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -173,8 +173,7 @@ subroutine grid_mech_spectral_basic_init call Utilities_updateCoords(reshape(F,shape(F_lastInc))) call Utilities_constitutiveResponse(P,temp33_Real,C_volAvg,C_minMaxAvg, & ! stress field, stress avg, global average of stiffness and (min+max)/2 reshape(F,shape(F_lastInc)), & ! target F - 0.0_pReal, & ! time increment - math_I3) ! no rotation of boundary condition + 0.0_pReal) ! time increment call DMDAVecRestoreArrayF90(da,solution_vec,F,ierr); CHKERRQ(ierr) ! deassociate pointer restartRead2: if (interface_restartInc > 0) then @@ -225,7 +224,7 @@ function grid_mech_spectral_basic_solution(incInfoIn,timeinc,timeinc_old,stress_ !-------------------------------------------------------------------------------------------------- ! update stiffness (and gamma operator) - S = utilities_maskedCompliance(rotation_BC%asMatrix(),stress_BC%maskLogical,C_volAvg) + S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg) if(num%update_gamma) call utilities_updateGamma(C_minMaxAvg) !-------------------------------------------------------------------------------------------------- @@ -457,7 +456,7 @@ subroutine formResidual(in, F, & ! evaluate constitutive response call utilities_constitutiveResponse(residuum, & ! "residuum" gets field of first PK stress (to save memory) P_av,C_volAvg,C_minMaxAvg, & - F,params%timeinc,params%rotation_BC%asMatrix()) + F,params%timeinc,params%rotation_BC) call MPI_Allreduce(MPI_IN_PLACE,terminallyIll,1,MPI_LOGICAL,MPI_LOR,PETSC_COMM_WORLD,ierr) !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 5c5a9f10c..07d9a5afc 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -187,8 +187,7 @@ subroutine grid_mech_spectral_polarisation_init call Utilities_updateCoords(reshape(F,shape(F_lastInc))) call Utilities_constitutiveResponse(P,temp33_Real,C_volAvg,C_minMaxAvg, & ! stress field, stress avg, global average of stiffness and (min+max)/2 reshape(F,shape(F_lastInc)), & ! target F - 0.0_pReal, & ! time increment - math_I3) ! no rotation of boundary condition + 0.0_pReal) ! time increment call DMDAVecRestoreArrayF90(da,solution_vec,FandF_tau,ierr); CHKERRQ(ierr) ! deassociate pointer restartRead2: if (interface_restartInc > 0) then @@ -241,7 +240,7 @@ function grid_mech_spectral_polarisation_solution(incInfoIn,timeinc,timeinc_old, !-------------------------------------------------------------------------------------------------- ! update stiffness (and gamma operator) - S = utilities_maskedCompliance(rotation_BC%asMatrix(),stress_BC%maskLogical,C_volAvg) + S = utilities_maskedCompliance(rotation_BC,stress_BC%maskLogical,C_volAvg) if (num%update_gamma) then call utilities_updateGamma(C_minMaxAvg) C_scale = C_minMaxAvg @@ -546,7 +545,7 @@ subroutine formResidual(in, FandF_tau, & ! evaluate constitutive response call utilities_constitutiveResponse(residual_F, & ! "residuum" gets field of first PK stress (to save memory) P_av,C_volAvg,C_minMaxAvg, & - F - residual_F_tau/polarBeta,params%timeinc,params%rotation_BC%asMatrix()) + F - residual_F_tau/polarBeta,params%timeinc,params%rotation_BC) call MPI_Allreduce(MPI_IN_PLACE,terminallyIll,1,MPI_LOGICAL,MPI_LOR,PETSC_COMM_WORLD,ierr) !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 7b826033b..a1265556a 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -686,10 +686,11 @@ end function utilities_curlRMS !-------------------------------------------------------------------------------------------------- function utilities_maskedCompliance(rot_BC,mask_stress,C) - real(pReal), dimension(3,3,3,3) :: utilities_maskedCompliance !< masked compliance - real(pReal), intent(in) , dimension(3,3,3,3) :: C !< current average stiffness - real(pReal), intent(in) , dimension(3,3) :: rot_BC !< rotation of load frame - logical, intent(in), dimension(3,3) :: mask_stress !< mask of stress BC + real(pReal), dimension(3,3,3,3) :: utilities_maskedCompliance !< masked compliance + real(pReal), intent(in), dimension(3,3,3,3) :: C !< current average stiffness + type(rotation), intent(in) :: rot_BC !< rotation of load frame + logical, intent(in), dimension(3,3) :: mask_stress !< mask of stress BC + integer :: j, k, m, n logical, dimension(9) :: mask_stressVector real(pReal), dimension(9,9) :: temp99_Real @@ -707,7 +708,7 @@ function utilities_maskedCompliance(rot_BC,mask_stress,C) allocate (c_reduced(size_reduced,size_reduced), source =0.0_pReal) allocate (s_reduced(size_reduced,size_reduced), source =0.0_pReal) allocate (sTimesC(size_reduced,size_reduced), source =0.0_pReal) - temp99_Real = math_3333to99(math_rotate_forward3333(C,rot_BC)) + temp99_Real = math_3333to99(rot_BC%rotTensor4(C)) if(debugGeneral) then write(6,'(/,a)') ' ... updating masked compliance ............................................' @@ -836,12 +837,12 @@ end subroutine utilities_fourierTensorDivergence subroutine utilities_constitutiveResponse(P,P_av,C_volAvg,C_minmaxAvg,& F,timeinc,rotation_BC) - real(pReal),intent(out), dimension(3,3,3,3) :: C_volAvg, C_minmaxAvg !< average stiffness - real(pReal),intent(out), dimension(3,3) :: P_av !< average PK stress - real(pReal),intent(out), dimension(3,3,grid(1),grid(2),grid3) :: P !< PK stress - real(pReal), intent(in), dimension(3,3,grid(1),grid(2),grid3) :: F !< deformation gradient target - real(pReal), intent(in) :: timeinc !< loading time - real(pReal), intent(in), dimension(3,3) :: rotation_BC !< rotation of load frame + real(pReal), intent(out), dimension(3,3,3,3) :: C_volAvg, C_minmaxAvg !< average stiffness + real(pReal), intent(out), dimension(3,3) :: P_av !< average PK stress + real(pReal), intent(out), dimension(3,3,grid(1),grid(2),grid3) :: P !< PK stress + real(pReal), intent(in), dimension(3,3,grid(1),grid(2),grid3) :: F !< deformation gradient target + real(pReal), intent(in) :: timeinc !< loading time + type(rotation), intent(in), optional :: rotation_BC !< rotation of load frame integer :: & @@ -863,7 +864,8 @@ subroutine utilities_constitutiveResponse(P,P_av,C_volAvg,C_minmaxAvg,& if (debugRotation) & write(6,'(/,a,/,3(3(2x,f12.4,1x)/))',advance='no') ' Piola--Kirchhoff stress (lab) / MPa =',& transpose(P_av)*1.e-6_pReal - P_av = math_rotate_forward33(P_av,rotation_BC) + if(present(rotation_BC)) & + P_av = rotation_BC%rotTensor2(P_av) write(6,'(/,a,/,3(3(2x,f12.4,1x)/))',advance='no') ' Piola--Kirchhoff stress / MPa =',& transpose(P_av)*1.e-6_pReal flush(6) diff --git a/src/math.f90 b/src/math.f90 index bac2f8192..0b06c9186 100644 --- a/src/math.f90 +++ b/src/math.f90 @@ -1301,41 +1301,6 @@ real(pReal) pure function math_areaTriangle(v1,v2,v3) end function math_areaTriangle -!-------------------------------------------------------------------------------------------------- -!> @brief rotate 33 tensor forward -!> @details deprecated -!-------------------------------------------------------------------------------------------------- -pure function math_rotate_forward33(tensor,R) - - real(pReal), dimension(3,3) :: math_rotate_forward33 - real(pReal), dimension(3,3), intent(in) :: tensor, R - - math_rotate_forward33 = matmul(R,matmul(tensor,transpose(R))) - -end function math_rotate_forward33 - - -!-------------------------------------------------------------------------------------------------- -!> @brief rotate 3333 tensor C'_ijkl=g_im*g_jn*g_ko*g_lp*C_mnop -!> @details deprecated -!-------------------------------------------------------------------------------------------------- -pure function math_rotate_forward3333(tensor,R) - - real(pReal), dimension(3,3,3,3) :: math_rotate_forward3333 - real(pReal), dimension(3,3), intent(in) :: R - real(pReal), dimension(3,3,3,3), intent(in) :: tensor - integer :: i,j,k,l,m,n,o,p - - math_rotate_forward3333 = 0.0_pReal - do i = 1,3;do j = 1,3;do k = 1,3;do l = 1,3 - do m = 1,3;do n = 1,3;do o = 1,3;do p = 1,3 - math_rotate_forward3333(i,j,k,l) = math_rotate_forward3333(i,j,k,l) & - + R(i,m) * R(j,n) * R(k,o) * R(l,p) * tensor(m,n,o,p) - enddo; enddo; enddo; enddo; enddo; enddo; enddo; enddo - -end function math_rotate_forward3333 - - !-------------------------------------------------------------------------------------------------- !> @brief limits a scalar value to a certain range (either one or two sided) ! Will return NaN if left > right From c36a5bdfbbb4e6a8c7924cee625f768aa654cc30 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 2 Dec 2019 23:06:28 +0100 Subject: [PATCH 200/233] bugfix: calculation of size of postResults was wrong --- src/crystallite.f90 | 5 ++--- src/homogenization.f90 | 8 ++++---- src/plastic_nonlocal.f90 | 7 ------- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/crystallite.f90 b/src/crystallite.f90 index a17213f9e..292241001 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -743,8 +743,7 @@ function crystallite_postResults(ipc, ip, el) ipc !< grain index real(pReal), dimension(1+ & - 1+plasticState(material_phaseAt(ipc,el))%sizePostResults + & - sum(sourceState(material_phaseAt(ipc,el))%p(:)%sizePostResults)) :: & + 1+sum(sourceState(material_phaseAt(ipc,el))%p(:)%sizePostResults)) :: & crystallite_postResults integer :: & c @@ -754,7 +753,7 @@ function crystallite_postResults(ipc, ip, el) crystallite_postResults(1) = 0.0_pReal ! header-like information (length) c = 1 - crystallite_postResults(c+1) = real(plasticState(material_phaseAt(ipc,el))%sizePostResults,pReal) ! size of constitutive results + crystallite_postResults(c+1) = real(sum(sourceState(material_phaseAt(ipc,el))%p(:)%sizePostResults),pReal) ! size of constitutive results c = c + 1 if (size(crystallite_postResults)-c > 0) & crystallite_postResults(c+1:size(crystallite_postResults)) = & diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 618c2faf8..0112f9cf5 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -255,8 +255,8 @@ subroutine homogenization_init thermal_maxSizePostResults = 0 damage_maxSizePostResults = 0 do p = 1,size(config_homogenization) - thermal_maxSizePostResults = max(thermal_maxSizePostResults, thermalState (p)%sizePostResults) - damage_maxSizePostResults = max(damage_maxSizePostResults ,damageState (p)%sizePostResults) + thermal_maxSizePostResults = max(thermal_maxSizePostResults, thermalState(p)%sizePostResults) + damage_maxSizePostResults = max(damage_maxSizePostResults, damageState (p)%sizePostResults) enddo materialpoint_sizeResults = 1 & ! grain count @@ -616,8 +616,8 @@ subroutine materialpoint_postResults grainLooping :do g = 1,myNgrains theSize = 1 + & - 1 + plasticState (material_phaseAt(g,e))%sizePostResults + & - sum(sourceState(material_phaseAt(g,e))%p(:)%sizePostResults) + 1 + & + sum(sourceState(material_phaseAt(g,e))%p(:)%sizePostResults) materialpoint_results(thePos+1:thePos+theSize,i,e) = crystallite_postResults(g,i,e) ! tell crystallite results thePos = thePos + theSize enddo grainLooping diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index 23bfb50aa..2e6734c9d 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -26,13 +26,9 @@ module plastic_nonlocal private real(pReal), parameter, private :: & KB = 1.38e-23_pReal !< Physical parameter, Boltzmann constant in J/Kelvin - - integer, dimension(:,:), allocatable, target, public :: & - plastic_nonlocal_sizePostResult !< size of each post result output character(len=64), dimension(:,:), allocatable, target, public :: & plastic_nonlocal_output !< name of each post result output - ! storage order of dislocation types integer, dimension(8), parameter :: & @@ -268,7 +264,6 @@ subroutine plastic_nonlocal_init allocate(deltaState(maxNinstances)) allocate(microstructure(maxNinstances)) - allocate(plastic_nonlocal_sizePostResult(maxval(phase_Noutput), maxNinstances), source=0) allocate(plastic_nonlocal_output(maxval(phase_Noutput), maxNinstances)) plastic_nonlocal_output = '' allocate(plastic_nonlocal_outputID(maxval(phase_Noutput), maxNinstances), source=undefined_ID) @@ -498,7 +493,6 @@ subroutine plastic_nonlocal_init if (outputID /= undefined_ID) then plastic_nonlocal_output(i,phase_plasticityInstance(p)) = outputs(i) - plastic_nonlocal_sizePostResult(i,phase_plasticityInstance(p)) = prm%totalNslip prm%outputID = [prm%outputID , outputID] endif @@ -524,7 +518,6 @@ subroutine plastic_nonlocal_init prm%totalNslip,0,0) plasticState(p)%nonlocal = .true. plasticState(p)%offsetDeltaState = 0 ! ToDo: state structure does not follow convention - plasticState(p)%sizePostResults = sum(plastic_nonlocal_sizePostResult(:,phase_plasticityInstance(p))) totalNslip(phase_plasticityInstance(p)) = prm%totalNslip From 93da6d3f636bb2d31fbe589cd9af2630266a1e6c Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 2 Dec 2019 23:07:01 +0100 Subject: [PATCH 201/233] was not used --- src/material.f90 | 3 --- src/prec.f90 | 4 ---- 2 files changed, 7 deletions(-) diff --git a/src/material.f90 b/src/material.f90 index 2f70fe97b..8aeab5dec 100644 --- a/src/material.f90 +++ b/src/material.f90 @@ -749,9 +749,6 @@ subroutine material_allocatePlasticState(phase,NofMyPhase,& plasticState(phase)%sizeDotState = sizeDotState plasticState(phase)%sizeDeltaState = sizeDeltaState plasticState(phase)%offsetDeltaState = sizeState-sizeDeltaState ! deltaState occupies latter part of state by definition - plasticState(phase)%Nslip = Nslip - plasticState(phase)%Ntwin = Ntwin - plasticState(phase)%Ntrans= Ntrans allocate(plasticState(phase)%aTolState (sizeState), source=0.0_pReal) allocate(plasticState(phase)%state0 (sizeState,NofMyPhase), source=0.0_pReal) diff --git a/src/prec.f90 b/src/prec.f90 index f0475e9b6..b6d5d4fdf 100644 --- a/src/prec.f90 +++ b/src/prec.f90 @@ -62,10 +62,6 @@ module prec end type type, extends(tState), public :: tPlasticState - integer :: & - nSlip = 0, & - nTwin = 0, & - nTrans = 0 logical :: & nonlocal = .false. real(pReal), pointer, dimension(:,:) :: & From e237d30e993880594011a45c1b2e2a9a32b28096 Mon Sep 17 00:00:00 2001 From: Test User Date: Tue, 3 Dec 2019 13:28:36 +0100 Subject: [PATCH 202/233] [skip ci] updated version information after successful test of v2.0.3-1133-gfede8225 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6464fe0a4..1fe12d401 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-1111-g374980da +v2.0.3-1133-gfede8225 From f5bbd3cf223b32f7090a01f0f2f78b48a3f3341d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 3 Dec 2019 16:39:54 +0100 Subject: [PATCH 203/233] ensure functionality through unit testing --- python/tests/test_Table.py | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 python/tests/test_Table.py diff --git a/python/tests/test_Table.py b/python/tests/test_Table.py new file mode 100644 index 000000000..577de84d2 --- /dev/null +++ b/python/tests/test_Table.py @@ -0,0 +1,46 @@ +import pytest +import numpy as np + +from damask import Table + +@pytest.fixture +def default(): + """Simple Table.""" + x = np.ones(65).reshape((5,13)) + return Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['test data','contains only ones']) + + +class TestTable: + + def test_get_tensor(self,default): + d = default.get_array('F') + assert np.allclose(d,1.0) and d.shape[1:] == (3,3) + + def test_get_vector(self,default): + d = default.get_array('v') + assert np.allclose(d,1.0) and d.shape[1:] == (3,) + + def test_write_read_str(self,default,tmpdir): + default.to_ASCII(str(tmpdir.join('default.txt'))) + new = Table.from_ASCII(str(tmpdir.join('default.txt'))) + assert all(default.data==new.data) + + def test_write_read_file(self,default,tmpdir): + with open(tmpdir.join('default.txt'),'w') as f: + default.to_ASCII(f) + with open(tmpdir.join('default.txt')) as f: + new = Table.from_ASCII(f) + assert all(default.data==new.data) + + def test_set_array(self,default): + default.set_array('F',np.zeros((5,3,3)),'set to zero') + d=default.get_array('F') + assert np.allclose(d,0.0) and d.shape[1:] == (3,3) + + def test_get_labels(self,default): + assert default.get_labels() == ['F','v','s'] + + def test_add_array(self,default): + d = np.random.random((5,9)) + default.add_array('nine',d,'random data') + assert np.allclose(d,default.get_array('nine')) From d92d503b3c63b0d5178320e467fc40d377dce4c4 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 3 Dec 2019 16:49:27 +0100 Subject: [PATCH 204/233] pytest should be part of the test suite --- .gitlab-ci.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 47cb2810c..6e82561c5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,7 @@ --- stages: - prepareAll + - python - preprocessing - postprocessing - compilePETSc @@ -103,6 +104,16 @@ checkout: - master - release +################################################################################################### +Pytest: + stage: python + script: + - cd $DAMASKROOT/python + - pytest + except: + - master + - release + ################################################################################################### OrientationRelationship: stage: preprocessing From 3effea8e1d046af30c033f064353052146ef9b41 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 3 Dec 2019 17:03:03 +0100 Subject: [PATCH 205/233] also check operations that should NOT work --- python/tests/test_Table.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/python/tests/test_Table.py b/python/tests/test_Table.py index 577de84d2..801df0392 100644 --- a/python/tests/test_Table.py +++ b/python/tests/test_Table.py @@ -6,7 +6,7 @@ from damask import Table @pytest.fixture def default(): """Simple Table.""" - x = np.ones(65).reshape((5,13)) + x = np.ones((5,13)) return Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['test data','contains only ones']) @@ -44,3 +44,14 @@ class TestTable: d = np.random.random((5,9)) default.add_array('nine',d,'random data') assert np.allclose(d,default.get_array('nine')) + + + def test_invalid_initialization(self,default): + x = default.get_array('v') + with pytest.raises(IndexError): + Table(x,{'F':(3,3)}) + + def test_invalid_set(self,default): + x = default.get_array('v') + with pytest.raises(ValueError): + default.set_array('F',x,'does not work') From fecd4632b45f9949542306cfd311d9c001269550 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 4 Dec 2019 05:49:17 +0100 Subject: [PATCH 206/233] correct reporting of time --- python/damask/dadf5.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index d03617752..4790a1b38 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -333,8 +333,8 @@ class DADF5(): """Return information on all active datasets in the file.""" message = '' with h5py.File(self.filename,'r') as f: - for s,i in enumerate(self.iter_visible('increments')): - message+='\n{} ({}s)\n'.format(i,self.times[s]) + for i in self.iter_visible('increments'): + message+='\n{} ({}s)\n'.format(i,self.times[self.increments.index(i)]) for o,p in zip(['constituents','materialpoints'],['con_physics','mat_physics']): for oo in self.iter_visible(o): message+=' {}\n'.format(oo) From 32ebcea207d23c10c76b8fa97a5fc1b0a281b500 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 4 Dec 2019 05:49:43 +0100 Subject: [PATCH 207/233] more tests --- python/tests/test_DADF5.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/python/tests/test_DADF5.py b/python/tests/test_DADF5.py index 5a6478f03..37c5a9e87 100644 --- a/python/tests/test_DADF5.py +++ b/python/tests/test_DADF5.py @@ -42,6 +42,22 @@ class TestDADF5: in_file = default.read_dataset(loc['sigma'],0) assert np.allclose(in_memory,in_file) + def test_add_determinant(self,default): + default.add_determinant('P') + loc = {'P': default.get_dataset_location('P'), + 'det(P)':default.get_dataset_location('det(P)')} + in_memory = np.linalg.det(default.read_dataset(loc['P'],0)) + in_file = default.read_dataset(loc['det(P)'],0) + assert np.allclose(in_memory,in_file) + + def test_add_norm(self,default): + default.add_norm('F',1) + loc = {'F': default.get_dataset_location('F'), + '|F|_1':default.get_dataset_location('|F|_1')} + in_memory = np.linalg.norm(default.read_dataset(loc['F'],0),ord=1,axis=(1,2),keepdims=True) + in_file = default.read_dataset(loc['|F|_1'],0) + assert np.allclose(in_memory,in_file) + def test_add_absolute(self,default): default.add_absolute('Fe') loc = {'Fe': default.get_dataset_location('Fe'), From 6c31e228553a3c453fba8905ed70f12a939307ea Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 4 Dec 2019 05:59:52 +0100 Subject: [PATCH 208/233] testing new style DADF5 file --- .../DADF5/12grains6x7x8_tensionY.hdf5 | Bin 1935952 -> 1935528 bytes python/tests/test_DADF5.py | 8 +++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/python/tests/reference/DADF5/12grains6x7x8_tensionY.hdf5 b/python/tests/reference/DADF5/12grains6x7x8_tensionY.hdf5 index caafce4784e2e9e3f29f8bd6dcad4e338a238153..39c17fadb5cc8fe724606eda02d7a62ac7ee8c6b 100644 GIT binary patch delta 19434 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 z

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 diff --git a/python/tests/test_DADF5.py b/python/tests/test_DADF5.py index 37c5a9e87..1dd93d003 100644 --- a/python/tests/test_DADF5.py +++ b/python/tests/test_DADF5.py @@ -23,7 +23,13 @@ def reference_dir(reference_dir_base): class TestDADF5: - + + def test_time_increments(self,default): + shape = default.read_dataset(default.get_dataset_location('F'),0).shape + default.set_by_time(0.0,20.0) + for i in default.iter_visible('increments'): + assert shape == default.read_dataset(default.get_dataset_location('F'),0).shape + def test_add_deviator(self,default): default.add_deviator('P') loc = {'P' :default.get_dataset_location('P'), From 6902d3dd0add631fda7dede02030bcfd59c94a4b Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 4 Dec 2019 06:04:06 +0100 Subject: [PATCH 209/233] repeated test better sort alphabetically --- python/tests/test_DADF5.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/python/tests/test_DADF5.py b/python/tests/test_DADF5.py index 1dd93d003..2235321b5 100644 --- a/python/tests/test_DADF5.py +++ b/python/tests/test_DADF5.py @@ -72,14 +72,6 @@ class TestDADF5: in_file = default.read_dataset(loc['|Fe|'],0) assert np.allclose(in_memory,in_file) - def test_add_determinant(self,default): - default.add_determinant('P') - loc = {'P': default.get_dataset_location('P'), - 'det(P)': default.get_dataset_location('det(P)')} - in_memory = np.linalg.det(default.read_dataset(loc['P'],0)).reshape(-1,1) - in_file = default.read_dataset(loc['det(P)'],0) - assert np.allclose(in_memory,in_file) - def test_add_spherical(self,default): default.add_spherical('P') loc = {'P': default.get_dataset_location('P'), From 285075bb6b35a0e6083223109fa0b056f19f8196 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 4 Dec 2019 06:15:32 +0100 Subject: [PATCH 210/233] ordered alphabetically --- python/damask/dadf5.py | 332 ++++++++++++++++++------------------- python/tests/test_DADF5.py | 33 ++-- 2 files changed, 183 insertions(+), 182 deletions(-) diff --git a/python/damask/dadf5.py b/python/damask/dadf5.py index 4790a1b38..5c23636db 100644 --- a/python/damask/dadf5.py +++ b/python/damask/dadf5.py @@ -437,6 +437,76 @@ class DADF5(): else: with h5py.File(self.filename,'r') as f: return f['geometry/x_c'][()] + + + def add_absolute(self,x): + """ + Add absolute value. + + Parameters + ---------- + x : str + Label of the dataset containing a scalar, vector, or tensor. + + """ + def __add_absolute(x): + + return { + 'data': np.abs(x['data']), + 'label': '|{}|'.format(x['label']), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': 'Absolute value of {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_abs v{}'.format(version) + } + } + + requested = [{'label':x,'arg':'x'}] + + self.__add_generic_pointwise(__add_absolute,requested) + + + def add_calculation(self,formula,label,unit='n/a',description=None,vectorized=True): + """ + Add result of a general formula. + + Parameters + ---------- + formula : str + Formula, refer to datasets by ‘#Label#‘. + label : str + Label of the dataset containing the result of the calculation. + unit : str, optional + Physical unit of the result. + description : str, optional + Human readable description of the result. + vectorized : bool, optional + Indicate whether the formula is written in vectorized form. Default is ‘True’. + + """ + if vectorized is not True: + raise NotImplementedError + + def __add_calculation(**kwargs): + + formula = kwargs['formula'] + for d in re.findall(r'#(.*?)#',formula): + formula = formula.replace('#{}#'.format(d),"kwargs['{}']['data']".format(d)) + + return { + 'data': eval(formula), + 'label': kwargs['label'], + 'meta': { + 'Unit': kwargs['unit'], + 'Description': '{} (formula: {})'.format(kwargs['description'],kwargs['formula']), + 'Creator': 'dadf5.py:add_calculation v{}'.format(version) + } + } + + requested = [{'label':d,'arg':d} for d in set(re.findall(r'#(.*?)#',formula))] # datasets used in the formula + pass_through = {'formula':formula,'label':label,'unit':unit,'description':description} + + self.__add_generic_pointwise(__add_calculation,requested,pass_through) def add_Cauchy(self,P='P',F='F'): @@ -470,6 +540,90 @@ class DADF5(): self.__add_generic_pointwise(__add_Cauchy,requested) + def add_determinant(self,x): + """ + Add the determinant of a tensor. + + Parameters + ---------- + x : str + Label of the dataset containing a tensor. + + """ + def __add_determinant(x): + + return { + 'data': np.linalg.det(x['data']), + 'label': 'det({})'.format(x['label']), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': 'Determinant of tensor {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_determinant v{}'.format(version) + } + } + + requested = [{'label':x,'arg':'x'}] + + self.__add_generic_pointwise(__add_determinant,requested) + + + def add_deviator(self,x): + """ + Add the deviatoric part of a tensor. + + Parameters + ---------- + x : str + Label of the dataset containing a tensor. + + """ + def __add_deviator(x): + + if not np.all(np.array(x['data'].shape[1:]) == np.array([3,3])): + raise ValueError + + return { + 'data': mechanics.deviatoric_part(x['data']), + 'label': 's_{}'.format(x['label']), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': 'Deviator of tensor {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_deviator v{}'.format(version) + } + } + + requested = [{'label':x,'arg':'x'}] + + self.__add_generic_pointwise(__add_deviator,requested) + + + def add_maximum_shear(self,x): + """ + Add maximum shear components of symmetric tensor. + + Parameters + ---------- + x : str + Label of the dataset containing a symmetric tensor. + + """ + def __add_maximum_shear(x): + + return { + 'data': mechanics.maximum_shear(x['data']), + 'label': 'max_shear({})'.format(x['label']), + 'meta': { + 'Unit': x['meta']['Unit'], + 'Description': 'Maximum shear component of of {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_maximum_shear v{}'.format(version) + } + } + + requested = [{'label':x,'arg':'x'}] + + self.__add_generic_pointwise(__add_maximum_shear,requested) + + def add_Mises(self,x): """ Add the equivalent Mises stress or strain of a symmetric tensor. @@ -540,58 +694,33 @@ class DADF5(): self.__add_generic_pointwise(__add_norm,requested,{'ord':ord}) - def add_absolute(self,x): + def add_principal_components(self,x): """ - Add absolute value. - + Add principal components of symmetric tensor. + + The principal components are sorted in descending order, each repeated according to its multiplicity. + Parameters ---------- x : str - Label of the dataset containing a scalar, vector, or tensor. + Label of the dataset containing a symmetric tensor. """ - def __add_absolute(x): + def __add_principal_components(x): return { - 'data': np.abs(x['data']), - 'label': '|{}|'.format(x['label']), + 'data': mechanics.principal_components(x['data']), + 'label': 'lambda_{}'.format(x['label']), 'meta': { 'Unit': x['meta']['Unit'], - 'Description': 'Absolute value of {} ({})'.format(x['label'],x['meta']['Description']), - 'Creator': 'dadf5.py:add_abs v{}'.format(version) + 'Description': 'Pricipal components of {} ({})'.format(x['label'],x['meta']['Description']), + 'Creator': 'dadf5.py:add_principal_components v{}'.format(version) } } requested = [{'label':x,'arg':'x'}] - - self.__add_generic_pointwise(__add_absolute,requested) - - def add_determinant(self,x): - """ - Add the determinant of a tensor. - - Parameters - ---------- - x : str - Label of the dataset containing a tensor. - - """ - def __add_determinant(x): - - return { - 'data': np.linalg.det(x['data']), - 'label': 'det({})'.format(x['label']), - 'meta': { - 'Unit': x['meta']['Unit'], - 'Description': 'Determinant of tensor {} ({})'.format(x['label'],x['meta']['Description']), - 'Creator': 'dadf5.py:add_determinant v{}'.format(version) - } - } - - requested = [{'label':x,'arg':'x'}] - - self.__add_generic_pointwise(__add_determinant,requested) + self.__add_generic_pointwise(__add_principal_components,requested) def add_spherical(self,x): @@ -624,79 +753,6 @@ class DADF5(): self.__add_generic_pointwise(__add_spherical,requested) - def add_deviator(self,x): - """ - Add the deviatoric part of a tensor. - - Parameters - ---------- - x : str - Label of the dataset containing a tensor. - - """ - def __add_deviator(x): - - if not np.all(np.array(x['data'].shape[1:]) == np.array([3,3])): - raise ValueError - - return { - 'data': mechanics.deviatoric_part(x['data']), - 'label': 's_{}'.format(x['label']), - 'meta': { - 'Unit': x['meta']['Unit'], - 'Description': 'Deviator of tensor {} ({})'.format(x['label'],x['meta']['Description']), - 'Creator': 'dadf5.py:add_deviator v{}'.format(version) - } - } - - requested = [{'label':x,'arg':'x'}] - - self.__add_generic_pointwise(__add_deviator,requested) - - - def add_calculation(self,formula,label,unit='n/a',description=None,vectorized=True): - """ - Add result of a general formula. - - Parameters - ---------- - formula : str - Formula, refer to datasets by ‘#Label#‘. - label : str - Label of the dataset containing the result of the calculation. - unit : str, optional - Physical unit of the result. - description : str, optional - Human readable description of the result. - vectorized : bool, optional - Indicate whether the formula is written in vectorized form. Default is ‘True’. - - """ - if vectorized is not True: - raise NotImplementedError - - def __add_calculation(**kwargs): - - formula = kwargs['formula'] - for d in re.findall(r'#(.*?)#',formula): - formula = formula.replace('#{}#'.format(d),"kwargs['{}']['data']".format(d)) - - return { - 'data': eval(formula), - 'label': kwargs['label'], - 'meta': { - 'Unit': kwargs['unit'], - 'Description': '{} (formula: {})'.format(kwargs['description'],kwargs['formula']), - 'Creator': 'dadf5.py:add_calculation v{}'.format(version) - } - } - - requested = [{'label':d,'arg':d} for d in set(re.findall(r'#(.*?)#',formula))] # datasets used in the formula - pass_through = {'formula':formula,'label':label,'unit':unit,'description':description} - - self.__add_generic_pointwise(__add_calculation,requested,pass_through) - - def add_strain_tensor(self,F='F',t='U',m=0): """ Add strain tensor calculated from a deformation gradient. @@ -729,62 +785,6 @@ class DADF5(): requested = [{'label':F,'arg':'F'}] self.__add_generic_pointwise(__add_strain_tensor,requested,{'t':t,'m':m}) - - - def add_principal_components(self,x): - """ - Add principal components of symmetric tensor. - - The principal components are sorted in descending order, each repeated according to its multiplicity. - - Parameters - ---------- - x : str - Label of the dataset containing a symmetric tensor. - - """ - def __add_principal_components(x): - - return { - 'data': mechanics.principal_components(x['data']), - 'label': 'lambda_{}'.format(x['label']), - 'meta': { - 'Unit': x['meta']['Unit'], - 'Description': 'Pricipal components of {} ({})'.format(x['label'],x['meta']['Description']), - 'Creator': 'dadf5.py:add_principal_components v{}'.format(version) - } - } - - requested = [{'label':x,'arg':'x'}] - - self.__add_generic_pointwise(__add_principal_components,requested) - - - def add_maximum_shear(self,x): - """ - Add maximum shear components of symmetric tensor. - - Parameters - ---------- - x : str - Label of the dataset containing a symmetric tensor. - - """ - def __add_maximum_shear(x): - - return { - 'data': mechanics.maximum_shear(x['data']), - 'label': 'max_shear({})'.format(x['label']), - 'meta': { - 'Unit': x['meta']['Unit'], - 'Description': 'Maximum shear component of of {} ({})'.format(x['label'],x['meta']['Description']), - 'Creator': 'dadf5.py:add_maximum_shear v{}'.format(version) - } - } - - requested = [{'label':x,'arg':'x'}] - - self.__add_generic_pointwise(__add_maximum_shear,requested) def __add_generic_pointwise(self,func,datasets_requested,extra_args={}): diff --git a/python/tests/test_DADF5.py b/python/tests/test_DADF5.py index 2235321b5..8aa8ec174 100644 --- a/python/tests/test_DADF5.py +++ b/python/tests/test_DADF5.py @@ -28,14 +28,15 @@ class TestDADF5: shape = default.read_dataset(default.get_dataset_location('F'),0).shape default.set_by_time(0.0,20.0) for i in default.iter_visible('increments'): - assert shape == default.read_dataset(default.get_dataset_location('F'),0).shape + assert shape == default.read_dataset(default.get_dataset_location('F'),0).shape - def test_add_deviator(self,default): - default.add_deviator('P') - loc = {'P' :default.get_dataset_location('P'), - 's_P':default.get_dataset_location('s_P')} - in_memory = mechanics.deviatoric_part(default.read_dataset(loc['P'],0)) - in_file = default.read_dataset(loc['s_P'],0) + + def test_add_absolute(self,default): + default.add_absolute('Fe') + loc = {'Fe': default.get_dataset_location('Fe'), + '|Fe|': default.get_dataset_location('|Fe|')} + in_memory = np.abs(default.read_dataset(loc['Fe'],0)) + in_file = default.read_dataset(loc['|Fe|'],0) assert np.allclose(in_memory,in_file) def test_add_Cauchy(self,default): @@ -52,10 +53,18 @@ class TestDADF5: default.add_determinant('P') loc = {'P': default.get_dataset_location('P'), 'det(P)':default.get_dataset_location('det(P)')} - in_memory = np.linalg.det(default.read_dataset(loc['P'],0)) + in_memory = np.linalg.det(default.read_dataset(loc['P'],0)).reshape((-1,1)) in_file = default.read_dataset(loc['det(P)'],0) assert np.allclose(in_memory,in_file) + def test_add_deviator(self,default): + default.add_deviator('P') + loc = {'P' :default.get_dataset_location('P'), + 's_P':default.get_dataset_location('s_P')} + in_memory = mechanics.deviatoric_part(default.read_dataset(loc['P'],0)) + in_file = default.read_dataset(loc['s_P'],0) + assert np.allclose(in_memory,in_file) + def test_add_norm(self,default): default.add_norm('F',1) loc = {'F': default.get_dataset_location('F'), @@ -64,14 +73,6 @@ class TestDADF5: in_file = default.read_dataset(loc['|F|_1'],0) assert np.allclose(in_memory,in_file) - def test_add_absolute(self,default): - default.add_absolute('Fe') - loc = {'Fe': default.get_dataset_location('Fe'), - '|Fe|': default.get_dataset_location('|Fe|')} - in_memory = np.abs(default.read_dataset(loc['Fe'],0)) - in_file = default.read_dataset(loc['|Fe|'],0) - assert np.allclose(in_memory,in_file) - def test_add_spherical(self,default): default.add_spherical('P') loc = {'P': default.get_dataset_location('P'), From 07e97787985281a7394fcc88c75ad226c2880f72 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 4 Dec 2019 10:20:03 +0100 Subject: [PATCH 211/233] one more test --- python/tests/test_Table.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/tests/test_Table.py b/python/tests/test_Table.py index 801df0392..c34f9ee3a 100644 --- a/python/tests/test_Table.py +++ b/python/tests/test_Table.py @@ -55,3 +55,7 @@ class TestTable: x = default.get_array('v') with pytest.raises(ValueError): default.set_array('F',x,'does not work') + + def test_invalid_get_array(self,default): + with pytest.raises(KeyError): + default.get_array('n') From 19c55990ab7d3f61071e86e65c0eb7685d4646a2 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 4 Dec 2019 18:30:08 +0100 Subject: [PATCH 212/233] works again and uses DADF5 intrisic features --- processing/post/DADF5toDREAM3D.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/processing/post/DADF5toDREAM3D.py b/processing/post/DADF5toDREAM3D.py index 885545297..7ab04b934 100755 --- a/processing/post/DADF5toDREAM3D.py +++ b/processing/post/DADF5toDREAM3D.py @@ -49,7 +49,7 @@ Phase_types = {'Primary': 0} #further additions to these can be done by looking # -------------------------------------------------------------------- parser = argparse.ArgumentParser(description='Creating a file for DREAM3D from DAMASK data') parser.add_argument('filenames',nargs='+',help='HDF5 based output file') -parser.add_argument('--inc',nargs='+',help='Increment for which DREAM3D to be used, eg. 00025',type=int) +parser.add_argument('--inc',nargs='+',help='Increment for which DREAM3D to be used, eg. 25',type=int) parser.add_argument('-d','--dir', dest='dir',default='postProc',metavar='string', help='name of subdirectory to hold output') @@ -59,15 +59,13 @@ options = parser.parse_args() # loop over input files for filename in options.filenames: f = damask.DADF5(filename) #DAMASK output file - count = 0 - for increment in f.increments: - if int(increment[3:]) not in options.inc: - count = count + 1 + for increment in options.inc: + f.set_by_increment(increment,increment) + if len(f.visible['increments']) == 0: continue #-------output file creation------------------------------------- dirname = os.path.abspath(os.path.join(os.path.dirname(filename),options.dir)) - print(dirname) try: os.mkdir(dirname) except FileExistsError: @@ -90,11 +88,10 @@ for filename in options.filenames: # Phase information of DREAM.3D is constituent ID in DAMASK o[cell_data_label + '/Phases'] = f.get_constituent_ID().reshape(tuple(f.grid)+(1,)) # Data quaternions - DAMASK_quaternion = f.read_dataset(f.get_dataset_location('orientation'),0) - DREAM_3D_quaternion = np.empty((np.prod(f.grid),4),dtype=np.float32) + DAMASK_quaternion = f.read_dataset(f.get_dataset_location('orientation')) # Convert: DAMASK uses P = -1, DREAM.3D uses P = +1. Also change position of imagninary part DREAM_3D_quaternion = np.hstack((-DAMASK_quaternion['x'],-DAMASK_quaternion['y'],-DAMASK_quaternion['z'], - DAMASK_quaternion['w'])) + DAMASK_quaternion['w'])).astype(np.float32) o[cell_data_label + '/Quats'] = DREAM_3D_quaternion.reshape(tuple(f.grid)+(4,)) # Attributes to CellData group @@ -109,12 +106,14 @@ for filename in options.filenames: # phase attributes o[cell_data_label + '/Phases'].attrs['ComponentDimensions'] = np.array([1],np.uint64) o[cell_data_label + '/Phases'].attrs['ObjectType'] = 'DataArray' + o[cell_data_label + '/Phases'].attrs['TupleDimensions'] = f.grid.astype(np.uint64) # Quats attributes o[cell_data_label + '/Quats'].attrs['ComponentDimensions'] = np.array([4],np.uint64) o[cell_data_label + '/Quats'].attrs['ObjectType'] = 'DataArray' - - # Create EnsembleAttributeMatrix + o[cell_data_label + '/Quats'].attrs['TupleDimensions'] = f.grid.astype(np.uint64) + + # Create EnsembleAttributeMatrix ensemble_label = data_container_label + '/EnsembleAttributeMatrix' # Data CrystalStructures From cb0d39eee6cb806e14eb2b3382a24611a4162ed5 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 4 Dec 2019 19:00:56 +0100 Subject: [PATCH 213/233] not needed anymore --- src/plastic_nonlocal.f90 | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/src/plastic_nonlocal.f90 b/src/plastic_nonlocal.f90 index 5469515dc..5a3f8c173 100644 --- a/src/plastic_nonlocal.f90 +++ b/src/plastic_nonlocal.f90 @@ -24,13 +24,10 @@ module plastic_nonlocal implicit none private - real(pReal), parameter, private :: & + real(pReal), parameter :: & KB = 1.38e-23_pReal !< Physical parameter, Boltzmann constant in J/Kelvin - - integer, dimension(:,:), allocatable, target, public :: & - plastic_nonlocal_sizePostResult !< size of each post result output - character(len=64), dimension(:,:), allocatable, target, public :: & + character(len=64), dimension(:,:), allocatable :: & plastic_nonlocal_output !< name of each post result output @@ -54,18 +51,18 @@ module plastic_nonlocal mob_scr_neg = 4 !< mobile screw positive ! BEGIN DEPRECATES - integer, dimension(:,:,:), allocatable, private :: & + integer, dimension(:,:,:), allocatable :: & iRhoU, & !< state indices for unblocked density iRhoB, & !< state indices for blocked density iRhoD, & !< state indices for dipole density iV, & !< state indices for dislcation velocities iD !< state indices for stable dipole height - integer, dimension(:), allocatable, private, protected :: & + integer, dimension(:), allocatable :: & totalNslip !< total number of active slip systems for each instance !END DEPRECATED - real(pReal), dimension(:,:,:,:,:,:), allocatable, private :: & - compatibility !< slip system compatibility between me and my neighbors + real(pReal), dimension(:,:,:,:,:,:), allocatable :: & + compatibility !< slip system compatibility between me and my neighbors enum, bind(c) enumerator :: & @@ -93,7 +90,7 @@ module plastic_nonlocal gamma_ID end enum - type, private :: tParameters !< container type for internal constitutive parameters + type :: tParameters !< container type for internal constitutive parameters real(pReal) :: & atomicVolume, & !< atomic volume Dsd0, & !< prefactor for self-diffusion coefficient @@ -143,19 +140,19 @@ module plastic_nonlocal interactionSlipSlip ,& !< coefficients for slip-slip interaction forestProjection_Edge, & !< matrix of forest projections of edge dislocations forestProjection_Screw !< matrix of forest projections of screw dislocations - real(pReal), dimension(:), allocatable, private :: & + real(pReal), dimension(:), allocatable :: & nonSchmidCoeff - real(pReal), dimension(:,:,:), allocatable, private :: & + real(pReal), dimension(:,:,:), allocatable :: & Schmid, & !< Schmid contribution nonSchmid_pos, & nonSchmid_neg !< combined projection of Schmid and non-Schmid contributions to the resolved shear stress (only for screws) integer :: & totalNslip - integer, dimension(:) ,allocatable , public:: & + integer, dimension(:) ,allocatable :: & Nslip,& colinearSystem !< colinear system to the active slip system (only valid for fcc!) - logical, private :: & + logical :: & shortRangeStressCorrection, & !< flag indicating the use of the short range stress correction by a excess density gradient term probabilisticMultiplication @@ -164,13 +161,13 @@ module plastic_nonlocal end type tParameters - type, private :: tNonlocalMicrostructure + type :: tNonlocalMicrostructure real(pReal), allocatable, dimension(:,:) :: & tau_pass, & tau_Back end type tNonlocalMicrostructure - type, private :: tNonlocalState + type :: tNonlocalState real(pReal), pointer, dimension(:,:) :: & rho, & ! < all dislocations rhoSgl, & @@ -196,16 +193,16 @@ module plastic_nonlocal v_scr_neg end type tNonlocalState - type(tNonlocalState), allocatable, dimension(:), private :: & + type(tNonlocalState), allocatable, dimension(:) :: & deltaState, & dotState, & state - type(tParameters), dimension(:), allocatable, private :: param !< containers of constitutive parameters (len Ninstance) + type(tParameters), dimension(:), allocatable :: param !< containers of constitutive parameters (len Ninstance) - type(tNonlocalMicrostructure), dimension(:), allocatable, private :: microstructure + type(tNonlocalMicrostructure), dimension(:), allocatable :: microstructure - integer(kind(undefined_ID)), dimension(:,:), allocatable, private :: & + integer(kind(undefined_ID)), dimension(:,:), allocatable :: & plastic_nonlocal_outputID !< ID of each post result output public :: & @@ -268,7 +265,6 @@ subroutine plastic_nonlocal_init allocate(deltaState(maxNinstances)) allocate(microstructure(maxNinstances)) - allocate(plastic_nonlocal_sizePostResult(maxval(phase_Noutput), maxNinstances), source=0) allocate(plastic_nonlocal_output(maxval(phase_Noutput), maxNinstances)) plastic_nonlocal_output = '' allocate(plastic_nonlocal_outputID(maxval(phase_Noutput), maxNinstances), source=undefined_ID) @@ -498,7 +494,6 @@ subroutine plastic_nonlocal_init if (outputID /= undefined_ID) then plastic_nonlocal_output(i,phase_plasticityInstance(p)) = outputs(i) - plastic_nonlocal_sizePostResult(i,phase_plasticityInstance(p)) = prm%totalNslip prm%outputID = [prm%outputID , outputID] endif @@ -524,7 +519,6 @@ subroutine plastic_nonlocal_init prm%totalNslip,0,0) plasticState(p)%nonlocal = .true. plasticState(p)%offsetDeltaState = 0 ! ToDo: state structure does not follow convention - plasticState(p)%sizePostResults = sum(plastic_nonlocal_sizePostResult(:,phase_plasticityInstance(p))) totalNslip(phase_plasticityInstance(p)) = prm%totalNslip From 1c835725896b93fdd48c64a3aa87a5dccc3d240c Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 05:00:26 +0100 Subject: [PATCH 214/233] more descriptive names --- python/damask/table.py | 60 +++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/python/damask/table.py b/python/damask/table.py index 7d9e65961..bb195122d 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -6,40 +6,40 @@ import numpy as np class Table(): """Store spreadsheet-like data.""" - def __init__(self,array,headings,comments=None): + def __init__(self,data,shapes,comments=None): """ - New spreadsheet data. + New spreadsheet. Parameters ---------- - array : numpy.ndarray + data : numpy.ndarray Data. - headings : dict - Column headings. Labels as keys and shape as tuple. Example 'F':(3,3) for a deformation gradient. + shapes : dict with str:tuple pairs + Shapes of the columns. Example 'F':(3,3) for a deformation gradient. comments : iterable of str, optional - Additional, human-readable information + Additional, human-readable information. """ - self.data = pd.DataFrame(data=array) + self.data = pd.DataFrame(data=data) - d = {} + labels = {} i = 0 - for label in headings: - for components in range(np.prod(headings[label])): - d[i] = label + for label in shapes.keys(): + for components in range(np.prod(shapes[label])): + labels[i] = label i+=1 if i != self.data.shape[1]: - raise IndexError('Mismatch between array shape and headings') + raise IndexError('Shape mismatch between shapes and data') - self.data.rename(columns=d,inplace=True) + self.data.rename(columns=labels,inplace=True) if comments is None: self.comments = [] else: self.comments = [c for c in comments] - self.headings = headings + self.shapes = shapes @staticmethod def from_ASCII(fname): @@ -47,8 +47,8 @@ class Table(): Create table from ASCII file. The first line needs to indicate the number of subsequent header lines as 'n header'. - Vector data labels are indicated by '1_v, 2_v, ..., n_v'. - Tensor data labels are indicated by '3x3:1_T, 3x3:2_T, ..., 3x3:9_T'. + Vector data column labels are indicated by '1_v, 2_v, ..., n_v'. + Tensor data column labels are indicated by '3x3:1_T, 3x3:2_T, ..., 3x3:9_T'. Parameters ---------- @@ -69,20 +69,20 @@ class Table(): comments = [f.readline()[:-1] for i in range(header-1)] labels = f.readline().split() - headings = {} + shapes = {} for label in labels: tensor_column = re.search(r'[0-9,x]*?:[0-9]*?_',label) if tensor_column: my_shape = tensor_column.group().split(':',1)[0].split('x') - headings[label.split('_',1)[1]] = tuple([int(d) for d in my_shape]) + shapes[label.split('_',1)[1]] = tuple([int(d) for d in my_shape]) else: vector_column = re.match(r'[0-9]*?_',label) if vector_column: - headings[label.split('_',1)[1]] = (int(label.split('_',1)[0]),) + shapes[label.split('_',1)[1]] = (int(label.split('_',1)[0]),) else: - headings[label]=(1,) + shapes[label]=(1,) - return Table(np.loadtxt(f),headings,comments) + return Table(np.loadtxt(f),shapes,comments) def get_array(self,label): """ @@ -98,7 +98,7 @@ class Table(): idx,key = label.split('_',1) return self.data[key].to_numpy()[:,int(idx)-1] else: - return self.data[label].to_numpy().reshape((-1,)+self.headings[label]) + return self.data[label].to_numpy().reshape((-1,)+self.shapes[label]) def set_array(self,label,array,info): """ @@ -129,7 +129,7 @@ class Table(): def get_labels(self): """Return the labels of all columns.""" - return [label for label in self.headings] + return list(self.shapes.keys()) def add_array(self,label,array,info): """ @@ -150,7 +150,7 @@ class Table(): else: self.comments.append('{} {}: {}'.format(label,array.shape[1:],info)) - self.headings[label] = array.shape[1:] if len(array.shape) > 1 else (1,) + self.shapes[label] = array.shape[1:] if len(array.shape) > 1 else (1,) size = np.prod(array.shape[1:],dtype=int) new_data = pd.DataFrame(data=array.reshape(-1,size), columns=[label for l in range(size)]) @@ -167,15 +167,15 @@ class Table(): """ labels = [] - for l in self.headings: - if(self.headings[l] == (1,)): + for l in self.shapes: + if(self.shapes[l] == (1,)): labels.append('{}'.format(l)) - elif(len(self.headings[l]) == 1): + elif(len(self.shapes[l]) == 1): labels+=['{}_{}'.format(i+1,l)\ - for i in range(self.headings[l][0])] + for i in range(self.shapes[l][0])] else: - labels+=['{}:{}_{}'.format('x'.join([str(d) for d in self.headings[l]]),i+1,l)\ - for i in range(np.prod(self.headings[l],dtype=int))] + labels+=['{}:{}_{}'.format('x'.join([str(d) for d in self.shapes[l]]),i+1,l)\ + for i in range(np.prod(self.shapes[l],dtype=int))] header = ['{} header'.format(len(self.comments)+1)]\ + self.comments\ From 5fdf112f78de93711a5bd03fa11163c9d6536587 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 05:45:27 +0100 Subject: [PATCH 215/233] allow strings as data in ASCII file --- python/damask/table.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python/damask/table.py b/python/damask/table.py index bb195122d..140665ab2 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -82,7 +82,10 @@ class Table(): else: shapes[label]=(1,) - return Table(np.loadtxt(f),shapes,comments) + data = pd.read_csv(f,names=[i for i in range(len(labels))],sep='\s+').to_numpy() + + return Table(data,shapes,comments) + def get_array(self,label): """ From 2172e92e7e2457633afc43fd9cd6740e14b9eafe Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 05:57:47 +0100 Subject: [PATCH 216/233] test exotic input files --- python/tests/reference/Table/datatype-mix.txt | 4 ++++ python/tests/reference/Table/whitespace-mix.txt | 6 ++++++ python/tests/test_Table.py | 12 ++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 python/tests/reference/Table/datatype-mix.txt create mode 100644 python/tests/reference/Table/whitespace-mix.txt diff --git a/python/tests/reference/Table/datatype-mix.txt b/python/tests/reference/Table/datatype-mix.txt new file mode 100644 index 000000000..2f6baa852 --- /dev/null +++ b/python/tests/reference/Table/datatype-mix.txt @@ -0,0 +1,4 @@ +1 header +a b +1.0 hallo +0.1 "hallo test" diff --git a/python/tests/reference/Table/whitespace-mix.txt b/python/tests/reference/Table/whitespace-mix.txt new file mode 100644 index 000000000..933a16e77 --- /dev/null +++ b/python/tests/reference/Table/whitespace-mix.txt @@ -0,0 +1,6 @@ +1 header +a b 1_c 2_c +1 2 3 4 +5 6 7 8 +9 10. 12. 12 + diff --git a/python/tests/test_Table.py b/python/tests/test_Table.py index c34f9ee3a..e7550984d 100644 --- a/python/tests/test_Table.py +++ b/python/tests/test_Table.py @@ -1,14 +1,21 @@ +import os + import pytest import numpy as np from damask import Table + @pytest.fixture def default(): """Simple Table.""" x = np.ones((5,13)) return Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['test data','contains only ones']) +@pytest.fixture +def reference_dir(reference_dir_base): + """Directory containing reference results.""" + return os.path.join(reference_dir_base,'Table') class TestTable: @@ -31,6 +38,11 @@ class TestTable: with open(tmpdir.join('default.txt')) as f: new = Table.from_ASCII(f) assert all(default.data==new.data) + + @pytest.mark.parametrize('fname',['datatype-mix.txt','whitespace-mix.txt']) + def test_read_strange(self,reference_dir,fname): + with open(os.path.join(reference_dir,fname)) as f: + new = Table.from_ASCII(f) def test_set_array(self,default): default.set_array('F',np.zeros((5,3,3)),'set to zero') From e7a67262f809eacf6af7b8286740c861d5159bb2 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 06:00:49 +0100 Subject: [PATCH 217/233] clear enough --- python/damask/table.py | 2 +- python/tests/test_Table.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/damask/table.py b/python/damask/table.py index 140665ab2..56507847e 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -130,7 +130,7 @@ class Table(): self.data[label] = array.reshape(self.data[label].shape) - def get_labels(self): + def labels(self): """Return the labels of all columns.""" return list(self.shapes.keys()) diff --git a/python/tests/test_Table.py b/python/tests/test_Table.py index e7550984d..c8965d1bd 100644 --- a/python/tests/test_Table.py +++ b/python/tests/test_Table.py @@ -49,8 +49,8 @@ class TestTable: d=default.get_array('F') assert np.allclose(d,0.0) and d.shape[1:] == (3,3) - def test_get_labels(self,default): - assert default.get_labels() == ['F','v','s'] + def test_labels(self,default): + assert default.labels() == ['F','v','s'] def test_add_array(self,default): d = np.random.random((5,9)) From ee8e3386f4db6fea6b14926595a2f8c38a902750 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 06:10:27 +0100 Subject: [PATCH 218/233] shorter but still descriptive names --- processing/post/addCauchy.py | 8 ++-- processing/post/addDeterminant.py | 6 +-- processing/post/addDeviator.py | 12 +++--- processing/post/addMises.py | 12 +++--- processing/post/addPK2.py | 8 ++-- processing/post/scaleData.py | 5 ++- processing/post/shiftData.py | 5 ++- python/damask/table.py | 71 ++++++++++++++++--------------- python/tests/test_Table.py | 26 +++++------ 9 files changed, 79 insertions(+), 74 deletions(-) diff --git a/processing/post/addCauchy.py b/processing/post/addCauchy.py index ad29792a6..afc5a57be 100755 --- a/processing/post/addCauchy.py +++ b/processing/post/addCauchy.py @@ -41,9 +41,9 @@ for name in filenames: damask.util.report(scriptName,name) table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) - table.add_array('Cauchy', - damask.mechanics.Cauchy(table.get_array(options.defgrad).reshape(-1,3,3), - table.get_array(options.stress).reshape(-1,3,3)).reshape(-1,9), - scriptID+' '+' '.join(sys.argv[1:])) + table.add('Cauchy', + damask.mechanics.Cauchy(table.get(options.defgrad).reshape(-1,3,3), + table.get(options.stress ).reshape(-1,3,3)).reshape(-1,9), + scriptID+' '+' '.join(sys.argv[1:])) table.to_ASCII(sys.stdout if name is None else name) diff --git a/processing/post/addDeterminant.py b/processing/post/addDeterminant.py index 4c3f9d260..f2368559d 100755 --- a/processing/post/addDeterminant.py +++ b/processing/post/addDeterminant.py @@ -38,8 +38,8 @@ for name in filenames: table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) for tensor in options.tensor: - table.add_array('det({})'.format(tensor), - np.linalg.det(table.get_array(tensor).reshape(-1,3,3)), - scriptID+' '+' '.join(sys.argv[1:])) + table.add('det({})'.format(tensor), + np.linalg.det(table.get(tensor).reshape(-1,3,3)), + scriptID+' '+' '.join(sys.argv[1:])) table.to_ASCII(sys.stdout if name is None else name) diff --git a/processing/post/addDeviator.py b/processing/post/addDeviator.py index 7807c7f5d..ca06034b3 100755 --- a/processing/post/addDeviator.py +++ b/processing/post/addDeviator.py @@ -40,12 +40,12 @@ for name in filenames: table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) for tensor in options.tensor: - table.add_array('dev({})'.format(tensor), - damask.mechanics.deviatoric_part(table.get_array(tensor).reshape(-1,3,3)).reshape((-1,9)), - scriptID+' '+' '.join(sys.argv[1:])) + table.add('dev({})'.format(tensor), + damask.mechanics.deviatoric_part(table.get(tensor).reshape(-1,3,3)).reshape((-1,9)), + scriptID+' '+' '.join(sys.argv[1:])) if options.spherical: - table.add_array('sph({})'.format(tensor), - damask.mechanics.spherical_part(table.get_array(tensor).reshape(-1,3,3)), - scriptID+' '+' '.join(sys.argv[1:])) + table.add('sph({})'.format(tensor), + damask.mechanics.spherical_part(table.get(tensor).reshape(-1,3,3)), + scriptID+' '+' '.join(sys.argv[1:])) table.to_ASCII(sys.stdout if name is None else name) diff --git a/processing/post/addMises.py b/processing/post/addMises.py index 9bc560f2d..0c2a6db50 100755 --- a/processing/post/addMises.py +++ b/processing/post/addMises.py @@ -45,12 +45,12 @@ for name in filenames: table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) for strain in options.strain: - table.add_array('Mises({})'.format(strain), - damask.mechanics.Mises_strain(damask.mechanics.symmetric(table.get_array(strain).reshape(-1,3,3))), - scriptID+' '+' '.join(sys.argv[1:])) + table.add('Mises({})'.format(strain), + damask.mechanics.Mises_strain(damask.mechanics.symmetric(table.get(strain).reshape(-1,3,3))), + scriptID+' '+' '.join(sys.argv[1:])) for stress in options.stress: - table.add_array('Mises({})'.format(stress), - damask.mechanics.Mises_stress(damask.mechanics.symmetric(table.get_array(stress).reshape(-1,3,3))), - scriptID+' '+' '.join(sys.argv[1:])) + table.add('Mises({})'.format(stress), + damask.mechanics.Mises_stress(damask.mechanics.symmetric(table.get(stress).reshape(-1,3,3))), + scriptID+' '+' '.join(sys.argv[1:])) table.to_ASCII(sys.stdout if name is None else name) diff --git a/processing/post/addPK2.py b/processing/post/addPK2.py index 45afdbcd1..185160d79 100755 --- a/processing/post/addPK2.py +++ b/processing/post/addPK2.py @@ -42,9 +42,9 @@ for name in filenames: table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) - table.add_array('S', - damask.mechanics.PK2(table.get_array(options.defgrad).reshape(-1,3,3), - table.get_array(options.stress).reshape(-1,3,3)).reshape(-1,9), - scriptID+' '+' '.join(sys.argv[1:])) + table.add('S', + damask.mechanics.PK2(table.get(options.defgrad).reshape(-1,3,3), + table.get(options.stress ).reshape(-1,3,3)).reshape(-1,9), + scriptID+' '+' '.join(sys.argv[1:])) table.to_ASCII(sys.stdout if name is None else name) diff --git a/processing/post/scaleData.py b/processing/post/scaleData.py index ad57f4b7e..60ffa41fa 100755 --- a/processing/post/scaleData.py +++ b/processing/post/scaleData.py @@ -44,7 +44,8 @@ for name in filenames: table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) for i,label in enumerate(options.label): - table.set_array(label,table.get_array(label)*float(options.factor[i]), - scriptID+' '+' '.join(sys.argv[1:])) + table.set(label, + table.get(label)*float(options.factor[i]), + scriptID+' '+' '.join(sys.argv[1:])) table.to_ASCII(sys.stdout if name is None else name) diff --git a/processing/post/shiftData.py b/processing/post/shiftData.py index 591e68c5d..37c72919e 100755 --- a/processing/post/shiftData.py +++ b/processing/post/shiftData.py @@ -44,7 +44,8 @@ for name in filenames: table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) for i,label in enumerate(options.label): - table.set_array(label,table.get_array(label)+float(options.offset[i]), - scriptID+' '+' '.join(sys.argv[1:])) + table.set(label, + table.get(label)+float(options.offset[i]), + scriptID+' '+' '.join(sys.argv[1:])) table.to_ASCII(sys.stdout if name is None else name) diff --git a/python/damask/table.py b/python/damask/table.py index 56507847e..171d15084 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -87,14 +87,19 @@ class Table(): return Table(data,shapes,comments) - def get_array(self,label): + def labels(self): + """Return the labels of all columns.""" + return list(self.shapes.keys()) + + + def get(self,label): """ - Return data as array. + Get column data. Parameters ---------- label : str - Label of the array. + Column label. """ if re.match(r'[0-9]*?_',label): @@ -103,62 +108,60 @@ class Table(): else: return self.data[label].to_numpy().reshape((-1,)+self.shapes[label]) - def set_array(self,label,array,info): + def set(self,label,data,info=None): """ - Modify data in the spreadsheet. + Set column data. Parameters ---------- label : str - Label for the new data. - array : np.ndarray + Column label. + data : np.ndarray New data. - info : str + info : str, optional Human-readable information about the new data. """ - if np.prod(array.shape[1:],dtype=int) == 1: - self.comments.append('{}: {}'.format(label,info)) - else: - self.comments.append('{} {}: {}'.format(label,array.shape[1:],info)) + if info is not None: + if np.prod(data.shape[1:],dtype=int) == 1: + self.comments.append('{}: {}'.format(label,info)) + else: + self.comments.append('{} {}: {}'.format(label,data.shape[1:],info)) if re.match(r'[0-9]*?_',label): idx,key = label.split('_',1) iloc = self.data.columns.get_loc(key).tolist().index(True) + int(idx) -1 - self.data.iloc[:,iloc] = array + self.data.iloc[:,iloc] = data else: - self.data[label] = array.reshape(self.data[label].shape) + self.data[label] = data.reshape(self.data[label].shape) - - def labels(self): - """Return the labels of all columns.""" - return list(self.shapes.keys()) - - def add_array(self,label,array,info): + def add(self,label,data,info=None): """ - Add data to the spreadsheet. + Add column data. Parameters ---------- label : str - Label for the new data. - array : np.ndarray - New data. - info : str - Human-readable information about the new data. + Column label. + data : np.ndarray + Modified data. + info : str, optional + Human-readable information about the modified data. """ - if np.prod(array.shape[1:],dtype=int) == 1: - self.comments.append('{}: {}'.format(label,info)) - else: - self.comments.append('{} {}: {}'.format(label,array.shape[1:],info)) + if info is not None: + if np.prod(data.shape[1:],dtype=int) == 1: + self.comments.append('{}: {}'.format(label,info)) + else: + self.comments.append('{} {}: {}'.format(label,data.shape[1:],info)) - self.shapes[label] = array.shape[1:] if len(array.shape) > 1 else (1,) - size = np.prod(array.shape[1:],dtype=int) - new_data = pd.DataFrame(data=array.reshape(-1,size), + self.shapes[label] = data.shape[1:] if len(data.shape) > 1 else (1,) + size = np.prod(data.shape[1:],dtype=int) + new_data = pd.DataFrame(data=data.reshape(-1,size), columns=[label for l in range(size)]) self.data = pd.concat([self.data,new_data],axis=1) - + + def to_ASCII(self,fname): """ Store as plain text file. diff --git a/python/tests/test_Table.py b/python/tests/test_Table.py index c8965d1bd..2fedfdc59 100644 --- a/python/tests/test_Table.py +++ b/python/tests/test_Table.py @@ -20,11 +20,11 @@ def reference_dir(reference_dir_base): class TestTable: def test_get_tensor(self,default): - d = default.get_array('F') + d = default.get('F') assert np.allclose(d,1.0) and d.shape[1:] == (3,3) def test_get_vector(self,default): - d = default.get_array('v') + d = default.get('v') assert np.allclose(d,1.0) and d.shape[1:] == (3,) def test_write_read_str(self,default,tmpdir): @@ -44,30 +44,30 @@ class TestTable: with open(os.path.join(reference_dir,fname)) as f: new = Table.from_ASCII(f) - def test_set_array(self,default): - default.set_array('F',np.zeros((5,3,3)),'set to zero') - d=default.get_array('F') + def test_set(self,default): + default.set('F',np.zeros((5,3,3)),'set to zero') + d=default.get('F') assert np.allclose(d,0.0) and d.shape[1:] == (3,3) def test_labels(self,default): assert default.labels() == ['F','v','s'] - def test_add_array(self,default): + def test_add(self,default): d = np.random.random((5,9)) - default.add_array('nine',d,'random data') - assert np.allclose(d,default.get_array('nine')) + default.add('nine',d,'random data') + assert np.allclose(d,default.get('nine')) def test_invalid_initialization(self,default): - x = default.get_array('v') + x = default.get('v') with pytest.raises(IndexError): Table(x,{'F':(3,3)}) def test_invalid_set(self,default): - x = default.get_array('v') + x = default.get('v') with pytest.raises(ValueError): - default.set_array('F',x,'does not work') + default.set('F',x,'does not work') - def test_invalid_get_array(self,default): + def test_invalid_get(self,default): with pytest.raises(KeyError): - default.get_array('n') + default.get('n') From 469d638afb87c2fa3dc6bc31c2be6df127e42596 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 06:50:06 +0100 Subject: [PATCH 219/233] making table class feature complete --- processing/post/addInfo.py | 29 +++-------------- processing/post/reLabel.py | 64 ++++++-------------------------------- python/damask/table.py | 34 ++++++++++++++++++++ python/tests/test_Table.py | 16 ++++++++++ 4 files changed, 65 insertions(+), 78 deletions(-) diff --git a/processing/post/addInfo.py b/processing/post/addInfo.py index 2d8192cc1..f7a54c3e2 100755 --- a/processing/post/addInfo.py +++ b/processing/post/addInfo.py @@ -24,35 +24,16 @@ parser.add_option('-i', dest = 'info', action = 'extend', metavar = '', help = 'items to add') - (options,filenames) = parser.parse_args() +if filenames == []: filenames = [None] if options.info is None: parser.error('no info specified.') -# --- loop over input files ------------------------------------------------------------------------ - -if filenames == []: filenames = [None] - for name in filenames: - try: table = damask.ASCIItable(name = name, - buffered = False) - except: continue - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) -# ------------------------------------------ assemble header --------------------------------------- + table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) + table.comments += options.info - table.head_read() - table.info_append(options.info) - table.head_write() - -# ------------------------------------------ pass through data ------------------------------------- - - outputAlive = True - - while outputAlive and table.data_read(): # read next data line of ASCII table - outputAlive = table.data_write() # output processed line - -# ------------------------------------------ output finalization ----------------------------------- - - table.close() # close ASCII tables + table.to_ASCII(sys.stdout if name is None else name) diff --git a/processing/post/reLabel.py b/processing/post/reLabel.py index e7ad1f1e9..4bd077586 100755 --- a/processing/post/reLabel.py +++ b/processing/post/reLabel.py @@ -35,62 +35,18 @@ parser.set_defaults(label = [], ) (options,filenames) = parser.parse_args() - -pattern = [re.compile('^()(.+)$'), # label pattern for scalar - re.compile('^(\d+_)?(.+)$'), # label pattern for multidimension - ] - -# --- loop over input files ------------------------------------------------------------------------- - if filenames == []: filenames = [None] +if len(options.label) != len(options.substitute): + parser.error('number of column labels and substitutes do not match.') + for name in filenames: - try: table = damask.ASCIItable(name = name, - buffered = False) - except: continue - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) -# ------------------------------------------ read header ------------------------------------------ + table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) + for i,label in enumerate(options.label): + table.rename(label, + options.substitute[i], + scriptID+' '+' '.join(sys.argv[1:])) - table.head_read() - -# ------------------------------------------ process labels --------------------------------------- - - errors = [] - remarks = [] - - if len(options.label) == 0: - errors.append('no labels specified.') - elif len(options.label) != len(options.substitute): - errors.append('mismatch between number of labels ({}) and substitutes ({}).'.format(len(options.label), - len(options.substitute))) - else: - indices = table.label_index (options.label) - dimensions = table.label_dimension(options.label) - for i,index in enumerate(indices): - if index == -1: remarks.append('label "{}" not present...'.format(options.label[i])) - else: - m = pattern[int(dimensions[i]>1)].match(table.tags[index]) # isolate label name - for j in range(dimensions[i]): - table.tags[index+j] = table.tags[index+j].replace(m.group(2),options.substitute[i]) # replace name with substitute - - if remarks != []: damask.util.croak(remarks) - if errors != []: - damask.util.croak(errors) - table.close(dismiss = True) - continue - -# ------------------------------------------ assemble header --------------------------------------- - - table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.head_write() - -# ------------------------------------------ process data ------------------------------------------ - - outputAlive = True - while outputAlive and table.data_read(): # read next data line of ASCII table - outputAlive = table.data_write() # output processed line - -# ------------------------------------------ output finalization ----------------------------------- - - table.close() # close ASCII tables + table.to_ASCII(sys.stdout if name is None else name) diff --git a/python/damask/table.py b/python/damask/table.py index 171d15084..7d413812d 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -161,6 +161,40 @@ class Table(): columns=[label for l in range(size)]) self.data = pd.concat([self.data,new_data],axis=1) + def delete(self,label): + """ + Delete column data. + + Parameters + ---------- + label : str + Column label. + + """ + self.data.drop(columns=label,inplace=True) + + del self.shapes[label] + + def rename(self,label_old,label_new,info=None): + """ + Rename column data. + + Parameters + ---------- + label_old : str + Old column label. + label_new : str + New column label. + + """ + self.data.rename(columns={label_old:label_new},inplace=True) + + comments = '{} => {}'.format(label_old,label_new) + comments += ': {}'.format(info) if info is not None else '' + self.comments.append(comments) + + self.shapes[label_new] = self.shapes.pop(label_old) + def to_ASCII(self,fname): """ diff --git a/python/tests/test_Table.py b/python/tests/test_Table.py index 2fedfdc59..b628abe9f 100644 --- a/python/tests/test_Table.py +++ b/python/tests/test_Table.py @@ -57,6 +57,22 @@ class TestTable: default.add('nine',d,'random data') assert np.allclose(d,default.get('nine')) + def test_rename_equivalent(self,default): + v = default.get('v') + default.rename('v','u') + u = default.get('u') + assert np.all(v == u) + + def test_rename_gone(self,default): + default.rename('v','V') + with pytest.raises(KeyError): + default.get('v') + + def test_delete(self,default): + default.delete('v') + with pytest.raises(KeyError): + default.get('v') + def test_invalid_initialization(self,default): x = default.get('v') From 3af696995ddcf65d6a8e8f44df248dc7beab3fa5 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 08:35:34 +0100 Subject: [PATCH 220/233] did not work when piping --- processing/post/addInfo.py | 2 ++ processing/post/reLabel.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/processing/post/addInfo.py b/processing/post/addInfo.py index f7a54c3e2..5e32510db 100755 --- a/processing/post/addInfo.py +++ b/processing/post/addInfo.py @@ -1,6 +1,8 @@ #!/usr/bin/env python3 import os +import sys +from io import StringIO from optparse import OptionParser import damask diff --git a/processing/post/reLabel.py b/processing/post/reLabel.py index 4bd077586..85d16acea 100755 --- a/processing/post/reLabel.py +++ b/processing/post/reLabel.py @@ -2,8 +2,8 @@ import os import sys +from io import StringIO from optparse import OptionParser -import re import damask From 1bf4946e677858cceac2d7ac2f3032195e4dea5e Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 08:37:39 +0100 Subject: [PATCH 221/233] invalid escape sequence --- python/damask/table.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/table.py b/python/damask/table.py index 7d413812d..b2be3ae20 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -82,7 +82,7 @@ class Table(): else: shapes[label]=(1,) - data = pd.read_csv(f,names=[i for i in range(len(labels))],sep='\s+').to_numpy() + data = pd.read_csv(f,names=[i for i in range(len(labels))],sep=r'\s+').to_numpy() return Table(data,shapes,comments) From f885748a589239a9e9d64607202423d07c29e315 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 08:43:14 +0100 Subject: [PATCH 222/233] variable was never used --- python/tests/test_Table.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/test_Table.py b/python/tests/test_Table.py index b628abe9f..67bcab557 100644 --- a/python/tests/test_Table.py +++ b/python/tests/test_Table.py @@ -42,7 +42,7 @@ class TestTable: @pytest.mark.parametrize('fname',['datatype-mix.txt','whitespace-mix.txt']) def test_read_strange(self,reference_dir,fname): with open(os.path.join(reference_dir,fname)) as f: - new = Table.from_ASCII(f) + Table.from_ASCII(f) def test_set(self,default): default.set('F',np.zeros((5,3,3)),'set to zero') From 53a38e3a97a2b61d56c857fe3d3970f34f405745 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 10:37:13 +0100 Subject: [PATCH 223/233] polishing --- processing/post/scaleData.py | 6 +++--- processing/post/shiftData.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/processing/post/scaleData.py b/processing/post/scaleData.py index 60ffa41fa..4484c5300 100755 --- a/processing/post/scaleData.py +++ b/processing/post/scaleData.py @@ -22,7 +22,7 @@ Uniformly scale column values by given factor. """, version = scriptID) parser.add_option('-l','--label', - dest = 'label', + dest = 'labels', action = 'extend', metavar = '', help ='column(s) to scale') parser.add_option('-f','--factor', @@ -31,7 +31,7 @@ parser.add_option('-f','--factor', help = 'factor(s) per column') parser.set_defaults(label = [], - ) + factor = []) (options,filenames) = parser.parse_args() if filenames == []: filenames = [None] @@ -43,7 +43,7 @@ for name in filenames: damask.util.report(scriptName,name) table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) - for i,label in enumerate(options.label): + for i,label in enumerate(options.labels): table.set(label, table.get(label)*float(options.factor[i]), scriptID+' '+' '.join(sys.argv[1:])) diff --git a/processing/post/shiftData.py b/processing/post/shiftData.py index 37c72919e..fb2ba48f9 100755 --- a/processing/post/shiftData.py +++ b/processing/post/shiftData.py @@ -22,7 +22,7 @@ Uniformly shift column values by given offset. """, version = scriptID) parser.add_option('-l','--label', - dest = 'label', + dest = 'labels', action = 'extend', metavar = '', help ='column(s) to shift') parser.add_option('-o','--offset', @@ -31,7 +31,7 @@ parser.add_option('-o','--offset', help = 'offset(s) per column') parser.set_defaults(label = [], - ) + offset = []) (options,filenames) = parser.parse_args() if filenames == []: filenames = [None] @@ -43,7 +43,7 @@ for name in filenames: damask.util.report(scriptName,name) table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) - for i,label in enumerate(options.label): + for i,label in enumerate(options.labels): table.set(label, table.get(label)+float(options.offset[i]), scriptID+' '+' '.join(sys.argv[1:])) From 1018b892960692b26f30655c652822309a01a82e Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 10:47:36 +0100 Subject: [PATCH 224/233] nice to have.. --- processing/post/sortTable.py | 45 +++++++----------------------------- python/damask/table.py | 29 ++++++++++++++++++++++- python/tests/test_Table.py | 38 +++++++++++++++++++++++++++--- 3 files changed, 71 insertions(+), 41 deletions(-) diff --git a/processing/post/sortTable.py b/processing/post/sortTable.py index 53a357226..3a3738d18 100755 --- a/processing/post/sortTable.py +++ b/processing/post/sortTable.py @@ -2,10 +2,9 @@ import os import sys +from io import StringIO from optparse import OptionParser -import numpy as np - import damask @@ -26,7 +25,7 @@ With coordinates in columns "x", "y", and "z"; sorting with x slowest and z fast parser.add_option('-l','--label', - dest = 'keys', + dest = 'labels', action = 'extend', metavar = '', help = 'list of column labels (a,b,c,...)') parser.add_option('-r','--reverse', @@ -38,42 +37,14 @@ parser.set_defaults(reverse = False, ) (options,filenames) = parser.parse_args() - - -# --- loop over input files ------------------------------------------------------------------------- - if filenames == []: filenames = [None] +if options.labels is None: + parser.error('no labels specified.') for name in filenames: - try: table = damask.ASCIItable(name = name, - buffered = False) - except: continue - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) -# ------------------------------------------ assemble header --------------------------------------- + table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) + table.sort_by(options.labels,not options.reverse) - table.head_read() - table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.head_write() - -# ------------------------------------------ process data --------------------------------------- - - table.data_readArray() - - keys = table.labels(raw = True)[::-1] if options.keys is None else options.keys[::-1] # numpy sorts with most significant column as last - - cols = [] - remarks = [] - for i,column in enumerate(table.label_index(keys)): - if column < 0: remarks.append('label "{}" not present...'.format(keys[i])) - else: cols += [table.data[:,column]] - if remarks != []: damask.util.croak(remarks) - - ind = np.lexsort(cols) if cols != [] else np.arange(table.data.shape[0]) - if options.reverse: ind = ind[::-1] - -# ------------------------------------------ output result --------------------------------------- - - table.data = table.data[ind] - table.data_writeArray() - table.close() # close ASCII table + table.to_ASCII(sys.stdout if name is None else name) diff --git a/python/damask/table.py b/python/damask/table.py index b2be3ae20..3c867fcf5 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -1,3 +1,4 @@ +import random import re import pandas as pd @@ -104,7 +105,7 @@ class Table(): """ if re.match(r'[0-9]*?_',label): idx,key = label.split('_',1) - return self.data[key].to_numpy()[:,int(idx)-1] + return self.data[key].to_numpy()[:,int(idx)-1].reshape((-1,1)) else: return self.data[label].to_numpy().reshape((-1,)+self.shapes[label]) @@ -196,6 +197,32 @@ class Table(): self.shapes[label_new] = self.shapes.pop(label_old) + def sort_by(self,labels,ascending=True): + """ + Get column data. + + Parameters + ---------- + label : list of str or str + Column labels. + ascending : bool, optional + Set sort order. + + """ + _temp = [] + _labels = [] + for label in labels if isinstance(labels,list) else [labels]: + if re.match(r'[0-9]*?_',label): + _temp.append(str(random.getrandbits(128))) + self.add(_temp[-1],self.get(label)) + _labels.append(_temp[-1]) + else: + _labels.append(label) + + self.data.sort_values(_labels,axis=0,inplace=True,ascending=ascending) + for t in _temp: self.delete(t) + self.comments.append('sorted by [{}]'.format(', '.join(labels))) + def to_ASCII(self,fname): """ Store as plain text file. diff --git a/python/tests/test_Table.py b/python/tests/test_Table.py index 67bcab557..b17348881 100644 --- a/python/tests/test_Table.py +++ b/python/tests/test_Table.py @@ -19,13 +19,21 @@ def reference_dir(reference_dir_base): class TestTable: - def test_get_tensor(self,default): - d = default.get('F') - assert np.allclose(d,1.0) and d.shape[1:] == (3,3) + def test_get_scalar(self,default): + d = default.get('s') + assert np.allclose(d,1.0) and d.shape[1:] == (1,) def test_get_vector(self,default): d = default.get('v') assert np.allclose(d,1.0) and d.shape[1:] == (3,) + + def test_get_tensor(self,default): + d = default.get('F') + assert np.allclose(d,1.0) and d.shape[1:] == (3,3) + + def test_get_component(self,default): + d = default.get('5_F') + assert np.allclose(d,1.0) and d.shape[1:] == (1,) def test_write_read_str(self,default,tmpdir): default.to_ASCII(str(tmpdir.join('default.txt'))) @@ -87,3 +95,27 @@ class TestTable: def test_invalid_get(self,default): with pytest.raises(KeyError): default.get('n') + + def test_sort_scalar(self): + x = np.random.random((5,13)) + t = Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['random test data']) + unsort = t.get('s') + t.sort_by('s') + sort = t.get('s') + assert np.all(np.sort(unsort,0)==sort) + + def test_sort_component(self): + x = np.random.random((5,12)) + t = Table(x,{'F':(3,3),'v':(3,)},['random test data']) + unsort = t.get('4_F') + t.sort_by('4_F') + sort = t.get('4_F') + assert np.all(np.sort(unsort,0)==sort) + + def test_sort_revert(self): + x = np.random.random((5,12)) + t = Table(x,{'F':(3,3),'v':(3,)},['random test data']) + t.sort_by('4_F',False) + sort = t.get('4_F') + assert np.all(np.sort(sort,0)==sort[::-1,:]) + From f585e1a5535575a4f81d5eef7a8a9c90da969ec4 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 11:20:05 +0100 Subject: [PATCH 225/233] not used --- src/source_thermal_dissipation.f90 | 10 ---------- src/source_thermal_externalheat.f90 | 19 +++---------------- 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/src/source_thermal_dissipation.f90 b/src/source_thermal_dissipation.f90 index 9b18efef5..0d16a9171 100644 --- a/src/source_thermal_dissipation.f90 +++ b/src/source_thermal_dissipation.f90 @@ -18,12 +18,6 @@ module source_thermal_dissipation source_thermal_dissipation_offset, & !< which source is my current thermal dissipation mechanism? source_thermal_dissipation_instance !< instance of thermal dissipation source mechanism - integer, dimension(:,:), allocatable, target, public :: & - source_thermal_dissipation_sizePostResult !< size of each post result output - - character(len=64), dimension(:,:), allocatable, target, public :: & - source_thermal_dissipation_output !< name of each post result output - type :: tParameters !< container type for internal constitutive parameters real(pReal) :: & kappa @@ -68,10 +62,6 @@ subroutine source_thermal_dissipation_init enddo enddo - allocate(source_thermal_dissipation_sizePostResult(maxval(phase_Noutput),Ninstance),source=0) - allocate(source_thermal_dissipation_output (maxval(phase_Noutput),Ninstance)) - source_thermal_dissipation_output = '' - do p=1, size(config_phase) if (all(phase_source(:,p) /= SOURCE_THERMAL_DISSIPATION_ID)) cycle instance = source_thermal_dissipation_instance(p) diff --git a/src/source_thermal_externalheat.f90 b/src/source_thermal_externalheat.f90 index 1b9d03529..00e6da6bf 100644 --- a/src/source_thermal_externalheat.f90 +++ b/src/source_thermal_externalheat.f90 @@ -15,17 +15,8 @@ module source_thermal_externalheat private integer, dimension(:), allocatable, public, protected :: & - source_thermal_externalheat_offset, & !< which source is my current thermal dissipation mechanism? - source_thermal_externalheat_instance !< instance of thermal dissipation source mechanism - - integer, dimension(:,:), allocatable, target, public :: & - source_thermal_externalheat_sizePostResult !< size of each post result output - - character(len=64), dimension(:,:), allocatable, target, public :: & - source_thermal_externalheat_output !< name of each post result output - - integer, dimension(:), allocatable, target, public :: & - source_thermal_externalheat_Noutput !< number of outputs per instance of this source + source_thermal_externalheat_offset, & !< which source is my current thermal dissipation mechanism? + source_thermal_externalheat_instance !< instance of thermal dissipation source mechanism type :: tParameters !< container type for internal constitutive parameters real(pReal), dimension(:), allocatable :: & @@ -73,11 +64,6 @@ subroutine source_thermal_externalheat_init enddo enddo - allocate(source_thermal_externalheat_sizePostResult(maxval(phase_Noutput),maxNinstance),source=0) - allocate(source_thermal_externalheat_output (maxval(phase_Noutput),maxNinstance)) - source_thermal_externalheat_output = '' - allocate(source_thermal_externalheat_Noutput(maxNinstance), source=0) - allocate(param(maxNinstance)) do p=1, size(config_phase) @@ -117,6 +103,7 @@ subroutine source_thermal_externalheat_dotState(phase, of) end subroutine source_thermal_externalheat_dotState + !-------------------------------------------------------------------------------------------------- !> @brief returns local heat generation rate !-------------------------------------------------------------------------------------------------- From 90fdb24faaffa217be64f374657f4981fac91ccc Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 5 Dec 2019 13:26:33 +0100 Subject: [PATCH 226/233] forgotten variable rename --- processing/post/scaleData.py | 2 +- processing/post/shiftData.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/processing/post/scaleData.py b/processing/post/scaleData.py index 4484c5300..58f853251 100755 --- a/processing/post/scaleData.py +++ b/processing/post/scaleData.py @@ -36,7 +36,7 @@ parser.set_defaults(label = [], (options,filenames) = parser.parse_args() if filenames == []: filenames = [None] -if len(options.label) != len(options.factor): +if len(options.labels) != len(options.factor): parser.error('number of column labels and factors do not match.') for name in filenames: diff --git a/processing/post/shiftData.py b/processing/post/shiftData.py index fb2ba48f9..57b20fbd0 100755 --- a/processing/post/shiftData.py +++ b/processing/post/shiftData.py @@ -36,7 +36,7 @@ parser.set_defaults(label = [], (options,filenames) = parser.parse_args() if filenames == []: filenames = [None] -if len(options.label) != len(options.offset): +if len(options.labels) != len(options.offset): parser.error('number of column labels and offsets do not match.') for name in filenames: From 4bc037107bbc51db5bf71ccae870961b962109e2 Mon Sep 17 00:00:00 2001 From: Test User Date: Thu, 5 Dec 2019 13:35:23 +0100 Subject: [PATCH 227/233] [skip ci] updated version information after successful test of v2.0.3-1136-gcc67f0e1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 1fe12d401..63973c11b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-1133-gfede8225 +v2.0.3-1136-gcc67f0e1 From 3caf2c129695490425f18d59850d98f83062ac94 Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Thu, 5 Dec 2019 09:05:50 -0500 Subject: [PATCH 228/233] condensing code --- python/damask/table.py | 89 +++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 45 deletions(-) diff --git a/python/damask/table.py b/python/damask/table.py index 3c867fcf5..9e7b57017 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -21,27 +21,27 @@ class Table(): Additional, human-readable information. """ + self.comments = [] if comments is None else [c for c in comments] self.data = pd.DataFrame(data=data) - - labels = {} - i = 0 - for label in shapes.keys(): - for components in range(np.prod(shapes[label])): - labels[i] = label - i+=1 - - if i != self.data.shape[1]: - raise IndexError('Shape mismatch between shapes and data') - - self.data.rename(columns=labels,inplace=True) - - if comments is None: - self.comments = [] - else: - self.comments = [c for c in comments] - self.shapes = shapes + labels = [] + for label,shape in self.shapes.items(): + labels += [label] * np.prod(shape) + + if len(labels) != self.data.shape[1]: + raise IndexError('Mismatch between shapes and data') + + self.data.rename(columns=dict(zip(range(len(labels)),labels)),inplace=True) + + + def __add_comment(self,label,shape,info): + if info is not None: + self.comments.append('{}{}: {}'.format(label, + ' '+str(shape) if np.prod(shape,dtype=int) > 1 else '', + info)) + + @staticmethod def from_ASCII(fname): """ @@ -67,7 +67,7 @@ class Table(): header = int(header) else: raise Exception - comments = [f.readline()[:-1] for i in range(header-1)] + comments = [f.readline()[:-1] for i in range(1,header)] labels = f.readline().split() shapes = {} @@ -81,10 +81,10 @@ class Table(): if vector_column: shapes[label.split('_',1)[1]] = (int(label.split('_',1)[0]),) else: - shapes[label]=(1,) - - data = pd.read_csv(f,names=[i for i in range(len(labels))],sep=r'\s+').to_numpy() + shapes[label] = (1,) + data = pd.read_csv(f,names=list(range(len(labels))),sep=r'\s+').to_numpy() + return Table(data,shapes,comments) @@ -107,7 +107,8 @@ class Table(): idx,key = label.split('_',1) return self.data[key].to_numpy()[:,int(idx)-1].reshape((-1,1)) else: - return self.data[label].to_numpy().reshape((-1,)+self.shapes[label]) + return self.data[label].to_numpy().reshape((-1,)+self.shapes[label]) # better return shape (N) instead of (N,1), i.e. no reshaping? + def set(self,label,data,info=None): """ @@ -123,11 +124,7 @@ class Table(): Human-readable information about the new data. """ - if info is not None: - if np.prod(data.shape[1:],dtype=int) == 1: - self.comments.append('{}: {}'.format(label,info)) - else: - self.comments.append('{} {}: {}'.format(label,data.shape[1:],info)) + self.__add_comment(label,data.shape[1:],info) if re.match(r'[0-9]*?_',label): idx,key = label.split('_',1) @@ -136,6 +133,7 @@ class Table(): else: self.data[label] = data.reshape(self.data[label].shape) + def add(self,label,data,info=None): """ Add column data. @@ -150,17 +148,15 @@ class Table(): Human-readable information about the modified data. """ - if info is not None: - if np.prod(data.shape[1:],dtype=int) == 1: - self.comments.append('{}: {}'.format(label,info)) - else: - self.comments.append('{} {}: {}'.format(label,data.shape[1:],info)) + self.__add_comment(label,data.shape[1:],info) self.shapes[label] = data.shape[1:] if len(data.shape) > 1 else (1,) size = np.prod(data.shape[1:],dtype=int) - new_data = pd.DataFrame(data=data.reshape(-1,size), - columns=[label for l in range(size)]) - self.data = pd.concat([self.data,new_data],axis=1) + self.data = pd.concat([self.data, + pd.DataFrame(data=data.reshape(-1,size), + columns=[label]*size)], + axis=1) + def delete(self,label): """ @@ -176,6 +172,7 @@ class Table(): del self.shapes[label] + def rename(self,label_old,label_new,info=None): """ Rename column data. @@ -190,9 +187,10 @@ class Table(): """ self.data.rename(columns={label_old:label_new},inplace=True) - comments = '{} => {}'.format(label_old,label_new) - comments += ': {}'.format(info) if info is not None else '' - self.comments.append(comments) + self.comments.append('{} => {}{}'.format(label_old, + label_new, + '' if info is None else ': {}'.format(info), + )) self.shapes[label_new] = self.shapes.pop(label_old) @@ -223,6 +221,7 @@ class Table(): for t in _temp: self.delete(t) self.comments.append('sorted by [{}]'.format(', '.join(labels))) + def to_ASCII(self,fname): """ Store as plain text file. @@ -238,14 +237,14 @@ class Table(): if(self.shapes[l] == (1,)): labels.append('{}'.format(l)) elif(len(self.shapes[l]) == 1): - labels+=['{}_{}'.format(i+1,l)\ - for i in range(self.shapes[l][0])] + labels += ['{}_{}'.format(i+1,l) \ + for i in range(self.shapes[l][0])] else: - labels+=['{}:{}_{}'.format('x'.join([str(d) for d in self.shapes[l]]),i+1,l)\ - for i in range(np.prod(self.shapes[l],dtype=int))] + labels += ['{}:{}_{}'.format('x'.join([str(d) for d in self.shapes[l]]),i+1,l) \ + for i in range(np.prod(self.shapes[l],dtype=int))] - header = ['{} header'.format(len(self.comments)+1)]\ - + self.comments\ + header = ['{} header'.format(len(self.comments)+1)] \ + + self.comments \ + [' '.join(labels)] try: From 2648a67dcdbf14db825ec310fb2c76b1733e0a8b Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Thu, 5 Dec 2019 12:00:59 -0500 Subject: [PATCH 229/233] fixed sort_by to respect updated index (upon subsequent adding of new data) --- python/damask/table.py | 60 ++++++++++++++++++++------------------ python/tests/test_Table.py | 19 ++++++++---- 2 files changed, 44 insertions(+), 35 deletions(-) diff --git a/python/damask/table.py b/python/damask/table.py index 9e7b57017..6181fdb1f 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -1,4 +1,3 @@ -import random import re import pandas as pd @@ -24,15 +23,24 @@ class Table(): self.comments = [] if comments is None else [c for c in comments] self.data = pd.DataFrame(data=data) self.shapes = shapes + self.__label_condensed() + + def __label_flat(self): + """Label data individually, e.g. v v v ==> 1_v 2_v 3_v.""" + labels = [] + for label,shape in self.shapes.items(): + size = np.prod(shape) + labels += ['{}{}'.format('' if size == 1 else '{}_'.format(i+1),label) for i in range(size)] + self.data.columns = labels + + + def __label_condensed(self): + """Label data condensed, e.g. 1_v 2_v 3_v ==> v v v.""" labels = [] for label,shape in self.shapes.items(): labels += [label] * np.prod(shape) - - if len(labels) != self.data.shape[1]: - raise IndexError('Mismatch between shapes and data') - - self.data.rename(columns=dict(zip(range(len(labels)),labels)),inplace=True) + self.data.columns = labels def __add_comment(self,label,shape,info): @@ -87,7 +95,7 @@ class Table(): return Table(data,shapes,comments) - + @property def labels(self): """Return the labels of all columns.""" return list(self.shapes.keys()) @@ -105,9 +113,11 @@ class Table(): """ if re.match(r'[0-9]*?_',label): idx,key = label.split('_',1) - return self.data[key].to_numpy()[:,int(idx)-1].reshape((-1,1)) + data = self.data[key].to_numpy()[:,int(idx)-1].reshape((-1,1)) else: - return self.data[label].to_numpy().reshape((-1,)+self.shapes[label]) # better return shape (N) instead of (N,1), i.e. no reshaping? + data = self.data[label].to_numpy().reshape((-1,)+self.shapes[label]) + + return data.astype(type(data.flatten()[0])) def set(self,label,data,info=None): @@ -149,13 +159,14 @@ class Table(): """ self.__add_comment(label,data.shape[1:],info) - + self.shapes[label] = data.shape[1:] if len(data.shape) > 1 else (1,) - size = np.prod(data.shape[1:],dtype=int) - self.data = pd.concat([self.data, - pd.DataFrame(data=data.reshape(-1,size), - columns=[label]*size)], - axis=1) + size = np.prod(data.shape[1:],dtype=int) + new = pd.DataFrame(data=data.reshape(-1,size), + columns=[label]*size, + ) + new.index = self.data.index + self.data = pd.concat([self.data,new],axis=1) def delete(self,label): @@ -201,24 +212,15 @@ class Table(): Parameters ---------- - label : list of str or str + label : str or list Column labels. - ascending : bool, optional + ascending : bool or list, optional Set sort order. """ - _temp = [] - _labels = [] - for label in labels if isinstance(labels,list) else [labels]: - if re.match(r'[0-9]*?_',label): - _temp.append(str(random.getrandbits(128))) - self.add(_temp[-1],self.get(label)) - _labels.append(_temp[-1]) - else: - _labels.append(label) - - self.data.sort_values(_labels,axis=0,inplace=True,ascending=ascending) - for t in _temp: self.delete(t) + self.__label_flat() + self.data.sort_values(labels,axis=0,inplace=True,ascending=ascending) + self.__label_condensed() self.comments.append('sorted by [{}]'.format(', '.join(labels))) diff --git a/python/tests/test_Table.py b/python/tests/test_Table.py index b17348881..a0dc31975 100644 --- a/python/tests/test_Table.py +++ b/python/tests/test_Table.py @@ -9,7 +9,7 @@ from damask import Table @pytest.fixture def default(): """Simple Table.""" - x = np.ones((5,13)) + x = np.ones((5,13),dtype=float) return Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['test data','contains only ones']) @pytest.fixture @@ -58,7 +58,7 @@ class TestTable: assert np.allclose(d,0.0) and d.shape[1:] == (3,3) def test_labels(self,default): - assert default.labels() == ['F','v','s'] + assert default.labels == ['F','v','s'] def test_add(self,default): d = np.random.random((5,9)) @@ -82,9 +82,9 @@ class TestTable: default.get('v') - def test_invalid_initialization(self,default): - x = default.get('v') - with pytest.raises(IndexError): + def test_invalid_initialization(self): + x = np.random.random((5,10)) + with pytest.raises(ValueError): Table(x,{'F':(3,3)}) def test_invalid_set(self,default): @@ -115,7 +115,14 @@ class TestTable: def test_sort_revert(self): x = np.random.random((5,12)) t = Table(x,{'F':(3,3),'v':(3,)},['random test data']) - t.sort_by('4_F',False) + t.sort_by('4_F',ascending=False) sort = t.get('4_F') assert np.all(np.sort(sort,0)==sort[::-1,:]) + def test_sort(self): + t = Table(np.array([[0,1,],[2,1,]]), + {'v':(2,)}, + ['test data']) + t.add('s',np.array(['b','a'])) + t.sort_by('s') + assert np.all(t.get('1_v') == np.array([2,0]).reshape((2,1))) From 860e2d08b5abde40c090910f65ad288dd1b34ab7 Mon Sep 17 00:00:00 2001 From: Test User Date: Fri, 6 Dec 2019 17:59:57 +0100 Subject: [PATCH 230/233] [skip ci] updated version information after successful test of v2.0.3-1177-ga41871e2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 63973c11b..ae832e588 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-1136-gcc67f0e1 +v2.0.3-1177-ga41871e2 From 59b3d81a731c4181862cbd16b0e4c7e4c470ec49 Mon Sep 17 00:00:00 2001 From: Test User Date: Fri, 6 Dec 2019 22:36:23 +0100 Subject: [PATCH 231/233] [skip ci] updated version information after successful test of v2.0.3-1199-g78eccd56 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 63973c11b..24bc6f288 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-1136-gcc67f0e1 +v2.0.3-1199-g78eccd56 From 0f4f415c5be0ce182c4608eab98dae8f1471f847 Mon Sep 17 00:00:00 2001 From: Test User Date: Sat, 7 Dec 2019 13:47:55 +0100 Subject: [PATCH 232/233] [skip ci] updated version information after successful test of v2.0.3-1218-g5a6111ec --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ae832e588..88e96b85c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-1177-ga41871e2 +v2.0.3-1218-g5a6111ec From a6e636a1c3e12615c2b2f2a5e958c3c781a48733 Mon Sep 17 00:00:00 2001 From: Test User Date: Sat, 7 Dec 2019 19:50:17 +0100 Subject: [PATCH 233/233] [skip ci] updated version information after successful test of v2.0.3-1228-g3e269f04 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 88e96b85c..35ae2dc0f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-1218-g5a6111ec +v2.0.3-1228-g3e269f04

PJjiX2T{7|?D6*po|UR2{cowRSU-LfQS-D=dc zv5cjx8LqG1yWmrJ7xB({M4mbU=^1W2OLTF5w|msHYYykL6Ia-4mtnj0l}w@+(N5;R zH7}F($9c-EbzGSzzMsy>V=Sqh4!Ve`cCpD^aCDJ z#=IsNMPf0-m$LBWd&oargP)4<|*`zbudK zXGP3sI~+rq1rWb2WiyxiQJ&Q2`%Dg_A829Msh7ljAVlGcs5!4p!E$a~A@?ZCI1e*c@c9;k@6Rzv3SGqU8gTHjIEntM z*gA8b2kBQL(zznAd@F+;6%*zm>`W_PRiR&6viZ%yF62LYEN>zN{j(VRt2ZKH_?)+o zPPhom%gfO)#^Lp)pV!sv;W(eYoj6$Gg5OtJ^vB+(h4X_K&b`fEy7Z4N28O>k8vMQU zs4oZq+Ksiq=l_`f3IFcM|CR>+d>*y%#Yd%$RP$ryy8hRdj_Q{L)Ktr;7;%rH zm%X#K5FYLP*Up_@Xy+Gu0hzycPP^fTU;O?)hkKcb zf8+jNZ&d$z68{{q;6;6oeu%P#qT%dsF=_WiYgR9GnY6BkoftFK&MJImg<4NSN>n}g>@9%y6 z-(eO1^Irbh4=m&}lfUg}f#U-1v=#{e;Pub%HyWP%Wv>hE;J%wbTDTnl>$)IU%H7_53fVh<^+G4{6}feqbT)&i*OB{Qx6<8xc{2gmZp+xtH#*1uf!zvc)2oCo~9I2M`n?>P1^H~9ZVf&c6WWPbCm`khBE zH0A1HkB?f+|Kt0Y3cqhC;9AYkKLxj6*9AYJ_WSn&UKiryuTnqPcj*3jUMT##z{2xF z@!$5iz-OWSBC6Rx$}=yfqT)cJ@4}70bN%n0)A;?av*26)8jJs~?!p75)qkzhZ~A{% z*Z=puKkMSptp2;YfBv3nUeMZ(gML~W>jK4Juxvxn`DywwfBu;C-e=W5U@IXrLD z*$cCRk9yr9&R1%+74QKZZeQPxugAEpKD*}f5;qsAcn(8N&gn3$H zck#)3xL!Oh@>ORH+%24)4i5B#)q`-Y)7BMa9rF<`ndc2q-F>)tv-TL&Pt zIic6Hiz>-=E$G=;&;WkiSsl7sV=z4S<3-0tk2{Eu$)Io}gC z0=jWuRGad`HhBS;LoZ0{oP1EY~0RGxA$o!Ia_g! zfg`6L9Aox0%WIB-Fys94TGVeq?0%`%jtVkVZYFlDy8#Lp2?#w>9)m9iF``R9_d~~s zLT~&`1sTbiQ1w@D0QbhK_`!hmU}%hfUOR)c=N=VwI$hYPkC*`#Kle?~mCD`j_z| zFmOw!qBh+ zW7e$>a=CC7=L456G9}4hu;Excj84mc(p4XWUE$^Xg3!JKYwpFCCRUJaSHGR+aSbpP z@`U!2*%+im9Nc`e3&)|SCNUtPk`!#%pmVpa9*$d%6^I@hgGqeZSA`5eHX1H zvicKq?Su88Sv*5ycy|<5nQPj4#&nQlJb{9Y$GXV95<#sK8SSt#%r=%A?PG?9-c~(i z1a9b+aeMW4!{D%OZVdX5RL!lqO{kYkkAnjPY)4=;Yb#wBRS!HqL z2NV6seU_6WxSzh~?V&r}P%~`*Rh6Lz;Gs9I0NTgd^y_`i=)d|JOh?bG=z;O9<&@($ zt08Cjb#m`SKNz%@NLqN0fOqCHWxl>{=u{MTJ@TL$BI&q49K&(<6i$1a>oNi+x@-+) zue*WMaogL?=)bl&iRc+skHX2lSHg_rTS*~vVE4PhWD=OL!|=1;0GQN?eG$R?&pIWi zHs*H_H|1;QX>wiUM8bfV`^9#c_>|wi_SPt{ZGXJ=_|*>b$S!c8EToHUV5zexzS<7Q z(k$CDQGc`%GM$ZbOQ+VZ+BT$HVS8Su8-~N=^*EHWaIO2{B>gAJe<;Qhk#Y=ZtB>65odPiKyn9R ze9)318Qn!zvoJgvOlt?CWl*a3U=$cK*%k2%0Axk_#%nQRT}1o#*F)W@?cn}3>WtW( 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

U= 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