Æ÷ÀÎÅÍ¿¡ Áý¾î³Ö¾îÁø 3d ¹è¿À» ÇÔ¼ö¿¡ Áý¾î³Ö¾î¼ ±× °ªÀ» Á» ¹Ù²Ù°í ½ÍÀºµ¥¿ä, ÇÔ¼ö ¼±¾ðÇÒ¶§ ÀÔ·Â °ªÀ» ¾î¶»°Ô ó¸®ÇØ¾ß ÇÒÁö ¸ð¸£°Ú½À´Ï´Ù...
3d ¹è¿À» ´ÙÀ½°ú °°Àº ½ÄÀ¸·Î Æ÷ÀÎÅÍ¿¡ Áý¾î³Ö¾ú±¸¿ä
float q_tf[Nz+2][Ny+2][Nx+2];
float (*p_tf)[Ny+2][Nx+2] = q_tf;
±× ´ÙÀ½¿¡ ÀÌ°É pbndry() ¶ó´Â ÇÔ¼ö¿¡ ³Ö¾î¼ ¾Æ·¡¿Í °°ÀÌ for loopÀ» ¸î¹ø µ¹·Á¼ °ªµéÀ» Á» ¹Ù²Ù°í ½ÍÀºµ¥¿ä, ÀÌ °æ¿ì pbndry() ÇÔ¼ö ¼±¾ð ÇÒ¶§ ÀÔ·Â °ªÀ» float *in_arr ¼³Á¤ÇؾßÇϳª¿ä ¾Æ´Ï¸é float **in_arr ¶Ç´Â float in_arr·Î ¼±¾ð ÇؾßÇϳª¿ä? ±×¸®°í ÀÌ 3d ¹è¿ Æ÷ÀÎÅ͸¦ pbndry() ÇÔ¼ö¿¡¼ À妽ÌÀ» ÇؾßÇϴµ¥ ¾î¶²½ÄÀ¸·Î 󸮸¦ ÇؾßÇÏ´ÂÁö ±Ã±ÝÇÕ´Ï´Ù.
#include <netcdf.h>
// netCDF constants
#define err(e) {printf("Error: %sn", nc_strerror(e)); return(2);}
#define fname "leap3d.nc"
// Variable sizes and dimensions (constants)
#define Nx 150
#define Ny 300
#define Nz 6
#define Nt 2000
#define ndims 4
void pbndry(float in_arr, int in_x_siz, int in_y_siz, int in_z_siz)
{
int i,j,k;
// Periodic boundary
// x-direction
for(k=1;k<in_z_siz+1;k++)
for(j=1;j<in_y_siz+1;j++)
in_arr[k][j][0] = in_arr[k][j][Nx];
in_arr[k][j][Nx+1] = in_arr[k][j][1];
// y-direction
for(k=1;k<in_z_siz+1;k++)
for(i=1;i<in_x_siz+1;i++)
in_arr[k][0][i] = in_arr[k][Ny][i];
in_arr[k][Ny+1][i] = in_arr[k][1][i];
// z-direction
for(j=1;j<in_y_siz+1;j++)
for(i=1;i<in_x_siz+1;i++)
in_arr[0][j][i] = in_arr[Nz][j][i];
in_arr[Nz+1][j][i] = in_arr[1][j][i];
printf("Periodic boundary funtion call completen");
}
int main()
{
int i,j,k,t;
float u = 0.0,
v = 3.0,
w = 3.0,
dtdl = 0.01;
// p_tf : p at future
// p_tn : p at now
// p_tp : p at past
float q_tf[Nz+2][Ny+2][Nx+2];
float q_tn[Nz+2][Ny+2][Nx+2];
float q_tp[Nz+2][Ny+2][Nx+2];
float (*p_tf)[Ny+2][Nx+2] = q_tf;
float (*p_tn)[Ny+2][Nx+2] = q_tn;
float (*p_tp)[Ny+2][Nx+2] = q_tp;
// netCDF variables
int ncid, retval, varid, x_dimid, y_dimid, z_dimid, t_dimid;
int dimids[ndims];
size_t start[ndims], count[ndims];
// netCDF file operation
// Creating netCDF file
if ((retval = nc_create(fname, NC_CLOBBER, &ncid)))
err(retval);
// Define dimensions
if ((retval = nc_def_dim(ncid, "z", Nz+2, &z_dimid)))
err(retval);
if ((retval = nc_def_dim(ncid, "y", Ny+2, &y_dimid)))
err(retval);
if ((retval = nc_def_dim(ncid, "x", Nx+2, &x_dimid)))
err(retval);
if ((retval = nc_def_dim(ncid, "t", NC_UNLIMITED, &t_dimid)))
err(retval);
// Dimension ids
dimids[0] = t_dimid;
dimids[1] = z_dimid;
dimids[2] = y_dimid;
dimids[3] = x_dimid;
// Variable for writing netCDF data one timestep at a time
count[0] = 1; // For time dimension : 1 timestep
count[1] = Nz+2; // For z : write everything
count[2] = Ny+2; // For y : write everything
count[3] = Nx+2; // For x : write everything
start[1] = 0; // For z : don't do anything
start[2] = 0; // For y : don't do anything
start[3] = 0; // For x : don't do anything
if ((retval = nc_def_var(ncid, "data", NC_FLOAT, ndims, dimids, &varid)))
err(retval);
if ((retval = nc_enddef(ncid)))
err(retval);
// Array initialization
for(k=0;k<Nz+2;k++)
{
for(j=0;j<Ny+2;j++)
{
for(i=0;i<Nx+2;i++)
{
p_tf[k][j][i] = 0.0;
p_tn[k][j][i] = 0.0;
p_tp[k][j][i] = 0.0;
}
}
}
for(k=1;k<Nz+1;k++)
{
for(j=100;j<139+3;j++)
{
for(i=100;i<139+3;i++)
{
p_tf[k][j][i] = 3.0;
p_tn[k][j][i] = 3.0;
p_tp[k][j][i] = 3.0;
}
}
}
// Euler scheme for the first time step
for(k=1;k<Nz+1;k++)
{
for(j=1;j<Ny+1;j++)
{
for(i=1;i<Nx+1;i++)
{
p_tf[k][j][i] = p_tn[k][j][i]
- u * dtdl * (p_tn[k][j][i] - p_tn[k][j][i-1])
- v * dtdl * (p_tn[k][j][i] - p_tn[k][j-1][i])
- w * dtdl * (p_tn[k][j][i] - p_tn[k-1][j][i]);
}
}
}
// Periodic boundary condition
pbndry(&p_tf,Nx,Ny,Nz);
p_tp = p_tn;
p_tn = p_tf;
start[0] = 0;
if (retval = nc_put_vara_float(ncid, varid, start, count, &p_tf[0][0][0]))
err(retval);
// Leapfrog scheme
for(t=1;t<Nt;t++)
{
for(k=1;k<Nz+1;k++)
{
for (j=1;j<Ny+1;j++)
{
for(i=1;i<Nx+1;i++)
{
p_tf[k][j][i] = p_tp[k][j][i]
- u * dtdl * (p_tn[k][j][i+1] - p_tn[k][j][i-1])
- v * dtdl * (p_tn[k][j+1][i] - p_tn[k][j-1][i])
- w * dtdl * (p_tn[k+1][j][i] - p_tn[k-1][j][i]);
}
}
}
pbndry(&p_tf,Nx,Ny,Nz);
p_tp = p_tn;
p_tn = p_tf;
start[0] = t;
if ((retval = nc_put_vara_float(ncid, varid, start, count, &p_tf[0][0][0])))
err(retval);
}
if ((retval = nc_close(ncid)))
err(retval);
printf("nDonen");
return 0;
}
3.149.236.96 |
2021.08.12 11:04:43 |
C °íÂ÷¿ø ¹è¿ Æ÷ÀÎÅÍ ÇÔ¼ö Áú¹® |
Áú¹® | 2,636¸íÀÌ Àоú¾î¿ä. 3.149.236.96 | | 10
|
´ñ±Û 9°³ |
3Â÷¿ø ¹è¿ÀÇ 2,3¹ø° À妽ºÀÇ Å©±â°¡ °íÁ¤ µÇ¾î ÀÖ´Â °æ¿ì.
¿¹) ¹è¿ÀÌ Ç×»ó arr[10][20][30] À¸·Î , ù À妽ºÀÎ 10Àº º¯ÈÇÒ ¼ö ÀÖ´Â Å©±â ÀÌÁö¸¸ 20 °ú 30 ÀÌ °íÁ¤µÇ¾î ÀÖ´Ù -> function(int arr[][20][30]) À¸·Î ¼±¾ð ÇÏ°í arr[i][j][k] ·Î Á¢±Ù °¡´É 3Â÷¿ø ¹è¿ÀÌ ¸ðµç À§Ä¡ÀÇ Å©±â°¡ °¡º¯ÀûÀÎ °æ¿ì (¾Æ¸¶µµ ÀÛ¼ºÀÚ´Ô »óȲ) ¿¹) arr[n][m][p] ·Î ¹è¿ÀÇ Å©±â°¡ ¾î¶»°Ô µÉ Áö ¿¹»ó ÇÒ ¼ö ¾ø´Ù -> function(int col, int row, int height, int *arr) À¸·Î ¼±¾ðÈÄ ÇÔ¼ö ³»ºÎ¿¡¼ arr[i * col * height + j * height + k] ½ÄÀ¸·Î Á¢±Ù ³» ÄÄÆÄÀÏ·¯°¡ ¼±Çà ÀÎÀÚ¸¦ ÅëÇÑ µ¿Àû ¹è¿ Å©±â ÇÒ´çÀ» Áö¿øÇÑ´Ù ¿¹) gcc ÀͽºÅÙ¼Ç »ç¿ë -> function(int row, int col, int height, int a[row][col][height]) ·Î ¼±¾ð ÇÏ°í arr[i][j][k] ·Î Á¢±Ù https://gist.github.com/wurikiji/bfd87406b4406952f563138dcf0be222 Âü°í Çϼ¼¿µ Àü 2¹ø° ¹æ½Ä (1Â÷¿ø ¹è¿ Á¢±Ù¹ýÀ¸·Î À妽º °è»ê) À» ¼±È£ ÇÕ´Ï´ç. ¿¹½Ã ÄÚµå ó·³ ¾²Áö´Â ¾Ê°í Matrix3D °°ÀÌ µû·Î ±¸Á¶Ã¼ ¸¸µé¾î¼ ±¸Á¶Ã¼¿¡, rows, cols, height, *arr ¼±¾ðÇؼ Çѹø¿¡ Àü´Þ ÇØÁ༠¾¹´Ï´ç. |
|
2021/08/12 12:26
|
Á¤¸» °¨»çÇÕ´Ï´Ù. µÎ¹ø° ¹æ¹ýÀº (1Â÷¿ø ¹è¿ Á¢±Ù¹ý) ÄÄÆÄÀÏ·¯ °¡¸®Áö ¾Ê°í ÀÛµ¿ Çϳª¿ä? | |
2021/08/12 12:45
|
³ß 1Â÷¿ø ¹è¿ Á¢±Ù¹ýÀº ´Ù µË´Ï´ç
±×·¡¼ ´Ù¸¥ »ç¶÷µé ÄÚµå º¸¸é Matrix ¶ó´Â À̸§ÀÇ ±¸Á¶Ã¼µéÀ» ÀÚÁÖ »ç¿ëÇÏ´Â°Ô º¸ÀÏ °Å¿¡¿© |
|
2021/08/12 13:14
|
³×. °¨»çÇÕ´Ï´Ù! | |
2021/08/12 13:40
|
À½...
¸ÞÀÎÇÔ¼ö¿¡ À§ÀÇ ÇÔ¼ö¸¦ ºÒ·¯¿Ã¶§ function(int col, int row, int height, int *arr) °°ÀÌ ¹è¿ ¾Õ¿¡ * ºÙ¾î¾ß Çϳª¿ä? ¾Æ´Ï¸é & ºÙÇô¾ß Çϳª¿ä? |
|
2021/08/13 02:49
|
¾Æ. ¾Æ´Õ´Ï´Ù. ¿¹Á¦¸¦ ³¡±îÁö ¾ÈºÃ³×¿ä. ¤¾¤¾¤¾ | |
2021/08/13 02:59
|
1Â÷¿ø ¹è¿ Á¢±Ù¹ý »ç¿ëÇϸé gcc ·Î ÄÄÆÄÀÏ ÇÒ¶§ ¾Æ·¡¿Í °°Àº °æ°í ¸Þ½ÃÁö ¶ß´Âµ¥ µüÈ÷ ¹®Á¦ ¾ø´Â°Ç°¡¿ä? ÇÁ·Î±×·¥Àº Á¦´ë·Î µ¹¾Æ°¡°í °á°ú°ªµµ ¸Â½À´Ï´Ù.
leapfrog.cpu.3d.c: In function ¡®main¡¯: leapfrog.cpu.3d.c:184:17: warning: passing argument 4 of ¡®pbndry¡¯ from incompatible pointer type [-Wincompatible-pointer-types] 184 | pbndry(Nx,Ny,Nz,p_tf); | ^~~~ | | | float (*)[202][202] leapfrog.cpu.3d.c:16:62: note: expected ¡®float *¡¯ but argument is of type ¡®float (*)[202][202]¡¯ 16 | void pbndry(int in_x_siz, int in_y_siz, int in_z_siz, float *in_arr) | ~~~~~~~^~~~~~ leapfrog.cpu.3d.c:232:20: warning: passing argument 4 of ¡®pbndry¡¯ from incompatible pointer type [-Wincompatible-pointer-types] 232 | pbndry(Nx,Ny,Nz,p_tf); | ^~~~ | | | float (*)[202][202] leapfrog.cpu.3d.c:16:62: note: expected ¡®float *¡¯ but argument is of type ¡®float (*)[202][202]¡¯ 16 | void pbndry(int in_x_siz, int in_y_siz, int in_z_siz, float *in_arr) | ~~~~~~~^~~~~~ |
|
2021/08/13 10:36
|
³ß µüÈ÷ ¹®Á¦ ¾ø½À´Ï´ç
¿ö´×ÀÌ ¶ß´Â°Ô ½Å°æ ¾²À̽øé (float*) ½ÄÀ¸·Î ij½ºÆà Çؼ ³Ñ°ÜÁÖ½Ã¸é µË´Ï´ç |
|
2021/08/13 11:24
|
´äº¯ °¨»çÇÕ´Ï´Ù. Á¤¸» ¸¹Àº µµ¿ò µÇ¾ú½À´Ï´Ù. | |
2021/08/13 12:09
|
¸Þ´º | ¸ñ·Ï | ¸ÇÀ§·Î | ·Î±×ÀÎ |