change runDenseOffset(s) in Alos2Proc/TopsProc in accordance with updated PyCuAmpcor

LT1AB
Lijun Zhu 2021-02-13 12:56:58 -08:00
parent 86a35acd5e
commit 563568561d
7 changed files with 158 additions and 79 deletions

View File

@ -70,7 +70,7 @@ def runDenseOffset(self):
#get water body mask #get water body mask
wbd0=np.memmap('wbd.rdr', dtype=np.int8, mode='r', shape=(length0, width0)) wbd0=np.memmap('wbd.rdr', dtype=np.int8, mode='r', shape=(length0, width0))
wbd0=wbd0[0+self._insar.offsetImageTopoffset:length0:self.offsetSkipHeight, wbd0=wbd0[0+self._insar.offsetImageTopoffset:length0:self.offsetSkipHeight,
0+self._insar.offsetImageLeftoffset:width0:self.offsetSkipWidth] 0+self._insar.offsetImageLeftoffset:width0:self.offsetSkipWidth]
wbd = np.zeros((length+100, width+100), dtype=np.int8) wbd = np.zeros((length+100, width+100), dtype=np.int8)
wbd[0:wbd0.shape[0], 0:wbd0.shape[1]]=wbd0 wbd[0:wbd0.shape[0], 0:wbd0.shape[1]]=wbd0
@ -240,15 +240,11 @@ def runDenseOffsetGPU(self):
print('dense offset skip width: %d' % (self.offsetSkipWidth)) print('dense offset skip width: %d' % (self.offsetSkipWidth))
print('dense offset skip hight: %d' % (self.offsetSkipHeight)) print('dense offset skip hight: %d' % (self.offsetSkipHeight))
print('dense offset covariance surface oversample factor: %d' % (self.offsetCovarianceOversamplingFactor)) print('dense offset covariance surface oversample factor: %d' % (self.offsetCovarianceOversamplingFactor))
print('dense offset covariance surface oversample window size: %d\n' % (self.offsetCovarianceOversamplingWindowsize))
objOffset = PyCuAmpcor.PyCuAmpcor() objOffset = PyCuAmpcor.PyCuAmpcor()
objOffset.algorithm = 0 objOffset.algorithm = 0
objOffset.deviceID = -1 objOffset.derampMethod = 1 # 1=linear phase ramp, 0=take mag, 2=skip
objOffset.nStreams = 2
#original ampcor program in roi_pac uses phase gradient to deramp
objOffset.derampMethod = 2
objOffset.referenceImageName = self._insar.referenceSlc objOffset.referenceImageName = self._insar.referenceSlc
objOffset.referenceImageHeight = m.length objOffset.referenceImageHeight = m.length
objOffset.referenceImageWidth = m.width objOffset.referenceImageWidth = m.width
@ -256,56 +252,79 @@ def runDenseOffsetGPU(self):
objOffset.secondaryImageHeight = s.length objOffset.secondaryImageHeight = s.length
objOffset.secondaryImageWidth = s.width objOffset.secondaryImageWidth = s.width
objOffset.offsetImageName = self._insar.denseOffset objOffset.offsetImageName = self._insar.denseOffset
objOffset.grossOffsetImageName = self._insar.denseOffset + ".gross"
objOffset.snrImageName = self._insar.denseOffsetSnr objOffset.snrImageName = self._insar.denseOffsetSnr
objOffset.covImageName = self._insar.denseOffsetCov
objOffset.windowSizeWidth = self.offsetWindowWidth objOffset.windowSizeWidth = self.offsetWindowWidth
objOffset.windowSizeHeight = self.offsetWindowHeight objOffset.windowSizeHeight = self.offsetWindowHeight
#objOffset.halfSearchRangeAcross = int(self.offsetSearchWindowWidth / 2 + 0.5)
#objOffset.halfSearchRangeDown = int(self.offsetSearchWindowHeight / 2 + 0.5)
objOffset.halfSearchRangeAcross = self.offsetSearchWindowWidth objOffset.halfSearchRangeAcross = self.offsetSearchWindowWidth
objOffset.halfSearchRangeDown = self.offsetSearchWindowHeight objOffset.halfSearchRangeDown = self.offsetSearchWindowHeight
objOffset.skipSampleDown = self.offsetSkipHeight objOffset.skipSampleDown = self.offsetSkipHeight
objOffset.skipSampleAcross = self.offsetSkipWidth objOffset.skipSampleAcross = self.offsetSkipWidth
#Oversampling method for correlation surface(0=fft,1=sinc) #Oversampling method for correlation surface(0=fft,1=sinc)
objOffset.corrSufaceOverSamplingMethod = 0 objOffset.corrSurfaceOverSamplingMethod = 0
objOffset.corrSurfaceOverSamplingFactor = self.offsetCovarianceOversamplingFactor objOffset.corrSurfaceOverSamplingFactor = self.offsetCovarianceOversamplingFactor
objOffset.corrSurfaceZoomInWindow = self.offsetCovarianceOversamplingWindowsize
# set gross offset
objOffset.grossOffsetAcrossStatic = 0 objOffset.grossOffsetAcrossStatic = 0
objOffset.grossOffsetDownStatic = 0 objOffset.grossOffsetDownStatic = 0
# set the margin
margin = 0
objOffset.referenceStartPixelDownStatic = self.offsetWindowHeight//2 # adjust the margin
objOffset.referenceStartPixelAcrossStatic = self.offsetWindowWidth//2 margin = max(margin, abs(objOffset.grossOffsetAcrossStatic), abs(objOffset.grossOffsetDownStatic))
objOffset.numberWindowDown = (m.length - 2*self.offsetSearchWindowHeight - self.offsetWindowHeight) // self.offsetSkipHeight # set the starting pixel of the first reference window
objOffset.numberWindowAcross = (m.width - 2*self.offsetSearchWindowWidth - self.offsetWindowWidth) // self.offsetSkipWidth objOffset.referenceStartPixelDownStatic = margin + self.offsetSearchWindowHeight
objOffset.referenceStartPixelAcrossStatic = margin + self.offsetSearchWindowWidth
# generic control # find out the total number of windows
objOffset.numberWindowDownInChunk = 8 objOffset.numberWindowDown = (m.length - 2*margin - 2*self.offsetSearchWindowHeight - self.offsetWindowHeight) // self.offsetSkipHeight
objOffset.numberWindowAcrossInChunk = 8 objOffset.numberWindowAcross = (m.width - 2*margin - 2*self.offsetSearchWindowWidth - self.offsetWindowWidth) // self.offsetSkipWidth
# gpu job control
objOffset.deviceID = 0
objOffset.nStreams = 2
objOffset.numberWindowDownInChunk = 1
objOffset.numberWindowAcrossInChunk = 64
objOffset.mmapSize = 16 objOffset.mmapSize = 16
# pass/adjust the parameters
objOffset.setupParams() objOffset.setupParams()
objOffset.setConstantGrossOffset(0, 0) # set up the starting pixels for each window, based on the gross offset
objOffset.setConstantGrossOffset(objOffset.grossOffsetAcrossStatic, objOffset.grossOffsetDownStatic)
# check whether all pixels are in image range (optional)
objOffset.checkPixelInImageRange() objOffset.checkPixelInImageRange()
print('\n======================================')
print('Running PyCuAmpcor...')
print('======================================\n')
objOffset.runAmpcor() objOffset.runAmpcor()
### Store params for later ### Store params for later
self._insar.offsetImageTopoffset = objOffset.halfSearchRangeDown # location of the center of the first reference window
self._insar.offsetImageLeftoffset = objOffset.halfSearchRangeAcross self._insar.offsetImageTopoffset = objOffset.referenceStartPixelDownStatic + (objOffset.windowSizeHeight-1)//2
self._insar.offsetImageLeftoffset = objOffset.referenceStartPixelAcrossStatic +(objOffset.windowSizeWidth-1)//2
# offset image dimension, the number of windows
width = objOffset.numberWindowAcross width = objOffset.numberWindowAcross
length = objOffset.numberWindowDown length = objOffset.numberWindowDown
offsetBIP = np.fromfile(objOffset.offsetImageName.decode('utf-8'), dtype=np.float32).reshape(length, width*2)
# convert the offset image from BIP to BIL
offsetBIP = np.fromfile(objOffset.offsetImageName, dtype=np.float32).reshape(length, width*2)
offsetBIL = np.zeros((length*2, width), dtype=np.float32) offsetBIL = np.zeros((length*2, width), dtype=np.float32)
offsetBIL[0:length*2:2, :] = offsetBIP[:, 1:width*2:2] offsetBIL[0:length*2:2, :] = offsetBIP[:, 1:width*2:2]
offsetBIL[1:length*2:2, :] = offsetBIP[:, 0:width*2:2] offsetBIL[1:length*2:2, :] = offsetBIP[:, 0:width*2:2]
os.remove(objOffset.offsetImageName.decode('utf-8')) os.remove(objOffset.offsetImageName)
offsetBIL.astype(np.float32).tofile(objOffset.offsetImageName.decode('utf-8')) offsetBIL.astype(np.float32).tofile(objOffset.offsetImageName)
# generate offset image description files
outImg = isceobj.createImage() outImg = isceobj.createImage()
outImg.setDataType('FLOAT') outImg.setDataType('FLOAT')
outImg.setFilename(objOffset.offsetImageName.decode('utf-8')) outImg.setFilename(objOffset.offsetImageName)
outImg.setBands(2) outImg.setBands(2)
outImg.scheme = 'BIL' outImg.scheme = 'BIL'
outImg.setWidth(objOffset.numberWindowAcross) outImg.setWidth(objOffset.numberWindowAcross)
@ -314,8 +333,11 @@ def runDenseOffsetGPU(self):
outImg.setAccessMode('read') outImg.setAccessMode('read')
outImg.renderHdr() outImg.renderHdr()
# gross offset image is not needed, since all zeros
# generate snr image description files
snrImg = isceobj.createImage() snrImg = isceobj.createImage()
snrImg.setFilename( objOffset.snrImageName.decode('utf8')) snrImg.setFilename( objOffset.snrImageName)
snrImg.setDataType('FLOAT') snrImg.setDataType('FLOAT')
snrImg.setBands(1) snrImg.setBands(1)
snrImg.setWidth(objOffset.numberWindowAcross) snrImg.setWidth(objOffset.numberWindowAcross)
@ -323,4 +345,20 @@ def runDenseOffsetGPU(self):
snrImg.setAccessMode('read') snrImg.setAccessMode('read')
snrImg.renderHdr() snrImg.renderHdr()
# generate cov image description files
# covariance of azimuth/range offsets.
# 1st band: cov(az, az), 2nd band: cov(rg, rg), 3rd band: cov(az, rg)
covImg = isceobj.createImage()
covImg.setFilename(objOffset.covImageName)
covImg.setDataType('FLOAT')
covImg.setBands(3)
covImg.scheme = 'BIP'
covImg.setWidth(objOffset.numberWindowAcross)
covImg.setLength(objOffset.numberWindowDown)
outImg.addDescription('covariance of azimuth/range offsets')
covImg.setAccessMode('read')
covImg.renderHdr()
return (objOffset.numberWindowAcross, objOffset.numberWindowDown) return (objOffset.numberWindowAcross, objOffset.numberWindowDown)
# end of file

