我目前正在C中实现计算流体动力学算法。它已经在2d系统中工作,现在我正致力于解决轴对称系统。
在模拟过程中,所有数据都存储在几个二维阵列(用于二维模拟)和三维阵列(用于轴对称阵列)中。
目前我有一个求解函数来解决几个方程式。
void solver(double ** data, Coefficients *coeff, Grid *grid)
其中:
data
包含我想在
中存储求解方程的数组这适用于2D系统。在做轴对称系统时,我想重新使用这个函数而不必重新编写或更改它来获取一个3d数组,因为我只需要沿轴解一个切片。
为此,我正在考虑创建一个新的二维数组,该数组包含指向三维数组的二维切片的所有指针。
我一直在玩一些测试代码来尝试这个概念,但我无法让它产生有意义的输出。这是我到目前为止所提出的:
#include <stdlib.h>
#include <stdio.h>
double *** alloc_3d_matrix(int x_dim, int y_dim, int z_dim)
{
int i, j;
double *** m;
m = calloc(x_dim, sizeof(double**));
for (i = 0; i < x_dim; i++)
{
m[i] = calloc(y_dim, sizeof(double*));
for (j = 0; j < y_dim; j++)
{
m[i][j] = calloc(z_dim, sizeof(double));
}
}
return m;
}
double *** alloc_2d_matrix(int x_dim, int y_dim)
{
int i;
double *** m;
m = calloc(x_dim, sizeof(double*));
for (i = 0; i < y_dim; i++)
{
m[i] = calloc(y_dim, sizeof(double));
}
return m;
}
void free_3d_matrix(void *** m, int x_dim, int y_dim)
{
int i, j;
for (i = 0; i < x_dim; i++)
{
for (j = 0; j < y_dim; j++)
{
free(m[i][j]);
}
free(m[i]);
}
free(m);
}
void free_2d_matrix(void ***m, int x_dim)
{
int i;
for (i = 0; i < x_dim; i++)
{
free(m[i]);
}
free(m);
}
void increment(double ** slice)
{
int i, j;
int sum = 0;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
sum++;
slice[i][j] = sum;
}
}
}
int main()
{
int i, j;
double *** d3, ***d2;
FILE *fp;
fp = fopen("test.txt", "w");
d2 = (double***)alloc_2d_matrix(5, 5);
d3 = alloc_3d_matrix(5, 5, 5);
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
d2[i][j] = &d3[i][j][0];
}
}
increment(*d2);
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
fprintf(fp,"%f, %p, %p\n", d3[i][j][0], &d3[i][j][0], d2[i][j]);
}
}
fclose(fp);
free_3d_matrix(d3, 5, 5);
return 0;
}
我觉得这会产生一个如下所示的输出:
1.000000,00E5A4B0,00E5A4B0
2.000000,00E5FCA8,00E5FCA8
3.000000,00E5FD00,00E5FD00
4.000000,00E5FBA0,00E5FBA0
5.000000,00E5F678,00E5F678
等
相反,我得到了这个输出:
1.000000,00E5A4B0,00E5A4B0
6.000000,00E5FCA8,00E5FCA8
11.000000,00E5FD00,00E5FD00
16.000000,00E5FBA0,00E5FBA0
21.000000,00E5F678,00E5F678
0.000000,00E5FB48,00E5FB48
0.000000,00E5F728,00E5F728
0.000000,00E5F620,00E5F620
0.000000,00E5FD58,00E5FD58
我不确定我的代码在哪里出错,并且不胜感激。
编辑:
添加了其余功能。
答案 0 :(得分:1)
在C中,多维数组在概念上是一个数组,其元素也是数组。所以如果你这样做:
int array [2] [3]; 从概念上讲,你最终得到:
(__ \ "id").json.pick[JsString].map{
case id if id.equals(JsString(accountId)) =>
Json.obj("primary" -> true)
case _ =>
Json.obj()
}
int array [2] [3] [2]; ......会给你一个像这样的结构:
array[0] => [0, 1, 2]
array[1] => [0, 1, 2]
所以试试这个d2 [i] [j] =&amp; d3 [0] [i] [j];代替d2 [i] [j] =&amp; d3 [i] [j] [0];
编辑---- 尝试d2 [i] [j] =&amp; d3 [i] [j] [j];