//#####################################################################
// Copyright 2003-2007, Ron Fedkiw, Geoffrey Irving, Igor Neverov, Eftychios Sifakis, Joseph Teran.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class GENERAL_CONSTITUTIVE_MODEL
//##################################################################### 
#ifndef __GENERAL_CONSTITUTIVE_MODEL__
#define __GENERAL_CONSTITUTIVE_MODEL__

#include <Deformables/Constitutive_Models/CONSTITUTIVE_MODEL.h>
namespace PhysBAM{

template<class TV> class GENERAL_STRESS_DERIVATIVE;

template<class T,int d>
class GENERAL_CONSTITUTIVE_MODEL
{
    typedef VECTOR<T,d> TV;
public:
    GENERAL_CONSTITUTIVE_MODEL()=default;
    virtual ~GENERAL_CONSTITUTIVE_MODEL();

//#####################################################################
    virtual MATRIX<T,d> Stress(const MATRIX<T,d>& F) const=0;
    virtual T Energy_Density(const MATRIX<T,d>& F) const=0;
    void Test(const MATRIX<T,d>& F) const;
    // returns dF_dP:M
    virtual void Stress_Derivative(const MATRIX<T,d>& F,GENERAL_STRESS_DERIVATIVE<TV>& dP_dF) const=0;
//#####################################################################
};
}
#endif
