/*!\file:  Material.h
 * \brief abstract class for Material object
 */ 

#ifndef _MATERIAL_H_
#define _MATERIAL_H_

/*Headers:*/
/*{{{*/
class Inputs;
template <class doubletype> class Vector;
#include "../../datastructures/datastructures.h"
#include "../Update.h"
class Element;
class Elements;
/*}}}*/

class Material: public Object,public Update{

	public: 
		virtual ~Material(){};
		/*WARNING: input should not be public but it is an easy way to update B from T (using UpdateFromSolution) from Pentas*/

		/*Numerics*/
		virtual Material*  copy2(Element* element)=0;
		virtual void       Configure(Elements* elements)=0;
		virtual void       GetViscosity(IssmDouble* pviscosity,IssmDouble epseff)=0;
		virtual void       GetViscosity_B(IssmDouble* pviscosity,IssmDouble epseff)=0;
		virtual void       GetViscosity_D(IssmDouble* pviscosity,IssmDouble epseff)=0;
		virtual void       GetViscosityBar(IssmDouble* pviscosity,IssmDouble epseff)=0;
		virtual void       GetViscosityComplement(IssmDouble* pviscosity_complement, IssmDouble* pepsilon)=0;
		virtual void       GetViscosityDComplement(IssmDouble* pviscosity_complement, IssmDouble* pepsilon)=0;
		virtual void       GetViscosityDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* pepsilon)=0;
		virtual void       GetViscosity2dDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* pepsilon)=0;
		virtual IssmDouble GetA()=0;
		virtual IssmDouble GetAbar()=0;
		virtual IssmDouble GetB()=0;
		virtual IssmDouble GetBbar()=0;
		virtual IssmDouble GetN()=0;
		virtual IssmDouble GetD()=0;
		virtual IssmDouble GetDbar()=0;
		virtual bool       IsDamage()=0;

};
#endif
