github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/OPIhor.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  /*
    17     日射量、長波長放射量の計算
    18     FILE=OPIhor.c
    19     Create Date=1999.10.10
    20  
    21  */
    22  
    23  package eeslism
    24  
    25  import (
    26  	"fmt"
    27  	"io"
    28  	"math"
    29  )
    30  
    31  func OPIhor(
    32  	fp io.Writer,
    33  	fp1 io.Writer,
    34  	lpn int,
    35  	mpn int,
    36  	mp []P_MENN,
    37  	lp []P_MENN,
    38  	Wd *WDAT,
    39  	ullp *bekt,
    40  	ulmp *bekt,
    41  	gp [][]XYZ,
    42  	nday int,
    43  	monten int,
    44  ) {
    45  	var ls,
    46  		ms,
    47  		ns,
    48  		//DE,
    49  		Isky,
    50  		Rsky,
    51  		Igref,
    52  		sg,
    53  		co,
    54  		sum,
    55  		sumg,
    56  		numg,
    57  		reff,
    58  		Ig, // Igの初期化を追加 2017/7/25 佐藤
    59  		reffg,
    60  		Esky,
    61  		Px,
    62  		Py,
    63  		Pz,
    64  		S,
    65  		T float64
    66  
    67  	//DE = 2.0
    68  
    69  	var i, j, k, h int
    70  	var rp int /*--多角形ループ--*/
    71  	//var Fs float64 // 20170426 higuchi add 形態係数
    72  
    73  	ls = -Wd.Sw
    74  	ms = -Wd.Ss
    75  	ns = Wd.Sh
    76  	Esky = Sgm * math.Pow((Wd.T+273.15), 4.0)
    77  
    78  	//昼
    79  	if ns > 0.0 {
    80  		for i = 0; i < mpn; i++ {
    81  			sum = 0.0
    82  			reff = 0.0
    83  			CINC(mp[i], ls, ms, ns, &co)
    84  			if co < 0.0 {
    85  				co = 0.0
    86  			}
    87  			mp[i].Idre = Wd.Idn * co * (1.0 - mp[i].sum)
    88  
    89  			//形態係数考慮
    90  			if monten > 0 {
    91  
    92  				/*------mp面からの拡散日射を求める-------------*/
    93  				k = 0
    94  				for j = 0; j < mpn; j++ {
    95  					if mp[i].faiwall[k] > 0.0 {
    96  						CINC(mp[j], ls, ms, ns, &co)
    97  						if co < 0.0 {
    98  							co = 0.0
    99  						}
   100  
   101  						mp[j].Ihor = Wd.Idn*co*(1.0-mp[j].sum) + mp[j].faia*Wd.Isky
   102  
   103  						//mp[j].Te=Wd.T+mp[j].as*mp[j].Ihor/mp[j].alo ;
   104  						mp[j].Te = Wd.T
   105  
   106  						sum = sum + mp[j].ref*mp[j].Ihor*mp[i].faiwall[k]
   107  						reff = reff + mp[j].Eo*Sgm*mp[i].faiwall[k]*math.Pow((mp[j].Te+273.15), 4.0)
   108  					}
   109  					k++
   110  				}
   111  
   112  				/*------lp面からの拡散日射を求める--------------*/
   113  				for j = 0; j < lpn; j++ {
   114  					if mp[i].faiwall[k] > 0.0 {
   115  						CINC(lp[j], ls, ms, ns, &co)
   116  						if co > 0.0 {
   117  
   118  							/*--2018.1.26 higuchi 付設障害物、外部障害物からの反射日射をやめるため、削除
   119  							SHADOWlp(j, DE, lpn, mpn, ls, ms, ns, &ullp[j],
   120  								&ulmp[j], &lp[j], lp, mp);
   121  							*/
   122  							/*2018.1.26  higuchi add 上記変更より、以下追加*/
   123  							lp[j].sum = 1
   124  
   125  							//printf("lp[%d].sum=%f\n", j, lp[j].sum);
   126  						} else {
   127  							lp[j].sum = 1.0
   128  							co = 0.0
   129  						}
   130  
   131  						lp[j].Ihor = Wd.Idn*co*(1.0-lp[j].sum) + lp[j].faia*Wd.Isky
   132  
   133  						lp[j].Te = Wd.T
   134  
   135  						sum = sum + lp[j].ref*lp[j].Ihor*mp[i].faiwall[k]
   136  
   137  						reff = reff + 0.9*Sgm*mp[i].faiwall[k]*math.Pow((lp[j].Te+273.15), 4.0)
   138  					}
   139  					k++
   140  				}
   141  
   142  				/*------地面からの拡散日射を求める--------------*/
   143  
   144  				if mp[i].faig > 0.0 {
   145  					k = 0
   146  					sumg = 0.0
   147  					numg = 0.0
   148  
   149  					for {
   150  						if gp[i][k].X == -999 {
   151  							break
   152  						}
   153  
   154  						numg = numg + 1.0
   155  
   156  						/*--建物自身による地面の影を求める--*/
   157  						for j = 0; j < mpn; j++ {
   158  							KOUTEN(gp[i][k].X, gp[i][k].Y, gp[i][k].Z, ls, ms, ns,
   159  								&Px, &Py, &Pz, mp[j].P[0], mp[j].e)
   160  							rp = mp[j].polyd - 2
   161  							for h = 0; h < rp; h++ { /*--多角形ループ---*/
   162  								INOROUT(Px, Py, Pz, mp[j].P[0], mp[j].P[h+1], mp[j].P[h+2], &S, &T)
   163  								if (S >= 0.0 && T >= 0.0) && ((S + T) <= 1.0) {
   164  									sumg = sumg + 1.0
   165  									goto koko1
   166  								}
   167  							}
   168  						}
   169  
   170  						/*--外部障害物による地面の影を求める--*/
   171  						for j = 0; j < lpn; j++ {
   172  							KOUTEN(gp[i][k].X, gp[i][k].Y, gp[i][k].Z, ls, ms, ns,
   173  								&Px, &Py, &Pz, lp[j].P[0], lp[j].e)
   174  							rp = lp[j].polyd - 2
   175  							for h = 0; h < rp; h++ { /*--多角形ループ---*/
   176  								INOROUT(Px, Py, Pz, lp[j].P[0], lp[j].P[h+1], lp[j].P[h+2], &S, &T)
   177  								if (S >= 0.0 && T >= 0.0) && ((S + T) <= 1.0) {
   178  									sumg = sumg + lp[j].shad[nday]
   179  									goto koko1
   180  								}
   181  
   182  							}
   183  						}
   184  					koko1:
   185  						k++
   186  					}
   187  
   188  					if numg == 0.0 {
   189  						sg = 0.0
   190  					} else {
   191  						sg = sumg / numg
   192  					}
   193  
   194  					Ig = Wd.Idn*Wd.Sh*(1.0-sg) + mp[i].grpfaia*Wd.Isky
   195  
   196  					mp[i].Teg = Wd.T + 0.7*Ig/23.0
   197  
   198  					reffg = 0.9 * Sgm * mp[i].faig * math.Pow((mp[i].Teg+273.15), 4.0)
   199  				} else {
   200  					Ig = 0.0
   201  					reffg = 0.0
   202  				}
   203  
   204  				/*---------------------------------------------------------*/
   205  				Isky = Wd.Isky * mp[i].faia
   206  
   207  				Igref = mp[i].faig * mp[i].refg * Ig
   208  
   209  				mp[i].Idf = Isky + Igref + sum
   210  
   211  				mp[i].Iw = mp[i].Idre + mp[i].Idf
   212  
   213  				mp[i].rn = Wd.RN * mp[i].faia
   214  
   215  				Rsky = mp[i].faia * Wd.Rsky
   216  
   217  				mp[i].Reff = Esky - Rsky - reff - reffg
   218  			} else {
   219  				// ↓20170426 higuchi add 条件追加 形態係数を計算しないパターン
   220  
   221  				Isky = Wd.Isky * 0.5
   222  
   223  				Igref = 0.5 * mp[i].refg * Ig
   224  
   225  				mp[i].Idf = Isky + Igref
   226  
   227  				mp[i].Iw = mp[i].Idre + mp[i].Idf
   228  
   229  				mp[i].rn = Wd.RN * 0.5
   230  
   231  				Rsky = 0.5 * Wd.Rsky
   232  
   233  				// higuchi add 20170915 地面が漏れていた
   234  				reffg = 0.9 * Sgm * 0.5 * math.Pow((Wd.T+273.15), 4.0)
   235  				mp[i].Reff = Esky - Rsky - reffg
   236  			}
   237  
   238  			// ↓ 20170426 higuchi add 条件追加
   239  			if dayprn {
   240  				fmt.Fprintf(fp, "%s %f %f %f %f %f %f\n",
   241  					mp[i].opname, sg, Isky, Igref, sum, mp[i].Idf, mp[i].Idre)
   242  				fmt.Fprintf(fp1, "%s %f %f %f %f %f %f\n", mp[i].opname, Esky, Rsky, reff, reffg, mp[i].Reff, mp[i].rn)
   243  			}
   244  
   245  		}
   246  	} else {
   247  		//夜
   248  		for i = 0; i < mpn; i++ {
   249  
   250  			reff = 0.0
   251  			mp[i].Idre = 0.0
   252  			mp[i].Idf = 0.0
   253  			mp[i].Iw = 0.0
   254  
   255  			// 20170426 higuchi add 形態係数を考慮しないパターン追加 start
   256  			if monten > 0 {
   257  				mp[i].rn = Wd.RN * mp[i].faia
   258  
   259  				/*------mp面からの長波長放射を求める---------*/
   260  				k = 0
   261  				for j = 0; j < mpn; j++ {
   262  
   263  					if mp[i].faiwall[k] > 0.0 {
   264  						reff = reff + mp[j].Eo*Sgm*mp[i].faiwall[k]*math.Pow((Wd.T+273.15), 4.0)
   265  					}
   266  
   267  					k++
   268  				}
   269  
   270  				/*------lp面からの長波長放射を求める-----------*/
   271  				for j = 0; j < lpn; j++ {
   272  					if mp[i].faiwall[k] > 0.0 {
   273  						reff = reff + 0.9*Sgm*mp[i].faiwall[k]*math.Pow((Wd.T+273.15), 4.0)
   274  					}
   275  
   276  					k++
   277  				}
   278  				/*--------地面からの長波長放射を求める---------------*/
   279  
   280  				if mp[i].faig > 0.0 {
   281  					reffg = 0.9 * Sgm * mp[i].faig * math.Pow((Wd.T+273.15), 4.0)
   282  				} else {
   283  					reffg = 0.0
   284  				}
   285  
   286  				Rsky = mp[i].faia * Wd.Rsky
   287  				mp[i].Reff = Esky - Rsky - reff - reffg
   288  			} else {
   289  				mp[i].rn = Wd.RN * 0.5
   290  				Rsky = 0.5 * Wd.Rsky
   291  				// higuchi add 20170915 地面が漏れていた
   292  				reffg = 0.9 * Sgm * 0.5 * math.Pow((Wd.T+273.15), 4.0)
   293  				mp[i].Reff = Esky - Rsky - reffg
   294  			}
   295  			// 20170426 higuchi add 形態係数を考慮しないパターン追加 end
   296  
   297  			if dayprn {
   298  				fmt.Fprintf(fp1, "%s %f %f %f %f %f %f\n", mp[i].opname, Esky, Rsky, reff, reffg, mp[i].Reff, mp[i].rn)
   299  			}
   300  		}
   301  	}
   302  }