(in-package :clf)

;; одномерная консервативная ячейка

(defclass cell1d-cv (conservative-variables cell-base)
  ((dimensions :initform 1
	       :accessor dimensions)
   (headers/cell1d-cv :initform '()
		      :allocation :class)))

(print-functions-for-class cell1d-cv 
			   ((inherit . cell-coordinates)
			    (inherit . conservative-variables)
			    (inherit . cell-size)
			    (inherit . cell-base)))

(defmethod make-dummy-cell ((type (eql 'cell1d-cv)))
  (make-instance type
		 :coord-vector (vector 'undef)
		 :size-vector (vector 'undef)
		 :number 'undef))

;; двумерная консервативная ячейка

(defclass cell2d-cv (conservative-variables cell-base)
  ((dimensions :initarg :dimensions
	       :initform 2
	       :accessor dimensions)
   ;; gradients содержит массив примитивных переменных и их градиентов
   (gradients :initform (make-dummy-variables 'primitive-variables)
	      :initarg :gradients
	      :accessor gradients)
   (headers/cell2d-cv :initform '(grad-P grad-phi grad-ug grad-ul)
		      :allocation :class)))

;; акцессоры и мутаторы градиентов (а нужны ли вообще? ну, пускай будут)
(defun grad-phi (cell)
  (phi (gradients cell)))

(defun grad-P (cell)
  (P (gradients cell)))

(defun grad-ug (cell)
  (ug (gradients cell)))

(defun grad-ul (cell)
  (ul (gradients cell)))

(defun (setf grad-phi) (new cell)
  (setf (phi (gradients cell)) new))

(defun (setf grad-P) (new cell)
  (setf (P (gradients cell)) new))

(defun (setf grad-ug) (new cell)
  (setf (ug (gradients cell)) new))

(defun (setf grad-ul) (new cell)
  (setf (ul (gradients cell)) new))

(make-header-for-class cell2d-cv)

(print-functions-for-class cell2d-cv 
			   ((inherit . cell-coordinates)
			    (inherit . conservative-variables)
			    (inherit . cell2d-cv)
			    (inherit . cell-size)
			    (inherit . cell-base)))

(defmethod make-dummy-cell ((type (eql 'cell2d-cv)))
  (make-instance type
		 :coord-vector (vector 'undef 'undef)
		 :size-vector (vector 'undef 'undef)
		 :gradients (make-instance 'primitive-variables
					   :var-vector (vector 'undef 'undef 'undef 'undef))
		 :number 'undef))

(defmethod clone ((cell cell2d-cv))
  (let ((duplicate (make-instance 'cell2d-cv
				  :coord-vector (coord-vector cell)
				  :size-vector (size-vector cell)
				  :P (P cell)
				  :phi (phi cell)
				  :ug (ug cell)
				  :ul (ul cell)
				  )))
    (setf (convergence duplicate)
	  (convergence cell))
    duplicate))


;; строго говоря, не правильно добавлять градиенты в cell2d-cv. Надо
;; было определить класс cell1d-cv-order2, добавить в него градиенты
;; по x и наследовать от cell1d-cv, а затем cell2d-cv-order2, и
;; наследовать его от класса cell1d-cv-order2 (а также от cell2d-cv)

;; но я сейчас быстро хакаю - магистерская на носу