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  }