summaryrefslogtreecommitdiffstats
path: root/sources/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sources/main.cpp')
-rw-r--r--sources/main.cpp387
1 files changed, 387 insertions, 0 deletions
diff --git a/sources/main.cpp b/sources/main.cpp
new file mode 100644
index 0000000..2d52703
--- /dev/null
+++ b/sources/main.cpp
@@ -0,0 +1,387 @@
+//-*- mode: c++; indent-tabs-mode: t; coding: utf-8; show-trailing-whitespace: t -*-
+
+// file main.cpp
+
+#include "main.hpp"
+
+//**********************************************************************
+// *
+// --------------- Electromagnetic Transients Program ------------ *
+// methods development branch, route eogb *
+// division of system engineering *
+// Bonneville Power Administration *
+// P. O. Box 3621 *
+// Portland, Oregon 97208 *
+// U.S.A. phone: (503) 230-4404 *
+// *
+// The fortran comment-card text now being read represents a *
+// summary introduction and explanation which applies to a very *
+// large program development referred to by the title of *
+// 'electromagnetic transients program' (abbreviated 'EMTP' , *
+// or 't.p.' in the older notation). *
+// *
+// In general terms, the purpose of this work is to simulate *
+// transient phenomena in power system networks, taking into *
+// account traveling waves (electromagnetic transients) on *
+// transmission lines, saturation of transformers, nonlinearities *
+// of surge arresters, etc. While not so restricted in theory, *
+// the most common program application is for the simulation of *
+// switching surges which propagate on power network transmission *
+// lines. for a more detailed explantion of the modeling *
+// techniques which are used, the reader is referred to the *
+// manual for this program (840 pages for the version dated *
+// march, 1983). ). while older issues were titled *
+// "EMTP user's manual", beginning in september of 1980 *
+// this work is now called the "EMTP rule book" . *
+// *
+// The utpf is a large 80-column bcd card-image file, to be used *
+// as input to e/t programs. E/t programs machine translate this *
+// utpf code into legal fortran for most computer systems of *
+// interest (ibm, cdc, univac, honeywell, dec pdp-10, dec vax-11, *
+// prime, sel, apollo, hitachi, facom, harris, etc.). *
+// *
+// In conformity with long-standing bpa policy, as well as the *
+// more recent (february 19, 1975) federal freedom of information *
+// act, dissemination of these program materials is freely made *
+// to any and all interested parties. a fee to cover reproduction,*
+// handling, and mailing costs may be assessed against the *
+// organization receiving the material, however. No claim or *
+// warranty as to the usefulness, accuracy, fidelity, or *
+// completeness of these materials is (or ever has been) in any *
+// way expressed or implied. *
+// *
+//**********************************************************************
+//
+// The present module main00 is always in memory. It is the
+// highest level module of a program which has two levels of
+// overlaying. It calls primary level overlays only (directly),
+// based on the value of variable 'nchain' . The following
+// legitimate values, and the meaning of the associated overlay
+// calls, exist .....
+// 1-20. For overlays 1, 2, ..., 20, which are secondary-level
+// overlays, a call must be first made to the controlling
+// primary-level overlay. Thus for such 'nchain' values,
+// control is transfered first to module main10 . This
+// is the only case where calls to overlays are not made
+// directly.
+//
+// 29. Completion of statistics (Monte Carlo) study, where variable
+// maxima of the different case solutions are read off the
+// disk, and are processed statistically to produce
+// cumulative distribution functions, etc.
+//
+// 31. Plot routine, for graphical output of transients.
+// The program also terminates execution here, usually,
+// after writing an end-of-information mark on the
+// plot tape (whether or not the user has plotted anything).
+//
+// 39. Supporting routine which generates EMTP branch
+// cards for the frequency-dependent representation of
+// an untransposed transmission line. this is the
+// "marti setup" code, named after dr. jose marti of
+// vancouver and caracas (see 1981 ieee pica paper).
+//
+// 41. Supporting routine which calculates transformer matrices (R)
+// and (L) from short-circuit and open-circuit data.
+//
+// 42. Supporting routine which converts an rms voltage vs. current
+// saturation characteristic into an instantaneous flux vs.
+// current characteristic.
+//
+// 43. Supporting routine which calculates weighting functions
+// a1(t) and a2(2) for the zero-sequence mode of a
+// distributed line which has frequency-dependent line
+// constants r and l .
+//
+// 44. Supporting routine which calculates line constants for
+// overhead transmission lines by means of carson's formula.
+// this is a modified version of what was originally (until
+// january 1975) the completely-separate bpa line-constants
+// program.
+//
+// 45. Supporting routine of 'Semlyen setup' code. the output
+// is a group of punched cards, as are required for the EMTP
+// simulation of a transmission circuit using semlyen
+// recursive convolution modeling.
+//
+// 47. Supporting routine of 'cable constants' code. the
+// primary function is to calculate (r), (l), % (c)
+// matrices for a multi-phase system of single-core coaxial
+// cables.
+//
+// 51. Printing of introductory paragraph of error-message
+// termination ('you lose, fella, ... '), plus error-message
+// texts for 'kill' codes numbered 1 through 50 .
+// the exiting linkage is to the last error overlay.
+//
+// 52. Error message texts for 'kill' codes numbered 51
+// the exiting linkage is to the last error overlay.
+//
+// 53. Error message texts for 'kill' codes numbered 91
+// through 150. the exiting linkage is to the last
+// error overlay.
+//
+// 54. Error message texts for 'kill' codes numbered 151
+// through 200. the exiting linkage is to the
+// last error overlay.
+//
+// 55. Final error overlay. Messages for kill = 201
+// onward are contained, as well as summary statistics
+// --- table sizes and timing figures for the run.
+// The exiting linkage is generally to module over1 (to read
+// a new data case), but may be to module over31 (for final
+// case termination).
+//**********************************************************************
+
+int main(int argc, char *argv[])
+{
+ char c;
+ char optopt;
+ int n1;
+ long int nReturnValue = EXIT_FAILURE;
+ static struct option long_options[] = {
+ { "dimensioning-file", optional_argument, nullptr, 'd' },
+ { "case-file", optional_argument, nullptr, 'f' },
+ { "help", optional_argument, nullptr, 'h' },
+ { "output-file", optional_argument, nullptr, 'o' },
+ { "verbose", optional_argument, nullptr, 'v' },
+ { "version", optional_argument, nullptr, 'V' },
+ { nullptr, 0, nullptr, 0 }
+ };
+ struct winsize sWindow;
+ //
+ auto a2010 = [&](void)
+ {
+ if(blkcom::nM4Plot == 1)
+ ;//emtspy();
+ switch(blkcom::nChain) {
+ case 29:
+#ifdef WITH_OVER29
+ over29();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 31:
+#ifdef WITH_OVER31
+ over31();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 39:
+#ifdef WITH_OVER39
+ over39();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 41:
+#ifdef WITH_OVER41
+ over41();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 42:
+#ifdef WITH_OVER42
+ over42();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 44:
+#ifdef WITH_OVER44
+ over44();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 45:
+#ifdef WITH_OVER45
+ over45();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 47:
+#ifdef WITH_OVER47
+ over47();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 51:
+#ifdef WITH_OVER51
+ over51::over51();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 52:
+#ifdef WITH_OVER52
+ over52();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 53:
+#ifdef WITH_OVER53
+ over53();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 54:
+#ifdef WITH_OVER54
+ over54();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ case 55:
+#ifdef WITH_OVER55
+ over55();
+#else
+ emtp::dummy();
+#endif
+ break;
+
+ default:
+ (*reinterpret_cast<std::ostream *> (blkcom::pLFiles[ 5 ])) << std::endl << " Illegal NCHAIN in MAIN00." << blkcom::nChain << std::endl << std::flush;
+ break;
+ }
+ };
+ auto a2001 = [&](void)
+ {
+ //
+ n1 = blkcom::nChain;
+ if(n1 > 30)
+ n1 -= 30;
+ if(n1 <= 0)
+ n1 = 1;
+ if(blkcom::nIprsUp == 0)
+ blkcom::nIprsUp = blkcom::pIprsOV[ n1 - 1 ];
+ if(blkcom::nChain > 20)
+ a2010();
+ else {
+ if((blkcom::nChain == 12) || (blkcom::nChain == 2))
+ emtp::main10();
+ else {
+ if(blkcom::nChain == -1)
+ ;//movecopy::move0(&blkcom::pIprsOv[ 0 ], nLL34);
+ emtp::vardim(emtp::sSizesFileName, blkcom::sLStat);
+ emtp::erexit();
+ blkcom::nChain = 0;
+ if (blkcom::nChain <= 20)
+ emtp::main10();
+ }
+ }
+ };
+ //
+ opterr = 0;
+ optind = 0;
+ blkcom::nLLBuff = -3333;
+ blkcom::nChain = -1;
+ blkcom::nLastOV = 0;
+ blkcom::nKill = 0;
+ blkcom::pLFiles[ 0 ] = reinterpret_cast<void *>(&std::cerr);
+ blkcom::pLFiles[ 4 ] = reinterpret_cast<void *>(&std::cin);
+ blkcom::pLFiles[ 5 ] = reinterpret_cast<void *>(&std::cout);
+ sWindow = utilities::getTerminalSize();
+ if(sWindow.ws_col >= 132)
+ blkcom::nKol132 = 132;
+ else if(sWindow.ws_col >= 80)
+ blkcom::nKol132 = 80;
+ else
+ blkcom::nKol132 = sWindow.ws_col;
+ while((c = getopt_long(argc, argv, "d:f:ho:vV", long_options, &optind)) != -1) {
+ switch(c) {
+ case 0:
+ // If this option set a flag, do nothing else now.
+ if(long_options[ optind ].flag != 0)
+ break;
+ std::cout << "Option " << long_options[ optind ].name;
+ if(optarg)
+ std::cout << " with arg " << optarg;
+ std::cout << std::endl;
+ break;
+
+ case 'd':
+ {
+ std::stringstream sTemp(optarg);
+ if(sTemp.str().empty()) {
+ blkcom::nChain = 51;
+ blkcom::nKill = 100;
+ emtp::sSizesFileName = "";
+ } else {
+ emtp::sSizesFileName = sTemp.str();
+ }
+ }
+ break;
+
+ case 'f':
+ // To do.
+ break;
+
+ case 'h':
+ std::cout << "Usage: gemtp++ [-d|--dimensioning-file dimfile] [-f|--case-file infile] [-h|--help] [-o|--output-file outfile] [-v|--verbose] [-V|--Version] [< infile]" << std::endl;
+ emtp::stoptp();
+ exit(EXIT_SUCCESS);
+ break;
+
+ case 'o':
+ // To do.
+ break;
+
+ case 'v':
+ ++blkcom::nIprsUp;
+ break;
+
+ case 'V':
+ // To do.
+ break;
+ }
+ }
+ FOREVER {
+ switch(blkcom::nKill) {
+ case 0:
+ case 9999:
+ a2001();
+ break;
+
+ case 7733:
+ (*reinterpret_cast<std::ostream *>(blkcom::pLFiles[ 5 ])) << " \"main\" intercept of \"begin\" request." << std::endl << std::flush;
+ blkcom::nKill = 0;
+ blkcom::nNumDCD = 0;
+ blkcom::nChain = 1;
+ emtp::main10();
+ break;
+
+ default:
+ if(blkcom::nChain > 51)
+ a2001();
+ else {
+ blkcom::nChain = 51;
+ a2001();
+ }
+ break;
+ }
+ }
+ ;;
+ return nReturnValue;
+}
+
+// end of file main.cpp