latest commit

This commit is contained in:
Karthik 2024-06-13 02:02:44 +02:00
parent a1e0ad544e
commit 7cab430c05
14 changed files with 381 additions and 70 deletions

View File

@ -25,6 +25,7 @@ classdef PhysicsConstants < handle
% Dy specific constants % Dy specific constants
Dy164Mass = 163.929174751*1.660539066E-27; Dy164Mass = 163.929174751*1.660539066E-27;
Dy164IsotopicAbundance = 0.2826; Dy164IsotopicAbundance = 0.2826;
DyMagneticMoment = 9.93*9.274009994E-24;
end end
methods methods

View File

@ -0,0 +1,94 @@
function visualizeDDIPotential(Transf)
x = Transf.x;
y = Transf.y;
z = Transf.z;
[X,Y] = meshgrid(x,y);
height = 20;
width = 45;
figure(1)
clf
set(gcf, 'Units', 'centimeters')
set(gcf, 'Position', [2 4 width height])
set(gcf, 'PaperPositionMode', 'auto')
subplot(1,2,1)
zlin = ones(size(X, 1)) * z(1); % Generate z data
mesh(x, y, zlin, 'EdgeColor','b') % Plot the surface
hold on
for idx = 2:length(z)
zlin = ones(size(X, 1))* z(idx); % Generate z data
mesh(x, y, zlin, 'EdgeColor','b') % Plot the surface
end
% set the axes labels' properties
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')
zlabel(gca, {'$z / 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')
x = Transf.kx;
y = Transf.ky;
z = Transf.kz;
[X,Y] = meshgrid(x,y);
subplot(1,2,2)
zlin = ones(size(X, 1)) * z(1); % Generate z data
mesh(x, y, zlin, 'EdgeColor','b') % Plot the surface
hold on
for idx = 2:length(z)
zlin = ones(size(X, 1))* z(idx); % Generate z data
mesh(x, y, zlin, 'EdgeColor','b') % Plot the surface
end
% set the axes labels' properties
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')
zlabel(gca, {'$k_z / 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

View File

@ -50,12 +50,6 @@ function visualizeSpace(Transf)
'FontWeight', 'normal', ... 'FontWeight', 'normal', ...
'FontAngle', 'normal') 'FontAngle', 'normal')
x = Transf.kx;
y = Transf.ky;
z = Transf.kz;
[X,Y] = meshgrid(x,y);
subplot(1,2,2) subplot(1,2,2)
zlin = ones(size(X, 1)) * z(1); % Generate z data zlin = ones(size(X, 1)) * z(1); % Generate z data
mesh(x, y, zlin, 'EdgeColor','b') % Plot the surface mesh(x, y, zlin, 'EdgeColor','b') % Plot the surface

View File

@ -0,0 +1,95 @@
function visualizeTrapPotential(V,Params,Transf)
set(0,'defaulttextInterpreter','latex')
set(groot, 'defaultAxesTickLabelInterpreter','latex'); set(groot, 'defaultLegendInterpreter','latex');
format long
x = Transf.x*Params.l0*1e6;
y = Transf.y*Params.l0*1e6;
z = Transf.z*Params.l0*1e6;
dx = x(2)-x(1); dy = y(2)-y(1); dz = z(2)-z(1);
%Plotting
height = 10;
width = 35;
figure(1)
clf
set(gcf, 'Units', 'centimeters')
set(gcf, 'Position', [2 4 width height])
set(gcf, 'PaperPositionMode', 'auto')
subplot(1,3,1)
n = V;
nxz = squeeze(trapz(n*dy,2));
nyz = squeeze(trapz(n*dx,1));
nxy = squeeze(trapz(n*dz,3));
plotxz = pcolor(x,z,nxz');
set(plotxz, 'EdgeColor', 'none');
xlabel(gca, {'$x$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
ylabel(gca, {'$z$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
title(gca, {'$V_{xz}$'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
colorbar
subplot(1,3,2)
plotyz = pcolor(y,z,nyz');
set(plotyz, 'EdgeColor', 'none');
xlabel(gca, {'$y$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
ylabel(gca, {'$z$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
title(gca, {'$V_{yz}$'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
colorbar
subplot(1,3,3)
plotxy = pcolor(x,y,nxy');
set(plotxy, 'EdgeColor', 'none');
xlabel(gca, {'$x$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
ylabel(gca, {'$y$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
title(gca, {'$V_{xy}$'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
colorbar
end

View File

@ -0,0 +1,92 @@
function visualizeWavefunction(psi,Params,Transf)
set(0,'defaulttextInterpreter','latex')
set(groot, 'defaultAxesTickLabelInterpreter','latex'); set(groot, 'defaultLegendInterpreter','latex');
format long
x = Transf.x*Params.l0*1e6;
y = Transf.y*Params.l0*1e6;
z = Transf.z*Params.l0*1e6;
dx = x(2)-x(1); dy = y(2)-y(1); dz = z(2)-z(1);
%Plotting
height = 10;
width = 35;
figure(1)
clf
set(gcf, 'Units', 'centimeters')
set(gcf, 'Position', [2 4 width height])
set(gcf, 'PaperPositionMode', 'auto')
subplot(1,3,1)
n = abs(psi).^2;
nxz = squeeze(trapz(n*dy,2));
nyz = squeeze(trapz(n*dx,1));
nxy = squeeze(trapz(n*dz,3));
plotxz = pcolor(x,z,nxz');
set(plotxz, 'EdgeColor', 'none');
xlabel(gca, {'$x$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
ylabel(gca, {'$z$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
title(gca, {'$|\Psi_{xz}|^2$'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
subplot(1,3,2)
plotyz = pcolor(y,z,nyz');
set(plotyz, 'EdgeColor', 'none');
xlabel(gca, {'$y$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
ylabel(gca, {'$z$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
title(gca, {'$|\Psi_{yz}|^2$'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
subplot(1,3,3)
plotxy = pcolor(x,y,nxy');
set(plotxy, 'EdgeColor', 'none');
xlabel(gca, {'$x$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
ylabel(gca, {'$y$ ($\mu$m)'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
title(gca, {'$|\Psi_{xy}|^2$'}, ...
'Interpreter', 'latex', ...
'FontName', 'Times New Roman', ...
'FontSize', 14, ...
'FontWeight', 'normal', ...
'FontAngle', 'normal')
end

View File

@ -5,13 +5,23 @@
%% - Create Simulator, Potential and Calculator object with specified options %% - Create Simulator, Potential and Calculator object with specified options
OptionsStruct = struct; OptionsStruct = struct;
OptionsStruct.SimulationMode = 'ImaginaryTimeEvolution'; % 'ImaginaryTimeEvolution' | 'RealTimeEvolution'
OptionsStruct.NumberOfAtoms = 1E6;
OptionsStruct.DipolarAngle = pi/2;
OptionsStruct.ScatteringLength = 86;
OptionsStruct.TrapFrequencies = [125, 125, 250];
OptionsStruct.NumberOfPoints = [64, 64, 48];
OptionsStruct.Dimensions = [40, 40, 20];
OptionsStruct.CutoffType = 'Cylindrical'; OptionsStruct.CutoffType = 'Cylindrical';
OptionsStruct.PotentialType = 'Harmonic'; OptionsStruct.PotentialType = 'Harmonic';
OptionsStruct.SimulationMode = 'ImaginaryTimeEvolution'; % 'ImaginaryTimeEvolution' | 'RealTimeEvolution'
OptionsStruct.TimeStep = 50e-06; % in s OptionsStruct.TimeStep = 50e-06; % in s
OptionsStruct.SimulationTime = 4e-03; % in s OptionsStruct.SimulationTime = 4e-03; % in s
OptionsStruct.SaveData = true; OptionsStruct.SaveData = true;
OptionsStruct.SaveDirectory = './Data'; OptionsStruct.SaveDirectory = './Data';
options = Helper.convertstruct2cell(OptionsStruct); options = Helper.convertstruct2cell(OptionsStruct);
clear OptionsStruct clear OptionsStruct
@ -23,4 +33,8 @@ pot = Simulator.Potentials(options{:});
[Params, Transf, psi, V, VDk] = sim.runSimulation(calc); [Params, Transf, psi, V, VDk] = sim.runSimulation(calc);
%% - Plot results %% - Plot results
Plotter.visualizeSpace(Transf) % Plotter.visualizeSpace(Transf)
Plotter.visualizeTrapPotential(V,Params,Transf)
% Plotter.visualizeWavefunction(psi,Params,Transf)

View File

@ -1,7 +1,7 @@
function VDkSemi = calculateNumericalHankelTransform(kr, kz, Rmax, Zmax, Nr) function VDkSemi = calculateNumericalHankelTransform(this,kr,kz,Rmax,Zmax,Nr)
% accuracy inputs for numerical integration % accuracy inputs for numerical integration
if(nargin==4) if(nargin==5)
Nr = 5e4; Nr = 5e4;
end end

View File

@ -1,4 +1,4 @@
function VDk = calculateVDCutoff(this, Params, Transf) function VDk = calculateVDCutoff(this,Params,Transf,TransfRad)
% makes the dipolar interaction matrix, size numel(Params.kr) * numel(Params.kz) % makes the dipolar interaction matrix, size numel(Params.kr) * numel(Params.kz)
% Rmax and Zmax are the interaction cutoffs % Rmax and Zmax are the interaction cutoffs
% VDk needs to be multiplied by Cdd % VDk needs to be multiplied by Cdd
@ -16,10 +16,7 @@ VDk = VDk + exp(-Zcutoff*sqrt(Transf.KX.^2+Transf.KY.^2)).*( sinsq .* cos(Zcut
% Nonanalytic part % Nonanalytic part
% For a cylindrical cutoff, we need to construct a kr grid based on the 3D parameters using Bessel quadrature % For a cylindrical cutoff, we need to construct a kr grid based on the 3D parameters using Bessel quadrature
Params.Lr = 0.5*min(Params.Lx,Params.Ly); VDkNon = this.calculateNumericalHankelTransform(TransfRad.kr, TransfRad.kz, TransfRad.Rmax, Zcutoff);
Params.Nr = max(Params.Nx,Params.Ny);
[TransfRad] = SetupSpaceRadial(Params);
VDkNon = this.calculateNumericalHankelTransform(TransfRad.kr, TransfRad.kz, TransfRad.Rmax, Zcutoff);
% Interpolating the nonanalytic part onto 3D grid % Interpolating the nonanalytic part onto 3D grid
fullkr = [-flip(TransfRad.kr)',TransfRad.kr']; fullkr = [-flip(TransfRad.kr)',TransfRad.kr'];

View File

@ -1,20 +1,21 @@
classdef DipolarGas < handle & matlab.mixin.Copyable classdef DipolarGas < handle & matlab.mixin.Copyable
properties (Access = public) properties (Access = public)
NumberOfAtoms;
DipolarAngle;
ScatteringLength;
TrapFrequencies;
NumberOfPoints;
Dimensions;
CutoffType;
PotentialType;
SimulationMode; SimulationMode;
TimeStep; TimeStep;
SimulationTime; SimulationTime;
NumberOfAtoms;
% Etol = 5e-10; % Tolerances
% rtol = 1e-5;
% cut_off = 2e6; % sometimes the imaginary time gets a little stuck
% even though the solution is good, this just stops it going on forever
% mindt = 1e-6; %Minimum size for a time step using adaptive dt
%Flags %Flags
DebugMode; DebugMode;
DoSave; DoSave;
SaveDirectory; SaveDirectory;
@ -28,27 +29,41 @@ classdef DipolarGas < handle & matlab.mixin.Copyable
p = inputParser; p = inputParser;
p.KeepUnmatched = true; p.KeepUnmatched = true;
addParameter(p, 'NumberOfAtoms', 1E6,...
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
addParameter(p, 'DipolarAngle', pi/2,...
@(x) assert(isnumeric(x) && isscalar(x) && (x > -2*pi) && (x < 2*pi)));
addParameter(p, 'ScatteringLength', 120,...
@(x) assert(isnumeric(x) && isscalar(x) && (x > -150) && (x < 150)));
addParameter(p, 'TrapFrequencies', 100 * ones(1,3),...
@(x) assert(isnumeric(x) && isvector(x) && all(x > 0)));
addParameter(p, 'NumberOfPoints', 128 * ones(1,3),...
@(x) assert(isnumeric(x) && isvector(x) && all(x > 0)));
addParameter(p, 'Dimensions', 10 * ones(1,3),...
@(x) assert(isnumeric(x) && isvector(x) && all(x > 0)));
addParameter(p, 'SimulationMode', 'ImaginaryTimeEvolution',... addParameter(p, 'SimulationMode', 'ImaginaryTimeEvolution',...
@(x) any(strcmpi(x,{'ImaginaryTimeEvolution','RealTimeEvolution'}))); @(x) any(strcmpi(x,{'ImaginaryTimeEvolution','RealTimeEvolution'})));
addParameter(p, 'NumberOfAtoms', 5000,... addParameter(p, 'TimeStep', 5E-4,...
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0))); @(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
addParameter(p, 'TimeStep', 0.0005,... addParameter(p, 'SimulationTime', 3,...
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0))); @(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
addParameter(p, 'SimulationTime', 3e-03,... addParameter(p, 'DebugMode', false,...
@(x) assert(isnumeric(x) && isscalar(x) && (x > 0)));
addParameter(p, 'DebugMode', false,...
@islogical); @islogical);
addParameter(p, 'SaveData', false,... addParameter(p, 'SaveData', false,...
@islogical); @islogical);
addParameter(p, 'SaveDirectory', './Data',... addParameter(p, 'SaveDirectory', './Data',...
@ischar); @ischar);
p.parse(varargin{:}); p.parse(varargin{:});
this.SimulationMode = p.Results.SimulationMode;
this.ErrorEstimationMethod= p.Results.ErrorEstimationMethod;
this.NumberOfAtoms = p.Results.NumberOfAtoms; this.NumberOfAtoms = p.Results.NumberOfAtoms;
this.DipolarAngle = p.Results.DipolarAngle;
this.ScatteringLength = p.Results.ScatteringLength;
this.TrapFrequencies = p.Results.TrapFrequencies;
this.NumberOfPoints = p.Results.NumberOfPoints;
this.Dimensions = p.Results.Dimensions;
this.SimulationMode = p.Results.SimulationMode;
this.TimeStep = p.Results.TimeStep; this.TimeStep = p.Results.TimeStep;
this.SimulationTime = p.Results.SimulationTime; this.SimulationTime = p.Results.SimulationTime;
@ -81,7 +96,7 @@ classdef DipolarGas < handle & matlab.mixin.Copyable
ret = this.SimulationTime; ret = this.SimulationTime;
end end
function set.NumberOfAtoms(this, val) function set.NumberOfAtoms(this, val)
assert(val <= 50000, '!!Not time efficient to compute for atom numbers larger than 50,000!!'); assert(val <= 1E6, '!!Not time efficient to compute for atom numbers larger than 1,000,000!!');
this.NumberOfAtoms = val; this.NumberOfAtoms = val;
end end
function ret = get.NumberOfAtoms(this) function ret = get.NumberOfAtoms(this)

View File

@ -1,4 +1,4 @@
function [psi,V,VDk] = initialize(this,calcObj,Params,Transf) function [psi,V,VDk] = initialize(this,calcObj,Params,Transf,TransfRad)
format long format long
X = Transf.X; Y = Transf.Y; Z = Transf.Z; X = Transf.X; Y = Transf.Y; Z = Transf.Z;
@ -11,12 +11,12 @@ if isfile(strcat(this.SaveDirectory, '/VDk_M.mat'))
VDk = load(sprintf(strcat(this.SaveDirectory, '/VDk_M.mat'))); VDk = load(sprintf(strcat(this.SaveDirectory, '/VDk_M.mat')));
VDk = VDk.VDk; VDk = VDk.VDk;
else else
VDk = calcObj.calculateVDCutoff(Params, Transf); VDk = calcObj.calculateVDCutoff(Params,Transf,TransfRad);
save(sprintf(strcat(this.SaveDirectory, '/VDk_M.mat')),'VDk'); save(sprintf(strcat(this.SaveDirectory, '/VDk_M.mat')),'VDk');
end end
disp('Finished DDI') disp('Finished DDI')
% == Setting up the initial wavefunction == % % == Setting up the initial wavefunction == %
psi = this.SetupWavefunction(); psi = this.setupWavefunction(Params,Transf);
end end

View File

@ -4,11 +4,12 @@ function [Params, Transf, psi,V,VDk] = runSimulation(this,calcObj)
% --- Set up spatial grids and transforms --- % --- Set up spatial grids and transforms ---
[Transf] = this.setupSpace(Params); [Transf] = this.setupSpace(Params);
[TransfRad] = this.setupSpaceRadial(Params);
% --- Initialize --- % --- Initialize ---
mkdir(sprintf(this.SaveDirectory)) mkdir(sprintf(this.SaveDirectory))
[psi,V,VDk] = this.initialize(calcObj,Params,Transf); [psi,V,VDk] = this.initialize(calcObj,Params,Transf,TransfRad);
Observ.EVec = []; Observ.NormVec = []; Observ.PCVec = []; Observ.tVecPlot = []; Observ.mucVec = []; Observ.EVec = []; Observ.NormVec = []; Observ.PCVec = []; Observ.tVecPlot = []; Observ.mucVec = [];
t_idx = 1; %Start at t = 0; t_idx = 1; %Start at t = 0;

View File

@ -1,6 +1,5 @@
function [Params] = setupParameters(this) function [Params] = setupParameters(this)
%========= Constants =========%
CONSTANTS = Helper.PhysicsConstants; CONSTANTS = Helper.PhysicsConstants;
hbar = CONSTANTS.PlanckConstantReduced; % [J.s] hbar = CONSTANTS.PlanckConstantReduced; % [J.s]
kbol = CONSTANTS.BoltzmannConstant; % [J/K] kbol = CONSTANTS.BoltzmannConstant; % [J/K]
@ -11,44 +10,47 @@ m0 = CONSTANTS.AtomicMassUnit; % [kg]
w0 = 2*pi*100; % Angular frequency unit [s^-1] w0 = 2*pi*100; % Angular frequency unit [s^-1]
mu0factor = 0.3049584233607396; % =(m0/me)*pi*alpha^2 -- me=mass of electron, alpha=fine struct. const. mu0factor = 0.3049584233607396; % =(m0/me)*pi*alpha^2 -- me=mass of electron, alpha=fine struct. const.
% mu0=mu0factor *hbar^2*a0/(m0*muB^2) % mu0=mu0factor *hbar^2*a0/(m0*muB^2)
%=============================%
% Number of points in each direction % Number of points in each direction
Params.Nx = 64; Params.Nx = this.NumberOfPoints(1);
Params.Ny = 64; Params.Ny = this.NumberOfPoints(2);
Params.Nz = 48; Params.Nz = this.NumberOfPoints(3);
% Dimensions (in units of l0) % Dimensions (in units of l0)
Params.Lx = 40; Params.Lx = this.Dimensions(1);
Params.Ly = 40; Params.Ly = this.Dimensions(2);
Params.Lz = 20; Params.Lz = this.Dimensions(3);
% Masses % Masses
Params.m = CONSTANTS.Dy164Mass; Params.m = CONSTANTS.Dy164Mass;
l0 = sqrt(hbar/(Params.m*w0)); % Defining a harmonic oscillator length l0 = sqrt(hbar/(Params.m*w0)); % Defining a harmonic oscillator length
% Atom numbers % Atom numbers
% Params.ppum = 2500; % particles per micron Params.N = this.NumberOfAtoms;
% Params.N = Params.Lz*Params.ppum*l0*1e6;
Params.N = 10^6;
% Dipole angle % Dipole angle
Params.theta = pi/2; % pi/2 dipoles along x, theta=0 dipoles along z Params.theta = this.DipolarAngle; % pi/2 dipoles along x, theta=0 dipoles along z
Params.phi = 0;
% Dipole lengths (units of muB) % Dipole lengths (units of muB)
Params.mu = 9.93*muB; Params.mu = CONSTANTS.DyMagneticMoment;
% Scattering lengths % Scattering lengths
Params.as = 86*a0; Params.as = this.ScatteringLength*a0;
% Trapping frequencies % Trapping frequencies
Params.wx = 2*pi*125; Params.wx = 2*pi*this.TrapFrequencies(1);
Params.wy = 2*pi*125; Params.wy = 2*pi*this.TrapFrequencies(2);
Params.wz = 2*pi*250; Params.wz = 2*pi*this.TrapFrequencies(3);
% Stochastic GPE % Stochastic GPE
Params.gamma_S = 7.5*10^(-3); % gamma for the stochastic GPE Params.gamma_S = 7.5*10^(-3); % gamma for the stochastic GPE
Params.muchem = 12.64*Params.wz/w0; % fixing the chemical potential for the stochastic GPE Params.muchem = 12.64*Params.wz/w0; % fixing the chemical potential for the stochastic GPE
Params.Etol = 5e-10; % Tolerances
Params.rtol = 1e-5;
Params.cut_off = 2e6; % sometimes the imaginary time gets a little stuck
% even though the solution is good, this just stops it going on forever
Params.mindt = 1e-6; % Minimum size for a time step using adaptive dt
% ================ Parameters defined by those above ================ % % ================ Parameters defined by those above ================ %
@ -59,7 +61,7 @@ Params.gs = 4*pi*Params.as/l0;
Params.add = mu0*Params.mu^2*Params.m/(12*pi*hbar^2); Params.add = mu0*Params.mu^2*Params.m/(12*pi*hbar^2);
% DDI strength % DDI strength
Params.gdd = 12*pi*Params.add/l0; %sometimes the 12 is a 4? --> depends on how Vdk (DDI) is defined Params.gdd = 12*pi*Params.add/l0; %sometimes the 12 is a 4 --> depends on how Vdk (DDI) is defined
% Trap gamma % Trap gamma
Params.gx=(Params.wx/w0)^2; Params.gx=(Params.wx/w0)^2;

View File

@ -1,10 +1,14 @@
function [Transf] = setupSpaceRadial(this,Params,morder) function [Transf] = setupSpaceRadial(this,Params,morder)
Params.Lr = 0.5*min(Params.Lx,Params.Ly);
Params.Nr = max(Params.Nx,Params.Ny);
Zmax = 0.5*Params.Lz; Zmax = 0.5*Params.Lz;
Rmax = Params.Lr; Rmax = Params.Lr;
Nz = Params.Nz; Nz = Params.Nz;
Nr = Params.Nr; Nr = Params.Nr;
if(nargin==1) if(nargin==2)
morder=0; %only do Bessel J0 morder=0; %only do Bessel J0
end end
@ -42,7 +46,7 @@ Transf.dz=z(2)-z(1);
Transf.dkz=kz(2)-kz(1); Transf.dkz=kz(2)-kz(1);
%b1=Transf; %b1=Transf;
function s_HT = hankelmatrix(order, rmax, Nr, eps_roots) function s_HT = hankelmatrix(order,rmax,Nr,eps_roots)
%HANKEL_MATRIX: Generates data to use for Hankel Transforms %HANKEL_MATRIX: Generates data to use for Hankel Transforms
% %
% s_HT = hankel_matrix(order, rmax, Nr, eps_roots) % s_HT = hankel_matrix(order, rmax, Nr, eps_roots)
@ -132,7 +136,7 @@ s_HT.wk=2./((s_HT.rmax)^2*abs(Jp1).^2);
return return
function z = bessel_zeros(d, a, n, e) function z = bessel_zeros(d,a,n,e)
%BESSEL_ZEROS: Finds the first n zeros of a bessel function %BESSEL_ZEROS: Finds the first n zeros of a bessel function
% %
% z = bessel_zeros(d, a, n, e) % z = bessel_zeros(d, a, n, e)
@ -293,7 +297,7 @@ function FI = fi(y)
end end
return return
function Jr = bessr(d, a, x) function Jr = bessr(d,a,x)
switch (d) switch (d)
case (1) case (1)
Jr = besselj(a, x)./besselj(a+1, x); Jr = besselj(a, x)./besselj(a+1, x);

View File

@ -1,4 +1,6 @@
function [psi] = setupWavefunction(this) function [psi] = setupWavefunction(this,Params,Transf)
X = Transf.X; Y = Transf.Y; Z = Transf.Z;
ellx = sqrt(Params.hbar/(Params.m*Params.wx))/Params.l0; ellx = sqrt(Params.hbar/(Params.m*Params.wx))/Params.l0;
elly = sqrt(Params.hbar/(Params.m*Params.wy))/Params.l0; elly = sqrt(Params.hbar/(Params.m*Params.wy))/Params.l0;
@ -7,15 +9,15 @@ ellz = sqrt(Params.hbar/(Params.m*Params.wz))/Params.l0;
Rx = 8*ellx; Ry = 8*elly; Rz = 8*ellz; Rx = 8*ellx; Ry = 8*elly; Rz = 8*ellz;
X0 = 0.0*Transf.Xmax; Y0 = 0.0*Transf.Ymax; Z0 = 0*Transf.Zmax; X0 = 0.0*Transf.Xmax; Y0 = 0.0*Transf.Ymax; Z0 = 0*Transf.Zmax;
psi = exp(-(X-X0).^2/Rx^2-(Y-Y0).^2/Ry^2-(Z-Z0).^2/Rz^2); psi = exp(-(X-X0).^2/Rx^2-(Y-Y0).^2/Ry^2-(Z-Z0).^2/Rz^2);
cur_norm = trapz(abs(psi(:)).^2)*Transf.dx*Transf.dy*Transf.dz; cur_norm = trapz(abs(psi(:)).^2)*Transf.dx*Transf.dy*Transf.dz;
psi = psi/sqrt(cur_norm); psi = psi/sqrt(cur_norm);
%add some noise % add some noise
r = normrnd(0,1,size(X)); r = normrnd(0,1,size(X));
theta = rand(size(X)); theta = rand(size(X));
noise = r.*exp(2*pi*1i*theta); noise = r.*exp(2*pi*1i*theta);
psi = 0*psi + 1*noise; psi = psi + 0.01*noise;
Norm = trapz(abs(psi(:)).^2)*Transf.dx*Transf.dy*Transf.dz; Norm = trapz(abs(psi(:)).^2)*Transf.dx*Transf.dy*Transf.dz;
psi = sqrt(Params.N)*psi/sqrt(Norm); psi = sqrt(Params.N)*psi/sqrt(Norm);