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]); }
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); }
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); }