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  }