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

     1  package eeslism
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  // システム方程式の作成およびシステム変数の計算
     8  func Syseqv(_Elout []*ELOUT, Syseq *SYSEQ) {
     9  	var eleq, elosv []*ELOUT
    10  	var sysmcf, syscv, Y []float64
    11  	var i, m, n, Nsv int
    12  	var mrk []rune
    13  
    14  	Syseq.A = ' '
    15  	eleq = nil
    16  	elosv = nil
    17  	sysmcf = nil
    18  	syscv = nil
    19  	Y = nil
    20  
    21  	Nelout := len(_Elout)
    22  
    23  	if Nelout > 0 {
    24  		eleq = make([]*ELOUT, Nelout)
    25  
    26  		for i = 0; i < Nelout; i++ {
    27  			eleq[i] = nil
    28  		}
    29  	}
    30  
    31  	if Nelout > 0 {
    32  		elosv = make([]*ELOUT, Nelout)
    33  
    34  		for i = 0; i < Nelout; i++ {
    35  			elosv[i] = nil
    36  		}
    37  	}
    38  
    39  	mrk = make([]rune, Nelout)
    40  
    41  	for i, Elout := range _Elout {
    42  
    43  		if DEBUG {
    44  			fmt.Printf("xxx syseqv  Eo name=%s control=%c sysld=%c i=%d MAX=%d\n",
    45  				Elout.Cmp.Name, Elout.Control, Elout.Sysld, i, Nelout)
    46  		}
    47  
    48  		if dayprn && Ferr != nil {
    49  			fmt.Fprintf(Ferr, "xxx syseqv  Eo name=%s control=%c sysld=%c i=%d MAX=%d\n",
    50  				Elout.Cmp.Name, Elout.Control, Elout.Sysld, i, Nelout)
    51  		}
    52  
    53  		if Elout.Control != LOAD_SW &&
    54  			Elout.Control != FLWIN_SW &&
    55  			Elout.Control != BATCH_SW {
    56  			Elout.Sv = -1
    57  			Elout.Sysv = 0.0
    58  		}
    59  
    60  		if Elout.Control == ON_SW {
    61  			if DEBUG {
    62  				fmt.Printf("ON_SW = [i=%d m=%d n=%d] %s  G=%f\n", i, m, n, Elout.Cmp.Name, Elout.G)
    63  			}
    64  
    65  			eleq[m] = Elout
    66  			elosv[n] = Elout
    67  			mrk[n] = SYSV_EQV
    68  			Elout.Sv = n
    69  			Elout.Sld = -1
    70  			n++
    71  
    72  			if Elout.Sysld == 'y' {
    73  				elosv[n] = Elout
    74  				mrk[n] = LOAD_EQV
    75  				Elout.Sld = n
    76  				n++
    77  			}
    78  			m++
    79  		} else if Elout.Control == LOAD_SW && Elout.Sysld != 'y' {
    80  			eleq[m] = Elout
    81  			Elout.Sv = -1
    82  			Elout.Sld = -1
    83  			m++
    84  		}
    85  	}
    86  	Nsv = n
    87  
    88  	sysmcf = make([]float64, Nsv*Nsv)
    89  	syscv = make([]float64, Nsv)
    90  	Y = make([]float64, Nsv)
    91  
    92  	for i = 0; i < Nsv; i++ {
    93  		elout := eleq[i]
    94  		a := sysmcf[Nsv*i : Nsv*i+Nsv]
    95  		b := syscv[i : i+1]
    96  
    97  		if DEBUG {
    98  			fmt.Printf("xxx syseqv Elout=%d %s Ni=%d cfo=%f\n",
    99  				i, elout.Cmp.Name, elout.Ni, elout.Coeffo)
   100  		}
   101  
   102  		if dayprn && Ferr != nil {
   103  			fmt.Fprintf(Ferr, "xxx syseqv Elout=%d %s Ni=%d cfo=%f\n",
   104  				i, elout.Cmp.Name, elout.Ni, elout.Coeffo)
   105  		}
   106  
   107  		c := a
   108  		matinit(c, Nsv)
   109  
   110  		b[0] = elout.Co
   111  
   112  		if n = elout.Sv; n >= 0 {
   113  			a[n] = elout.Coeffo
   114  			if nn := elout.Sld; nn >= 0 {
   115  				a[nn] = -1.0
   116  			}
   117  		} else {
   118  			b[0] -= elout.Coeffo * elout.Sysv
   119  		}
   120  
   121  		for j := 0; j < elout.Ni; j++ {
   122  			elin := elout.Elins[j]
   123  			cfin := elout.Coeffin[j]
   124  			elov := elin.Upv
   125  
   126  			if elov != nil {
   127  				if DEBUG {
   128  					fmt.Printf("xxx syseqv Elout=%d %s  in=%d elov=%s  control=%c sys=%f\n",
   129  						i, elout.Cmp.Name, j,
   130  						elov.Cmp.Name, elov.Control, elov.Sysv)
   131  				}
   132  
   133  				if dayprn && Ferr != nil {
   134  					fmt.Fprintf(Ferr, "xxx syseqv Elout=%d %s  in=%d elov=%s  control=%c sys=%f\n",
   135  						i, elout.Cmp.Name, j,
   136  						elov.Cmp.Name, elov.Control, elov.Sysv)
   137  				}
   138  
   139  				if elov.Control == ON_SW {
   140  					n = elin.Upv.Sv
   141  					a[n] += cfin
   142  				} else if elov.Control == LOAD_SW ||
   143  					elov.Control == FLWIN_SW ||
   144  					elov.Control == BATCH_SW {
   145  					if DEBUG {
   146  						fmt.Printf("xxx syseqv elov=%s  control=%c sys=%f\n",
   147  							elov.Cmp.Name, elov.Control, elov.Sysv)
   148  					}
   149  
   150  					if dayprn && Ferr != nil {
   151  						fmt.Fprintf(Ferr, "xxx syseqv elov=%s  control=%c sys=%f\n",
   152  							elov.Cmp.Name, elov.Control, elov.Sysv)
   153  					}
   154  
   155  					b[0] -= cfin * elov.Sysv
   156  				}
   157  			}
   158  		}
   159  		if DEBUG {
   160  			fmt.Printf("xx syseqv  i=%d  b=%f\n", i, b[0])
   161  		}
   162  	}
   163  
   164  	/********* 連立方程式 ***********/
   165  
   166  	if DEBUG {
   167  		Seqprint("%.6g\t", Nsv, sysmcf, "%.6g", syscv)
   168  
   169  		//for ( i = 0; i < Nsv; i++ )
   170  		//	fmt.Printf ( "%g\n", sysmcf[i+Nsv*7] ) ;
   171  	}
   172  
   173  	if Nsv > 0 {
   174  		/**********************
   175  		matprint("%6.2f ", Nsv, sysmcf) ;
   176  		/**********************/
   177  
   178  		Matinv(sysmcf, Nsv, Nsv, "<Syseqv>")
   179  		Matmalv(sysmcf, syscv, Nsv, Nsv, Y)
   180  	}
   181  
   182  	for i = 0; i < Nsv; i++ {
   183  		if mrk[i] == SYSV_EQV {
   184  			elosv[i].Sysv = Y[i]
   185  		} else if mrk[i] == LOAD_EQV {
   186  			elosv[i].Load = Y[i]
   187  		}
   188  		if DEBUG {
   189  			fmt.Printf("%d: %s = %f\n", i, elosv[i].Cmp.Name, Y[i])
   190  		}
   191  	}
   192  
   193  	if DEBUG {
   194  		for i = 0; i < Nsv; i++ {
   195  			fmt.Printf("Y[%d]=%.5f  mrk=%c  Elo=%s\n",
   196  				i, Y[i], mrk[i], elosv[i].Cmp.Name)
   197  		}
   198  		fmt.Printf("\n")
   199  	}
   200  
   201  	if dayprn && Ferr != nil {
   202  		for i = 0; i < Nsv; i++ {
   203  			fmt.Fprintf(Ferr, "Y[%d]=%6.3f  mrk=%c  Elo=%s\n",
   204  				i, Y[i], mrk[i], elosv[i].Cmp.Name)
   205  		}
   206  		fmt.Fprintf(Ferr, "\n")
   207  	}
   208  }