%% Physical constants
PlanckConstant               = 6.62607015E-34;
PlanckConstantReduced        = 6.62607015E-34/(2*pi);
FineStructureConstant        = 7.2973525698E-3;
ElectronMass                 = 9.10938291E-31;
GravitationalConstant        = 6.67384E-11;
ProtonMass                   = 1.672621777E-27;
AtomicMassUnit               = 1.660539066E-27; 
BohrRadius                   = 5.2917721067E-11; 
BohrMagneton                 = 9.274009994E-24; 
BoltzmannConstant            = 1.38064852E-23;
StandardGravityAcceleration  = 9.80665;
SpeedOfLight                 = 299792458;
StefanBoltzmannConstant      = 5.670373E-8;
ElectronCharge               = 1.602176634E-19;
VacuumPermeability           = 1.25663706212E-6; 
DielectricConstant           = 8.8541878128E-12;
ElectronGyromagneticFactor   = -2.00231930436153;
AvogadroConstant             = 6.02214076E23;
ZeroKelvin                   = 273.15;
GravitationalAcceleration    = 9.80553;
VacuumPermittivity           = 1 / (SpeedOfLight^2 * VacuumPermeability);
HartreeEnergy                = ElectronCharge^2 / (4 * pi * VacuumPermittivity * BohrRadius);
AtomicUnitOfPolarizability   = (ElectronCharge^2 * BohrRadius^2) / HartreeEnergy; % Or simply 4*pi*VacuumPermittivity*BohrRadius^3

% Dy specific constants
Dy164Mass                    = 163.929174751*AtomicMassUnit;
Dy164IsotopicAbundance       = 0.2826;
DyMagneticMoment             = 9.93*BohrMagneton;

%% Scaling of the QF term

wz           = 2 * pi * 72.4;                                                                   % Trap frequency in the tight confinement direction
lz           = sqrt(PlanckConstantReduced/(Dy164Mass * wz));                                    % Defining a harmonic oscillator length
gs           = 4 * pi * PlanckConstantReduced^2/Dy164Mass * as;                                 % Contact interaction strength
add          = VacuumPermeability*DyMagneticMoment^2*Dy164Mass/(12*pi*PlanckConstantReduced^2); % Dipole length
gdd          = VacuumPermeability*DyMagneticMoment^2/3;

nadd2s       = 0.05:0.01:0.25;
as_to_add    = 0.76:0.01:0.81;

QF                = zeros(length(as_to_add), length(nadd2s));
ScatteringLengths = zeros(length(as_to_add), 1);
AtomNumber        = zeros(length(nadd2s), 1);
w0                = 2 * pi * 61.6316;                                                           % Trap frequency in the tight confinement direction
l0                = sqrt(PlanckConstantReduced/(Dy164Mass * w0));                               % Defining a harmonic oscillator length
tsize             = 10 * l0;

x0           = 5;
Aineq        = []; 
Bineq        = []; 
Aeq          = []; 
Beq          = [];
lb           = [1]; 
ub           = [10];
nonlcon      = [];
fminconopts  = optimoptions(@fmincon,'Display','off', 'StepTolerance', 1.0000e-11, 'MaxIterations',1500);

for idx = 1:length(nadd2s)
    for jdx = 1:length(as_to_add)
        AtomNumberDensity      = nadd2s(idx) / add^2;                                                             % Areal density of atoms
        AtomNumber(idx)        = AtomNumberDensity*tsize^2; 
        as                     = (as_to_add(jdx) * add);                                                          % Scattering length
        gs                     = 4 * pi * PlanckConstantReduced^2/Dy164Mass * as;                                 % Contact interaction strength
        ScatteringLengths(jdx) = as/BohrRadius;
        TotalEnergyPerParticle = @(x) computeTotalEnergyPerParticle(x, as, AtomNumberDensity, wz, lz, gs, add, gdd, PlanckConstantReduced);
        sigma                  = fmincon(TotalEnergyPerParticle, x0, Aineq, Bineq, Aeq, Beq, lb, ub, nonlcon, fminconopts);
        eps_dd                 = add/as;                                                                          % Relative interaction strength
        
        % == Quantum Fluctuations term == %
        MeanWidth              = sigma * lz;
        gammaQF                = (32/3) * gs * (as^3/pi)^(1/2) * (1 + ((3/2) * eps_dd^2));
        gamma5                 = sqrt(2/5) / (sqrt(pi) * MeanWidth)^(3/2);
        gQF                    = gamma5 * gammaQF;
        QF(jdx, idx)           = 3 * gQF * AtomNumberDensity^(3/2);
    end
end

figure
clf
set(gcf,'Position',[50 50 950 750])
imagesc(AtomNumber*1E-5, ScatteringLengths, QF * 1E31);   % Specify x and y data for axes
set(gca, 'YDir', 'normal');              % Correct the y-axis direction
cbar1 = colorbar;
cbar1.Label.Interpreter = 'latex';
ylabel(cbar1,'$(\times 10^{-31})$','FontSize',16,'Rotation',270)
xlabel(' Atom number for a trap area of 100$\mu m^2 ~ (\times 10^5)$','fontsize',16,'interpreter','latex');
ylabel('Scattering length ($\times a_0$)','fontsize',16,'interpreter','latex');
title('Scaling of the quantum fluctuations term','fontsize',16,'interpreter','latex')