View File

@ -156,11 +156,11 @@ def runDenseOffsetsGPU(self):
secondary = os.path.join(self._insar.mergedDirname, sf) secondary = os.path.join(self._insar.mergedDirname, sf)
####For this module currently, we need to create an actual file on disk ####For this module currently, we need to create an actual file on disk
for infile in [reference,secondary]: for infile in [reference,secondary]:
if os.path.isfile(infile): if os.path.isfile(infile):
continue continue
print('Creating actual file {} ...\n'.format(infile))
cmd = 'gdal_translate -of ENVI {0}.vrt {0}'.format(infile) cmd = 'gdal_translate -of ENVI {0}.vrt {0}'.format(infile)
status = os.system(cmd) status = os.system(cmd)
if status: if status:
@ -170,21 +170,23 @@ def runDenseOffsetsGPU(self):
m = isceobj.createSlcImage() m = isceobj.createSlcImage()
m.load(reference + '.xml') m.load(reference + '.xml')
m.setAccessMode('READ') m.setAccessMode('READ')
# m.createImage()
### Load the secondary object ### Load the secondary object
s = isceobj.createSlcImage() s = isceobj.createSlcImage()
s.load(secondary + '.xml') s.load(secondary + '.xml')
s.setAccessMode('READ') s.setAccessMode('READ')
# s.createImage()
# get the dimension
width = m.getWidth() width = m.getWidth()
length = m.getLength() length = m.getLength()
### create the GPU processor
objOffset = PyCuAmpcor.PyCuAmpcor() objOffset = PyCuAmpcor.PyCuAmpcor()
### Set parameters
# cross-correlation method, 0=Frequency domain, 1= Time domain
objOffset.algorithm = 0 objOffset.algorithm = 0
objOffset.deviceID = -1 # deramping method: 0 to take magnitude (fixed for Tops)
objOffset.nStreams = 2
objOffset.derampMethod = 0 objOffset.derampMethod = 0
objOffset.referenceImageName = reference + '.vrt' objOffset.referenceImageName = reference + '.vrt'
objOffset.referenceImageHeight = length objOffset.referenceImageHeight = length
@ -193,36 +195,56 @@ def runDenseOffsetsGPU(self):
objOffset.secondaryImageHeight = length objOffset.secondaryImageHeight = length
objOffset.secondaryImageWidth = width objOffset.secondaryImageWidth = width
objOffset.numberWindowDown = (length-100-self.winhgt)//self.skiphgt # adjust the margin
objOffset.numberWindowAcross = (width-100-self.winwidth)//self.skipwidth margin = max(self.margin, abs(self.azshift), abs(self.rgshift))
# set the start pixel in the reference image
objOffset.referenceStartPixelDownStatic = margin + self.srchgt
objOffset.referenceStartPixelAcrossStatic = margin + self.srcwidth
# compute the number of windows
objOffset.numberWindowDown = (length-2*margin-2*self.srchgt-self.winhgt)//self.skiphgt
objOffset.numberWindowAcross = (width-2*margin-2*self.srcwidth-self.winwidth)//self.skipwidth
# set the template window size
objOffset.windowSizeHeight = self.winhgt objOffset.windowSizeHeight = self.winhgt
objOffset.windowSizeWidth = self.winwidth objOffset.windowSizeWidth = self.winwidth
# set the (half) search range
objOffset.halfSearchRangeDown = self.srchgt objOffset.halfSearchRangeDown = self.srchgt
objOffset.halfSearchRangeAcross = self.srcwidth objOffset.halfSearchRangeAcross = self.srcwidth
objOffset.referenceStartPixelDownStatic = 50 # set the skip distance between windows
objOffset.referenceStartPixelAcrossStatic = 50
objOffset.skipSampleDown = self.skiphgt objOffset.skipSampleDown = self.skiphgt
objOffset.skipSampleAcross = self.skipwidth objOffset.skipSampleAcross = self.skipwidth
objOffset.corrSufaceOverSamplingMethod = 0 # correlation surface oversampling method, # 0=FFT, 1=Sinc
objOffset.corrSurfaceOverSamplingMethod = 0
# oversampling factor
objOffset.corrSurfaceOverSamplingFactor = self.oversample objOffset.corrSurfaceOverSamplingFactor = self.oversample
# generic control ### gpu control
objOffset.numberWindowDownInChunk = 10 objOffset.deviceID = 0
objOffset.numberWindowAcrossInChunk = 10 objOffset.nStreams = 2
# number of windows in a chunk/batch
objOffset.numberWindowDownInChunk = 1
objOffset.numberWindowAcrossInChunk = 64
# memory map cache size in GB
objOffset.mmapSize = 16 objOffset.mmapSize = 16
# Modify BIL in filename to BIP if needed and store for future use
prefix, ext = os.path.splitext(self._insar.offsetfile)
if ext == '.bil':
ext = '.bip'
self._insar.offsetfile = prefix + ext
objOffset.setupParams() # set the output file name
objOffset.offsetImageName = os.path.join(self._insar.mergedDirname, self._insar.offsetfile)
objOffset.grossOffsetImageName = os.path.join(self._insar.mergedDirname, self._insar.offsetfile + ".gross")
objOffset.snrImageName = os.path.join(self._insar.mergedDirname, self._insar.snrfile)
objOffset.covImageName = os.path.join(self._insar.mergedDirname, self._insar.covfile)
objOffset.setConstantGrossOffset(self.azshift,self.rgshift) ### print the settings
# objOffset.numberThreads = 1
### Configure dense Ampcor object
print('\nReference frame: %s' % (mf)) print('\nReference frame: %s' % (mf))
print('Secondary frame: %s' % (sf)) print('Secondary frame: %s' % (sf))
print('Main window size width: %d' % (self.winwidth)) print('Main window size width: %d' % (self.winwidth))
@ -231,41 +253,41 @@ def runDenseOffsetsGPU(self):
print('Search window size height: %d' % (self.srchgt)) print('Search window size height: %d' % (self.srchgt))
print('Skip sample across: %d' % (self.skipwidth)) print('Skip sample across: %d' % (self.skipwidth))
print('Skip sample down: %d' % (self.skiphgt)) print('Skip sample down: %d' % (self.skiphgt))
print('Field margin: %d' % (self.margin)) print('Field margin: %d' % (margin))
print('Oversampling factor: %d' % (self.oversample)) print('Oversampling factor: %d' % (self.oversample))
print('Gross offset across: %d' % (self.rgshift)) print('Gross offset across: %d' % (self.rgshift))
print('Gross offset down: %d\n' % (self.azshift)) print('Gross offset down: %d\n' % (self.azshift))
#Modify BIL in filename to BIP if needed and store for future use
prefix, ext = os.path.splitext(self._insar.offsetfile)
if ext == '.bil':
ext = '.bip'
self._insar.offsetfile = prefix + ext
objOffset.offsetImageName = os.path.join(self._insar.mergedDirname, self._insar.offsetfile)
objOffset.snrImageName = os.path.join(self._insar.mergedDirname, self._insar.snrfile)
print('Output dense offsets file name: %s' % (objOffset.offsetImageName)) print('Output dense offsets file name: %s' % (objOffset.offsetImageName))
print('Output gross offsets file name: %s' % (objOffset.grossOffsetImageName))
print('Output SNR file name: %s' % (objOffset.snrImageName)) print('Output SNR file name: %s' % (objOffset.snrImageName))
print('Output COV file name: %s' % (objOffset.covImageName))
# pass the parameters to C++ programs
objOffset.setupParams()
# set the (static) gross offset
objOffset.setConstantGrossOffset(self.azshift,self.rgshift)
# make sure all pixels are in range
objOffset.checkPixelInImageRange()
print('\n======================================') print('\n======================================')
print('Running dense ampcor...') print('Running PyCuAmpcor...')
print('======================================\n') print('======================================\n')
# run ampcor
objOffset.checkPixelInImageRange()
objOffset.runAmpcor() objOffset.runAmpcor()
#objOffset.denseampcor(m, s) ### Where the magic happens...
### Store params for later ### Store params for later
# offset width x length, also number of windows
self._insar.offset_width = objOffset.numberWindowAcross self._insar.offset_width = objOffset.numberWindowAcross
self._insar.offset_length = objOffset.numberWindowDown self._insar.offset_length = objOffset.numberWindowDown
self._insar.offset_top = 50 # the center of the first reference window
self._insar.offset_left = 50 self._insar.offset_top = objOffset.referenceStartPixelDownStatic + (objOffset.windowSizeHeight-1)//2
self._insar.offset_left = objOffset.referenceStartPixelAcrossStatic + (objOffset.windowSizeWidth-1)//2
# generate description files for output images
outImg = isceobj.createImage() outImg = isceobj.createImage()
outImg.setDataType('FLOAT') outImg.setDataType('FLOAT')
outImg.setFilename(objOffset.offsetImageName.decode('utf-8')) outImg.setFilename(objOffset.offsetImageName)
outImg.setBands(2) outImg.setBands(2)
outImg.scheme = 'BIP' outImg.scheme = 'BIP'
outImg.setWidth(objOffset.numberWindowAcross) outImg.setWidth(objOffset.numberWindowAcross)
@ -273,8 +295,19 @@ def runDenseOffsetsGPU(self):
outImg.setAccessMode('read') outImg.setAccessMode('read')
outImg.renderHdr() outImg.renderHdr()
# gross offset
goutImg = isceobj.createImage()
goutImg.setDataType('FLOAT')
goutImg.setFilename(objOffset.grossOffsetImageName)
goutImg.setBands(2)
goutImg.scheme = 'BIP'
goutImg.setWidth(objOffset.numberWindowAcross)
goutImg.setLength(objOffset.numberWindowDown)
goutImg.setAccessMode('read')
goutImg.renderHdr()
snrImg = isceobj.createImage() snrImg = isceobj.createImage()
snrImg.setFilename( objOffset.snrImageName.decode('utf-8')) snrImg.setFilename(objOffset.snrImageName)
snrImg.setDataType('FLOAT') snrImg.setDataType('FLOAT')
snrImg.setBands(1) snrImg.setBands(1)
snrImg.setWidth(objOffset.numberWindowAcross) snrImg.setWidth(objOffset.numberWindowAcross)
@ -282,6 +315,15 @@ def runDenseOffsetsGPU(self):
snrImg.setAccessMode('read') snrImg.setAccessMode('read')
snrImg.renderHdr() snrImg.renderHdr()
covImg = isceobj.createImage()
covImg.setFilename(objOffset.covImageName)
covImg.setDataType('FLOAT')
covImg.setBands(3)
covImg.scheme = 'BIP'
covImg.setWidth(objOffset.numberWindowAcross)
covImg.setLength(objOffset.numberWindowDown)
covImg.setAccessMode('read')
covImg.renderHdr()
if __name__ == '__main__' : if __name__ == '__main__' :

