1 SUB HDDSET(field$(), command$, title$, workfile$, outfile$, err$) 2 ! 3 ! set up the input parameters and data lines, 4 ! one line at a time. Line data is passed in field$() 5 ! 6 ! TRUTH.B4S 7 .DEFINE .TRUE%=-1% 8 .DEFINE .FALSE%=0% 9 COMMON (FCSERR) err1%, err2% 10 ! 11 ! {HDDDEF.B4S} 12 ! 13 .DEFINE .pipe.chan% = 21% 14 .DEFINE .node.chan% = 22% 15 .DEFINE .loop.chan% = 23% 16 .DEFINE .tf.out.chan% = 24% 17 .DEFINE .log.chan% = 25% 18 ! 19 ! 20 ! Constant definitions 21 ! 22 .DEFINE .eof% = -10% 23 .DEFINE .max.args% = 21% 24 .DEFINE .tf.bufsiz% = 128% 25 .DEFINE .cmd.line.siz% = 128% 26 .DEFINE .node.buf.siz% = 52% 27 .DEFINE .pipe.buf.siz% = 30% 28 .DEFINE .loop.buf.siz% = 42% ! must be (2 * .max.nodes% + 2) 29 ! 30 .DEFINE .max.nodes% = 20% 31 ! 32 ! {HDDMAP} 33 ! 34 ! buffers/maps 35 ! 36 MAP (NODES) node$ = .node.buf.siz% 37 MAP (NODES) n%(4%), ! connected nodes & ! -ve denotes blocked off & ! zero means no node & nodeflow, ! drawoff from node - litres/sec & xnode, ynode,! node coords & elevation, ! reduced level at node (m - AHD)) & resid.head, ! head at the node (m) & procflag% ! bit set means branch "done" 38 ! 39 MAP (PIPES) pipe$ = .pipe.buf.siz% 40 MAP (PIPES) node1%, node2%, diam, length, pipeflow 41 ! 42 ! note - pipeflow is +ve in direction node1 -> node2 43 ! 44 MAP (LOOPS) loop$ = .loop.buf.siz% 45 MAP (LOOPS) loop%, l.node%(.max.nodes%) 46 ! 47 MAP (INBUF) inbuf$ = 128% 48 MAP (CMDBUF) command.buffer$ = .cmd.line.siz% 49 ! 50 COMMON (SETUP) in.put%, input%, pipe.coeff, & node.file.open%, pipe.file.open%, & loop.file.open%, & echo%, first%, ask%, help%, & node.inp%, pipe.inp%, loop.inp%, line.inp%, & heads%, flows%, lo.op%, co.eff%, & loopdata%, results%, spare1%, & debug%, debug1%, debug2%, & more.data%, not.finished% 51 ! 52 ! 53 ! print "at A" 54 IF field$(1%) = "START" & THEN in.put%, first% = .true% & \ IF field$(2%) = "NODES" & THEN node.inp% = .true% & ELSE IF field$(2%) = "PIPES" & THEN pipe.inp% = .true% & ELSE IF field$(2%) = "LOOPS" & THEN loop.inp% = .true% & ELSE IF field$(2%) = "LINES" & THEN line.inp% = .true% 55 ! print "SET - line.inp% ";line.inp% 56 ! 57 IF NOT (in.put%) & THEN do% = fn.workfile% IF field$(1%) = "WORKFILE" & \ do% = fn.outfile% IF field$(1%) = "OUTFILE" & \ do% = fn.heads% IF field$(1%) = "HEADS" & \ do% = fn.flows% IF field$(1%) = "FLOWS" & \ do% = fn.loopdata% IF field$(1%) = "DATAFILE" & \ do% = fn.title% IF field$(1%) = "TITLE" & \ do% = fn.results% IF field$(1%) = "RESULTS" & \ pipe.coeff = val(field$(2%)) IF field$(1%) = "COEFFICIENT" & \ IF field$(1%) = "CLOSE" & THEN pi.pe% = val(field$(2%)) & \ do% = fn.close%(pi.pe%) & ELSE IF field$(1%) = "OPEN" & THEN pi.pe% = val(field$(2%)) & \ do% = fn.open%(pi.pe%) 58 ! 59 IF NOT (in.put%) & THEN debug% = val(field$(2%)) IF field$(1%) = "DEBUG" & \ debug1% = val(field$(2%)) IF field$(1%) = "DEBUG1" & \ debug2% = val(field$(2%)) IF field$(1%) = "DEBUG2" & \ help% = .true% IF field$(1%) = "HELP" OR field$(1%) = "?" & \ more.data% = .false% IF field$(1%)="DO" OR field$(1%)="GO" OR field$(1%)="QUIT" OR field$(1%) = "EXIT" & \ not.finished% = .false% IF field$(1%) = "QUIT" OR field$(1%) = "EXIT" & \ IF field$(1%) = "ECHO" & THEN IF field$(2%) = "" OR field$(2%) = "-1" & THEN echo% = .true% & ELSE echo% = .false% 60 ! 61 IF in.put% & THEN IF field$(1%) = "END" & THEN in.put% = .false% & \ IF field$(2%) = "NODES" & THEN node.inp% = .false% & ELSE IF field$(2%) = "PIPES" & THEN pipe.inp% = .false% & ELSE IF field$(2%) = "LOOPS" & THEN loop.inp% = .false% & ELSE IF field$(2%) = "LINES" & THEN line.inp% = .false% 62 ! 63 IF (in.put% AND first% AND line.inp%) & THEN CALL CLOSE.(.pipe.chan%) & \ CALL CLOSE.(.loop.chan%) & \ do% = fn.open.workfile%(".P", "U", .pipe.chan%, .pipe.buf.siz%) & \ do% = fn.open.workfile%(".L", "U", .loop.chan%, .loop.buf.siz%) 64 ! 65 ! print "input, first, line.inp: "; in.put%; first%; line.inp% 66 ! 67 IF in.put% & THEN IF first% & THEN first% = .false% & ELSE IF node.inp% & THEN do% = fn.node.inp% & ELSE IF pipe.inp% & THEN do% = fn.pipe.inp% & ELSE IF loop.inp% & THEN do% = fn.loop.inp% & ELSE IF line.inp% & THEN do% = fn.writeback% 68 ! 69 ! print "end of ITEs in.put, first "; in.put%, first% 70 ! 71 ! print "at C" 72 IF echo% & THEN command$ = CR + LF + command$ & \ print command$ 73 ! 74 SUBEXIT 75 ! 76 ! ***************** FUNCTIONS ************************** 77 ! 78 ! ***************** fn.workfile$() ************************** 79 ! 80 DEF fn.workfile% 81 ! 82 workfile$ = field$(2%) 83 ! 84 workfile$ = edit$(workfile$, 40%) 85 psn.dot% = pos(workfile$, ".", 1%) 86 workfile$ = left$(workfile$, psn.dot% - 1%) IF psn.dot% > 0% 87 ! 88 IF field$(3%) = "NEW" & THEN do% = fn.open.workfile%(".N", "W", .node.chan%, .node.buf.siz%) & \ do% = fn.open.workfile%(".P", "W", .pipe.chan%, .pipe.buf.siz%) & \ do% = fn.open.workfile%(".L", "W", .loop.chan%, .loop.buf.siz%) & \ node.file.open%, pipe.file.open%, loop.file.open% = .true% & ELSE new.workfiles% = .false% 89 ! 90 FNEND 91 ! 92 ! ***************** fn.outfile$() ************************** 93 ! 94 DEF fn.outfile% 95 ! 96 outfile$ = field$(2%) 97 ! 98 outfile$ = edit$(outfile$, 40%) 99 psn.dot% = pos(outfile$, ".", 1%) 100 outfile$ = left$(outfile$, psn.dot% - 1%) IF psn.dot% > 0% 101 ! 102 FNEND 103 ! 104 ! ***************** fn.title%() ************************** 105 ! 106 DEF fn.title% 107 ! 108 title$ = edit$(right$(command$, 6%), 8%) + CR + LF + HT + "[HDD: " + time$(0%) + " " + date$(0%) + "]" 109 ! 110 FNEND 111 ! 112 ! *************** fn.flows%() ************************ 113 ! 114 DEF fn.flows% 115 ! 116 IF field$(2%) <> "" & THEN flows% = val(field$(2%)) & ELSE flows% = .true% 117 ! 118 FNEND 119 ! 120 ! *************** fn.heads%() ************************ 121 ! 122 DEF fn.heads% 123 ! 124 IF field$(2%) <> "" & THEN heads% = val(field$(2%)) & ELSE heads% = .true% 125 ! 126 FNEND 127 ! 128 ! *************** fn.loopdata%() ************************ 129 ! 130 DEF fn.loopdata% 131 ! 132 IF field$(2%) <> "" & THEN loopdata% = val(field$(2%)) & ELSE loopdata% = .true% 133 ! 134 FNEND 135 ! 136 ! *************** fn.results%() ************************ 137 ! 138 DEF fn.results% 139 ! 140 IF field$(2%) <> "" & THEN results% = val(field$(2%)) & ELSE results% = .true% 141 ! 142 FNEND 143 ! 144 ! ************* fn.node.inp% ******************** 145 ! 146 DEF fn.node.inp% 147 ! 148 IF NOT (node.file.open%) & THEN do% = fn.open.workfile%(".N", "W", .node.chan%, .node.buf.siz%) & \ node.file.open% = .true% 149 ! 150 rec% = val(field$(1%)) 151 n%(0%) = val(field$(2%)) 152 n%(1%) = val(field$(3%)) 153 n%(2%) = val(field$(4%)) 154 n%(3%) = val(field$(5%)) 155 nodeflow = val(field$(6%)) 156 xnode = val(field$(7%)) 157 ynode = val(field$(8%)) 158 elevation = val(field$(9%)) 159 resid.head = val(field$(10%)) 160 procflag% = 0% 161 ! 162 CALL PUT.(.node.chan%, node$, rec%) 163 ! 164 FNEND 165 ! 166 ! ************* fn.pipe.inp% ******************** 167 ! 168 DEF fn.pipe.inp% 169 ! 170 IF NOT (pipe.file.open%) & THEN do% = fn.open.workfile%(".P", "W", .pipe.chan%, .pipe.buf.siz%) & \ pipe.file.open% = .true% 171 ! 172 rec% = val(field$(1%)) 173 node1% = val(field$(2%)) 174 node2% = val(field$(3%)) 175 diam = val(field$(4%)) 176 length = val(field$(5%)) 177 pipeflow = val(field$(6%)) 178 ! 179 CALL PUT.(.pipe.chan%, pipe$, rec%) 180 ! print "fn.pipe.inp - rec%, err1%, node1%: "; rec%, err1%, node1%, node2% 181 ! 182 FNEND 183 ! 184 ! ************* fn.loop.inp% ******************** 185 ! 186 DEF fn.loop.inp% 187 ! 188 IF NOT (loop.file.open%) & THEN do% = fn.open.workfile%(".L", "W", .loop.chan%, .loop.buf.siz%) & \ loop.file.open% = .true% 189 ! 190 loop% = val(field$(1%)) 191 l.node%(i%) = val(field$(i% + 2%)) FOR i% = 0% TO (.max.nodes% - 1%) 192 ! 193 CALL PUT.(.loop.chan%, loop$, loop%) 194 ! 195 FNEND 196 ! 197 ! **************** fn.writeback%() ************** 198 ! 199 DEF fn.writeback% 200 ! 201 new.workfiles% = .false% 202 IF NOT (pipe.file.open%) & THEN do% = fn.open.workfile%(".P", "U", .pipe.chan%, .pipe.buf.siz%) & \ pipe.file.open% = .true% 203 ! 204 IF NOT (loop.file.open%) & THEN do% = fn.open.workfile%(".L", "U", .loop.chan%, .loop.buf.siz%) & \ pipe.file.open% = .true% 205 ! 206 err.msg$ = "" 207 ! print "in fn.writeback" 208 CALL HDDWRB(field$(), err.msg$) 209 ! 210 FNEND 211 ! 212 ! ************* fn.open.workfile%() ************* 213 ! 214 DEF fn.open.workfile%(ext$, mode$, chan%, reclen%) 215 ! 216 IF workfile$ = "" & THEN workfile$ = "HDXDAT" 217 ! 218 CALL OPEN.(workfile$ + ext$, mode$, chan%, reclen%) 219 ! 220 FNEND 221 ! 222 ! ************** fn.open%(pipe%) ********************* 223 ! 224 DEF fn.open%(pipe%) 225 ! 226 CALL GET.(.pipe.chan%, pipe$, pipe%) 227 do% = fn.valve%(node1%, node2%, 1%) 228 do% = fn.valve%(node2%, node1%, 1%) 229 ! 230 FNEND 231 ! 232 ! ************** fn.close%(pipe%) ********************* 233 ! 234 DEF fn.close%(pipe%) 235 ! 236 CALL GET.(.pipe.chan%, pipe$, pipe%) 237 do% = fn.valve%(node1%, node2%, -1%) 238 do% = fn.valve%(node2%, node1%, -1%) 239 ! 240 FNEND 241 ! 242 ! ************** fn.valve%() ********************* 243 ! 244 DEF fn.valve%(firstnode%, secondnode%, mode%) 245 ! 246 ! close or open the link firstnode->secondnode 247 ! mode: .open% (or) .close% 248 ! 249 CALL GET.(.node.chan%, node$, firstnode%) 250 ! 251 FOR i2% = 0% to 3% 252 IF ABS(n%(i2%)) = secondnode% & THEN n%(i2%) = -(n%(i2%)) IF sgn(n%(i2%)) <> mode% & ! 253 NEXT i2% 254 ! 255 CALL PUT.(.node.chan%, node$, firstnode%) 256 ! 257 FNEND 258 ! 259 ! {BL:[101,5]FNSAW.B4S} 260 ! FNANSCHK.B4S 261 ! 262 DEF fn.ans$ (text$) = edit$ (left$ (text$, 1%), 32%) 263 DEF fn.upper.case$ (text$) = edit$ (text$, 32%) 264 ! 265 DEF fn.ans% (text$) 266 IF ((edit$ (left$ (text$, 1%), 32%) = "Y") OR (text$ = "1")) & THEN fn.ans% = -1% & ELSE fn.ans% = 0% 267 FNEND 268 ! 269 SUBEND