#include "ExternalPotentialPlugin.h"
#include <CompuCell3D/Simulator.h>
#include <CompuCell3D/Potts3D/Potts3D.h>
using namespace CompuCell3D;
using namespace std;

namespace CompuCell3D {

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ExternalPotentialPlugin::ExternalPotentialPlugin()
 : Plugin(), CellGChangeWatcher()
{
//   adjNeighbor_ptr=0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ExternalPotentialPlugin::~ExternalPotentialPlugin()
{
//   if(adjNeighbor_ptr) delete adjNeighbor_ptr;
   //adjNeighbor_ptr=0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void ExternalPotentialPlugin::init(Simulator *_simulator){
  
  potts = _simulator->getPotts();
  
  //cellAccessorPtr=potts->getCellAccessorPtr();
//  potts->registerCellDynamicClassNode(&classNode);

  //volumeEnergy.setClassNode(classNode);
  
//  externalPotentialEnergy.setCellAccessorPtr(potts->getCellAccessorPtr());


  potts->registerEnergyFunction(&externalPotentialEnergy);
  
  potts->registerCellGChangeWatcher(this);
  //potts->registerStepper(this);

   Dim3D fieldDim=potts->getCellFieldG()->getDim();
   
   
   
  //adjNeighbor_ptr = new AdjacentNeighbor(fieldDim);
  
  //adjNeighbor=AdjacentNeighbor(fieldDim);///THIS causes problems!!!!
  adjNeighbor.initialize(fieldDim);
  if(potts->getBoundaryXName()=="Periodic"){
      adjNeighbor.setPeriodicX();
  }
  if(potts->getBoundaryYName()=="Periodic"){
      adjNeighbor.setPeriodicY();
  }
  if(potts->getBoundaryZName()=="Periodic"){
      adjNeighbor.setPeriodicZ();
  }

  externalPotentialEnergy.setAdjacentNeighborPtr(&adjNeighbor);
  externalPotentialEnergy.setCellFieldG(potts->getCellFieldG());
  externalPotentialEnergy.setPotts(potts);
  
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void ExternalPotentialPlugin::readXML(XMLPullParser &in){
   externalPotentialEnergy.readXML(in);

}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

};
