40 #include <Xyce_config.h>
45 #include <N_UTL_Misc.h>
65 #include <N_ERH_ErrorMgr.h>
66 #include <N_IO_ActiveOutput.h>
67 #include <N_IO_CmdParse.h>
68 #include <N_LOA_Loader.h>
70 #include <N_PDS_Comm.h>
71 #include <N_PDS_Manager.h>
78 #include <N_UTL_BreakPoint.h>
79 #include <N_UTL_OptionBlock.h>
80 #include <N_UTL_Timer.h>
118 Report::DevelFatal().in(
"AnalysisManager::provisionalStep") <<
"unknown type of analysis";
130 RefCountPtr<N_ANP_Transient> mixedSignalTransientAnalysisObject =
133 if (!Teuchos::is_null(mixedSignalTransientAnalysisObject))
135 dcopFlag = mixedSignalTransientAnalysisObject->
getDCOPFlag();
160 bool recoverableFailureFlag=
true;
161 while (!stepSuccess && recoverableFailureFlag)
226 bool dcopFlag =
false;
227 RefCountPtr<N_ANP_Transient> mixedSignalTransientAnalysisObject =
230 if (!Teuchos::is_null(mixedSignalTransientAnalysisObject))
232 dcopFlag = mixedSignalTransientAnalysisObject->
getDCOPFlag();
246 mixedSignalTransientAnalysisObject->stats_.failedStepsAttempted_ += 1;
273 loader_->setExternalSolverState (ss);
295 if (initializeAllFlag_ ==
false)
297 Report::DevelFatal().in(
"AnalysisManager::runStep") <<
"Call initializeAll function first";
300 if (analysisParamsRegistered ==
false)
302 Report::UserError() <<
"No analysis statement in the netlist";
306 bool integration_status =
false;
308 #ifdef Xyce_VERBOSE_TIME
312 solverStartTime_ = elapsedTimerPtr_->elapsedTime();
316 Report::UserError() <<
"Not valid to use .STEP statements in an inner solve";
322 #ifdef Xyce_VERBOSE_TIME
323 Xyce::dout() <<
"AnalysisManager::runStep:" << std::endl;
324 Xyce::dout() <<
"nextTime = " << tiInfo.
nextTime << std::endl;
325 Xyce::dout() <<
"stepSize = " << tiInfo.
nextTimeStep << std::endl;
334 Report::DevelFatal().in(
"AnalysisManager::runStep") <<
"Unknown type of analysis";
336 integration_status = twoLevelAnalysisObject_->twoLevelStep();
337 workingIntgMethod_->setupTwoLevelError(tlError);
340 return integration_status;
377 #ifdef Xyce_DEBUG_ANALYSIS
380 Xyce::dout() <<
"AnalysisManager::startTimeStep:" << std::endl;
384 #ifdef Xyce_VERBOSE_TIME
418 bool dcopFlag =
true;
420 if (!Teuchos::is_null(twoLevelTransientAnalysisObject)) {
421 dcopFlag = twoLevelTransientAnalysisObject->
getDCOPFlag();
423 #ifdef Xyce_VERBOSE_TIME
452 std::map<std::string,double> inputMap;
453 std::vector<double> outputVector;
454 std::vector< std::vector<double> > jacobian;
459 while( currentDeviceName != endDeviceName )
461 inputMap[ *currentDeviceName ] = 0.0;
465 #ifdef Xyce_DEBUG_ANALYSIS
468 Xyce::dout() <<
"AnalysisManager::conductanceTest()" << std::endl;
470 while( currentDeviceName != endDeviceName )
472 Xyce::dout() <<
"currentDeviceName = \"" << *currentDeviceName <<
"\" added to inputMap[ "
473 << *currentDeviceName <<
" ] = " << inputMap[ *currentDeviceName ] << std::endl;
479 int isize=inputMap.size();
480 outputVector.resize(isize,0.0);
481 jacobian.resize(isize);
482 for (
int i=0;i<isize;++i)
484 jacobian[i].resize(isize,0.0);
494 int numElectrodes = isize;
497 fp1 = fopen(
"conductance.txt",
"w");
499 fprintf(fp1,
"%s",
"Conductance array: \n");
500 fprintf(fp1,
"%s",
" ");
503 std::map<std::string,double>::iterator iterM = inputMap.begin();
504 std::map<std::string,double>::iterator endM = inputMap.end ();
505 for (iE2 = 0; iE2 < numElectrodes; ++iE2,++iterM)
507 std::string srcname = iterM->first;
508 fprintf(fp1,
"\t%14s",srcname.c_str());
510 fprintf(fp1,
"%s",
"\n");
512 iterM = inputMap.begin();
513 for (iE1 = 0; iE1 < numElectrodes; ++iE1, ++iterM)
515 std::string srcname = iterM->first;
516 fprintf(fp1,
"%14s",srcname.c_str());
517 for (iE2 = 0; iE2 < numElectrodes; ++iE2)
519 fprintf(fp1,
"\t%14.4e",jacobian[iE1][iE2]);
521 fprintf(fp1,
"%s",
"\n");
523 fprintf(fp1,
"%s",
"\n");
527 fprintf(fp1,
"%s",
"\nConductance calculation failed!\n");
544 bool bsuccess =
true;
565 Report::UserError() <<
"Multi-Level Newton solves only supports DC and Transient analysis";
603 bool bsuccess =
true;
624 (
const std::vector<std::string> & paramNames,
625 const std::vector<double> & paramVals)
627 #ifdef Xyce_DEBUG_ANALYSIS
628 std::string netListFile = commandLine_.getArgumentValue(
"netlist");
629 Xyce::dout() <<
"\n " << netListFile;
630 Xyce::dout() <<
" AnalysisManager::homotopyStepSuccess " << std::endl;
633 outputManagerAdapter_->outputHomotopy( paramNames, paramVals, *getTIADataStore()->nextSolutionPtr );
636 getTIADataStore()->updateSolDataArrays();
639 loader_->homotopyStepSuccess (paramNames,paramVals);
657 #ifdef Xyce_DEBUG_ANALYSIS
658 std::string netListFile =
commandLine_.getArgumentValue(
"netlist");
659 Xyce::dout() <<
"\n " << netListFile;
660 Xyce::dout() <<
" AnalysisManager::homotopyStepFailure " << std::endl;
667 loader_->homotopyStepFailure ();
683 #ifdef Xyce_DEBUG_ANALYSIS
684 std::string netListFile =
commandLine_.getArgumentValue(
"netlist");
685 Xyce::dout() <<
"\n " << netListFile;
686 Xyce::dout() <<
" AnalysisManager::stepSuccess " << std::endl;
691 switch (analysisUpper)
696 if (twoLevelTransientAnalysisObject)
702 Report::DevelFatal().in(
"AnalysisManager::stepSuccess") <<
"Failed dynamic_cast of twoLevelAnalysisObject to N_ANP_Transient.";
713 Report::DevelFatal().in(
"AnalysisManager::stepSuccess") <<
"Unknown type of analysis";
729 switch (analysisUpper)
734 if (twoLevelTransientAnalysisObject)
740 Report::DevelFatal().in(
"AnalysisManager::stepFailure") <<
"Failed dynamic_cast of twoLevelAnalysisObject to N_ANP_Transient.";
751 Report::DevelFatal().in(
"AnalysisManager::stepFailure") <<
"Unknown type of analysis";
765 bool bsuccess =
true;
780 bool bsuccess =
true;
781 loader_->getBreakPoints(breakPointTimes);