38 #include <Xyce_config.h>
44 #include <N_IO_CircuitBlock.h>
45 #include <N_IO_CmdParse.h>
46 #include <N_IO_OptionBlock.h>
47 #include <N_IO_OutputMgr.h>
48 #include <N_IO_PkgOptionsMgr.h>
49 #include <N_IO_SpiceSeparatedFieldTool.h>
51 #include <N_MPDE_Manager.h>
55 #include <N_UTL_Factory.h>
56 #include <N_UTL_FeatureTest.h>
71 Linear::System & linear_system,
75 Linear::Builder & builder,
76 Topo::Topology & topology,
77 IO::InitialConditionsManager & initial_conditions_manager,
78 IO::RestartMgr & restart_manager)
86 mpdeManager_(new N_MPDE_Manager(
analysisManager_, loader, device_manager, builder, topology, initial_conditions_manager, restart_manager,
analysisManager_.getCommandLine()))
264 typedef Util::Factory<AnalysisBase, MPDE> MPDEFactoryBase;
277 class MPDEFactory :
public MPDEFactoryBase
307 Linear::System & linear_system,
311 Linear::Builder & builder,
312 Topo::Topology & topology,
313 IO::InitialConditionsManager & initial_conditions_manager,
314 IO::RestartMgr & restart_manager)
327 virtual ~MPDEFactory()
371 void setMPDEAnalysisOptionBlock(
const Util::OptionBlock &option_block)
391 bool setMPDETimeIntegratorOptionBlock(
const Util::OptionBlock &option_block)
413 bool setMPDEIntOptionBlock(
const Util::OptionBlock &option_block)
439 struct MPDEAnalysisReg :
public IO::PkgOptionsReg
442 MPDEFactory & factory )
446 bool operator()(
const Util::OptionBlock &option_block)
448 factory_.setMPDEAnalysisOptionBlock(option_block);
449 factory_.deviceManager_.setBlockAnalysisFlag(
true);
470 IO::PkgOptionsMgr & options_manager,
471 IO::CircuitBlock & circuit_block,
472 const std::string & netlist_filename,
473 const IO::TokenVector & parsed_line)
475 Util::OptionBlock option_block(
"MPDE", Util::OptionBlock::NO_EXPRESSIONS, netlist_filename, parsed_line[0].lineNumber_);
477 int numFields = parsed_line.size();
480 if ( numFields < 3 || numFields > 6 )
482 Report::UserError0().at(netlist_filename, parsed_line[0].lineNumber_)
483 <<
".MPDE line has an unexpected number of fields";
486 int linePosition = 1;
487 int endPosition = numFields - 1;
489 Util::Param parameter(
"",
"");
492 parameter.setTag(
"TSTEP" );
493 parameter.setVal( parsed_line[linePosition].string_ );
494 option_block.addParam( parameter );
497 parameter.setTag(
"TSTOP" );
498 parameter.setVal( parsed_line[linePosition].string_ );
499 option_block.addParam( parameter );
503 parameter.setTag( parsed_line[endPosition].string_ );
504 if ( parameter.uTag() ==
"NOOP" || parameter.uTag() ==
"UIC" )
506 parameter.setVal(
"1" );
507 option_block.addParam( parameter );
510 else if ( numFields == 6)
512 Report::UserError0().at(netlist_filename, parsed_line[endPosition].lineNumber_) <<
"expected NOOP/UIC field on .MPDE line but found" << parameter.usVal();
515 if ( linePosition <= endPosition )
517 parameter.setTag(
"TSTART" );
518 parameter.setVal( parsed_line[linePosition].string_ );
519 option_block.addParam( parameter );
523 if ( linePosition <= endPosition )
525 parameter.setTag(
"DTMAX" );
526 parameter.setVal( parsed_line[linePosition].string_ );
527 option_block.addParam( parameter );
531 circuit_block.addOptions(option_block);
538 IO::PkgOptionsMgr & options_manager)
541 Util::ParamMap ¶meters = options_manager.addOptionsMetadataMap(
"TIMEINT-MPDE");
543 parameters.insert(Util::ParamMap::value_type(
"METHOD", Util::Param(
"METHOD", 1)));
545 parameters.insert(Util::ParamMap::value_type(
"CONSTSTEP", Util::Param(
"CONSTSTEP", 0)));
546 parameters.insert(Util::ParamMap::value_type(
"USEDEVICEMAX", Util::Param(
"USEDEVICEMAX", 1)));
547 parameters.insert(Util::ParamMap::value_type(
"RELTOL", Util::Param(
"RELTOL", 1.0E-2)));
548 parameters.insert(Util::ParamMap::value_type(
"ABSTOL", Util::Param(
"ABSTOL", 1.0E-6)));
549 parameters.insert(Util::ParamMap::value_type(
"RESTARTSTEPSCALE", Util::Param(
"RESTARTSTEPSCALE", .005)));
550 parameters.insert(Util::ParamMap::value_type(
"NLNEARCONV", Util::Param(
"NLNEARCONV", 0)));
551 parameters.insert(Util::ParamMap::value_type(
"NLSMALLUPDATE", Util::Param(
"NLSMALLUPDATE", 1)));
552 parameters.insert(Util::ParamMap::value_type(
"DOUBLEDCOPSTEP", Util::Param(
"DOUBLEDCOPSTEP", 0)));
553 parameters.insert(Util::ParamMap::value_type(
"FIRSTDCOPSTEP", Util::Param(
"FIRSTDCOPSTEP", 0)));
554 parameters.insert(Util::ParamMap::value_type(
"LASTDCOPSTEP", Util::Param(
"LASTDCOPSTEP", 1)));
555 parameters.insert(Util::ParamMap::value_type(
"RESETTRANNLS", Util::Param(
"RESETTRANNLS", 1)));
556 parameters.insert(Util::ParamMap::value_type(
"BPENABLE", Util::Param(
"BPENABLE", 1)));
557 parameters.insert(Util::ParamMap::value_type(
"EXITTIME", Util::Param(
"EXITTIME", 0.0)));
558 parameters.insert(Util::ParamMap::value_type(
"EXITSTEP", Util::Param(
"EXITSTEP", 0)));
559 parameters.insert(Util::ParamMap::value_type(
"ERROPTION", Util::Param(
"ERROPTION", 0)));
560 parameters.insert(Util::ParamMap::value_type(
"DEBUGLEVEL", Util::Param(
"DEBUGLEVEL", 0)));
561 parameters.insert(Util::ParamMap::value_type(
"JACLIMITFLAG", Util::Param(
"JACLIMITFLAG", 0)));
562 parameters.insert(Util::ParamMap::value_type(
"JACLIMIT", Util::Param(
"JACLIMIT", 1.0e17)));
563 parameters.insert(Util::ParamMap::value_type(
"DAESTATEDERIV", Util::Param(
"DAESTATEDERIV", 0)));
564 parameters.insert(Util::ParamMap::value_type(
"TESTFIRSTSTEP", Util::Param(
"TESTFIRSTSTEP", 0)));
565 parameters.insert(Util::ParamMap::value_type(
"DTMIN", Util::Param(
"DTMIN", 0.0)));
566 parameters.insert(Util::ParamMap::value_type(
"MAXORD", Util::Param(
"MAXORD", 5)));
567 parameters.insert(Util::ParamMap::value_type(
"MINORD", Util::Param(
"MINORD", 1)));
568 parameters.insert(Util::ParamMap::value_type(
"OUTPUTINTERPMPDE", Util::Param(
"OUTPUTINTERPMPDE", 1)));
569 parameters.insert(Util::ParamMap::value_type(
"INTERPOUTPUT", Util::Param(
"INTERPOUTPUT", 1)));
570 parameters.insert(Util::ParamMap::value_type(
"CONDTEST", Util::Param(
"CONDTEST", 0)));
571 parameters.insert(Util::ParamMap::value_type(
"CONDTESTDEVICENAME", Util::Param(
"CONDTESTDEVICENAME",
"dev_name")));
572 parameters.insert(Util::ParamMap::value_type(
"ISOCONDTEST", Util::Param(
"ISOCONDTEST", 0)));
573 parameters.insert(Util::ParamMap::value_type(
"ISOCONDTESTDEVICENAME", Util::Param(
"ISOCONDTESTDEVICENAME",
"dev_name")));
574 parameters.insert(Util::ParamMap::value_type(
"MINTIMESTEPSBP", Util::Param(
"MINTIMESTEPSBP", 10)));
575 parameters.insert(Util::ParamMap::value_type(
"NLMIN", Util::Param(
"NLMIN", 3)));
576 parameters.insert(Util::ParamMap::value_type(
"NLMAX", Util::Param(
"NLMAX", 8)));
577 parameters.insert(Util::ParamMap::value_type(
"DELMAX", Util::Param(
"DELMAX", 1.0e+99)));
578 parameters.insert(Util::ParamMap::value_type(
"TIMESTEPSREVERSAL", Util::Param(
"TIMESTEPSREVERSAL",
false)));
582 Util::ParamMap ¶meters = options_manager.addOptionsMetadataMap(
"MPDEINT");
584 parameters.insert(Util::ParamMap::value_type(
"AUTON2", Util::Param(
"AUTON2",
false)));
585 parameters.insert(Util::ParamMap::value_type(
"AUTON2MAX", Util::Param(
"AUTON2MAX", 100)));
586 parameters.insert(Util::ParamMap::value_type(
"DCOPEXIT", Util::Param(
"DCOPEXIT", 0)));
587 parameters.insert(Util::ParamMap::value_type(
"DEBUGLEVEL", Util::Param(
"DEBUGLEVEL", 0)));
588 parameters.insert(Util::ParamMap::value_type(
"DIFF", Util::Param(
"DIFF", 0)));
589 parameters.insert(Util::ParamMap::value_type(
"DIFFORDER", Util::Param(
"DIFFORDER", 1)));
590 parameters.insert(Util::ParamMap::value_type(
"EXITSAWTOOTHSTEP", Util::Param(
"EXITSAWTOOTHSTEP", -1)));
591 parameters.insert(Util::ParamMap::value_type(
"FREQDOMAIN", Util::Param(
"FREQDOMAIN", 0)));
592 parameters.insert(Util::ParamMap::value_type(
"IC", Util::Param(
"IC", 0)));
593 parameters.insert(Util::ParamMap::value_type(
"ICEXIT", Util::Param(
"ICEXIT", 0)));
594 parameters.insert(Util::ParamMap::value_type(
"ICPER", Util::Param(
"ICPER", 10)));
595 parameters.insert(Util::ParamMap::value_type(
"N2", Util::Param(
"N2", 10)));
596 parameters.insert(Util::ParamMap::value_type(
"NONLTESTEPS", Util::Param(
"NONLTESTEPS", 10)));
597 parameters.insert(Util::ParamMap::value_type(
"OSCOUT", Util::Param(
"OSCOUT",
"")));
598 parameters.insert(Util::ParamMap::value_type(
"OSCSRC", Util::Param(
"OSCSRC",
"VECTOR")));
599 parameters.insert(Util::ParamMap::value_type(
"PHASE", Util::Param(
"PHASE", 0)));
600 parameters.insert(Util::ParamMap::value_type(
"PHASECOEFF", Util::Param(
"PHASECOEFF", 0)));
601 parameters.insert(Util::ParamMap::value_type(
"SAVEICDATA", Util::Param(
"SAVEICDATA",
false)));
602 parameters.insert(Util::ParamMap::value_type(
"STARTUPPERIODS", Util::Param(
"STARTUPPERIODS", 0)));
603 parameters.insert(Util::ParamMap::value_type(
"T2", Util::Param(
"T2", 0.0)));
604 parameters.insert(Util::ParamMap::value_type(
"TEST", Util::Param(
"TEST", 0)));
605 parameters.insert(Util::ParamMap::value_type(
"WAMPDE", Util::Param(
"WAMPDE", 0)));
621 factory_block.
optionsManager_.addCommandParser(
".MPDE", extractMPDEData);
623 factory_block.
optionsManager_.addCommandProcessor(
"MPDE",
new MPDEAnalysisReg(*factory));
625 factory_block.
optionsManager_.addOptionsProcessor(
"MPDEINT", IO::createRegistrationOptions(*factory, &MPDEFactory::setMPDEIntOptionBlock));
626 factory_block.
optionsManager_.addOptionsProcessor(
"TIMEINT-MPDE", IO::createRegistrationOptions(*factory, &MPDEFactory::setMPDETimeIntegratorOptionBlock));
IO::PkgOptionsMgr & optionsManager_
bool doProcessSuccessfulStep()
Pure virtual class to augment a linear system.
bool resetForStepAnalysis()
Topo::Topology & topology_
Device::DeviceMgr & deviceManager_
Util::ListenerAutoSubscribe< StepEvent > StepEventListener
void notify(const StepEvent &event)
Topo::Topology & topology_
bool finalVerboseOutput()
Util::OptionBlock mpdeIntOptionBlock_
Nonlinear::Manager & nonlinearManager_
Linear::System & linearSystem_
Topo::Topology & topology_
Util::OptionBlock mpdeTimeIntegratorOptionBlock_
The FactoryBlock contains parameters needed by the analysis creation functions.
Linear::System & linearSystem_
IO::InitialConditionsManager & initialConditionsManager_
bool registerMPDEFactory(FactoryBlock &factory_block)
Linear::System & linearSystem_
Util::OptionBlock timeIntegratorOptionBlock_
AnalysisManager & analysisManager_
Linear::Builder & builder_
MPDE(AnalysisManager &analysis_manager, Linear::System &linear_system, Nonlinear::Manager &nonlinear_manager, Loader::Loader &loader, Device::DeviceMgr &device_manager, Linear::Builder &builder, Topo::Topology &topology, IO::InitialConditionsManager &initial_conditions_manager, IO::RestartMgr &restart_manager)
Nonlinear::Manager & nonlinearManager_
IO::RestartMgr & restartManager_
Device::DeviceMgr & deviceManager_
Nonlinear::Manager & nonlinearManager_
IO::RestartMgr & restartManager_
const TimeIntg::TIAParams & getTIAParams() const
void addAnalysisFactory(FactoryBlock &factory_block, Util::Factory< AnalysisBase, void > *factory)
IO::InitialConditionsManager & initialConditionsManager_
bool processSuccessfulDCOP()
int getIntegrationMethod() const
AnalysisManager & analysisManager_
Util::OptionBlock mpdeAnalysisOptionBlock_
N_MPDE_Manager * mpdeManager_
bool doProcessFailedStep()
Linear::Builder & builder_