120 lines
5.1 KiB
Fortran
120 lines
5.1 KiB
Fortran
|
|
subroutine testImageSetGet(ptImageAccessorGet,ptImageAccessorSet,choice)
|
|
implicit none
|
|
|
|
integer*8 ptImageAccessorSet !pointers to image accessor objects
|
|
integer*8 ptImageAccessorGet !pointers to image accessor objects
|
|
integer*4 choice
|
|
integer i,j,k
|
|
integer*4 eofGet, lineWidth,length, col, row,numEl, addVal,newLength
|
|
integer*4, allocatable, dimension(:):: dataLineRowIndx,dataLineColIndx
|
|
real*4, allocatable, dimension(:):: dataLineGet,dataLineSet
|
|
!this code shows few instance of how to read and write data to a file using the image API.
|
|
! data are read from one file and set into another. if choice = 2 the test is done assumning that the file endianness
|
|
! is opposite of the machine one, so in the output each group of fout bytes is swapped.
|
|
! part of the data are accessed first half line at the time in sequential order.
|
|
! second they are accessed randomly (see below for the exact order).
|
|
! third the remaining are accessed one line at the time.
|
|
if ((choice .eq. 1) .or. (choice .eq. 2)) then
|
|
! image is already initialized, so get some of the information
|
|
call getFileWidth(ptImageAccessorGet, lineWidth)
|
|
call getFileLength(ptImageAccessorGet, length)
|
|
! plan to access the output file randomly, so the file needs to exist already in its full size.
|
|
call createFile(ptImageAccessorSet, length)
|
|
|
|
allocate(dataLineGet(lineWidth))! where read data are stored
|
|
allocate(dataLineSet(lineWidth))! where write data are stored
|
|
allocate(dataLineRowIndx(lineWidth))! array with the row index positions when reading/writing randomly to file
|
|
allocate(dataLineColIndx(lineWidth))! array with the column index positions when reading/writing randomly to file
|
|
|
|
! print the images info
|
|
call printObjectInfo(ptImageAccessorGet)
|
|
call printObjectInfo(ptImageAccessorSet)
|
|
numEl = lineWidth/2
|
|
j = 1
|
|
!access the first 1/4 of the file sequentially, half line at the time. Use get,setSequentialElements()
|
|
do i = 1, length/4
|
|
do k = 1, 2
|
|
col = 1 + numEl*(k-1)! half line at the time
|
|
!get numEl elements from the image associated with ptImageAccessorGet starting from row j and column col
|
|
! and put them in dataLineGet
|
|
call getSequentialElements(ptImageAccessorGet,dataLineGet,j,col,numEl)
|
|
|
|
dataLineSet(1:numEl) = dataLineGet(1:numEl)
|
|
!set the numEl elements to the image associated with ptImageAccessorSet starting from row j and column col
|
|
call setSequentialElements(ptImageAccessorSet,dataLineSet,j,col,numEl)
|
|
enddo
|
|
j = j + 1
|
|
|
|
enddo
|
|
!access the second 1/4 (plus reminder if length/4 not integer) reading or setting lineWith elements at the time but for each element move one column and one row up taking
|
|
! the modulo of the lineWidth and length (i.e. access elements on the diagonals). in a 3 by 4 matrix this is the order in which
|
|
!elements are accessed
|
|
! 1 5 9
|
|
! 10 2 6
|
|
! 7 11 3
|
|
! 4 8 12
|
|
|
|
numEl = lineWidth
|
|
row = 0
|
|
col = 0
|
|
j = 0
|
|
newLength = length/4 + mod(length/2,4)
|
|
do i = 1, newLength*lineWidth
|
|
j = j + 1
|
|
! set the row and column indeces
|
|
dataLineRowIndx(j) = mod(row, newLength) + length/4 + 1
|
|
dataLineColIndx(j) = mod(col, lineWidth) + 1
|
|
col = col + 1
|
|
row = row + 1
|
|
if (mod(j,lineWidth) .eq. 0) then
|
|
!get the data in the positions specified by dataLineColIndx nad dataLineRowIndx
|
|
call getElements(ptImageAccessorGet,dataLineGet,dataLineRowIndx,dataLineColIndx,numEl)
|
|
! set the data in the same position
|
|
call setElements(ptImageAccessorSet,dataLineGet,dataLineRowIndx,dataLineColIndx,numEl)
|
|
|
|
j = 0
|
|
endif
|
|
enddo
|
|
|
|
! access the rest 1/4 of the files one line at the time using the get,setLine
|
|
|
|
do i = length/2 + 1, length/2 + length/4
|
|
eofGet = i
|
|
call getLine(ptImageAccessorGet,dataLineGet,eofGet)
|
|
dataLineSet(:) = dataLineGet(:)
|
|
! data from dataLineSet are put into the tile
|
|
call setLine(ptImageAccessorSet,dataLineSet,eofGet)
|
|
|
|
|
|
|
|
enddo
|
|
! access the rest 1/4 of the files one line at the time using the get,setLineSequential
|
|
call initSequentialAccessor(ptImageAccessorGet,length/2 + length/4 + 1)! need to set the first line
|
|
call initSequentialAccessor(ptImageAccessorSet,length/2 + length/4 + 1)! need to set the first line
|
|
|
|
do
|
|
call getLineSequential(ptImageAccessorGet,dataLineGet,eofGet)
|
|
!when eofGet < 0 then the end of file has been reached.
|
|
if(eofGet .lt. 0) then
|
|
exit
|
|
endif
|
|
dataLineSet(:) = dataLineGet(:)
|
|
! data from dataLineSet are put into the tile
|
|
call setLineSequential(ptImageAccessorSet,dataLineSet)
|
|
j = j - 1
|
|
|
|
|
|
|
|
enddo
|
|
|
|
deallocate(dataLineGet)
|
|
deallocate(dataLineSet)
|
|
deallocate(dataLineRowIndx)
|
|
deallocate(dataLineColIndx)
|
|
|
|
|
|
endif
|
|
|
|
end
|