ÇÁ·Î±×·¡¹Ö
ù ÆäÀÌÁö ·£´ý ±Û ȸ¿ø°¡ÀÔ ·Î±×ÀÎ
ºñ°ø°³ ¼Õ´Ô ¡¦ 2021-08-12 11:04:43
URL https://te31.com/rgr/view.php?id=study&no=3044 ¸ð¹ÙÀÏ È­¸é
C °íÂ÷¿ø ¹è¿­ Æ÷ÀÎÅÍ ÇÔ¼ö Áú¹®

Æ÷ÀÎÅÍ¿¡ Áý¾î³Ö¾îÁø 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 function 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;
}

Áú¹® | 2541¸íÀÌ Àоú¾î¿ä. 34.201.16.34

0
1 ºñ°ø°³ ¼Õ´Ô ¡¦ 2021-08-12 12:26:32
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 ¼±¾ðÇؼ­ Çѹø¿¡ Àü´Þ ÇØÁ༭ ¾¹´Ï´ç.
2 ºñ°ø°³ ¼Õ´Ô ¡¦ 2021-08-12 12:45:36
Á¤¸» °¨»çÇÕ´Ï´Ù. µÎ¹ø° ¹æ¹ýÀº (1Â÷¿ø ¹è¿­ Á¢±Ù¹ý) ÄÄÆÄÀÏ·¯ °¡¸®Áö ¾Ê°í ÀÛµ¿ Çϳª¿ä?
3 ºñ°ø°³ ¼Õ´Ô ¡¦ 2021-08-12 13:14:31
³ß 1Â÷¿ø ¹è¿­ Á¢±Ù¹ýÀº ´Ù µË´Ï´ç
±×·¡¼­ ´Ù¸¥ »ç¶÷µé ÄÚµå º¸¸é Matrix ¶ó´Â À̸§ÀÇ ±¸Á¶Ã¼µéÀ» ÀÚÁÖ »ç¿ëÇÏ´Â°Ô º¸ÀÏ °Å¿¡¿©
4 ºñ°ø°³ ¼Õ´Ô ¡¦ 2021-08-12 13:40:03
³×. °¨»çÇÕ´Ï´Ù!
5 ºñ°ø°³ ¼Õ´Ô ¡¦ 2021-08-13 02:49:27
À½...
¸ÞÀÎÇÔ¼ö¿¡ À§ÀÇ ÇÔ¼ö¸¦ ºÒ·¯¿Ã¶§ function(int col, int row, int height, int *arr) °°ÀÌ ¹è¿­ ¾Õ¿¡ * ºÙ¾î¾ß Çϳª¿ä? ¾Æ´Ï¸é & ºÙÇô¾ß Çϳª¿ä?
6 ºñ°ø°³ ¼Õ´Ô ¡¦ 2021-08-13 02:59:43
¾Æ. ¾Æ´Õ´Ï´Ù. ¿¹Á¦¸¦ ³¡±îÁö ¾ÈºÃ³×¿ä. ¤¾¤¾¤¾
7 ºñ°ø°³ ¼Õ´Ô ¡¦ 2021-08-13 10:36: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)
| ~~~~~~~^~~~~~
8 ºñ°ø°³ ¼Õ´Ô ¡¦ 2021-08-13 11:24:37
³ß µüÈ÷ ¹®Á¦ ¾ø½À´Ï´ç
¿ö´×ÀÌ ¶ß´Â°Ô ½Å°æ ¾²À̽øé (float*) ½ÄÀ¸·Î ij½ºÆà Çؼ­ ³Ñ°ÜÁÖ½Ã¸é µË´Ï´ç
9 ºñ°ø°³ ¼Õ´Ô ¡¦ 2021-08-13 12:09:09
´äº¯ °¨»çÇÕ´Ï´Ù. Á¤¸» ¸¹Àº µµ¿ò µÇ¾ú½À´Ï´Ù.
´ñ±ÛÀ» ÀÛ¼ºÇÏ½Ç ¼ö ¾ø½À´Ï´Ù.
(±ÇÇÑÀÌ ¾ø´Â ȸ¿ø·¹º§)
¸ñ·ÏÀ¸·Î
ÀÌ¿ë¾à°ü | ±¤°í/Á¦ÈÞ | °³ÀÎÁ¤º¸Ãë±Þ¹æħ | ¹®ÀÇ/½Å°í | ¸ð¹ÙÀÏ TE31 | ¼­¹ö ºÎÇÏ : 23%
½Ç½Ã°£ Issue Ä¿¹Â´ÏƼ TE31 [¾ËÁö·Õ] ¨Ï 2002-2024
TOP arrow_upward