конечно-элементный анализ — 2-я линейная конвекция в c ++ (ошибка сегментации)

я следую 12 шагов доктора Лорены Барбары к уравнению Стокса Навье (http://lorenabarba.com/blog/cfd-python-12-steps-to-navier-stokes/) структура, но я не уверен, как сделать 2-й линейной конвекции. Мне было интересно, если кто-нибудь здесь будет знаком с тем, как это сделать.
Ниже приведен пример кода:

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

}
}
}

0

Решение

Доступ к un[i-1][j] а также un[i][j-1] выходит за границы массива, когда i == 0 а также j == 0 соответственно отсюда и крушение.

Также вы теряете память в больших количествах выделяя un каждая итерация цикла и никогда ее не удалять.

1

Другие решения


По вопросам рекламы [email protected]