/*!\file: DofIndexing.h
 * \brief prototype for DofIndexing.h
 */ 

#ifndef _DOFINDEXING_H_
#define  _DOFINDEXING_H_

#include "../include/include.h"

class DofIndexing{
	
	public:

		/*sizes: */
		int gsize; //number of dofs for a node
		int fsize; //number of dofs solver for
		int ssize; //number of constrained dofs

		/*partitioning: */
		int     clone;   //this node is replicated from another one 

		/*boundary conditions sets: */
		bool*     f_set; //is dof on f-set (on which we solve)
		bool*     s_set; //is dof on s-set (on which boundary conditions -dirichlet- are applied)
		IssmDouble*   svalues; //list of constraint values. size g_size, for ease of use.

		/*types of dofs: */
		int*     doftype; //approximation type of the dofs (used only for coupling), size g_size
		
		/*list of degrees of freedom: */
		int*     gdoflist; //dof list in g_set
		int*     fdoflist; //dof list in f_set
		int*     sdoflist; //dof list in s_set


		/*DofIndexing constructors, destructors {{{*/
		DofIndexing();
		DofIndexing(int g_size);
		void Init(int g_size,int* doftype);
		void InitSet(int setenum);
		DofIndexing(DofIndexing* properties);
		~DofIndexing();
		/*}}}*/
		/*Object like functionality: {{{*/
		void  Echo(void); 
		void  DeepEcho(void); 
		void  copy(DofIndexing* properties);
		/*}}}*/
		/*DofIndexing management: {{{*/
		DofIndexing* Spawn(int* indices, int numindices);
		/*}}}*/

};
#endif //ifndef _DOFINDEXING_H_
