only parse geom file once

This commit is contained in:
Martin Diehl 2019-02-02 09:18:01 +01:00
parent 3d750e7933
commit 4a28284058
1 changed files with 163 additions and 223 deletions

View File

@ -28,6 +28,8 @@ module mesh
mesh_maxNcellnodes !< max number of cell nodes in any CP element mesh_maxNcellnodes !< max number of cell nodes in any CP element
!!!! BEGIN DEPRECATED !!!!! !!!! BEGIN DEPRECATED !!!!!
integer(pInt), dimension(:), allocatable, private :: &
microGlobal
integer(pInt), dimension(:), allocatable, public, protected :: & integer(pInt), dimension(:), allocatable, public, protected :: &
mesh_homogenizationAt, & !< homogenization ID of each element mesh_homogenizationAt, & !< homogenization ID of each element
mesh_microstructureAt !< microstructure ID of each element mesh_microstructureAt !< microstructure ID of each element
@ -278,8 +280,6 @@ integer(pInt), dimension(:,:), allocatable, private :: &
mesh_spectral_build_nodes, & mesh_spectral_build_nodes, &
mesh_spectral_build_elements, & mesh_spectral_build_elements, &
mesh_spectral_build_ipNeighborhood, & mesh_spectral_build_ipNeighborhood, &
mesh_spectral_getGrid, &
mesh_spectral_getSize, &
mesh_build_cellnodes, & mesh_build_cellnodes, &
mesh_build_ipVolumes, & mesh_build_ipVolumes, &
mesh_build_ipCoordinates mesh_build_ipCoordinates
@ -354,7 +354,6 @@ subroutine mesh_init(ip,el)
include 'fftw3-mpi.f03' include 'fftw3-mpi.f03'
integer(C_INTPTR_T) :: devNull, local_K, local_K_offset integer(C_INTPTR_T) :: devNull, local_K, local_K_offset
integer :: ierr, worldsize integer :: ierr, worldsize
integer(pInt), parameter :: FILEUNIT = 222_pInt
integer(pInt), intent(in), optional :: el, ip integer(pInt), intent(in), optional :: el, ip
integer(pInt) :: j integer(pInt) :: j
logical :: myDebug logical :: myDebug
@ -364,21 +363,20 @@ subroutine mesh_init(ip,el)
#include "compilation_info.f90" #include "compilation_info.f90"
call mesh_build_FEdata ! get properties of the different types of elements call mesh_build_FEdata ! get properties of the different types of elements
mesh_unitlength = numerics_unitlength ! set physical extent of a length unit in mesh mesh_unitlength = numerics_unitlength ! set physical extent of a length unit in mesh
myDebug = (iand(debug_level(debug_mesh),debug_levelBasic) /= 0_pInt) myDebug = (iand(debug_level(debug_mesh),debug_levelBasic) /= 0_pInt)
call fftw_mpi_init() call fftw_mpi_init()
call IO_open_file(FILEUNIT,geometryFile) ! parse info from geometry file... call mesh_spectral_read_grid()
if (myDebug) write(6,'(a)') ' Opened geometry file'; flush(6)
grid = mesh_spectral_getGrid(fileUnit)
call MPI_comm_size(PETSC_COMM_WORLD, worldsize, ierr) call MPI_comm_size(PETSC_COMM_WORLD, worldsize, ierr)
if(ierr /=0_pInt) call IO_error(894_pInt, ext_msg='MPI_comm_size') if(ierr /=0_pInt) call IO_error(894_pInt, ext_msg='MPI_comm_size')
if(worldsize>grid(3)) call IO_error(894_pInt, ext_msg='number of processes exceeds grid(3)') if(worldsize>grid(3)) call IO_error(894_pInt, ext_msg='number of processes exceeds grid(3)')
geomSize = mesh_spectral_getSize(fileUnit)
devNull = fftw_mpi_local_size_3d(int(grid(3),C_INTPTR_T), & devNull = fftw_mpi_local_size_3d(int(grid(3),C_INTPTR_T), &
int(grid(2),C_INTPTR_T), & int(grid(2),C_INTPTR_T), &
int(grid(1),C_INTPTR_T)/2+1, & int(grid(1),C_INTPTR_T)/2+1, &
@ -395,19 +393,20 @@ subroutine mesh_init(ip,el)
mesh_Nnodes = product(grid(1:2) + 1_pInt)*(grid3 + 1_pInt) mesh_Nnodes = product(grid(1:2) + 1_pInt)*(grid3 + 1_pInt)
call mesh_spectral_build_nodes() call mesh_spectral_build_nodes()
if (myDebug) write(6,'(a)') ' Built nodes'; flush(6) if (myDebug) write(6,'(a)') ' Built nodes'; flush(6)
call theMesh%init(mesh_node)
! For compatibility
call theMesh%init(mesh_node)
! For compatibility
mesh_maxNips = theMesh%elem%nIPs mesh_maxNips = theMesh%elem%nIPs
mesh_maxNipNeighbors = theMesh%elem%nIPneighbors mesh_maxNipNeighbors = theMesh%elem%nIPneighbors
mesh_maxNcellnodes = theMesh%elem%Ncellnodes mesh_maxNcellnodes = theMesh%elem%Ncellnodes
call mesh_spectral_build_elements()
call mesh_spectral_build_elements(FILEUNIT)
if (myDebug) write(6,'(a)') ' Built elements'; flush(6) if (myDebug) write(6,'(a)') ' Built elements'; flush(6)
call mesh_build_cellconnectivity call mesh_build_cellconnectivity
if (myDebug) write(6,'(a)') ' Built cell connectivity'; flush(6) if (myDebug) write(6,'(a)') ' Built cell connectivity'; flush(6)
mesh_cellnode = mesh_build_cellnodes(mesh_node,mesh_Ncellnodes) mesh_cellnode = mesh_build_cellnodes(mesh_node,mesh_Ncellnodes)
@ -418,7 +417,6 @@ subroutine mesh_init(ip,el)
if (myDebug) write(6,'(a)') ' Built IP volumes'; flush(6) if (myDebug) write(6,'(a)') ' Built IP volumes'; flush(6)
call mesh_build_ipAreas call mesh_build_ipAreas
if (myDebug) write(6,'(a)') ' Built IP areas'; flush(6) if (myDebug) write(6,'(a)') ' Built IP areas'; flush(6)
close (FILEUNIT)
call mesh_spectral_build_ipNeighborhood call mesh_spectral_build_ipNeighborhood
@ -683,17 +681,14 @@ pure function mesh_cellCenterCoordinates(ip,el)
enddo enddo
mesh_cellCenterCoordinates = mesh_cellCenterCoordinates / real(FE_NcellnodesPerCell(c),pReal) mesh_cellCenterCoordinates = mesh_cellCenterCoordinates / real(FE_NcellnodesPerCell(c),pReal)
end function mesh_cellCenterCoordinates end function mesh_cellCenterCoordinates
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
!> @brief Reads grid information from geometry file. If fileUnit is given, !> @brief Parses geometry file
!! assumes an opened file, otherwise tries to open the one specified in geometryFile
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
function mesh_spectral_getGrid(fileUnit) subroutine mesh_spectral_read_grid()
use IO, only: & use IO, only: &
IO_checkAndRewind, &
IO_open_file, &
IO_stringPos, & IO_stringPos, &
IO_lc, & IO_lc, &
IO_stringValue, & IO_stringValue, &
@ -703,145 +698,158 @@ function mesh_spectral_getGrid(fileUnit)
use DAMASK_interface, only: & use DAMASK_interface, only: &
geometryFile geometryFile
implicit none implicit none
integer(pInt), dimension(3) :: mesh_spectral_getGrid character(len=:), allocatable :: rawData
integer(pInt), intent(in), optional :: fileUnit character(len=65536) :: line
integer(pInt), allocatable, dimension(:) :: chunkPos integer(pInt), allocatable, dimension(:) :: chunkPos
integer(pInt), dimension(3) :: g = -1_pInt
real(pReal), dimension(3) :: s = -1_pInt
integer(pInt) :: h =- 1_pInt
integer(pInt) :: &
headerLength = -1_pInt, &
fileLength, &
fileUnit, &
startPos, endPos, &
myStat, &
l, i, j, e, c
logical :: &
gotGrid = .false., &
gotSize = .false., &
gotHomogenization = .false.
integer(pInt) :: headerLength = 0_pInt !--------------------------------------------------------------------------------------------------
character(len=1024) :: line, & ! read data as stream
keyword inquire(file = trim(geometryFile), size=fileLength)
integer(pInt) :: i, j, myFileUnit open(newunit=fileUnit, file=trim(geometryFile), access='stream',&
logical :: gotGrid = .false. status='old', position='rewind', action='read',iostat=myStat)
if(myStat /= 0_pInt) call IO_error(100_pInt,ext_msg=trim(geometryFile))
allocate(character(len=fileLength)::rawData)
read(fileUnit) rawData
close(fileUnit)
mesh_spectral_getGrid = -1_pInt !--------------------------------------------------------------------------------------------------
if(.not. present(fileUnit)) then ! get header length
myFileUnit = 289_pInt endPos = index(rawData,new_line(''))
call IO_open_file(myFileUnit,trim(geometryFile)) if(endPos <= index(rawData,'head')) then
else call IO_error(error_ID=841_pInt, ext_msg='mesh_spectral_read_grid')
myFileUnit = fileUnit else
endif chunkPos = IO_stringPos(rawData(1:endPos))
if (chunkPos(1) < 2_pInt) call IO_error(error_ID=841_pInt, ext_msg='mesh_spectral_read_grid')
headerLength = IO_intValue(rawData(1:endPos),chunkPos,1_pInt)
startPos = endPos + 1_pInt
endif
call IO_checkAndRewind(myFileUnit) !--------------------------------------------------------------------------------------------------
! read and interprete header
l = 0
do while (l < headerLength .and. startPos < len(rawData))
endPos = startPos + index(rawData(startPos:),new_line('')) - 1_pInt
line = rawData(startPos:endPos)
startPos = endPos + 1_pInt
l = l + 1_pInt
read(myFileUnit,'(a1024)') line ! cycle empty lines
chunkPos = IO_stringPos(line) chunkPos = IO_stringPos(trim(line))
keyword = IO_lc(IO_StringValue(line,chunkPos,2_pInt,.true.)) select case ( IO_lc(IO_StringValue(trim(line),chunkPos,1_pInt,.true.)) )
if (keyword(1:4) == 'head') then
headerLength = IO_intValue(line,chunkPos,1_pInt) + 1_pInt
else
call IO_error(error_ID=841_pInt, ext_msg='mesh_spectral_getGrid')
endif
rewind(myFileUnit)
do i = 1_pInt, headerLength
read(myFileUnit,'(a1024)') line
chunkPos = IO_stringPos(line)
select case ( IO_lc(IO_StringValue(line,chunkPos,1_pInt,.true.)) )
case ('grid')
gotGrid = .true.
do j = 2_pInt,6_pInt,2_pInt
select case (IO_lc(IO_stringValue(line,chunkPos,j)))
case('a')
mesh_spectral_getGrid(1) = IO_intValue(line,chunkPos,j+1_pInt)
case('b')
mesh_spectral_getGrid(2) = IO_intValue(line,chunkPos,j+1_pInt)
case('c')
mesh_spectral_getGrid(3) = IO_intValue(line,chunkPos,j+1_pInt)
end select
enddo
end select
enddo
if(.not. present(fileUnit)) close(myFileUnit) case ('grid')
if (chunkPos(1) > 6) gotGrid = .true.
do j = 2_pInt,6_pInt,2_pInt
select case (IO_lc(IO_stringValue(line,chunkPos,j)))
case('a')
g(1) = IO_intValue(line,chunkPos,j+1_pInt)
case('b')
g(2) = IO_intValue(line,chunkPos,j+1_pInt)
case('c')
g(3) = IO_intValue(line,chunkPos,j+1_pInt)
end select
enddo
if (.not. gotGrid) & case ('size')
call IO_error(error_ID = 845_pInt, ext_msg='grid') if (chunkPos(1) > 6) gotSize = .true.
if(any(mesh_spectral_getGrid < 1_pInt)) & do j = 2_pInt,6_pInt,2_pInt
call IO_error(error_ID = 843_pInt, ext_msg='mesh_spectral_getGrid') select case (IO_lc(IO_stringValue(line,chunkPos,j)))
case('x')
s(1) = IO_floatValue(line,chunkPos,j+1_pInt)
case('y')
s(2) = IO_floatValue(line,chunkPos,j+1_pInt)
case('z')
s(3) = IO_floatValue(line,chunkPos,j+1_pInt)
end select
enddo
end function mesh_spectral_getGrid case ('homogenization')
if (chunkPos(1) > 1) gotHomogenization = .true.
h = IO_intValue(line,chunkPos,2_pInt)
end select
enddo
!--------------------------------------------------------------------------------------------------
! global data
grid = g
geomSize = s
allocate(microGlobal(product(grid)), source = -1_pInt)
!--------------------------------------------------------------------------------------------------
! read and interprete content
e = 1_pInt
do while (startPos < len(rawData))
endPos = startPos + index(rawData(startPos:),new_line('')) - 1_pInt
line = rawData(startPos:endPos)
startPos = endPos + 1_pInt
l = l + 1_pInt
chunkPos = IO_stringPos(trim(line))
if (chunkPos(1) == 3) then
if (IO_lc(IO_stringValue(line,chunkPos,2)) == 'of') then
c = IO_intValue(line,chunkPos,1)
microGlobal(e:e+c-1_pInt) = [(IO_intValue(line,chunkPos,3),i = 1_pInt,IO_intValue(line,chunkPos,1))]
else if (IO_lc(IO_stringValue(line,chunkPos,2)) == 'to') then
c = IO_intValue(line,chunkPos,3) - IO_intValue(line,chunkPos,1) + 1_pInt
microGlobal(e:e+c-1_pInt) = [(i, i = IO_intValue(line,chunkPos,1),IO_intValue(line,chunkPos,3))]
else
c = chunkPos(1)
do i = 0_pInt, c - 1_pInt
microGlobal(e+i) = IO_intValue(line,chunkPos,i+1_pInt)
enddo
endif
else
c = chunkPos(1)
do i = 0_pInt, c - 1_pInt
microGlobal(e+i) = IO_intValue(line,chunkPos,i+1_pInt)
enddo
endif
e = e+c
end do
if (e-1 /= product(grid)) print*, 'mist', e
! if (.not. gotGrid) &
! call IO_error(error_ID = 845_pInt, ext_msg='grid')
! if(any(mesh_spectral_getGrid < 1_pInt)) &
! call IO_error(error_ID = 843_pInt, ext_msg='mesh_spectral_getGrid')
! if (.not. gotSize) &
! call IO_error(error_ID = 845_pInt, ext_msg='size')
! if (any(mesh_spectral_getSize<=0.0_pReal)) &
! call IO_error(error_ID = 844_pInt, ext_msg='mesh_spectral_getSize')
! if (.not. gotHomogenization ) &
! call IO_error(error_ID = 845_pInt, ext_msg='homogenization')
! if (mesh_spectral_getHomogenization<1_pInt) &
! call IO_error(error_ID = 842_pInt, ext_msg='mesh_spectral_getHomogenization')
end subroutine mesh_spectral_read_grid
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
!> @brief Reads size information from geometry file. If fileUnit is given, !> @brief Reads homogenization information from geometry file.
!! assumes an opened file, otherwise tries to open the one specified in geometryFile
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
function mesh_spectral_getSize(fileUnit) integer(pInt) function mesh_spectral_getHomogenization()
use IO, only: &
IO_checkAndRewind, &
IO_open_file, &
IO_stringPos, &
IO_lc, &
IO_stringValue, &
IO_intValue, &
IO_floatValue, &
IO_error
use DAMASK_interface, only: &
geometryFile
implicit none
real(pReal), dimension(3) :: mesh_spectral_getSize
integer(pInt), intent(in), optional :: fileUnit
integer(pInt), allocatable, dimension(:) :: chunkPos
integer(pInt) :: headerLength = 0_pInt
character(len=1024) :: line, &
keyword
integer(pInt) :: i, j, myFileUnit
logical :: gotSize = .false.
mesh_spectral_getSize = -1.0_pReal
if(.not. present(fileUnit)) then
myFileUnit = 289_pInt
call IO_open_file(myFileUnit,trim(geometryFile))
else
myFileUnit = fileUnit
endif
call IO_checkAndRewind(myFileUnit)
read(myFileUnit,'(a1024)') line
chunkPos = IO_stringPos(line)
keyword = IO_lc(IO_StringValue(line,chunkPos,2_pInt,.true.))
if (keyword(1:4) == 'head') then
headerLength = IO_intValue(line,chunkPos,1_pInt) + 1_pInt
else
call IO_error(error_ID=841_pInt, ext_msg='mesh_spectral_getSize')
endif
rewind(myFileUnit)
do i = 1_pInt, headerLength
read(myFileUnit,'(a1024)') line
chunkPos = IO_stringPos(line)
select case ( IO_lc(IO_StringValue(line,chunkPos,1,.true.)) )
case ('size')
gotSize = .true.
do j = 2_pInt,6_pInt,2_pInt
select case (IO_lc(IO_stringValue(line,chunkPos,j)))
case('x')
mesh_spectral_getSize(1) = IO_floatValue(line,chunkPos,j+1_pInt)
case('y')
mesh_spectral_getSize(2) = IO_floatValue(line,chunkPos,j+1_pInt)
case('z')
mesh_spectral_getSize(3) = IO_floatValue(line,chunkPos,j+1_pInt)
end select
enddo
end select
enddo
if(.not. present(fileUnit)) close(myFileUnit)
if (.not. gotSize) &
call IO_error(error_ID = 845_pInt, ext_msg='size')
if (any(mesh_spectral_getSize<=0.0_pReal)) &
call IO_error(error_ID = 844_pInt, ext_msg='mesh_spectral_getSize')
end function mesh_spectral_getSize
!--------------------------------------------------------------------------------------------------
!> @brief Reads homogenization information from geometry file. If fileUnit is given,
!! assumes an opened file, otherwise tries to open the one specified in geometryFile
!--------------------------------------------------------------------------------------------------
integer(pInt) function mesh_spectral_getHomogenization(fileUnit)
use IO, only: & use IO, only: &
IO_checkAndRewind, & IO_checkAndRewind, &
IO_open_file, & IO_open_file, &
@ -854,7 +862,6 @@ integer(pInt) function mesh_spectral_getHomogenization(fileUnit)
geometryFile geometryFile
implicit none implicit none
integer(pInt), intent(in), optional :: fileUnit
integer(pInt), allocatable, dimension(:) :: chunkPos integer(pInt), allocatable, dimension(:) :: chunkPos
integer(pInt) :: headerLength = 0_pInt integer(pInt) :: headerLength = 0_pInt
character(len=1024) :: line, & character(len=1024) :: line, &
@ -862,13 +869,10 @@ integer(pInt) function mesh_spectral_getHomogenization(fileUnit)
integer(pInt) :: i, myFileUnit integer(pInt) :: i, myFileUnit
logical :: gotHomogenization = .false. logical :: gotHomogenization = .false.
mesh_spectral_getHomogenization = -1_pInt
if(.not. present(fileUnit)) then
myFileUnit = 289_pInt myFileUnit = 289_pInt
call IO_open_file(myFileUnit,trim(geometryFile)) call IO_open_file(myFileUnit,trim(geometryFile))
else
myFileUnit = fileUnit
endif
call IO_checkAndRewind(myFileUnit) call IO_checkAndRewind(myFileUnit)
@ -891,7 +895,7 @@ integer(pInt) function mesh_spectral_getHomogenization(fileUnit)
end select end select
enddo enddo
if(.not. present(fileUnit)) close(myFileUnit) close(myFileUnit)
if (.not. gotHomogenization ) & if (.not. gotHomogenization ) &
call IO_error(error_ID = 845_pInt, ext_msg='homogenization') call IO_error(error_ID = 845_pInt, ext_msg='homogenization')
@ -935,85 +939,21 @@ end subroutine mesh_spectral_build_nodes
!! Allocates global array 'mesh_element' !! Allocates global array 'mesh_element'
!> @todo does the IO_error makes sense? !> @todo does the IO_error makes sense?
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
subroutine mesh_spectral_build_elements(fileUnit) subroutine mesh_spectral_build_elements()
use IO, only: & use IO, only: &
IO_checkAndRewind, & IO_error
IO_lc, &
IO_stringValue, &
IO_stringPos, &
IO_error, &
IO_continuousIntValues, &
IO_intValue, &
IO_countContinuousIntValues
implicit none implicit none
integer(pInt), intent(in) :: &
fileUnit
integer(pInt), allocatable, dimension(:) :: chunkPos
integer(pInt) :: & integer(pInt) :: &
e, i, & e, i, &
headerLength = 0_pInt, &
maxDataPerLine, &
homog, & homog, &
elemOffset elemOffset
integer(pInt), dimension(:), allocatable :: &
microstructures, &
microGlobal
integer(pInt), dimension(1,1) :: &
dummySet = 0_pInt
character(len=65536) :: &
line, &
keyword
character(len=64), dimension(1) :: &
dummyName = ''
homog = mesh_spectral_getHomogenization(fileUnit)
!-------------------------------------------------------------------------------------------------- homog = mesh_spectral_getHomogenization()
! get header length
call IO_checkAndRewind(fileUnit)
read(fileUnit,'(a65536)') line
chunkPos = IO_stringPos(line)
keyword = IO_lc(IO_StringValue(line,chunkPos,2_pInt,.true.))
if (keyword(1:4) == 'head') then
headerLength = IO_intValue(line,chunkPos,1_pInt) + 1_pInt
else
call IO_error(error_ID=841_pInt, ext_msg='mesh_spectral_build_elements')
endif
!--------------------------------------------------------------------------------------------------
! get maximum microstructure index
call IO_checkAndRewind(fileUnit)
do i = 1_pInt, headerLength
read(fileUnit,'(a65536)') line
enddo
maxDataPerLine = 0_pInt
i = 1_pInt
do while (i > 0_pInt)
i = IO_countContinuousIntValues(fileUnit)
maxDataPerLine = max(maxDataPerLine, i) ! found a longer line?
enddo
allocate(mesh_element (4_pInt+8_pInt,mesh_NcpElems), source = 0_pInt) allocate(mesh_element (4_pInt+8_pInt,mesh_NcpElems), source = 0_pInt)
allocate(microstructures (1_pInt+maxDataPerLine), source = 1_pInt) ! prepare to receive counter and max data size
allocate(microGlobal (mesh_NcpElemsGlobal), source = 1_pInt)
!--------------------------------------------------------------------------------------------------
! read in microstructures
call IO_checkAndRewind(fileUnit)
do i=1_pInt,headerLength
read(fileUnit,'(a65536)') line
enddo
e = 0_pInt
do while (e < mesh_NcpElemsGlobal .and. microstructures(1) > 0_pInt) ! fill expected number of elements, stop at end of data (or blank line!)
microstructures = IO_continuousIntValues(fileUnit,maxDataPerLine,dummyName,dummySet,0_pInt) ! get affected elements
do i = 1_pInt,microstructures(1_pInt)
e = e+1_pInt ! valid element entry
microGlobal(e) = microstructures(1_pInt+i)
enddo
enddo
elemOffset = product(grid(1:2))*grid3Offset elemOffset = product(grid(1:2))*grid3Offset