ISCE_INSAR/components/isceobj/LineAccessor/test/fortranSrc.F

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