diff --git a/GPE Solver/+Helper/ImageSelection.class b/GPE Solver/+Helper/ImageSelection.class
deleted file mode 100644
index cfac41d..0000000
Binary files a/GPE Solver/+Helper/ImageSelection.class and /dev/null differ
diff --git a/GPE Solver/+Helper/ImageSelection.java b/GPE Solver/+Helper/ImageSelection.java
deleted file mode 100644
index 5be8fbb..0000000
--- a/GPE Solver/+Helper/ImageSelection.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Based on code snippet from
- * http://java.sun.com/developer/technicalArticles/releases/data/
- *
- * Copyright © 2008, 2010 Oracle and/or its affiliates. All rights reserved. Use is subject to license terms.
- */
-
-import java.awt.image.BufferedImage;
-import java.awt.datatransfer.*;
-
-public class ImageSelection implements Transferable {
-
- private static final DataFlavor flavors[] =
- {DataFlavor.imageFlavor};
-
- private BufferedImage image;
-
- public ImageSelection(BufferedImage image) {
- this.image = image;
- }
-
- // Transferable
- public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
- if (flavor.equals(flavors[0]) == false) {
- throw new UnsupportedFlavorException(flavor);
- }
- return image;
- }
-
- public DataFlavor[] getTransferDataFlavors() {
- return flavors;
- }
-
- public boolean isDataFlavorSupported(DataFlavor
- flavor) {
- return flavor.equals(flavors[0]);
- }
-}
\ No newline at end of file
diff --git a/GPE Solver/+Helper/PhysicsConstants.m b/GPE Solver/+Helper/PhysicsConstants.m
deleted file mode 100644
index f62dd0a..0000000
--- a/GPE Solver/+Helper/PhysicsConstants.m
+++ /dev/null
@@ -1,46 +0,0 @@
-classdef PhysicsConstants < handle
- properties (Constant)
- % CODATA
- 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.66053878283E-27;
- BohrRadius=0.52917721092E-10;
- BohrMagneton=927.400968E-26;
- BoltzmannConstant=1.380649E-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;
-
- % Dy specific constants
- Dy164Mass = 163.929174751*1.66053878283E-27;
- Dy164IsotopicAbundance = 0.2826;
- BlueWavelength = 421.291e-9;
- BlueLandegFactor = 1.22;
- BlueLifetime = 4.94e-9;
- BlueLinewidth = 1/4.94e-9;
- RedWavelength = 626.086e-9;
- RedLandegFactor = 1.29;
- RedLifetime = 1.2e-6;
- RedLinewidth = 1/1.2e-6;
- PushBeamWaveLength = 626.086e-9;
- PushBeamLifetime = 1.2e-6;
- PushBeamLinewidth = 1/1.2e-6;
- end
-
- methods
- function pc = PhysicsConstants()
- end
- end
-
-end
diff --git a/GPE Solver/+Helper/bringFiguresWithTagInForeground.m b/GPE Solver/+Helper/bringFiguresWithTagInForeground.m
deleted file mode 100644
index c58a117..0000000
--- a/GPE Solver/+Helper/bringFiguresWithTagInForeground.m
+++ /dev/null
@@ -1,15 +0,0 @@
-function output = bringFiguresWithTagInForeground()
-
-figure_handles = findobj('type','figure');
-
-for idx = 1:length(figure_handles)
- if ~isempty(figure_handles(idx).Tag)
- figure(figure_handles(idx));
- end
-end
-
-if nargout > 0
- output = figure_handles;
-end
-
-end
\ No newline at end of file
diff --git a/GPE Solver/+Helper/calculateDistanceFromPointToLine.m b/GPE Solver/+Helper/calculateDistanceFromPointToLine.m
deleted file mode 100644
index df5c8c6..0000000
--- a/GPE Solver/+Helper/calculateDistanceFromPointToLine.m
+++ /dev/null
@@ -1,10 +0,0 @@
-function ret = calculateDistanceFromPointToLine(p0 , p1, p2)
- p01 = p0 - p1;
- p12 = p2 - p1;
- CrossProduct = [p01(2)*p12(3) - p01(3)*p12(2), p01(3)*p12(1) - p01(1)*p12(3), p01(1)*p12(2) - p01(2)*p12(1)];
- ret = norm(CrossProduct) / norm(p12);
-
- %Height of parallelogram (Distance between point and line) = Area of parallelogram / Base
- %Area = One side of parallelogram X Base
- %ret = norm(cross(one side, base))./ norm(base);
-end
\ No newline at end of file
diff --git a/GPE Solver/+Helper/convertstruct2cell.m b/GPE Solver/+Helper/convertstruct2cell.m
deleted file mode 100644
index 90fdf2c..0000000
--- a/GPE Solver/+Helper/convertstruct2cell.m
+++ /dev/null
@@ -1,6 +0,0 @@
-function CellOut = convertstruct2cell(StructIn)
- % CellOut = Convertstruct2cell(StructIn)
- % converts a struct into a cell-matrix where the first column contains
- % the fieldnames and the second the contents
- CellOut = [fieldnames(StructIn) struct2cell(StructIn)]';
-end
\ No newline at end of file
diff --git a/GPE Solver/+Helper/findAllZeroCrossings.m b/GPE Solver/+Helper/findAllZeroCrossings.m
deleted file mode 100644
index 4b8d9db..0000000
--- a/GPE Solver/+Helper/findAllZeroCrossings.m
+++ /dev/null
@@ -1,18 +0,0 @@
-function ret = findAllZeroCrossings(x,y)
-% Finds all Zero-crossing of the function y = f(x)
- zci = @(v) find(v(:).*circshift(v(:), [-1 0]) <= 0); % Returns Approximate Zero-Crossing Indices Of Argument Vector
- zxidx = zci(y);
- if ~isempty(zxidx)
- for k1 = 1:numel(zxidx)
- idxrng = max([1 zxidx(k1)-1]):min([zxidx(k1)+1 numel(y)]);
- xrng = x(idxrng);
- yrng = y(idxrng);
- [yrng2, ~, jyrng] = unique(yrng); %yrng is a new array containing the unique values of yrng. jyrng contains the indices in yrng that correspond to the original vector. yrng = yrng2(jyrng)
- xrng2 = accumarray(jyrng, xrng, [], @mean); %This function creates a new array "xrng2" by applying the function "@mean" to all elements in "xrng" that have identical indices in "jyrng". Any elements with identical X values will have identical indices in jyrng. Thus, this function creates a new array by averaging values with identical X values in the original array.
- ret(k1) = interp1( yrng2(:), xrng2(:), 0, 'linear', 'extrap' );
- end
- else
- warning('No zero crossings found!')
- ret = nan;
- end
-end
\ No newline at end of file
diff --git a/GPE Solver/+Helper/getFigureByTag.m b/GPE Solver/+Helper/getFigureByTag.m
deleted file mode 100644
index 8fc6bf9..0000000
--- a/GPE Solver/+Helper/getFigureByTag.m
+++ /dev/null
@@ -1,191 +0,0 @@
-function figure_handle = getFigureByTag(tag_name, varargin)
- % figure_handle = getFigureByTag(tag_name, varargin)
- %
- % Example code:
- % f_h = getFigureByTag('survivalMeasurement','Name','Survival')
- %
- % clf(f_h);
- % a_h = gca(f_h);
- % xlim(a_h,[10,100]);
- % % custom position
- % f_h.Position = [4052.3 719.67 560 420];
-
- assert(nargin>=1 && ischar(tag_name),'You must specify ``tag_name'' as a string.');
-
- f_h = findobj('type','figure','tag',tag_name);
-
- if isempty(f_h)
- f_h = figure('Tag',tag_name,varargin{:});
-
- defaultNewFigProperties = {'Color','w','NumberTitle','off','Name',sprintf('Fig. %d',f_h.Number)};
-
- varargin = [defaultNewFigProperties,varargin];
- else
- f_h = f_h(1);
- end
-
- if ~isempty(varargin)
- set(f_h,varargin{:});
- end
-
- addCopyButton(f_h);
-
- if nargout > 0
- figure_handle = f_h;
- else
- set(groot,'CurrentFigure',f_h);
- end
-
-end
-
-function addCopyButton(f_h)
-
- if(strcmp(f_h.ToolBar,'none'))
- return
- end
-
- tb = findall(f_h,'Type','uitoolbar');
-
- pt = findall(tb, 'tag', 'Custom.CopyPlot' );
- if isempty(pt)
- pt = uipushtool(tb);
- else
- pt = pt(1);
- end
-
- cdata = zeros(16,16,3);
-
- % Evernote Logo
-% cdata(:,:,1) =[255 NaN NaN NaN NaN 99 11 27 175 NaN NaN NaN NaN NaN NaN 255
-% NaN NaN NaN 251 93 14 0 0 0 66 70 106 210 NaN NaN NaN
-% NaN NaN NaN 42 0 43 0 0 0 0 0 0 20 185 NaN NaN
-% NaN 243 56 0 42 82 0 0 0 0 0 0 0 45 NaN NaN
-% NaN 156 44 64 113 65 0 0 0 0 0 0 0 32 NaN NaN
-% 136 9 26 28 11 0 0 0 0 0 0 0 0 10 188 NaN
-% 132 0 0 0 0 0 0 0 0 0 136 175 16 0 133 NaN
-% NaN 28 0 0 0 0 0 0 0 0 152 238 50 0 124 NaN
-% NaN 58 0 0 0 0 0 0 0 0 0 9 0 0 71 NaN
-% NaN 175 0 0 0 0 0 61 15 0 0 0 0 0 100 NaN
-% NaN NaN 143 12 0 0 0 210 195 87 17 0 0 0 126 NaN
-% NaN NaN NaN 183 118 50 150 NaN NaN 110 219 78 0 0 160 NaN
-% NaN NaN NaN NaN NaN NaN NaN 191 0 35 NaN 150 0 23 NaN NaN
-% NaN NaN NaN NaN NaN NaN NaN 124 0 172 NaN 81 0 93 NaN NaN
-% 255 NaN NaN NaN NaN NaN NaN 183 0 0 0 0 51 228 NaN 245
-% 253 254 NaN NaN NaN NaN NaN NaN 156 63 45 100 NaN NaN 255 255]/255.;
-%
-%
-% cdata(:,:,2) = [255 255 255 255 255 216 166 171 225 229 218 229 247 255 255 255
-% 255 255 255 255 201 166 159 157 167 188 189 200 243 255 255 255
-% 237 238 255 181 159 183 164 170 163 158 160 157 169 233 248 250
-% 224 235 188 140 182 195 161 168 168 168 168 169 147 186 244 240
-% 255 226 175 185 207 189 161 168 168 168 168 168 159 179 249 249
-% 227 172 172 179 172 163 169 168 168 170 163 155 160 173 231 237
-% 215 161 163 165 166 168 168 168 168 162 215 228 172 163 209 219
-% 248 178 159 168 168 168 168 168 168 159 220 249 185 158 208 222
-% 249 192 151 169 168 168 169 160 163 172 163 159 166 167 194 204
-% 246 229 155 157 168 169 159 188 174 154 162 167 166 166 202 214
-% 212 231 218 168 157 153 165 255 242 190 171 159 167 166 207 220
-% 218 203 251 243 206 181 230 210 208 207 242 196 154 168 223 232
-% 255 224 232 250 237 214 244 194 152 178 255 223 145 175 250 252
-% 255 255 244 239 222 213 240 214 149 228 254 199 136 203 244 232
-% 255 255 255 246 231 246 246 232 165 159 167 147 184 253 254 242
-% 253 254 255 255 254 255 255 255 231 183 178 199 249 255 255 255]/255.;
-%
-%
-% cdata(:,:,3) = [255 255 255 255 255 117 38 50 187 211 170 190 234 255 255 255
-% 255 254 255 255 120 51 27 20 39 97 98 122 220 255 255 255
-% 238 252 246 73 22 71 37 49 35 20 24 18 49 196 231 231
-% 232 242 86 0 78 108 29 45 45 45 45 46 0 82 214 201
-% 255 175 63 85 139 98 27 45 45 45 45 45 23 72 233 231
-% 167 51 57 72 55 32 47 45 45 50 34 14 27 57 201 218
-% 154 30 33 38 39 45 45 45 45 31 157 188 53 34 153 180
-% 234 67 24 45 45 45 45 44 45 24 169 241 83 20 146 182
-% 241 99 4 48 45 45 47 28 35 53 32 26 39 44 104 127
-% 238 192 14 20 45 47 27 97 56 10 29 44 41 40 127 158
-% 214 253 169 37 20 16 34 218 207 105 55 23 42 40 147 182
-% 218 214 241 201 138 71 177 225 181 130 224 107 12 45 175 197
-% 255 233 202 218 212 132 230 196 27 61 255 172 0 64 240 242
-% 255 255 219 197 176 160 237 143 0 195 245 110 0 123 230 230
-% 255 255 255 227 197 241 244 202 36 24 39 0 81 228 242 245
-% 253 254 255 255 254 255 255 255 191 78 71 121 221 255 255 255]/255.;
-
- %OneNote logo
-
- cdata(:,:,1) =[255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 255 255 255 255 245 213 213 213 213 213 213 213 184 184 215 255
- 255 255 255 255 241 213 213 213 213 213 213 213 184 184 208 255
- 255 233 204 204 194 176 176 185 213 213 213 213 184 184 208 255
- 255 154 101 101 101 101 101 103 213 213 213 206 162 162 193 255
- 255 152 101 183 116 152 115 101 213 213 213 206 162 162 193 255
- 255 152 101 207 189 178 122 101 213 213 213 206 162 162 193 255
- 255 152 101 199 152 224 122 101 213 213 213 195 128 128 170 255
- 255 152 101 166 101 183 115 101 213 213 213 195 128 128 170 255
- 255 154 101 101 101 101 101 103 213 213 213 195 128 128 170 255
- 255 233 204 204 194 176 176 185 213 213 213 183 95 95 148 255
- 255 255 255 255 241 213 213 213 213 213 213 183 94 94 148 255
- 255 255 255 255 245 213 213 213 213 213 213 183 94 94 163 255
- 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]/255.;
-
-
- cdata(:,:,2) =[255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 255 255 255 255 219 112 110 110 110 110 110 134 84 84 158 255
- 255 255 255 255 207 110 110 110 110 110 110 134 84 84 141 255
- 255 222 178 178 146 81 81 88 110 110 110 134 84 84 141 255
- 255 102 23 23 23 23 23 24 110 110 110 125 58 58 123 255
- 255 100 23 147 46 100 44 23 110 110 110 125 58 58 123 255
- 255 100 23 183 156 139 55 23 110 110 110 125 58 58 123 255
- 255 100 23 170 99 208 55 23 110 110 110 119 38 38 109 255
- 255 100 23 121 23 146 44 23 110 110 110 119 38 38 109 255
- 255 102 23 23 23 23 23 24 110 110 110 119 38 38 109 255
- 255 222 178 178 146 81 81 88 110 110 110 118 37 37 109 255
- 255 255 255 255 207 110 110 110 110 110 110 118 37 37 110 255
- 255 255 255 255 219 112 110 110 110 110 110 118 37 37 131 255
- 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]/255.;
-
-
- cdata(:,:,3) =[255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 255 255 255 255 255 255 255 255 255 255 255 246 229 229 240 255
- 255 255 255 255 255 255 255 255 255 255 255 246 229 229 238 255
- 255 242 224 224 224 224 224 232 255 255 255 246 229 229 238 255
- 255 194 163 163 163 163 163 164 255 255 255 244 223 223 234 255
- 255 194 163 212 172 194 171 163 255 255 255 244 223 223 234 255
- 255 194 163 226 216 209 176 163 255 255 255 244 223 223 234 255
- 255 194 163 221 193 236 176 163 255 255 255 240 209 209 224 255
- 255 194 163 202 163 212 171 163 255 255 255 240 209 209 224 255
- 255 194 163 163 163 163 163 164 255 255 255 240 209 209 224 255
- 255 242 224 224 224 224 224 232 255 255 255 223 161 161 192 255
- 255 255 255 255 255 255 255 255 255 255 255 223 160 160 192 255
- 255 255 255 255 255 255 255 255 255 255 255 223 160 160 201 255
- 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]/255.;
-
-
- pt.Tag = 'Custom.CopyPlot';
- pt.CData = cdata;
- pt.Separator = true;
- pt.ClickedCallback = @copyToClipboard;
-
-end
-
-function copyToClipboard(~,~)
- fig_h = get(get(gcbo,'Parent'),'Parent');
- if strcmp(fig_h.WindowStyle,'docked')
- if ismac || ispc
- matlab.graphics.internal.copyFigureHelper(fig_h);
- else
- %warning('Copy function to the clipboard only works if the figure is undocked.');
- Helper.screencapture(fig_h,[],'clipboard');
- end
- else
- pos = fig_h.Position;
- Helper.screencapture(fig_h,[],'clipboard','position',[7,7,pos(3)-2,pos(4)]);
- end
-end
-
-
-
diff --git a/GPE Solver/+Helper/ode5.m b/GPE Solver/+Helper/ode5.m
deleted file mode 100644
index 3eb003f..0000000
--- a/GPE Solver/+Helper/ode5.m
+++ /dev/null
@@ -1,92 +0,0 @@
-function Y = ode5(odefun,tspan,y0,varargin)
-%ODE5 Solve differential equations with a non-adaptive method of order 5.
-% Y = ODE5(ODEFUN,TSPAN,Y0) with TSPAN = [T1, T2, T3, ... TN] integrates
-% the system of differential equations y' = f(t,y) by stepping from T0 to
-% T1 to TN. Function ODEFUN(T,Y) must return f(t,y) in a column vector.
-% The vector Y0 is the initial conditions at T0. Each row in the solution
-% array Y corresponds to a time specified in TSPAN.
-%
-% Y = ODE5(ODEFUN,TSPAN,Y0,P1,P2...) passes the additional parameters
-% P1,P2... to the derivative function as ODEFUN(T,Y,P1,P2...).
-%
-% This is a non-adaptive solver. The step sequence is determined by TSPAN
-% but the derivative function ODEFUN is evaluated multiple times per step.
-% The solver implements the Dormand-Prince method of order 5 in a general
-% framework of explicit Runge-Kutta methods.
-%
-% Example
-% tspan = 0:0.1:20;
-% y = ode5(@vdp1,tspan,[2 0]);
-% plot(tspan,y(:,1));
-% solves the system y' = vdp1(t,y) with a constant step size of 0.1,
-% and plots the first component of the solution.
-
-if ~isnumeric(tspan)
- error('TSPAN should be a vector of integration steps.');
-end
-
-if ~isnumeric(y0)
- error('Y0 should be a vector of initial conditions.');
-end
-
-h = diff(tspan);
-if any(sign(h(1))*h <= 0)
- error('Entries of TSPAN are not in order.')
-end
-
-try
- f0 = feval(odefun,tspan(1),y0,varargin{:});
-catch
- msg = ['Unable to evaluate the ODEFUN at t0,y0. ',lasterr];
- error(msg);
-end
-
-y0 = y0(:); % Make a column vector.
-if ~isequal(size(y0),size(f0))
- error('Inconsistent sizes of Y0 and f(t0,y0).');
-end
-
-neq = length(y0);
-N = length(tspan);
-Y = zeros(neq,N);
-
-% Method coefficients -- Butcher's tableau
-%
-% C | A
-% --+---
-% | B
-
-C = [1/5; 3/10; 4/5; 8/9; 1];
-
-A = [ 1/5, 0, 0, 0, 0
- 3/40, 9/40, 0, 0, 0
- 44/45 -56/15, 32/9, 0, 0
- 19372/6561, -25360/2187, 64448/6561, -212/729, 0
- 9017/3168, -355/33, 46732/5247, 49/176, -5103/18656];
-
-B = [35/384, 0, 500/1113, 125/192, -2187/6784, 11/84];
-
-% More convenient storage
-A = A.';
-B = B(:);
-
-nstages = length(B);
-F = zeros(neq,nstages);
-
-Y(:,1) = y0;
-for i = 2:N
- ti = tspan(i-1);
- hi = h(i-1);
- yi = Y(:,i-1);
-
- % General explicit Runge-Kutta framework
- F(:,1) = feval(odefun,ti,yi,varargin{:});
- for stage = 2:nstages
- tstage = ti + C(stage-1)*hi;
- ystage = yi + F(:,1:stage-1)*(hi*A(1:stage-1,stage-1));
- F(:,stage) = feval(odefun,tstage,ystage,varargin{:});
- end
- Y(:,i) = yi + F*(hi*B);
-
-end
-Y = Y.';
diff --git a/GPE Solver/+Helper/onenoteccdata.m b/GPE Solver/+Helper/onenoteccdata.m
deleted file mode 100644
index 5f3c177..0000000
--- a/GPE Solver/+Helper/onenoteccdata.m
+++ /dev/null
@@ -1,55 +0,0 @@
-cmap = zeros(16,16,3);
-
-cmap(:,:,1) = [0.0000 0.0118 0.4510 0.0039 0.2078 0.1569 0.4078 0.4431 0.4510 0.1922 0.4235 0.4196 0.2235 0.4235 0.4039 0.4392
- 0.4471 0.1647 0.4157 0.0000 0.0235 0.4353 0.0314 0.4314 0.0196 0.2392 0.0667 0.0392 0.4431 0.3804 0.2941 0.4275
- 0.3686 0.3608 0.2000 0.2824 0.3059 0.0549 0.1804 0.1882 0.4392 0.4314 0.3255 0.0078 0.0902 0.1961 0.4353 0.1412
- 0.2314 0.3647 0.0353 0.3804 0.1647 0.2431 0.1686 0.2745 0.2980 0.4235 0.3922 0.4157 0.2784 0.3333 0.2510 0.0588
- 0.1020 0.0745 0.2549 0.0471 0.1216 0.4000 0.3961 0.2627 0.1098 0.1725 0.3098 0.4314 0.3529 0.3412 0.0784 0.0824
- 0.4471 0.1490 0.1804 0.3529 0.2196 0.3137 0.3255 0.0941 0.0078 0.3294 0.3765 0.2706 0.0510 0.0157 0.4275 0.1176
- 0.1294 0.1333 0.1725 0.3451 0.2118 0.3843 0.1255 0.1569 0.2118 0.1608 0.0353 0.2039 0.1608 0.4510 1.0000 0.8000
- 0.9882 0.6510 0.9961 0.4549 0.4549 0.6824 0.7882 0.5686 0.5373 0.5490 0.7765 0.7137 0.8510 0.7176 0.5020 0.4902
- 0.8941 0.9020 0.4745 0.8980 0.9098 0.4824 0.6471 0.6353 0.9922 0.9647 0.6353 0.4588 0.9647 0.9020 0.4980 0.8118
- 0.5059 0.4941 0.9686 0.4863 0.5451 0.9725 0.8980 0.5451 0.5333 0.6824 0.4588 0.8196 0.8314 0.8980 0.8941 0.9961
- 0.5255 0.8392 0.9804 0.5216 0.8588 0.8078 0.5176 0.7647 0.5608 0.9725 0.9059 0.4627 0.9882 0.8275 0.7725 0.8745
- 0.8235 0.8431 0.7373 1.0000 0.5137 0.4706 0.4784 0.7412 0.8863 0.9373 0.5529 0.5804 0.4510 0.9255 0.8235 0.8667
- 0.7569 0.8824 0.5294 0.5176 0.5373 0.9569 0.5294 0.4824 0.5098 0.5137 0.5569 0.8471 0.5098 0.9490 0.8706 0.9412
- 0.4902 0.6000 0.6980 0.7882 0.5490 0.7216 0.6431 0.4824 0.5569 0.4667 0.6627 0.9922 0.7804 0.8039 0.6275 0.7333
- 0.5725 0.5647 0.8549 0.7529 0.6235 0.8784 0.5922 0.7294 0.6118 0.7922 0.7843 0.6667 0.9294 0.6902 0.6784 0.9176
- 0.6706 0.7490 0.7961 0.5882 0.8627 0.4627 0.6196 0.7059 0.6078 0.9765 0.6549 0.6863 0.5373 0.7098 0.7176 0.7765];
-
-cmap(:,:,2) = [0.0000 0.0078 0.2157 0.0000 0.0980 0.0745 0.1922 0.2157 0.2157 0.0902 0.2000 0.1961 0.1059 0.2039 0.1882 0.2078
- 0.2078 0.0784 0.2000 0.0000 0.0118 0.2118 0.0157 0.2039 0.0078 0.1137 0.0314 0.0196 0.2118 0.1804 0.1373 0.2078
- 0.1765 0.1725 0.0941 0.1333 0.1451 0.0275 0.0863 0.0902 0.2078 0.2078 0.1529 0.0039 0.0431 0.0941 0.2039 0.0667
- 0.1098 0.1725 0.0157 0.1804 0.0784 0.1137 0.0824 0.1333 0.1412 0.2000 0.1882 0.2000 0.1333 0.1569 0.1176 0.0275
- 0.0471 0.0353 0.1216 0.0196 0.0588 0.1922 0.1882 0.1255 0.0510 0.0824 0.1451 0.2039 0.1686 0.1647 0.0392 0.0392
- 0.2157 0.0706 0.0863 0.1686 0.1020 0.1490 0.1529 0.0431 0.0039 0.1569 0.1804 0.1255 0.0235 0.0078 0.2000 0.0549
- 0.0627 0.0627 0.0824 0.1647 0.1020 0.1843 0.0588 0.0745 0.1020 0.0784 0.0157 0.0980 0.0784 0.2157 1.0000 0.7137
- 0.9843 0.4980 0.9961 0.2235 0.2196 0.5412 0.6980 0.3843 0.3373 0.3569 0.6824 0.5922 0.7843 0.6000 0.2902 0.2706
- 0.8510 0.8588 0.2471 0.8549 0.8667 0.2627 0.4980 0.4784 0.9843 0.9490 0.4745 0.2235 0.9451 0.8627 0.2824 0.7333
- 0.2941 0.2784 0.9529 0.2667 0.3490 0.9569 0.8510 0.3490 0.3333 0.5451 0.2275 0.7412 0.7608 0.8549 0.8471 0.9922
- 0.3255 0.7686 0.9725 0.3176 0.8000 0.7255 0.3098 0.6627 0.3725 0.9647 0.8627 0.2314 0.9804 0.7529 0.6745 0.8235
- 0.7451 0.7765 0.6235 0.9961 0.3020 0.2431 0.2510 0.6314 0.8392 0.9098 0.3608 0.4000 0.2196 0.8902 0.7490 0.8078
- 0.6549 0.8353 0.3294 0.3137 0.3412 0.9373 0.3255 0.2588 0.2980 0.3059 0.3686 0.7843 0.3020 0.9255 0.8157 0.9176
- 0.2745 0.4275 0.5686 0.6980 0.3569 0.6039 0.4863 0.2627 0.3647 0.2392 0.5137 0.9922 0.6863 0.7216 0.4706 0.6196
- 0.3882 0.3765 0.7882 0.6471 0.4588 0.8275 0.4157 0.6118 0.4431 0.7059 0.6902 0.5255 0.8980 0.5569 0.5412 0.8824
- 0.5333 0.6392 0.7098 0.4078 0.8039 0.2314 0.4549 0.5804 0.4392 0.9647 0.5059 0.5529 0.3373 0.5882 0.5961 0.6784];
-
-cmap(:,:,3) = [0.0000 0.0157 0.4980 0.0039 0.2314 0.1725 0.4627 0.5020 0.5020 0.2196 0.4745 0.4706 0.2510 0.4784 0.4510 0.4980
- 0.4941 0.1882 0.4667 0.0000 0.0275 0.4941 0.0353 0.4902 0.0196 0.2667 0.0745 0.0471 0.4902 0.4314 0.3294 0.4784
- 0.4196 0.4000 0.2235 0.3216 0.3412 0.0627 0.2039 0.2118 0.4863 0.4863 0.3608 0.0078 0.1020 0.2196 0.4824 0.1569
- 0.2588 0.4118 0.0392 0.4235 0.1843 0.2745 0.1882 0.3059 0.3373 0.4784 0.4392 0.4627 0.3137 0.3765 0.2824 0.0667
- 0.1137 0.0824 0.2863 0.0510 0.1373 0.4510 0.4471 0.2941 0.1216 0.1961 0.3490 0.4824 0.3961 0.3804 0.0902 0.0941
- 0.4980 0.1647 0.2000 0.4000 0.2431 0.3529 0.3647 0.1059 0.0118 0.3686 0.4196 0.3020 0.0549 0.0196 0.4824 0.1294
- 0.1451 0.1529 0.1922 0.3882 0.2392 0.4353 0.1412 0.1765 0.2353 0.1804 0.0353 0.2275 0.1843 0.5059 1.0000 0.8196
- 0.9882 0.6863 0.9961 0.5098 0.5098 0.7137 0.8118 0.6118 0.5843 0.5922 0.8000 0.7412 0.8627 0.7451 0.5529 0.5412
- 0.9059 0.9137 0.5255 0.9098 0.9176 0.5333 0.6824 0.6706 0.9922 0.9686 0.6706 0.5098 0.9647 0.9137 0.5490 0.8314
- 0.5569 0.5451 0.9725 0.5373 0.5922 0.9725 0.9059 0.5882 0.5804 0.7137 0.5137 0.8353 0.8510 0.9059 0.9020 0.9961
- 0.5725 0.8549 0.9843 0.5725 0.8745 0.8275 0.5647 0.7882 0.6039 0.9765 0.9137 0.5176 0.9882 0.8431 0.7961 0.8863
- 0.8392 0.8588 0.7647 1.0000 0.5608 0.5216 0.5294 0.7686 0.8980 0.9412 0.6000 0.6235 0.5059 0.9333 0.8431 0.8784
- 0.7804 0.8941 0.5765 0.5686 0.5843 0.9608 0.5765 0.5333 0.5569 0.5647 0.6039 0.8627 0.5608 0.9569 0.8863 0.9490
- 0.5412 0.6392 0.7294 0.8078 0.5961 0.7490 0.6784 0.5373 0.6000 0.5216 0.6941 0.9922 0.8039 0.8235 0.6667 0.7608
- 0.6157 0.6078 0.8667 0.7765 0.6588 0.8902 0.6314 0.7569 0.6510 0.8157 0.8039 0.7020 0.9373 0.7216 0.7098 0.9255
- 0.7059 0.7725 0.8196 0.6314 0.8784 0.5137 0.6549 0.7373 0.6471 0.9804 0.6902 0.7176 0.5804 0.7412 0.7451 0.8000];
-
-%%
-[cdata, cmap] = imread('onenote.png');
\ No newline at end of file
diff --git a/GPE Solver/+Helper/parforNotifications.m b/GPE Solver/+Helper/parforNotifications.m
deleted file mode 100644
index 4ad3af4..0000000
--- a/GPE Solver/+Helper/parforNotifications.m
+++ /dev/null
@@ -1,148 +0,0 @@
-% Copyright (c) 2019 Andrea Alberti
-%
-% All rights reserved.
-classdef parforNotifications < handle
- properties
- N; % number of iterations
- text = 'Please wait ...'; % text to show
- width = 50;
- showWarning = true;
- end
- properties (GetAccess = public, SetAccess = private)
- n;
- end
- properties (Access = private)
- inProgress = false;
- percent;
- DataQueue;
- usePercent;
- Nstr;
- NstrL;
- lastComment;
- end
- methods
- function this = parforNotifications()
- this.DataQueue = parallel.pool.DataQueue;
- afterEach(this.DataQueue, @this.updateStatus);
- end
- % Start progress bar
- function PB_start(this,N,varargin)
- assert(isscalar(N) && isnumeric(N) && N == floor(N) && N>0, 'Error: ''N'' must be a scalar positive integer.');
-
- this.N = N;
-
- p = inputParser;
- addParameter(p,'message','Please wait: ');
- addParameter(p,'usePercentage',true);
-
- parse(p,varargin{:});
-
- this.text = p.Results.message;
- assert(ischar(this.text), 'Error: ''Message'' must be a string.');
-
- this.usePercent = p.Results.usePercentage;
- assert(isscalar(this.usePercent) && islogical(this.usePercent), 'Error: ''usePercentage'' must be a logical scalar.');
-
- this.percent = 0;
- this.n = 0;
- this.lastComment = '';
- if this.usePercent
- fprintf('%s [%s]: %3d%%\n',this.text, char(32*ones(1,this.width)),0);
- else
- this.Nstr = sprintf('%d',this.N);
- this.NstrL = numel(this.Nstr);
- fprintf('%s [%s]: %s/%s\n',this.text, char(32*ones(1,this.width)),[char(32*ones(1,this.NstrL-1)),'0'],this.Nstr);
- end
-
- this.inProgress = true;
- end
- % Iterate progress bar
- function PB_iterate(this,str)
- if nargin == 1
- send(this.DataQueue,'');
- else
- send(this.DataQueue,str);
- end
- end
- function warning(this,warn_id,msg)
- if this.showWarning
- msg = struct('Action','Warning','Id',warn_id,'Message',msg);
- send(this.DataQueue,msg);
- end
- end
- function PB_reprint(this)
- p = round(100*this.n/this.N);
-
- this.percent = p;
-
- cursor_pos=1+round((this.width-1)*p/100);
-
- if p < 100
- sep_char = '|';
- else
- sep_char = '.';
- end
-
- if this.usePercent
- fprintf('%s [%s%s%s]: %3d%%\n', this.text, char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),p);
- else
- nstr=sprintf('%d',this.n);
- fprintf('%s [%s%s%s]: %s/%s\n', this.text, char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),[char(32*ones(1,this.NstrL-numel(nstr))),nstr],this.Nstr);
- end
- end
- function updateStatus(this,data)
-
- if ischar(data)
-
- this.n = this.n + 1;
-
- p = round(100*this.n/this.N);
-
- if p >= this.percent+1 || this.n == this.N
- this.percent = p;
-
- cursor_pos=1+round((this.width-1)*p/100);
-
- if p < 100
- sep_char = '|';
- else
- sep_char = '.';
- end
-
- if ~isempty(data)
- comment = [' (',data,')'];
- else
- comment = '';
- end
-
- if this.usePercent
- fprintf('%s%s%s%s]: %3d%%%s\n',char(8*ones(1,58+numel(this.lastComment))), char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),p,comment);
- else
- nstr=sprintf('%d',this.n);
- fprintf('%s%s%s%s]: %s/%s%s\n',char(8*ones(1,55+2*numel(this.Nstr)+numel(this.lastComment))), char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),[char(32*ones(1,this.NstrL-numel(nstr))),nstr],this.Nstr,comment)
- end
-
- this.lastComment = comment;
-
-
- if p == 100
- this.inProgress = false;
- end
- end
-
- else
- switch data.Action
- case 'Warning'
- warning(data.Id,[data.Message,newline]);
- if this.inProgress
- this.PB_reprint();
- end
- end
-
- end
-
- end
- end
-end
-
-
diff --git a/GPE Solver/+Helper/screencapture.m b/GPE Solver/+Helper/screencapture.m
deleted file mode 100644
index 206312e..0000000
--- a/GPE Solver/+Helper/screencapture.m
+++ /dev/null
@@ -1,820 +0,0 @@
-function imageData = screencapture(varargin)
-% screencapture - get a screen-capture of a figure frame, component handle, or screen area rectangle
-%
-% ScreenCapture gets a screen-capture of any Matlab GUI handle (including desktop,
-% figure, axes, image or uicontrol), or a specified area rectangle located relative to
-% the specified handle. Screen area capture is possible by specifying the root (desktop)
-% handle (=0). The output can be either to an image file or to a Matlab matrix (useful
-% for displaying via imshow() or for further processing) or to the system clipboard.
-% This utility also enables adding a toolbar button for easy interactive screen-capture.
-%
-% Syntax:
-% imageData = screencapture(handle, position, target, 'PropName',PropValue, ...)
-%
-% Input Parameters:
-% handle - optional handle to be used for screen-capture origin.
-% If empty/unsupplied then current figure (gcf) will be used.
-% position - optional position array in pixels: [x,y,width,height].
-% If empty/unsupplied then the handle's position vector will be used.
-% If both handle and position are empty/unsupplied then the position
-% will be retrieved via interactive mouse-selection.
-% If handle is an image, then position is in data (not pixel) units, so the
-% captured region remains the same after figure/axes resize (like imcrop)
-% target - optional filename for storing the screen-capture, or the
-% 'clipboard'/'printer' strings.
-% If empty/unsupplied then no output to file will be done.
-% The file format will be determined from the extension (JPG/PNG/...).
-% Supported formats are those supported by the imwrite function.
-% 'PropName',PropValue -
-% optional list of property pairs (e.g., 'target','myImage.png','pos',[10,20,30,40],'handle',gca)
-% PropNames may be abbreviated and are case-insensitive.
-% PropNames may also be given in whichever order.
-% Supported PropNames are:
-% - 'handle' (default: gcf handle)
-% - 'position' (default: gcf position array)
-% - 'target' (default: '')
-% - 'toolbar' (figure handle; default: gcf)
-% this adds a screen-capture button to the figure's toolbar
-% If this parameter is specified, then no screen-capture
-% will take place and the returned imageData will be [].
-%
-% Output parameters:
-% imageData - image data in a format acceptable by the imshow function
-% If neither target nor imageData were specified, the user will be
-% asked to interactively specify the output file.
-%
-% Examples:
-% imageData = screencapture; % interactively select screen-capture rectangle
-% imageData = screencapture(hListbox); % capture image of a uicontrol
-% imageData = screencapture(0, [20,30,40,50]); % capture a small desktop region
-% imageData = screencapture(gcf,[20,30,40,50]); % capture a small figure region
-% imageData = screencapture(gca,[10,20,30,40]); % capture a small axes region
-% imshow(imageData); % display the captured image in a matlab figure
-% imwrite(imageData,'myImage.png'); % save the captured image to file
-% img = imread('cameraman.tif');
-% hImg = imshow(img);
-% screencapture(hImg,[60,35,140,80]); % capture a region of an image
-% screencapture(gcf,[],'myFigure.jpg'); % capture the entire figure into file
-% screencapture(gcf,[],'clipboard'); % capture the entire figure into clipboard
-% screencapture(gcf,[],'printer'); % print the entire figure
-% screencapture('handle',gcf,'target','myFigure.jpg'); % same as previous, save to file
-% screencapture('handle',gcf,'target','clipboard'); % same as previous, copy to clipboard
-% screencapture('handle',gcf,'target','printer'); % same as previous, send to printer
-% screencapture('toolbar',gcf); % adds a screen-capture button to gcf's toolbar
-% screencapture('toolbar',[],'target','sc.bmp'); % same with default output filename
-%
-% Technical description:
-% http://UndocumentedMatlab.com/blog/screencapture-utility/
-%
-% Bugs and suggestions:
-% Please send to Yair Altman (altmany at gmail dot com)
-%
-% See also:
-% imshow, imwrite, print
-%
-% Release history:
-% 1.17 2016-05-16: Fix annoying warning about JavaFrame property becoming obsolete someday (yes, we know...)
-% 1.16 2016-04-19: Fix for deployed application suggested by Dwight Bartholomew
-% 1.10 2014-11-25: Added the 'print' target
-% 1.9 2014-11-25: Fix for saving GIF files
-% 1.8 2014-11-16: Fixes for R2014b
-% 1.7 2014-04-28: Fixed bug when capturing interactive selection
-% 1.6 2014-04-22: Only enable image formats when saving to an unspecified file via uiputfile
-% 1.5 2013-04-18: Fixed bug in capture of non-square image; fixes for Win64
-% 1.4 2013-01-27: Fixed capture of Desktop (root); enabled rbbox anywhere on desktop (not necesarily in a Matlab figure); enabled output to clipboard (based on Jiro Doke's imclipboard utility); edge-case fixes; added Java compatibility check
-% 1.3 2012-07-23: Capture current object (uicontrol/axes/figure) if w=h=0 (e.g., by clicking a single point); extra input args sanity checks; fix for docked windows and image axes; include axes labels & ticks by default when capturing axes; use data-units position vector when capturing images; many edge-case fixes
-% 1.2 2011-01-16: another performance boost (thanks to Jan Simon); some compatibility fixes for Matlab 6.5 (untested)
-% 1.1 2009-06-03: Handle missing output format; performance boost (thanks to Urs); fix minor root-handle bug; added toolbar button option
-% 1.0 2009-06-02: First version posted on MathWorks File Exchange
-
-% License to use and modify this code is granted freely to all interested, as long as the original author is
-% referenced and attributed as such. The original author maintains the right to be solely associated with this work.
-
-% Programmed and Copyright by Yair M. Altman: altmany(at)gmail.com
-% $Revision: 1.17 $ $Date: 2016/05/16 17:59:36 $
-
- % Ensure that java awt is enabled...
- if ~usejava('awt')
- error('YMA:screencapture:NeedAwt','ScreenCapture requires Java to run.');
- end
-
- % Ensure that our Java version supports the Robot class (requires JVM 1.3+)
- try
- robot = java.awt.Robot; %#ok
- catch
- uiwait(msgbox({['Your Matlab installation is so old that its Java engine (' version('-java') ...
- ') does not have a java.awt.Robot class. '], ' ', ...
- 'Without this class, taking a screen-capture is impossible.', ' ', ...
- 'So, either install JVM 1.3 or higher, or use a newer Matlab release.'}, ...
- 'ScreenCapture', 'warn'));
- if nargout, imageData = []; end
- return;
- end
-
- % Process optional arguments
- paramsStruct = processArgs(varargin{:});
-
- % If toolbar button requested, add it and exit
- if ~isempty(paramsStruct.toolbar)
-
- % Add the toolbar button
- addToolbarButton(paramsStruct);
-
- % Return the figure to its pre-undocked state (when relevant)
- redockFigureIfRelevant(paramsStruct);
-
- % Exit immediately (do NOT take a screen-capture)
- if nargout, imageData = []; end
- return;
- end
-
- % Convert position from handle-relative to desktop Java-based pixels
- [paramsStruct, msgStr] = convertPos(paramsStruct);
-
- % Capture the requested screen rectangle using java.awt.Robot
- imgData = getScreenCaptureImageData(paramsStruct.position);
-
- % Return the figure to its pre-undocked state (when relevant)
- redockFigureIfRelevant(paramsStruct);
-
- % Save image data in file or clipboard, if specified
- if ~isempty(paramsStruct.target)
- if strcmpi(paramsStruct.target,'clipboard')
- if ~isempty(imgData)
- imclipboard(imgData);
- else
- msgbox('No image area selected - not copying image to clipboard','ScreenCapture','warn');
- end
- elseif strncmpi(paramsStruct.target,'print',5) % 'print' or 'printer'
- if ~isempty(imgData)
- hNewFig = figure('visible','off');
- imshow(imgData);
- print(hNewFig);
- delete(hNewFig);
- else
- msgbox('No image area selected - not printing screenshot','ScreenCapture','warn');
- end
- else % real filename
- if ~isempty(imgData)
- imwrite(imgData,paramsStruct.target);
- else
- msgbox(['No image area selected - not saving image file ' paramsStruct.target],'ScreenCapture','warn');
- end
- end
- end
-
- % Return image raster data to user, if requested
- if nargout
- imageData = imgData;
-
- % If neither output formats was specified (neither target nor output data)
- elseif isempty(paramsStruct.target) & ~isempty(imgData) %#ok ML6
- % Ask the user to specify a file
- %error('YMA:screencapture:noOutput','No output specified for ScreenCapture: specify the output filename and/or output data');
- %format = '*.*';
- formats = imformats;
- for idx = 1 : numel(formats)
- ext = sprintf('*.%s;',formats(idx).ext{:});
- format(idx,1:2) = {ext(1:end-1), formats(idx).description}; %#ok
- end
- [filename,pathname] = uiputfile(format,'Save screen capture as');
- if ~isequal(filename,0) & ~isequal(pathname,0) %#ok Matlab6 compatibility
- try
- filename = fullfile(pathname,filename);
- imwrite(imgData,filename);
- catch % possibly a GIF file that requires indexed colors
- [imgData,map] = rgb2ind(imgData,256);
- imwrite(imgData,map,filename);
- end
- else
- % TODO - copy to clipboard
- end
- end
-
- % Display msgStr, if relevant
- if ~isempty(msgStr)
- uiwait(msgbox(msgStr,'ScreenCapture'));
- drawnow; pause(0.05); % time for the msgbox to disappear
- end
-
- return; % debug breakpoint
-
-%% Process optional arguments
-function paramsStruct = processArgs(varargin)
-
- % Get the properties in either direct or P-V format
- [regParams, pvPairs] = parseparams(varargin);
-
- % Now process the optional P-V params
- try
- % Initialize
- paramName = [];
- paramsStruct = [];
- paramsStruct.handle = [];
- paramsStruct.position = [];
- paramsStruct.target = '';
- paramsStruct.toolbar = [];
- paramsStruct.wasDocked = 0; % no false available in ML6
- paramsStruct.wasInteractive = 0; % no false available in ML6
-
- % Parse the regular (non-named) params in recption order
- if ~isempty(regParams) & (isempty(regParams{1}) | ishandle(regParams{1}(1))) %#ok ML6
- paramsStruct.handle = regParams{1};
- regParams(1) = [];
- end
- if ~isempty(regParams) & isnumeric(regParams{1}) & (length(regParams{1}) == 4) %#ok ML6
- paramsStruct.position = regParams{1};
- regParams(1) = [];
- end
- if ~isempty(regParams) & ischar(regParams{1}) %#ok ML6
- paramsStruct.target = regParams{1};
- end
-
- % Parse the optional param PV pairs
- supportedArgs = {'handle','position','target','toolbar'};
- while ~isempty(pvPairs)
-
- % Disregard empty propNames (may be due to users mis-interpretting the syntax help)
- while ~isempty(pvPairs) & isempty(pvPairs{1}) %#ok ML6
- pvPairs(1) = [];
- end
- if isempty(pvPairs)
- break;
- end
-
- % Ensure basic format is valid
- paramName = '';
- if ~ischar(pvPairs{1})
- error('YMA:screencapture:invalidProperty','Invalid property passed to ScreenCapture');
- elseif length(pvPairs) == 1
- if isempty(paramsStruct.target)
- paramsStruct.target = pvPairs{1};
- break;
- else
- error('YMA:screencapture:noPropertyValue',['No value specified for property ''' pvPairs{1} '''']);
- end
- end
-
- % Process parameter values
- paramName = pvPairs{1};
- if strcmpi(paramName,'filename') % backward compatibility
- paramName = 'target';
- end
- paramValue = pvPairs{2};
- pvPairs(1:2) = [];
- idx = find(strncmpi(paramName,supportedArgs,length(paramName)));
- if ~isempty(idx)
- %paramsStruct.(lower(supportedArgs{idx(1)})) = paramValue; % incompatible with ML6
- paramsStruct = setfield(paramsStruct, lower(supportedArgs{idx(1)}), paramValue); %#ok ML6
-
- % If 'toolbar' param specified, then it cannot be left empty - use gcf
- if strncmpi(paramName,'toolbar',length(paramName)) & isempty(paramsStruct.toolbar) %#ok ML6
- paramsStruct.toolbar = getCurrentFig;
- end
-
- elseif isempty(paramsStruct.target)
- paramsStruct.target = paramName;
- pvPairs = {paramValue, pvPairs{:}}; %#ok (more readable this way, although a bit less efficient...)
-
- else
- supportedArgsStr = sprintf('''%s'',',supportedArgs{:});
- error('YMA:screencapture:invalidProperty','%s \n%s', ...
- 'Invalid property passed to ScreenCapture', ...
- ['Supported property names are: ' supportedArgsStr(1:end-1)]);
- end
- end % loop pvPairs
-
- catch
- if ~isempty(paramName), paramName = [' ''' paramName '''']; end
- error('YMA:screencapture:invalidProperty','Error setting ScreenCapture property %s:\n%s',paramName,lasterr); %#ok
- end
-%end % processArgs
-
-%% Convert position from handle-relative to desktop Java-based pixels
-function [paramsStruct, msgStr] = convertPos(paramsStruct)
- msgStr = '';
- try
- % Get the screen-size for later use
- screenSize = get(0,'ScreenSize');
-
- % Get the containing figure's handle
- hParent = paramsStruct.handle;
- if isempty(paramsStruct.handle)
- paramsStruct.hFigure = getCurrentFig;
- hParent = paramsStruct.hFigure;
- else
- paramsStruct.hFigure = ancestor(paramsStruct.handle,'figure');
- end
-
- % To get the acurate pixel position, the figure window must be undocked
- try
- if strcmpi(get(paramsStruct.hFigure,'WindowStyle'),'docked')
- set(paramsStruct.hFigure,'WindowStyle','normal');
- drawnow; pause(0.25);
- paramsStruct.wasDocked = 1; % no true available in ML6
- end
- catch
- % never mind - ignore...
- end
-
- % The figure (if specified) must be in focus
- if ~isempty(paramsStruct.hFigure) & ishandle(paramsStruct.hFigure) %#ok ML6
- isFigureValid = 1; % no true available in ML6
- figure(paramsStruct.hFigure);
- else
- isFigureValid = 0; % no false available in ML6
- end
-
- % Flush all graphic events to ensure correct rendering
- drawnow; pause(0.01);
-
- % No handle specified
- wasPositionGiven = 1; % no true available in ML6
- if isempty(paramsStruct.handle)
-
- % Set default handle, if not supplied
- paramsStruct.handle = paramsStruct.hFigure;
-
- % If position was not specified, get it interactively using RBBOX
- if isempty(paramsStruct.position)
- [paramsStruct.position, jFrameUsed, msgStr] = getInteractivePosition(paramsStruct.hFigure); %#ok jFrameUsed is unused
- paramsStruct.wasInteractive = 1; % no true available in ML6
- wasPositionGiven = 0; % no false available in ML6
- end
-
- elseif ~ishandle(paramsStruct.handle)
- % Handle was supplied - ensure it is a valid handle
- error('YMA:screencapture:invalidHandle','Invalid handle passed to ScreenCapture');
-
- elseif isempty(paramsStruct.position)
- % Handle was supplied but position was not, so use the handle's position
- paramsStruct.position = getPixelPos(paramsStruct.handle);
- paramsStruct.position(1:2) = 0;
- wasPositionGiven = 0; % no false available in ML6
-
- elseif ~isnumeric(paramsStruct.position) | (length(paramsStruct.position) ~= 4) %#ok ML6
- % Both handle & position were supplied - ensure a valid pixel position vector
- error('YMA:screencapture:invalidPosition','Invalid position vector passed to ScreenCapture: \nMust be a [x,y,w,h] numeric pixel array');
- end
-
- % Capture current object (uicontrol/axes/figure) if w=h=0 (single-click in interactive mode)
- if paramsStruct.position(3)<=0 | paramsStruct.position(4)<=0 %#ok ML6
- %TODO - find a way to single-click another Matlab figure (the following does not work)
- %paramsStruct.position = getPixelPos(ancestor(hittest,'figure'));
- paramsStruct.position = getPixelPos(paramsStruct.handle);
- paramsStruct.position(1:2) = 0;
- paramsStruct.wasInteractive = 0; % no false available in ML6
- wasPositionGiven = 0; % no false available in ML6
- end
-
- % First get the parent handle's desktop-based Matlab pixel position
- parentPos = [0,0,0,0];
- dX = 0;
- dY = 0;
- dW = 0;
- dH = 0;
- if ~isFigure(hParent)
- % Get the reguested component's pixel position
- parentPos = getPixelPos(hParent, 1); % no true available in ML6
-
- % Axes position inaccuracy estimation
- deltaX = 3;
- deltaY = -1;
-
- % Fix for images
- if isImage(hParent) % | (isAxes(hParent) & strcmpi(get(hParent,'YDir'),'reverse')) %#ok ML6
-
- % Compensate for resized image axes
- hAxes = get(hParent,'Parent');
- if all(get(hAxes,'DataAspectRatio')==1) % sanity check: this is the normal behavior
- % Note 18/4/2013: the following fails for non-square images
- %actualImgSize = min(parentPos(3:4));
- %dX = (parentPos(3) - actualImgSize) / 2;
- %dY = (parentPos(4) - actualImgSize) / 2;
- %parentPos(3:4) = actualImgSize;
-
- % The following should work for all types of images
- actualImgSize = size(get(hParent,'CData'));
- dX = (parentPos(3) - min(parentPos(3),actualImgSize(2))) / 2;
- dY = (parentPos(4) - min(parentPos(4),actualImgSize(1))) / 2;
- parentPos(3:4) = actualImgSize([2,1]);
- %parentPos(3) = max(parentPos(3),actualImgSize(2));
- %parentPos(4) = max(parentPos(4),actualImgSize(1));
- end
-
- % Fix user-specified img positions (but not auto-inferred ones)
- if wasPositionGiven
-
- % In images, use data units rather than pixel units
- % Reverse the YDir
- ymax = max(get(hParent,'YData'));
- paramsStruct.position(2) = ymax - paramsStruct.position(2) - paramsStruct.position(4);
-
- % Note: it would be best to use hgconvertunits, but:
- % ^^^^ (1) it fails on Matlab 6, and (2) it doesn't accept Data units
- %paramsStruct.position = hgconvertunits(hFig, paramsStruct.position, 'Data', 'pixel', hParent); % fails!
- xLims = get(hParent,'XData');
- yLims = get(hParent,'YData');
- xPixelsPerData = parentPos(3) / (diff(xLims) + 1);
- yPixelsPerData = parentPos(4) / (diff(yLims) + 1);
- paramsStruct.position(1) = round((paramsStruct.position(1)-xLims(1)) * xPixelsPerData);
- paramsStruct.position(2) = round((paramsStruct.position(2)-yLims(1)) * yPixelsPerData + 2*dY);
- paramsStruct.position(3) = round( paramsStruct.position(3) * xPixelsPerData);
- paramsStruct.position(4) = round( paramsStruct.position(4) * yPixelsPerData);
-
- % Axes position inaccuracy estimation
- if strcmpi(computer('arch'),'win64')
- deltaX = 7;
- deltaY = -7;
- else
- deltaX = 3;
- deltaY = -3;
- end
-
- else % axes/image position was auto-infered (entire image)
- % Axes position inaccuracy estimation
- if strcmpi(computer('arch'),'win64')
- deltaX = 6;
- deltaY = -6;
- else
- deltaX = 2;
- deltaY = -2;
- end
- dW = -2*dX;
- dH = -2*dY;
- end
- end
-
- %hFig = ancestor(hParent,'figure');
- hParent = paramsStruct.hFigure;
-
- elseif paramsStruct.wasInteractive % interactive figure rectangle
-
- % Compensate for 1px rbbox inaccuracies
- deltaX = 2;
- deltaY = -2;
-
- else % non-interactive figure
-
- % Compensate 4px figure boundaries = difference betweeen OuterPosition and Position
- deltaX = -1;
- deltaY = 1;
- end
- %disp(paramsStruct.position) % for debugging
-
- % Now get the pixel position relative to the monitor
- figurePos = getPixelPos(hParent);
- desktopPos = figurePos + parentPos;
-
- % Now convert to Java-based pixels based on screen size
- % Note: multiple monitors are automatically handled correctly, since all
- % ^^^^ Java positions are relative to the main monitor's top-left corner
- javaX = desktopPos(1) + paramsStruct.position(1) + deltaX + dX;
- javaY = screenSize(4) - desktopPos(2) - paramsStruct.position(2) - paramsStruct.position(4) + deltaY + dY;
- width = paramsStruct.position(3) + dW;
- height = paramsStruct.position(4) + dH;
- paramsStruct.position = round([javaX, javaY, width, height]);
- %paramsStruct.position
-
- % Ensure the figure is at the front so it can be screen-captured
- if isFigureValid
- figure(hParent);
- drawnow;
- pause(0.02);
- end
- catch
- % Maybe root/desktop handle (root does not have a 'Position' prop so getPixelPos croaks
- if isequal(double(hParent),0) % =root/desktop handle; handles case of hParent=[]
- javaX = paramsStruct.position(1) - 1;
- javaY = screenSize(4) - paramsStruct.position(2) - paramsStruct.position(4) - 1;
- paramsStruct.position = [javaX, javaY, paramsStruct.position(3:4)];
- end
- end
-%end % convertPos
-
-%% Interactively get the requested capture rectangle
-function [positionRect, jFrameUsed, msgStr] = getInteractivePosition(hFig)
- msgStr = '';
- try
- % First try the invisible-figure approach, in order to
- % enable rbbox outside any existing figure boundaries
- f = figure('units','pixel','pos',[-100,-100,10,10],'HitTest','off');
- drawnow; pause(0.01);
- oldWarn = warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame');
- jf = get(handle(f),'JavaFrame');
- warning(oldWarn);
- try
- jWindow = jf.fFigureClient.getWindow;
- catch
- try
- jWindow = jf.fHG1Client.getWindow;
- catch
- jWindow = jf.getFigurePanelContainer.getParent.getTopLevelAncestor;
- end
- end
- com.sun.awt.AWTUtilities.setWindowOpacity(jWindow,0.05); %=nearly transparent (not fully so that mouse clicks are captured)
- jWindow.setMaximized(1); % no true available in ML6
- jFrameUsed = 1; % no true available in ML6
- msg = {'Mouse-click and drag a bounding rectangle for screen-capture ' ...
- ... %'or single-click any Matlab figure to capture the entire figure.' ...
- };
- catch
- % Something failed, so revert to a simple rbbox on a visible figure
- try delete(f); drawnow; catch, end %Cleanup...
- jFrameUsed = 0; % no false available in ML6
- msg = {'Mouse-click within any Matlab figure and then', ...
- 'drag a bounding rectangle for screen-capture,', ...
- 'or single-click to capture the entire figure'};
- end
- uiwait(msgbox(msg,'ScreenCapture'));
-
- k = waitforbuttonpress; %#ok k is unused
- %hFig = getCurrentFig;
- %p1 = get(hFig,'CurrentPoint');
- positionRect = rbbox;
- %p2 = get(hFig,'CurrentPoint');
-
- if jFrameUsed
- jFrameOrigin = getPixelPos(f);
- delete(f); drawnow;
- try
- figOrigin = getPixelPos(hFig);
- catch % empty/invalid hFig handle
- figOrigin = [0,0,0,0];
- end
- else
- if isempty(hFig)
- jFrameOrigin = getPixelPos(gcf);
- else
- jFrameOrigin = [0,0,0,0];
- end
- figOrigin = [0,0,0,0];
- end
- positionRect(1:2) = positionRect(1:2) + jFrameOrigin(1:2) - figOrigin(1:2);
-
- if prod(positionRect(3:4)) > 0
- msgStr = sprintf('%dx%d area captured',positionRect(3),positionRect(4));
- end
-%end % getInteractivePosition
-
-%% Get current figure (even if its handle is hidden)
-function hFig = getCurrentFig
- oldState = get(0,'showHiddenHandles');
- set(0,'showHiddenHandles','on');
- hFig = get(0,'CurrentFigure');
- set(0,'showHiddenHandles',oldState);
-%end % getCurrentFig
-
-%% Get ancestor figure - used for old Matlab versions that don't have a built-in ancestor()
-function hObj = ancestor(hObj,type)
- if ~isempty(hObj) & ishandle(hObj) %#ok for Matlab 6 compatibility
- try
- hObj = get(hObj,'Ancestor');
- catch
- % never mind...
- end
- try
- %if ~isa(handle(hObj),type) % this is best but always returns 0 in Matlab 6!
- %if ~isprop(hObj,'type') | ~strcmpi(get(hObj,'type'),type) % no isprop() in ML6!
- try
- objType = get(hObj,'type');
- catch
- objType = '';
- end
- if ~strcmpi(objType,type)
- try
- parent = get(handle(hObj),'parent');
- catch
- parent = hObj.getParent; % some objs have no 'Parent' prop, just this method...
- end
- if ~isempty(parent) % empty parent means root ancestor, so exit
- hObj = ancestor(parent,type);
- end
- end
- catch
- % never mind...
- end
- end
-%end % ancestor
-
-%% Get position of an HG object in specified units
-function pos = getPos(hObj,field,units)
- % Matlab 6 did not have hgconvertunits so use the old way...
- oldUnits = get(hObj,'units');
- if strcmpi(oldUnits,units) % don't modify units unless we must!
- pos = get(hObj,field);
- else
- set(hObj,'units',units);
- pos = get(hObj,field);
- set(hObj,'units',oldUnits);
- end
-%end % getPos
-
-%% Get pixel position of an HG object - for Matlab 6 compatibility
-function pos = getPixelPos(hObj,varargin)
- persistent originalObj
- try
- stk = dbstack;
- if ~strcmp(stk(2).name,'getPixelPos')
- originalObj = hObj;
- end
-
- if isFigure(hObj) %| isAxes(hObj)
- %try
- pos = getPos(hObj,'OuterPosition','pixels');
- else %catch
- % getpixelposition is unvectorized unfortunately!
- pos = getpixelposition(hObj,varargin{:});
-
- % add the axes labels/ticks if relevant (plus a tiny margin to fix 2px label/title inconsistencies)
- if isAxes(hObj) & ~isImage(originalObj) %#ok ML6
- tightInsets = getPos(hObj,'TightInset','pixel');
- pos = pos + tightInsets.*[-1,-1,1,1] + [-1,1,1+tightInsets(1:2)];
- end
- end
- catch
- try
- % Matlab 6 did not have getpixelposition nor hgconvertunits so use the old way...
- pos = getPos(hObj,'Position','pixels');
- catch
- % Maybe the handle does not have a 'Position' prop (e.g., text/line/plot) - use its parent
- pos = getPixelPos(get(hObj,'parent'),varargin{:});
- end
- end
-
- % Handle the case of missing/invalid/empty HG handle
- if isempty(pos)
- pos = [0,0,0,0];
- end
-%end % getPixelPos
-
-%% Adds a ScreenCapture toolbar button
-function addToolbarButton(paramsStruct)
- % Ensure we have a valid toolbar handle
- hFig = ancestor(paramsStruct.toolbar,'figure');
- if isempty(hFig)
- error('YMA:screencapture:badToolbar','the ''Toolbar'' parameter must contain a valid GUI handle');
- end
- set(hFig,'ToolBar','figure');
- hToolbar = findall(hFig,'type','uitoolbar');
- if isempty(hToolbar)
- error('YMA:screencapture:noToolbar','the ''Toolbar'' parameter must contain a figure handle possessing a valid toolbar');
- end
- hToolbar = hToolbar(1); % just in case there are several toolbars... - use only the first
-
- % Prepare the camera icon
- icon = ['3333333333333333'; ...
- '3333333333333333'; ...
- '3333300000333333'; ...
- '3333065556033333'; ...
- '3000000000000033'; ...
- '3022222222222033'; ...
- '3022220002222033'; ...
- '3022203110222033'; ...
- '3022201110222033'; ...
- '3022204440222033'; ...
- '3022220002222033'; ...
- '3022222222222033'; ...
- '3000000000000033'; ...
- '3333333333333333'; ...
- '3333333333333333'; ...
- '3333333333333333'];
- cm = [ 0 0 0; ... % black
- 0 0.60 1; ... % light blue
- 0.53 0.53 0.53; ... % light gray
- NaN NaN NaN; ... % transparent
- 0 0.73 0; ... % light green
- 0.27 0.27 0.27; ... % gray
- 0.13 0.13 0.13]; % dark gray
- cdata = ind2rgb(uint8(icon-'0'),cm);
-
- % If the button does not already exit
- hButton = findall(hToolbar,'Tag','ScreenCaptureButton');
- tooltip = 'Screen capture';
- if ~isempty(paramsStruct.target)
- tooltip = [tooltip ' to ' paramsStruct.target];
- end
- if isempty(hButton)
- % Add the button with the icon to the figure's toolbar
- hButton = uipushtool(hToolbar, 'CData',cdata, 'Tag','ScreenCaptureButton', 'TooltipString',tooltip, 'ClickedCallback',['screencapture(''' paramsStruct.target ''')']); %#ok unused
- else
- % Otherwise, simply update the existing button
- set(hButton, 'CData',cdata, 'Tag','ScreenCaptureButton', 'TooltipString',tooltip, 'ClickedCallback',['screencapture(''' paramsStruct.target ''')']);
- end
-%end % addToolbarButton
-
-%% Java-get the actual screen-capture image data
-function imgData = getScreenCaptureImageData(positionRect)
- if isempty(positionRect) | all(positionRect==0) | positionRect(3)<=0 | positionRect(4)<=0 %#ok ML6
- imgData = [];
- else
- % Use java.awt.Robot to take a screen-capture of the specified screen area
- rect = java.awt.Rectangle(positionRect(1), positionRect(2), positionRect(3), positionRect(4));
- robot = java.awt.Robot;
- jImage = robot.createScreenCapture(rect);
-
- % Convert the resulting Java image to a Matlab image
- % Adapted for a much-improved performance from:
- % http://www.mathworks.com/support/solutions/data/1-2WPAYR.html
- h = jImage.getHeight;
- w = jImage.getWidth;
- %imgData = zeros([h,w,3],'uint8');
- %pixelsData = uint8(jImage.getData.getPixels(0,0,w,h,[]));
- %for i = 1 : h
- % base = (i-1)*w*3+1;
- % imgData(i,1:w,:) = deal(reshape(pixelsData(base:(base+3*w-1)),3,w)');
- %end
-
- % Performance further improved based on feedback from Urs Schwartz:
- %pixelsData = reshape(typecast(jImage.getData.getDataStorage,'uint32'),w,h).';
- %imgData(:,:,3) = bitshift(bitand(pixelsData,256^1-1),-8*0);
- %imgData(:,:,2) = bitshift(bitand(pixelsData,256^2-1),-8*1);
- %imgData(:,:,1) = bitshift(bitand(pixelsData,256^3-1),-8*2);
-
- % Performance even further improved based on feedback from Jan Simon:
- pixelsData = reshape(typecast(jImage.getData.getDataStorage, 'uint8'), 4, w, h);
- imgData = cat(3, ...
- transpose(reshape(pixelsData(3, :, :), w, h)), ...
- transpose(reshape(pixelsData(2, :, :), w, h)), ...
- transpose(reshape(pixelsData(1, :, :), w, h)));
- end
-%end % getInteractivePosition
-
-%% Return the figure to its pre-undocked state (when relevant)
-function redockFigureIfRelevant(paramsStruct)
- if paramsStruct.wasDocked
- try
- set(paramsStruct.hFigure,'WindowStyle','docked');
- %drawnow;
- catch
- % never mind - ignore...
- end
- end
-%end % redockFigureIfRelevant
-
-%% Copy screen-capture to the system clipboard
-% Adapted from http://www.mathworks.com/matlabcentral/fileexchange/28708-imclipboard/content/imclipboard.m
-function imclipboard(imgData)
- % Import necessary Java classes
- import java.awt.Toolkit.*
- import java.awt.image.BufferedImage
- import java.awt.datatransfer.DataFlavor
-
- % Add the necessary Java class (ImageSelection) to the Java classpath
- if ~exist('ImageSelection', 'class')
- % Obtain the directory of the executable (or of the M-file if not deployed)
- %javaaddpath(fileparts(which(mfilename)), '-end');
- if isdeployed % Stand-alone mode.
- [status, result] = system('path'); %#ok
- MatLabFilePath = char(regexpi(result, 'Path=(.*?);', 'tokens', 'once'));
- else % MATLAB mode.
- MatLabFilePath = fileparts(mfilename('fullpath'));
- end
- javaaddpath(MatLabFilePath, '-end');
- end
-
- % Get System Clipboard object (java.awt.Toolkit)
- cb = getDefaultToolkit.getSystemClipboard; % can't use () in ML6!
-
- % Get image size
- ht = size(imgData, 1);
- wd = size(imgData, 2);
-
- % Convert to Blue-Green-Red format
- imgData = imgData(:, :, [3 2 1]);
-
- % Convert to 3xWxH format
- imgData = permute(imgData, [3, 2, 1]);
-
- % Append Alpha data (not used)
- imgData = cat(1, imgData, 255*ones(1, wd, ht, 'uint8'));
-
- % Create image buffer
- imBuffer = BufferedImage(wd, ht, BufferedImage.TYPE_INT_RGB);
- imBuffer.setRGB(0, 0, wd, ht, typecast(imgData(:), 'int32'), 0, wd);
-
- % Create ImageSelection object
- % % custom java class
- imSelection = ImageSelection(imBuffer);
-
- % Set clipboard content to the image
- cb.setContents(imSelection, []);
-%end %imclipboard
-
-%% Is the provided handle a figure?
-function flag = isFigure(hObj)
- flag = isa(handle(hObj),'figure') | isa(hObj,'matlab.ui.Figure');
-%end %isFigure
-
-%% Is the provided handle an axes?
-function flag = isAxes(hObj)
- flag = isa(handle(hObj),'axes') | isa(hObj,'matlab.graphics.axis.Axes');
-%end %isFigure
-
-%% Is the provided handle an image?
-function flag = isImage(hObj)
- flag = isa(handle(hObj),'image') | isa(hObj,'matlab.graphics.primitive.Image');
-%end %isFigure
-
-%%%%%%%%%%%%%%%%%%%%%%%%%% TODO %%%%%%%%%%%%%%%%%%%%%%%%%
-% find a way in interactive-mode to single-click another Matlab figure for screen-capture
\ No newline at end of file
diff --git a/GPE Solver/+Plotter/Analysis.m b/GPE Solver/+Plotter/Analysis.m
deleted file mode 100644
index df85ab4..0000000
--- a/GPE Solver/+Plotter/Analysis.m
+++ /dev/null
@@ -1,50 +0,0 @@
- set(0,'defaulttextInterpreter','latex')
- set(groot, 'defaultAxesTickLabelInterpreter','latex'); set(groot, 'defaultLegendInterpreter','latex');
- format long
-
- runIdx = 6;
-
- load(sprintf('./Data/Run_%03i/psi_gs.mat',runIdx),'psi','muchem','Observ','t_idx','Transf','Params','VDk','V');
-
- x = Transf.x*Params.l0*1e6;
- y = Transf.y*Params.l0*1e6;
- z = Transf.z*Params.l0*1e6;
- %percentcomplete = linspace(0,1,Params.cut_off/200);
-
- dx = x(2)-x(1); dy = y(2)-y(1); dz = z(2)-z(1);
- %Plotting
- subplot(2,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('$x$ [$\mu$m]'); ylabel('$z$ [$\mu$m]');
-
- subplot(2,3,2)
- plotyz = pcolor(y,z,nyz');
- set(plotyz, 'EdgeColor', 'none');
- xlabel('$y$ [$\mu$m]'); ylabel('$z$ [$\mu$m]');
-
- subplot(2,3,3)
- plotxy = pcolor(x,y,nxy');
- set(plotxy, 'EdgeColor', 'none');
- xlabel('$x$ [$\mu$m]'); ylabel('$y$ [$\mu$m]');
-
- subplot(2,3,4)
- plot(-log10(Observ.residual),'-b')
- ylabel('$-\mathrm{log}_{10}(r)$'); xlabel('steps');
-
- subplot(2,3,5)
- plot(Observ.EVec,'-b')
- ylabel('$E$'); xlabel('steps');
-
- subplot(2,3,6)
- plot(Observ.mucVec,'-b')
- ylabel('$\mu$'); xlabel('steps');
-% xlim([0,1]); ylim([0,8]);
-% xlim([0,1]); ylim([0,8]);
-
- Ecomp = energy_components(psi,Params,Transf,VDk,V);
diff --git a/GPE Solver/+Plotter/MakeMovie.m b/GPE Solver/+Plotter/MakeMovie.m
deleted file mode 100644
index 8842cbd..0000000
--- a/GPE Solver/+Plotter/MakeMovie.m
+++ /dev/null
@@ -1,77 +0,0 @@
-set(0,'defaulttextInterpreter','latex')
-set(groot, 'defaultAxesTickLabelInterpreter','latex'); set(groot, 'defaultLegendInterpreter','latex');
-
-RunIdx = 1;
-
-FileDir = dir(sprintf('./Data/Run_%03i/TimeEvolution/*.mat',RunIdx));
-NumFiles = numel(FileDir);
-QuenchSettings = load(sprintf('./Data/Run_%03i/QuenchSettings',RunIdx),'Quench','Params','Transf','VDk','V');
-Transf = QuenchSettings.Transf; Params = QuenchSettings.Params;
-x = Transf.x; y = Transf.y; z = Transf.z;
-dx = x(2)-x(1); dy = y(2)-y(1); dz = z(2)-z(1);
-
-mkdir(sprintf('./Data/Run_%03i/Figures',RunIdx))
-outputVideo = VideoWriter(fullfile('./Data/Movie.avi'));
-outputVideo.FrameRate = 10;
-open(outputVideo)
-
-figure(1);
-x0 = 800;
-y0 = 200;
-width = 800;
-height = 600;
-set(gcf,'position',[x0,y0,width,height])
-
-EVecTemp = [];
-
-for ii = 2:(NumFiles-1)
- load(sprintf('./Data/Run_%03i/TimeEvolution/psi_%i.mat',RunIdx,ii),'psi','muchem','T','Observ','t_idx');
-
- %Plotting
- subplot(2,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'); shading interp
- set(plotxz, 'EdgeColor', 'none');
- xlabel('$x$ [$\mu$m]'); ylabel('$z$ [$\mu$m]');
-
- subplot(2,3,2)
- plotyz = pcolor(y,z,nyz'); shading interp
- set(plotyz, 'EdgeColor', 'none');
- xlabel('$y$ [$\mu$m]'); ylabel('$z$ [$\mu$m]');
-
- subplot(2,3,3)
- plotxy = pcolor(x,y,nxy'); shading interp
- set(plotxy, 'EdgeColor', 'none');
- xlabel('$x$ [$\mu$m]'); ylabel('$y$ [$\mu$m]');
-
- subplot(2,3,4)
- plot(Observ.tVecPlot*1000/Params.w0,Observ.NormVec,'-b')
- ylabel('Normalization'); xlabel('$t$ [$m$s]');
-
- subplot(2,3,5)
- plot(Observ.tVecPlot*1000/Params.w0,1-2*Observ.PCVec/pi,'-b')
- ylabel('Coherence'); xlabel('$t$ [$m$s]');
- ylim([0,1])
-
- subplot(2,3,6)
- plot(Observ.tVecPlot*1000/Params.w0,Observ.EVec,'-b')
- ylabel('E'); xlabel('$t$ [$m$s]');
-
- tVal = Observ.tVecPlot(end)*1000/Params.w0;
- sgtitle(sprintf('$\\mu =%.3f \\hbar\\omega_0$, $T=%.1f$nK, $t=%.1f$ms',muchem,T,tVal))
-
- drawnow
- saveas(gcf,sprintf('./Data/Run_%03i/Figures/Image_%i.jpg',RunIdx,ii))
- img = imread(sprintf('./Data/Run_%03i/Figures/Image_%i.jpg',RunIdx,ii));
- writeVideo(outputVideo,img)
-% hold off;
- clf
-end
-
-close(outputVideo)
-close(figure(1))
-delete(sprintf('./Data/Run_%03i/Figures/*.jpg',RunIdx)) % deleting images after movie is made
\ No newline at end of file
diff --git a/GPE Solver/+Plotter/OrderParameter_m.m b/GPE Solver/+Plotter/OrderParameter_m.m
deleted file mode 100644
index 2ce76dc..0000000
--- a/GPE Solver/+Plotter/OrderParameter_m.m
+++ /dev/null
@@ -1,58 +0,0 @@
-function [m_Order] = OrderParameter_m(psi,Transf,Params,VDk,V,T,muchem)
-
- NumRealiz = 100;
-
- Mx = numel(Transf.x);
- My = numel(Transf.y);
- Mz = numel(Transf.z);
-
- r = normrnd(0,1,size(psi));
- theta = rand(size(psi));
- noise = r.*exp(2*pi*1i*theta);
-
- KEop= 0.5*(Transf.KX.^2+Transf.KY.^2+Transf.KZ.^2);
- Gamma = 1-1i*Params.gamma_S;
- dt = Params.dt;
-
- avgpsi = 0;
- avgpsi2 = 0;
-
- for jj = 1:NumRealiz
- %generate initial state
- xi = sqrt(2*Params.gamma_S*Params.kbol*T*10^(-9)*dt/(Params.hbar*Params.w0*Transf.dx*Transf.dy*Transf.dz));
- swapx = randi(length(Transf.x),1,length(Transf.x));
- swapy = randi(length(Transf.y),1,length(Transf.y));
- swapz = randi(length(Transf.z),1,length(Transf.z));
- psi_j = psi + xi * noise(swapx,swapy,swapz);
-
- % --- % propagate forward in time 1 time step:
- %kin
- psi_j = fftn(psi_j);
- psi_j = psi_j.*exp(-0.5*1i*Gamma*dt*KEop);
- psi_j = ifftn(psi_j);
-
- %DDI
- frho = fftn(abs(psi_j).^2);
- Phi = real(ifftn(frho.*VDk));
-
- %Real-space
- psi_j = psi_j.*exp(-1i*Gamma*dt*(V + Params.gs*abs(psi_j).^2 + Params.gammaQF*abs(psi_j).^3 + Params.gdd*Phi - muchem));
-
- %kin
- psi_j = fftn(psi_j);
- psi_j = psi_j.*exp(-0.5*1i*Gamma*dt*KEop);
- psi_j = ifftn(psi_j);
-
- %Projection
- kcut = sqrt(2*Params.e_cut);
- K = (Transf.KX.^2+Transf.KY.^2+Transf.KZ.^2) depends on how Vdk (DDI) is defined
-
-%Trap gamma
-Params.gx=(Params.wx/w0)^2;
-Params.gy=(Params.wy/w0)^2;
-Params.gz=(Params.wz/w0)^2;
-
-%Loading the rest into Params
-Params.hbar = hbar; Params.kbol = kbol; Params.mu0 = mu0; Params.muB = muB; Params.a0 = a0;
-Params.w0 = w0; Params.l0 = l0;
\ No newline at end of file
diff --git a/GPE Solver/+Simulator/running_file.m b/GPE Solver/+Simulator/running_file.m
deleted file mode 100644
index f980611..0000000
--- a/GPE Solver/+Simulator/running_file.m
+++ /dev/null
@@ -1,23 +0,0 @@
-%-% Running file %-%
-clearvars
-
-njob = 6;
-
-mkdir(sprintf('./Data'))
-mkdir(sprintf('./Data/Run_%03i',njob))
-
-%Obtain simulation parameters
-[Params] = parameters();
-
-%Set up spatial grids and transforms
-[Transf] = setup_space(Params);
-
-[psi,V,VDk] = Initialize(Params,Transf);
-
-% --- Initialize
-Observ.EVec = []; Observ.NormVec = []; Observ.PCVec = []; Observ.tVecPlot = []; Observ.mucVec = [];
-t_idx = 1; %Start at t = 0;
-Observ.res_idx = 1;
-
-
-[psi] = ssfm_imag(psi,Params,Transf,VDk,V,njob,t_idx,Observ);
\ No newline at end of file
diff --git a/GPE Solver/+Simulator/setup_space.m b/GPE Solver/+Simulator/setup_space.m
deleted file mode 100644
index 9929e31..0000000
--- a/GPE Solver/+Simulator/setup_space.m
+++ /dev/null
@@ -1,32 +0,0 @@
-function [Transf] = setup_space(Params)
-Transf.Xmax = 0.5*Params.Lx;
-Transf.Ymax = 0.5*Params.Ly;
-Transf.Zmax = 0.5*Params.Lz;
-
-Nz = Params.Nz; Nx = Params.Nx; Ny = Params.Ny;
-
-% Fourier grids
-x = linspace(-0.5*Params.Lx,0.5*Params.Lx-Params.Lx/Params.Nx,Params.Nx);
-Kmax = pi*Params.Nx/Params.Lx;
-kx = linspace(-Kmax,Kmax,Nx+1);
-kx = kx(1:end-1); dkx = kx(2)-kx(1);
-kx = fftshift(kx);
-
-y = linspace(-0.5*Params.Ly,0.5*Params.Ly-Params.Ly/Params.Ny,Params.Ny);
-Kmax = pi*Params.Ny/Params.Ly;
-ky = linspace(-Kmax,Kmax,Ny+1);
-ky = ky(1:end-1); dky = ky(2)-ky(1);
-ky = fftshift(ky);
-
-z = linspace(-0.5*Params.Lz,0.5*Params.Lz-Params.Lz/Params.Nz,Params.Nz);
-Kmax = pi*Params.Nz/Params.Lz;
-kz = linspace(-Kmax,Kmax,Nz+1);
-kz = kz(1:end-1); dkz = kz(2)-kz(1);
-kz = fftshift(kz);
-
-[Transf.X,Transf.Y,Transf.Z]=ndgrid(x,y,z);
-[Transf.KX,Transf.KY,Transf.KZ]=ndgrid(kx,ky,kz);
-Transf.x = x; Transf.y = y; Transf.z = z;
-Transf.kx = kx; Transf.ky = ky; Transf.kz = kz;
-Transf.dx = x(2)-x(1); Transf.dy = y(2)-y(1); Transf.dz = z(2)-z(1);
-Transf.dkx = dkx; Transf.dky = dky; Transf.dkz = dkz;
\ No newline at end of file
diff --git a/GPE Solver/+Simulator/setup_space_radial.m b/GPE Solver/+Simulator/setup_space_radial.m
deleted file mode 100644
index 3887b9e..0000000
--- a/GPE Solver/+Simulator/setup_space_radial.m
+++ /dev/null
@@ -1,311 +0,0 @@
-function [Transf] = setup_space_radial(Params,morder)
-Zmax = 0.5*Params.Lz;
-Rmax = Params.Lr;
-Nz = Params.Nz;
-Nr = Params.Nr;
-
-if(nargin==1)
- morder=0; %only do Bessel J0
-end
-
-% Fourier grids
-z=linspace(-Zmax,Zmax,Nz+1);
-z=z(1:end-1);
-dz=z(2)-z(1);
-Kmax=Nz*2*pi/(4*Zmax);
-kz=linspace(-Kmax,Kmax,Nz+1);
-kz=kz(1:end-1);
-
-% Hankel grids and transform
-H = hankelmatrix(morder,Rmax,Nr);
-r=H.r(:);
-kr=H.kr(:);
-T = diag(H.J/H.kmax)*H.T*diag(Rmax./H.J)*dz*(2*pi);
-Tinv = diag(H.J./Rmax)*H.T'*diag(H.kmax./H.J)/dz/(2*pi);
-wr=H.wr;
-wk=H.wk;
-% H.T'*diag(H.J/H.vmax)*H.T*diag(Rmax./H.J)
-
-[Transf.R,Transf.Z]=ndgrid(r,z);
-[Transf.KR,Transf.KZ]=ndgrid(kr,kz);
-Transf.T=T;
-Transf.Tinv=Tinv;
-Transf.r=r;
-Transf.kr=kr;
-Transf.z=z;
-Transf.kz=kz;
-Transf.wr=wr;
-Transf.wk=wk;
-Transf.Rmax=Rmax;
-Transf.Zmax=Zmax;
-Transf.dz=z(2)-z(1);
-Transf.dkz=kz(2)-kz(1);
-%b1=Transf;
-
-function s_HT = hankelmatrix(order, rmax, Nr, eps_roots)
-%HANKEL_MATRIX: Generates data to use for Hankel Transforms
-%
-% s_HT = hankel_matrix(order, rmax, Nr, eps_roots)
-%
-% s_HT = Structure containing data to use for the pQDHT
-% order = Transform order
-% rmax = Radial extent of transform
-% Nr = Number of sample points
-% eps_roots = Error in estimation of roots of Bessel function (optional)
-%
-% s_HT:
-% order, rmax, Nr = As above
-% J_roots = Roots of the pth order Bessel fn.
-% J_roots_N1 = (N+1)th root
-% r = Radial co-ordinate vector
-% v = frequency co-ordinate vector
-% kr = Radial wave number co-ordinate vector
-% vmax = Limiting frequency
-% = roots_N1 / (2*pi*rmax)
-% S = rmax * 2*pi*vmax (S product)
-% T = Transform matrix
-% J = Scaling vector
-% = J_(order+1){roots}
-%
-% The algorithm used is that from:
-% "Computation of quasi-discrete Hankel transforms of the integer
-% order for propagating optical wave fields"
-% Manuel Guizar-Sicairos and Julio C. Guitierrez-Vega
-% J. Opt. Soc. Am. A 21(1) 53-58 (2004)
-%
-% The algorithm also calls the function:
-% zn = bessel_zeros(1, p, Nr+1, 1e-6),
-% where p and N are defined above, to calculate the roots of the bessel
-% function. This algorithm is taken from:
-% "An Algorithm with ALGOL 60 Program for the Computation of the
-% zeros of the Ordinary Bessel Functions and those of their
-% Derivatives".
-% N. M. Temme
-% Journal of Computational Physics, 32, 270-279 (1979)
-%
-% Example: Propagation of radial field
-%
-% % Note the use of matrix and element products / divisions
-% H = hankel_matrix(0, 1e-3, 512);
-% DR0 = 50e-6;
-% Ur0 = exp(-(H.r/DR0).^2);
-% Ukr0 = H.T * (Ur0./H.J);
-% k0 = 2*pi/800e-9;
-% kz = realsqrt((k0^2 - H.kr.^2).*(k0>H.kr));
-% z = (-5e-3:1e-5:5e-3);
-% Ukrz = (Ukr0*ones(1,length(z))).*exp(i*kz*z);
-% Urz = (H.T * Ukrz) .* (H.J * ones(1,length(z)));
-%
-% See also bessel_zeros, besselj
-
-if (~exist('eps_roots', 'var')||isemtpy(eps_roots))
- s_HT.eps_roots = 1e-6;
-else
- s_HT.eps_roots = eps_roots;
-end
-
-s_HT.order = order;
-s_HT.rmax = rmax;
-s_HT.Nr = Nr;
-
-% Calculate N+1 roots:
-J_roots = bessel_zeros(1, s_HT.order, s_HT.Nr+1, s_HT.eps_roots);
-s_HT.J_roots = J_roots(1:end-1);
-s_HT.J_roots_N1 = J_roots(end);
-
-% Calculate co-ordinate vectors
-s_HT.r = s_HT.J_roots * s_HT.rmax / s_HT.J_roots_N1;
-s_HT.v = s_HT.J_roots / (2*pi * s_HT.rmax);
-s_HT.kr = 2*pi * s_HT.v;
-s_HT.kmax = s_HT.J_roots_N1 / (s_HT.rmax);
-s_HT.vmax = s_HT.J_roots_N1 / (2*pi * s_HT.rmax);
-s_HT.S = s_HT.J_roots_N1;
-
-% Calculate hankel matrix and vectors
-% I use (p=order) and (p1=order+1)
-Jp = besselj(s_HT.order, (s_HT.J_roots) * (s_HT.J_roots.') / s_HT.S);
-Jp1 = abs(besselj(s_HT.order+1, s_HT.J_roots));
-s_HT.T = 2*Jp./(Jp1 * (Jp1.') * s_HT.S);
-s_HT.J = Jp1;
-s_HT.wr=2./((s_HT.kmax)^2*abs(Jp1).^2);
-s_HT.wk=2./((s_HT.rmax)^2*abs(Jp1).^2);
-
-return
-
-
-
-
-function z = bessel_zeros(d, a, n, e)
-%BESSEL_ZEROS: Finds the first n zeros of a bessel function
-%
-% z = bessel_zeros(d, a, n, e)
-%
-% z = zeros of the bessel function
-% d = Bessel function type:
-% 1: Ja
-% 2: Ya
-% 3: Ja'
-% 4: Ya'
-% a = Bessel order (a>=0)
-% n = Number of zeros to find
-% e = Relative error in root
-%
-% This function uses the routine described in:
-% "An Algorithm with ALGOL 60 Program for the Computation of the
-% zeros of the Ordinary Bessel Functions and those of their
-% Derivatives".
-% N. M. Temme
-% Journal of Computational Physics, 32, 270-279 (1979)
-
-z = zeros(n, 1);
-aa = a^2;
-mu = 4*aa;
-mu2 = mu^2;
-mu3 = mu^3;
-mu4 = mu^4;
-
-if (d<3)
- p = 7*mu - 31;
- p0 = mu - 1;
- if ((1+p)==p)
- p1 = 0;
- q1 = 0;
- else
- p1 = 4*(253*mu2 - 3722*mu+17869)*p0/(15*p);
- q1 = 1.6*(83*mu2 - 982*mu + 3779)/p;
- end
-else
- p = 7*mu2 + 82*mu - 9;
- p0 = mu + 3;
- if ((p+1)==1)
- p1 = 0;
- q1 = 0;
- else
- p1 = (4048*mu4 + 131264*mu3 - 221984*mu2 - 417600*mu + 1012176)/(60*p);
- q1 = 1.6*(83*mu3 + 2075*mu2 - 3039*mu + 3537)/p;
- end
-end
-
-if (d==1)|(d==4)
- t = .25;
-else
- t = .75;
-end
-tt = 4*t;
-
-if (d<3)
- pp1 = 5/48;
- qq1 = -5/36;
-else
- pp1 = -7/48;
- qq1 = 35/288;
-end
-
-y = .375*pi;
-if (a>=3)
- bb = a^(-2/3);
-else
- bb = 1;
-end
-a1 = 3*a - 8;
-% psi = (.5*a + .25)*pi;
-
-for s=1:n
- if ((a==0)&(s==1)&(d==3))
- x = 0;
- j = 0;
- else
- if (s>=a1)
- b = (s + .5*a - t)*pi;
- c = .015625/(b^2);
- x = b - .125*(p0 - p1*c)/(b*(1 - q1*c));
- else
- if (s==1)
- switch (d)
- case (1)
- x = -2.33811;
- case (2)
- x = -1.17371;
- case (3)
- x = -1.01879;
- otherwise
- x = -2.29444;
- end
- else
- x = y*(4*s - tt);
- v = x^(-2);
- x = -x^(2/3) * (1 + v*(pp1 + qq1*v));
- end
- u = x*bb;
- v = fi(2/3 * (-u)^1.5);
- w = 1/cos(v);
- xx = 1 - w^2;
- c = sqrt(u/xx);
- if (d<3)
- x = w*(a + c*(-5/u - c*(6 - 10/xx))/(48*a*u));
- else
- x = w*(a + c*(7/u + c*(18 - 14/xx))/(48*a*u));
- end
- end
- j = 0;
-
-while ((j==0)|((j<5)&(abs(w/x)>e)))
- xx = x^2;
- x4 = x^4;
- a2 = aa - xx;
- r0 = bessr(d, a, x);
- j = j+1;
- if (d<3)
- u = r0;
- w = 6*x*(2*a + 1);
- p = (1 - 4*a2)/w;
- q = (4*(xx-mu) - 2 - 12*a)/w;
- else
- u = -xx*r0/a2;
- v = 2*x*a2/(3*(aa+xx));
- w = 64*a2^3;
- q = 2*v*(1 + mu2 + 32*mu*xx + 48*x4)/w;
- p = v*(1 + (40*mu*xx + 48*x4 - mu2)/w);
- end
- w = u*(1 + p*r0)/(1 + q*r0);
- x = x+w;
- end
- z(s) = x;
- end
-end
-
-
-function FI = fi(y)
- c1 = 1.570796;
- if (~y)
- FI = 0;
- elseif (y>1e5)
- FI = c1;
- else
- if (y<1)
- p = (3*y)^(1/3);
- pp = p^2;
- p = p*(1 + pp*(pp*(27 - 2*pp) - 210)/1575);
- else
- p = 1/(y + c1);
- pp = p^2;
- p = c1 - p*(1 + pp*(2310 + pp*(3003 + pp*(4818 + pp*(8591 + pp*16328))))/3465);
- end
- pp = (y+p)^2;
- r = (p - atan(p+y))/pp;
- FI = p - (1+pp)*r*(1 + r/(p+y));
- end
-return
-
-function Jr = bessr(d, a, x)
- switch (d)
- case (1)
- Jr = besselj(a, x)./besselj(a+1, x);
- case (2)
- Jr = bessely(a, x)./bessely(a+1, x);
- case (3)
- Jr = a./x - besselj(a+1, x)./besselj(a, x);
- otherwise
- Jr = a./x - bessely(a+1, x)./bessely(a, x);
- end
-return
\ No newline at end of file
diff --git a/GPE Solver/+Simulator/ssfm_imag.m b/GPE Solver/+Simulator/ssfm_imag.m
deleted file mode 100644
index dc84401..0000000
--- a/GPE Solver/+Simulator/ssfm_imag.m
+++ /dev/null
@@ -1,98 +0,0 @@
-function [psi] = ssfm_imag(psi,Params,Transf,VDk,V,njob,t_idx,Observ)
-
-set(0,'defaulttextInterpreter','latex')
-set(groot, 'defaultAxesTickLabelInterpreter','latex'); set(groot, 'defaultLegendInterpreter','latex');
-
-dt=-1j*abs(Params.dt);
-
-KEop= 0.5*(Transf.KX.^2+Transf.KY.^2+Transf.KZ.^2);
-Observ.residual = 1; Observ.res = 1;
-
-figure(1)
-muchem = chemicalpotential(psi,Params,Transf,VDk,V);
-runningplot(psi,Params,Transf,Observ)
-drawnow
-
-AdaptIdx = 0;
-
-while t_idx < Params.cut_off
- %kin
- psi = fftn(psi);
- psi = psi.*exp(-0.5*1i*dt*KEop);
- psi = ifftn(psi);
-
- %DDI
- frho = fftn(abs(psi).^2);
- Phi = real(ifftn(frho.*VDk));
-
- %Real-space
- psi = psi.*exp(-1i*dt*(V + Params.gs*abs(psi).^2 + Params.gammaQF*abs(psi).^3 + Params.gdd*Phi - muchem));
-
- %kin
- psi = fftn(psi);
- psi = psi.*exp(-0.5*1i*dt*KEop);
- psi = ifftn(psi);
-
- %Renorm
- Norm = trapz(abs(psi(:)).^2)*Transf.dx*Transf.dy*Transf.dz;
- psi = sqrt(Params.N)*psi/sqrt(Norm);
-
- muchem = chemicalpotential(psi,Params,Transf,VDk,V);
-
- %Plotting loop
- if mod(t_idx,1000) == 0
-
- %Change in Energy
- E = energytotal(psi,Params,Transf,VDk,V);
- E = E/Norm;
- Observ.EVec = [Observ.EVec E];
-
- %Chemical potential
- Observ.mucVec = [Observ.mucVec muchem];
-
- %Normalized residuals
- res = norm_resid(psi,Params,Transf,VDk,V,muchem);
- Observ.residual = [Observ.residual res];
-
- Observ.res_idx = Observ.res_idx + 1;
- figure(1)
- runningplot(psi,Params,Transf,Observ)
- drawnow
-
- save(sprintf('./Data/Run_%03i/psi_gs.mat',njob),'psi','muchem','Observ','t_idx','Transf','Params','VDk','V');
-
- %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);
- if relres <1e-5
- if AdaptIdx > 4 && abs(dt) > Params.mindt
- dt = dt / 2;
- fprintf('Time step changed to '); disp(dt);
- AdaptIdx = 0;
- elseif AdaptIdx > 4 && abs(dt) < Params.mindt
- break
- else
- AdaptIdx = AdaptIdx + 1;
- end
- else
- AdaptIdx = 0;
- end
- end
- if any(isnan(psi(:)))
- disp('Idiot.')
- break
- end
- t_idx=t_idx+1;
-end
-
-
-%Change in Energy
-E = energytotal(psi,Params,Transf,VDk,V)
-E = E/Norm;
-Observ.EVec = [Observ.EVec E];
-
-% Phase coherence
-[PhaseC] = PhaseCoherence(psi,Transf,Params);
-Observ.PCVec = [Observ.PCVec PhaseC];
-
-Observ.res_idx = Observ.res_idx + 1;
-save(sprintf('./Data/Run_%03i/psi_gs.mat',njob),'psi','muchem','Observ','t_idx','Transf','Params','VDk','V');
\ No newline at end of file
diff --git a/ODT Calculator/Calculator.py b/ODT Calculator/Calculator.py
index 94ae4b5..b8b0079 100644
--- a/ODT Calculator/Calculator.py
+++ b/ODT Calculator/Calculator.py
@@ -3,6 +3,9 @@ from scipy.optimize import curve_fit
from scipy import interpolate
from astropy import units as u, constants as ac
+from Potentials import *
+from Helpers import *
+
DY_POLARIZABILITY = 184.4 # in a.u, most precise measured value of Dy polarizability
DY_MASS = 164*u.u
DY_DIPOLE_MOMENT = 9.93 * ac.muB
diff --git a/ODT Calculator/ODTCalculations.ipynb b/ODT Calculator/ODTCalculations.ipynb
index 0fd86d8..b27772c 100644
--- a/ODT Calculator/ODTCalculations.ipynb
+++ b/ODT Calculator/ODTCalculations.ipynb
@@ -7,8 +7,11 @@
"metadata": {},
"outputs": [],
"source": [
- "from calculateDipoleTrapPotential import *\n",
- "%matplotlib notebook"
+ "from Calculator import *\n",
+ "from Potentials import *\n",
+ "from Helpers import *\n",
+ "from Plotter import *\n",
+ "# %matplotlib notebook"
]
},
{
@@ -21,12 +24,31 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"id": "38c770ac",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "C:\\Users\\Karthik\\anaconda3\\envs\\Py39VEnv\\lib\\site-packages\\scipy\\optimize\\_minpack_py.py:1010: OptimizeWarning: Covariance of the parameters could not be estimated\n",
+ " warnings.warn('Covariance of the parameters could not be estimated',\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3kAAAKyCAYAAABoqBcWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAADRzUlEQVR4nOzdd3xV9eH/8de52XtvyCBhg4KAMlRABVFr1fpta62D1tH+1NYW21q6HK3a1tHdfmv1q7W12trWuiu4F8oQkB0SSAjZi+xxc+/5/XFuIpGVQHLPHe/n45HHXSfhnUMIeefzOZ+PYZqmiYiIiIiIiAQEh90BREREREREZOSo5ImIiIiIiAQQlTwREREREZEAopInIiIiIiISQFTyREREREREAohKnoiIiIiISABRyRMREREREQkgKnkiIiIiIiIBRCVPREREREQkgKjkiYiIiIiIBJCgLnm///3vKSgoIDIyklmzZvH222/bHUlEREREROSEBG3J+/vf/843vvENvv/977Nx40bOOOMMzjvvPPbt22d3NBERERERkeNmmKZp2h3CDqeddhqnnHIKf/jDHwaemzx5MhdffDH33HOPjclERERERESOX1CO5PX29rJhwwaWLl066PmlS5fy3nvv2ZRKRERERETkxIXaHcAODQ0NuFwuMjIyBj2fkZFBTU3NYd+np6eHnp6egcdut5umpiZSUlIwDGNU84qIiIiIiJimSVtbG9nZ2TgcRx6vC8qS1++T5cw0zSMWtnvuuYc77rjDG7FERERERESOqKKigjFjxhzx9aAseampqYSEhBwyaldXV3fI6F6/lStXsmLFioHHLS0t5ObmsnfvXuLi4kY171A4nU5ef/11Fi9eTFhYmN1xAprOtcU0TXpdJr1OF919brr7XPQ63WQlRhIdbn1r2V3bxqb9LbR29dHW00dbdx/tPU7aul0c6HJyx6cmMT7D+vfz6JpyfvVq6RH/vF98bjqLJqQBUNPaTV1rD0XpMQN/lpwYfV17j8619wTkua7bTug/rsDobsZMm0LfZ/4P4g7/s8toONDZy87adnbWtOFymVxzev7Aa0t+8TYNHc7Dvl9uchTP3DBv4PFP/7uLtq4+EmPCiI8MIzYyhOjwEKLDQkmKCePU/OSBY5s7egl1GISFOggLcRDi0AyqgPza9lG+dq7b2tooKCg4Zv8I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",
+ "text/plain": [
+ "