View File

@ -91,7 +91,7 @@ mm=0 # margin to be neglected
gross=0 # whether to use a varying gross offset gross=0 # whether to use a varying gross offset
azshift=0 # constant gross offset along height/azimuth azshift=0 # constant gross offset along height/azimuth
rgshift=0 # constant gross offset along width/range rgshift=0 # constant gross offset along width/range
deramp=0 # 0 for mag (TOPS), 1 for complex deramp=0 # 0 for mag (TOPS), 1 for complex linear ramp, 2 for complex no deramping
oo=32 # correlation surface oversampling factor oo=32 # correlation surface oversampling factor
outprefix=./merged/20151120_20151214/offset # output prefix outprefix=./merged/20151120_20151214/offset # output prefix
outsuffix=_ww64_wh64 # output suffix outsuffix=_ww64_wh64 # output suffix
@ -368,8 +368,7 @@ RIOPAC extracts the secondary window centering at the correlation surface peak.
| PyCuAmpcor | CUDA variable | ampcor.F equivalent | Notes | | PyCuAmpcor | CUDA variable | ampcor.F equivalent | Notes |
| :--- | :--- | :---- | :--- | | :--- | :--- | :---- | :--- |
| rawDataOversamplingFactor | rawDataOversamplingFactor | i_ovs=2 | the oversampling factor for reference and secondary windows, use 2 for InSAR SLCs. | | rawDataOversamplingFactor | rawDataOversamplingFactor | i_ovs=2 | the oversampling factor for reference and secondary windows, use 2 for InSAR SLCs. |
| derampMethod | derampMethod | 1 or no effect on TOPS | 0=mag for TOPS, 1=deramping (default), else=skip deramping. | derampMethod | derampMethod | 1 or no effect on TOPS | Only for complex: 0=take mag (TOPS), 1=linear deramp (default), else=skip deramp.
**Difference to ROIPAC** **Difference to ROIPAC**

