Latest modified scripts to generate phase diagram

This commit is contained in:
Karthik 2025-05-10 00:36:17 +02:00
parent 78f435df89
commit 044db810e2
7 changed files with 98 additions and 97 deletions

View File

@ -53,16 +53,16 @@ function run_hybrid_worker_for_phase_boundary(batchParams, batchIdx)
OptionsStruct.TrapPotentialType = 'Harmonic'; OptionsStruct.TrapPotentialType = 'Harmonic';
OptionsStruct.NumberOfGridPoints = [128, 256, 128]; OptionsStruct.NumberOfGridPoints = [128, 256, 128];
OptionsStruct.Dimensions = [30, 50, 30]; OptionsStruct.Dimensions = [40, 80, 40];
OptionsStruct.UseApproximationForLHY = true; OptionsStruct.UseApproximationForLHY = true;
OptionsStruct.IncludeDDICutOff = true; OptionsStruct.IncludeDDICutOff = true;
OptionsStruct.CutoffType = 'CustomCylindrical'; OptionsStruct.CutoffType = 'Cylindrical';
OptionsStruct.CustomCylindricalCutOffRadius = 12; OptionsStruct.SimulationMode = 'ImaginaryTimeEvolution'; % 'ImaginaryTimeEvolution' | 'RealTimeEvolution' | 'EnergyMinimization'
OptionsStruct.CustomCylindricalCutOffHeight = 10; OptionsStruct.GradientDescentMethod = 'NonLinearCGD'; % 'HeavyBall' | 'NonLinearCGD'
OptionsStruct.SimulationMode = 'ImaginaryTimeEvolution'; OptionsStruct.MaxIterationsForGD = 15000;
OptionsStruct.TimeStepSize = 5E-4; OptionsStruct.TimeStepSize = 1E-3; % in s
OptionsStruct.MinimumTimeStepSize = 2E-6; OptionsStruct.MinimumTimeStepSize = 1E-6; % in s
OptionsStruct.TimeCutOff = 1E5; OptionsStruct.TimeCutOff = 1E6; % in s
OptionsStruct.EnergyTolerance = 5E-10; OptionsStruct.EnergyTolerance = 5E-10;
OptionsStruct.ResidualTolerance = 1E-05; OptionsStruct.ResidualTolerance = 1E-05;
OptionsStruct.NoiseScaleFactor = 0.010; OptionsStruct.NoiseScaleFactor = 0.010;

View File

