Parent Directory | Revision Log

Revision **825** -
(**show annotations**)
(**download**)
(**as text**)

*Mon Aug 21 23:41:31 2006 UTC*
(17 years, 3 months ago)
by *johnpye*

File MIME type: application/x-lyx

File size: 56027 byte(s)

File MIME type: application/x-lyx

File size: 56027 byte(s)

Copying documentation into code tree

1 | #LyX 1.4.1 created this file. For more info see http://www.lyx.org/ |

2 | \lyxformat 245 |

3 | \begin_document |

4 | \begin_header |

5 | \textclass book |

6 | \language english |

7 | \inputencoding auto |

8 | \fontscheme default |

9 | \graphics default |

10 | \paperfontsize default |

11 | \spacing single |

12 | \papersize a4paper |

13 | \use_geometry false |

14 | \use_amsmath 2 |

15 | \cite_engine basic |

16 | \use_bibtopic false |

17 | \paperorientation portrait |

18 | \secnumdepth 3 |

19 | \tocdepth 3 |

20 | \paragraph_separation indent |

21 | \defskip medskip |

22 | \quotes_language english |

23 | \papercolumns 1 |

24 | \papersides 2 |

25 | \paperpagestyle default |

26 | \tracking_changes false |

27 | \output_changes true |

28 | \end_header |

29 | |

30 | \begin_body |

31 | |

32 | \begin_layout Chapter |

33 | Writing METHODs |

34 | \begin_inset LatexCommand \label{cha:methods} |

35 | |

36 | \end_inset |

37 | |

38 | |

39 | \end_layout |

40 | |

41 | \begin_layout Standard |

42 | In this chapter we describe a methodology (pun intended) which can help |

43 | make anyone who can solve a quadratic equation a mathematical modeling |

44 | expert. |

45 | This methodology helps you to avoid mistakes and to find mistakes quickly |

46 | when you make them. |

47 | Finding bugs weeks after creating a model is annoying, inefficient, and |

48 | (frequently) embarrassing. |

49 | Because METHOD code can be large, we do not include many examples here. |

50 | |

51 | \begin_inset Note Note |

52 | status collapsed |

53 | |

54 | \begin_layout Standard |

55 | See ***vessel something*** for detailed examples |

56 | \end_layout |

57 | |

58 | \end_inset |

59 | |

60 | One of the advantages of this methodology is that it allows almost automatic |

61 | \begin_inset LatexCommand \index{methods, automatic generation} |

62 | |

63 | \end_inset |

64 | |

65 | generation of methods for a model based on the declarative structure (defined |

66 | parts and variables) in the model, as we shall see in Section\InsetSpace ~ |

67 | |

68 | \begin_inset LatexCommand \ref{sec:methods.automation} |

69 | |

70 | \end_inset |

71 | |

72 | |

73 | \noun off |

74 | . |

75 | Even if you skip much of this chapter, read |

76 | \noun default |

77 | Section\InsetSpace ~ |

78 | |

79 | \noun off |

80 | |

81 | \begin_inset LatexCommand \ref{sec:methods.automation} |

82 | |

83 | \end_inset |

84 | |

85 | |

86 | \end_layout |

87 | |

88 | \begin_layout Standard |

89 | We divide methods into |

90 | \family typewriter |

91 | _self |

92 | \family default |

93 | and |

94 | \family typewriter |

95 | _all |

96 | \family default |

97 | categories. |

98 | The premise of our approach to design methods is that we can write the |

99 | |

100 | \family typewriter |

101 | _self |

102 | \family default |

103 | methods incrementally, building on the already tested methods of previous |

104 | MODEL parts we are reusing. |

105 | In this way we never have to write a single huge method that directly manipulat |

106 | es the hundreds of variables that are in the model hierarchy. |

107 | Were that all there was to it, things would actually be pretty simple. |

108 | However, in ASCEND, one can also select to solve any part of an ASCEND |

109 | model (in particular, any part that is an instance of a single type), and |

110 | this capability complicates method writing - but not by much if we really |

111 | understand the approach we advocate here. |

112 | As an example, suppose we have a flowsheet that has a reactor followed |

113 | by a flash unit in it. |

114 | In ASCEND, we can select to solve the entire flowsheet, only the reactor, |

115 | only the flash unit or even any one of the streams in it (yes, each stream |

116 | has physical property calculations that belong to it making it interesting |

117 | to isolate and solve). |

118 | Should we choose to solve only the flash unit, ASCEND will isolate the |

119 | equations defining the flash - including the equations we use when defining |

120 | the input and output streams to it as they are a part of the flash unit. |

121 | But the input to the flash is also the output from the reactor and is a |

122 | part of the reactor, too. |

123 | Each part would typically take the prime responsibility for supplying methods |

124 | that will set fix flags, set nominal values, etc., for its variables, but |

125 | who owns the variables they both share such as in the connecting stream? |

126 | By |

127 | \begin_inset Quotes eld |

128 | \end_inset |

129 | |

130 | tradition |

131 | \begin_inset Quotes erd |

132 | \end_inset |

133 | |

134 | in chemical engineering flowsheet modeling, we will assert that the reactor |

135 | has prime responsibility for its output stream. |

136 | If we are solving the entire flowsheet, it should set the flags, etc., for |

137 | its output stream. |

138 | However, when we isolate the flash for solving, the flash unit must assume |

139 | responsibility to set fix flags, nominal values, etc., for the output stream |

140 | from the reactor as that stream is its input stream. |

141 | The |

142 | \family typewriter |

143 | _all |

144 | \family default |

145 | methods allow us to handle these shared variables correctly when we isolate |

146 | a part for solving by itself. |

147 | \begin_inset Note Note |

148 | status collapsed |

149 | |

150 | \begin_layout Standard |

151 | This needs more explanation: I don't find it completely clear. |

152 | \end_layout |

153 | |

154 | \end_inset |

155 | |

156 | |

157 | \end_layout |

158 | |

159 | \begin_layout Standard |

160 | Usually discovery of the information you need to write the methods proceeds |

161 | in the order that they appear below: |

162 | \family typewriter |

163 | check |

164 | \family default |

165 | , |

166 | \family typewriter |

167 | default |

168 | \family default |

169 | , |

170 | \family typewriter |

171 | specify |

172 | \family default |

173 | , |

174 | \family typewriter |

175 | bound |

176 | \family default |

177 | , |

178 | \family typewriter |

179 | scale |

180 | \family default |

181 | . |

182 | |

183 | \end_layout |

184 | |

185 | \begin_layout Section |

186 | Why use standardised methods on models? |

187 | \end_layout |

188 | |

189 | \begin_layout Standard |

190 | In the present chapter, we are proposing that you use a particular standardised |

191 | set of methods on your models. |

192 | While ASCEND doesn't force you to follow these conventions, we hope that |

193 | you will |

194 | \emph on |

195 | choose |

196 | \emph default |

197 | to follow them, because: |

198 | \end_layout |

199 | |

200 | \begin_layout Itemize |

201 | You models will be more portable. |

202 | \end_layout |

203 | |

204 | \begin_layout Itemize |

205 | They will integrate better with the existing model library when composing |

206 | larger models composed of smaller perhaps pre-existing models. |

207 | \end_layout |

208 | |

209 | \begin_layout Itemize |

210 | Other users will be be more easily able to understand what you have built. |

211 | \end_layout |

212 | |

213 | \begin_layout Itemize |

214 | The proposed structure has, in our experience, made for models that are |

215 | easier to debug. |

216 | \end_layout |

217 | |

218 | \begin_layout Standard |

219 | There will be cases where these standard methods don't suffice for your |

220 | needs; these are just proposals for a useful starting point and shared-use |

221 | conventions. |

222 | \end_layout |

223 | |

224 | \begin_layout Standard |

225 | Note that if you do not write the standard methods, your MODEL will inherit |

226 | the ones given in the library |

227 | \family typewriter |

228 | basemodel.a4l |

229 | \family default |

230 | . |

231 | The |

232 | \family typewriter |

233 | ClearAll |

234 | \family default |

235 | and |

236 | \family typewriter |

237 | reset |

238 | \family default |

239 | methods here will work for you if you follow the guidelines for the method |

240 | |

241 | \family typewriter |

242 | specify |

243 | \family default |

244 | . |

245 | The other methods defined in |

246 | \family typewriter |

247 | basemodel.a4l |

248 | \family default |

249 | |

250 | \family typewriter |

251 | (check_self |

252 | \family default |

253 | , |

254 | \family typewriter |

255 | default_self |

256 | \family default |

257 | , |

258 | \family typewriter |

259 | bound_self |

260 | \family default |

261 | , |

262 | \family typewriter |

263 | scale_self |

264 | \family default |

265 | , |

266 | \family typewriter |

267 | check_all |

268 | \family default |

269 | , |

270 | \family typewriter |

271 | default_all |

272 | \family default |

273 | , |

274 | \family typewriter |

275 | bound_all |

276 | \family default |

277 | , |

278 | \family typewriter |

279 | scale_all |

280 | \family default |

281 | ) all contain |

282 | \family typewriter |

283 | STOP |

284 | \family default |

285 | statements that will warn you that you have skipped something important, |

286 | should you accidentally call one of these methods. |

287 | If you create a model for someone else and they run into one of these |

288 | \family typewriter |

289 | STOP |

290 | \family default |

291 | errors while using your model, that error is your fault. |

292 | \end_layout |

293 | |

294 | \begin_layout Section |

295 | Methods *_self |

296 | \begin_inset LatexCommand \index{methods, \_self} |

297 | |

298 | \end_inset |

299 | |

300 | VS *_all |

301 | \begin_inset LatexCommand \index{methods, \_all} |

302 | |

303 | \end_inset |

304 | |

305 | |

306 | \end_layout |

307 | |

