void step() { phi.initGhostCells( ); { #pragma omp parallel for firstprivate( ghostfield) for( unsigned i=0; i<2; i++) { swap_fields( field[i], ghostfield);// now field is void ghostfield.initGhostCells( ); arakawa( phi, ghostfield, nonlinear[i]); swap_fields( field[i], ghostfield);// now ghostfield is void } karniadakis.step_i<S>( field, nonlinear); #pragma omp parallel for for( unsigned i=0; i<2; i++) dft_drt.r2c( field[i], cfield[i]); karniadakis.step_ii( cfield); swap_fields( cphi, phi); //now phi is void multiply_coefficients(); #pragma omp parallel for for( unsigned i=0; i<2; i++) dft_drt.c2r( cfield[i], field[i]); } dft_drt.c2r( cphi, phi); //field in phi again }
int main() { //Construct coefficients and init karniadakis with correct normalisation const Complex kxmin { 0, 2.*M_PI/lx}, kzmin{ 0, M_PI/lz}; for( unsigned i=0; i<nz; i++) for( unsigned j=0; j<nx/2+1; j++) rayleigh_equations( coefficients(i,j), (double)j*kxmin, (double)(i+1)*kzmin); karniadakis.init_coeff( coefficients, (double)(2*nx*(nz))); //swaps in coefficients //Initialize the complex fields //////////////////////// cfield[0].zero(); cfield[1].zero(); Complex ctheta_0 = { 0, -0.5*theta_0}; Complex comega_0 = {0.5*omega_0, 0}; cfield[0](iz, ix) = ctheta_0; cfield[1](iz, ix) = comega_0; //Transform and backtransform will multiply input dft_drt.c2r( cfield[0], field[0]), dft_drt.c2r( cfield[1], field[1]); dft_drt.r2c( field[0], cfield[0]), dft_drt.r2c( field[1], cfield[1]); //Hopefully the step_ii function will correctly normalize karniadakis.invert_coeff<TL_EULER>(); karniadakis.step_ii( cfield); if( abs( cfield[0](iz,ix) - ctheta_0) > 1e-14 || abs( cfield[1](iz,ix) - comega_0) > 1e-14 ) { cout << "TEST FAILED: \n"; cout << setprecision(6) << fixed; cout << "Rayleigh = "<< R <<endl; cout << "-0.5 theta_0 = " <<ctheta_0<< endl << " 0.5 omega_0 = "<< comega_0<<endl; cout << cfield[0](iz,ix) << endl<< cfield[1](iz,ix)<<endl; cout <<scientific<< "Difference: " <<abs( cfield[0](iz,ix) - ctheta_0 )<<endl; cout <<scientific<< "Difference: " <<abs( cfield[1](iz,ix) - comega_0 )<<endl; } else cout << "TEST PASSED!\n"; return 0; }