#include #include #include #include #include #include #include using namespace std; typedef std::complex Complex; void ksintegrate(Complex* u, int Nx, double Lx, double dt, int Nt); double ksnorm(Complex* u, int Nx); int main(int argc, char* argv[]) { // to be set as command-line args int Nx = 0; int Nruns = 5; bool printnorms = false; if (argc < 2) { cout << "please provide one integer argument Nx\n [two optional args: Nruns printnorm]" << endl; exit(1); } Nx = atoi(argv[1]); if (argc >= 3) Nruns = atoi(argv[2]); if (argc >= 4) printnorms = bool(atoi(argv[3])); cout << "Nx == " << Nx << endl; double dt = 1.0/16.0; double T = 200.0; double Lx = (M_PI/16.0)*Nx; double dx = Lx/Nx; int Nt = (int)(T/dt); double* x = new double[Nx]; Complex* u0 = new Complex[Nx]; Complex* u = new Complex[Nx]; for (int n=0; n= skip) avgtime += cputime; printf("cputtime == %f\n", cputime); } printf("norm(u(0)) == %f\n", ksnorm(u0, Nx)); printf("norm(u(T)) == %f\n", ksnorm(u, Nx)); avgtime /= (Nruns-skip); printf("avgtime == %f\n", avgtime); delete[] u0; delete[] u; delete[] x; } void ksintegrate(Complex* u, int Nx, double Lx, double dt, int Nt) { int* kx = new int[Nx]; double* alpha = new double[Nx]; Complex* D = new Complex[Nx]; Complex* G = new Complex[Nx]; double* L = new double[Nx]; for (int n=0; n(u); fftw_complex* uu_fftw = reinterpret_cast(uu); fftw_plan u_fftw_plan = fftw_plan_dft_1d(Nx, u_fftw, u_fftw, FFTW_FORWARD, FFTW_ESTIMATE); fftw_plan u_ifftw_plan = fftw_plan_dft_1d(Nx, u_fftw, u_fftw, FFTW_BACKWARD, FFTW_ESTIMATE); fftw_plan uu_fftw_plan = fftw_plan_dft_1d(Nx, uu_fftw, uu_fftw, FFTW_FORWARD, FFTW_ESTIMATE); fftw_plan uu_ifftw_plan = fftw_plan_dft_1d(Nx, uu_fftw, uu_fftw, FFTW_BACKWARD, FFTW_ESTIMATE); fftw_execute(uu_fftw_plan); Complex* Nn = new Complex[Nx]; for (int n=0; n spectral for (int n=0; n