Corrected script for calculating the dispersion relation in 2D - thanks to Tom Bland!
This commit is contained in:
parent
2d6fb3f15c
commit
4583f1a643
2
.gitignore
vendored
2
.gitignore
vendored
@ -10,5 +10,7 @@ Time-Series-Analyzer/Time-Series-Data
|
||||
*.mp4
|
||||
*.bat
|
||||
*.json
|
||||
*.txt
|
||||
*.asv
|
||||
.ipynb_checkpoints/
|
||||
.vscode/
|
@ -40,8 +40,8 @@ wz = 2 * pi * 300;
|
||||
lz = sqrt(PlanckConstantReduced/(Dy164Mass * wz)); % Defining a harmonic oscillator length
|
||||
|
||||
% Number of grid points in each direction
|
||||
Params.Nx = 128;
|
||||
Params.Ny = 128;
|
||||
Params.Nx = 256;
|
||||
Params.Ny = 256;
|
||||
Params.Lx = 150*1e-6;
|
||||
Params.Ly = 150*1e-6;
|
||||
[Transf] = setupSpace(Params);
|
||||
@ -49,7 +49,7 @@ Params.Ly = 150*1e-6;
|
||||
nadd2s = 0.110; % Number density * add^2
|
||||
as_to_add = 0.782; % 1/edd
|
||||
Params.theta = 57; % Polar angle of dipole moment
|
||||
Params.eta = 0; % Azimuthal angle of dipole moment
|
||||
Params.phi = 0; % Azimuthal angle of dipole moment
|
||||
|
||||
add = VacuumPermeability*DyMagneticMoment^2*Dy164Mass/(12*pi*PlanckConstantReduced^2); % Dipole length
|
||||
gdd = VacuumPermeability*DyMagneticMoment^2/3;
|
||||
@ -74,10 +74,10 @@ sigma = fmincon(TotalEnergyPerParticle, x0, Aineq, Bineq, Aeq,
|
||||
MeanWidth = sigma * lz;
|
||||
|
||||
% == 2-D DDI Potential in k-space == %
|
||||
VDk = compute2DPotentialInMomentumSpace(Transf, Params, MeanWidth);
|
||||
VDk_fftshifted = fftshift(VDk);
|
||||
VDk = compute2DPotentialInMomentumSpace(Transf, Params, MeanWidth); % Transf.K is in shifted space, so VDk is shifted
|
||||
VDk_fftshifted = fftshift(VDk); % This is in normal space, but dispersion is calculated in shifted space, so unshifted VDk needs to be used there
|
||||
|
||||
figure(8)
|
||||
figure(11)
|
||||
clf
|
||||
set(gcf,'Position',[50 50 950 750])
|
||||
imagesc(fftshift(Transf.kx)*1e-6, fftshift(Transf.ky)*1e-6, VDk_fftshifted); % Specify x and y data for axes
|
||||
@ -86,7 +86,7 @@ cbar1 = colorbar;
|
||||
cbar1.Label.Interpreter = 'latex';
|
||||
xlabel('$k_x l_o$','fontsize',16,'interpreter','latex');
|
||||
ylabel('$k_y l_o$','fontsize',16,'interpreter','latex');
|
||||
title(['2-D DDI Potential: $\theta = ',num2str(Params.theta), '; \eta = ', num2str(Params.eta),'$'],'fontsize',16,'interpreter','latex')
|
||||
title(['2-D DDI Potential: $\theta = ',num2str(Params.alpha), '; \phi = ', num2str(Params.phi),'$'],'fontsize',16,'interpreter','latex')
|
||||
|
||||
% == Quantum Fluctuations term == %
|
||||
gammaQF = (32/3) * gs * (as^3/pi)^(1/2) * (1 + ((3/2) * eps_dd^2));
|
||||
@ -95,47 +95,74 @@ gQF = gamma5 * gammaQF;
|
||||
|
||||
EpsilonK = zeros(length(Transf.ky), length(Transf.kx));
|
||||
gs_tilde = gs / (sqrt(2*pi) * MeanWidth);
|
||||
gdd_tilde = gdd / (sqrt(2*pi) * MeanWidth); % you were missing this!
|
||||
|
||||
% == Dispersion relation == %
|
||||
for idx = 1:length(Transf.kx)
|
||||
for jdx = 1:length(Transf.ky)
|
||||
DeltaK = ((PlanckConstantReduced^2 .* (Transf.kx(idx).^2 + Transf.ky(jdx).^2)) ./ (2 * Dy164Mass)) + (2 * AtomNumberDensity * gs_tilde) + ((2 * AtomNumberDensity) .* VDk_fftshifted(jdx, idx)) + (3 * gQF * AtomNumberDensity^(3/2));
|
||||
DeltaK = ((PlanckConstantReduced^2 .* (Transf.kx(idx).^2 + Transf.ky(jdx).^2)) ./ (2 * Dy164Mass)) + (2 * AtomNumberDensity * gs_tilde) + ((2 * AtomNumberDensity) * gdd_tilde .* VDk(jdx, idx)) + (3 * gQF * AtomNumberDensity^(3/2));
|
||||
EpsilonK(jdx, idx) = sqrt(((PlanckConstantReduced^2 .* (Transf.kx(idx).^2 + Transf.ky(jdx).^2)) ./ (2 * Dy164Mass)) .* DeltaK);
|
||||
end
|
||||
end
|
||||
|
||||
EpsilonK = double(imag(EpsilonK) ~= 0); % 'isreal' returns 0 for complex numbers and 1 for real numbers, so we negate it
|
||||
EpsilonK = real(EpsilonK);
|
||||
|
||||
figure(9)
|
||||
figure(12)
|
||||
clf
|
||||
set(gcf,'Position',[50 50 950 750])
|
||||
imagesc(fftshift(Transf.kx)*1e-6, fftshift(Transf.ky)*1e-6, EpsilonK); % Specify x and y data for axes
|
||||
imagesc(fftshift(Transf.kx)*1e-6, fftshift(Transf.ky)*1e-6, fftshift(EpsilonK)); % Specify x and y data for axes
|
||||
set(gca, 'YDir', 'normal'); % Correct the y-axis direction
|
||||
cbar1 = colorbar;
|
||||
cbar1.Label.Interpreter = 'latex';
|
||||
xlabel('$k_x l_o$','fontsize',16,'interpreter','latex');
|
||||
ylabel('$k_y l_o$','fontsize',16,'interpreter','latex');
|
||||
title(['2-D Dispersion: $\theta = ',num2str(Params.theta), '; \eta = ', num2str(Params.eta),'$'],'fontsize',16,'interpreter','latex')
|
||||
title(['2-D Dispersion: $\theta = ',num2str(Params.alpha), '; \phi = ', num2str(Params.phi),'$'],'fontsize',16,'interpreter','latex')
|
||||
|
||||
%% 3-D Plot
|
||||
% Assuming Transf.kx, Transf.ky, and EpsilonK are already defined
|
||||
% Apply fftshift and scaling
|
||||
kx_shifted = fftshift(Transf.kx) * 1e-6; % Convert to desired units
|
||||
ky_shifted = fftshift(Transf.ky) * 1e-6; % Convert to desired units
|
||||
EpsilonK_shifted = fftshift(EpsilonK); % This is the energy or function you want to plot
|
||||
|
||||
% Create meshgrid for the kx and ky values
|
||||
[Kx, Ky] = meshgrid(kx_shifted, ky_shifted);
|
||||
|
||||
% Create the 3D plot
|
||||
figure(13)
|
||||
clf
|
||||
set(gcf,'Position',[50 50 950 750])
|
||||
surf(Kx, Ky, EpsilonK_shifted);
|
||||
shading interp; % Interpolates shading between grid points
|
||||
% Label axes
|
||||
xlabel('$k_x l_o$','fontsize',16,'interpreter','latex');
|
||||
ylabel('$k_y l_o$','fontsize',16,'interpreter','latex');
|
||||
zlabel('$\epsilon(k)$','fontsize',16,'interpreter','latex');
|
||||
title(['2-D Dispersion: $\theta = ',num2str(Params.alpha), '; \phi = ', num2str(Params.phi),'$'],'fontsize',16,'interpreter','latex')
|
||||
colorbar; % Optional, to show a color scale for the surface plot
|
||||
% Apply a different colormap
|
||||
colormap('jet'); % 'jet', 'parula', 'hot', etc.
|
||||
colorbar; % Add colorbar to see the range of values
|
||||
|
||||
%% Cycle through angles
|
||||
|
||||
% Define values for theta and eta
|
||||
% Define values for theta and phi
|
||||
theta_values = 0:10:90; % Range of theta values (you can modify this)
|
||||
eta_values = 0:10:90; % Range of eta values (you can modify this)
|
||||
phi_values = 0:10:90; % Range of phi values (you can modify this)
|
||||
|
||||
% Set up VideoWriter object to produce a movie
|
||||
% v = VideoWriter('potential_movie', 'MPEG-4'); % Create a video object
|
||||
% v.FrameRate = 5; % Frame rate of the video
|
||||
% open(v); % Open the video file
|
||||
|
||||
% Loop over theta and eta values
|
||||
% Loop over theta and phi values
|
||||
for theta = theta_values
|
||||
for eta = eta_values
|
||||
% Update Params with current theta and eta
|
||||
for phi = phi_values
|
||||
% Update Params with current theta and phi
|
||||
Params.theta = theta;
|
||||
Params.eta = eta;
|
||||
Params.phi = phi;
|
||||
|
||||
% Compute the potential for the current theta and eta
|
||||
% Compute the potential for the current theta and phi
|
||||
% == 2-D DDI Potential in k-space == %
|
||||
VDk = compute2DPotentialInMomentumSpace(Transf, Params, MeanWidth);
|
||||
VDk_fftshifted = fftshift(VDk);
|
||||
@ -147,28 +174,29 @@ for theta = theta_values
|
||||
|
||||
EpsilonK = zeros(length(Transf.ky), length(Transf.kx));
|
||||
gs_tilde = gs / (sqrt(2*pi) * MeanWidth);
|
||||
gdd_tilde = gdd / (sqrt(2*pi) * MeanWidth); % you were missing this!
|
||||
|
||||
% == Dispersion relation == %
|
||||
for idx = 1:length(Transf.kx)
|
||||
for jdx = 1:length(Transf.ky)
|
||||
DeltaK = ((PlanckConstantReduced^2 .* (Transf.kx(idx).^2 + Transf.ky(jdx).^2)) ./ (2 * Dy164Mass)) + (2 * AtomNumberDensity * gs_tilde) + ((2 * AtomNumberDensity) .* VDk_fftshifted(jdx, idx)) + (3 * gQF * AtomNumberDensity^(3/2));
|
||||
DeltaK = ((PlanckConstantReduced^2 .* (Transf.kx(idx).^2 + Transf.ky(jdx).^2)) ./ (2 * Dy164Mass)) + (2 * AtomNumberDensity * gs_tilde) + ((2 * AtomNumberDensity) * gdd_tilde .* VDk(jdx, idx)) + (3 * gQF * AtomNumberDensity^(3/2));
|
||||
EpsilonK(jdx, idx) = sqrt(((PlanckConstantReduced^2 .* (Transf.kx(idx).^2 + Transf.ky(jdx).^2)) ./ (2 * Dy164Mass)) .* DeltaK);
|
||||
end
|
||||
end
|
||||
|
||||
EpsilonK = double(imag(EpsilonK) ~= 0); % 'isreal' returns 0 for complex numbers and 1 for real numbers, so we negate it
|
||||
EpsilonK = real(EpsilonK);
|
||||
|
||||
% Plot the result
|
||||
figure(10)
|
||||
figure(14)
|
||||
clf
|
||||
set(gcf,'Position',[50 50 950 750])
|
||||
imagesc(fftshift(Transf.kx)*1e-6, fftshift(Transf.ky)*1e-6, EpsilonK); % Specify x and y data for axes
|
||||
imagesc(fftshift(Transf.kx)*1e-6, fftshift(Transf.ky)*1e-6, fftshift(EpsilonK)); % Specify x and y data for axes
|
||||
set(gca, 'YDir', 'normal'); % Correct the y-axis direction
|
||||
cbar1 = colorbar;
|
||||
cbar1.Label.Interpreter = 'latex';
|
||||
xlabel('$k_x l_o$','fontsize',16,'interpreter','latex');
|
||||
ylabel('$k_y l_o$','fontsize',16,'interpreter','latex');
|
||||
title(['2-D Dispersion: $\theta = ',num2str(Params.theta), '; \eta = ', num2str(Params.eta),'$'],'fontsize',16,'interpreter','latex')
|
||||
title(['2-D Dispersion: $\theta = ',num2str(Params.theta), '; \phi = ', num2str(Params.phi),'$'],'fontsize',16,'interpreter','latex')
|
||||
|
||||
% Capture the frame and write to video
|
||||
% frame = getframe(gcf); % Capture the current figure
|
||||
@ -224,7 +252,7 @@ function VDk = compute2DPotentialInMomentumSpace(Transf, Params, MeanWidth)
|
||||
|
||||
Qsq = QX.^2 + QY.^2;
|
||||
absQ = sqrt(Qsq);
|
||||
QDsq = QX.^2*cos(Params.eta)^2 + QY.^2*sin(Params.eta)^2; % eta here is the azimuthal angle of the dipole moment (angle from the x-axis)
|
||||
QDsq = QX.^2*cos(Params.phi)^2 + QY.^2*sin(Params.phi)^2; % phi here is the azimuthal angle of the dipole moment (angle from the x-axis)
|
||||
|
||||
% Bare interaction
|
||||
Fpar = -1 + 3*sqrt(pi)*QDsq.*erfcx(absQ)./absQ; % Scaled complementary error function erfcx(x) = e^(x^2) * erfc(x)
|
||||
|
Loading…
Reference in New Issue
Block a user