Browse code

Маршевая функция

Dmitrii Kashin authored on 04/05/2015 07:27:08
Showing 3 changed files
... ...
@@ -26,11 +26,11 @@
26 26
 	       
27 27
 ;;	       (:file "solver" :depends-on ("package" "field"))
28 28
 ;;	       (:file "solver2d" :depends-on ("package" "field2d"))
29
-;;	       (:file "march" :depends-on ("package"))
30 29
 ;;	       (:file "march2d" :depends-on ("package" "solver" "grid" "field"))
31 30
 
32 31
 	       (:file "test2d-conservative" :depends-on ("field2d-conservative" "boundary-conditions"))
33 32
 	       (:file "output-functions")
33
+	       (:file "march" :depends-on ("grid2d-conservative" "output-functions"))
34 34
 	       ))
35 35
   
36 36
 
37 37
new file mode 100644
... ...
@@ -0,0 +1,79 @@
0
+(in-package :clf)
1
+
2
+(defun march (grid &key output-every-step output-every-time finish-time finish-step
3
+		     print-out-border suppress-export
4
+		     (max-timestep #'max-timestep-constant)
5
+		     (make-step #'make-step/wo-sources)
6
+		     (cu nil))
7
+  ;; Проверка начальных условий и вывод информации о процессе
8
+  (format t "Маршевая функция запущена.~%")
9
+  (when output-every-step
10
+    (format t "Вывод каждые ~d итераций.~%" output-every-step))
11
+  (when output-every-time
12
+    (format t "Вывод каждые ~a секунд.~%" output-every-time))
13
+  (unless (or finish-step finish-time)
14
+    (error "По крайней мере одно условие остановки должно быть указано"))
15
+  (when finish-step
16
+    (format nil "Остановка после ~d итераций.~%" finish-step))
17
+  (when finish-time
18
+    (format t "Остановка после ~a секунд.~%" finish-time))
19
+  (when (not cu)
20
+    (error "Число CFL не задано"))
21
+
22
+  (let ((stop-flag nil)
23
+	(newgrid (clone grid)))
24
+
25
+    ;; сначала экспортируем начальное поле
26
+    (export-grid grid :print-out-border print-out-border)
27
+    ;; если finish-step установлен в 0, то больше ничего не делаем
28
+    (when (<= finish-step 0)
29
+      (setf stop-flag t))
30
+    (loop until stop-flag
31
+       do (let* ((print-flag nil)
32
+		 (time (grid-time grid))
33
+		 (tau (funcall max-timestep grid :kurganov-tadmor cu))
34
+		 (iterations (iteration grid)))
35
+	    ;; изменяем шаг по времени, если надо делать вывод в
36
+	    ;; определённый момент
37
+	    (when output-every-time
38
+	      ;; гарантируем, что не перескочим сразу несколько
39
+	      ;; моментов для вывода по времени
40
+	      (when (> tau output-every-time)
41
+		(setf tau output-every-time))
42
+	      ;; условие перехода через момент времени, когда мы
43
+	      ;; обязаны сделать вывод
44
+	      (when (< (mod (+ time tau) output-every-time)
45
+		       (mod time output-every-time))
46
+		(decf tau (mod (+ time tau) output-every-time))
47
+		(setf print-flag t))
48
+	      )
49
+	    ;; изменяем шаг по времени, если близки ко времени
50
+	    ;; окончанию расчёта
51
+	    (when (and finish-time
52
+		       (> (+ time tau) finish-time))
53
+	      (setf tau (- finish-time time))
54
+	      (setf print-flag t)
55
+	      (setf stop-flag t))
56
+	    ;; проверяем, не надо ли делать вывод после этой итерации
57
+	    (when (and output-every-step
58
+		       (zerop (mod (1+ iterations) output-every-step)))
59
+	      (setf print-flag t))
60
+	    ;; проверяем, является ли следующий шаг последним
61
+	    (when (>= (1+ iterations) finish-step)
62
+	      (setf print-flag t)
63
+	      (setf stop-flag t))
64
+	    ;; шаг
65
+	    (funcall make-step grid newgrid tau)
66
+	    ;; печать
67
+	    (when (and (not suppress-export)
68
+		       print-flag)
69
+	      (export-grid newgrid :print-out-border print-out-border))
70
+	    
71
+	    ;; меняем сетки местами
72
+	    (setf grid (clone newgrid))
73
+	    ;(update-gradients-conv grid)
74
+	    ))
75
+
76
+    ;; по завершении маршевой функции возвращаем последнюю полученную сетку
77
+    grid
78
+    ))
... ...
@@ -26,10 +26,7 @@
26 26
 					 :ul 25.0))
27 27
       (set-constant-field-2d grid)
28 28
       (update-boundary-cells grid)
29
-
30
-;      (march grid
31
-;	     :output-every-step 10
32
-;	     :finish-step 100)
29
+      (march grid :finish-step -1)
33 30
       grid
34 31
       )))
35 32
 
... ...
@@ -109,9 +106,6 @@
109 109
 				 :left-vars left-vars
110 110
 				 :right-vars right-vars))
111 111
       (update-boundary-cells grid)
112
-;      (march grid
113
-;	     :output-every-step 10
114
-;	     :finish-step 100)
115
-
112
+      (march grid :finish-step -1)
116 113
       grid
117 114
       )))