2019-01-16 19:40:08 +00:00
|
|
|
/**
|
|
|
|
* cuAmpcorParameter.cu
|
2019-11-20 00:59:49 +00:00
|
|
|
* Input parameters for ampcor
|
2019-01-16 19:40:08 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "cuAmpcorParameter.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#ifndef IDIVUP
|
|
|
|
#define IDIVUP(i,j) ((i+j-1)/j)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
///
|
2019-11-20 00:59:49 +00:00
|
|
|
/// Constructor for cuAmpcorParameter class
|
2019-01-16 19:40:08 +00:00
|
|
|
/// also sets the default/initial values of various parameters
|
|
|
|
///
|
2019-11-20 00:59:49 +00:00
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
cuAmpcorParameter::cuAmpcorParameter()
|
|
|
|
{
|
2019-11-20 00:59:49 +00:00
|
|
|
// default settings
|
|
|
|
// will be changed if they are set by python scripts
|
|
|
|
algorithm = 0; //0 freq; 1 time
|
|
|
|
deviceID = 0;
|
|
|
|
nStreams = 1;
|
2019-01-16 19:40:08 +00:00
|
|
|
derampMethod = 1;
|
2019-11-20 00:59:49 +00:00
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
windowSizeWidthRaw = 64;
|
|
|
|
windowSizeHeightRaw = 64;
|
|
|
|
halfSearchRangeDownRaw = 20;
|
|
|
|
halfSearchRangeAcrossRaw = 20;
|
|
|
|
|
|
|
|
skipSampleAcrossRaw = 64;
|
|
|
|
skipSampleDownRaw = 64;
|
|
|
|
rawDataOversamplingFactor = 2;
|
|
|
|
zoomWindowSize = 8;
|
2019-11-20 00:59:49 +00:00
|
|
|
oversamplingFactor = 16;
|
|
|
|
oversamplingMethod = 0;
|
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
masterImageName = "master.slc";
|
|
|
|
masterImageWidth = 1000;
|
|
|
|
masterImageHeight = 1000;
|
|
|
|
slaveImageName = "slave.slc";
|
|
|
|
slaveImageWidth = 1000;
|
|
|
|
slaveImageHeight = 1000;
|
|
|
|
offsetImageName = "DenseOffset.off";
|
|
|
|
grossOffsetImageName = "GrossOffset.off";
|
|
|
|
snrImageName = "snr.snr";
|
2019-11-20 00:59:49 +00:00
|
|
|
covImageName = "cov.cov";
|
2019-01-16 19:40:08 +00:00
|
|
|
numberWindowDown = 1;
|
2019-11-20 00:59:49 +00:00
|
|
|
numberWindowAcross = 1;
|
2019-01-16 19:40:08 +00:00
|
|
|
numberWindowDownInChunk = 1;
|
2019-11-20 00:59:49 +00:00
|
|
|
numberWindowAcrossInChunk = 1 ;
|
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
masterStartPixelDown0 = 0;
|
|
|
|
masterStartPixelAcross0 = 0;
|
2019-11-20 00:59:49 +00:00
|
|
|
|
|
|
|
corrRawZoomInHeight = 17; // 8*2+1
|
|
|
|
corrRawZoomInWidth = 17;
|
|
|
|
|
|
|
|
useMmap = 1; // use mmap
|
|
|
|
mmapSizeInGB = 1;
|
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2019-11-20 00:59:49 +00:00
|
|
|
* To determine other process parameters after reading essential parameters from python
|
|
|
|
*/
|
2019-01-16 19:40:08 +00:00
|
|
|
|
|
|
|
void cuAmpcorParameter::setupParameters()
|
2019-11-20 00:59:49 +00:00
|
|
|
{
|
2019-01-16 19:40:08 +00:00
|
|
|
zoomWindowSize *= rawDataOversamplingFactor; //8 * 2
|
2019-11-20 00:59:49 +00:00
|
|
|
halfZoomWindowSizeRaw = zoomWindowSize/(2*rawDataOversamplingFactor); // 8*2/(2*2) = 4
|
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
windowSizeWidth = windowSizeWidthRaw*rawDataOversamplingFactor; //
|
|
|
|
windowSizeHeight = windowSizeHeightRaw*rawDataOversamplingFactor;
|
|
|
|
|
2019-11-20 00:59:49 +00:00
|
|
|
searchWindowSizeWidthRaw = windowSizeWidthRaw + 2*halfSearchRangeDownRaw;
|
2019-01-16 19:40:08 +00:00
|
|
|
searchWindowSizeHeightRaw = windowSizeHeightRaw + 2*halfSearchRangeAcrossRaw;
|
2019-11-20 00:59:49 +00:00
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
searchWindowSizeWidthRawZoomIn = windowSizeWidthRaw + 2*halfZoomWindowSizeRaw;
|
|
|
|
searchWindowSizeHeightRawZoomIn = windowSizeHeightRaw + 2*halfZoomWindowSizeRaw;
|
2019-11-20 00:59:49 +00:00
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
searchWindowSizeWidth = searchWindowSizeWidthRawZoomIn*rawDataOversamplingFactor;
|
|
|
|
searchWindowSizeHeight = searchWindowSizeHeightRawZoomIn*rawDataOversamplingFactor;
|
2019-11-20 00:59:49 +00:00
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
numberWindows = numberWindowDown*numberWindowAcross;
|
|
|
|
if(numberWindows <=0) {
|
|
|
|
fprintf(stderr, "Incorrect number of windows! (%d, %d)\n", numberWindowDown, numberWindowAcross);
|
|
|
|
exit(EXIT_FAILURE);
|
2019-11-20 00:59:49 +00:00
|
|
|
}
|
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
// modified 02/12/2018 to include one more chunk
|
|
|
|
// e.g. numberWindowDownInChunk=102, numberWindowDown=10, results in numberChunkDown=11
|
2019-11-20 00:59:49 +00:00
|
|
|
// the last chunk will include 2 windows, numberWindowDownInChunkRun = 2.
|
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
numberChunkDown = IDIVUP(numberWindowDown, numberWindowDownInChunk);
|
|
|
|
numberChunkAcross = IDIVUP(numberWindowAcross, numberWindowAcrossInChunk);
|
|
|
|
numberChunks = numberChunkDown*numberChunkAcross;
|
2019-11-20 00:59:49 +00:00
|
|
|
allocateArrays();
|
2019-01-16 19:40:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void cuAmpcorParameter::allocateArrays()
|
|
|
|
{
|
|
|
|
int arraySize = numberWindows*sizeof(int);
|
|
|
|
grossOffsetDown = (int *)malloc(arraySize);
|
|
|
|
grossOffsetAcross = (int *)malloc(arraySize);
|
|
|
|
masterStartPixelDown = (int *)malloc(arraySize);
|
|
|
|
masterStartPixelAcross = (int *)malloc(arraySize);
|
|
|
|
slaveStartPixelDown = (int *)malloc(arraySize);
|
|
|
|
slaveStartPixelAcross = (int *)malloc(arraySize);
|
2019-11-20 00:59:49 +00:00
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
int arraySizeChunk = numberChunks*sizeof(int);
|
|
|
|
masterChunkStartPixelDown = (int *)malloc(arraySizeChunk);
|
|
|
|
masterChunkStartPixelAcross = (int *)malloc(arraySizeChunk);
|
|
|
|
slaveChunkStartPixelDown = (int *)malloc(arraySizeChunk);
|
|
|
|
slaveChunkStartPixelAcross = (int *)malloc(arraySizeChunk);
|
|
|
|
masterChunkHeight = (int *)malloc(arraySizeChunk);
|
|
|
|
masterChunkWidth = (int *)malloc(arraySizeChunk);
|
|
|
|
slaveChunkHeight = (int *)malloc(arraySizeChunk);
|
|
|
|
slaveChunkWidth = (int *)malloc(arraySizeChunk);
|
|
|
|
}
|
|
|
|
|
|
|
|
void cuAmpcorParameter::deallocateArrays()
|
|
|
|
{
|
|
|
|
free(grossOffsetDown);
|
|
|
|
free(grossOffsetAcross);
|
|
|
|
free(masterStartPixelDown);
|
|
|
|
free(masterStartPixelAcross);
|
|
|
|
free(slaveStartPixelDown);
|
|
|
|
free(slaveStartPixelAcross);
|
|
|
|
free(masterChunkStartPixelDown);
|
|
|
|
free(masterChunkStartPixelAcross);
|
|
|
|
free(slaveChunkStartPixelDown);
|
|
|
|
free(slaveChunkStartPixelAcross);
|
|
|
|
free(masterChunkHeight);
|
|
|
|
free(masterChunkWidth);
|
|
|
|
free(slaveChunkHeight);
|
|
|
|
free(slaveChunkWidth);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-11-20 00:59:49 +00:00
|
|
|
/// Set starting pixels for master and slave windows from arrays
|
2019-01-16 19:40:08 +00:00
|
|
|
/// set also gross offsets between master and slave windows
|
2019-11-20 00:59:49 +00:00
|
|
|
///
|
2019-01-16 19:40:08 +00:00
|
|
|
void cuAmpcorParameter::setStartPixels(int *mStartD, int *mStartA, int *gOffsetD, int *gOffsetA)
|
|
|
|
{
|
|
|
|
for(int i=0; i<numberWindows; i++)
|
|
|
|
{
|
|
|
|
masterStartPixelDown[i] = mStartD[i];
|
2019-11-20 00:59:49 +00:00
|
|
|
grossOffsetDown[i] = gOffsetD[i];
|
2019-01-16 19:40:08 +00:00
|
|
|
slaveStartPixelDown[i] = masterStartPixelDown[i] + grossOffsetDown[i] - halfSearchRangeDownRaw;
|
|
|
|
masterStartPixelAcross[i] = mStartA[i];
|
2019-11-20 00:59:49 +00:00
|
|
|
grossOffsetAcross[i] = gOffsetA[i];
|
2019-01-16 19:40:08 +00:00
|
|
|
slaveStartPixelAcross[i] = masterStartPixelAcross[i] + grossOffsetAcross[i] - halfSearchRangeAcrossRaw;
|
|
|
|
}
|
|
|
|
setChunkStartPixels();
|
|
|
|
}
|
|
|
|
|
|
|
|
void cuAmpcorParameter::setStartPixels(int mStartD, int mStartA, int *gOffsetD, int *gOffsetA)
|
|
|
|
{
|
|
|
|
for(int row=0; row<numberWindowDown; row++)
|
|
|
|
{
|
|
|
|
for(int col = 0; col < numberWindowAcross; col++)
|
|
|
|
{
|
|
|
|
int i = row*numberWindowAcross + col;
|
|
|
|
masterStartPixelDown[i] = mStartD + row*skipSampleDownRaw;
|
|
|
|
grossOffsetDown[i] = gOffsetD[i];
|
|
|
|
slaveStartPixelDown[i] = masterStartPixelDown[i] + grossOffsetDown[i] - halfSearchRangeDownRaw;
|
|
|
|
masterStartPixelAcross[i] = mStartA + col*skipSampleAcrossRaw;
|
|
|
|
grossOffsetAcross[i] = gOffsetA[i];
|
|
|
|
slaveStartPixelAcross[i] = masterStartPixelAcross[i] + grossOffsetAcross[i] - halfSearchRangeAcrossRaw;
|
2019-11-20 00:59:49 +00:00
|
|
|
}
|
2019-01-16 19:40:08 +00:00
|
|
|
}
|
|
|
|
setChunkStartPixels();
|
|
|
|
}
|
|
|
|
|
|
|
|
void cuAmpcorParameter::setStartPixels(int mStartD, int mStartA, int gOffsetD, int gOffsetA)
|
|
|
|
{
|
|
|
|
//fprintf(stderr, "set start pixels %d %d %d %d\n", mStartD, mStartA, gOffsetD, gOffsetA);
|
|
|
|
for(int row=0; row<numberWindowDown; row++)
|
|
|
|
{
|
|
|
|
for(int col = 0; col < numberWindowAcross; col++)
|
|
|
|
{
|
|
|
|
int i = row*numberWindowAcross + col;
|
|
|
|
masterStartPixelDown[i] = mStartD + row*skipSampleDownRaw;
|
|
|
|
grossOffsetDown[i] = gOffsetD;
|
|
|
|
slaveStartPixelDown[i] = masterStartPixelDown[i] + grossOffsetDown[i] - halfSearchRangeDownRaw;
|
|
|
|
masterStartPixelAcross[i] = mStartA + col*skipSampleAcrossRaw;
|
|
|
|
grossOffsetAcross[i] = gOffsetA;
|
|
|
|
slaveStartPixelAcross[i] = masterStartPixelAcross[i] + grossOffsetAcross[i] - halfSearchRangeAcrossRaw;
|
2019-11-20 00:59:49 +00:00
|
|
|
}
|
2019-01-16 19:40:08 +00:00
|
|
|
}
|
|
|
|
setChunkStartPixels();
|
|
|
|
}
|
|
|
|
|
|
|
|
void cuAmpcorParameter::setChunkStartPixels()
|
|
|
|
{
|
2019-11-20 00:59:49 +00:00
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
maxMasterChunkHeight = 0;
|
|
|
|
maxMasterChunkWidth = 0;
|
|
|
|
maxSlaveChunkHeight = 0;
|
|
|
|
maxSlaveChunkWidth = 0;
|
2019-11-20 00:59:49 +00:00
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
for(int ichunk=0; ichunk <numberChunkDown; ichunk++)
|
|
|
|
{
|
|
|
|
for (int jchunk =0; jchunk<numberChunkAcross; jchunk++)
|
|
|
|
{
|
2019-11-20 00:59:49 +00:00
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
int idxChunk = ichunk*numberChunkAcross+jchunk;
|
2019-11-20 00:59:49 +00:00
|
|
|
int mChunkSD = masterImageHeight;
|
|
|
|
int mChunkSA = masterImageWidth;
|
2019-01-16 19:40:08 +00:00
|
|
|
int mChunkED = 0;
|
|
|
|
int mChunkEA = 0;
|
|
|
|
int sChunkSD = slaveImageHeight;
|
|
|
|
int sChunkSA = slaveImageWidth;
|
|
|
|
int sChunkED = 0;
|
|
|
|
int sChunkEA = 0;
|
2019-11-20 00:59:49 +00:00
|
|
|
|
2019-01-16 19:40:08 +00:00
|
|
|
// modified 02/12/2018
|
2019-11-20 00:59:49 +00:00
|
|
|
int numberWindowDownInChunkRun = numberWindowDownInChunk;
|
|
|
|
int numberWindowAcrossInChunkRun = numberWindowAcrossInChunk;
|
|
|
|
// modify the number of windows in last chunk
|
|
|
|
if(ichunk == numberChunkDown -1)
|
2019-01-16 19:40:08 +00:00
|
|
|
numberWindowDownInChunkRun = numberWindowDown - numberWindowDownInChunk*(numberChunkDown -1);
|
2019-11-20 00:59:49 +00:00
|
|
|
if(jchunk == numberChunkAcross -1)
|
2019-01-16 19:40:08 +00:00
|
|
|
numberWindowAcrossInChunkRun = numberWindowAcross - numberWindowAcrossInChunk*(numberChunkAcross -1);
|
2019-11-20 00:59:49 +00:00
|
|
|
|
|
|
|
|
|
|
|
for(int i=0; i<numberWindowDownInChunkRun; i++)
|
2019-01-16 19:40:08 +00:00
|
|
|
{
|
|
|
|
for(int j=0; j<numberWindowAcrossInChunkRun; j++)
|
2019-11-20 00:59:49 +00:00
|
|
|
{
|
2019-01-16 19:40:08 +00:00
|
|
|
int idxWindow = (ichunk*numberWindowDownInChunk+i)*numberWindowAcross + (jchunk*numberWindowAcrossInChunk+j);
|
|
|
|
int vpixel = masterStartPixelDown[idxWindow];
|
2019-11-20 00:59:49 +00:00
|
|
|
if(mChunkSD > vpixel) mChunkSD = vpixel;
|
2019-01-16 19:40:08 +00:00
|
|
|
if(mChunkED < vpixel) mChunkED = vpixel;
|
|
|
|
vpixel = masterStartPixelAcross[idxWindow];
|
2019-11-20 00:59:49 +00:00
|
|
|
if(mChunkSA > vpixel) mChunkSA = vpixel;
|
2019-01-16 19:40:08 +00:00
|
|
|
if(mChunkEA < vpixel) mChunkEA = vpixel;
|
|
|
|
vpixel = slaveStartPixelDown[idxWindow];
|
2019-11-20 00:59:49 +00:00
|
|
|
if(sChunkSD > vpixel) sChunkSD = vpixel;
|
2019-01-16 19:40:08 +00:00
|
|
|
if(sChunkED < vpixel) sChunkED = vpixel;
|
|
|
|
vpixel = slaveStartPixelAcross[idxWindow];
|
2019-11-20 00:59:49 +00:00
|
|
|
if(sChunkSA > vpixel) sChunkSA = vpixel;
|
2019-01-16 19:40:08 +00:00
|
|
|
if(sChunkEA < vpixel) sChunkEA = vpixel;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
masterChunkStartPixelDown[idxChunk] = mChunkSD;
|
|
|
|
masterChunkStartPixelAcross[idxChunk] = mChunkSA;
|
|
|
|
slaveChunkStartPixelDown[idxChunk] = sChunkSD;
|
|
|
|
slaveChunkStartPixelAcross[idxChunk] = sChunkSA;
|
|
|
|
masterChunkHeight[idxChunk] = mChunkED - mChunkSD + windowSizeHeightRaw;
|
|
|
|
masterChunkWidth[idxChunk] = mChunkEA - mChunkSA + windowSizeWidthRaw;
|
|
|
|
slaveChunkHeight[idxChunk] = sChunkED - sChunkSD + searchWindowSizeHeightRaw;
|
|
|
|
slaveChunkWidth[idxChunk] = sChunkEA - sChunkSA + searchWindowSizeWidthRaw;
|
|
|
|
if(maxMasterChunkHeight < masterChunkHeight[idxChunk]) maxMasterChunkHeight = masterChunkHeight[idxChunk];
|
|
|
|
if(maxMasterChunkWidth < masterChunkWidth[idxChunk] ) maxMasterChunkWidth = masterChunkWidth[idxChunk];
|
|
|
|
if(maxSlaveChunkHeight < slaveChunkHeight[idxChunk]) maxSlaveChunkHeight = slaveChunkHeight[idxChunk];
|
|
|
|
if(maxSlaveChunkWidth < slaveChunkWidth[idxChunk] ) maxSlaveChunkWidth = slaveChunkWidth[idxChunk];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// check whether master and slave windows are within the image range
|
|
|
|
void cuAmpcorParameter::checkPixelInImageRange()
|
|
|
|
{
|
|
|
|
int endPixel;
|
|
|
|
for(int row=0; row<numberWindowDown; row++)
|
|
|
|
{
|
|
|
|
for(int col = 0; col < numberWindowAcross; col++)
|
|
|
|
{
|
|
|
|
int i = row*numberWindowAcross + col;
|
2019-11-20 00:59:49 +00:00
|
|
|
if(masterStartPixelDown[i] <0)
|
2019-01-16 19:40:08 +00:00
|
|
|
{
|
|
|
|
fprintf(stderr, "Master Window start pixel out ot range in Down, window (%d,%d), pixel %d\n", row, col, masterStartPixelDown[i]);
|
|
|
|
exit(EXIT_FAILURE); //or raise range error
|
2019-11-20 00:59:49 +00:00
|
|
|
}
|
|
|
|
if(masterStartPixelAcross[i] <0)
|
2019-01-16 19:40:08 +00:00
|
|
|
{
|
|
|
|
fprintf(stderr, "Master Window start pixel out ot range in Across, window (%d,%d), pixel %d\n", row, col, masterStartPixelAcross[i]);
|
|
|
|
exit(EXIT_FAILURE);
|
2019-11-20 00:59:49 +00:00
|
|
|
}
|
|
|
|
endPixel = masterStartPixelDown[i] + windowSizeHeightRaw;
|
|
|
|
if(endPixel >= masterImageHeight)
|
2019-01-16 19:40:08 +00:00
|
|
|
{
|
|
|
|
fprintf(stderr, "Master Window end pixel out ot range in Down, window (%d,%d), pixel %d\n", row, col, endPixel);
|
|
|
|
exit(EXIT_FAILURE);
|
2019-11-20 00:59:49 +00:00
|
|
|
}
|
|
|
|
endPixel = masterStartPixelAcross[i] + windowSizeWidthRaw;
|
|
|
|
if(endPixel >= masterImageWidth)
|
2019-01-16 19:40:08 +00:00
|
|
|
{
|
|
|
|
fprintf(stderr, "Master Window end pixel out ot range in Across, window (%d,%d), pixel %d\n", row, col, endPixel);
|
|
|
|
exit(EXIT_FAILURE);
|
2019-11-20 00:59:49 +00:00
|
|
|
}
|
2019-01-16 19:40:08 +00:00
|
|
|
//slave
|
2019-11-20 00:59:49 +00:00
|
|
|
if(slaveStartPixelDown[i] <0)
|
2019-01-16 19:40:08 +00:00
|
|
|
{
|
|
|
|
fprintf(stderr, "Slave Window start pixel out ot range in Down, window (%d,%d), pixel %d\n", row, col, slaveStartPixelDown[i]);
|
2019-11-20 00:59:49 +00:00
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
if(slaveStartPixelAcross[i] <0)
|
2019-01-16 19:40:08 +00:00
|
|
|
{
|
|
|
|
fprintf(stderr, "Slave Window start pixel out ot range in Across, window (%d,%d), pixel %d\n", row, col, slaveStartPixelAcross[i]);
|
|
|
|
exit(EXIT_FAILURE);
|
2019-11-20 00:59:49 +00:00
|
|
|
}
|
|
|
|
endPixel = slaveStartPixelDown[i] + searchWindowSizeHeightRaw;
|
|
|
|
if(endPixel >= slaveImageHeight)
|
2019-01-16 19:40:08 +00:00
|
|
|
{
|
|
|
|
fprintf(stderr, "Slave Window end pixel out ot range in Down, window (%d,%d), pixel %d\n", row, col, endPixel);
|
|
|
|
exit(EXIT_FAILURE);
|
2019-11-20 00:59:49 +00:00
|
|
|
}
|
|
|
|
endPixel = slaveStartPixelAcross[i] + searchWindowSizeWidthRaw;
|
|
|
|
if(endPixel >= slaveImageWidth)
|
2019-01-16 19:40:08 +00:00
|
|
|
{
|
|
|
|
fprintf(stderr, "Slave Window end pixel out ot range in Across, window (%d,%d), pixel %d\n", row, col, endPixel);
|
|
|
|
exit(EXIT_FAILURE);
|
2019-11-20 00:59:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2019-01-16 19:40:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-11-20 00:59:49 +00:00
|
|
|
cuAmpcorParameter::~cuAmpcorParameter()
|
2019-01-16 19:40:08 +00:00
|
|
|
{
|
|
|
|
deallocateArrays();
|
|
|
|
}
|