1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
#ifndef lattice
#define lattice
#include "dipole.h"
class Lattice{
private:
Dipole* dipoleArray;
double E; // pointing in +ve y axis V/m
public:
const int xSize;
const int ySize;
Lattice(const int, const int);
~Lattice();
Dipole* GetDipole(int x, int y); // return a dipole
double calcLocalEnergy( int x, int y);
};
#endif
///////////////////////////////////////////////////////////
#include "dipole.h"
#include "lattice.h"
#include <cmath>
#include <cstdlib>
#include<iostream>
Lattice::Lattice(const int xSize, const int ySize): xSize(xSize), ySize(ySize){
dipoleArray = new Dipole[xSize*ySize]; //store 1D array list
for(int i=0; i<xSize; i++){
for(int j=0; j<ySize; j++){
//loop through the entire array and create dipoles
dipoleArray[ i+j*xSize ] = Dipole(); // i + j*xSize to mimic 2D lattice form
}
}
}
Dipole* Lattice::GetDipole(int x, int y){
return &dipoleArray[ (x%xSize) + (y%ySize)*xSize ]; // modulo is for loop behaviour
}
double Lattice::calcLocalEnergy( int x, int y){
double k = 1/(4*3.14158*8.85E-12); double p1=0; double p2 =0; double r = 1E-8; double energy = 0;
double E =1e4; double pZero = 1e-27; double pOne = 1e-29;
// std::cout<<"0"<<std::endl;
Dipole* central = GetDipole(x,y); // define central dipole in the lattice at position [x,y] given by the argument
// take modulo because x,y can potentially = -1 OR xSize for neighbour dipoles
// modulo ensures neighbours are found correctly
// for 0 <= x,y < xSize modulo has no effect
Dipole* neighbour[4];
neighbour[0] = GetDipole(x,y-1); //up = 0, right = 1, down = 2, left = 3
neighbour[1] = GetDipole(x+1,y);
neighbour[2] = GetDipole(x,y+1);
neighbour[3] = GetDipole(x-1,y);
int myDirection = central->GetDirection() ;
int type = central->GetType();
if(type==0){p1 = pZero; } else{p1 = pOne; }
for(int i=0; i<4; i++){
int neighbourDirection = neighbour[i]->GetDirection();
int Ntype = neighbour[i]->GetType();
if(Ntype==1){ p2 = pOne; } else{ p2 = pZero; }
// std::cout<<"1"<<std::endl;
double Energy[4][4]=
{
{-2*k*p1*p2/r/r/r - (p1+p2)*E, -p1*E, 2*k*p1*p2/r/r/r - (p1-p2)*E, -p1*E }, // ABOVE OR BELOW DIPOLES
{-p2*E, 2*k*p1*p2/3/r/r/r, p2*E, -2*k*p1*p2/3/r/r/r },
{2*k*p1*p2/r/r/r + (p1-p2)*E, p1*E, -2*k*p1*p2/r/r/r + (p1+p2)*E, p1*E},
{-p2*E, -2*k*p1*p2/3/r/r/r, p2*E, 2*k*p1*p2/3/r/r/r}
};
// std::cout<<"2"<<std::endl;
double Energy2[4][4] =
{
{ 2*k*p1*p2/3/r/r/r -(p1+p2)*E, -p1*E, -2*k*p1*p2/3/r/r/r -(p1-p2)*E, -p1*E }, // RIGHT OR LEFT ENERGIES
{ -p2*E, -2*k*p1*p2/r/r/r, p2*E, 2*k*p1*p2/r/r/r },
{ -2*k*p1*p2/3/r/r/r +(p1-p2)*E, p1*E, 2*k*p1*p2/3/r/r/r +(p1+p2)*E, p1*E },
{-p2*E, 2*k*p1*p2/r/r/r, p2*E, -2*k*p1*p2/r/r/r }
};
//std::cout<<"3"<<std::endl;
std::cout<<"i = "<< i << "\t" << type << "\t "<<Ntype <<"\t"<< neighbourDirection<<"\t"<<myDirection<<std::endl;
std::cout<<"x = " << x << "y = "<< y <<std::endl;
if(i==0 || i==2){
energy += Energy[myDirection][neighbourDirection];
}
else if(i==1 || i==3){
energy += Energy2[myDirection][neighbourDirection];
}
}//std::cout<<"4"<<std::endl;
std::cout<<"4end clac local E"<<std::endl;
return energy;
}
Lattice::~Lattice(){
delete[] dipoleArray;
}
|