{ "cells": [ { "cell_type": "markdown", "id": "35a53b91-f1eb-4c06-983f-3aaa32ac5a87", "metadata": { "tags": [] }, "source": [ "# [Weather data and solar radiation](01WeatherData.ipynb)\n", "\n", "# [Thermal circuit and state-space representation for a thermal circuit with capacities in every node: simple wall](02SimpleWall.ipynb)\n", "\n", "# Thermal circuit and state-space representation for a thermal circuit with capacities in some nodes: cubic building\n", "\n", "This tutorial presents the theory of heat transfer in buildings and examplifies it on a [toy model](https://en.m.wikipedia.org/wiki/Toy_model).\n", "\n", "**Objectives:**\n", "- Analyse a cubic building with 5 identical walls & a transparent wall (glass window), air infiltration, and HVAC system controlling the indoor air temperature.\n", "- Model the heat transfer in the building by a thermal circuit.\n", "- Obtain the mathematical model as a system of Differential Algebraic Equations (DAE) from the thermal circuit.\n", "- Transfrom the system of DAE into state-space representation.\n", "- Find the steady-state solution.\n", "- Simulate by using Euler methods for numerical integration.." ] }, { "cell_type": "code", "execution_count": 1, "id": "764b77e2-3f93-4484-9842-6b328305d517", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import dm4bem" ] }, { "cell_type": "markdown", "id": "dd09d492-4c1d-422d-9a88-55f8631e5836", "metadata": { "tags": [] }, "source": [ "## Physical analysis\n", "\n", "### Description of the building\n", "\n", "\n", "> Figure 1. Simple ventilated room (5 two-layer walls and 1 glass window) equiped with an HVAC system which acts as a proportional controller.\n", "\n", "Let’s consider a cubic building with an HVAC systems acting as a [proportional controller](https://en.m.wikipedia.org/wiki/Proportional_control)." ] }, { "cell_type": "markdown", "id": "d101012e-cfec-4e3d-9268-03e8cc68fceb", "metadata": { "tags": [] }, "source": [ "The dimensions and surface areas of the building are:\n", "- $l=3 \\: \\mathrm{m}$ - edge length of the cube;\n", "- $S_g=l^2$ - surface area of the glass window;\n", "- $S_c = S_i = 5 \\times S_g$ - surface area of the 5 (concrete and insulation) walls." ] }, { "cell_type": "code", "execution_count": 2, "id": "e81f680f-dfcf-42a7-95f0-25869b407aee", "metadata": {}, "outputs": [], "source": [ "l = 3 # m length of the cubic room\n", "Sg = l**2 # m² surface of the glass wall\n", "Sc = Si = 5 * Sg # m² surface of concrete & insulation of the 5 walls" ] }, { "cell_type": "markdown", "id": "04249e0b-1f3d-47f5-b8f7-024135cda83b", "metadata": {}, "source": [ "### Thermo-physical properties\n", "The thermophysical properties of the air (in SI units) are:" ] }, { "cell_type": "code", "execution_count": 3, "id": "6b636b8a-a7af-4ebe-9eee-578dea6f7742", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>Density</th>\n", " <th>Specific heat</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>Air</th>\n", " <td>1.2</td>\n", " <td>1000</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Density Specific heat\n", "Air 1.2 1000" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "air = {'Density': 1.2, # kg/m³\n", " 'Specific heat': 1000} # J/(kg·K)\n", "# pd.DataFrame.from_dict(air, orient='index', columns=['air'])\n", "pd.DataFrame(air, index=['Air'])" ] }, { "cell_type": "markdown", "id": "55dcaa59-47e6-4fbd-9c42-ad843a62b4d6", "metadata": {}, "source": [ "The [thermophysical properties](https://energieplus-lesite.be/donnees/enveloppe44/enveloppe2/conductivite-thermique-des-materiaux/) ([thermal conductivities](https://en.m.wikipedia.org/wiki/List_of_thermal_conductivities), [densities](https://en.wikipedia.org/wiki/Density) and [specific heat capacities](https://en.m.wikipedia.org/wiki/Table_of_specific_heat_capacities)) and the geometry (widths and surface areas) of the three materials (i.e., concrete, insulation, glass) in SI units are:" ] }, { "cell_type": "code", "execution_count": 4, "id": "2db86dfc-2fd4-4a32-94b2-a21dcd1286c8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>Conductivity</th>\n", " <th>Density</th>\n", " <th>Specific heat</th>\n", " <th>Width</th>\n", " <th>Surface</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>Layer_out</th>\n", " <td>1.400</td>\n", " <td>2300.0</td>\n", " <td>880</td>\n", " <td>0.20</td>\n", " <td>45</td>\n", " </tr>\n", " <tr>\n", " <th>Layer_in</th>\n", " <td>0.027</td>\n", " <td>55.0</td>\n", " <td>1210</td>\n", " <td>0.08</td>\n", " <td>45</td>\n", " </tr>\n", " <tr>\n", " <th>Glass</th>\n", " <td>1.400</td>\n", " <td>2500.0</td>\n", " <td>1210</td>\n", " <td>0.04</td>\n", " <td>9</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Conductivity Density Specific heat Width Surface\n", "Layer_out 1.400 2300.0 880 0.20 45\n", "Layer_in 0.027 55.0 1210 0.08 45\n", "Glass 1.400 2500.0 1210 0.04 9" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "concrete = {'Conductivity': 1.400,\n", " 'Density': 2300.0,\n", " 'Specific heat': 880,\n", " 'Width': 0.2,\n", " 'Surface': 5 * l**2}\n", "\n", "insulation = {'Conductivity': 0.027,\n", " 'Density': 55.0,\n", " 'Specific heat': 1210,\n", " 'Width': 0.08,\n", " 'Surface': 5 * l**2}\n", "\n", "glass = {'Conductivity': 1.4,\n", " 'Density': 2500,\n", " 'Specific heat': 1210,\n", " 'Width': 0.04,\n", " 'Surface': l**2}\n", "\n", "wall = pd.DataFrame.from_dict({'Layer_out': concrete,\n", " 'Layer_in': insulation,\n", " 'Glass': glass},\n", " orient='index')\n", "wall" ] }, { "cell_type": "markdown", "id": "fe6a3471-4696-4661-ad9e-3ab90dd18f63", "metadata": {}, "source": [ "where `Slices` is the number of meshes used in the [numerical discretization](https://en.m.wikipedia.org/wiki/Discretization). " ] }, { "cell_type": "markdown", "id": "30e10ea7-83eb-4a06-889e-d1c83b617b14", "metadata": {}, "source": [ "### Radiative properties\n", "\n", "The [radiative properties](https://en.wikipedia.org/wiki/Emissivity#Absorptivity) of the surfaces are:\n", "- long wave [emmisivity](https://www.engineeringtoolbox.com/emissivity-coefficients-d_447.html) of concrete (between normal and rough) and glass pyrex;\n", "- short wave [absortivity of solar radiation](https://www.engineeringtoolbox.com/solar-radiation-absorbed-materials-d_1568.html) of white smooth surfaces;\n", "- short wave [transmittance](https://www.engineeringtoolbox.com/optical-properties-glazing-materials-d_1355.html) of window glass (thickness of 4 mm);\n", "- short wave [absortivity and transmittance](https://energieplus-lesite.be/techniques/enveloppe7/composants-de-l-enveloppe/vitrages/vitrage-permettant-le-controle-solaire/) of reflective blue window glass." ] }, { "cell_type": "code", "execution_count": 5, "id": "415dff20-125d-4988-b863-90e17919f217", "metadata": {}, "outputs": [], "source": [ "# radiative properties\n", "ε_wLW = 0.85 # long wave emmisivity: wall surface (concrete)\n", "ε_gLW = 0.90 # long wave emmisivity: glass pyrex\n", "α_wSW = 0.25 # short wave absortivity: white smooth surface\n", "α_gSW = 0.38 # short wave absortivity: reflective blue glass\n", "τ_gSW = 0.30 # short wave transmitance: reflective blue glass" ] }, { "cell_type": "markdown", "id": "702b5007-e07f-48b0-b3d0-c80f6c0dcbd9", "metadata": {}, "source": [ "The [Stefan-Boltzmann constant](https://en.m.wikipedia.org/wiki/Stefan–Boltzmann_constant) is:" ] }, { "cell_type": "code", "execution_count": 6, "id": "1de290ff-7474-4623-aca9-fadfd45593ee", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "σ = 5.67e-08 W/(m²⋅K⁴)\n" ] } ], "source": [ "σ = 5.67e-8 # W/(m²⋅K⁴) Stefan-Bolzmann constant\n", "print(f'σ = {σ} W/(m²⋅K⁴)')" ] }, { "cell_type": "markdown", "id": "466314ca-35c9-4327-9ac5-e412f760baed", "metadata": {}, "source": [ "### Convection coefficients\n", "\n", "Conventional values for the [convection coeficients](https://energieplus-lesite.be/theories/enveloppe9/echanges-chaleur-parois/resistance-thermique-d-echange-superficiel/) for indoor and outdoor convection in W/(m²⋅K) are:" ] }, { "cell_type": "code", "execution_count": 7, "id": "c77bc614-0b91-4d45-93b6-8562947255de", "metadata": {}, "outputs": [], "source": [ "h = pd.DataFrame([{'in': 8., 'out': 25}], index=['h']) # W/(m²⋅K)" ] }, { "cell_type": "code", "execution_count": 8, "id": "a9fd244e-9fcd-42e7-b56a-a6438a41f9fd", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>in</th>\n", " <th>out</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>h</th>\n", " <td>8.0</td>\n", " <td>25</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " in out\n", "h 8.0 25" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h" ] }, { "cell_type": "markdown", "id": "7999a5df-05f3-4f8a-a1e3-7106dca8222e", "metadata": { "tags": [] }, "source": [ "## Thermal network\n", "\n", "Thermal networks (or circuits) are weighted [directed graphs](https://en.m.wikipedia.org/wiki/Directed_graph) in which:\n", "- the **nodes** (or vertices) represent temperatures, $\\theta_i$, of geometrical points, surfaces or volumes;\n", "- the oriented **branches** (or edges) represent thermal heat flow rates, $q_j$, betweenn the temperature nodes.\n", "\n", "\n", "> Figure 2. Basic thermal network.\n", "\n", "A thermal network has at least one oriented branch, $q$, and one node, $\\theta$.\n", "\n", "In a node there are a thermal capacity, $C_i$, (which can be positive or zero) and a heat flow rate source, $\\dot Q_i$, (which can be zero).\n", "\n", "On a branch, there are a conductane, $G_j > 0$, (which needs to be strictely pozitve) and a temperature source, $T_j$ (which can be zero).\n", "\n", "The problem of analysis of thermal circuits (or the simulation problem, or the direct problem) is:\n", "\n", "**given**:\n", "- [incidence matrix](https://en.m.wikipedia.org/wiki/Incidence_matrix) $A$ which indicates how the nodes are connected by oriented branches;\n", "- conductance diagonal matrix $G$;\n", "- capacity diagonal matrix $C$;\n", "- temperature source vector $b$;\n", "- heat flow source vector $f$;\n", "\n", "**find** the temperature vector $\\theta$ and the flow rate vector $q.$\n", "\n", "\n", "For the [toy model](https://en.m.wikipedia.org/wiki/Toy_model) shown in Figure 1, heat transfert is:\n", "- through the walls (concrete and insulation), \n", "- through the glass window,\n", "- by ventilation,\n", "- from indoor auxiliary sources,\n", "- from the HVAC system.\n", "\n", "The HVAC system is modelled as a proportional controller. There is long wave radiative exchange between the wall and the glass window. The sources are:\n", "- temperature sources:\n", " - outdoor atmospheric air;\n", " - indoor air temperature setpoint;\n", "- flow rate sources:\n", " - solar radiation on the outdoor and the indoor walls;\n", " - auxiliary heat gains in the thermal zone.\n", "\n", "\n", "> Figure 3. Heat processes for the cubic building shown in Figure 1.\n", "\n", "\n", "> Figure 4. Thermal circuit for the cubic building shown in Figure 1 and the heat processes shown in Figure 2. *Note*: space discretization of the walls is done for simplicity." ] }, { "cell_type": "markdown", "id": "4cad06cc-972a-4a7f-859c-4b5de7a1e72d", "metadata": { "tags": [] }, "source": [ "Figure 3 shows the models of:\n", "- concrete & insulation wall: in red;\n", "- glass window: in green;\n", "- ventilation: in magenta;\n", "- indoor volume: in blue (conductances 6 & 7 for convection; conductance 5 for long wave radiation between the walls and the glass window);\n", "- HVAC system: in black.\n", "\n", "The sources are:\n", "- $T_o$ - outdoor temperature, °C;\n", "- $T_{i,sp}$ - setpoint temperaure for the indoor air, °C;\n", "- $\\Phi_o$ - solar radiation absorbed by the outdoor surface of the wall, W;\n", "- $\\Phi_i$ - solar radiation absorbed by the indoor surface of the wall, W;\n", "- $\\dot{Q}_a$ - auxiliary heat gains (i.e., occupants, electrical devices, etc.), W;\n", "- $\\Phi_a$ - solar radiation absorbed by the glass, W.\n", "\n", "\n", "*Note*: The known values, i.e. the elements of the circuit (the conductances $G$ and capacities $C$) and the sources (of temperature $T$ and of flow rate $\\Phi$ or $\\dot{Q}$) are noted in uppercase (majuscule) letters. The unknow variables, i.e. the temperatures in the nodes $\\theta$ and the flow rates on the branches $q$, are noted in lowercase (minuscule) letters." ] }, { "cell_type": "markdown", "id": "3d80e066-38d0-4ca2-b193-0a9f06c26499", "metadata": { "tags": [] }, "source": [ "### Thermal coductances\n", "#### Conduction\n", "The conductances 1, 2, 3, and 4 of the thermal circuit from Figure 3 model the heat transfer by [conduction](https://en.m.wikipedia.org/wiki/Thermal_conduction). Conduction conductances, in W/K, are of the form:\n", "$$G_{cd} = \\frac{\\lambda}{w}S$$\n", "where:\n", "\n", "- $\\lambda$ - [thermal conductvity](https://en.m.wikipedia.org/wiki/Thermal_conductivity), W/(m⋅K);\n", "- $w$ - width of the material, m;\n", "- $S$ - surface area of the wall, m²." ] }, { "cell_type": "code", "execution_count": 9, "id": "23b6045b-18c2-4598-8c3b-a3e95e9fe541", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>Conductance</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>Layer_out</th>\n", " <td>315.0000</td>\n", " </tr>\n", " <tr>\n", " <th>Layer_in</th>\n", " <td>15.1875</td>\n", " </tr>\n", " <tr>\n", " <th>Glass</th>\n", " <td>315.0000</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Conductance\n", "Layer_out 315.0000\n", "Layer_in 15.1875\n", "Glass 315.0000" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# conduction\n", "G_cd = wall['Conductivity'] / wall['Width'] * wall['Surface']\n", "pd.DataFrame(G_cd, columns=['Conductance'])" ] }, { "cell_type": "markdown", "id": "58c9a68d-ff08-45bf-913a-814fc9aa0f79", "metadata": { "tags": [] }, "source": [ "#### Convection\n", "The conductances 0, 6 and 7 model the heat transfer by [convection](https://en.m.wikipedia.org/wiki/Convection_(heat_transfer). Convection conductances, in W/K, are of the form:\n", "$$G_{cv} = {h S}$$\n", "where:\n", "- $h$ is the [convection coefficient](https://en.m.wikipedia.org/wiki/Heat_transfer_coefficient), W/(m²⋅K);\n", "- $S$ - surface area of the wall, m².\n", "\n", ">Table 1. Surface thermal resistances [Dal Zotto et al. 2014, p. 251]\n", "\n", "| Type of wall | Indoor surface |Outdoor surface|\n", "|--------------|:--------------:|:-------------:|\n", "| | $h_i$,W/(m²·K) | $h_o$,W/(m²·K)|\n", "|*Vertical* (tilt > 60°)| 7.7| 25 |\n", "|*Horizontal* (tilt < 60°)| | |\n", "|- Upward heat flow | 10| 25 |\n", "|- Downward heat flow | 5.9| 25 |" ] }, { "cell_type": "code", "execution_count": 10, "id": "3df65dcd-7962-42f5-80f2-e71d4cbc6486", "metadata": {}, "outputs": [], "source": [ "# convection\n", "Gw = h * wall['Surface'][0] # wall\n", "Gg = h * wall['Surface'][2] # glass" ] }, { "cell_type": "markdown", "id": "b800939e-8a50-45f9-83ef-e5cc98fe7c63", "metadata": { "tags": [] }, "source": [ "#### Long wave radiation\n", "##### View factors inside the building\n", "\n", "The majority of methods used for modelling the [radiative heat exchange](https://en.m.wikipedia.org/wiki/Thermal_radiation) use the [view factors](https://en.m.wikipedia.org/wiki/View_factor) between surfaces. The view factor $F_{i,j}$ is defined as *the proportion of radiation leaving surface $i$ that is intercepted by surface $j$*. The view factors can be estimated by [differential areas](https://en.m.wikipedia.org/wiki/View_factor#View_factors_of_differential_areas) or for different configurations of surfaces [[5](http://www.thermalradiation.net/indexCat.html)].\n", "\n", "The view factors need to satisfy the [summation rule](https://en.m.wikipedia.org/wiki/View_factor#Summation_of_view_factors) \n", "$$\\sum_{j=0}^{n-1} F_{i,j} = 1$$\n", "and the [reciprocity theorem](https://en.wikipedia.org/wiki/View_factor#Reciprocity):\n", "$$F_{i,j} S_i = F_{j,i} S_j$$\n", "where $S_{i}$ and $S_{j}$ are the surface areas.\n", "\n", "For a [convex](https://en.m.wikipedia.org/wiki/Convex_function) surface $i$, the [self-viewing factor](https://en.wikipedia.org/wiki/View_factor#Self-viewing_surfaces) is zero,\n", "$$F_{i,i} = 0$$\n", "\n", "Two simplified relations are used to calculate the view factors for buildings.\n", "\n", "In the first one, the view factors are defined by:\n", "$$\\begin{cases}\n", "F_{i,j} = \\frac{S_i}{S_T}\\\\ \n", "F_{i,i} = 0\n", "\\end{cases}$$\n", "\n", "where $S_{T} = \\sum_{j=0}^{n-1} S_j$, i.e. the surface $S_j$ is included in the total surface $S_T$. In this method, the reciprocity theorem is satisfied,\n", "$$F_{i,j} S_i = F_{j,i} S_j = \\frac{S_i S_j}{S_T}$$\n", "but summation rule isn't,\n", "$$\\sum_{j=0}^{n-1} F_{i,j} = \\sum_{j=0, j \\neq i}^{n-1} \\frac{S_j}{S_T} = \\frac {S_T - S_i}{S_T} \\neq 1$$\n", "\n", "In this case, the heat balance for each surface would be wrong.\n", "\n", "In the second one, the view factors are defined by:\n", "$$\\begin{cases}\n", "F_{i,j} = \\frac{S_j}{S_T -S_i}\\\\ \n", "F_{i,i} = 0\n", "\\end{cases}$$\n", "\n", "where $S_{T} = \\sum_{j=0}^{n-1} S_j$, i.e. the surface $S_i$ is not included in the total surface $S_{T,i} = S_T - S_i$. \n", "\n", "In this case, the reciprocty theorem is generally not respected:\n", "$$F_{i, j} S_i = \\frac{S_j}{S_T - S_i} S_i \\neq F_{j, i} S_j = \\frac{S_i}{S_T - S_j} S_j$$\n", "but the summation rule is respected:\n", "$$ \\sum_{i=0}^{n-1} F_{i, j} = \\frac{1}{S_T - S_i} \\sum_{\\substack{j=0\\\\i\\neq j}}^{n-1} S_j = 1 $$" ] }, { "cell_type": "code", "execution_count": 11, "id": "728db6f6-aa01-4f5c-8cae-6e3fd8a3ddc4", "metadata": {}, "outputs": [], "source": [ "# view factor wall-glass\n", "Fwg = glass['Surface'] / concrete['Surface']" ] }, { "cell_type": "markdown", "id": "456ebb01-0e0e-41f5-9484-34a2496b2e13", "metadata": {}, "source": [ "Note: The view factor between two surfaces, $j,k$ that are in the same plan (e.g. a window and a wall) is zero,\n", "$$F_{j,k} = F_{k,j}=0$$\n", "\n", "Therefore the total surface $S_{T,i}$ should be:\n", "$$S_{T,i} = \\sum_{j=0}^{n-1} S_j - \\sum_k S_k$$\n", "i.e. the surfaces $S_k$ in the same plan with the surface $S_i$ are not included in $S_{T,i}$." ] }, { "cell_type": "markdown", "id": "b9f00e69-9bae-4b7e-bf1d-afddce3c206a", "metadata": {}, "source": [ "##### View factor between tilted outdoor walls and sky\n", "\n", "The view factor between the top surface of finite wall $w$ tilted relative to an infinite plane of the ground $g$ is [[5](http://www.thermalradiation.net/sectionc/C-9.html), [6](http://www.diva-portal.org/smash/get/diva2:1305017/FULLTEXT01.pdf), eq. 4.18]:\n", "\n", "$$ F_{w,g} = \\frac {1 - \\cos \\beta}{2}$$\n", "\n", "Therefore, the view factor between the tilted wall $w$ and the sky dome $s$ is [[6](http://www.diva-portal.org/smash/get/diva2:1305017/FULLTEXT01.pdf), eq. 4.17]:\n", "$$ F_{w,s} = 1 - F_{w,g} = \\frac {1 + \\cos \\beta}{2}$$" ] }, { "cell_type": "markdown", "id": "6b226466-40de-4678-9673-fec8a811b873", "metadata": { "tags": [] }, "source": [ "##### Thermal network for long wave radiation\n", "\n", "The long-wave heat exchange between surfaces may be modelled by using the concept of [radiosity](https://en.m.wikipedia.org/wiki/Radiosity_(radiometry)) and then linearizing the radiative heat exchange. \n", "\n", "\n", "> Figure 5. Radiative long-wave heat exchange between two surfaces: a) modeled by [emmitance](https://en.m.wikipedia.org/wiki/Radiant_exitance) (source) and [radiosity](https://en.m.wikipedia.org/wiki/Radiosity_(radiometry)) (nodes); b) modeled by linearization of emmitance (temperature sources) and radiosity (temperature nodes).\n", "\n", "For two surfaces, shown by temperature nodes 4 and 5 in Figure 3 and by nodes 1 and 2 in Figure 4, the [conductances](https://en.m.wikipedia.org/wiki/Radiosity_(radiometry)#Circuit_analogy), in m², for radiative heat exchange expressed by using the emmitance (or the [radiant excitance](https://en.m.wikipedia.org/wiki/Radiant_exitance)) of the black body, the [radiosity](https://en.m.wikipedia.org/wiki/Radiosity_(radiometry)), and the [reciprocity](https://en.m.wikipedia.org/wiki/View_factor#Reciprocity) of view factors are:\n", "\n", "$$G_{1}^{r} = \\frac{\\varepsilon_1}{1 - \\varepsilon_1} S_1$$\n", "\n", "$$G_{1,2}^{r} = F_{1,2} S_1 = F_{2,1} S_2$$\n", "\n", "$$G_{2}^{r} = \\frac{\\varepsilon_2}{1 - \\varepsilon_2} S_2$$\n", "\n", "where:\n", "- $\\varepsilon_1$ and $\\varepsilon_2$ are the [emmisivities](https://en.m.wikipedia.org/wiki/Emissivity) of the surfaces 1 and 2;\n", "- $S_1$ and $S_2$ - areas of the surfaces 1 and 2, m²;\n", "- $F_{1,2}$ - [view factor](https://en.m.wikipedia.org/wiki/View_factor) between surfaces 1 and 2.\n", "\n", "\n", "The [net flows leaving the surfaces 1 and 2](https://en.m.wikipedia.org/wiki/Radiosity_(radiometry)#Circuit_analogy) are:\n", "\n", "$$q_{net,1} = \\frac{\\varepsilon_1}{1 - \\varepsilon_1} S_1 (M^o_1 - J_1)= G^r_1 (M_1^o - J_1)$$\n", "\n", "$$q_{net,2} = \\frac{\\varepsilon_2}{1 - \\varepsilon_2} S_2 (M^o_2 - J_2)= G^r_2 (M_2^o - J_2)$$\n", "\n", "respectively, where:\n", "- $M^o_1$ and $M^o_2$ are the [emmitances](https://en.m.wikipedia.org/wiki/Radiant_exitance) of the surfaces 1 and 2 when emmiting as black bodies, $M^o = \\sigma T^4$, W/m²;\n", "- $J_1$ and $J_2$ - [radiosities](https://en.m.wikipedia.org/wiki/Radiosity_(radiometry)) of surfaces 1 and 2, W/m²;\n", "- $G^r_1$ and $G^r_2$ - conductances for long wave radiative heat exchange, m².\n", "\n", "The [net flow between surfaces 1 and 2](https://en.m.wikipedia.org/wiki/Radiosity_(radiometry)#Circuit_analogy) is:\n", "\n", "$$q_{1,2} = F_{1,2} S_1 (J_1 - J_2) = F_{2,1} S_2 (J_1 - J_2)= G_{1,2}^r (J_1 - J_2)$$\n", "\n", "In order to express the long-wave radiative exchange as a function of temperature differences, a linearization of the difference of temperatures $T_1^4 - T_2^4$ may be used:\n", "\n", "$$T_1^4 - T_2^4 = (T_1^2 + T_2^2)(T_1^2 - T_2^2) = (T_1^2 + T_2^2)(T_1 + T_2)(T_1 - T_2) = 4 \\bar{T}^3 (T_1 - T_2)$$\n", "\n", "where the mean temperature $\\bar{T}$, measured in kelvin, is:\n", "\n", "$$\\bar{T} =\\sqrt[3]{ \\frac{(T_1^2 + T_2^2)(T_1 + T_2)}{4}}$$\n", "\n", "The evaluation of mean temperaure, $\\bar{T}$, requires the values of the surface tempetratures, $T_1$ and $T_2$. An initial guess can be used (and then an iterative process, for a more precise evaluation).\n", "\n", "After linearization, the conductances, in W/K, for radiative heat exchange are:\n", "\n", "$$G_{1} = 4 \\sigma \\bar{T}^3 \\frac{\\varepsilon_1}{1 - \\varepsilon_1} S_1$$\n", "\n", "$$G_{1,2} = 4 \\sigma \\bar{T}^3 F_{1,2} S_1 = 4 \\sigma \\bar{T}^3 F_{2,1} S_2$$\n", "\n", "$$G_{2} = 4 \\sigma \\bar{T}^3 \\frac{\\varepsilon_2}{1 - \\varepsilon_2} S_2$$" ] }, { "cell_type": "code", "execution_count": 12, "id": "f911a20f-4e20-43b3-aa72-a7e329a0b951", "metadata": {}, "outputs": [], "source": [ "# long wave radiation\n", "Tm = 20 + 273 # K, mean temp for radiative exchange\n", "\n", "GLW1 = 4 * σ * Tm**3 * ε_wLW / (1 - ε_wLW) * wall['Surface']['Layer_in']\n", "GLW12 = 4 * σ * Tm**3 * Fwg * wall['Surface']['Layer_in']\n", "GLW2 = 4 * σ * Tm**3 * ε_gLW / (1 - ε_gLW) * wall['Surface']['Glass']" ] }, { "cell_type": "markdown", "id": "939d7aac-b49a-4ff6-be6b-c0e227b5cd21", "metadata": { "tags": [] }, "source": [ "The equivalent conductance, in W/K, for the radiative long-wave heat exchange between the wall and the glass window is:\n", "$$G = \\frac{1}{1/G_1 + 1/G_{1,2} + 1/G_2}$$" ] }, { "cell_type": "code", "execution_count": 13, "id": "8f9999e8-b7ed-4f5b-87c9-5068d576b05e", "metadata": {}, "outputs": [], "source": [ "GLW = 1 / (1 / GLW1 + 1 / GLW12 + 1 / GLW2)" ] }, { "cell_type": "markdown", "id": "760164d6-ad67-4326-8c5f-dbc7c2db3c36", "metadata": {}, "source": [ "*Note*: Resistances in [series or parallel](https://en.m.wikipedia.org/wiki/Series_and_parallel_circuits) can be replaced by their equivalent resistance. " ] }, { "cell_type": "markdown", "id": "bf582ff0-b249-4c75-ac60-07574b741a0a", "metadata": { "tags": [] }, "source": [ "#### Advection\n", "\n", "The [volumetric flow rate](https://en.m.wikipedia.org/wiki/Volumetric_flow_rate) of the air, in m³/s, is:\n", "\n", "$$\\dot{V}_a = \\frac{\\mathrm{ACH}}{3600} V_a$$\n", "\n", "where:\n", "- $\\mathrm{ACH}$ ([air changes per hour](https://en.m.wikipedia.org/wiki/Air_changes_per_hour)) is the air infiltration rate, 1/h;\n", "- $3600$ - number of seconds in one hour, s/h;\n", "- $V_a$ - volume of the air in the thermal zone, m³." ] }, { "cell_type": "code", "execution_count": 14, "id": "4de7fa16-19de-449b-b932-58a89ad98fb5", "metadata": {}, "outputs": [], "source": [ "# ventilation flow rate\n", "Va = l**3 # m³, volume of air\n", "ACH = 1 # air changes per hour\n", "Va_dot = ACH / 3600 * Va # m³/s, air infiltration" ] }, { "cell_type": "markdown", "id": "aa9cba86-76bc-4650-ba65-4a735ddca022", "metadata": { "tags": [] }, "source": [ "The net flow rate that the building receives by [advection](https://en.m.wikipedia.org/wiki/Advection), i.e., introducing outdoor air at temperature $T_o$ and extracting indoor air at temperature $\\theta_i$ by [ventilation](https://en.m.wikipedia.org/wiki/Ventilation_(architecture)) and/or [air infiltration](https://en.m.wikipedia.org/wiki/Infiltration_(HVAC)), is:\n", "\n", "$$q_v = \\dot{m}_a c_a (T_o - \\theta_i) = \\rho_a c_a \\dot{V}_a (T_o - \\theta_i)$$\n", "\n", "where:\n", "- $\\dot{m}_a$ is the [mass flow rate](https://en.m.wikipedia.org/wiki/Mass_flow_rate) of air, kg/s;\n", "- $\\dot{V}_a$ - [volumetric flow rate](https://en.m.wikipedia.org/wiki/Volumetric_flow_rate), m³/s;\n", "- $c_a$ - [specific heat capacity](https://en.m.wikipedia.org/wiki/Specific_heat_capacity) of the air, J/kg·K;\n", "- $\\rho_a$ - [density](https://en.m.wikipedia.org/wiki/Density) of air, kg/m³;\n", "- $T_o$ - outdoor air temperature, °C (noted in majuscule because it is a *temperature source* or *input variable*);\n", "- $\\theta_i$ - indoor air temperature, °C (noted in minuscule because it is a *dependent temperature* or *output variable*).\n", "\n", "Therefore, the conductance of [advection](https://en.m.wikipedia.org/wiki/Advection) by [ventilation](https://en.m.wikipedia.org/wiki/Ventilation_(architecture)) and/or [infiltration](https://en.m.wikipedia.org/wiki/Infiltration_(HVAC)), in W/K, is:\n", "\n", "$$G_v = \\rho_a c_a \\dot{V}_a$$" ] }, { "cell_type": "code", "execution_count": 15, "id": "12396b52-d8be-4445-8360-0f70c905d7f8", "metadata": {}, "outputs": [], "source": [ "# ventilation & advection\n", "Gv = air['Density'] * air['Specific heat'] * Va_dot" ] }, { "cell_type": "markdown", "id": "ba620d83-b3da-4adf-a7ae-6e9dc8bd1516", "metadata": {}, "source": [ "> Table 2. Typical values for the ventilation rates (in air changes per hour, ACH) as a function of the position of windows (H. Recknagel, E. Spenger, E_R Schramek (2013), Table 1.12.1-4)\n", "\n", "| Position of windows | Ventilation rate, ACH [h⁻ⁱ] |\n", "| --------------------------------------- | ---------------------- |\n", "| Window closed, doors closed | 0 to 0.5 |\n", "| Tilted window, venetian blind closed | 0.3 to 1.5 |\n", "| Tilted window, whitout venetian blind | 0.8 to 4.0 |\n", "| Window half opened | 5 to 10 |\n", "| Window fully open | 9 to 15 |\n", "| Window and French window fully open (cross ventilation) | about 40 |\n" ] }, { "cell_type": "markdown", "id": "3344af80-e018-4cb2-a01c-de4cc9b967d0", "metadata": { "tags": [] }, "source": [ "#### Proportional controller\n", "\n", "In the simplest representation, the [HVAC system](https://en.m.wikipedia.org/wiki/HVAC_control_system) can be considered as a [proportional controller](https://en.m.wikipedia.org/wiki/Proportional_control) that adjusts the heat flow rate $q_{HVAC}$ in order to control the indoor temperature $\\theta_i$ at its setpoint value $T_{i,sp}$. The heat flow-rate, in W, injected by the [HVAC](https://en.m.wikipedia.org/wiki/Heating,_ventilation,_and_air_conditioning) system into the controlled space is:\n", "\n", "$$ q_{HVAC} = K_p (T_{i, sp} - \\theta_i)$$\n", "\n", "where:\n", "- $K_p$ is the proportional gain, W/K;\n", "- $T_{i, sp}$ - indoor temperature [setpoint](https://en.m.wikipedia.org/wiki/Setpoint_(control_system)), °C (noted in majuscule because it is an *input, i.e. independent, variable*);\n", "- $\\theta_i$ - indoor temperature, °C (noted in minuscule because it is a *output, i.e. dependent variable*).\n", "\n", "This equation shows that the proportional controller can be modelled by a source of temperature, $T_{i, sp}$, and a conductance, $K_p$. If the controller gain tends towards:\n", "- infinity, $K_p \\rightarrow \\infty$, then the controller is perfect, $\\theta_i \\rightarrow T_{i, sp}$.\n", "- zero, $K_p \\rightarrow 0$, then the controller is not acting and the building is in free-running, i.e. $q_{HVAC} = 0$ ([Ghiaus 2003](https://doi.org/10.1016/S0378-7788(02)00110-X)).\n", "\n", "*Note*: Respecting the [sign convention](https://en.m.wikipedia.org/wiki/Passive_sign_convention#Active_and_passive_components), the flow rate $q_{HVAC}$ is oriented from the lower to the higher potential of the temperature source $T_{i,sp}$." ] }, { "cell_type": "code", "execution_count": 16, "id": "b2e864e6-7854-465c-8049-18967065e84f", "metadata": {}, "outputs": [], "source": [ "# P-controler gain\n", "Kp = 1e4 # almost perfect controller Kp -> ∞\n", "Kp = 1e-3 # no controller Kp -> 0\n", "Kp = 0" ] }, { "cell_type": "markdown", "id": "e983632f-041d-4066-a00a-74a2f1bbe18b", "metadata": { "tags": [] }, "source": [ "#### Conductances in series and/or parallel\n", "If conductances are connected to temperature nodes which have no capacity and/or flow rate source, then the conductances can be considered in [series or parallel](https://en.m.wikipedia.org/wiki/Series_and_parallel_circuits) (depending on the connection). Let's consider, for example, the outdoor side of the glass window (Figure 3): the outdoor convection conductance and the conduction conductance (corresponding to half of the width of the glass) are in series:\n", "\n", "$$ G_{gs} = \\frac{1}{1/G_{g,cv.out } + 1/(2 G_{g,cd})} = \n", "\\frac{1}{\\frac{1}{h_{out} S_g} + \\frac{w / 2}{\\lambda S_g}}\n", "$$" ] }, { "cell_type": "code", "execution_count": 17, "id": "00673392-3443-4a45-8772-2533b07bfe51", "metadata": {}, "outputs": [], "source": [ "# glass: convection outdoor & conduction\n", "Ggs = float(1 / (1 / Gg.loc['h', 'out'] + 1 / (2 * G_cd['Glass'])))" ] }, { "cell_type": "markdown", "id": "096daa39-110e-4e99-bab0-00dabab6d17b", "metadata": { "tags": [] }, "source": [ "### Thermal capacities\n", "#### Walls\n", "The [thermal capacities](https://en.m.wikipedia.org/wiki/Heat_capacity) of the wall, in J/kg, are:\n", "\n", "$$C_w= m_w c_w= \\rho_w c_w w_w S_w$$\n", "\n", "where:\n", "- $m_w = \\rho_w w_w S_w$ is the mass of the wall, kg;\n", "- $c_w$ - [specific heat capacity](https://en.m.wikipedia.org/wiki/Specific_heat_capacity), J/(kg⋅K);\n", "- $\\rho_w$ - [density](https://en.m.wikipedia.org/wiki/Density), kg/m³;\n", "- $w_w$ - width of the wall, m;\n", "- $S_w$ - surface area of the wall, m²." ] }, { "cell_type": "code", "execution_count": 18, "id": "069c5751-493f-46a9-9d62-d415c8c86c36", "metadata": {}, "outputs": [], "source": [ "C = wall['Density'] * wall['Specific heat'] * wall['Surface'] * wall['Width']" ] }, { "cell_type": "markdown", "id": "c2d7d457-941e-43bf-acb5-59598eaec544", "metadata": { "tags": [] }, "source": [ "#### Air\n", "Similarly, the thermal capacity of the air, in J/kg, is:\n", "\n", "$$C_a = m_a c_a = \\rho_a c_a V_a$$\n", "\n", "where:\n", "- $m_a = \\rho_a V_a$ is the mass of the air, kg;\n", "- $\\rho_w$ - [density](https://en.m.wikipedia.org/wiki/Density) of air, kg/m³;\n", "- $c_a$ - specific heat capacity of the air, J/(kg⋅K);\n", "- $V_a$ - volume of the air in the thermal zone, m³." ] }, { "cell_type": "code", "execution_count": 19, "id": "5ad5ddf7-6842-4ad5-adf0-61081c440ef1", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>Capacity</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>Layer_out</th>\n", " <td>18216000.0</td>\n", " </tr>\n", " <tr>\n", " <th>Layer_in</th>\n", " <td>239580.0</td>\n", " </tr>\n", " <tr>\n", " <th>Glass</th>\n", " <td>1089000.0</td>\n", " </tr>\n", " <tr>\n", " <th>Air</th>\n", " <td>32400.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Capacity\n", "Layer_out 18216000.0\n", "Layer_in 239580.0\n", "Glass 1089000.0\n", "Air 32400.0" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C['Air'] = air['Density'] * air['Specific heat'] * Va\n", "pd.DataFrame(C, columns=['Capacity'])" ] }, { "cell_type": "markdown", "id": "9519c7be-a11b-46cc-b253-c843122e1f8d", "metadata": {}, "source": [ "### Temperature sources\n", "\n", "The [temperature sources](https://en.m.wikipedia.org/wiki/Voltage_source#Ideal_voltage_sources) model temperatures which vary independently of what happens in the themal circuit; they are inputs of the physical model. Generally, the temperature sources are:\n", "- outdoor air and ground temperature;\n", "- temperature of adjacent spaces which have controlled temperature;\n", "- setpoint temperature." ] }, { "cell_type": "markdown", "id": "f12176f0-3744-4a96-8f92-e9253e4d6e34", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ "#### Outdoor air and ground temperature\n", "The hourly values of outdoor temperatures can be obtained from weather data files downloadable from the [Repository of free climate data for building performance simulation](http://climate.onebuilding.org) or from [Weather data for EnergyPlus®](https://energyplus.net/weather) (see the tutorial on [Weather data and solar radiation](01WeatherData.ipynb))." ] }, { "cell_type": "markdown", "id": "88477ba9-030d-49c5-881a-7457ece60d23", "metadata": {}, "source": [ "#### Adjacent spaces with controlled temperature\n", "\n", "If the adjacent spaces are controlled by a HVAC system, it means that their temperature can be considered independent of the studied thermal zone(s); therefore, they can be modelled by a temperature source." ] }, { "cell_type": "markdown", "id": "5be6f99c-ea56-410b-b123-655dd53a0c8a", "metadata": { "tags": [] }, "source": [ "#### Setpoint temperature\n", "\n", "[Setpoint](https://en.m.wikipedia.org/wiki/Setpoint_(control_system)) temperature does not depend on the heat transfer processes of the analyzed thermal zone. If the HVAC system can deliver the heat flow rate:\n", "\n", "$$ q_{HVAC} = K_p (T_{i, sp} - \\theta_i)$$\n", "\n", "where:\n", "- $K_p$ is the proportional gain, W/K;\n", "- $T_{i, sp}$ - indoor temperature [setpoint](https://en.m.wikipedia.org/wiki/Setpoint_(control_system)), °C;\n", "- $\\theta_i$ - indoor temperature, °C,\n", "\n", "then the setpoint for indoor temperature, $T_{i, sp}$, may be modelled by a source of temperature." ] }, { "cell_type": "markdown", "id": "2f59b264-6a45-428e-a9c6-00132387bd75", "metadata": { "tags": [] }, "source": [ "### Heat flow rate sources\n", "The [heat flow rate sources](https://en.m.wikipedia.org/wiki/Current_source#Background) model flow rates which vary idependently of what happens in the themal circuit. They are inputs of the physical model. Generally, the heat flow rate sources are:\n", "- solar radiation absorbed by the walls;\n", "- internal auxiliary sources." ] }, { "cell_type": "markdown", "id": "f4e620b1-b31b-4a70-96ea-bc1dc4943707", "metadata": { "tags": [] }, "source": [ "#### Solar radiation absorbed by the walls\n", "\n", "The [direct](https://en.m.wikipedia.org/wiki/Direct_insolation), diffuse and reflected components of the [solar radiation](https://en.m.wikipedia.org/wiki/Solar_irradiance) on a tilted surface can be estimated from weather data by using the function `sol_rad_tilt_surf` from the module `dm4bem` (see the tutorial on [Weather data and solar radiation](../t01/t01ReadWeatherData.ipynb))." ] }, { "cell_type": "markdown", "id": "2a081593-6450-4c0b-b25f-929368727023", "metadata": { "tags": [] }, "source": [ "##### External wall\n", "\n", "The radiation absorbed by the outdoor surface of the wall is:\n", "\n", "$$\\Phi_o = \\alpha_{w,SW} S_w E_{tot}$$\n", "\n", "where:\n", "- $\\alpha_{w,SW}$ is the [absorptance](https://en.m.wikipedia.org/wiki/Absorptance) of the outdoor surface of the wall in short wave, $0 \\leqslant \\alpha_{w,SW} \\leqslant 1$;\n", "- $S_w$ - surface area of the wall, m²;\n", "- $E_{tot}$ - total [solar irradiance](https://en.m.wikipedia.org/wiki/Solar_irradiance) on the wall, W/m²." ] }, { "cell_type": "markdown", "id": "40f0cfba-4376-4ad5-a5ce-e9a046226a00", "metadata": { "tags": [] }, "source": [ "##### Internal walls\n", "\n", "The total shortwave incident irradiance on the wall $i$, $E_i$, may be estimated as a function of the direct solar irradiance incident on the surface of the walls, $E_{i}^{o}$:\n", "\n", "$$S_i E_i = S_i E_{i}^{o} + \\sum_{j=1}^{n} F_{j,i} S_j \\rho_j E_j$$\n", "\n", "where:\n", "- $S_i$ is the area of the surface of the wall $i$, m²;\n", "- $E_i$ - total irradiance received directly and by multiple reflections on surface $i$, W/m²;\n", "- $E_{i}^{o}$ - irradiance received directly from the sun on surface $i$, W/m²;\n", "- $F_{j, i}$ - [view factor](https://en.m.wikipedia.org/wiki/View_factor) between surface $j$ and surface $i$, $0 ⩽ F_{j,i} ⩽ 1$;\n", "- $\\rho_j$ - [reflectance](https://en.m.wikipedia.org/wiki/Reflectance) of surface $j$, $0 ⩽ \\rho_j ⩽ 1$.\n", "\n", "\n", "By taking into account the [reciprocity](https://en.m.wikipedia.org/wiki/View_factor#Reciprocity) of the view factors: $S_i F_{i,j} = S_j F_{j,i}$, the set of previous equation becomes:\n", "\n", "$$\n", "\\begin{bmatrix}\n", "1 - \\rho_1 F_{1,1} & - \\rho_2 F_{1,2} & ... & - \\rho_n F_{1,n}\\\\ \n", "- \\rho_1 F_{2,1} & 1 - \\rho_2 F_{2,2} & ... & - \\rho_n F_{2,n} \\\\ \n", "... & ... & ... & ... \\\\ \n", "- \\rho_1 F_{n,1} & - \\rho_2 F_{n,1} & ... & 1 - \\rho_n F_{n,n}\n", "\\end{bmatrix} \\begin{bmatrix}\n", "E_1\\\\ \n", "E_2\\\\ \n", "...\\\\ \n", "E_n\n", "\\end{bmatrix} = \\begin{bmatrix}\n", "E_{1}^{o}\\\\ \n", "E_{2}^{o}\\\\ \n", "...\\\\ \n", "E_{n}^{o}\n", "\\end{bmatrix}\n", "$$\n", "\n", "or\n", "\n", "$$(I - \\rho \\circ F) E = E^o$$\n", "\n", "The unknown total [irradiances](https://en.m.wikipedia.org/wiki/Irradiance) on walls, in W/m², are then\n", "\n", "$$ E = (I - \\rho \\circ F)^{-1} E^o$$\n", "\n", "where:\n", "\n", "- the symbol $\\circ$ represents the [Hadamard (or element-wise) product](https://en.wikipedia.org/wiki/Hadamard_product_(matrices));\n", "\n", "$I =\\begin{bmatrix}\n", "1 & 0 & ... & 0 \\\\ \n", "0 & 1 & ... & 0 \\\\ \n", "... & ... & ... & ...\\\\ \n", "0 & 0 & ... & 1 \n", "\\end{bmatrix}, $ is the [identity matrix](https://en.m.wikipedia.org/wiki/Identity_matrix);\n", "\n", "$\\rho = \\begin{bmatrix}\n", "\\rho_1\\\\ \n", "\\rho_2\\\\ \n", "...\\\\ \n", "\\rho_n\n", "\\end{bmatrix}$ - vector of [reflectances](https://en.m.wikipedia.org/wiki/Reflectance), $0 \\le \\rho_{i,j} \\le 1$;\n", "\n", "$F = \\begin{bmatrix}\n", "F_{1,1} & F_{1,2} & ... & F_{1,n}\\\\ \n", "F_{2,1} & F_{2,2} & ... & F_{2,n} \\\\ \n", "... & ... & ... & ...\\\\ \n", "F_{n,1} & F_{n,2} & ... & F_{n,n}\n", "\\end{bmatrix}$ - matrix of [view factors](https://en.m.wikipedia.org/wiki/View_factor), $0 \\le F_{i,j} \\le 1$;\n", "\n", "$E^o = \\begin{bmatrix}\n", "E_{1}^{o}\\\\ \n", "E_{2}^{o}\\\\ \n", "...\\\\ \n", "E_{n}^{o}\n", "\\end{bmatrix}$ - vector of [direct solar irradiances](https://en.m.wikipedia.org/wiki/Solar_irradiance), W/m²;\n", "\n", "$E = \\begin{bmatrix}\n", "E_1\\\\ \n", "E_2\\\\ \n", "...\\\\ \n", "E_n\n", "\\end{bmatrix}$ - vector of unknown total irradiances, W/m².\n", "\n", "\n", "The radiative short wave (i.e. solar) heat flow rate on each surface is:\n", "\n", "$$ \\Phi = S E $$\n", "\n", "where:\n", "\n", "$\\Phi = \\begin{bmatrix}\n", "\\Phi_1\\\\ \n", "\\Phi_2\\\\ \n", "...\\\\ \n", "\\Phi_n\n", "\\end{bmatrix}$ - vector of total heat flow rates due to solar radiation, W; \n", "\n", "$S =\\begin{bmatrix}\n", "S_1 & 0 & ... & 0 \\\\ \n", "0 & S_2 & ... & 0 \\\\ \n", "... & ... & ... & ...\\\\ \n", "0 & 0 & ... & S_n \n", "\\end{bmatrix}$ - matrix of surface areas of walls $i$, m²." ] }, { "cell_type": "markdown", "id": "55178565-8a30-4c8b-9760-6fe48a5548fc", "metadata": {}, "source": [ "#### Internal sources\n", "\n", "Internal flow rates are generated by occupants and by the electrical equipment (with values given for [offices](https://energieplus-lesite.be/theories/bilan-thermique44/charges-thermiques-internes-pour-les-bureaux/), [commercial spaces](https://energieplus-lesite.be/theories/bilan-thermique44/charges-thermiques-internes-pour-les-commerces/), etc.)." ] }, { "cell_type": "markdown", "id": "5a994858-649e-498d-8115-ad658b4c253d", "metadata": { "tags": [] }, "source": [ "## System of algebraic-differential equations (DAE)\n", "\n", "The analysis of a thermal circuit, or the direct problem ([Ghiaus 2022](https://hal.archives-ouvertes.fr/hal-03484064/document)), means to find the temperatures in the nodes, $\\theta$, and the heat flows on the branches, $q$, i.e. to solve for $\\theta$ and $q$ the system of [Differential-Algebraic Equations (DAE)](https://en.m.wikipedia.org/wiki/Differential-algebraic_system_of_equations) (Figures 3 and 4):\n", "\n", "$$\\left\\{\\begin{array}{ll}\n", "C \\dot{\\theta} = -(A^T G A) \\theta + A^T G b + f\\\\ \n", "q = G (-A \\theta + b)\n", "\\end{array}\\right.$$\n", "\n", "where:\n", "- $\\theta$ is the temperature vector of size $n_\\theta$ equal to the number of nodes;\n", "- $q$ - heat flow vector of size $n_q$ equal to the number of branches;\n", "- $A$ - [incidence matrix](https://en.m.wikipedia.org/wiki/Incidence_matrix) of size $n_q$ rows and $n_{\\theta}$ columns, where $n_q$ is the number of flow branches and $n_{\\theta}$ is the number of temperature nodes. It shows how the temperature nodes are connected by oriented branches of heat flows:\n", " - if flow *m* enters into node *n*, then the element (*m, n*) of the matrix $A$ is 1, i.e., $A_{m,n} = 1$;\n", " - if flow *m* exits from node *n*, then the element (*m, n*) of the matrix $A$ is -1, i.e., $A_{m,n} = -1$, ; \n", " - if flow *m* is not connected to node *n*, then the element (*m, n*) of the matrix $A$ is 0, i.e., $A_{m,n} = 0$.\n", "\n", "- $G$ - conductance diagonal matrix of size $n_q \\times n_q$, where $n_q$ is the number of flow branches: diagonal matrix containing the conductances. Each branch $k$ needs to contain a conductance $0 < G_{k,k} < \\infty $. \n", "\n", "- $C$ - capacity diagonal matrix of size $n_θ \\times n_θ$, where $n_θ$ is the number of temperature nodes: diagonal matrix containing the capacities. If there is no capacity in the node *n*, then $C_{n, n} = 0$.\n", "\n", "- $b$ - temperature source vector of size $n_q$: if there is no temperature source on the branch *m*, then $b_m = 0$.\n", "\n", "- $f$ - heat flow source vector of size $n_θ$: if there is no heat flow source in the node *n*, then $f_n = 0$.\n", "\n", "The resolution is first done for temperatures, $\\theta$, by solving the equation\n", "$$C \\dot{\\theta} = -(A^T G A) \\theta + A^T G b + f$$\n", "which, generally, is a system of differential-algebraic equations (DAE). Then, the heat flow rates are found from the equation\n", "$$q = G (-A \\theta + b)$$\n", "\n", "\n", "> Figure 6. Matrices of the system of Differential-Algebraic Equations (DAE) \n", "\\begin{aligned}\n", " &C \\dot{\\theta} = -(A^T G A) \\theta + A^T G b + f \\\\\n", " &q = G (-A \\theta + b)\n", "\\end{aligned}" ] }, { "cell_type": "markdown", "id": "e0eeaa18-4cbb-4ac3-b7e9-98b3edbb863f", "metadata": {}, "source": [ "### A: incidence matrix\n", "\n", "The [incidence matrix](https://en.m.wikipedia.org/wiki/Incidence_matrix) is:\n", "\n", "$A_{kl} = \\begin{cases}\\phantom{-}\n", "0 & \\text{if branch } q_k \\text{ is not connected to node } \\theta_l \\\\ \n", "+1 & \\text{if branch } q_k \\text{ enters into node } \\theta_l\\\\ \n", "-1 & \\text{if branch } q_k \\text{ gets out of node } \\theta_l \n", "\\end{cases}$\n", "\n", "For the themal circuit shown in Figure 3,\n", "\n", "$ A = \\begin{cases}\n", "A_{0,0} = 1\\\\ \n", "A_{1,0} = -1, A_{1,1} = 1\\\\ \n", "...\\\\\n", "A_{11,6} = 1\\\\\n", "\\end{cases}$" ] }, { "cell_type": "code", "execution_count": 20, "id": "beaddf90-558e-45e4-a912-f5db92f2430a", "metadata": {}, "outputs": [], "source": [ "A = np.zeros([12, 8]) # n° of branches X n° of nodes\n", "A[0, 0] = 1 # branch 0: -> node 0\n", "A[1, 0], A[1, 1] = -1, 1 # branch 1: node 0 -> node 1\n", "A[2, 1], A[2, 2] = -1, 1 # branch 2: node 1 -> node 2\n", "A[3, 2], A[3, 3] = -1, 1 # branch 3: node 2 -> node 3\n", "A[4, 3], A[4, 4] = -1, 1 # branch 4: node 3 -> node 4\n", "A[5, 4], A[5, 5] = -1, 1 # branch 5: node 4 -> node 5\n", "A[6, 4], A[6, 6] = -1, 1 # branch 6: node 4 -> node 6\n", "A[7, 5], A[7, 6] = -1, 1 # branch 7: node 5 -> node 6\n", "A[8, 7] = 1 # branch 8: -> node 7\n", "A[9, 5], A[9, 7] = 1, -1 # branch 9: node 5 -> node 7\n", "A[10, 6] = 1 # branch 10: -> node 6\n", "A[11, 6] = 1 # branch 11: -> node 6\n", "\n", "# np.set_printoptions(suppress=False)\n", "# pd.DataFrame(A)" ] }, { "cell_type": "markdown", "id": "2c2db9a2-e612-4077-8cb1-9f14a3111fb2", "metadata": {}, "source": [ "### G: conductance matrix\n", "\n", "The conductance matrix of the themal circuit shown in Figure 3 is diagonal:\n", "\n", "$ G = \\begin{cases}\n", "G_{0,0} = G_{w,out} & \\text{convection outside surface of the wall}\\\\ \n", "G_{1,1} = G_{2,2} = 2G_{cd,Layer\\,out} & \\text{conduction in half width of the outer layer}\\\\ \n", "G_{3,3} = G_{4,4} = 2G_{cd,Layer\\,in} & \\text{conduction in half width of the inner layer}\\\\ \n", "G_{5,5} = G_{LW} & \\text{long-wave radiation walls - window}\\\\\n", "G_{6,6} = G_{w,in} & \\text{convection inside surface of the wall}\\\\\n", "G_{7,7} = G_{g,in} & \\text{convection inside surface of the glass}\\\\\n", "G_{8,8} = G_{gs} & \\text{convection outside surface of the glass}\\\\ & \\text{and conduction in half width of the glass}\\\\\n", "G_{9,9} = 2G_{cd,glass} & \\text{conduction in half width of the glass}\\\\\n", "G_{10,10} = G_v & \\text{advection by ventilation}\\\\\n", "G_{11,11} = K_p & \\text{gain of proportional controller}\n", "\\end{cases}$" ] }, { "cell_type": "code", "execution_count": 21, "id": "8c53e123-581d-40bd-8be5-0013a4b8e74f", "metadata": {}, "outputs": [], "source": [ "G = np.diag(np.hstack(\n", " [Gw['out'],\n", " 2 * G_cd['Layer_out'], 2 * G_cd['Layer_out'],\n", " 2 * G_cd['Layer_in'], 2 * G_cd['Layer_in'],\n", " GLW,\n", " Gw['in'],\n", " Gg['in'],\n", " Ggs,\n", " 2 * G_cd['Glass'],\n", " Gv,\n", " Kp]))\n", "\n", "# np.set_printoptions(precision=3, threshold=16, suppress=True)\n", "# pd.set_option(\"display.precision\", 1)\n", "# pd.DataFrame(G)" ] }, { "cell_type": "markdown", "id": "0d0d7f02-bc07-497f-a66b-0f07682530fb", "metadata": {}, "source": [ "### C: capacity matrix\n", "\n", "The capacity matrix of the themal circuit shown in Figure 3 is diagonal:\n", "\n", "$ C = \\begin{cases}\n", "C_{1,1} = C_{Layer\\,out} & \\text{outer layer of the wall}\\\\ \n", "C_{3,3} = C_{Layer\\,in} & \\text{inner layer of the wall}\\\\ \n", "C_{6,6} = C_{Air} & \\text{air of the room}\\\\ \n", "C_{7,7} = C_{Glass} & \\text{glass of the windows}\\\\\n", "\\end{cases}$\n", "\n", "The thermal capacities of the air and of the glass can be neglected or not." ] }, { "cell_type": "code", "execution_count": 22, "id": "ca2b5a02-7d8e-4292-8a91-46a4ffcc3200", "metadata": {}, "outputs": [], "source": [ "neglect_air_glass = False\n", "\n", "if neglect_air_glass:\n", " C = np.diag([0, C['Layer_out'], 0, C['Layer_in'], 0, 0,\n", " 0, 0])\n", "else:\n", " C = np.diag([0, C['Layer_out'], 0, C['Layer_in'], 0, 0,\n", " C['Air'], C['Glass']])\n", "\n", "# pd.set_option(\"display.precision\", 3)\n", "# pd.DataFrame(C)" ] }, { "cell_type": "markdown", "id": "efedaf69-3d44-427b-8901-0a68be3edabd", "metadata": { "tags": [] }, "source": [ "### b: temperature source vector\n", "\n", "The vector of *temperature sources* is $b$, of size $n_q$, the number of branches (in this example 12). An element of the vector $b$ corresponding to a branch without a source is zero. If the flow in a source is from the low potential to the high potential of the source (i.e. from - to +), then the source is positive. If the flow rate in the temperature source is from high potential to low potential (i.e. from + to -), then the source is negative (see [passive sign convention](https://en.m.wikipedia.org/wiki/Passive_sign_convention)). \n", "\n", "For the thermal circuit shown in Figure 3,\n", "\n", "$$b = [\\begin{matrix}\n", "T_o &0 &0 &0 &0 &0 &0 &0 &T_o &0 &T_o &T_{i,sp} \n", "\\end{matrix}]^T$$\n", "\n", "i.e. $b_0 = b_8 = b_{10} = T_o$ and $b_{11} = T_{i,sp}$ where:\n", "- $T_o$ is the outdoor temperature, °C;\n", "- $T_{i,sp}$ - set-point temperaure for the indoor air, °C.\n", "\n", "Since the temperature sorces $T_o$ and $T_{i,sp}$ are [time series](https://en.m.wikipedia.org/wiki/Time_series), in vector $b$ the branches which contain temperature sources are designated by $1$ and the branches without any temeprature source by $0$." ] }, { "cell_type": "code", "execution_count": 23, "id": "26aab83c-5ed8-427a-8ec2-afdf98923cbf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b = [1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 1.]\n" ] } ], "source": [ "b = np.zeros(12) # branches\n", "b[[0, 8, 10, 11]] = 1 # branches with temperature sources\n", "print(f'b = ', b)" ] }, { "cell_type": "markdown", "id": "236ad1c6-64ac-4e42-b7cb-46be011ccc75", "metadata": { "tags": [] }, "source": [ "### f: heat flow source vector\n", "\n", "The vector of *heat sources* is $f$, of size $n_{\\theta}$, the number of nodes (in this example 8). An element of the vector $f$ corresponding to a node without a heat source is zero.\n", "\n", "For the thermal circuit shown in Figure 3,\n", "\n", "$$f = [\\begin{matrix}\n", "\\Phi_o &0 &0 &0 &\\Phi_i &0 &\\dot{Q_a} &\\Phi_a \n", "\\end{matrix}]^T$$\n", "\n", "i.e. $f_0 = \\Phi_o$, $f_4 = \\Phi_i$, $f_6 = \\dot{Q_a}$, and $f_7 = \\Phi_a$, where:\n", "- $\\Phi_o$ - solar radiation absorbed by the outdoor surface of the wall, W;\n", "- $\\Phi_i$ - solar radiation absorbed by the indoor surface of the wall, W;\n", "- $\\dot{Q}_a$ - auxiliary heat gains (i.e., occupants, electrical devices, etc.), W;\n", "- $\\Phi_a$ - solar radiation absorbed by the glass, W.\n", "\n", "Since the flow rate sorces $\\Phi_o$, $\\Phi_i$, $\\dot{Q}_a$ and $\\Phi_a$ are [time series](https://en.m.wikipedia.org/wiki/Time_series), in vector $f$ the nodes which contain flow rate sources are designated by $1$ and the nodes without any flow rate source by $0$." ] }, { "cell_type": "code", "execution_count": 24, "id": "0879a889-03f1-4858-b039-014ba391197d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "f = [1. 0. 0. 0. 1. 0. 1. 1.]\n" ] } ], "source": [ "f = np.zeros(8) # nodes\n", "f[[0, 4, 6, 7]] = 1 # nodes with heat-flow sources\n", "print(f'f = ', f)" ] }, { "cell_type": "markdown", "id": "5dee59ff-9153-498a-ab9b-a1bedb6b5d35", "metadata": { "tags": [] }, "source": [ "### y: output vector\n", "\n", "The vector of outputs is $y$, of size $n_{\\theta}$, the number of nodes (in this example 8). The non-zero values of $y$ indicate the nodes which are the outputs of the model.\n", "\n", "For the thermal circuit shown in Figure 3, if the output is the indoor air temperature, then the output vector is:\n", "\n", "$$y = [\\begin{matrix}\n", "0 &0 &0 &0 &0 &0 &\\theta_6 &0 \n", "\\end{matrix}]^T$$\n", "\n", "In vector $y$, the nodes for which the temperatures are outputs are noted by $1$ and the other nodes by $0$." ] }, { "cell_type": "code", "execution_count": 25, "id": "19fe1e2e-15aa-4739-9524-8003117eac45", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "y = [0. 0. 0. 0. 0. 0. 1. 0.]\n" ] } ], "source": [ "y = np.zeros(8) # nodes\n", "y[[6]] = 1 # nodes (temperatures) of interest\n", "print(f'y = ', y)" ] }, { "cell_type": "markdown", "id": "966dd727-c0b3-4c10-b458-6b3383219905", "metadata": { "tags": [] }, "source": [ "## State-space representation\n", "The [differential-algebraic system of equations (DAE)](https://en.m.wikipedia.org/wiki/Differential-algebraic_system_of_equations)\n", "\n", "$$C \\dot{\\theta} = -(A^T G A) \\theta + A^T G b + f$$\n", "\n", "is transformed in [state-space representation](https://en.m.wikipedia.org/wiki/State-space_representation) ([Ghiaus 2013](https://hal.archives-ouvertes.fr/hal-03605823/document)):\n", "\n", "$$\\left\\{\\begin{array}{rr}\n", "\\dot{\\theta}_s=A_s \\theta_s + B_s u\\\\ \n", "y = C_s \\theta_s + D_s u\n", "\\end{array}\\right.$$\n", "\n", "where:\n", "- $\\theta_s$ is the vector of state variables which are the temperatures of nodes containing capacities; the elements are in the same order as in the vector of temperatures, $\\theta$; its dimension, $\\dim \\theta_s$, is equal to the number of capacities from the thermal network; for the circuit presented in Figure 3, $\\theta_s = [\\theta_1, \\theta_3, \\theta_6, \\theta_7]^T$;\n", "\n", "- $u = \\begin{bmatrix} b_T \\\\ f_Q\\end{bmatrix}$ - vector of inputs of dimension $\\dim u$ equal to the number of sources (of temperaure, $b_T$, and heat flows, $f_Q$) of the thermal network, where:\n", "\n", " - vector $b_T$ of nonzero elements of vector $b$ of temperature sources; for the circuit presented in Figure 3, $b_T = [T_o, T_o, T_o, T_{i,sp}]^T$ corresponds to branches 0, 8, 10 and 11; \n", " - vector $f_Q$ of nonzero elements of vector $f$ of flow sources; for the circuit presented in Figure 3, $f_Q = [\\Phi_o, \\Phi_i, \\dot{Q}_a, \\Phi_a]^T$ corresponds to nodes 0, 4, 6, and 7;\n", " \n", "- $y$ - vector of outputs, a subset of vector $\\theta$ representing temperature nodes which are of interest; for the circuit presented in Figure 3, $y = \\theta_6$, the indoor temperature.\n", "\n", "- $A_s$ - state matrix, of dimension $\\dim A_s = \\dim {\\theta_s} \\times \\dim {\\theta_s}$;\n", "\n", "- $B_s$ - input matrix, of dimension $\\dim B_s = \\dim {\\theta_s} \\times \\dim u$;\n", "\n", "- $C_s$ - output matrix, of dimension $\\dim C_s = \\dim y \\times \\dim {\\theta_s}$;\n", "\n", "- $D_s$ - feedthrough (or feedforward) matrix, of dimension $\\dim D_s = \\dim y \\times \\dim u$.\n", "\n", "*Note*: The subscript $s$ of the matrices $A_s, B_s, C_s, D_s$ is used to differentiante the matrices $A_s, C_s$ of the state-space represenation of the matrices $A, C$ of the system of DAE." ] }, { "cell_type": "markdown", "id": "c70c3d14-d402-4fb5-a7d0-18a83f556c97", "metadata": { "tags": [] }, "source": [ "The [state-space representation](https://en.m.wikipedia.org/wiki/State-space_representation), i.e., matrices $A_s, B_s, C_s, D_s$ is obtained from the system of DAE, i.e., matrices and vectors $A, G, b, C, f, y$ ([Ghiaus 2013](https://hal.archives-ouvertes.fr/hal-03605823/document))." ] }, { "cell_type": "code", "execution_count": 26, "id": "23c9de06-8be7-4dff-a734-027c31349e27", "metadata": {}, "outputs": [], "source": [ "[As, Bs, Cs, Ds] = dm4bem.tc2ss(A, G, C, b, f, y)\n", "θs = ['θ1', 'θ3', 'θ6', 'θ7'] # state temperature nodes\n", "uT = ['q0', 'q8', 'q10', 'q11'] # temperature sources\n", "uQ = ['θ0', 'θ4', 'θ6', 'θ7'] # flow sources\n", "u = uT + uQ # inputs\n", "y = ['θ6'] # output" ] }, { "cell_type": "code", "execution_count": 27, "id": "d2d9e0fb-a580-4747-8309-fb779eef9c9a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>θ1</th>\n", " <th>θ3</th>\n", " <th>θ6</th>\n", " <th>θ7</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>θ1</th>\n", " <td>-0.000024</td>\n", " <td>0.000002</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " </tr>\n", " <tr>\n", " <th>θ3</th>\n", " <td>0.000121</td>\n", " <td>-0.000239</td>\n", " <td>0.000107</td>\n", " <td>0.000011</td>\n", " </tr>\n", " <tr>\n", " <th>θ6</th>\n", " <td>0.000000</td>\n", " <td>0.000790</td>\n", " <td>-0.003925</td>\n", " <td>0.002857</td>\n", " </tr>\n", " <tr>\n", " <th>θ7</th>\n", " <td>0.000000</td>\n", " <td>0.000002</td>\n", " <td>0.000085</td>\n", " <td>-0.000240</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " θ1 θ3 θ6 θ7\n", "θ1 -0.000024 0.000002 0.000000 0.000000\n", "θ3 0.000121 -0.000239 0.000107 0.000011\n", "θ6 0.000000 0.000790 -0.003925 0.002857\n", "θ7 0.000000 0.000002 0.000085 -0.000240" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(As, index=θs, columns=θs)" ] }, { "cell_type": "code", "execution_count": 28, "id": "45f01493-c24a-4721-87cd-3b8a041ecfe8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>q0</th>\n", " <th>q8</th>\n", " <th>q10</th>\n", " <th>q11</th>\n", " <th>θ0</th>\n", " <th>θ4</th>\n", " <th>θ6</th>\n", " <th>θ7</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>θ1</th>\n", " <td>0.000022</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>0.0</td>\n", " <td>1.970654e-08</td>\n", " <td>0.000000e+00</td>\n", " <td>0.000000</td>\n", " <td>0.000000e+00</td>\n", " </tr>\n", " <tr>\n", " <th>θ3</th>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>0.0</td>\n", " <td>0.000000e+00</td>\n", " <td>2.931594e-07</td>\n", " <td>0.000000</td>\n", " <td>0.000000e+00</td>\n", " </tr>\n", " <tr>\n", " <th>θ6</th>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>0.000278</td>\n", " <td>0.0</td>\n", " <td>0.000000e+00</td>\n", " <td>2.600003e-05</td>\n", " <td>0.000031</td>\n", " <td>0.000000e+00</td>\n", " </tr>\n", " <tr>\n", " <th>θ7</th>\n", " <td>0.000000</td>\n", " <td>0.000152</td>\n", " <td>0.000000</td>\n", " <td>0.0</td>\n", " <td>0.000000e+00</td>\n", " <td>8.022402e-08</td>\n", " <td>0.000000</td>\n", " <td>9.182736e-07</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " q0 q8 q10 q11 θ0 θ4 θ6 \\\n", "θ1 0.000022 0.000000 0.000000 0.0 1.970654e-08 0.000000e+00 0.000000 \n", "θ3 0.000000 0.000000 0.000000 0.0 0.000000e+00 2.931594e-07 0.000000 \n", "θ6 0.000000 0.000000 0.000278 0.0 0.000000e+00 2.600003e-05 0.000031 \n", "θ7 0.000000 0.000152 0.000000 0.0 0.000000e+00 8.022402e-08 0.000000 \n", "\n", " θ7 \n", "θ1 0.000000e+00 \n", "θ3 0.000000e+00 \n", "θ6 0.000000e+00 \n", "θ7 9.182736e-07 " ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(Bs, index=θs, columns=u)" ] }, { "cell_type": "code", "execution_count": 29, "id": "2742fa42-e6f3-44da-9a70-77276a1ebb3b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>θ1</th>\n", " <th>θ3</th>\n", " <th>θ6</th>\n", " <th>θ7</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>θ6</th>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " θ1 θ3 θ6 θ7\n", "θ6 0.0 0.0 1.0 0.0" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(Cs, index=y, columns=θs)" ] }, { "cell_type": "code", "execution_count": 30, "id": "2b089013-2490-48e5-85cf-8434de74c602", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>q0</th>\n", " <th>q8</th>\n", " <th>q10</th>\n", " <th>q11</th>\n", " <th>θ0</th>\n", " <th>θ4</th>\n", " <th>θ6</th>\n", " <th>θ7</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>θ6</th>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " q0 q8 q10 q11 θ0 θ4 θ6 θ7\n", "θ6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(Ds, index=y, columns=u)" ] }, { "cell_type": "markdown", "id": "5aacac92-0397-464e-8217-912bf5ad7091", "metadata": { "tags": [] }, "source": [ "## Steady-state\n", "[Steady-state](https://en.m.wikipedia.org/wiki/Steady_state) means that the term $C \\dot \\theta = 0$ in the system of DAE.\n", "\n", "In [steady-state](https://en.m.wikipedia.org/wiki/Steady_state), the model can be checked if it is incorrect. Let's consider that:\n", "- the controller is not active, $K_p \\rightarrow 0$,\n", "- the outdoor temperature is $T_o = 10 \\, \\mathrm{^\\circ C}$,\n", "- the indoor temperature setpoint is $T_{i,sp} = 20 \\, \\mathrm{^\\circ C}$,\n", "- all flow rate sources are zero." ] }, { "cell_type": "code", "execution_count": 31, "id": "057d723f-cec3-479f-988d-c02e4359d3b1", "metadata": {}, "outputs": [], "source": [ "b = np.zeros(12) # temperature sources\n", "b[[0, 8, 10]] = 10 # outdoor temperature\n", "b[[11]] = 20 # indoor set-point temperature\n", "\n", "f = np.zeros(8) # flow-rate sources" ] }, { "cell_type": "markdown", "id": "528c0234-44d8-4f99-97b9-b43615af5761", "metadata": { "tags": [] }, "source": [ "*Note*: Steady-state analysis is a test of [falsification (refutability)](https://en.m.wikipedia.org/wiki/Falsifiability) of the model, not a [verification and validation](https://en.m.wikipedia.org/wiki/Verification_and_validation). If the model does not pass the steady-state test, it means that it is wrong. If the model passes the steady-state test, it does not mean that it is correct. For example, the values of the capacities in matrix $C$ or of the conductances in matrix $G$ can be wrong even when the steady-state test is passed. " ] }, { "cell_type": "markdown", "id": "2d9fe093-30f3-4654-8836-c69b5c4215a3", "metadata": { "tags": [] }, "source": [ "### Steady-state from differential algebraic equations (DAE)\n", "The value of temperature in [steady-state](https://en.m.wikipedia.org/wiki/Steady_state) is obtained from the system of DAE by considering that $C \\dot{\\theta} = 0$:\n", "\n", "$$\\theta_{ss} = (A^T G A)^{-1}(A^T G b + f)$$\n", "\n", "For the conditions mentioned above, in steady-state, all temperatures $\\theta_0 ... \\theta_7$, including the indoor air temperature $\\theta_6$, are equal to $T_o = 10 \\, \\mathrm{^\\circ C}$." ] }, { "cell_type": "code", "execution_count": 32, "id": "a5612549-466d-4f50-93ce-09b1834a6164", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "θ = [10. 10. 10. 10. 10. 10. 10. 10.] °C\n" ] } ], "source": [ "θ = np.linalg.inv(A.T @ G @ A) @ (A.T @ G @ b + f)\n", "print(f'θ = {θ} °C')" ] }, { "cell_type": "markdown", "id": "a29cd51c-08bf-4395-a070-d2c074eee82d", "metadata": { "tags": [] }, "source": [ "### Steady-state from state-space representation\n", "The input vector $u$ is obtained by stacking the vectors $b_T$ and $f_Q$:\n", "\n", "$$u = \\begin{bmatrix} b_T \\\\ f_Q\\end{bmatrix}$$\n", "\n", "where:\n", "- $b_T$ is a vector of the nonzero elements of vector $b$ of temperature sources. For the circuit presented in Figure 3, $b_T = [T_o, T_o, T_o, T_{i,sp}]^T$ corresponding to branches 0, 8, 10 and 11, where:\n", " - $T_o$ - outdoor temperature, °C;\n", " - $T_{i,sp}$ - set-point temperaure for the indoor air, °C.\n", "- $f_Q$ - vector the nonzero elements of vector $f$ of flow sources. For the circuit presented in Figure 3, $f_Q = [\\Phi_o, \\Phi_i, \\dot{Q}_a, \\Phi_a]^T$ corresponding to nodes 0, 4, 6, and 7, where:\n", " - $\\Phi_o$ - solar radiation absorbed by the outdoor surface of the wall, W;\n", " - $\\Phi_i$ - solar radiation absorbed by the indoor surface of the wall, W;\n", " - $\\dot{Q}_a$ - auxiliary heat gains (i.e., occupants, electrical devices, etc.), W;\n", " - $\\Phi_a$ - solar radiation absorbed by the glass, W.\n", "\n", "*Note*: Zero in vectors $b$ and $f$ indicates that there is no source on the branch or in the node, respectively. However, a source can have the value zero." ] }, { "cell_type": "code", "execution_count": 33, "id": "3780da0d-8598-4f86-bb83-fc64e91fede7", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "u = [10 10 10 20 0 0 0 0]\n" ] } ], "source": [ "bT = np.array([10, 10, 10, 20]) # [To, To, To, Tisp]\n", "fQ = np.array([0, 0, 0, 0]) # [Φo, Φi, Qa, Φa]\n", "u = np.hstack([bT, fQ])\n", "print(f'u = {u}')" ] }, { "cell_type": "markdown", "id": "bcbf9e6a-a765-47ee-aaab-f8a4f61592e9", "metadata": { "tags": [] }, "source": [ "The steady-state value of the output of the state-space representation is obtained when $\\dot \\theta_{C} = 0$:\n", "\n", "$$y_{ss} = (-C_s A_s^{-1} B_s + D_s) u$$" ] }, { "cell_type": "code", "execution_count": 34, "id": "219ac224-2586-48e6-8424-29dcc399eada", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "yss = [10.] °C\n" ] } ], "source": [ "yss = (-Cs @ np.linalg.inv(As) @ Bs + Ds) @ u\n", "print(f'yss = {yss} °C')" ] }, { "cell_type": "markdown", "id": "08a89aa8-1970-4f33-ae6c-5ee9f6e08eb8", "metadata": {}, "source": [ "The error between the steady-state values obtained from the system of DAE, $\\theta_6$, and the output of the state-space representation, $y_{ss}$, \n", "\n", "$$\\varepsilon = \\left | \\theta_6 - y_{ss} \\right |$$\n", "\n", "is practically zero; the slight difference is due to [numerical errors](https://en.m.wikipedia.org/wiki/Numerical_error)." ] }, { "cell_type": "code", "execution_count": 35, "id": "87a59afc-9c44-4f8b-9df7-22acfce592b4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Max error between DAE and state-space: 8.88e-15 °C\n" ] } ], "source": [ "print(f'Max error between DAE and state-space: \\\n", "{max(abs(θ[6] - yss)):.2e} °C')" ] }, { "cell_type": "markdown", "id": "747a5518-38c0-429a-9fbe-22154079afd1", "metadata": { "tags": [] }, "source": [ "## Dynamic simulation" ] }, { "cell_type": "markdown", "id": "9c0d162e-389e-4de3-b59f-76580adb72ea", "metadata": { "tags": [] }, "source": [ "### Time step\n", "\n", "The condition for [numerical stability](https://en.m.wikipedia.org/wiki/Euler_method#Numerical_stability) of [Euler explicit integration](https://en.m.wikipedia.org/wiki/Numerical_methods_for_ordinary_differential_equations#Euler_method) method is\n", "\n", "$$\\left | \\lambda_i \\Delta t + 1 \\right | < 1, \\forall \\lambda_i, $$\n", "\n", "i.e. in the complex plane, $\\lambda_i \\Delta t$ is inside a circle of radius 1 centered in {-1, 0j}, where:\n", "- $\\lambda_i$ are the eigenvalues of matrix $A_s$,\n", "- $\\Delta t$ - time step.\n", "\n", "For positive real eigenvalues $\\left \\{ \\lambda \\in \\Re |\\lambda >0 \\right \\}$, which is the case of thermal networks, the above condition [becomes](http://www.math.iit.edu/~fass/478578_Chapter_4.pdf)\n", "\n", "$$- \\lambda_i \\Delta t - 1 < 1, \\forall \\lambda_i, $$\n", "\n", "or\n", "\n", "$$ 0 < \\Delta t < -\\frac{2}{\\min \\lambda_i} = 2 \\min -\\frac{1}{\\lambda_i} = 2 \\min T_i$$\n", "\n", "where $T_i$ are the [time constants](https://en.m.wikipedia.org/wiki/Time_constant), $T_i = - \\frac{1}{\\lambda_i} $" ] }, { "cell_type": "code", "execution_count": 36, "id": "df463621-1d41-4c2b-bc4d-68199da29c47", "metadata": {}, "outputs": [], "source": [ "λ = np.linalg.eig(As)[0] # eigenvalues of matrix As\n", "λ = np.sort(λ)" ] }, { "cell_type": "code", "execution_count": 37, "id": "684f7b6e-4df7-440b-b3ce-a90fa8136f55", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time constants:\n", "['249.30 s', '4093.20 s', '6729.11 s', '44033.06 s']\n", "\n", "2 x Time constants:\n", "['498.60 s', '8186.41 s', '13458.22 s', '88066.12 s']\n", "\n", "Maximum time step: 498.60 s = 8.31 min\n" ] } ], "source": [ "print('Time constants:') \n", "print([f'{T:.2f} s' for T in -1 / λ])\n", "\n", "print('\\n2 x Time constants:') \n", "print([f'{T:.2f} s' for T in -2 / λ])\n", "\n", "dtmax = 2 * min(-1. / λ)\n", "print(f'\\nMaximum time step: {dtmax:.2f} s = {dtmax / 60:.2f} min')" ] }, { "cell_type": "markdown", "id": "17f1b010-7d23-46f1-8c13-cc1e7704bc0c", "metadata": {}, "source": [ "Let's chose a time step smaller than $\\Delta t_{max} = \\min (-2 / \\lambda_i) $." ] }, { "cell_type": "code", "execution_count": 38, "id": "d634f2a6-d989-42f4-8f51-d973d63b5027", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dt = 480.0 s = 8 min\n" ] } ], "source": [ "# time step\n", "dt = np.floor(dtmax / 60) * 60 # s\n", "print(f'dt = {dt} s = {dt / 60:.0f} min')" ] }, { "cell_type": "markdown", "id": "0d83dfe8-fe63-42c9-b913-47b1019d1a00", "metadata": {}, "source": [ "### Settling time\n", "The [settling time](https://en.m.wikipedia.org/wiki/Step_response) is roughly 4 times the larger time constant." ] }, { "cell_type": "code", "execution_count": 39, "id": "89a7aa43-6fb4-46d8-bb9b-5fbd15a7102e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4 * Time constants: \n", " [ 996 16372 26916 176132] s \n", "\n", "Settling time: 176132 s = 2935.5 min = 48.93 h = 2.04 days\n" ] } ], "source": [ "# settling time\n", "time_const = np.array([int(x) for x in sorted(-1 / λ)])\n", "print('4 * Time constants: \\n', 4 * time_const, 's \\n')\n", "\n", "t_settle = 4 * max(-1 / λ)\n", "print(f'Settling time: \\\n", "{t_settle:.0f} s = \\\n", "{t_settle / 60:.1f} min = \\\n", "{t_settle / (3600):.2f} h = \\\n", "{t_settle / (3600 * 24):.2f} days')" ] }, { "cell_type": "markdown", "id": "1dac581d-272f-4cdd-8843-eeb44dd6a58d", "metadata": { "tags": [] }, "source": [ "### Step response\n", "Let's obtain the dynamic response of the system to a [step input](https://en.m.wikipedia.org/wiki/Step_response).\n", "\n", "#### Duration\n", "The duration of the simulation needs to be larger than the estimated [settling time](https://en.m.wikipedia.org/wiki/Settling_time). This requires a corresponding number of time steps in the time vector." ] }, { "cell_type": "code", "execution_count": 40, "id": "6062f401-b335-460a-bbba-61ddeb700662", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Duration = 176400.0 s\n", "Number of time steps = 367\n" ] } ], "source": [ "# Step response\n", "# -------------\n", "# duration: next multiple of 3600 s that is larger than t_settle\n", "duration = np.ceil(t_settle / 3600) * 3600\n", "n = int(np.floor(duration / dt)) # number of time steps\n", "t = np.arange(0, n * dt, dt) # time vector for n time steps\n", "\n", "print(f'Duration = {duration} s')\n", "print(f'Number of time steps = {n}')\n", "# pd.DataFrame(t, columns=['time'])" ] }, { "cell_type": "markdown", "id": "e1cf346d-6283-4095-aa29-6dc378f54eb6", "metadata": { "tags": [] }, "source": [ "#### Input vector\n", "In dynamic simulation, the inputs are [time series](https://en.m.wikipedia.org/wiki/Time_series), e.g., the oudoor temperature will have $n$ values $T_o = [T_{o(0)}, T_{o(1)}, ..., T_{o(n-1)}]$ at [discrete time](https://en.m.wikipedia.org/wiki/Discrete_time_and_continuous_time#Discrete_time) $t = [t_0, t_1, ... , t_{n-1}]$.\n", "\n", "The input vector $u$ of the state-space representation is obtained by stacking the vectors $b_T$ and $f_Q$ of the system of Differential Algebraic Equations:\n", "\n", "$$u = \\begin{bmatrix} b_T \\\\ f_Q\\end{bmatrix}$$\n", "\n", "where:\n", "- vector $b_T$ consists of the nonzero elements of vector $b$ of temperature sources; for the circuit presented in Figure 3, \n", "\n", "$$b = [\\begin{matrix}\n", "T_o &0 &0 &0 &0 &0 &0 &0 &T_o &0 &T_o &T_{i,sp} \n", "\\end{matrix}]^T$$\n", "and \n", "$$b_T = [T_o, T_o, T_o, T_{i,sp}]^T$$\n", "corresponding to branches 0, 8, 10 and 11; \n", "- vector $f_Q$ is the nonzero elements of vector $f$ of flow sources; for the circuit presented in Figure 3,\n", "\n", "$$f = [\\begin{matrix}\n", "\\Phi_o &0 &0 &0 &\\Phi_i &0 &\\dot{Q_a} &\\Phi_a \n", "\\end{matrix}]^T$$\n", "\n", "and\n", "\n", "$$f_Q = [\\Phi_o, \\Phi_i, \\dot{Q}_a, \\Phi_a]^T$$\n", "\n", "corresponding to nodes 0, 4, 6, and 7.\n", "\n", "For the thermal circuit shown in Figure 3, the [time series](https://en.m.wikipedia.org/wiki/Time_series) of the input vector, $u = [u_0, u_1, ... , u_{n-1}]^T$, is:\n", "\n", "$$u = \n", "\\begin{bmatrix}\n", "T_o\\\\ \n", "T_o\\\\ \n", "T_o\\\\ \n", "T_{i,sp}\\\\ \n", "\\Phi_o\\\\ \n", "\\Phi_i\\\\ \n", "\\dot{Q}_a\\\\ \n", "\\Phi_a\n", "\\end{bmatrix}\n", "= \\begin{bmatrix}\n", "T_{o(0)} & T_{o(1)}& ... & T_{o(n-1)}\\\\ \n", "T_{o(0)} & T_{o(1)}& ... & T_{o(n-1)}\\ \\\\ \n", "T_{o(0)} & T_{o(1)}& ... & T_{o(n-1)}\\ \\\\ \n", "T_{i,sp(0)} & T_{i,sp(1)}& ... & T_{i,sp(n-1)}\\ \\\\ \n", "\\Phi_{o(0)} & \\Phi_{o(1)} & ... & \\Phi_{o(n-1)}\\\\\n", "\\Phi_{i(0)} & \\Phi_{i(1)} & ... & \\Phi_{i(n-1)}\\\\ \n", "\\dot{Q}_{a(0)} & \\dot{Q}_{a(1)} & ... & \\dot{Q}_{a(n-1)}\\\\ \n", "\\Phi_{a(0)} & \\Phi_{a(1)} & ... & \\Phi_{a(n-1)}\n", "\\end{bmatrix}$$\n", "\n", "where:\n", "- $T_o = [T_{o(0)}, T_{o(1)}, ..., T_{o(n-1)}]$ is the [time series](https://en.m.wikipedia.org/wiki/Time_series) of the oudoor temperature at [discrete time](https://en.m.wikipedia.org/wiki/Discrete_time_and_continuous_time#Discrete_time) $t = [t_0, t_1, ... , t_{n-1}]$.\n", "\n", "- $T_{i, sp} = [T_{{i, sp}(0)}, T_{{i, sp}(1)}, ..., T_{{i, sp}(n-1)}]$ is the [time series](https://en.m.wikipedia.org/wiki/Time_series) of the setpoint indoor temperature at [discrete time](https://en.m.wikipedia.org/wiki/Discrete_time_and_continuous_time#Discrete_time) $t = [t_0, t_1, ... , t_{n-1}]$.\n", "\n", "- $\\Phi_o = [\\Phi_{o(0)}, \\Phi_{o(1)}, ..., \\Phi_{o(n-1)}]$ is the [time series](https://en.m.wikipedia.org/wiki/Time_series) of the solar radiation absorbed by the outdoor surface of the wall at [discrete time](https://en.m.wikipedia.org/wiki/Discrete_time_and_continuous_time#Discrete_time) $t = [t_0, t_1, ... , t_{n-1}]$.\n", "\n", "- $\\Phi_i = [\\Phi_{i(0)}, \\Phi_{i(1)}, ..., \\Phi_{i(n-1)}]$ is the [time series](https://en.m.wikipedia.org/wiki/Time_series) of the solar radiation absorbed by the indoor surface of the wall at [discrete time](https://en.m.wikipedia.org/wiki/Discrete_time_and_continuous_time#Discrete_time) $t = [t_0, t_1, ... , t_{n-1}]$.\n", "\n", "- $\\dot{Q}_a = [\\dot{Q}_{a(0)}, \\dot{Q}_{a(1)}, ..., \\dot{Q}_{a(n-1)}]$ is the [time series](https://en.m.wikipedia.org/wiki/Time_series) of the auxiliary heat gains (i.e., occupants, electrical devices, etc.) at [discrete time](https://en.m.wikipedia.org/wiki/Discrete_time_and_continuous_time#Discrete_time) $t = [t_0, t_1, ... , t_{n-1}]$.\n", "\n", "- $\\Phi_a = [\\Phi_{a(0)}, \\Phi_{a(1)}, ..., \\Phi_{a(n-1)}]$ is the [time series](https://en.m.wikipedia.org/wiki/Time_series) of the solar radiation absorbed by the glass at [discrete time](https://en.m.wikipedia.org/wiki/Discrete_time_and_continuous_time#Discrete_time) $t = [t_0, t_1, ... , t_{n-1}]$.\n", "\n", "Let's consider a step response in the conditions used for steady-state analysis, i.e. $T_o = 10 \\, \\mathrm{^\\circ C}$, $T_{i,sp} = 20 \\, \\mathrm{^\\circ C}$, and all the flow sources zero (including the HVAC system)." ] }, { "cell_type": "code", "execution_count": 41, "id": "3da47c23-3af1-4515-b919-2b394a655a2f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>0</th>\n", " <th>1</th>\n", " <th>2</th>\n", " <th>3</th>\n", " <th>4</th>\n", " <th>5</th>\n", " <th>6</th>\n", " <th>7</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>20.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>20.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>20.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>20.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>20.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>362</th>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>20.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>363</th>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>20.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>364</th>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>20.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>365</th>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>20.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>366</th>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>10.0</td>\n", " <td>20.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>367 rows × 8 columns</p>\n", "</div>" ], "text/plain": [ " 0 1 2 3 4 5 6 7\n", "0 10.0 10.0 10.0 20.0 0.0 0.0 0.0 0.0\n", "1 10.0 10.0 10.0 20.0 0.0 0.0 0.0 0.0\n", "2 10.0 10.0 10.0 20.0 0.0 0.0 0.0 0.0\n", "3 10.0 10.0 10.0 20.0 0.0 0.0 0.0 0.0\n", "4 10.0 10.0 10.0 20.0 0.0 0.0 0.0 0.0\n", ".. ... ... ... ... ... ... ... ...\n", "362 10.0 10.0 10.0 20.0 0.0 0.0 0.0 0.0\n", "363 10.0 10.0 10.0 20.0 0.0 0.0 0.0 0.0\n", "364 10.0 10.0 10.0 20.0 0.0 0.0 0.0 0.0\n", "365 10.0 10.0 10.0 20.0 0.0 0.0 0.0 0.0\n", "366 10.0 10.0 10.0 20.0 0.0 0.0 0.0 0.0\n", "\n", "[367 rows x 8 columns]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# input vector\n", "#u = np.zeros([8, n]) # u = [To To To Tisp Φo Φi Qa Φa]\n", "#u[0:3, :] = 10 * np.ones([3, n]) # To = 10 for n time steps\n", "#u[3, :] = 20 * np.ones([1, n]) # Tisp = 20 for n time steps\n", "\n", "#pd.DataFrame(u)\n", "\n", "# input vector\n", "u = np.zeros([n, 8]) # u = [To To To Tisp Φo Φi Qa Φa]\n", "u[:, 0:3] = 10 * np.ones([n, 3]) # To = 10 for n time steps\n", "u[:, 3] = 20 * np.ones([n]) # Tisp = 20 for n time steps\n", "\n", "pd.DataFrame(u)" ] }, { "cell_type": "markdown", "id": "c26d5657-c137-46c9-93e2-6340e13f9d7d", "metadata": { "tags": [] }, "source": [ "#### Time integration" ] }, { "cell_type": "markdown", "id": "c6b0cfa0-301c-4bdb-8f36-8fa6d2bebee3", "metadata": { "tags": [] }, "source": [ "The state-space model\n", "\n", "$$\\left\\{\\begin{array}{rr}\n", "\\dot{\\theta}_C=A_s \\theta_C + B_s u\\\\ \n", "y = C_s \\theta_C + D_s u\n", "\\end{array}\\right.$$\n", "\n", "is integrated in time by using [Euler forward (or explicit) method](https://en.m.wikipedia.org/wiki/Numerical_methods_for_ordinary_differential_equations#Euler_method) for numerical integration:\n", "\n", "$$ \\theta_{s,k+1} = (I + \\Delta t A) \\theta_{s,k} + \\Delta t B u_k $$\n", "\n", "and [Euler backward (or implicit) method](https://en.m.wikipedia.org/wiki/Numerical_methods_for_ordinary_differential_equations#Backward_Euler_method) for numerical integration:\n", "\n", "$$\\theta_{s,k+1} = (I - \\Delta t A)^{-1} ( \\theta_{s,k} + \\Delta t B u_k )$$\n", "\n", "where $k = 0, ... , n - 1$." ] }, { "cell_type": "code", "execution_count": 42, "id": "c6e318a6-782e-4976-8b9e-3f5bd0d01797", "metadata": {}, "outputs": [], "source": [ "# initial conditions\n", "n_s = As.shape[0] # number of state variables\n", "θ_exp = np.zeros([n_s, t.shape[0]]) # explicit Euler in time t\n", "θ_imp = np.zeros([n_s, t.shape[0]]) # implicit Euler in time t\n", "\n", "# time integration\n", "I = np.eye(n_s) # identity matrix\n", "\n", "for k in range(n - 1):\n", " θ_exp[:, k + 1] = (I + dt * As) @ θ_exp[:, k]\\\n", " + dt * Bs @ u[k, :]\n", " θ_imp[:, k + 1] = np.linalg.inv(I - dt * As) @ (θ_imp[:, k]\\\n", " + dt * Bs @ u[k, :]) " ] }, { "cell_type": "markdown", "id": "dc2b5250-4741-4dc7-9e48-f1961e6070b0", "metadata": {}, "source": [ "Then, we obtain the outputs\n", "\n", "$$ y = C_s \\theta_s + D_s u$$\n", "\n", "for explicit and for implicit Euler methods, respectively." ] }, { "cell_type": "code", "execution_count": 43, "id": "696aa2ef-3242-4a7c-a50d-bbf694a15b28", "metadata": {}, "outputs": [], "source": [ "# outputs\n", "y_exp = Cs @ θ_exp + Ds @ u.T\n", "y_imp = Cs @ θ_imp + Ds @ u.T" ] }, { "cell_type": "markdown", "id": "c39cb941-fafd-48ab-9a55-d42342488fb4", "metadata": {}, "source": [ "The results of explicit and implicit Euler integration are practically identical." ] }, { "cell_type": "code", "execution_count": 44, "id": "049a8d85-8f52-40dc-8e90-41878ee10b4e", "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": [ "fig, ax = plt.subplots()\n", "ax.plot(t / 3600, y_exp.T, t / 3600, y_imp.T)\n", "ax.set(xlabel='Time, $t$ / h',\n", " ylabel='Temperatue, $θ_i$ / °C',\n", " title='Step input: outdoor temperature $T_o$')\n", "ax.legend(['Explicit', 'Implicit'])\n", "ax.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "3dde9c4b-5343-4e4e-baf3-f8a20355f61e", "metadata": { "tags": [] }, "source": [ "> Figure 7. Step response to outdoor temperature by using Euler\n", "[implicit](https://en.m.wikipedia.org/wiki/Numerical_methods_for_ordinary_differential_equations#Backward_Euler_method)\n", "and\n", "[explicit](https://en.m.wikipedia.org/wiki/Numerical_methods_for_ordinary_differential_equations#Euler_method) integration.\n", "\n", "The value the indoor temperature obtained after the [settling time](https://en.m.wikipedia.org/wiki/Settling_time) is almost equal to the value obtained in steady-state." ] }, { "cell_type": "code", "execution_count": 45, "id": "d6801343-7156-4c91-b7cd-f93f93229ad2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Steady-state indoor temperature obtained with:\n", "- DAE model: 10.0000 °C\n", "- state-space model: 10.0000 °C\n", "- steady-state response to step input: 9.9640 °C\n" ] } ], "source": [ "print('Steady-state indoor temperature obtained with:')\n", "print(f'- DAE model: {float(θ[6]):.4f} °C')\n", "print(f'- state-space model: {float(yss):.4f} °C')\n", "print(f'- steady-state response to step input: {float(y_exp[:, -2]):.4f} °C')" ] }, { "cell_type": "markdown", "id": "0912b7bf-c1bd-4606-b5c4-095f3d4c581b", "metadata": { "tags": [] }, "source": [ "### Simulation with weather data" ] }, { "cell_type": "markdown", "id": "55fecef0-f660-47d1-a1d4-bc06ad4bc997", "metadata": { "tags": [] }, "source": [ "#### Start and end time\n", "The simulation will be done from `start_date` to `end_date` indicated in the format `MM-DD HH:MM:SS` (month, day, hour:minute:second)." ] }, { "cell_type": "code", "execution_count": 46, "id": "53f451dc-4055-432f-bfb9-575ab072be50", "metadata": {}, "outputs": [], "source": [ "start_date = '02-01 12:00:00'\n", "end_date = '02-07 18:00:00'" ] }, { "cell_type": "markdown", "id": "866a79fb-4820-4907-9104-82b79e1939a4", "metadata": {}, "source": [ "The weather data are for a year. The choice of `2000` for the year is arbitrary; it used in order to respect the format `YYYY-MM-DD HH:MM:SS`." ] }, { "cell_type": "code", "execution_count": 47, "id": "de1d7d8f-9c19-4b30-aab2-5bd5b5b58a58", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2000-02-01 12:00:00 \tstart date\n", "2000-02-07 18:00:00 \tend date\n" ] } ], "source": [ "start_date = '2000-' + start_date\n", "end_date = '2000-' + end_date\n", "print(f'{start_date} \\tstart date')\n", "print(f'{end_date} \\tend date')" ] }, { "cell_type": "markdown", "id": "904f198e-960b-4045-93f4-1b9a34057ae0", "metadata": { "tags": [] }, "source": [ "#### Inputs\n", "##### Read weather data\n", "Dynamic simulation needs [time series](https://en.m.wikipedia.org/wiki/Time_series) of weather data for air temperature, direct solar radiation on a normal surface and diffuse solar radiation on an horizontal surface (see the tutorial on [Weather data and solar radiation](../t01/t01ReadWeatherData.ipynb)).\n", "\n", "From the weather data, we select:\n", "- hourly outdoor air temperature, °C;\n", "- hourly solar [direct normal irradiance](https://en.m.wikipedia.org/wiki/Direct_insolation) (or beam radiation), W/m²;\n", "- hourly solar diffuse horizontal irradiance (or [diffuse sky radiation](https://en.wikipedia.org/wiki/Diffuse_sky_radiation)), W/m²." ] }, { "cell_type": "code", "execution_count": 48, "id": "d2d7d382-98c6-436f-a3da-766052220313", "metadata": {}, "outputs": [], "source": [ "filename = './weather_data/FRA_Lyon.074810_IWEC.epw'\n", "[data, meta] = dm4bem.read_epw(filename, coerce_year=None)\n", "weather = data[[\"temp_air\", \"dir_n_rad\", \"dif_h_rad\"]]\n", "del data" ] }, { "cell_type": "markdown", "id": "d666fae4-aaaa-462a-adad-055d4693cb98", "metadata": {}, "source": [ "The year is set to `2000` by convention and the data is selected from start to end." ] }, { "cell_type": "code", "execution_count": 49, "id": "abaaf4fa-eb5a-4cd4-832d-163100be3a76", "metadata": {}, "outputs": [], "source": [ "weather.index = weather.index.map(lambda t: t.replace(year=2000))\n", "weather = weather.loc[start_date:end_date]" ] }, { "cell_type": "markdown", "id": "71b03819-1b8d-4a54-9c8a-fb56364d07ac", "metadata": {}, "source": [ "##### Solar irradiance on the walls\n", "For the surface orientation given by `slope`, `azimuth`and `latitude`, and the `albedo` of the surface in front of the wall, by using the weather data, we can calculate the:\n", "- direct irradiance, W/m²,\n", "- diffuse irradiance, W/m²,\n", "- reflected irradiance, W/m²,\n", "\n", "for hourly solar [irradiance](https://en.m.wikipedia.org/wiki/Solar_irradiance) on a tilted surface." ] }, { "cell_type": "code", "execution_count": 50, "id": "e79c6269-6464-418c-ab8a-9a8cf28e9e03", "metadata": {}, "outputs": [], "source": [ "surface_orientation = {'slope': 90,\n", " 'azimuth': 0,\n", " 'latitude': 45}\n", "albedo = 0.2\n", "rad_surf = dm4bem.sol_rad_tilt_surf(\n", " weather, surface_orientation, albedo)\n", "# pd.DataFrame(rad_surf)" ] }, { "cell_type": "markdown", "id": "75b3c42d-2a15-4bf1-bb8f-84f7ded1b24d", "metadata": { "tags": [] }, "source": [ "The total solar [irradiance](https://en.m.wikipedia.org/wiki/Solar_irradiance) $E_{tot}$, in W/m², is the sum of direct, diffuse, and reflected components. " ] }, { "cell_type": "code", "execution_count": 51, "id": "5e9f21e8-f118-4f99-9195-83fb25dd0b06", "metadata": {}, "outputs": [], "source": [ "rad_surf['Φtot'] = rad_surf.sum(axis=1)" ] }, { "cell_type": "markdown", "id": "bacf20a0-9eef-41cd-b97c-a66da45a9f18", "metadata": { "tags": [] }, "source": [ "##### Resample the weather data\n", "The weather data is at the time-step of 1h. It needs to be resampled at time step $\\Delta t$ used for numerical integration." ] }, { "cell_type": "code", "execution_count": 52, "id": "93c1c908-ff9c-444a-9c69-b5e77270d87a", "metadata": {}, "outputs": [], "source": [ "# resample weather data\n", "data = pd.concat([weather['temp_air'], rad_surf['Φtot']], axis=1)\n", "data = data.resample(str(dt) + 'S').interpolate(method='linear')\n", "data = data.rename(columns={'temp_air': 'To'})\n", "data = data.rename_axis('Time')\n", "# pd.DataFrame(data)" ] }, { "cell_type": "markdown", "id": "11dc5a18-d6d6-4491-b78d-4aaaa2086d85", "metadata": { "tags": [] }, "source": [ "##### Other inputs\n", "Let's consider the indoor temperature setpoint $T_{i,sp} = 20 \\, \\mathrm{^\\circ C}$ and the auxiliary heat flow $\\dot{Q}_a = 0 \\, \\mathrm{W}$ constant for the whole duration of the simulation." ] }, { "cell_type": "code", "execution_count": 53, "id": "6d61f97c-5a6b-4bef-9353-7036b195eafa", "metadata": {}, "outputs": [], "source": [ "data['Ti'] = 20 * np.ones(data.shape[0])\n", "data['Qa'] = 0 * np.ones(data.shape[0])\n", "# pd.DataFrame(data)" ] }, { "cell_type": "markdown", "id": "9c94a6eb-0994-47e7-8784-0572e76963db", "metadata": { "tags": [] }, "source": [ "##### Input vector in time\n", "The input is formed by the vectors of time series of temperature sources $\\left [ T_o, T_o ,T_o, T_{i,sp} \\right ]^T$ and vectors of time series of the heat flow sources $\\left [ \\Phi_o, \\Phi_i, \\dot{Q_a}, \\Phi_a \\right ]^T$:\n", "\n", "$$u = \n", "\\begin{bmatrix}\n", "T_o\\\\ \n", "T_o\\\\ \n", "T_o\\\\ \n", "T_{i,sp}\\\\ \n", "\\Phi_o\\\\ \n", "\\Phi_i\\\\ \n", "\\dot{Q}_a\\\\ \n", "\\Phi_a\n", "\\end{bmatrix}\n", "= \\begin{bmatrix}\n", "T_{o(0)} & T_{o(1)}& ... & T_{o(n-1)}\\\\ \n", "T_{o(0)} & T_{o(1)}& ... & T_{o(n-1)}\\ \\\\ \n", "T_{o(0)} & T_{o(1)}& ... & T_{o(n-1)}\\ \\\\ \n", " T_{i,sp(0)} & T_{i,sp(1)}& ... & T_{i,sp(n-1)}\\ \\\\ \n", "\\Phi_{o,(0)} & \\Phi_{o,(1)} & ... & \\Phi_{o,(n-1)}\\\\\n", "\\Phi_{i,(0)} & \\Phi_{i,(1)} & ... & \\Phi_{i,(n-1)}\\\\ \n", " \\dot{Q}_{a(0)} & \\dot{Q}_{a(1)} & ... & \\dot{Q}_{a(n-1)}\\\\ \n", "\\Phi_{a,(0)} & \\Phi_{a,(1)} & ... & \\Phi_{a,(n-1)}\n", "\\end{bmatrix}$$\n", "\n", "where:\n", "\n", "$T_o$: the time series vector of outdoor temperatures (from weather data), °C.\n", "\n", "$T_{i,sp}$: time series vector of indoor setpoint temperatures, °C.\n", "\n", "$\\Phi_o$: time series vector of solar (i.e. short wave) radiation, in W, absorbed by the outdoor surface of the wall:\n", "\n", "$$\\Phi_o = \\alpha_{w,SW} S_w E_{tot}$$\n", "\n", "where:\n", "\n", "- $\\alpha_{w,SW}$ is the absortion coefficient of the outdoor surface of the wall in short wave, $0 \\leqslant \\alpha_{w,SW} \\leqslant 1$;\n", "- $S_w$ - surface area of the wall, m²;\n", "- $E_{tot}$ - total solar irradiation on the wall, W/m².\n", "\n", "$\\Phi_i$: time series vector of short wave (i.e. solar) radiation, in W, absorbed by the indoor surfaces of the wall:\n", "\n", "$$\\Phi_i = \\tau_{g,SW} \\alpha_{w,SW} S_g E_{tot}$$\n", "\n", "where:\n", "- $\\tau_{g,SW}$ is the transmission coefficient of the window glass, $0 \\leqslant \\tau_{g,SW} \\leqslant 1$;\n", "- $\\alpha_{w,SW}$ - absortion coefficient of the indoor surface of the wall in short wave, $0 \\leqslant \\alpha_{w,SW} \\leqslant 1$;\n", "- $S_g$ - surface area of the window glass, m²;\n", "- $E_{tot}$ - total solar radiation intensity on the wall, W/m².\n", "\n", "$\\dot{Q}_a$: time vector of auxiliary heat flows (from occupants, electrical devices, etc.), W.\n", "\n", "$\\Phi_a$: time series vector of short wave (i.e. solar) radiation, in W, absorbed by the window glass:\n", "\n", "$$\\Phi_a = \\alpha_{g,SW} S_g E_{tot}$$\n", "\n", "where:\n", "- $\\alpha_{g,SW}$ is the absortion coefficient of the glass window in short wave, $0 \\leqslant \\alpha_{w,SW} \\leqslant 1$;\n", "- $S_g$ - surface area of the glass window, m²;\n", "- $E_{tot}$ - total solar irradiation on the wall, W/m²." ] }, { "cell_type": "code", "execution_count": 54, "id": "6b9bf1da-df99-4c29-a995-a37235f92e2c", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>To</th>\n", " <th>To</th>\n", " <th>To</th>\n", " <th>Ti</th>\n", " <th>Φo</th>\n", " <th>Φi</th>\n", " <th>Qa</th>\n", " <th>Φa</th>\n", " </tr>\n", " <tr>\n", " <th>Time</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2000-02-01 12:00:00+01:00</th>\n", " <td>10.00</td>\n", " <td>10.00</td>\n", " <td>10.00</td>\n", " <td>20.0</td>\n", " <td>803.250000</td>\n", " <td>48.195000</td>\n", " <td>0.0</td>\n", " <td>244.188000</td>\n", " </tr>\n", " <tr>\n", " <th>2000-02-01 12:08:00+01:00</th>\n", " <td>10.20</td>\n", " <td>10.20</td>\n", " <td>10.20</td>\n", " <td>20.0</td>\n", " <td>975.898057</td>\n", " <td>58.553883</td>\n", " <td>0.0</td>\n", " <td>296.673009</td>\n", " </tr>\n", " <tr>\n", " <th>2000-02-01 12:16:00+01:00</th>\n", " <td>10.40</td>\n", " <td>10.40</td>\n", " <td>10.40</td>\n", " <td>20.0</td>\n", " <td>1148.546115</td>\n", " <td>68.912767</td>\n", " <td>0.0</td>\n", " <td>349.158019</td>\n", " </tr>\n", " <tr>\n", " <th>2000-02-01 12:24:00+01:00</th>\n", " <td>10.60</td>\n", " <td>10.60</td>\n", " <td>10.60</td>\n", " <td>20.0</td>\n", " <td>1321.194172</td>\n", " <td>79.271650</td>\n", " <td>0.0</td>\n", " <td>401.643028</td>\n", " </tr>\n", " <tr>\n", " <th>2000-02-01 12:32:00+01:00</th>\n", " <td>10.80</td>\n", " <td>10.80</td>\n", " <td>10.80</td>\n", " <td>20.0</td>\n", " <td>1493.842229</td>\n", " <td>89.630534</td>\n", " <td>0.0</td>\n", " <td>454.128038</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>2000-02-07 17:28:00+01:00</th>\n", " <td>4.68</td>\n", " <td>4.68</td>\n", " <td>4.68</td>\n", " <td>20.0</td>\n", " <td>163.144887</td>\n", " <td>9.788693</td>\n", " <td>0.0</td>\n", " <td>49.596046</td>\n", " </tr>\n", " <tr>\n", " <th>2000-02-07 17:36:00+01:00</th>\n", " <td>4.56</td>\n", " <td>4.56</td>\n", " <td>4.56</td>\n", " <td>20.0</td>\n", " <td>122.358665</td>\n", " <td>7.341520</td>\n", " <td>0.0</td>\n", " <td>37.197034</td>\n", " </tr>\n", " <tr>\n", " <th>2000-02-07 17:44:00+01:00</th>\n", " <td>4.44</td>\n", " <td>4.44</td>\n", " <td>4.44</td>\n", " <td>20.0</td>\n", " <td>81.572443</td>\n", " <td>4.894347</td>\n", " <td>0.0</td>\n", " <td>24.798023</td>\n", " </tr>\n", " <tr>\n", " <th>2000-02-07 17:52:00+01:00</th>\n", " <td>4.32</td>\n", " <td>4.32</td>\n", " <td>4.32</td>\n", " <td>20.0</td>\n", " <td>40.786222</td>\n", " <td>2.447173</td>\n", " <td>0.0</td>\n", " <td>12.399011</td>\n", " </tr>\n", " <tr>\n", " <th>2000-02-07 18:00:00+01:00</th>\n", " <td>4.20</td>\n", " <td>4.20</td>\n", " <td>4.20</td>\n", " <td>20.0</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>0.0</td>\n", " <td>0.000000</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>1126 rows × 8 columns</p>\n", "</div>" ], "text/plain": [ " To To To Ti Φo Φi \\\n", "Time \n", "2000-02-01 12:00:00+01:00 10.00 10.00 10.00 20.0 803.250000 48.195000 \n", "2000-02-01 12:08:00+01:00 10.20 10.20 10.20 20.0 975.898057 58.553883 \n", "2000-02-01 12:16:00+01:00 10.40 10.40 10.40 20.0 1148.546115 68.912767 \n", "2000-02-01 12:24:00+01:00 10.60 10.60 10.60 20.0 1321.194172 79.271650 \n", "2000-02-01 12:32:00+01:00 10.80 10.80 10.80 20.0 1493.842229 89.630534 \n", "... ... ... ... ... ... ... \n", "2000-02-07 17:28:00+01:00 4.68 4.68 4.68 20.0 163.144887 9.788693 \n", "2000-02-07 17:36:00+01:00 4.56 4.56 4.56 20.0 122.358665 7.341520 \n", "2000-02-07 17:44:00+01:00 4.44 4.44 4.44 20.0 81.572443 4.894347 \n", "2000-02-07 17:52:00+01:00 4.32 4.32 4.32 20.0 40.786222 2.447173 \n", "2000-02-07 18:00:00+01:00 4.20 4.20 4.20 20.0 0.000000 0.000000 \n", "\n", " Qa Φa \n", "Time \n", "2000-02-01 12:00:00+01:00 0.0 244.188000 \n", "2000-02-01 12:08:00+01:00 0.0 296.673009 \n", "2000-02-01 12:16:00+01:00 0.0 349.158019 \n", "2000-02-01 12:24:00+01:00 0.0 401.643028 \n", "2000-02-01 12:32:00+01:00 0.0 454.128038 \n", "... ... ... \n", "2000-02-07 17:28:00+01:00 0.0 49.596046 \n", "2000-02-07 17:36:00+01:00 0.0 37.197034 \n", "2000-02-07 17:44:00+01:00 0.0 24.798023 \n", "2000-02-07 17:52:00+01:00 0.0 12.399011 \n", "2000-02-07 18:00:00+01:00 0.0 0.000000 \n", "\n", "[1126 rows x 8 columns]" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# input vector\n", "To = data['To']\n", "Ti = data['Ti']\n", "Φo = α_wSW * wall['Surface']['Layer_out'] * data['Φtot']\n", "Φi = τ_gSW * α_wSW * wall['Surface']['Glass'] * data['Φtot']\n", "Qa = data['Qa']\n", "Φa = α_gSW * wall['Surface']['Glass'] * data['Φtot']\n", "\n", "u = pd.concat([To, To, To, Ti, Φo, Φi, Qa, Φa], axis=1)\n", "u.columns.values[[4, 5, 7]] = ['Φo', 'Φi', 'Φa']\n", "pd.DataFrame(u)" ] }, { "cell_type": "markdown", "id": "95d371b1-e61b-4092-8a03-3c0052fa1f7e", "metadata": {}, "source": [ "#### Initial conditions\n", "The initial value of the state-vector can be zero or different from zero." ] }, { "cell_type": "code", "execution_count": 55, "id": "3428bbdd-d34a-4d93-8438-d1c2fe8c9279", "metadata": {}, "outputs": [], "source": [ "θ_exp = 20 * np.ones([As.shape[0], u.shape[0]])" ] }, { "cell_type": "markdown", "id": "a9f75273-a2d7-4bea-b30d-c8b1adeec56f", "metadata": { "tags": [] }, "source": [ "#### Time integration\n", "[Explicit Euler](https://en.m.wikipedia.org/wiki/Numerical_methods_for_ordinary_differential_equations#Euler_method) integration in time,\n", "\n", "$$ \\theta_{s,k+1} = (I + \\Delta t A) \\theta_{s,k} + \\Delta t B u_k $$\n", "\n", "where $k = 0, ... , n - 1$," ] }, { "cell_type": "code", "execution_count": 56, "id": "6dd045e0-2a7a-4946-9f37-ed341d9da11d", "metadata": {}, "outputs": [], "source": [ "for k in range(u.shape[0] - 1):\n", " θ_exp[:, k + 1] = (I + dt * As) @ θ_exp[:, k]\\\n", " + dt * Bs @ u.iloc[k, :]" ] }, { "cell_type": "markdown", "id": "c7fcc96b-baa9-4582-a9df-8042f90352ed", "metadata": { "tags": [] }, "source": [ "yields the time variation of state variable $\\theta$, from which we obtain the variation of the output (i.e. indoor temperature):\n", "\n", "$$y = C_s \\theta_s + D_s u$$\n", "\n", "and the variation of the heat flow of the HVAC system:\n", "\n", "$$q_{HVAC} = K_p (T_{i,sp} - \\theta_i) = K_p (T_{i,sp} - y)$$\n", "\n", "where $K_p$ is the gain of the P-controller and $T_{i,sp}$ is the HVAC-setpoint for the indoor temperature." ] }, { "cell_type": "code", "execution_count": 57, "id": "d80f2c02-3119-4309-9635-5fd0ee967293", "metadata": { "tags": [] }, "outputs": [], "source": [ "y_exp = Cs @ θ_exp + Ds @ u.to_numpy().T\n", "q_HVAC = Kp * (data['Ti'] - y_exp[0, :])" ] }, { "cell_type": "code", "execution_count": 58, "id": "5960a54b-27b7-4887-a4aa-d0684bb3c89d", "metadata": {}, "outputs": [], "source": [ "data['θi_exp'] = y_exp.T\n", "data['q_HVAC'] = q_HVAC.T" ] }, { "cell_type": "code", "execution_count": 59, "id": "723f3f3d-8a6e-48b1-b450-55eddf077e1a", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 2 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, axs = plt.subplots(2, 1)\n", "\n", "data[['To', 'θi_exp']].plot(ax=axs[0],\n", " xticks=[],\n", " ylabel='Temperature, $θ$ / °C')\n", "axs[0].legend(['$θ_{outdoor}$', '$θ_{indoor}$'],\n", " loc='upper right')\n", "\n", "data[['Φtot', 'q_HVAC']].plot(ax=axs[1],\n", " ylabel='Heat rate, $q$ / W')\n", "axs[1].set(xlabel='Time')\n", "axs[1].legend(['$Φ_{total}$', '$q_{HVAC}$'],\n", " loc='upper right')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "5269b547-190c-4c45-92d5-4544f7eca659", "metadata": {}, "source": [ "> Figure 6. Simulation in free-running with weather data using Euler explicit method of integration. a) Indoor and outdoor temperatures. b) Solar and HVAC heat flow rates." ] }, { "cell_type": "code", "execution_count": 60, "id": "f7ece29e-0059-4e52-8498-c5b20b252994", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 2 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "t = dt * np.arange(data.shape[0]) # time vector\n", "\n", "fig, axs = plt.subplots(2, 1)\n", "# plot outdoor and indoor temperature\n", "axs[0].plot(t / 3600 / 24, data['To'], label='$θ_{outdoor}$')\n", "axs[0].plot(t / 3600 / 24, y_exp[0, :], label='$θ_{indoor}$')\n", "axs[0].set(ylabel='Temperatures, $θ$ / °C',\n", " title='Simulation for weather')\n", "axs[0].legend(loc='upper right')\n", "\n", "# plot total solar radiation and HVAC heat flow\n", "axs[1].plot(t / 3600 / 24, data['Φtot'], label='$Φ_{total}$')\n", "axs[1].plot(t / 3600 / 24, q_HVAC, label='$q_{HVAC}$')\n", "axs[1].set(xlabel='Time, $t$ / day',\n", " ylabel='Heat flows, $q$ / W')\n", "axs[1].legend(loc='upper right')\n", "\n", "fig.tight_layout()" ] }, { "cell_type": "markdown", "id": "ff1d5ac5-e9d7-4046-8adf-62fa7ca52988", "metadata": {}, "source": [ "> Figure 7. Simulation in free-running with weather data using Euler explicit method of integration. a) Indoor and outdoor temperatures. b) Solar and HVAC heat flow rates." ] }, { "cell_type": "markdown", "id": "0ebf5b58-0cf9-4c35-b751-09382cfd4510", "metadata": {}, "source": [ "## Discussion\n", "\n", "Interchange the materials of the layers of the wall. Discuss the step responses and the simuation for weather. Give arguments for the advantages and the disadvanted of indoor and outdoor insulation.\n", "\n", "The time step depends on:\n", "\n", "- P-controller gain `Kp`:\n", " - if $K_p \\rightarrow \\infty$, then the controller is perfect and the time step needs to be small;\n", " - if $K_p \\rightarrow 0$, then, the controller is ineffective and the building is in free-running.\n", "- Capacities considered into the model:\n", " - if the capacities of the air $C_a =$ `C['Air']` and of the glass $C_g =$ `C['Glass']` are considered, then the time step is small;\n", " - if the capacities of the air and of the glass are zero, then the time step is large (and the order of the state-space model is reduced).\n", "\n", "The controller models an HVAC system able to heat (when $q_{HVAC} > 0$) and to cool (when $q_{HVAC} < 0$)." ] }, { "cell_type": "markdown", "id": "08d18237-b075-4f6c-82df-fa70d47a5216", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ "## References\n", "\n", "1. C. Ghiaus (2013) Causality issue in the heat balance method for calculating the design heating and cooling loads, *Energy* 50: 292-301, https://doi.org/10.1016/j.energy.2012.10.024, open access preprint: [HAL-03605823](https://hal.archives-ouvertes.fr/hal-03605823/document)\n", "\n", "2. C. Ghiaus (2021). Dynamic Models for Energy Control of Smart Homes, in *S. Ploix M. Amayri, N. Bouguila (eds.) Towards Energy Smart Homes*, Online ISBN: 978-3-030-76477-7, Print ISBN: 978-3-030-76476-0, Springer, pp. 163-198 (ref.)\n", "[DOI 10.1007/978-3-030-76477-7_5](https://doi.org/10.1007/978-3-030-76477-7_5), open access preprint: [HAL 03578578](https://hal.archives-ouvertes.fr/hal-03578578/document)\n", "\n", "3. J.A. Duffie, W. A. Beckman, N. Blair (2020) [Solar Engineering of Thermal Processes](https://www.eng.uc.edu/~beaucag/Classes/SolarPowerForAfrica/Solar%20Engineering%20of%20Thermal%20Processes,%20Photovoltaics%20and%20Wind.pdf), 5th ed. John Wiley & Sons, Inc. ISBN 9781119540281\n", "\n", "4. [Réglementation Thermique 2005. Méthode de calcul Th-CE.](https://pdfslide.fr/documents/rt2005-methode-de-calcul-th-ce.html) Annexe à l’arrêté du 19 juillet 2006\n", "\n", "5. H. Recknagel, E. Sprenger, E.-R. Schramek (2013) Génie climatique, 5e edition, Dunod, Paris. ISBN 978-2-10-070451-4\n", "\n", "6. J.R. Howell et al. (2021) Thermal Radiation Heat Transfer 7th edition, ISBN 978-0-367-34707-0, [A Catalogue of Configuration Factors](http://www.thermalradiation.net/indexCat.html)\n", "\n", "7. J. Widén, J. Munkhammar (2019) [Solar Radiation Theory](http://www.diva-portal.org/smash/get/diva2:1305017/FULLTEXT01.pdf), Uppsala University" ] }, { "cell_type": "markdown", "id": "192aa19d-b9ce-4ff6-a591-562a5b13ef70", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ "# [Thermal circuits assembling](04AssemblingCircuits.ipynb)\n", "\n", "# [Switch between models: heating & cooling and free-running](05SwitchModels.ipynb)\n", "\n", "# [Control input: heating & cooling and free-running](06Control_Input.ipynb)\n", "\n", "# [Radiation coupled with convection](07Coupled_rad_convection.ipynb)\n", "\n", "# [Sensible thermal load in steady-state](08Thermal_load.ipynb)\n", "\n", "# [Air flow by ventilation](09Air_flow_ventilation.ipynb)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.7" }, "toc-autonumbering": true, "toc-showcode": false, "toc-showmarkdowntxt": false, "toc-showtags": false }, "nbformat": 4, "nbformat_minor": 5 }