Hamiltonian base class
Seit heute morgen denke ich mir, dass es sinnvoll sein könnte, wenn wir eine Hamiltonian Basis-Klasse haben. Da arbeite ich gerade im Branch 33 dran, ist aber noch nicht committed. Die Idee ist sowas:
template <int SymD, class SpinType, int ReducedSymD=1, class ReducedSpinType=int>
class Hamiltonian
{
public:
typedef std::array<SpinType, SymD> StateVector;
typedef std::array<ReducedSpinType, ReducedSymD> ReducedStateVector;
template <class A>
void wolff_flip(StateVector& sv, const A a);
template <class A>
double wolff_coupling(StateVector& sv1, StateVector& sv2, const A a);
template <class A>
double metro_coupling(StateVector& sv1, StateVector& sv2, const A a);
template <class A>
ReducedStateVector& metro_reduce_ref(StateVector& sv, const A a);
template <class A>
ReducedStateVector metro_reduce_cpy(StateVector sv, const A a);
};
Hier sind also die notwendigen Methoden und Datentypen deklariert und wenn sie in einem bestimmten abgeleiteten Hamiltonian dann gebraucht werden, müssen sie nach wie vor dort implementiert werden.
template <typename SpinType = int>
class Ising : public Hamiltonian<1,SpinType>
{
public:
double J;
typedef typename Hamiltonian<1,SpinType>::StateVector StateVector;
typedef typename Hamiltonian<1,SpinType>::ReducedStateVector ReducedStateVector;
(...)
template <class A = bool>
inline void wolff_flip(StateVector& sv, const A a=0)
{
sv[0] *= -1;
}
Wenn ich für ein gewisses Model also keinen ReducedStateVector brauche, dann ist der trotzdem automatisch vorhanden und die Funktionen, die das Ding benutzen, kompilieren.
Edited by Manuel Schrauth