一个有关网格生成的问题

weixin_41655489 2018-04-11 09:38:20
我是一个非计算机专业的学生,现在正在做毕业设计
我在编程中遇到了如下的麻烦
定义了3个int的数作为三维网格的长宽高如下
//定义物理尺寸
const int NX = 10;
const int NY = 10;
const int NZ = 10;
const int M = NX*NY*NZ; //10*10*10的立方体为网格区域
但是课程要求至少NX,NY,NZ为200 运行的时候就会出现问题,老师说是运行内存的问题,但是并没有告诉我如何解决,我现在像求助大家帮忙



...全文
694 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiht594 2018-04-13
  • 打赏
  • 举报
回复
数组太大了。 栈大小不够。需要在堆上分配内存、用new/delete或者malloc/free。 可以搜以下堆栈区别
srhouyu 2018-04-13
  • 打赏
  • 举报
回复
静态数组的容量很有限。想要比较大的数组就得new动态数组。但是比较麻烦。动态数组只能是一维的,你得把三维的内容展开,放到一维中去。 使用vector<vector<vector<double>>>更方便一些。
赵4老师 2018-04-12
  • 打赏
  • 举报
回复
仅供参考:
//在堆中开辟一个3×4×5的3维int数组
#include <stdio.h>
#include <malloc.h>
int ***p;
int i,j,k;
void main() {
    p=(int ***)malloc(3*sizeof(int **));
    if (NULL==p) return;
    for (i=0;i<3;i++) {
        p[i]=(int **)malloc(4*sizeof(int *));
        if (NULL==p[i]) return;
        for (j=0;j<4;j++) {
            p[i][j]=(int *)malloc(5*sizeof(int));
            if (NULL==p[i][j]) return;
        }
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            for (k=0;k<5;k++) {
                p[i][j][k]=i*20+j*5+k;
            }
        }
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            for (k=0;k<5;k++) {
                printf(" %2d",p[i][j][k]);
            }
            printf("\n");
        }
        printf("---------------\n");
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            free(p[i][j]);
        }
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
//---------------
// 20 21 22 23 24
// 25 26 27 28 29
// 30 31 32 33 34
// 35 36 37 38 39
//---------------
// 40 41 42 43 44
// 45 46 47 48 49
// 50 51 52 53 54
// 55 56 57 58 59
//---------------
weixin_41655489 2018-04-11
  • 打赏
  • 举报
回复
//15向前上方向生长 if (index_i < NX - 1 && index_k < NZ - 1) { i = index_i + 1; j = index_j; k = index_k + 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d7_18) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //16向前下方向生长 if (index_i <NX - 1 && index_k >0) { i = index_i + 1; j = index_j; k = index_k - 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d7_18) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //17向后上方向生长 if (index_i > 0 && index_k < NZ - 1) { i = index_i - 1; j = index_j; k = index_k + 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d7_18) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //18向后下方向生长 if (index_i > 0 && index_k > 0) { i = index_i - 1; j = index_j; k = index_k - 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d7_18) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //19向右前上对角线方向生长 if (index_i < NX - 1 && index_j < NY - 1 && index_k < NZ - 1) { i = index_i + 1; j = index_j + 1; k = index_k + 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d19_26) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //20向右后上对角线方向生长 if (index_i > 0 && index_j < NY - 1 && index_k < NZ - 1) { i = index_i - 1; j = index_j + 1; k = index_k + 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d19_26) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //21向左后上对角线方向生长 if (index_i > 0 && index_j > 0 && index_k < NZ - 1) { i = index_i - 1; j = index_j - 1; k = index_k + 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d19_26) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //22向左前上对角线方向生长 if (index_i<NX - 1 && index_j>0 && index_k < NZ - 1) { i = index_i + 1; j = index_j - 1; k = index_k + 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d19_26) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //23向右前下对角线方向生长 if (index_i < NX - 1 && index_j<NY - 1 && index_k>0) { i = index_i + 1; j = index_j + 1; k = index_k - 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d19_26) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //24向右后下对角线方向生长 if (index_i > 0 && index_j<NY - 1 && index_k>0) { i = index_i - 1; j = index_j + 1; k = index_k - 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d19_26) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //25向左后下对角线方向生长 if (index_i > 0 && index_j > 0 && index_k > 0) { i = index_i - 1; j = index_j - 1; k = index_k - 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d19_26) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //26向左前下对角线方向生长 if (index_i<NX - 1 && index_j>0 && index_k > 0) { i = index_i + 1; j = index_j - 1; k = index_k - 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d19_26) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } } Tnumsoild = numsoild;//统计生长相个数 } } double feq(int q, double rho, double u[3]) //定义平衡态分布函数 { double eu, uvw, feq; eu = e[q][0] * u[0] + e[q][1] * u[1] + e[q][2] * u[2]; //离散速度 uvw = u[0] * u[0] + u[1] * u[1] + u[2] * u[2]; //u^2项 feq = w[q] * rho* (1.0 + 3.0*eu + 4.5*eu*eu - 1.5*uvw); //书P49 式子3.106 return feq; } void Evolution() //演化 { //Collision step 碰撞过程 for (k = 0; k <= NZ; k++) { for (j = 0; j <= NY; j++) { for (i = 0; i <= NX; i++) { for (q = 0; q < Q; q++) //对于19个方向 { if (arrgrid[i][j][k] == 0) //对于网格内的所有点进行划分,如果某点为间隙(非生长相),则进行逼近 { f[i][j][k][q] = f[i][j][k][q] + omega*(feq(q, rho[i][j][k], u[i][j][k]) - f[i][j][k][q]);//得到演化后的速度分布函数,书P48 式子3.104 } } } } } //streaming for (k = 0; k <= NZ; k++) { for (j = 0; j <= NY; j++) { for (i = 0; i <= NX; i++) { for (q = 0; q < Q; q++) { ip = i + e[q][0]; //演化后的三维位置 jp = j + e[q][1]; kp = k + e[q][2]; if (ip >= 0 && jp >= 0 && kp >= 0 && ip <= NX && jp <= NY && kp <= NZ) //该点位于网格区域内部 { ftemp[ip][jp][kp][q] = f[i][j][k][q]; //得到一个演化后的临时速度分布函数 } } } } } for (k = 0; k <= NZ; k++) { for (j = 0; j <= NY; j++) { for (i = 0; i <= NX; i++) { for (q = 0; q < Q; q++) { f[i][j][k][q] = ftemp[i][j][k][q]; } } } } }
weixin_41655489 2018-04-11
  • 打赏
  • 举报