308 | \begin_layout Standard |

309 | When you create a model definition, you create a container holding variables, |

310 | equations, arrays, and other models. |

311 | You create methods in the same definition to control the state of (the |

312 | values stored in) all these parts. |

313 | ASCEND lets you share objects among several models by passing objects through |

314 | a model interface (the |

315 | \family typewriter |

316 | MODEL |

317 | \family default |

318 | parameter list), by creating ALIASES |

319 | \begin_inset LatexCommand \index{ALIASES} |

320 | |

321 | \end_inset |

322 | |

323 | for parts within contained objects, and even by merging parts (though merging |

324 | should be avoided for any object larger than a variable). |

325 | |

326 | \end_layout |

327 | |

328 | \begin_layout Standard |

329 | \begin_inset Marginal |

330 | status collapsed |

331 | |

332 | \begin_layout Standard |

333 | Too many cooks |

334 | \begin_inset LatexCommand \index{cooks} |

335 | |

336 | \end_inset |

337 | |

338 | spoil the broth |

339 | \begin_inset LatexCommand \index{broth} |

340 | |

341 | \end_inset |

342 | |

343 | . |

344 | \end_layout |

345 | |

346 | \end_inset |

347 | |

348 | The problem this creates for you as a |

349 | \family typewriter |

350 | METHOD |

351 | \family default |

352 | writer is to decide which of the several |

353 | \family typewriter |

354 | MODEL |

355 | \family default |

356 | s that share an object is responsible for updating that variable's default, |

357 | bounds, and nominal values. |

358 | You could decide that every model which shares a variable is responsible |

359 | for these values. |

360 | This decision will lead to many, many, many hard to understand conflicts |

361 | as different models all try to manage the same value. |

362 | And, the last one run will in fact have the final say. |

363 | But it is difficult to know always which is the last one run. |

364 | The sensible approach is to make only one model responsible for the bounding, |

365 | scaling, and default setting of each variable: |

366 | \emph on |

367 | the model that creates the variable in the first place |

368 | \emph default |

369 | . |

370 | If you abide by this approach, you will keep things much simpler for yourself. |

371 | And, fortunately, the modeling language makes it pretty clear who has created |

372 | each and every variable - except when merging variables. |

373 | \end_layout |

374 | |

375 | \begin_layout Standard |

376 | \begin_inset Marginal |

377 | status collapsed |

378 | |

379 | \begin_layout Standard |

380 | Use *_self methods on locally created variables and parts |

381 | \end_layout |

382 | |

383 | \end_inset |

384 | |

385 | Consider the following model and creating the |

386 | \family typewriter |

387 | *_self |

388 | \family default |

389 | methods |

390 | \family typewriter |

391 | default_self |

392 | \family default |

393 | , |

394 | \family typewriter |

395 | check_self |

396 | \family default |

397 | , |

398 | \family typewriter |

399 | bound_self |

400 | \family default |

401 | , and |

402 | \family typewriter |

403 | scale_self |

404 | \family default |

405 | for it. |

406 | |

407 | \end_layout |

408 | |

409 | \begin_layout LyX-Code |

410 | MODEL selfish( |

411 | \end_layout |

412 | |

413 | \begin_layout LyX-Code |

414 | external_var WILL_BE solver_var; |

415 | \end_layout |

416 | |

417 | \begin_layout LyX-Code |

418 | out_thingy WILL_BE input_part; |

419 | \end_layout |

420 | |

421 | \begin_layout LyX-Code |

422 | ); |

423 | \end_layout |

424 | |

425 | \begin_layout LyX-Code |

426 | my_variable IS_A solver_var; |

427 | \end_layout |

428 | |

429 | \begin_layout LyX-Code |

430 | |

431 | \end_layout |

432 | |

433 | \begin_layout LyX-Code |

434 | peek_at_variable ALIASES out_thingy.mabob.cost; |

435 | \end_layout |

436 | |

437 | \begin_layout LyX-Code |

438 | my_thingy IS_A nother_part; |

439 | \end_layout |

440 | |

441 | \begin_layout LyX-Code |

442 | navel_gaze ALIASES my_thingy.mabob.cost; |

443 | \end_layout |

444 | |

445 | \begin_layout LyX-Code |

446 | END selfish; |

447 | \end_layout |

448 | |

449 | \begin_layout Standard |

450 | |

451 | \end_layout |

452 | |

453 | \begin_layout Standard |

454 | |

455 | \family typewriter |

456 | IS_A |

457 | \family default |

458 | statements indicate all the parts we have created in this model: namely, |

459 | the |

460 | \family typewriter |

461 | solver_var |

462 | \family default |

463 | we call |

464 | \family typewriter |

465 | my_variable |

466 | \family default |

467 | and the |

468 | \family typewriter |

469 | nother_part |

470 | \family default |

471 | we call |

472 | \family typewriter |

473 | my_thingy |

474 | \family default |

475 | . |

476 | This model should manage the value of the only variable it creates: |

477 | \family typewriter |

478 | my_variable |

479 | \family default |

480 | . |

481 | The variable, |

482 | \family typewriter |

483 | external_var |

484 | \family default |

485 | , comes in from the outside so some other model has created it and should |

486 | manage it. |

487 | The variables |

488 | \family typewriter |

489 | peek_at_variable |

490 | \family default |

491 | and |

492 | \family typewriter |

493 | navel_gaze |

494 | \family default |

495 | also are not created here and should not be managed in the |

496 | \family typewriter |

497 | *_self |

498 | \family default |

499 | methods of |

500 | \family typewriter |

501 | selfish |

502 | \family default |

503 | . |

504 | |

505 | \family typewriter |

506 | my_thingy.mabob.cost |

507 | \family default |

508 | belongs to a part we created. |

509 | We want to default, bound, or scale variables in all parts we create, also, |

510 | so we must call |

511 | \family typewriter |

512 | my_thingy.default_self |

513 | \family default |

514 | whenever |

515 | \family typewriter |

516 | default_self |

517 | \family default |

518 | is called for this model. |

519 | Its |

520 | \family typewriter |

521 | *_self |

522 | \family default |

523 | method should in turn call the |

524 | \family typewriter |

525 | *_self |

526 | \family default |

527 | method for |

528 | \family typewriter |

529 | mabob |

530 | \family default |

531 | , which should set defaults, bounds and scaling for its variable, |

532 | \family typewriter |

533 | cost |

534 | \family default |

535 | . |

536 | Finally, |

537 | \family typewriter |

538 | out_thingy |

539 | \family default |

540 | is an input parameter and is not created here; we should not call |

541 | \family typewriter |

542 | out_thingy.default_self |

543 | \family default |

544 | , therefore, as some other model will do so. |

545 | \end_layout |

546 | |

547 | \begin_layout Standard |

548 | \begin_inset Marginal |

549 | status collapsed |

550 | |

551 | \begin_layout Standard |

552 | Use *_all methods to manage a troublesome part |

553 | \end_layout |

554 | |

555 | \end_inset |

556 | |

557 | As noted above, you may choose to isolate any mathematical subproblem in |

558 | a large simulation for debugging or solving purposes. |

559 | When you do this isolation using the Browser and Solver tools, you still |

560 | need to call scaling, bounding, and checking methods for all parts of the |

561 | isolated subproblem, even for those parts that come in from the outside. |

562 | This is easily done by writing |

563 | \family typewriter |

564 | *_all |

565 | \family default |

566 | methods. |

567 | In the example above, |

568 | \family typewriter |

569 | scale_all |

570 | \family default |

571 | will scale |

572 | \family typewriter |

573 | external_var |

574 | \family default |

575 | and call |

576 | \family typewriter |

577 | out_thingy.scale_all |

578 | \family default |

579 | because these parts are defined using |

580 | \family typewriter |

581 | WILL_BE |

582 | \family default |

583 | |

584 | \begin_inset LatexCommand \index{WILL\_BE} |

585 | |

586 | \end_inset |

587 | |

588 | statements. |

589 | Finally |

590 | \family typewriter |

591 | scale_all |

592 | \family default |

593 | will call its local |

594 | \family typewriter |

595 | *_self |

596 | \family default |

597 | to do all the normal scaling. |

598 | \end_layout |

599 | |

600 | \begin_layout Standard |

601 | That's the big picture of |

602 | \family typewriter |

603 | *_self |

604 | \family default |

605 | and |

606 | \family typewriter |

607 | *_all |

608 | \family default |

609 | methods. |

610 | Each kind of method (bound, scale, default, check) has its own peculiarities, |

611 | which we cover in Section |

612 | \begin_inset LatexCommand \ref{sec:methods.selfMethods} |

613 | |

614 | \end_inset |

615 | |

616 | |

617 | \noun off |

618 | and |

619 | \noun default |

620 | Section |

621 | \noun off |

622 | |

623 | \begin_inset LatexCommand \ref{sec:methods.allMethods} |

624 | |

625 | \end_inset |

626 | |

627 | , but they all follow the rules above |

628 | \noun default |

629 | and |

630 | \noun off |

631 | distinguish among variables and parts defined with |

632 | \family typewriter |

633 | \noun default |

634 | WILL_BE |

635 | \family default |

636 | \noun off |

637 | (managed in * |

638 | \family typewriter |

639 | \noun default |

640 | _all |

641 | \family default |

642 | \noun off |

643 | only), IS_A |

644 | \begin_inset LatexCommand \index{IS\_A} |

645 | |

646 | \end_inset |

647 | |

648 | (managed in |

649 | \family typewriter |

650 | \noun default |

651 | *_self |

652 | \family default |

653 | \noun off |

654 | only), and |

655 | \family typewriter |

656 | \noun default |

657 | ALIASES |

658 | \family default |

659 | \noun off |

660 | (not our responsibility). |

661 | \end_layout |

662 | |

663 | \begin_layout Section |

