//-*- mode: c++; indent-tabs-mode: t; coding: utf-8; show-trailing-whitespace: t -*- // file emtp.cpp #include "emtp.hpp" // The EMTP solution process proper consists of numerous secondary- // level overlays, each called from module main10 using // module number 'nchain' as the indicator of where control is to // pass next. The following is a tabulation of valid 'nchain' // values, along with the function of the corresponding code. With // the possible exception of the time-step loop, 'nchain' is the // utpf overlay number of the code to which control is to be // transfered next. The overlay number of the time-step loop // is given by 'nchain' corresponding to the first quarter of // the time-step-loop segmentation, on machines not using ecs // overlaying. // // 1. Input of miscellaneous data cards. // 2. Input branch data. // 3. Code associated with the cascading of pi-circuits for // steady-state phasor solutions only. // 4. Input and processing of frequency-dependence data for // distributed-parameter line mode. // 5. Input of switch and source data cards. // 6. Network connectivity output. Setup of transient-network // renumbering tables. // 7. Network node renumbering routine (John Walker's old // subroutine number). // 8. Convert tables to new node numbers. Find steady-state // phasor equivalents for distributed branches. // 9. Set up steady-state phasor network renumbering tables. // 10. Form the steady-state admittance matrix (y). Solve for // steady-state phasor voltages. // 11. Output steady-state phasor solution (if requested). // 12. Branch-table and switch-table processing, as preparation // for the integration in time-step loop. // 13. Setup initial conditions on lumped elements, and past // history for distributed lines. // 14. Form (Y) for the transients network. Triangularize the // first partition (nonswitch/source nodes). // 15. Final setup operations before time-step loop. // 16. First quarter of time-step loop (checking for changes of // switches and pseudo-nonlinear elements, retriangularization // of Ybb and calculation of thevenin impedance vectors). // 17. Second quarter of time-step loop (branch-table history // updating, addition of branch contributions to nodal // injected current vector i ). // 18. Third quarter of time-step loop (source update, repeat // solution of (Y)v = i for node voltage vector v ). // 19. Fourth quarter of time-step loop (solution of 3-phase // nonlinearities and compensation-based rotating // machinery [type-50 s.m., u.m.], superposition to // give the total solution including compensation). // 20. Punch and print terminal conditions (if requested). // Catalog plot-data points on the disk as a permanent file, if // misc. data parameter 'icat' is positive. namespace emtp { const long int nLL34 = 34; std::string sSizesFileName; tWords pWords[ 24 ] = { { "a", "attach", 1 }, { "p", "punch", 2 }, { "out", "output", 3 }, { "s", "save", 4 }, { "spy", "spydata", 5 }, { "d", "disable", 7 }, { "r", "return", 10 }, { "n", "newfile", 11 }, { "ne", "new epsln", 13 }, { "de", "delete", 15 }, { "m", "monitor", 16 }, { "lf", "listoff", 18 }, { "ln", "liston", 20 }, { "v", "vintage", 21 }, { "old", "oldfile", 23 }, { "st", "stop", 25 }, { "w", "watch5", 26 }, { "com", "comment", 27 }, { "wi", "width", 29 }, { "u", "units", 30 }, { "", "", 31 }, { "", "", 0 } }; // subroutine ioerr. void ioerr(const long int &nAddr) { ; } // subroutine caterr. void caterr(const long int &nAddr, const long int &nKodErr) { ; } void stoptp(void) { // Temporary stop statements of EMTP have been converted to // "CALL STOPTP", allowing installation-dependent clean up. blkcom::sTexCol = blkcom::sABuff.str().substr(0, 80); if((blkcom::nChain == 31) && (blkcom::nLastOV == 1) && (blkcom::nKill == 9999)) exit(EXIT_FAILURE); (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Temporary error stop in \"stoptp\"., nchain, lastov ="; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << blkcom::nChain << blkcom::nLastOV; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Last-read card image ABUFF follows ...." << std::endl; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << blkcom::sABuff.str() << std::endl << std::flush; exit(EXIT_FAILURE); } // subroutine nextcard. void nextcard(void) { long int n7; // This entry is used only for interactive EMTP. It gets // next card image from memory rather than unit 5. n7 = blkcom::nNumDCD + 1; a1472: if(spycom::nIprSpy < 5) goto a1486; (*reinterpret_cast(spycom::pMFiles[ 5 ])) << " in \"nextcard\":"; (*reinterpret_cast(spycom::pMFiles[ 5 ])) << std::setfill(' ') << std::setw(5) << std::dec << n7; (*reinterpret_cast(spycom::pMFiles[ 5 ])) << " "; (*reinterpret_cast(spycom::pMFiles[ 5 ])) << std::setfill(' ') << std::setw(80) << spyf77::sFile6[ n7 - 1 ] << std::endl; utilities::window(*reinterpret_cast(blkcom::pLFiles[ 5 ]), \ *reinterpret_cast(spycom::pMFiles[ 5 ])); a1486: if(n7 <= spycom::nNumCRD) goto a1488; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " **** **** Data crisis. Last card has been read. numcrd ="; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::setfill(' ') << std::setw(6) << std::dec << spycom::nNumCRD << std::endl; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Use \"data\" command of spy to read in next block of data." << std::endl; if(blkcom::nM4Plot != 1) goto a9000; over20::emtspy(); goto a1472; a1488: blkcom::sABuff.str(spyf77::sFile6[ n7 - 1 ]); goto a9200; a9000: blkcom::nKill = 7654; a9200: return; } // subroutine cimage. void cimage(void) { // VAX-11 installation-dependent EMTP module which serves // to return the next input card. All systems will substitute. // //char pBuff10[ 80 ]; // long int i; long int j; long int k; long int l; long int n1, n2, n3, n8 = 0, n11 = 0, n12 = 99999, n13 = 99999; // double d1; double d11 = 0.0; // std::string sBuff10; std::string sFileName; std::string sText1; std::string sText2; std::string sText4("9"); std::string sText5("blank"); std::string sCharC("c"); std::string sChTACS("tacs"); // std::fstream *pTempFile1 = nullptr, *pTempFile2 = nullptr, *pTempFile7 = nullptr; // auto a4209 = [ & ](void) { // blkcom::nNFrFld = 1; free((void *) &d11); a4225: if(d11 < 0.0) pTempFile1 = pTempFile2; else pTempFile1 = reinterpret_cast(blkcom::pLFiles[ (int) d11 ]); if(n8 == 8) { utilities::closeFile(reinterpret_cast(pTempFile1)); if(blkcom::nNOutPR == 0) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "+Close file on unit 0x" << std::setfill('0') << std::setw(8) << std::hex << pTempFile1 << " ." << std::endl; if(pTempFile1 == blkcom::pLFiles[ 4 ]) blkcom::nNOutPR = 1; } else { if(blkcom::nNOutPR == 0) { (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "+Copy file"; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "0x" << std::setfill('0') << std::setw(8) << std::hex << pTempFile1; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " to" << sText1 << " ." << std::endl; } utilities::copyFile(pTempFile1, \ pTempFile7, \ sFileName); } }; auto a4206 = [ & ](void) { pTempFile2 = reinterpret_cast(blkcom::pLFiles[ 6 ]); a4209(); }; auto a4506 = [ & ](void) { long int i; long int k; long int n4; // std::fstream *pTempFile6 = nullptr; std::fstream *pTempFile7 = nullptr; // n4 = 0; sFileName = std::string(25, ' '); for(k = blkcom::nKolBeg; k <= 80; k++) { if(blkcom::sTexCol[ k - 1 ] != ' ') { if((blkcom::sTexCol[ k - 1 ] == blkcom::cCSepar) || \ (blkcom::sTexCol[ k - 1 ] == '(')) goto a4536; ++n4; sFileName[ n4 - 1 ] = blkcom::sTexCol[ k - 1 ]; } } k = 80; a4536: blkcom::nKolBeg = k + 1; blkcom::nNFrFld = 1; free((void *) &d11); pTempFile7 = reinterpret_cast(blkcom::pLFiles[ (int) d11 - 1 ]); if(n8 == 4) { free((void *) &d11); pTempFile6 = reinterpret_cast(blkcom::pLFiles[ (int) d11 - 1 ]); } else { if(!pTempFile6) pTempFile6 = reinterpret_cast(blkcom::pLFiles[ 6 ]); if(n8 == 5) pTempFile7 = reinterpret_cast(spycom::pMFiles[ 4 ]); if(!pTempFile7) { for(k = 1; k <= 15; k++) if(blkcom::pLFilesSave[ k - 1 ] == nullptr) goto a4568; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::endl; for(i = 1; i <= 10; i++) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Error, "; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::endl; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::string(5, ' ') << " All I/O channels occupied. Kill run at s.n. 4566 of \"cimage\" ." << std::endl; for(i = 1; i <= 20; i++) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::setfill(' ') << std::setw(5) << std::dec << blkcom::pLFilesSave[ i - 1 ]; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::endl; stoptp(); a4568: pTempFile7 = reinterpret_cast(blkcom::pLFiles[ k - 1 ]); } else { if(blkcom::nNOutPR == 0) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "+" << sText1.substr(0, 6) << " file:" << sFileName.substr(0, 25) << " unit = 0x" << std::setfill('0') << std::setw(8) << std::hex << pTempFile7 << std::endl; switch(n8) { case 4: utilities::copyFile(pTempFile6, pTempFile7, sFileName); // label 4423 break; case 9: utilities::openFile(pTempFile7, sFileName, std::ios::out); // label 4907 break; case 11: utilities::deleteFile(sFileName); // label 5106 break; case 16: utilities::closeFile(pTempFile7); // label 5608 utilities::openFile(pTempFile7, sFileName, std::ios::out); break; default: utilities::closeFile(pTempFile7); utilities::openFile(pTempFile7, sFileName, std::ios::out); pTempFile7 -> seekp(0, std::ios::beg); if(n8 == 5) over20::spying(); break; } } } }; auto cattach = [ & ](void) { sText1 = "attach"; a4506(); }; auto cpunch = [ & ](void) { long int n1; // sText1 = "punch"; a4206(); }; auto coutput = [ & ](void) { sText1 = "output"; a4206(); }; auto csave = [ & ](void) { sText1 = "saved"; a4506(); }; auto cspydata = [ & ](void) { sText1 = "spying"; blkcom::pMFilesSave[ 1 ] = nullptr; // remember $spy for eof time in "spying (2288)" blkcom::pMFilesSave[ 0 ] = spycom::pMFiles[ 4 ]; // remember spy input channel till now spycom::pMFiles[ 4 ] = blkcom::pLFiles[ 16 ]; // special I/O unit used for $spy connection spycom::nKFile5 = 1; // flag so "spying" knows munit5 opened to disk a4506(); }; auto cdisable = [ & ](void) { if(blkcom::nNOutPR == 0) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "+Begin data to be ignored." << std::endl; }; auto cenable = [ & ](void) { if(blkcom::nNOutPR == 0) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "+End of data to be ignored." << std::endl; }; auto creturn = [ & ](void) { pTempFile2 = reinterpret_cast(blkcom::pLFiles[ 3 ]); a4209(); }; auto cnewfile = [ & ](void) { sText1 = "newfil"; pTempFile2 = reinterpret_cast(blkcom::pLFiles[ 3 ]); a4506(); }; auto cnew_epsilon = [ & ](void) { double d1; // blkcom::nNFrFld = 1; d1 = blkcom::nEpsilon; freedom::freeOne(blkcom::nEpsilon); if(blkcom::nNOutPR == 0) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "+ Epsiln change. old, new =" << std::setfill(' ') << std::setw(13) << d1 << blkcom::nEpsilon << std::endl; }; auto cdelete = [ & ](void) { sText1 = "delete"; a4506(); utilities::deleteFile(sFileName); }; auto cmonitor = [ & ](void) { if(blkcom::nNOutPR != 0) { (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << sBuff10 << std::endl; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "+CRT Monitor. Card number = " << std::setfill(' ') << std::setw(5) << std::dec << blkcom::nNumDCD << std::endl; } }; auto clistoff = [ & ](void) { if(blkcom::nNOutPR == 0) { (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "+Turn off input listing at card" << std::setfill(' ') << std::setw(5) << std::dec << blkcom::nNumDCD << std::endl; blkcom::nNOutPR = 1; } }; auto cliston = [ & ](void) { (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::string(51, ' ') << "|$liston"<< std::endl; blkcom::nNOutPR = 0; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "+Turn on input listing at card" << std::setfill(' ') << std::setw(5) << std::dec << blkcom::nNumDCD << std::endl; }; auto cvintage = [ & ](void) { ; }; auto coldfile = [ & ](void) { ; }; auto cstop = [ & ](void) { ; }; auto cwatch5 = [ & ](void) { ; }; auto ccomment = [ & ](void) { ; }; auto cwidth = [ & ](void) { ; }; auto cunits = [ & ](void) { ; }; tRequest pRequests[] = { { "a", "attach", 1, cattach }, { "p", "punch", 2, cpunch }, { "out", "output", 3, coutput }, { "s", "save", 4, csave }, { "spy", "spydata", 5, cspydata }, { "d", "disable", 7, cdisable }, { "e", "enable", 9, cenable }, { "r", "return", 10, creturn }, { "n", "newfile", 11, cnewfile }, { "ne", "new epsiln", 13, cnew_epsilon }, { "de", "delete", 15, cdelete }, { "m", "monitor", 16, cmonitor }, { "lf", "listoff", 18, clistoff }, { "ln", "liston", 20, cliston }, { "v", "vintage", 21, cvintage }, { "old", "oldfile", 23, coldfile }, { "st", "stop", 25, cstop }, { "w", "watch5", 26, cwatch5 }, { "com", "comment", 27, ccomment }, { "wi", "width", 29, cwidth }, { "u", "units", 30, cunits } }; std::list sRequests(pRequests, pRequests + sizeof(pRequests) / sizeof(tRequest)); auto cecho = [ & ](void) { if(blkcom::nChain <= 15) ++blkcom::pIpnTV[ 10 ] + 1; reinterpret_cast(blkcom::pInEcho) -> write(blkcom::sABuff.str().c_str(), 80); }; auto ibrinc = [ & ](void) { ++blkcom::nIBr; labcom::sXOptBR[ blkcom::nIBr - 1 ] = blkcom::nXOpt; labcom::sCOptBR[ blkcom::nIBr - 1 ] = blkcom::nCOpt; }; // // The main body of cimage subroutine. // if(blkcom::nIprsUp >= 10) { (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Begin cimage. lunit5, lunit6, noutpr, numdcd ="; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "0x" << std::setfill('0') << std::setw(8) << std::hex << blkcom::pLFiles[ 4 ]; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "0x" << std::setfill('0') << std::setw(8) << std::hex << blkcom::pLFiles[ 5 ]; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::setfill(' ') << std::setw(5) << std::dec << blkcom::nNOutPR; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::setfill(' ') << std::setw(5) << std::dec << blkcom::nNumDCD << std::endl << std::flush; } a1000: if(blkcom::nM4Plot == 1) over20::emtspy(); if(blkcom::pLFiles[ 4 ] != nullptr) { if(reinterpret_cast(blkcom::pLFiles[ 4 ]) -> is_open()) { std::getline(*reinterpret_cast(blkcom::pLFiles[ 4 ]), sBuff10, '\n'); if(reinterpret_cast(blkcom::pLFiles[ 4 ]) -> eof()) goto a4000; } } if(blkcom::pLFiles[ 4 ]) { if(!reinterpret_cast(blkcom::pLFiles[ 4 ]) -> is_open()) nextcard(); } else nextcard(); if(blkcom::nKill > 0) goto a4000; if(!blkcom::pLFilesSave[ 4 ]) ++blkcom::nNumDCD; sBuff10 = blkcom::sABuff.str(); sText1 = sBuff10[ 0 ]; sText2 = sBuff10[ 1 ]; if(sText1 != CHARC) goto a3034; if(sText2 != BLANK) goto a3034; a1036: if(blkcom::nNOutPR != 0) goto a1000; if(n11 != 0) goto a1000; if(blkcom::nKol132 == 132) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Comment card. " << std::string(37, ' ') << "|" << sBuff10.substr(0, 80) << std::endl; else (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Comment card. " << std::string(37, ' ') << "|" << sBuff10.substr(0, 29) << std::endl; goto a1000; a3034: if(blkcom::nNOutPR != 0) goto a3035; if(blkcom::nKol132 == 132) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::string(52, ' ') << "|" << sBuff10.substr(0, 80) << std::endl; else (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::string(52, ' ') << "|" << sBuff10.substr(0, 29) << std::endl; a3035: if(n13 > 0) goto a3011; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " " << std::setfill(' ') << std::setw(5) << std::dec << blkcom::nNumDCD << " :" << blkcom::sABuff.str().substr(0, 72) << std::endl; n13 = n12; a3011: --n13; blkcom::sABuff >> sText2; if(strcom::toLower(sText2) != sText5) goto a3040; if(n8 == 6) goto a3044; a3039: blkcom::sABuff.str(""); goto a3233; a3040: if(blkcom::sChCont == strcom::toLower(sText4)) goto a3233; blkcom::sTexCol = blkcom::sABuff.str().substr(0, 80); if((strcom::toLower(blkcom::sABuff.str()) != "$listoff") && \ (strcom::toLower(blkcom::sABuff.str()) != "$liston")) goto a3042; goto a3246; a3042: if(blkcom::sChCont == sChTACS) goto a3233; if(blkcom::sTexCol == blkcom::sChCont) goto a3246; if(n8 != 6) goto a1144; a3044: if(blkcom::nNOutPR == 0) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "+Comment card (impicit)." << std::endl; goto a1000; a1144: for(k = 1; k <= 80; k++) { if(blkcom::sTexCol[ k - 1 ] == blkcom::cCSepar) goto a3237; if(blkcom::sTexCol.substr(k - 1, blkcom::sChCont.size()) == blkcom::sChCont) goto a3237; } a3233: blkcom::nKolBeg = -std::numeric_limits::infinity(); goto a7014; a3237: blkcom::nKolBeg = 1; goto a7014; a3246: blkcom::nKolBeg = 2; a3251: blkcom::nNRight = -2; freedom::freeOne(d1); if(blkcom::nIprsUp >= 1) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::endl << " nfrfld = " << std::setfill(' ') << std::setw(8) << blkcom::nNFrFld << std::string(5, ' ') << "texta6 = " << blkcom::pTextA6[ 0 ].substr(0, 7) << blkcom::pTextA6[ 1 ].substr(0, 7) << std::endl; blkcom::nNRight = 0; for(i = 1; i <= 200; i++) { n1 = pRequests[ i - 1 ].m_nPointer; n2 = pRequests[ i ].m_nPointer - 1; if(n2 < 0) goto a3319; if(blkcom::nIprsUp >= 35) { (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Special-request word" << std::setfill(' ') << std::setw(4) << i << " ."; for(j = n1; j <= n2; j++) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << pRequests[ j - 1 ].m_sLongName; } if(strcom::toLower(pRequests[ n1 - 1 ].m_sLongName) == BLANK) goto a3306; l = 0; n2 = n2 - n1 + 1; if(n3 != blkcom::nNFrFld) goto a3306; for(j = n1; j <= n2; j++) { ++l; if(strcom::toLower(blkcom::pTextA6[ l - 1 ]) != pRequests[ j - 1 ].m_sLongName) goto a3306; } if(blkcom::nIprsUp >= 2) { (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::endl << " key-word found. i, n8 =" << std::setfill(' ') << std::setw(5) << i << n8; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::string(5, ' ') << "texta6, textay = " << blkcom::pTextA6[ 0 ] << pRequests[ i - 1 ].m_sLongName << std::endl; } a3294: if(n8 != 6) goto a3301; if(i != 7) goto a1036; a3301: n8 = i; switch(n8) { case 1: // ***** Request no. 1. "$attach" ***** cattach(); break; case 2: // ***** Request no. 2. "$punch" ***** cpunch(); break; case 3: // ***** Request no. 3. "$output" ***** coutput(); break; case 4: // ***** Request no. 4. "$save" ***** csave(); break; case 5: // ***** Request no. 5. "$spy" ***** cspydata(); break; case 6: // ***** Request no. 6. "$disable" ***** cdisable(); break; case 7: // ***** Request no. 7. "$enable" ***** cenable(); break; case 8: // ***** Request no. 8. "$return" ***** creturn(); break; case 9: // ***** Request no. 9. "$newfile" ***** cnewfile(); break; case 10: // ***** Request no. 10. "new epsiln" ***** cnew_epsilon(); break; case 11: // ***** Request no. 11. "delete" ***** cdelete(); break; case 12: // ***** Request no. 12. "monitor" ***** cmonitor(); break; case 13: // ***** Request no. 13. "listoff" ***** clistoff(); break; case 14: // ***** Request no. 14. "liston" ***** cliston(); break; case 15: // ***** Request no. 15. "vintage" ***** cvintage(); break; case 16: // ***** Request no. 16. "oldfile" ***** coldfile(); break; case 17: // ***** Request no. 17. "stop" ***** cstop(); break; case 18: // ***** Request no. 18. "watch5" ***** cwatch5(); break; case 19: // ***** Request no. 19. "comment" ***** ccomment(); break; case 21: // ***** Request no. 21. "units" ***** cunits(); break; } if((n8 >= 1) && (n8 <= 21)) goto a1000; a3306: if(strcom::toLower(blkcom::pTextA6[ 0 ]) == pRequests[ i - 1 ].m_sLongName) goto a3294; } a3319: (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Illegal $-card. Stop at s.n. 3319 of \"cimage\" ." << std::endl; stoptp(); cattach(); goto a1000; a4000: (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::endl << " " << std::string(85, '=') << std::endl; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " End of file encounted in \"cimage\" while, attempting to read another data card. Stop." << std::endl << " " << std::string(85, '=') << std::endl; stoptp(); a7014: if(blkcom::pInEcho == nullptr) return; cecho(); } void erexit(void) { // VAX-11 installation-dependent EMTP module. This is // called by the top of "MAIN00", before any EMTP data input. //int idum[ 3 ]; //nKWTVAX = 0; datain::datain(); } void dummy(void) { std::stringstream sTemp; // //(*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Dummy overlay function called. nchain = " << blkcom::nChain << ". Exiting." << std::endl << std::flush; sTemp << " Dummy overlay function called. nchain = " << blkcom::nChain << ". Exiting." << std::endl << std::flush; throw(std::runtime_error(sTemp.str().c_str())); blkcom::nKill = 60; } // subroutine tapsav. void tapsav(char *narray, std::fstream &n1, const long int &n2, const long int &n3) { // Near-universal module for dumping or restoring (central memory // vs. disk) of /label/ . This does not work for those // computers like Prime and Burroughs where common blocks // are not ordered regularly in memory. Switch "KBURRO" // selects between disk or virtual memory (/C29B01/). int i; int j; int k; int nKVecSv, n13; // long int n4, n9; // std::vector sKPen(5); // auto a5448 = [&](void) { if(n3 <= 1) n1.write(&narray[ 0 ], n2); else n1.read(&narray[ 0 ], n2); }; auto a6327 = [&](void) { if((blkcom::nChain == 20) && (blkcom::nMemSav == 1)) a5448 (); else { if(blkcom::nChain == 1) a5448 (); else { if(!((blkcom::nChain == 6) || (blkcom::nChain == 8))) { n13 = 29; emtp::dimens(sKPen, n13, blkcom::sTrash, blkcom::sTrash); nKVecSv = 2 * (blkcom::nIt + blkcom::nIt + blkcom::nIBr + blkcom::nTot + blkcom::nIoffd) + blkcom::nKSwtch + blkcom::nLHist; n9 = blkcom::sSStat.m_nTLabl + nKVecSv * blkcom::pNByte[ 2 ] / blkcom::pNByte[ 3 ]; if(n9 >= sKPen[ 1 ] + 50) { (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Error stop in \"tapsav\". Overflow of /c29b01/ storage. n2, kpen(2) ="; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::setw (8) << n2 << sKPen[ 1 ]; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " needed storage n9 ="; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::setw (8) << n9; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "\n memory requirement in integer words for virtual computer implementation of tapsav. Storage must\n"; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "provide for all of --/label/--( deck \"labcom\" ), the several usages \"vecrsv\" and \"vecisv\" (over6-11), plus 50 extra cells.\n"; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "nchain =" << std::setw (5) << blkcom::nChain << std::endl << std::flush; emtp::stoptp(); } else { j = 50; if(n3 <= 1) { for(k = 1; k <= n2; k++) { ++j; labcom::pKArray[ j - 1 ] = narray[ k - 1 ]; } } else { for(k = 1; k <= n2; k++) { ++j; narray[ k - 1 ] = labcom::pKArray[ j - 1 ]; } } } } } } }; // if(narray) { if(blkcom::nIprsUp >= 1) { n9 = 0; sKPen[ 1 ] = 0; n4 = (size_t) narray; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "\n Top of \"tapsav\". n1 n2 n3 kburro n4" << std::endl << std::flush; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "0x" << std::setw(8) << std::setfill('0') << std::hex << &n1 << " " << n2; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " " << n3 << " " << blkcom::nKBurro << std::setw(8) << " " << n4 << std::endl << std::flush; } else { if(blkcom::nKBurro != 1) a5448(); else a6327(); } if (blkcom::nIprsUp >= 1) (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Exit \"tapsav\". n9, kpen(2) = " << n9 << " " << sKPen[ 1 ] << std:: endl << std::flush; } } /* subroutine main10. */ void main10(void) { subr10(); } /* subroutine subr10. */ void subr10(void) { int nIprCBL; int n24; // try { blkcom::nKTab = 0; FOREVER { if(blkcom::nChain <= 20) { if(blkcom::nKill != 0) blkcom::nChain = 51; else { n24 = blkcom::nChain; if(n24 < 1) n24 = 1; blkcom::nIprsUp = blkcom::pIprsOV[ n24 - 1 ]; nIprCBL = blkcom::nIprsUp; if(blkcom::nM4Plot == 1) over20::emtspy (); if(blkcom::nChain == 0) blkcom::nChain = 1; switch (blkcom::nChain) { case 1: #ifdef WITH_OVER1 over1::over1(); #else dummy(); #endif break; case 2: #ifdef WITH_OVER2 over2(); #else dummy(); #endif break; case 3: case 4: emtp::stoptp(); break; #ifdef WITH_OVER5 over5(); #else dummy(); #endif break; #ifdef WITH_OVER6 over6(); #else dummy(); #endif break; #ifdef WITH_OVER7 over7(); #else dummy(); #endif break; #ifdef WITH_OVER8 over8(); #else dummy(); #endif break; #ifdef WITH_OVER9 over9(); #else dummy(); #endif break; #ifdef WITH_OVER10 over10(); #else dummy(); #endif break; #ifdef WITH_OVER11 over11(); #else dummy(); #endif break; case 12: #ifdef WITH_OVER12 over12(); #else dummy(); #endif break; case 13: #ifdef WITH_OVER13 over13(); #else dummy(); #endif break; case 14: #ifdef WITH_OVER14 over14(); #else dummy (); #endif break; case 15: #ifdef WITH_OVER15 over15(); #else dummy(); #endif break; case 16: case 17: case 18: case 19: #ifdef WITH_OVER16 over16(); #else dummy(); #endif break; case 20: #ifdef WITH_OVER20 over20::over20(); #else dummy(); #endif break; } } } else break; } } catch(std::exception &e) { std::cerr << e.what() << std::endl; exit(EXIT_FAILURE); } } void setmar(int *n) { if (*n) *n = 0; } void chrsiz(int *n) { if (*n) *n = 0; } void setplt(void) { ; } void setstd (void) { ; } void interp(void) { ; } void namea6(const std::string &sText1, long int *n24) { // module for maintainance of alphanumeric vector texvec of // "labcom". maxbus of "blkcom" is last used cell. n24 chooses // mode of use: 0 will add text1, positive will locate it, // and negative will destroy (remove) it. int j; int n17 = 0; // std::string sText2("unused"); // if(blkcom::nMaxBus <= 0) goto a3423; for(j = 1; j <= blkcom::nMaxBus; j++) if(strcom::toLower(sText1) == strcom::toLower(labcom::sTexVec[ j - 1 ])) goto a3446; a3423: if(*n24 != 0) goto a3438; if (n17 == 0) goto a3434; labcom::sTexVec[ n17 - 1 ] = strcom::toLower (sText1); *n24 = n17; for(j = 1; j <= blkcom::nMaxBus; j++) if(strcom::toLower(labcom::sTexVec[ j - 1 ]) != strcom::toLower(sText2)) { ; } else { n17 = j; goto a9000; } n17 = 0; goto a9000; a3434: ++blkcom::nMaxBus; if (blkcom::nMaxBus > blkcom::sSStat.m_nSize7) exit(EXIT_FAILURE); labcom::sTexVec[ blkcom::nMaxBus - 1 ] = strcom::toLower(sText1); *n24 = blkcom::nMaxBus; goto a9000; a3438: if(blkcom::nIprsUp >= 1) { (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " +++++ Search of EMTP name vector bus through cell"; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::setw (5) << blkcom::nMaxBus; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " in \"namea6\" shows no match for\n"; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " . \""; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::setw (6) << sText1; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << "\". Return -intinf."; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::setw (10) << *n24 << std::endl << std::flush; } *n24 = std::numeric_limits::min(); goto a9000; a3446: if (*n24 < 0) goto a3455; *n24 = j; goto a9000; a3455: labcom::sTexVec[ j - 1 ] = strcom::toLower (sText2); n17 = j; a9000: if(blkcom::nIprsUp >= 6) { (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " Exit \"namea6\". text1, maxbus, n24, j ="; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << " "; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::setw (6) << sText1; (*reinterpret_cast(blkcom::pLFiles[ 5 ])) << std::setw (10) << blkcom::nMaxBus << *n24 << j << std::endl << std::flush; } } void tables(void) { // Utility which is used to both dump and restore EMTP // tables (central memory vs. disk). Usage is for both // "statistics" (over12, over15, over20) and "start again" // (over1, over20). Call to "tapsav" dumps /label/ . // Also used by $restart request of "cimage" (called // from "lookie" which is called by "subts3" of ov16). // Also used by "restore" request of rtm, where table // restoration is in "katalg" of overlay 20. // Note about deck "synmac". If EMTP s.m. modeling // Brandwajn (type-59), is to be deleted, // then all s.m. subroutines ( smdat, smout, smpfit, // smint, uncor, premec, elec, past, // update, increm ) are to be destroyed, and // deck "synmac" is to be removed from the present module. // but then "dimension z(1)" should be added in its // place, and the "n4 =" calculation involving "locint" // should be replaced by the simple statements "n4 = 1" . // comment card immediately preceding "synmac" ------------- // comment card immediately following "synmac" ------------- long int i, iprsav[] = { 0, 0, 0, 0 }; long int j; long int ll0, ll1, ll2, ll4; long int n1, n2, n3, n4, n5, n9, n24; // char *pBusOne = &blkcom::sBus1[ 0 ]; long int *pIDistX = &blkcom::nEnerg; long int *pKBase = &blkcom::sMonCar.m_nKBase; std::vector sIntegX; std::vector sITemp; std::vector sJTemp; std::vector sKTemp; std::vector sKPen; // ll1 = 1; ll2 = 2; ll4 = 4; blkcom::nNWord1 = (size_t) blkcom::pVoltBC - (size_t) &sKPen; blkcom::nNWord2 = (size_t) blkcom::pIDistX - (size_t) &blkcom::pLFilesSave[ 14 ]; // ... to complete. } // subroutine csup. void csup(const long int &l) { ; } } // end of file emtp.hpp