@ -549,7 +549,11 @@ SaveDirectory = './Results/Data_3D/AnisotropicTrap/TiltedDipoles45';
JobNumber = 0; JobNumber = 0;
Plotter.visualizeGSWavefunction(SaveDirectory, JobNumber) Plotter.visualizeGSWavefunction(SaveDirectory, JobNumber)
%% %%
SaveDirectory = './Results/Data_3D/GradientDescent/Phi020/aS_090_theta_020_phi_000_N_100000'; SaveDirectory = './Results/Data_3D/GradientDescent/aS_088_theta_000_phi_000_N_750000';
JobNumber = 0;
Plotter.visualizeGSWavefunction(SaveDirectory, JobNumber)
%%
SaveDirectory = './Results/Data_3D/PhaseDiagram/ImagTimePropagation/aS_9.458000e+01_theta_000_phi_000_N_304167';
JobNumber = 0; JobNumber = 0;
Plotter.visualizeGSWavefunction(SaveDirectory, JobNumber) Plotter.visualizeGSWavefunction(SaveDirectory, JobNumber)
%% %%
@ -588,7 +592,11 @@ end
%% %%
SaveDirectory = './Results/Data_3D/GradientDescent/'; SaveDirectory = './Results/Data_3D/GradientDescent/';
JobNumber = 1; JobNumber = 0;
Plotter.visualizeGSWavefunction(SaveDirectory, JobNumber)
%%
SaveDirectory = './Results/Data_3D/ImagTimeProp/';
JobNumber = 0;
Plotter.visualizeGSWavefunction(SaveDirectory, JobNumber) Plotter.visualizeGSWavefunction(SaveDirectory, JobNumber)
%% Visualize phase diagram %% Visualize phase diagram
@ -619,8 +627,11 @@ grid on;
%% Density modulation determination %% Density modulation determination
SaveDirectory = './Results/Data_3D/GradientDescent/Phi030/aS_079_theta_030_phi_000_N_100000'; % SaveDirectory = './Results/Data_3D/GradientDescent/Phi020/aS_090_theta_020_phi_000_N_100000';
JobNumber = 0; % JobNumber = 0;
SaveDirectory = './Results/Data_3D/PhaseDiagram';
JobNumber = 1;
% Load data % Load data
Data = load(sprintf(horzcat(SaveDirectory, '/Run_%03i/psi_gs.mat'),JobNumber),'psi','Params','Transf','Observ'); Data = load(sprintf(horzcat(SaveDirectory, '/Run_%03i/psi_gs.mat'),JobNumber),'psi','Params','Transf','Observ');
@ -670,7 +681,7 @@ function ModulationFlag = determineDensityModulation(psi, Params, Transf)
smoothedProfile = smooth(densityProfile, 10); smoothedProfile = smooth(densityProfile, 10);
% Step 2: Compute the residual (original - smoothed) % Step 2: Compute the residual (original - smoothed)
residual = densityProfile - smoothedProfile; % We do this residual = densityProfile - smoothedProfile;
% Step 3: Compute the Fourier Transform of the residual % Step 3: Compute the Fourier Transform of the residual
N = length(residual); N = length(residual);
@ -679,9 +690,11 @@ function ModulationFlag = determineDensityModulation(psi, Params, Transf)
P1 = P2(1:N/2+1); % Single-sided spectrum P1 = P2(1:N/2+1); % Single-sided spectrum
P1(2:end-1) = 2*P1(2:end-1); % Correct for the energy in the negative frequencies P1(2:end-1) = 2*P1(2:end-1); % Correct for the energy in the negative frequencies
P1 = P1(15:end);
% Step 4: Check for significant peaks in the Fourier spectrum % Step 4: Check for significant peaks in the Fourier spectrum
% We check if the peak frequency is above a certain threshold % We check if the peak frequency is above a certain threshold
threshold = 1E-3; % This can be adjusted based on the expected modulation strength threshold = 500; % This can be adjusted based on the expected modulation strength
peakValue = max(P1); peakValue = max(P1);
if peakValue > threshold if peakValue > threshold
@ -690,3 +703,60 @@ function ModulationFlag = determineDensityModulation(psi, Params, Transf)
ModulationFlag = false; % Indicates otherwise ModulationFlag = false; % Indicates otherwise
end end
end end
%% Generate lists
% Set display format
format longG
% Generate the lists
list1 = linspace(1E5, 5E6, 25);
list2 = linspace(80, 105, 25);
% Convert to strings with no scientific notation
str_list1 = compose('%.0f', list1);
str_list2 = compose('%.2f', list2);
% Join as space-separated strings
row1 = strjoin(str_list1', ' ');
row2 = strjoin(str_list2', ' ');
% Display results
disp(row1)
disp(row2)
%% Phase diagram for untilted case
N = [1E5, 3.04E5, 5.08E5, 7.125E5, 9.16E5, 1.12E6, 1.325E6, 1.529E6, ...
1.733E6, 1.9375E6, 2.141E6, 2.345E6, 2.55E6, 2.75E6, 2.95E6, ...
3.1625E6, 3.367E6, 3.57E6, 3.775E6, 3.979E6, 4.183E6, 4.3875E6, ...
4.591E6, 4.795E6, 5E6];
as_LB = [87.29, 93.54, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, ...
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN];
as_UB = [88.33, 94.58, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, ...
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN];
% Filter only rows with non-NaN data
valid_idx = ~isnan(as_LB) & ~isnan(as_UB);
N_valid = N(valid_idx);
LB_valid = as_LB(valid_idx);
UB_valid = as_UB(valid_idx);
% Create shaded area between LB and UB
x_fill = [N_valid, fliplr(N_valid)];
y_fill = [LB_valid, fliplr(UB_valid)];
% Plot settings
figure(1);
set(gcf,'Position',[100 100 950 750])
fill(x_fill, y_fill, [0.8 0.8 1], 'EdgeColor', 'none'); % Light blue shade
% Axes settings
set(gca, 'XScale', 'log');
xlim([1E4, 1E7]);
ylim([79, 106]);
xlabel('Atom number', 'Interpreter', 'latex', 'FontSize', 16);
ylabel('Scattering length $a_s$ ($a_0$)', 'Interpreter', 'latex', 'FontSize', 16);
grid on;
set(gca,'FontSize',16,'Box','On','Linewidth',2);

View File

@ -1,33 +1,33 @@
OptionsStruct = struct; OptionsStruct = struct;
OptionsStruct.NumberOfAtoms = 90000; OptionsStruct.NumberOfAtoms = 5E7;
OptionsStruct.DipolarPolarAngle = deg2rad(0); OptionsStruct.DipolarPolarAngle = deg2rad(0);
OptionsStruct.DipolarAzimuthAngle = 0; OptionsStruct.DipolarAzimuthAngle = 0;
OptionsStruct.ScatteringLength = 85; OptionsStruct.ScatteringLength = 102;
OptionsStruct.TrapFrequencies = [50, 20, 150]; OptionsStruct.TrapFrequencies = [50, 20, 150];
OptionsStruct.TrapPotentialType = 'Harmonic'; OptionsStruct.TrapPotentialType = 'Harmonic';
OptionsStruct.NumberOfGridPoints = [128, 256, 128]; OptionsStruct.NumberOfGridPoints = [128, 256, 128];
OptionsStruct.Dimensions = [30, 50, 30]; OptionsStruct.Dimensions = [40, 80, 40];
OptionsStruct.UseApproximationForLHY = true; OptionsStruct.UseApproximationForLHY = true;
OptionsStruct.IncludeDDICutOff = true; OptionsStruct.IncludeDDICutOff = true;
OptionsStruct.CutoffType = 'Cylindrical'; OptionsStruct.CutoffType = 'Cylindrical';
OptionsStruct.SimulationMode = 'ImaginaryTimeEvolution'; % 'ImaginaryTimeEvolution' | 'RealTimeEvolution' | 'EnergyMinimization' OptionsStruct.SimulationMode = 'ImaginaryTimeEvolution'; % 'ImaginaryTimeEvolution' | 'RealTimeEvolution' | 'EnergyMinimization'
OptionsStruct.GradientDescentMethod = 'NonLinearCGD'; % 'HeavyBall' | 'NonLinearCGD' OptionsStruct.GradientDescentMethod = 'NonLinearCGD'; % 'HeavyBall' | 'NonLinearCGD'
OptionsStruct.MaxIterationsForGD = 15000; OptionsStruct.MaxIterationsForGD = 15000;
OptionsStruct.TimeStepSize = 5E-4; % in s OptionsStruct.TimeStepSize = 1E-3; % in s
OptionsStruct.MinimumTimeStepSize = 2E-6; % in s OptionsStruct.MinimumTimeStepSize = 1E-6; % in s
OptionsStruct.TimeCutOff = 1E6; % in s OptionsStruct.TimeCutOff = 1E4; % in s
OptionsStruct.EnergyTolerance = 5E-10; OptionsStruct.EnergyTolerance = 5E-10;
OptionsStruct.ResidualTolerance = 1E-05; OptionsStruct.ResidualTolerance = 1E-05;
OptionsStruct.NoiseScaleFactor = 0.010; OptionsStruct.NoiseScaleFactor = 0.010;
OptionsStruct.PlotLive = false; OptionsStruct.PlotLive = true;
OptionsStruct.JobNumber = 0; OptionsStruct.JobNumber = 0;
OptionsStruct.RunOnGPU = true; OptionsStruct.RunOnGPU = false;
OptionsStruct.SaveData = true; OptionsStruct.SaveData = true;
OptionsStruct.SaveDirectory = './Results/Data_3D/GradientDescent'; OptionsStruct.SaveDirectory = './Results/Data_3D/ImagTimeProp';
options = Helper.convertstruct2cell(OptionsStruct); options = Helper.convertstruct2cell(OptionsStruct);
sim = Simulator.DipolarGas(options{:}); sim = Simulator.DipolarGas(options{:});

View File

@ -162,7 +162,7 @@ classdef DipolarGas < handle & matlab.mixin.Copyable
methods methods
function set.TimeStepSize(this, val) function set.TimeStepSize(this, val)
assert(val > 1e-06, 'Not time efficient to compute for time steps smaller than 1 microsecond!'); assert(val > 1E-9, 'Not time efficient to compute for time steps smaller than 1 nanosecond!');
this.TimeStepSize = val; this.TimeStepSize = val;
end end
function ret = get.TimeStepSize(this) function ret = get.TimeStepSize(this)
@ -176,7 +176,6 @@ classdef DipolarGas < handle & matlab.mixin.Copyable
ret = this.TimeCutOff; 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!!');
this.NumberOfAtoms = val; this.NumberOfAtoms = val;
end end
function ret = get.NumberOfAtoms(this) function ret = get.NumberOfAtoms(this)

View File

@ -1,27 +0,0 @@
$root = "C:\Users\Karthik\Documents\GitRepositories\Calculations\Dipolar-Gas-Simulator\Results\Data_3D\GradientDescent\Phi020"
# Step 1: Delete all files except 'psi_gs.mat'
Get-ChildItem -Path $root -Recurse -File -Force |
Where-Object { $_.Name -ne "psi_gs.mat" } |
ForEach-Object {
try {
Remove-Item -Path $_.FullName -Force -ErrorAction Stop
Write-Output "Deleted: $($_.FullName)"
} catch {
Write-Warning "Failed to delete: $($_.FullName)"
}
}
# Step 2: Delete all empty directories (deepest first)
Get-ChildItem -Path $root -Recurse -Directory -Force |
Sort-Object FullName -Descending |
ForEach-Object {
if (-not (Get-ChildItem -Path $_.FullName -Force)) {
try {
Remove-Item -Path $_.FullName -Force -ErrorAction Stop
Write-Output "Deleted empty folder: $($_.FullName)"
} catch {
Write-Warning "Failed to delete folder: $($_.FullName)"
}
}
}

View File

@ -1,41 +0,0 @@
$root = "C:\Users\Karthik\Documents\GitRepositories\Calculations\Dipolar-Gas-Simulator\Results\Data_3D\GradientDescent\Phi030"
# Define parameter ranges
$SCATTERING_LENGTH_RANGE = @(79.0..90.0)
$POLAR_ANGLE_RANGE = @(30.0)
$AZIMUTHAL_ANGLE_RANGE = @(0.0)
$NUM_ATOMS_LIST = @(50000, 55000, 60000, 65000, 70000, 75000, 80000, 85000, 90000, 95000, 100000, 105000)
# Utility function to format floating point values as zero-padded 3-digit integers
function Format-Value($value) {
return "{0:D3}" -f [int]($value * 1)
}
# Generate all valid folder names
$expectedFolders = @()
foreach ($aS in $SCATTERING_LENGTH_RANGE) {
$aS_str = Format-Value $aS
foreach ($theta in $POLAR_ANGLE_RANGE) {
$theta_str = Format-Value $theta
foreach ($phi in $AZIMUTHAL_ANGLE_RANGE) {
$phi_str = Format-Value $phi
foreach ($N in $NUM_ATOMS_LIST) {
$folderName = "aS_${aS_str}_theta_${theta_str}_phi_${phi_str}_N_${N}"
$expectedFolders += $folderName
}
}
}
}
# Get actual folders in the root directory
$actualFolders = Get-ChildItem -Path $root -Directory -Force | Select-Object -ExpandProperty Name
# Compare and find missing folders
$missingFolders = $expectedFolders | Where-Object { $_ -notin $actualFolders }
# Output missing folders
Write-Host "Missing folders:"
$missingFolders | ForEach-Object { Write-Host $_ }
# Optional: Save to a file
$missingFolders | Out-File -FilePath "$root\missing_folders.txt" -Encoding UTF8

View File

@ -1,10 +1,10 @@
# ----------- Define scan ranges ----------- # ----------- Define scan ranges -----------
# Use space-separated floating-point/integer values # Use space-separated floating-point/integer values
SCATTERING_LENGTH_RANGE="[79.0 80.0 81.0 82.0 83.0 84.0 85.0 86.0 87.0 88.0 89.0 90.0]" SCATTERING_LENGTH_RANGE="[82.0 84.0 86.0 88.0 90.0 92.0 94.0 96.0 98.0 100.0]"
POLAR_ANGLE_RANGE="[20.0]" POLAR_ANGLE_RANGE="[0.0]"
AZIMUTHAL_ANGLE_RANGE="[0.0]" AZIMUTHAL_ANGLE_RANGE="[0.0]"
NUM_ATOMS_LIST="[50000 140000 220000 310000 400000 480000 570000 660000 740000 830000 920000 1000000]" NUM_ATOMS_LIST="[50000 500000 950000 1400000 1850000 2300000 2750000 3200000 3650000 4100000 4550000 5000000]"
CHUNK_SIZE=4 CHUNK_SIZE=4
# ----------- Count total combinations for SLURM array ----------- # ----------- Count total combinations for SLURM array -----------