1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-03-06 02:39:07 +00:00
Files
Paul Kimpel 2c72f7fd1d Commit CUBE Library version 13 of February 1972.
1. Commit library tape images, directories, and extracted text files.
2. Commit additional utilities under Unisys-Emode-Tools.
2018-05-27 11:24:23 -07:00

936 lines
34 KiB
Plaintext

LABEL 0000000000XXXXXX0010000001
BEGIN
COMMENT DETERMINATION OF FLOW AND PRESSURE DISTRIBUTIONS FOR
FLUID FLOW IN A PIPELINE NETWORK.
YUI LOONG WANG.
PROFESSIONAL SERVICES GROUP, BURROUGHS CORPORATION.
CARD SEQUENCE STARTS WITH NET-0001.
FIRST RELEASE 9-1-63 ;
INTEGER NOCASE, B, NODE, NOFEED, NOSINK, NOP, NONP, STATE, UMAX,
DT, DBBN, NOLP, DPC, NNN, NPATH, LUMAX ;
BOOLEAN BLOOP, BPO, BFLOW, OPT1, BERR, BINPUT ;
REAL TEMP, MW, DENR, VIS, Z0, Z1, Z2, TOLP ;
REAL T1, T2 ;
ALPHA CASE, SYSTEM, AA ;
FILE IN FILI(1,10) ;
FILE OUT FILO 1(1,15) ;
LIST IN1(CASE, B, NODE, NOFEED, NOSINK, NOP, NONP, SYSTEM),
IN2(STATE, TEMP, MW, DENR, VIS, Z0, Z1, Z2),
IN3(UMAX, DT, DBBN, DPC, TOLP),
IN4(BLOOP,BPO, BFLOW, OPT1, BINPUT),
OUTR1(B, NODE, NOFEED, NOSINK, NOP, NONP, SYSTEM, AA,
TEMP, MW, DENR, VIS, Z2, Z1, Z0, TOLP),
OUTIN1(UMAX, DT, DBBN, DPC, BLOOP, BPO, BFLOW, OPT1),
TITLE(CASE) ;
FORMAT FMI1(A6, 6I6, A6), FMI2(I2, 2F7.2, 5E11.4),
FMI3(4I4, F8.4), FMI4(5L5),
FMO(//X30,"PIPELINE NETWORK ANALYSIS",
/////X20,"PROBLEM",A36),
F1(///X20, "TOTAL RUNNING TIME FOR CASE ", A6,
" IS ", F6.2, " SECONDS"),
FMOINA( ///X32, "PRINTOUT OF INPUT DATA"),
FMOR1( ///X20,"BRANCHES", I35, //X20,"NODES", I38, //X20,
"FEEDS", I38, //X20, "SINKS", I38, //X20,
"PRESSURES SPECIFIED", I24, //X20,
"NON-PIPE MEMBERS", I27, //X20, "SYSTEM", A37,
//X20,"STATE", A38,
//X20,"TEMPERATURE", F26.1, " DEG F",
//X20,"MOLECULAR WEIGHT", F27.2,
//X20, "DENSITY", E27.4, " LB/CU FT",
//X20,"VISCOSITY", E31.4, " CP",
//X20,"COMPRESSIBILITY FACTOR",
/X24, "Z2 = ", E11.4, /X24, "Z1 = ", E11.4,
/X24, "Z0 = ", E11.4,
//X20, "PRESSURE DROP TOLERANCE", F9.3,
" PSI/BRANCH"),
FMOIN1( //X20,"UMAX = ", I5, X15, "DT = ", I5,
//X20,"DBBN = ", I5, X15, "DPC = ", I5,
//X20,"BLOOP = ", L5, X15, "BPO = ", L5,
//X20,"BFLOW = ", L5, X15, "OPT1 = ", L5) ;
LABEL START, FINI ;
START: T1 ~TIME(1) ;
READ(FILI, FMI1, IN1)[FINI] ;
READ(FILI,FMI2,IN2) ; READ(FILI,FMI3,IN3) ;
READ(FILI,FMI4,IN4) ;
NOLP ~ B - NODE + NOP ;
BEGIN
INTEGER I, J, K, N, N1, LP, N2, N3, N4, N5, N6, N7, N8, N9, U ;
INTEGER ARRAY SN, EN, A[0:B], NF[0:NOFEED], NS[0:NOSINK], NP[0:NOP],
BNP, DIR[0:NONP], T[0:DT], TN1, TN2[0:30],
NBL[0:IF NOLP > 30 THEN NOLP ELSE 30],
NOBN[0:NODE], BBN[0:NODE, 0:DBBN], NPN1[0:NONP] ;
REAL ARRAY L[0:B], D[0:B], ED[0:B], H[0:NODE], FEED[0:NOFEED],
SINK[0:NOSINK], P[0:NOP], POL[0:NONP], POLC[0:NONP,0:DPC],
DP[0:NOP-1], FLOW[0:B], PN[0:NODE], COP[0:B], PN1[0:NONP];
ALPHA ARRAY NAME[0:NONP] ;
REAL TRS1, TRS2, TRS3, TRS4, TRS5, TRS6, TRS7, TRS8, TRS9,
TRS10, TRS11, TRS12, TRS13 ;
BEGIN
COMMENT THIS SECTION DETERMINES LOOPS AND PATHS, ESTIMATES FLOW
PATTERNS, AND PERFORMS OTHER PRELIMINARY CHORES. ;
LABEL PAT ;
LABEL ER1 ;
INTEGER DSR, MAXRANK ;
INTEGER ARRAY RANK[0:NODE] ;
ARRAY F[0:30] ;
LIST IN5(FOR J ~ 1 STEP 1 UNTIL B DO [ SN[J], EN[J], L[J],
D[J], ED[J], A[J]]),
IN5A(FOR J ~ 1 STEP 1 UNTIL B DO [SN[J], EN[J], L[J],
D[J], ED[J], A[J], FLOW[J]]),
IN6(FOR I ~ 1 STEP 1 UNTIL NODE DO H[I]),
IN7(FOR K ~ 1 STEP 1 UNTIL NOFEED DO [NF[K], FEED[K]]),
IN8(FOR K ~ 1 STEP 1 UNTIL NOSINK DO [NS[K], SINK[K]]),
IN9(FOR K ~ 1 STEP 1 UNTIL NOP DO [NP[K], P[K]]),
IN10( FOR K ~ 1 STEP 1 UNTIL NONP DO [ NAME[K], BNP[K],
DIR[K], POL[K]]),
IN11( FOR N ~ 0 STEP 1 UNTIL POL[K] DO POLC[K,N]),
ERRO(K),
IN12(FOR K ~ 1 STEP 1 UNTIL NOLP DO NBL[K]),
IN13(FOR J ~ 1 STEP 1 UNTIL N DO T[N1+J]),
IN14(FOR K ~ N2 STEP 1 UNTIL NOLP DO NBL[K]) ;
FORMAT FMI5(2I5, F7.2, F8.4, F8.5, I2),
FMI5A(2I5, F7.2, F8.4, F8.5, I2, F16.4),
FMI6(8F7.2), FMI789(4(I5, F9.2)),
FMI10(A10, 3I5), FMI11(5E16.8),
FMI12(16I5),
FMEA(/X20,"NUMBER OF BRANCHES AT NODE", I4,
"IS GREATER THEN DBBN"),
FMEB(/X20,"TOTAL INPUT = ", F10.2,
"TOTAL OUTPUT = ", F10.2),
FMEC(/X20,"FOR BRANCH", I4, ", EN > SN"),
FMOINB(//X40, "BRANCH DESCRIPTIONS", ///X11, "BRANCH ",
"CONNECTING NODES DIAMETER LENGTH ",
"ROUGHNESS A FLOW", /X22, "SN", X6, "EN",
X7, "INCHES", X6, "FEET", X8, "E/D",A17/),
FMOIN2(I15, I9, I8, F13.2, F11.1, F13.5, I5, F12.2),
FMOINC(//X40, "NODAL SPECIFICATIONS", //X26, "NODE", X6,
"HEIGHT SOURCE SINK PRESSURE",
/X37, "FEET", 2A10, X5, "PSI"/),
FMOIN3(I29, F12.1, 3F10.2),
FMOIND(//X40,"NON-PIPE MEMBERS",//X11,"NAME BRANCH",
" DIRECTION POLYNOMIAL COEFFICIENTS"//),
FMOIN4(A16, I6, I12, X6, 5F12.6),
FMEE(/X20,"NUMBER OF BRANCHES WITH A[J] = 3 IS ",
I4, ", AND UNEQUAL TO NONP") ;
PROCEDURE LOOPANDPATH(CASE, B, NODE, SN, EN, BLOOP, NPATH, TN1,
TN2, A, UMAX, LUMAX, DBN, DT, BPO, NBN, BN, LP,
NBL, T, BERR) ;
COMMENT THIS PROCEDURE FORMS ALL THE INDEPENDENT LOOPS AND/OR
PATHS BETWEEN GIVEN PAIRS OF NODES FOR A NETWORK.
YUI LOONG WANG,
PROFESSIONAL SERVICES GROUP, BORROUGHS CORP.
CARD SEQUENCE STARTS WITH LOPA-0001,
FIRST RELEASE 9-1-64.
VALUE CASE, B, NODE, BLOOP, NPATH, UMAX, LUMAX, DBN, DT, BPO ;
INTEGER B, NODE, NPATH, UMAX, LUMAX, DBN, DT, LP ;
BOOLEAN BLOOP, BPO, BERR ;
ALPHA CASE ;
INTEGER ARRAY SN, EN, TN1, TN2, A, NBN, NBL, T[0], BN[0,0] ;
BEGIN
INTEGER I, J, K, L, N, NN, N1, N2, N3, N4, N5, N6, N7, N8,
NS, NE, U ;
BOOLEAN TBS1, TBS2 ;
LABEL PO, FINI ;
FORMAT OUT FM1(///X20,"LOOPANDPATH",X5,"PROBLEM ",A6),
FM2(//X15,"NUMBER OF BRANCHES = ", I20,
//X15,"NUMBER OF NODES = ", I23,
//X15,"NUMBER OF INDEPENDENT LOOPS FORMED = ", I4,
//X15,"NUMBER OF PATHS FORMED = ", I16),
FM3(//X18, A4, I4, " (",I3," BRANCHES) NUMBER BRANCH"/),
FM4(I47, I7),
ERR(///X10,"AN ERROR HAS BEEN FOUND: "),
ERR2(/X15,"AFTER ",I3,"LOOPS, U EXCEEDS LUMAX"),
ERR2A(/X15,"AFTER ",I3, "PATHS, U EXCEEDS UMAX"),
ERR3(/X15,"AFTER ",I3,"LOOPS(PATHS), THE DIMENSION OF",
" ARRAY T HAS TO BE INCREASED"),
ERR4(/X15,"BRANCH", I4, " ARE NOT USED IN",
" FORMING LOOPS") ;
LP ~ B - NODE + 1 ; BERR ~ FALSE ;
BEGIN
COMMENT IN THIS SECTION, ALL THE LOOPS AND/OR PATHS ARE FORMED. ;
LABEL LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8, STOR ;
LABEL PA ;
INTEGER PB ;
INTEGER ARRAY PP[0:UMAX], P, PN[0:UMAX, 0:DBN] ;
L ~ N ~ N1 ~ N2 ~ J ~ 0 ; U ~ 1 ;
IF BLOOP THEN
BEGIN
TBS2 ~ TRUE ; GO TO LF1
END ;
COMMENT DETERMINE PATHES. ;
LF2: N2 ~ N2 + 1 ; IF N2 > NPATH THEN GO TO PO ;
PB ~ J ~ 0 ; NS ~ TN1[N2] ; NE ~ TN2[N2] ;
N3 ~ RANK[NE] ; U ~ ABS(RANK[NS] - N3) ;
IF U = 0 THEN U ~ 1 ; GO TO PA ;
LF4: U ~ U + 1 ; NS ~ TN1[N2] ;
IF U > UMAX THEN
BEGIN
WRITE(FILO, ERR) ; WRITE(FILO, ERR2A, N2) ;
BERR ~ TRUE ; GO TO FINI
END ;
PB ~ 0 ; GO TO PA ;
COMMENT DETERMINE LOOPS. ;
LF1: N1 ~ N1 + 1 ;
IF N1 > LP THEN
BEGIN
TBS2 ~ FALSE ; GO TO LF2
END ;
LF5: J ~ J + 1 ;
IF J > B THEN
BEGIN
U ~ U + 1 ; J ~ 1 ;
IF U > LUMAX THEN
BEGIN
WRITE(FILO, ERR) ; WRITE(FILO, ERR2, N1) ;
BERR ~ TRUE ; GO TO FINI
END ;
FOR K ~ 1 STEP 1 UNTIL B DO IF A[K] = 0 THEN GO TO LF6 ;
FOR K ~ 1 STEP 1 UNTIL B DO
A[K] ~ IF A[K] = 1 THEN 0 ELSE 3 ;
TBS1 ~ TRUE ; U ~ 3 ;
END ;
LF6: IF A[J] ! 0 THEN GO TO LF5 ;
NS ~ EN[J] ; NE ~ SN[J] ;
N3 ~ RANK[NE] ; PB ~ J ;
COMMENT FORM A PATH BETWEEN NODES NS AND NE WITH U BRANCHES. ;
PA: K ~ 0 ;
COMMENT SEARCH AND STORE ALL POSSIBLE K-TH BRANCH. ;
LF3: NN ~ 0 ; K ~ K + 1 ; N4 ~ NBN[NS] ;
FOR I ~ N4 STEP -1 UNTIL 1 DO
BEGIN
N5 ~ BN[NS,I] ; N6 ~ ABS(N5) ;
IF N6 ! ABS(PB) THEN IF N6 ! J THEN
IF NOT TBS2 OR A[N6] ! 3 THEN
BEGIN
IF N5 > 0 THEN N7 ~ EN[N6] ELSE N7 ~ SN[N6] ;
N8 ~ ABS(RANK[N7] - N3) ;
IF N8 { (U-K) THEN
BEGIN
NN ~ NN + 1 ; P[K,NN] ~ N5 ; PN[K,NN] ~ N7
END
END
END ;
COMMENT EITHER SEARCH FOR THE (K+1)TH BRANCH OR FOR OTHER
K-TH BRANCH. ;
IF NN ! 0 THEN GO TO LF7 ;
LF8: K ~ K - 1 ;
IF K = 0 THEN
IF TBS2 THEN GO TO LF5 ELSE GO TO LF4 ;
PP[K] ~ I ~ PP[K] - 1 ; IF I = 0 THEN GO TO LF8 ;
PB ~ P[K,I] ; NS ~ PN[K,I] ; GO TO LF3 ;
LF7: PP[K] ~ NN ;
COMMENT IF K = U, CHECK WHETHER A LOOP OR PATH IS FORMED,
OTHERWISE SEARCH FOR THE (K+1)TH BRANCH. ;
IF K = U THEN
BEGIN
FOR I ~ NN STEP -1 UNTIL 1 DO
IF PN[K,I] = NE THEN GO TO STOR ;
GO TO LF8
END
ELSE
BEGIN
PB ~ P[K,NN] ; NS ~ PN[K,NN] ; GO TO LF3
END ;
COMMENT STORE THE LOOP OR PATH FORMED. ;
STOR: L ~ L + 1 ; PP[K] ~ I ; N4 ~ N + 1 ;
N ~ N + U ; IF TBS2 THEN N ~ N + 1 ;
NBL[L] ~ IF TBS2 THEN U + 1 ELSE U ;
IF N > DT THEN
BEGIN
WRITE(FILO, ERR) ; WRITE(FILO, ERR3, L) ;
BERR ~ TRUE ; GO TO FINI
END ;
IF TBS2 THEN
BEGIN
T[N4] ~ J ; A[J] ~ 2 ; N4 ~ N4 + 1 ;
END ;
FOR I ~ N4 STEP 1 UNTIL N DO
BEGIN
N5 ~ I + 1 - N4 ; N5 ~ P[N5, PP[N5]] ;
T[I] ~ N5 ; N5 ~ ABS(N5) ;
IF TBS2 THEN IF A[N5] = 0 THEN A[N5] ~ 1
END ;
IF TBS2 THEN GO TO LF1 ELSE GO TO LF2 ;
END ;
COMMENT IF BPO, PRINT OUT THE LOOPS OR PATHS. ;
PO: BEGIN
IF NOT BLOOP THEN LP ~ 0 ;
IF BPO THEN
BEGIN
WRITE(FILO[PAGE]) ; WRITE(FILO, FM1, CASE) ;
WRITE(FILO, FM2, B, NODE, LP, NPATH) ;
N ~ 0 ;
FOR I ~ 1 STEP 1 UNTIL LP DO
BEGIN
U ~ NBL[I] ; WRITE(FILO, FM3, "LOOP", I, U) ;
FOR K ~ 1 STEP 1 UNTIL U DO WRITE(FILO, FM4, K, T[N+K]) ;
N ~ N + U
END ;
FOR I ~ 1 STEP 1 UNTIL NPATH DO
BEGIN
U ~ NBL[I+LP] ; WRITE(FILO, FM3, "PATH", I, U) ;
FOR K ~ 1 STEP 1 UNTIL U DO WRITE(FILO, FM4, K, T[N+K]) ;
N ~ N + U
END
END ;
COMMENT CHECK TO SEE IF ALL AVAILABLE BRANCHES ARE USED IN
FORMING LOOPS. ;
IF BLOOP THEN IF NOT TBS1 THEN
FOR J ~ 1 STEP 1 UNTIL B DO
IF A[J] = 0 THEN
BEGIN
WRITE(FILO, ERR) ; WRITE(FILO, ERR4, J) ;
BERR ~ TRUE ; GO TO FINI
END
END PO ;
FINI: END LOOPANDPATH ;
IF BINPUT THEN
BEGIN
WRITE(FILO[PAGE]) ; WRITE(FILO, FMO, TITLE) ;
IF STATE = 1 THEN AA ~ " GAS " ELSE AA ~ "LIQUID" ;
WRITE(FILO, FMOINA) ; WRITE(FILO, FMOR1, OUTR1) ;
WRITE(FILO, FMOIN1, OUTIN1) ;
IF STATE = 1 THEN AA ~ "MCF/HR" ELSE AA ~ " GPM " ;
WRITE(FILO[PAGE]) ; WRITE(FILO, FMOINB, AA) ;
END ;
IF BFLOW THEN READ(FILI,FMI5A,IN5A)
ELSE READ(FILI,FMI5,IN5) ;
READ(FILI,FMI6,IN6) ; READ(FILI,FMI789,IN7) ;
READ(FILI,FMI789,IN8) ; READ(FILI,FMI789,IN9) ;
READ(FILI,FMI10,IN10) ;
IF NONP ! 0 THEN READ(FILI, FMI11, IN11) ;
IF BINPUT THEN
BEGIN
FOR J ~ 1 STEP 1 UNTIL B DO
IF BFLOW THEN
WRITE(FILO, FMOIN2, J, SN[J],EN[J],L[J],D[J],ED[J],A[J],
FLOW[J])
ELSE
WRITE(FILO, FMOIN2, J,SN[J],EN[J],L[J],D[J],ED[J],A[J]) ;
WRITE(FILO[PAGE]) ; WRITE(FILO, FMOINC, AA, AA) ;
FOR I ~ 1 STEP 1 UNTIL NODE DO
BEGIN
TRS1 ~ TRS2 ~ TRS3 ~ 0.0 ;
FOR K ~ 1 STEP 1 UNTIL NOFEED DO
IF I = NF[K] THEN TRS1 ~ FEED[K] ;
FOR K ~ 1 STEP 1 UNTIL NOSINK DO
IF I = NS[K] THEN TRS2 ~ SINK[K] ;
FOR K ~ 1 STEP 1 UNTIL NOP DO
IF I = NP[K] THEN TRS3 ~ P[K] ;
IF TRS3 = 0.0 THEN WRITE(FILO,FMOIN3, I,H[I],TRS1,TRS2)
ELSE WRITE(FILO,FMOIN3, I,H[I],TRS1,TRS2,TRS3)
END ;
IF NONP ! 0 THEN
BEGIN
WRITE(FILO[PAGE]) ; WRITE(FILO, FMOIND) ;
END ;
FOR K ~ 1 STEP 1 UNTIL NONP DO
WRITE(FILO, FMOIN4, NAME[K], BNP[K], DIR[K],
FOR N ~ 1 STEP 1 UNTIL POL[K] DO POLC[K,N]) ;
END ;
COMMENT FIRST DETERMINE THE NUMBER OF BRANCHES CONNECTED TO EACH
NODE. STORE THAT IN NOBN[I] FOR NODE I, AND THE BRANCH
NUMBERS IN BBN[I,]. ;
FOR I ~ 1 STEP 1 UNTIL NODE DO NOBN[I] ~ 0 ;
FOR J ~ 1 STEP 1 UNTIL B DO
BEGIN
I ~ SN[J] ; NOBN[I] ~ N1 ~ NOBN[I] + 1 ;
K ~ EN[J] ; NOBN[K] ~ N2 ~ NOBN[K] + 1 ;
IF (N1 > DBBN) OR (N2 > DBBN) THEN
BEGIN
IF N1 > DBBN THEN K ~ I ;
WRITE(FILO,FMEA, ERRO) ; GO TO START
END ;
BBN[I,N1] ~ J ; BBN[K,N2] ~ -J
END ;
COMMENT CHECK POSSIBLE ERRORS IN INPUT DATA. ;
COMMENT CHECK TOTAL INPUT AND OUTPUT. ;
TRS1 ~ TRS2 ~ 0.0 ;
FOR K ~ 1 STEP 1 UNTIL NOFEED DO TRS1 ~ FEED[K] + TRS1 ;
FOR K ~ 1 STEP 1 UNTIL NOSINK DO TRS2 ~ SINK[K] + TRS2 ;
IF ABS((TRS1 - TRS2) / TRS1) > 1.0@-6 THEN
BEGIN
WRITE(FILO, FMEB, TRS1, TRS2) ; GO TO START
END ;
COMMENT CHECK SN AND EN, AND NON-PIPE ELEMENTS. ;
FOR K ~ 1 STEP 1 UNTIL B DO
IF EN[K] < SN[K] THEN
BEGIN
WRITE(FILO, FMEC, ERRO) ; GO TO START
END ;
COMMENT DETERMINE THE RANK OF EACH NODES. THE FIRST NODE IS
ARBITRARILY ASSIGNED A RANK OF 1. ;
DSR ~ 40 ;
ER1: DSR ~ DSR + 20 ;
BEGIN
INTEGER ARRAY SR, SR1[0:DSR] ;
LABEL R1 ;
RANK[1] ~ SR[1] ~ N2 ~ N3 ~ MAXRANK ~ 1 ;
R1: N1 ~ N2 ; N2 ~ 0 ; MAXRANK ~ MAXRANK + 1 ;
FOR J ~ 1 STEP 1 UNTIL N1 DO SR1[J] ~ SR[J] ;
FOR J ~ 1 STEP 1 UNTIL N1 DO
BEGIN
N4 ~ SR1[J] ; N5 ~ NOBN[N4] ;
FOR K ~ 1 STEP 1 UNTIL N5 DO
BEGIN
N6 ~ BBN[N4,K] ;
IF N6 > 0 THEN N7 ~ EN[N6] ELSE N7 ~ SN[-N6] ;
IF RANK[N7] = 0 THEN
BEGIN
RANK[N7] ~ MAXRANK ; N2 ~ N2 + 1 ;
IF N2 > DSR THEN GO TO ER1 ;
SR[N2] ~ N7 ;
END
END
END ;
N3 ~ N3 + N2 ; IF N3 < NODE THEN GO TO R1 ;
END ;
COMMENT INITIAL ESTIMATE OF FLOW DISTRIBUTION. ;
IF NOT BFLOW THEN
BEGIN
U ~ K ~ 1 ; N ~ 0 ;
PAT: N ~ N + 1 ; TN1[N] ~ 1 ;
IF U { NOFEED THEN
BEGIN
IF NF[U] = 1 THEN
BEGIN
U ~ U + 1 ; N ~ N - 1 ; GO TO PAT
END ;
TN2[N] ~ NF[U] ; F[N] ~ -FEED[U] ; U ~ U + 1
END
ELSE IF K { NOSINK THEN
BEGIN
IF NS[K] = 1 THEN
BEGIN
K ~ K + 1 ; N ~ N - 1 ; GO TO PAT
END ;
IF NS[K] = 1 THEN K ~ K + 1 ;
TN2[N] ~ NS[K] ; F[N] ~ SINK[K] ; K ~ K + 1
END ;
IF (N = 30) OR (K > NOSINK) THEN
BEGIN
LOOPANDPATH(CASE, B, NODE, SN, EN, FALSE, N, TN1,
TN2, A, UMAX, LUMAX, DBBN, DT, FALSE, NOBN, BBN,
LP, NBL, T, BERR) ;
IF BERR THEN GO TO START ;
END
ELSE GO TO PAT ;
N1 ~ 0 ;
FOR I ~ 1 STEP 1 UNTIL N DO
BEGIN
N3 ~ N1 + 1 ; N1 ~ NBL[I] + N1 ;
FOR J ~ N3 STEP 1 UNTIL N1 DO
BEGIN
N2 ~ T[J] ; N4 ~ ABS(N2) ;
FLOW[N4] ~ SIGN(N2) | F[I] + FLOW[N4] ;
END ;
END ;
IF K { NOSINK THEN
BEGIN
N ~ 0 ; GO TO PAT ;
END ;
END ;
COMMENT EITHER READ IN LOOP DATA OR USE PROCEDURE LOOPFINDER. ;
IF BLOOP THEN
BEGIN
N1 ~ 0 ; READ(FILI, FMI12, IN12) ;
FOR K ~ 1 STEP 1 UNTIL NOLP DO
BEGIN
N ~ NBL[K] ; READ(FILI,FMI12,IN13) ; N1 ~ N1 + N
END
END
ELSE
BEGIN
LUMAX ~ UMAX ; NPATH ~ NOP - 1 ;
FOR I ~ 2 STEP 1 UNTIL NOP DO
BEGIN
TN1[I-1] ~ NP[I] ; TN2[I-1] ~ NP[1] ;
END ;
LOOPANDPATH(CASE, B, NODE, SN, EN, TRUE, NPATH, TN1,
TN2, A, UMAX, LUMAX, DBBN, DT, BPO, NOBN, BBN,
LP, NBL, T, BERR) ;
IF BERR THEN GO TO START ;
END ;
N2 ~ 0 ;
FOR I ~ 1 STEP 1 UNTIL LP DO
BEGIN
N3 ~ N2 + 1 ; N2 ~ NBL[I] + N2 ; TRS2 ~ 0 ;
U ~ 0 ;
FOR J ~ N3 STEP 1 UNTIL N2 DO
BEGIN
K ~ ABS(T[J]) ; TRS1 ~ ABS(FLOW[K]) ;
IF TRS1 = 0.0 THEN U ~ 1 ;
IF TRS2 < TRS1 THEN TRS2 ~ TRS1 ;
END ;
IF U ! 0 THEN
BEGIN
IF TRS2 = 0.0 THEN TRS2 ~ 0.5 | SINK[1] ;
TRS2 ~ 0.2143 | TRS2 ;
FOR J ~ N3 STEP 1 UNTIL N2 DO
BEGIN
K ~ ABS(T[J]) ; FLOW[K] ~ SIGN(T[J]) | TRS2 + FLOW[K];
END
END ;
END ;
FOR J ~ 1 STEP 1 UNTIL B DO A[J] ~ 0 ;
FOR J ~ 1 STEP 1 UNTIL NONP DO A[BNP[J]] ~ 3 ;
END PRELIMINARY ;
COMMENT THE FLOWS ARE NOW ADJUSTED TO SATISFY THE PRESSURE
BALANCE. ;
COMMENT THIS SECTION PERFORMS ITERATIVE CALCULATIONS BASED ON
THE HARDY CROSS METHOD. ;
BEGIN
INTEGER ITER ;
REAL COP1, COP2, RE1, RE2, F, DQ, SUMP, SUMDP, PAVG, Z, RENO,
G, DG ;
REAL ARRAY C[0:B] ;
LIST OUTIM1(ITER, N2, TRS4, TRS5, N4),
OUTR2(J, N1, N2, FLOW[J], TRS1, COP[J], AA),
OUTR3(I, PN[I], TRS1, TRS2),
OUTR3A(I, PN[I], TRS1),
OUTR3B(I, PN[I], TRS2) ;
FORMAT OUT FMOIMA(//X36,"INTERMEDIATE PRINTOUT", ///X15,
"ITERATION LOOPS ADJUSTED TOTAL ERROR ",
"MAXIMUM ERROR AT LOOP", /X46,"PSI",X11,"PSI"/),
FMOIM1(/I20, I14, X5, 2E14.5, I9),
FMORA(////X45,"FLOW DISTRIBUTION", ///X11, "BRANCH",
X3, "CONNECTING NODES", X7,"FLOW", X6,
"PRESSURE DROP FRICTION COEFF COMMENT", /X22,
"SN", X6, "EN", A15, X13, "PSI"//),
FMOR2(I14, I10, I8, F17.3, F15.3, E19.6, A11),
FMORB(////X40,"NODAL CONDITIONS",////X27, "NODE", X4,
"PRESSURE", X6, "SOURCE", X8, "SINK", X8,
//X33, "PSIG", 2A13///),
FMOR3(I30, 3F13.3),
FMOR3A(I30, F13.3, F26.3) ;
LABEL REITERATE, RE ;
COMMENT INITIAL SETUP. ;
FOR I ~ 1 STEP 1 UNTIL NODE DO PN[I] ~ P[1] ;
FOR I ~ 2 STEP 1 UNTIL NOP DO
DP[I-1] ~ H[NP[1]] - H[NP[I]] ;
FOR I ~ 1 STEP 1 UNTIL NOP-1 DO
DP[I] ~ DP[I] | DENR / 144.0 + P[1] - P[I+1] ;
IF STATE = 1 THEN
BEGIN
RE1 ~ 6326.33 | DENR / VIS ;
COP1 ~ (TEMP + 460.0) | DENR | DENR | 575.23455 / MW ;
END
ELSE IF STATE = 2 THEN
BEGIN
RE1 ~ 50.759 | DENR / VIS ;
COP1 ~ 0.0017274 | DENR ;
END ;
FOR J ~ 1 STEP 1 UNTIL B DO C[J] ~ L[J] | COP1 / D[J]*5 ;
ITER ~ 0 ; Z ~ 1 ;
COMMENT START ITERATION HERE. ;
REITERATE: ITER ~ ITER + 1 ;
IF ITER > 100 THEN GO TO START ;
COMMENT CALCULATE THE PRESSURE DROP COEFFICIENTS FOR PIPES. ;
FOR N5 ~ 1 STEP 1 UNTIL B DO IF A[N5] ! 3 THEN
BEGIN
COMMENT THIS SECTION CALCULATES THE FRICTION FACTOR F FOR
BRANCH J FROM THE GIVEN REYNOLDS NUMBER-RENO. THE
RELATIONS GIVEN BY COULSON AND RICHARDSON IN P.30 OF
"CHEMICAL ENGINEERING", VOL I, IS USED. ;
IF STATE = 1 THEN
BEGIN
PAVG ~ PN[SN[N5]] + PN[EN[N5]] ;
Z ~ (Z2 | PAVG + Z1 + Z0 / PAVG)| 0.5 ;
END ;
RENO ~ ABS(FLOW[N5]) | RE1 | Z / D[N5] ;
IF RENO = 0.0 THEN RENO ~ 50.0 ;
IF RENO < 2000.0 THEN F ~ 8.0 / RENO
ELSE
BEGIN
G ~ 1.0 ;
TRS1 ~ 14.3 ; TRS2 ~ ED[N5] ;
IF TRS2 ! 0.0 THEN
BEGIN
IF RENO > 1.0@7 THEN TRS1 ~ -2.5 | LN(TRS2) + 3.2
ELSE FOR N6 ~ 1 STEP 1 WHILE ABS(G) > 1.0@-5 DO
BEGIN
TRS3 ~ TRS1 / (1.13 | RENO) + 0.27027 | TRS2 ;
G ~ 2.5 | LN(TRS3) ;
DG ~ (1.0 - 2.5 / TRS3) / (1.13 | RENO) ;
TRS1 ~ G / DG + TRS1 ;
END
END
ELSE FOR N6 ~ 1 STEP 1 WHILE ABS(G) > 1.0@-5 DO
BEGIN
G ~ 0.3 + 2.5 | LN(RENO / TRS1) - TRS1 ;
DG ~ 2.5 / TRS1 + 1.0 ; TRS1 ~ G / DG + TRS1 ;
END ;
F ~ 1.0 / TRS1*2 ;
END ;
COP[N5] ~ C[N5] | F | Z ;
END COEFF ;
COMMENT CALCULATE THE PRESSURE DROP COEFFICIENTS FOR NON-PIPES. ;
FOR K ~ 1 STEP 1 UNTIL NONP DO
BEGIN
TRS1 ~ 0.0 ; J ~ BNP[K] ; TRS2 ~ ABS(FLOW[J]) ;
FOR N ~ POL[K] STEP -1 UNTIL 0 DO
TRS1 ~ TRS1 | TRS2 + POLC[K,N] ;
COP[J] ~ TRS1 / TRS2*2 ;
END ;
COMMENT LOOP BALANCING BY THE HARDY - CROSS METHOD. ;
N1 ~ N2 ~ N4 ~ 0 ; TRS4 ~ TRS5 ~ 0.0 ;
FOR K ~ 1 STEP 1 UNTIL NOLP DO
BEGIN
N3 ~ NBL[K] ; SUMP ~ SUMDP ~ 0.0 ;
COMMENT CALCULATE PRSSURE DROPS AND THE PARTIALS FOR BRANCHES. ;
FOR N ~ 1 STEP 1 UNTIL N3 DO
BEGIN
J ~ T[N1+N] ; N5 ~ ABS(J) ;
TRS7 ~ FLOW[N5] ; TRS8 ~ ABS(TRS7) ;
IF A[N5] ! 3 THEN
BEGIN
TRS10 ~ COP[N5] | TRS8 ;
SUMDP ~ SUMDP + TRS10 + TRS10 ;
SUMP ~ SIGN(J) | TRS7 | TRS10 + SUMP ;
END
ELSE
BEGIN
FOR I ~ 1 STEP 1 WHILE BNP[I] ! N5 DO ;
IF (DIR[I] = 0) OR (SIGN(TRS7) = SIGN(DIR[I])) THEN
BEGIN
TRS9 ~ TRS10 ~ 0.0 ;
FOR N6 ~ POL[I] STEP -1 UNTIL 1 DO
BEGIN
TRS11 ~ POLC[I,N6] ;
TRS9 ~ TRS9 | TRS8 + TRS11 ;
TRS10 ~ TRS10 | TRS8 + N6 | TRS11
END ;
TRS9 ~ TRS9 | TRS8 + POLC[I,0] ;
COP[N5] ~ TRS9 / TRS8*2 ;
SUMP ~ SIGN(TRS7) | SIGN(J) | TRS9 + SUMP ;
SUMDP ~ SUMDP + TRS10 ;
END
ELSE COP[N5] ~ 0.0 ;
END ;
END ;
COMMENT CHECK PRESSURE BALANCES AND IF NECESSARY MAKE FLOW
ADJUSTMENTS. ;
IF K > LP THEN SUMP ~ -DP[K-LP] + SUMP ;
TRS6 ~ ABS(SUMP) ; TRS4 ~ TRS4 + TRS6 ;
IF TRS6 > TRS5 THEN
BEGIN
TRS5 ~ TRS6 ; N4 ~ K
END ;
IF TRS6 > (N3 | TOLP) THEN
BEGIN
N2 ~ N2 + 1 ; DQ ~ -SUMP / SUMDP ;
FOR N ~ 1 STEP 1 UNTIL N3 DO
BEGIN
J ~ T[N1+N] ; N5 ~ ABS(J) ;
FLOW[N5] ~ SIGN(J) | DQ + FLOW[N5]
END ;
IF K > LP THEN
BEGIN
J ~ T[N1+1] ; U ~ T[N1+N3] ;
N6 ~ IF J < 0 THEN EN[-J] ELSE SN[J] ;
N7 ~ IF U < 0 THEN SN[-U] ELSE EN[U] ;
FOR K ~ 1 STEP 1 UNTIL NOFEED DO
IF NF[K] = N6 THEN FEED[K] ~ FEED[K] + DQ
ELSE IF NF[K] = N7 THEN FEED[K] ~ FEED[K] - DQ ;
FOR K ~ 1 STEP 1 UNTIL NOSINK DO
IF NS[K] = N6 THEN SINK[K] ~ SINK[K] - DQ
ELSE IF NS[K] = N7 THEN SINK[K] ~ SINK[K] + DQ ;
END ;
END ;
N1 ~ N1 + N3
END ;
COMMENT PRINT OUT INTERMEDIATE RESULTS IF REQUIRED. ;
IF OPT1 THEN
BEGIN
IF ITER = 1 THEN
BEGIN
WRITE(FILO[PAGE]) ; WRITE(FILO, FMO, TITLE) ;
WRITE(FILO, FMOIMA) ;
END ;
WRITE(FILO, FMOIM1, OUTIM1) ;
END ;
COMMENT CHECKS RESULTS. ;
IF (N2 > 0) AND (STATE = 2) THEN GO TO REITERATE ;
NNN ~ N2 ;
COMMENT THIS SECTION CALCULATES NODAL PRESSURES FROM THE FLOW
DISTRIBUTION. ;
FOR I ~ 1 STEP 1 UNTIL NODE DO PN[I] ~ 0.0 ;
N1 ~ 1 ; PN[NP[1]] ~ P[1] ;
RE: FOR I ~ 1 STEP 1 UNTIL NODE DO
BEGIN
N3 ~ NOBN[I] ; TRS3 ~ PN[I] ;
IF TRS3 ! 0.0 THEN
FOR K ~ 1 STEP 1 UNTIL N3 DO
BEGIN
N4 ~ BBN[I,K] ; N6 ~ ABS(N4) ;
IF N4 < 0 THEN N5 ~ SN[-N4] ELSE N5 ~ EN[N4] ;
IF PN[N5] = 0.0 THEN
BEGIN
TRS1 ~ ABS(FLOW[N6]) | FLOW[N6] ;
TRS2 ~ SIGN(N4) | COP[N6] | TRS1 ;
PN[N5] ~ (H[N5] - H[I]) | DENR / 144.0 + TRS3 - TRS2 ;
N1 ~ N1 + 1 ;
END
END
END ;
IF N1 < NODE THEN GO TO RE ;
IF NNN ! 0 THEN GO TO REITERATE ;
COMMENT THIS SECTION PRINTS OUT FLOW AND PRESSURE DISTIBUTIONS. ;
WRITE(FILO[PAGE]) ; WRITE(FILO, FMO, TITLE) ;
IF STATE = 1 THEN AA~ " GAS" ELSE AA ~ "LIQUID" ;
WRITE(FILO, FMOR1, OUTR1) ;
IF STATE = 1 THEN AA ~ "MCF/HR" ELSE AA ~ " GPM " ;
WRITE(FILO[PAGE]) ; WRITE(FILO, FMORA, AA) ;
FOR J ~ 1 STEP 1 UNTIL B DO
BEGIN
N1 ~ SN[J] ; N2 ~ EN[J] ;
TRS1 ~ PN[N1] - PN[N2] ; AA ~ " " ;
IF A[J] = 3 THEN
BEGIN
FOR K ~ 1 STEP 1 WHILE BNP[K] ! J DO ;
AA ~ NAME[K]
END ;
WRITE(FILO, FMOR2, OUTR2)
END ;
WRITE(FILO[PAGE]) ; WRITE(FILO, FMORB, AA, AA) ;
FOR I ~ 1 STEP 1 UNTIL NODE DO
BEGIN
TRS1 ~ TRS2 ~ 0.0 ;
FOR K ~ 1 STEP 1 UNTIL NOFEED DO
IF I = NF[K] THEN TRS1 ~ FEED[K] ;
FOR K ~ 1 STEP 1 UNTIL NOSINK DO
IF I = NS[K] THEN TRS2 ~ SINK[K] ;
IF TRS1 ! 0.0 THEN
BEGIN
IF TRS2 ! 0.0 THEN WRITE(FILO, FMOR3, OUTR3)
ELSE WRITE(FILO, FMOR3, OUTR3A)
END
ELSE
BEGIN
IF TRS2 ! 0.0 THEN WRITE(FILO, FMOR3A, OUTR3B)
ELSE WRITE(FILO, FMOR3, I, PN[I]) ;
END
END ;
END ITERATIVE CALCULATIONS ;
END ;
T2 ~ (TIME(1) - T1) / 60.0 ;
WRITE(FILO, F1, CASE, T2) ;
GO TO START ;
FINI: END .
LABEL 000000000FILI 0010000001
TEST 2 35 30 3 11 2 0 WATER 2 IN1
2 70.0 18.0 0.50 @ 02 0.8 @ 00 0.1 @ 01 0.0 @ 00 0.0 @ 00 2 IN2
10 500 5 1 0.001 2 IN3
FALSE TRUEFALSE TRUE TRUE
1 2 500.0 24.0 0.0 3 2 IN5
2 4 120.0 16.0 0.0
2 5 120.0 16.0 0.0
3 4 80.0 16.0 0.0
5 6 80.0 16.0 0.0
3 7 95.0 8.0 0.0
3 8 70.0 12.0 0.0
4 9 70.0 12.0 0.0
5 11 70.0 12.0 0.0
6 16 170.0 14.0 0.0
7 8 40.0 8.0 0.0
8 9 80.0 8.0 0.0
9 10 60.0 8.0 0.0
10 11 60.0 8.0 0.0
7 13 100.0 14.0 0.0
9 14 100.0 12.0 0.0
11 15 100.0 12.0 0.0
12 13 270.0 14.0 0.0 3
15 16 80.0 8.0 0.0
13 17 150.0 14.0 0.0
14 17 150.0 12.0 0.0
14 18 175.0 12.0 0.0
16 19 120.0 12.0 0.0
18 19 223.0 12.0 0.0
17 20 90.0 14.0 0.00 3
18 21 90.0 12.0 0.00 3
19 22 90.0 12.0 0.00 3
20 23 120.0 14.0 0.00 3
21 24 120.0 12.0 0.00 3
22 25 120.0 12.0 0.00 3
23 28 150.0 14.0 0.00 3
24 29 150.0 12.0 0.00 3
25 30 150.0 12.0 0.00 3
26 27 60.0 12.0 0.00 3
27 28 230.0 12.0 0.00 3
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 IN6
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 IN6
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 IN6
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 IN6
1 20000.0 12 10000.0 19 4000.0 2 IN7
3 5300.0 6 7300.0 9 700.0 10 200.0 2 IN8
15 830.0 20 1250.0 21 120.0 26 4600.0 2 IN8
28 4600.0 29 5200.0 30 3900.0 2 IN8
1 200.0 12 200.0 2 IN9
TEST 1 41 28 4 12 1 WATER NET1IN1
2 100.0 18.0 0.624 @ 02 0.1 @ 01 0.1 @ 01 0.0 @ 00 0.0 @ 00 1 IN2
201000 5 0 0.0001
FALSE TRUEFALSE TRUE TRUE
1 2 10.0 1.0 0.00 NET1IN5
1 5 10.0 1.0 0.0
2 3 10.0 1.0 0.0
3 4 10.0 2.0 0.0
3 6 15.0 1.0 0.0
4 8 10.0 2.0 0.0
5 6 15.0 1.0 0.0
5 9 10.0 1.0 0.0
5 11 20.0 2.0 0.0
6 7 15.0 1.0 0.0
7 8 10.0 1.0 0.0
7 11 10.0 2.0 0.0
8 12 10.0 1.0 0.0
9 10 15.0 1.0 0.0
9 13 10.0 1.0 0.0
10 11 15.0 2.0 0.0
10 14 10.0 1.0 0.0
11 12 10.0 2.0 0.0
11 15 10.0 2.0 0.0
12 16 10.0 1.0 0.0
13 14 15.0 1.0 0.0
13 17 10.0 1.0 0.0
14 15 15.0 1.0 0.0
14 19 10.0 2.0 0.0
15 16 10.0 1.0 0.0
15 19 10.0 2.0 0.0
16 20 10.0 1.0 0.0
16 21 10.0 1.0 0.0
17 18 8.0 1.0 0.0
17 25 40.0 1.0 0.0
18 19 8.0 2.0 0.0
19 20 8.0 2.0 0.0
19 22 10.0 2.0 0.0
20 21 8.0 1.0 0.0
21 28 40.0 1.0 0.0
22 23 10.0 1.0 0.0
23 24 10.0 1.0 0.0
24 27 10.0 2.0 0.0
25 26 8.0 1.0 0.0
26 27 8.0 2.0 0.0
27 28 16.0 2.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 NET1IN6
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
4 100.0 11 200.0 19 200.0 27 100.0 NET1 IN7
2 20.0 5 50.0 10 20.0 16 50.0 NET1 IN8
17 20.0 25 100.0 28 100.0 1 40.0
12 40.0 18 50.0 21 50.0 6 60.0
1 100.0 NET1 IN9