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;
}
Áú¹® | 2615¸íÀÌ Àоú¾î¿ä. 3.146.255.127