github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/epsinput.go (about) 1 package eeslism 2 3 import ( 4 "bufio" 5 6 "fmt" 7 "io" 8 "strconv" 9 "strings" 10 ) 11 12 /* シミュレーション結果、標題、識別データの入力 */ 13 14 func esondat(fi io.Reader, Estl *ESTL) { 15 var s string 16 var i, j, Nparm, Ndat int 17 var catnm, C *CATNM 18 19 Estl.Catnm = nil 20 21 for { 22 _, err := fmt.Fscanf(fi, "%s", &s) 23 if err != nil { 24 break 25 } 26 27 switch s { 28 case "-t": 29 fmt.Fscanf(fi, " %[^;];", &s) 30 Estl.Title = s 31 case "-w": 32 fmt.Fscanf(fi, "%s", &s) 33 Estl.Wdatfile = s 34 case "-tid": 35 fmt.Fscanf(fi, " %c", &Estl.Tid) 36 case "-u": 37 i := 0 38 for { 39 _, err := fmt.Fscanf(fi, "%s", &s) 40 if err != nil || s == ";" { 41 break 42 } 43 Estl.Unit[i] = s 44 i++ 45 Estl.Nunit = i 46 } 47 case "-Ntime": 48 fmt.Fscanf(fi, " %d", &Estl.Ntime) 49 case "-dtm": 50 fmt.Fscanf(fi, " %d", &Estl.dtm) 51 case "-tmid": 52 fmt.Fscanf(fi, "%s", &s) 53 Estl.Timeid = s 54 Estl.Ntimeid = len(Estl.Timeid) 55 case "-cat": 56 N := CATNMMAX 57 if N > 0 { 58 Estl.Catnm = make([]CATNM, N) 59 } 60 61 if Estl.Catnm != nil { 62 for ss := 0; ss < N; ss++ { 63 C = &Estl.Catnm[ss] 64 C.Name = "" 65 C.N = 0 66 C.Ncdata = 0 67 } 68 } 69 70 Estl.Ndata = 0 71 catidx := 0 72 for { 73 catnm = &Estl.Catnm[catidx] 74 75 _, err := fmt.Fscanf(fi, "%s", &s) 76 if err != nil || s == "*" { 77 break 78 } 79 catnm.Name = s 80 catnm.Ncdata = 0 81 fmt.Fscanf(fi, "%d", &catnm.N) 82 for i = 0; i < catnm.N; i++ { 83 fmt.Fscanf(fi, "%s %d %d", &s, &Nparm, &Ndat) 84 for j = 0; j < Nparm-1; j++ { 85 fmt.Fscanf(fi, "%s", &s) 86 } 87 Estl.Ndata += Ndat 88 catnm.Ncdata += Ndat 89 } 90 catidx++ 91 } 92 case "-wdloc": 93 fmt.Fscanf(fi, "%[^;];", &s) 94 s += " ;" 95 Estl.Wdloc = s 96 case "-Ndata": 97 fmt.Fscanf(fi, " %d", &Estl.Ndata) 98 default: 99 if s[len(s)-1] == '#' { 100 Estl.Flid = s 101 } else { 102 Eprint("<esondat>", s) 103 } 104 } 105 } 106 107 if Estl.Title != "" { 108 fmt.Printf("esondat title=%s\n", Estl.Title) 109 } 110 111 if Estl.Title != "" { 112 fmt.Printf("esondat w=%s\n", Estl.Wdatfile) 113 } 114 115 fmt.Printf("esondat tid=%c\n", Estl.Tid) 116 fmt.Printf("esondat Ntime=%d\n", Estl.Ntime) 117 fmt.Printf("esondat tmdt=%s\n", Estl.Timeid) 118 fmt.Printf("esondat flid=%s\n", Estl.Flid) 119 } 120 121 /* ----------------------------------------------------------- */ 122 123 /* 要素名、シミュレーション結果入力用記憶域確保 */ 124 125 func esoint(fi io.Reader, err string, Ntime int, Estl *ESTL, _Tlist []TLIST) { 126 var nm, id string 127 var V *rune 128 var st int 129 var cat *CATNM 130 var R *RQLIST 131 var n int 132 var catIdx = 0 133 var rqIdx = 0 134 135 cat = nil 136 R = nil 137 V = nil 138 139 if Estl.Catnm != nil { 140 cat = &Estl.Catnm[0] 141 } 142 // Rq = &Estl.Rq[0] 143 144 for i := 0; i < Estl.Ndata; i++ { 145 Tlist := &_Tlist[i] 146 fmt.Fscanf(fi, " %[^_]_%s %c %c", &nm, &id, &Tlist.Vtype, &Tlist.Ptype) 147 148 switch Tlist.Vtype { 149 case 'H', 'Q', 'E', 'q', 'e', 'm': 150 Tlist.Stype = 't' 151 case 'T', 'X', 'R', 't', 'x', 'r': 152 Tlist.Stype = 'a' 153 case 'c': 154 Tlist.Stype = 'c' 155 default: 156 switch id[len(id)-1] { 157 case 'n', 'c': 158 Tlist.Stype = 'n' 159 case 'm', 'h', 'e', 'p': 160 Tlist.Stype = 'm' 161 default: 162 s := fmt.Sprintf("xxxx %s xxx %s %s %c %c %c\n", err, nm, id, id[len(id)-1], Tlist.Vtype, Tlist.Ptype) 163 Eprint("<esoint>", s) 164 } 165 } 166 167 if Estl.Catnm != nil { 168 if n >= cat.Ncdata { 169 catIdx++ 170 cat = &Estl.Catnm[catIdx] 171 n = 0 172 } 173 Tlist.Cname = cat.Name 174 n++ 175 } else { 176 Tlist.Cname = "*" 177 } 178 179 Tlist.Name = nm 180 Tlist.Id = id 181 Tlist.Req = 'n' 182 183 if Estl.Nrqlist == 0 && Estl.Nvreq == 0 { 184 Tlist.Req = 'y' 185 } else { 186 R = &Estl.Rq[rqIdx] 187 for j := 0; j < Estl.Nrqlist; j++ { 188 if (Tlist.Name == R.Name || R.Name == "*") && 189 (Tlist.Id == R.Id || R.Id == "*") { 190 Tlist.Req = 'y' 191 break 192 } else if st = strings.IndexRune(Tlist.Name, ':'); st != -1 { 193 194 if Tlist.Name[:st] == R.Name[:st] && R.Id == "*" { 195 Tlist.Req = 'y' 196 break 197 } 198 } 199 } 200 201 for j := 0; j < Estl.Nvreq; j++ { 202 V = &Estl.Vreq[j] 203 if *V == Tlist.Vtype { 204 Tlist.Req = 'y' 205 break 206 } 207 } 208 } 209 210 switch Tlist.Ptype { 211 case 'f': 212 Tlist.Fval = make([]float64, Ntime) 213 case 'd': 214 Tlist.Ival = make([]int, Ntime) 215 case 'c': 216 Tlist.Cval = make([]rune, Ntime) 217 } 218 219 fofmt(Estl, Tlist) 220 } 221 } 222 223 /* ----------------------------------------------------------- */ 224 225 /* 出力時の書式指定 */ 226 227 func fofmt(Estl *ESTL, Tlist *TLIST) { 228 var fmt string 229 230 switch Tlist.Vtype { 231 case 't', 'T': 232 fmt = "%8.1f" 233 case 'r', 'R': 234 fmt = "%8.0f" 235 case 'x', 'X': 236 fmt = "%8.4f" 237 case 'q', 'e', 'Q', 'E': 238 fmt = "%8.1f" 239 case 'H': 240 fmt = "%8d" 241 case 'h': 242 fmt = "%04d" 243 case 'c': 244 fmt = "%c" 245 } 246 247 Tlist.Fmt = fmt 248 249 for j := 0; j < Estl.Nunit; j++ { 250 if Estl.Unit[j][0] == byte(Tlist.Vtype) { 251 Tlist.Unit = Estl.Unit[2] 252 } 253 } 254 } 255 256 /* ----------------------------------------------------------- */ 257 258 /* 年、月、日、曜日、時刻の入力 */ 259 260 func tmdata(Vcfile *VCFILE, Tmdt *TMDT, Daytm *DAYTM, perio rune) int { 261 var err error 262 fi := Vcfile.Fi 263 Estl := &Vcfile.Estl 264 r := 1 265 266 scanner := bufio.NewScanner(fi) 267 for scanner.Scan() { 268 s := scanner.Text() 269 270 if s == "-999" || s == "end" { 271 if Vcfile.Ic != 2 || perio == 'y' { 272 _, err := fi.Seek(Vcfile.Ad, io.SeekStart) 273 if err != nil { 274 panic(err) 275 } 276 Vcfile.Ic++ 277 } else { 278 return 0 279 } 280 } else { 281 D := 0 282 for i := 0; i < Estl.Ntimeid; i++ { 283 if i > 0 { 284 if scanner.Scan() { 285 s = scanner.Text() 286 } else { 287 return r 288 } 289 } 290 291 switch Estl.Timeid[i] { 292 case 'Y': //年 293 Tmdt.CYear = s 294 Tmdt.Year, err = strconv.Atoi(s) 295 if err != nil { 296 panic(err) 297 } 298 Tmdt.Dat[i] = &Tmdt.CYear 299 300 if Tmdt.Year == Daytm.Year { 301 D++ 302 } 303 case 'M': //月 304 Tmdt.CMon = s 305 Tmdt.Mon, err = strconv.Atoi(s) 306 if err != nil { 307 panic(err) 308 } 309 Tmdt.Dat[i] = &Tmdt.CMon 310 311 if Tmdt.Mon == Daytm.Mon { 312 D++ 313 } 314 case 'D': //日 315 Tmdt.CDay = s 316 Tmdt.Day, err = strconv.Atoi(s) 317 if err != nil { 318 panic(err) 319 } 320 Tmdt.Dat[i] = &Tmdt.CDay 321 322 if Tmdt.Day == Daytm.Day { 323 D++ 324 } 325 case 'W': //曜日 326 Tmdt.CWkday = s 327 Tmdt.Dat[i] = &Tmdt.CWkday 328 case 'T': //時刻 329 Tmdt.CTime = s 330 if st := strings.IndexByte(s, ':'); st != -1 { 331 s = s[:st] + "." + s[st+1:] 332 } 333 fval, err := strconv.ParseFloat(s, 64) 334 if err != nil { 335 panic(err) 336 } 337 Tmdt.Time = int(fval*100 + 0.5) 338 Tmdt.Dat[i] = &Tmdt.CTime 339 340 if Tmdt.Time-int(100*Daytm.Time+0.5) == 0 { 341 D++ 342 } 343 } 344 } 345 346 if D == Estl.Ntimeid { 347 return 1 348 } else { 349 for i := 0; i < Estl.Ndata; i++ { 350 if scanner.Scan() { 351 scanner.Text() 352 } else { 353 return r 354 } 355 } 356 } 357 } 358 } 359 360 return r 361 } 362 363 /* ----------------------------------------------------------- */ 364 365 /* シミュレーション結果データ入力 */ 366 367 func esdatgt(fi io.Reader, i int, Ndata int, Tlist []TLIST) { 368 scanner := bufio.NewScanner(fi) 369 for j := 0; j < Ndata; j++ { 370 if scanner.Scan() { 371 s := scanner.Text() 372 if Tlist[j].Req == 'y' || Tlist[j].Vtype == 'h' || Tlist[j].Vtype == 'H' { 373 switch Tlist[j].Ptype { 374 case 'f': 375 fval, err := strconv.ParseFloat(s, 64) 376 if err != nil { 377 fmt.Println(err) 378 } else { 379 Tlist[j].Fval[i] = fval 380 // fmt.Printf("<<esdatgt>> j=%d (data=%s) %s %s [%d]=%f\n", 381 // j, s, Tlist[j].name, Tlist[j].id, i, Tlist[j].fval[i]) 382 } 383 case 'd': 384 ival, err := strconv.Atoi(s) 385 if err != nil { 386 fmt.Println(err) 387 } else { 388 Tlist[j].Ival[i] = ival 389 } 390 case 'c': 391 Tlist[j].Cval[i] = rune(s[0]) 392 } 393 if j > 0 { 394 Tml := &Tlist[j-1] 395 if Tml.Vtype == 'h' || Tml.Vtype == 'H' { 396 Tlist[j].Pair = Tml 397 } 398 } 399 } 400 } 401 } 402 }