diff --git a/CMakeLists.txt b/CMakeLists.txt index 708d8aa3c..dd2348fd1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -184,7 +184,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "DEBUG") endif () set (CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}} ${PETSC_INCLUDES} ${BUILDCMD_POST}") -set (CMAKE_Fortran_LINK_EXECUTABLE "${CMAKE_Fortran_LINK_EXECUTABLE} -o ${PETSC_EXTERNAL_LIB} ${BUILDCMD_POST}") +set (CMAKE_Fortran_LINK_EXECUTABLE "${CMAKE_Fortran_LINK_EXECUTABLE} -o ${PETSC_EXTERNAL_LIB} -lz ${BUILDCMD_POST}") message ("Fortran Compiler Flags:\n${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}}\n") message ("C Compiler Flags:\n${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}\n") diff --git a/src/C_routines.c b/src/C_routines.c index 723c2978d..927b26412 100644 --- a/src/C_routines.c +++ b/src/C_routines.c @@ -6,6 +6,7 @@ #include #include #include +#include "zlib.h" /* http://stackoverflow.com/questions/30279228/is-there-an-alternative-to-getcwd-in-fortran-2003-2008 */ @@ -57,3 +58,17 @@ void signalusr1_c(void (*handler)(int)){ void signalusr2_c(void (*handler)(int)){ signal(SIGUSR2, handler); } + +void inflate_c(const uLong *s_deflated, const uLong *s_inflated, const Byte deflated[], Byte inflated[]){ + /* make writable copy, uncompress will write to it */ + uLong s_inflated_; + s_inflated_ = *s_inflated; + + if(uncompress((Bytef *)inflated, &s_inflated_, (Bytef *)deflated, *s_deflated) == Z_OK) + return; + else{ + for(uLong i=0;i<*s_inflated;i++){ + inflated[i] = 0; + } + } +} diff --git a/src/zlib.f90 b/src/zlib.f90 new file mode 100644 index 000000000..670131334 --- /dev/null +++ b/src/zlib.f90 @@ -0,0 +1,44 @@ +!-------------------------------------------------------------------------------------------------- +!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH +!> @brief Inflate zlib compressed data +!-------------------------------------------------------------------------------------------------- +module zlib + use prec + + implicit none + private + + public :: & + zlib_inflate + + interface + + subroutine inflate_C(s_deflated,s_inflated,deflated,inflated) bind(C) + use, intrinsic :: ISO_C_Binding, only: & + C_SIGNED_CHAR, C_INT64_T + + integer(C_INT64_T), intent(in) :: s_deflated,s_inflated + integer(C_SIGNED_CHAR), dimension(s_deflated), intent(in) :: deflated + integer(C_SIGNED_CHAR), dimension(s_inflated), intent(out) :: inflated + + end subroutine inflate_C + + end interface + +contains + +!-------------------------------------------------------------------------------------------------- +!> @brief Inflate byte-wise representation +!-------------------------------------------------------------------------------------------------- +function zlib_inflate(deflated,size_inflated) + + integer(C_SIGNED_CHAR), dimension(:), intent(in) :: deflated + integer(pLongInt), intent(in) :: size_inflated + + integer(C_SIGNED_CHAR), dimension(size_inflated) :: zlib_inflate + + call inflate_C(size(deflated,kind=C_INT64_T),int(size_inflated,C_INT64_T),deflated,zlib_inflate) + +end function zlib_inflate + +end module zlib