コード例 #1
0
ファイル: toefl_b.cpp プロジェクト: Gregor1981/feltor
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
}
コード例 #2
0
ファイル: karniadakis2_t.cpp プロジェクト: rkube/feltor
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;
}