github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/eegndata.go (about)

     1  package eeslism
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"strconv"
     8  	"strings"
     9  )
    10  
    11  /*   ファイル、計算期間、出力日の入力        */
    12  
    13  // FILE
    14  //   -skyrd
    15  //   -intgtsupw
    16  //   -w
    17  //   -out
    18  // RUN
    19  //   (mm/dd) => dayys   助走期間
    20  //   mm/dd-mm/dd => days, daye, dayxs     計算開始 計算終了
    21  //   Tinit => Tini   初期温度 (15[deg])
    22  //   dTime => dtm    計算時間間隔 [s](指定しないとき3600 [s]となる)
    23  //   Stime => sttmm   計算開始時刻
    24  //   MaxIterate => MaxIterate
    25  //   RepeatDays => daye    周期定常計算の繰り返し日数の取得
    26  //   -periodic => perio, days, dayxs
    27  // PRINT
    28  //   mm/dd-mm/ddまたはmm/dd => pday
    29  //   *wd => wdpri
    30  //   *rev => revpri
    31  //   *pmv => pmvpri
    32  //   *helm => helmkey
    33  //   *log => グローバル変数 Ferr の設定
    34  //   *debug => グローバル変数 DEBUGの設定
    35  func Gdata(section *EeTokens, File string, wfname *string,
    36  	ofname *string, dtm *int, sttmm *int, dayxs *int, days *int, daye *int,
    37  	Tini *float64, pday []int, wdpri *int, revpri *int, pmvpri *int,
    38  	helmkey *rune, MaxIterate *int, Daytm *DAYTM, Wd *WDAT, perio *rune) {
    39  	var s, ss, ce, dd string
    40  	var st int
    41  	var Ms, Ds, Mxs, Dxs, Me, De int
    42  	var logprn int = 0
    43  
    44  	*dtm = 3600
    45  	*sttmm = -1
    46  
    47  	*wfname = ""
    48  
    49  	//E := fmt.Sprintf(ERRFMT, dsn)
    50  
    51  	*ofname = File
    52  
    53  	for i := 1; i < 366; i++ {
    54  		pday[i] = 0
    55  	}
    56  
    57  	if st = strings.LastIndex(*ofname, "."); st != -1 {
    58  		*ofname = (*ofname)[:st]
    59  	}
    60  
    61  	for section.IsEnd() == false {
    62  		line := section.GetLogicalLine()
    63  
    64  		if line[0] == "FILE" {
    65  			for _, s := range line[1:] {
    66  				if s == "-skyrd" { // 気象データは夜間放射量で定義されている
    67  					Wd.RNtype = 'R'
    68  				} else if s == "-intgtsupw" { // 給水温度を補間する
    69  					Wd.Intgtsupw = 'Y'
    70  				} else {
    71  					if st := strings.IndexRune(s, '='); st != -1 {
    72  						s1, s2 := s[:st], s[st+1:]
    73  
    74  						var err error
    75  						if s1 == "w" {
    76  							_, err = fmt.Sscanf(s2, "%s", &dd)
    77  							if err != nil {
    78  								panic(err)
    79  							}
    80  							*wfname = dd
    81  						} else if s1 == "out" {
    82  							_, err = fmt.Sscanf(s2, "%s", &ss)
    83  							if err != nil {
    84  								panic(err)
    85  							}
    86  
    87  							//NOTE: 何をやりたいのか不明(UDA)
    88  							const FLDELIM = "/"
    89  							if strings.LastIndex(ss, FLDELIM) == -1 {
    90  								*ofname = File
    91  
    92  								if st := strings.LastIndex(*ofname, FLDELIM); st != -1 {
    93  									s2 = ss
    94  								}
    95  							} else {
    96  								*ofname = ss
    97  							}
    98  						} else {
    99  							Eprint("<Gdata>", s)
   100  						}
   101  					}
   102  				}
   103  
   104  				if ce != "" {
   105  					break
   106  				}
   107  			}
   108  		} else if line[0] == "RUN" {
   109  			*Tini = 15.0
   110  
   111  			var err error
   112  			for i := 1; i < len(line); i++ {
   113  				s = line[i]
   114  				if strings.HasPrefix(s, "Tinit") {
   115  					kv := strings.SplitN(s, "=", 2)
   116  					*Tini, err = strconv.ParseFloat(kv[1], 64)
   117  					if err != nil {
   118  						panic(err)
   119  					}
   120  				} else if st := strings.IndexRune(s, '='); st != -1 {
   121  					key := s[:st]
   122  					value := s[st+1:]
   123  
   124  					if key == "dTime" {
   125  						// For `dTime=3600`
   126  						*dtm, err = strconv.Atoi(value)
   127  						if err != nil {
   128  							panic(err)
   129  						}
   130  					} else if key == "Stime" {
   131  						// For `Stime=0`
   132  						*sttmm, err = strconv.Atoi(value)
   133  						if err != nil {
   134  							panic(err)
   135  						}
   136  						*sttmm *= 100
   137  					} else if key == "MaxIterate" {
   138  						// For `MaxIterate=100`
   139  						*MaxIterate, err = strconv.Atoi(value)
   140  						if err != nil {
   141  							panic(err)
   142  						}
   143  					} else if key == "RepeatDays" { // 周期定常計算の繰り返し日数の取得
   144  						// For `RepeatDays=365`
   145  						var Ndays int
   146  						Ndays, err = strconv.Atoi(value)
   147  						if err != nil {
   148  							panic(err)
   149  						}
   150  
   151  						if *perio != 'y' {
   152  							fmt.Println("周期定常計算の指定がされていません")
   153  						}
   154  
   155  						*daye = *days + Ndays - 1
   156  					} else {
   157  						panic(s)
   158  					}
   159  				} else if s[0] == '(' {
   160  					// For `(1/1)`
   161  					_, err = fmt.Sscanf(s, "(%d/%d)", &Mxs, &Dxs)
   162  					if err != nil {
   163  						panic(err)
   164  					}
   165  					*dayxs = FNNday(Mxs, Dxs) // 助走計算開始日
   166  				} else if s == "-periodic" { // 周期定常計算への対応
   167  					// For `-periodic 1/1`
   168  					*perio = 'y'  // 周期定常計算フラグの変更
   169  					s = line[i+1] // 計算する日付の読み込み
   170  					i++
   171  					_, err = fmt.Sscanf(s, "%d/%d", &Ms, &Ds) // 計算する日付の取得
   172  					if err != nil {
   173  						panic(err)
   174  					}
   175  					*days = FNNday(Ms, Ds)
   176  					*dayxs = *days // 助走計算開始日
   177  					Daytm.Mon = Ms
   178  					Daytm.Day = Ds
   179  				} else if strings.IndexRune(s, '-') != -1 {
   180  					// For `1/1-12/31`
   181  					_, err = fmt.Sscanf(s, "%d/%d-%d/%d", &Ms, &Ds, &Me, &De)
   182  					if err != nil {
   183  						panic(err)
   184  					}
   185  					*days = FNNday(Ms, Ds)
   186  					*daye = FNNday(Me, De)
   187  
   188  					if Mxs == 0 {
   189  						*dayxs = *days // 助走計算開始日
   190  						Daytm.Mon = Ms
   191  						Daytm.Day = Ds
   192  					} else {
   193  						Daytm.Mon = Mxs
   194  						Daytm.Day = Dxs
   195  					}
   196  				} else {
   197  					Eprint("<Gdata>", s)
   198  				}
   199  
   200  				if ce != "" {
   201  					break
   202  				}
   203  			}
   204  			fmt.Printf("<<Gdata>> dtm=%d\n", *dtm)
   205  		} else if line[0] == "PRINT" {
   206  			for _, s := range line[1:] {
   207  				switch s {
   208  				case "*wd":
   209  					*wdpri = 1
   210  				case "*rev":
   211  					*revpri = 1
   212  				case "*pmv":
   213  					*pmvpri = 1
   214  				case "*helm":
   215  					*helmkey = 'y'
   216  				case "*log":
   217  					logprn = 1
   218  				case "*debug":
   219  					DEBUG = true
   220  				default:
   221  					if strings.IndexRune(s, '-') == -1 {
   222  						var Ms, Ds int
   223  						fmt.Sscanf(s, "%d/%d", &Ms, &Ds)
   224  						pday[FNNday(Ms, Ds)] = 1
   225  					} else {
   226  						var Ms, Ds, Me, De, ns, ne, n int
   227  						fmt.Sscanf(s, "%d/%d-%d/%d", &Ms, &Ds, &Me, &De)
   228  						ns = FNNday(Ms, Ds)
   229  						n = FNNday(Me, De)
   230  						if ns < n {
   231  							ne = n
   232  						} else {
   233  							ne = n + 365
   234  						}
   235  						for n = ns; n <= ne; n++ {
   236  							if n > 365 {
   237  								pday[n-365] = 1
   238  							} else {
   239  								pday[n] = 1
   240  							}
   241  						}
   242  					}
   243  				}
   244  			}
   245  		} else if line[0] == "*" {
   246  			break
   247  		} else {
   248  			Eprint("<Gdata>", s)
   249  		}
   250  	}
   251  
   252  	// Concatenate ".log" to the end of *ofname and copy to s
   253  	s = filepath.Join(*ofname + ".log")
   254  
   255  	// Open the file for writing
   256  	var err error
   257  	Ferr, err = os.Create(s)
   258  	if err != nil {
   259  		// Handle error
   260  	}
   261  
   262  	if logprn == 0 {
   263  		// Close the file and set ferr to nil if logprn is 0
   264  		Ferr.Close()
   265  		Ferr = nil
   266  	}
   267  }