回复
void QuartetStructureGenerationSet() { double d1_6 = 0.02; //定义六个主方向(接触)生长概率为0.02 double d7_18 = d1_6 / 2.; //定义十二个次方向(水平)生长概率为0.01 double d19_26 = d1_6 / 8.; //定义六个第三方向(对角线)生长概率为0.0025 double n = 0.8; //定义孔隙率为0.8 double cdd = 0.001; //定义生长核分布概率为0.001 double numtotal_need = (1 - n)*NX*NY*NZ; //定义生长相的数量 int numsoild = 0; //定义初始生长核数量为0 int Tnumsoild; //定义整型生长核总量 int soild[M + 1][3]; srand((unsigned)time(NULL)); //第一步,遍历所有网格,生成固相内核 for (i = 0; i <= NX; i++) //生成格点[0][0][0],,,,[0][0][10];[0][1][0],,,[0][1][10];;;;[10][10][10] { for (j = 0; j <= NY; j++) { for (k = 0; k <= NZ; k++) { arrgrid[i][j][k] = 0; //初始化每一个格点,初始化后,格点的坐标变为[0][0][0],并赋值为0 soild[numsoild][0] = 0; soild[numsoild][1] = 0; soild[numsoild][2] = 0; if (((rand() % 1000) / 1000.0) < cdd) //随机分配一个0~0.9999的数值给每一个格点 { arrgrid[i][j][k] = 1; //若该值小于生长核分布概率0.001,则赋值为1,并记录下它的坐标[i][j][k](表示该点为生长核) soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; numsoild = numsoild + 1; //记录生长核的数量 } } } } Tnumsoild = numsoild; //获得生长核总数 //第二步,从固相核向周围26个方向生长 while (Tnumsoild < numtotal_need) //当生长核总数小于生长相(200)时,执行以下循环 { for (int index_soild = 0; index_soild < Tnumsoild; index_soild++) //分别记录所有生长核的三维坐标 { int index_i = soild[index_soild][0]; int index_j = soild[index_soild][1]; int index_k = soild[index_soild][2]; //1向右方向生长 if (index_j < NY - 1) //对于内部生长核而言 { i = index_i; j = index_j + 1; k = index_k; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d1_6) //该生长核右方向节点并非生长核并且方向随机生长率满足设定值 { numsoild = numsoild + 1; //该点成为生长核,并记录其坐标,其余方向同理 arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //2向后方向生长 if (index_i > 0) { i = index_i - 1; j = index_j; k = index_k; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d1_6) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //3向左方向生长 if (index_j > 0) { i = index_i; j = index_j - 1; k = index_k; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d1_6) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //4向前方向生长 if (index_i < NX - 1) { i = index_i + 1; j = index_j; k = index_k; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d1_6) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //5向上方向生长 if (index_k < NZ - 1) { i = index_i; j = index_j; k = index_k + 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d1_6) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //6向下方向生长 if (index_k > 0) { i = index_i; j = index_j; k = index_k - 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d1_6) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //7向水平方向右前生长 if (index_i < NX - 1 && index_j < NY - 1) { i = index_i + 1; j = index_j + 1; k = index_k; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d7_18) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //8向水平方向左前生长 if (index_i < NX - 1 && index_j > 0) { i = index_i + 1; j = index_j - 1; k = index_k; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d7_18) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //9向水平方向右后生长 if (index_i > 0 && index_j < NY - 1) { i = index_i - 1; j = index_j + 1; k = index_k; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d7_18) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //10向水平方向左后生长 if (index_i > 0 && index_j > 0) { i = index_i - 1; j = index_j - 1; k = index_k; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d7_18) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //11向右上方向生长 if (index_j < NY - 1 && index_k < NZ - 1) { i = index_i; j = index_j + 1; k = index_k + 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d7_18) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //12向右下方向生长 if (index_j <NY - 1 && index_k >0) { i = index_i; j = index_j + 1; k = index_k - 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d7_18) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } } //13向左上方向生长 if (index_j > 0 && index_k < NZ - 1) { i = index_i; j = index_j - 1; k = index_k + 1; if (arrgrid[i][j][k] == 0 && ((rand() % 1000) / 1000.0) < d7_18) { numsoild = numsoild + 1; arrgrid[i][j][k] = 1; soild[numsoild][0] = i; soild[numsoild][1] = j; soild[numsoild][2] = k; } }
weixin_41655489 2018-04-11
  • 打赏
  • 举报
回复
#include <iostream> //声明头文件 #include <cmath> #include <cstdlib> #include <iomanip> #include <fstream> #include <sstream> #include <string> #include <ctime> using namespace std; //D3Q19 3维19个离散速度 const int Q = 19; int e[Q][3] = { { 0, 0, 0 }, { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1, 0 }, { 0, -1, 0 }, { 0, 0, 1 }, { 0, 0, -1 }, { 1, 1, 0 }, { -1, -1, 0 }, { 1, -1, 0 }, { -1, 1, 0 }, { 1, 0, 1 }, { -1, 0, -1 }, { 1, 0, -1 }, { -1, 0, 1 }, { 0, 1, 1 }, { 0, -1, -1 }, { 0, 1, -1 }, { 0, -1, 1 } }; double w[Q] = { 1. / 3, 1. / 18, 1. / 18, 1. / 18, 1. / 18, 1. / 18, 1. / 18, 1. / 36, 1. / 36, 1. / 36, 1. / 36, 1. / 36, 1. / 36, 1. / 36, 1. / 36, 1. / 36, 1. / 36, 1. / 36, 1. / 36 }; //定义物理尺寸 const int NX = 10; const int NY = 10; const int NZ = 10; const int M = NX*NY*NZ; //10*10*10的立方体为网格区域 //lattice boltzmann method double rho[NX + 1][NY + 1][NZ + 1], u[NX + 1][NY + 1][NZ + 1][3], u0[NX + 1][NX + 1][NZ + 1][3]; //声明密度,演化后速度,演化前速度 double velocity; //定义速度 double f[NX + 1][NY + 1][NZ + 1][Q], F[NX + 1][NY + 1][NZ + 1][Q], feqq[NX + 1][NY + 1][NZ + 1][Q], ftemp[NX + 1][NY + 1][NZ + 1][Q];//声明速度分布函数演化前与演化后的,平衡态分布函数,临时分布函数 int i, j, k, q, ip, jp, kp, n; // double c, Re, dx, dy, dz, LX, LY, LZ, dt, rho0, tau_f, niu, omega, error, temp;//声明格子速度、雷诺数、空间步长、方向长度、时间步长、初始密度、弛豫时间、运动粘度、离散速度比、临时变量 //QuartetStructureGenerationSet int arrgrid[NX + 1][NY + 1][NZ + 1], solidBoundaryNode[NX + 1][NY + 1][NZ + 1]; //定义格点 以及边界点(三维) double rho_in = 1.0; //内部密度 double rho_out = 0.5; //外部密度 void initilization(); //声明初始化子函数 void QuartetStructureGenerationSet(); //声明QSGS double feq(int q, double rho, double u[3]); // void Evolution(); // void outputdata(int m); //声明输出 void Error(); void boundary(); //声明边界条件 void Macroscopic(); int main() { initilization(); QuartetStructureGenerationSet(); for (n = 0;; n++) { Evolution(); Macroscopic(); boundary(); if (n % 100 == 0) { Error(); cout << "The " << n << " th computation result: The max relative error of uvw is: " << setiosflags(ios::scientific) << error << endl; if (n >= 500) { if (n % 500 == 0) outputdata(n); if (error<1.0e-8) break; } } } return 0; } void initilization() //定义初始化子函数 { dx = 1.0; //空间步长、时间步长均为1 dy = 1.0; dz = 1.0; dt = dx; c = dx / dt; LX = dx*NX; //空间方向长度 LY = dy*NY; LZ = dz*NZ; tau_f = 1.35; //弛豫时间定为1.35?(tau_f = 3*niu+0.5,niu未知) omega = 1.0 / tau_f; //书P48 式子3.103 rho0 = 0.5; //初始密度为0.5 for (k = 0; k <= NZ; k++) { for (j = 0; j <= NY; j++) { for (i = 0; i <= NX; i++) //初始化三维速度、密度 { u[i][j][k][0] = 0.0; u[i][j][k][1] = 0.0; u[i][j][k][2] = 0.0; rho[i][j][k] = rho0; for (q = 0; q < Q; q++) //格点个数以及分布函数 { f[i][j][k][q] = feq(q, rho[i][j][k], u[i][j][k]); } } } } }

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