(in-package :clf)

;; граничные условия, что для примитивных, что для консервативных переменных - почти одинаковые.
;; я решил не выделять отдельный файл

;; -------------------- ДЛЯ ПРИМИТИВНЫХ ПЕРЕМЕННЫХ

(defmethod update-boundary-cells ((grid grid2d-pv))
  (loop for i from 0 to (cells-max-x grid) do
       (funcall (symbol-function (bottom-boundary-condition grid))
		grid
		(index i -1)
		'bottom)
       (funcall (symbol-function (top-boundary-condition grid))
		grid
		(index i (1+ (cells-max-y grid)))
		'top))
  (loop for j from 0 to (cells-max-y grid) do
       (funcall (symbol-function (left-boundary-condition grid))
		grid
		(index -1 j)
		'left)
       (funcall (symbol-function (right-boundary-condition grid))
		grid
		(index (1+ (cells-max-x grid)) j)
		'right)))

(defmethod zeroe ((grid grid2d-pv) (index cell-index) border)
  (let ((i (x-index index))
	(j (y-index index)))
    (setf (cell grid index)
	  (cell grid (case border
		       ((left) (index (1+ i) j))
		       ((right) (index (1- i) j))
		       ((bottom) (index i (1+ j)))
		       ((top) (index i (1- j))))))))

;; todo: эта функция должна проверять, не начальное ли это значение
;; возможно, фиксированное поле надо откуда-то задавать

(defmethod fixed ((grid grid2d-pv) (index cell-index) border)
  (when (zerop (iteration grid))
    (zeroe grid index border)))

;; (defmethod frolov-boundary ((grid grid2d-pv) (index cell-index) border)
;;   (let ((i (x-index index))
;; 	(j (y-index index)))
;;     (let ((new-index (case border
;; 		       ((left) (index (1+ i) j))
;; 		       ((right) (index (1- i) j))
;; 		       ((bottom) (index i (1+ j)))
;; 		       ((top) (index i (1- j))))))
;;       ;; фиксированные значения для P и phi - остальное сносится
;;       (setf (ug (cell grid index))
;; 	    (ug (cell grid )))
;;       (setf (ul (cell grid index))
;; 	    (ul (cell grid )))
;;       )))




;; -------------------- ДЛЯ КОНСЕРВАТИВНЫХ ПЕРЕМЕННЫХ

(defmethod update-boundary-cells ((grid grid2d-cv))
  (loop for i from (min-x-index grid) to (max-x-index grid) do
       (funcall (symbol-function (bottom-boundary-condition grid))
		grid
		(index i -1)
		'bottom)
       (funcall (symbol-function (top-boundary-condition grid))
		grid
		(index i (1+ (cells-max-y grid)))
		'top))
  (loop for j from 0 to (cells-max-y grid) do
       (funcall (symbol-function (left-boundary-condition grid))
		grid
		(index -1 j)
		'left)
       (funcall (symbol-function (right-boundary-condition grid))
		grid
		(index (1+ (cells-max-x grid)) j)
		'right)))

(defmethod zeroe ((grid grid2d-cv) (index cell-index) border)
  (let ((i (x-index index))
	(j (y-index index)))
    (setf (cell grid index)
	  (let ((cell (cell grid (case border
				   ((left) (index (1+ i) j))
				   ((right) (index (1- i) j))
				   ((bottom) (index i (1+ j)))
				   ((top) (index i (1- j)))))))
	    (make-instance 'conservative-variables
			   :var-vector (var-vector cell))))))

(defmethod fixed ((grid grid2d-cv) (index cell-index) border)
  (when (zerop (iteration grid))
    (zeroe grid index border)))