github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/waterandair.go (about) 1 //This file is part of EESLISM. 2 // 3 //Foobar is free software : you can redistribute itand /or modify 4 //it under the terms of the GNU General Public License as published by 5 //the Free Software Foundation, either version 3 of the License, or 6 //(at your option) any later version. 7 // 8 //Foobar is distributed in the hope that it will be useful, 9 //but WITHOUT ANY WARRANTY; without even the implied warranty of 10 //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the 11 //GNU General Public License for more details. 12 // 13 //You should have received a copy of the GNU General Public License 14 //along with Foobar.If not, see < https://www.gnu.org/licenses/>. 15 16 package eeslism 17 18 import "math" 19 20 // 水、空気の物性値の計算 21 // パソコンによる空気調和計算法より作成 22 23 // 空気の密度 dblT[℃]、出力[kg/m3] 24 func FNarow(dblT float64) float64 { 25 return 1.293 / (1.0 + dblT/273.15) 26 } 27 28 // 空気の比熱 dblT[℃]、出力[J/kgK] 29 func FNac() float64 { 30 return 1005.0 31 } 32 33 // 空気の熱伝導率 dblT[℃]、出力[W/mK] 34 func FNalam(dblT float64) float64 { 35 var dblTemp float64 36 37 if dblT > -50.0 && dblT < 100.0 { 38 dblTemp = 0.0241 + 0.000077*dblT 39 } else { 40 dblTemp = -999.0 41 } 42 43 return dblTemp 44 } 45 46 // 空気の粘性係数 dblT[℃]、出力[Pa s] 47 func FNamew(dblT float64) float64 { 48 return (0.0074237 / (dblT + 390.15) * math.Pow((dblT+273.15)/293.15, 1.5)) 49 } 50 51 // 空気の動粘性係数 dblT[℃]、出力[m2/s] 52 func FNanew(dblT float64) float64 { 53 return FNamew(dblT) / FNarow(dblT) 54 } 55 56 // 空気の膨張率 dblT[℃]、出力[1/K] 57 func FNabeta(dblT float64) float64 { 58 return 1.0 / (dblT + 273.15) 59 } 60 61 // 水の密度 dblT[℃]、出力[kg/m3] 62 func FNwrow(dblT float64) float64 { 63 var dblTemp float64 64 65 if dblT > 0.0 && dblT < 100.0 { 66 dblTemp = 1000.5 - 0.068737*dblT - 0.0035781*dblT*dblT 67 } else if dblT < 200.0 { 68 dblTemp = 1008.7 - 0.28735*dblT - 0.0021643*dblT*dblT 69 } else { 70 dblTemp = -999.0 71 } 72 73 return dblTemp 74 } 75 76 // 水の比熱 dblT[℃]、出力[J/kgK] 77 func FNwc(dblT float64) float64 { 78 var dblTemp float64 79 80 if dblT > 0.0 && dblT < 100.0 { 81 dblTemp = 4210.4 - 1.356*dblT + 0.014588*dblT*dblT 82 } else if dblT < 200.0 { 83 dblTemp = 4306.8 - 2.7913*dblT + 0.018773*dblT*dblT 84 } else { 85 dblTemp = -999.0 86 } 87 88 return dblTemp 89 } 90 91 // 水の熱伝導率 dblT[℃]、出力[W/mK] 92 func FNwlam(dblT float64) float64 { 93 var dblTemp float64 94 95 if dblT > 0.0 && dblT < 100.0 { 96 dblTemp = 0.56871 + 0.0018421*dblT - 7.0427e-6*dblT*dblT 97 } else if dblT < 200.0 { 98 dblTemp = 0.60791 + 0.0012032*dblT - 4.7025e-6*dblT*dblT 99 } else { 100 dblTemp = -999.0 101 } 102 103 return dblTemp 104 } 105 106 // 水の動粘性係数 dblT[℃]、出力[m2/s] 107 func FNwnew(dblT float64) float64 { 108 var dblTemp float64 109 110 if dblT > 0.0 && dblT < 50.0 { 111 dblTemp = math.Exp(-13.233 - 0.032516*dblT + 0.000068997*dblT*dblT + 112 0.0000069513*dblT*dblT*dblT - 0.00000009386*dblT*dblT*dblT*dblT) 113 } else if dblT < 100.0 { 114 dblTemp = math.Exp(-13.618 - 0.015499*dblT - 0.000022461*dblT*dblT + 115 0.00000036334*dblT*dblT*dblT) 116 } else if dblT < 200.0 { 117 dblTemp = math.Exp(-13.698 - 0.016782*dblT + 0.000034425*dblT*dblT) 118 } else { 119 dblTemp = -999.0 120 } 121 122 return dblTemp 123 } 124 125 // 水の膨張率 dblT[℃]、出力[1/K] 126 func FNwbeta(dblT float64) float64 { 127 var dblTemp float64 128 129 if dblT > 0.0 && dblT < 50.0 { 130 dblTemp = -0.060159 + 0.018725*dblT - 0.00045278*dblT*dblT + 131 0.0000098148*dblT*dblT*dblT - 0.000000083333*dblT*dblT*dblT*dblT 132 } else if dblT < 100.0 { 133 dblTemp = -0.46048 + 0.03104*dblT - 0.000325*dblT*dblT + 134 0.0000013889*dblT*dblT*dblT 135 } else if dblT < 200.0 { 136 dblTemp = 0.33381 + 0.002847*dblT + 0.000016154*dblT*dblT 137 } else { 138 dblTemp = -999.0 139 } 140 141 return dblTemp 142 } 143 144 // 水の粘性係数 dblT[℃]、出力[Pa s] 145 func FNwmew(dblT float64) float64 { 146 return FNwnew(dblT) / FNwrow(dblT) 147 } 148 149 // 空気の熱拡散率 dblT[℃]、出力[m2/s] 150 func FNaa(dblT float64) float64 { 151 return FNalam(dblT) / FNac() / FNarow(dblT) 152 } 153 154 // 水の熱拡散率 dblT[℃]、出力[m2/s] 155 func FNwa(dblT float64) float64 { 156 return FNwlam(dblT) / FNwc(dblT) / FNwrow(dblT) 157 } 158 159 // プラントル数の計算 160 func FNPr(strF byte, dblT float64) float64 { 161 var dblTemp float64 162 163 if strF == 'A' || strF == 'a' { 164 dblTemp = FNanew(dblT) / FNaa(dblT) 165 } else if strF == 'W' || strF == 'w' { 166 dblTemp = FNwnew(dblT) / FNwa(dblT) 167 } else { 168 dblTemp = -999.0 169 } 170 171 return dblTemp 172 } 173 174 // グラスホフ数の計算 175 // dblTs:表面温度[℃] 176 // dblTa:主流温度[℃] 177 // dblx :代表長さ[m] 178 func FNGr(strF byte, dblTs, dblTa, dblx float64) float64 { 179 const dblg = 9.80665 180 181 dblT := (dblTs + dblTa) / 2. 182 183 // 温度差の計算 184 dbldT := math.Max(math.Abs(dblTs-dblTa), 0.1) 185 186 var dblBeta, n float64 187 if strF == 'A' || strF == 'a' { 188 dblBeta = FNabeta(dblT) 189 n = FNanew(dblT) 190 } else if strF == 'W' || strF == 'w' { 191 dblBeta = FNwbeta(dblT) 192 n = FNwnew(dblT) 193 } else { 194 dblBeta = -999.0 195 n = -999.0 196 } 197 198 return dblg * dblBeta * dbldT * math.Pow(dblx, 3.0) / (n * n) 199 } 200 201 // 各種定数を入力するとヌセルト数が計算される。 202 // Nu = C * (Pr Gr)^m 203 func FNCNu(dblC, dblm, dblPrGr float64) float64 { 204 return dblC * math.Pow(dblPrGr, dblm) 205 } 206 207 // 管内の強制対流熱伝達率の計算(流体は水のみ) 208 // dbld:配管内径[m] 209 // dblL:管長[m] 210 // dblv:管内流速[m/s] 211 // dblT:流体と壁面の平均温度[℃] 212 func FNhinpipe(dbld, dblL, dblv, dblT float64) float64 { 213 dblnew := FNwnew(dblT) 214 dblRe := dblv * dbld / dblnew 215 dblPr := FNPr('W', dblT) 216 dbldL := dbld / dblL 217 dblld := FNwlam(dblT) / dbld 218 219 var dblTemp float64 220 if dblRe < 2200. { 221 dblTemp = (3.66 + 0.0668*dbldL*dblRe*dblPr/(1.+0.04*math.Pow(dbldL*dblRe*dblPr, 2./3.))) * dblld 222 } else { 223 dblTemp = 0.023 * math.Pow(dblRe, 0.8) * math.Pow(dblPr, 0.4) * dblld 224 } 225 226 return dblTemp 227 } 228 229 // 円管外部の自然対流熱伝達率の計算(流体は水のみ) 230 // dbld:配管内径[m] 231 // dblT:流体と壁面の平均温度[℃] 232 func FNhoutpipe(dbld, dblTs, dblTa float64) float64 { 233 dblC := 0.5 234 dbln := 0.25 235 236 dblPr := FNPr('W', (dblTs+dblTa)/2.) 237 dblGr := FNGr('W', dblTs, dblTa, dbld) 238 239 dblNu := dblC * math.Pow(dblPr*dblGr, dbln) 240 241 return dblNu / dbld 242 }