\documentclass[twocolumn,nofootinbib,superscriptaddress,notitlepage,10pt,a4paper,aps,pra]{revtex4-2}
\usepackage[utf8]{inputenc}
%\usepackage[spanish]{babel}
\usepackage{graphicx}
\usepackage[labelfont=bf]{caption}
\usepackage{siunitx}

\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{booktabs}
\usepackage{chemformula}
\usepackage{hyperref}
\usepackage{adjustbox}
\usepackage{float}
\usepackage{hyperref}

\usepackage{pgfplotstable}
\pgfplotsset{compat=1.17}
\pgfplotstableset{
empty cells with={--}, % replace empty cells with ’--’
every head row/.style={before row=\toprule,after row=\midrule},
every last row/.style={after row=\bottomrule}%,
%every even row/.style={
%before row={\rowcolor[gray]{0.9}}}, % Add this for stylish tables ;)
%begin table=\begin{longtable},
%end table=\end{longtable}
}
\usepackage{chngcntr}
\counterwithin{figure}{section}
\counterwithin{table}{section}

% Who the heck calls tables "cuadros"? We should call RAE to add an entry to thepage
% word "tabla", so it can be used like "cuadro" ;)
%\addto\captionsspanish{%
%\def\tablename{Tabla}%
%}

% Yep, it's not a SI unit, but screw it! ;)
\DeclareSIUnit\rpm{RPM}

\sisetup{separate-uncertainty=true}

\graphicspath{ {./img/} }

\bibliographystyle{plainnat}

