47 #include <Xyce_config.h>
49 #include <N_ERH_ErrorMgr.h>
54 #include <N_UTL_FeatureTest.h>
61 typedef std::map<int, std::pair<const char *, Factory> > Registry;
66 static Registry s_registry;
76 std::pair<Registry::iterator, bool> result = getRegistry().insert(Registry::value_type(type, std::pair<const char *, Factory>(name, factory)));
77 if (!result.second && name != (*result.first).second.first)
78 Report::DevelFatal0() <<
"Time integration factory " << type <<
" named " << name <<
" already registered with name " << (*result.first).second.first;
81 TimeIntegrationMethod *
88 Registry::const_iterator it = getRegistry().find(type);
89 if (it == getRegistry().end())
92 return (*(*it).second.second)(tia_params, step_error_control, data_store);
98 Registry::const_iterator it = getRegistry().find(type);
99 if (it == getRegistry().end())
102 return (*it).second.first;
114 : timeIntegrationMethod_(0),
117 timeIntegratorStat_(
"Time integrator", parent_stat),
118 predictorStat_(
"Predictor", timeIntegratorStat_),
119 completeStepStat_(
"Successful Step", timeIntegratorStat_),
120 rejectStepStat_(
"Failed Step", timeIntegratorStat_),
121 updateCoefStat_(
"Update Coef", timeIntegratorStat_),
122 residualStat_(
"Load Residual", timeIntegratorStat_),
123 jacobianStat_(
"Load Jacobian", timeIntegratorStat_),
124 initializeStat_(
"Initialize", timeIntegratorStat_),
125 updateLeadStat_(
"Lead Currents", timeIntegratorStat_)
163 Report::DevelFatal0().in(
"WorkingIntegrationMethod::createTimeIntegMethod") <<
"Invalid integration method " << type <<
" specified";
327 Linear::Vector * solnVecPtr,
328 const std::vector<double> & fastTimes )
331 outputManagerAdapter, time, solnVecPtr, fastTimes );
337 Linear::Vector * solnVecPtr,
338 const std::vector<double> & fastTimes,
342 outputManagerAdapter, time, solnVecPtr, fastTimes, phiGID );
349 Linear::Vector * solnVecPtr,
350 const bool doNotInterpolate,
351 const std::vector<double> & outputInterpolationTimes,
352 bool skipPrintLineOutput )
356 outputManagerAdapter, tia_params, time, solnVecPtr, doNotInterpolate, outputInterpolationTimes, skipPrintLineOutput) ;
360 Parallel::Machine comm,
361 IO::InitialConditionsManager & initial_conditions_manager,
362 const NodeNameMap & node_name_map,
364 Linear::Vector * solnVecPtr,
365 const double saveTime,
366 const bool doNotInterpolate)
virtual void getInitialQnorm(TwoLevelError &tle) const =0
virtual void obtainPredictor()=0
int getNumberOfSteps() const
virtual void obtainCorrectorDeriv()=0
virtual void updateDerivsBlock(const std::list< IndexPair > &solGIDList, const std::list< IndexPair > &staGIDList)=0
virtual bool saveOutputSolution(Parallel::Machine comm, IO::InitialConditionsManager &initial_conditions_manager, const NodeNameMap &node_name_map, const TIAParams &tia_params, Linear::Vector *solnVecPtr, const double saveTime, const bool doNotInterpolate)=0
virtual bool printMPDEOutputSolution(Analysis::OutputMgrAdapter &outputManagerAdapter, const double time, Linear::Vector *solnVecPtr, const std::vector< double > &fastTimes)
virtual void rejectStepForHabanero()
virtual const char * getName() const =0
virtual void updateLeadCurrentVec()
Pure virtual class to augment a linear system.
void setTwoLevelTimeInfo()
void updateDerivsBlock(const std::list< IndexPair > &solGIDList, const std::list< IndexPair > &staGIDList)
virtual void initialize(const TIAParams &tia_params)=0
TimeIntegrationMethod * timeIntegrationMethod_
Pointer to the integration method.
bool isTimeIntegrationMethodCreated()
virtual void getTwoLevelError(TwoLevelError &tle) const =0
virtual void setTwoLevelTimeInfo()=0
double partialTimeDeriv() const
virtual bool printWaMPDEOutputSolution(Analysis::OutputMgrAdapter &outputManagerAdapter, const double time, Linear::Vector *solnVecPtr, const std::vector< double > &fastTimes, const int phiGID)
virtual void completeStep(const TIAParams &tia_params)=0
virtual int getUsedOrder() const =0
const char * getTimeIntegrationName(int type)
void obtainCorrectorDeriv()
TimeIntegrationMethod * createTimeIntegrationMethod(int type, const TIAParams &tia_params, StepErrorControl &step_error_control, DataStore &data_store)
virtual double partialTimeDeriv() const =0
void registerFactory(int type, const char *name, Factory factory)
void completeStep(const TIAParams &tia_params)
void getTwoLevelError(TwoLevelError &tle) const
void getInitialQnorm(TwoLevelError &tle) const
virtual void applyJacobian(const Linear::Vector &input, Linear::Vector &result)
bool printMPDEOutputSolution(Analysis::OutputMgrAdapter &outputManagerAdapter, const double time, Linear::Vector *solnVecPtr, const std::vector< double > &fastTimes)
void rejectStep(const TIAParams &tia_params)
virtual void obtainJacobian()
void loadFinalSensitivityDerivatives()
virtual void obtainPredictorDeriv()=0
virtual ~WorkingIntegrationMethod()
virtual void updateCoeffs()
virtual int getOrder() const =0
virtual bool printOutputSolution(Analysis::OutputMgrAdapter &outputManagerAdapter, const TIAParams &tia_params, const double time, Linear::Vector *solnVecPtr, const bool doNotInterpolate, const std::vector< double > &outputInterpolationTimes, bool skipPrintLineOutput)=0
WorkingIntegrationMethod(Stats::Stat parent_stat)
TimeIntegrationMethod *(* Factory)(const TIAParams &tia_params, StepErrorControl &step_error_control, DataStore &data_store)
void obtainSensitivityResiduals()
virtual void updateLeadCurrent()
void createTimeIntegMethod(int type, const TIAParams &tia_params, StepErrorControl &step_error_control, DataStore &data_store)
virtual int getNscsco() const =0
virtual void obtainResidual()=0
virtual double computeErrorEstimate() const =0
void obtainPredictorDeriv()
void rejectStepForHabanero()
bool saveOutputSolution(Parallel::Machine comm, IO::InitialConditionsManager &initial_conditions_manager, const NodeNameMap &node_name_map, const TIAParams &tia_params, Linear::Vector *solnVecPtr, const double saveTime, const bool doNotInterpolate)
void applyJacobian(const Linear::Vector &input, Linear::Vector &result)
virtual void loadFinalSensitivityDerivatives()=0
virtual int getNumberOfSteps() const =0
bool printWaMPDEOutputSolution(Analysis::OutputMgrAdapter &outputManagerAdapter, const double time, Linear::Vector *solnVecPtr, const std::vector< double > &fastTimes, const int phiGID)
bool printOutputSolution(Analysis::OutputMgrAdapter &outputManagerAdapter, const TIAParams &tia_params, const double time, Linear::Vector *solnVecPtr, const bool doNotInterpolate, const std::vector< double > &outputInterpolationTimes, bool skipPrintLineOutput)
void initialize(const TIAParams &tia_params)
virtual void obtainSensitivityResiduals()=0
virtual void rejectStep(const TIAParams &tia_params)=0
double computeErrorEstimate() const
virtual void updateStateDeriv()