664 | How to write ClearAll |

665 | \begin_inset LatexCommand \index{ClearAll} |

666 | |

667 | \end_inset |

668 | |

669 | and reset |

670 | \begin_inset LatexCommand \index{reset} |

671 | |

672 | \end_inset |

673 | |

674 | |

675 | \end_layout |

676 | |

677 | \begin_layout Standard |

678 | Writing these two standard methods in your model is very simple: do nothing. |

679 | You may wish to write alternative |

680 | \family typewriter |

681 | reset_* |

682 | \family default |

683 | methods as we shall discuss. |

684 | All models inherit these methods from the definitions in |

685 | \family typewriter |

686 | basemodel.a4l |

687 | \family default |

688 | . |

689 | Just so you know, here is what they do. |

690 | \end_layout |

691 | |

692 | \begin_layout Subsection |

693 | |

694 | \family typewriter |

695 | METHOD ClearAll |

696 | \end_layout |

697 | |

698 | \begin_layout Standard |

699 | This method finds any variable that is a |

700 | \family typewriter |

701 | solver_var |

702 | \family default |

703 | or refinement of |

704 | \family typewriter |

705 | solver_var |

706 | \family default |

707 | and changes the |

708 | \family typewriter |

709 | .fixed |

710 | \family default |

711 | flag on that var to |

712 | \family typewriter |

713 | FALSE |

714 | \family default |

715 | . |

716 | This method only touches the |

717 | \family typewriter |

718 | .fixe |

719 | \family default |

720 | d flags; i.e., it does not change the value of |

721 | \family typewriter |

722 | .included |

723 | \family default |

724 | flags on relations or return boolean, integer and symbol variables to a |

725 | default value. |

726 | |

727 | \end_layout |

728 | |

729 | \begin_layout Subsection |

730 | |

731 | \family typewriter |

732 | METHOD reset |

733 | \end_layout |

734 | |

735 | \begin_layout Standard |

736 | This method calls |

737 | \family typewriter |

738 | ClearAll |

739 | \family default |

740 | to bring the model to a standard state with all variables unfixed (free), |

741 | then it calls the user-written specify method to bring the model to a state |

742 | where it has an equal number of variables to calculate and equations to |

743 | solve - i.e., to being |

744 | \begin_inset Quotes eld |

745 | \end_inset |

746 | |

747 | square. |

748 | \begin_inset Quotes erd |

749 | \end_inset |

750 | |

751 | Normally you do not need to write this method: your models will inherit |

752 | this one unless you override it (redefine it) in your model. |

753 | \end_layout |

754 | |

755 | \begin_layout Standard |

756 | This standard state is not necessarily the most useful starting state for |

757 | any particular application. |

758 | This method merely establishes a base case the modeler finds to be a good |

759 | starting point. |

760 | As an example, the modeler may elect to set fix variables for the base |

761 | case for a flash unit so it corresponds to an isothermal flash calculation. |

762 | Chemical engineers understand this case and can make changes from it to |

763 | set up other cases, such as an adiabatic flash, relatively easily by setting |

764 | and resetting but one or two |

765 | \family typewriter |

766 | .fixed |

767 | \family default |

768 | flags. |

769 | There is no one perfect "reset"' for all purposes. |

770 | Other |

771 | \family typewriter |

772 | reset_* |

773 | \family default |

774 | methods can also be written for particular purposes, if such arise |

775 | \begin_inset Foot |

776 | status collapsed |

777 | |

778 | \begin_layout Standard |

779 | The name of a method, for example |

780 | \family typewriter |

781 | reset_someOtherPurpose |

782 | \family default |

783 | is a communication tool. |

784 | Please use meaningful names as long as necessary to tell what the method |

785 | does. |

786 | Avoid cryptic abbreviations and hyper-specialized jargon known only to |

787 | you and your three friends when you are naming methods; however, do not |

788 | shy away from technical terms common to the engineering domain in which |

789 | you are modeling. |

790 | \end_layout |

791 | |

792 | \end_inset |

793 | |

794 | . |

795 | \end_layout |

796 | |

797 | \begin_layout Section |

798 | The |

799 | \family typewriter |

800 | *_self |

801 | \family default |

802 | |

803 | \begin_inset LatexCommand \index{\_self} |

804 | |

805 | \end_inset |

806 | |

807 | methods |

808 | \begin_inset LatexCommand \label{sec:methods.selfMethods} |

809 | |

810 | \end_inset |

811 | |

812 | |

813 | \end_layout |

814 | |

815 | \begin_layout Standard |

816 | The following methods should be redefined by each reusable library |

817 | \family typewriter |

818 | MODEL |

819 | \family default |

820 | . |

821 | Models that do not supply proper versions of these methods are usually |

822 | very hard to reuse. |

823 | |

824 | \end_layout |

825 | |

826 | \begin_layout Subsection |

827 | |

828 | \family typewriter |

829 | METHOD check_self |

830 | \family default |

831 | |

832 | \begin_inset LatexCommand \index{check\_self} |

833 | |

834 | \end_inset |

835 | |

836 | |

837 | \end_layout |

838 | |

839 | \begin_layout Standard |

840 | One can benefit by writing this method first, though it is run last. |

841 | Just as they taught you in elementary school, always check your work. |

842 | Start by defining criteria for a successful solution that will not be included |

843 | in the equations solved and compute them in this method. |

844 | As you develop your |

845 | \family typewriter |

846 | MODEL |

847 | \family default |

848 | , you should expect to revise the check method from time to time, if you |

849 | are learning anything about the model. |

850 | We frequently change our definition of success when modeling. |

851 | \end_layout |

852 | |

853 | \begin_layout Standard |

854 | When a mathematical model is solved, the assumptions that went into writing |

855 | (deriving) the equations should be checked. |

856 | Usually there are redundant equations available (more than one way to state |

857 | the physics or economics mathematically). |

858 | These should be used to check the particularly tricky bits of the model. |

859 | \end_layout |

860 | |

861 | \begin_layout Standard |

862 | Check that the physical or intuitive (qualitative) relationships among variables |

863 | you expect to hold are true, especially if you have not written such relationsh |

864 | ips in terms of inequalities ( |

865 | \family typewriter |

866 | x*z <= y |

867 | \family default |

868 | ) in the |

869 | \family typewriter |

870 | MODEL |

871 | \family default |

872 | equations. |

873 | \end_layout |

874 | |

875 | \begin_layout Standard |

876 | In some models, checking the variable values against absolute physical limits |

877 | ( |

878 | \family typewriter |

879 | temperature > 0{K} |

880 | \family default |

881 | and |

882 | \family typewriter |

883 | temperature < Tcritical |

884 | \family default |

885 | , for example) may be all that is necessary or possible. |

886 | Do not check variable values against their |

887 | \family typewriter |

888 | .lower_bound |

889 | \family default |

890 | or |

891 | \family typewriter |

892 | .upper_bound |

893 | \family default |

894 | , as ASCEND will do this for you. |

895 | \end_layout |

896 | |

897 | \begin_layout Standard |

898 | If a check fails, use a |

899 | \family typewriter |

900 | STOP |

901 | \family default |

902 | |

903 | \begin_inset LatexCommand \index{STOP} |

904 | |

905 | \end_inset |

906 | |

907 | statement to notify yourself (or your end-user) that the solution may be |

908 | bogus. |

909 | |

910 | \family typewriter |

911 | STOP |

912 | \family default |

913 | raises an error signal and issues an error message. |

914 | |

915 | \family typewriter |

916 | STOP |

917 | \family default |

918 | normally also stops further execution of the method and returns control |

919 | to a higher level, though there are interactive tools to force method execution |

920 | to continue. |

921 | |

922 | \family typewriter |

923 | STOP |

924 | \family default |

925 | does not cause ASCEND to exit though: just for the method execution to |

926 | halt and for control to return to the user. |

927 | \end_layout |

928 | |

929 | \begin_layout Subsection |

930 | |

931 | \family typewriter |

932 | METHOD default_self |

933 | \begin_inset LatexCommand \index{default\_self} |

934 | |

935 | \end_inset |

936 | |

937 | |

938 | \end_layout |

939 | |

940 | \begin_layout Standard |

941 | This method should set default values for any variables declared locally |

942 | ( |

943 | \family typewriter |

944 | IS_A |

945 | \family default |

946 | ) to the model. |

947 | If the default value declared for the atom type, of which the variable |

948 | is an instance, is appropriate (and typically it is), then you need not |

949 | set a specific default value here. |

950 | This method also should run |

951 | \family typewriter |

952 | default_self |

953 | \family default |

954 | on all the complex parts that are declared locally (with |

955 | \family typewriter |

956 | IS_A |

957 | \family default |

958 | ) in the model. |

959 | \end_layout |

960 | |

961 | \begin_layout Standard |

962 | This method should not run any methods on model parts that come via |

963 | \family typewriter |

964 | WILL_BE |

965 | \family default |

966 | in the definition's parameter list. |

967 | This method also should not change the values of variables that are passed |

968 | in through the parameter list. |

969 | Sometimes there will be nothing for this method to do. |

970 | Define it anyway, leaving it empty, so that any writer reusing this model |

971 | as part of a higher level model can safely assume it is there and call |

972 | it without having to know the details. |

973 | \end_layout |

974 | |

975 | \begin_layout Standard |

976 | When a top-level simulation is built by the compiler, this method will be |

977 | run (for the top-level model) at the end of compilation. |

978 | If your model's |

979 | \family typewriter |

980 | default_self |

981 | \family default |

982 | method does not call the lower-level |

983 | \family typewriter |

984 | default_self |

985 | \family default |

986 | methods in your model locally-declared ( |

987 | \family typewriter |

988 | IS_A |

989 | \family default |

990 | ) parts, it is quite likely that your model will not solve. |