\begin{document}
  \title{Determination of the viscosity of shower gel and glycerine}
  \author{Adrià Vilanova Martínez}
  \email{avilanma7@alumnes.ub.edu}
  \affiliation{Facultat de Física, \textsc{Universitat de Barcelona}; Facultat de Matemàtiques i Estadística, \textsc{Universitat Politècnica de Catalunya}}

  \begin{abstract}
    \begin{description}
      \item[Abstract] In this paper we analyze the rheological behavior of shower gel and glycerine to show that the gel is a non-Newtonian pseudoplastic fluid and glycerine is a Newtonian fluid. We also tabulate the dependence of their viscosity at room temperature depending on the shear rate or the shear stress. Finally, we model the dependence of glycerine's viscosity with temperature using Guzman-Andrade's law and the three-parameter exponential model, and conclude that the latter one is slightly better.
      \item[Resumen] En este paper se analiza el comportamiento reológico de gel de baño y glicerina para mostrar que el gel es un fluido no newtoniano pseudoplástico y la glicerina es un fluido newtoniano. También tabulamos la dependencia de sus viscosidades a temperatura ambiente dependiendo del gradiente de velocidad o esfuerzo tangencial. Finalmente, modelamos la dependencia de la viscosidad de la glicerina con la temperatura mediante la ley de Guzman-Andrade y el modelo exponencial de 3 parámetros, y concluimos que el último es ligeramente mejor.
    \end{description}
  \end{abstract}

  \maketitle

  \section{Introduction}

  Viscosity is one of the most important rheological properties of a fluid, which can be defined as
  \[ \mu := \frac{\tau}{\dot{\gamma}}, \]
  where $\tau$ is the shear stress and $\dot{\gamma}$ is the shear rate.

  When the shear stress is proportional to the shear rate, viscosity is uniquely defined (modulus the temperature) and we say that the fluid is a Newtonian fluid. Otherwise, we say that it is a non-Newtonian fluid. Non-Newtonian fluids can be classified into several subgroups depending on how the shear stress depends on the shear rate, as shown in figure \ref{fig1}.

  One of the goals of this experiment is to classify both substances according to this classification.

  \begin{figure}
    \centering
    \includegraphics[width=7cm]{Viscous_regimes_chart.png}
    \caption{Graph showing the dependence of shear stress and shear rate in several types of non-Newtonian fluids and in a Newtonian fluid. The slope of each line is the magnitude of the viscosity.\cite{wiki:nonnewtoniangraph}}
    \label{fig1}
  \end{figure}

  With regards to the dependance of viscosity with temperature, several authors have proposed some theoretical equations which work well in different contexts.\cite{enwiki:1018579135, Makhija1970} One of them is Guzman-Andrade's relation:
  \[ \mu = \mu_0 \exp \left( \frac{B}{T} \right), \]
  where $\mu_0, B$ are constants. This equation was first published in an article by Spanish physicst J. Guzman in the \textit{Anales de la Sociedad Española de Física y Química}, although it is commonly attributed to Andrade.\cite[p.~778]{Markovitz1985}

  Another goal of the experiment is to verify that the dependence of the viscosity of glycerine with temperature satisfies Guzman-Andrade's relation, and find the constants $\mu_0, B$ if it is the case.

  \vspace{1em}
  \hrule
  \vspace{1em}

  In order to get an experimental measure of the viscosity, we have used a rotational viscometer (Fungilab's Premium one). This viscometer has a cylindrical spindle, which is introduced inside of a cylindrical container (a beaker) containing a fluid, and rotates at constant velocity. This generates what is known as a cylindrical Couette flow (see figure \ref{fig2}).

  \begin{figure}
    \centering
    \includegraphics[height=4.5cm]{CouetteTaylorSystem.pdf}
    \caption{Diagram showing cylindrical Couette flow.\cite{wiki:couetteflow}}
    \label{fig2}
  \end{figure}

  With the use of a dynamometer, the viscometer measures the amount of torque that needs to be exerted in order for the spindle to rotate at constant velocity, and that gives a measure of the shear stress $\tau$:
  \[ T = \tau \cdot 2 \pi R_1 L \cdot R_1, \]
  where $R_1$ is the radius and $L$ is the height of the spindle.\cite{guiopractica}

  For cylindrical Couette flow, the shear rate is given by
  \[ \dot{\gamma} (R_b) = \frac{2 \omega R_2^2}{R_2^2 - R_1^2}, \]
  where $R_2$ is the radius of the cylindrical container and $\omega$ is the spindle's angular velocity.

  By combining the 2 previous expressions and using the definition of viscosity, it can be seen that
  \[ T = C \mu \omega, \]
  where $C$ is a constant that depends on $R_1$, $R_2$ and $L$, that is, the properties of the spindle used. Since Couette flow is an idealization of the actual flow inside the container, $C$ is actually calibrated experimentally.

  In this experiment, we have used Fungilab's spindles L3 and L4, and the calibrations given by the manufacturer for those spindles result in the following expressions for the shear rate and shear stress as a function of the values given by the rotational viscometer:\cite{fungilab:manual}
  \[ \begin{cases}
    \dot{\gamma}_\text{L3} = 0.214 \cdot \omega \;\; (\si{\per\second}), \\
    \tau_\text{L3} = 0.257 \cdot P \;\; (\si{\pascal}).
  \end{cases} \]
  \[ \begin{cases}
    \dot{\gamma}_\text{L4} = 0.209 \cdot \omega \;\; (\si{\per\second}), \\
    \tau_\text{L4} = 1.28 \cdot P \;\; (\si{\pascal}).
  \end{cases} \]
  In these expressions, $\omega$ is the angular velocity of the spindle in $\si{\rpm}$ and $P$ is the percentage of the measured torque with respect to the maximum measurable torque.

  \section{Methodology}
  In order to get a table of values of the viscosity as a function of the shear rate, we have done the following procedure for both fluids: first, we mounted the spindle into the viscometer (the L4 spindle for shower gel, and the L3 spindle for glycerine). Then, we filled a beaker with the test fluid and put it under the viscometer, immersing the spindle in the middle of the beaker. Afterwards, we set up the viscometer by configuring the spindle we mounted, and measured the viscosity, percentage of torque and temperature 10 times at different angular velocities. For the smallest and biggest angular velocities we measured the values 3 times, in order to do error analysis.

  Afterwards, we heated the glycerine up to $\SI{50}{\degree}$ and measured the viscosity, percentage of torque and temperature multiple times at constant angular velocity $\omega = \SI{200}{\rpm}$ while we let the glycerine cool down until reaching almost room temperature. We continued using the L3 spindle since it was the one which had the ideal range for measuring the viscosity, as we saw in the previous part of the experiment.

  In order to get correct measurements, we took into account the considerations made by the viscometer manufacturer\cite[p.~47]{fungilab:manual} which were also reminded to us by the lab coordinators.

  \section{Results}
  % Change the counters to count by subsection:
  \counterwithin{figure}{subsection}
  \counterwithin{table}{subsection}

  In order to calculate the errors for each measure, we used the information available in the viscometer's specifications,\cite{fungilab:manual, fungilab:specifications} except for the error of the angular velocity of the spindle, which was assumed to be $\SI{0.1}{\rpm}$ since the display always showed one decimal place.

  The specifications state that the uncertainty for the viscosity is $\SI{0.1}{\milli\pascal\per\second}$ if $\mu < \SI{10000}{\milli\pascal}$, and $\SI{1}{\milli\pascal\per\second}$ otherwise. They also state that the resolution for the temperature is $\SI{0.1}{\celsius}$ and the precision is $\SI{0.1}{\celsius}$, so the total uncertainty for the temperature is taken as $\SI{0.2}{\celsius}$.

  The errors for all the derived magnitudes have been calculated using the theory of error propagation. In specific, we've used the following facts:
  \begin{itemize}
    \item The error is linear: $\delta(aX + bY) = a \delta(X) + b \delta(Y)$.
    \item The error propagates as: $\delta(f(x_1, \ldots, x_n)) = \sum_{i = 1}^n | \partial_i f(x) | \delta (x_i)$.
    \item If we have a set of independent random variables $\{ X_1, \ldots X_n \}$, each of them identically distributed with a $N(\mu, \sigma)$ distribution, and we have a realization of them $x = (x_1, \ldots, x_n)$, then we can estimate the parameters of the distribution from our realization via the maximum likelihood method, which gives us the following estimators:
    \begin{equation*}
      \begin{aligned}
        \hat{\mu} := \frac{1}{n} \sum_{i = 1}^n x_i = \bar{x}, \\
        \hat{\sigma}^2 := \frac{1}{n} \sum_{i = 1}^n (x_i - \bar{x})^2 = S^2 \implies \\
        \implies \hat{\sigma} = \sqrt{\frac{1}{n} \sum_{i = 1}^n (x_i - \bar{x})}.
      \end{aligned}
    \end{equation*}
  \end{itemize}

  This last fact is used in order to calculate the statistical error of viscosity and the percentage of torque.

  The total errors for both magnitudes are calculated as $\delta(x) = \sqrt{\delta_\text{exp.}(x)^2 + \delta_\text{stat.}(x)^2}$, assuming $\delta_\text{stat.}(x)$ is the same for all the measurements (we can only calculate it for the first and the last ones).

  \begin{widetext}
    \subsection{Shower gel}

    \begin{table}[H]
      \centering
      \pgfplotstabletypeset[
        columns/0/.style={column name=$\omega \, (\si{\rpm})$, fixed, fixed zerofill, precision=2},
        columns/1/.style={column name=$\delta(\omega)$, fixed, fixed zerofill, precision=2},
        columns/2/.style={column name=$\eta \, (\si{\milli\pascal\per\second})$, fixed, fixed zerofill, precision=0},
        columns/3/.style={column name=$\delta(\eta)$, fixed, fixed zerofill, precision=0},
        columns/4/.style={column name=\% \textit{torque}, fixed, fixed zerofill, precision=1},
        columns/5/.style={column name=$\delta$(\% \textit{torque}), fixed, fixed zerofill, precision=1},
        columns/6/.style={column name=$T \, (\si{\celsius})$, fixed, fixed zerofill, precision=1},
        columns/7/.style={column name=$\delta(T)$, fixed, fixed zerofill, precision=1},
        columns/8/.style={column name=$\dot{\gamma} \, (\si{\per\second})$, fixed, fixed zerofill, precision=2},
        columns/9/.style={column name=$\delta(\dot{\gamma})$, fixed, fixed zerofill, precision=2},
        columns/10/.style={column name=$\tau \, (\si{\pascal})$, fixed, fixed zerofill, precision=1},
        columns/11/.style={column name=$\delta(\tau)$, fixed, fixed zerofill, precision=1},
        columns/12/.style={column name=$T \, (\si{\newton\meter})$, fixed, fixed zerofill, precision=1},
        columns/13/.style={column name=$\delta(T)$, fixed, fixed zerofill, precision=1}
      ]{../data/gel_full.dat}
      \caption{Experimental data obtained for the shower gel via the rotational viscometer using the L4 spindle. For the topmost and bottommost rows, there have been 3 measurements which have been combined, and the value shown is the mean. $\delta(\cdot)$ means the error of $\cdot$, in the same units.}
    \end{table}
  \end{widetext}

  \begin{figure}[H]
    \centering
    \input{../output/gel_viscosity_vs_rpm_full.tex}
    \caption{Viscosity of the shower gel as a function of the angular velocity, with error bars.}
    \label{figa1}
  \end{figure}

  \begin{figure}[H]
    \centering
    \input{../output/gel_torque_vs_rpm_full.tex}
    \caption{Torque as a function of the angular velocity in the case of the shower gel, with error bars.}
  \end{figure}

  \begin{figure}[H]
    \centering
    \input{../output/gel_shear_stress_vs_shear_rate_full.tex}
    \caption{Shear stress as a function of the shear rate in the case of the shower gel, with error bars.}
    \label{figa3}
  \end{figure}

  We observe that in figure \ref{figa3} the function which describes the shear stress as a function of the shear rate is concave, so this corresponds to the pseudoplastic (or shear thinning) behavior. Also, in figure \ref{figa1} we see that the function is convex. In particular, the fact that it is pseudoplastic means that shower gel is a non-Newtonian fluid.

  \begin{widetext}
    \subsection{Glycerine}

    \begin{table}[H]
      \centering
      \pgfplotstabletypeset[
        columns/0/.style={column name=$\omega \, (\si{\rpm})$, fixed, fixed zerofill, precision=2},
        columns/1/.style={column name=$\delta(\omega)$, fixed, fixed zerofill, precision=2},
        columns/2/.style={column name=$\eta \, (\si{\milli\pascal\per\second})$, fixed, fixed zerofill, precision=0},
        columns/3/.style={column name=$\delta(\eta)$, fixed, fixed zerofill, precision=0},
        columns/4/.style={column name=\% \textit{torque}, fixed, fixed zerofill, precision=1},
        columns/5/.style={column name=$\delta$(\% \textit{torque}), fixed, fixed zerofill, precision=1},
        columns/6/.style={column name=$T \, (\si{\celsius})$, fixed, fixed zerofill, precision=1},
        columns/7/.style={column name=$\delta(T)$, fixed, fixed zerofill, precision=1},
        columns/8/.style={column name=$\dot{\gamma} \, (\si{\per\second})$, fixed, fixed zerofill, precision=2},
        columns/9/.style={column name=$\delta(\dot{\gamma})$, fixed, fixed zerofill, precision=2},
        columns/10/.style={column name=$\tau \, (\si{\pascal})$, fixed, fixed zerofill, precision=1},
        columns/11/.style={column name=$\delta(\tau)$, fixed, fixed zerofill, precision=1},
        columns/12/.style={column name=$T \, (\si{\newton\meter})$, fixed, fixed zerofill, precision=1},
        columns/13/.style={column name=$\delta(T)$, fixed, fixed zerofill, precision=1}
      ]{../data/glicerina_full.dat}
      \caption{Experimental data obtained for glycerine via the rotational viscometer using the L3 spindle. For the topmost and bottommost rows, there have been 3 measurements which have been combined, and the value shown is the mean. $\delta(\cdot)$ means the error of $\cdot$, in the same units.}
    \end{table}
  \end{widetext}

  \begin{figure}[H]
    \centering
    \input{../output/glicerina_viscosity_vs_rpm_full.tex}
    \caption{Viscosity of the glycerine as a function of the angular velocity, with error bars.}
  \end{figure}

  \begin{figure}[H]
    \centering
    \input{../output/glicerina_torque_vs_rpm_full.tex}
    \caption{Torque as a function of the angular velocity in the case of the glycerine, with error bars.}
  \end{figure}

  \begin{figure}[H]
    \centering
    \input{../output/glicerina_shear_stress_vs_shear_rate_full.tex}
    \caption{Shear stress as a function of the shear rate in the case of the glycerine, with error bars.}
    \label{figb3}
  \end{figure}

  We can clearly see that the relationship between $\tau$ and $\dot{\gamma}$ is lineal, and therefore glycerine is a Newtonian fluid. By fitting the experimental data on figure \ref{figb3} to a line, we can determine its viscosity:
  \[ \mu = \SI{0.977(5)}{\pascal\per\second} \]

  \newpage

  \subsection{Glycerine. Dependence of its viscosity with temperature}
  \begin{table}[h]
    \centering
    \pgfplotstabletypeset[
      columns={3, 1, 3, 1},
      display columns/0/.style={select equal part entry of={0}{2}, column name=$\eta \, (\si{\milli\pascal\per\second}) \pm 5$, fixed, fixed zerofill, precision=1},
      display columns/1/.style={select equal part entry of={0}{2}, column name=$T \, (\si{\celsius}) \pm 0.2$, fixed, fixed zerofill, precision=1, column type/.add={}{||}},
      display columns/2/.style={select equal part entry of={1}{2}, column name=$\eta \, (\si{\milli\pascal\per\second}) \pm 5$, fixed, fixed zerofill, precision=1},
      display columns/3/.style={select equal part entry of={1}{2}, column name=$T \, (\si{\celsius}) \pm 0.2$, fixed, fixed zerofill, precision=1}
    ]{../data/glicerina_temperatura.dat}
    \caption{Experimental data obtained for glycerine while it was cooled down via the rotational viscometer using the L3 spindle, and a fixed angular velocity of $\SI{200}{\rpm}$.}
  \end{table}

  \begin{figure}[h]
    \centering
    \input{../output/glicerina_viscosity_vs_t_full.tex}
    \caption{Viscosity of the glycerine as a function of the temperature, with error bars.}
  \end{figure}

  \begin{figure}[h]
    \centering
    \input{../output/glicerina_viscosity_vs_t_modified.tex}
    \caption{Linerization of the previous graph, with error bars.}
    \label{figc2}
  \end{figure}

  By fitting the experimental data to the linearization of Guzman-Andrade's law
  \[ \mu = \mu_0 \exp\left( \frac{B}{T} \right) \implies \]
  \[ \log(\mu) = \log(\mu_0) + B \frac{1}{T}, \]
  we have determined that the coefficients are:
  \[ \begin{cases}
    \log (\mu_0) = \SI{-14.9(6)}{}, \\
    B = \SI{6283(196)}{\kelvin},
  \end{cases} \]
  which implies:
  \[ \mu_0 = \SI{3.38(4)e-7}{\milli\pascal\per\second} \]

  Note that in this case $\mu_0$ represents the limit of viscosity as $T \to \infty$, and $B$ controls how quickly the viscosity decreases with temperature (if it's smaller, viscosity decreases faster).

  In our case, we see this model seems like a good fit (the correlation is close to 1 and both parameter have small relative errors). However, by doing a quick inspection at figure \ref{figc2}, we see that the data doesn't seem perfectly linear (in fact, it seems like there's a boundary point which separates 2 linear regimes).

  We could instead fit a model like the three-parameter exponential:
  \[ \mu = \mu_0 \exp\left( \frac{B}{T - C} \right). \]

  \begin{figure}
    \centering
    \input{../output/glicerina_viscosity_vs_t_3p.tex}
    \caption{Fitting viscosity of the glycerine as a function of the temperature via the three-parameter exponential model.}
    \label{figc3}
  \end{figure}

  By fitting our data to this model via the least-squares method (see fig. \ref{figc3}), we obtain the following estimated parameters:
  \[ \begin{cases}
    \mu_0 = \SI{15.8(18)}{\milli\pascal\per\second}, \\
    B = \SI{95(8)}{\kelvin}, \\
    C = \SI{272.8(14)}{\kelvin}. \\
  \end{cases} \]

  We can clearly see in figure \ref{figc3} that this is a better fit, but the uncertainty in some of the parameters is slightly bigger.

  \section{Discussion of results}
  % Change the counters back to count by section:
  \counterwithin{figure}{section}
  \counterwithin{table}{section}

  In the first part of the experiment, we saw that the viscosity for the shower gel as a function of the shear rate increased very quickly near a 0 shear rate, while it remained constant for higher shear rates, which indicates that the function is concave and therefore the fluid is non-Newtonian. Since the increase happened near 0 and not at a higher shear rate (which would mean the viscosity would be 0 until a certain value of the shear rate), we verified that the behavior of the shower gel was pseudoplastic and not Bingham pseudoplastic.

  However, we saw that for glycerine viscosity remained constant over the entire range of shear rates, because the shear rate and shear stress were proportional. This indicated us that, as opposed to the gel, the behavior of glycerine was Newtonian.

  With regards to the viscosity of glycerine depending on temperature, we can compare our tabbed values with the ones presented by J.B. Segur and Helen E. Oberstar in \cite{Segur1951} for an aqueous glycerol solution containing 97\% of glycerine (we also include the value found in the first part with $T = \SI{21}{\celsius}$):

  \begin{table}[H]
    \centering
    \pgfplotstabletypeset[
      display columns/0/.style={column name=$T \, (\si{\celsius})$, fixed, fixed zerofill, precision=0},
      display columns/1/.style={column name=$\mu_\text{exp.} \, (\si{\milli\pascal\per\second})$, fixed, fixed zerofill, precision=0},
      display columns/2/.style={column name=$\mu_\text{bib.} \, (\si{\milli\pascal\per\second})$, fixed, fixed zerofill, precision=0},
      display columns/3/.style={column name=Relative diff. (in \%), fixed, fixed zerofill, precision=0}
    ]{comparison_t_viscosity.dat}
    \caption{Experimental data obtained for glycerine while it was cooled down via the rotational viscometer using the L3 spindle, and a fixed angular velocity of $\SI{200}{\rpm}$.}
  \end{table}

  We can see that for $T = \SI{50}{\celsius}$ the relative difference is pretty high, but we get pretty close results in the lower range. We don't take into consideration the high relative difference when $T = \SI{20}{\celsius}$ because in the lab we took the measurements at a slightly higher temperature, and therefore the high relative difference is expected.

  Something that we can note is what physical meaning have the $\mu_0$ and $B$ constants in Guzman-Andrade's law. We already stated that $\mu_0$ is a measure of the viscosity in the thermodynamic limit $T \to \infty$, but in the case of $B$, we only stated that decreasing $B$ will make the viscosity decrease quicker with temperature. And even then, why does viscosity decrease with temperature?

  To explain this, Reid and Sherwood state that the main force which opposes the relative motion of two close parallel layers of the liquid might be thought of as the molecular forces acting in the boundary between both layers. If we increase temperature, we are increasing the kinetic energy of the molecules and therefore it is much easier for them to overcome these interactions, thus decreasing viscosity.\cite{poling2001the}

  They also describe this law theoretically, and arrive to the following expression:
  \[ \mu \approx K \exp\left( 3.8 \frac{T_b}{T} \right), \]
  where $T_b$ is the normal boiling point of the substance. We see that $B \propto T_b$, so $B$ describes the normal boiling point (scaled with a constant).

  \section{Conclusions}
  The gel we tested in the lab is a non-Newtonian pseudoplastic fluid, while glycerine is a Newtonian fluid. Also, we found that we can model the viscosity of glycerine as a function of temperature with the 3-paremeter exponential model, which is a slightly better model than the model based on Guzman-Andrade's law.

  \bibliography{references}

\end{document}
