//----------------------------------------------------------------------------- void MGL_EXPORT mgl_datac_link(HADT d, dual *A, long mx,long my,long mz) { if(!A) return; if(!d->link && d->a) delete [](d->a); d->nx = mx>0 ? mx:1; d->ny = my>0 ? my:1; d->nz = mz>0 ? mz:1; d->link=true; d->a=A; d->NewId(); }
//----------------------------------------------------------------------------- void MGL_EXPORT mgl_datac_squeeze(HADT d, long rx,long ry,long rz,long smooth) { long kx,ky,kz, nx=d->nx, ny=d->ny, nz=d->nz; dual *b; // simple checking if(rx>=nx) rx=nx-1; if(rx<1) rx=1; if(ry>=ny) ry=ny-1; if(ry<1) ry=1; if(rz>=nz) rz=nz-1; if(rz<1) rz=1; // new sizes kx = 1+(nx-1)/rx; ky = 1+(ny-1)/ry; kz = 1+(nz-1)/rz; b = new dual[kx*ky*kz]; if(!smooth) #pragma omp parallel for collapse(3) for(long k=0;k<kz;k++) for(long j=0;j<ky;j++) for(long i=0;i<kx;i++) b[i+kx*(j+ky*k)] = d->a[i*rx+nx*(j*ry+ny*rz*k)]; else #pragma omp parallel for collapse(3) for(long k=0;k<kz;k++) for(long j=0;j<ky;j++) for(long i=0;i<kx;i++) { long dx,dy,dz,i1,j1,k1; dx = (i+1)*rx<=nx ? rx : nx-i*rx; dy = (j+1)*ry<=ny ? ry : ny-j*ry; dz = (k+1)*rz<=nz ? rz : nz-k*rz; dual s = 0; for(k1=k*rz;k1<k*rz+dz;k1++) for(j1=j*ry;j1<j*ry+dz;j1++) for(i1=i*rx;i1<i*rx+dx;i1++) s += d->a[i1+nx*(j1+ny*k1)]; b[i+kx*(j+ky*k)] = s/mreal(dx*dy*dz); } if(!d->link) delete [](d->a); d->a=b; d->nx = kx; d->ny = ky; d->nz = kz; d->NewId(); d->link=false; }
//----------------------------------------------------------------------------- void MGL_EXPORT mgl_datac_rearrange(HADT d, long mx,long my,long mz) { if(mx<1) return; // wrong mx if(my<1) { my = d->nx*d->ny*d->nz/mx; mz = 1; } else if(mz<1) mz = (d->nx*d->ny*d->nz)/(mx*my); long m = mx*my*mz; if(m==0 || m>d->nx*d->ny*d->nz) return; // too high desired dimensions d->nx = mx; d->ny = my; d->nz = mz; d->NewId(); }
//----------------------------------------------------------------------------- void MGL_EXPORT mgl_datac_transpose(HADT d, const char *dim) { long nx=d->nx, ny=d->ny, nz=d->nz, n; dual *b=new dual[nx*ny*nz], *a=d->a; if(!strcmp(dim,"xyz")) memcpy(b,a,nx*ny*nz*sizeof(dual)); else if(!strcmp(dim,"xzy") || !strcmp(dim,"zy")) { #pragma omp parallel for collapse(3) for(long j=0;j<ny;j++) for(long k=0;k<nz;k++) for(long i=0;i<nx;i++) b[i+nx*(k+nz*j)] = a[i+nx*(j+ny*k)]; n=nz; nz=ny; ny=n; } else if(!strcmp(dim,"yxz") || !strcmp(dim,"yx")) { #pragma omp parallel for collapse(3) for(long k=0;k<nz;k++) for(long i=0;i<nx;i++) for(long j=0;j<ny;j++) b[j+ny*(i+nx*k)] = a[i+nx*(j+ny*k)]; n=nx; nx=ny; ny=n; } else if(!strcmp(dim,"yzx")) { #pragma omp parallel for collapse(3) for(long k=0;k<nz;k++) for(long i=0;i<nx;i++) for(long j=0;j<ny;j++) b[j+ny*(k+nz*i)] = a[i+nx*(j+ny*k)]; n=nx; nx=ny; ny=nz; nz=n; } else if(!strcmp(dim,"zxy")) { #pragma omp parallel for collapse(3) for(long i=0;i<nx;i++) for(long j=0;j<ny;j++) for(long k=0;k<nz;k++) b[k+nz*(i+nx*j)] = a[i+nx*(j+ny*k)]; n=nx; nx=nz; nz=ny; ny=n; } else if(!strcmp(dim,"zyx") || !strcmp(dim,"zx")) { #pragma omp parallel for collapse(3) for(long i=0;i<nx;i++) for(long j=0;j<ny;j++) for(long k=0;k<nz;k++) b[k+nz*(j+ny*i)] = a[i+nx*(j+ny*k)]; n=nz; nz=nx; nx=n; } memcpy(a,b,nx*ny*nz*sizeof(dual)); delete []b; n=d->nx; d->nx=nx; d->ny=ny; d->nz=nz; if(nx!=n) d->NewId(); }
//----------------------------------------------------------------------------- void MGL_EXPORT mgl_datac_extend(HADT d, long n1, long n2) { long nx=d->nx, ny=d->ny, nz=d->nz; if(nz>2 || n1==0) return; long mx, my, mz; dual *b=0; if(n1>0) // extend to higher dimension(s) { n2 = n2>0 ? n2:1; mx = nx; my = ny>1?ny:n1; mz = ny>1 ? n1 : n2; b = new dual[mx*my*mz]; if(ny>1) #pragma omp parallel for for(long i=0;i<n1;i++) memcpy(b+i*nx*ny, d->a, nx*ny*sizeof(dual)); else #pragma omp parallel for for(long i=0;i<n1*n2;i++) memcpy(b+i*nx, d->a, nx*sizeof(dual)); } else { mx = -n1; my = n2<0 ? -n2 : nx; mz = n2<0 ? nx : ny; if(n2>0 && ny==1) mz = n2; b = new dual[mx*my*mz]; dual v; if(n2<0) #pragma omp parallel for collapse(2) for(long j=0;j<nx;j++) for(long i=0;i<mx*my;i++) b[i+mx*my*j] = d->a[j]; else #pragma omp parallel for collapse(2) for(long j=0;j<nx*ny;j++) for(long i=0;i<mx;i++) b[i+mx*j] = d->a[j]; if(n2>0 && ny==1) #pragma omp parallel for for(long i=0;i<n2;i++) memcpy(b+i*mx*my, d->a, mx*my*sizeof(dual)); } if(!d->link) delete [](d->a); d->a=b; d->nx=mx; d->ny=my; d->nz=mz; d->NewId(); d->link=false; }