991 | \end_layout |

992 | |

993 | \begin_layout Subsection |

994 | |

995 | \family typewriter |

996 | METHOD bound_self |

997 | \begin_inset LatexCommand \index{bound\_self} |

998 | |

999 | \end_inset |

1000 | |

1001 | |

1002 | \end_layout |

1003 | |

1004 | \begin_layout Standard |

1005 | Much of the art of nonlinear physical modeling is in bounding the solution. |

1006 | This method should update the bounds on locally defined ( |

1007 | \family typewriter |

1008 | IS_A |

1009 | \family default |

1010 | ) variables and |

1011 | \family typewriter |

1012 | (IS_A) |

1013 | \family default |

1014 | defined model parts. |

1015 | Updating bounds requires some care. |

1016 | For example, the bounds on fractions frequently don't need updating. |

1017 | This method should not bound variables passed into the |

1018 | \family typewriter |

1019 | MODEL |

1020 | \family default |

1021 | definition or parts passed into the definition. |

1022 | \end_layout |

1023 | |

1024 | \begin_layout Standard |

1025 | A common formula for updating bounds is to define a region around the current |

1026 | value of the variable. |

1027 | A linear region size formula, as an example, would be: |

1028 | \end_layout |

1029 | |

1030 | \begin_layout Standard |

1031 | \begin_inset Formula \begin{equation} |

1032 | x_{bound}=x\pm\Delta\cdot x_{nominal}\label{eq:methods.bound-width}\end{equation} |

1033 | |

1034 | \end_inset |

1035 | |

1036 | or, in ASCEND syntax, |

1037 | \end_layout |

1038 | |

1039 | \begin_layout LyX-Code |

1040 | v.upper_bound := v + |

1041 | \begin_inset LatexCommand \index{boundwidth} |

1042 | |

1043 | \end_inset |

1044 | |

1045 | boundwidth * v.nominal; |

1046 | \end_layout |

1047 | |

1048 | \begin_layout LyX-Code |

1049 | v.lower_bound := v - boundwidth * v.nominal; |

1050 | \end_layout |

1051 | |

1052 | \begin_layout Standard |

1053 | Care must be taken that such a formula does not move the bounds (particularly |

1054 | lower bounds) out so far as to allow non-physical solutions. |

1055 | Logarithmic bounding regions are also simple to calculate. |

1056 | Here |

1057 | \family typewriter |

1058 | boundwidth |

1059 | \family default |

1060 | is a |

1061 | \family typewriter |

1062 | bound_width |

1063 | \family default |

1064 | : it could be a real atom (but |

1065 | \series bold |

1066 | not |

1067 | \series default |

1068 | a |

1069 | \family typewriter |

1070 | solver_var |

1071 | \family default |

1072 | ) or some value you can use to determine how much "wiggle-room" you want |

1073 | to give a solver. |

1074 | |

1075 | \end_layout |

1076 | |

1077 | \begin_layout Standard |

1078 | Small powers of 4 and 10 are usually good values of |

1079 | \family typewriter |

1080 | boundwidth |

1081 | \family default |

1082 | . |

1083 | Too small a boundwidth can cut off the portion of number space where the |

1084 | solution is found. |

1085 | Too large a bound width can allow solvers to wander for great distances |

1086 | in uninteresting regions of the number space. |

1087 | \end_layout |

1088 | |

1089 | \begin_layout Standard |

1090 | \begin_inset Note Note |

1091 | status open |

1092 | |

1093 | \begin_layout Standard |

1094 | We need an example here |

1095 | \end_layout |

1096 | |

1097 | \end_inset |

1098 | |

1099 | |

1100 | \end_layout |

1101 | |

1102 | \begin_layout Subsection |

1103 | |

1104 | \family typewriter |

1105 | METHOD scale_self |

1106 | \begin_inset LatexCommand \index{scale\_self} |

1107 | |

1108 | \end_inset |

1109 | |

1110 | |

1111 | \begin_inset LatexCommand \label{ssec:methods.scaleself} |

1112 | |

1113 | \end_inset |

1114 | |

1115 | |

1116 | \end_layout |

1117 | |

1118 | \begin_layout Standard |

1119 | Most nonlinear (and many linear) models cannot be solved without proper |

1120 | scaling of the variables. |

1121 | |

1122 | \family typewriter |

1123 | scale_self |

1124 | \family default |

1125 | should reset the |

1126 | \family typewriter |

1127 | .nominal |

1128 | \family default |

1129 | value on every real variable in need of scaling. |

1130 | It should then call the |

1131 | \family typewriter |

1132 | scale_self |

1133 | \family default |

1134 | method on all the locally-defined ( |

1135 | \family typewriter |

1136 | IS_A |

1137 | \family default |

1138 | ) parts of the MODEL. |

1139 | A proper nominal is one such that you expect at the solution |

1140 | \end_layout |

1141 | |

1142 | \begin_layout Standard |

1143 | \begin_inset Formula \begin{equation} |

1144 | 0\leq abs\left(\frac{x}{x_{nominal}}\right)\leq10\label{eq:methods.choiceNominal}\end{equation} |

1145 | |

1146 | \end_inset |

1147 | |

1148 | |

1149 | \end_layout |

1150 | |

1151 | \begin_layout Standard |

1152 | As one is dividing by the nominal value for the variable to establish its |

1153 | scaled value, zero is about the worst value you could choose for a nominal |

1154 | value. |

1155 | \end_layout |

1156 | |

1157 | \begin_layout Standard |

1158 | This method should not change the |

1159 | \family typewriter |

1160 | .nominal |

1161 | \family default |

1162 | values for models and variables that are received through the parameter |

1163 | list of the model. |

1164 | \end_layout |

1165 | |

1166 | \begin_layout Standard |

1167 | Variables (like fractions), when bounded such that they cannot be too far |

1168 | away from 1.0 in magnitude, probably don't need scaling most of the time, |

1169 | so long as they they are also bounded away from 0.0. |

1170 | |

1171 | \end_layout |

1172 | |

1173 | \begin_layout Standard |

1174 | Some solvers, but not all, will attempt to scale the equations and variables |

1175 | by heuristic matrix-based methods. |

1176 | This works, but inconsistently; user-defined scaling |

1177 | \begin_inset LatexCommand \index{scaling} |

1178 | |

1179 | \end_inset |

1180 | |

1181 | is generally superior. |

1182 | ASCEND makes scaling equations easy to do. |

1183 | You scale the variables, which can only be done well by knowing something |

1184 | about where the solution is going to be found (by being an engineer, for |

1185 | example). |

1186 | Then ASCEND can calculate an appropriate equation-scaling by efficient |

1187 | symbolic methods. |

1188 | \end_layout |

1189 | |

1190 | \begin_layout Section |

1191 | The |

1192 | \family typewriter |

1193 | *_all |

1194 | \family default |

1195 | methods |

1196 | \begin_inset LatexCommand \label{sec:methods.allMethods} |

1197 | |

1198 | \end_inset |

1199 | |

1200 | |

1201 | \end_layout |

1202 | |

1203 | \begin_layout Subsection |

1204 | |

1205 | \family typewriter |

1206 | METHOD default_all |

1207 | \begin_inset LatexCommand \index{default\_all} |

1208 | |

1209 | \end_inset |

1210 | |

1211 | |

1212 | \end_layout |

1213 | |

1214 | \begin_layout Standard |

1215 | Above we discussed the ability in ASCEND to isolate and solve any part of |

1216 | a model that is defined as an instance of a single type requires you initialize |

1217 | the arguments to a model that you are isolating. |

1218 | This method should run the |

1219 | \family typewriter |

1220 | default_all |

1221 | \family default |

1222 | method on each of the parts received through the parameter list via |

1223 | \family typewriter |

1224 | WILL_BE |

1225 | \family default |

1226 | statements and should give appropriate default values to any variables |

1227 | received through the parameter list. |

1228 | After these calls and settings have been done, it should then call its |

1229 | own |

1230 | \family typewriter |

1231 | default_self |

1232 | \family default |

1233 | to take care of all local defaults. |

1234 | \end_layout |

1235 | |

1236 | \begin_layout Subsection |

1237 | |

1238 | \family typewriter |

1239 | METHOD check_all |

1240 | \begin_inset LatexCommand \index{check\_all} |

1241 | |

1242 | \end_inset |

1243 | |

1244 | |

1245 | \end_layout |

1246 | |

1247 | \begin_layout Standard |

1248 | When solving only a part of a simulation, it is necessary to check the models |

1249 | and variables passed into the part as well as the locally defined parts |

1250 | and variables. |

1251 | This method should call |

1252 | \family typewriter |

1253 | check_all |

1254 | \family default |

1255 | on the parts received as |

1256 | \family typewriter |

1257 | WILL_BE |

1258 | \family default |

1259 | parameters, then call |

1260 | \family typewriter |

1261 | check_self |

1262 | \family default |

1263 | to check the locally defined parts and equations. |

1264 | \end_layout |

1265 | |

1266 | \begin_layout Subsection |

1267 | |

1268 | \family typewriter |

1269 | METHOD bound_all |

1270 | \begin_inset LatexCommand \index{bound\_all} |

1271 | |

1272 | \end_inset |

1273 | |

1274 | |

1275 | \end_layout |

1276 | |

1277 | \begin_layout Standard |

1278 | This method should be like |

1279 | \family typewriter |

1280 | bound_self |

1281 | \family default |

1282 | except that it bounds the passed in variables and calls |

1283 | \family typewriter |

1284 | bound_all |

1285 | \family default |

1286 | on the passed in parts. |

1287 | It should then call |

1288 | \family typewriter |

1289 | bound_self |

1290 | \family default |

1291 | . |

1292 | \end_layout |

1293 | |

1294 | \begin_layout Subsection |

1295 | |

