darray.cxx
/**************************************************************************
* darray.C
*
* Array class
*
* Constructor, copy constructor, destructor, operator overloading
* function overloading, reference type
*
**************************************************************************/
/**********************************************************
* definition of array class
**********************************************************/
#include "darray.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
void G__ary_assign(double *c,double start,double stop,int n)
{
int i;
double res;
res = (stop-start)/(n-1);
for(i=0;i<n;i++) c[i] = i*res + start ;
}
void G__ary_plus(double *c,double *a,double *b,n)
double *c,*a,*b;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = a[i] + b[i];
}
void G__ary_minus(c,a,b,n)
double *c,*a,*b;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = a[i] - b[i];
}
void G__ary_multiply(c,a,b,n)
double *c,*a,*b;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = a[i] * b[i];
}
void G__ary_divide(c,a,b,n)
double *c,*a,*b;
int n;
{
int i;
for(i=0;i<n;i++) {
if(b[i]!=0) c[i] = a[i] / b[i];
else {
if(a[i]==0) c[i]=1;
else if(a[i]>0) c[i]=1e101;
else c[i]=-1e101;
}
}
}
void G__ary_power(c,a,b,n)
double *c,*a,*b;
int n;
{
int i,j;
int flag=0;
double r;
for(i=0;i<n;i++) {
if(a[i]>0) c[i] = exp(b[i]*log(a[i]));
else if(a[i]==0) c[i]=0;
else {
if(fmod(b[i],1.0)==0.0) {
r=1;
for(j=0;j<(int)a[i];j++)
r *= b[i];
}
else if(flag==0) {
fprintf(stderr,"Error: Power operator oprand<0\n");
flag++;
}
}
}
}
void G__ary_exp(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = exp(a[i]);
}
void G__ary_log(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) {
if(a[i]>0) c[i] = log(a[i]);
else c[i] = -1e101;
}
}
void G__ary_log10(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) {
if(a[i]>0) c[i] = log10(a[i]);
else c[i] = -1e101;
}
}
void G__ary_sinc(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) {
if(a[i]!=0) c[i] = sin(a[i])/a[i];
else c[i] = 1;
}
}
void G__ary_sin(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = sin(a[i]);
}
void G__ary_cos(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = cos(a[i]);
}
void G__ary_tan(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = tan(a[i]);
}
void G__ary_sinh(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = sinh(a[i]);
}
void G__ary_cosh(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = cosh(a[i]);
}
void G__ary_tanh(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = tanh(a[i]);
}
void G__ary_asin(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = asin(a[i]);
}
void G__ary_acos(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = acos(a[i]);
}
void G__ary_atan(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = atan(a[i]);
}
void G__ary_fabs(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = fabs(a[i]);
}
void G__ary_sqrt(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) c[i] = sqrt(a[i]);
}
void G__ary_rect(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) {
if(-0.5<a[i] && a[i]<0.5)
c[i]=1.0;
else if(a[i]==0.5 || a[i]==0.5)
c[i]=0.5;
else
c[i]=0.0;
}
}
void G__ary_square(c,a,n)
double *c,*a;
int n;
{
int i;
double tmp;
for(i=0;i<n;i++) {
tmp = sin(a[i]);
if(tmp<0) c[i] = -1.0;
else if(tmp==0) c[i]= 0.0;
else c[i] = 1.0;
}
}
void G__ary_rand(c,a,n)
double *c,*a;
int n;
{
int i;
for(i=0;i<n;i++) {
c[i] = drand48();
}
}
void G__ary_conv(c,a,n,b,m)
double *c,*a,*b;
int n,m;
{
int i,j,k;
int f,t;
f = m/2;
t = m-f;
for(i=0;i<n;i++) {
c[i]=0.0;
for(j=0;j<m;j++) {
k=i-f+j;
if(k<0) c[i] += a[0]*b[j];
else if(k>=n) c[i] += a[n-1]*b[j];
else c[i] += a[k]*b[j];
}
}
}
void G__ary_integ(c,a,b,n)
double *c,*a,*b;
int n;
{
int i;
double integ=0.0;
for(i=0;i<n-1;i++) {
integ += b[i]*(a[i+1]-a[i]);
c[i] = integ;
}
integ += b[i]*(a[i]-a[i-1]);
c[i] = integ;
}
void G__ary_diff(c,a,b,n)
double *c,*a,*b;
int n;
{
int i;
double integ=0.0;
for(i=0;i<n;i++) {
c[i] = (b[i+1]-b[i])/(a[i+1]-a[i]);
}
c[i] = c[i-1];
}
/***********************************************
* Destructor
***********************************************/
array::~array()
{
delete[] dat;
}
/***********************************************
* Copy constructor
***********************************************/
array::array(array& X)
{
int i;
dat = new double[X.n];
memcpy(dat,X.dat,X.n*sizeof(double));
n = X.n;
}
/***********************************************
* Implicit conversion constructor
***********************************************/
array::array(double x)
{
if(G__arraysize==0) {
cerr << "Error: Size of array 0\n";
return;
}
dat = new double[G__arraysize];
G__ary_assign(dat,x,x,G__arraysize);
n=G__arraysize;
}
/***********************************************
* Constructor
***********************************************/
array::array(double start,double stop,int ndat)
{
double res;
G__arraysize=ndat;
dat = new double[G__arraysize];
G__ary_assign(dat,start,stop,G__arraysize);
n = G__arraysize;
}
/***********************************************
* constructor
***********************************************/
array::array(void)
{
if(G__arraysize==0) {
cerr << "Error: Size of array 0\n";
return;
}
dat = new double[G__arraysize];
n=G__arraysize;
}
/***********************************************
* constructor
***********************************************/
array::array(double *p,int ndat)
{
G__arraysize=ndat;
dat = new double[G__arraysize];
memcpy(dat,p,ndat*sizeof(double));
n = G__arraysize;
}
/***********************************************
* constructor for rvalue subarray
***********************************************/
array::array(array& X,int offset,int ndat)
{
int i;
dat = new double[ndat];
if(offset+ndat>X.n) {
memcpy(dat,X.dat+offset,(X.n-offset)*sizeof(double));
for(i=X.n-offset;i<ndat;i++) dat[i] = 0.0;
}
else {
memcpy(dat,X.dat+offset,ndat*sizeof(double));
}
n = ndat;
}
/***********************************************
* resize
***********************************************/
int array::resize(int size)
{
double *temp;
if(size!=n) {
delete[] dat;
dat=new double[size];
n=size;
}
return(n);
}
/**********************************************************
* operator = as member function
**********************************************************/
array& array::operator =(array& a)
{
int i;
if(a.n<n) memcpy(dat,a.dat,a.n*sizeof(double));
else memcpy(dat,a.dat,n*sizeof(double));
return(*this);
}
/***********************************************
* operator +
***********************************************/
array operator +(array& a,array& b)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_plus(c.dat,a.dat,b.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* operator -
***********************************************/
array operator -(array& a,array& b)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_minus(c.dat,a.dat,b.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* operator *
***********************************************/
array operator *(array& a,array& b)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_multiply(c.dat,a.dat,b.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* operator /
***********************************************/
array operator /(array& a,array& b)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_divide(c.dat,a.dat,b.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* operator @ (power)
***********************************************/
array operator @(array& a,array& b)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_power(c.dat,a.dat,b.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* operator << (shift)
***********************************************/
array operator <<(array& a,int shift)
{
array c=array(0.0 , 0.0 , a.n);
int i;
for(i=0;i<a.n-shift;i++) {c.dat[i] = a.dat[i+shift] ;}
c.n=a.n;
return(c);
}
/***********************************************
* operator >> (shift)
***********************************************/
array operator >>(array& a,int shift)
{
array c=array(0.0 , 0.0 , a.n);
int i;
for(i=0;i<a.n-shift;i++) {c.dat[i+shift] = a.dat[i] ;}
c.n=a.n;
return(c);
}
/**********************************************************
* class array function overloading
**********************************************************/
/***********************************************
* exp
***********************************************/
array exp(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_exp(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* log
***********************************************/
array log(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_log(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* log10
***********************************************/
array log10(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_log10(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* sinc
***********************************************/
array sinc(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_sinc(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* sin
***********************************************/
array sin(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_sin(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* cos
***********************************************/
array cos(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_cos(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* tan
***********************************************/
array tan(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_tan(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* sinh
***********************************************/
array sinh(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_sinh(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* cosh
***********************************************/
array cosh(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_cosh(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* tanh
***********************************************/
array tanh(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_tanh(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* asin
***********************************************/
array asin(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_asin(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* acos
***********************************************/
array acos(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_acos(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* atan
***********************************************/
array atan(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_atan(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* abs
***********************************************/
array abs(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_fabs(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* fabs
***********************************************/
array fabs(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_fabs(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* sqrt
***********************************************/
array sqrt(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_sqrt(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* rect
***********************************************/
array rect(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_rect(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* square
***********************************************/
array square(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_square(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* rand
***********************************************/
array rand(array& a)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_rand(c.dat,a.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* conv cross convolution
***********************************************/
array conv(array& a,array& b)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_conv(c.dat,a.dat,a.n,b.dat,b.n);
c.n=a.n;
return(c);
}
/***********************************************
* integ
***********************************************/
array integ(array& a,array& b)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_integ(c.dat,a.dat,b.dat,a.n);
c.n=a.n;
return(c);
}
/***********************************************
* diff differential
***********************************************/
array diff(array& a,array& b)
{
array c=array(0.0 , 0.0 , a.n);
int i;
G__ary_diff(c.dat,a.dat,b.dat,a.n);
c.n=a.n;
return(c);
}
/**********************************************************
* subarray class for lvalue
**********************************************************/
subarray array::sub(int offset,int ndat)
{
subarray c;
c.dat = dat + offset;
if(offset+ndat>n) {
c.n = n-offset;
cerr << "Not enough data in master array, data shrinked\n";
}
else {
c.n = ndat;
}
return(c);
}
array& subarray::operator =(array& a)
{
if(a.n<n) memcpy(dat,a.dat,a.n*sizeof(double));
else memcpy(dat,a.dat,n*sizeof(double));
return(a);
}
// optional for rvalue
subarray& subarray::operator =(subarray& a)
{
if(a.n<n) memcpy(dat,a.dat,a.n*sizeof(double));
else memcpy(dat,a.dat,n*sizeof(double));
return(a);
}
/***********************************************
* subarray for rvalue
***********************************************/
array subarray(array& X,int offset,int ndat)
{
array c=array(X,offset,ndat);
return(c);
}