Page MenuHomec4science

No OneTemporary

File Metadata

Created
Tue, Jan 21, 17:32
diff --git a/Bank of Tubes.ipynb b/Bank of Tubes.ipynb
new file mode 100644
index 0000000..97b92cf
--- /dev/null
+++ b/Bank of Tubes.ipynb
@@ -0,0 +1,294 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:16pt\"><i><b> Bank of Tubes </b> </i> </p>\n",
+ "<p style=\"color:#2471A3;font-size:11pt\"><i><b>A tube bank uses an aligned arrangement of $10mm$ diameter tubed with $S_T = S_L = 20mm$. There\n",
+ "are 10 rows of tubes with 50 tubes in each row. <br>\n",
+ "Consider an application for which cold water flows through the tubes, maintaining the outer surface temperature at 27°C, while flue gases at 427°C and\n",
+ "a velocity of 5m/s are in cross flow over the tubes. <br> The properties of the flue gas may be approximated\n",
+ "as those of atmospheric temperature at 427°C. <br> \n",
+ "What is the total rate of heat transfer per unit length\n",
+ "of the tubes in the bank?\n",
+ " <\\i></p></b>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import ipywidgets as widgets\n",
+ "import matplotlib.pyplot as plt\n",
+ "from IPython.display import IFrame, display, clear_output\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042810',1200,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042811',1200,350)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042812',1200,450)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 4"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042813',1200,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 5"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042814',1200,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 6.1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### A:\n",
+ "$$\\overline{Nu_D}=C C_2 Re_{D,max}^m Pr^{0.36} \\left(\\frac{Pr}{Pr_s}\\right)^{1/4}\n",
+ "$$\n",
+ "#### B:\n",
+ "$$Nu_x = 0.453 Re_x^{1/2} Pr^{1/3}, \\mbox{ for } Pr \\geq 0.6$$\n",
+ "\n",
+ "#### C:\n",
+ "$$\\overline{Nu_L} = \\Bigg{(}0.825 + \\frac{0.387 Ra_L^{1/6}}{[1+ (0.492/Pr)^{9/16}]^{8/27}} \\Bigg{)}^2$$\n",
+ "\n",
+ "#### D:\n",
+ "$$\\overline{Nu_D}=0.3+\\frac{0.62 Re_D^{1/2}Pr^{1/3}}{\\left(1+(\\frac{0.4}{Pr})^{2/3}\\right)^{1/4}}\\left(1+\\frac{Re_D}{282000}^{5/8}\\right)^{4/5}, Re_D>0.2 \\textrm{ and } Pr>0.2$$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042815',1200,350)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 6.2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042816',1200,400)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 6.3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042817',1200,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 7.1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042818',1200,400)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 7.2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042819',1200,250)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 8"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042820',1200,250)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Boiling.ipynb b/Boiling.ipynb
new file mode 100644
index 0000000..8187ac7
--- /dev/null
+++ b/Boiling.ipynb
@@ -0,0 +1,531 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h1> Boiling </h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<div style=\"background-color:#f6f6f6;border:1px solid #707070;padding:0.5em 1em;box-sizing:border-box;\">\n",
+ "Boiling corresponds to convection process with a phase change. In this case, it is important to consider the latent heat effects associated with the phase change. In fact, for boiling, heat transfer can occur while the temperature of the fluid remains constant. Boiling occurs when the surface temperature $T_s$ is higher than the saturation temperature $T_{sat}$.\n",
+ " <br>\n",
+ " <br>\n",
+ "During boiling, the following parameters characterize the process :\n",
+ " <ul>\n",
+ " <li> Latent heat $h_{fg}$</li>\n",
+ " <li> The surface tension at the liquid-vapor interface $\\sigma$ </li>\n",
+ " <li> The density difference between the liquid and vapor phases which generates a buoyauncy force proportional to $g(\\rho_l - \\rho_v)$ </li>\n",
+ " </ul>\n",
+ "\n",
+ "Due to these many effects acting simultaneously, the heat transfer coefficients of boiling are usually larger than the heat transfer coefficients of single-phase convection.\n",
+ "\n",
+ "Many engineering applications involve two-phased convection such as boilers and condensers.\n",
+ "</div>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "from IPython.display import IFrame, display, clear_output"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2> Boiling Modes </h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Boiling can occur in different conditions or mode. <br>\n",
+ "The mode depends on the <i> <b>excess temperature </b></i>\n",
+ "$$\\Delta T_e = T_s - T_{sat}$$\n",
+ "The heat transfered from the solid surface to the fluid is \n",
+ "$$q''_s = h(T_s - T_{sat}) = h\\Delta T_e$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the following videos, you will be able to watch the different boiling modes as the excess temperature increases.\n",
+ "<br>\n",
+ "\n",
+ "<i> Advice : Lower your volume (you could also keep it high to enjoy the epic background music accompanying this epic phenomena!)</i>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://www.youtube.com/embed/GA9MBdePwmo',400,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This video will then be broken down in order to properly distinguish the different boiling modes."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://www.youtube.com/embed/VqWVxe9WUmE?list=PL2Z-lNqulYHTjDxvInSoTcnSGU8tJfjJq',400,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Free Convection Boiling <\\h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Free convection boiling happens when $$\\Delta T_e \\le \\Delta T_{e,A}$$\n",
+ "The surface temperature is above the saturation temperature. Therefore, it is possible to sustain the formation of bubble. \n",
+ "However, free convection dominates the motion of the fluid."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Nucleate Boiling <\\h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Nucelate boiling happens when $$\\Delta T_{e,A} \\le \\Delta T_e \\le \\Delta T_{e,C}$$\n",
+ "Two flow regimes occur :\n",
+ " <ul>\n",
+ " <li> <i>Isolated bubbles regime </i> between A and B : Isolated bubbles will develop at nucleation sites at the surface of the solid and then seperate from the surface. </li>\n",
+ " <li> <i> Jets and columns regime </i> between B and C : The number of nucleation sites increase, more bubbles form. Therefore, they will interfere with each other and merge, forming jets and columns</li>\n",
+ " </ul>\n",
+ "At point C, the critical heat flux $q''_{max}$ is reached. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://www.youtube.com/embed/d5WUR3VVY98',400,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Transient Boiling </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Tranisent boiling, also called transition boiling, unstable film boiling, or partial film boiling occurs when \n",
+ "$$\\Delta T_{e,C} \\le \\Delta T_e \\le \\Delta T_{e,D}$$\n",
+ "The quick bubble formation leads to the start of the formation of a vapor film on the surface. The conditions osccillate between film and nucleate boiling.\n",
+ "<br>\n",
+ "\n",
+ "As $\\Delta T_e$ increases, the fraction of the total surface covered by the film increases.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://www.youtube.com/embed/tEVBHdwH11A?list=PL2Z-lNqulYHTjDxvInSoTcnSGU8tJfjJq',400,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Film Boiling </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Film boiling occurs when \n",
+ "$$\\Delta T_e \\le \\Delta T_{e,D}$$\n",
+ "The point D of the boiling curve, corresponds to the Leidenfrost point where the heat flux is at its minimum $q''_{min}$.\n",
+ "<br>\n",
+ "The surface is completely covered by a film of vapor and heat transfer by conduction and radiation will occur from the\n",
+ "surface to the liquid through the vapor. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "IFrame('https://www.youtube.com/embed/_QZXhb9e4w4?list=PL2Z-lNqulYHTjDxvInSoTcnSGU8tJfjJq',400,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Boiling Crisis </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "However, when increasing the surface temperature, and thus the excess temperature $\\Delta T_e$ from point $C$ the boiling crisis occurs.\n",
+ "<br>\n",
+ "In fact, after point $C$, the condition will shift from the boiling curve and move suddenly from point $C$ to $E$.\n",
+ "<br>\n",
+ "\n",
+ "It is possible to stay on the boiling curve when decreasing the excess temperature $\\Delta T_e$.\n",
+ "<br>\n",
+ "\n",
+ "This phenomena highlights the <b> hysteris </b> property displayed in the boiling curve.\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2> Pool Boiling Correlations </h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Each boiling mode has different characteristics, and therefore, different correlations are defined for each mode.\n",
+ "\n",
+ "For the following correlations,\n",
+ "<ul>\n",
+ " <li> The indice $v$ correspond to the vapor property, determined at the film temperature $T_f = \\frac{T_s + T_{sat}}{2}$ </li>\n",
+ " <li> The indice $l$ correspond to the liquid property, determined at the saturation temperature $T_{sat}$ </li>\n",
+ " <li> The latent heat $h_{fg}$ is determined at the saturation temperature $T_{sat}$ </li>\n",
+ " </ul>\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Nucleate Pool Boiling </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The heat flux is given by the <b> Rohsenow correlation </b>\n",
+ "$$q''_s = \\mu_l h_{fg} \\big{[}\\frac{g(\\rho_l - \\rho_v)}{\\sigma} \\big{]} ^{1/2} \\big{(}\\frac{c_{p,l} \\Delta T_e}{C_{s,f} h_{fg} Pr_l^n} \\big{)}^3$$\n",
+ "\n",
+ "$C_{s,f}$ and $n$ depend on the surface-fluid interface combination. They are determined from the following table.\n",
+ "\n",
+ "<table>\n",
+ " <tr>\n",
+ " <th>Surface-Fluid Combination</th>\n",
+ " <th>$C_{s,f}$</th>\n",
+ " <th>$n$</th>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td><b>Water-copper<b></td> <td> </td> <td> </td> \n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Scored</td> <td>0.0068</td> <td>1.0</td> \n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Polished</td> <td>0.0128</td> <td>1.0</td> \n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td><b>Water-stainless steel<b></td> <td> </td> <td> </td> \n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Chemically etched</td> <td>0.0133</td> <td>1.0</td> \n",
+ " </tr> \n",
+ " <tr>\n",
+ " <td>Mechanically polished</td> <td>0.0132</td> <td>1.0</td> \n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Ground and polished</td> <td>0.0080</td> <td>1.0</td> \n",
+ " </tr> \n",
+ " <tr>\n",
+ " <td><b>Water-brass<b></td> <td>0.0060 </td> <td>1.0 </td> \n",
+ " </tr> \n",
+ " <tr>\n",
+ " <td><b>Water-nickel<b></td> <td>0.0060 </td> <td>1.0 </td> \n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td><b>Water-platinum<b></td> <td>0.0130 </td> <td>1.0 </td> \n",
+ " </tr> \n",
+ "</table> \n",
+ " \n",
+ "The <b> critical heat flux </b> is given by \n",
+ "$$q''_{s,max} = C h_{f,g} \\rho_v \\big{[}\\frac{g \\sigma (\\rho_l - \\rho_v)}{\\rho_v^2} \\big{]}^{1/4}$$\n",
+ "$C = \\frac{\\pi}{4}$ for large horizontal cylinders, spheres and finite heated surfaces. <br>\n",
+ "$C = 0.149$ for large horizontal plates,"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Film Boiling <\\h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The average Nusselt number is given by\n",
+ "$$\\overline{Nu}_D = C \\big{[} \\frac{g \\rho_v (\\rho_l - \\rho_v)h'_{fg}D^3}{\\mu_l k_v (T_s-T_{sat})} \\big{]}^{1/4}$$\n",
+ "$h'_{fg} = h_{fg}+0.8 c_{p,v}(T_s - T_{sat})$ <br>\n",
+ "$C = 0.62$ for horizontal cylinders. <br>\n",
+ "$C = 0.67$ for spheres\n",
+ "<br>\n",
+ "\n",
+ "If $T_s > 300 ^{\\circ}C$, <b>radiation</b> is also present. <br>\n",
+ "The total convection coeeficient is estimated the following way\n",
+ "$$\\overline{h} = \\overline{h}_{conv} + \\frac{3}{4} \\overline{h}_{rad}$$\n",
+ "$\\overline{h}_{conv}$ is evaluated with the previous correlation.<br>\n",
+ "$$\\overline{h}_{rad} = \\frac{\\epsilon \\sigma (T_s^4 - T_{sat}^4)}{T_s - T_{sat}}$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2> Forced Convection Boiling </h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The conditions of the forced convection boiling depend on the geometry of the problem. It can be external or internal.\n",
+ "<br>\n",
+ "The internal forced boiling is also called <i> two-phase flow </i> since it involves rapid phase changes in the flow direction.\n",
+ "<br>\n",
+ "\n",
+ "The following correlations are used for forced convection boiling.\n",
+ "<br>\n",
+ "The properties of the fluid are estimated at the saturation temperature $T_{sat}$.\n",
+ "<br>\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> External : Cylinder </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "External forced convection boiling combines both the effect of pure forced external convection and pool boiling and therefore depends strongly on the velocity of the fluid. \n",
+ "<br>\n",
+ "\n",
+ "In the case of flow at velocity $V$ across a cylinder of diameter $D$, the following correlations developed by Lienhard and Eichhorn are used.\n",
+ "Two cases should be distinguished depending on the velocity, low velocity and high velocity external convection.\n",
+ "<br>\n",
+ "\n",
+ "The problem should be solved with both correlations and than the correlation which is valid for the studied case is picked.\n",
+ "\n",
+ "<br>\n",
+ "<br> \n",
+ "\n",
+ "<table style=\"width:80%\">\n",
+ " <tr>\n",
+ " <th> </th> \n",
+ " <th>Low Velocity</th>\n",
+ " <th>High Velocity</th>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align = \"right\"> <b> Condition <b> </td>\n",
+ " <td>$$\\frac{q''_{max}}{\\rho_v h_{fg} V} > \\big{[} \\frac{0.275}{\\pi} \\big{(} \\frac{ \\rho_l}{ \\rho_v} \\big{)}^{1/2}+1 \\big{]}$$ </td>\n",
+ " <td>$$\\frac{q''_{max}}{\\rho_v h_{fg} V} < \\big{[} \\frac{0.275}{\\pi} \\big{(} \\frac{ \\rho_l}{ \\rho_v} \\big{)}^{1/2}+1 \\big{]}$$ <\\td>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align = \"right\"> <b>Correlation <b> </td> \n",
+ " <td>$$\\frac{q''_{max}}{\\rho_v h_{fg} V} = \\frac{1}{\\pi} \\big{[}1 + \\big{(}\\frac{4}{We_D} \\big{)}^{1/3} \\big{]}$$ <\\td>\n",
+ " <td> $$\\frac{q''_{max}}{\\rho_v h_{fg} V} = \\frac{(\\rho_l / \\rho_v)^{3/4}}{169 \\pi} + \\frac{(\\rho_l / \\rho_v)^{1/2}}{19.2 \\pi We_D^{1/3}}$$<\\td> \n",
+ " <\\tr> \n",
+ "</table> \n",
+ " \n",
+ "$We_D = \\frac{\\rho_v V^2 D}{ \\sigma}$with V the fluid velocity"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Internal : Circular Smooth Tubes </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Internal forced convection boiling is characterized by the formation of bubbles formation at the inner\n",
+ "surface of a heated tube through which a liquid is flowing. It is highly influenced by the velocity and is determined by hydrodynamic effects which differ\n",
+ "significantly from pool boiling. It is a two-phase flow.\n",
+ "\n",
+ "Consider a flow in vertical tube with a constant surface\n",
+ "heat flux. <br>\n",
+ "At the inlet of the tube, heat is transferred to the subcooled liquid by single phase forced internal convection as seen previously.\n",
+ "At some point, the wall temperature will exceed the saturation temperature of the liquid, causing the vaporization of the liquid flowing inside the tube. Bubbles will form at the wall of the tube, and the liquid will flow at the center of the tube. Therefore, this region is characterized by important radial\n",
+ "temperature gradients. The thickness of the bubble region will increase until the liquid reached the saturation temperature, this corresponds to the start of the saturated flow boiling region. <br>\n",
+ "The vapor quality increases, the large difference between the densities of the vapor and the liquid will cause the mean velocity of the $u_m$ to increase significantly.When the vapor quality increases even more, the bubbles will form slugs of vapor. Then, a film of liquid will be formed on the inner surface of the tube. Afterwards, dry spots appear on the surface and grow until the entire surface is dry. The remaining liquid will travel as droplets in the core of the tube at a high velocity. <br>\n",
+ "Finally, the drops of liquid vaporize and only superheated vapor remains, coming back to the case of a single phase internal forced convection.\n",
+ "The local heat transfer coefficienct strongly depends on the mean velocity of the fluid $u_m$ which varies along the tube. It is also influenced by the fluid and the tube material.\n",
+ "\n",
+ "The following correlation corresponds to internal forced convection boiling, more precisely for the saturated flow boiling\n",
+ "region in a smooth circular tube."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Use the largest h among :\n",
+ "$$\\frac{h}{h_{sp}} = 0.6683 \\big{(}\\frac{\\rho_l}{\\rho_v}\\big{)}^{0.1} \\overline{X}^{ 0.16}(1-\\overline{X})^{0.64}f(Fr) + 1058 \\big{(}\\frac{q''_s }{\\dot{m}'' h_{fg}} \\big{)}^{0.7} (1 - \\overline{X})^{0.8}G_{s,f}$$\n",
+ "<br>\n",
+ "$$\\frac{h}{h_{sp}} = 1.136\\big{(}\\frac{\\rho_l}{\\rho_v}\\big{)}^{0.45} \\overline{X}^{ 0.72}(1-\\overline{X})^{0.08}f(Fr) + 667.2 \\big{(}\\frac{q''_s }{\\dot{m}'' h_{fg}} \\big{)}^{0.7} (1 - \\overline{X})^{0.8}G_{s,f}$$\n",
+ "\n",
+ "<ul> \n",
+ " <li> $\\overline{X}(x) = \\frac{q''_s \\pi D x}{\\dot{m} h_{fg}}$ is the time average vapor quality </li>\n",
+ " <li> $\\dot{m}'' = \\frac{\\dot{m}}{A_c}$ </li>\n",
+ " <li> $h_{sp}$ is the single-phase convection coefficient calculated with the right correlation for internal forced convection assuming all the mass is flowing in the liquid form </li>\n",
+ " <li> f is a function of $Fr=\\frac{(\\dot{m}''/\\rho_l)^2}{g D}$ and is determined from the table below depending on the geometry of the problem </li>\n",
+ "</ul> \n",
+ " <table style=\"width:80%\"> \n",
+ " <tr>\n",
+ " <th> </th> \n",
+ " <th>Vertical Tubes</th>\n",
+ " <th>Horizontal Tubes</th>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align = \"right\"> $f(Fr)$ </td>\n",
+ " <td align = \"center\"> 1 </td>\n",
+ " <td align = \"center\">$$\\begin{cases} 2.63 Fr^{0.3} &\\mbox{if } Fr < 0.04 \\\\\n",
+ " 1 & \\mbox{if } Fr>0.04 \\end{cases}$$ <\\td>\n",
+ " <\\tr> \n",
+ " </table>\n",
+ " \n",
+ "<ul>\n",
+ " <li> $G_{s,f}$ depends one the surface-liquid combination and is determined from the following table </li>\n",
+ "<\\ul>\n",
+ " \n",
+ " \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<table style=\"width:80%\">\n",
+ " <tr>\n",
+ " <th>Fluid in Commercial Copper Tubing</th>\n",
+ " <th>$G_{s,f}$</th>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align=\"left\">Kerosene<\\td>\n",
+ " <td align=\"center\">$0.488$<\\td>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align=\"left\">Refrigerant R-134-a<\\td>\n",
+ " <td align=\"center\"> $1.63$<\\td> \n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align=\"left\">Refrigerant R-152-a<\\td>\n",
+ " <td align=\"center\">$1.10$<\\td>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align=\"left\">Water<\\td>\n",
+ " <td align=\"center\">$1.00$<\\td>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align=\"left\">Water<\\td>\n",
+ " <td align=\"center\">$1.00$<\\td>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align=\"left\"><b> Stainless Steel Tubing <b><\\td>\n",
+ " <td align=\"center\">$\\mathbf{1.00}$<\\td>\n",
+ " <\\tr>\n",
+ "</table> \n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Content.ipynb b/Content.ipynb
new file mode 100644
index 0000000..da821ef
--- /dev/null
+++ b/Content.ipynb
@@ -0,0 +1,151 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Welcome to the Convective Heat Transfer Jupyter Notebook!\n",
+ "This notebook contains the notions on Convection covered in the Heat and Mass Transfer class. </br>\n",
+ "Here you can access the theory, but it is also a chance for you to work on some interactive exercices which aim to help you with the understanding of the presented concepts as well as the methodoly of resolution of these problems. <br>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The goal of the notebook is to guide you through a learning process as _laminar_ as possible!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "You can access the content by simply clicking on the correponding section in the table of content!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "source": [
+ "\n",
+ " \n",
+ "<h3>\n",
+ "<table style = \"width : 100%\"> \n",
+ "\n",
+ " <tr>\n",
+ " <col width = \"25%\">\n",
+ " <col width = \"50%\">\n",
+ " <col width = \"25%\">\n",
+ " <td align=\"center\"> <a href=Convection_Intro.ipynb> <b> <font size='6'> INTRODUCTION <\\font><\\b> <\\a> \n",
+ " <\\td>\n",
+ " <td align=\"center\"> <a href=ForcedConvection.ipynb><button> <b> <big> <font size='6'> FORCED CONVECTION <\\font> <\\b> <\\button> <\\a> <\\td>\n",
+ " <td align=\"center\"> <a href=FreeConvection.ipynb> <button> <b> <font size='6'> FREE CONVECTION <\\a><\\font> <\\button> <\\td>\n",
+ " <\\tr> \n",
+ " <tr style= \"width : 50%\">\n",
+ " <td align = \"center\"> <font size='4'><ul style=\"list-style-type:none;\"> <li>What is a convection problem?<\\li> <li> <br> Types of convection problems <\\li> <li> <br> Local and average convection coefficient <\\li> <li> <br> Laminar and turbulent flow <\\li> <li> <br> Adimensional numbers <\\li> <\\font> <\\ul> </td>\n",
+ " <td> \n",
+ " <table style = \"width : 100%\">\n",
+ " <tr> \n",
+ " <td align=\"center\"> <a href=ForcedConvection.ipynb> <button> <b> <font size='5'>External Convection<\\font> <\\b><\\button> <\\a> </td>\n",
+ " <td align=\"center\"> <a href=Internal.ipynb> <button> <b> <font size='5'>Internal Convection <\\font> <\\button> <\\b> <\\a> </td>\n",
+ " <\\tr>\n",
+ " <tr> \n",
+ " <td align = \"center\"> <font size='4'> <ul style=\"list-style-type:none;\"> <li> Parallel flow over a plate <\\li> <li> <br> Horizontal plate <\\li> <li> <br> Cylinder in a cross-flow <\\li> <li> <br> <a href=Exercice:-Fuell-Cell-Vehicle Flow across a bank of tubes > <\\li> <\\ul> <\\font></td>\n",
+ " <td align = \"center\"> <font size='4'> <ul style=\"list-style-type:none;\"> <li> Definition <\\li> <li> <br> Energy Balance <\\li> <li> <br>Convection Correlations <\\li> <li> <br>Heat Transfer Enhancement<\\li><li> <br>Influence of parameters <\\li> <\\ul> <\\font> </td>\n",
+ " </tr> \n",
+ " </td> \n",
+ " <td align = \"center\"> <font size='4'> <ul style=\"list-style-type:none;\"> <li>Definition <\\li> <li> <br> Vertical Plate<\\li> <li> <br>Inclined Plate <\\li> <li> <br> Horizontal plate <\\li> <li> <br> Infinite Horizontal Cylinder <\\li> <\\font><\\ul> <\\td>\n",
+ " <\\tr>\n",
+ " <\\table>\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<style>\n",
+ "td {\n",
+ " font-size: 50px\n",
+ "}\n",
+ "</style>\n",
+ "## Table of Content\n",
+ "\n",
+ "1. <a href=Convection_Intro.ipynb> <h4> Introduction </h4> </a> \n",
+ " 1.1 What is a convection problem?<a href=Convection_Intro.ipynb#What-is-a-convection-problem?> >> </a> \n",
+ " 1.2 Types of convection problems <a href=Convection_Intro.ipynb#Types-of-convection-problems> >> </a> \n",
+ " 1.3 Heat-Balance-for-open-systems <a href=Convection_Intro.ipynb#Heat-Balance-for-open-systems> >> </a> \n",
+ " 1.4 Boundary layer equations <a href=Convection_Intro.ipynb#Boundary-Layer-Equations> >> </a> \n",
+ " 1.5 Local and average convection coefficient <a href=Convection_Intro.ipynb#Local-and-average-convection-coefficient> >> </a> \n",
+ " 1.6 Laminar and turbulent flow <a href=Convection_Intro.ipynb#Laminar-and-turbulent-flow> >> </a> \n",
+ " 1.7 Adimensional numbers <a href=Convection_Intro.ipynb#Adimensional-numbers> >> </a> \n",
+ " \n",
+ "\n",
+ "2. <a href=ForcedConvection.ipynb> <h4> External forced convection <img src=\"Images/Wind_icon.png\" style=\"width:3%\"> </h4></a> \n",
+ " 2.1 Introduction<a href=ForcedConvection.ipynb#External-forced-convection> >> </a> \n",
+ " 2.2 Isothermal flat plate <a href=ForcedConvection.ipynb#Isothermal-flat-plate> >> </a> \n",
+ " 2.3 Plate with constant heat flux <a href=ForcedConvection.ipynb#Plate-with-constant-heat-flux> >> </a> \n",
+ " 2.4 Cylinder in cross flow<a href=ForcedConvection.ipynb#Cylinder-in-cross-flow> >> </a> \n",
+ " 2.5 Flow across a bank of tubes <a href=ForcedConvection.ipynb#Flow-across-a-bank-of-tubes> >> </a> \n",
+ " 2.5 Exercises <a href=Exercice-7-5.ipynb> >> </a> \n",
+ " 2.6 Quiz\n",
+ "\n",
+ "\n",
+ "3. <a href=Internal.ipynb><h4> Internal forced convection <img src=\"Images/Pipe_icon.png\" style=\"width:2%\"> </h4></a> \n",
+ " 3.1 Introduction<a href=Internal.ipynb#Introduction> >> </a> \n",
+ " 3.2 Energy balance<a href=Internal.ipynb#Energy-Balance> >> </a> \n",
+ " 3.3 Convection correlations<a href=Internal.ipynb#Convection-Correlations> >> </a> \n",
+ " 3.3 Heat transfer enhancement<a href=Internal.ipynb#Heat-Tranfer-Enhancement> >> </a> \n",
+ " 3.4 Influence of parameters<a href=Internal.ipynb#Influence-of-parameters> >> </a> \n",
+ " 3.5 Example <a href=Exercice-Internal-1.ipynb> >> </a> \n",
+ " 3.6 Quiz\n",
+ "\n",
+ "4. <a href=FreeConvection.ipynb> <h4> Free convection <img src=\"Images/Free_icon.png\" style=\"width:3%\"></h4></a> \n",
+ " 4.1 Introduction<a href=FreeConvection.ipynb#Introduction> >> </a> \n",
+ " 4.2 Vertical plate<a href=FreeConvection.ipynb#Vertical-plate> >> </a> \n",
+ " 4.3 Inclined plate<a href=FreeConvection.ipynb#Inclined-plate> >> </a> \n",
+ " 4.4 Infinite horizontal cylinder<a href=FreeConvection.ipynb#Infinite-horizontal-cylinder> >> </a> \n",
+ " 4.5 Example <a href=Exercice-8-1.ipynb> >> </a> \n",
+ " 4.6 Quiz \n",
+ "\n",
+ "5. Boiling \n",
+ " 5.1 Content goes here .. \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Convection_Intro.ipynb b/Convection_Intro.ipynb
new file mode 100644
index 0000000..cf3c99f
--- /dev/null
+++ b/Convection_Intro.ipynb
@@ -0,0 +1,263 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h1>Introduction to convection problems</h1>\n",
+ "\n",
+ "\n",
+ "<h2>What is a convection problem?</h2>\n",
+ "<!--(Explain temperature boundary layer)-> maybe later</br>-->\n",
+ "<div style=\"background-color:#f6f6f6;border:1px solid #707070;padding:0.5em 1em;box-sizing:border-box;\">\n",
+ "<p>In this chapter we will look at the phenomenon of convection. Heat transfer by convection takes place when a fluid moves over a surface in presence of a temperature gradient. Consider for example the heat transfer from a hot, horizontal plate with uniform surface temperature $T_s$ along which flows a colder fluid (temperature of the fluid $T$) with velocity $V$ on the upper side. The temperature gradient between the two materials will introduce a heat transfer by convection from the hot plate with surface $A_s$ towards the cold fluid. The heat transfer rate by convection $q$ takes the form: \n",
+ " $$Q = (T-T_s) \\int_{A_s} h A_s$$</p>\n",
+ "\n",
+ "Note the following points:</br>\n",
+ "<ul>\n",
+ " <li>Units: $Q$ is in [W], temperatures $T_s$ and $T$ are in [K], and the contact area $A_s$ in [m<sup>2</sup>]. Thus $h$ is in [W</sup>K<sup>-1</sup>m<sup>-2</sup>].</li>\n",
+ " <li>The convection coefficient $h$ is not constant over the contact area $A_s$. In fact $h$ depends on the flow conditions.</li>\n",
+ " <li>Heat transfer by convection accounts for both, the heat transfer by the bulk fluid motion, called <i>advection</i>, and the heat transfer rate due to <i>conduction</i>.</li>\n",
+ "</ul>\n",
+ "\n",
+ "<p>The convection problem consists in the determination of the convection coefficient $h$. Indeed, the convection coefficient depends on a number of factors as fluid properties, surface geometry of the solid and flow conditions. For this reason convection problems are fairly complex. Even if analytical solutions can be found by solving the boundary layer equations, this is only readily effected for simple flow situations. A more practical approach is to determine $h$ using empirical relations under the form of correlations, which will be explained the following chapters.</p>\n",
+ "<b>Assumptions:</b><br>\n",
+ "<p>The following assumptions are made for both forced and free convection problems:</p>\n",
+ "<ul>\n",
+ " <li>No phase change occurs in the fluid</li>\n",
+ " <li>The fluid properties within the boundary layer are assumed constant</li>\n",
+ " <li>The velocity and temperature gradients outside of the boundary layer are negligible</li>\n",
+ "</ul>\n",
+ "</div>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2>Types of convection problems</h2>\n",
+ "Compare forced and free convection problems (and conduction problems)<br>\n",
+ "\n",
+ "<table style=\"width:80%\">\n",
+ " <tr>\n",
+ " <th>Conduction</th>\n",
+ " <th>Convection</th>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align=\"left\">Conduction takes place in a solid or a confined stationary fluid. <br> Heat transfer occurs in presence of a temperature gradient<\\td>\n",
+ " <td align=\"left\">Convection takes place between a moving fluid and a solid <br> <b>Forced Convection </b> : The fluid flow with a velocity $V$ along a surface <br> <b>Free Convection </b> The fluid flow is induced by buoyancy forces inside the fluid itself due to temperature and density gradients. <\\td>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align=\"left\">The heat transfer happens through diffusion only<\\td>\n",
+ " <td align=\"left\"> As the fluid particles move, advection heat transfer must be taken into account using an open system energy balance <\\td> \n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align=\"left\">It involves a physical contact<\\td>\n",
+ " <td align=\"left\">It involves a physical contact<\\td>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align=\"left\">It does not involve mass transport<\\td>\n",
+ " <td align=\"left\">It involves mass transport<\\td>\n",
+ " <\\tr>\n",
+ " \n",
+ "</table> \n",
+ "\n",
+ " \n",
+ "<!-- Complete this part -->"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<hr>\n",
+ "<h2>Heat Balance for open systems</h2>\n",
+ "In the case of convection problems the energy exchange by advection must be taken into account. This can be done through an open system energy balance of a control volume.<br><br>\n",
+ "\n",
+ "<div style=\"background-color:#f6f6f6;border:1px solid #707070;padding:0.5em 1em;box-sizing:border-box;\">\n",
+ " <b>Variables:</b><br>\n",
+ " $\\rho$ Density<br>\n",
+ " $\\hat{u}$ Internal energy<br>\n",
+ " $\\nu$ Specific volume<br>\n",
+ " $h$ Enthalpy <br>\n",
+ " $\\dot{m}$ Mass flow<br>\n",
+ " $\\vec{u}$ Velocity<br>\n",
+ " $k$ Thermal conductivity<br>\n",
+ " $T$ Temperature<br>\n",
+ " $\\dot{q}$ Heat generation or absorbtion\n",
+ "</div>\n",
+ "<br> \n",
+ "<b>Assumptions:</b><br>\n",
+ "<ul>\n",
+ " <li>The material is isotropic</li>\n",
+ " <li>Changes in potential energy and kinetic energy are negligible in the control volume</li>\n",
+ " <li>Neglect the effect of pressure changes $dp$ on enthalpy, internal energy and density: $h = c_p dT$</li>\n",
+ " <li>The fluid is incompressible $\\nabla \\cdot u = 0$</li>\n",
+ " <li>All material properties are temperature independant</li>\n",
+ " <li>Viscous stress does not dissipate enough energy to heat the fluid</li>\n",
+ " \n",
+ "</ul>\n",
+ "The change in energy of the control volume can then be expressed as\n",
+ "$$\\frac{d\\hat{U}}{dt}=\\dot{\\hat{U}}=\\dot{m}(\\hat{u}+p \\nu)_{in} - \\dot{m} (\\hat{u}+p \\nu)_{out} + \\dot{Q} + \\dot{E}_{gen} $$\n",
+ "Note that in the advection terms the terms of kinetic and potential energy have been simplified according to the assumption.<br>\n",
+ "Rewrite this equation in integral form: <br>\n",
+ "$$\\int_{V} \\frac{\\partial \\rho \\hat{u}}{\\partial t} dV = - \\int_{S} (\\rho h \\vec{u}) \\cdot \\vec{n} dS - \\int_{S} - (k \\nabla T) \\cdot \\vec{n}dS \n",
+ " + \\int_{V} \\dot{q} dV$$\n",
+ "Applying Gauss' law we can rewrite expression as a volume integral that takes the form\n",
+ "$$\\int_{V} [\\frac{\\partial \\rho \\hat{u}}{\\partial t} + \\nabla \\cdot (\\rho h \\vec{u}) - \\nabla \\cdot (k\\nabla T) - \\dot{q}] dV= 0$$\n",
+ "Now we have that\n",
+ "$$d (\\rho \\hat{u}) = d (\\rho h) - dp \\approx d(\\rho h) \\approx \\rho dh$$\n",
+ "Thus $$\\frac{\\partial \\rho \\hat{u}}{\\partial t} \\approx \\rho \\frac{\\partial h}{\\partial t}$$\n",
+ "Now we also have that\n",
+ "$$\\nabla \\cdot (\\rho \\vec{u} h) = \\rho (\\vec{u} \\cdot \\nabla h + h \\nabla \\cdot \\vec{u}) = \\rho (\\vec{u} \\cdot \\nabla h)$$\n",
+ "Not that the fluid is assumed incompressible, so $\\rho$ is constant. As the control volume is arbitrary, the integrand can be set to zero. Replacing $h = c_p T$ we find the following equation for open systems:\n",
+ "$$\\rho c_p (\\frac{\\partial T}{\\partial t} + \\vec{u} \\nabla T) = k \\nabla^2 T + \\dot{q}$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<hr>\n",
+ "<h2>Boundary Layer Equations</h2>\n",
+ "In order to determine the flow conditions at a solid contact surface, we consider the boundary layer problem.<br>\n",
+ "We will consider a 2D case under the following assumptions:<br>\n",
+ "<ul>\n",
+ " <li>No heat sources ($\\dot{q}$=0)</li>\n",
+ " <li>Steady state</li>\n",
+ " <li>The velocity gradient normal to the solid surface is much bigger than the gradient in downstream direction<br>\n",
+ " $$\\frac{\\partial v}{\\partial y}>>\\frac{\\partial u}{\\partial x}$$<br>\n",
+ " $u$ denotes the velocity component in downstream direction along the surface, $v$ is the velocity component orthogonal to $u$</li>\n",
+ " <li>$v<<u$</li>\n",
+ " <li>incompressible flow</li>\n",
+ " <li>Neglect viscous dissipation</li>\n",
+ " <li>All the additional assumptions made for the energy equation</li>\n",
+ "</ul>\n",
+ "The set of boundary layer equations is then given by the following equations:<br>\n",
+ "<br>\n",
+ "<b>Conservation of mass:</b>\n",
+ "$$\\frac{\\partial u}{\\partial x} + \\frac{\\partial v}{\\partial y}= 0 $$\n",
+ "<b>Conservation of momentum:</b>\n",
+ "$$u \\frac{\\partial u}{\\partial x} + v \\frac{\\partial v}{\\partial y} = - \\frac{1}{\\rho}\\frac{dp}{dx}+\\nu\\frac{\\partial^2 u}{\\partial y^2}$$\n",
+ "<b>Conservation of energy:</b>\n",
+ "$$u \\frac{\\partial T}{\\partial x} + v \\frac{\\partial T}{\\partial y} = \\alpha \\frac{\\partial^2 T}{\\partial y^2}$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<hr>\n",
+ "<h2>Local and average convection coefficient</h2>\n",
+ "<p>The local convection coefficient $h$ applies only to an infinitely small contact area $dA_s$. As explained below, it depends on a number of factors. In order to simplify the expression for $q$, the total heat transfer rate may be expressed using an <i>average convection coefficient</i> $\\overline{h}$:\n",
+ "\\begin{equation}\n",
+ " \\overline{h}=\\frac{1}{A_s}\\int_{A_s}h dA_s\n",
+ "\\end{equation}\n",
+ "The heat transfer rate can then be expressed as:</p>\n",
+ "\\begin{equation}\n",
+ " Q = (T_s - T) \\overline{h} A_s\n",
+ "\\end{equation}\n",
+ "\n",
+ "In practice, there also exist correlations in order to directly determine the average convection coefficients $\\overline{h}$."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<hr>\n",
+ "<h2>Laminar and turbulent flow</h2>\n",
+ "<p>The flow conditions of the fluid have significant impact on both surface friction and heat transfer by convection. In fact, in the velocity boundary layer, there are often laminar and turbulent flows occuring at different regions.</p>\n",
+ "\n",
+ "<b>insert image</b>\n",
+ "\n",
+ "<p>Let's consider the case of parallel flow along a horizontal plate. The boundary layer begins to develop in a <i>laminar zone</i> at the leading edge of the plate. This means the flow is ordered and the streamlines, along which the particles flow, can be identified. As the velocity decreases in downstream direction, the fluid flows through a <i>transition zone</i>. In this zone the flow conditions become time-dependent and change between laminar and turbulent characteristics. Further downstream, the flow becomes fully turbulent. Conditions in the <i>turbulent zone</i> are highly irregular, such that velocity and pressure fluctuations occur. In this region vortices, known as <i>streaks</i>, can be observed.</p>\n",
+ "\n",
+ "<p>The onset of transition from laminar to turbulent flow depends on a adimensional number called <i>Reynolds number</i> defined as follows:</p>\n",
+ "\\begin{equation}\n",
+ " Re_x = \\frac{\\rho u_{\\infty} x}{\\mu}\n",
+ "\\end{equation}\n",
+ "$\\rho$ denotes the fluid density, $u_{\\infty}$ denotes the free stream velocity, $x$ is a characteristic length and $\\mu$ is the dynamic viscosity"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<hr>\n",
+ "<h2>Adimensional numbers</h2>\n",
+ "<!-- this part is under construction -->\n",
+ "\n",
+ "<table>\n",
+ " <tr>\n",
+ " <th>Name</th>\n",
+ " <th>Mathematical expression</th>\n",
+ " <th>Physical interpretation</th>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Reynolds</td>\n",
+ " <td>$Re_x =\\frac{\\rho u x}{\\mu}$</td>\n",
+ " <td>Ratio of inertial forces to viscous forces </td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Nusselt</td>\n",
+ " <td>$Nu_x =\\frac{h x}{k_f}$</td>\n",
+ " <td>Ratio of convective to conductive heat transfer</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Prandtl</td>\n",
+ " <td>$Pr = \\frac{\\nu}{\\alpha}=\\frac{c_p \\mu}{k}$</td>\n",
+ " <td>Ratio of momentum diffusitivy to thermal diffusivity</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Grashof</td>\n",
+ " <td>$Gr_x =\\frac{g \\beta (T_s - T_{\\infty}) x^3}{\\nu^2}$</td>\n",
+ " <td>Ratio of bouyancy forces to viscous forces</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Rayleigh</td>\n",
+ " <td>$Ra_x =Gr_x \\cdot Pr$</td>\n",
+ " <td>Associated with buoyancy driven-flow, and characterises the flow's regime</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Weber</td>\n",
+ " <td>$We_x =\\frac{\\rho_{\\nu}V^2 x}{\\sigma}$</td>\n",
+ " <td>Ratio between fluid inertia to surface tension</td>\n",
+ " </tr>\n",
+ " \n",
+ " \n",
+ "</table>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Review description of Rayleigh number"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Exercice-7-5.ipynb b/Exercice-7-5.ipynb
new file mode 100644
index 0000000..2582963
--- /dev/null
+++ b/Exercice-7-5.ipynb
@@ -0,0 +1,388 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Fuell cell vehicle\n",
+ "\n",
+ "Consider a fuel cell driven automobile that makes use of a metal hydride powder to stock hydrogen. This powder can be used to stock hydrogen by adsorbtion, which allows to avoid high pressure tanks for hydrogen storage. Before the hydrogen can be fed to a fuel cell, it must be desorbed, which can be achieved by heating the metal hydride. In order for the desorption to take place at atmospheric pressure, the metal hydride power needs to reach a temparture of $T_{min}=275.2$K<br><br>\n",
+ "\n",
+ "<div class=\"row\">\n",
+ " <div class=\"column\">\n",
+ " <img src=\"Images/Car.png\" alt=\"Car\" style=\"width:35%\">\n",
+ " <img src=\"Images/Car_Pipe.png\" alt=\"Pipe\" style=\"width:35%\">\n",
+ " </div>\n",
+ " </div>\n",
+ "At a steady cruise speed of $V$=25 m/s the automobile consumes $\\dot{m} = 1.35 \\cdot 10^{-4}$ kg/s hydrogen. The necessary heat generation to desorb hydrogen at a given rate can be obtained using the following formula:<br><br>\n",
+ "$$\\dot{E} = - \\dot{m} \\cdot 29.5 \\cdot 10^6 J/kg$$\n",
+ "<br>\n",
+ "with $\\dot{m}$ in kg/s.<br>\n",
+ "Assume that the metal hydride powder is contained in a cylindrical canister made of stainless steel, with length $L$ = 0.8m, inside diameter $D$=0.1m and a thickness of $t$=0.5mm. Assume the canister is arranged such that the external airflow flows vith velocity $V$=25m/s and at a temperature $T_{\\infty}$=23 °C in transverse direction across the canister. How much heat must be added to the canister, in order for the desorbtion to take place?\n",
+ "\n",
+ "***"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import ipywidgets as widgets\n",
+ "import matplotlib.pyplot as plt\n",
+ "from IPython.display import IFrame, display, clear_output\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from Python_Code.ExHydrogen import * "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 1: Problem Type\n",
+ "Determine the present type of convection for this problem. Is it a forced convection or a free convection problem?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1041755&forceview=1',756,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 2: Assumptions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1041757&forceview=1',756,600)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 3.1\n",
+ "For simplicity we often assume the air properties to be constant. We then extract the properties of air at a certain temperature. How is this temeperature calculated? \n",
+ "Choices are: \n",
+ "**A**: $$\\frac{T_{\\infty}+T_{s}}{2}$$ \n",
+ "**B**: $$T_{s}$$\n",
+ "**C**: $$T_{\\infty}$$\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1041758&forceview=1',756,300) "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 3.2 \n",
+ "We do not know exactly $T_{s}$. However, we assume the temperature gradient between the inner and outer surface of the canister wall to be small. \n",
+ "It is therefore resonable to assume that $T{s}=T_{min}$. Calculate, under this assumption the temperature at which you retrieve air properties from the tables."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1041760',756,320)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "\n",
+ "## Question 4 \n",
+ "Calculate the total heat generation $\\dot{E_g}$ necessary to supply enough hydrogen to the fuel cell in order to drive at $V$=25 m/s. \n",
+ "Hint: pay attention on the sign"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EvalEnergyGen()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Qustion 5.1: Flow conditions\n",
+ "What quantity do you consider in order to specify the flow conditions? \n",
+ "A: Prandtl number \n",
+ "B: Flow velocity \n",
+ "C: Fluid viscosity \n",
+ "D: Reynolds number "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042821',756,360)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Question 5.2: Flow conditions\n",
+ "Calculate the quantity that specifies flow conditions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EvalFlowConditions()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "\n",
+ "## Question 6.1\n",
+ "Choose the Nusselt correlation that you apply for this problem\n",
+ "\n",
+ "#### A:\n",
+ "$$\\overline{Nu_D}=0.3+\\frac{0.62 Re_D^{1/2}Pr^{1/3}}{\\left(1+(\\frac{0.4}{Pr})^{2/3}\\right)^{1/4}}\\left(1+\\frac{Re_D}{282000}^{5/8}\\right)^{4/5}, Re_D>0.2 \\textrm{ and } Pr>0.2$$\n",
+ "\n",
+ "#### B:\n",
+ "$$Nu_x = 0.453 Re_x^{1/2} Pr^{1/3}, \\mbox{ for } Pr \\geq 0.6$$\n",
+ "\n",
+ "#### C:\n",
+ "$$\\overline{Nu_L} = \\Bigg{(}0.825 + \\frac{0.387 Ra_L^{1/6}}{[1+ (0.492/Pr)^{9/16}]^{8/27}} \\Bigg{)}^2$$\n",
+ "\n",
+ "#### D:\n",
+ "$$\\overline{Nu_D}=C_1 Re_{D,max}^m Pr^{0.36} \\left(\\frac{Pr}{Pr_s}\\right)^{1/4}, \\mbox{ if } \n",
+ " \\begin{cases} \n",
+ " N_L \\geq 20 \\\\\n",
+ " 0.7 \\leq Pr \\leq 500 \\\\\n",
+ " 10 \\leq Re_{D,max} \\leq 2 \\cdot 10^6\n",
+ " \\end{cases}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042822&forceview=1',756,360)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Question 6.2\n",
+ "Calculate the Nusselt number. Make sure that you replied **correctly** to the previous question. You may use the following command to calculate the Nusselt number: \n",
+ "\n",
+ " Nusselt(Re, Pr) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Re = 1000\n",
+ "Pr = 1.2\n",
+ "print(Nusselt(Re,Pr))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EvalNusselt()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Question 6.3 \n",
+ "Calculate the convection coefficient"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EvalConvectionCoeff()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 7.1: Thermal Resistances\n",
+ "Calculate the thermal resistance $R_{wall}$ of the cylinder wall"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EvalRwall()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Question 7.2: Thermal Resistances\n",
+ "Calculate the thermal convection resistance $R_{conv}$ between the wall and the fluid"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EvalRconv()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Question 7.3\n",
+ "Calculate the outer temperature of the cylinder wall (hint: give your result with a precision of 0.1K)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EvalTout()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Remark \n",
+ "The graph displayed above (if you solved correctly Question 7.3) shows the temperature distribution along the radial axis. We can conclued that the thermal resistance of the Caniister Wall is very small compared to the convection resistance. Thus the assumption made in Question 3.2 is reasonable"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 8.1: Heat Flux\n",
+ "Given the temperatures $T_{min}$ at the inside of the wall and $T_{\\infty}$ of the fluid, calculate the heat flux through convection"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EvalHeatFlux()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Question 8.2: Heat Flux \n",
+ "What is the additional energy generation rate in order to maintain a temperature $T_{min}$ inside the canister? (give a positive value)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EvalAddHeatFlux()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Exercice-8-1.ipynb b/Exercice-8-1.ipynb
new file mode 100644
index 0000000..5196dc3
--- /dev/null
+++ b/Exercice-8-1.ipynb
@@ -0,0 +1,231 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:16pt\"><i><b> Vertical Plate Cooling </b> </i> </p>\n",
+ "<p style=\"color:#2471A3;font-size:11pt\"><i><b>A number of thin plates are to be cooled by vertically suspending them in a water bath at a temperature of $20^{\\circ{}}C$. If the plates are initially at $54^{\\circ{}}C$ and are $0.15m$ long, what minimum spacing would prevent interference between their free convection boundary layers? <\\i></p></b>\n",
+ "\n",
+ " <img src=\"Images/Free_Convection_Exercise_Plate.png\" style=\"width:40%\">"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import ipywidgets as widgets\n",
+ "import matplotlib.pyplot as plt\n",
+ "from IPython.display import IFrame, display, clear_output\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from Python_Code.ExFree import * "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042123',1200,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042124',1200,350)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042125',1200,250)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### At which temperature should the properties of the water be determined? (in ⁰C )"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EvalFilmTemp()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:11pt\"><i><b> The boundary layer thickness is given by\n",
+ "$$\\delta = \\eta x (\\frac{Gr_x}{4})^{-1/4}$$\n",
+ "$Gr_x$ and $\\eta$ have to be determined in order to compute the boundary layer thickness.<\\i><\\p><\\b>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 4.1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042126',1200,250)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 4.2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042127',1200,350)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 4.3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042128',1200,250)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EvalBoundaryThickness()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 5 "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042129',1200,300)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Exercice-Internal-1.ipynb b/Exercice-Internal-1.ipynb
new file mode 100644
index 0000000..c34124a
--- /dev/null
+++ b/Exercice-Internal-1.ipynb
@@ -0,0 +1,234 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:16pt\"><i><b> Pipe</b> </i> </p>\n",
+ "<p style=\"color:#2471A3;font-size:11pt\"><i> <b> Steam at $100^{\\circ{}}C$ and atmospheric pressure is condensing on the outer surface of a thin-walled circular pipe. The pipe has a diameter of $D=50mm$ and a length of $L=6m$. Water flows through the pipe at a rate of $\\dot{m}=0.25kg/s$. Its inlet and outlet temperatures are $T_{m,i}=15^{\\circ{}}C$ and $T_{m,o}=57^{\\circ{}}C$. Compute the average convection coefficient associated with the internal water flow.</i> </p></b>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import ipywidgets as widgets\n",
+ "import matplotlib.pyplot as plt\n",
+ "from IPython.display import IFrame, display, clear_output\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from Python_Code.ExFree import * "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042130',1200,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042131',1200,250)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042132',1200,400)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 4"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042133',1200,400)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:11pt\"><i> <b>The average heat transfer coefficient is given by \n",
+ "$$\\overline{h}=\\frac{Q}{A \\Delta T_{lm}}$$\n",
+ "Therefore, we shoud determine the total heat transfer $Q$, the area of the surface $A$ and the logarithmic mean temperature $\\Delta T_{lm}$ <\\i><\\p><\\b>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 5.1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042134',1200,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 5.2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042135',1200,200)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### What it the logarithmic mean temperature? "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 6.1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042137',1200,350)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 6.2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1042136',1200,300)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Exercise-10-4.ipynb b/Exercise-10-4.ipynb
new file mode 100644
index 0000000..c9bdd6f
--- /dev/null
+++ b/Exercise-10-4.ipynb
@@ -0,0 +1,86 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:16pt\"><i><b> Multichip Module Cooling</b> </i> </p>\n",
+ "<p style=\"color:#2471A3;font-size:11pt\"><i><b>One way to cool a multichip module is to submerge it in a saturated fluorocarbon liquid. <br>\n",
+ "Vapor is generated due to boiling and is then condensed on the outer surface of copper tubing which are suspended in the vapor above the liquid. The tube has a diameter of $D = 10$mm and is coiled in a horizontal plate. <br>\n",
+ "It is cooled by water that enters at 285K and leaves at 315K. \n",
+ "All the heat is dissipated by the chip through a 100mm by 100mm boiling surface at which the flux is $105W/m^2$\n",
+ "to the fluorocarbon liquid, which is at $T_{sat} = 57°C$ <\\i></p></b>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:10pt\"><b>Liquid properties: $k_l = 0.0537W/mK$, $c_{p,l} = 1100J/kgK$, $h_{fg} = 84400J/kg$, $\\rho_l = 1619.2kg/m^3$\n",
+ ",\n",
+ "$\\rho_v = 13.4kg/m^3$\n",
+ ", $\\sigma = 8.1 · 10^{−3}kg/s^2$\n",
+ ", $\\mu_l = 440 · 10^{−6}kg/ms$, $Pr_l = 9$</p></b>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:10pt\"><b>a) For the prescribed heat dissipation what is the required condensation rate and water flow-rate\n",
+ "in kg/s ?\n",
+ "</p></b>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:10pt\"><b>\n",
+ "b) Assuming fully developed flow throughout the tube, determine the tube surface temperature at\n",
+ "the coil inlet and outlet (Hint: after determining the convection coefficients, use an the energy\n",
+ "balance on a portion of the tube surface to find an expression for Ts. Use an iterative approach\n",
+ "to determine the surface temperature of the tube both at the inner and outer section).\n",
+ "</p></b>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:10pt\"><b>\n",
+ "c) Assuming a uniform tube surface temperature of Ts = 53°C, determine the required length of\n",
+ "the coil.\n",
+ "</p></b>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/ExerciseRefrigeratedTruck.ipynb b/ExerciseRefrigeratedTruck.ipynb
new file mode 100644
index 0000000..ef115c1
--- /dev/null
+++ b/ExerciseRefrigeratedTruck.ipynb
@@ -0,0 +1,454 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h1 style=\"color:#2471A3;font-size:16pt\"><b>Refrigerated Truck</b></h1>\n",
+ "The roof of a refrigerated truck compartment is of composite construction, consisting of a layer of\n",
+ "foamed urethane insulation ($t_2$ = 50mm, $k_f$ = 0.026W/mK) sandwiched between aluminum alloy\n",
+ "panels ($t_1$ = 5mm, $k_p$ = 180W/mK). \n",
+ "\n",
+ "The length and width of the roof are $L$ = 10m and $W$ = 3,5m, respectively and the temperature of the inner surface is $T_{s,i}$ = 10°C \n",
+ "***\n",
+ "### Moving Truck \n",
+ "Consider conditions for which the truck is moving at a speed of $V$ = 105km/h, the air temperature is $T_{\\infty}$ = 32°C and the solar\n",
+ "irradiation is $G_s$ = 750W/m<sup>2</sup>. \n",
+ "Turbulent flow may be assumed over the entire length of the roof. Assume $T_{s,o}>T_{inf}$ and $Ra_L$ > 107. \n",
+ "For equivalent values of the solar absorptivity and emissivity of the outer surface $\\alpha$ = $\\epsilon$ = 0.5,\n",
+ "estimate the average temperature $T_{s,o}$ of the outer surface. \n",
+ "What is the corresponding heat load imposed on the refrigeration system?\n",
+ "\n",
+ "\n",
+ "\n",
+ "• If \u000b",
+ "S = \u000fS = 0:5, the roof is not insulated (t2 = 0), what are the corresponding values of the\n",
+ "surface temperature and the heat load?\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "from IPython.display import IFrame, display, clear_output, Latex\n",
+ "import ipywidgets as widgets\n",
+ "from ipywidgets import HBox\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from Python_Code.ExRefrigeratedTruck import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def EvaluateNumericalSolution(inputstring, solution, tolerance):\n",
+ " notaNumber = \"Result is not a number\"\n",
+ " correct = \"Your answer is correct!\"\n",
+ " wrong = \"Wrong. Please try again.\"\n",
+ " clear_output();\n",
+ " try:\n",
+ " result = float(inputstring)\n",
+ " except ValueError:\n",
+ " print(notaNumber)\n",
+ " return\n",
+ " if np.abs(result-solution)<=tolerance:\n",
+ " print(correct)\n",
+ " else:\n",
+ " print(wrong)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "### Question 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " <iframe\n",
+ " width=\"800\"\n",
+ " height=\"300\"\n",
+ " src=\"https://moodle.epfl.ch/mod/hvp/embed.php?id=1044236\"\n",
+ " frameborder=\"0\"\n",
+ " allowfullscreen\n",
+ " ></iframe>\n",
+ " "
+ ],
+ "text/plain": [
+ "<IPython.lib.display.IFrame at 0x19ba1a99da0>"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1044236', 800, 300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "### Question 2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "CHANGE THIS TO IMAGES\n"
+ ]
+ }
+ ],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1044237&forceview=1',800,300)\n",
+ "print(\"CHANGE THIS TO IMAGES\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 3\n",
+ "Which one of the following equation is correct for the heat balance? Assume all variables positive. Think of the direction in which the heat transfer takes place\n",
+ "\n",
+ "**Answer A:** $$ q_{abs}'' + q_{conv}'' = q_{cond}'' + q_{emit}'' $$\n",
+ "**Answer B:** $$ q_{abs}'' - q_{emit}'' = q_{conv}'' + q_{cond}'' $$\n",
+ "**Answer C:** $$ q_{abs}'' + q_{conv}'' - q_{emit}'' = q_{cond}''$$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " <iframe\n",
+ " width=\"1000\"\n",
+ " height=\"300\"\n",
+ " src=\"https://moodle.epfl.ch/mod/hvp/embed.php?id=1044241&forceview=1\"\n",
+ " frameborder=\"0\"\n",
+ " allowfullscreen\n",
+ " ></iframe>\n",
+ " "
+ ],
+ "text/plain": [
+ "<IPython.lib.display.IFrame at 0x1d0d974f898>"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "IFrame('https://moodle.epfl.ch/mod/hvp/embed.php?id=1044241&forceview=1',1000,300)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 4\n",
+ "Calculate the thermal resistance of the wall (in $mK^2/W$)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "ebd3dc88b9794960bcf3dcbbe32b76d1",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Text(value='', placeholder='Type your answer')"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "69fbfda1ed9346e9bf717131032bbc92",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "HBox(children=(Button(description='Check answer', style=ButtonStyle()), Button(description='Hint', style=Butto…"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "86d00c17f53947d8b0907b01100a9652",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Output()"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "R_wall()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 5: Convection\n",
+ "Compute the convection coefficient for the heat flux occurring on the top of the truck."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "7c1915a6a6944801bfd7717c2ff3e1c6",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Text(value='', placeholder='Type your answer')"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "3a0615221d8845e7833e0a344b3ee7c8",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "HBox(children=(Button(description='Check answer', style=ButtonStyle()), Button(description='Hint', style=Butto…"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "10356b20376a441f8a9bd086bcc122ba",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Output()"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "R_conv()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 6.1:\n",
+ "Compute the absorbed heat flux"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Question 6.2: \n",
+ "Compute the emitted heat flux"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 7.1\n",
+ "A special finish ($\\alpha$ = 0.15, $\\epsilon$ = 0:8) may be applied to the outer surface. \n",
+ "How does this affect the surface temperature and the heat load?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Question 7.2\n",
+ "Calculate the new outer temperature\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Question 8.1\n",
+ "Now consider the condition for which the track is parked ($V$ = 0). All other conditions remain unchanged. \n",
+ "Consider the case without the special finish ($\\alpha$ = $\\epsilon$ = 0.5). All other conditions remain unchanged. \n",
+ "What type of convection appears in this case?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Question 8.2\n",
+ "Compute the outer surface temperature $T_{o,s}$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Question 8.3\n",
+ "Compute the total heat flux for this case"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***\n",
+ "## Conclusion:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/FlatPlateLaminar.ipynb b/FlatPlateLaminar.ipynb
new file mode 100644
index 0000000..3f2344e
--- /dev/null
+++ b/FlatPlateLaminar.ipynb
@@ -0,0 +1,46 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "<b>Continuity equation:</b>\n",
+ "\\begin{equation}\n",
+ " \\frac{\\partial u}{\\partial x} + \\frac{\\partial u}{\\partial x} = 0\n",
+ "\\end{equation}\n",
+ "\n",
+ "<b>Momentum equation:</b>\n",
+ "\\begin{equation}\n",
+ " u \\frac{\\partial u}{\\partial x} + v \\frac{\\partial u}{\\partial y}= \\nu \\frac{\\partial ^2 u}{\\partial y^2}\n",
+ "\\end{equation}\n",
+ "<b>Energy equation:</b>\n",
+ "\\begin{equation}\n",
+ " u \\frac{\\partial T}{\\partial x}+ v \\frac{\\partial T}{\\partial y}= \\alpha \\frac{\\partial ^2 T}{\\partial y ^2}\n",
+ "\\end{equation}"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/ForcedConvection.ipynb b/ForcedConvection.ipynb
new file mode 100644
index 0000000..8f124f1
--- /dev/null
+++ b/ForcedConvection.ipynb
@@ -0,0 +1,1067 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h1>External forced convection</h1>\n",
+ "\n",
+ "<div style=\"background-color:#f6f6f6;border:1px solid #707070;padding:0.5em 1em;box-sizing:border-box;\">\n",
+ "<p>Forced Convection takes place when a fluid maintained at velocity $V$ and temperature $T_{\\infty}$ (temperature far from the surface) flows over a surface at a different temperature $T_s$. The temperature gradient between the two materials leads to heat transfer by convection. Note that <i>forced</i> convection means that the fluid is maintained at velocity $V$ by external means, such as a pump or a fan.<br>\n",
+ "This chapter treats some examples of forced external flow problems. The goal of these problems is to determine convection coefficients for each of the different flow geometries.</p>\n",
+ "<b>Assumptions:</b>\n",
+ "<ul>\n",
+ " <li>The free flow of the fluid is maintained by external means such as a pump or a fan. The incoming\n",
+ " flow is assumed uniform.</li>\n",
+ " <li>The surfaces are immersed in a free flow without any other obstacles. The boundary layers\n",
+ " develop freely without any other constraints.</li>\n",
+ "</ul>\n",
+ "\n",
+ "<b>Film temperature:</b><br>\n",
+ "<p>The fluid properties depend on the temperature, which is not uniform for all the particles in the boundary layer. In order to keep account for this dependancy, we define the <i>film temperature</i> as follows:</p>\n",
+ "$$T_f = \\frac{T_s + T_{\\infty}}{2}$$\n",
+ " \n",
+ "<b>Methodology to solve convection problems:</b><br>\n",
+ "<ol>\n",
+ " <li>Given the temperatures $T_s$ and $T_{\\infty}$, interpolate all relevant material properties at the corresponding temperature (often approximated with $T_f$)</li>\n",
+ " <li>Calculate the Reynolds number $Re_x$ in order to identify the flow conditions (<i> is the flow laminar or turbulent? <\\i>):<br>\n",
+ " $$Re_x = \\frac{\\rho V x}{\\mu}$$\n",
+ " $x$ is the <i>characteristic length</i> of the object subject to the flow. This may sometimes be the distance from the leading edge of the object and in other cases, f.e. for the <i>cylinder in cross flow</i>, we use the <i>hydraulic diameter</i> $D$.</li>\n",
+ " <li>Calculate the Nusselt number $Nu_x$ using the corresponding Nusselt correlation (don't forget to check the conditions on $Pr$, $Re$ etc.) </li>\n",
+ " <li>Calculate the convection coefficient $h$ or $\\overline{h}$ using\n",
+ " $$h_x = \\frac{Nu_x \\cdot k_f}{x}$$ or $$\\overline{h_x} = \\frac{\\overline{Nu_x}\\cdot k_f}{x}$$\n",
+ " Note that $k_f$ denotes the thermal conductivity of the surrounding fluid.</li>\n",
+ " <li>Given the temperatures $T_s$ and $T_{\\infty}$, calculate the total heat transfer\n",
+ " $$Q = \\pm A_s \\cdot \\overline{h} \\cdot (T_s -T_{\\infty})$$ where $A_s$ denotes the contact area.\n",
+ " </li>\n",
+ "</ol>\n",
+ "</div> "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from Python_Code.PlotsFEC import PlotNusselt, PlotConvCoeff,PlotTemperature\n",
+ "from Python_Code.FEC_BoundaryLayer import BoundaryLayer\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<hr>\n",
+ "<h2>Isothermal flat plate</h2>\n",
+ "Assume an isothermal plate at temperature $T_s$ lies horizontally and is subject to a parrallel flow on it's upper side. The fluid at temperature $T_{\\infty}$ reaches the leading edge of the plate with uniform velocity $V$ as indicated on the image.<br>\n",
+ "<img src=\"Images/External_Plate.png\" width=600 >\n",
+ "\n",
+ "<h3>Flow conditions</h3>\n",
+ "The heat transfer rate for the isothermal plate problem depends strongly on the flow conditions, in particular whether the flow is laminar or turbulent. The Reynolds number $Re_x$ indicates the flow conditions. <br>\n",
+ "The flow is <b>laminar</b> for\n",
+ "$$Re_x \\leq Re_{x,c} = 5 \\cdot 10^5$$\n",
+ "The flow is considered <b>turbulent</b> for\n",
+ "$$Re_x \\geq Re_{x,c}$$\n",
+ "Note that $Re_x$ is linear in the characteristic length $x$. This means the flow conditions might change along the plate and a transition from laminar to turbulent conditions might take place.\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3>Laminar flow over an isothermal plate</h3>\n",
+ "The problem of laminar flow over an isothermal plate is one of the few convection problems that can be solved analytically.\n",
+ "For more information look at the <i>derivation of the results for laminar flow over an isotermal plate</i>. The results obtained by this derivation are listed below.<br>\n",
+ "<br>\n",
+ "<!-- add hyperlink to this section -->\n",
+ "\n",
+ "<b>Boundary layer thickness:</b><br>\n",
+ "Recall that the boundary layer thickness is defined as the distance y from the plate where $\\frac{u}{u_{\\infty}}=0.99$. This thickness is given by the relation\n",
+ "$$\\delta = \\frac{5x}{\\sqrt{Re_x}}$$\n",
+ "\n",
+ "<b>Friction coefficient:</b><br>\n",
+ "The friction coefficient relates the shear force exerted by a fluid an a surface to the kinetic energy of that fluid. It is defined as:\n",
+ "$$C_{f,x} = \\frac{\\tau_{s,x}}{\\rho u_{\\infty}/2}$$\n",
+ "The friction coefficient at a distance $x$ from the leading edge is given by\n",
+ "$$C_{f,x} = \\frac{0.664}{\\sqrt{Re_x}}$$\n",
+ "The average friction coefficient for the area from the leading edge to a distance $x$ from the leading edge is obtained by\n",
+ "$$\\overline{C_{f,x}} = \\frac{1.328}{\\sqrt{Re_x}}$$\n",
+ "\n",
+ "<b>Nusselt number:</b>\n",
+ "\n",
+ "Use the following correlation to calculate the Nusselt number:\n",
+ "$$Nu_x = \\frac{h_x x}{k_f} = 0.332 Re_x^{1/2} Pr^{1/3}$$\n",
+ "The average Nusselt number takes the form\n",
+ "$$\\overline{Nu_x} = 0.664 Re_x^{1/2} Pr^{1/3}$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3>Turbulent flow over an isothermal plate</h3>\n",
+ "The flow is considered turbulent when $Re_{x}\\geq Re_{x,c}$. It is not possible to find an exact analytical solution for the turbulent boundary layer problem. However, correlations can be obtained when exploring experimental data.<br>\n",
+ "<br>\n",
+ "\n",
+ "The <b>boundary layer thickness</b> at distance $x$ from the leading edge is given by<br>\n",
+ "$$\\delta = x \\cdot 0.37 Re_x^{-1/5}$$\n",
+ "<br>\n",
+ "The <b>local friction coefficient</b> can be obtained using\n",
+ "$$C_{f,x} = 0.0592 Re_x^{-1/5}, \\mbox{ for } Re_{x,c} \\leq Re_x \\leq 10^8$$\n",
+ "<br>\n",
+ "Determine the <b>local Nusselt number</b> using the correlation\n",
+ "$$Nu_x = 0.0296 Re_x^{4/5} Pr^{1/3}, \\mbox{ for } 0.6 \\leq Pr \\leq 60$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<hr>\n",
+ "<h2>Plate with constant heat flux</h2>\n",
+ "<p>A different problem is the plate with a constant heat flux over its surface. In this case it is assumed that the constant heat flux $q''$ [W/m<sup>2</sup>] and the temperature of the surrounding fluid $T_\\infty$ are known (<i>This situation applies for example for a thin plate that is uniformly heated by electrical heaters</i>). The convection coefficient can be used to calculate the temperature profile of the plate:\n",
+ " $$T_s(x)=T_{\\infty} + \\frac{q_s''}{h_x}$$\n",
+ "The convection coefficient $h_x$ can be calculated using the correlations for the local Nusselt numbers.<br>\n",
+ " For <b>laminar flow</b> conditions use:\n",
+ " $$Nu_x = 0.453 Re_x^{1/2} Pr^{1/3}, \\mbox{ for } Pr \\geq 0.6$$\n",
+ " For <b>turbulent flow</b> conditions use:\n",
+ " $$Nu_x = 0.0308 Re_x^{4/5} Pr^{1/3} \\mbox{ for } 0.6 \\leq Pr \\leq 60$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:12pt\"><i><b> Example: Boundary Layer Thickness</b> </i> </p>\n",
+ "Assume the following flow conditions of water along a flat plate: $\\rho$=1000kg/m^3, $\\mu$=1.7e-3, $V$ = 2m/s, $L$ = 1m. We then calculate the boundary layer thickness.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 576x360 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "BoundaryLayer()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Note that there is a discontinuity in this result. This is due to the fact that the boundary layer is not well defined in the transition zone from laminar to turbulent flow."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:12pt\"><i><b> Example: Plate with constant heat flux</b> </i> </p>\n",
+ "Consider a horizontal plate that is heated uniformly by electrical heater elements and dissipates a $q'' = 1000 [W/m^2]$. There is water at a temperature of $T_{\\inf}=300 K$ flowing over the plate. Adjust the flow velocity $V$ and consider the change for $Nu_x$,$h_x$ and $T(x)$.<br>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Example on the temperature distribution in downstream direction along a plate with constant heat flux\n",
+ "# as a function of Re an Pr\n",
+ "\n",
+ "# TODO: hide the code (when finished)\n",
+ "def Plot_ConstHeatFlux(V):\n",
+ " # GIVEN BY THE PROBLEM STATEMENT\n",
+ " xmin = 0.01 # choose xmin > 0 for the calculation\n",
+ " xmax = 3\n",
+ " n = 100 # n is the resolution\n",
+ " x = np.linspace(xmin,xmax,n)\n",
+ " Tinf = 300\n",
+ " q = 1000\n",
+ " \n",
+ " # MATERIAL PROPERTIES OF WATER AT 300K\n",
+ " rho = 1/1.003e-3\n",
+ " mu = 855e-6\n",
+ " Pr = 5.83\n",
+ " k = 0.613\n",
+ " \n",
+ " # CALCULATION\n",
+ " Re = rho*V*x/mu\n",
+ " Nu = np.zeros(len(x))\n",
+ " h = np.zeros(len(x))\n",
+ " T = np.zeros(len(x))\n",
+ " for i in range(x.shape[0]):\n",
+ " if Re[i] < 5e10: # turbulent flow\n",
+ " Nu[i] = (0.453*np.sqrt(Re[i])*(Pr**(1/3)))\n",
+ " else:\n",
+ " Nu[i] = (0.0308*(Re[i]**0.8)*(Pr**(1/3)))\n",
+ " h[i] = Nu[i]*k/x[i]\n",
+ " T[i] = Tinf + q/h[i]\n",
+ " \n",
+ " # PLOT THE RESULTS\n",
+ " plt.subplots(1,3,figsize=(15,6))\n",
+ " plt.subplot(131)\n",
+ " plt.plot(x,Nu)\n",
+ " plt.axis([xmin, xmax, 0, 5000])\n",
+ " plt.xlabel(\"Downstream distance [m]\")\n",
+ " plt.ylabel(\"Local Nusselt number\")\n",
+ " plt.title(\"Local Nusselt Number\")\n",
+ " \n",
+ " plt.subplot(132)\n",
+ " plt.plot(x,h)\n",
+ " plt.xlabel(\"Downstream distance [m]\")\n",
+ " plt.ylabel(\"Convection coefficient\")\n",
+ " plt.axis([xmin, xmax, 0, 10000])\n",
+ " plt.title(\"Convection coefficient\")\n",
+ " \n",
+ " plt.subplot(133)\n",
+ " plt.plot(x,T)\n",
+ " plt.xlabel(\"Downstream distance [m]\")\n",
+ " plt.ylabel(\"Temperature [K]\")\n",
+ " plt.title(\"Temperature\")\n",
+ " plt.axis([xmin, xmax, 300, 305])\n",
+ " plt.tight_layout()\n",
+ " plt.show()\n",
+ " \n",
+ "#Plot_ConstHeatFlux(10)\n",
+ "widgets.interact(Plot_ConstHeatFlux, V=widgets.FloatSlider(min=1, max=10, step=0.1, value = 5));"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " <div class=\"bk-root\">\n",
+ " <a href=\"https://bokeh.org\" target=\"_blank\" class=\"bk-logo bk-logo-small bk-logo-notebook\"></a>\n",
+ " <span id=\"1001\">Loading BokehJS ...</span>\n",
+ " </div>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ "(function(root) {\n",
+ " function now() {\n",
+ " return new Date();\n",
+ " }\n",
+ "\n",
+ " var force = true;\n",
+ "\n",
+ " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n",
+ " root._bokeh_onload_callbacks = [];\n",
+ " root._bokeh_is_loading = undefined;\n",
+ " }\n",
+ "\n",
+ " var JS_MIME_TYPE = 'application/javascript';\n",
+ " var HTML_MIME_TYPE = 'text/html';\n",
+ " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n",
+ " var CLASS_NAME = 'output_bokeh rendered_html';\n",
+ "\n",
+ " /**\n",
+ " * Render data to the DOM node\n",
+ " */\n",
+ " function render(props, node) {\n",
+ " var script = document.createElement(\"script\");\n",
+ " node.appendChild(script);\n",
+ " }\n",
+ "\n",
+ " /**\n",
+ " * Handle when an output is cleared or removed\n",
+ " */\n",
+ " function handleClearOutput(event, handle) {\n",
+ " var cell = handle.cell;\n",
+ "\n",
+ " var id = cell.output_area._bokeh_element_id;\n",
+ " var server_id = cell.output_area._bokeh_server_id;\n",
+ " // Clean up Bokeh references\n",
+ " if (id != null && id in Bokeh.index) {\n",
+ " Bokeh.index[id].model.document.clear();\n",
+ " delete Bokeh.index[id];\n",
+ " }\n",
+ "\n",
+ " if (server_id !== undefined) {\n",
+ " // Clean up Bokeh references\n",
+ " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n",
+ " cell.notebook.kernel.execute(cmd, {\n",
+ " iopub: {\n",
+ " output: function(msg) {\n",
+ " var id = msg.content.text.trim();\n",
+ " if (id in Bokeh.index) {\n",
+ " Bokeh.index[id].model.document.clear();\n",
+ " delete Bokeh.index[id];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " // Destroy server and session\n",
+ " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n",
+ " cell.notebook.kernel.execute(cmd);\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " /**\n",
+ " * Handle when a new output is added\n",
+ " */\n",
+ " function handleAddOutput(event, handle) {\n",
+ " var output_area = handle.output_area;\n",
+ " var output = handle.output;\n",
+ "\n",
+ " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n",
+ " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n",
+ " return\n",
+ " }\n",
+ "\n",
+ " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
+ "\n",
+ " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n",
+ " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n",
+ " // store reference to embed id on output_area\n",
+ " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
+ " }\n",
+ " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
+ " var bk_div = document.createElement(\"div\");\n",
+ " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
+ " var script_attrs = bk_div.children[0].attributes;\n",
+ " for (var i = 0; i < script_attrs.length; i++) {\n",
+ " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
+ " }\n",
+ " // store reference to server id on output_area\n",
+ " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " function register_renderer(events, OutputArea) {\n",
+ "\n",
+ " function append_mime(data, metadata, element) {\n",
+ " // create a DOM node to render to\n",
+ " var toinsert = this.create_output_subarea(\n",
+ " metadata,\n",
+ " CLASS_NAME,\n",
+ " EXEC_MIME_TYPE\n",
+ " );\n",
+ " this.keyboard_manager.register_events(toinsert);\n",
+ " // Render to node\n",
+ " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
+ " render(props, toinsert[toinsert.length - 1]);\n",
+ " element.append(toinsert);\n",
+ " return toinsert\n",
+ " }\n",
+ "\n",
+ " /* Handle when an output is cleared or removed */\n",
+ " events.on('clear_output.CodeCell', handleClearOutput);\n",
+ " events.on('delete.Cell', handleClearOutput);\n",
+ "\n",
+ " /* Handle when a new output is added */\n",
+ " events.on('output_added.OutputArea', handleAddOutput);\n",
+ "\n",
+ " /**\n",
+ " * Register the mime type and append_mime function with output_area\n",
+ " */\n",
+ " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
+ " /* Is output safe? */\n",
+ " safe: true,\n",
+ " /* Index of renderer in `output_area.display_order` */\n",
+ " index: 0\n",
+ " });\n",
+ " }\n",
+ "\n",
+ " // register the mime type if in Jupyter Notebook environment and previously unregistered\n",
+ " if (root.Jupyter !== undefined) {\n",
+ " var events = require('base/js/events');\n",
+ " var OutputArea = require('notebook/js/outputarea').OutputArea;\n",
+ "\n",
+ " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
+ " register_renderer(events, OutputArea);\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " \n",
+ " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
+ " root._bokeh_timeout = Date.now() + 5000;\n",
+ " root._bokeh_failed_load = false;\n",
+ " }\n",
+ "\n",
+ " var NB_LOAD_WARNING = {'data': {'text/html':\n",
+ " \"<div style='background-color: #fdd'>\\n\"+\n",
+ " \"<p>\\n\"+\n",
+ " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
+ " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
+ " \"</p>\\n\"+\n",
+ " \"<ul>\\n\"+\n",
+ " \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
+ " \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
+ " \"</ul>\\n\"+\n",
+ " \"<code>\\n\"+\n",
+ " \"from bokeh.resources import INLINE\\n\"+\n",
+ " \"output_notebook(resources=INLINE)\\n\"+\n",
+ " \"</code>\\n\"+\n",
+ " \"</div>\"}};\n",
+ "\n",
+ " function display_loaded() {\n",
+ " var el = document.getElementById(\"1001\");\n",
+ " if (el != null) {\n",
+ " el.textContent = \"BokehJS is loading...\";\n",
+ " }\n",
+ " if (root.Bokeh !== undefined) {\n",
+ " if (el != null) {\n",
+ " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n",
+ " }\n",
+ " } else if (Date.now() < root._bokeh_timeout) {\n",
+ " setTimeout(display_loaded, 100)\n",
+ " }\n",
+ " }\n",
+ "\n",
+ "\n",
+ " function run_callbacks() {\n",
+ " try {\n",
+ " root._bokeh_onload_callbacks.forEach(function(callback) {\n",
+ " if (callback != null)\n",
+ " callback();\n",
+ " });\n",
+ " } finally {\n",
+ " delete root._bokeh_onload_callbacks\n",
+ " }\n",
+ " console.debug(\"Bokeh: all callbacks have finished\");\n",
+ " }\n",
+ "\n",
+ " function load_libs(css_urls, js_urls, callback) {\n",
+ " if (css_urls == null) css_urls = [];\n",
+ " if (js_urls == null) js_urls = [];\n",
+ "\n",
+ " root._bokeh_onload_callbacks.push(callback);\n",
+ " if (root._bokeh_is_loading > 0) {\n",
+ " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
+ " return null;\n",
+ " }\n",
+ " if (js_urls == null || js_urls.length === 0) {\n",
+ " run_callbacks();\n",
+ " return null;\n",
+ " }\n",
+ " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
+ " root._bokeh_is_loading = css_urls.length + js_urls.length;\n",
+ "\n",
+ " function on_load() {\n",
+ " root._bokeh_is_loading--;\n",
+ " if (root._bokeh_is_loading === 0) {\n",
+ " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
+ " run_callbacks()\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " function on_error() {\n",
+ " console.error(\"failed to load \" + url);\n",
+ " }\n",
+ "\n",
+ " for (var i = 0; i < css_urls.length; i++) {\n",
+ " var url = css_urls[i];\n",
+ " const element = document.createElement(\"link\");\n",
+ " element.onload = on_load;\n",
+ " element.onerror = on_error;\n",
+ " element.rel = \"stylesheet\";\n",
+ " element.type = \"text/css\";\n",
+ " element.href = url;\n",
+ " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
+ " document.body.appendChild(element);\n",
+ " }\n",
+ "\n",
+ " for (var i = 0; i < js_urls.length; i++) {\n",
+ " var url = js_urls[i];\n",
+ " var element = document.createElement('script');\n",
+ " element.onload = on_load;\n",
+ " element.onerror = on_error;\n",
+ " element.async = false;\n",
+ " element.src = url;\n",
+ " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
+ " document.head.appendChild(element);\n",
+ " }\n",
+ " };var element = document.getElementById(\"1001\");\n",
+ " if (element == null) {\n",
+ " console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n",
+ " return false;\n",
+ " }\n",
+ "\n",
+ " function inject_raw_css(css) {\n",
+ " const element = document.createElement(\"style\");\n",
+ " element.appendChild(document.createTextNode(css));\n",
+ " document.body.appendChild(element);\n",
+ " }\n",
+ "\n",
+ " \n",
+ " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.4.0.min.js\"];\n",
+ " var css_urls = [];\n",
+ " \n",
+ "\n",
+ " var inline_js = [\n",
+ " function(Bokeh) {\n",
+ " Bokeh.set_log_level(\"info\");\n",
+ " },\n",
+ " function(Bokeh) {\n",
+ " \n",
+ " \n",
+ " }\n",
+ " ];\n",
+ "\n",
+ " function run_inline_js() {\n",
+ " \n",
+ " if (root.Bokeh !== undefined || force === true) {\n",
+ " \n",
+ " for (var i = 0; i < inline_js.length; i++) {\n",
+ " inline_js[i].call(root, root.Bokeh);\n",
+ " }\n",
+ " if (force === true) {\n",
+ " display_loaded();\n",
+ " }} else if (Date.now() < root._bokeh_timeout) {\n",
+ " setTimeout(run_inline_js, 100);\n",
+ " } else if (!root._bokeh_failed_load) {\n",
+ " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
+ " root._bokeh_failed_load = true;\n",
+ " } else if (force !== true) {\n",
+ " var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n",
+ " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
+ " }\n",
+ "\n",
+ " }\n",
+ "\n",
+ " if (root._bokeh_is_loading === 0) {\n",
+ " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
+ " run_inline_js();\n",
+ " } else {\n",
+ " load_libs(css_urls, js_urls, function() {\n",
+ " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
+ " run_inline_js();\n",
+ " });\n",
+ " }\n",
+ "}(window));"
+ ],
+ "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"<div style='background-color: #fdd'>\\n\"+\n \"<p>\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"</p>\\n\"+\n \"<ul>\\n\"+\n \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n \"<li>use INLINE resources instead, as so:</li>\\n\"+\n \"</ul>\\n\"+\n \"<code>\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"</code>\\n\"+\n \"</div>\"}};\n\n function display_loaded() {\n var el = document.getElementById(\"1001\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };var element = document.getElementById(\"1001\");\n if (element == null) {\n console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n return false;\n }\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n \n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.4.0.min.js\"];\n var css_urls = [];\n \n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n function(Bokeh) {\n \n \n }\n ];\n\n function run_inline_js() {\n \n if (root.Bokeh !== undefined || force === true) {\n \n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));"
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ " <div class=\"bk-root\" id=\"dc0954e4-9462-423a-9bdd-425b453e0acb\" data-root-id=\"1002\"></div>\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "(function(root) {\n",
+ " function embed_document(root) {\n",
+ " \n",
+ " var docs_json = {\"eed8ea28-c62d-4ed3-ab22-fa92560d3a4d\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1013\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"1017\",\"type\":\"Grid\"},{\"id\":\"1022\",\"type\":\"Grid\"}],\"left\":[{\"id\":\"1018\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"renderers\":[{\"id\":\"1039\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1003\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1029\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1005\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1009\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1007\",\"type\":\"Range1d\"},\"y_scale\":{\"id\":\"1011\",\"type\":\"LinearScale\"}},\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1014\",\"type\":\"BasicTicker\"},{\"attributes\":{\"callback\":null},\"id\":\"1005\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1028\",\"type\":\"HelpTool\"},{\"attributes\":{\"source\":{\"id\":\"1036\",\"type\":\"ColumnDataSource\"}},\"id\":\"1040\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1045\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"AAAAAAAAAAAIH3zwwQefPwgffPDBB68/RhdddNFFtz8IH3zwwQe/P2WTTTbZZMM/RhdddNFFxz8nm2yyySbLPwgffPDBB88/dNFFF1100T9lk0022WTTP1ZVVVVVVdU/RhdddNFF1z822WSTTTbZPyebbLLJJts/GF100UUX3T8IH3zwwQffP3zwwQcffOA/dNFFF1104T9tsskmm2ziP2WTTTbZZOM/XXTRRRdd5D9WVVVVVVXlP0422WSTTeY/RhdddNFF5z8++OCDDz7oPzbZZJNNNuk/L7rooosu6j8nm2yyySbrPx988MEHH+w/GF100UUX7T8QPvjggw/uPwgffPDBB+8/AAAAAAAA8D988MEHH3zwP/jggw8++PA/dNFFF1108T/xwQcffPDxP22yySabbPI/6aKLLrro8j9lk0022WTzP+GDDz744PM/XXTRRRdd9D/ZZJNNNtn0P1ZVVVVVVfU/0kUXXXTR9T9ONtlkk032P8omm2yyyfY/RhdddNFF9z/CBx988MH3Pz744IMPPvg/uuiiiy66+D822WSTTTb5P7PJJptssvk/L7rooosu+j+rqqqqqqr6PyebbLLJJvs/o4suuuii+z8ffPDBBx/8P5tssskmm/w/GF100UUX/T+UTTbZZJP9PxA++OCDD/4/jC666KKL/j8IH3zwwQf/P4QPPvjgg/8/AAAAAAAAAEA++OCDDz4AQHzwwQcffABAuuiiiy66AED44IMPPvgAQDbZZJNNNgFAdNFFF110AUCzySabbLIBQPHBBx988AFAL7rooosuAkBtsskmm2wCQKuqqqqqqgJA6aKLLrroAkAnm2yyySYDQGWTTTbZZANAo4suuuiiA0Dhgw8++OADQB988MEHHwRAXXTRRRddBECbbLLJJpsEQNlkk0022QRAF1100UUXBUBWVVVVVVUFQJRNNtlkkwVA0kUXXXTRBUAQPvjggw8GQE422WSTTQZAjC666KKLBkDKJptssskGQAgffPDBBwdARhdddNFFB0CEDz744IMHQMIHH3zwwQdAAAAAAAAACEA=\",\"dtype\":\"float64\",\"shape\":[100]},\"y\":[0.0,35336.13230837348,70672.26461674696,106008.39692512044,141344.52923349393,176680.66154186742,212016.79385024088,247352.92615861437,282689.05846698786,318025.1907753613,353361.32308373484,388697.4553921083,424033.58770048176,459369.7200088552,494705.85231722874,530041.9846256023,565378.1169339757,600714.2492423492,636050.3815507226,671386.5138590962,706722.6461674697,742058.7784758431,777394.9107842166,812731.0430925902,848067.1754009635,883403.3077093371,918739.4400177104,954075.5723260841,989411.7046344575,1024747.8369428309,1060083.9692512045,1095420.101559578,1130756.2338679514,1166092.366176325,1201428.4984846984,1236764.6307930718,1272100.7631014453,1307436.8954098192,1342773.0277181924,1378109.160026566,1413445.2923349394,1448781.4246433128,1484117.5569516863,1519453.6892600597,1554789.8215684332,1590125.953876807,1625462.0861851803,1660798.2184935538,1696134.350801927,1731470.4831103007,1766806.6154186742,1802142.7477270474,1837478.8800354209,1872815.0123437948,1908151.1446521683,1943487.2769605415,1978823.409268915,2014159.5415772886,2049495.6738856619,2084831.8061940353,2120167.938502409,2155504.0708107827,2190840.203119156,2226176.335427529,2261512.467735903,2296848.6000442766,2332184.73235265,2367520.864661023,2402856.9969693967,2438193.1292777704,2473529.2615861436,2508865.393894517,2544201.5262028906,2579537.6585112642,2614873.7908196384,2650209.9231280116,2685546.055436385,2720882.1877447586,2756218.320053132,2791554.452361505,2826890.5846698787,2862226.716978252,2897562.8492866256,2932898.9815949993,2968235.1139033725,3003571.246211746,3038907.3785201195,3074243.5108284927,3109579.6431368664,3144915.77544524,3180251.907753614,3215588.0400619875,3250924.1723703607,3286260.304678734,3321596.4369871076,3356932.569295481,3392268.701603854,3427604.833912228,3462940.9662206015,3498277.0985289747]},\"selected\":{\"id\":\"1047\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1048\",\"type\":\"UnionRenderers\"}},\"id\":\"1036\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"dimension\":1,\"ticker\":{\"id\":\"1019\",\"type\":\"BasicTicker\"}},\"id\":\"1022\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1011\",\"type\":\"LinearScale\"},{\"attributes\":{\"ticker\":{\"id\":\"1014\",\"type\":\"BasicTicker\"}},\"id\":\"1017\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1009\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1027\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1026\",\"type\":\"SaveTool\"},{\"attributes\":{\"callback\":null,\"end\":60000,\"start\":0.01},\"id\":\"1007\",\"type\":\"Range1d\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1037\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1023\",\"type\":\"PanTool\"},{\"id\":\"1024\",\"type\":\"WheelZoomTool\"},{\"id\":\"1025\",\"type\":\"BoxZoomTool\"},{\"id\":\"1026\",\"type\":\"SaveTool\"},{\"id\":\"1027\",\"type\":\"ResetTool\"},{\"id\":\"1028\",\"type\":\"HelpTool\"}]},\"id\":\"1029\",\"type\":\"Toolbar\"},{\"attributes\":{\"data_source\":{\"id\":\"1036\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1037\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1038\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1040\",\"type\":\"CDSView\"}},\"id\":\"1039\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"axis_label\":\"downstream distance x [m]\",\"formatter\":{\"id\":\"1045\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1014\",\"type\":\"BasicTicker\"}},\"id\":\"1013\",\"type\":\"LinearAxis\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1038\",\"type\":\"Line\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1046\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1019\",\"type\":\"BasicTicker\"},{\"attributes\":{\"overlay\":{\"id\":\"1046\",\"type\":\"BoxAnnotation\"}},\"id\":\"1025\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1023\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1047\",\"type\":\"Selection\"},{\"attributes\":{\"axis_label\":\"Nu_x\",\"formatter\":{\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1019\",\"type\":\"BasicTicker\"}},\"id\":\"1018\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"text\":\"Reynolds number\"},\"id\":\"1003\",\"type\":\"Title\"}],\"root_ids\":[\"1002\"]},\"title\":\"Bokeh Application\",\"version\":\"1.4.0\"}};\n",
+ " var render_items = [{\"docid\":\"eed8ea28-c62d-4ed3-ab22-fa92560d3a4d\",\"notebook_comms_target\":\"1049\",\"roots\":{\"1002\":\"dc0954e4-9462-423a-9bdd-425b453e0acb\"}}];\n",
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
+ "\n",
+ " }\n",
+ " if (root.Bokeh !== undefined) {\n",
+ " embed_document(root);\n",
+ " } else {\n",
+ " var attempts = 0;\n",
+ " var timer = setInterval(function(root) {\n",
+ " if (root.Bokeh !== undefined) {\n",
+ " clearInterval(timer);\n",
+ " embed_document(root);\n",
+ " } else {\n",
+ " attempts++;\n",
+ " if (attempts > 100) {\n",
+ " clearInterval(timer);\n",
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
+ " }\n",
+ " }\n",
+ " }, 10, root)\n",
+ " }\n",
+ "})(window);"
+ ],
+ "application/vnd.bokehjs_exec.v0+json": ""
+ },
+ "metadata": {
+ "application/vnd.bokehjs_exec.v0+json": {
+ "id": "1002"
+ }
+ },
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "3bbc707e122947999781dc0e5bdf2fb7",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "interactive(children=(FloatSlider(value=5.0, description='V', max=10.0), Output()), _dom_classes=('widget-inte…"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "PlotNusselt()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The nusselt number increases when $V$ increases."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "How does this affect the convection coefficient?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ " <div class=\"bk-root\" id=\"8675501c-5ec5-47dc-b3bb-7d1097bca3ff\" data-root-id=\"1191\"></div>\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "(function(root) {\n",
+ " function embed_document(root) {\n",
+ " \n",
+ " var docs_json = {\"a8d7d706-9f48-49c1-b7e9-9395e18a80ff\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1202\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"1206\",\"type\":\"Grid\"},{\"id\":\"1211\",\"type\":\"Grid\"}],\"left\":[{\"id\":\"1207\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"renderers\":[{\"id\":\"1228\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1192\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1218\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1194\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1198\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1196\",\"type\":\"Range1d\"},\"y_scale\":{\"id\":\"1200\",\"type\":\"LinearScale\"}},\"id\":\"1191\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1198\",\"type\":\"LinearScale\"},{\"attributes\":{\"dimension\":1,\"ticker\":{\"id\":\"1208\",\"type\":\"BasicTicker\"}},\"id\":\"1211\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1213\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"text\":\"Convection Coefficient\"},\"id\":\"1192\",\"type\":\"Title\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1243\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1226\",\"type\":\"Line\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"AAAAAAAAAAAIH3zwwQefPwgffPDBB68/RhdddNFFtz8IH3zwwQe/P2WTTTbZZMM/RhdddNFFxz8nm2yyySbLPwgffPDBB88/dNFFF1100T9lk0022WTTP1ZVVVVVVdU/RhdddNFF1z822WSTTTbZPyebbLLJJts/GF100UUX3T8IH3zwwQffP3zwwQcffOA/dNFFF1104T9tsskmm2ziP2WTTTbZZOM/XXTRRRdd5D9WVVVVVVXlP0422WSTTeY/RhdddNFF5z8++OCDDz7oPzbZZJNNNuk/L7rooosu6j8nm2yyySbrPx988MEHH+w/GF100UUX7T8QPvjggw/uPwgffPDBB+8/AAAAAAAA8D988MEHH3zwP/jggw8++PA/dNFFF1108T/xwQcffPDxP22yySabbPI/6aKLLrro8j9lk0022WTzP+GDDz744PM/XXTRRRdd9D/ZZJNNNtn0P1ZVVVVVVfU/0kUXXXTR9T9ONtlkk032P8omm2yyyfY/RhdddNFF9z/CBx988MH3Pz744IMPPvg/uuiiiy66+D822WSTTTb5P7PJJptssvk/L7rooosu+j+rqqqqqqr6PyebbLLJJvs/o4suuuii+z8ffPDBBx/8P5tssskmm/w/GF100UUX/T+UTTbZZJP9PxA++OCDD/4/jC666KKL/j8IH3zwwQf/P4QPPvjgg/8/AAAAAAAAAEA++OCDDz4AQHzwwQcffABAuuiiiy66AED44IMPPvgAQDbZZJNNNgFAdNFFF110AUCzySabbLIBQPHBBx988AFAL7rooosuAkBtsskmm2wCQKuqqqqqqgJA6aKLLrroAkAnm2yyySYDQGWTTTbZZANAo4suuuiiA0Dhgw8++OADQB988MEHHwRAXXTRRRddBECbbLLJJpsEQNlkk0022QRAF1100UUXBUBWVVVVVVUFQJRNNtlkkwVA0kUXXXTRBUAQPvjggw8GQE422WSTTQZAjC666KKLBkDKJptssskGQAgffPDBBwdARhdddNFFB0CEDz744IMHQMIHH3zwwQdAAAAAAAAACEA=\",\"dtype\":\"float64\",\"shape\":[100]},\"y\":[\"Infinity\",17680.689439356687,15391.934150895799,14193.024253546804,13399.45694527919,12814.604145446727,12355.745258800722,11980.628120552725,11664.90479157496,11393.330455392996,11155.760857235495,10945.123310932828,10756.300994992383,10585.479255285252,10429.742558988559,10286.81534505503,10154.88943710124,10032.505617376337,9918.470245761258,9811.795222345028,9711.653898263212,9617.34812836103,9528.28326367811,9443.948903176255,9363.903890173282,9287.764482699678,9215.194928448014,9145.899883412574,9079.61825976105,9016.118192899521,8955.192893160869,8896.657202776427,8840.344719678347,8786.105380276525,8733.803416478499,8683.315619861745,8634.52985948331,8587.343810344015,8541.663857758684,8497.404149368207,8454.48577167004,8412.836032046018,8372.387830559619,8333.079108453883,8294.852362440011,8257.65421562858,8221.435037399906,8186.148605700922,8151.751806241117,8118.204363879218,8085.468602175942,8053.5092276609685,8022.2931358440055,7991.789236406469,7961.968295354773,7932.802792208801,7904.266790548757,7876.335820456818,7848.986771573111,7822.197795642767,7795.9482175666435,7770.218454085544,7744.989939329539,7720.245056552366,7695.9670754479,7672.140094512867,7648.748987978835,7625.77935688804,7603.217483932972,7581.050291719526,7559.265304148676,7537.850610642814,7516.7948329703995,7496.087094446993,7475.716991312466,7455.674566103542,7435.950282857966,7416.535004002091,7397.419968787316,7378.596773153252,7360.057350906422,7341.793956113322,7323.79914661559,7306.065768582993,7288.586942027291,7271.356047206613,7254.366711855692,7237.612799182989,7221.088396580339,7204.787804995258,7188.705528920075,7172.836266955684,7157.174902910979,7141.716497402155,7126.456279918719,7111.389641325651,7096.512126773403,7081.819428989596,7067.307381928107,7052.971954753142]},\"selected\":{\"id\":\"1244\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1245\",\"type\":\"UnionRenderers\"}},\"id\":\"1225\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1244\",\"type\":\"Selection\"},{\"attributes\":{\"callback\":null,\"end\":35000},\"id\":\"1196\",\"type\":\"Range1d\"},{\"attributes\":{},\"id\":\"1212\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1208\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1216\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1245\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1240\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1212\",\"type\":\"PanTool\"},{\"id\":\"1213\",\"type\":\"WheelZoomTool\"},{\"id\":\"1214\",\"type\":\"BoxZoomTool\"},{\"id\":\"1215\",\"type\":\"SaveTool\"},{\"id\":\"1216\",\"type\":\"ResetTool\"},{\"id\":\"1217\",\"type\":\"HelpTool\"}]},\"id\":\"1218\",\"type\":\"Toolbar\"},{\"attributes\":{\"ticker\":{\"id\":\"1203\",\"type\":\"BasicTicker\"}},\"id\":\"1206\",\"type\":\"Grid\"},{\"attributes\":{\"callback\":null},\"id\":\"1194\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1203\",\"type\":\"BasicTicker\"},{\"attributes\":{\"data_source\":{\"id\":\"1225\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1226\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1227\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1229\",\"type\":\"CDSView\"}},\"id\":\"1228\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"overlay\":{\"id\":\"1243\",\"type\":\"BoxAnnotation\"}},\"id\":\"1214\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"source\":{\"id\":\"1225\",\"type\":\"ColumnDataSource\"}},\"id\":\"1229\",\"type\":\"CDSView\"},{\"attributes\":{\"axis_label\":\"Convection coefficient h\",\"formatter\":{\"id\":\"1240\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1208\",\"type\":\"BasicTicker\"}},\"id\":\"1207\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1242\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1217\",\"type\":\"HelpTool\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1227\",\"type\":\"Line\"},{\"attributes\":{\"axis_label\":\"Downstream Distance x\",\"formatter\":{\"id\":\"1242\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1203\",\"type\":\"BasicTicker\"}},\"id\":\"1202\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1215\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1200\",\"type\":\"LinearScale\"}],\"root_ids\":[\"1191\"]},\"title\":\"Bokeh Application\",\"version\":\"1.4.0\"}};\n",
+ " var render_items = [{\"docid\":\"a8d7d706-9f48-49c1-b7e9-9395e18a80ff\",\"notebook_comms_target\":\"1246\",\"roots\":{\"1191\":\"8675501c-5ec5-47dc-b3bb-7d1097bca3ff\"}}];\n",
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
+ "\n",
+ " }\n",
+ " if (root.Bokeh !== undefined) {\n",
+ " embed_document(root);\n",
+ " } else {\n",
+ " var attempts = 0;\n",
+ " var timer = setInterval(function(root) {\n",
+ " if (root.Bokeh !== undefined) {\n",
+ " clearInterval(timer);\n",
+ " embed_document(root);\n",
+ " } else {\n",
+ " attempts++;\n",
+ " if (attempts > 100) {\n",
+ " clearInterval(timer);\n",
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
+ " }\n",
+ " }\n",
+ " }, 10, root)\n",
+ " }\n",
+ "})(window);"
+ ],
+ "application/vnd.bokehjs_exec.v0+json": ""
+ },
+ "metadata": {
+ "application/vnd.bokehjs_exec.v0+json": {
+ "id": "1191"
+ }
+ },
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "9013c84e3bbc4067aef5b68c533f0d31",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "interactive(children=(FloatSlider(value=5.0, description='V', max=10.0), Output()), _dom_classes=('widget-inte…"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "PlotConvCoeff()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The evolution of the convection coefficient is interesting. At the beginning, the convection coefficient is high and then decreases and seems to stabilize in downstream direction."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "PlotTemperature()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<p style=\"color:#2471A3;font-size:12pt\"><i><b> Example: </b> </i> </p>\n",
+ "<p><i>Consider a horizontal metallic plate over which flows water at velocity $V$. The plate is heated by several small heater elements distributed uniformly below the plate. What is the type of boundary condition for this case?</i></p>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# TODO: hide the code and delet the output\n",
+ "\n",
+ "def BC(x):\n",
+ " if x == 'Constant Heat Flux':\n",
+ " answer = \"Your answer is correct\"\n",
+ " elif x == 'Constant Temperature':\n",
+ " answer = \"False. We can consider a constant heat flux in this case.\"\n",
+ " else:\n",
+ " answer = \" \"\n",
+ " print(answer) \n",
+ "\n",
+ "\n",
+ "widgets.interact(BC, x = widgets.Dropdown(\n",
+ " options=['','Constant Temperature', 'Constant Heat Flux'],\n",
+ " #value=['Sth'],\n",
+ " rows = 3,\n",
+ " description='BC:',\n",
+ " disabled=False\n",
+ "));"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<b>Here a set of possible questions in relation with the above theory</b><br>\n",
+ "<ul>\n",
+ " <li><i>Consider a laminar flow over a horizontal plate. Where is the shear stress higher, at the leading edge or in downstream direction of the\n",
+ " plate?</i><br>\n",
+ " Answer: C~1/sqrt(Re), thus C decreases as x increases (Re ~ x). This meas the shear decreases in downstream direction</li>\n",
+ " <li><i>How does the boundary layer thickness behave as the flow velocity increases?</i><br>\n",
+ " Answer: $\\delta$ is proportional to $Re^{-1/5}$, and Re ~ V, thus the boundary layer will be slightly thinner</li>\n",
+ "</ul>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<hr>\n",
+ "<h2>Cylinder in cross-flow</h2>\n",
+ "A frequent convection problem is the cylinder in cross-flow. The cylinder is subject to a flow in transverse direction and exchanges heat with the fluid of the flow. The heat exchange by convection depends on the flow conditions and especially of the development of the boundary layer.\n",
+ "<img src=\"Images/External_Cylinder.png\" width=600 >"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3>Flow description</h3>\n",
+ "<p>In the case of a cross-flow around a cylinder, there will be two stagnation points. The first one is called <i>forward stagnation point</i> and the second <i>separation point</i>. At the forward stagnation point we observe a rise in pressure located at $x=0$. Following the boundary layer in x-direction, the pressure starts decreasing and the free stream velocity $u_{\\infty}$ increases. Then, after meeting a minimum pressure, the pressure starts increasing again and $u_{\\infty}$ starts decreasing, until the free stream velocity becomes zero at the separation point. At this point, the boundary layer does not contain enough linear momentum to overcome the pressure exerted by the flow back upstream in the wake region.</p>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<div style=\"background-color:#f6f6f6;border:1px solid #707070;padding:0.5em 1em;box-sizing:border-box;\">\n",
+ "$u_{\\infty}$ Free stream velocity (velocity at the edge of the boundary layer)</br>\n",
+ "$V$ Upstream velocity</br>\n",
+ "$D$ Diameter of the cylinder</br>\n",
+ "$p$ Pressure</br>\n",
+ "<!--$\\theta$ angle</br>\n",
+ "$x$ distance along the edge of the cylinder -->\n",
+ "$F_D$ Drag force and drag coefficient<br>\n",
+ "$C_D$ Drag coefficient <br>\n",
+ "$A_f$ Frontal area (projected surface orthogonal to upstream velocity)<br>\n",
+ "$\\tau_{s}$ Shear stress at the surface\n",
+ "</div>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3>Drag force</h3>\n",
+ "<p>The drag force $F_D$ decomposes in two components. The first one is the drag due to shear stress on the boundary layer surface of the cylinder. This drag force is called <i>friction drag</i>. The second drag force is due to the pressure differential in flow direction. The pressure at the forward stagnation point is bigger than the pressure in the region of wake formation in downstream direction of the cylinder. This drag force is called <i>pressure drag</i> or <i>form drag</i>.</p>\n",
+ "\n",
+ "<p>A dimensionless drag coefficient can be defined as: \n",
+ "\\begin{equation}\n",
+ " C_D = \\frac{F_D}{A_f(\\frac{\\rho V^2}{2})}\n",
+ "\\end{equation}\n",
+ "$A_f$ denotes the frontal area of the cylinder, meaning the projection of the cylinder on a plane that is orthogonal to the upstream velocity.</p>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3>Convection heat transfer</h3>\n",
+ "The Reynolds number for a crossflow around a cylinder is defined using the diameter $D$ as characteristic length:\n",
+ "$$Re_D = \\frac{\\rho V D}{\\mu}$$\n",
+ "There are several convection correlations found for different values of $Re$ and $Pr$. The <i>Churchill-Bernstein</i> correllation, used to calculate the average Nusselt number $\\overline{Nu_D}$ applies to a wide range of values for the Reynolds and Prandtl number. It can be calculated as follows:<br><br>\n",
+ "$$\\overline{Nu_D}=0.3+\\frac{0.62 Re_D^{1/2}Pr^{1/3}}{\\left(1+(\\frac{0.4}{Pr})^{2/3}\\right)^{1/4}}\\left(1+\\frac{Re_D}{282000}^{5/8}\\right)^{4/5}, Re_D>0.2 \\textrm{ and } Pr>0.2$$\n",
+ "<br>\n",
+ "The material properties for this correlation are evaluated at $T_f$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Add a graph that plots the different drag forces as a function of velocity (the Drag coefficient changes)\n",
+ "# Complete the theory by this part if this is done"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\"\"\"CHANGE THIS\"\"\"\n",
+ "from Python_Code import ForcExtConv\n",
+ "%matplotlib inline\n",
+ "ForcExtConv.cyl_crossflow()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<hr>\n",
+ "<h2>Flow across a bank of tubes</h2>\n",
+ "\n",
+ "<div style=\"background-color:#f6f6f6;border:1px solid #707070;padding:0.5em 1em;box-sizing:border-box;\">\n",
+ "<table>\n",
+ " <tr><tb>$V$</tb> <tb>incident velocity</tb></tr><br>\n",
+ " <tr><tb>$D$</tb> <tb>tube diameter</tb></tr><br>\n",
+ " <tr><tb>$S_T$</tb> <tb>transverse pitch</tb></tr><br>\n",
+ " <tr><tb>$S_L$</tb> <tb>longitudinal pitch</tb></tr><br>\n",
+ " <tr><tb>$N_L$</tb> <tb>number of rows of tubes</tb></tr><br>\n",
+ " <tr><tb>$T_i, T_o$</tb> <tb>inflow and outflow temperature of the fluid</tb></tr><br>\n",
+ " <tr><tb>$Pr$</tb> <tb>Prandtl number of the external fluid</tb></tr><br>\n",
+ " <tr><tb>$Pr_s$</tb> <tb>Prandtl number of the external fluid at the surface temperature</tb></tr><br>\n",
+ "</table>\n",
+ "\n",
+ "<div>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<img src=\"Images/External_Bank.png\" width=800 >\n",
+ "\n",
+ "There are numerous heat transfer applications that can be approximated considering crossflow over a bank of tubes. In this setup, one external fluid flows across a bank of tubes and another internal fluid at a different temperature flows inside the tubes.<br>\n",
+ "The arrangement of the tubes is essential for the external flow and thus affects highly the heat transfer between the two fluids. The tube rows may either be <i>aligned</i> with each other, or <i>staggered</i> in the flow direction. The <i>longitudinal pitch</i> $S_L$ and the <i>transverse pitch</i> $S_T$ denote the distance between the center of two tube rows in downstream direction or in transverse direction respectively.</br>\n",
+ "Flow conditions depend highly on the boundary layer development and wake interactions, which influence the heat transfer. If the incident flow at the first row of tubes is uniform, this is not the case for the following tube rows in downstream direction, where the flow conditions depend on the tube alignment.<br>\n",
+ "As the flow conditions are highly local for this case, it is meaningful to search for an average convection coefficient. The following correlation was proposed by Zukaskaus:<br>\n",
+ "\n",
+ "$$\\overline{Nu_D}=C_1 Re_{D,max}^m Pr^{0.36} \\left(\\frac{Pr}{Pr_s}\\right)^{1/4}, \\mbox{ if } \n",
+ " \\begin{cases} \n",
+ " N_L \\geq 20 \\\\\n",
+ " 0.7 \\leq Pr \\leq 500 \\\\\n",
+ " 10 \\leq Re_{D,max} \\leq 2 \\cdot 10^6\n",
+ " \\end{cases}\n",
+ "$$\n",
+ "<br>\n",
+ "where $N_L$ denotes the number of tube rows and all the fluid properties except for $Pr_s$ are evaluated at the arithmetic mean temperature between the inlet and the outlet:\n",
+ "$$T = \\frac{T_i + T_o}{2}$$\n",
+ "The Reynolds number is obtained using\n",
+ "$$Re_{D,max} = \\frac{\\rho V_{max} D}{\\mu} \\mbox{ using } \n",
+ " V_{max} = \\begin{cases}\n",
+ " \\frac{S_T}{S_T-S_D}V, \\mbox{if aligned} \\\\\n",
+ " \\frac{S_T}{2(S_D - D)}V, \\mbox{if staggered}\n",
+ " \\end{cases}\n",
+ "$$\n",
+ "The coefficients $m$ and $C_1$ can be retrieved from the following table:<br>\n",
+ "<table>\n",
+ " <tr>\n",
+ " <th>Configuration</th>\n",
+ " <th>$Re_D$</th>\n",
+ " <th>$C_1$</th>\n",
+ " <th>$m$</th>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Aligned</td> <td>10-10<sup>2</sup></td> <td>0.8</td> <td>0.4</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Staggered</td> <td>10-10<sup>2</sup></td> <td>0.9</td> <td>0.4</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Aligned </td> <td>10<sup>2</sup>-10<sup>3</sup></td> <td>Approximate as a single (isolated) cylinder</td> <td> </td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Staggered </td> <td>10<sup>2</sup>-10<sup>3</sup></td> <td>Approximate as a single (isolated)cylinder</td> <td> </td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Aligned ($S_T / S_L > 0.7$) </td> <td>10<sup>3</sup>-2 $\\cdot$ 10<sup>5</sup></td> <td>0.27</td> <td>0.63</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Staggered ($S_T / S_L < 2$) </td> <td>10<sup>3</sup>-2 $\\cdot$ 10<sup>5</sup></td> <td>0.35 ($\\frac{S_T}{S_L}$)<sup>1/5</sup></td> <td>0.6</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Staggered ($S_T / S_L > 2$) </td> <td>10<sup>3</sup>-2 $\\cdot$ 10<sup>5</sup></td> <td>0.4</td> <td>0.6</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Aligned </td> <td>2 $\\cdot$ 10<sup>5</sup>-2 $\\cdot$ 10<sup>6</sup></td> <td>0.021</td> <td>0.84</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Staggered </td> <td>2 $\\cdot$ 10<sup>5</sup>-2 $\\cdot$ 10<sup>6</sup></td> <td>0.022</td> <td>0.84</td>\n",
+ " </tr>\n",
+ "</table>\n",
+ "\n",
+ "For bank of tubes with 20 or less rows of tubes, the average convection coefficient is reduced. The entry region, where convection is less strong weakens the average convection rate in this case. In the case for $N_L\\leq 20$ use the same correllations as before adjusted by a correction factor $C_2$.\n",
+ "<br>\n",
+ "$$ \\overline{Nu}_{(N_L\\leq 20)} = C_2 \\cdot \\overline{Nu}_{(N_L\\gt 20)}$$\n",
+ "Retrieve $C_2$ from the table below (assuming $Re_{D,max}\\geq 10^3$):\n",
+ "\n",
+ "<table>\n",
+ " <tr>\n",
+ " <th>$N_L$</th><th> 1</th><th> 2</th><th> 3</th><th> 4</th><th> 5</th><th> 7</th><th> 10</th><th> 13</th><th> 16</th>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Aligned</td><td> 0.70</td><td> 0.80</td><td> 0.86</td><td> 0.90</td><td> 0.92</td><td> 0.95</td><td> 0.97</td><td> 0.98 </td><td>0.99</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td>Staggered</td><td> 0.64</td><td> 0.76</td><td> 0.84</td><td> 0.89</td><td> 0.92</td><td> 0.95</td><td> 0.97</td><td> 0.98</td><td> 0.99</td>\n",
+ " </tr>\n",
+ "</table> "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<b>Question list:</b>\n",
+ "<ul>\n",
+ " <li>What effect does an increase of $S_L$ have on the convection coefficient?<br>\n",
+ " The convection coefficient increases under mixing ant turbulent flow conditions. When $S_L$ is increased, the effect of \n",
+ " the boundary layers on the next row of tubes gets smaller and the convection coefficient decreases. A design criteria \n",
+ " for bank of tube it is desirable to have $\\frac{S_T}{S_L}>0.7$</li>\n",
+ " <li>Given a bank of tubes under crossflow, where does the highest convection coefficient appear? (assume small $S_L$)<br>\n",
+ " Under the hypothesis that $S_L$ is small, the boundary layer separation and wake interactions do influence the rows of\n",
+ " tubes further downstream. As the flow downstream gets more turbulent, the convection coefficient increases. However,\n",
+ " this increase only takes place until a certain number of rows after which flow conditions do not change more. Typically,\n",
+ " the convection coefficient does not increase any more after the 5th row.</li>\n",
+ " <li>Consider a bank of tubes where the tubes are in a staggered arrangement. How does this impact the convection coefficient\n",
+ " compared to an aligned arrangement?<br>\n",
+ " A staggered alignement of the tubes enhances the mixing of the fluid in cross-flow, which in turn enhances the\n",
+ " convection coefficient on its own. The heat transfer rate is thus increased in this case. Note this is true especially for small Reynolds numbers ($Re_D \\leq 100 $), meaning for laminar flow conditions.\n",
+ "</ul>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "\"\"\"CHANGE THIS\"\"\"\n",
+ "\n",
+ "from Python_Code import ForcExtConv\n",
+ "%matplotlib inline\n",
+ "ForcExtConv.bankoftubes()\n",
+ "# Add an example with N_L<20 --> the correlation changes (don't forget to add theory if this exercice is included)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/FreeConvection.ipynb b/FreeConvection.ipynb
new file mode 100644
index 0000000..4dcb9ab
--- /dev/null
+++ b/FreeConvection.ipynb
@@ -0,0 +1,353 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h1>Free Convection : External </h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2>Introduction</h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<div style=\"background-color:#f6f6f6;border:1px solid #707070;padding:0.5em 1em;box-sizing:border-box;\">\n",
+ "<p>Free convection, or natural convection occurs without any forced velocity. However, in this case, convection is due to a body force on a fluid presenting density gradients. The density gradients are generally caused by temperature gradients within the fluid. The body force, which is due to the gravitational field, along with the density gradients result in a buoyancy force, that creates free convection currents.<\\p>\n",
+ "<p>The fluid properties depend on the temperature, which is not uniform for all the particles in the boundary layer. In order to keep account for this dependancy, we define the <i>film temperature</i> as follows:\n",
+ "$$T_f = \\frac{T_s + T_{\\infty}}{2}$$ <\\p>\n",
+ " \n",
+ "<h3> Adimensional numbers </h3>\n",
+ "Here is presented a list of the adimensional numbers used in this section <\\br>\n",
+ "<ul> <\\br>\n",
+ " <li> Reynolds number $Re_x = \\frac{\\rho u x}{\\mu}$\n",
+ " <li> Nusselt number $Nu_x = \\frac{hx}{k_f}$ </li>\n",
+ " <li> Prandtl number $Pr = \\frac{\\nu}{\\alpha}$ </li>\n",
+ " <li> Grashof number $Gr_x = \\frac{g \\beta (T_s - T_{\\infty})x^3}{\\nu^2}$ </li>\n",
+ " <li> Rayleigh number $Ra_x = Gr_x Pr = \\frac{g \\beta (T_s - T_\\infty)x^3}{\\nu \\alpha}$ </li>\n",
+ "<\\ul>\n",
+ "<br>\n",
+ "\n",
+ "<p><b><i> N.B </i></b> <br>\n",
+ "$\\beta$ is the volumetric thermal expansion coefficient. It can be estimated from the thermodynamic properties tables.\n",
+ "For an ideal gas $\\beta \\approx \\frac{1}{T_f}$ <\\p>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2>Vertical plate</h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "A common case of free convection is the vertical plate. In fact, if the surface temperature of the plate is higher than the ambient temperature of the fluid. The fluid near the plate is hotter, therefore lighter. Hence, the hot fluid rises due to density and temperature gradients, causing a natural convection. </br>\n",
+ "Inversely, if the surface temperature of the plate is lower than the ambient temperature of the fluid, the fluid near the plate is colder and therefore heavier. Hence, the cold fluid falls down. \n",
+ "</br> \n",
+ "\n",
+ "In order to determine the thickness and the velocity of the fluid in the boundary layer, <i> the boundary layer similarity equations </i> have to be solved. In the following section, the solutions of these equations are going to be presented. These solutions are valid in the case of a laminar flow, they are a bad approximation for turbulent flows. </br>\n",
+ "</br>\n",
+ "<b><i> Example </i></b> </br>\n",
+ "Here is an example of the development of a boundary layer on a vertical plate due to a difference of temperature between the surface of the plate and the ambient air at atmospheric pressure.</br>\n",
+ "Note the relatively small scale of the thickness of the boundary layer. </br>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from helper import FreeConvection\n",
+ "FreeConvection.plotVerticalPLate()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import ipywidgets as widgets\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "\n",
+ "%matplotlib inline\n",
+ "\n",
+ "def Type(x):\n",
+ " if x == 'Hotter':\n",
+ " answer = \"Correct! The air is near the plate is moving upward. It is lighter than the surrounding air, and therefore warmer. \"\n",
+ " elif x=='' :\n",
+ " answer = \" \"\n",
+ " else:\n",
+ " answer = \"False. The air is near the plate is moving upward. It is lighter than the surrounding air, and therefore warmer. \"\n",
+ " print(answer) \n",
+ "\n",
+ "widgets.interact(Type, x = widgets.Dropdown(\n",
+ " options=['','Hotter', 'Cooler'],\n",
+ " #value=['Sth'],\n",
+ " rows = 3,\n",
+ " description='',\n",
+ " disabled=False\n",
+ "))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Using the following graphs, with the appropriate Prandtl number $Pr$ value, it is possible to determine the desired parameters. </br>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from Python_Code import FreeGraph\n",
+ "FreeGraph.plotFree()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Laminar flow </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h4> Boundary Layer </h4>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the case of a laminar flow, it is possible to determine the the temperature and the velocity inside the boundary layer as well as the boundary layer thickness, using the solutions of the similarity equations.</br>\n",
+ "</br>\n",
+ "<b> Nomenclature </b> </br>\n",
+ "$x [m]$: direction along the plate </br>\n",
+ "$y [m]$: direction perpendicular to the plate </br>\n",
+ "$u [m/s]$ : velocity along the x-direction </br>\n",
+ "$v [m/s]$ : velocity along the y-direction </br>\n",
+ "$\\eta $ : adimensional number </br>\n",
+ "</br>\n",
+ "\n",
+ "$$\\eta = \\frac{y}{x} \\Big{(}\\frac{Gr_s}{4}\\Big{)}^{1/4}$$\n",
+ "</br>\n",
+ "$$f'(\\eta) = \\frac{ux}{2\\nu}Gr_x^{-1/2}$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Using the following graphs, with the appropriate Prandtl number $Pr$ value, it is possible to determine the desired parameters. </br>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<a href=Exercice-8-1.ipynb><p style=\"color:#2471A3;font-size:16pt\"><i><b> Example </b> </i>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h4> Heat convection coefficient </h4>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "It is possible to calculate the local value ussing the correlations \n",
+ "$$Nu_x = \\Big{(}\\frac{Gr_x}{4}\\Big{)}^{1/4}g(Pr)$$ </br>\n",
+ "$$g(Pr) = \\frac{0.75Pr^{1/2}}{(0.609 + 1.22Pr^{1/2}+1.238Pr)^{1/4}}$$\n",
+ "\n",
+ "<ol>\n",
+ " <li> Evaluate the <b> properties of the fluid </b> at $T_f = \\frac{T_s + T_{\\infty}}{2}$ </li>\n",
+ " <li> Verify that $Ra_x < 10^9$ </li>\n",
+ " <li> Compute $g(Pr)$ </li>\n",
+ " <li> Compute the <b>Nusselt number</b> $Nu_x$ </li>\n",
+ " <li> Compute the <b>local heat transfer coeffecitent </b> $h$\n",
+ "</ol>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Laminar & Turbulent Flow </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Wether the flow is laminar or turbulent, the average value of the Nusselt number can be determined using the <b> Churchill & Chu </b> formula :\n",
+ "\\begin{equation}\n",
+ " \\overline{Nu_L} = \\Bigg{(}0.825 + \\frac{0.387 Ra_L^{1/6}}{[1+ (0.492/Pr)^{9/16}]^{8/27}} \\Bigg{)}^2\n",
+ "\\end{equation}\n",
+ "\n",
+ "In order to properly use this formula, it is important to determine : </br>\n",
+ "<ol>\n",
+ " <li>The <b>properties of the fluid</b> at temperature $T_f = \\frac{T_{m,o} + T_{m,i}}{2}$ from the thermodynamics tables</li>\n",
+ " <li>The adimensional numbers $Ra_L$ and $Pr$</li>\n",
+ " <li>The average <b>Nusselt number </b>$ \\overline{Nu_D}$, using the <b> Churchill & Chu </b>formula </li>\n",
+ " <li>The <b> convection coefficient </b> $h$ from the Nusselt number $Nu_D$\n",
+ "</ol>\n",
+ "\n",
+ "<i><b> N.B </b></i> </br> \n",
+ "This correlation can also be used in the case of a vertical cylinder of height $L$ if the boundary layer thickness $\\delta$ is much smaller than its diameter $D$.\n",
+ "This condition is verified when : \n",
+ "$$\\frac{D}{L} \\geq \\frac{35}{Gr_L ^{1/4}}$$\n",
+ "<b> ADD EXAMPLE </b>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2>Inclined plate</h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the case of a vertical plate, the buyouncy force is only parallel to the plate surface. However, if the plate is inclined, this force has a component normal to the plate surface.Therefore, the velocity of the fluid along the plate decreases.\n",
+ "</br>\n",
+ "\n",
+ "If the angle of the plate with the vertical axis is $0^{\\circ} <\\theta <60 ^{\\circ}$, it is possible to use the previous correlations by taking \n",
+ "$$g'= gcos \\theta$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Horizontal plate </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the case of horizontal plates, the buyoncy force has only a component normal to the surface of the plate. Two cases can be presented.\n",
+ "<l> \n",
+ " <li> <b> Cold plate : </b> The air near the plate is getting colder, thus heavier. The flow moves horizontally on the upper surface, then descends along the edges of the plates. </li>\n",
+ " <li> <b> Hot plate : </b> The aire near the plate is getting hotter, thus lighter. The flow moves horizontally on the lower surface, then ascends along the edges of the plate. </li>\n",
+ "</l>\n",
+ "It it therefore important to distinguish between the upper and lower surfaces of the plate. In fact, they display different flows, which result in different heat transfer coefficient. </br>\n",
+ "</br>\n",
+ "The following correlations can be used for <b> laminar & turbulent </b>, in order to determine the heat transfer coefficient.\n",
+ "\n",
+ "<img src=\"Images/Free_Horizontal.png\" width=800 >\n",
+ "\n",
+ "<table style=\"width:80%\">\n",
+ " <tr>\n",
+ " <td align=\"center\">Hot plate Upper surface & Cold plate Lower surface<\\td>\n",
+ " <td align=\"left\">$10^7<Ra_L<10^{11} \\qquad \\overline{Nu_L} = 0.15 Ra_L^{1/3}$ <BR> $10^4<Ra_L<10^7 \\qquad \\overline{Nu_L} = 0.54 Ra_L^{1/4}$ <\\li> <\\l> <\\td>\n",
+ " <\\tr>\n",
+ " <tr>\n",
+ " <td align =\"center\">Hot plate Lower surface & Cold plate Upper surface <\\td>\n",
+ " <td align = \"left\"> $10^5 < Ra_L <10^{11} \\qquad \\overline{Nu_L} = 0.27Ra_L^{1/4}$ <\\td>\n",
+ " \n",
+ "<table> "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2>Infinite horizontal cylinder</h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the case of long infinite horizontal cylinder, the Nusselt number is given by the <b> Churchil & Chu correlation </b> <br>\n",
+ "$$\\overline{Nu_D} = \\Big{\\{}0.6 + \\frac{0.387 Ra_D^{1/6}}{[1+ (0.559/Pr)^{9/16}]^{8/27}} \\Big{\\}}^2$$\n",
+ "\n",
+ "<img src=\"Images/Free_Cylinder.png\" width=600 >"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/IdeasForNotebook.ipynb b/IdeasForNotebook.ipynb
new file mode 100644
index 0000000..ebbc773
--- /dev/null
+++ b/IdeasForNotebook.ipynb
@@ -0,0 +1,90 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# This is a first Jupiter notebook"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h1>Ideas for the Heat and Mass Transfer Notebook </h1>\n",
+ "</br>\n",
+ "<h2>Points to keep in mind</h2>\n",
+ "<ul>\n",
+ " <li>\n",
+ " Always highlight underlying assumptions for all examples </li>\n",
+ " <li> Explain the exercices in text form and with images (photos of handwritten sketches at the debut)</li>\n",
+ "</ul>\n",
+ "\n",
+ "<h2>Questions</h2>\n",
+ "<ul>\n",
+ " <li> What is the goal of the Notebook? How will it be used? To be presented ex-cathedra in front of \n",
+ " the class or to be accessed by the students on their own?</li>\n",
+ " <li> How many code should the students get to view? Should the coding be done\n",
+ " essentially \"behind\" the visible interface (reducing visible code to a minimum)?</li>\n",
+ " <li> How should the content be interactive? Multiple choice questions, interactive graphs or animations?</li>\n",
+ " <li> How should the notebook(s) be structured? 1 general document or several interconnected documents?</li>\n",
+ " <li><b>What chapter should we start on?</b></li>\n",
+ " <li> What exercices can we include?</li>\n",
+ " <li> Thermal resistances?</li>\n",
+ " <li> Add a link to the tables and formulary?</li>\n",
+ "</ul>\n",
+ "<h2>Ideas for content</h2>\n",
+ "<h3>Interactive part</h3>\n",
+ "<ul>\n",
+ " <li> Student has to choose the right temperature to retrieve the material properties from the tables</li>\n",
+ " <li> Add sliders to make graphs interactive -> comment on physical behavour of h(x), T(x) etc..</li>\n",
+ " <li> Ask the student for the assumptions that are made (or not) when using a formula/solving an exercise</li>\n",
+ " <li> Multiple choice questions to review the chapter --> comment all answers (import questions from moodle)</li>\n",
+ " <li> (Animations) </li>\n",
+ " \n",
+ "</ul>\n",
+ "<h3>(Possible) structure of the Notebook</h3>\n",
+ "<ul>\n",
+ " <li> Global overview of the convection: forced/free convection, boiling, condensation --> navigation </li>\n",
+ " <li> Distinct page for all of these themes</li>\n",
+ " <li> Theory explaining: Boundary layers (temperature/velocity), laminar and turbulent flow, local and mean value of h, Nu etc, how to retrieve properties to calculate adimensional numbers (meaning of adimensional numbers) </li>\n",
+ " <li> Examples: problem statement, sketches</li>\n",
+ " <li> Help the student to calculate the adimensional numbers (choose the right temperature to look up in tables), select the good correllations etc.. </li>\n",
+ " <li> Print/plot/visualize the result (f.e. h, T, q), comment on the result </li>\n",
+ " <li> QCM at the end of every chapter as a summary</li>\n",
+ " <li> Final QCM as a global summary</li>\n",
+ "</ul>\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Images/Car.png b/Images/Car.png
new file mode 100644
index 0000000..6b10c66
Binary files /dev/null and b/Images/Car.png differ
diff --git a/Images/Car_Pipe.png b/Images/Car_Pipe.png
new file mode 100644
index 0000000..71f3b55
Binary files /dev/null and b/Images/Car_Pipe.png differ
diff --git a/Images/Cylinder_Crossflow.JPG b/Images/Cylinder_Crossflow.JPG
new file mode 100644
index 0000000..b0ca51d
Binary files /dev/null and b/Images/Cylinder_Crossflow.JPG differ
diff --git a/Images/External_Bank.png b/Images/External_Bank.png
new file mode 100644
index 0000000..3fb241d
Binary files /dev/null and b/Images/External_Bank.png differ
diff --git a/Images/External_Cylinder.png b/Images/External_Cylinder.png
new file mode 100644
index 0000000..cec1e78
Binary files /dev/null and b/Images/External_Cylinder.png differ
diff --git a/Images/External_Plate.png b/Images/External_Plate.png
new file mode 100644
index 0000000..b153452
Binary files /dev/null and b/Images/External_Plate.png differ
diff --git a/Images/Free_Convection_Exercise_Plate.png b/Images/Free_Convection_Exercise_Plate.png
new file mode 100644
index 0000000..1f724ea
Binary files /dev/null and b/Images/Free_Convection_Exercise_Plate.png differ
diff --git a/Images/Free_Cylinder.png b/Images/Free_Cylinder.png
new file mode 100644
index 0000000..22d72fa
Binary files /dev/null and b/Images/Free_Cylinder.png differ
diff --git a/Images/Free_Horizontal.png b/Images/Free_Horizontal.png
new file mode 100644
index 0000000..8a45436
Binary files /dev/null and b/Images/Free_Horizontal.png differ
diff --git a/Images/Free_Icon.png b/Images/Free_Icon.png
new file mode 100644
index 0000000..a2ae7e5
Binary files /dev/null and b/Images/Free_Icon.png differ
diff --git a/Images/Free_Vertical_Plate.png b/Images/Free_Vertical_Plate.png
new file mode 100644
index 0000000..7b30bba
Binary files /dev/null and b/Images/Free_Vertical_Plate.png differ
diff --git a/Images/HydrogenCarSketch.jpg b/Images/HydrogenCarSketch.jpg
new file mode 100644
index 0000000..61c6e39
Binary files /dev/null and b/Images/HydrogenCarSketch.jpg differ
diff --git a/Images/InternalConvection_EnergyBalance.jpg b/Images/InternalConvection_EnergyBalance.jpg
new file mode 100644
index 0000000..88dae43
Binary files /dev/null and b/Images/InternalConvection_EnergyBalance.jpg differ
diff --git a/Images/Internal_Enhancement_1.png b/Images/Internal_Enhancement_1.png
new file mode 100644
index 0000000..193b10b
Binary files /dev/null and b/Images/Internal_Enhancement_1.png differ
diff --git a/Images/Internal_Enhancement_2.png b/Images/Internal_Enhancement_2.png
new file mode 100644
index 0000000..722040e
Binary files /dev/null and b/Images/Internal_Enhancement_2.png differ
diff --git a/Images/Internal_External.png b/Images/Internal_External.png
new file mode 100644
index 0000000..b1b945b
Binary files /dev/null and b/Images/Internal_External.png differ
diff --git a/Images/Internal_Pipe.png b/Images/Internal_Pipe.png
new file mode 100644
index 0000000..533d731
Binary files /dev/null and b/Images/Internal_Pipe.png differ
diff --git a/Images/NuCorrBankOfTubes.png b/Images/NuCorrBankOfTubes.png
new file mode 100644
index 0000000..504e0f0
Binary files /dev/null and b/Images/NuCorrBankOfTubes.png differ
diff --git a/Images/NuCorrCylinder.png b/Images/NuCorrCylinder.png
new file mode 100644
index 0000000..58ae96f
Binary files /dev/null and b/Images/NuCorrCylinder.png differ
diff --git a/Images/NuCorrPlateLaminar.png b/Images/NuCorrPlateLaminar.png
new file mode 100644
index 0000000..ed9a08e
Binary files /dev/null and b/Images/NuCorrPlateLaminar.png differ
diff --git a/Images/NuCorrVerticalPlate.png b/Images/NuCorrVerticalPlate.png
new file mode 100644
index 0000000..70e6290
Binary files /dev/null and b/Images/NuCorrVerticalPlate.png differ
diff --git a/Images/Pipe_Icon.png b/Images/Pipe_Icon.png
new file mode 100644
index 0000000..8962199
Binary files /dev/null and b/Images/Pipe_Icon.png differ
diff --git a/Images/Wind_icon.png b/Images/Wind_icon.png
new file mode 100644
index 0000000..5a45be6
Binary files /dev/null and b/Images/Wind_icon.png differ
diff --git a/Internal.ipynb b/Internal.ipynb
new file mode 100644
index 0000000..659e4b3
--- /dev/null
+++ b/Internal.ipynb
@@ -0,0 +1,519 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h1>Forced Convection - Internal Flow Problems </h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2>Introduction</h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<div style=\"background-color:#f6f6f6;border:1px solid #707070;padding:0.5em 1em;box-sizing:border-box;\">\n",
+ "The internal convection occurs when the flow is internal. The flow is internal when it is confined by the surface. Therefore, the boundary layer cannot develop without being constrained. There will be a heat transfer by convection between the fluid and the surface. </br>\n",
+ "</br>\n",
+ "<p>The fluid properties depend on the temperature, which is not uniform for all the particles in the boundary layer. In order to keep account for this dependancy, we define the <i>film temperature</i> as follows:</p>\n",
+ " $$T_f = \\frac{T_s + T_{\\infty}}{2}$$\n",
+ " \n",
+ "<i><b>Example: </b></i>Flow in a pipe \n",
+ "\n",
+ "\n",
+ "__ADD SKETCH__\n",
+ "\n",
+ "\n",
+ "\n",
+ "<h3> Adimensional numbers </h3>\n",
+ "The relevant adimensional numbers for this section are\n",
+ "<br>\n",
+ "<ul>\n",
+ " <li> Reynolds number $Re_D = \\frac{\\rho u D}{\\mu}= \\frac{4 \\dot{m}}{\\pi D \\mu}$ </li>\n",
+ " <li> Nusselt number $Nu_D = \\frac{hD}{k_f}$\n",
+ " <li> Prandtl number $Pr = \\frac{\\nu}{\\alpha}$ </li>\n",
+ "</ul>\n",
+ "</div>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Possible Parts (to check) : Hydrodynamics, Thermal Considerations** \n",
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2>Energy Balance</h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The most common case of internal convection is the flow in the pipe. For a mass flow $\\dot{m}$ of the fluid flowing trhough the pipe, a boundary layer will develop inside the pipe. However it will be constrained by the surface of the pipe. Heat is exchanged between the fluid and the surface of the pipe by convection. The flow is maintained by an external mean such as a pump or a fan.\n",
+ "<br> <br>\n",
+ "\n",
+ "<div style=\"background-color:#f6f6f6;border:1px solid #707070;padding:0.5em 1em;box-sizing:border-box;\">\n",
+ " <b>Nomenclature :</b> </br>\n",
+ "</br>\n",
+ "$T_s [K]$: Temperature of the internal surface of the pipe (surface in contact with the fluid) </br>\n",
+ "$T_{m} [K] $: Mean temperature of the fluid </br>\n",
+ "$T_{m,o} [K]$ : Mean temperature of the fluid at the outlet of the pipe </br>\n",
+ "$T_{m,i} [K]$ : Mean temperature of the fluid at the inlet of the pipe </br>\n",
+ "</br>\n",
+ "$q_s''[W/m^2]$ : Surface heat flux </br>\n",
+ "$Q [W]$: Overall heat transfer </br>\n",
+ "</br>\n",
+ "$P [m]$ : Pipe cross-section perimeter </br>\n",
+ "$L [m]$ : Length of the pipe </br>\n",
+ "$A [m^2]$ : Area of the pipe </br>\n",
+ "</br>\n",
+ "$\\dot{m} [kg/s]$ : Mass flow </br>\n",
+ "$c_p [J/kgK]$ : Heat capacity of the fluid </br>\n",
+ "$h [W/m^2K]$ : Local convection coefficient </br>\n",
+ "$\\bar{h} [W/m^2K]$ : Average convection coefficient </br>\n",
+ "\n",
+ "</div>\n",
+ "</br>\n",
+ "\n",
+ "The mean temperature $T_m(x)$ and the heat transfer $Q(x)$ vary with respect to $x$, the position along the pipe. In fact, due to the heat transfer by convection, the surface temperature of the pipe varies as well as the temperature of the fluid, which means that the heat transfer also varies along the pipe. </br>\n",
+ "In order to determine $T_m(x)$ and $Q(x)$, an energy balance is done on the fluid with the following assumptions. </br>\n",
+ "</br>\n",
+ "__Assumptions__:\n",
+ "1. Steady flow\n",
+ "1. Viscous dissipation is negligible\n",
+ "1. Incompressible fluid\n",
+ "1. Pressure variation is negligible\n",
+ "1. Heat transfer by conduction in the axial direction is negligible\n",
+ "\n",
+ "\n",
+ "<img src=\"Images\\Internal_Pipe.png\" style=\"float: left; width: 40%; margin-right: 5%; margin-bottom: 0.5em;\">\n",
+ "<img src=\"Images\\InternalConvection_EnergyBalance.jpg\" style=\"float: left; width: 40%; margin-right: 5%; margin-bottom: 0.5em;\">\n",
+ "<p style=\"clear: both;\">\n",
+ "\n",
+ "The surface heat flux at a given position $x$ is \n",
+ "\\begin{equation}\n",
+ "q_s'' = h (T_s(x) - T_m(x))\n",
+ "\\end{equation}\n",
+ "\n",
+ "\n",
+ "The overall heat transfer by convection is, by Newton's law of cooling,\n",
+ "\\begin{equation}\n",
+ "Q = \\dot{m}c_p (T_{m,o} - T_{m,i})\n",
+ "\\end{equation}\n",
+ "\n",
+ "The energy balance on a portion of the pipe is \n",
+ "\\begin{equation}\n",
+ "\\label{Energy_Balance}\n",
+ "dQ= \\dot{m}c_pdT_m =q_s''Pdx\n",
+ "\\end{equation}\n",
+ "\n",
+ "\\begin{equation}\n",
+ "\\frac{dT_m}{dx} = \\frac{q_s'' P}{\\dot{m}c_p}\n",
+ "\\end{equation}"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Constant Surface Heat Flux </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The surface heat flux $q_s''$ is constant.</br>\n",
+ "<i>Example : </i> This would be the case if the surface of the pipe is heated with electrical heaters. \n",
+ "<div style=\"background-color:#f6f6f6;border:1px solid #707070;padding:0.5em 1em;box-sizing:border-box;\">\n",
+ "By integrating the previous equation of energy balance and considering the boundary conditions, the overall heat transfer is given by\n",
+ "\n",
+ "\\begin{equation}\n",
+ "Q(x) = q_s''Px = \\dot{m}c_p (T_m(x) - T_{m,i})\n",
+ "\\end{equation}\n",
+ "\n",
+ "Using the previous results and equations, the temperature distribution of the fluid along the pipe is\n",
+ "\\begin{equation}\n",
+ "T_m(x) = T_{m,i} + \\frac{q_s''P}{\\dot{m}c_p}x\n",
+ "\\end{equation}\n",
+ "\n",
+ "The temperature of the pipe's internal surface is given by\n",
+ "\\begin{equation}\n",
+ "T_s(x) = T_m(x) + \\frac{q_s''}{h}\n",
+ "\\end{equation}\n",
+ "\n",
+ "The temperatures distributions present a linear variation with $x$. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Constant Surface Temperature </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this case, the temperature of the internal surface of the pipe $T_s$ is constant.</br>\n",
+ "</br>\n",
+ "From the previous equations, it is known that\n",
+ "\\begin{equation}\n",
+ "q_s'' = h (T_s(x) - T_m(x))\n",
+ "\\end{equation}\n",
+ "</br>\n",
+ "\\begin{equation}\n",
+ "\\frac{dT_m}{dx} = \\frac{q_s'' P}{\\dot{m}c_p}\n",
+ "\\end{equation}\n",
+ "Therefore, the differential equation can be obtained\n",
+ "\\begin{equation}\n",
+ "\\frac{dT_m}{dx} = \\frac{hP}{\\dot{m}c_p}(T_s(x) - T_m(x))\n",
+ "\\end{equation}\n",
+ "</br>\n",
+ "\\begin{equation}\n",
+ "\\Delta T = T_s(x) - T_m(x)\n",
+ "\\end{equation}\n",
+ "</br>\n",
+ "\\begin{equation}\n",
+ "\\frac{-\\Delta T}{dx} = \\frac{hP}{\\dot{m}c_p}(\\Delta T)\n",
+ "\\end{equation}\n",
+ "\n",
+ "<div style=\"background-color:#f6f6f6;border:1px solid #707070;padding:0.5em 1em;box-sizing:border-box;\">\n",
+ " The solution is\n",
+ "\\begin{equation}\n",
+ "\\frac{T_s-T_m(x)}{T_s - T_{m,i}} = exp \\Big{(}-\\frac{Px}{\\dot{m}c_p} \\bar{h} \\Big{)}\n",
+ "\\end{equation}\n",
+ "\n",
+ "The overall heat transfer is\n",
+ "\\begin{equation}\n",
+ "Q = \\bar{h}A \\Delta T_{lm} = \\bar{h}A \\frac{\\Delta T_o - \\Delta T_i}{ln(\\Delta T_o / \\Delta T_i)}\n",
+ "\\end{equation}\n",
+ "with \n",
+ "\\begin{equation}\n",
+ "\\Delta T_o = T_s - T_{m,o} \\qquad \\Delta T_i = T_s - T_{m,i}\n",
+ "\\end{equation}\n",
+ " <dfiv>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import ipywidgets as widgets\n",
+ "import matplotlib.pyplot as plt\n",
+ "from IPython.display import display, clear_output\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<i> A pipe is heated with electric heaters. What is the boundary condition? </i>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def BC(x):\n",
+ " if x == 'Constant surface temperature':\n",
+ " answer = \"False. The heaters generate a constant heat flux.\"\n",
+ " elif x == 'Constant surface heat flux':\n",
+ " answer = \"Correct!The heaters generate a constant heat flux.\"\n",
+ " else:\n",
+ " answer = \" \"\n",
+ " print(answer) \n",
+ "\n",
+ "widgets.interact(BC, x = widgets.Dropdown(\n",
+ " options=['','Constant surface heat flux', 'Constant surface temperature'],\n",
+ " #value=['Sth'],\n",
+ " rows = 3,\n",
+ " description='BC : ',\n",
+ " disabled=False\n",
+ "))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<i> A pipe is placed in an ice bath at $0^{\\circ}C$. What is the boundary condition? </i>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def BC(x):\n",
+ " if x == 'Constant surface temperature':\n",
+ " answer = \"Correct! The ice melts at a constant temperature\"\n",
+ " elif x == 'Constant surface heat flux':\n",
+ " answer = \"False. The ice melts at a constant temperature\"\n",
+ " else:\n",
+ " answer = \" \"\n",
+ " print(answer) \n",
+ "\n",
+ "widgets.interact(BC, x = widgets.Dropdown(\n",
+ " options=['','Constant surface heat flux', 'Constant surface temperature'],\n",
+ " #value=['Sth'],\n",
+ " rows = 3,\n",
+ " description='BC : ',\n",
+ " disabled=False\n",
+ "))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> External Convection </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In most cases, the temperature of the external fluid $T_{\\infty}$is usually fixed (instead of the surface emperature of the pipe).\n",
+ "The previous results (constant surfarce temperature) can be used in the case where external convection occurs with the internal convection. </br>\n",
+ "</l>\n",
+ " <li>The surface temperature $T_s$ is replaced by the free stream temperature of the external fluid $T_{\\infty}$ </li>\n",
+ " <li> The convection coefficient $\\bar{h}$ is replaced by the overall heat transfer coefficient $U$ whith\n",
+ " \\begin{equation}\n",
+ " UA = \\frac{1}{R_{conv,out} + R_{cond,wall} + R_{conv,in}}\n",
+ " \\end{equation} </li>\n",
+ "</l>\n",
+ "\n",
+ "<img src=\"Images/Internal_External.png\" width=600 >"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<a href=Exercice-Internal-1.ipynb> <button> <p style=\"color:#2471A3;font-size:16pt\"><i><b> Example </b> </i>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2>Convection Correlations</h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h3> Circular Cross-Section </h3>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "An important notion for this section is the friction factor, which allows us to compute the pressure drop in the pipe. This pressure drop is mainly due to friction between the fluid and the wall of the pipe.\n",
+ "$$f = -\\frac{\\Delta p}{\\Delta x} \\frac{2D_i}{\\rho u_m^2}$$\n",
+ "Where $u_m$ is the mean velocity of the fluid\n",
+ "$$u_m = \\frac{\\dot{m}}{\\rho A_c}$$\n",
+ "In order to properly use this table, it is important to determine : </br>\n",
+ "<ol>\n",
+ " <li>The <b>properties of the fluid</b> at temperature $T_f = \\frac{T_{m,o} + T_{m,i}}{2}$ from the thermodynamics tables</li>\n",
+ " <li>Wether the flow is <b>laminar</b> or <b> turbulent </b> by calculating the <b>Reynolds number $Re_D$</b> </li>\n",
+ " <li>Wether the flow is fully developed by calculating the end of the entry length $x_{fd}$</li>\n",
+ " <li>The <b>Nusselt number</b>$Nu_D$, using the appropriate correlation from the tables </li>\n",
+ " <li>The <b>convection coefficient </b>$h$ from the Nusselt number $Nu_D$\n",
+ "</ol>\n",
+ "\n",
+ "\n",
+ "<table style=\"width:80%\">\n",
+ " <tr>\n",
+ " <th></th>\n",
+ " <th>Entry length end $x_{fd}$</th>\n",
+ " <th>Friction factor $f$</th>\n",
+ " <th>$Nu_D$</th>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td align=\"center\"> <b> Laminar <\\b> <\\br> $Re_D<2300$ <\\td>\n",
+ " <td align=\"center\">$x_{fd}= 0.05DRe_D$</td>\n",
+ " <td align=\"center\">$f = 4C_f = 64Re_D^{-1}$</td>\n",
+ " <td align=\"left\"> <ul style=\"list-style-type:square;\"> <li> Constant Surface Heat Flux $q_s''$ $$Nu_D = 4.36$$ </br> </br> </li> <li> Constant Surface Temperature $T_s$ $$Nu_D =3.66$$</li> </l></td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <td align=\"center\"> <b> Turbulent <\\b> <\\br> $Re_D>2300$ <\\td>\n",
+ " <td align=\"center\">$ 10D<x_{fd}<60D$</td>\n",
+ " <td align=\"center\">For $3000<Re_D<5.10^6$ $$f = (0.790lnRe_D - 1.64)^{-2}$$</td>\n",
+ " <td align=\"left\"> For all boundary conditions </br> </br> <ul style=\"list-style-type:square;\"> <li> For $Re_D > 10^4$ and $0.7 \\le Pr \\le 160$</br> </br>$$Nu_D = 0.023Re_D^{4/5}Pr^n$$ </br>$n=0.4 (T_s>T_m)$ for heating and $n=0.3 (T_s <T_m)$ for cooling </br> </br></li> <li> For $3000 \\le Re_D \\le 5.10^6$ and $0.5 \\le Pr \\le 3000$ $$Nu_D = \\frac{(f/8)(Re_D - 1000)Pr}{1 + 12.7(f/8)^{1/2}(Pr^{2/3}-1)}$$ </l></td>\n",
+ " </tr>\n",
+ "</table> "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2>Heat Tranfer Enhancement</h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In order to enhance the heat transfer, it is possible to : \n",
+ " - Increase the convection coeffecient $h$ by introducing surface roughness to enhance turbulence (machining, coil-spring wire), or by inducing swirl through the insertion of a twisted tape and/or \n",
+ " - Increase the convection surface area by manufacturing a tube with grooved inner surface.\n",
+ " - Increase the convection coeffecient $h$ and the area by using spiral fins or ribs. \n",
+ " However, these methods will induce a higher pressure drop.\n",
+ " \n",
+ "<p style=\"float: left; font-size: 9pt; text-align: center; width:20%; margin-right: 5%; margin-bottom: 0.5em;\"><img src=\"Images\\Internal_Enhancement_1.png\" style=\"width: 100%\">Coiled Spring</p>\n",
+ "<p style=\"float: left; font-size: 9pt; text-align: center; width: 20%; margin-right: 5%; margin-bottom: 0.5em;\"><img src=\"Images\\Internal_Enhancement_2.png\" style=\"width: 100%\">Longitudinal Fins</p>\n",
+ "\n",
+ "<p style=\"clear: both;\">"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<i> Usually, which type of flow generates a higher heat transfer? </i>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def Flow(x):\n",
+ " if x == 'Turbulent':\n",
+ " answer = \"Correct! By enhancing the turbulence of the flow, the heat transfer coefficient is increased, hence the heat transfered is increased\"\n",
+ " elif x == 'Laminar':\n",
+ " answer = \"False. By enhancing the turbulence of the flow, the heat transfer is increased, hence the heat tranfered is increased.\"\n",
+ " else:\n",
+ " answer = \" \"\n",
+ " print(answer) \n",
+ "\n",
+ "widgets.interact(Flow, x = widgets.Dropdown(\n",
+ " options=['','Laminar', 'Turbulent'],\n",
+ " #value=['Sth'],\n",
+ " rows = 3,\n",
+ " description='Flow Type : ',\n",
+ " disabled=False\n",
+ "))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "<h2>Influence of parameters</h2>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "__ADD MANY SLIDERS__ (convection coefficient, temperautre, heat transfer)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "__ADD EXAMPLE WITH EXTERNAL CONVECTION__ \n",
+ "__ADD QCM__"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Markdown_HTML_hints.ipynb b/Markdown_HTML_hints.ipynb
new file mode 100644
index 0000000..3f0cdc5
--- /dev/null
+++ b/Markdown_HTML_hints.ipynb
@@ -0,0 +1,56 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Markdown hints:\n",
+ "_italic text is between underscores_\n",
+ "__bold text is between two underscores__ or between two **asterisks**\n",
+ "\n",
+ "HTML hints:\n",
+ "<h1>Header one </h1>\n",
+ "<h2>Header one </h2>\n",
+ "<h3>Header one </h3>\n",
+ "<h4>Header one </h4>\n",
+ "and so on"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Diya Testing\n",
+ "Hello Marcel"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Nomenclature.ipynb b/Nomenclature.ipynb
new file mode 100644
index 0000000..888c372
--- /dev/null
+++ b/Nomenclature.ipynb
@@ -0,0 +1,32 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Python_Code/ExFree.py b/Python_Code/ExFree.py
new file mode 100644
index 0000000..e06ef44
--- /dev/null
+++ b/Python_Code/ExFree.py
@@ -0,0 +1,61 @@
+import numpy as np
+import ipywidgets as widgets
+import matplotlib.pyplot as plt
+from IPython.display import display, clear_output
+
+def EvaluateNumericalSolution(inputstring, solution, tolerance):
+ notaNumber = "Result is not a number"
+ correct = "Your answer is correct!"
+ wrong = "Wrong. Please try again."
+ clear_output();
+ try:
+ result = float(inputstring)
+ except ValueError:
+ print(notaNumber)
+ return
+ if np.abs(result-solution)<=tolerance:
+ print(correct)
+ else:
+ print(wrong)
+
+
+"""Question 3"""
+def EvalFilmTemp():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateFilmTemp(b):
+ with output:
+ if text.value!="":
+ solution = 37
+ resultstring = text.value
+ tolerance = 0
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateFilmTemp)
+
+"""Question 4.3"""
+def EvalBoundaryThickness():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateBoundaryThickness(b):
+ with output:
+ if text.value!="":
+ solution = 6.3
+ resultstring = text.value
+ tolerance = 0.1
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateBoundaryThickness)
+
\ No newline at end of file
diff --git a/Python_Code/ExHydrogen.py b/Python_Code/ExHydrogen.py
new file mode 100644
index 0000000..a106a9b
--- /dev/null
+++ b/Python_Code/ExHydrogen.py
@@ -0,0 +1,265 @@
+import numpy as np
+import ipywidgets as widgets
+import matplotlib.pyplot as plt
+from IPython.display import display, clear_output
+
+
+def EvaluateNumericalSolution(inputstring, solution, tolerance):
+ notaNumber = "Result is not a number"
+ correct = "Your answer is correct!"
+ wrong = "Wrong. Please try again."
+ clear_output();
+ try:
+ result = float(inputstring)
+ except ValueError:
+ print(notaNumber)
+ return
+ if np.abs(result-solution)<=tolerance:
+ print(correct)
+ else:
+ print(wrong)
+
+"""Function that clears and updates the displayed value"""
+def echo(string, padding=40):
+ padding = " " * (padding - len(string)) if padding else ""
+ print(string + padding, end='\r')
+
+"""Nusselt correlation passed to students"""
+def Nusselt(Re,Pr):
+ result = 0.3+(0.62*Re**(0.5)*Pr**(1/3))/ ((1+(0.4/Pr)**(2/3))**(0.25))*(1+(Re/282000)**(5/8))**(4/5)
+ resultstr = "The Nusselt Number is:%.2f \n" % float(result)
+ return resultstr
+
+"""PLOT FUNCTIONS"""
+def plotTemperature():
+ def Twall(r,r1=0.05,r2=0.055,T1=275.2,Tinterface=275.7):
+ """calculates the temperature inside the wall for r1<r2 without heat sources"""
+ if r<=r1:
+ T = T1
+ else:
+ T = (T1-Tinterface)/np.log(r1/r2)*np.log(r/r2)+Tinterface
+ return T
+ rwall = np.linspace(0.045,0.055,100)
+ Tin =[Twall(x) for x in rwall]
+ rout = np.linspace(0.055,0.060,50)
+ Tout = 296*np.ones((len(rout),1))
+ fig = plt.figure(figsize=(15,7))
+ plt.rcParams.update({'font.size': 20})
+ plt.plot(rwall,Tin,color='r')
+ plt.plot(rout,Tout,color='r')
+ plt.plot([0.05,0.05],[273,296],'k')
+ plt.plot([0.055,0.055],[273,296],'k')
+ plt.ylabel("Temperature")
+ plt.xlabel("Radius [m]");
+ plt.grid(True)
+ plt.annotate("Metal hydride \n- Canister interface",xy=(0.05,285),xytext=(0.045,290),arrowprops=dict(facecolor='black', shrink=0.05))
+ plt.annotate("Canister - \n Air interface",xy=(0.055,285),xytext=(0.051,290),arrowprops=dict(facecolor='black', shrink=0.05))
+ return fig
+
+"""Question 4"""
+def EvalEnergyGen():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateEnGen(b):
+ with output:
+ if text.value!="":
+ resultstring = text.value
+ solution = -3982
+ tolerance = 20
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateEnGen)
+
+
+"""Question 5.2"""
+def EvalFlowConditions():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateFlowCondition(b):
+ with output:
+ if text.value!="":
+ resultstring = text.value
+ solution = 173760
+ tolerance = 300
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateFlowCondition)
+
+"""Question 6.1"""
+
+def NusseltCorr():
+ def eval_nuCorr(Nusselt):
+ if Nusselt =="":
+ print("")
+ return
+ elif Nusselt=="A":
+ answer = True
+ else:
+ answer = False
+ return widgets.Valid(value=answer)
+
+ widgets.interact(eval_nuCorr, Nusselt=widgets.Dropdown(
+ options = ["","A", "B","C","D"]
+ ))
+
+"""Question 6.2"""
+
+def EvalNusselt():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateNusselt(b):
+ with output:
+ if text.value!="":
+ solution = 315.8
+ resultstring = text.value
+ tolerance = 1
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateNusselt)
+
+
+"""Question 6.3"""
+def EvalConvectionCoeff():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateConvectionCoeff(b):
+ with output:
+ if text.value!="":
+ solution = 72.6
+ resultstring = text.value
+ tolerance = 3
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateConvectionCoeff)
+
+"""Question 7.1"""
+def EvalRwall():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateRwall(b):
+ with output:
+ if text.value!="":
+ solution = 0.001415
+ resultstring = text.value
+ tolerance = 0.0001
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateRwall)
+"""Question 7.2"""
+def EvalRconv():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateRconv(b):
+ with output:
+ if text.value!="":
+ solution = 0.053
+ resultstring = text.value
+ tolerance = 0.01
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateRconv)
+
+"""Question 7.3"""
+def EvalTout():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateRconv(b):
+ with output:
+ if text.value!="":
+ solution = 275.73
+ resultstring = text.value
+ tolerance = 0.2
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ try:
+ result = float(resultstring)
+ except ValueError:
+ return
+ if abs(solution-result)<=tolerance:
+ display(plotTemperature())
+ else:
+ clear_output();
+
+ button.on_click(evaluateRconv)
+
+
+"""Quesiton 8.1"""
+def EvalHeatFlux():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateHeatFlux(b):
+ with output:
+ if text.value!="":
+ solution = 406
+ resultstring = text.value
+ tolerance = 3
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateHeatFlux)
+
+"""Question 8.2"""
+def EvalAddHeatFlux():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateAddHeatFlux(b):
+ with output:
+ if text.value!="":
+ solution = 3576
+ resultstring = text.value
+ tolerance = 10
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateAddHeatFlux)
+
+
diff --git a/Python_Code/ExInternal.py b/Python_Code/ExInternal.py
new file mode 100644
index 0000000..fa9ac1e
--- /dev/null
+++ b/Python_Code/ExInternal.py
@@ -0,0 +1,61 @@
+import numpy as np
+import ipywidgets as widgets
+import matplotlib.pyplot as plt
+from IPython.display import display, clear_output
+
+def EvaluateNumericalSolution(inputstring, solution, tolerance):
+ notaNumber = "Result is not a number"
+ correct = "Your answer is correct!"
+ wrong = "Wrong. Please try again."
+ clear_output();
+ try:
+ result = float(inputstring)
+ except ValueError:
+ print(notaNumber)
+ return
+ if np.abs(result-solution)<=tolerance:
+ print(correct)
+ else:
+ print(wrong)
+
+
+"""Question 3"""
+def EvalLMDT():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateLMDT(b):
+ with output:
+ if text.value!="":
+ solution = 37
+ resultstring = text.value
+ tolerance = 0
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateLMDT)
+
+"""Question 4.3"""
+def EvalBoundaryThickness():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ button = widgets.Button(description="Check answer")
+ output = widgets.Output()
+ display(button, output)
+
+ def evaluateBoundaryThickness(b):
+ with output:
+ if text.value!="":
+ solution = 6.3
+ resultstring = text.value
+ tolerance = 0.1
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ button.on_click(evaluateBoundaryThickness)
+
\ No newline at end of file
diff --git a/Python_Code/ExRefrigeratedTruck.py b/Python_Code/ExRefrigeratedTruck.py
new file mode 100644
index 0000000..996b56e
--- /dev/null
+++ b/Python_Code/ExRefrigeratedTruck.py
@@ -0,0 +1,102 @@
+import numpy as np
+import ipywidgets as widgets
+from ipywidgets import HBox
+import matplotlib.pyplot as plt
+from IPython.display import display, clear_output, Latex
+
+
+def EvaluateNumericalSolution(inputstring, solution, tolerance):
+ notaNumber = "Result is not a number"
+ correct = "Your answer is correct!"
+ wrong = "Wrong. Please try again."
+ clear_output();
+ try:
+ result = float(inputstring)
+ except ValueError:
+ print(notaNumber)
+ return
+ if np.abs(result-solution)<=tolerance:
+ print(correct)
+ else:
+ print(wrong)
+
+def CreateAnsweringTools():
+ text = widgets.Text(placeholder='Type your answer')
+ button = widgets.Button(description="Check answer")
+ return text, button
+
+"""Question 4"""
+def R_wall():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ checkbutton = widgets.Button(description="Check answer")
+ hintbutton = widgets.Button(description="Hint")
+ cheatbutton = widgets.Button(description="Show solution")
+ buttons = HBox([checkbutton, hintbutton, cheatbutton])
+ output = widgets.Output()
+
+ solution = 1.923
+ tolerance = 0.1
+ solstr = str(solution)
+ def evaluate_Rwall(b):
+ with output:
+ if text.value!="":
+ resultstring = text.value
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ def display_formula_Rwall(c):
+ with output:
+ clear_output()
+ display(Latex(r"""Recall the formula for the thermal resistance of a planar wall:
+ \begin{equation} R'' = \frac{L}{k}\end{equation}"""))
+
+ def display_solution_Rwall(s):
+ with output:
+ clear_output()
+ display(Latex(r"""Adding all resistances together leads to $R''_{wall} =""" + solstr + """ m^2 K / W$.
+ Note that the resistance of the aluminum is very small"""))
+
+ display(buttons, output)
+ checkbutton.on_click(evaluate_Rwall)
+ hintbutton.on_click(display_formula_Rwall)
+ cheatbutton.on_click(display_solution_Rwall)
+
+"""Question 5"""
+def R_conv():
+ text = widgets.Text(placeholder='Type your answer')
+ display(text)
+ checkbutton = widgets.Button(description="Check answer")
+ hintbutton = widgets.Button(description="Hint")
+ cheatbutton = widgets.Button(description="Show solution")
+ buttons = HBox([checkbutton, hintbutton, cheatbutton])
+ output = widgets.Output()
+
+ solution = 52.6
+ tolerance = 0.3
+ solstr = str(solution)
+ def evaluate_Rconv(b):
+ with output:
+ if text.value!="":
+ resultstring = text.value
+ EvaluateNumericalSolution(resultstring, solution, tolerance)
+ else:
+ clear_output();
+
+ def display_formula_Rconv(c):
+ with output:
+ clear_output()
+ display(Latex(r"""$Re > 5\cdot10^5$ means the flow is turbulent. Use the following correlation:
+ \begin{equation} h = 0.037 Re_L^{4/5}Pr^{1/3}\end{equation}"""))
+
+ def display_solution_Rconv(s):
+ with output:
+ clear_output()
+ display(Latex(r"""Using the relations $h = \frac{Nu_L k_f}{L}$ and $R''_{conv}=\frac{1}{h}$ leads to
+ $R''_{conv} =""" + solstr + """ m^2 K / W$."""))
+
+ display(buttons, output)
+ checkbutton.on_click(evaluate_Rconv)
+ hintbutton.on_click(display_formula_Rconv)
+ cheatbutton.on_click(display_solution_Rconv)
\ No newline at end of file
diff --git a/Python_Code/FEC_BoundaryLayer.py b/Python_Code/FEC_BoundaryLayer.py
new file mode 100644
index 0000000..0e01299
--- /dev/null
+++ b/Python_Code/FEC_BoundaryLayer.py
@@ -0,0 +1,28 @@
+import numpy as np
+import matplotlib.pyplot as plt
+
+def BoundaryLayer():
+ x = np.linspace(0,1,100)
+ rho = 1000
+ mu = 1.7e-3
+ V = 2
+ def BoundaryLayer(x):
+ Re = [rho*V*d/mu for d in x]
+ delta = []
+ for d,Re in zip(x, Re):
+ if Re>5e5:
+ delta.append(d*0.37*Re**(-1/5))
+ else:
+ if d==0:
+ delta.append(0)
+ else:
+ delta.append(5*d*Re**(-0.5))
+ return delta
+
+ delta = BoundaryLayer(x)
+
+ plt.figure(figsize=(8,5))
+ plt.rcParams.update({'font.size': 13})
+ plt.plot(x,delta, 'b*');
+ plt.xlabel("Downstream distance")
+ plt.ylabel("Boundary Layer thickness")
\ No newline at end of file
diff --git a/Python_Code/ForcExtConv.py b/Python_Code/ForcExtConv.py
new file mode 100644
index 0000000..8ac10fb
--- /dev/null
+++ b/Python_Code/ForcExtConv.py
@@ -0,0 +1,76 @@
+import numpy as np
+import matplotlib.pyplot as plt
+
+def ReX(rho, mu, V, x):
+ return rho*V*x/mu
+
+def FlatPlate_BL_lam(x, ReX):
+ return np.divide(x,np.sqrt(ReX))
+
+def FlatPlate_BL_turb(x, ReX):
+ return 0.37*np.multiply(x, ReX**(-1/5))
+
+
+def NuCorr_BoT(ReD,Pr,Prs,m,C):
+ '''Nusselt correlation for a bank of tubes'''
+ return C*(ReD**m)*Pr**0.36*(Pr/Prs)**0.25
+
+def NuCorr_Cyl(Re,Pr):
+ '''Churchill-Bernstein Correlation as a function of Re and Pr'''
+ return 0.3+(0.62*Re**(0.5)*Pr**(1/3))/ ((1+(0.4/Pr)**(2/3))**(0.25))*(1+(Re/282000)**(5/8))**(4/5)
+
+def BoundaryLayer():
+ x = np.linspace(0.01,1,100)
+ Re = ReX(1000, 1.7e-3, 1, x)
+ #print(x[-1])
+ delta_lam = FlatPlate_BL_lam(x, Re)
+ plt.plot(x, delta_lam, label='laminar')
+
+ #print(Re[-1])
+ delta_turb = FlatPlate_BL_turb(x,Re)
+ plt.plot(x, delta_turb, label='turbulent')
+ plt.legend()
+ plt.show()
+
+
+def cyl_crossflow():
+ Re = np.linspace(0,10000,100)
+ Pr = 0.7
+ plt.plot(Re,NuCorr_Cyl(Re,Pr)) #'''label='Churchill-Bernstein'''
+ plt.title('Churchill-Bernstein Correlation')
+ plt.xlabel('Reynolds Number')
+ plt.ylabel('Nu_bar')
+ #plt.legend()
+ plt.show()
+
+def bankoftubes():
+ C1 = 0.8
+ m = 0.4
+ mu = 1.7e-3
+ rho = 1000
+ Vmax = 10
+ D = np.linspace(0,0.05,30)
+ ReD = rho*Vmax*D/mu
+ Pr = 8
+ Pr_s= 5
+ Nu = NuCorr_BoT(ReD,Pr,Pr_s,m,C1)
+ plt.plot(D,Nu)
+ plt.xlabel('Tube diameter')
+ plt.ylabel('Nusselt Number')
+
+
+def g(x):
+ answer = str('')
+ if x == 'Constant Heat Flux':
+ answer = "Your answer is correct"
+ elif x == 'Constant Temperature':
+ answer = "False. We can consider a constant heat flux in this case."
+ else:
+ answer = "Choose an answer"
+ print(answer)
+
+"""widgets.interact(g, x = widgets.ToggleButtons(
+ options=['Constant Temperature', 'Constant Heat Flux'],
+ description='BC:',
+ disabled=False,
+ #tooltips=['FirstToolTip','SecontToolTip'], """
\ No newline at end of file
diff --git a/Python_Code/FreeGraph.py b/Python_Code/FreeGraph.py
new file mode 100644
index 0000000..a75a086
--- /dev/null
+++ b/Python_Code/FreeGraph.py
@@ -0,0 +1,39 @@
+import matplotlib.pyplot as plt
+import matplotlib.widgets as widgets
+import numpy as np
+
+
+
+class SnaptoCursor(object):
+ def __init__(self, ax, x, y):
+ self.ax = ax
+ self.ly = ax.axvline(color='k', alpha=0.2) # the vert line
+ self.marker, = ax.plot([0],[0], marker="o", color="crimson", zorder=3)
+ self.x = x
+ self.y = y
+ self.txt = ax.text(0.7, 0.9, '')
+
+ def mouse_move(self, event):
+ if not event.inaxes: return
+ x, y = event.xdata, event.ydata
+ indx = np.searchsorted(self.x, [x])[0]
+ x = self.x[indx]
+ y = self.y[indx]
+ self.ly.set_xdata(x)
+ self.marker.set_data([x],[y])
+ self.txt.set_text('x=%1.2f, y=%1.2f' % (x, y))
+ self.txt.set_position((x,y))
+ self.ax.figure.canvas.draw_idle()
+
+def plotFree()
+ t = np.arange(0.0, 1.0, 0.01)
+ s = np.sin(2*2*np.pi*t)
+ fig, ax = plt.subplots()
+
+ #cursor = Cursor(ax)
+ cursor = SnaptoCursor(ax, t, s)
+ cid = plt.connect('motion_notify_event', cursor.mouse_move)
+
+ ax.plot(t, s,)
+ plt.axis([0, 1, -1, 1])
+ plt.show()
\ No newline at end of file
diff --git a/Python_Code/PlotsFEC.py b/Python_Code/PlotsFEC.py
new file mode 100644
index 0000000..83622ab
--- /dev/null
+++ b/Python_Code/PlotsFEC.py
@@ -0,0 +1,119 @@
+import numpy as np
+from bokeh.plotting import figure
+from ipywidgets import interact
+from bokeh.io import push_notebook, show, output_notebook
+
+
+Tinf = 300
+q = 1000
+xmin = 0.00 # choose xmin > 0 for the calculation
+xmax = 3
+n = 100 # n is the resolution
+x = np.linspace(xmin,xmax,n)
+rho = 1/1.003e-3
+mu = 855e-6
+Pr = 5.83
+k = 0.613
+
+def Reynolds(x,V=1):
+ Re = [rho*V*d/mu for d in x]
+ return Re
+
+def Nusselt(x,V, Pr):
+ """input: vector of downstream distance, corresponding local Reynolds number and constant Prandtl number
+ output: vector of local nusselt number """
+ Nu = []
+ for Re in Reynolds(x,V):
+ if Re==0:
+ Nu.append(0)
+ elif Re>5e10: # flow is turbulent
+ Nu.append(0.453*Re**(1/2)*Pr**(1/3))
+ else:
+ Nu.append(0.0308*Re**(4/5)*Pr**(1/3))
+ return Nu
+
+def ConvCoeff(dist, Nusselt):
+ """input: vectors of downsteram distance and local nusselt number at these distances
+ output: vector of local convection coefficient"""
+ h = []
+ for x, Nu in zip(dist,Nusselt):
+ if x==0:
+ h.append(np.inf)
+ else:
+ h.append(Nu*k/x)
+ return h
+
+def PlotNusselt():
+ def updateNusselt(V):
+ Re = Reynolds(x,V)
+ Nu = Nusselt(x,V,Pr)
+ r.data_source.data['y'] = Nu
+ push_notebook()
+
+ y = Reynolds(x)
+ z = np.zeros(len(x))
+
+ output_notebook()
+
+ p = figure(title="Reynolds number",y_range=[0.01,60000], x_axis_label="downstream distance x [m]", y_axis_label = 'Nu_x', plot_height = 300, plot_width=600)
+ r = p.line(x, y, line_width=2)
+ #p2 = figure(title="Nusselt number", x_axis_label="downstream distance x [m]", y_axis_label = 'Nu_x', plot_height = 400, plot_width=400)
+ #s = p2.line(x, z, line_width=2)
+ show(p,notebook_handle=True)
+
+ interact(updateNusselt, V=(0,10,0.1));
+
+
+def PlotConvCoeff():
+ def initConvCoeff(V=5):
+ Nu = Nusselt(x,V,Pr);
+ h = ConvCoeff(x,Nu);
+ return h
+
+ def updateConvCoeff(V):
+ Nu = Nusselt(x,V,Pr);
+ h = ConvCoeff(x,Nu);
+ c.data_source.data['y']=h
+ push_notebook()
+
+ p2 = figure(title="Convection Coefficient", y_range=[0,35000],x_axis_label="Downstream Distance x", y_axis_label = "Convection coefficient h", plot_height = 300, plot_width=600)
+ y = initConvCoeff()
+ c=p2.line(x, y, line_width=2)
+ show(p2, notebook_handle=True)
+ interact(updateConvCoeff, V=(0,10,0.1))
+
+def PlotTemperature():
+ def TempEvolution(dist, convcoeff):
+ Temp=[]
+ for h in convcoeff:
+ if h<1e-5:
+ Temp.append(0)
+ else:
+ Temp.append(Tinf + q/h)
+ return Temp
+
+ def initT(V=5):
+ Nu = Nusselt(x,V,Pr)
+ h = ConvCoeff(x,Nu)
+ Temp = TempEvolution(x,h)
+ return Temp
+
+ def updateT(V):
+ Nu = Nusselt(x,V,Pr)
+ h = ConvCoeff(x,Nu)
+ Temp = TempEvolution(x,h)
+ T.data_source.data['y']=Temp
+ push_notebook()
+
+ output_notebook()
+
+ p3 = figure(title="Temperature",y_range=[300,305],x_axis_label="Downstream Distance x", y_axis_label = "T", plot_height = 200, plot_width=600)
+ y = initT()
+ T=p3.line(x, y, line_width=2)
+ show(p3, notebook_handle=True)
+ interact(updateT, V=(0,10,0.1))
+
+
+
+
+
\ No newline at end of file
diff --git a/Python_Code/Script.py b/Python_Code/Script.py
new file mode 100644
index 0000000..754931d
--- /dev/null
+++ b/Python_Code/Script.py
@@ -0,0 +1,18 @@
+import numpy as np
+import csv
+import matplotlib.pyplot as plt
+
+x = np.linspace(0,0.5,100)
+
+def readcsvfile(data, filename):
+ data = [];
+ with open(filename) as csvfile:
+ reader = csv.reader(csvfile)
+ for row in reader:
+ data.append(row)
+ csvfile.close()
+ return data
+
+water = []
+water = readcsvfile(water, 'Saturated_Water.csv')
+print(water)
\ No newline at end of file
diff --git a/Python_Code/Tables/7_1_FlatPlate_BoundaryLayerFcts.csv b/Python_Code/Tables/7_1_FlatPlate_BoundaryLayerFcts.csv
new file mode 100644
index 0000000..ee98e91
--- /dev/null
+++ b/Python_Code/Tables/7_1_FlatPlate_BoundaryLayerFcts.csv
@@ -0,0 +1,18 @@
+0,0,0,0.332
+0.4,0.027,0.133,0.331
+0.8,0.106,0.265,0.327
+1.2,0.238,0.394,0.317
+1.6,0.420,0.517,0.297
+2.0,0.650,0.630,0.267
+2.4,0.922,0.729,0.228
+2.8,1.231,0.812,0.184
+3.2,1.569,0.876,0.139
+3.6,1.930,0.923,0.098
+4.0,2.306,0.956,0.064
+4.4,2.692,0.976,0.039
+4.8,3.085,0.988,0.022
+5.2,3.482,0.994,0.011
+5.6,3.880,0.997,0.005
+6.0,4.280,0.999,0.002
+6.4,4.679,1.000,0.001
+6.8,5.079,1.000,0.000
\ No newline at end of file
diff --git a/Python_Code/Tables/A6_Saturated_Water.csv b/Python_Code/Tables/A6_Saturated_Water.csv
new file mode 100644
index 0000000..32be14c
--- /dev/null
+++ b/Python_Code/Tables/A6_Saturated_Water.csv
@@ -0,0 +1,55 @@
+273.15,0.00611,1.000,206.3,2502,4.217,1.854,1750,8.02,569,18.2,12.99,0.815,75.5,68.05,273.15
+275,0.00697,1.000,181.7,2497,4.211,1.855,1652,8.09,574,18.3,12.22,0.817,75.3,32.74,275
+280,0.00990,1.000,130.4,2485,4.198,1.858,1422,8.29,582,18.6,10.26,0.825,74.8,46.04,280
+285,0.01387,1.000,99.4,2473,4.189,1.861,1225,8.49,590,18.9,8.81,0.833,74.3,114.1,285
+290,0.01917,1.001,69.7,2461,4.184,1.864,1080,8.69,598,19.3,7.56,0.841,73.7,174.0,290
+295,0.02617,1.002,51.94,2449,4.181,1.868,959,8.89,606,19.5,6.62,0.849,72.7,227.5,295
+300,0.03531,1.003,39.13,2438,4.179,1.872,855,9.09,613,19.6,5.83,0.857,71.7,276.1,300
+305,0.04712,1.005,29.74,2426,4.178,1.877,769,9.29,620,20.1,5.20,0.865,70.9,320.6,305
+310,0.06221,1.007,22.93,2414,4.178,1.882,695,9.49,628,20.4,4.62,0.873,70.0,361.9,310
+315,0.08132,1.009,17.82,2402,4.179,1.888,631,9.69,634,20.7,4.16,0.883,69.2,400.4,315
+320,0.1053,1.011,13.98,2390,4.180,1.895,577,9.89,640,21.0,3.77,0.894,68.3,436.7,320
+325,0.1351,1.013,11.06,2378,4.182,1.903,528,10.09,645,21.3,3.42,0.901,67.5,471.2,325
+330,0.1719,1.016,8.82,2366,4.184,1.911,489,10.29,650,21.7,3.15,0.908,66.6,504.0,330
+335,0.2167,1.018,7.09,2354,4.186,1.920,453,10.49,656,22.0,2.88,0.916,65.8,535.5,335
+340,0.2713,1.021,5.74,2342,4.188,1.930,420,10.69,660,22.3,2.66,0.925,64.9,566.0,340
+345,0.3372,1.024,4.683,2329,4.191,1.941,389,10.89,664,22.6,2.45,0.933,64.1,595.4,345
+350,0.4163,1.027,3.846,2317,4.195,1.954,365,11.09,668,23.0,2.29,0.942,63.2,624.2,350
+355,0.5100,1.030,3.180,2304,4.199,1.968,343,11.29,671,23.3,2.14,0.951,62.3,652.3,355
+360,0.6209,1.034,2.645,2291,4.203,1.983,324,11.49,674,23.7,2.02,0.960,61.4,697.9,360
+365,0.7514,1.038,2.212,2278,4.209,1.999,306,11.69,677,24.1,1.91,0.969,60.5,707.1,365
+370,0.9040,1.041,1.861,2265,4.214,2.017,289,11.89,679,24.5,1.80,0.978,59.5,728.7,370
+373.15,1.0133,1.044,1.679,2257,4.217,2.029,279,12.02,680,24.8,1.76,0.984,58.9,750.1,373.15
+375,1.0815,1.045,1.574,2252,4.220,2.036,274,12.09,681,24.9,1.70,0.987,58.6,761,375
+380,1.2869,1.049,1.337,2239,4.226,2.057,260,12.29,683,25.4,1.61,0.999,57.6,788,380
+385,1.5233,1.053,1.142,2225,4.232,2.080,248,12.49,685,25.8,1.53,1.004,56.6,814,385
+390,1.794,1.058,0.980,2212,4.239,2.104,237,12.69,686,26.3,1.47,1.013,55.6,841,390
+400,2.455,1.067,0.731,2183,4.256,2.158,217,13.05,688,27.2,1.34,1.033,53.6,896,400
+410,3.302,1.077,0.553,2153,4.278,2.221,200,13.42,688,28.2,1.24,1.054,51.5,952,410
+420,4.370,1.088,0.425,2123,4.302,2.291,185,13.79,688,29.8,1.16,1.075,49.4,1010,420
+430,5.699,1.099,0.331,2091,4.331,2.369,173,14.14,685,30.4,1.09,1.10,47.2,430
+440,7.333,1.110,0.261,2059,4.36,2.46,162,14.50,682,31.7,1.04,1.12,45.1,440
+450,9.319,1.123,0.208,2024,4.40,2.56,152,14.85,678,33.1,0.99,1.14,42.9,450
+460,11.71,1.137,0.167,1989,4.44,2.68,143,15.19,673,34.6,0.95,1.17,40.7,460
+470,14.55,1.152,0.136,1951,4.48,2.79,136,15.54,667,36.3,0.92,1.20,38.5,470
+480,17.90,1.167,0.111,1912,4.53,2.94,129,15.88,660,38.1,0.89,1.23,36.2,480
+490,21.83,1.184,0.0922,1870,4.59,3.10,124,16.23,651,40.1,0.87,1.25,33.9,—,490
+500,26.40,1.203,0.0766,1825,4.66,3.27,118,16.59,642,42.3,0.86,1.28,31.6,—,500
+510,31.66,1.222,0.0631,1779,4.74,3.47,113,16.95,631,44.7,0.85,1.31,29.3,—,510
+520,37.70,1.244,0.0525,1730,4.84,3.70,108,17.33,621,47.5,0.84,1.35,26.9,—,520
+530,44.58,1.268,0.0445,1679,4.95,3.96,104,17.72,608,50.6,0.85,1.39,24.5,—,530
+540,52.38,1.294,0.0375,1622,5.08,4.27,101,18.1,594,54.0,0.86,1.43,22.1,—,540
+550,61.19,1.323,0.0317,1564,5.24,4.64,97,18.6,580,58.3,0.87,1.47,19.7,—,550
+560,71.08,1.355,0.0269,1499,5.43,5.09,94,19.1,563,63.7,0.90,1.52,17.3,—,560
+570,82.16,1.392,0.0228,1429,5.68,5.67,91,19.7,548,76.7,0.94,1.59,15.0,—,570
+580,94.51,1.433,0.0193,1353,6.00,6.40,88,20.4,528,76.7,0.99,1.68,12.8,—,580
+590,108.3,1.482,0.0163,1274,6.41,7.35,84,21.5,513,84.1,1.05,1.84,10.5,—,590
+600,123.5,1.541,0.0137,1176,7.00,8.75,81,22.7,497,92.9,1.14,2.15,8.4,—,600
+610,137.3,1.612,0.0115,1068,7.85,11.1,77,24.1,467,103,1.30,2.60,6.3,—,610
+620,159.1,1.705,0.0094,941,9.35,15.4,72,25.9,444,114,1.52,3.46,4.5,—,620
+625,169.1,1.778,0.0085,858,10.6,18.3,70,27.0,430,121,1.65,4.20,3.5,—,625
+630,179.7,1.856,0.0075,781,12.6,22.1,67,28.0,412,130,2.0,4.8,2.6,—,630
+635,190.9,1.935,0.0066,683,16.4,27.6,64,30.0,392,141,2.7,6.0,1.5,—,635
+640,202.7,2.075,0.0057,560,26,42,59,32.0,367,155,4.2,9.6,0.8,—,640
+645,215.2,2.351,0.0045,361,90,—,54,37.0,331,178,12,26,0.1,—,645
+647.3c,221.2,3.170,0.0032,0,,,45,45.0,238,238,,,0.0,—,647.3c
\ No newline at end of file
diff --git a/Python_Code/Tables/A6_Saturated_Water_README.txt b/Python_Code/Tables/A6_Saturated_Water_README.txt
new file mode 100644
index 0000000..ddde95d
--- /dev/null
+++ b/Python_Code/Tables/A6_Saturated_Water_README.txt
@@ -0,0 +1,18 @@
+The file Saturated_Water.csv contains the properties in the following order:
+Column-Idx, Property
+0 Temperature T
+1 Pressure p
+2 Specific volume (liq) nu*10^3 m^3/kg
+3 Specific volume (gas) nu m^3/kg
+4 Heat of vaporization h kJ/kg
+5 Specific heat (liq) kJ/kg
+6 Specific heat (gas) kJ/kg
+7 Viscosity (liq) mu*10^6 Ns/m^2
+8 Viscosity (gas) mu*10^6 Ns/m^2
+9 Thermal Conductivity (liq) k*10^3 W/m/K
+10 Thermal Conduvtivity (gas) k*10^3 W/m/K
+11 Prandtl (liq)
+12 Prandtl (gas)
+13 Surface Tension sigma*10^3 N/m
+14 Therm. Expans. Coeff. Beta*10^6 1/K
+15 Temperature T K
\ No newline at end of file
diff --git a/Python_Code/Tables/A_4_AirProperties.csv b/Python_Code/Tables/A_4_AirProperties.csv
new file mode 100644
index 0000000..fc2cde6
--- /dev/null
+++ b/Python_Code/Tables/A_4_AirProperties.csv
@@ -0,0 +1,35 @@
+100,3.5562,1.032,71.1,2.00,9.34,2.54,0.786
+150,2.3364,1.012,103.4,4.426,13.8,5.84,0.758
+200,1.7458,1.007,132.5,7.590,18.1,10.3,0.737
+250,1.3947,1.006,159.6,11.44,22.3,15.9,0.720
+300,1.1614,1.007,184.6,15.89,26.3,22.5,0.707
+350,0.9950,1.009,208.2,20.92,30.0,29.9,0.700
+400,0.8711,1.014,230.1,26.41,33.8,38.3,0.690
+450,0.7740,1.021,250.7,32.39,37.3,47.2,0.686
+500,0.6964,1.030,270.1,38.79,40.7,56.7,0.684
+550,0.6329,1.040,288.4,45.57,43.9,66.7,0.683
+600,0.5804,1.051,305.8,52.69,46.9,76.9,0.685
+650,0.5356,1.063,322.5,60.21,49.7,87.3,0.690
+700,0.4975,1.075,338.8,68.10,52.4,98.0,0.695
+750,0.4643,1.087,354.6,76.37,54.9,109,0.702
+800,0.4354,1.099,369.8,84.93,57.3,120,0.709
+850,0.4097,1.110,384.3,93.80,59.6,131,0.716
+900,0.3868,1.121,398.1,102.9,62.0,143,0.720
+950,0.3666,1.131,411.3,112.2,64.3,155,0.723
+1000,0.3482,1.141,424.4,121.9,66.7,168,0.726
+1100,0.3166,1.159,449.0,141.8,71.5,195,0.728
+1200,0.2902,1.175,473.0,162.9,76.3,224,0.728
+1300,0.2679,1.189,496.0,185.1,82,257,0.719
+1400,0.2488,1.207,530,213,91,303,0.703
+1500,0.2322,1.230,557,240,100,350,0.685
+1600,0.2177,1.248,584,268,106,390,0.688
+1700,0.2049,1.267,611,298,113,435,0.685
+1800,0.1935,1.286,637,329,120,482,0.683
+1900,0.1833,1.307,663,362,128,534,0.677
+2000,0.1741,1.337,689,396,137,589,0.672
+2100,0.1658,1.372,715,431,147,646,0.667
+2200,0.1582,1.417,740,468,160,714,0.655
+2300,0.1513,1.478,766,506,175,783,0.647
+2400,0.1448,1.558,792,547,196,869,0.630
+2500,0.1389,1.665,818,589,222,960,0.613
+3000,0.1135,2.726,955,841,486,1570,0.536
\ No newline at end of file
diff --git a/Python_Code/Tables/A_4_README.txt b/Python_Code/Tables/A_4_README.txt
new file mode 100644
index 0000000..866ed19
--- /dev/null
+++ b/Python_Code/Tables/A_4_README.txt
@@ -0,0 +1,3 @@
+A_4_Air_Properties Table
+values are:
+T, rho, c_p, my*10^7, nu*10^6, k*10^3, alpha*10^6
\ No newline at end of file
diff --git a/helper/FreeConvection.py b/helper/FreeConvection.py
new file mode 100644
index 0000000..b4e2c60
--- /dev/null
+++ b/helper/FreeConvection.py
@@ -0,0 +1,31 @@
+import numpy as np
+import matplotlib.pyplot as plt
+
+
+def plotVerticalPLate():
+
+ g = 9.81;
+ T_s = 80;
+ T_inf = 20;
+ DT = T_s - T_inf;
+ T_f = (T_s + T_inf)/2;
+ N = 1.5;
+ beta = 1/T_f;
+ mu = 1.957e-5;
+ rho = 1/0.9276;
+
+ nu = mu/rho;
+
+ def Gr(t) :
+ return g*beta*(T_s - T_inf)*np.power(t, 3)/(nu*nu)
+
+ x=np.linspace(0.0000001,40,100)
+ y= N*np.multiply(np.power(0.25*Gr(x),-0.25),x)
+
+ plt.figure(figsize=[5,7])
+ plt.ylim(0,40)
+ plt.xlim(0,0.03)
+ plt.xlabel('Boundary Layer Thickness')
+ plt.ylabel('Plate')
+ plt.fill_between(y,x,40, facecolor = 'red')
+ plt.plot(y,x, fillstyle ='left', c = 'red')
\ No newline at end of file
diff --git a/helper/InternalConvection.py b/helper/InternalConvection.py
new file mode 100644
index 0000000..6fe8ae5
--- /dev/null
+++ b/helper/InternalConvection.py
@@ -0,0 +1,47 @@
+import ipywidgets as widgets
+import numpy as np
+import matplotlib.pyplot as plt
+
+
+def InternalCircular():
+ TC = widgets.Dropdown(
+ options=[('Forced Convection, External',1), ('Forced Convection, Internal',2), ('Free Convection',3)],
+ #value='Forced Internal, Convection',
+ description='What is the type of convection?',
+ disabled=False,
+ )
+ display(TC)
+ print(TC.value)
+
+
+ TP = widgets.Dropdown(
+ options=[('Inlet Temperature',1), ('Film temperature',2),('Outlet Temperature',3)],
+ #value='Film Temperature',
+ description='At which temperature are the properties of the fluid determined?',
+ disabled=False,
+ )
+
+ display(TP)
+
+ TF = widgets.Dropdown(
+ options=[('Laminar',1), ('Turbulent',2)],
+ #value='Laminar',
+ description='What is the type of the flow?',
+ disabled=False,
+ )
+
+ display (TF)
+
+ BC = widgets.Dropdown(
+ options=[('Constant surface temperature',1), ('Constant surface heat flux',2)],
+ #value='Constant surface heat flux',
+ description='What are the boundary conditions',
+ disabled=False,
+ )
+
+ display(BC)
+
+
+
+
+
diff --git a/tinyarrow.jpg b/tinyarrow.jpg
new file mode 100644
index 0000000..ac6dd04
Binary files /dev/null and b/tinyarrow.jpg differ

Event Timeline