1296 | \family typewriter |

1297 | METHOD scale_all |

1298 | \begin_inset LatexCommand \index{scale\_all} |

1299 | |

1300 | \end_inset |

1301 | |

1302 | |

1303 | \end_layout |

1304 | |

1305 | \begin_layout Standard |

1306 | This method should be like |

1307 | \family typewriter |

1308 | scale_self |

1309 | \family default |

1310 | above except that it scales the variables received through the parameter |

1311 | list and calls |

1312 | \family typewriter |

1313 | scale_all |

1314 | \family default |

1315 | on the passed in parts. |

1316 | It should then call |

1317 | \family typewriter |

1318 | scale_self |

1319 | \family default |

1320 | to take care of the local variables and models. |

1321 | \end_layout |

1322 | |

1323 | \begin_layout Section |

1324 | |

1325 | \family typewriter |

1326 | METHOD specify |

1327 | \family default |

1328 | |

1329 | \begin_inset LatexCommand \index{specify} |

1330 | |

1331 | \end_inset |

1332 | |

1333 | |

1334 | \end_layout |

1335 | |

1336 | \begin_layout Standard |

1337 | The method |

1338 | \family typewriter |

1339 | specify |

1340 | \family default |

1341 | sets the |

1342 | \family typewriter |

1343 | .fixed |

1344 | \family default |

1345 | flags so an instance of the model is solvable. |

1346 | There are two issues involved. |

1347 | First, the model must be square - i.e., it must have as many free variables |

1348 | as it has eligible equations available to compute them. |

1349 | Second, it should be a setting of |

1350 | \family typewriter |

1351 | .fixed |

1352 | \family default |

1353 | flags that the modeler knows will solve numerically. |

1354 | This latter requirement requires one to have an intuitive feel for the |

1355 | model. |

1356 | A chemical engineer will |

1357 | \begin_inset Quotes eld |

1358 | \end_inset |

1359 | |

1360 | know |

1361 | \begin_inset Quotes erd |

1362 | \end_inset |

1363 | |

1364 | that a flash calculation, where he has fixed both the pressure and the |

1365 | vapor fraction, is a pretty robust calculation. |

1366 | It would be a good way to set fix flags in the |

1367 | \family typewriter |

1368 | specify |

1369 | \family default |

1370 | method. |

1371 | Getting the |

1372 | \family typewriter |

1373 | .fixed |

1374 | \family default |

1375 | flags set for a large complex model is one of the hardest tasks ever invented |

1376 | by mathematicians if you go about it in the wrong way. |

1377 | If you follow the prescription here, getting the right number of flags |

1378 | set is almost automatic. |

1379 | We have set written the specify methods for a complex hierarchy of models |

1380 | correctly the first time using this approach. |

1381 | \end_layout |

1382 | |

1383 | \begin_layout Standard |

1384 | We shall illustrate this section by examining the set of models in |

1385 | \family typewriter |

1386 | simple_fs.a4c |

1387 | \family default |

1388 | . |

1389 | You should find that model in the model directory for ASCEND and open it |

1390 | in your favorite text editor. |

1391 | This model is for a simple flowsheet comprising a mixer, a reactor, a flash |

1392 | unit and a simple stream splitter. |

1393 | It contains the following models: |

1394 | \family typewriter |

1395 | mixture |

1396 | \family default |

1397 | , |

1398 | \family typewriter |

1399 | molar_stream |

1400 | \family default |

1401 | , |

1402 | \family typewriter |

1403 | mixer |

1404 | \family default |

1405 | , |

1406 | \family typewriter |

1407 | reactor |

1408 | \family default |

1409 | , |

1410 | \family typewriter |

1411 | flash |

1412 | \family default |

1413 | , |

1414 | \family typewriter |

1415 | splitter |

1416 | \family default |

1417 | , |

1418 | \family typewriter |

1419 | flowsheet |

1420 | \family default |

1421 | , |

1422 | \family typewriter |

1423 | controller |

1424 | \family default |

1425 | , |

1426 | \family typewriter |

1427 | test_flowsheet |

1428 | \family default |

1429 | and |

1430 | \family typewriter |

1431 | test_controller |

1432 | \family default |

1433 | . |

1434 | When compiling and solving, one typically creates an instance of |

1435 | \family typewriter |

1436 | test_controller |

1437 | \family default |

1438 | . |

1439 | |

1440 | \end_layout |

1441 | |

1442 | \begin_layout Standard |

1443 | Model mixture only defines new variables |

1444 | \family typewriter |

1445 | y[components] |

1446 | \family default |

1447 | and one equation that says their sum is unity. |

1448 | Model molar_stream introduces new variables |

1449 | \family typewriter |

1450 | Ftot |

1451 | \family default |

1452 | and |

1453 | \family typewriter |

1454 | f[components] |

1455 | \family default |

1456 | . |

1457 | It also introduces an instance of the model mixture, which it calls |

1458 | \family typewriter |

1459 | state |

1460 | \family default |

1461 | . |

1462 | Finally it introduces locally the equations |

1463 | \family typewriter |

1464 | f_def |

1465 | \family default |

1466 | , one for each component. |

1467 | Models |

1468 | \family typewriter |

1469 | mixer |

1470 | \family default |

1471 | , |

1472 | \family typewriter |

1473 | reactor |

1474 | \family default |

1475 | , |

1476 | \family typewriter |

1477 | flash |

1478 | \family default |

1479 | and |

1480 | \family typewriter |

1481 | splitter |

1482 | \family default |

1483 | introduce their own local variables and equations. |

1484 | Each also defines it input and output streams as instances of the model |

1485 | |

1486 | \family typewriter |

1487 | molar_stream |

1488 | \family default |

1489 | . |

1490 | Model |

1491 | \family typewriter |

1492 | flowsheet |

1493 | \family default |

1494 | contains a |

1495 | \family typewriter |

1496 | mixer |

1497 | \family default |

1498 | , |

1499 | \family typewriter |

1500 | reactor |

1501 | \family default |

1502 | , |

1503 | \family typewriter |

1504 | flash |

1505 | \family default |

1506 | and |

1507 | \family typewriter |

1508 | splitter |

1509 | \family default |

1510 | , etc. |

1511 | \end_layout |

1512 | |

1513 | \begin_layout Standard |

1514 | Assume you have just written a set of models, such as those in |

1515 | \family typewriter |

1516 | simple_fs.a4c |

1517 | \family default |

1518 | . |

1519 | In this approach you should start with the lowest level models - i.e., the |

1520 | ones that only introduce (using |

1521 | \family typewriter |

1522 | IS_A |

1523 | \family default |

1524 | statements) new variables and new parts that are instances of types in |

1525 | existing ASCEND libraries. |

1526 | The lowest level model by this definition is |

1527 | \family typewriter |

1528 | mixture |

1529 | \family default |

1530 | . |

1531 | It only introduces new variables and one new equation. |

1532 | Once you have written and debugged a |

1533 | \family typewriter |

1534 | specify |

1535 | \family default |

1536 | method for |

1537 | \family typewriter |

1538 | mixture |

1539 | \family default |

1540 | , then again look for any model that only introduces new variables and local |

1541 | equations and/or parts for which a debugged |

1542 | \family typewriter |

1543 | specify |

1544 | \family default |

1545 | method exists. |

1546 | The model |

1547 | \family typewriter |

1548 | molar_stream |

1549 | \family default |

1550 | is such a model and can be considered next. |

1551 | It introduces a part which is an instance of |

1552 | \family typewriter |

1553 | mixture |

1554 | \family default |

1555 | for which we already have a |

1556 | \family typewriter |

1557 | specify |

1558 | \family default |

1559 | method. |

1560 | Once we have a debugged |

1561 | \family typewriter |

1562 | specify |

1563 | \family default |

1564 | method for |

1565 | \family typewriter |

1566 | molar_stream |

1567 | \family default |

1568 | , then we can consider any of the models |

1569 | \family typewriter |

1570 | mixer |

1571 | \family default |

1572 | , |

1573 | \family typewriter |

1574 | reactor |

1575 | \family default |

1576 | , |

1577 | \family typewriter |

1578 | flash |

1579 | \family default |

1580 | and |

1581 | \family typewriter |

1582 | splitter |

1583 | \family default |

1584 | - they only have parts that are instances of |

1585 | \family typewriter |

1586 | molar_stream |

1587 | \family default |

1588 | . |

1589 | After creating and debugging their |

1590 | \family typewriter |

1591 | specify |

1592 | \family default |

1593 | methods, we can consider the model |

1594 | \family typewriter |

1595 | flowsheet |

1596 | \family default |

1597 | , then |

1598 | \family typewriter |

1599 | controller |

1600 | \family default |

1601 | , then |

1602 | \family typewriter |

1603 | test_flowsheet |

1604 | \family default |

1605 | and finally |

1606 | \family typewriter |

1607 | test_controller |

1608 | \family default |

1609 | . |

1610 | \end_layout |

1611 | |

1612 | \begin_layout Standard |

1613 | The safest way to set |

1614 | \family typewriter |

1615 | .fixed |

1616 | \family default |

1617 | flags is first to clear all the |

1618 | \family typewriter |

1619 | .fixed |

1620 | \family default |

1621 | flags for a model instance by running the method |

1622 | \family typewriter |

1623 | ClearAll |

1624 | \family default |

1625 | . |

1626 | The method |

1627 | \family typewriter |

1628 | specify |

1629 | \family default |

1630 | does |

1631 | \series bold |

1632 | not |

1633 | \series default |

1634 | run |

1635 | \family typewriter |

1636 | ClearAll |

1637 | \family default |

1638 | , but we always write our |

1639 | \family typewriter |

1640 | specify |

1641 | \family default |

1642 | methods assuming |

1643 | \family typewriter |

1644 | ClearAll |

