Calculates all strains per unique layer that are given by the
input strain_map, but with a reduced number. The reduction is done
by equally spacing the strains between the min and max strain
with a given number \(N\), which can be also an array of the
\(len(N) = L\), where \(L\) is the number of unique layers.
Calculates the sticks to insert into the layer springs which model the
external force (thermal stress). The length of \(l_i\) of the
\(i\)-th spacer stick is calculated from the temperature-dependent
linear thermal expansion \(\alpha(T)\) of the layer:
where \(A(T)\) is the integrated lin. therm. expansion coefficient
in respect to the temperature \(T\). The indices 1 and 2 indicate
the initial and final state.
Parameters:
temp_map (ndarray[float]) – spatio-temporal temperature profile.
delta_temp_map (ndarray[float]) – spatio-temporal temperature
difference profile.
Returns:
(tuple) –
sticks (ndarray[float]) - summed spacer sticks.
sticks_sub_systems (ndarray[float]) - spacer sticks per
sub-system.
Calculates the force acting on each mass in a linear spring due to damping (\(\gamma_i\)) according to the shift velocity difference \(v_{i}-v_{i-1}\) with \(v_i(t) = \dot{x}_i(t)\):
Returns a strain profile for the sample structure for given temperature
profile. The result can be saved using an unique hash of the sample
and the simulation parameters in order to reuse it.
Parameters:
delays (ndarray[Quantity]) – delays range of simulation [s].
temp_map (ndarray[float]) – spatio-temporal temperature map.
Calculates the strain_map of the sample structure for a given
temp_map and delta_temp_map and delay array. Further
details are given in Ref. [7]. The coupled differential equations are
solved for each oscillator in a linear chain of masses and springs:
where \(x_i(t) = z_{i}(t) - z_i^0\) is the shift of each layer.
\(m_i\) is the mass and \(k_i = m_i\, v_i^2/c_i^2\) is the
spring constant of each layer. Furthermore an empirical damping term
\(F_i^{damp} = \gamma_i(\dot{x}_i-\dot{x}_{i-1})\) is introduced
and the external force (thermal stress) \(F_i^{heat}(t)\).
The thermal stresses are modelled as spacer sticks which are
calculated from the linear thermal expansion coefficients. The
equation of motion can be reformulated as:
The numerical solution also allows for non-harmonic inter-atomic
potentials of up to the order \(M\). Accordingly
\(k_i = (k_i^1 \ldots k_i^{M-1})\) can be an array accounting for
higher orders of the potential which is in the harmonic case purely
quadratic (\(k_i = k_i^1\)). The resulting force from the
displacement of the springs
Provides the according ode function for the ode solver which has to be
solved. The ode function has the input \(t\) and \(X(t)\) and
calculates the temporal derivative \(\dot{X}(t)\) where the vector
Calculates the force acting on each mass in a linear spring due to
damping (\(\gamma_i\)) according to the shift velocity difference
\(v_{i}-v_{i-1}\) with \(v_i(t) = \dot{x}_i(t)\):
Calculates the sticks to insert into the layer springs which model the
external force (thermal stress). The length of \(l_i\) of the
\(i\)-th spacer stick is calculated from the temperature-dependent
linear thermal expansion \(\alpha(T)\) of the layer:
where \(A(T)\) is the integrated lin. therm. expansion coefficient
in respect to the temperature \(T\). The indices 1 and 2 indicate
the initial and final state.
Parameters:
temp_map (ndarray[float]) – spatio-temporal temperature profile.
delta_temp_map (ndarray[float]) – spatio-temporal temperature
difference profile.
Returns:
(tuple) –
sticks (ndarray[float]) - summed spacer sticks.
sticks_sub_systems (ndarray[float]) - spacer sticks per
sub-system.
Calculates all strains per unique layer that are given by the
input strain_map, but with a reduced number. The reduction is done
by equally spacing the strains between the min and max strain
with a given number \(N\), which can be also an array of the
\(len(N) = L\), where \(L\) is the number of unique layers.
Creates the real and symmetric \(K\) matrix (\(L \times L\)) of spring constants \(k_i\) and masses \(m_i\) and calculates the eigenvectors \(\Xi_j\) and eigenfrequencies \(\omega_j\) for the matrix which are used to calculate the strain_map of the structure.
Returns a strain profile for the sample structure for given temperature
profile. The result can be saved using an unique hash of the sample
and the simulation parameters in order to reuse it.
Parameters:
delays (ndarray[Quantity]) – delays range of simulation [s].
temp_map (ndarray[float]) – spatio-temporal temperature map.
Calculates the strain_map of the sample structure for a given
temp_map and delta_temp_map and delay array. Further
details are given in Ref. [8]. Within the linear chain of \(N\)
masses (\(m_i\)) at position \(z_i\) coupled with spring
constants \(k_i\) one can formulate the differential equation
of motion as follow:
Here \(x_i(t) = z_i(t)-z_i^0\) is the shift of each layer,
\(F_i^{heat}(t)\) is the external force (thermal stress) of each
layer and \(\kappa_{i,i} = -(k_i + k_{i+1})/m_i\), and
\(\kappa_{i,i+1} = \kappa_{i+1,i} = k_{i+1}/m_i\).
\(k_i = m_i\, v_i^2/c_i^2\) is the spring constant and \(c_i\)
and \(v_i\) are the thickness and longitudinal sound velocity of
each layer respectively.
One can rewrite the homogeneous differential equation in matrix
form to obtain the general solution
\[\frac{d^2}{dt^2} X = K \, X\]
Here \(X = (x_1 \ldots x_N)\) and \(K\) is the
tri-diagonal matrix of \(\kappa\) which is real and symmetric.
The differential equation can be solved with the ansatz:
where \(\Xi_j = (\xi_1^j \ldots \xi_N^j)\) are the eigenvectors of
the matrix \(K\). Thus by solving the Eigenproblem for \(K\) one
gets the eigenvecotrs \(\Xi_j\) and the eigenfrequencies
\(\omega_j\). From the initial conditions
The external force is implemented as spacer sticks which are
inserted into the springs and hence the layers have a new
equilibrium positions \(z_i(\infty) = z_i^\infty\).
Thus we can do a coordination transformation:
\(x_i^\infty(0)\) is the new initial condition after the excitation
where \(l_i\) is the length of the \(i\)-th spacer stick.
The spacer sticks are calculated from the temperature change and the
linear thermal expansion coefficients.
The actual strain \(\epsilon_i(t)\) of each layer is calculates
as follows:
with \(\Delta x_i = x_i - x_{i-1}\). The stick \(l_i\) have
to be added here, because \(x_i\) has been transformed into the new
coordinate system \(x_i^\infty\).
Parameters:
delays (ndarray[Quantity]) – delays range of simulation [s].
temp_map (ndarray[float]) – spatio-temporal temperature map.
delta_temp_map (ndarray[float]) – spatio-temporal differential
temperature map.
Creates the real and symmetric \(K\) matrix (\(L \times L\)) of
spring constants \(k_i\) and masses \(m_i\) and calculates the
eigenvectors \(\Xi_j\) and eigenfrequencies \(\omega_j\) for the
matrix which are used to calculate the strain_map of the structure.
If the result has been save to file, load it from there.
Calculates the sticks to insert into the layer springs which model the
external force (thermal stress). The length of \(l_i\) of the
\(i\)-th spacer stick is calculated from the temperature-dependent
linear thermal expansion \(\alpha(T)\) of the layer:
where \(A(T)\) is the integrated lin. therm. expansion coefficient
in respect to the temperature \(T\). The indices 1 and 2 indicate
the initial and final state.
Parameters:
temp_map (ndarray[float]) – spatio-temporal temperature profile.
delta_temp_map (ndarray[float]) – spatio-temporal temperature
difference profile.
Returns:
(tuple) –
sticks (ndarray[float]) - summed spacer sticks.
sticks_sub_systems (ndarray[float]) - spacer sticks per
sub-system.
Calculates all strains per unique layer that are given by the
input strain_map, but with a reduced number. The reduction is done
by equally spacing the strains between the min and max strain
with a given number \(N\), which can be also an array of the
\(len(N) = L\), where \(L\) is the number of unique layers.