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

     1  //This file is part of EESLISM.
     2  //
     3  //Foobar is free software : you can redistribute itand /or modify
     4  //it under the terms of the GNU General Public License as published by
     5  //the Free Software Foundation, either version 3 of the License, or
     6  //(at your option) any later version.
     7  //
     8  //Foobar is distributed in the hope that it will be useful,
     9  //but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
    11  //GNU General Public License for more details.
    12  //
    13  //You should have received a copy of the GNU General Public License
    14  //along with Foobar.If not, see < https://www.gnu.org/licenses/>.
    15  
    16  /*  pipe.c  */
    17  
    18  package eeslism
    19  
    20  import (
    21  	"errors"
    22  	"fmt"
    23  	"io"
    24  	"math"
    25  	"strconv"
    26  	"strings"
    27  )
    28  
    29  /*  配管・ダクト 仕様入力 */
    30  
    31  func Pipedata(cattype EqpType, s string, Pipeca *PIPECA) int {
    32  	var st string
    33  	var dt float64
    34  	var id int
    35  
    36  	if cattype == DUCT_TYPE {
    37  		Pipeca.Type = DUCT_PDT
    38  	} else if cattype == PIPEDUCT_TYPE {
    39  		Pipeca.Type = PIPE_PDT
    40  	} else {
    41  		panic(cattype)
    42  	}
    43  
    44  	st = strings.Split(s, "=")[1]
    45  
    46  	var err error
    47  	dt, err = strconv.ParseFloat(st, 64)
    48  	if err != nil {
    49  		panic("Failed to parse float: " + err.Error())
    50  	}
    51  
    52  	if strings.HasPrefix(s, "Ko") {
    53  		Pipeca.Ko = dt
    54  	} else {
    55  		id = 1
    56  	}
    57  
    58  	return id
    59  }
    60  
    61  /* --------------------------- */
    62  
    63  /*  管長・ダクト長、周囲温度設定 */
    64  
    65  func Pipeint(Pipe []*PIPE, Simc *SIMCONTL, Compnt []*COMPNT, Wd *WDAT) {
    66  	for _, pipe := range Pipe {
    67  		if pipe.Cmp.Ivparm != nil {
    68  			pipe.L = *pipe.Cmp.Ivparm
    69  		} else {
    70  			pipe.L = -999.0
    71  		}
    72  
    73  		if pipe.Cmp.Envname != "" {
    74  			pipe.Tenv = envptr(pipe.Cmp.Envname, Simc, Compnt, Wd, nil)
    75  		} else {
    76  			pipe.Room = roomptr(pipe.Cmp.Roomname, Compnt)
    77  		}
    78  
    79  		if pipe.Cat.Ko < 0.0 {
    80  			Err := fmt.Sprintf("Name=%s  Ko=%.4g", pipe.Cmp.Name, pipe.Cat.Ko)
    81  			Eprint("Pipeint", Err)
    82  		}
    83  
    84  		if pipe.L < 0.0 {
    85  			Err := fmt.Sprintf("Name=%s  L=%.4g", pipe.Cmp.Name, pipe.L)
    86  			Eprint("Pipeint", Err)
    87  		}
    88  	}
    89  }
    90  
    91  /* --------------------------- */
    92  
    93  /*  特性式の係数  */
    94  
    95  //
    96  // [IN 1] ---> +------+ ---> [OUT 1] 空気 or 温水温度
    97  //             | PIPE |
    98  // [IN 2] ---> +------+ ---> [OUT 2] 湿度 (DUCT_PDTのみ)
    99  //
   100  func Pipecfv(Pipe []*PIPE) {
   101  	for _, pipe := range Pipe {
   102  		Te := 0.0
   103  		if pipe.Cmp.Control != OFF_SW {
   104  			if pipe.Cmp.Envname != "" {
   105  				Te = *pipe.Tenv
   106  			} else if pipe.Room != nil {
   107  				Te = pipe.Room.Tot
   108  			} else {
   109  				Err := fmt.Sprintf("Undefined Pipe Environment  name=%s", pipe.Name)
   110  				Eprint("<Pipecfv>", Err)
   111  			}
   112  			pipe.Ko = pipe.Cat.Ko
   113  
   114  			Eo1 := pipe.Cmp.Elouts[0]
   115  			cG := Spcheat(Eo1.Fluid) * Eo1.G
   116  			pipe.Ep = 1.0 - math.Exp(-(pipe.Ko*pipe.L)/cG)
   117  			pipe.D1 = cG * pipe.Ep
   118  			pipe.Do = pipe.D1 * Te
   119  			Eo1.Coeffo = cG
   120  			Eo1.Co = pipe.Do
   121  			Eo1.Coeffin[0] = pipe.D1 - cG
   122  
   123  			if pipe.Cat.Type == DUCT_PDT {
   124  				Eo2 := pipe.Cmp.Elouts[1]
   125  				Eo2.Coeffo = 1.0
   126  				Eo2.Co = 0.0
   127  				Eo2.Coeffin[0] = -1.0
   128  			}
   129  		}
   130  	}
   131  }
   132  
   133  /* --------------------------- */
   134  
   135  /* 取得熱量の計算 */
   136  
   137  func Pipeene(Pipe []*PIPE) {
   138  	for _, pipe := range Pipe {
   139  		pipe.Tin = pipe.Cmp.Elins[0].Sysvin
   140  
   141  		if pipe.Cmp.Control != OFF_SW {
   142  			Eo := pipe.Cmp.Elouts[0]
   143  			pipe.Tout = pipe.Do
   144  			pipe.Q = pipe.Do - pipe.D1*pipe.Tin
   145  
   146  			if pipe.Room != nil {
   147  				pipe.Room.Qeqp += (-pipe.Q)
   148  			}
   149  
   150  			if pipe.Cat.Type == DUCT_PDT {
   151  				Eo = pipe.Cmp.Elouts[1]
   152  				pipe.Xout = Eo.Sysv
   153  				pipe.RHout = FNRhtx(pipe.Tout, pipe.Xout)
   154  				pipe.Hout = FNH(pipe.Tout, Eo.Sysv)
   155  			} else {
   156  				pipe.Hout = -999.0
   157  			}
   158  		} else {
   159  			pipe.Q = 0.0
   160  		}
   161  	}
   162  }
   163  
   164  /* --------------------------- */
   165  
   166  /* 負荷計算用設定値のポインター */
   167  
   168  func pipeldsptr(load *ControlSWType, key []string, Pipe *PIPE, idmrk *byte) (VPTR, error) {
   169  	var err error
   170  	var vptr VPTR
   171  
   172  	if key[1] == "Tout" {
   173  		vptr.Ptr = &Pipe.Toset
   174  		vptr.Type = VAL_CTYPE
   175  		Pipe.Loadt = load
   176  		*idmrk = 't'
   177  	} else if Pipe.Cat.Type == DUCT_PDT && key[1] == "xout" {
   178  		vptr.Ptr = &Pipe.Xoset
   179  		vptr.Type = VAL_CTYPE
   180  		Pipe.Loadx = load
   181  		*idmrk = 'x'
   182  	} else {
   183  		err = errors.New("Tout or xout expected")
   184  	}
   185  
   186  	return vptr, err
   187  }
   188  
   189  /* ------------------------------------------ */
   190  
   191  /* 負荷計算用設定値のスケジュール設定 */
   192  
   193  func pipeldsschd(Pipe *PIPE) {
   194  	Eo := Pipe.Cmp.Elouts[0]
   195  
   196  	if Pipe.Loadt != nil {
   197  		if Eo.Control != OFF_SW {
   198  			if Pipe.Toset > TEMPLIMIT {
   199  				Eo.Control = LOAD_SW
   200  				Eo.Sysv = Pipe.Toset
   201  			} else {
   202  				Eo.Control = OFF_SW
   203  			}
   204  		}
   205  	}
   206  
   207  	if Pipe.Cat.Type == DUCT_PDT && Pipe.Loadx != nil {
   208  		if len(Pipe.Cmp.Elouts) > 1 {
   209  			Eo = Pipe.Cmp.Elouts[1]
   210  			if Eo.Control != OFF_SW {
   211  				if Pipe.Xoset > 0.0 {
   212  					Eo.Control = LOAD_SW
   213  					Eo.Sysv = Pipe.Xoset
   214  				} else {
   215  					Eo.Control = OFF_SW
   216  				}
   217  			}
   218  		}
   219  	}
   220  }
   221  
   222  /* --------------------------- */
   223  
   224  func pipeprint(fo io.Writer, id int, Pipe []*PIPE) {
   225  	switch id {
   226  	case 0:
   227  		if len(Pipe) > 0 {
   228  			fmt.Fprintf(fo, "%s %d\n", PIPEDUCT_TYPE, len(Pipe))
   229  		}
   230  		for _, pipe := range Pipe {
   231  			fmt.Fprintf(fo, " %s 1 5\n", pipe.Name)
   232  		}
   233  	case 1:
   234  		for _, pipe := range Pipe {
   235  			fmt.Fprintf(fo, "%s_c c c %s_G m f %s_Ti t f %s_To t f %s_Q q f\n",
   236  				pipe.Name, pipe.Name, pipe.Name, pipe.Name, pipe.Name)
   237  		}
   238  	default:
   239  		for _, pipe := range Pipe {
   240  			fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f %.2f\n",
   241  				pipe.Cmp.Elouts[0].Control, pipe.Cmp.Elouts[0].G,
   242  				pipe.Tin, pipe.Cmp.Elouts[0].Sysv, pipe.Q)
   243  		}
   244  	}
   245  }
   246  
   247  /* --------------------------- */
   248  
   249  /* 日積算値に関する処理 */
   250  
   251  func pipedyint(Pipe []*PIPE) {
   252  	for _, pipe := range Pipe {
   253  		svdyint(&pipe.Tidy)
   254  		qdyint(&pipe.Qdy)
   255  	}
   256  }
   257  
   258  func pipemonint(Pipe []*PIPE) {
   259  	for _, pipe := range Pipe {
   260  		svdyint(&pipe.MTidy)
   261  		qdyint(&pipe.MQdy)
   262  	}
   263  }
   264  
   265  func pipeday(Mon int, Day int, ttmm int, Pipe []*PIPE, Nday int, SimDayend int) {
   266  	for _, pipe := range Pipe {
   267  		// 日集計
   268  		svdaysum(int64(ttmm), pipe.Cmp.Elouts[0].Control, pipe.Tin, &pipe.Tidy)
   269  		qdaysum(int64(ttmm), pipe.Cmp.Elouts[0].Control, pipe.Q, &pipe.Qdy)
   270  
   271  		// 月集計
   272  		svmonsum(Mon, Day, ttmm, pipe.Cmp.Elouts[0].Control, pipe.Tin, &pipe.MTidy, Nday, SimDayend)
   273  		qmonsum(Mon, Day, ttmm, pipe.Cmp.Elouts[0].Control, pipe.Q, &pipe.MQdy, Nday, SimDayend)
   274  	}
   275  }
   276  
   277  func pipedyprt(fo io.Writer, id int, Pipe []*PIPE) {
   278  	switch id {
   279  	case 0:
   280  		if len(Pipe) > 0 {
   281  			fmt.Fprintf(fo, "%s %d\n", PIPEDUCT_TYPE, len(Pipe))
   282  		}
   283  		for _, pipe := range Pipe {
   284  			fmt.Fprintf(fo, " %s 1 14\n", pipe.Name)
   285  		}
   286  
   287  	case 1:
   288  		for _, pipe := range Pipe {
   289  			fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", pipe.Name, pipe.Name)
   290  			fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name)
   291  			fmt.Fprintf(fo, "%s_Hh H d %s_Qh Q f %s_Hc H d %s_Qc Q f\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name)
   292  			fmt.Fprintf(fo, "%s_th h d %s_qh q f %s_tc h d %s_qc q f\n\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name)
   293  		}
   294  
   295  	default:
   296  		for _, pipe := range Pipe {
   297  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ",
   298  				pipe.Tidy.Hrs, pipe.Tidy.M, pipe.Tidy.Mntime,
   299  				pipe.Tidy.Mn, pipe.Tidy.Mxtime, pipe.Tidy.Mx)
   300  			fmt.Fprintf(fo, "%1d %3.1f ", pipe.Qdy.Hhr, pipe.Qdy.H)
   301  			fmt.Fprintf(fo, "%1d %3.1f ", pipe.Qdy.Chr, pipe.Qdy.C)
   302  			fmt.Fprintf(fo, "%1d %2.0f ", pipe.Qdy.Hmxtime, pipe.Qdy.Hmx)
   303  			fmt.Fprintf(fo, "%1d %2.0f\n", pipe.Qdy.Cmxtime, pipe.Qdy.Cmx)
   304  		}
   305  	}
   306  }
   307  
   308  func pipemonprt(fo io.Writer, id int, Pipe []*PIPE) {
   309  	switch id {
   310  	case 0:
   311  		if len(Pipe) > 0 {
   312  			fmt.Fprintf(fo, "%s %d\n", PIPEDUCT_TYPE, len(Pipe))
   313  		}
   314  		for _, pipe := range Pipe {
   315  			fmt.Fprintf(fo, " %s 1 14\n", pipe.Name)
   316  		}
   317  
   318  	case 1:
   319  		for _, pipe := range Pipe {
   320  			fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", pipe.Name, pipe.Name)
   321  			fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name)
   322  			fmt.Fprintf(fo, "%s_Hh H d %s_Qh Q f %s_Hc H d %s_Qc Q f\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name)
   323  			fmt.Fprintf(fo, "%s_th h d %s_qh q f %s_tc h d %s_qc q f\n\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name)
   324  		}
   325  
   326  	default:
   327  		for _, pipe := range Pipe {
   328  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ",
   329  				pipe.MTidy.Hrs, pipe.MTidy.M, pipe.MTidy.Mntime,
   330  				pipe.MTidy.Mn, pipe.MTidy.Mxtime, pipe.MTidy.Mx)
   331  			fmt.Fprintf(fo, "%1d %3.1f ", pipe.MQdy.Hhr, pipe.MQdy.H)
   332  			fmt.Fprintf(fo, "%1d %3.1f ", pipe.MQdy.Chr, pipe.MQdy.C)
   333  			fmt.Fprintf(fo, "%1d %2.0f ", pipe.MQdy.Hmxtime, pipe.MQdy.Hmx)
   334  			fmt.Fprintf(fo, "%1d %2.0f\n", pipe.MQdy.Cmxtime, pipe.MQdy.Cmx)
   335  		}
   336  	}
   337  }
   338  
   339  // 配管、ダクト内部変数のポインターを作成します
   340  func pipevptr(key []string, Pipe *PIPE) (VPTR, error) {
   341  	var err error
   342  	var vptr VPTR
   343  	switch key[1] {
   344  	case "Tout":
   345  		vptr.Ptr = &Pipe.Tout
   346  		vptr.Type = VAL_CTYPE
   347  	case "hout":
   348  		vptr.Ptr = &Pipe.Hout
   349  		vptr.Type = VAL_CTYPE
   350  	case "xout":
   351  		vptr.Ptr = &Pipe.Xout
   352  		vptr.Type = VAL_CTYPE
   353  	case "RHout":
   354  		vptr.Ptr = &Pipe.RHout
   355  		vptr.Type = VAL_CTYPE
   356  	default:
   357  		err = errors.New("Tout, hout, xout or RHout is expected")
   358  	}
   359  
   360  	return vptr, err
   361  }