1645 | \family default |

1646 | has just been run and thus that all |

1647 | \family typewriter |

1648 | .fixed |

1649 | \family default |

1650 | flags are set to false. |

1651 | The following steps will aid you to write, almost automatically, a |

1652 | \family typewriter |

1653 | specify |

1654 | \family default |

1655 | method that fixes the correct number of |

1656 | \family typewriter |

1657 | .fixed |

1658 | \family default |

1659 | flags. |

1660 | \end_layout |

1661 | |

1662 | \begin_layout Enumerate |

1663 | Find all locally defined solver variables (of type |

1664 | \family typewriter |

1665 | solver_var |

1666 | \family default |

1667 | - e.g., |

1668 | \family typewriter |

1669 | y[components] |

1670 | \family default |

1671 | are of type |

1672 | \family typewriter |

1673 | fraction |

1674 | \family default |

1675 | which is of type |

1676 | \family typewriter |

1677 | solver_var |

1678 | \family default |

1679 | ). |

1680 | In mixture, the statement |

1681 | \begin_inset Quotes eld |

1682 | \end_inset |

1683 | |

1684 | |

1685 | \family typewriter |

1686 | y[components] IS_A fraction; |

1687 | \family default |

1688 | |

1689 | \begin_inset Quotes erd |

1690 | \end_inset |

1691 | |

1692 | introduces new |

1693 | \family typewriter |

1694 | solver_var |

1695 | \family default |

1696 | s, one for each element in the set |

1697 | \family typewriter |

1698 | components |

1699 | \family default |

1700 | . |

1701 | Let us assume there are |

1702 | \family typewriter |

1703 | nc |

1704 | \family default |

1705 | such elements. |

1706 | \end_layout |

1707 | |

1708 | \begin_layout Enumerate |

1709 | Find locally introduced equations. |

1710 | In |

1711 | \family typewriter |

1712 | mixture |

1713 | \family default |

1714 | , there is one such equation that says the variables |

1715 | \family typewriter |

1716 | y |

1717 | \family default |

1718 | add up to one. |

1719 | \end_layout |

1720 | |

1721 | \begin_layout Enumerate |

1722 | Find all new parts that are instances of previously defined types. |

1723 | In |

1724 | \family typewriter |

1725 | mixture |

1726 | \family default |

1727 | , there are no new parts. |

1728 | \end_layout |

1729 | |

1730 | \begin_layout Enumerate |

1731 | You must set |

1732 | \family typewriter |

1733 | .fixed |

1734 | \family default |

1735 | flags locally equal in number to the number of new locally defined |

1736 | \family typewriter |

1737 | solver_var |

1738 | \family default |

1739 | s minus the number of new locally defined equations. |

1740 | In |

1741 | \family typewriter |

1742 | mixture |

1743 | \family default |

1744 | you must write set one |

1745 | \family typewriter |

1746 | fixed |

1747 | \family default |

1748 | flag to true for all but one of the components as there are |

1749 | \family typewriter |

1750 | nc |

1751 | \family default |

1752 | new locally introduced variables and one new locally introduced equation. |

1753 | The |

1754 | \family typewriter |

1755 | CHOICE |

1756 | \family default |

1757 | function arbitrarily selects one element of the set (in set theory, you |

1758 | cannot identify a set element as being first, another as second, etc, so |

1759 | for purity's sake, we only give you the option of letting ASCEND pick one |

1760 | arbitrarily). |

1761 | Thus we set all |

1762 | \family typewriter |

1763 | nc |

1764 | \family default |

1765 | flags and then clear one. |

1766 | \end_layout |

1767 | |

1768 | \begin_layout Enumerate |

1769 | You must run the |

1770 | \family typewriter |

1771 | specify |

1772 | \family default |

1773 | method for each new part. |

1774 | Here there are none. |

1775 | Running specify will guarantee each part is |

1776 | \begin_inset Quotes eld |

1777 | \end_inset |

1778 | |

1779 | square |

1780 | \begin_inset Quotes erd |

1781 | \end_inset |

1782 | |

1783 | - i.e., after being run, the part will not alter the number of degrees of |

1784 | freedom for the current model definition. |

1785 | However, the same |

1786 | \family typewriter |

1787 | solver_var |

1788 | \family default |

1789 | may get fixed in two or more different parts if those parts share that |

1790 | |

1791 | \family typewriter |

1792 | solver_var |

1793 | \family default |

1794 | , and you will have to discover this sharing and add special statements |

1795 | to correct this type of multiple setting of the same flag. |

1796 | This discovery will best be done by compiling an instance of the type and |

1797 | using the Find By Type tool in the Browser. |

1798 | Its default setting is to find all |

1799 | \family typewriter |

1800 | solver_vars |

1801 | \family default |

1802 | with |

1803 | \family typewriter |

1804 | .fixed |

1805 | \family default |

1806 | equal to |

1807 | \family typewriter |

1808 | TRUE |

1809 | \family default |

1810 | , exactly what you need to aid you with this task. |

1811 | You may also wish to change in minor ways the flag setting that the parts |

1812 | do to suit the needs of the current type definition - you may wish to free |

1813 | |

1814 | \family typewriter |

1815 | temperature |

1816 | \family default |

1817 | and fix |

1818 | \family typewriter |

1819 | pressure |

1820 | \family default |

1821 | for a stream, for example, when the stream is part of a higher level model. |

1822 | \end_layout |

1823 | |

1824 | \begin_layout Standard |

1825 | Look now at the |

1826 | \family typewriter |

1827 | molar_stream |

1828 | \family default |

1829 | model. |

1830 | Running |

1831 | \family typewriter |

1832 | ClearAll |

1833 | \family default |

1834 | for an instance of |

1835 | \family typewriter |

1836 | molar_stream |

1837 | \family default |

1838 | will clear all the |

1839 | \family typewriter |

1840 | .fixed |

1841 | \family default |

1842 | flags for it and all its parts. |

1843 | It introduces |

1844 | \family typewriter |

1845 | Ftot |

1846 | \family default |

1847 | and |

1848 | \family typewriter |

1849 | f[components] |

1850 | \family default |

1851 | as local new solver variables. |

1852 | It also introduces one new equation for each component, one less than the |

1853 | number of new variables. |

1854 | Finally it introduces a new part called |

1855 | \family typewriter |

1856 | state |

1857 | \family default |

1858 | . |

1859 | We have partitioned the |

1860 | \family typewriter |

1861 | specify |

1862 | \family default |

1863 | method into two methods here for |

1864 | \begin_inset Quotes eld |

1865 | \end_inset |

1866 | |

1867 | chemical engineering reasons, |

1868 | \begin_inset Quotes erd |

1869 | \end_inset |

1870 | |

1871 | one of which runs the other. |

1872 | Think of what the two of them accomplish as the |

1873 | \family typewriter |

1874 | specify |

1875 | \family default |

1876 | method we wish to create. |

1877 | First we run the |

1878 | \family typewriter |

1879 | specify |

1880 | \family default |

1881 | method for the new part: |

1882 | \family typewriter |

1883 | state |

1884 | \family default |

1885 | . |

1886 | That will set the |

1887 | \family typewriter |

1888 | .fixed |

1889 | \family default |

1890 | flags for |

1891 | \family typewriter |

1892 | nc-1 |

1893 | \family default |

1894 | of the variables |

1895 | \family typewriter |

1896 | state.y[components] |

1897 | \family default |

1898 | . |

1899 | Then, as there is one more variable than equation in this model, we must |

1900 | set a net of one added |

1901 | \family typewriter |

1902 | .fixed |

1903 | \family default |

1904 | flag. |

1905 | We accomplish this by first clearing all the flags for the variables |

1906 | \family typewriter |

1907 | state.y[components] |

1908 | \family default |

1909 | -- one of which was already clear -- and then fixing all the variables |

1910 | |

1911 | \family typewriter |

1912 | f[components] |

1913 | \family default |

1914 | . |

1915 | We cleared |

1916 | \family typewriter |

1917 | nc-1 |

1918 | \family default |

1919 | flags and set |

1920 | \family typewriter |

1921 | nc |

1922 | \family default |

1923 | for a net of one new flag being set. |

1924 | For our |

1925 | \family typewriter |

1926 | molar_stream |

1927 | \family default |

1928 | model, we would prefer that the variables |

1929 | \family typewriter |

1930 | f[components] |

1931 | \family default |

1932 | are the ones we fix. |

1933 | \end_layout |

1934 | |

1935 | \begin_layout Standard |

1936 | Lastly, look at the |

1937 | \family typewriter |

1938 | reactor |

1939 | \family default |

1940 | model. |

1941 | We introduce |

1942 | \family typewriter |

1943 | nc+1 |

1944 | \family default |

1945 | new variables: |

1946 | \family typewriter |

1947 | stoich_coef[feed.components] |

1948 | \family default |

1949 | and |

1950 | \family typewriter |

1951 | turnover |

1952 | \family default |

1953 | . |

1954 | We also introduce |

1955 | \family typewriter |

1956 | nc |

1957 | \family default |

1958 | new equations. |

1959 | Lastly we introduce two parts |

1960 | \family typewriter |

1961 | feed |

1962 | \family default |

1963 | and |

1964 | \family typewriter |

1965 | out |

1966 | \family default |

1967 | , which are |

1968 | \family typewriter |

1969 | molar_stream |

1970 | \family default |

1971 | s. |

1972 | The |

1973 | \family typewriter |

1974 | specify |

1975 | \family default |

1976 | method, again a combination of |

1977 | \family typewriter |

1978 | specify |

1979 | \family default |

1980 | and |

1981 | \family typewriter |

1982 | seqmod |

1983 | \family default |

1984 | , must set a net of one new |

1985 | \family typewriter |

1986 | .fixed |

1987 | \family default |

1988 | flag. |

