diff --git a/Oven Brick Model.ipynb b/Oven Brick Model.ipynb
new file mode 100644
index 0000000..9da05f5
--- /dev/null
+++ b/Oven Brick Model.ipynb
@@ -0,0 +1,1458 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "9e47daa3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import cantera as ct\n",
+ "import pde\n",
+ "\n",
+ "from matplotlib import pyplot as plt\n",
+ "%matplotlib widget"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "74655ac0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "grid = pde.CartesianGrid([[0, 0.14]], 32, periodic=False)\n",
+ "field = pde.ScalarField(grid, 0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "d447beea",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "eq = pde.PDE({\"c\": \"0.0001 * laplace(c)\"}, bc=[{\"derivative\": 1}, {\"value\": 0}])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "9d3fc1f0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "7ebf14f5ef9c4496aa8cf0ad6cbcdb7c",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/1.0 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "solution = eq.solve(field, t_range=1, dt=0.001)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "9564e6fc",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "a0ec1569fa484e108a0f79e7d71cc576",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/1.0 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "9a81c2f246bb4774ab9157f4eef297c1",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "image/png": "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",
+ "text/html": [
+ "\n",
+ "
\n",
+ "
\n",
+ " Figure\n",
+ "
\n",
+ "

\n",
+ "
\n",
+ " "
+ ],
+ "text/plain": [
+ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[[-9.13274059e-01 -7.43918268e-01 -5.86270837e-01 -4.46341021e-01\n",
+ " -3.27877044e-01 -2.32185354e-01 -1.58399513e-01 -1.04059738e-01\n",
+ " -6.58146580e-02 -4.00727502e-02 -2.34909844e-02 -1.32608365e-02\n",
+ " -7.21098208e-03 -3.77871294e-03 -1.90906437e-03 -9.30354685e-04\n",
+ " -4.37592261e-04 -1.98764517e-04 -8.72410176e-05 -3.70242282e-05\n",
+ " -1.52022957e-05 -6.04318828e-06 -2.32719325e-06 -8.68724285e-07\n",
+ " -3.14546983e-07 -1.10537627e-07 -3.77240727e-08 -1.25104480e-08\n",
+ " -4.03442906e-09 -1.26786676e-09 -3.95715740e-10 -1.48152483e-10]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "solution = eq.solve(solution, t_range=1, dt=0.001)\n",
+ "solution.plot()\n",
+ "print(solution.gradient(bc=[{\"derivative\": 1}, {\"value\": 0}]).data)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3164bd16",
+ "metadata": {},
+ "source": [
+ "# 연료 조성 반영 입구 조건 계산"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "1ebaaaef",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "gas = ct.Solution('gri30.xml')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "d03cafb5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "gas.TPX = 600 + 273.15, ct.one_atm, \"H2:6.42, O2:0.39, N2:47.28, CH4:1.79, CO:24.25, CO2:19.72, C2H4:0.13, C2H6:0.04\"\n",
+ "fuel_comp = gas.X"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "5bddc916",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " gri30:\n",
+ "\n",
+ " temperature 873.15 K\n",
+ " pressure 1.0133e+05 Pa\n",
+ " density 0.40894 kg/m^3\n",
+ " mean mol. weight 29.3 kg/kmol\n",
+ " phase of matter gas\n",
+ "\n",
+ " 1 kg 1 kmol \n",
+ " --------------- ---------------\n",
+ " enthalpy -2.9427e+06 -8.6222e+07 J\n",
+ " internal energy -3.1905e+06 -9.3481e+07 J\n",
+ " entropy 8194.9 2.4011e+05 J/K\n",
+ " Gibbs function -1.0098e+07 -2.9587e+08 J\n",
+ " heat capacity c_p 1254.1 36746 J/K\n",
+ " heat capacity c_v 970.34 28431 J/K\n",
+ "\n",
+ " mass frac. Y mole frac. X chem. pot. / RT\n",
+ " --------------- --------------- ---------------\n",
+ " H2 0.0044164 0.064187 -19.925\n",
+ " O2 0.0042583 0.0038992 -31.756\n",
+ " CH4 0.009799 0.017896 -38.919\n",
+ " CO 0.23178 0.24245 -41.902\n",
+ " CO2 0.29614 0.19716 -83.677\n",
+ " C2H4 0.0012445 0.0012997 -28.665\n",
+ " C2H6 0.00041043 0.00039992 -50.523\n",
+ " N2 0.45196 0.47271 -25.262\n",
+ " [ +45 minor] 0 0 \n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "gas()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "40d9a0f9",
+ "metadata": {},
+ "source": [
+ "연료 기체 구성비와 같은 원소 1몰의 완전 연소 산소 요구량"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "5cb2f86f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "2.2584483103379323\n",
+ "0.9072176564687062\n"
+ ]
+ }
+ ],
+ "source": [
+ "consider_o_in_fuel = True\n",
+ "\n",
+ "coef_O = gas.elemental_mole_fraction('C') * 2 + gas.elemental_mole_fraction('H') / 2 - (gas.elemental_mole_fraction('O') if consider_o_in_fuel else 0)\n",
+ "\n",
+ "coef_N = coef_O * 3.762\n",
+ "\n",
+ "coef_O + coef_N\n",
+ "\n",
+ "# 공기 1몰의 원자 몰수 = 2 ; O2 + N2 만으로 구성되었으면\n",
+ "\n",
+ "# 연료 기체 1몰의 원자 몰수\n",
+ "\n",
+ "mean_natoms = sum([(gas.X[i] * sum([v for v in gas.species(i).composition.values()])) for i in range(gas.n_species)])\n",
+ "print(mean_natoms)\n",
+ "\n",
+ "# 연료 기체 1몰에 필요한 공기 몰수\n",
+ "air_fuel_ratio_st = mean_natoms * (coef_N + coef_O) / 2\n",
+ "print (air_fuel_ratio_st)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "bf4af7ee",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "air = ct.Solution('gri30.xml')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "a5470a8e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " gri30:\n",
+ "\n",
+ " temperature 300 K\n",
+ " pressure 7080.3 Pa\n",
+ " density 0.081894 kg/m^3\n",
+ " mean mol. weight 28.851 kg/kmol\n",
+ " phase of matter gas\n",
+ "\n",
+ " 1 kg 1 kmol \n",
+ " --------------- ---------------\n",
+ " enthalpy 1907.6 55036 J\n",
+ " internal energy -84549 -2.4393e+06 J\n",
+ " entropy 7658.6 2.2095e+05 J/K\n",
+ " Gibbs function -2.2957e+06 -6.6231e+07 J\n",
+ " heat capacity c_p 1010.1 29141 J/K\n",
+ " heat capacity c_v 721.88 20827 J/K\n",
+ "\n",
+ " mass frac. Y mole frac. X chem. pot. / RT\n",
+ " --------------- --------------- ---------------\n",
+ " O2 0.2329 0.21 -28.895\n",
+ " N2 0.7671 0.79 -25.93\n",
+ " [ +51 minor] 0 0 \n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "air.X = \"O2:1, N2:3.762\"\n",
+ "air_comp = air.X\n",
+ "air()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "424bc158",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1240.6028257966418\n",
+ "\n",
+ " gri30:\n",
+ "\n",
+ " temperature 1513.8 K\n",
+ " pressure 1.0133e+05 Pa\n",
+ " density 0.24948 kg/m^3\n",
+ " mean mol. weight 30.989 kg/kmol\n",
+ " phase of matter gas\n",
+ "\n",
+ " 1 kg 1 kmol \n",
+ " --------------- ---------------\n",
+ " enthalpy -1.4987e+06 -4.6443e+07 J\n",
+ " internal energy -1.9048e+06 -5.9029e+07 J\n",
+ " entropy 8413.6 2.6073e+05 J/K\n",
+ " Gibbs function -1.4235e+07 -4.4112e+08 J\n",
+ " heat capacity c_p 1300.2 40291 J/K\n",
+ " heat capacity c_v 1031.9 31977 J/K\n",
+ "\n",
+ " mass frac. Y mole frac. X chem. pot. / RT\n",
+ " --------------- --------------- ---------------\n",
+ " H2 3.0791e-08 4.7331e-07 -33.192\n",
+ " H 4.6416e-10 1.427e-08 -16.596\n",
+ " O 5.5069e-07 1.0667e-06 -15.427\n",
+ " O2 0.049365 0.047808 -30.854\n",
+ " OH 2.254e-05 4.1072e-05 -32.023\n",
+ " H2O 0.026501 0.045587 -48.619\n",
+ " HO2 5.0853e-08 4.7746e-08 -47.45\n",
+ " H2O2 2.4769e-09 2.2566e-09 -64.046\n",
+ " CO 5.0256e-06 5.5601e-06 -47.675\n",
+ " CO2 0.28765 0.20255 -63.102\n",
+ " N 3.2802e-14 7.2571e-14 -13.191\n",
+ " NH3 9.034e-15 1.6438e-14 -62.979\n",
+ " NNH 1.4737e-14 1.5736e-14 -42.978\n",
+ " NO 0.0005737 0.0005925 -28.618\n",
+ " NO2 2.1637e-06 1.4575e-06 -44.045\n",
+ " N2O 4.8881e-08 3.4416e-08 -41.809\n",
+ " HNO 8.6389e-11 8.632e-11 -45.214\n",
+ " N2 0.63588 0.70341 -26.382\n",
+ " [ +35 minor] 6.3022e-15 7.2656e-15 \n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "phi = 0.70\n",
+ "\n",
+ "gas.TPX = 25+273.15, ct.one_atm, phi * fuel_comp + air_comp\n",
+ "\n",
+ "gas.equilibrate('HP')\n",
+ "\n",
+ "print(gas.T - 273.15)\n",
+ "gas()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "4c9a7916",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.4285714285714286"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "1/0.7"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "e2c9d846",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fuel = ct.Solution('gri30.xml')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "2619aaed",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fuel.TPX = 25+273.15, 1e5, fuel_comp"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "5fa14d40",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " gri30:\n",
+ "\n",
+ " temperature 298.15 K\n",
+ " pressure 1e+05 Pa\n",
+ " density 1.182 kg/m^3\n",
+ " mean mol. weight 29.3 kg/kmol\n",
+ " phase of matter gas\n",
+ "\n",
+ " 1 kg 1 kmol \n",
+ " --------------- ---------------\n",
+ " enthalpy -3.6069e+06 -1.0568e+08 J\n",
+ " internal energy -3.6915e+06 -1.0816e+08 J\n",
+ " entropy 6976.6 2.0442e+05 J/K\n",
+ " Gibbs function -5.687e+06 -1.6663e+08 J\n",
+ " heat capacity c_p 1051.5 30810 J/K\n",
+ " heat capacity c_v 767.76 22495 J/K\n",
+ "\n",
+ " mass frac. Y mole frac. X chem. pot. / RT\n",
+ " --------------- --------------- ---------------\n",
+ " H2 0.0044164 0.064187 -18.476\n",
+ " O2 0.0042583 0.0038992 -30.234\n",
+ " CH4 0.009799 0.017896 -56.545\n",
+ " CO 0.23178 0.24245 -69.79\n",
+ " CO2 0.29614 0.19716 -186.09\n",
+ " C2H4 0.0012445 0.0012997 -11.859\n",
+ " C2H6 0.00041043 0.00039992 -69.231\n",
+ " N2 0.45196 0.47271 -23.795\n",
+ " [ +45 minor] 0 0 \n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "fuel()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "e2d4686c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "h2 = fuel.species('H2')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "ce558f2c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.013281769137764726"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "h2.thermo.h(25+273.15)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fe14a891",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4b1f191f",
+ "metadata": {},
+ "source": [
+ "# 이론공연비 계산"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "60f9c29b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def stoich_AF (fuel_compostion, mole_fraction=True):\n",
+ " \"Stoichiometric Air/Fuel ratio (volume)\"\n",
+ " \n",
+ " gas = ct.Solution('gri30.xml')\n",
+ "\n",
+ " if mole_fraction:\n",
+ " gas.TPX = 600 + 273.15, ct.one_atm, fuel_compostion\n",
+ " else:\n",
+ " gas.TPY = 600 + 273.15, ct.one_atm, fuel_compostion\n",
+ " \n",
+ " fuel_comp = gas.X\n",
+ "\n",
+ " # 연료의 원자 1 몰 완전 연소에 필요한 산소 원자 몰 수\n",
+ " coef_O = gas.elemental_mole_fraction('C') * 2 + gas.elemental_mole_fraction('H') / 2 - (gas.elemental_mole_fraction('O'))\n",
+ "\n",
+ " # 연료의 원자 1 몰 완전 연소에 필요한 공기 원자 몰 수 = 산소 원자 몰 수 X (1 + 3.762)\n",
+ " coef_N = coef_O * 3.762\n",
+ "\n",
+ " # 공기 1몰의 원자 몰수 = 2 ; O2 + N2 만으로 구성되었으면\n",
+ " mean_natoms_air = 2\n",
+ "\n",
+ " # 연료 기체 1몰의 원자 몰수 (평균 분자당 원자 수)\n",
+ " mean_natoms_fuel = sum([(gas.X[i] * sum([v for v in gas.species(i).composition.values()])) for i in range(gas.n_species)])\n",
+ "\n",
+ " # 연료 기체 1몰에 필요한 공기 몰수 ()\n",
+ " air_fuel_ratio_st = mean_natoms_fuel * (coef_N + coef_O) / mean_natoms_air\n",
+ "\n",
+ " return (air_fuel_ratio_st)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "c633e758",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "coke_oven_fuel = \"H2:6.42, O2:0.39, N2:47.28, CH4:1.79, CO:24.25, CO2:19.72, C2H4:0.13, C2H6:0.04\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "d489bdf1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "st_AF = stoich_AF(coke_oven_fuel)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "825758e1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "air = ct.Solution('gri30.xml')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "99dbfd30",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "air.X = \"O2:1, N2:3.762\"\n",
+ "air_comp = air.X"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "7e1a5975",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1506.856765604754\n",
+ "\n",
+ " gri30:\n",
+ "\n",
+ " temperature 1780 K\n",
+ " pressure 1.0133e+05 Pa\n",
+ " density 0.21633 kg/m^3\n",
+ " mean mol. weight 31.597 kg/kmol\n",
+ " phase of matter gas\n",
+ "\n",
+ " 1 kg 1 kmol \n",
+ " --------------- ---------------\n",
+ " enthalpy -1.9051e+06 -6.0194e+07 J\n",
+ " internal energy -2.3734e+06 -7.4994e+07 J\n",
+ " entropy 8525 2.6936e+05 J/K\n",
+ " Gibbs function -1.708e+07 -5.3966e+08 J\n",
+ " heat capacity c_p 1351.2 42694 J/K\n",
+ " heat capacity c_v 1088.1 34380 J/K\n",
+ "\n",
+ " mass frac. Y mole frac. X chem. pot. / RT\n",
+ " --------------- --------------- ---------------\n",
+ " H2 6.2424e-06 9.7839e-05 -28.347\n",
+ " H 9.5406e-08 2.9906e-06 -14.173\n",
+ " O 1.3675e-06 2.7007e-06 -17.795\n",
+ " O2 0.00073214 0.00072297 -35.589\n",
+ " OH 6.1066e-05 0.00011345 -31.968\n",
+ " H2O 0.033613 0.058955 -46.141\n",
+ " HO2 1.1974e-08 1.1463e-08 -49.763\n",
+ " H2O2 1.4101e-09 1.3099e-09 -63.936\n",
+ " CO 0.0014344 0.0016181 -41.208\n",
+ " CO2 0.3634 0.26091 -59.003\n",
+ " HCO 2.8143e-12 3.0644e-12 -55.381\n",
+ " CH2O 6.3467e-14 6.6788e-14 -69.555\n",
+ " N 9.3579e-12 2.111e-11 -13.467\n",
+ " NH 1.4448e-12 3.0404e-12 -27.64\n",
+ " NH2 1.006e-12 1.9838e-12 -41.814\n",
+ " NH3 1.3308e-11 2.469e-11 -55.987\n",
+ " NNH 3.8031e-12 4.1406e-12 -41.107\n",
+ " NO 0.00020133 0.000212 -31.262\n",
+ " NO2 4.7618e-08 3.2705e-08 -49.056\n",
+ " N2O 1.5885e-08 1.1404e-08 -44.729\n",
+ " HNO 5.0425e-10 5.1373e-10 -45.435\n",
+ " HCN 4.3708e-14 5.1101e-14 -51.054\n",
+ " HNCO 1.5701e-11 1.153e-11 -68.848\n",
+ " NCO 1.2119e-13 9.1136e-14 -54.675\n",
+ " N2 0.60055 0.67737 -26.934\n",
+ " [ +28 minor] 1.1611e-14 8.5342e-15 \n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "phi = 1\n",
+ "\n",
+ "mix = ct.Solution('gri30.xml')\n",
+ "\n",
+ "mix.TPX = 25+273.15, ct.one_atm, phi * fuel_comp + st_AF * air_comp\n",
+ "\n",
+ "mix.equilibrate('HP')\n",
+ "\n",
+ "print(mix.T - 273.15)\n",
+ "mix()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "a20ce147",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def exhaust_stoichiometry (phi = 1, return_unburned=False):\n",
+ "\n",
+ " mix = ct.Solution('gri30.xml')\n",
+ "\n",
+ " mix.TPX = 25+273.15, ct.one_atm, phi * fuel_comp + st_AF * air_comp\n",
+ " \n",
+ " element_X = {ename: mix.elemental_mole_fraction(ename) for ename in mix.element_names}\n",
+ " \n",
+ " exhaust = ct.Solution('gri30.xml')\n",
+ " exhaust.X = {\n",
+ " \"CO2\" : element_X['C'],\n",
+ " \"H2O\" : element_X['H']/2,\n",
+ " \"O2\" : (element_X['O'] - 2*element_X['C'] - element_X['H']/2)/2,\n",
+ " \"N2\" : element_X['N']/2,\n",
+ " }\n",
+ " \n",
+ " if return_unburned:\n",
+ " return mix.mole_fraction_dict(threshold=-1), exhaust.mole_fraction_dict(threshold=-1)\n",
+ " else:\n",
+ " return exhaust.mole_fraction_dict(threshold=-1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "c49236bf",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from scipy import optimize as opt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "4e5bd0e1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " converged: True\n",
+ " flag: 'converged'\n",
+ " function_calls: 8\n",
+ " iterations: 7\n",
+ " root: 0.6547375739201831\n"
+ ]
+ }
+ ],
+ "source": [
+ "f_found = opt.root_scalar(lambda x: exhaust_stoichiometry(x)[\"O2\"] - 0.045, \n",
+ " bracket=[1e-300, 1])\n",
+ "\n",
+ "print(f_found)\n",
+ "\n",
+ "phi_O2_045 = f_found.root"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "c3d58dd5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def exhaust_equilibrium (phi = 1):\n",
+ "\n",
+ " mix = ct.Solution('gri30.xml')\n",
+ "\n",
+ " mix.TPX = 25+273.15, ct.one_atm, phi * fuel_comp + st_AF * air_comp\n",
+ " \n",
+ " mix.equilibrate(\"HP\")\n",
+ " \n",
+ " return mix.mole_fraction_dict(threshold=-1)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "dc4ca92f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ " converged: True\n",
+ " flag: 'converged'\n",
+ " function_calls: 8\n",
+ " iterations: 7\n",
+ " root: 0.6526852820518209"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "f_found = opt.root_scalar(lambda x: exhaust_equilibrium(x)[\"O2\"] - 0.045, \n",
+ " bracket=[0.5, 1])\n",
+ "\n",
+ "f_found"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "f9c07f28",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.3856202738392207"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "1 / 0.7216984471721393"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "447502a7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.4285714285714286"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "1/0.7"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "87a2118d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fuel = ct.Solution('gri30.xml')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "9a5b2b68",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fuel.TPX = 25+273.15, 1e5, fuel_comp"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "14224e71",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " gri30:\n",
+ "\n",
+ " temperature 298.15 K\n",
+ " pressure 1e+05 Pa\n",
+ " density 1.182 kg/m^3\n",
+ " mean mol. weight 29.3 kg/kmol\n",
+ " phase of matter gas\n",
+ "\n",
+ " 1 kg 1 kmol \n",
+ " --------------- ---------------\n",
+ " enthalpy -3.6069e+06 -1.0568e+08 J\n",
+ " internal energy -3.6915e+06 -1.0816e+08 J\n",
+ " entropy 6976.6 2.0442e+05 J/K\n",
+ " Gibbs function -5.687e+06 -1.6663e+08 J\n",
+ " heat capacity c_p 1051.5 30810 J/K\n",
+ " heat capacity c_v 767.76 22495 J/K\n",
+ "\n",
+ " mass frac. Y mole frac. X chem. pot. / RT\n",
+ " --------------- --------------- ---------------\n",
+ " H2 0.0044164 0.064187 -18.476\n",
+ " O2 0.0042583 0.0038992 -30.234\n",
+ " CH4 0.009799 0.017896 -56.545\n",
+ " CO 0.23178 0.24245 -69.79\n",
+ " CO2 0.29614 0.19716 -186.09\n",
+ " C2H4 0.0012445 0.0012997 -11.859\n",
+ " C2H6 0.00041043 0.00039992 -69.231\n",
+ " N2 0.45196 0.47271 -23.795\n",
+ " [ +45 minor] 0 0 \n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "fuel()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "3e637e4c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "h2 = fuel.species('H2')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "49a5dca8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.013281769137764726"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "h2.thermo.h(25+273.15)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4c6c962f",
+ "metadata": {},
+ "source": [
+ "# 발열량 계산"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "2f732468",
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "Xu, Xb = exhaust_stoichiometry(phi=phi_O2_045, return_unburned=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f7c5063d",
+ "metadata": {},
+ "source": [
+ "## 배가스 산소 농도 4.5% 연료+공기 혼합 기체 "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "53b2c1b9",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " gri30:\n",
+ "\n",
+ " temperature 298.15 K\n",
+ " pressure 1.0133e+05 Pa\n",
+ " density 1.1869 kg/m^3\n",
+ " mean mol. weight 29.039 kg/kmol\n",
+ " phase of matter gas\n",
+ "\n",
+ " 1 kg 1 kmol \n",
+ " --------------- ---------------\n",
+ " enthalpy -1.5255e+06 -4.4299e+07 J\n",
+ " internal energy -1.6109e+06 -4.6778e+07 J\n",
+ " entropy 6999.5 2.0326e+05 J/K\n",
+ " Gibbs function -3.6124e+06 -1.049e+08 J\n",
+ " heat capacity c_p 1027.5 29837 J/K\n",
+ " heat capacity c_v 741.17 21523 J/K\n",
+ "\n",
+ " mass frac. Y mole frac. X chem. pot. / RT\n",
+ " --------------- --------------- ---------------\n",
+ " H2 0.0018679 0.026906 -19.333\n",
+ " O2 0.1362 0.1236 -26.764\n",
+ " CH4 0.0041445 0.0075018 -57.401\n",
+ " CO 0.098029 0.10163 -70.646\n",
+ " CO2 0.12525 0.082645 -186.95\n",
+ " C2H4 0.00052634 0.00054482 -12.715\n",
+ " C2H6 0.00017359 0.00016764 -70.088\n",
+ " N2 0.63381 0.657 -23.453\n",
+ " [ +45 minor] 0 0 \n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "gas_u = ct.Solution('gri30.xml')\n",
+ "gas_u.TPX = 25 + 273.15, ct.one_atm, Xu\n",
+ "gas_u()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1d54eebc",
+ "metadata": {},
+ "source": [
+ "## 배가스 산소 농도 4.5% 완전 연소 배가스"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "id": "a1bc3d15",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " gri30:\n",
+ "\n",
+ " temperature 298.15 K\n",
+ " pressure 1.0133e+05 Pa\n",
+ " density 1.2684 kg/m^3\n",
+ " mean mol. weight 31.031 kg/kmol\n",
+ " phase of matter gas\n",
+ "\n",
+ " 1 kg 1 kmol \n",
+ " --------------- ---------------\n",
+ " enthalpy -2.9803e+06 -9.2481e+07 J\n",
+ " internal energy -3.0602e+06 -9.496e+07 J\n",
+ " entropy 6565.1 2.0372e+05 J/K\n",
+ " Gibbs function -4.9377e+06 -1.5322e+08 J\n",
+ " heat capacity c_p 997.71 30960 J/K\n",
+ " heat capacity c_v 729.77 22645 J/K\n",
+ "\n",
+ " mass frac. Y mole frac. X chem. pot. / RT\n",
+ " --------------- --------------- ---------------\n",
+ " O2 0.046403 0.045 -27.775\n",
+ " H2O 0.026987 0.046486 -123.33\n",
+ " CO2 0.2928 0.20645 -186.03\n",
+ " N2 0.63381 0.70206 -23.387\n",
+ " [ +49 minor] 0 0 \n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "gas_b = ct.Solution('gri30.xml')\n",
+ "gas_b.TPX = 25 + 273.15, ct.one_atm, Xb\n",
+ "gas_b()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e537f99",
+ "metadata": {},
+ "source": [
+ "## 배가스 산소 농도 4.5% 혼합 기체 kg 당 저위발열량 (J/kg)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "067ae187",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1454825.772118082"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "heating_value_J_kg = gas_u.enthalpy_mass - gas_b.enthalpy_mass\n",
+ "heating_value_J_kg"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "f8713062",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "heat_to_battery = 80 # GJ / Rev"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "42f68b81",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "3636.3636363636365"
+ ]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "heat_to_chamber = heat_to_battery * 1000 * 3 / 66 # MJ / hr\n",
+ "heat_to_chamber"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "30be4bfc",
+ "metadata": {},
+ "source": [
+ "## 연소실당 질량 유량 kg/hr"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "id": "fd85f6dc",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2499.5182970050437"
+ ]
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mfr_to_chamber = heat_to_chamber * 1e6 / heating_value_J_kg # kg / hr\n",
+ "mfr_to_chamber"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "id": "fa7ef7a2",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " gri30:\n",
+ "\n",
+ " temperature 1990.3 K\n",
+ " pressure 1.0133e+05 Pa\n",
+ " density 0.18983 kg/m^3\n",
+ " mean mol. weight 31.002 kg/kmol\n",
+ " phase of matter gas\n",
+ "\n",
+ " 1 kg 1 kmol \n",
+ " --------------- ---------------\n",
+ " enthalpy -8.9328e+05 -2.7694e+07 J\n",
+ " internal energy -1.427e+06 -4.4241e+07 J\n",
+ " entropy 8783.1 2.7229e+05 J/K\n",
+ " Gibbs function -1.8374e+07 -5.6963e+08 J\n",
+ " heat capacity c_p 1347.2 41767 J/K\n",
+ " heat capacity c_v 1079 33452 J/K\n",
+ "\n",
+ " mass frac. Y mole frac. X chem. pot. / RT\n",
+ " --------------- --------------- ---------------\n",
+ " H2 3.8291e-06 5.8883e-05 -29.203\n",
+ " H 3.798e-07 1.1681e-05 -14.602\n",
+ " O 6.69e-05 0.00012964 -15.939\n",
+ " O2 0.045092 0.043688 -31.879\n",
+ " OH 0.00048954 0.00089239 -30.541\n",
+ " H2O 0.02669 0.045932 -45.143\n",
+ " HO2 6.0747e-07 5.7059e-07 -46.48\n",
+ " H2O2 1.9061e-08 1.7373e-08 -61.082\n",
+ " CO 0.001079 0.0011942 -41.097\n",
+ " CO2 0.29111 0.20507 -57.036\n",
+ " HCO 4.8149e-12 5.1441e-12 -55.699\n",
+ " CH2O 2.8094e-14 2.9008e-14 -70.301\n",
+ " N 2.9746e-10 6.5837e-10 -13.636\n",
+ " NH 1.4836e-11 3.0632e-11 -28.238\n",
+ " NH2 2.3841e-12 4.6128e-12 -42.839\n",
+ " NH3 4.3381e-12 7.8968e-12 -57.441\n",
+ " NNH 1.8258e-11 1.9504e-11 -41.873\n",
+ " NO 0.003114 0.0032174 -29.575\n",
+ " NO2 3.837e-06 2.5857e-06 -45.514\n",
+ " N2O 2.4382e-07 1.7174e-07 -43.211\n",
+ " HNO 6.6639e-09 6.6614e-09 -44.177\n",
+ " HCN 1.9162e-14 2.1981e-14 -53.395\n",
+ " HOCN 1.3976e-14 1.0071e-14 -69.335\n",
+ " HNCO 9.1269e-12 6.5765e-12 -69.335\n",
+ " NCO 5.5326e-13 4.0822e-13 -54.733\n",
+ " N2 0.63235 0.6998 -27.272\n",
+ " [ +27 minor] 7.2355e-17 8.6041e-17 \n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "gas_chamber = ct.Solution('gri30.xml')\n",
+ "gas_chamber.TPX = 600 + 273.15, ct.one_atm, Xu\n",
+ "gas_chamber.equilibrate(\"HP\")\n",
+ "gas_chamber()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "22b66a96",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "eq_state = gas_chamber.TPX"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 77,
+ "id": "683e1479",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "684763.1753790071 154859298.7922234\n",
+ "0.0 187247735.976\n"
+ ]
+ },
+ {
+ "ename": "ValueError",
+ "evalue": "f(a) and f(b) must have different signs",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
+ "Input \u001b[1;32mIn [77]\u001b[0m, in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 15\u001b[0m \u001b[38;5;28mprint\u001b[39m(h0 \u001b[38;5;241m-\u001b[39m h1, mfr_to_chamber\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m3600\u001b[39m \u001b[38;5;241m*\u001b[39m (h0 \u001b[38;5;241m-\u001b[39m h1) \u001b[38;5;241m-\u001b[39m htc \u001b[38;5;241m*\u001b[39m area_chamber_wall \u001b[38;5;241m*\u001b[39m (((eq_state[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m-\u001b[39m Tout)\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m \u001b[38;5;241m-\u001b[39m Twall0) \u001b[38;5;241m+\u001b[39m ((eq_state[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m-\u001b[39m Tout)\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m \u001b[38;5;241m-\u001b[39m Twall1))\n\u001b[0;32m 16\u001b[0m )\n\u001b[0;32m 18\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m mfr_to_chamber\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m3600\u001b[39m \u001b[38;5;241m*\u001b[39m (h0 \u001b[38;5;241m-\u001b[39m h1) \u001b[38;5;241m-\u001b[39m htc \u001b[38;5;241m*\u001b[39m area_chamber_wall \u001b[38;5;241m*\u001b[39m (((eq_state[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m-\u001b[39m Tout)\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m \u001b[38;5;241m-\u001b[39m Twall0) \u001b[38;5;241m+\u001b[39m ((eq_state[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m-\u001b[39m Tout)\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m \u001b[38;5;241m-\u001b[39m Twall1))\n\u001b[1;32m---> 20\u001b[0m f_found \u001b[38;5;241m=\u001b[39m \u001b[43mopt\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mroot_scalar\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchamber_energy_balance\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 21\u001b[0m \u001b[43m \u001b[49m\u001b[43mbracket\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[38;5;28;43mmin\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mTwall0\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mTwall1\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meq_state\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 23\u001b[0m \u001b[38;5;28mprint\u001b[39m(f_found)\n\u001b[0;32m 26\u001b[0m f_found\u001b[38;5;241m.\u001b[39mroot \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m273.15\u001b[39m\n",
+ "File \u001b[1;32m~\\miniconda3\\lib\\site-packages\\scipy\\optimize\\_root_scalar.py:249\u001b[0m, in \u001b[0;36mroot_scalar\u001b[1;34m(f, args, method, bracket, fprime, fprime2, x0, x1, xtol, rtol, maxiter, options)\u001b[0m\n\u001b[0;32m 246\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mBracket needed for \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m method)\n\u001b[0;32m 248\u001b[0m a, b \u001b[38;5;241m=\u001b[39m bracket[:\u001b[38;5;241m2\u001b[39m]\n\u001b[1;32m--> 249\u001b[0m r, sol \u001b[38;5;241m=\u001b[39m methodc(f, a, b, args\u001b[38;5;241m=\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 250\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m meth \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msecant\u001b[39m\u001b[38;5;124m'\u001b[39m]:\n\u001b[0;32m 251\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m x0 \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
+ "File \u001b[1;32m~\\miniconda3\\lib\\site-packages\\scipy\\optimize\\zeros.py:776\u001b[0m, in \u001b[0;36mbrentq\u001b[1;34m(f, a, b, args, xtol, rtol, maxiter, full_output, disp)\u001b[0m\n\u001b[0;32m 774\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m rtol \u001b[38;5;241m<\u001b[39m _rtol:\n\u001b[0;32m 775\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrtol too small (\u001b[39m\u001b[38;5;132;01m%g\u001b[39;00m\u001b[38;5;124m < \u001b[39m\u001b[38;5;132;01m%g\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m (rtol, _rtol))\n\u001b[1;32m--> 776\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43m_zeros\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_brentq\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mxtol\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrtol\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmaxiter\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfull_output\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdisp\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 777\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m results_c(full_output, r)\n",
+ "\u001b[1;31mValueError\u001b[0m: f(a) and f(b) must have different signs"
+ ]
+ }
+ ],
+ "source": [
+ "htc = 568 # W / m2 / K\n",
+ "\n",
+ "Twall0 = 1200 + 273.15\n",
+ "Twall1 = 1200 + 273.15\n",
+ "\n",
+ "area_chamber_wall = 6.7 * 16.7 \n",
+ "def chamber_energy_balance (Tout):\n",
+ " \n",
+ " gas_chamber.TPX = eq_state\n",
+ " h0 = gas_chamber.enthalpy_mass\n",
+ " \n",
+ " gas_chamber.TP = Tout, gas_chamber.P\n",
+ " h1 = gas_chamber.enthalpy_mass\n",
+ " \n",
+ " print(h0 - h1, mfr_to_chamber/3600 * (h0 - h1) - htc * area_chamber_wall * (((eq_state[0] - Tout)/2 - Twall0) + ((eq_state[0] - Tout)/2 - Twall1))\n",
+ ")\n",
+ " \n",
+ " return mfr_to_chamber/3600 * (h0 - h1) - htc * area_chamber_wall * (((eq_state[0] - Tout)/2 - Twall0) + ((eq_state[0] - Tout)/2 - Twall1))\n",
+ "\n",
+ "f_found = opt.root_scalar(chamber_energy_balance,\n",
+ " bracket=[min(Twall0, Twall1), eq_state[0]])\n",
+ "\n",
+ "print(f_found)\n",
+ "\n",
+ "\n",
+ "f_found.root - 273.15"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 78,
+ "id": "d5e7dad6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1473.15"
+ ]
+ },
+ "execution_count": 78,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "min(Twall0, Twall1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1470c1e2",
+ "metadata": {},
+ "source": [
+ "# 공급 열량 오더 추정"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "id": "858a862e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "346.5"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# 50'C 장입탄 1 톤을 1100'C 코크스로 건류시키기 위해 필요한 열량\n",
+ "heat_coking_mcal_per_ton = (1100 - 50) * 0.33 # Mcal / t-c\n",
+ "heat_coking_mcal_per_ton"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "id": "d9a3443d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "925.2"
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# 50`C 물 1톤을 800`C 수증기로 증발하는데 필요한 열량\n",
+ "# 액체 가열 + 증발 + 증기 가열\n",
+ "heat_evap_mcal_per_ton = 1 * (100 - 50) + 539.2 + 0.48*(800-100)\n",
+ "heat_evap_mcal_per_ton"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "id": "bc35e30a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 1~4 기 장입 습탄 34 톤 중 수분 5.9% (2 톤) 제외 건탄 32 톤\n",
+ "# 1 문당 장입에서 추출까지 필요한 열량\n",
+ "heat_total_mcal = 32 * heat_coking_mcal_per_ton + 2 * heat_evap_mcal_per_ton # Mcal\n",
+ "heat_total_gj = heat_total_mcal / 1000 * 4.184 / 0.6 # GJ"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "id": "c5a556cd",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 1 문에 시간당 공급되는 "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "2b8e5d35",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "59.4"
+ ]
+ },
+ "execution_count": 53,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# 건류 시간 동안 rev 횟수\n",
+ "n_rev_total = 3 * 24 * 66 / 80\n",
+ "\n",
+ "n_rev_total"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "id": "9e3eee55",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "100.24864"
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "66 * heat_total_gj / n_rev_total"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "id": "4ae27703",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 80 GJ/rev 는 모든 문에 공급되는 열량이 맞다"
+ ]
+ }
+ ],
+ "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.12"
+ },
+ "toc": {
+ "base_numbering": 1,
+ "nav_menu": {},
+ "number_sections": true,
+ "sideBar": true,
+ "skip_h1_title": false,
+ "title_cell": "Table of Contents",
+ "title_sidebar": "Contents",
+ "toc_cell": false,
+ "toc_position": {
+ "height": "calc(100% - 180px)",
+ "left": "10px",
+ "top": "150px",
+ "width": "384px"
+ },
+ "toc_section_display": true,
+ "toc_window_display": true
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
|