/*!\file Penpair.h
 * \brief: header file for penpair object */

#ifndef _PENPAIR_H_
#define _PENPAIR_H_

/*Headers:*/
/*{{{1*/
#include "./Load.h"
#include "../Node.h"
#include "../Elements/Element.h"

class Element;
/*}}}*/

class Penpair: public Load{

	private: 
		int		id;
		int analysis_type;
		
		Hook* hnodes;  //hook to 2 nodes
		Node** nodes;

		Parameters* parameters; //pointer to solution parameters

	public:

		/*Penpair constructors, destructors: {{{1*/
		Penpair();
		Penpair(int penpair_id,int* penpair_node_ids,int analysis_type);
		~Penpair();
		/*}}}*/
		/*Object virtual functions definitions:{{{1 */
		void  Echo();
		void  DeepEcho();
		int   Id(); 
		int   MyRank();
		#ifdef _SERIAL_
		void  Marshall(char** pmarshalled_dataset);
		int   MarshallSize();
		void  Demarshall(char** pmarshalled_dataset);
		#endif
		int   ObjectEnum();
		Object* copy();
		/*}}}*/
		/*Update virtual functions resolution: {{{1*/
		void  InputUpdateFromVector(double* vector, int name, int type);
		void  InputUpdateFromVector(int* vector, int name, int type);
		void  InputUpdateFromVector(bool* vector, int name, int type);
		void  InputUpdateFromMatrixDakota(double* matrix, int nrow, int ncols,int name, int type){_error_("Not implemented yet!");}
		void  InputUpdateFromVectorDakota(double* vector, int name, int type){_error_("Not implemented yet!");}
		void  InputUpdateFromVectorDakota(int* vector, int name, int type){_error_("Not implemented yet!");}
		void  InputUpdateFromVectorDakota(bool* vector, int name, int type){_error_("Not implemented yet!");}
		void  InputUpdateFromConstant(double constant, int name);
		void  InputUpdateFromConstant(int constant, int name);
		void  InputUpdateFromConstant(bool constant, int name);
		void  InputUpdateFromSolution(double* solution){_error_("Not implemented yet!");}
		void  InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented yet");};
		/*}}}*/
			/*Load virtual functions definitions: {{{1*/
		void  Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
		void  SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
		void  CreateKMatrix(Mat Kff, Mat Kfs);
		void  CreatePVector(Vec pf);
		void  CreateJacobianMatrix(Mat Jff);
		void  PenaltyCreateKMatrix(Mat Kff,Mat Kfs,double kmax);
		void  PenaltyCreatePVector(Vec pf, double kmax);
		void  PenaltyCreateJacobianMatrix(Mat Jff,double kmax);
		bool  InAnalysis(int analysis_type);
		/*}}}*/
			/*Penpair management: {{{1*/
		ElementMatrix* PenaltyCreateKMatrixDiagnosticHoriz(double kmax);
		ElementMatrix* PenaltyCreateKMatrixDiagnosticMacAyealPattyn(double kmax);
		ElementMatrix* PenaltyCreateKMatrixDiagnosticStokes(double kmax);
		ElementMatrix* PenaltyCreateKMatrixPrognostic(double kmax);
		/*}}}*/
};

#endif  /* _PENPAIR_H_ */


