github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/e79.go (about) 1 // Package eeslism は C言語による Open EESLISM をGo言語に移植したものです。 2 package eeslism 3 4 import ( 5 "fmt" 6 "path/filepath" 7 "strings" 8 9 "os" 10 ) 11 12 func Entry(InFile string, efl_path string) { 13 var s string 14 15 var Daytm DAYTM 16 var Simc *SIMCONTL 17 var Loc *LOCAT 18 var Wd, Wdd, Wdm WDAT 19 var dminute int 20 var Rmvls *RMVLS 21 var Eqcat *EQCAT 22 var Eqsys *EQSYS 23 var i int 24 25 /* ============================ */ 26 27 var Compnt []*COMPNT 28 var Elout []*ELOUT 29 var Elin []*ELIN 30 var Syseq SYSEQ 31 var Mpath []*MPATH 32 var Plist []*PLIST 33 var Pelm []*PELM 34 var Contl []*CONTL 35 var Ctlif []*CTLIF 36 var Ctlst []*CTLST 37 var key int 38 var Exsf EXSFS // 外皮 39 var Soldy []float64 // 日集計データ 40 var Solmon []float64 // 月集計データ 41 42 var uop, ulp []bekt 43 var ullp, ulmp *bekt 44 45 /*---------------higuchi add-------------------start*/ 46 47 var bdpn, obsn, lpn, opn, mpn, monten, polyn, treen, shadn int 48 49 var DE, co float64 50 51 var wap []float64 52 var wip [][]float64 53 54 //var uop, ulp, ullp, ulmp *bekt 55 56 var gp [][]XYZ 57 var gpn int 58 59 var fp1, fp2, fp3, fp4 *os.File 60 61 var BDP []BBDP 62 var obs []OBS 63 var tree []TREE /*-樹木データ-*/ 64 var poly []POLYGN /*--POLYGON--*/ 65 var shadtb []SHADTB /*-LP面の日射遮蔽率スケジュール-*/ 66 var op, lp, mp []P_MENN 67 var Noplpmp NOPLPMP // OP、LP、MPの定義数 68 69 var Datintvl int 70 var dcnt int 71 //var Sdstr []SHADSTR 72 73 //var st *C.char 74 // var Ipath string 75 76 BDP = nil 77 obs = nil 78 tree = nil 79 poly = nil 80 shadtb = nil 81 op = nil 82 lp = nil 83 mp = nil 84 85 // ここまで修正 satoh 2008/11/8 86 87 /*---------------higuchi add--------------------end*/ 88 89 Contl = nil 90 Ctlif = nil 91 Ctlst = nil 92 93 Mpath = nil 94 Plist = nil 95 Pelm = nil 96 Elout = nil 97 Elin = nil 98 //Ferr = nil 99 100 Wd.EarthSurface = nil 101 Exsf.EarthSrfFlg = false 102 Exsf.Exs = nil 103 Soldy = nil 104 Fbmlist = "" 105 106 Rmvls = NewRMVLS() 107 Simc = NewSIMCONTL() 108 109 Eqsys = NewEQSYS() 110 Loc = NewLOCAT() 111 Eqcat = NewEQCAT() 112 113 /* ------------------------------------------------------ */ 114 115 Psyint() 116 117 Ifile := InFile 118 s = Ifile 119 120 // 入力されたパスが"で始まる場合に除去する 121 if strings.HasPrefix(Ifile, "\"") { 122 fmt.Sscanf(Ifile, "\"%~[\"]\"", s) 123 } 124 125 // ディレクトリ名のみ 126 Ifile = filepath.Dir(Ifile) 127 128 // 注釈文の除去 129 bdata0 := Eesprera(s) 130 131 // スケジュ-ルデ-タの作成 132 EWKFile := strings.TrimSuffix(s, filepath.Ext(s)) 133 bdata, schtba, schnma, week := Eespre(bdata0, EWKFile, &key) //key=`WEEK`が含まれているかどうか 134 135 Simc.File = InFile 136 Simc.Loc = Loc 137 138 // 建築・設備システムデータ入力 139 Schdl, Flout := Eeinput( 140 EWKFile, 141 efl_path, 142 bdata, week, schtba, schnma, 143 Simc, &Exsf, Rmvls, Eqcat, Eqsys, 144 &Compnt, 145 &Elout, 146 &Elin, 147 &Mpath, 148 &Plist, 149 &Pelm, 150 &Contl, 151 &Ctlif, 152 &Ctlst, 153 &Wd, 154 &Daytm, key, 155 &bdpn, &obsn, &treen, &shadn, &polyn, &BDP, &obs, &tree, &shadtb, &poly, &monten, &gpn, &DE, &Noplpmp) 156 157 // 外部障害物のメモリを確保 158 op = make([]P_MENN, Noplpmp.Nop) 159 lp = make([]P_MENN, Noplpmp.Nlp) 160 P_MENNinit(op, Noplpmp.Nop) 161 P_MENNinit(lp, Noplpmp.Nlp) 162 163 // 最大収束回数のセット 164 LOOP_MAX := Simc.MaxIterate 165 VAV_Count_MAX := Simc.MaxIterate 166 167 // 動的カーテンの展開 168 for i := range Rmvls.Sd { 169 Sd := Rmvls.Sd[i] 170 if Sd.DynamicCode != "" { 171 ctifdecode(Sd.DynamicCode, Sd.Ctlif, Simc, Compnt, Mpath, &Wd, &Exsf, Schdl) 172 } 173 } 174 175 if bdpn != 0 { 176 177 RET := STRCUT(s, ".") 178 RET1 := RET 179 RET3 := RET 180 RET14 := RET 181 RET15 := RET 182 183 RET += "_shadow.gchi" 184 RET1 += "_I.gchi" 185 RET3 += "_ffactor.gchi" 186 RET14 += "_lwr.gchi" 187 188 var err error 189 if fp1, err = os.Create(RET); err != nil { 190 fmt.Println("File not open _shadow.gchi") 191 os.Exit(1) 192 } 193 194 if fp2, err = os.Create(RET1); err != nil { 195 fmt.Println("File not open _I.gchi") 196 os.Exit(1) 197 } 198 199 if fp3, err = os.Create(RET14); err != nil { 200 fmt.Println("File not open _lwr.gchi") 201 os.Exit(1) 202 } 203 204 if fp4, err = os.Create(RET3); err != nil { 205 fmt.Println("File not open _ffactor.gchi") 206 os.Exit(1) 207 } 208 209 // 座標の変換 210 LP_COORDNT(&lpn, bdpn, obsn, treen, polyn, poly, tree, obs, BDP, lp) 211 212 OP_COORDNT(&opn, bdpn, BDP, op, polyn, poly) 213 214 // LPの構造体に日毎の日射遮蔽率を代入 215 for i := 0; i < lpn; i++ { 216 for j := 0; j < shadn; j++ { 217 if lp[i].opname == shadtb[j].lpname { 218 for k := 1; k < 366; k++ { 219 for l := 0; l < shadtb[j].indatn; l++ { 220 if k >= shadtb[j].ndays[l] && k <= shadtb[j].ndaye[l] { 221 lp[i].shad[k] = shadtb[j].shad[l] 222 break 223 } 224 } 225 } 226 } 227 } 228 } 229 230 //---- mpの総数をカウント mpは、OP面+OPW面 --------------- 231 mpn := 0 232 for i := 0; i < opn; i++ { 233 mpn += 1 234 for j := 0; j < op[i].wd; j++ { 235 mpn += 1 236 } 237 } 238 239 //---窓壁のカウンター変数の初期化--- 240 //wap := make([]float64, opn) 241 wip := make([][]float64, opn) 242 for i := 0; i < opn; i++ { 243 if op[i].wd != 0 { 244 wip[i] = make([]float64, op[i].wd) 245 } 246 } 247 248 //---領域の確保 gp 地面の座標(X,Y,Z)--- 249 gp := make([][]XYZ, mpn) 250 for i := 0; i < mpn; i++ { 251 gp[i] = make([]XYZ, gpn+1) 252 } 253 254 //---領域の確保 mp--- 255 mp := make([]P_MENN, Noplpmp.Nmp) 256 P_MENNinit(mp, mpn) 257 258 //----OP,OPWの構造体をMPへ代入する---- 259 DAINYUU_MP(&mp, op, opn, mpn) 260 261 for i := 0; i < mpn; i++ { 262 fmt.Fprintf(fp1, "%s\n", mp[i].opname) 263 } 264 265 //---ベクトルの向きを判別する変数の初期化--- 266 //---opから見たopの位置--- 267 uop := make([]bekt, opn) 268 for i := 0; i < opn; i++ { 269 uop[i].ps = make([][]float64, opn) 270 for j := 0; j < opn; j++ { 271 uop[i].ps[j] = make([]float64, op[j].polyd) 272 } 273 } 274 275 //---opから見たlpの位置--- 276 ulp := make([]bekt, opn) 277 for i := 0; i < opn; i++ { 278 ulp[i].ps = make([][]float64, lpn) 279 for j := 0; j < lpn; j++ { 280 ulp[i].ps[j] = make([]float64, lp[j].polyd) 281 } 282 } 283 284 //---lpから見たlpの位置--- 285 ullp := make([]bekt, lpn) 286 for i := 0; i < lpn; i++ { 287 ullp[i].ps = make([][]float64, lpn) 288 for j := 0; j < lpn; j++ { 289 ullp[i].ps[j] = make([]float64, lp[j].polyd) 290 } 291 } 292 293 //---lpから見たmpの位置--- 294 ulmp := make([]bekt, lpn) 295 for i := 0; i < lpn; i++ { 296 ulmp[i].ps = make([][]float64, mpn) 297 for j := 0; j < mpn; j++ { 298 ulmp[i].ps[j] = make([]float64, mp[j].polyd) 299 } 300 } 301 302 //------CG確認用データ作成------- 303 HOUSING_PLACE(lpn, mpn, lp, mp, RET15) 304 305 //----前面地面代表点および壁面の中心点を求める-------- 306 GRGPOINT(mp, mpn) 307 for i := 0; i < lpn; i++ { 308 GDATA(&lp[i], &lp[i].G) 309 } 310 311 // 20170426 higuchi add 条件追加 形態係数を計算しないパターンを組み込んだ 312 if monten > 0 { 313 //---LPから見た天空に対する形態係数算出------ 314 FFACTOR_LP(lpn, mpn, monten, lp, mp) 315 } 316 317 for i := 0; i < mpn; i++ { 318 for j := range Rmvls.Sd { 319 if Rmvls.Sd[j].Sname == mp[i].opname { 320 mp[i].exs = Rmvls.Sd[j].exs 321 mp[i].as = Rmvls.Sd[j].as 322 mp[i].alo = Rmvls.Sd[j].alo 323 mp[i].Eo = Rmvls.Sd[j].Eo 324 break 325 } 326 } 327 } 328 329 for i := 0; i < mpn; i++ { 330 mp[i].refg = Exsf.Exs[mp[i].exs].Rg 331 //fmt.Printf("mp[%d].refg=%f\n", i, mp[i].refg) 332 } 333 334 //---面の裏か表かの判断をするためのベクトル値の算出-- 335 URA(opn, opn, op, uop, op) //--opから見たopの位置-- 336 URA(lpn, lpn, lp, ullp, lp) //--lpから見たlpの位置-- 337 URA(lpn, mpn, mp, ulmp, lp) //--lpから見たmpの位置-- 338 URA(opn, lpn, lp, ulp, op) //--opから見たlpの位置-- 339 340 // if test { 341 // /*---op,lp座標の確認-------*/ 342 // ZPRINT(lp, op, lpn, opn, RET13) 343 // ZPRINT(mp, op, mpn, opn, RET6) 344 // mp_printf(mpn, mp, RET7) 345 // lp_printf(lpn, lp, RET8) 346 // e_printf(lpn, lp, RET9) 347 // e_printf(mpn, mp, RET10) 348 // errbekt_printf(lpn, lpn, ullp, RET11) 349 // errbekt_printf(lpn, mpn, ulmp, RET12) 350 // } 351 352 fmt.Fprintf(fp2, "M\nD\nmt\nname\ngl_shadow\nIsky\nIg\nIb\nIdf\nIdre\n") 353 fmt.Fprintf(fp3, "M\nD\nmt\nname\nRsky\nreff\nreffg\nReff\n") 354 355 } 356 357 /*-----------------higuchi add-----------------------------end*/ 358 359 if DEBUG { 360 fmt.Println("eeinput end") 361 362 for i, Pe := range Pelm { 363 fmt.Printf("[%3d] Pelm=%s\n", i, Pe.Cmp.Name) 364 } 365 366 for i, Eo := range Elout { 367 fmt.Printf("[%3d] Eo_cmp=%s\n", i, Eo.Cmp.Name) 368 } 369 370 fmt.Printf("Npelm=%d Ncmalloc=%d Ncompnt=%d Nelout=%d Nelin=%d\n", 371 len(Pelm), len(Compnt), len(Compnt), len(Elout), len(Elin)) 372 } 373 374 Soldy = make([]float64, len(Exsf.Exs)) 375 Solmon = make([]float64, len(Exsf.Exs)) 376 377 DTM = float64(Simc.DTm) 378 dminute = int(float64(Simc.DTm) / 60.0) 379 Cff_kWh = DTM / 3600.0 / 1000.0 380 381 for rm := range Rmvls.Room { 382 Rm := Rmvls.Room[rm] 383 Rm.Qeqp = 0.0 384 } 385 386 // スケジュール設定のデバッグ出力 387 Schdl.dprschtable() 388 389 // 外表面方位データのデバッグ出力 390 Exsf.dprexsf() 391 392 // 壁・窓のデバッグ出力 393 Rmvls.dprwwdata() 394 395 // 室のデバッグ出力 396 Rmvls.dprroomdata() 397 398 // 重量壁体のデバッグ出力 399 Rmvls.dprballoc() 400 401 Simc.eeflopen(Flout, efl_path) 402 403 if DEBUG { 404 fmt.Println("<<main>> eeflopen ") 405 } 406 407 if Ferr != nil { 408 fmt.Fprintln(Ferr, "\n<<main>> eeflopen end") 409 } 410 411 // 壁体内部温度の初期値設定 412 Rmvls.Tinit() 413 414 if DEBUG { 415 fmt.Println("<<main>> Tinit") 416 } 417 418 if Ferr != nil { 419 fmt.Fprintln(Ferr, "\n<<main>> Tinit") 420 } 421 422 // ボイラ機器仕様の初期化 423 Eqcat.Boicaint(Simc, Compnt, &Wd, &Exsf, Schdl) 424 425 // システム使用機器の初期設定 426 Eqsys.Mecsinit(Simc, Compnt, Exsf.Exs, &Wd, Rmvls) 427 428 if DEBUG { 429 fmt.Println("<<main>> Mecsinit") 430 } 431 432 if Ferr != nil { 433 fmt.Fprintln(Ferr, "\n<<main>> Mecsinit") 434 } 435 436 /******************* 437 438 1997.11.18 熱損失係数計算用改訂 439 440 *******************/ 441 442 bdhpri(Simc.Ofname, Rmvls, &Exsf) 443 444 // xprtwallinit (Rmvls.Nmwall, Rmvls.Mw); 445 446 /* --------------------------------------------------------- */ 447 448 Daytm.Ddpri = 0 449 450 if Simc.Sttmm < 0 { 451 Simc.Sttmm = dminute 452 } 453 454 tt := Simc.Sttmm / 100 455 mm := Simc.Sttmm % 100 456 mta := (tt*60 + mm) / dminute 457 mtb := (24 * 60) / dminute 458 //mtb = 12; 459 // 110413 higuchi add 影面積をストアして、影計算を10日おきにする 460 Sdstr := make([]SHADSTR, mpn) 461 for i := 0; i < mpn; i++ { 462 Sdstr[i].sdsum = make([]float64, mtb) 463 for jj := 0; jj < mtb; jj++ { 464 Sdstr[i].sdsum[jj] = 0.0 465 } 466 } 467 468 dcnt = 0 469 470 for nday := Simc.Daystartx; nday <= Simc.Dayend; nday++ { 471 if dcnt == Datintvl { 472 dcnt = 0 473 MATINIT_sdstr(mpn, mtb, Sdstr) 474 } 475 dcnt++ 476 477 if dayprn && Ferr != nil { 478 fmt.Fprintf(Ferr, "\n\n\t===== Dayly Loop =====\n\n") 479 } 480 481 day := ((nday - 1) % 365) + 1 482 if Simc.Perio == 'y' { 483 day = Simc.Daystart 484 } 485 Daytm.DayOfYear = day 486 487 dayprn = Simc.Dayprn[day] != 0 488 489 if Simc.Perio != 'y' && nday > Simc.Daystartx { 490 Daytm.Mon, Daytm.Day = monthday(Daytm.Mon, Daytm.Day) 491 } 492 493 if nday >= Simc.Daystart { 494 Daytm.Ddpri = 1 495 } 496 if Simc.Perio == 'y' && nday != Simc.Dayend { 497 Daytm.Ddpri = 0 498 } 499 500 if nday > Simc.Daystartx { 501 mta = 1 502 } 503 504 for mt := mta; mt <= mtb; mt++ { 505 if dayprn && Ferr != nil { 506 fmt.Fprintf(Ferr, "\n\n\t===== Timely Loop =====\n\n") 507 } 508 509 if mm >= 60 { 510 mm -= 60 511 tt++ 512 } 513 514 if tt > 24 || (tt == 24 && mm > 0) { 515 tt -= 24 516 } 517 518 Daytm.Tt = tt 519 Daytm.Ttmm = tt*100 + mm 520 Daytm.Time = float64(Daytm.Ttmm) / 100.0 521 522 if DEBUG { 523 fmt.Printf("<< main >> nday=%d mm=%d mt=%d tt=%d mm=%d\n", nday, mm, mt, tt, mm) 524 } 525 526 //if (day == 16 && Daytm.ttmm == 800) 527 // fmt.Printf("xxxxxx\n") 528 529 Vcfinput(&Daytm, Simc.Nvcfile, Simc.Vcfile, Simc.Perio) 530 Weatherdt(Simc, &Daytm, Loc, &Wd, Exsf.Exs, Exsf.EarthSrfFlg) 531 532 if dayprn && Ferr != nil { 533 fmt.Fprintf(Ferr, "\n\n\n---- date=%2d/%2d nday=%d day=%d time=%5.2f ----\n", 534 Daytm.Mon, Daytm.Day, nday, day, Daytm.Time) 535 } 536 537 if DEBUG { 538 fmt.Printf("---- date=%2d %2d nday=%d day=%d time=%5.2f ----\n", 539 Daytm.Mon, Daytm.Day, nday, day, Daytm.Time) 540 } 541 542 if dayprn && Ferr != nil { 543 Flinprt(Eqsys.Flin) 544 } 545 546 /*** if (Daytm.ttmm == 100 )****/ 547 if mt == mta { 548 fmt.Printf("%d/%d", Daytm.Mon, Daytm.Day) 549 if nday < Simc.Daystart { 550 fmt.Printf(")") 551 } 552 if Daytm.Ddpri != 0 && Simc.Dayprn[day] != 0 { 553 fmt.Printf(" *") 554 } 555 fmt.Printf("\n") 556 557 /*------------------------higuchi add---形態係数の算出---------start*/ 558 //fmt.Printf("nday=%d,day=%d\n",nday,day) ; 559 //fmt.Printf("bdpn=%d\n",bdpn) ; 560 561 // 20170426 higuchi add 形態係数を計算しない処理の追加 562 if bdpn != 0 && monten > 0 { 563 if nday == Simc.Daystartx { 564 fmt.Printf("form_factor calcuration start\n") 565 GR_MONTE_CARLO(mp, mpn, lp, lpn, monten, day) 566 MONTE_CARLO(mpn, lpn, monten, mp, lp, gp, gpn, day, Simc.Daystartx) 567 ffactor_printf(fp4, mpn, lpn, mp, lp, Daytm.Mon, Daytm.Day) 568 fmt.Printf("form_factor calcuration end\n") 569 } else { 570 for i := 0; i < lpn; i++ { 571 k := day - 1 572 if k == 0 { 573 k = 365 574 } 575 if lp[i].shad[day] != lp[i].shad[k] { 576 fmt.Printf("form_factor calcuration start:shad[%d]=%f,shad[%d]=%f\n", nday, lp[i].shad[day], k, lp[i].shad[k]) 577 GR_MONTE_CARLO(mp, mpn, lp, lpn, monten, day) 578 MONTE_CARLO(mpn, lpn, monten, mp, lp, gp, gpn, day, Simc.Daystartx) 579 ffactor_printf(fp4, mpn, lpn, mp, lp, Daytm.Mon, Daytm.Day) 580 fmt.Printf("form_factor calcuration end\n") 581 break 582 } 583 } 584 } 585 586 } 587 /*------------------------higuchi add-----------------------end*/ 588 589 if DEBUG { 590 fmt.Printf(" ** daymx=%d Tgrav=%f DT=%f Tsupw=%f\n", 591 Loc.Daymxert, Loc.Tgrav, Loc.DTgr, Wd.Twsup) 592 } 593 } 594 595 // 傾斜面日射量の計算 596 Exsf.Exsfsol(&Wd) 597 598 /*==transplantation to eeslism from KAGExSUN by higuchi 070918==start*/ 599 if bdpn != 0 { 600 601 MATINIT_sum(opn, op) 602 MATINIT_sum(mpn, mp) 603 MATINIT_sum(lpn, lp) 604 605 ls := -Wd.Sw 606 ms := -Wd.Ss 607 ns := Wd.Sh 608 609 if Wd.Sh > 0.0 { 610 611 // 110413 higuchi add 下の条件 612 if dcnt == 1 { 613 614 for j := 0; j < opn; j++ { 615 616 wap[j] = 0.0 617 for i := 0; i < op[j].wd; i++ { 618 wip[j][i] = 0.0 619 } 620 CINC(op[j], ls, ms, ns, &co) 621 if co > 0.0 { 622 SHADOW(j, DE, opn, lpn, ls, ms, ns, &uop[j], &ulp[j], &op[j], op, lp, &wap[j], wip[j], day) 623 } else { 624 op[j].sum = 1.0 625 for i := 0; i < op[j].wd; i++ { 626 op[j].opw[i].sumw = 1.0 627 } 628 } 629 } 630 //fmt.Printf("dcnt1=%d\n",dcnt) ; 631 DAINYUU_SMO2(opn, mpn, op, mp, Sdstr, dcnt, mt) 632 633 // 20170426 higuchi add 条件追加 634 if dayprn { 635 shadow_printf(fp1, Daytm.Mon, Daytm.Day, Daytm.Time, mpn, mp) 636 } 637 638 } else { 639 //fmt.Printf("dcnt2=%d\n",dcnt) ; 640 DAINYUU_SMO2(opn, mpn, op, mp, Sdstr, dcnt, mt) 641 // 20170426 higuchi add 条件追加 642 if dayprn { 643 shadow_printf(fp1, Daytm.Mon, Daytm.Day, Daytm.Time, mpn, mp) 644 } 645 } 646 647 //SHADSTR *Sdstrd; 648 //Sdstrd = Sdstr; 649 //for (i = 0; i < mpn; i++, Sdstrd++) 650 //{ 651 // int m; 652 // for (m = 0; m < mtb; m++) 653 // printf("Sdstr[%d].sdsum[%d]=%f\n", i, m, Sdstrd->sdsum[m]); 654 //} 655 } 656 657 // 20170426 higuchi add 条件追加 658 if dayprn { 659 fmt.Fprintf(fp2, "%d %d %5.2f\n", Daytm.Mon, Daytm.Day, Daytm.Time) 660 fmt.Fprintf(fp3, "%d %d %5.2f\n", Daytm.Mon, Daytm.Day, Daytm.Time) 661 } 662 663 // 20170426 higuchi add 引数追加 dayprn,monten 664 OPIhor(fp2, fp3, lpn, mpn, mp, lp, &Wd, ullp, ulmp, gp, day, monten) 665 for i := range Rmvls.Sd { 666 if Rmvls.Sd[i].Sname != "" { 667 for j := 0; j < mpn; j++ { 668 if Rmvls.Sd[i].Sname == mp[j].opname { 669 Rmvls.Sd[i].Fsdw = mp[j].sum 670 //fmt.Printf("Sd->Fswd=%f\n", Rmvls.Sd[i].Fsdw) 671 Rmvls.Sd[i].Idre = mp[j].Idre 672 Rmvls.Sd[i].Idf = mp[j].Idf 673 Rmvls.Sd[i].Iw = mp[j].Iw 674 Rmvls.Sd[i].rn = mp[j].Reff 675 //fmt.Printf("Sd->ali=%f\n", Rmvls.Sd[i].ali) 676 break 677 } 678 } 679 } 680 } 681 } 682 683 /*===============higuchi 070918============================end*/ 684 if dayprn && Ferr != nil { 685 xprsolrd(Exsf.Exs) 686 } 687 688 if DEBUG { 689 xprsolrd(Exsf.Exs) 690 fmt.Println("<<main>> Exsfsol") 691 } 692 693 // 現時刻ステップのスケジュール作成 694 Eeschdlr(day, Daytm.Ttmm, Schdl, Rmvls) 695 696 if DEBUG { 697 fmt.Println("<<main>> Eeschdlr") 698 } 699 700 // 制御で使用する状態値を計算する(集熱器の相当外気温度) 701 CalcControlStatus(Eqsys, Rmvls, &Wd, &Exsf) 702 703 // 制御情報の更新 704 Contlschdlr(Contl, Mpath, Compnt) 705 706 // 空調発停スケジュール設定が完了したら人体発熱を再計算 707 for _, rm := range Rmvls.Room { 708 rm.Qischdlr() 709 } 710 711 if DEBUG { 712 fmt.Println("<<main>> Contlschdlr") 713 } 714 715 /*** 716 eloutprint(0, Nelout, Elout, Compnt); 717 *****/ 718 719 // カウンターリセット 720 Eqsys.VAVcountreset() 721 Eqsys.Valvcountreset() 722 Eqsys.Evaccountreset() 723 724 /*---- Satoh Debug VAV 2000/12/6 ----*/ 725 // ここから: VAV 計算繰り返しループ 726 for j := 0; j < VAV_Count_MAX; j++ { 727 if DEBUG { 728 fmt.Printf("\n\n====== VAV LOOP Count=%d ======\n\n\n", j) 729 } 730 if dayprn && Ferr != nil { 731 fmt.Fprintf(Ferr, "\n\n====== VAV LOOP Count=%d ======\n\n\n", j) 732 } 733 734 VAVreset := 0 735 Valvreset := 0 736 737 // ポンプ流量設定(太陽電池ポンプのみ 738 Eqsys.Pumpflow() 739 740 if DEBUG { 741 fmt.Println("<<main>> Pumpflow") 742 } 743 744 if Simc.Dayprn[day] != 0 && Ferr != nil { 745 fmt.Fprintln(Ferr, "<<main>> Pumpflow") 746 } 747 748 Pflow(Mpath, &Wd) 749 750 if DEBUG { 751 fmt.Println("<<main>> Pflow") 752 } 753 754 if dayprn && Ferr != nil { 755 fmt.Fprintln(Ferr, "<<main>> Pflow") 756 } 757 758 /************ 759 eloutprint(0, Nelout, Elout, Compnt); 760 ***********/ 761 762 Sysupv(Mpath, Rmvls) 763 764 if DEBUG { 765 fmt.Println("<<main>> Sysupv") 766 } 767 768 if dayprn && Ferr != nil { 769 fmt.Fprintln(Ferr, "<<main>> Sysupv") 770 } 771 772 /***** 773 elinprint(0, Compnt, Elout, Elin); 774 ***********/ 775 776 for i := range Rmvls.Room { 777 Rmvls.Emrk[i] = '!' 778 } 779 780 for n := range Rmvls.Sd { 781 Rmvls.Sd[n].mrk = '!' 782 } 783 784 // システム使用機器特性式係数の計算 785 Eqsys.Mecscf() 786 787 if DEBUG { 788 fmt.Println("<<main>> Mecscf") 789 } 790 791 /*======higuchi update 070918==========*/ 792 eeroomcf(&Wd, &Exsf, Rmvls, nday, mt) 793 /*=====================================*/ 794 795 if DEBUG { 796 fmt.Println("<<main>> eeroomcf") 797 } 798 799 /* 作用温度制御時の設定室内空気温度 */ 800 Rmotset(Rmvls.Room) 801 if DEBUG { 802 fmt.Println("<<main>> Rmotset End") 803 } 804 805 /* 室、放射パネルのシステム方程式作成 */ 806 Roomvar(Rmvls.Room, Rmvls.Rdpnl) 807 808 if DEBUG { 809 fmt.Println("<<main>> Roomvar") 810 eloutprint(1, Elout, Compnt) 811 elinprint(1, Compnt, Elout, Elin) 812 } 813 814 if dayprn && Ferr != nil { 815 fmt.Fprintf(Ferr, "<<main>> Roomvar\n") 816 eloutfprint(1, Elout, Compnt) 817 elinfprint(1, Compnt, Elout, Elin) 818 } 819 //eloutprint(1, Nelout, Elout, Compnt); 820 821 //hcldmodeinit(&Eqsys); 822 823 // 収束計算 824 for i := 0; i < LOOP_MAX; i++ { 825 if i == 0 { 826 hcldwetmdreset(Eqsys) 827 } 828 829 if DEBUG { 830 fmt.Printf("再計算が必要な機器のループ %d\n", i) 831 } 832 833 if dayprn && Ferr != nil { 834 fmt.Fprintf(Ferr, "再計算が必要な機器のループ %d\n\n\n", i) 835 } 836 837 LDreset := 0 838 DWreset := 0 839 TKreset := 0 840 BOIreset := 0 841 Evacreset := 0 842 PCMfunreset := 0 843 844 /******************************** 845 if ( TKreset > 0 ) 846 fmt.Printf("<< main >> nday=%d mt=%d tt=%d mm=%d TKreset=%d\n", 847 nday, mt, tt, mm, TKreset ); 848 ****************************/ 849 850 // 蓄熱槽特性式係数 851 Stankcfv(Eqsys.Stank) 852 853 // 特性式の係数 854 Hcldcfv(Eqsys.Hcload) 855 856 // システム方程式の作成およびシステム変数の計算 857 Syseqv(Elout, &Syseq) 858 859 Sysvar(Compnt) 860 861 // 室温・湿度計算結果代入、室供給熱量計算 862 // およびパネル入口温度代入、パネル供給熱量計算 863 Roomene(Rmvls, Rmvls.Room, Rmvls.Rdpnl, &Exsf, &Wd) 864 865 // 室負荷の計算 866 Roomload(Rmvls.Room, &LDreset) 867 868 // PCM家具の収束判定 869 PCMfunchk(Rmvls.Room, &Wd, &PCMfunreset) 870 871 // 壁体内部温度の計算と収束計算のチェック 872 if Rmvls.Pcmiterate == 'y' { 873 PCMwlchk(i, Rmvls, &Exsf, &Wd, &LDreset) 874 } 875 876 // 供給熱量、エネルギーの計算 877 Boiene(Eqsys.Boi, &BOIreset) 878 879 // 冷却熱量/加熱量、エネルギーの計算 880 Refaene(Eqsys.Refa, &LDreset) 881 882 // 空調負荷の計算 883 Hcldene(Eqsys.Hcload, &LDreset, &Wd) 884 885 // 供給熱量の計算 886 Hccdwreset(Eqsys.Hcc, &DWreset) 887 888 // 槽内水温、水温分布逆転の検討 889 Stanktss(Eqsys.Stank, &TKreset) 890 891 // 内部温度、熱量の計算 892 Evacene(Eqsys.Evac, &Evacreset) 893 894 if BOIreset+LDreset+DWreset+TKreset+Evacreset+PCMfunreset == 0 { 895 break 896 } 897 } 898 899 if i == LOOP_MAX { 900 fmt.Printf("収束しませんでした。 MAX=%d\n", LOOP_MAX) 901 } 902 903 // 供給熱量の計算 904 Hccene(Eqsys.Hcc) 905 906 // 風量の計算 907 VAVene(Eqsys.Vav, &VAVreset) 908 Valvene(Eqsys.Valv, &Valvreset) 909 910 if VAVreset == 0 && Valvreset == 0 { 911 break 912 } 913 914 // カウントアップ 915 Eqsys.VAVcountinc() 916 Eqsys.Valvcountinc() 917 918 // 風量が変わったら電気蓄熱暖房器の係数を再計算 919 Stheatcfv(Eqsys.Stheat) 920 } 921 // ここまで: VAV 計算繰り返しループ 922 923 // 太陽電池内蔵壁体の発電量計算 924 CalcPowerOutput(Rmvls.Sd, &Wd, &Exsf) 925 926 if Simc.Helmkey == 'y' { 927 Helmroom(Rmvls.Room, Rmvls.Qrm, &Rmvls.Qetotal, Wd.T, Wd.X) 928 } 929 930 /************* 931 fmt.Printf("xxxmain Pathheat\n") 932 Pathheat(Nmpath, Mpath) 933 ************************/ 934 935 // 室の熱取得要素の計算 936 Qrmsim(Rmvls.Room, &Wd, Rmvls.Qrm) 937 938 for rm := range Rmvls.Room { 939 Rmvls.Room[rm].Qeqp = 0.0 940 } 941 942 if DEBUG { 943 fmt.Printf("Mecsene st\n") 944 } 945 946 /* システム使用機器の供給熱量、エネルギーの計算 */ 947 Eqsys.Mecsene() 948 949 /*********************** 950 fmt.Printf("Mecsene en\n") 951 /***********************/ 952 953 if DEBUG { 954 mecsxprint(Eqsys) 955 } 956 957 /* ------------------------------------------------ */ 958 if DEBUG { 959 fmt.Printf("xxxmain 2\n") 960 } 961 962 // 前時刻の室温の入れ替え、OT、MRTの計算 963 Rmsurft(Rmvls.Room, Rmvls.Sd) 964 965 if DEBUG { 966 fmt.Printf("xxxmain 3\n") 967 } 968 969 //if (Daytm.Mon == 1 && Daytm.Day == 5 && fabs(Daytm.Time - 23.15) < 1.e-5) 970 // printf("debug\n"); 971 972 // 壁体内部温度の計算(ヒステリシス考慮PCMの状態値もここで設定) 973 RMwlt(Rmvls.Mw) 974 975 if DEBUG { 976 fmt.Printf("xxxmain 4\n") 977 } 978 979 // PMV、SET*の計算 980 Rmcomfrt(Rmvls.Room) 981 982 if DEBUG { 983 fmt.Printf("xxxmain 5\n") 984 } 985 986 //xprsolrd (Exsf.Nexs, Exsf.Exs); 987 988 // 代表日の毎時計算結果のファイル出力 989 Eeprinth(&Daytm, Simc, Flout, Rmvls, &Exsf, Mpath, Eqsys, &Wd) 990 991 if DEBUG { 992 fmt.Printf("xxxmain 6\n") 993 } 994 995 if Daytm.Ddpri != 0 { 996 // 室の日集計、月集計 997 Roomday(Daytm.Mon, Daytm.Day, day, Daytm.Ttmm, Rmvls.Room, Rmvls.Rdpnl, Simc.Dayend) 998 if Simc.Helmkey == 'y' { 999 Helmdy(day, Rmvls.Room, &Rmvls.Qetotal) 1000 } 1001 1002 Compoday(Daytm.Mon, Daytm.Day, day, Daytm.Ttmm, Eqsys, Simc.Dayend) 1003 /** if (Nqrmpri > 0) **/ 1004 Qrmsum(Daytm.Day, Rmvls.Room, Rmvls.Qrm, Rmvls.Trdav, Rmvls.Qrmd) 1005 1006 if DEBUG { 1007 fmt.Printf("xxxmain 7\n") 1008 } 1009 1010 // 気象データの日集計、月集計 1011 Wdtsum(Daytm.Mon, Daytm.Day, day, Daytm.Ttmm, &Wd, Exsf.Exs, &Wdd, &Wdm, Soldy, Solmon, Simc) 1012 } 1013 if DEBUG { 1014 fmt.Printf("xxxmain 8\n") 1015 } 1016 1017 if DEBUG { 1018 Rmvls.xprtwsrf() 1019 Rmvls.xprrmsrf() 1020 Rmvls.xprtwall() 1021 } 1022 1023 mm += dminute 1024 1025 // 時刻ループの最後 1026 } 1027 1028 // 日集計の出力 1029 Eeprintd(&Daytm, Simc, Flout, Rmvls, Exsf.Exs, Soldy, Eqsys, &Wdd) 1030 /*****fmt.Printf("xxxmain 9\n")*****/ 1031 1032 //if (Daytm.Mon == 4 && Daytm.Day == 25) 1033 // printf("debug\n"); 1034 1035 // 月集計の出力 1036 if IsEndDay(Daytm.Mon, Daytm.Day, Daytm.DayOfYear, Simc.Dayend) && Daytm.Ddpri != 0 { 1037 //fmt.Printf("月集計出力\n") 1038 Eeprintm(&Daytm, Simc, Flout, Rmvls, Exsf.Exs, Solmon, Eqsys, &Wdm) 1039 } 1040 1041 } 1042 // 月-時刻別集計値の出力 1043 Eeprintmt(Simc, Flout, Eqsys, Rmvls.Rdpnl) 1044 1045 if DEBUG { 1046 fmt.Printf("メモリ領域の解放\n") 1047 } 1048 1049 Eeflclose(Flout) 1050 1051 /*------------------higuchi add---------------------start*/ 1052 if bdpn != 0 { 1053 1054 defer fp1.Close() 1055 defer fp2.Close() 1056 defer fp3.Close() 1057 defer fp4.Close() 1058 } 1059 1060 /*---------------------higuchi 1999.7.21-----------end*/ 1061 } 1062 1063 func matiniti(A []int, N int) { 1064 for i := 0; i < N; i++ { 1065 A[i] = 0 1066 } 1067 } 1068 1069 func P_MENNinit(_pm []P_MENN, N int) { 1070 const pmax = 200 1071 for i := 0; i < N; i++ { 1072 pm := &_pm[i] 1073 pm.Nopw = 0 1074 pm.opname = "" 1075 matinit(pm.rgb[:], 3) 1076 matinit(pm.faiwall[:], pmax) 1077 pm.wd = 0 1078 pm.exs = 0 1079 pm.grpx, pm.faia, pm.faig, pm.grpfaia, pm.sum, pm.ref, pm.refg, pm.wa, pm.wb = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 1080 pm.Ihor, pm.Idre, pm.Idf, pm.Iw, pm.Reff, pm.rn, pm.Te, pm.Teg = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 1081 matinit(pm.shad[:], 365) 1082 pm.alo, pm.as, pm.Eo = 0.0, 0.0, 0.0 1083 pm.polyd, pm.sbflg = 0, 0 1084 pm.P, pm.opw = nil, nil 1085 } 1086 }