View File

@ -259,12 +259,7 @@ cdef class PyCuAmpcor(object):
@secondaryImageName.setter @secondaryImageName.setter
def secondaryImageName(self, str a): def secondaryImageName(self, str a):
self.c_cuAmpcor.param.secondaryImageName = <string> a.encode() self.c_cuAmpcor.param.secondaryImageName = <string> a.encode()
@property
def referenceImageName(self):
return self.c_cuAmpcor.param.referenceImageName
@referenceImageName.setter
def referenceImageName(self, str a):
self.c_cuAmpcor.param.referenceImageName = <string> a.encode()
@property @property
def referenceImageHeight(self): def referenceImageHeight(self):
return self.c_cuAmpcor.param.referenceImageHeight return self.c_cuAmpcor.param.referenceImageHeight
@ -449,4 +444,4 @@ cdef class PyCuAmpcor(object):
self.c_cuAmpcor.runAmpcor() self.c_cuAmpcor.runAmpcor()
# end of file # end of file

View File

@ -3,7 +3,7 @@
/** /**
* Run ampcor process for a batch of images (a chunk) * Run ampcor process for a batch of images (a chunk)
* @param[in] idxDown_ index oIDIVUP(i,j) ((i+j-1)/j)f the chunk along Down/Azimuth direction * @param[in] idxDown_ index of the chunk along Down/Azimuth direction
* @param[in] idxAcross_ index of the chunk along Across/Range direction * @param[in] idxAcross_ index of the chunk along Across/Range direction
*/ */
void cuAmpcorChunk::run(int idxDown_, int idxAcross_) void cuAmpcorChunk::run(int idxDown_, int idxAcross_)

