Added script to visualize the 2D grid for the 2D solver and made other appropriate changes.
This commit is contained in:
parent
53894fb77b
commit
96f33d3634
83
Dipolar-Gas-Simulator/+Plotter/visualizeSpace2D.m
Normal file
83
Dipolar-Gas-Simulator/+Plotter/visualizeSpace2D.m
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
function visualizeSpace2D(Transf)
|
||||||
|
|
||||||
|
% Ensure that x and y are vectors (1D) and create a 2D mesh grid from them
|
||||||
|
[X, Y] = meshgrid(Transf.x, Transf.y); % Create 2D mesh grid from x and y vectors
|
||||||
|
|
||||||
|
height = 20;
|
||||||
|
width = 45;
|
||||||
|
figure(1)
|
||||||
|
clf
|
||||||
|
set(gcf, 'Units', 'centimeters')
|
||||||
|
set(gcf, 'Position', [2 4 width height])
|
||||||
|
set(gcf, 'PaperPositionMode', 'auto')
|
||||||
|
|
||||||
|
% Plot real space grid
|
||||||
|
subplot(1,2,1)
|
||||||
|
hold on
|
||||||
|
|
||||||
|
% Plot the grid lines
|
||||||
|
for i = 1:size(X, 1)
|
||||||
|
plot(X(i,:), Y(i,:), 'k'); % Plot horizontal grid lines in black
|
||||||
|
end
|
||||||
|
for j = 1:size(X, 2)
|
||||||
|
plot(X(:,j), Y(:,j), 'k'); % Plot vertical grid lines in black
|
||||||
|
end
|
||||||
|
|
||||||
|
axis equal % Ensures equal scaling for both axes
|
||||||
|
|
||||||
|
% Set axes labels
|
||||||
|
xlabel(gca, {'$x / l_o ~ (m)$'}, ...
|
||||||
|
'Interpreter', 'latex', ...
|
||||||
|
'FontName', 'Times New Roman', ...
|
||||||
|
'FontSize', 14, ...
|
||||||
|
'FontWeight', 'normal', ...
|
||||||
|
'FontAngle', 'normal')
|
||||||
|
ylabel(gca, {'$y / l_o ~ (m)$'}, ...
|
||||||
|
'Interpreter', 'latex', ...
|
||||||
|
'FontName', 'Times New Roman', ...
|
||||||
|
'FontSize', 14, ...
|
||||||
|
'FontWeight', 'normal', ...
|
||||||
|
'FontAngle', 'normal')
|
||||||
|
title(gca, 'Real Space', ...
|
||||||
|
'Interpreter', 'tex', ...
|
||||||
|
'FontName', 'Times New Roman', ...
|
||||||
|
'FontSize', 14, ...
|
||||||
|
'FontWeight', 'normal', ...
|
||||||
|
'FontAngle', 'normal')
|
||||||
|
|
||||||
|
% Plot Fourier space grid in a similar style
|
||||||
|
[KX, KY] = meshgrid(Transf.kx, Transf.ky); % Create 2D mesh grid from kx and ky
|
||||||
|
|
||||||
|
subplot(1,2,2)
|
||||||
|
hold on
|
||||||
|
|
||||||
|
% Plot the grid lines
|
||||||
|
for i = 1:size(KX, 1)
|
||||||
|
plot(KX(i,:), KY(i,:), 'k'); % Plot horizontal grid lines
|
||||||
|
end
|
||||||
|
for j = 1:size(KX, 2)
|
||||||
|
plot(KX(:,j), KY(:,j), 'k'); % Plot vertical grid lines
|
||||||
|
end
|
||||||
|
|
||||||
|
axis equal % Ensure equal scaling for both axes
|
||||||
|
|
||||||
|
% Set axes labels
|
||||||
|
xlabel(gca, {'$k_x / l_o ~ (m^{-1})$'}, ...
|
||||||
|
'Interpreter', 'latex', ...
|
||||||
|
'FontName', 'Times New Roman', ...
|
||||||
|
'FontSize', 14, ...
|
||||||
|
'FontWeight', 'normal', ...
|
||||||
|
'FontAngle', 'normal')
|
||||||
|
ylabel(gca, {'$k_y / l_o ~ (m^{-1})$'}, ...
|
||||||
|
'Interpreter', 'latex', ...
|
||||||
|
'FontName', 'Times New Roman', ...
|
||||||
|
'FontSize', 14, ...
|
||||||
|
'FontWeight', 'normal', ...
|
||||||
|
'FontAngle', 'normal')
|
||||||
|
title(gca, 'Fourier Space', ...
|
||||||
|
'Interpreter', 'tex', ...
|
||||||
|
'FontName', 'Times New Roman', ...
|
||||||
|
'FontSize', 14, ...
|
||||||
|
'FontWeight', 'normal', ...
|
||||||
|
'FontAngle', 'normal')
|
||||||
|
end
|
@ -32,12 +32,12 @@ OptionsStruct.SaveDirectory = './Data';
|
|||||||
options = Helper.convertstruct2cell(OptionsStruct);
|
options = Helper.convertstruct2cell(OptionsStruct);
|
||||||
clear OptionsStruct
|
clear OptionsStruct
|
||||||
|
|
||||||
sim = Simulator.DipolarGas(options{:});
|
sim = Simulator.DipolarGas(options{:});
|
||||||
pot = Simulator.Potentials(options{:});
|
pot = Simulator.Potentials(options{:});
|
||||||
sim.Potential = pot.trap(); % + pot.repulsive_chopstick();
|
sim.Potential = pot.trap(); % + pot.repulsive_chopstick();
|
||||||
|
|
||||||
%-% Run Simulation %-%
|
%-% Run Simulation %-%
|
||||||
[Params, Transf, psi, V, VDk] = sim.run();
|
[Params, Transf, psi, V, VDk] = sim.run();
|
||||||
|
|
||||||
%% - Plot numerical grid
|
%% - Plot numerical grid
|
||||||
Plotter.visualizeSpace(Transf)
|
Plotter.visualizeSpace(Transf)
|
||||||
@ -59,12 +59,12 @@ OptionsStruct.ScatteringLength = 90;
|
|||||||
|
|
||||||
OptionsStruct.TrapFrequencies = [44.97, 10.4, 126.3];
|
OptionsStruct.TrapFrequencies = [44.97, 10.4, 126.3];
|
||||||
|
|
||||||
OptionsStruct.NumberOfGridPoints = [128, 256, 128];
|
OptionsStruct.NumberOfGridPoints = [50, 50];
|
||||||
OptionsStruct.Dimensions = [50, 120, 150];
|
OptionsStruct.Dimensions = [100, 100];
|
||||||
OptionsStruct.TimeStepSize = 500E-6; % in s
|
OptionsStruct.TimeStepSize = 1E-3; % in s
|
||||||
OptionsStruct.NumberOfTimeSteps = 100; % in s
|
OptionsStruct.TimeCutOff = 2E6; % in s
|
||||||
OptionsStruct.EnergyTolerance = 5E-10;
|
OptionsStruct.EnergyTolerance = 5E-10;
|
||||||
OptionsStruct.ResidualTolerance = 1E-05;
|
OptionsStruct.ResidualTolerance = 1E-04;
|
||||||
|
|
||||||
OptionsStruct.JobNumber = 1;
|
OptionsStruct.JobNumber = 1;
|
||||||
OptionsStruct.RunOnGPU = false;
|
OptionsStruct.RunOnGPU = false;
|
||||||
@ -73,16 +73,15 @@ OptionsStruct.SaveDirectory = './Data';
|
|||||||
options = Helper.convertstruct2cell(OptionsStruct);
|
options = Helper.convertstruct2cell(OptionsStruct);
|
||||||
clear OptionsStruct
|
clear OptionsStruct
|
||||||
|
|
||||||
solver = Variational2D.DipolarGas(options{:});
|
solver = Variational2D.DipolarGas(options{:});
|
||||||
|
|
||||||
%-% Run Solver %-%
|
%-% Run Solver %-%
|
||||||
[Params, Transf, psi, V, VDk] = solver.run();
|
[Params, Transf, psi, V, VDk] = solver.run();
|
||||||
|
|
||||||
%% - Plot numerical grid
|
%% - Plot numerical grid
|
||||||
Plotter.visualizeSpace(Transf)
|
Plotter.visualizeSpace2D(Transf)
|
||||||
%% - Plot trap potential
|
|
||||||
Plotter.visualizeTrapPotential(sim.Potential,Params,Transf)
|
|
||||||
%% - Plot initial wavefunction
|
%% - Plot initial wavefunction
|
||||||
Plotter.visualizeWavefunction(psi,Params,Transf)
|
Plotter.visualizeWavefunction2D(psi,Params,Transf)
|
||||||
%% - Plot GS wavefunction
|
%% - Plot GS wavefunction
|
||||||
Plotter.visualizeGSWavefunction(Params.njob)
|
Plotter.visualizeGSWavefunction2D(Params.njob)
|
||||||
|
|
||||||
|
@ -11,11 +11,11 @@ classdef DipolarGas < handle & matlab.mixin.Copyable
|
|||||||
|
|
||||||
SimulationMode;
|
SimulationMode;
|
||||||
TimeStepSize;
|
TimeStepSize;
|
||||||
NumberOfTimeSteps;
|
MinimumTimeStepSize;
|
||||||
|
TimeCutOff;
|
||||||
EnergyTolerance;
|
EnergyTolerance;
|
||||||
ResidualTolerance;
|
ResidualTolerance;
|
||||||
MinimumTimeStepSize;
|
|
||||||
|
|
||||||
Calculator;
|
Calculator;
|
||||||
|
|
||||||
SimulationParameters;
|
SimulationParameters;
|
||||||
@ -51,14 +51,14 @@ classdef DipolarGas < handle & matlab.mixin.Copyable
|
|||||||
@(x) assert(isnumeric(x) && isvector(x) && all(x > 0)));
|
@(x) assert(isnumeric(x) && isvector(x) && all(x > 0)));
|
||||||
addParameter(p, 'TimeStepSize', 5E-4,...
|
addParameter(p, 'TimeStepSize', 5E-4,...
|
||||||
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
||||||
addParameter(p, 'NumberOfTimeSteps', 2e6,...
|
addParameter(p, 'MinimumTimeStepSize', 1e-6,...
|
||||||
|
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
||||||
|
addParameter(p, 'TimeCutOff', 2e6,...
|
||||||
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
||||||
addParameter(p, 'EnergyTolerance', 1e-10,...
|
addParameter(p, 'EnergyTolerance', 1e-10,...
|
||||||
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
||||||
addParameter(p, 'ResidualTolerance', 1e-10,...
|
addParameter(p, 'ResidualTolerance', 1e-10,...
|
||||||
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
|
||||||
addParameter(p, 'MinimumTimeStepSize', 1e-6,...
|
|
||||||
@(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, 'RunOnGPU', false,...
|
addParameter(p, 'RunOnGPU', false,...
|
||||||
@ -80,11 +80,10 @@ classdef DipolarGas < handle & matlab.mixin.Copyable
|
|||||||
this.NumberOfGridPoints = p.Results.NumberOfGridPoints;
|
this.NumberOfGridPoints = p.Results.NumberOfGridPoints;
|
||||||
this.Dimensions = p.Results.Dimensions;
|
this.Dimensions = p.Results.Dimensions;
|
||||||
this.TimeStepSize = p.Results.TimeStepSize;
|
this.TimeStepSize = p.Results.TimeStepSize;
|
||||||
this.NumberOfTimeSteps = p.Results.NumberOfTimeSteps;
|
this.MinimumTimeStepSize = p.Results.MinimumTimeStepSize;
|
||||||
|
this.TimeCutOff = p.Results.TimeCutOff;
|
||||||
this.EnergyTolerance = p.Results.EnergyTolerance;
|
this.EnergyTolerance = p.Results.EnergyTolerance;
|
||||||
this.ResidualTolerance = p.Results.ResidualTolerance;
|
this.ResidualTolerance = p.Results.ResidualTolerance;
|
||||||
this.MinimumTimeStepSize = p.Results.MinimumTimeStepSize;
|
|
||||||
|
|
||||||
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;
|
||||||
@ -106,12 +105,12 @@ classdef DipolarGas < handle & matlab.mixin.Copyable
|
|||||||
function ret = get.TimeStepSize(this)
|
function ret = get.TimeStepSize(this)
|
||||||
ret = this.TimeStepSize;
|
ret = this.TimeStepSize;
|
||||||
end
|
end
|
||||||
function set.NumberOfTimeSteps(this, val)
|
function set.TimeCutOff(this, val)
|
||||||
assert(val <= 2E6, 'Not time efficient to compute for time spans longer than 2E6 seconds!');
|
assert(val <= 2E6, 'Not efficient to compute for time spans longer than 2E6 seconds!');
|
||||||
this.NumberOfTimeSteps = val;
|
this.TimeCutOff = val;
|
||||||
end
|
end
|
||||||
function ret = get.NumberOfTimeSteps(this)
|
function ret = get.TimeCutOff(this)
|
||||||
ret = this.NumberOfTimeSteps;
|
ret = this.TimeCutOff;
|
||||||
end
|
end
|
||||||
function set.NumberOfAtoms(this, val)
|
function set.NumberOfAtoms(this, val)
|
||||||
assert(val <= 1E6, '!!Not time efficient to compute for atom numbers larger than 1,000,000!!');
|
assert(val <= 1E6, '!!Not time efficient to compute for atom numbers larger than 1,000,000!!');
|
||||||
|
@ -27,7 +27,7 @@ function [Params, Transf, psi, V, VDk] = run(this)
|
|||||||
E_vs_iter(1) = E_Var([ells(1) nus(1)]);
|
E_vs_iter(1) = E_Var([ells(1) nus(1)]);
|
||||||
|
|
||||||
t_idx = 1; % Start at t = 0;
|
t_idx = 1; % Start at t = 0;
|
||||||
|
|
||||||
for nn = 1:Params.SelfConIter
|
for nn = 1:Params.SelfConIter
|
||||||
Observ.EVec = []; Observ.NormVec = []; Observ.PCVec = []; Observ.tVecPlot = []; Observ.mucVec = [];
|
Observ.EVec = []; Observ.NormVec = []; Observ.PCVec = []; Observ.tVecPlot = []; Observ.mucVec = [];
|
||||||
Observ.res_idx = 1;
|
Observ.res_idx = 1;
|
||||||
|
@ -42,11 +42,11 @@ function [Params] = setupParameters(this)
|
|||||||
% Tolerances
|
% Tolerances
|
||||||
Params.Etol = this.EnergyTolerance;
|
Params.Etol = this.EnergyTolerance;
|
||||||
Params.rtol = this.ResidualTolerance;
|
Params.rtol = this.ResidualTolerance;
|
||||||
Params.sim_time_cut_off = this.NumberOfTimeSteps; % sometimes the imaginary time gets a little stuck
|
Params.sim_time_cut_off = this.TimeCutOff; % sometimes the imaginary time gets a little stuck
|
||||||
% even though the solution is good, this just stops it going on forever
|
% even though the solution is good, this just stops it going on forever
|
||||||
Params.mindt = this.MinimumTimeStepSize; % Minimum size for a time step using adaptive dt
|
Params.mindt = this.MinimumTimeStepSize; % Minimum size for a time step using adaptive dt
|
||||||
|
|
||||||
Params.njob = this.JobNumber;
|
Params.njob = this.JobNumber;
|
||||||
|
|
||||||
|
|
||||||
% ================ Variational method parameters ================ %
|
% ================ Variational method parameters ================ %
|
||||||
|
Loading…
Reference in New Issue
Block a user