%  splatticep  Lattice Hamiltonian for a 2D spin model with nn interaction with periodic 
%              boundary condition; sparse version.
%   splatticep(op1,op2,Nx,Ny) gives the lattice Hamiltonian as a sparse matrix for 
%   a 2D spin for Nx*Ny qubits. op1 and op2 define the nearest-neighbor interaction. 
%   For the Hamiltonian periodic boundary condition is used.

function Hzz=splatticep(op1,op2,Nx,Ny)
 
N=Nx*Ny;
Hzz=sparse(2^N,2^N);

for iy=0:Ny-1
    for ix=1:Nx-1
       index=ix+Nx*iy;
       Hzz=Hzz+spinteract(op1,op2,index,index+1,N);
       disp(['x  ' num2str(index) ',' num2str(index+1)])
    end %for
    % Periodic BC
    if Nx>2,
       Hzz=Hzz+spinteract(op2,op1,Nx*iy+1,Nx*iy+Nx,N);
       disp(['px ' num2str(Nx*iy+Nx) ',' num2str(Nx*iy+1) ])
   end %if    
end %for
for ix=1:Nx
    for iy=0:Ny-2
       index=ix+Nx*iy;
       Hzz=Hzz+spinteract(op1,op2,index,index+Nx,N);
       disp(['y  ' num2str(index) ',' num2str(index+Nx)])
    end %for
    % Periodic BC
    if Ny>2,
       Hzz=Hzz+spinteract(op2,op1,ix,ix+(Ny-1)*Nx,N); 
       disp(['py ' num2str(ix+(Ny-1)*Nx) ',' num2str(ix)])
    end %if
end %for