Browse code

Переписал рекурсивные части через цикл, добавил флаг -O2

Dmitrii Kashin authored on 11/09/2014 11:10:49
Showing 5 changed files
... ...
@@ -1,5 +1,5 @@
1 1
 CXX=g++
2
-CFLAGS=-Wall -g -ggdb
2
+CFLAGS=-Wall -g -ggdb -O2
3 3
 LDFLAGS=-lm
4 4
 SOURCES=main.cxx variables.cxx cell.cxx grid.cxx solver.cxx timestep_constant.cxx march.cxx
5 5
 STASH=grid-init.o
... ...
@@ -31,10 +31,11 @@
31 31
 ** 2014-09-11
32 32
    Избавился от ofstream в пользу stdio.h
33 33
    Добавил в Makefile действие rebuild
34
+   Выставил флаг оптимизации -O2 (Как быстро стало работать!).
35
+   Переписал march через цикл, потому что так и не смог добиться хвостовой рекурсии.
34 36
 ** 2014-09-10
35
-   Сегодня я развернул на своём сервере web-интерфейс для просмотра
36
-   изменений git-репозитория. Он называется GitList, и меня в принципе
37
-   устраивает.
37
+   Сегодня я развернул на своём сервере web-интерфейс для просмотра изменений
38
+   git-репозитория. Он называется GitList, и меня в принципе устраивает.
38 39
 ** 2014-09-04
39 40
    Добил тесты Власенко для скачков без источниковых членов. К сожалению, я ловлю segfault
40 41
    где-то в районе 22760 шага. Я посмотрел backtrace в gdb и мне кажется, что стоит
... ...
@@ -4,67 +4,75 @@
4 4
 #include "solver.h"
5 5
 #include "march-config.h"
6 6
 
7
-void
7
+Grid1D
8 8
 march (Grid1D grid)
9 9
 {
10 10
   int finFlag = 0;
11
-  int printFlag = 0;
12 11
 
13
-  double tau = count_time_step(grid);
14
-  double time = grid.time;
15
-  double newTime = time + tau;
16
-
17
-  // set output flag
18
-  if (outputEveryStep)
19
-    if (grid.iter % outputEveryStep == 0)
20
-      printFlag = 1;
21
-  if (outputEveryTime)
22
-    if ( fmod(grid.time, outputEveryTime) == 0)
23
-      printFlag = 1;
24
-
25
-  // set fin flag
26
-  if (finTime)
27
-    if (grid.time >= finTime)
28
-      finFlag = 1;
29
-  if (finStep)
30
-    if (grid.iter >= finStep)
31
-      finFlag = 1;
32
-
33
-  // modify time step
34
-  if (outputEveryTime)
35
-    {
36
-      if (newTime>finTime)
37
-	{
38
-	  tau = finTime-newTime;
39
-	  newTime = finTime;
40
-	}
41
-      if (tau>outputEveryTime)
42
-	{
43
-	  tau = outputEveryTime;
44
-	  newTime = grid.time + tau;
45
-	}
46
-      // условие перехода через точку времени, когда мы обязаны сделать вывод
47
-      if ( fmod(newTime,outputEveryTime) < fmod(time,outputEveryTime) )
48
-	{
49
-	  tau -= fmod(time,outputEveryTime);
50
-	  newTime = grid.time + tau;
51
-	}
52
-    }
53
-
54
-  // печать
55
-  if (printFlag || finFlag)
56
-    printGridToFile(grid);
57
-
58
-  if (grid.iter > 22650)
59
-    printGridToFile(grid);
60
-
61
-
62
-  // шаг
63
-  if (!finFlag)
64
-    {
65
-      printf("Making iteration %06d; Passed time: %f\n", grid.iter+1, grid.time);
66
-      Grid1D newgrid = make_step(grid, tau);
67
-      march(newgrid);
68
-    };
12
+  while (!finFlag) {
13
+    int printFlag = 0;
14
+    
15
+    double tau = count_time_step(grid);
16
+    double time = grid.time;
17
+    double newTime = time + tau;
18
+    
19
+    // set output flag
20
+    if (outputEveryStep)
21
+      if (grid.iter % outputEveryStep == 0)
22
+	printFlag = 1;
23
+    if (outputEveryTime)
24
+      if ( fmod(grid.time, outputEveryTime) == 0)
25
+	printFlag = 1;
26
+    
27
+    // set fin flag
28
+    if (finTime)
29
+      if (grid.time >= finTime)
30
+	finFlag = 1;
31
+    if (finStep)
32
+      if (grid.iter >= finStep)
33
+	finFlag = 1;
34
+    
35
+    // modify time step
36
+    if (outputEveryTime)
37
+      {
38
+	if (newTime>finTime)
39
+	  {
40
+	    tau = finTime-newTime;
41
+	    newTime = finTime;
42
+	  }
43
+	if (tau>outputEveryTime)
44
+	  {
45
+	    tau = outputEveryTime;
46
+	    newTime = grid.time + tau;
47
+	  }
48
+	// условие перехода через точку времени, когда мы обязаны сделать вывод
49
+	if ( fmod(newTime,outputEveryTime) < fmod(time,outputEveryTime) )
50
+	  {
51
+	    tau -= fmod(time,outputEveryTime);
52
+	    newTime = grid.time + tau;
53
+	  }
54
+      }
55
+    
56
+    // печать
57
+    if (printFlag || finFlag)
58
+      printGridToFile(grid);
59
+    
60
+    if (grid.iter > 22650)
61
+      printGridToFile(grid);
62
+    
63
+    // шаг
64
+    if (!finFlag)
65
+      {
66
+	printf("Making iteration %06d; Passed time: %f\n", grid.iter+1, grid.time);
67
+	Grid1D newgrid = make_step(grid, tau);
68
+	grid = newgrid;
69
+      }
70
+    else
71
+      {
72
+	printf("Final conditions are reached! Finishing.\n");
73
+	return grid;
74
+      };
75
+  }
76
+  return grid;
69 77
 }
70 78
 
... ...
@@ -3,6 +3,6 @@
3 3
 #ifndef MARCH
4 4
 #define MARCH
5 5
 
6
-void march (Grid1D grid);
6
+Grid1D march (Grid1D grid);
7 7
 
8 8
 #endif //MARCH
... ...
@@ -36,7 +36,7 @@ count_left_flux(Grid1D grid, unsigned int i, double tau)
36 36
   if (i == 0) {
37 37
     left_shot = grid.lbc.vars;
38 38
     right_shot = grid.cells[i].vars;
39
-  } else if ((signed)i == (signed)grid.N-1) {
39
+  } else if (i == grid.N-1) {
40 40
     left_shot = grid.cells[i-1].vars;
41 41
     right_shot = grid.rbc.vars;
42 42
   } else {