<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bose Research Group</title><link>https://bose-research-group.github.io/</link><atom:link href="https://bose-research-group.github.io/index.xml" rel="self" type="application/rss+xml"/><description>Bose Research Group</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Fri, 07 Aug 2026 12:38:53 +0530</lastBuildDate><image><url>https://bose-research-group.github.io/media/icon_hu_9bd251d90a98e6b2.png</url><title>Bose Research Group</title><link>https://bose-research-group.github.io/</link></image><item><title>Newton's Laws of Motion</title><link>https://bose-research-group.github.io/courses/intro-thermo-stat-mech/01-classical-mechanics/01-01-newtons-laws/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/courses/intro-thermo-stat-mech/01-classical-mechanics/01-01-newtons-laws/</guid><description>&lt;p>To develop the Newton&amp;rsquo;s formulation of classical equation, first we need to
discuss the essential description of a physical system. At an elementary level,
one can think of a macro-system as a collection of $N$ point particles, the
$j$th one located at $\vec{r}_j(t)$ at time $t$, with a velocity given by
$$\vec{v}_j = \frac{d\vec{r}_j}{dt}.$$
The momentum of the $j$th particle is defined as $\vec{p}_j = m_j\vec{v}_j$.&lt;/p>
&lt;p>First, we list the three laws of classical mechanics formulated by Newton:&lt;/p>
&lt;ol>
&lt;li>In absence of external forces, a body would either be at rest or execute motion in a straight line with a constant velocity $\vec{v}$.&lt;/li>
&lt;li>The action of an external force on a body is to induce a change in momentum, $\vec{p}$. More precisely, $\vec{F}_\text{ext} = \frac{\text{d}\vec{p}}{\text{d}t}$.&lt;/li>
&lt;li>The force exerted by body $B$ on body $A$ is equal in magnitude and opposite in direction to the force exerted by body $A$ on body $B$.&lt;/li>
&lt;/ol>
&lt;p>Note, that of the three Newtonian laws, only the second law has all the physics.
The other two laws can be seen to be applications of this law.&lt;/p>
&lt;blockquote>
&lt;p>Can you derive Newton&amp;rsquo;s first and third laws starting from the second law?&lt;/p>&lt;/blockquote>
&lt;p>Before moving to a further discussion of multiple particles, let us discuss a few properties at the one particle level. These properties would also go through for multiple particles.&lt;/p>
&lt;h2 id="work-done-by-external-force">Work Done by External Force&lt;/h2>
&lt;p>Work done by an external force which moves a particle from point 1 to 2 along a path $\vec{s}$ is given by
$$W = \int_1^2 \vec{F}\cdot d\vec{s}$$
$$=m\int_{t_1}^{t_2} \frac{d\vec{v}}{dt}\cdot \vec{v}\,dt$$
$$=m\int_{t_1}^{t_2} \frac{d}{dt}\left(\frac{\vec{v}\cdot\vec{v}}{2}\right)\,dt$$
$$=\frac{1}{2}m\vec{v}(t_2)\cdot\vec{v}(t_2) - \frac{1}{2}m\vec{v}(t_1)\cdot\vec{v}(t_1)$$
&lt;/p>
&lt;p>This quantity is called the kinetic energy, $T=\frac{1}{2}m\vec{v}\cdot\vec{v}$.&lt;/p>
&lt;p>This also tells us that the work done along a closed path is 0. By elementary
vector calculus, the force is the gradient of a scalar function. This scalar function is called the potential, $V\left(\vec{r}\right)$, and $\vec{F} = -\vec{\nabla} V\left(\vec{r}\right)$.&lt;/p>
&lt;h2 id="conservation-of-energy">Conservation of Energy&lt;/h2>
&lt;p>Consider the quantity $H(\vec{r}, \vec{p}) = T(\vec{p}) + V(\vec{r})$, which we shall call the total energy. We derive the time-evolution of this quantity,
$$\frac{dH}{dt} = \nabla_{\vec{p}} T(\vec{p})\cdot \frac{d\vec{p}_j}{dt}+ \nabla_{\vec{r}} V(\vec{r})\cdot\frac{d\vec{r}}{dt}$$
$$= \frac{\vec{p}}{m}\cdot \frac{d\vec{p}}{dt}+ \nabla_{\vec{r}} V(\vec{r})\cdot\frac{d\vec{r}}{dt}$$
$$= \vec{v}\cdot \vec{F} - \vec{F}\cdot\frac{d\vec{r}}{dt}$$
$$= 0$$
&lt;/p>
&lt;p>Thus, we see that the total energy is a constant of motion.&lt;/p></description></item><item><title>Postulates of Thermodynamics</title><link>https://bose-research-group.github.io/courses/intro-thermo-stat-mech/02-thermo-postulates/02-01-postulates/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/courses/intro-thermo-stat-mech/02-thermo-postulates/02-01-postulates/</guid><description>&lt;p>The fundamentals of thermodynamics can be encapsulated in four postulates. We list them all here, but in the class we will go in a stepwise manner.&lt;/p>
&lt;h3 id="postulates-in-entropy-representation">Postulates in Entropy Representation&lt;/h3>
&lt;h3 id="postulate-1-existence-of-equilibrium-states">Postulate 1: Existence of Equilibrium States&lt;/h3>
&lt;p>There exist particular states (called &lt;strong>equilibrium states&lt;/strong>) of simple systems that, macroscopically, are characterized completely by the internal energy $U$, the volume $V$, and the mole numbers $N_{1}$, $N_{2}$, &amp;hellip; , $N_{r}$, of the chemical components.&lt;/p>
&lt;blockquote>
&lt;p>Do you think this set of variables make sense from a physical angle?&lt;/p>&lt;/blockquote>
&lt;h3 id="postulate-2-definition-of-entropy">Postulate 2: Definition of Entropy&lt;/h3>
&lt;p>There exists a function (called the &lt;em>entropy&lt;/em>, $S$) of the extensive parameters $(U, V, N_{1}, N_{2},\dots)$ of any composite system, defined for all equilibrium states such that the values assumed by the extensive parameters in the absence of an internal constraint are those that &lt;strong>maximize&lt;/strong> $S$ over the manifold of constrained equilibrium states.&lt;/p>
&lt;blockquote>
&lt;p>Notice that unlike traditional developments, we are not starting with the internal energy or $U$ as a state function. We are defining the entropy as a state function instead. Think about why!&lt;/p>&lt;/blockquote>
&lt;h3 id="postulate-3-properties-of-entropy">Postulate 3: Properties of Entropy&lt;/h3>
&lt;p>The &lt;strong>entropy&lt;/strong> of a composite system is additive over the constituent subsystems. $S$ is continuous and differentiable, and a monotonically increasing homogeneous function of the energy of the first order.
$$S = \sum_{j} S_{j}$$
$$S(\lambda U, \lambda V, \lambda N) = \lambda S(U,V,N)$$
$$\left( \frac{\partial S}{\partial U} \right)_{V, N} > 0$$
&lt;/p>
&lt;blockquote>
&lt;p>We will deal with the details of &lt;a href="https://bose-research-group.github.io/courses/intro-thermo-stat-mech/02-thermo-postulates/02-02-homogeneous-functions/">homogeneous functions&lt;/a> in a bit. Till then it is suffices to note that both entropy as a function of $(U, V, N_j&amp;hellip;)$ and energy as a function of $(S, V, N_j&amp;hellip;)$ are first-order homogeneous functions.&lt;/p>&lt;/blockquote>
&lt;h3 id="postulate-4-nernst-postulate">Postulate 4: Nernst Postulate&lt;/h3>
&lt;p>The &lt;strong>entropy&lt;/strong> of any system vanishes at $T=0K$, or when
$$\left( \frac{\partial U}{\partial S} \right)_{V, N} = 0$$
&lt;/p>
&lt;p>This implies that the entropy has a unique zero.&lt;/p>
&lt;h2 id="energy-representation">Energy Representation&lt;/h2>
&lt;p>All of thermodynamics can equivalently be expressed if a system is characterized by the entropy, $S$, volume, $V$, and number of particles, $N_j$. Then the state function of interest is the internal energy $U(S, V, N)$, which is a first-order homogeneous equation. This internal energy is &lt;strong>minimized&lt;/strong> over all the constrained equilibrium states.&lt;/p></description></item><item><title>Homogeneous Functions</title><link>https://bose-research-group.github.io/courses/intro-thermo-stat-mech/02-thermo-postulates/02-02-homogeneous-functions/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/courses/intro-thermo-stat-mech/02-thermo-postulates/02-02-homogeneous-functions/</guid><description>&lt;p>A multivariate function, $f(\vec{x})$, is said to be homogeneous of order $n$, if
$$f(\lambda\vec{x}) = \lambda^n f(\vec{x})$$
&lt;/p>
&lt;p>One of the most interesting and relevant properties of homogeneous functions is &lt;strong>Euler&amp;rsquo;s theorem&lt;/strong>.&lt;/p>
&lt;h2 id="eulers-theorem-for-homegeneous-function">Euler&amp;rsquo;s Theorem for Homegeneous Function&lt;/h2>
&lt;p>Differentiating the definition by $\lambda$ one gets:
$$n\lambda^{n-1}f(\vec{x}) = \sum_j\frac{\partial f(\lambda\vec{x})}{\partial(\lambda x_j)}\frac{d(\lambda x_j)}{d\lambda}$$
$$=\vec\nabla f(\lambda\vec{x}) \cdot \vec{x}$$
Putting $\lambda = 1$, we get Euler&amp;rsquo;s theorem for homogeneous functions,
$$nf(\vec{x}) = \vec\nabla f(\vec{x})\cdot\vec{x},$$
which relates the value of the function at a points to the values of all the gradient of the function and the point itself.&lt;/p>
&lt;h2 id="consequence-for-entropy-and-energy">Consequence for Entropy and Energy&lt;/h2>
&lt;p>Given that entropy and energy are both first-order homogeneous functions, we can now write:
$$S(U, V, N_j) = \frac{\partial S}{\partial U} U + \frac{\partial S}{\partial V} V + \sum_j \frac{\partial S}{\partial N_j} N_j$$
$$U(S, V, N_j) = \frac{\partial U}{\partial S} S + \frac{\partial U}{\partial V} V + \sum_j \frac{\partial U}{\partial N_j} N_j$$
&lt;/p>
&lt;p>Now, what are these partial derivatives? We will talk more about them in next.&lt;/p></description></item><item><title>Description of Multiple-Particle Systems</title><link>https://bose-research-group.github.io/courses/intro-thermo-stat-mech/01-classical-mechanics/01-02-multiple-particles/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/courses/intro-thermo-stat-mech/01-classical-mechanics/01-02-multiple-particles/</guid><description>&lt;p>Till now the bulk of our discussion after the basic Newtonian laws was in terms
of a single particle system. Those are the simplest and often the most boring.
The real complexity and interesting phenomena relate to many-particle systems.
How do we understand such systems?&lt;/p>
&lt;p>If the dimensionality of the space is $d$ and the number of particles are $N$, then the multiparticle position vector can be thought of as a $dN$-dimensional vector. If $\vec{r}_j$ is the position of the $j$th particle (for $j=1,2,\ldots,N$), then the total configuration can be obtained by concatenating each of the position vectors together. The $c$th coordinate for the $j$th particle becomes the $d(j-1) + c + 1$th element of the configuration space vector:
$$\vec{q}_{d(j-1)+c+1} = \vec{r}_{j, c}.$$
&lt;/p>
&lt;p>The velocity vector is the time-derivative of the configuration point, and the momentum vector is obtainedby multiplying by the diagonal mass matrix:
$$\vec{p} = M\frac{d\vec{q}}{dt}$$
&lt;/p>
&lt;h2 id="definition-of-phase-space">Definition of Phase-Space&lt;/h2>
&lt;p>When we come to the statistical mechanics part of the course, the molecular basis of thermodynamics will be developed in terms of energy as a function of the momenta and positions.&lt;/p>
&lt;p>This multidimensional space obtained by a combination of the positions $\vec{q}$ and the momenta $\vec{p}$ is called the phase space. Every problem is, in addition to the Hamiltonian, specified by an initial position, $\vec{q}(0)$, and an initial momentum, $\vec{p}(0)$. Newton&amp;rsquo;s second law can be rewritten as follows:
$$\frac{d\vec{q}(t)}{dt} = M^{-1}\vec{p}(t)$$
$$\frac{d\vec{p}(t)}{dt} = -\nabla V(\vec{q}(t)) = \vec{F}(\vec{q}(t))$$
It is well-known that a $o$th order differential equation solved with the
initial values of the first $o$ derivatives is equivalent to $o$ coupled
first-order differential equations. This is just the same decomposition of the
second-order Newton&amp;rsquo;s law into two first-order differential equations.&lt;/p>
&lt;p>The dynamical trajectories of a multiparticle system can be interpreted as a
single trajectory in the phase-space. Because of conservation of energy, all
points on this phase-space trajectory would have the same energy.&lt;/p></description></item><item><title>Derivatives of the State Functions: Intensive Variables</title><link>https://bose-research-group.github.io/courses/intro-thermo-stat-mech/02-thermo-postulates/02-03-derivatives/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/courses/intro-thermo-stat-mech/02-thermo-postulates/02-03-derivatives/</guid><description>&lt;p>Consider an isolated system of $N$ particles in a box of volume $V$ with a total internal energy, $U$. This box has a partition through it which divides the system into two parts &amp;mdash; one with $N_1, V_1, U_1$ and the second with $N_2, V_2, U_2$, such that
$$N_1 + N_2 = N$$
$$V_1 + V_2 = V$$
$$U_1 + U_2 = U$$
&lt;/p>
&lt;p>This common setup will allow us to define a variety of ``experiments&amp;rsquo;&amp;rsquo; and consequently understand the various intensive thermodynamic quantities.&lt;/p>
&lt;h2 id="temperature">Temperature&lt;/h2>
&lt;p>First consider an experiment where the partition allows for transfer of energy
but not of particle or changing of volume. How do we define the new equilibrium
on allowing exchange of energy? Now, though $N_1, V_1$ and $N_2, V_2$ are
constants, $U_1$ and $U_2$ are not. They are, however, still constrained by
$U_1 + U_2 = U$. We have to change the energy of the two compartments until
entropy is maximized. Notice that $dU_1 = -dU_2$. So there is only a single
independent variable.&lt;/p>
$$S = S_1(U_1, V_1, N_1) + S_2(U_2, V_2, N_2)$$
$$\frac{\partial S}{\partial U_1} = \frac{\partial S_1}{\partial U_1} - \frac{\partial S_2}{\partial U_2} = 0$$
$$\frac{\partial S_1}{\partial U_1} = \frac{\partial S_2}{\partial U_2}$$
&lt;p>So, energy flows from one compartment to the other till these two partial
derivatives become equal. Physical intuition tells us that this partial
derivative, therefore, must have something to do with the temperature. Let us
assume that $\frac{\partial S}{\partial U} = f(T)$ for some function $f$.&lt;/p>
&lt;p>Now, let us think about the route to establishment of equilibrium. Over time,
the total entropy $S = S_1 + S_2$ must increase.
$$\frac{dS}{dt} = \frac{dS_1}{dt} + \frac{dS_2}{dt} > 0$$
$$\left(\frac{\partial S_1}{\partial U_1} - \frac{\partial S_2}{\partial U_2}\right)\frac{dU_1}{dt} > 0$$
&lt;/p>
&lt;p>This shows us that if $\frac{\partial S_1}{\partial U_1}=f(T_1)&amp;gt;\frac{\partial
S_2}{\partial U_2} = f(T_2)$ at the initial time, then $\frac{dU_1}{dt}&amp;gt;0$. This means
that the energy is flowing from the second compartment to the first compartment.
So, we define $f(T) = \frac{1}{T}$, which satisfies this direction of energy flow.&lt;/p>
&lt;h3 id="temperature-using-internal-energy">Temperature using Internal Energy&lt;/h3></description></item><item><title>Introduction to Fourier Transform</title><link>https://bose-research-group.github.io/courses/computational-sciences-hands-on/01-introduction-to-julia/fftw/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/courses/computational-sciences-hands-on/01-introduction-to-julia/fftw/</guid><description>&lt;p>Fourier transform relates a function in one space, say the $x$ space, to another
function in the reciprocal space, say the $\xi$ space.&lt;/p>
$$F(\xi) = FT[f](\xi) = \int_{-\infty}^\infty f(x) \exp(-2\pi i\xi x) dx$$
$$f(x) = IFT[F](x) = \int_{-\infty}^\infty F(\xi) \exp(2\pi i\xi x) d\xi$$
&lt;p>The length of the $\xi$ grid is equal to the length of the $x$ grid. Say this
length is $N$. Consequently, for a particular value of $\xi$, the Fourier
integral uses $N$ function evaluations. A naive calculation of the fourier
transform is expensive, scaling as $\mathcal{O}(N^2)$. A much more efficient
implementation is called the Fast Fourier Transform (FFT) which scales as
$\mathcal{O}(N\log(N))$.&lt;/p>
&lt;p>The &lt;a href="https://juliamath.github.io/FFTW.jl/stable/" target="_blank" rel="noopener">FFTW.jl&lt;/a> package provides
implementations of FFT in Julia:
$$F_k = \sum_{m=0}^{N-1} f_m \exp\left(-\frac{2\pi ikm}{N}\right)\quad k=0, \ldots, N-1.$$
This is provided by the function fft. Notice that $k$ is the discretized version
of the $\xi$ variable and $m$ is the one corresponding to $x$. The points where
$k&amp;gt;N/2$ are equivalent to frequencies at $k-N$ by periodicity. To order change
this ordering to go from $-N/2$ to $N/2$, use the fftshift function provided in
the FFTW.jl package. An inverse FFT routine called bfft is provided which
calculates:
$$f_m = \sum_{k=0}^{N-1} F_k \exp\left(\frac{2\pi ikm}{N}\right)\quad m=0, \ldots, N-1.$$
&lt;/p>
&lt;p>One can slowly modify the Fourier transform expression by converting it into a
finite Riemann sum to obtain a formula analogous to the FFT one. Let $x$ be
discretized between $x_\text{min}$ and $x_\text{max}$ in a grid of size $\Delta
x$. The frequency axis will have the same $N$ number of points with a spacing of
$\Delta\xi=\frac{1}{N\Delta x}$. Then the $k$th frequency component will be given as
$$FT[f](k\Delta\xi) = \sum_{m=0}^{N-1} f(x_\text{min}+m\Delta x) \exp\left(-2\pi i k\Delta\xi (x_\text{min}+m\Delta x)\right)\Delta x$$
$$=\exp\left(-2\pi i k\Delta \xi x_\text{min}\right) \Delta x \sum_{m=0}^{N-1} f(x_\text{min}+m\Delta x) \exp\left(-2\pi i k\Delta \xi m \Delta x\right)$$
$$=\exp\left(-2\pi i k\Delta \xi x_\text{min}\right) \Delta x \sum_{m=0}^{N-1} f_m \exp\left(-\frac{2\pi i k m}{N}\right)$$
$$=\exp\left(-2\pi i k\Delta \xi x_\text{min}\right) \Delta x F_k$$
&lt;/p>
&lt;p>Now for the inverse transform:
$$IFT[F](x_\text{min}+m\Delta x) = \sum_{k=0}^{N-1} F_k \exp\left(2\pi i k\Delta\xi (x_\text{min} + m\Delta x)\right)\Delta k$$
$$=\Delta k\sum_{k=0}^{N-1} \underbrace{\exp(2\pi i k\Delta\xi x_\text{min}) F_k}_{G_k} \exp\left(\frac{2\pi i k m}{N}\right)$$
$$=g_m\Delta k$$
&lt;/p>
&lt;p>The details of implementation in Julia are given in &lt;a href="#example-using-fftw">the examples section&lt;/a>.&lt;/p>
&lt;h2 id="uses-in-quantum-mechanics">Uses in Quantum Mechanics&lt;/h2>
&lt;p>Consider a function, say the wave function, in position space, $\psi(x)$. Let us
say that we want to represent that in momentum space and obtain the function
$\tilde{\psi}(p)$.
$$\tilde{\psi}(p) = \langle p|\psi\rangle = \int_{-\infty}^\infty dx \langle p|x\rangle\langle x|\psi\rangle$$
$$= \frac{1}{\sqrt{2\pi\hbar}}\int_{-\infty}^\infty dx \exp\left(-\frac{i p x}{\hbar}\right) \psi(x)$$
Notice that apart from the prefactor of $\frac{1}{\sqrt{2\pi\hbar}}$, the rest
of the expression is a Fourier transform with the replacement $p = 2\pi\hbar\xi$.
$$\tilde{\psi}(p) = \frac{1}{\sqrt{2\pi\hbar}} FT[\psi]\left(\frac{p}{2\pi\hbar}\right)$$
or, equivalently,
$$\tilde{\psi}(2\pi\hbar\xi) = \frac{1}{\sqrt{2\pi\hbar}} FT[\psi]\left(\xi\right)$$
&lt;/p>
&lt;p>Similarly transforming the momentum space wave function back to the position
space involves an inverse Fourier transform with the same definitions.
$$\phi(x) = \frac{1}{\sqrt{2\pi\hbar}}\int_{-\infty}^\infty dp \exp\left(\frac{ipx}{\hbar}\right)\tilde\phi(p)$$
&lt;/p>
&lt;p>To prove that this works, consider transforming the momentum space wave
function, obtained by Fourier transforming $\psi(x)$, back to position space:
$$\psi_b(x) = \frac{1}{\sqrt{2\pi\hbar}}\int_{-\infty}^\infty \tilde\psi(p) \exp\left(\frac{ipx}{\hbar}\right) dp$$
$$=\frac{1}{2\pi\hbar} \int_{-\infty}^\infty FT[\psi]\left(\frac{p}{2\pi\hbar}\right) \exp\left(\frac{ipx}{\hbar}\right) dp$$
$$= \int_{-\infty}^\infty FT[\psi]\left(\xi\right) \exp\left(2\pi i\xi x\right) d\xi$$
$$=IFT[FT[\psi]](x) = \psi(x)$$
We get the original position space wave function back.&lt;/p>
&lt;h3 id="example-using-fftw">Example using FFTW&lt;/h3>
&lt;p>Let us suppose we have a wave packet that is given by:
$$\psi(x) = \frac{1}{(\pi\sigma)^{1/4}} \exp\left(-\frac{x^2}{2\sigma^2} + \frac{ipx}{\hbar}\right)$$
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-julia" data-lang="julia">&lt;span class="line">&lt;span class="cl">&lt;span class="n">dx&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.01&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">nsteps&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">^&lt;/span>&lt;span class="mi">15&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">nsteps&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">dx&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="n">dx&lt;/span>&lt;span class="ss">:nsteps&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">dx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">σ&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">10.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">5.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ψ&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">exp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="o">.^&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">σ&lt;/span>&lt;span class="o">^&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="nb">im&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">sqrt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sqrt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">π&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">σ&lt;/span>&lt;span class="p">))&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/p>
&lt;figure class="ma0w-75" id="figure-wave-function-in-position-space">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Wave function in position space" srcset="
/media/computational-sciences/pos_space_wf_hu_6935a8ea92cbe4f9.webp 400w,
/media/computational-sciences/pos_space_wf_hu_39e987df721cb40.webp 760w,
/media/computational-sciences/pos_space_wf_hu_156beef75a94f1df.webp 1200w"
src="https://bose-research-group.github.io/media/computational-sciences/pos_space_wf_hu_6935a8ea92cbe4f9.webp"
width="760"
height="535"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Wave function in position space
&lt;/figcaption>&lt;/figure>
&lt;p>We write a function to get the Fourier transform from the FFT, keeping in mind that in almost all uses of quantum mechanics the factor of $2\pi$ in the Fourier transform kernel is absent,
The inverse Fourier transform can also be implemented using FFT in a similar manner:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-julia" data-lang="julia">&lt;span class="line">&lt;span class="cl">&lt;span class="k">function&lt;/span> &lt;span class="n">inverse_fourier_transform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">unitary&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="kt">Bool&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">true&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dk&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">F&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dk&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">bfft&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ifftshift&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">.*&lt;/span> &lt;span class="n">exp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="nb">im&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">ifftshift&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">unitary&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">F&lt;/span> &lt;span class="o">./&lt;/span> &lt;span class="n">sqrt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="nb">π&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">F&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">end&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">end&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/p>
&lt;p>We use this function to obtain the momentum space wave function as follows:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-julia" data-lang="julia">&lt;span class="line">&lt;span class="cl">&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ψtilde&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">fourier_transform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ψ&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
to obtain the following wave function
&lt;figure class="ma0w-75" id="figure-wave-function-in-momentum-space">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Wave function in momentum space" srcset="
/media/computational-sciences/mom_space_wf_hu_2270dcec797a394f.webp 400w,
/media/computational-sciences/mom_space_wf_hu_a6ff07d3a0ffa5bf.webp 760w,
/media/computational-sciences/mom_space_wf_hu_244c51ef95b7fa81.webp 1200w"
src="https://bose-research-group.github.io/media/computational-sciences/mom_space_wf_hu_2270dcec797a394f.webp"
width="760"
height="557"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Wave function in momentum space
&lt;/figcaption>&lt;/figure>
&lt;/p></description></item><item><title>Time-Independent Quantum Mechanics</title><link>https://bose-research-group.github.io/courses/computational-sciences-hands-on/02-basic-qm/time-independent/tise/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/courses/computational-sciences-hands-on/02-basic-qm/time-independent/tise/</guid><description>&lt;p>The goal is to model any 1D Hamiltonian,
$$\hat{H} = -\frac{\hbar^2}{2m}\frac{\partial^2}{\partial x^2} + V(\hat{x})$$
and find its eigenstates and eigenenergies,
$$\hat{H}|\psi_n\rangle = \epsilon_n|\psi_n\rangle.$$
To do this, one needs to be able to represent the Hamiltonian operator as a
matrix for a given computational basis, $|\phi_n\rangle$. We assume that the
computational basis forms an orthonormal set. We start by inserting a resolution
of identity in the eigenstate equation in terms of the computational basis&lt;/p>
&lt;p>
$$\sum_k \hat{H}|\phi_k\rangle\langle\phi_k|\psi_n\rangle = \epsilon_n\sum_k|\phi_k\rangle\langle\phi_k|\psi_n\rangle$$
Taking an overlap of the equation with with $|\phi_j\rangle$
$$\sum_k \langle\phi_j|\hat{H}|\phi_k\rangle\langle\phi_k|\psi_n\rangle = \epsilon_n\langle\phi_j|\psi_n\rangle$$
This gives rise to the matrix eigenvalue equation in the $|\phi_n\rangle$ basis.&lt;/p>
&lt;p>A variety of basis can be chosen. The more physically relevant the basis, the
more efficient the computations. However as long as the basis can be
systematically increased, one should be able to find the correct eigenstates.
This procedure is called &amp;ldquo;convergence.&amp;rdquo;&lt;/p>
&lt;h2 id="basis-of-position-eigenstates">Basis of Position Eigenstates&lt;/h2>
&lt;p>As our first example, we choose to work in the position eigenbasis. Of course,
the position eigenbasis forms an infinite dimensional vector space, which cannot
be handled in a simple manner on the computer. We truncate the space by
considering a subset of the real axis &amp;mdash; the domain considered is
$\mathbb{D} = [L_\text{min}, L_\text{max}] \subset\mathbb{R}$. However, that is
not enough by itself because any domain, closed or open, would still be an
infinite set.&lt;/p>
&lt;p>So, we consider a finite set defined by a lower limit, $L_\text{min}$, an upper
limit, $L_\text{max}$, and a grid spacing $\Delta x$. An arbitrary element of
the computational basis is therefore $x_j = L_\text{min} + (j-1)\Delta
x$, such that $\hat{x}|\phi_j\rangle = x_j|\phi_j\rangle$.&lt;/p>
&lt;p>Next, we need to derive the matrix elements of the Hamiltonian.
$$\langle\phi_j|\hat{H}|\phi_k\rangle = -\frac{\hbar^2}{2m}\left\langle\phi_j\left|\frac{\partial^2}{\partial x^2}\right|\phi_k\right\rangle + \langle\phi_j|V(\hat{x})|\phi_k\rangle$$
$$= -\frac{\hbar^2}{2m}\left\langle\phi_j\left|\frac{\partial^2}{\partial x^2}\right|\phi_k\right\rangle + V(x_k)\delta_{j,k}$$
Instead of directly calculating the matrix element of the second derivative
operator, we start by exploring the action of the Hamiltonian matrix on an
arbitrary wave function written in the position basis.
$$H|\psi\rangle = -\frac{\hbar^2}{2m}\frac{\partial^2}{\partial x^2}|\psi\rangle + \hat{V}|\psi\rangle$$
So, we need to find how to write the second derivative of the wave function
$|\psi\rangle$ as a function of the its values on the grid. Expanding the
function in its Taylor series, we can show that
$$\left.\frac{\partial^2}{\partial x^2}\psi(x)\right|_{x=x_n} (\Delta x)^2 = \psi(x_{n+1}) -2\psi(x_n) + \psi(x_{n-1})$$
$$-\frac{\hbar^2}{2m}\left.\frac{\partial^2}{\partial x^2}\psi(x)\right|_{x=x_n} = -\frac{\hbar^2}{2m(\Delta x)^2}\left(\psi(x_{n+1}) -2\psi(x_n) + \psi(x_{n-1})\right)$$
for $\Delta x\to 0$.&lt;/p>
&lt;p>Now, we can put everything together. The matrix element of the Hamiltonian turns out to be:
$$\langle\phi_j|\hat{H}|\phi_k\rangle = -\frac{\hbar^2}{2m(\Delta x)^2}\left(\delta_{j,k+1}-2\delta_{j,k}+\delta_{j,k-1}\right) + V(x_k)\delta_{j,k}$$
&lt;/p>
&lt;p>Below is the code which defines the tridiagonal Hamiltonian for a given
potential on a position eigenstate basis given by the variable &lt;code>xgrid&lt;/code> in Julia:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-julia" data-lang="julia">&lt;span class="line">&lt;span class="cl">&lt;span class="k">function&lt;/span> &lt;span class="n">get_Hamiltonian_matrix_position_space&lt;/span>&lt;span class="p">(;&lt;/span> &lt;span class="n">V&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">xgrid&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="kt">AbstractVector&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="kt">Float64&lt;/span>&lt;span class="p">},&lt;/span> &lt;span class="n">hbar&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="kt">Float64&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">1.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="kt">Float64&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">1.0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dx&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">xgrid&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">xgrid&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Npoints&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xgrid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">H&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">zeros&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Npoints&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Npoints&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="n">Npoints&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">c&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="n">Npoints&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">c&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">H&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hbar&lt;/span>&lt;span class="o">^&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">m&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">dx&lt;/span>&lt;span class="o">^&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">V&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xgrid&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elseif&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">H&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">hbar&lt;/span>&lt;span class="o">^&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">dx&lt;/span>&lt;span class="o">^&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">end&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">end&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">H&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">end&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
The Hamiltonian matrix obtained from this code can now be diagonalized to get the
energies and the eigenstates.&lt;/p>
&lt;h3 id="harmonic-oscillator-eigenstates">Harmonic Oscillator Eigenstates&lt;/h3>
&lt;p>Let us test the code by using a harmonic oscillator as an example. Consider the
following potential:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-julia" data-lang="julia">&lt;span class="line">&lt;span class="cl">&lt;span class="n">V&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="kt">Float64&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.5&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="o">^&lt;/span>&lt;span class="mi">2&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/p>
&lt;p>To use the potential, first we need to decide on the grid. This will of course
be converged. Because this potential is symmetric, we will choose a symmetric
grid with $L_\text{min}=-L_\text{max}$.&lt;/p>
&lt;p>Let us take the following grid:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-julia" data-lang="julia">&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mf">0.5&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mf">0.1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mf">0.5&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
Then we diagonalize the matrix as follows
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-julia" data-lang="julia">&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="n">LinearAlgebra&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">H&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_Hamiltonian_matrix_position_space&lt;/span>&lt;span class="p">(;&lt;/span> &lt;span class="n">V&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">xgrid&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">vals&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">vecs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">eigen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">H&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/p>
&lt;p>Take a look at the values that you get. Do they match what you know from basic
quantum mechanics?&lt;/p>
&lt;p>Probably not! On running the code, the lowest eigenvalue that I got is 3.43. Where are we going wrong then?&lt;/p>
&lt;p>Notice that the Hamiltonian matrix elements that we derived in the previous
section requires $\Delta x\to 0$. This constraint is not satisfied here. However, what
does &amp;ldquo;tending to 0&amp;rdquo; mean in a computational setting? To understand this, let us
plot the energy of the lowest eigenstate as a function of $\Delta x$ keeping the
$L_\text{min}$ and $L_\text{max}$ fixed. We are just trying to make the
second derivative Taylor expansion correct. Notice that, in &lt;a href="#dx-convergence">the convergence with $\Delta x$ figure&lt;/a>, as $\Delta x$ decreases
the value of $E_0$ seems to be hitting a constant value. This is the converged
value with respect to $\Delta x$.&lt;/p>
&lt;figure class="ma0 w-75" id="figure-dx-convergence">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Convergence of grid spacing" srcset="
/media/computational-sciences/basic-qm/time-independent/dx_convergence_hu_727335c6db67e64f.webp 400w,
/media/computational-sciences/basic-qm/time-independent/dx_convergence_hu_5367ce4ecedbbad2.webp 760w,
/media/computational-sciences/basic-qm/time-independent/dx_convergence_hu_9b1ca2bd4e6e706c.webp 1200w"
src="https://bose-research-group.github.io/media/computational-sciences/basic-qm/time-independent/dx_convergence_hu_727335c6db67e64f.webp"
width="760"
height="550"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Convergence of grid spacing
&lt;/figcaption>&lt;/figure>
&lt;p>If we stopped at this level, does this value match the analytical value for the
harmonic oscillator? The zero-point energy should actually be 0.5, whereas the
value we are getting by diagonalizing is close to 5.0. That terribly incorrect.&lt;/p>
&lt;p>The next step would be to check for convergence with respect to the box size,
$L_\text{max}$. Since the Taylor series error seems to be relatively well
converged with $\Delta x=0.001$, that the value of $L_\text{max}$ is kept
unchanged. The plot of the energies of the first five eigenstates is shown in
&lt;a href="#Lmax-convergence">$L_\text{max}$ convergence figure&lt;/a>. Notice how the energies
of the first 5 eigenstates converge to the correct values around $L_\text{max} =
5.0$. This is convergence with respect to the box size.&lt;/p>
&lt;figure class="ma0 w-75" id="figure-lmax-convergence">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Convergence of box size" srcset="
/media/computational-sciences/basic-qm/time-independent/Lmax_convergence_hu_75e826eae3a03ab1.webp 400w,
/media/computational-sciences/basic-qm/time-independent/Lmax_convergence_hu_98396b739b2b187a.webp 760w,
/media/computational-sciences/basic-qm/time-independent/Lmax_convergence_hu_1fb254d2983fef08.webp 1200w"
src="https://bose-research-group.github.io/media/computational-sciences/basic-qm/time-independent/Lmax_convergence_hu_75e826eae3a03ab1.webp"
width="760"
height="548"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Convergence of box size
&lt;/figcaption>&lt;/figure>
&lt;blockquote>
&lt;p>Write the programs to obtain the $\Delta x$ and the $L_\text{max}$ convergence curves.&lt;/p>&lt;/blockquote>
&lt;blockquote>
&lt;p>Converge the harmonic oscillator energies corresponding to the ground state and the 10th excited state. What are the box-sizes required for the two cases? Are they the same or different and why?&lt;/p>&lt;/blockquote>
&lt;blockquote>
&lt;p>Can you use the same technique to converge the eigenstates of a Morse oscillator?&lt;/p>&lt;/blockquote>
&lt;h2 id="basis-of-momentum-eigenstates">Basis of Momentum Eigenstates&lt;/h2></description></item><item><title>Time-Dependent Quantum Mechanics</title><link>https://bose-research-group.github.io/courses/computational-sciences-hands-on/02-basic-qm/time-dependent/tdse/</link><pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/courses/computational-sciences-hands-on/02-basic-qm/time-dependent/tdse/</guid><description>&lt;p>How do we simulate the dynamics of a quantum system? Suppose we know that the initial state of the system is given by a particular wave function $|\psi(0)\rangle$ and the system is described by a Hamiltonian,
$$\hat{H} = -\frac{\hbar^2}{2m}\frac{\partial^2}{\partial x^2} + V(x),$$
then the time-evolution of the wave function satisfies the Time-Dependent Schrödinger equation,
$$i\hbar\frac{\partial}{\partial t}|\psi(t)\rangle = \hat{H}|\psi(t)\rangle.$$
&lt;/p>
&lt;p>The initial wave packet is given in position space as $\psi(x, 0)$ and we want
to propagate it out to obtain $\psi(x, t)$. The direct way of solving this problem is to solve for the short-time propagator defined as
$$\hat{U} = \exp\left(-\frac{i \hat{H} \Delta t}{\hbar}\right).$$
If this can be represented in position space, then we can propagate the wave function as follows:
$$\psi(x, t+\Delta t) = \hat{U}\psi(x, t)$$
&lt;/p>
&lt;p>In the previous chapter, we have defined a function which creates the Hamiltonian in position space. We can easily exponentiate this to obtain the propagator in Julia, and use that to propagate for all times as shown below:
&lt;/p>
&lt;p>Now, this works well, but the computational cost can become prohibitively high.
First notice that the Hamiltonian matrix needs to be converged with respect to
$L_\text{min}$, $L_\text{max}$ and $\Delta x$; one needs to use very small
$\Delta x$ values to reduce the error of truncating the Taylor series for the
kinetic energy part. Additionally the range has to be big enough to account for
the full dynamics. Finally, the propagator is the exponential of the Hamiltonian
matrix, which scales as $N^3$ where $N$ is the cardinality of the basis set. Can
we do better than this?&lt;/p>
&lt;h2 id="split-operator-method-or-the-feit-and-fleck-method">Split-Operator Method or the Feit and Fleck Method&lt;/h2>
&lt;p>The propagator is the exponential of the Hamiltonian
$$U(t) = \exp\left(-i \hat{H} t/\hbar\right)$$
$$=\exp\left(-i (\hat{T} + \hat{V}) t/\hbar\right)$$
&lt;/p>
&lt;p>The issue with directly exponentiating this operator is the computational cost.
Let us see if we can simplify this expression some more. The
&lt;a href="https://en.wikipedia.org/wiki/Baker%e2%80%93Campbell%e2%80%93Hausdorff_formula" target="_blank" rel="noopener">Baker-Campbell-Hausdorff
formula&lt;/a>
indicates that for any pair of operators $\hat{X}$ and $\hat{Y}$,
$$\exp\left(\hat{X}\right)\exp\left(\hat{Y}\right) = \exp\left(\hat{Z}\right)$$
$$\text{where } \hat{Z} = \hat{X} + \hat{Y} + \frac{1}{2}[\hat{X}, \hat{Y}] + \frac{1}{12}[\hat{X}, [\hat{X}, \hat{Y}]] + \ldots$$
&lt;/p>
&lt;p>Consider the following expression:
$$\exp\left(-i\hat{T}t/\hbar\right)\exp\left(-i\hat{V}t/\hbar\right) = \exp\left(-\frac{i}{\hbar}\left(\hat{H}t + \frac{1}{2}[\hat{T}, \hat{V}]t^2 + \ldots\right)\right)$$
Notice that as $t\to 0$, the right-hand side just becomes the propagator.
Therefore for small $t$, the propagator can be approximated as:
$$U(\Delta t) \approx \exp\left(-i \hat{T} \Delta t/\hbar\right)\exp\left(-i\hat{V}\Delta t/\hbar\right)$$
$$\approx \exp\left(-\frac{i \hat{V} \Delta t}{2\hbar}\right)\exp\left(-\frac{i \hat{T} \Delta t}{\hbar}\right)\exp\left(-\frac{i\hat{V}\Delta t}{2\hbar}\right)$$
Splitting the propagator in this manner is variously called the Suzuki-Trotter
or Trotter or the Lie-Trotter decomposition. The second expression is more
accurate than the first one. We will continue the discussion with the
higher-order Trotter expression.&lt;/p>
&lt;p>The short-time propagator needs to be applied to an initial wave function in
position space. This amounts to the sequential application of individual pieces.
First $\exp\left(-\frac{i\hat{V}\Delta t}{2\hbar}\right)$ needs to be applied to
the wave function:
$$|\psi_V\rangle = \exp\left(-\frac{i\hat{V}\Delta t}{2\hbar}\right)|\psi(t)\rangle = \int dx \exp\left(-\frac{i\hat{V}\Delta t}{2\hbar}\right)|x\rangle\langle x|\psi(t)\rangle$$
$$ = \int dx |x\rangle \underbrace{\exp\left(-\frac{iV(x)\Delta t}{2\hbar}\right)\langle x|\psi(t)\rangle}_{\psi_V(x)}$$
Next the kinetic energy portion is applied:
$$\exp\left(-\frac{i\hat{T}\Delta t}{\hbar}\right)|\psi_V\rangle = \int dx_0 \exp\left(-\frac{i\hat{T}\Delta t}{\hbar}\right)|x_0\rangle \psi_V(x_0)$$
$\ket{x_0}$ is not an eigenstate of the $\hat{T}$ operator. However a momentum eigenstate, $\ket{p}$ is an eigenstate. So, we insert a resolution of identity in terms of $\ket{p}\bra{p}$ to simplify:
$$\exp\left(-\frac{i\hat{T}\Delta t}{\hbar}\right)|\psi_V\rangle = \int dp\int dx_0 \exp\left(-\frac{i\hat{T}\Delta t}{\hbar}\right)\ket{p}\langle p|x_0\rangle \psi_V(x_0)$$
$$ = \frac{1}{\sqrt{2\pi\hbar}}\int dp\int dx_0 \ket{p} \exp\left(-\frac{ip^2\Delta t}{2m\hbar}\right) \exp\left(-\frac{i p x_0}{\hbar}\right) \psi_V(x_0)$$
Now, define
$$\tilde{\psi}_V(p) = \frac{1}{\sqrt{2\pi\hbar}}\int dx \exp\left(-\frac{i p x}{\hbar}\right) \exp\left(-\frac{i V(x)\Delta t}{2\hbar}\right)\langle x|\psi\rangle$$
$$\therefore\ket{\psi_{TV}} = \exp\left(-\frac{i\hat{T}\Delta t}{\hbar}\right)|\psi_V\rangle = \int dp \ket{p} \underbrace{\exp\left(-\frac{ip^2\Delta t}{2m\hbar}\right) \tilde{\psi}_V(p)}_{\tilde{\psi}_{TV}(p)}$$
&lt;/p>
&lt;p>Finally, the last piece of the propagator in terms of the potential operator needs to be applied:
$$\exp\left(-\frac{i\hat{V}\Delta t}{2\hbar}\right)\ket{\psi_{TV}} = \int dp\exp\left(-\frac{i\hat{V}\Delta t}{2\hbar}\right)\ket{p} \tilde{\psi}_{TV}(p)$$
$$= \int dx \ket{x} \int dp\exp\left(-\frac{iV(x)\Delta t}{2\hbar}\right)\langle x|p\rangle \tilde{\psi}_{TV}(p)$$
$$= \frac{1}{\sqrt{2\pi\hbar}} \int dx \ket{x} \int dp\exp\left(-\frac{iV(x)\Delta t}{2\hbar}\right)\exp\left(\frac{ipx}{\hbar}\right) \tilde{\psi}_{TV}(p)$$
$$ = \int dx \ket{x}\exp\left(-\frac{iV(x)\Delta t}{2\hbar}\right) \psi_{TV}(x)$$
where $\psi_{TV}(x) = \frac{1}{\sqrt{2\pi\hbar}}\int dp \exp(ipx/\hbar)\tilde{\psi}_{TV}(p)$.&lt;/p>
&lt;h3 id="algorithm">Algorithm&lt;/h3>
&lt;p>Therefore, a step of propagation from $\psi(x, t)$ to $\psi(x, t+\Delta t)$ involves the following steps:&lt;/p>
&lt;ol>
&lt;li>Define $\psi_V(x) = \exp\left(-\frac{i V(x) \Delta t}{2\hbar}\right)\psi(x, t)$.&lt;/li>
&lt;li>Define $\tilde{\psi}_V(p) = \frac{1}{\sqrt{2\pi\hbar}}\int dx \exp\left(-i p x / \hbar\right)\psi_V(x)$ by using FFT.&lt;/li>
&lt;li>Apply the kinetic energy propagator $\tilde{\psi}_{TV}(p) = \exp\left(-\frac{ip^2\Delta t}{2m\hbar}\right)\tilde{\psi}_V(p)$.&lt;/li>
&lt;li>Convert to position basis: $\psi_{TV}(x) = \frac{1}{\sqrt{2\pi\hbar}}\int dp \exp\left(i p x / \hbar\right)\tilde{\psi}_{TV}(p)$ using the IFFT routines.&lt;/li>
&lt;li>Finally apply the second potential energy piece, $\psi(x, t+\Delta t) = \exp\left(-\frac{i V(x) \Delta t}{2\hbar}\right)\psi_{TV}(x)$.&lt;/li>
&lt;/ol>
&lt;h2 id="examples">Examples&lt;/h2>
&lt;h3 id="harmonic-oscillator">Harmonic Oscillator&lt;/h3>
&lt;p>Imagine we are working with a harmonic potential:
Let us check the dynamics of an initial state obtained by shifting the ground
state of the harmonic potential to be centered on $x=-3$.
where the function for dot product is defined as follows:
&lt;/p>
&lt;p>The evolution of the probability density is shown below in the gif using both
the direct exponentiation way and the split-operator method:
&lt;figure class="ma0w-75" id="figure-time-evolution-of-the-probability-for-an-initial-state-defined-by-the-ground-state-wave-function-shifted-from-the-mean-position-under-a-harmonic-potential">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Time evolution of the probability for an initial state defined by the ground state wave function shifted from the mean position under a harmonic potential"
src="https://bose-research-group.github.io/media/computational-sciences/basic-qm/time-dependent/shifted_ground_state.gif"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Time evolution of the probability for an initial state defined by the ground state wave function shifted from the mean position under a harmonic potential
&lt;/figcaption>&lt;/figure>
Notice that the width of the wave packet does not change over time. This is a
peculiar feature when the starting state has the same form as the ground state
wave function. (Read more about coherent states.)&lt;/p>
&lt;p>What happens if we make the initial wave packet broader or narrower than the
ground state wave packet? We keep the center of the initial wave packet at
$x=-3$ just as in the previous case.
&lt;figure class="ma0w-75" id="figure-time-evolution-of-the-probability-for-an-initial-gaussian-wave-function-with-a-larger-standard-deviation-and-centered-at-x-3-under-a-harmonic-potential">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Time evolution of the probability for an initial Gaussian wave function with a larger standard deviation and centered at $x=-3$ under a harmonic potential"
src="https://bose-research-group.github.io/media/computational-sciences/basic-qm/time-dependent/shifted_fatter_wf.gif"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Time evolution of the probability for an initial Gaussian wave function with a larger standard deviation and centered at $x=-3$ under a harmonic potential
&lt;/figcaption>&lt;/figure>
&lt;figure class="ma0w-75" id="figure-time-evolution-of-the-probability-for-an-initial-gaussian-wave-function-with-a-smaller-standard-deviation-and-centered-at-x-3-under-a-harmonic-potential">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Time evolution of the probability for an initial Gaussian wave function with a smaller standard deviation and centered at $x=-3$ under a harmonic potential"
src="https://bose-research-group.github.io/media/computational-sciences/basic-qm/time-dependent/shifted_sharper_wf.gif"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Time evolution of the probability for an initial Gaussian wave function with a smaller standard deviation and centered at $x=-3$ under a harmonic potential
&lt;/figcaption>&lt;/figure>
&lt;/p>
&lt;p>Irrespective of the initial width of the wave function, the time evolution of
the expectation value of position is identical.
&lt;figure class="ma0w-75" id="figure-time-evolution-of-the-position-of-the-wave-functions-centered-at-x-3-moving-under-a-harmonic-potential">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Time evolution of the position of the wave functions centered at $x=-3$ moving under a harmonic potential" srcset="
/media/computational-sciences/basic-qm/time-dependent/positions_harmonic_hu_a7416b69d4682b96.webp 400w,
/media/computational-sciences/basic-qm/time-dependent/positions_harmonic_hu_44e5b1f341f46fae.webp 760w,
/media/computational-sciences/basic-qm/time-dependent/positions_harmonic_hu_cd4041d66ee6ad69.webp 1200w"
src="https://bose-research-group.github.io/media/computational-sciences/basic-qm/time-dependent/positions_harmonic_hu_a7416b69d4682b96.webp"
width="760"
height="549"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Time evolution of the position of the wave functions centered at $x=-3$ moving under a harmonic potential
&lt;/figcaption>&lt;/figure>
&lt;/p>
&lt;p>However, the widths of the wave packets show interesting patterns:
&lt;figure class="ma0w-75" id="figure-time-evolution-of-the-width-of-the-wave-functions-centered-at-x-3-moving-under-a-harmonic-potential">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Time evolution of the width of the wave functions centered at $x=-3$ moving under a harmonic potential" srcset="
/media/computational-sciences/basic-qm/time-dependent/widths_harmonic_hu_7391f00ce4dcc57f.webp 400w,
/media/computational-sciences/basic-qm/time-dependent/widths_harmonic_hu_f28704685780a8f5.webp 760w,
/media/computational-sciences/basic-qm/time-dependent/widths_harmonic_hu_ad1341a4da1fa555.webp 1200w"
src="https://bose-research-group.github.io/media/computational-sciences/basic-qm/time-dependent/widths_harmonic_hu_7391f00ce4dcc57f.webp"
width="760"
height="548"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Time evolution of the width of the wave functions centered at $x=-3$ moving under a harmonic potential
&lt;/figcaption>&lt;/figure>
&lt;/p></description></item><item><title>MC Simulation of Lennard-Jones Fluid: A Project</title><link>https://bose-research-group.github.io/courses/computational-sciences-hands-on/03-monte-carlo/ljfluid/</link><pubDate>Mon, 07 Apr 2025 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/courses/computational-sciences-hands-on/03-monte-carlo/ljfluid/</guid><description>&lt;p>A Lennard-Jones fluid, in its simplest form, is a monoatomic fluid with the constituent particles interacting in a pair-wise fashion using the famous &lt;a href="https://en.wikipedia.org/wiki/Lennard-Jones_potential#Overview" target="_blank" rel="noopener">Lennard-Jones potential&lt;/a>:
$$V_\text{LJ}(r_{ij}) = 4\epsilon \left(\left(\frac{\sigma}{r_{ij}}\right)^{12}-\left(\frac{\sigma}{r_{ij}}\right)^6\right),$$
where $r_{ij}$ is the distance between the $i$th and the $j$th atom, $r_{ij} = \sqrt{(x_i-x_j)^2 + (y_i-y_j)^2 + (z_i-z_j)^2}$.&lt;/p>
&lt;p>This will be a guided tutorial in exploring the thermodynamics of the Lennard-Jones fluid using Metropolis Monte Carlo. The simulations are going to use &lt;strong>periodic boundary conditions&lt;/strong>, with the potential evaluated using the &lt;strong>minimum image convention&lt;/strong>.&lt;/p>
&lt;h2 id="configuration-space-definition-and-convention">Configuration Space Definition and Convention&lt;/h2>
&lt;p>Because Julia is a column-major language, we are going to store the coordinates of any given frame with $N$ atoms in a $(3\times N)$ matrix, with the $j$th column giving the position vector of the $j$ atom.&lt;/p>
&lt;h2 id="implement-the-lennard-jones-potential">Implement the Lennard-Jones Potential&lt;/h2>
&lt;p>The evaluation of the potential for the full box of particles will proceed in three steps:&lt;/p>
&lt;ol>
&lt;li>Write a function, &lt;code>Vpair&lt;/code> to calculate the Lennard-Jones potential for a distance.&lt;/li>
&lt;li>In addition write a &lt;code>get_distance&lt;/code> function which will take the $3\times N$ position matrix and two indices $i$ and $j$, and return the distance between the $i$th and the $j$th atoms (columns) under the minimum image convention.&lt;/li>
&lt;li>Write a function, &lt;code>Vtot&lt;/code>, which takes in the position matrix and calculates the total potential energy as a sum of all the pair-wise potential energies obtained using the &lt;code>Vpair&lt;/code> function.&lt;/li>
&lt;/ol>
&lt;h2 id="implement-mc-moves">Implement MC Moves&lt;/h2>
&lt;p>Because this is a mono-atomic system, the only possible move is a translation. We will evaluate two different moves and try to understand what are the pros and cons.&lt;/p>
&lt;ol>
&lt;li>Write a &lt;code>move_single&lt;/code> function that takes in a position matrix, chooses one random atom and moves one of its dimensions at random. Is this the most efficient way of constructing moves? No! However, its the simplest.&lt;/li>
&lt;li>Write a &lt;code>move_all&lt;/code> function which basically moves all the atoms in every move.&lt;/li>
&lt;/ol>
&lt;p>Remember to enforce periodic boundary conditions in your move as well.&lt;/p>
&lt;h2 id="implement-the-mc-function">Implement the MC function&lt;/h2>
&lt;p>In the spirit of what has been discussed previously, implement the actual MC code which takes in a starting initial configuration and returns a series of frames using the &lt;code>Vtot&lt;/code> function for a particular temperature. Each frame is a $3\times N$ matrix. If there are $F$ frames, you may choose to store them as a $F\times 3\times N$ tensor.&lt;/p>
&lt;h2 id="analysis-and-runs">Analysis and Runs&lt;/h2>
&lt;p>Now we should have all the ingredients ready. How does one do a real simulation?&lt;/p>
&lt;ol>
&lt;li>Choose all the parameters for the Lennard-Jones potential, the box size $L$, and the number of particles $N$.&lt;/li>
&lt;li>Create a random initial configuration. This in principle can be obtained in any way. For real problems, one could use the crystal structure of the system, a previous molecular dynamics run, or electronic structure minimization. In our case, we will just use a random placement of molecules.&lt;/li>
&lt;li>Run a single MC run evaluating the total potential energy at each frame to see if you are equilibrated. This is called the &lt;strong>equilibration run&lt;/strong>.
&lt;ol>
&lt;li>How many MC steps does equilibration take when using &lt;code>move_single&lt;/code>?&lt;/li>
&lt;li>How many MC steps does equilibration take starting from the same initial configuration when using &lt;code>move_all&lt;/code>?&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>You can choose 5 or 10 different frames from the &lt;strong>post-equilibration part&lt;/strong> of the equilibration trajectory and launch multiple MC runs to obtain error analysis. These would be called the production runs. Do a comparison between &lt;code>move_single&lt;/code> and &lt;code>move_all&lt;/code>. Some sample observables are discussed in &lt;a href="#observables">Observables&lt;/a>.&lt;/li>
&lt;li>Choose one of the production runs and visualize using VMD / PyMol.&lt;/li>
&lt;/ol>
&lt;h3 id="observables">Observables&lt;/h3>
&lt;p>We are interested in understanding a few bulk observables at different temperatures and number densities. The simplest are the interatomic distance, or the total potential energy. In addition to just looking at the average with some MC error, one should also plot the histograms to understand the distribution of these quantities.&lt;/p>
&lt;p>Apart from that one simple but very important observable is the &lt;a href="https://en.wikipedia.org/wiki/Radial_distribution_function" target="_blank" rel="noopener">Radial Distribution Function&lt;/a>, which tells us about the local packing and particle distribution with respect to the bulk density. To calculate the radial distribution function:&lt;/p>
&lt;ol>
&lt;li>Define the average density at a distance $r$, $\langle \rho(r)\rangle$, as the local density of particles at a distance $r$ away from another particle. The number of particles at distance $r$ from another particle is therefore $4\pi r^2 \langle\rho(r)\rangle$.
&lt;ol>
&lt;li>Calculate $\langle\rho(r)\rangle$ by finding the average number of particles at a distance $r$ from any particle and dividing it by $4\pi r^2$.&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>The radial distribution function, $g(r)$, is defined as $g(r) = \frac{\langle\rho(r)\rangle}{\rho}$ where $\rho$ is the bulk density.&lt;/li>
&lt;/ol>
&lt;h2 id="putting-it-all-together">Putting It All Together&lt;/h2>
&lt;p>Write a full program, that can be run in two different modes:&lt;/p>
&lt;ol>
&lt;li>the &lt;strong>equilibration&lt;/strong> mode&lt;/li>
&lt;li>the &lt;strong>run&lt;/strong> mode&lt;/li>
&lt;/ol>
&lt;p>The input would be in the form of a &lt;a href="https://toml.io/en/" target="_blank" rel="noopener">TOML file&lt;/a> which can be parsed very easily in Julia using the &lt;a href="https://docs.julialang.org/en/v1/stdlib/TOML/" target="_blank" rel="noopener">TOML standard library&lt;/a>.&lt;/p>
&lt;p>A sample input structure, without the exact values provided, may be:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">system&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">N&lt;/span> &lt;span class="p">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">L&lt;/span> &lt;span class="p">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">epsilon&lt;/span> &lt;span class="p">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">sigma&lt;/span> &lt;span class="p">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">temperature&lt;/span> &lt;span class="p">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">simulation&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">mc_steps&lt;/span> &lt;span class="p">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">Deltax&lt;/span> &lt;span class="p">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">output_traj&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;traj.xyz&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">mode&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;equilibration&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>[system]&lt;/code> block encodes everything about our LJ fluid, while the &lt;code>[simulation]&lt;/code> block tells the program what to do and how to run. The &lt;code>mode&lt;/code> variable specifies the running mode, and one might read in different parameters based on the running mode. For instance, one may choose to have a &lt;code>nbins&lt;/code> parameter for the &lt;strong>run&lt;/strong> mode and not for the &lt;strong>equilibration&lt;/strong> mode. Similarly, one may ask for a list of thermodynamic observables to be output along with error bars for the &lt;strong>run&lt;/strong> mode and not for the &lt;strong>equilibration&lt;/strong> mode.&lt;/p>
&lt;p>This input format is just a suggestion. Feel free to use your imagination.&lt;/p></description></item><item><title>Variational adaptive Gaussian decomposition: Scalable quadrature-free time-sliced thawed Gaussian dynamics</title><link>https://bose-research-group.github.io/publication/2026-vagd/</link><pubDate>Fri, 07 Aug 2026 12:38:53 +0530</pubDate><guid>https://bose-research-group.github.io/publication/2026-vagd/</guid><description/></item><item><title>Excitonic Hamiltonian for Singlet Fission: Beyond a Dimer Model</title><link>https://bose-research-group.github.io/publication/2026-singlet-fission-beyond-dimer/</link><pubDate>Sun, 26 Apr 2026 12:38:53 +0530</pubDate><guid>https://bose-research-group.github.io/publication/2026-singlet-fission-beyond-dimer/</guid><description/></item><item><title>Routes of Transport in the Path Integral Lindblad Dynamics through State-to-State Analysis</title><link>https://bose-research-group.github.io/publication/2026-pild-state2state/</link><pubDate>Mon, 06 Apr 2026 12:38:53 +0530</pubDate><guid>https://bose-research-group.github.io/publication/2026-pild-state2state/</guid><description/></item><item><title>QuantumDynamicsCLI.jl</title><link>https://bose-research-group.github.io/project/quantumdynamicscli/</link><pubDate>Tue, 11 Mar 2025 16:07:46 +0530</pubDate><guid>https://bose-research-group.github.io/project/quantumdynamicscli/</guid><description>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">&lt;strong>Documentation&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">&lt;a href="https://amartyabose.github.io/QuantumDynamicsCLI.jl/dev/" target="_blank" rel="noopener">
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="https://img.shields.io/badge/docs-dev-blue.svg" alt="Dev" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="what-is-quantumdynamicscli">What is QuantumDynamicsCLI?&lt;/h2>
&lt;p>Simulating the dynamics of quantum systems is a challenging task with a
multitude of complicated computational methods. The
&lt;a href="https://github.com/amartyabose/QuantumDynamics.jl" target="_blank" rel="noopener">QuantumDynamics.jl&lt;/a> package
provides modular open-source implementations of an increasingly growing number
of these methods, while remaining a flexible platform for further development.
However, owing primarily to its exceptionally flexible nature, the usage of
QuantumDynamics.jl happens through short Julia scripts. This means that for the
most common simulation jobs, one needs to effectively rewrite the same code
multiple times increasing the chances of errors. As a means to making some of
the common types of simulations more facile, we now offer the
QuantumDynamicsCLI.jl package which installs the qdsim application as a sister
code of the QuantumDynamics.jl package. As the framework grows, so will this
application grow to accommodate the new methods and their most common use cases.&lt;/p>
&lt;h2 id="installation">Installation&lt;/h2>
&lt;p>QuantumDynamicsCLI.jl is a registered package. Installation is a simple procedure. It can be done either through the Pkg REPL:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">~ julia
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">julia&amp;gt; ]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pkg&amp;gt; add QuantumDynamicsCLI
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>or by using the &lt;code>Pkg&lt;/code> package manager in a script as follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-julia" data-lang="julia">&lt;span class="line">&lt;span class="cl">&lt;span class="n">julia&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="k">using&lt;/span> &lt;span class="n">Pkg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">julia&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">Pkg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;QuantumDynamicsCLI&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After the package gets built, an executable called &lt;code>qdsim&lt;/code> will be placed in &lt;code>$HOME/.julia/bin&lt;/code> along with the code completions for the shell in &lt;code>$HOME/.julia/completions&lt;/code>. Please add &lt;code>$HOME/.julia/bin&lt;/code> to your path and source the correct completions file.&lt;/p>
&lt;p>While QuantumDynamicsCLI.jl builds on top of the QuantumDynamics.jl package, separate installation of that package is unnecessary. Just installing QuantumDynamicsCLI.jl would install QuantumDynamics.jl as a dependency.&lt;/p>
&lt;h2 id="basic-usage">Basic Usage&lt;/h2>
&lt;p>&lt;code>qdsim&lt;/code> comes as a single program with multiple sub-components. These components can call each other, but are mostly meant for the end-user, and are used for running simulations and post-processing the data. The general syntax for running any particular component is as follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&amp;gt; qdsim &amp;lt;component_name&amp;gt; &amp;lt;command_name&amp;gt; &amp;lt;arguments&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Currently, two &lt;code>command&lt;/code>s are supported:&lt;/p>
&lt;ul>
&lt;li>&lt;code>simulate&lt;/code>: gives access to various techniques for simulating the dynamics&lt;/li>
&lt;li>&lt;code>post&lt;/code>: provides post-processing tools for the output&lt;/li>
&lt;/ul>
&lt;p>The most important sub-command of &lt;code>simulate&lt;/code> is &lt;code>run&lt;/code>, and for &lt;code>post&lt;/code> is &lt;code>get-observable&lt;/code>.&lt;/p>
&lt;h2 id="types-of-simulations">Types of Simulations&lt;/h2>
&lt;p>The primary focus of the qdsim application provided by the QuantumDynamicsCLI.jl package and the underlying QuantumDynamics.jl package is the simulation of dynamics and spectra of open quantum systems. New methods are consistently added and the support for old methods improved. Currently the following methods are supported:&lt;/p>
&lt;ul>
&lt;li>Iterative Quasi-adiabatic Propagators Path Integral (iQuAPI)&lt;/li>
&lt;li>Blip QuAPI&lt;/li>
&lt;li>Time-Evolved Matrix Product Operators (TEMPO)&lt;/li>
&lt;li>Pairwise-Connected Tensor Network Path Integral (PC-TNPI)&lt;/li>
&lt;li>standard Hierarchical Equations of Motion (HEOM)&lt;/li>
&lt;li>scaled HEOM&lt;/li>
&lt;li>Transfer Tensor Method coupled with any of the path integral methods&lt;/li>
&lt;li>Generalized Quantum Master Equation (GQME)&lt;/li>
&lt;li>Multichromophore Incoherent Forster Theory&lt;/li>
&lt;li>Bloch-Redfield Master Equation&lt;/li>
&lt;li>Lindblad Master Equation&lt;/li>
&lt;/ul></description></item><item><title>Adaptive Kink Filtration: Achieving Asymptotic Size-Independence of Path Integral Simulations Utilizing the Locality of Interactions</title><link>https://bose-research-group.github.io/publication/2025-adaptive-kink/</link><pubDate>Wed, 26 Feb 2025 12:38:53 +0530</pubDate><guid>https://bose-research-group.github.io/publication/2025-adaptive-kink/</guid><description/></item><item><title>Non-Hermitian State-to-State Analysis of Transport in Aggregates with Multiple Endpoints</title><link>https://bose-research-group.github.io/publication/2025-non-hermitian-state2state/</link><pubDate>Wed, 26 Feb 2025 12:38:53 +0530</pubDate><guid>https://bose-research-group.github.io/publication/2025-non-hermitian-state2state/</guid><description/></item><item><title>Devansh defends his MSc project!</title><link>https://bose-research-group.github.io/post/20250206-devansh-msc/</link><pubDate>Thu, 06 Feb 2025 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/post/20250206-devansh-msc/</guid><description>&lt;p>Devansh defended his MSc research today! He has studied in detail the effect of complex lossy environments on the spectra of a variety of systems. His work is described in &lt;a href="https://bose-research-group.github.io/publication/2024-impact-loss-linear-spectra/">this publication.&lt;/a>&lt;/p></description></item><item><title>Impact of Loss Mechanisms on Linear Spectra of Excitonic and Polaritonic Aggregates</title><link>https://bose-research-group.github.io/publication/2024-impact-loss-linear-spectra/</link><pubDate>Mon, 14 Oct 2024 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2024-impact-loss-linear-spectra/</guid><description/></item><item><title>Incorporation of Empirical Gain and Loss Mechanisms in Open Quantum Systems through Path Integral Lindblad Dynamics</title><link>https://bose-research-group.github.io/publication/2024-path-integral-lindblad-dynamics/</link><pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2024-path-integral-lindblad-dynamics/</guid><description/></item><item><title>Quantum correlation functions through tensor network path integral</title><link>https://bose-research-group.github.io/publication/2023-quantum-correlation-functions-tensor-network/</link><pubDate>Tue, 05 Dec 2023 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2023-quantum-correlation-functions-tensor-network/</guid><description/></item><item><title>Impact of Spatial Inhomogeneity on Excitation Energy Transport in the Fenna–Matthews–Olson Complex</title><link>https://bose-research-group.github.io/publication/2023-impact-spatial-fmo/</link><pubDate>Thu, 14 Sep 2023 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2023-impact-spatial-fmo/</guid><description/></item><item><title>Impact of Solvent on State-to-State Population Transport in Multistate Systems Using Coherences</title><link>https://bose-research-group.github.io/publication/2023-impact-solvent-state-to-state/</link><pubDate>Tue, 08 Aug 2023 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2023-impact-solvent-state-to-state/</guid><description/></item><item><title>QuantumDynamics.jl: A modular approach to simulations of dynamics of open quantum systems</title><link>https://bose-research-group.github.io/publication/2023-quantum-dynamics_jl/</link><pubDate>Tue, 23 May 2023 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2023-quantum-dynamics_jl/</guid><description/></item><item><title>QuantumDynamics.jl</title><link>https://bose-research-group.github.io/project/quantumdynamics/</link><pubDate>Fri, 05 May 2023 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/project/quantumdynamics/</guid><description>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">&lt;strong>Documentation&lt;/strong>&lt;/th>
&lt;th style="text-align: center">&lt;strong>Build Status&lt;/strong>&lt;/th>
&lt;th style="text-align: center">&lt;strong>Citation&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">&lt;a href="https://amartyabose.github.io/QuantumDynamics.jl/dev/" target="_blank" rel="noopener">
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="https://img.shields.io/badge/docs-dev-blue.svg" alt="Dev" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/a>&lt;/td>
&lt;td style="text-align: center">&lt;a href="https://github.com/amartyabose/QuantumDynamics.jl/actions/workflows/test.yml" target="_blank" rel="noopener">
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="https://github.com/amartyabose/QuantumDynamics.jl/actions/workflows/test.yml/badge.svg?branch=main" alt="Run tests" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/a>&lt;/td>
&lt;td style="text-align: center">&lt;a href="https://doi.org/10.1063/5.0151483" target="_blank" rel="noopener">
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="https://img.shields.io/badge/DOI-10.1063/5.0151483-blue.svg" alt="DOI" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>QuantumDynamics is an open-source software for the simulation of open quantum systems. Though written with performance in mind, QuantumDynamics provides a high throughput platform for experimentation with state-of-the-art approaches to method development.&lt;/p>
&lt;p>The primary problem that QuantumDynamics is aimed at solving is the simulation of the dynamics of a relatively small quantum system coupled to a dissipative environment. Such a system-solvent decomposed problem can typically be represented by the Hamiltonian:
$$\hat{H} = \hat{H}_0 + \hat{H}_\text{env}$$
where
$\hat{H}_0$ is the Hamiltonian of the isolated system and
$\hat{H}_\text{env}$ is the Hamiltonian corresponding to the environment and the interaction between the system and the environment.&lt;/p>
&lt;p>As demonstrated in the tutorials and the example codes, QuantumDynamics provides some approximate methods for simulating the dynamics of the system. However, the goal of this package is to provide access to more state-of-the-art techniques based on path integrals, tensor networks and other ideas in such a manner that all of these methods can be used as far as possible in a composable manner.&lt;/p>
&lt;h2 id="installation">Installation&lt;/h2>
&lt;p>The QuantumDynamics.jl package is registered. The installation can either be done by going into the Pkg REPL mode for Julia&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">~ julia&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-julia" data-lang="julia">&lt;span class="line">&lt;span class="cl">&lt;span class="n">julia&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pkg&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">add&lt;/span> &lt;span class="n">QuantumDynamics&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>or by using the &lt;code>Pkg&lt;/code> package manager in a script:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-julia" data-lang="julia">&lt;span class="line">&lt;span class="cl">&lt;span class="n">julia&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="k">using&lt;/span> &lt;span class="n">Pkg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">julia&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">Pkg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;QuantumDynamics&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>This installs the latest stable release of QuantumDynamics.jl. Currently new features are being implemented quite regularly. The stable release may not always be up-to-date. Please add the bleeding edge release version to take advantage of the new features by adding the git repository:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">~ julia
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">julia&amp;gt; ]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pkg&amp;gt; add https://github.com/amartyabose/QuantumDynamics.jl
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Various parts of QuantumDynamics.jl depends on the BLAS and LAPACK libraries for efficient implementation of linear algebra routines. Julia generally uses OpenBLAS as a default implementation. The most common alternative is Intel&amp;rsquo;s Math Kernel Library (MKL), which can be used with QuantumDynamics.jl by first installing MKL.jl. In the actual script, MKL.jl should be loaded before loading QuantumDynamics.jl:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-julia" data-lang="julia">&lt;span class="line">&lt;span class="cl">&lt;span class="n">julia&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="k">using&lt;/span> &lt;span class="n">MKL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">julia&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="k">using&lt;/span> &lt;span class="n">QuantumDynamics&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="citation">Citation&lt;/h2>
&lt;p>If you use QuantumDynamics in your work, please cite the &lt;a href="https://pubs.aip.org/aip/jcp/article/158/20/204113/2892511/QuantumDynamics-jl-A-modular-approach-to" target="_blank" rel="noopener">QuantumDynamics.jl paper&lt;/a>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bibtex" data-lang="bibtex">&lt;span class="line">&lt;span class="cl">&lt;span class="nc">@article&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nl">10.1063/5.0151483&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">author&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">{Bose, Amartya}&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">title&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;{QuantumDynamics.jl: A modular approach to simulations of dynamics of open quantum systems}&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">journal&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">{The Journal of Chemical Physics}&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">volume&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">{158}&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">number&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">{20}&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">year&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">{2023}&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">month&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">{05}&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">abstract&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;{A simulation of the non-adiabatic dynamics of a quantum system coupled to dissipative environments poses significant challenges. New sophisticated methods are regularly being developed with an eye toward moving to larger systems and more complicated descriptions of solvents. Many of these methods, however, are quite difficult to implement and debug. Furthermore, trying to make the individual algorithms work together through a modular application programming interface can be quite difficult as well. We present a new, open-source software framework, QuantumDynamics.jl, designed to address these challenges. It provides implementations of a variety of perturbative and non-perturbative methods for simulating the dynamics of these systems. Most prominently, QuantumDynamics.jl supports hierarchical equations of motion and methods based on path integrals. An effort has been made to ensure maximum compatibility of the interface between the various methods. Additionally, QuantumDynamics.jl, being built on a high-level programming language, brings a host of modern features to explorations of systems, such as the usage of Jupyter notebooks and high level plotting, the possibility of leveraging high-performance machine learning libraries for further development. Thus, while the built-in methods can be used as end-points in themselves, the package provides an integrated platform for experimentation, exploration, and method development.}&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">issn&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">{0021-9606}&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">doi&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">{10.1063/5.0151483}&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">url&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">{https://doi.org/10.1063/5.0151483}&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">note&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">{204113}&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">eprint&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">{https://pubs.aip.org/aip/jcp/article-pdf/doi/10.1063/5.0151483/17794821/204113\_1\_5.0151483.pdf}&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Multisite Tensor Network Path Integral</title><link>https://bose-research-group.github.io/project/mstnpi/</link><pubDate>Fri, 04 Nov 2022 20:27:50 +0530</pubDate><guid>https://bose-research-group.github.io/project/mstnpi/</guid><description>&lt;p>Simulating the dynamics of a quantum system coupled to a dissipative environment gets challenging because of the non-Markovian memory that needs to be accounted for. While iterative propagation and basic &lt;a href="https://bose-research-group.github.io/project/tensor-network-path-integral">&lt;strong>tensor network path integral (TNPI)&lt;/strong>&lt;/a> enable simulation of longer memory times, the dimensionalities of systems that can be simulated are still very limited. For extended systems the dimensionality grows exponentially with the number of &lt;em>sites&lt;/em> or &lt;em>monomers&lt;/em>, making these techniques untenable. Consider $50$ monomers described by two levels each. That implies that the Hilbert space has a dimensionality of $2^{50}$. This exponential growth of the dimensionality of the Hilbert space may be controlled if the dynamics can be restricted to a significantly smaller subspace. This is the case when considering the single particle subspace in a Frenkel-like process which conserves the number of particles. However, solving the 50-dimensional problem, while more feasible than the $2^{50}$ dimensional problem, is still a significant challenge.&lt;/p>
&lt;p>The standard &lt;a href="https://bose-research-group.github.io/project/tensor-network-path-integral">TNPI&lt;/a> decomposes the path integral expression only along the temporal dimension. However, to account for these extended systems, one needs to decompose it also along a spatial dimension, separating out the individual sites. Thus a two-dimensional tensor network decomposition is achieved. Contraction of this 2D tensor network after incorporation of the influence functional yields the time-dependent reduced density operator corresponding to the extended system in the presence of a dissipative environment. The simulations happen in the full Hilbert space allowing for a transparent inclusion of more involved effects like multi-photon process, multi-dimensional spectra, etc.&lt;/p></description></item><item><title>Exciton and Polaritonic Transport</title><link>https://bose-research-group.github.io/project/exciton-transport/</link><pubDate>Fri, 04 Nov 2022 17:04:49 +0530</pubDate><guid>https://bose-research-group.github.io/project/exciton-transport/</guid><description>&lt;h1 id="motivation">Motivation&lt;/h1>
&lt;p>The transfer of electronic excitation — the movement of an exciton — is among the most fundamental processes in both nature and technology. In photosynthetic complexes, this process captures sunlight and channels energy with near-unity efficiency. In molecular crystals, conjugated polymers, and organic microcavities, similar mechanisms underlie the performance of optoelectronic and quantum photonic devices. Despite the diversity of these systems, they all share a central theme: energy flow occurs in a quantum mechanical world shaped by structure, coherence, and dissipation.&lt;/p>
&lt;p>Our group studies how quantum coherence and environmental interactions organize the flow of excitation energy through complex molecular and hybrid systems. The goal is not only to quantify how efficiently energy moves, but to reveal how it moves — to uncover the competing routes of transport that emerge from the interplay of coherent delocalization, vibrational coupling, and environmental loss.&lt;/p>
&lt;h1 id="conceptual-background">Conceptual Background&lt;/h1>
&lt;p>Excitonic transport lies in the fascinating regime between classical diffusion and fully coherent quantum motion. When the coupling between sites in a molecular aggregate is strong compared to environmental noise, excitations delocalize over multiple chromophores, giving rise to wave-like dynamics. Conversely, strong coupling to phonons or solvent fluctuations can localize the excitation and drive it toward incoherent hopping. Real systems — biological, chemical, and synthetic — exist somewhere in between, and the key challenge is to understand how coherence and dissipation cooperate to produce efficient transport.&lt;/p>
&lt;p>Traditional theories such as Förster or Redfield describe these two limiting regimes separately. However, they often rely on perturbative or Markovian assumptions that fail in intermediate or strongly coupled regimes. To overcome this, we employ numerically exact open-system simulations based on path integrals, which treat system–environment coupling nonperturbatively and capture long-time memory effects. These methods are discussed in detail in &lt;a href="https://bose-research-group.github.io/project/tensor-network-path-integral/">Tensor Network Path Integral&lt;/a>, where we developed scalable algorithms to evaluate the Feynman–Vernon influence functional for extended molecular systems.&lt;/p>
&lt;p>Here, the focus is on how these rigorous dynamical tools can be used to map the routes of excitonic and polaritonic transport.&lt;/p></description></item><item><title>Tensor Network Path Integral</title><link>https://bose-research-group.github.io/project/tensor-network-path-integral/</link><pubDate>Fri, 04 Nov 2022 16:34:44 +0530</pubDate><guid>https://bose-research-group.github.io/project/tensor-network-path-integral/</guid><description>&lt;p>Simulations of real-time dynamics of quantum systems coupled with dissipative media is plagued by the curse of dimensionality. As a way to avoid the problem, many methods integrate out the bath and simulate the dynamics of the reduced density matrix. Such simulations are characterized by the presence of non-Markovian memory. Path integrals, through the use of Feynman-Vernon&amp;rsquo;s influence functional, provides a rigorous way of capturing this non-Markovian effect of the environment on the system.&lt;/p>
&lt;p>The most challenging aspect is that the cost of these calculations grow exponentially with the memory length. We classify approaches that utilize tensor networks to make path integral simulations more efficient as belonging to the &lt;strong>tensor network path integral (TNPI)&lt;/strong> family of methods. There can be many different kinds of tensor networks that are used. Time-evolved matrix product operators (TEMPO) is a particular one that uses matrix product states and matrix product operators for simulating real-time dynamics with Feynman-Vernon influence functional. We have developed a method called the &lt;strong>pairwise-connected tensor network path integral (PC-TNPI)&lt;/strong> as a generalization on these approaches. Additionally, the TNPI framework allows for further factorization of the system to deal with extended systems. This extension, called the &lt;strong>multisite tensor network path integral (MS-TNPI)&lt;/strong>, is described in &lt;a href="https://bose-research-group.github.io/project/mstnpi/">its own section&lt;/a>.&lt;/p></description></item><item><title>Contact</title><link>https://bose-research-group.github.io/contact/</link><pubDate>Mon, 24 Oct 2022 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/contact/</guid><description/></item><item><title>News</title><link>https://bose-research-group.github.io/news/</link><pubDate>Mon, 24 Oct 2022 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/news/</guid><description/></item><item><title>Openings</title><link>https://bose-research-group.github.io/positions/</link><pubDate>Mon, 24 Oct 2022 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/positions/</guid><description/></item><item><title>People</title><link>https://bose-research-group.github.io/people/</link><pubDate>Mon, 24 Oct 2022 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/people/</guid><description/></item><item><title>Softwares</title><link>https://bose-research-group.github.io/software/</link><pubDate>Mon, 24 Oct 2022 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/software/</guid><description/></item><item><title>Tour</title><link>https://bose-research-group.github.io/tour/</link><pubDate>Mon, 24 Oct 2022 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/tour/</guid><description/></item><item><title>Effect of temperature gradient on quantum transport</title><link>https://bose-research-group.github.io/publication/2022-effect-of-temperature/</link><pubDate>Mon, 05 Sep 2022 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2022-effect-of-temperature/</guid><description/></item><item><title>Zero-cost corrections to influence functional coefficients from bath response functions</title><link>https://bose-research-group.github.io/publication/2022-zero-cost-corrections/</link><pubDate>Thu, 04 Aug 2022 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2022-zero-cost-corrections/</guid><description/></item><item><title>Tensor Network Path Integral Study of Dynamics in B850 LH2 Ring with Atomistically Derived Vibrations</title><link>https://bose-research-group.github.io/publication/2022-tensor-network-b850/</link><pubDate>Tue, 12 Jul 2022 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2022-tensor-network-b850/</guid><description/></item><item><title>Pairwise connected tensor network representation of path integrals</title><link>https://bose-research-group.github.io/publication/2022-pairwise-connected/</link><pubDate>Thu, 27 Jan 2022 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2022-pairwise-connected/</guid><description/></item><item><title>A multisite decomposition of the tensor network path integrals</title><link>https://bose-research-group.github.io/publication/2022-multisite-decomposition/</link><pubDate>Mon, 10 Jan 2022 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2022-multisite-decomposition/</guid><description/></item><item><title>A Tensor Network Representation of Path Integrals: Implementation and Analysis</title><link>https://bose-research-group.github.io/publication/2021-tnpi/</link><pubDate>Tue, 19 Oct 2021 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2021-tnpi/</guid><description/></item><item><title>Quantum phase transitions in long-range interacting hyperuniform spin chains in a transverse field</title><link>https://bose-research-group.github.io/publication/2021-qpt-hyperuniform-spins/</link><pubDate>Fri, 29 Jan 2021 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2021-qpt-hyperuniform-spins/</guid><description/></item><item><title>Quantum‐classical Path Integral Evaluation of Reaction Rates with a Near‐equilibrium Flux Formulation</title><link>https://bose-research-group.github.io/publication/2021-qcpi-neareqm-rate/</link><pubDate>Mon, 25 Jan 2021 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2021-qcpi-neareqm-rate/</guid><description/></item><item><title>All-Mode Quantum–Classical Path Integral Simulation of Bacteriochlorophyll Dimer Exciton-Vibration Dynamics</title><link>https://bose-research-group.github.io/publication/2020-bchl-dimer/</link><pubDate>Thu, 04 Jun 2020 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2020-bchl-dimer/</guid><description/></item><item><title>Coherent State-Based Path Integral Methodology for Computing the Wigner Phase Space Distribution</title><link>https://bose-research-group.github.io/publication/2019-cspi-wigner/</link><pubDate>Mon, 15 Apr 2019 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2019-cspi-wigner/</guid><description/></item><item><title>Quasiclassical Correlation Functions from the Wigner Density Using the Stability Matrix</title><link>https://bose-research-group.github.io/publication/2019-quasiclassical-correlation/</link><pubDate>Tue, 26 Feb 2019 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2019-quasiclassical-correlation/</guid><description/></item><item><title>Wigner Distribution by Adiabatic Switching in Normal Mode or Cartesian Coordinates and Molecular Applications</title><link>https://bose-research-group.github.io/publication/2018-asw-normal-cartesian/</link><pubDate>Wed, 10 Oct 2018 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2018-asw-normal-cartesian/</guid><description/></item><item><title>Phase Space and Path Integral Approaches to Quantum Dynamics</title><link>https://bose-research-group.github.io/publication/2018-amartya-phd/</link><pubDate>Tue, 01 May 2018 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2018-amartya-phd/</guid><description/></item><item><title>Non-equilibrium reactive flux: A unified framework for slow and fast reaction kinetics</title><link>https://bose-research-group.github.io/publication/2017-noneqm-rate/</link><pubDate>Wed, 04 Oct 2017 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2017-noneqm-rate/</guid><description/></item><item><title>Wigner phase space distribution via classical adiabatic switching</title><link>https://bose-research-group.github.io/publication/2015-asw/</link><pubDate>Mon, 21 Sep 2015 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/publication/2015-asw/</guid><description/></item><item><title/><link>https://bose-research-group.github.io/admin/config.yml</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bose-research-group.github.io/admin/config.yml</guid><description/></item></channel></rss>