Esempio n. 1
0
File: fft.c Progetto: geoffryan/cow
double k_at(cow_domain *d, int i, int j, int k, double *kvec)
// -----------------------------------------------------------------------------
// Here, we populate the wave vectors on the Fourier lattice. The convention
// used by FFTW is the same as that used by numpy, described at the link
// below. For N odd, the (positive) Nyquist frequency is placed in the middle
// bin.
//
// http://docs.scipy.org/doc/numpy/reference/generated/numpy.fft.fftfreq.html
// -----------------------------------------------------------------------------
{
  const int Nx = cow_domain_getnumglobalzones(d, 0);
  const int Ny = cow_domain_getnumglobalzones(d, 1);
  const int Nz = cow_domain_getnumglobalzones(d, 2);
  i += cow_domain_getglobalstartindex(d, 0);
  j += cow_domain_getglobalstartindex(d, 1);
  k += cow_domain_getglobalstartindex(d, 2);
  kvec[0] = (Nx % 2 == 0) ?
    ((i<  Nx   /2) ? i : i-Nx):  // N even
    ((i<=(Nx-1)/2) ? i : i-Nx);  // N odd
  kvec[1] = (Ny % 2 == 0) ?
    ((j<  Ny   /2) ? j : j-Ny):
    ((j<=(Ny-1)/2) ? j : j-Ny);
  kvec[2] = (Nz % 2 == 0) ?
    ((k<  Nz   /2) ? k : k-Nz):
    ((k<=(Nz-1)/2) ? k : k-Nz);
  return sqrt(kvec[0]*kvec[0] + kvec[1]*kvec[1] + kvec[2]*kvec[2]);
}
Esempio n. 2
0
File: samp.c Progetto: darien0/cow
void cow_dfield_sampleglobalind(cow_dfield *f, int i, int j, int k, double **x,
				int *n0)
{
  int ng = f->domain->n_ghst;
  double xin[3];
  i -= cow_domain_getglobalstartindex(f->domain, 0);
  j -= cow_domain_getglobalstartindex(f->domain, 1);
  k -= cow_domain_getglobalstartindex(f->domain, 2);
  xin[0] = cow_domain_positionatindex(f->domain, 0, i + ng);
  xin[1] = cow_domain_positionatindex(f->domain, 1, j + ng);
  xin[2] = cow_domain_positionatindex(f->domain, 2, k + ng);
  cow_dfield_setsamplecoords(f, xin, 1, 3);
  cow_dfield_setsamplemode(f, COW_SAMPLE_NEAREST);
  cow_dfield_sampleexecute(f);
  cow_dfield_getsampleresult(f, x, NULL, n0);
}
Esempio n. 3
0
File: fft.c Progetto: geoffryan/cow
struct fft_plan_3d *call_fft_plan_3d(cow_domain *d, int *nbuf)
{
  const int i0 = cow_domain_getglobalstartindex(d, 0);
  const int i1 = cow_domain_getnumlocalzonesinterior(d, 0) + i0 - 1;
  const int j0 = cow_domain_getglobalstartindex(d, 1);
  const int j1 = cow_domain_getnumlocalzonesinterior(d, 1) + j0 - 1;
  const int k0 = cow_domain_getglobalstartindex(d, 2);
  const int k1 = cow_domain_getnumlocalzonesinterior(d, 2) + k0 - 1;
  const int Nx = cow_domain_getnumglobalzones(d, 0);
  const int Ny = cow_domain_getnumglobalzones(d, 1);
  const int Nz = cow_domain_getnumglobalzones(d, 2);
  return fft_3d_create_plan(d->mpi_cart,
                            Nz, Ny, Nx,
                            k0,k1, j0,j1, i0,i1,
                            k0,k1, j0,j1, i0,i1,
                            SCALED_NOT, PERMUTE_NONE, nbuf);
}