5_Turing_2D_Contln.c |
1 /****************************************************************************************** 2 3 This program solves reacrtion-diffusion equations using the explicit method. 4 5 Reacrtion-diffusion equations are ut = du uxx + f(u,v) and vt = dv vxx + g(u,v). 6 7 Time loop in this program consists of 8 "Calculation part" and "Draw Part". 9 10 Calculation part is controlled by the interval parameter INTV. 11 This numerical result is visualized by using "g_contln_2D" of GLSC3D. 12 13 *******************************************************************************************/ 14 15 #include<stdio.h> 16 #include<stdlib.h> 17 #include<glsc3d_3.h> 18 19 #define N (100) 20 #define M (100) 21 22 double f(double u, double v) 23 { 24 return u * (1 - u * u) - v; 25 } 26 double g(double u, double v) 27 { 28 return 3.0 * u - 2.0 * v; 29 // return 3.0 * (u + 0.05) - 2.0 * v; 30 // return 3.0 * (u - 0.05) - 2.0 * v; 31 } 32 33 int main() 34 { 35 double Lx = 100.0; 36 double Ly = 100.0; 37 double dx = Lx / N; 38 double dy = Ly / M; 39 double dt = 0.001; 40 double du = 1.0; 41 double dv = 10.0; 42 43 double lambda_u = du * dt / (dx * dx); 44 double lambda_v = dv * dt / (dy * dy); 45 46 double u0[N + 2][M + 2]; 47 double u1[N + 2][M + 2]; 48 double v0[N + 2][M + 2]; 49 double v1[N + 2][M + 2]; 50 51 int INTV = 200; 52 53 g_init("Window", 600, 600); //Pixel Size 54 55 g_def_scale_2D(0, //ID 56 -Lx*0.5, Lx*0.5, //xmin,xmax 57 -Ly*0.5, Ly*0.5, //ymin,ymax 58 20.0, 20.0, //Window (Left, Top) Position 59 560, 560); //Window Size (x,y) 60 //Set initial calculation 61 { 62 //Step1 63 double u_Init_Sum = 0.0; 64 double v_Init_Sum = 0.0; 65 66 unsigned int seed = 2; //Seed for random number generated by rand() 67 srand(seed); 68 69 for(int j = 1;j < M + 1; j ++) 70 { 71 for(int i = 1;i < N + 1; i ++) 72 { 73 double Max = 1.0; //Maximum of random number 74 double Min = 0.0; //Minimum of random number 75 double RandNumber = Min + (int)(rand()*(Max-Min+1.0)/(1.0+RAND_MAX)); 76 u0[i][j] = 2.0 * (RandNumber - 0.5); 77 v0[i][j] = 2.0 * (RandNumber - 0.5); 78 79 u_Init_Sum += u0[i][j] * dx * dy; 80 v_Init_Sum += v0[i][j] * dx * dy; 81 } 82 } 83 84 //Step2 85 for(int j = 1;j < M + 1; j ++) 86 { 87 u0[0][j] = u0[N][j]; 88 u0[N + 1][j] = u0[1][j]; 89 v0[0][j] = v0[N][j]; 90 v0[N + 1][j] = v0[1][j]; 91 } 92 for(int i = 0;i < N + 2; i ++) 93 { 94 u0[i][0] = u0[i][M]; 95 u0[i][M + 1] = u0[i][1]; 96 v0[i][0] = v0[i][M]; 97 v0[i][M + 1] = v0[i][1]; 98 } 99 } 100 101 //////////// Start time loop //////////// 102 for (int i_time = 0; ; i_time++) { 103 104 //////////// Draw Part //////////// 105 if (i_time%INTV == 0) { 106 g_cls(); //Clear window 107 g_sel_scale(0); //Select Virtual scale 108 g_line_color(0.0, 0.0, 0.0, 1.0); 109 g_boundary(); //Draw Boundary 110 111 g_line_color(1.0, 0.0, 0.0, 1.0); 112 g_contln_2D(-Lx*0.5 + dx*0.5, Lx*0.5 - dx*0.5, -Ly*0.5 + dy*0.5, Ly*0.5 - dy*0.5, N+2, M+2, u0, 0.0); //Contln_0.0 113 114 g_finish(); //flush Draw buffer 115 g_sleep(0.01); //Sleep 0.01 sec 116 } 117 118 //////////// Calculation Part //////////// 119 { 120 //Step3 121 for(int j = 1;j < M + 1; j ++) 122 { 123 for(int i = 1;i < N + 1; i ++) 124 { 125 u1[i][j] = u0[i][j] 126 + lambda_u * (u0[i - 1][j] - 2 * u0[i][j] + u0[i + 1][j]) 127 + lambda_u * (u0[i][j - 1] - 2 * u0[i][j] + u0[i][j + 1]) 128 + dt * f(u0[i][j], v0[i][j]); 129 130 v1[i][j] = v0[i][j] 131 + lambda_v * (v0[i - 1][j] - 2 * v0[i][j] + v0[i + 1][j]) 132 + lambda_v * (v0[i][j - 1] - 2 * v0[i][j] + v0[i][j + 1]) 133 + dt * g(u0[i][j], v0[i][j]); 134 } 135 } 136 //Step4 137 for(int j = 1;j < M + 1; j ++) 138 { 139 for(int i = 1;i < N + 1; i ++) 140 { 141 u0[i][j] = u1[i][j]; 142 v0[i][j] = v1[i][j]; 143 } 144 } 145 //Step5 146 for(int j = 1;j < M + 1; j ++) 147 { 148 u0[0][j] = u0[N][j]; 149 u0[N + 1][j] = u0[1][j]; 150 v0[0][j] = v0[N][j]; 151 v0[N + 1][j] = v0[1][j]; 152 } 153 for(int i = 0;i < N + 2; i ++) 154 { 155 u0[i][0] = u0[i][M]; 156 u0[i][M + 1] = u0[i][1]; 157 v0[i][0] = v0[i][M]; 158 v0[i][M + 1] = v0[i][1]; 159 } 160 } 161 } 162 return 0; 163 } |