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 }