1989 | The way it does it is |

1990 | \begin_inset Quotes eld |

1991 | \end_inset |

1992 | |

1993 | tricky |

1994 | \begin_inset Quotes erd |

1995 | \end_inset |

1996 | |

1997 | but not difficult to follow. |

1998 | In |

1999 | \family typewriter |

2000 | seqmod |

2001 | \family default |

2002 | , we fix |

2003 | \family typewriter |

2004 | turnover |

2005 | \family default |

2006 | and all |

2007 | \family typewriter |

2008 | nc |

2009 | \family default |

2010 | of the variables |

2011 | \family typewriter |

2012 | stoich_coef |

2013 | \family default |

2014 | . |

2015 | We seem to have fixed |

2016 | \family typewriter |

2017 | nc |

2018 | \family default |

2019 | too many. |

2020 | In |

2021 | \family typewriter |

2022 | specify |

2023 | \family default |

2024 | , which first runs |

2025 | \family typewriter |

2026 | seqmod |

2027 | \family default |

2028 | , we only run the |

2029 | \family typewriter |

2030 | specify |

2031 | \family default |

2032 | method for |

2033 | \family typewriter |

2034 | feed |

2035 | \family default |

2036 | and |

2037 | \series bold |

2038 | not |

2039 | \series default |

2040 | the |

2041 | \family typewriter |

2042 | specify |

2043 | \family default |

2044 | method for |

2045 | \family typewriter |

2046 | out |

2047 | \family default |

2048 | . |

2049 | We know that not running the |

2050 | \family typewriter |

2051 | specify |

2052 | \family default |

2053 | method for |

2054 | \family typewriter |

2055 | out |

2056 | \family default |

2057 | , a |

2058 | \family typewriter |

2059 | molar_stream |

2060 | \family default |

2061 | as we just discussed above, will leave us with |

2062 | \family typewriter |

2063 | nc |

2064 | \family default |

2065 | |

2066 | \family typewriter |

2067 | .fixed |

2068 | \family default |

2069 | flags not set. |

2070 | So we deviously traded these flags for those belonging to |

2071 | \family typewriter |

2072 | stoich_coef |

2073 | \family default |

2074 | , giving us a net of fixing one flag. |

2075 | If we had abided by all the steps above, we would have run the |

2076 | \family typewriter |

2077 | specify |

2078 | \family default |

2079 | method for |

2080 | \family typewriter |

2081 | out |

2082 | \family default |

2083 | , then gone in and cleared the flags for |

2084 | \family typewriter |

2085 | out.f[components] |

2086 | \family default |

2087 | while setting those for |

2088 | \family typewriter |

2089 | stoich_coef[components] |

2090 | \family default |

2091 | in trade to get the flags we want set for this model. |

2092 | We did the equivalent with a shortcut. |

2093 | \end_layout |

2094 | |

2095 | \begin_layout Standard |

2096 | If a model is parametric, the models defined by |

2097 | \family typewriter |

2098 | WILL_BE |

2099 | \family default |

2100 | in the parameter list should be viewed as new variables defined in the |

2101 | model. |

2102 | Remember |

2103 | \family typewriter |

2104 | specify |

2105 | \family default |

2106 | must fix sufficient variables to make an instance of this model square. |

2107 | \end_layout |

2108 | |

2109 | \begin_layout Standard |

2110 | At each of the above steps, pay special attention to indexed variables used |

2111 | in |

2112 | \emph on |

2113 | indexed |

2114 | \emph default |

2115 | equations |

2116 | \begin_inset Note Note |

2117 | status collapsed |

2118 | |

2119 | \begin_layout Standard |

2120 | need a cross reference here to the appropriate part of the manual |

2121 | \end_layout |

2122 | |

2123 | \end_inset |

2124 | |

2125 | . |

2126 | Frequently you must fix or free |

2127 | \family typewriter |

2128 | n |

2129 | \family default |

2130 | or |

2131 | \family typewriter |

2132 | n-1 |

2133 | \family default |

2134 | variables indexed over a set of size |

2135 | \family typewriter |

2136 | n |

2137 | \family default |

2138 | , if there are |

2139 | \family typewriter |

2140 | n |

2141 | \family default |

2142 | matching equations. |

2143 | In general, if you think you have |

2144 | \family typewriter |

2145 | specify |

2146 | \family default |

2147 | correctly written, change the sizes of all the sets in your MODEL by one |

2148 | and then by two members. |

2149 | If your |

2150 | \family typewriter |

2151 | specify |

2152 | \family default |

2153 | method still works, you are probably using sets correctly. |

2154 | Pursuing 'symmetry', i.e. |

2155 | the identical treatment of all variables defined in a single array, usually |

2156 | helps you write |

2157 | \family typewriter |

2158 | specify |

2159 | \family default |

2160 | correctly. |

2161 | \end_layout |

2162 | |

2163 | \begin_layout Standard |

2164 | When writing models that combine parts which do not share very well, or |

2165 | which both try to compute the same variable in different ways, it may even |

2166 | be necessary to write a |

2167 | \family typewriter |

2168 | WHEN |

2169 | \family default |

2170 | statement to selectively 'turn off' the conflicting equations or model |

2171 | fragments. |

2172 | An object or equation |

2173 | \family typewriter |

2174 | USE |

2175 | \family default |

2176 | d in any |

2177 | \family typewriter |

2178 | WHEN |

2179 | \family default |

2180 | statement is turned off by default and becomes a part of the solved |

2181 | \family typewriter |

2182 | MODEL |

2183 | \family default |

2184 | only when the condition of some |

2185 | \family typewriter |

2186 | CASE |

2187 | \family default |

2188 | that |

2189 | \family typewriter |

2190 | USE |

2191 | \family default |

2192 | s that object is matched. |

2193 | \end_layout |

2194 | |

2195 | \begin_layout Standard |

2196 | The setting of boolean, integer, and symbol variables that are controlling |

2197 | conditions of |

2198 | \family typewriter |

2199 | WHEN |

2200 | \family default |

2201 | and |

2202 | \family typewriter |

2203 | SWITCH |

2204 | \family default |

2205 | statements should be done in the |

2206 | \family typewriter |

2207 | specify |

2208 | \family default |

2209 | method. |

2210 | \end_layout |

2211 | |

2212 | \begin_layout Standard |

2213 | There is no 'one perfect' |

2214 | \family typewriter |

2215 | specify |

2216 | \family default |

2217 | method for all purposes. |

2218 | This routine should merely define a reasonably useful base configuration |

2219 | of the model. |

2220 | Other |

2221 | \family typewriter |

2222 | specify_whatElseYouWant |

2223 | \family default |

2224 | methods can also be written. |

2225 | \end_layout |

2226 | |

2227 | \begin_layout Section |

2228 | |

2229 | \family typewriter |

2230 | METHOD values |

2231 | \begin_inset LatexCommand \index{values} |

2232 | |

2233 | \end_inset |

2234 | |

2235 | |

2236 | \end_layout |

2237 | |

2238 | \begin_layout Standard |

2239 | In a final application |

2240 | \family typewriter |

2241 | MODEL |

2242 | \family default |

2243 | , you should record at least one set of input values (values of the fixed |

2244 | variables and guesses of key solved-for variables) that leads to a good |

2245 | solution. |

2246 | This facilitates testing of the model, and helps the next person using |

2247 | your model to be assured that it works as expected. |

2248 | \end_layout |

2249 | |

2250 | \begin_layout Section |

2251 | Summary |

2252 | \end_layout |

2253 | |

2254 | \begin_layout Standard |

2255 | \begin_inset Marginal |

2256 | status collapsed |

2257 | |

2258 | \begin_layout Standard |

2259 | adding our standard methods to a model definition |

2260 | \end_layout |

2261 | |

2262 | \end_inset |

2263 | |

2264 | We have defined a set of standard methods for ASCEND models which we insist |

2265 | a modeler provide before we will allow a model to be placed in any of our |

2266 | model libraries. |

2267 | These are listed in Table |

2268 | \begin_inset LatexCommand \ref{tab:methods.stdMethodReqd} |

2269 | |

2270 | \end_inset |

2271 | |

2272 | |

2273 | \noun off |

2274 | . |

2275 | As should be evident from above, not all models must have associated methods; |

2276 | our first vessel model did not. |

2277 | It is simply our policy that models in our libraries must have these methods |

2278 | to promote model reuse and to serve as examples of best practices in mathematic |

2279 | al modeling. |

2280 | \end_layout |

2281 | |

2282 | \begin_layout Standard |

2283 | \begin_inset Float table |

2284 | wide false |

2285 | sideways false |

2286 | status open |

2287 | |

2288 | \begin_layout Caption |

2289 | \begin_inset LatexCommand \label{tab:methods.stdMethodReqd} |

2290 | |

2291 | \end_inset |

2292 | |

2293 | Standard methods required for types in our ASCEND model library |

2294 | \end_layout |

2295 | |

2296 | \begin_layout Standard |

2297 | \begin_inset Tabular |

2298 | <lyxtabular version="3" rows="8" columns="2"> |

2299 | <features islongtable="true"> |

2300 | <column alignment="center" valignment="top" leftline="true" width="0"> |

2301 | <column alignment="center" valignment="top" leftline="true" rightline="true" width="4in"> |

2302 | <row topline="true" bottomline="true"> |

2303 | <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |

2304 | \begin_inset Text |

2305 | |

2306 | \begin_layout Standard |

2307 | method |

2308 | \end_layout |

2309 | |

2310 | \end_inset |

2311 | </cell> |

2312 | <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |

2313 | \begin_inset Text |

2314 | |

2315 | \begin_layout Standard |

2316 | description |

2317 | \end_layout |

2318 | |

2319 | \end_inset |

2320 | </cell> |

2321 | </row> |

