ISCE_INSAR/components/stdproc/model/addsubmodel/src/addsubmodel.cpp

211 lines
4.7 KiB
C++

//#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//# Author: Piyush Agram
//# Copyright 2013, by the California Institute of Technology. ALL RIGHTS RESERVED.
//# United States Government Sponsorship acknowledged.
//# Any commercial use must be negotiated with the Office of Technology Transfer at
//# the California Institute of Technology.
//# This software may be subject to U.S. export control laws.
//# By accepting this software, the user agrees to comply with all applicable U.S.
//# export laws and regulations. User has the responsibility to obtain export licenses,
//# or other export authority as may be required before exporting such information to
//# foreign countries or providing access to foreign persons.
//#
//#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <iostream>
#include <cmath>
#include <complex>
#include "addsubmodel.h"
#include "DataAccessor.h"
using namespace std;
void addsubmodel::setDims(int wid, int len)
{
width = wid;
length = len;
}
void addsubmodel::setScaleFactor(float scale)
{
scaleFactor = scale;
}
void addsubmodel::setFlip(int flag)
{
flip = flag;
}
void addsubmodel::cpxCpxprocess(uint64_t input, uint64_t model, uint64_t out)
{
DataAccessor* modelAcc = (DataAccessor*) model;
DataAccessor* inAcc = (DataAccessor*) input;
DataAccessor* outAcc = (DataAccessor*) out;
int i,j,k;
int wid;
if (scaleFactor != 1.0)
{
cout << "scaleFactor is not used when both input and model are complex floats. \n";
}
complex <float> *data = new complex<float>[width];
complex <float> *modarr = new complex<float>[width];
for(i=0;i<length;i++)
{
k=i;
modelAcc->getLine((char*)modarr,k);
k=i;
inAcc->getLine((char*)data,k);
wid = width;
if(flip !=0 )
{
#pragma omp parallel for private(j) \
shared(modarr,wid,data)
for(j=0;j<wid;j++)
{
data[j] = data[j]*conj(modarr[j]);
}
}
else
{
#pragma omp parallel for private(j) \
shared(modarr,data,wid)
for(j=0; j<wid; j++)
{
data[j] = data[j]*modarr[j];
}
}
k = i;
outAcc->setLine((char*)data,k);
}
delete [] data;
delete [] modarr;
modelAcc = NULL;
inAcc = NULL;
outAcc = NULL;
}
void addsubmodel::unwUnwprocess(uint64_t input, uint64_t model, uint64_t out)
{
DataAccessor* modelAcc = (DataAccessor*) model;
DataAccessor* inAcc = (DataAccessor*) input;
DataAccessor* outAcc = (DataAccessor*) out;
int i,j,k;
int wid;
float mult;
if (flip != 0)
{
mult = -scaleFactor;
}
else
{
mult = scaleFactor;
}
float *data = new float[width];
float *modarr = new float[width];
for(i=0;i<length;i++)
{
k=i;
modelAcc->getLine((char*)modarr,k);
k=i;
inAcc->getLine((char*)data,k);
wid = width;
#pragma omp parallel for private(j) \
shared(modarr,data,wid,mult)
for(j=0; j<wid; j++)
{
data[j] = data[j] + mult*modarr[j];
}
k = i;
outAcc->setLine((char*)data,k);
}
delete [] data;
delete [] modarr;
modelAcc = NULL;
inAcc = NULL;
outAcc = NULL;
}
void addsubmodel::cpxUnwprocess(uint64_t input, uint64_t model, uint64_t out)
{
DataAccessor* modelAcc = (DataAccessor*) model;
DataAccessor* inAcc = (DataAccessor*) input;
DataAccessor* outAcc = (DataAccessor*) out;
//Complex J
complex <float> cJ;
cJ = (0.0,1.0);
int i,j,k;
int wid;
float mult;
if (flip != 0)
{
mult = -scaleFactor;
}
else
{
mult = scaleFactor;
}
complex <float> *data = new complex<float>[width];
float *modarr = new float[width];
for(i=0;i<length;i++)
{
k=i;
modelAcc->getLine((char*)modarr,k);
k=i;
inAcc->getLine((char*)data,k);
wid = width;
#pragma omp parallel for private(j) \
shared(modarr,data,wid,mult,cJ)
for(j=0; j<wid; j++)
{
data[j] = data[j] * exp(cJ*mult*modarr[j]);
}
k = i;
outAcc->setLine((char*)data,k);
}
delete [] data;
delete [] modarr;
modelAcc = NULL;
inAcc = NULL;
outAcc = NULL;
}
void addsubmodel::print()
{
cout << "**************************\n";
cout << "Length: " << length <<"\n";
cout << "Width: " << width << "\n";
cout << "Scale : " << scaleFactor << "\n";
cout << "Flip : " << flip << "\n";
}