| 10_Diffusion_1D_Text.c |
1 #include<stdio.h>
2 #include<glsc3d_3.h>
3
4 #define N (200)
5
6 int main()
7 {
8 double x;
9 double L = 5;
10 double dx = L / N;
11 double t = 0.0;
12 double dt = 0.0001;
13 double u[N + 2];
14 double tmpu[N + 2];
15 double D = 1.0;
16 int INTV = 100;
17 g_init("Window", 900, 320); //Pixel Size
18 g_def_scale_2D(0, //ID
19 -L*0.5, L*0.5, //xmin,xmax
20 -0.2, 1.2, //ymin,ymax
21 20.0, 20.0, //Window (Left, Top) Position
22 560, 280); //Window Size (x,y)
23
24 g_def_scale_2D(1, //ID
25 -L*0.5, L*0.5, //xmin,xmax
26 -0.2, 1.2, //ymin,ymax
27 620.0, 20.0, //Window (Left, Top) Position
28 260, 280); //Window Size (x,y)
29
30 //Set initial calculation
31 {
32 //Step1
33 for(int i = 1;i < N + 1; i ++)
34 {
35 x = i*dx - L*0.5;
36 u[i] = exp(-(x*x));
37 }
38 //Step2
39 u[0] = u[1];
40 u[N + 1] = u[N];
41 }
42 //////////// Start time loop ////////////
43 for (int i_time = 0; t < 10; i_time++) {
44 t = i_time * dt;
45 //////////// Draw Part ////////////
46 if (i_time%INTV == 0) {
47 g_cls(); //Clear window
48 //////////// Graph Part ////////////
49 {
50 g_sel_scale(0); //Select Virtual scale
51 g_line_color(0.0, 0.0, 0.0, 1.0);
52 g_boundary(); //Draw Boundary
53
54 g_line_width(1.0);
55 g_line_color(0.0, 0.0, 0.0, 0.5);
56 g_move_2D(-L*0.5, 0.0); g_plot_2D(L*0.5, 0.0); //X Axis
57 g_move_2D(0.0, -1.2); g_plot_2D(0.0, 1.2); //Y Axis
58
59 //Profile of u
60 g_line_width(2.0);
61 g_line_color(1.0, 0.0, 0.0, 1.0);
62 for (int i=0; i<N-1; i++) {
63 g_move_2D(i*dx-L*0.5, u[i]);
64 g_plot_2D((i+1)*dx-L*0.5, u[i+1]);
65 }
66
67 g_text_size(18);
68 g_text_color(1.0, 0.0, 0.0, 1.0);
69 g_text_2D_virtual(L*0.5 - 0.4, 1.0, "u: -");
70 }
71 //////////// Charactor Part ////////////
72 {
73 g_sel_scale(1); //Select Virtual scale
74 g_text_size(16);
75 g_text_color(0, 0, 0, 1);
76
77 double TextLeft = 620.0;
78 double TextTop = 40.0;
79 double TextWidth = 30.0;
80 int IncrimentTextWidth = 0;
81
82 g_text_standard(TextLeft, TextTop + TextWidth*(IncrimentTextWidth ++), "t = %2.15f", t);
83 g_text_standard(TextLeft, TextTop + TextWidth*(IncrimentTextWidth ++), "i_time = %d", i_time);
84 g_text_standard(TextLeft, TextTop + TextWidth*(IncrimentTextWidth ++), "dt = %2.8f", dt);
85 g_text_standard(TextLeft, TextTop + TextWidth*(IncrimentTextWidth ++), "L = %2.4f", L);
86 g_text_standard(TextLeft, TextTop + TextWidth*(IncrimentTextWidth ++), "N = %d", N);
87 g_text_standard(TextLeft, TextTop + TextWidth*(IncrimentTextWidth ++), "dx = %2.4f", dx);
88 g_text_standard(TextLeft, TextTop + TextWidth*(IncrimentTextWidth ++), "D = %2.4f", D);
89 g_text_standard(TextLeft, TextTop + TextWidth*(IncrimentTextWidth ++), "D * dt/(dx*dx) = %2.4f (< 0.5)", D*dt/(dx*dx));
90 }
91 g_finish(); //flush Draw buffer
92 g_sleep(0.0); //Sleep 0.0 sec
93 }
94 //////////// Calculation Part ////////////
95 {
96 //Step3
97 for(int i = 1;i < N + 1; i ++)
98 {
99 tmpu[i] = u[i] + D * (u[i - 1] -2 * u[i] + u[i + 1]) / (dx * dx) * dt;
100 }
101 for(int i = 1;i < N + 1; i ++)
102 {
103 u[i] = tmpu[i];
104 }
105 //Step4
106 u[0] = u[1];
107 u[N + 1] = u[N];
108 }
109 }
110 return 0;
111 }
|