set Lib_VTK_IO-master.zip and related files back to initial version, new version is not working with MSC.Marc 2010
This commit is contained in:
parent
53348db000
commit
190a59b707
|
@ -27,7 +27,6 @@
|
||||||
#include "../lib/kdtree2.f90"
|
#include "../lib/kdtree2.f90"
|
||||||
#endif
|
#endif
|
||||||
#include "../lib/IR_Precision.f90"
|
#include "../lib/IR_Precision.f90"
|
||||||
#include "../lib/Lib_Base64.f90"
|
|
||||||
#include "../lib/Lib_VTK_IO.f90"
|
#include "../lib/Lib_VTK_IO.f90"
|
||||||
|
|
||||||
module libs
|
module libs
|
||||||
|
|
|
@ -71,7 +71,7 @@ public:: I1P, FI1P, DI1P, MinI1P, MaxI1P, BII1P, BYI1P
|
||||||
public:: I_P, FI_P, DI_P, MinI_P, MaxI_P, BII_P, BYI_P
|
public:: I_P, FI_P, DI_P, MinI_P, MaxI_P, BII_P, BYI_P
|
||||||
public:: check_endian
|
public:: check_endian
|
||||||
public:: bit_size
|
public:: bit_size
|
||||||
public:: str, strz, cton, bstr, bcton
|
public:: str, strz, cton
|
||||||
public:: ir_initialized,IR_Init
|
public:: ir_initialized,IR_Init
|
||||||
public:: IR_Print
|
public:: IR_Print
|
||||||
!-----------------------------------------------------------------------------------------------------------------------------------
|
!-----------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -143,7 +143,7 @@ real(R4P), parameter:: MinR4P = -huge(1._R4P ), MaxR4P = huge(1._R4P ) !< Min
|
||||||
real(R_P), parameter:: MinR_P = MinR8P, MaxR_P = MaxR8P !< Min and max values of kind=R_P variable.
|
real(R_P), parameter:: MinR_P = MinR8P, MaxR_P = MaxR8P !< Min and max values of kind=R_P variable.
|
||||||
! Real number of bits/bytes
|
! Real number of bits/bytes
|
||||||
#ifdef r16p
|
#ifdef r16p
|
||||||
integer(I2P):: BIR16P, BYR16P !< Number of bits/bytes of kind=R16P variable.
|
integer(I1P):: BIR16P, BYR16P !< Number of bits/bytes of kind=R16P variable.
|
||||||
#endif
|
#endif
|
||||||
integer(I1P):: BIR8P, BYR8P !< Number of bits/bytes of kind=R8P variable.
|
integer(I1P):: BIR8P, BYR8P !< Number of bits/bytes of kind=R8P variable.
|
||||||
integer(I1P):: BIR4P, BYR4P !< Number of bits/bytes of kind=R4P variable.
|
integer(I1P):: BIR4P, BYR4P !< Number of bits/bytes of kind=R4P variable.
|
||||||
|
@ -156,11 +156,11 @@ real(R8P), parameter:: smallR8P = tiny(1._R8P ) !< Smallest representable valu
|
||||||
real(R4P), parameter:: smallR4P = tiny(1._R4P ) !< Smallest representable value of kind=R4P variable.
|
real(R4P), parameter:: smallR4P = tiny(1._R4P ) !< Smallest representable value of kind=R4P variable.
|
||||||
real(R_P), parameter:: smallR_P = smallR8P !< Smallest representable value of kind=R_P variable.
|
real(R_P), parameter:: smallR_P = smallR8P !< Smallest representable value of kind=R_P variable.
|
||||||
! Integer min and max values:
|
! Integer min and max values:
|
||||||
integer(I8P), parameter:: MinI8P = -huge(1_I8P), MaxI8P = huge(1_I8P) !< Min and max values of kind=I8P variable.
|
integer(I8P), parameter:: MinI8P = -huge(1_I8P)-1_I8P, MaxI8P = huge(1_I8P) !< Min and max values of kind=I8P variable.
|
||||||
integer(I4P), parameter:: MinI4P = -huge(1_I4P), MaxI4P = huge(1_I4P) !< Min and max values of kind=I4P variable.
|
integer(I4P), parameter:: MinI4P = -huge(1_I4P)-1_I4P, MaxI4P = huge(1_I4P) !< Min and max values of kind=I4P variable.
|
||||||
integer(I2P), parameter:: MinI2P = -huge(1_I2P), MaxI2P = huge(1_I2P) !< Min and max values of kind=I2P variable.
|
integer(I2P), parameter:: MinI2P = -huge(1_I2P)-1_I2P, MaxI2P = huge(1_I2P) !< Min and max values of kind=I2P variable.
|
||||||
integer(I1P), parameter:: MinI1P = -huge(1_I1P), MaxI1P = huge(1_I1P) !< Min and max values of kind=I1P variable.
|
integer(I1P), parameter:: MinI1P = -huge(1_I1P)-1_I1P, MaxI1P = huge(1_I1P) !< Min and max values of kind=I1P variable.
|
||||||
integer(I_P), parameter:: MinI_P = MinI4P, MaxI_P = MaxI4P !< Min and max values of kind=I_P variable.
|
integer(I_P), parameter:: MinI_P = MinI4P, MaxI_P = MaxI4P !< Min and max values of kind=I_P variable.
|
||||||
! Integer number of bits/bytes:
|
! Integer number of bits/bytes:
|
||||||
integer(I8P), parameter:: BII8P = bit_size(MaxI8P), BYI8P = bit_size(MaxI8P)/8_I8P !< Number of bits/bytes of kind=I8P variable.
|
integer(I8P), parameter:: BII8P = bit_size(MaxI8P), BYI8P = bit_size(MaxI8P)/8_I8P !< Number of bits/bytes of kind=I8P variable.
|
||||||
integer(I4P), parameter:: BII4P = bit_size(MaxI4P), BYI4P = bit_size(MaxI4P)/8_I4P !< Number of bits/bytes of kind=I4P variable.
|
integer(I4P), parameter:: BII4P = bit_size(MaxI4P), BYI4P = bit_size(MaxI4P)/8_I4P !< Number of bits/bytes of kind=I4P variable.
|
||||||
|
@ -206,14 +206,14 @@ endinterface
|
||||||
interface str
|
interface str
|
||||||
module procedure &
|
module procedure &
|
||||||
#ifdef r16p
|
#ifdef r16p
|
||||||
strf_R16P,str_R16P,&
|
str_R16P,strf_R16P,&
|
||||||
#endif
|
#endif
|
||||||
strf_R8P ,str_R8P, &
|
str_R8P,strf_R8P, &
|
||||||
strf_R4P ,str_R4P, &
|
str_R4P,strf_R4P, &
|
||||||
strf_I8P ,str_I8P, &
|
str_I8P,strf_I8P, &
|
||||||
strf_I4P ,str_I4P, &
|
str_I4P,strf_I4P, &
|
||||||
strf_I2P ,str_I2P, &
|
str_I2P,strf_I2P, &
|
||||||
strf_I1P ,str_I1P
|
str_I1P,strf_I1P
|
||||||
endinterface
|
endinterface
|
||||||
!> @brief Function for converting number, integer, to string, prefixing with the right number of zeros (number to string type
|
!> @brief Function for converting number, integer, to string, prefixing with the right number of zeros (number to string type
|
||||||
!> casting with zero padding);
|
!> casting with zero padding);
|
||||||
|
@ -243,38 +243,6 @@ interface cton
|
||||||
ctoi_I2P, &
|
ctoi_I2P, &
|
||||||
ctoi_I1P
|
ctoi_I1P
|
||||||
endinterface
|
endinterface
|
||||||
!> @brief Function for converting number, real and integer, to bit-string (number to bit-string type casting);
|
|
||||||
!> number, intent(\b IN):: <b>\em n</b> input number;
|
|
||||||
!> string, intent(\b OUT):: <b>\em bstr</b> output bit-string.
|
|
||||||
!> @ingroup IR_PrecisionInterface
|
|
||||||
interface bstr
|
|
||||||
module procedure &
|
|
||||||
#ifdef r16p
|
|
||||||
bstr_R16P,&
|
|
||||||
#endif
|
|
||||||
bstr_R8P, &
|
|
||||||
bstr_R4P, &
|
|
||||||
bstr_I8P, &
|
|
||||||
bstr_I4P, &
|
|
||||||
bstr_I2P, &
|
|
||||||
bstr_I1P
|
|
||||||
endinterface
|
|
||||||
!> @brief Function for converting bit-string to number, real or initeger, (bit-string to number type casting);
|
|
||||||
!> string, intent(\b IN):: <b>\em bstr</b> input bit-string;
|
|
||||||
!> number, intent(\b OUT):: <b>\em n</b> output number.
|
|
||||||
!> @ingroup IR_PrecisionInterface
|
|
||||||
interface bcton
|
|
||||||
module procedure &
|
|
||||||
#ifdef r16p
|
|
||||||
bctor_R16P, &
|
|
||||||
#endif
|
|
||||||
bctor_R8P, &
|
|
||||||
bctor_R4P, &
|
|
||||||
bctoi_I8P, &
|
|
||||||
bctoi_I4P, &
|
|
||||||
bctoi_I2P, &
|
|
||||||
bctoi_I1P
|
|
||||||
endinterface
|
|
||||||
!-----------------------------------------------------------------------------------------------------------------------------------
|
!-----------------------------------------------------------------------------------------------------------------------------------
|
||||||
contains
|
contains
|
||||||
!> @ingroup IR_PrecisionPublicProcedure
|
!> @ingroup IR_PrecisionPublicProcedure
|
||||||
|
@ -321,12 +289,12 @@ contains
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
!---------------------------------------------------------------------------------------------------------------------------------
|
||||||
implicit none
|
implicit none
|
||||||
real(R16P), intent(IN):: i !< Real variable of which number of bits must be computed.
|
real(R16P), intent(IN):: i !< Real variable of which number of bits must be computed.
|
||||||
integer(I2P):: bits !< Number of bits of i.
|
integer(I1P):: bits !< Number of bits of i.
|
||||||
integer(I1P):: mold(1) !< "Molding" dummy variable for bits counting.
|
integer(I1P):: mold(1) !< "Molding" dummy variable for bits counting.
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
!---------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
!---------------------------------------------------------------------------------------------------------------------------------
|
||||||
bits = size(transfer(i,mold))*8_I2P
|
bits = size(transfer(i,mold))*8_I1P
|
||||||
return
|
return
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
!---------------------------------------------------------------------------------------------------------------------------------
|
||||||
endfunction bit_size_R16P
|
endfunction bit_size_R16P
|
||||||
|
@ -814,203 +782,6 @@ contains
|
||||||
return
|
return
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
!---------------------------------------------------------------------------------------------------------------------------------
|
||||||
endfunction ctoi_I1P
|
endfunction ctoi_I1P
|
||||||
|
|
||||||
#ifdef r16p
|
|
||||||
!> @brief Function for converting real to string of bits. This function achieves casting of real to bit-string.
|
|
||||||
!> @note It is assumed that R16P is represented by means of 128 bits, but this is not ensured in all architectures.
|
|
||||||
elemental function bstr_R16P(n) result(bstr)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R8P), intent(IN):: n !< Real to be converted.
|
|
||||||
character(128):: bstr !< Returned bit-string containing input number.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
write(bstr,'(B128.128)')n ! Casting of n to bit-string.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bstr_R16P
|
|
||||||
#endif
|
|
||||||
|
|
||||||
!> @brief Function for converting real to string of bits. This function achieves casting of real to bit-string.
|
|
||||||
!> @note It is assumed that R8P is represented by means of 64 bits, but this is not ensured in all architectures.
|
|
||||||
elemental function bstr_R8P(n) result(bstr)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R8P), intent(IN):: n !< Real to be converted.
|
|
||||||
character(64):: bstr !< Returned bit-string containing input number.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
write(bstr,'(B64.64)')n ! Casting of n to bit-string.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bstr_R8P
|
|
||||||
|
|
||||||
!> @brief Function for converting real to string of bits. This function achieves casting of real to bit-string.
|
|
||||||
!> @note It is assumed that R4P is represented by means of 32 bits, but this is not ensured in all architectures.
|
|
||||||
elemental function bstr_R4P(n) result(bstr)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R4P), intent(IN):: n !< Real to be converted.
|
|
||||||
character(32):: bstr !< Returned bit-string containing input number.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
write(bstr,'(B32.32)')n ! Casting of n to bit-string.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bstr_R4P
|
|
||||||
|
|
||||||
!> @brief Function for converting integer to string of bits. This function achieves casting of integer to bit-string.
|
|
||||||
!> @note It is assumed that I8P is represented by means of 64 bits, but this is not ensured in all architectures.
|
|
||||||
elemental function bstr_I8P(n) result(bstr)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I8P), intent(IN):: n !< Real to be converted.
|
|
||||||
character(64):: bstr !< Returned bit-string containing input number.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
write(bstr,'(B64.64)')n ! Casting of n to bit-string.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bstr_I8P
|
|
||||||
|
|
||||||
!> @brief Function for converting integer to string of bits. This function achieves casting of integer to bit-string.
|
|
||||||
!> @note It is assumed that I4P is represented by means of 32 bits, but this is not ensured in all architectures.
|
|
||||||
elemental function bstr_I4P(n) result(bstr)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: n !< Real to be converted.
|
|
||||||
character(32):: bstr !< Returned bit-string containing input number.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
write(bstr,'(B32.32)')n ! Casting of n to bit-string.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bstr_I4P
|
|
||||||
|
|
||||||
!> @brief Function for converting integer to string of bits. This function achieves casting of integer to bit-string.
|
|
||||||
!> @note It is assumed that I2P is represented by means of 16 bits, but this is not ensured in all architectures.
|
|
||||||
elemental function bstr_I2P(n) result(bstr)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I2P), intent(IN):: n !< Real to be converted.
|
|
||||||
character(16):: bstr !< Returned bit-string containing input number.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
write(bstr,'(B16.16)')n ! Casting of n to bit-string.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bstr_I2P
|
|
||||||
|
|
||||||
!> @brief Function for converting integer to string of bits. This function achieves casting of integer to bit-string.
|
|
||||||
!> @note It is assumed that I1P is represented by means of 8 bits, but this is not ensured in all architectures.
|
|
||||||
elemental function bstr_I1P(n) result(bstr)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I1P), intent(IN):: n !< Real to be converted.
|
|
||||||
character(8):: bstr !< Returned bit-string containing input number.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
write(bstr,'(B8.8)')n ! Casting of n to bit-string.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bstr_I1P
|
|
||||||
|
|
||||||
!> @brief Function for converting bit-string to real. This function achieves casting of bit-string to real.
|
|
||||||
elemental function bctor_R8P(bstr,knd) result(n)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
character(*), intent(IN):: bstr !< String containing input number.
|
|
||||||
real(R8P), intent(IN):: knd !< Number kind.
|
|
||||||
real(R8P):: n !< Number returned.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
read(bstr,'(B'//trim(str(.true.,bit_size(knd)))//'.'//trim(str(.true.,bit_size(knd)))//')')n ! Casting of bstr to n.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bctor_R8P
|
|
||||||
|
|
||||||
!> @brief Function for converting bit-string to real. This function achieves casting of bit-string to real.
|
|
||||||
elemental function bctor_R4P(bstr,knd) result(n)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
character(*), intent(IN):: bstr !< String containing input number.
|
|
||||||
real(R4P), intent(IN):: knd !< Number kind.
|
|
||||||
real(R4P):: n !< Number returned.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
read(bstr,'(B'//trim(str(.true.,bit_size(knd)))//'.'//trim(str(.true.,bit_size(knd)))//')')n ! Casting of bstr to n.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bctor_R4P
|
|
||||||
|
|
||||||
!> @brief Function for converting bit-string to integer. This function achieves casting of bit-string to integer.
|
|
||||||
elemental function bctoi_I8P(bstr,knd) result(n)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
character(*), intent(IN):: bstr !< String containing input number.
|
|
||||||
integer(I8P), intent(IN):: knd !< Number kind.
|
|
||||||
integer(I8P):: n !< Number returned.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
read(bstr,'(B'//trim(str(.true.,bit_size(knd)))//'.'//trim(str(.true.,bit_size(knd)))//')')n ! Casting of bstr to n.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bctoi_I8P
|
|
||||||
|
|
||||||
!> @brief Function for converting bit-string to integer. This function achieves casting of bit-string to integer.
|
|
||||||
elemental function bctoi_I4P(bstr,knd) result(n)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
character(*), intent(IN):: bstr !< String containing input number.
|
|
||||||
integer(I4P), intent(IN):: knd !< Number kind.
|
|
||||||
integer(I4P):: n !< Number returned.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
read(bstr,'(B'//trim(str(.true.,bit_size(knd)))//'.'//trim(str(.true.,bit_size(knd)))//')')n ! Casting of bstr to n.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bctoi_I4P
|
|
||||||
|
|
||||||
!> @brief Function for converting bit-string to integer. This function achieves casting of bit-string to integer.
|
|
||||||
elemental function bctoi_I2P(bstr,knd) result(n)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
character(*), intent(IN):: bstr !< String containing input number.
|
|
||||||
integer(I2P), intent(IN):: knd !< Number kind.
|
|
||||||
integer(I2P):: n !< Number returned.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
read(bstr,'(B'//trim(str(.true.,bit_size(knd)))//'.'//trim(str(.true.,bit_size(knd)))//')')n ! Casting of bstr to n.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bctoi_I2P
|
|
||||||
|
|
||||||
!> @brief Function for converting bit-string to integer. This function achieves casting of bit-string to integer.
|
|
||||||
elemental function bctoi_I1P(bstr,knd) result(n)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
character(*), intent(IN):: bstr !< String containing input number.
|
|
||||||
integer(I1P), intent(IN):: knd !< Number kind.
|
|
||||||
integer(I1P):: n !< Number returned.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
read(bstr,'(B'//trim(str(.true.,bit_size(knd)))//'.'//trim(str(.true.,bit_size(knd)))//')')n ! Casting of bstr to n.
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endfunction bctoi_I1P
|
|
||||||
!> @}
|
!> @}
|
||||||
|
|
||||||
!> Subroutine for initilizing module's variables that are not initialized into the definition specification.
|
!> Subroutine for initilizing module's variables that are not initialized into the definition specification.
|
||||||
|
|
|
@ -1,867 +0,0 @@
|
||||||
!> @ingroup Library
|
|
||||||
!> @{
|
|
||||||
!> @defgroup Lib_Base64Library Lib_Base64
|
|
||||||
!> @}
|
|
||||||
|
|
||||||
!> @ingroup Interface
|
|
||||||
!> @{
|
|
||||||
!> @defgroup Lib_Base64Interface Lib_Base64
|
|
||||||
!> @}
|
|
||||||
|
|
||||||
!> @ingroup PublicProcedure
|
|
||||||
!> @{
|
|
||||||
!> @defgroup Lib_Base64PublicProcedure Lib_Base64
|
|
||||||
!> @}
|
|
||||||
|
|
||||||
!> @ingroup PrivateProcedure
|
|
||||||
!> @{
|
|
||||||
!> @defgroup Lib_Base64PrivateProcedure Lib_Base64
|
|
||||||
!> @}
|
|
||||||
|
|
||||||
!> @ingroup GlobalVarPar
|
|
||||||
!> @{
|
|
||||||
!> @defgroup Lib_Base64GlobalVarPar Lib_Base64
|
|
||||||
!> @}
|
|
||||||
|
|
||||||
!> @ingroup PrivateVarPar
|
|
||||||
!> @{
|
|
||||||
!> @defgroup Lib_Base64PrivateVarPar Lib_Base64
|
|
||||||
!> @}
|
|
||||||
|
|
||||||
!> This module contains base64 encoding/decoding procedures.
|
|
||||||
!> @todo \b Decoding: Implement decoding functions.
|
|
||||||
!> @todo \b DocComplete: Complete the documentation.
|
|
||||||
!> @ingroup Lib_Base64Library
|
|
||||||
module Lib_Base64
|
|
||||||
!-----------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
USE IR_Precision ! Integers and reals precision definition.
|
|
||||||
!-----------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!-----------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
private
|
|
||||||
public:: b64_encode
|
|
||||||
!public:: b64_decode
|
|
||||||
public:: pack_data
|
|
||||||
!-----------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!-----------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
!> @ingroup Lib_Base64GlobalVarPar
|
|
||||||
!> @{
|
|
||||||
!> @}
|
|
||||||
!> @ingroup Lib_Base64PrivateVarPar
|
|
||||||
!> @{
|
|
||||||
character(64):: base64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" !< Base64 alphabet.
|
|
||||||
!> @}
|
|
||||||
!-----------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!-----------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief Subroutine for encoding numbers (integer and real) to base64.
|
|
||||||
!> @ingroup Lib_Base64Interface
|
|
||||||
interface b64_encode
|
|
||||||
module procedure b64_encode_R8_a, &
|
|
||||||
b64_encode_R4_a, &
|
|
||||||
b64_encode_I8_a, &
|
|
||||||
b64_encode_I4_a, &
|
|
||||||
b64_encode_I2_a, &
|
|
||||||
b64_encode_I1_a
|
|
||||||
endinterface
|
|
||||||
!!> @brief Subroutine for decoding numbers (integer and real) from base64.
|
|
||||||
!!> @ingroup Lib_Base64Interface
|
|
||||||
!interface b64_decode
|
|
||||||
! module procedure b64_decode_R8_a, &
|
|
||||||
! b64_decode_R4_a, &
|
|
||||||
! b64_decode_I8_a, &
|
|
||||||
! b64_decode_I4_a, &
|
|
||||||
! b64_decode_I2_a, &
|
|
||||||
! b64_decode_I1_a
|
|
||||||
!endinterface
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array. This is useful for encoding different kinds
|
|
||||||
!> variables into a single stream of bits.
|
|
||||||
!> @ingroup Lib_Base64Interface
|
|
||||||
interface pack_data
|
|
||||||
module procedure pack_data_R8_R4,pack_data_R8_I8,pack_data_R8_I4,pack_data_R8_I2,pack_data_R8_I1, &
|
|
||||||
pack_data_R4_R8,pack_data_R4_I8,pack_data_R4_I4,pack_data_R4_I2,pack_data_R4_I1, &
|
|
||||||
pack_data_I8_R8,pack_data_I8_R4,pack_data_I8_I4,pack_data_I8_I2,pack_data_I8_I1, &
|
|
||||||
pack_data_I4_R8,pack_data_I4_R4,pack_data_I4_I8,pack_data_I4_I2,pack_data_I4_I1, &
|
|
||||||
pack_data_I2_R8,pack_data_I2_R4,pack_data_I2_I8,pack_data_I2_I4,pack_data_I2_I1, &
|
|
||||||
pack_data_I1_R8,pack_data_I1_R4,pack_data_I1_I8,pack_data_I1_I4,pack_data_I1_I2
|
|
||||||
endinterface
|
|
||||||
!-----------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
contains
|
|
||||||
!> @ingroup Lib_Base64PrivateProcedure
|
|
||||||
!> @{
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_R8_R4(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R8P), intent(IN):: a1(1:) !< Firs data stream.
|
|
||||||
real(R4P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_R8_R4
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_R8_I8(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R8P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I8P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_R8_I8
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_R8_I4(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R8P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I4P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_R8_I4
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_R8_I2(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R8P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I2P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_R8_I2
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_R8_I1(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R8P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I1P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_R8_I1
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_R4_R8(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R4P), intent(IN):: a1(1:) !< Firs data stream.
|
|
||||||
real(R8P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_R4_R8
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_R4_I8(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R4P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I8P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_R4_I8
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_R4_I4(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R4P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I4P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_R4_I4
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_R4_I2(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R4P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I2P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_R4_I2
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_R4_I1(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
real(R4P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I1P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_R4_I1
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I8_R8(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I8P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
real(R8P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I8_R8
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I8_R4(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I8P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
real(R4P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I8_R4
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I8_I4(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I8P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I4P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I8_I4
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I8_I2(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I8P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I2P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I8_I2
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I8_I1(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I8P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I1P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I8_I1
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I4_R8(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
real(R8P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I4_R8
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I4_R4(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
real(R4P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I4_R4
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I4_I8(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I8P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I4_I8
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I4_I2(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I2P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I4_I2
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I4_I1(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I1P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I4_I1
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I2_R8(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I2P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
real(R8P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I2_R8
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I2_R4(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I2P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
real(R4P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I2_R4
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I2_I8(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I2P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I8P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I2_I8
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I2_I4(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I2P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I4P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I2_I4
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I2_I1(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I2P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I1P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I2_I1
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I1_R8(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I1P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
real(R8P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I1_R8
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I1_R4(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I1P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
real(R4P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I1_R4
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I1_I8(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I1P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I8P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I1_I8
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I1_I4(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I1P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I4P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I1_I4
|
|
||||||
|
|
||||||
!> @brief Subroutine for packing different kinds of data into single I1P array.
|
|
||||||
pure subroutine pack_data_I1_I2(a1,a2,packed)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I1P), intent(IN):: a1(1:) !< First data stream.
|
|
||||||
integer(I2P), intent(IN):: a2(1:) !< Second data stream.
|
|
||||||
integer(I1P), allocatable, intent(INOUT):: packed(:) !< Packed data into I1P array.
|
|
||||||
integer(I1P), allocatable:: p1(:) !< Temporary packed data of first stream.
|
|
||||||
integer(I1P), allocatable:: p2(:) !< Temporary packed data of second stream.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
p1 = transfer(a1,p1) ; p2 = transfer(a2,p2)
|
|
||||||
if (allocated(packed)) deallocate(packed) ; allocate(packed(1:size(p1,dim=1)+size(p2,dim=1)))
|
|
||||||
packed = [p1,p2]
|
|
||||||
deallocate(p1,p2)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine pack_data_I1_I2
|
|
||||||
|
|
||||||
!> @brief Subroutine for encoding bits (must be multiple of 24 bits) into base64 charcaters code (of length multiple of 4).
|
|
||||||
!> @note The bits stream are encoded in chunks of 24 bits as the following example (in little endian order):
|
|
||||||
!> @code
|
|
||||||
!> +--first octet--+-second octet--+--third octet--+
|
|
||||||
!> |7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|
|
|
||||||
!> +-----------+---+-------+-------+---+-----------+
|
|
||||||
!> |5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0|
|
|
||||||
!> +--1.index--+--2.index--+--3.index--+--4.index--+
|
|
||||||
!> @endcode
|
|
||||||
!> The 4 indexes are stored into 4 elements 8 bits array, thus 2 bits of each array element are not used.
|
|
||||||
pure subroutine encode_bits(bits,padd,code)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I1P), intent(IN):: bits(1:) !< Bits to be encoded.
|
|
||||||
integer(I4P), intent(IN):: padd !< Number of padding characters ('=').
|
|
||||||
character(*), intent(OUT):: code !< Characters code.
|
|
||||||
integer(I1P):: sixb(1:4) !< 6 bits slices (stored into 8 bits integer) of 24 bits input.
|
|
||||||
integer(I8P):: c,e !< Counters.
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
c = 1_I8P
|
|
||||||
do e=1_I8P,size(bits,dim=1),3_I8P ! loop over array elements: 3 bytes (24 bits) scanning
|
|
||||||
sixb = 0_I1P
|
|
||||||
call mvbits(bits(e ),2,6,sixb(1),0)
|
|
||||||
call mvbits(bits(e ),0,2,sixb(2),4) ; call mvbits(bits(e+1),4,4,sixb(2),0)
|
|
||||||
call mvbits(bits(e+1),0,4,sixb(3),2) ; call mvbits(bits(e+2),6,2,sixb(3),0)
|
|
||||||
call mvbits(bits(e+2),0,6,sixb(4),0)
|
|
||||||
sixb = sixb + 1_I1P
|
|
||||||
code(c :c ) = base64(sixb(1):sixb(1))
|
|
||||||
code(c+1:c+1) = base64(sixb(2):sixb(2))
|
|
||||||
code(c+2:c+2) = base64(sixb(3):sixb(3))
|
|
||||||
code(c+3:c+3) = base64(sixb(4):sixb(4))
|
|
||||||
c = c + 4_I8P
|
|
||||||
enddo
|
|
||||||
if (padd>0) code(len(code)-padd+1:)=repeat('=',padd)
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine encode_bits
|
|
||||||
|
|
||||||
!> @brief Subroutine for encoding array numbers to base64 (R8P).
|
|
||||||
pure subroutine b64_encode_R8_a(nB,n,code)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: nB !< Number of bytes of single element of n.
|
|
||||||
real(R8P), intent(IN):: n(1:) !< Array of numbers to be encoded.
|
|
||||||
character(((size(n,dim=1)*nB+2)/3)*4), intent(OUT):: code !< Encoded array.
|
|
||||||
integer(I1P):: nI1P(1:((size(n,dim=1)*nB+2)/3)*3) !< One byte integer array containing n.
|
|
||||||
integer(I4P):: padd !< Number of padding characters ('=').
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
nI1P = transfer(n,nI1P) ! casting n to integer array of 1 byte elements
|
|
||||||
padd = mod((size(n,dim=1)*nB),3_I4P) ; if (padd>0_I4P) padd = 3_I4P - padd ! computing the number of padding characters
|
|
||||||
call encode_bits(bits=nI1P,padd=padd,code=code) ! encoding bits
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine b64_encode_R8_a
|
|
||||||
|
|
||||||
!> @brief Subroutine for encoding array numbers to base64 (R4P).
|
|
||||||
pure subroutine b64_encode_R4_a(nB,n,code)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: nB !< Number of bytes of single element of n.
|
|
||||||
real(R4P), intent(IN):: n(1:) !< Array of numbers to be encoded.
|
|
||||||
character(((size(n,dim=1)*nB+2)/3)*4), intent(OUT):: code !< Encoded array.
|
|
||||||
integer(I1P):: nI1P(1:((size(n,dim=1)*nB+2)/3)*3) !< One byte integer array containing n.
|
|
||||||
integer(I4P):: padd !< Number of padding characters ('=').
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
nI1P = transfer(n,nI1P) ! casting n to integer array of 1 byte elements
|
|
||||||
padd = mod((size(n,dim=1)*nB),3_I4P) ; if (padd>0_I4P) padd = 3_I4P - padd ! computing the number of padding characters
|
|
||||||
call encode_bits(bits=nI1P,padd=padd,code=code) ! encoding bits
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine b64_encode_R4_a
|
|
||||||
|
|
||||||
!> @brief Subroutine for encoding array numbers to base64 (I8P).
|
|
||||||
pure subroutine b64_encode_I8_a(nB,n,code)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: nB !< Number of bytes of single element of n.
|
|
||||||
integer(I8P), intent(IN):: n(1:) !< Array of numbers to be encoded.
|
|
||||||
character(((size(n,dim=1)*nB+2)/3)*4), intent(OUT):: code !< Encoded array.
|
|
||||||
integer(I1P):: nI1P(1:((size(n,dim=1)*nB+2)/3)*3) !< One byte integer array containing n.
|
|
||||||
integer(I4P):: padd !< Number of padding characters ('=').
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
nI1P = transfer(n,nI1P) ! casting n to integer array of 1 byte elements
|
|
||||||
padd = mod((size(n,dim=1)*nB),3_I4P) ; if (padd>0_I4P) padd = 3_I4P - padd ! computing the number of padding characters
|
|
||||||
call encode_bits(bits=nI1P,padd=padd,code=code) ! encoding bits
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine b64_encode_I8_a
|
|
||||||
|
|
||||||
!> @brief Subroutine for encoding array numbers to base64 (I4P).
|
|
||||||
pure subroutine b64_encode_I4_a(nB,n,code)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: nB !< Number of bytes of single element of n.
|
|
||||||
integer(I4P), intent(IN):: n(1:) !< Array of numbers to be encoded.
|
|
||||||
character(((size(n,dim=1)*nB+2)/3)*4), intent(OUT):: code !< Encoded array.
|
|
||||||
integer(I1P):: nI1P(1:((size(n,dim=1)*nB+2)/3)*3) !< One byte integer array containing n.
|
|
||||||
integer(I4P):: padd !< Number of padding characters ('=').
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
nI1P = transfer(n,nI1P) ! casting n to integer array of 1 byte elements
|
|
||||||
padd = mod((size(n,dim=1)*nB),3_I4P) ; if (padd>0_I4P) padd = 3_I4P - padd ! computing the number of padding characters
|
|
||||||
call encode_bits(bits=nI1P,padd=padd,code=code) ! encoding bits
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine b64_encode_I4_a
|
|
||||||
|
|
||||||
!> @brief Subroutine for encoding array numbers to base64 (I2P).
|
|
||||||
pure subroutine b64_encode_I2_a(nB,n,code)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: nB !< Number of bytes of single element of n.
|
|
||||||
integer(I2P), intent(IN):: n(1:) !< Array of numbers to be encoded.
|
|
||||||
character(((size(n,dim=1)*nB+2)/3)*4), intent(OUT):: code !< Encoded array.
|
|
||||||
integer(I1P):: nI1P(1:((size(n,dim=1)*nB+2)/3)*3) !< One byte integer array containing n.
|
|
||||||
integer(I4P):: padd !< Number of padding characters ('=').
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
nI1P = transfer(n,nI1P) ! casting n to integer array of 1 byte elements
|
|
||||||
padd = mod((size(n,dim=1)*nB),3_I4P) ; if (padd>0_I4P) padd = 3_I4P - padd ! computing the number of padding characters
|
|
||||||
call encode_bits(bits=nI1P,padd=padd,code=code) ! encoding bits
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine b64_encode_I2_a
|
|
||||||
|
|
||||||
!> @brief Subroutine for encoding array numbers to base64 (I1P).
|
|
||||||
pure subroutine b64_encode_I1_a(nB,n,code)
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
implicit none
|
|
||||||
integer(I4P), intent(IN):: nB !< Number of bytes of single element of n.
|
|
||||||
integer(I1P), intent(IN):: n(1:) !< Array of numbers to be encoded.
|
|
||||||
character(((size(n,dim=1)*nB+2)/3)*4), intent(OUT):: code !< Encoded array.
|
|
||||||
integer(I1P):: nI1P(1:((size(n,dim=1)*nB+2)/3)*3) !< One byte integer array containing n.
|
|
||||||
integer(I4P):: padd !< Number of padding characters ('=').
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
nI1P = transfer(n,nI1P) ! casting n to integer array of 1 byte elements
|
|
||||||
padd = mod((size(n,dim=1)*nB),3_I4P) ; if (padd>0_I4P) padd = 3_I4P - padd ! computing the number of padding characters
|
|
||||||
call encode_bits(bits=nI1P,padd=padd,code=code) ! encoding bits
|
|
||||||
return
|
|
||||||
!---------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
endsubroutine b64_encode_I1_a
|
|
||||||
|
|
||||||
!!> @brief Subroutine for decoding array numbers from base64 (R8P).
|
|
||||||
!pure subroutine b64_decode_R8_a(code,n)
|
|
||||||
!!--------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
!implicit none
|
|
||||||
!real(R8P), intent(OUT):: n(1:) !< Number to be decoded.
|
|
||||||
!character(ncR8P*size(n,dim=1)), intent(IN):: code !< Encoded number.
|
|
||||||
!integer(I4P):: c,d !< Counters.
|
|
||||||
!!--------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!!--------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
!d = 1_I4P
|
|
||||||
!do c=1,len(code),ncR8P
|
|
||||||
! call b64_decode_R8_s(code=code(c:c+ncR8P-1),n=n(d))
|
|
||||||
! d = d + 1_I4P
|
|
||||||
!enddo
|
|
||||||
!return
|
|
||||||
!!--------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
!endsubroutine b64_decode_R8_a
|
|
||||||
!> @}
|
|
||||||
endmodule Lib_Base64
|
|
3206
lib/Lib_VTK_IO.f90
3206
lib/Lib_VTK_IO.f90
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue