From 044a0489446f2b18051c528e7cfac304d03ff7d7 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 27 Jul 2021 11:59:46 +0200 Subject: [PATCH] taking care of corner cases (e.g. restart) adjusting tests to take care of new 'setup' group --- PRIVATE | 2 +- src/HDF5_utilities.f90 | 4 ++++ src/IO.f90 | 8 ++++---- src/config.f90 | 2 +- src/grid/DAMASK_grid.f90 | 6 ++++-- src/grid/discretization_grid.f90 | 6 ++++-- src/math.f90 | 2 +- src/prec.f90 | 1 + src/results.f90 | 19 +++++++++++++++++-- 9 files changed, 37 insertions(+), 13 deletions(-) diff --git a/PRIVATE b/PRIVATE index 7d48d8158..9699f20f2 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 7d48d8158c1b2c0ab8bdd1c5d2baa3d020ae006d +Subproject commit 9699f20f21f8a5f532c735a1aa9daeba395da94d diff --git a/src/HDF5_utilities.f90 b/src/HDF5_utilities.f90 index 2d2632e13..fa62e4840 100644 --- a/src/HDF5_utilities.f90 +++ b/src/HDF5_utilities.f90 @@ -1473,6 +1473,10 @@ subroutine HDF5_write_real7(dataset,loc_id,datasetName,parallel) end subroutine HDF5_write_real7 +!-------------------------------------------------------------------------------------------------- +!> @brief Write dataset of type string (scalar). +!> @details Not collective, must be called by one process at at time. +!-------------------------------------------------------------------------------------------------- subroutine HDF5_write_str(dataset,loc_id,datasetName) character(len=*), intent(in) :: dataset diff --git a/src/IO.f90 b/src/IO.f90 index 961e92d63..a32bd5ef0 100644 --- a/src/IO.f90 +++ b/src/IO.f90 @@ -128,19 +128,19 @@ function IO_read(fileName) result(fileContent) inquire(file = fileName, size=fileLength) open(newunit=fileUnit, file=fileName, access='stream',& status='old', position='rewind', action='read',iostat=myStat) - if(myStat /= 0) call IO_error(100,ext_msg=trim(fileName)) + if (myStat /= 0) call IO_error(100,ext_msg=trim(fileName)) allocate(character(len=fileLength)::fileContent) - if(fileLength==0) then + if (fileLength==0) then close(fileUnit) return endif read(fileUnit,iostat=myStat) fileContent - if(myStat /= 0) call IO_error(102,ext_msg=trim(fileName)) + if (myStat /= 0) call IO_error(102,ext_msg=trim(fileName)) close(fileUnit) if (scan(fileContent(:index(fileContent,LF)),CR//LF) /= 0) fileContent = CRLF2LF(fileContent) - if(fileContent(fileLength:fileLength) /= IO_EOL) fileContent = fileContent//IO_EOL ! ensure EOL@EOF + if (fileContent(fileLength:fileLength) /= IO_EOL) fileContent = fileContent//IO_EOL ! ensure EOL@EOF end function IO_read diff --git a/src/config.f90 b/src/config.f90 index 8f5680158..c460ce7c5 100644 --- a/src/config.f90 +++ b/src/config.f90 @@ -56,7 +56,7 @@ subroutine parse_material() print*, 'reading material.yaml'; flush(IO_STDOUT) fileContent = IO_read('material.yaml') call results_openJobFile(parallel=.false.) - call results_writeDataset_str(fileContent,'setup','material.yaml','DAMASK main configuration') + call results_writeDataset_str(fileContent,'setup','material.yaml','main configuration') call results_closeJobFile endif call parallelization_bcast_str(fileContent) diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 89521a223..b6e45a75b 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -108,7 +108,7 @@ program DAMASK_grid step_mech, & step_discretization character(len=:), allocatable :: & - fileContent + fileContent, fname !-------------------------------------------------------------------------------------------------- ! init DAMASK (all modules) @@ -131,8 +131,10 @@ program DAMASK_grid if (worldrank == 0) then fileContent = IO_read(interface_loadFile) + fname = interface_loadFile + if (scan(fname,'/') /= 0) fname = fname(scan(fname,'/',.true.)+1:) call results_openJobFile(parallel=.false.) - call results_writeDataset_str(fileContent,'setup',interface_loadFile,'load case definition (grid solver)') + call results_writeDataset_str(fileContent,'setup',fname,'load case definition (grid solver)') call results_closeJobFile endif diff --git a/src/grid/discretization_grid.f90 b/src/grid/discretization_grid.f90 index 8592f7963..1c88e5817 100644 --- a/src/grid/discretization_grid.f90 +++ b/src/grid/discretization_grid.f90 @@ -69,7 +69,7 @@ subroutine discretization_grid_init(restart) integer, dimension(worldsize) :: & displs, sendcounts character(len=:), allocatable :: & - fileContent + fileContent, fname print'(/,a)', ' <<<+- discretization_grid init -+>>>'; flush(IO_STDOUT) @@ -78,8 +78,10 @@ subroutine discretization_grid_init(restart) if(worldrank == 0) then fileContent = IO_read(interface_geomFile) call readVTI(grid,geomSize,origin,materialAt_global,fileContent) + fname = interface_geomFile + if (scan(fname,'/') /= 0) fname = fname(scan(fname,'/',.true.)+1:) call results_openJobFile(parallel=.false.) - call results_writeDataset_str(fileContent,'setup',interface_geomFile,'geometry definition (grid solver)') + call results_writeDataset_str(fileContent,'setup',fname,'geometry definition (grid solver)') call results_closeJobFile else allocate(materialAt_global(0)) ! needed for IntelMPI diff --git a/src/math.f90 b/src/math.f90 index a48f44b93..052ff7fa0 100644 --- a/src/math.f90 +++ b/src/math.f90 @@ -1209,7 +1209,7 @@ subroutine selfTest error stop 'math_sym33to6/math_6toSym33' call random_number(t66) - if(any(dNeq(math_sym3333to66(math_66toSym3333(t66)),t66))) & + if(any(dNeq(math_sym3333to66(math_66toSym3333(t66)),t66,1.0e-15_pReal))) & error stop 'math_sym3333to66/math_66toSym3333' call random_number(v6) diff --git a/src/prec.f90 b/src/prec.f90 index 3090eb67c..4b70ffbfa 100644 --- a/src/prec.f90 +++ b/src/prec.f90 @@ -89,6 +89,7 @@ end subroutine prec_init ! replaces "==" but for certain (relative) tolerance. Counterpart to dNeq ! https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ ! AlmostEqualRelative +! ToDo: Use 'spacing': https://gcc.gnu.org/onlinedocs/gfortran/SPACING.html#SPACING !-------------------------------------------------------------------------------------------------- logical elemental pure function dEq(a,b,tol) diff --git a/src/results.f90 b/src/results.f90 index 9c4507938..5553a883a 100644 --- a/src/results.f90 +++ b/src/results.f90 @@ -65,13 +65,17 @@ subroutine results_init(restart) logical, intent(in) :: restart character(len=pPathLen) :: commandLine + integer :: hdferr + integer(HID_T) :: group_id + character(len=:), allocatable :: date + print'(/,a)', ' <<<+- results init -+>>>'; flush(IO_STDOUT) print*, 'M. Diehl et al., Integrating Materials and Manufacturing Innovation 6(1):83–91, 2017' print*, 'https://doi.org/10.1007/s40192-017-0084-5'//IO_EOL - if(.not. restart) then + if (.not. restart) then resultsFile = HDF5_openFile(getSolverJobName()//'.hdf5','w') call results_addAttribute('DADF5_version_major',0) call results_addAttribute('DADF5_version_minor',14) @@ -84,9 +88,20 @@ subroutine results_init(restart) call results_addAttribute('description','mappings to place data in space','cell_to') call results_closeGroup(results_addGroup('setup')) call results_addAttribute('description','input data used to run the simulation','setup') - call results_closeJobFile + else + date = now() + call results_openJobFile + call get_command(commandLine) + call results_addAttribute('call (restart at '//date//')',trim(commandLine)) + call h5gmove_f(resultsFile,'setup','tmp',hdferr) + call results_addAttribute('description','input data used to run the simulation (backup from restart at '//date//')','tmp') + call results_closeGroup(results_addGroup('setup')) + call results_addAttribute('description','input data used to run the simulation','setup') + call h5gmove_f(resultsFile,'tmp','setup/backup',hdferr) endif + call results_closeJobFile + end subroutine results_init