View File

@ -41,7 +41,9 @@ void cuAmpcorController::runAmpcor()
GDALAllRegister(); GDALAllRegister();
// reference and secondary images; use band=1 as default // reference and secondary images; use band=1 as default
// TODO: selecting band // TODO: selecting band
std::cout << "Opening reference image " << param->referenceImageName << "...\n";
GDALImage *referenceImage = new GDALImage(param->referenceImageName, 1, param->mmapSizeInGB); GDALImage *referenceImage = new GDALImage(param->referenceImageName, 1, param->mmapSizeInGB);
std::cout << "Opening secondary image " << param->secondaryImageName << "...\n";
GDALImage *secondaryImage = new GDALImage(param->secondaryImageName, 1, param->mmapSizeInGB); GDALImage *secondaryImage = new GDALImage(param->secondaryImageName, 1, param->mmapSizeInGB);
cuArrays<float2> *offsetImage, *offsetImageRun; cuArrays<float2> *offsetImage, *offsetImageRun;
@ -100,9 +102,12 @@ void cuAmpcorController::runAmpcor()
<< nChunksDown << " x " << nChunksAcross << std::endl; << nChunksDown << " x " << nChunksAcross << std::endl;
// iterative over chunks down // iterative over chunks down
int message_interval = nChunksDown/10;
for(int i = 0; i<nChunksDown; i++) for(int i = 0; i<nChunksDown; i++)
{ {
std::cout << "Processing chunk (" << i <<", x" << ") out of " << nChunksDown << std::endl; if(i%message_interval == 0)
std::cout << "Processing chunks (" << i+1 <<", x) - (" << std::min(nChunksDown, i+message_interval )
<< ", x) out of " << nChunksDown << std::endl;
// iterate over chunks across // iterate over chunks across
for(int j=0; j<nChunksAcross; j+=param->nStreams) for(int j=0; j<nChunksAcross; j+=param->nStreams)
{ {

View File

@ -81,7 +81,7 @@ inline int gpuDeviceInit(int devID)
} }
checkCudaErrors(cudaSetDevice(devID)); checkCudaErrors(cudaSetDevice(devID));
printf("gpuDeviceInit() Using CUDA Device %d ...\n", devID); printf("Using CUDA Device %d ...\n", devID);
return devID; return devID;
} }
@ -120,4 +120,4 @@ inline void gpuDeviceList()
} }
#endif //__CUDAUTIL_H #endif //__CUDAUTIL_H
//end of file //end of file