Added live plotting functionality for the Variational solver.
This commit is contained in:
parent
7bdfb6af51
commit
8b2732cad5
67
Dipolar-Gas-Simulator/+Plotter/plotLive2D.m
Normal file
67
Dipolar-Gas-Simulator/+Plotter/plotLive2D.m
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
function plotLive2D(psi, Params, Transf, Observ)
|
||||||
|
set(0,'defaulttextInterpreter','latex')
|
||||||
|
set(groot, 'defaultAxesTickLabelInterpreter','latex'); set(groot, 'defaultLegendInterpreter','latex');
|
||||||
|
|
||||||
|
format long
|
||||||
|
|
||||||
|
% Axes scaling and coordinates in micrometers
|
||||||
|
x = Transf.x * Params.l0 * 1e6;
|
||||||
|
y = Transf.y * Params.l0 * 1e6;
|
||||||
|
|
||||||
|
% Compute probability density |psi|^2
|
||||||
|
nxy = abs(psi).^2;
|
||||||
|
nxyScaled = nxy*(Params.add*10^6)^2;
|
||||||
|
|
||||||
|
% Plotting
|
||||||
|
figure(1);
|
||||||
|
set(gcf,'Position', [100, 100, 1600, 900])
|
||||||
|
clf
|
||||||
|
|
||||||
|
% Plot |psi(x,y)|^2 (density in x and y plane)
|
||||||
|
ax1 = subplot('Position', [0.05, 0.55, 0.28, 0.4]);
|
||||||
|
plotxy = pcolor(x,y,nxyScaled');
|
||||||
|
set(plotxy, 'EdgeColor', 'none');
|
||||||
|
% shading interp; % Smooth shading
|
||||||
|
clim(ax1);
|
||||||
|
cbar1 = colorbar;
|
||||||
|
cbar1.Label.Interpreter = 'latex';
|
||||||
|
ylabel(cbar1,'$na_{dd}^2$','FontSize',16,'Rotation',270)
|
||||||
|
xlabel('$x$ ($\mu$m)', 'Interpreter', 'latex', 'FontSize', 14)
|
||||||
|
ylabel('$y$ ($\mu$m)', 'Interpreter', 'latex', 'FontSize', 14)
|
||||||
|
title('$|\Psi(x,y)|^2$', 'Interpreter', 'latex', 'FontSize', 14)
|
||||||
|
|
||||||
|
% Plot real part of psi in the x-y plane
|
||||||
|
subplot('Position', [0.36, 0.55, 0.28, 0.4])
|
||||||
|
pcolor(x, y, real(psi)');
|
||||||
|
shading interp;
|
||||||
|
colorbar;
|
||||||
|
xlabel('$x$ [$\mu$m]', 'FontSize', 14); ylabel('$y$ [$\mu$m]', 'FontSize', 14);
|
||||||
|
title('Re$\{\Psi_{xy}\}$', 'FontSize', 14);
|
||||||
|
|
||||||
|
% Plot imaginary part of psi in the x-y plane
|
||||||
|
subplot('Position', [0.67, 0.55, 0.28, 0.4])
|
||||||
|
pcolor(x, y, imag(psi)');
|
||||||
|
shading interp;
|
||||||
|
colorbar;
|
||||||
|
xlabel('$x$ [$\mu$m]', 'FontSize', 14); ylabel('$y$ [$\mu$m]', 'FontSize', 14);
|
||||||
|
title('Im$\{\Psi_{xy}\}$', 'FontSize', 14);
|
||||||
|
|
||||||
|
|
||||||
|
% Plot residual (time steps vs -log10(residual))
|
||||||
|
subplot('Position', [0.05, 0.05, 0.26, 0.4]);
|
||||||
|
plot(-log10(Observ.residual), '-b')
|
||||||
|
ylabel('$-\mathrm{log}_{10}(r)$', 'FontSize', 14); xlabel('Time steps', 'FontSize', 14);
|
||||||
|
title('Residual', 'FontSize', 14);
|
||||||
|
|
||||||
|
% Plot total energy over time
|
||||||
|
subplot('Position', [0.36, 0.05, 0.26, 0.4]);
|
||||||
|
plot(Observ.EVec, '-b')
|
||||||
|
ylabel('$E_{tot}$', 'FontSize', 14); xlabel('Time steps', 'FontSize', 14);
|
||||||
|
title('Total Energy', 'FontSize', 14);
|
||||||
|
|
||||||
|
% Plot chemical potential over time
|
||||||
|
subplot('Position', [0.67, 0.05, 0.26, 0.4]);
|
||||||
|
plot(Observ.mucVec, '-b')
|
||||||
|
ylabel('$\mu$', 'FontSize', 14); xlabel('Time steps', 'FontSize', 14);
|
||||||
|
title('Chemical Potential', 'FontSize', 14);
|
||||||
|
end
|
@ -73,6 +73,7 @@ OptionsStruct.WidthLowerBound = 5;
|
|||||||
OptionsStruct.WidthUpperBound = 8;
|
OptionsStruct.WidthUpperBound = 8;
|
||||||
OptionsStruct.WidthCutoff = 1e-3;
|
OptionsStruct.WidthCutoff = 1e-3;
|
||||||
|
|
||||||
|
OptionsStruct.PlotLive = true;
|
||||||
OptionsStruct.JobNumber = 1;
|
OptionsStruct.JobNumber = 1;
|
||||||
OptionsStruct.RunOnGPU = false;
|
OptionsStruct.RunOnGPU = false;
|
||||||
OptionsStruct.SaveData = true;
|
OptionsStruct.SaveData = true;
|
||||||
|
@ -175,7 +175,7 @@ function [psi] = propagateWavefunction(this,psi,Params,Transf,VDk,V,t_idx,Observ
|
|||||||
Observ.tVecPlot = [Observ.tVecPlot tVal];
|
Observ.tVecPlot = [Observ.tVecPlot tVal];
|
||||||
Observ.res_idx = Observ.res_idx + 1;
|
Observ.res_idx = Observ.res_idx + 1;
|
||||||
|
|
||||||
pb.run(' - Job Completed!');
|
pb.run(' - Run Completed!');
|
||||||
disp('Saving data...');
|
disp('Saving data...');
|
||||||
save(sprintf('./Data/Run_%03i/TimeEvolution/psi_%i.mat',Params.njob,Observ.res_idx),'psi','muchem','Observ','t_idx');
|
save(sprintf('./Data/Run_%03i/TimeEvolution/psi_%i.mat',Params.njob,Observ.res_idx),'psi','muchem','Observ','t_idx');
|
||||||
disp('Save complete!');
|
disp('Save complete!');
|
||||||
|
@ -26,7 +26,7 @@ classdef DipolarGas < handle & matlab.mixin.Copyable
|
|||||||
Calculator;
|
Calculator;
|
||||||
|
|
||||||
SimulationParameters;
|
SimulationParameters;
|
||||||
|
PlotLive;
|
||||||
JobNumber;
|
JobNumber;
|
||||||
RunOnGPU;
|
RunOnGPU;
|
||||||
DebugMode;
|
DebugMode;
|
||||||
@ -78,6 +78,8 @@ classdef DipolarGas < handle & matlab.mixin.Copyable
|
|||||||
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
||||||
addParameter(p, 'JobNumber', 1,...
|
addParameter(p, 'JobNumber', 1,...
|
||||||
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
||||||
|
addParameter(p, 'PlotLive', false,...
|
||||||
|
@islogical);
|
||||||
addParameter(p, 'RunOnGPU', false,...
|
addParameter(p, 'RunOnGPU', false,...
|
||||||
@islogical);
|
@islogical);
|
||||||
addParameter(p, 'DebugMode', false,...
|
addParameter(p, 'DebugMode', false,...
|
||||||
@ -109,6 +111,7 @@ classdef DipolarGas < handle & matlab.mixin.Copyable
|
|||||||
this.WidthUpperBound = p.Results.WidthUpperBound;
|
this.WidthUpperBound = p.Results.WidthUpperBound;
|
||||||
this.WidthCutoff = p.Results.WidthCutoff;
|
this.WidthCutoff = p.Results.WidthCutoff;
|
||||||
|
|
||||||
|
this.PlotLive = p.Results.PlotLive;
|
||||||
this.JobNumber = p.Results.JobNumber;
|
this.JobNumber = p.Results.JobNumber;
|
||||||
this.RunOnGPU = p.Results.RunOnGPU;
|
this.RunOnGPU = p.Results.RunOnGPU;
|
||||||
this.DebugMode = p.Results.DebugMode;
|
this.DebugMode = p.Results.DebugMode;
|
||||||
|
@ -22,6 +22,11 @@ function [psi, Observ] = propagateWavefunction(this, psi, Params, VParams, Trans
|
|||||||
res = this.Calculator.calculateNormalizedResiduals(psi,Params,VParams,Transf,VDk,V,muchem);
|
res = this.Calculator.calculateNormalizedResiduals(psi,Params,VParams,Transf,VDk,V,muchem);
|
||||||
Observ.residual = [Observ.residual res];
|
Observ.residual = [Observ.residual res];
|
||||||
|
|
||||||
|
if this.PlotLive
|
||||||
|
Plotter.plotLive2D(psi,Params,Transf,Observ)
|
||||||
|
drawnow
|
||||||
|
end
|
||||||
|
|
||||||
g_eff = Params.gs * (1/(sqrt(2*pi)*VParams.ell));
|
g_eff = Params.gs * (1/(sqrt(2*pi)*VParams.ell));
|
||||||
gamma_eff = Params.gammaQF * (sqrt(2/5)/(pi^(3/4)*VParams.ell^(3/2)));
|
gamma_eff = Params.gammaQF * (sqrt(2/5)/(pi^(3/4)*VParams.ell^(3/2)));
|
||||||
Ez = (0.25*VParams.ell^2) + (0.25*Params.gz*VParams.ell^2);
|
Ez = (0.25*VParams.ell^2) + (0.25*Params.gz*VParams.ell^2);
|
||||||
@ -55,7 +60,8 @@ function [psi, Observ] = propagateWavefunction(this, psi, Params, VParams, Trans
|
|||||||
|
|
||||||
muchem = this.Calculator.calculateChemicalPotential(psi,Params,VParams,Transf,VDk,V);
|
muchem = this.Calculator.calculateChemicalPotential(psi,Params,VParams,Transf,VDk,V);
|
||||||
|
|
||||||
if mod(t_idx,1000) == 0
|
%Plotting loop
|
||||||
|
if mod(t_idx,500) == 0
|
||||||
|
|
||||||
% Change in Energy
|
% Change in Energy
|
||||||
E = this.Calculator.calculateTotalEnergy(psi,Params,VParams,Transf,VDk,V);
|
E = this.Calculator.calculateTotalEnergy(psi,Params,VParams,Transf,VDk,V);
|
||||||
@ -70,6 +76,13 @@ function [psi, Observ] = propagateWavefunction(this, psi, Params, VParams, Trans
|
|||||||
Observ.residual = [Observ.residual res];
|
Observ.residual = [Observ.residual res];
|
||||||
Observ.res_idx = Observ.res_idx + 1;
|
Observ.res_idx = Observ.res_idx + 1;
|
||||||
|
|
||||||
|
% Plotting
|
||||||
|
if this.PlotLive
|
||||||
|
Plotter.plotLive2D(psi,Params,Transf,Observ)
|
||||||
|
drawnow
|
||||||
|
end
|
||||||
|
%
|
||||||
|
|
||||||
%Adaptive time step -- Careful, this can quickly get out of control
|
%Adaptive time step -- Careful, this can quickly get out of control
|
||||||
relres = abs(Observ.residual(Observ.res_idx)-Observ.residual(Observ.res_idx-1))/Observ.residual(Observ.res_idx);
|
relres = abs(Observ.residual(Observ.res_idx)-Observ.residual(Observ.res_idx-1))/Observ.residual(Observ.res_idx);
|
||||||
if relres <1e-5
|
if relres <1e-5
|
||||||
@ -109,6 +122,6 @@ function [psi, Observ] = propagateWavefunction(this, psi, Params, VParams, Trans
|
|||||||
% Chemical potential
|
% Chemical potential
|
||||||
Observ.mucVec = [Observ.mucVec muchem];
|
Observ.mucVec = [Observ.mucVec muchem];
|
||||||
|
|
||||||
pb.run(' - Job Completed!');
|
pb.run(' - Run Completed!');
|
||||||
clear pb.run
|
clear pb.run
|
||||||
end
|
end
|
@ -62,6 +62,16 @@ function [Params, Transf, psi, V, VDk] = run(this)
|
|||||||
|
|
||||||
save(sprintf('./Data/Run_%03i/psi_gs_%i.mat',Params.njob),'psi','Observ','Transf','Params','VDk','V','VParams');
|
save(sprintf('./Data/Run_%03i/psi_gs_%i.mat',Params.njob),'psi','Observ','Transf','Params','VDk','V','VParams');
|
||||||
|
|
||||||
|
%Plotting
|
||||||
|
if this.PlotLive
|
||||||
|
figure(2);
|
||||||
|
plot(ells,E_vs_iter,'LineStyle','none','Marker','o','MarkerSize',3,'Color','b','MarkerFaceColor','b')
|
||||||
|
xlabel('$\ell$', 'FontSize', 14)
|
||||||
|
ylabel('$E_{var}$', 'FontSize', 14)
|
||||||
|
title('Variational Energy', 'FontSize', 14);
|
||||||
|
drawnow
|
||||||
|
end
|
||||||
|
|
||||||
if relelldiff < Params.ellcutoff
|
if relelldiff < Params.ellcutoff
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user