{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 211 オットーサイクル\n", "\n", "Example: Spark-Ignition. Four-Stroke Engine\n", "\n", "## 読み込み" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import math\n", "\n", "import sys\n", "sys.path.append(r'~\\Lib\\site-packages') # Path to library directory\n", "import CoolProp\n", "import CoolProp.CoolProp as CP \n", "from CoolProp.Plots import PropertyPlot\n", "\n", "import matplotlib.pyplot as plt \n", "%matplotlib inline\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", "\n", "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## パラメータ定義" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "WF = 'air'\n", "K = 273.15\n", "bore = 0.1 # m\n", "stroke = 0.09 #m\n", "CR = 8.3 # Compression ratio\n", "N_cyl = 4 # number of cylinder\n", "N = 60 # engine speed 1/s\n", "AF = 16 # air-fuel ratio\n", "HC = 44*10**6 # heat of combusion J/kg\n", "T_amb = 32 + K # outdoor air temperature\n", "P_atm = 100*10**3 # atomospheric air temperature Pa\n", "\n", "Vol_dis_cyl = math.pi*bore**2 *stroke/4 # Displacement of each cylinder\n", "Vol_cl = Vol_dis_cyl/(CR-1) # clearance volume\n", "Vol_BDC = Vol_dis_cyl+Vol_cl #bottom dead center volume\n", "Vol_TDC = Vol_cl # top dead center volume" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### データフレーム用意" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "index = list(range(1,4+1))\n", "states = pd.DataFrame(columns=['T', 'P', 's', 'v', 'Vol', 'u', 'm'], index=index)#K, Pa, J/kg/K, m3/kg, m3/mol?, J/kg, kg/mol" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Point 1" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "states.ix[1, 'T'] = T_amb\n", "states.ix[1, 'P'] = P_atm\n", "states.ix[1, 's'] = CP.PropsSI('S', 'T', states.ix[1, 'T'], 'P', states.ix[1, 'P'], WF)\n", "states.ix[1, 'u'] = CP.PropsSI('U', 'T', states.ix[1, 'T'], 'P', states.ix[1, 'P'], WF)\n", "states.ix[1, 'v'] = 1/CP.PropsSI('D', 'T', states.ix[1, 'T'], 'P', states.ix[1, 'P'], WF)\n", "states.ix[1, 'Vol'] = Vol_BDC\n", "states.ix[1, 'm'] = states.ix[1, 'Vol'] / states.ix[1, 'v']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Point 2" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "states.ix[2, 'm'] = states.ix[1, 'm']\n", "states.ix[2, 'Vol'] = Vol_TDC\n", "states.ix[2, 'v'] = states.ix[2, 'Vol'] / states.ix[2, 'm']\n", "states.ix[2, 's'] = states.ix[1, 's']\n", "states.ix[2, 'u'] = CP.PropsSI('U', 'D', 1/states.ix[2, 'v'], 'S', states.ix[2, 's'], WF)\n", "states.ix[2, 'T'] = CP.PropsSI('T', 'D', 1/states.ix[2, 'v'], 'S', states.ix[2, 's'], WF)\n", "states.ix[2, 'P'] = CP.PropsSI('P', 'D', 1/states.ix[2, 'v'], 'S', states.ix[2, 's'], WF)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Work etc." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "m_in:8.07E-04\n", "m_f:4.75E-05\n" ] } ], "source": [ "W_comp = states.ix[2, 'm'] * states.ix[2, 'u'] - states.ix[1, 'm'] * states.ix[1, 'u'] #Compression work\n", "m_in = (Vol_BDC - Vol_TDC) / (1/CP.PropsSI('D', 'T', T_amb, 'P', P_atm, WF)) #mass of incoming air\n", "m_f = m_in / (AF+1) # mass of fuel\n", "print('m_in:{:.02E}'.format(m_in))\n", "print('m_f:{:.02E}'.format(m_f))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## State 3" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "states.ix[3, 'm'] = states.ix[2, 'm']\n", "states.ix[3, 'Vol'] = Vol_TDC\n", "states.ix[3, 'v'] = states.ix[3, 'Vol'] / states.ix[3, 'm']\n", "states.ix[3, 'u'] = (m_f * HC - states.ix[2, 'm'] * states.ix[2, 'u']) / states.ix[3, 'm'] # from Energy balance\n", "states.ix[3, 'T'] = CP.PropsSI('T', 'U', states.ix[3, 'u'], 'D', 1/states.ix[3, 'v'], WF)\n", "states.ix[3, 'P'] = CP.PropsSI('P', 'U', states.ix[3, 'u'], 'D', 1/states.ix[3, 'v'], WF)\n", "states.ix[3, 's'] = CP.PropsSI('S', 'U', states.ix[3, 'u'], 'D', 1/states.ix[3, 'v'], WF)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## State 4" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def find_P_from_v_s(WF, v, s, Pstart, Pstop, eps=1e-6):\n", " v1 = 1/CP.PropsSI('D','P',Pstart,'S', s, WF)\n", " v2 = 1/CP.PropsSI('D','P',Pstop,'S', s, WF)\n", " while abs(v2-v1)/v > eps:\n", " Pm = (Pstart+Pstop)/2.0\n", " vm = 1/CP.PropsSI('D','P',Pm,'S',s,WF)\n", " if (vm-v)*(v2-v) < 0: Pstart,v1 = Pm,vm\n", " else: Pstop,v2 = Pm,vm\n", " return Pm\n", "\n", "states.ix[4, 'm'] = states.ix[3, 'm']\n", "states.ix[4, 'Vol'] = Vol_BDC\n", "states.ix[4, 'v'] = states.ix[4, 'Vol'] / states.ix[4, 'm']\n", "states.ix[4, 's'] = states.ix[3, 's']\n", "\n", "#states.ix[4, 'P'] = CP.PropsSI('P', 'D', 1/states.ix[4, 'v'], 'S', 1/states.ix[4, 's'], WF)\n", "states.ix[4, 'P'] = find_P_from_v_s(WF, states.ix[4, 'v'], states.ix[4, 's'], states.ix[1, 'P'], states.ix[3, 'P'])\n", "\n", "#states.ix[4, 'T'] = CP.PropsSI('T', 'D', 1/states.ix[4, 'v'], 'S', 1/states.ix[4, 's'], WF)\n", "states.ix[4, 'T'] = CP.PropsSI('T', 'D', 1/states.ix[4, 'v'], 'P', states.ix[4, 'P'], WF)\n", "\n", "#states.ix[4, 'u'] = CP.PropsSI('U', 'D', 1/states.ix[4, 'v'], 'S', 1/states.ix[4, 's'], WF)\n", "states.ix[4, 'u'] = states.ix[3, 'u'] - states.ix[2, 'u']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 結果テーブルの表示" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "W_net -848.25 = W_exp -581.94 - W_comp 266.31\n", "eta: -0.41\n" ] }, { "data": { "text/html": [ "
\n", " | T | \n", "P | \n", "s | \n", "v | \n", "Vol | \n", "u | \n", "m | \n", "
---|---|---|---|---|---|---|---|
1 | \n", "305.15 | \n", "100000 | \n", "3907.63 | \n", "0.875698 | \n", "0.000803688 | \n", "343914 | \n", "0.000917768 | \n", "
2 | \n", "695.502 | \n", "1.90557e+06 | \n", "3907.63 | \n", "0.105506 | \n", "9.68299e-05 | \n", "634085 | \n", "0.000917768 | \n", "
3 | \n", "1831.19 | \n", "5.02999e+06 | \n", "4754.13 | \n", "0.105506 | \n", "9.68299e-05 | \n", "1.64231e+06 | \n", "0.000917768 | \n", "
4 | \n", "929.61 | \n", "305023 | \n", "4754.13 | \n", "0.875698 | \n", "0.000803688 | \n", "1.00823e+06 | \n", "0.000917768 | \n", "