c ++中的二维线性对流(分段故障)

时间:2014-11-21 22:01:16

标签: c++ finite-element-analysis fluid-dynamics

我跟随Lorena Barbara博士对Navier stokes方程(http://lorenabarba.com/blog/cfd-python-12-steps-to-navier-stokes/)结构的12个步骤,但我不确定如何进行2d线性对流。我想知道这里是否有人会熟悉如何做到这一点。 以下是我的示例代码:

#include <iostream>
#include <fstream>
#include <string>
#include <cstring> 
#include <cstdlib> 
#include <typeinfo>
#include <sstream>
#include <cmath>

void linspace_2d(double a, double b, double c, double d, double ** array){
    double delta =(b-a)/(c-1);
    for (int i=0; i<c; ++i){
            for (int j=0; j<d; ++j){
                    array[i][j]= j*delta;
               }
       } 
  }

void convection_2d(const std::string& str, const int nx, const int ny, const int nt){
       double c=1.;            // speed
       double dx=2.0/(nx-1.);  // grid distance in x direction
       double dy=2.0/(ny-1.);  // grid distance in y direction
       double sigma=0.2;
       double dt=sigma*dx;      // time step

       double **space;          // mesh grid
       // Alocate memory
       space = new double *[nx];
       for (int i=0; i<nx; ++i){ space[i] = new double[ny]; }

       double a=0, b=2;
       linspace_2d(a, b, nx, ny, space);    // function creates gives values to the mesh

       // Initialize the array u and
       double **u;    
       u = new double *[nx];
       for (int i=0; i<nx; ++i){ u[i] = new double[ny]; }

       // Set inital conditions
       for (int i=0; i<nx; ++i){
               for (int j=0; j<ny; ++j){
                       u[i][j] = 1.;
                       if ( ((double) i>=0.5/dx) && ((double) i<(1./dx+1.)) && ((double) j>=0.5/dy) && ((double) j<(1./dy+1.)) ){
                               u[i][j] = 2.;
                       }
               }
       // Iteration
       for (int t=0; t<nt; ++t){
               // Copy elements of array u into array un
               double **un;
               un = new double *[nx];
               for (int x=0; x<nx; ++x){ un[x] = new double[ny]; }
               for (int x=0; x<nx; ++x){
                       for (int y=0; y<ny; ++y){
                               un[x][y] = u[x][y];
                       }
               }

               // take timestep
               for (int i=0; i<nx; ++i){
                       for (int j=0; j<ny; ++j){
                               u[i][j] = un[i][j] - (c*dt/dx*(un[i][j] - un[i-1][j])) - (c*dt/dy*(un[i][j]-un[i][j-1]));

                       }
               }
       }

1 个答案:

答案 0 :(得分:1)

分别在un[i-1][j]un[i][j-1]时访问i == 0j == 0超出数组范围,因此崩溃。

此外,您会大量泄漏内存,并在每次循环迭代时分配un,并且永远不会删除它。