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  }