講義ノート2005年度5E 計算機応用 → ラプラス方程式を解くプログラムの一部

ラプラス方程式を解くプログラムの一部


ラプラス方程式

以下を完成させよ.


001: #include <stdio.h>
002: #define MAXDIM 510
003: 
004: void initialize(double u[][MAXDIM], int flag[][MAXDIM]);
005: void set_cordinate(int n,double x[][MAXDIM],double y[][MAXDIM]);
006: void set_boundary_wall_pot(int n, double u[][MAXDIM], int f[][MAXDIM]);
007: void set_circle(double x0, double y0, double r, double v,
008:         int n, double x[][MAXDIM], double y[][MAXDIM],
009:             double u[][MAXDIM], int f[][MAXDIM]);
010: void plot_3d(FILE *gp, char *data_file,
011:          double rot_x, double rot_z);
012: 
013: /*=====================================================================*/
014: /*   main                                                              */
015: /*=====================================================================*/
016: int main(void){
017:    double u[MAXDIM][MAXDIM];
018:    double x[MAXDIM][MAXDIM], y[MAXDIM][MAXDIM];
019:    int flag[MAXDIM][MAXDIM];
020:    int i,j;
021:    int k, iteration;
022:    int nlat;
023:    char *plot_data_file;
024:    FILE *fp;
025:    FILE *gp;
026:    
027:    plot_data_file="result.txt";
028:    
029:    nlat=100;
030:    
031:    initialize(u, flag);
032:    set_cordinate(nlat,x,y);
033:    set_boundary_wall_pot(nlat, u, flag);
034:    set_circle(0.3, 0.3, 0.2,  20.0, nlat, x, y, u, flag);
035:    set_circle(0.7, 0.6, 0.03, -20.0, nlat, x, y, u, flag);
036:    
037:    iteration=2000;
038:    
039:    /*---------------------------------*/
040:    /*  ここにガウスザイデル法の計算を書く  */
041:    /*  3重の繰り返し構造               */
042:    /*---------------------------------*/
043:    
044:    
045:    fp=fopen(plot_data_file,"w");
046:    
047:    for(j=0; j<=nlat; j++){
048:      for(i=0; i<=nlat; i++){
049:        fprintf(fp, "%f\t%f\t%f\n",x[i][j],y[i][j],u[i][j]);
050:      }
051:      fprintf(fp,"\n");
052:    }
053:    
054:    fclose(fp);
055:    
056:    
057:    gp = popen("gnuplot -persist","w");
058:    plot_3d(gp, plot_data_file, 30, 30);
059:    plot_3d(gp, plot_data_file, 45, 30);
060:    plot_3d(gp, plot_data_file, 60, 30);
061:    plot_3d(gp, plot_data_file, 75, 30);
062:    pclose(gp);
063: 
064:    return 0;
065:    
066: }
067: 
068: /*=====================================================================*/
069: /*   initialize function                                               */
070: /*=====================================================================*/
071: void initialize(double u[][MAXDIM], int flag[][MAXDIM]){
072: 
073: 
074:   /*---------------------------------*/
075:   /*  繰り返しを使って、初期化する。     */
076:   /*---------------------------------*/
077: 
078: }
079: 
080: /*=====================================================================*/
081: /*   set coordinate                                                    */
082: /*=====================================================================*/
083: void set_cordinate(int n,double x[][MAXDIM],double y[][MAXDIM]){
084: 
085: 
086:   /*-------------------------------------------*/
087:   /*  繰り返しを使って、格子点の座標を設定する。     */
088:   /*-------------------------------------------*/
089: 
090: 
091: }
092: 
093: /*=====================================================================*/
094: /*   set external boudary points                                       */
095: /*=====================================================================*/
096: void set_boundary_wall_pot(int n, double u[][MAXDIM], int f[][MAXDIM]){
097: 
098: 
099:   /*---------------------------------------------------------*/
100:   /*  繰り返しを使って、外部境界のポテンシャルとフラグを設定する     */
101:   /*---------------------------------------------------------*/
102: 
103: 
104:   
105: }
106: 
107: /*=====================================================================*/
108: /*   set circler boundary                                              */
109: /*=====================================================================*/
110: void set_circle(double x0, double y0, double r, double v,
111:         int n, double x[][MAXDIM], double y[][MAXDIM],
112:         double u[][MAXDIM], int f[][MAXDIM]){
113:   /*---------------------------------------------------------------*/
114:   /*  繰り返しを使って、電極内部の格子点のポテンシャルとフラグを設定する     */
115:   /*---------------------------------------------------------------*/
116: 
117: }
118: 
119: 
120: /*==========================================================*/
121: /*   3D plot                                                */
122: /*==========================================================*/
123: void plot_3d(FILE *gp, char *data_file,
124:          double rot_x, double rot_z){
125:   
126:   
127:   /* == flowing lines make a graph by using gnuplot == */
128:   
129:   printf("start plot 3D\n");
130:   fprintf(gp, "reset\n");
131:   fprintf(gp, "set terminal postscript eps color\n");
132:   fprintf(gp, "set output \"graph.eps\"\n");
133:   fprintf(gp, "set view %f,%f\n", rot_x, rot_z);
134:   fprintf(gp, "set contour base\n");
135:   fprintf(gp, "set cntrparam levels 20\n");
136:   fprintf(gp, "set hidden3d\n");
137:   fprintf(gp, "set nokey\n");
138:   fprintf(gp, "splot \"%s\" with lines\n", data_file);
139:   fprintf(gp, "set terminal x11\n");
140:   fprintf(gp, "replot\n");
141:   
142: }


last update:



no counter