2322 | <row topline="true"> |

2323 | <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |

2324 | \begin_inset Text |

2325 | |

2326 | \begin_layout Standard |

2327 | |

2328 | \family typewriter |

2329 | default_self |

2330 | \end_layout |

2331 | |

2332 | \end_inset |

2333 | </cell> |

2334 | <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |

2335 | \begin_inset Text |

2336 | |

2337 | \begin_layout Standard |

2338 | a method called automatically when any simulation is compiled to provide |

2339 | default values and adjust bounds for any locally created variables which |

2340 | may have unsuitable defaultsin their ATOM definitions. |

2341 | Usually the variables selected are those for which the model becomes ill-behave |

2342 | d if given poor initial guesses or bounds (e.g., zero). |

2343 | This method should include statements to run the default_self method for |

2344 | each of its locally created (IS_A'd) parts. |

2345 | This method should be written first. |

2346 | \end_layout |

2347 | |

2348 | \end_inset |

2349 | </cell> |

2350 | </row> |

2351 | <row topline="true"> |

2352 | <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |

2353 | \begin_inset Text |

2354 | |

2355 | \begin_layout Standard |

2356 | |

2357 | \family typewriter |

2358 | ClearAll |

2359 | \end_layout |

2360 | |

2361 | \end_inset |

2362 | </cell> |

2363 | <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |

2364 | \begin_inset Text |

2365 | |

2366 | \begin_layout Standard |

2367 | a method to set all the fixed flags for variables in the type to FALSE. |

2368 | This puts these flags into a known standard state -- i.e., all are FALSE. |

2369 | All models inherit this method from the base model and the need to rewrite |

2370 | it is very, very rare. |

2371 | |

2372 | \end_layout |

2373 | |

2374 | \end_inset |

2375 | </cell> |

2376 | </row> |

2377 | <row topline="true"> |

2378 | <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |

2379 | \begin_inset Text |

2380 | |

2381 | \begin_layout Standard |

2382 | |

2383 | \family typewriter |

2384 | specify |

2385 | \end_layout |

2386 | |

2387 | \end_inset |

2388 | </cell> |

2389 | |

2390 | \begin_inset Text |

2391 | |

2392 | \begin_layout Standard |

2393 | a method which assumes all the |

2394 | \family typewriter |

2395 | fixed |

2396 | \family default |

2397 | flags are currently |

2398 | \family typewriter |

2399 | FALSE |

2400 | \family default |

2401 | and which then sets a suitable set of fixed flags to |

2402 | \family typewriter |

2403 | TRUE |

2404 | \family default |

2405 | to make an instance of this type of model well-posed. |

2406 | A well-posed model is one that is square ( |

2407 | \begin_inset Formula $n$ |

2408 | \end_inset |

2409 | |

2410 | equations in |

2411 | \begin_inset Formula $n$ |

2412 | \end_inset |

2413 | |

2414 | unknowns) and solvable. |

2415 | |

2416 | \end_layout |

2417 | |

2418 | \end_inset |

2419 | </cell> |

2420 | </row> |

2421 | <row topline="true"> |

2422 | <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |

2423 | \begin_inset Text |

2424 | |

2425 | \begin_layout Standard |

2426 | |

2427 | \family typewriter |

2428 | reset |

2429 | \end_layout |

2430 | |

2431 | \end_inset |

2432 | </cell> |

2433 | |

2434 | \begin_inset Text |

2435 | |

2436 | \begin_layout Standard |

2437 | a method which first runs the |

2438 | \family typewriter |

2439 | ClearAll |

2440 | \family default |

2441 | method and then the |

2442 | \family typewriter |

2443 | specify |

2444 | \family default |

2445 | method. |

2446 | We include this method because it is very convenient. |

2447 | We only have to run one method to make any simulation well-posed, no matter |

2448 | how its fixed flags are currently set. |

2449 | All models inherit this method from the base model, as with |

2450 | \family typewriter |

2451 | ClearAll |

2452 | \family default |

2453 | . |

2454 | |

2455 | \end_layout |

2456 | |

2457 | \end_inset |

2458 | </cell> |

2459 | </row> |

2460 | <row topline="true"> |

2461 | <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |

2462 | \begin_inset Text |

2463 | |

2464 | \begin_layout Standard |

2465 | |

2466 | \family typewriter |

2467 | values |

2468 | \end_layout |

2469 | |

2470 | \end_inset |

2471 | </cell> |

2472 | |

2473 | \begin_inset Text |

2474 | |

2475 | \begin_layout Standard |

2476 | a method to establish typical values for the variables we have fixed in |

2477 | an application or test model. |

2478 | We may also supply values for some of the variables we will be computing |

2479 | to aid in solving a model instance of this type. |

2480 | These values are ones that we have tested for simulation of this type and |

2481 | found good. |

2482 | |

2483 | \end_layout |

2484 | |

2485 | \end_inset |

2486 | </cell> |

2487 | </row> |

2488 | <row topline="true"> |

2489 | <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |

2490 | \begin_inset Text |

2491 | |

2492 | \begin_layout Standard |

2493 | |

2494 | \family typewriter |

2495 | bound_self |

2496 | \end_layout |

2497 | |

2498 | \end_inset |

2499 | </cell> |

2500 | |

2501 | \begin_inset Text |

2502 | |

2503 | \begin_layout Standard |

2504 | a method to update the |

2505 | \family typewriter |

2506 | .upper_bound |

2507 | \family default |

2508 | and |

2509 | \family typewriter |

2510 | .lower_bound |

2511 | \family default |

2512 | value for each of the variables. |

2513 | ASCEND solvers use these bound values to help solve the model equations. |

2514 | This method should bound locally created variables and then call |

2515 | \family typewriter |

2516 | bound_self |

2517 | \family default |

2518 | for every locally created ( |

2519 | \family typewriter |

2520 | IS_A |

2521 | \family default |

2522 | 'd) part. |

2523 | |

2524 | \end_layout |

2525 | |

2526 | \end_inset |

2527 | </cell> |

2528 | </row> |

2529 | <row topline="true" bottomline="true"> |

2530 | <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |

2531 | \begin_inset Text |

2532 | |

2533 | \begin_layout Standard |

2534 | |

2535 | \family typewriter |

2536 | scale_self |

2537 | \end_layout |

2538 | |

2539 | \end_inset |

2540 | </cell> |

2541 | |

2542 | \begin_inset Text |

2543 | |

2544 | \begin_layout Standard |

2545 | a method to update the |

2546 | \family typewriter |

2547 | .nominal |

2548 | \family default |

2549 | value for each of the variables. |

2550 | ASCEND solvers will use these nominal values to rescale the variable to |

2551 | have a value of about one in magnitude to help solve the model equations. |

2552 | This method should re-scale locally created variables and then call |

2553 | \family typewriter |

2554 | scale_self |

2555 | \family default |

2556 | for every locally created ( |

2557 | \family typewriter |

2558 | IS_A |

2559 | \family default |

2560 | 'd) part. |

2561 | |

2562 | \end_layout |

2563 | |

2564 | \end_inset |

2565 | </cell> |

2566 | </row> |

2567 | </lyxtabular> |

2568 | |

2569 | \end_inset |

2570 | |

2571 | |

2572 | \end_layout |

2573 | |

2574 | \end_inset |

2575 | |

2576 | |

2577 | \end_layout |

2578 | |

2579 | \begin_layout Section |

2580 | Method writing automation |

2581 | \begin_inset LatexCommand \label{sec:methods.automation} |

2582 | |

2583 | \end_inset |

2584 | |

2585 | |

2586 | \end_layout |

2587 | |

2588 | \begin_layout Standard |

2589 | \begin_inset Marginal |

2590 | status collapsed |

2591 | |

2592 | \begin_layout Standard |

2593 | Hit the button Library/Edit/Suggest methods and tweak the results |

2594 | \end_layout |

2595 | |

2596 | \end_inset |

2597 | |

2598 | ASCEND will help you write the standard methods. |

2599 | Writing most of the standard methods can be nearly automated once the declarati |

2600 | ve portion of the model definition is written. |

2601 | Usually, however, some minor tweaking of the automatically generated code |

2602 | is needed. |

2603 | In the Library window, the Edit menu has a "Suggest methods" button. |

2604 | Select a model you have written and read into the library, then hit this |

2605 | button. |

2606 | |

2607 | \end_layout |

2608 | |

2609 | \begin_layout Standard |

2610 | In the Display window will appear a good starting point for the standard |

2611 | methods that you have not yet defined. |

2612 | This starting point follows the guidelines in this chapter. |

2613 | It saves you a lot of typing but it is a starting point only. |

2614 | Select and copy the text into the model you are editing, then tailor it |

2615 | to your needs and finish the missing bits. |

2616 | The comments in the generated code can be deleted before or after you copy |

2617 | the text to your model file. |

2618 | \end_layout |

2619 | |

2620 | \begin_layout Standard |

2621 | If you have suggestions for general improvements to the generated method |

2622 | code, please mail them to us and include a sample of what the generated |

2623 | code ought to look like before the user performs any hand-editing. |

2624 | We aim to create easily understood and easily fixed method suggestions, |

2625 | not perfect suggestions, because procedural code style tastes vary so widely. |

2626 | \end_layout |

2627 | |

2628 | \begin_layout Standard |

2629 | \begin_inset Note Note |

2630 | status open |

2631 | |

2632 | \begin_layout Standard |

2633 | Closing the chapter you find below the suggested methods ASCEND generates |

2634 | for the ***vessel*** model. |

2635 | \end_layout |

2636 | |

2637 | \end_inset |

2638 | |

2639 | |

2640 | \end_layout |

2641 | |

2642 | \end_body |

2643 | \end_document |

john.pye@anu.edu.au | ViewVC Help |

Powered by ViewVC 1.1.22 |