40 #include <Xyce_config.h>
45 #include <N_UTL_Misc.h>
75 #include <N_ERH_ErrorMgr.h>
78 #include <N_LOA_Loader.h>
80 #include <N_PDS_Manager.h>
81 #include <N_PDS_Comm.h>
83 #include <N_UTL_OptionBlock.h>
84 #include <N_UTL_Timer.h>
85 #include <N_UTL_BreakPoint.h>
87 #include <N_IO_CmdParse.h>
102 bool bsuccess =
true;
105 bool dcopFlag =
true;
125 msg =
"AnalysisManager::provisionalStep - "
126 "unknown type of analysis\n";
127 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL_0, msg);
143 RefCountPtr<N_ANP_Transient> mixedSignalTransientAnalysisObject =
146 if (!Teuchos::is_null(mixedSignalTransientAnalysisObject))
148 dcopFlag = mixedSignalTransientAnalysisObject->
getDCOPFlag();
163 if (!
secPtr_->stepAttemptStatus)
167 stepSuccess =
secPtr_->stepAttemptStatus;
173 bool recoverableFailureFlag=
true;
174 while (!stepSuccess && recoverableFailureFlag)
183 if (!
secPtr_->stepAttemptStatus)
236 secPtr_->stepAttemptStatus =
false;
239 bool dcopFlag =
false;
240 RefCountPtr<N_ANP_Transient> mixedSignalTransientAnalysisObject =
243 if (!Teuchos::is_null(mixedSignalTransientAnalysisObject))
245 dcopFlag = mixedSignalTransientAnalysisObject->
getDCOPFlag();
257 wimPtr->rejectStepForHabanero();
259 mixedSignalTransientAnalysisObject->totalNumberFailedStepsAttempted_ += 1;
260 secPtr_->numberSuccessiveFailures += 1;
293 if (initializeAllFlag_ ==
false)
295 msg =
"AnalysisManager::runStep - "
296 "you need to call the initializeAll function first\n";
297 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL_0, msg);
300 if (analysisParamsRegistered ==
false)
302 msg =
"AnalysisManager::runStep: "
303 "no analysis statement in the netlist\n";
304 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL_0, msg);
307 bool integration_status =
false;
309 #ifdef Xyce_VERBOSE_TIME
313 solverStartTime_ = elapsedTimerPtr_->elapsedTime();
317 msg =
"AnalysisManager::runStep - "
318 "Not valid to use .STEP statements in an inner solve.\n";
319 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL_0, msg);
325 #ifdef Xyce_VERBOSE_TIME
326 Xyce::dout() <<
"AnalysisManager::runStep:" << std::endl;
327 Xyce::dout() <<
"nextTime = " << tiInfo.
nextTime << std::endl;
328 Xyce::dout() <<
"stepSize = " << tiInfo.
nextTimeStep << std::endl;
337 msg =
"AnalysisManager::runStep - "
338 "unknown type of analysis\n";
339 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL_0, msg);
341 integration_status = twoLevelAnalysisObject_->twoLevelStep();
342 wimPtr->setupTwoLevelError(tlError);
345 return integration_status;
382 #ifdef Xyce_DEBUG_ANALYSIS
385 Xyce::dout() <<
"AnalysisManager::startTimeStep:" << std::endl;
389 #ifdef Xyce_VERBOSE_TIME
404 secPtr_->updateTwoLevelTimeInfo(tiInfo);
410 wimPtr->setTwoLevelTimeInfo(tiInfo);
419 wimPtr->obtainCorrectorDeriv();
422 bool dcopFlag =
true;
424 if (!Teuchos::is_null(twoLevelTransientAnalysisObject)) {
425 dcopFlag = twoLevelTransientAnalysisObject->
getDCOPFlag();
427 #ifdef Xyce_VERBOSE_TIME
428 if (!dcopFlag)
secPtr_->outputTimeInfo(lout());
456 std::map<std::string,double> inputMap;
457 std::vector<double> outputVector;
458 std::vector< std::vector<double> > jacobian;
463 while( currentDeviceName != endDeviceName )
465 inputMap[ *currentDeviceName ] = 0.0;
469 #ifdef Xyce_DEBUG_ANALYSIS
472 Xyce::dout() <<
"AnalysisManager::conductanceTest()" << std::endl;
474 while( currentDeviceName != endDeviceName )
476 Xyce::dout() <<
"currentDeviceName = \"" << *currentDeviceName <<
"\" added to inputMap[ "
477 << *currentDeviceName <<
" ] = " << inputMap[ *currentDeviceName ] << std::endl;
483 int isize=inputMap.size();
484 outputVector.resize(isize,0.0);
485 jacobian.resize(isize);
486 for (
int i=0;i<isize;++i)
488 jacobian[i].resize(isize,0.0);
498 int numElectrodes = isize;
501 fp1 = fopen(
"conductance.txt",
"w");
503 fprintf(fp1,
"%s",
"Conductance array: \n");
504 fprintf(fp1,
"%s",
" ");
507 std::map<std::string,double>::iterator iterM = inputMap.begin();
508 std::map<std::string,double>::iterator endM = inputMap.end ();
509 for (iE2 = 0; iE2 < numElectrodes; ++iE2,++iterM)
511 std::string srcname = iterM->first;
512 fprintf(fp1,
"\t%14s",srcname.c_str());
514 fprintf(fp1,
"%s",
"\n");
516 iterM = inputMap.begin();
517 for (iE1 = 0; iE1 < numElectrodes; ++iE1, ++iterM)
519 std::string srcname = iterM->first;
520 fprintf(fp1,
"%14s",srcname.c_str());
521 for (iE2 = 0; iE2 < numElectrodes; ++iE2)
523 fprintf(fp1,
"\t%14.4e",jacobian[iE1][iE2]);
525 fprintf(fp1,
"%s",
"\n");
527 fprintf(fp1,
"%s",
"\n");
531 fprintf(fp1,
"%s",
"\nConductance calculation failed!\n");
548 bool bsuccess =
true;
569 msg =
"AnalysisManager::startupSolvers: Multi-Level Newton solves only supports DC and Transient analysis\n";
570 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL_0, msg);
607 bool bsuccess =
true;
625 (
const std::vector<std::string> & paramNames,
626 const std::vector<double> & paramVals)
628 #ifdef Xyce_DEBUG_ANALYSIS
629 std::string netListFile = commandLine_.getArgumentValue(
"netlist");
630 Xyce::dout() <<
"\n " << netListFile;
631 Xyce::dout() <<
" AnalysisManager::homotopyStepSuccess " << std::endl;
634 outputMgrAdapterRCPtr_->outputHomotopy( paramNames, paramVals, *getTIADataStore()->nextSolutionPtr );
637 getTIADataStore()->updateSolDataArrays();
640 loaderPtr->homotopyStepSuccess (paramNames,paramVals);
658 #ifdef Xyce_DEBUG_ANALYSIS
659 std::string netListFile =
commandLine_.getArgumentValue(
"netlist");
660 Xyce::dout() <<
"\n " << netListFile;
661 Xyce::dout() <<
" AnalysisManager::homotopyStepFailure " << std::endl;
684 #ifdef Xyce_DEBUG_ANALYSIS
685 std::string netListFile =
commandLine_.getArgumentValue(
"netlist");
686 Xyce::dout() <<
"\n " << netListFile;
687 Xyce::dout() <<
" AnalysisManager::stepSuccess " << std::endl;
691 secPtr_->stepAttemptStatus =
true;
692 switch( analysisUpper )
697 if (twoLevelTransientAnalysisObject)
703 std::string msg =
"AnalysisManager::stepSuccess - "
704 "Failed dynamic_cast of twoLevelAnalysisObject to N_ANP_Transient.\n";
705 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL_0, msg);
716 std::string msg =
"AnalysisManager::stepSuccess - "
717 "unknown type of analysis\n";
718 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL_0, msg);
733 secPtr_->stepAttemptStatus =
false;
734 switch( analysisUpper )
739 if (twoLevelTransientAnalysisObject)
745 std::string msg =
"AnalysisManager::stepSuccess - "
746 "Failed dynamic_cast of twoLevelAnalysisObject to N_ANP_Transient.\n";
747 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL_0, msg);
758 std::string msg =
"AnalysisManager::stepFailure - "
759 "unknown type of analysis\n";
760 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL_0, msg);
774 bool bsuccess =
true;
775 wimPtr->getInitialQnorm (tle);
789 bool bsuccess =
true;
790 loaderPtr->getBreakPoints(breakPointTimes);