// Logs:
//
//  $Log: Lattice.h,v $
//  Revision 1.3  2003/06/26 09:27:11  cvs
//  added log fields...
//

#ifndef _LATTICE___
#define _LATTICE___

#include "Config.h"

#include "Util.h"
#include <math.h>
#include <iostream>
#include <Rtypes.h>

class Lattice {
protected:
  float *fdistances; //precalculated distances
  float*** fspace; //lattice energies
  float fa,fb,fc; //base cell size in Angstroms
  int fNa,fNb,fNc; //lattice size
  
  float fsigma; //scale of the field, used to set sigma of FillRandom in eV

private:
  void PrecalculateDistances();

public:
  Lattice(){fa=fb=fc=1.0;fspace=0;fdistances=0;};
  Lattice(const int Na,const int Nb,const int Nc);
  virtual ~Lattice();

  void SetBase(const float a,const float b,const float c);

  void FillRandom();
  void ScaleEnergy(const float sigma);

  float*** Get() const {return fspace;}
  float Distance(const int i,const int j,const  int k) const;
  float Distance(const int idx);
  float GetEnergy(int i,int j,int k) const;
  float GetEnergyDifference(int i,int j,int k,int di,int dj,int dk) const;
  int GetNa()const {return fNa;};
  int GetNb()const {return fNb;};
  int GetNc()const {return fNc;};
  float Geta()const {return fa;};
  float Getb()const {return fb;};
  float Getc()const {return fc;};

  ClassDef(Lattice,0)  //Periodic Lattice with random energies
};

#endif //_LATTICE___





