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

     1  package eeslism
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  // Upo, Upv の書き換え
     8  // NOTE: おそらく、 Upoは経路要素における上流の要素を指す。
     9  //       Upvは計算時に参照すべき上流要素を指す。多くの場合は Upo == Upv だと考えらえる。
    10  func Sysupv(Mpath []*MPATH, Rmvls *RMVLS) {
    11  	var Rdpnl *RDPNL
    12  	var Nrdpnl int
    13  	var up *ELOUT
    14  
    15  	for m, mpath := range Mpath {
    16  		/* 停止要素のシステム方程式からの除外 */
    17  
    18  		if DEBUG {
    19  			fmt.Printf("\n\n<< Sysupv >> m=%d  MAX=%d\n", m, len(Mpath))
    20  		}
    21  
    22  		for i, plist := range mpath.Plist {
    23  
    24  			if DEBUG {
    25  				fmt.Printf("\n<<Sysupv>  i=%d  iMAX=%d\n", i, len(mpath.Plist))
    26  				fmt.Printf("OFF_SW=%c  Plist->control=%c\n", OFF_SW, plist.Control)
    27  			}
    28  			if dayprn && Ferr != nil {
    29  				fmt.Fprintf(Ferr, "\n<<Sysupv>  i=%d  iMAX=%d\n", i, len(mpath.Plist))
    30  				fmt.Fprintf(Ferr, "OFF_SW=%c  Plist->control=%c\n", OFF_SW, plist.Control)
    31  			}
    32  
    33  			if plist.Control != OFF_SW {
    34  				// 末端経路が停止してなければ:
    35  				//
    36  
    37  				// 末端経路が分岐・合流の場合は、最初の要素を無視する
    38  				var pelmStartIdx int
    39  				if plist.Type == DIVERG_LPTP || plist.Type == CONVRG_LPTP {
    40  					pelmStartIdx = 1
    41  				} else {
    42  					pelmStartIdx = 0
    43  				}
    44  
    45  				// Testcode
    46  				pelm := plist.Pelm[pelmStartIdx]
    47  				if pelm.Out != nil && pelm.Out.Control != FLWIN_SW && pelm.In != nil {
    48  					up = pelm.In.Upo
    49  				}
    50  				plist.Plmvb = nil
    51  
    52  				// 末端経路内の要素のループ
    53  				for j := pelmStartIdx; j < len(plist.Pelm); j++ {
    54  					pelm = plist.Pelm[j]
    55  					if DEBUG {
    56  						fmt.Printf("\n<< sysupv >> pelm=%d %s  MAX=%d\n", j, pelm.Cmp.Name, len(plist.Pelm))
    57  						if pelm.Out != nil {
    58  							fmt.Printf("<< Sysupv >> Pelm->out->control=%c\n", pelm.Out.Control)
    59  						}
    60  					}
    61  					if dayprn && Ferr != nil {
    62  						fmt.Fprintf(Ferr, "\n<< sysupv >> pelm=%d %s  MAX=%d\n", j, pelm.Cmp.Name, len(plist.Pelm))
    63  						if pelm.Out != nil {
    64  							fmt.Fprintf(Ferr, "<< Sysupv >> Pelm->out->control=%c\n", pelm.Out.Control)
    65  						}
    66  					}
    67  					if pelm.Out == nil {
    68  						pelm.In.Upv = up
    69  						if plist.Plmvb == nil {
    70  							// 末端経路内で出口がない要素のうち経路内で最上流のもの
    71  							plist.Plmvb = pelm
    72  						}
    73  					} else if pelm.Out.Control != OFF_SW {
    74  						if DEBUG {
    75  							fmt.Printf("<<<<<< Pelm->out->control=%c FLWIN_SW=%c\n", pelm.Out.Control, FLWIN_SW)
    76  						}
    77  						if dayprn && Ferr != nil {
    78  							fmt.Fprintf(Ferr, "<<<<<< Pelm->out->control=%c FLWIN_SW=%c\n", pelm.Out.Control, FLWIN_SW)
    79  						}
    80  						if pelm.Out.Control == FLWIN_SW {
    81  							up = pelm.Out
    82  						} else {
    83  							if DEBUG {
    84  								fmt.Printf("up->cmp->name=%s\n", up.Cmp.Name)
    85  							}
    86  
    87  							if dayprn && Ferr != nil {
    88  								fmt.Fprintf(Ferr, "up->cmp->name=%s\n", up.Cmp.Name)
    89  							}
    90  
    91  							// Testcode
    92  							if pelm.In != nil {
    93  								pelm.In.Upv = up
    94  							}
    95  
    96  							if DEBUG {
    97  								fmt.Printf("<< Sysupv >> pelm=%s up=%s\n", pelm.Cmp.Name, pelm.In.Upv.Cmp.Name)
    98  							}
    99  
   100  							up = pelm.Out
   101  							if plist.Plmvb == nil {
   102  								plist.Plmvb = pelm
   103  							}
   104  						}
   105  					} else if plist.Batch && j == 0 {
   106  						up = pelm.Out
   107  					} else {
   108  						if DEBUG {
   109  							fmt.Printf("<Sysupv> 1\n")
   110  						}
   111  						if pelm.In != nil {
   112  							pelm.In.Upv = nil
   113  						}
   114  						if DEBUG {
   115  							fmt.Printf("<Sysupv> 2\n")
   116  						}
   117  					}
   118  				}
   119  
   120  				if mpath.Type == CIR_PTYP {
   121  					// 合流経路の場合:
   122  					// ex) `> G4 G5 >` の場合、G5が停止していれば、
   123  
   124  					ptermel := plist.Pelm[len(plist.Pelm)-1] // 末端要素
   125  					if ptermel.Out.Control == OFF_SW {
   126  						ptermel = plist.Plmvb
   127  						ptermel.In.Upv = up
   128  					}
   129  				}
   130  			} else {
   131  				// 末端経路が停止している場合: 入力無し
   132  				//
   133  				for _, Pelm := range plist.Pelm {
   134  					if Pelm.In != nil {
   135  						Pelm.In.Upv = nil
   136  					}
   137  				}
   138  			}
   139  		}
   140  
   141  		/* 分岐要素のシステム方程式からの除外 */
   142  
   143  		for i, Plist := range mpath.Plist {
   144  			if DEBUG {
   145  				fmt.Printf("  Sysupv  BRC  i=%d\n", i)
   146  			}
   147  			if Plist.Type == DIVERG_LPTP {
   148  				Pelm := Plist.Pelm[0]
   149  				Pelm.Out.Control = OFF_SW
   150  				up := Plist.Pelm[0].Cmp.Elins[0].Upv
   151  				if Pelm = Plist.Plmvb; Pelm != nil {
   152  					Pelm.In.Upv = up
   153  				}
   154  			}
   155  		}
   156  
   157  	}
   158  	if SIMUL_BUILDG {
   159  		/*********************************/
   160  		/* 放射パネル設置室についてのパネル上流要素 */
   161  
   162  		for i := range Rmvls.Room {
   163  			room := Rmvls.Room[i]
   164  			for j := 0; j < room.Nrp; j++ {
   165  				rmpnl := room.rmpnl[j]
   166  				elin := room.cmp.Elins[room.Nachr+room.Ntr+j]
   167  				elp := rmpnl.pnl.cmp.Elins[0]
   168  				elin.Upv = elp.Upv
   169  			}
   170  		}
   171  
   172  		for i := 0; i < Nrdpnl; i++ {
   173  			Rdpnl = Rmvls.Rdpnl[i]
   174  
   175  			for j := 0; j < Rdpnl.MC; j++ {
   176  				rm := Rdpnl.rm[j]
   177  				rmpnl := rm.rmpnl[j]
   178  				elin := Rdpnl.cmp.Elins[Rdpnl.elinpnl[j]]
   179  				for jj := 0; jj < Rdpnl.Nrp[j]; jj++ {
   180  					elin.Upv = rmpnl.pnl.cmp.Elins[0].Upv
   181  				}
   182  			}
   183  		}
   184  
   185  		if DEBUG {
   186  			fmt.Printf("  Sysupv end  ========\n")
   187  		}
   188  	}
   189  }