49 #include <Xyce_config.h>
57 #include <N_LAS_Matrix.h>
58 #include <N_UTL_FeatureTest.h>
63 namespace MemristorTEAM {
71 template <
typename ScalarT>
74 fval = 1.0 - pow( (2.0*(w/D) - 1.0), (2*p) );
78 template <
typename ScalarT>
79 void BiolekWindowFunction(
const ScalarT & w,
const ScalarT & D,
const ScalarT & p,
const ScalarT & i, ScalarT & fval )
81 ScalarT stp_of_i = 1.0;
84 fval = 1.0 - pow( ((w/D) - stp_of_i), (2*p) );
87 template <
typename ScalarT>
90 fval = j * (1.0 - pow( (pow( (w - 0.5), 2) -0.75), p ) );
98 template <
typename ScalarT>
99 void TEAMWindowFunctionF(
const ScalarT & x,
const ScalarT & i,
const ScalarT & aOff, ScalarT & aOn,
const ScalarT & wc, ScalarT & fval )
103 fval = exp( -exp( (x-aOff)/wc ) );
107 fval = exp( -exp( -(x-aOn)/wc ) );
141 template <
typename ScalarT>
142 void xVarFterm(
const ScalarT & Vpos,
const ScalarT & Vneg,
const ScalarT & x,
143 const ScalarT &
G,
const ScalarT & iOff,
const ScalarT & iOn,
144 const ScalarT & kOff,
const ScalarT & kOn,
145 const ScalarT & alphaOff,
const ScalarT & alphaOn, ScalarT & fval )
149 ScalarT i = G * (Vpos - Vneg);
153 fval=-kOff*pow( ((i/iOff) - 1.0), alphaOff );
157 fval=-kOn*pow( ((i/iOn) - 1.0), alphaOn);
159 if ( (i>iOn) && (i<iOff) )
167 template <
typename ScalarT>
168 void ReffLin(
const ScalarT & X,
const ScalarT & Ron,
const ScalarT & Roff,
const ScalarT & Xon,
const ScalarT & Xoff, ScalarT & fval )
171 fval = Ron + (X - Xon) * (Roff-Ron)/(Xoff - Xon);
175 template <
typename ScalarT>
176 void ReffNonLin(
const ScalarT & X,
const ScalarT & Ron,
const ScalarT & Roff,
const ScalarT & Xon,
const ScalarT & Xoff, ScalarT & fval )
179 ScalarT lambda = log(Roff/Ron);
181 fval = Ron * exp( (X - Xon) * lambda /(Xoff - Xon) );
278 .setDescription(
"IV relationship to use, 0 is linear, 1 is nonlinear");
306 .setDescription(
"Modeling Coefficient");
309 .setDescription(
"Modeling Coefficient");
312 .setDescription(
"Modeling Coefficient");
315 .setDescription(
"Modeling Coefficient");
318 .setDescription(
"Modeling Coefficient");
321 .setDescription(
"Modeling Coefficient");
324 .setDescription(
"Resistence in on state");
327 .setDescription(
"Resistence in off state");
330 .setDescription(
"Current scale in On state");
333 .setDescription(
"Current scale in off state");
336 .setDescription(
"Scaling for x variable. For example 1e9 if x will be in units of nanometers.");
340 .setDescription(
"Window Function Parameter (windows 1, 2 and 3)");
343 .setDescription(
"Window Function Parameter (windows 1, 2 and 3)");
346 .setDescription(
"Window Function Parameter (window 3)");
350 .setDescription(
"Window Function Parameter (window 4)");
353 .setDescription(
"Window Function Parameter (window 4)");
357 .setDescription(
"Window Function Parameter (window 4)");
361 .setDescription(
"Type of windowing function: 0-None, 1-Jogelkar, 2-Biolek, 3-Prodromakis, 4-Kvatinsky");
365 .setDescription(
"RTN model in resistance (on/off)" );
369 .setDescription(
"RTN model in resistance: seed" );
373 .setDescription(
"RTN model: lambda" );
377 .setDescription(
"RTN model in resistance: Update time" );
381 .setDescription(
"RTN model in resistance: Minimum allowed update time" );
385 .setDescription(
"RTN model in resistance: Base change in resistance for RTN" );
389 .setDescription(
"RTN model in resistance: Base change in resistance for RTN scaled by R" );
410 :
DeviceInstance(instance_block, configuration.getInstanceParameters(), factory_block),
415 resNoiseLastUpdateStep(0),
416 resNoiseLastUpdateTime(0.0),
417 resNoiseNextUpdateTime(0.0),
418 resNoiseHiLoState(0),
419 resNoiseRfactor(1.0),
427 APosEquPosNodeOffset(-1),
428 APosEquNegNodeOffset(-1),
429 APosEquXNodeOffset(-1),
430 ANegEquPosNodeOffset(-1),
431 ANegEquNegNodeOffset(-1),
432 ANegEquXNodeOffset(-1),
438 f_PosEquPosNodePtr(0),
439 f_PosEquNegNodePtr(0),
441 f_NegEquPosNodePtr(0),
442 f_NegEquNegNodePtr(0),
533 const std::vector<int> & intLIDVecRef,
534 const std::vector<int> & extLIDVecRef)
756 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
803 double v_pos = solVec[
li_Pos];
804 double v_neg = solVec[
li_Neg];
805 double x = solVec[
li_x];
813 Sacado::Fad::SFad<double,1> varX( 1, 0, x );
814 Sacado::Fad::SFad<double,1> paramRon(
model_.
ROn_ );
815 Sacado::Fad::SFad<double,1> paramRoff(
model_.
ROff_ );
816 Sacado::Fad::SFad<double,1> paramXon(
model_.
xOn_ );
817 Sacado::Fad::SFad<double,1> paramXoff(
model_.
xOff_ );
818 Sacado::Fad::SFad<double,1> resultFad;
822 ReffLin( varX, paramRon, paramRoff, paramXon, paramXoff, resultFad );
827 ReffNonLin( varX, paramRon, paramRoff, paramXon, paramXoff, resultFad );
829 Reff = resultFad.val();
845 G=1.0/(rfactor*
Reff);
851 Sacado::Fad::SFad<double,3> varVpos( 3, 0, v_pos);
852 Sacado::Fad::SFad<double,3> varVneg( 3, 1, v_neg);
853 Sacado::Fad::SFad<double,3> varX( 3, 2, x );
854 Sacado::Fad::SFad<double,3> parami(
i0 );
855 Sacado::Fad::SFad<double,3> paramG(
G );
856 Sacado::Fad::SFad<double,3> paramiOff(
model_.
iOff_ );
857 Sacado::Fad::SFad<double,3> paramiOn(
model_.
iOn_ );
858 Sacado::Fad::SFad<double,3> paramkOff(
model_.
kOff_ );
859 Sacado::Fad::SFad<double,3> paramkOn(
model_.
kOn_ );
862 Sacado::Fad::SFad<double,3> resultFad;
864 xVarFterm(varVpos, varVneg, varX, paramG, paramiOff, paramiOn, paramkOff, paramkOn,
865 paramAlphaOff, paramAlphaOn, resultFad);
868 Sacado::Fad::SFad<double,3> windowFunctionFad;
873 windowFunctionFad = 1.0;
877 Sacado::Fad::SFad<double,3> paramD(
model_.
D_ );
878 Sacado::Fad::SFad<double,3> paramP(
model_.
p_ );
883 Sacado::Fad::SFad<double,3> paramD(
model_.
D_ );
884 Sacado::Fad::SFad<double,3> paramP(
model_.
p_ );
889 Sacado::Fad::SFad<double,3> paramD(
model_.
D_ );
890 Sacado::Fad::SFad<double,3> paramP(
model_.
p_ );
891 Sacado::Fad::SFad<double,3> paramJ(
model_.
j_ );
896 Sacado::Fad::SFad<double,3> paramAOn(
model_.
aOn_ );
897 Sacado::Fad::SFad<double,3> paramAOff(
model_.
aOff_ );
898 Sacado::Fad::SFad<double,3> paramWc(
model_.
wc_ );
980 double x = solVec[
li_x];
1137 bool bsuccess =
true;
1197 (*it)->processParams();
1224 :
DeviceModel(model_block, configuration.getModelParameters(), factory_block),
1231 randomResNoiseOn_(false),
1232 randomResNoiseSeed_(0),
1233 randomResNoiseLambda_(0.0),
1234 randomResNoiseMean_(0.0),
1235 randomResNoiseSD_(0.0),
1236 randomResUpdateTime_(0.0),
1237 randomResEpsilonUpdateTime_(0.0),
1238 randomResDelta_(0.0),
1239 randomResDeltaGrad_(0.0)
1320 os <<
"Number of MemristorTEAM Instances: " <<
instanceContainer.size() << std::endl;
1321 os <<
" name model name Parameters" << std::endl;
1326 os <<
" " << i <<
": " << (*it)->getName() <<
"\t";
1329 os <<
"\tG(T) = " << (*it)->G;
1355 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1392 double v_pos = solVec[ri.
li_Pos];
1393 double v_neg = solVec[ri.
li_Neg];
1394 double x = solVec[ri.
li_x];
1402 Sacado::Fad::SFad<double,1> varX( 1, 0, x );
1407 Sacado::Fad::SFad<double,1> resultFad;
1413 ReffLin( varX, paramRon, paramRoff, paramXon, paramXoff, resultFad );
1422 ReffNonLin( varX, paramRon, paramRoff, paramXon, paramXoff, resultFad );
1424 ri.
Reff = resultFad.val();
1433 ri.
G = 1.0/(ri.
Reff);
1434 ri.
i0 = (v_pos-v_neg)*ri.
G;
1477 Sacado::Fad::SFad<double,1> varX( 1, 0, x );
1482 Sacado::Fad::SFad<double,1> resultFad;
1488 ReffLin( varX, paramRon, paramRoff, paramXon, paramXoff, resultFad );
1497 ReffNonLin( varX, paramRon, paramRoff, paramXon, paramXoff, resultFad );
1499 ri.
Reff = resultFad.val();
1508 ri.
G = 1.0/(ri.
Reff);
1509 ri.
i0 = (v_pos-v_neg)*ri.
G;
1520 Sacado::Fad::SFad<double,3> varVpos( 3, 0, v_pos);
1521 Sacado::Fad::SFad<double,3> varVneg( 3, 1, v_neg);
1522 Sacado::Fad::SFad<double,3> varX( 3, 2, x );
1523 Sacado::Fad::SFad<double,3> parami( ri.
i0 );
1524 Sacado::Fad::SFad<double,3> paramG( ri.
G );
1525 Sacado::Fad::SFad<double,3> paramiOff( ri.
model_.
iOff_ );
1526 Sacado::Fad::SFad<double,3> paramiOn( ri.
model_.
iOn_ );
1534 Sacado::Fad::SFad<double,3> resultFad;
1536 xVarFterm(varVpos, varVneg, varX, paramG, paramiOff, paramiOn, paramkOff, paramkOn,
1537 paramAlphaOff, paramAlphaOn, resultFad);
1540 Sacado::Fad::SFad<double,3> windowFunctionFad;
1545 windowFunctionFad = 1.0;
1549 Sacado::Fad::SFad<double,3> paramD( ri.
model_.
D_ );
1550 Sacado::Fad::SFad<double,3> paramP( ri.
model_.
p_ );
1555 Sacado::Fad::SFad<double,3> paramD( ri.
model_.
D_ );
1556 Sacado::Fad::SFad<double,3> paramP( ri.
model_.
p_ );
1561 Sacado::Fad::SFad<double,3> paramD( ri.
model_.
D_ );
1562 Sacado::Fad::SFad<double,3> paramP( ri.
model_.
p_ );
1563 Sacado::Fad::SFad<double,3> paramJ( ri.
model_.
j_ );
1578 ri.
dxFEqdVpos = windowFunctionFad.val()*resultFad.dx(0);
1579 ri.
dxFEqdVneg = windowFunctionFad.val()*resultFad.dx(1);
1580 ri.
dxFEqdx = windowFunctionFad.val()*resultFad.dx(2) + resultFad.val()*windowFunctionFad.dx(2) / (ri.
model_.
xScaling_);
1621 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ,
double * leadF,
double * leadQ,
double * junctionV)
1674 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1743 .registerDevice(
"memristor", 2)
1744 .registerModelType(
"memristor", 2);
1757 const std::string & name,
1758 std::vector<double> & dfdp,
1759 std::vector<double> & dqdp,
1760 std::vector<double> & dbdp,
1761 std::vector<int> & Findices,
1762 std::vector<int> & Qindices,
1763 std::vector<int> & Bindices
1770 double v_pos = solVec[in->
li_Pos];
1771 double v_neg = solVec[in->
li_Neg];
1773 double dfdpLoc = -(v_pos-v_neg)*in->
G*in->
G;
1780 Findices[0] = in->
li_Pos;
1781 Findices[1] = in->
li_Neg;
const InstanceName & getName() const
bool updateDependentParameters()
double * f_XEquNegNodePtr
const DeviceOptions & deviceOptions_
Descriptor & addPar(const char *parName, T default_value, T U::*varPtr)
Adds the parameter description to the parameter map.
double * daeQVectorRawPtr
virtual void registerStoreLIDs(const std::vector< int > &stoLIDVecRef)
double * f_PosEquNegNodePtr
virtual bool loadDAEMatrices(Linear::Matrix &dFdx, Linear::Matrix &dQdx)
Populates the device's Jacobian object with these pointers.
void G(const ScalarT &V1, const ScalarT &V2, const ScalarT &Ap, const ScalarT &An, ScalarT &Vp, ScalarT &Vn, ScalarT &fval)
Pure virtual class to augment a linear system.
virtual bool loadDAEFVector()
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
double * f_NegEquXNodePtr
virtual void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
void setNumStoreVars(int num_store_vars)
void addBranchDataNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
InstanceVector::const_iterator getInstanceEnd() const
Returns an iterator to the ending of the vector of all instances created for this device...
Base class for all parameters.
virtual std::ostream & printOutInstances(std::ostream &os) const
int resNoiseLastUpdateStep
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
double randomResUpdateTime_
double randomResEpsilonUpdateTime_
double * nextJunctionVCompRawPtr
static void loadInstanceParameters(ParametricData< Instance > &p)
virtual void operator()(const ParameterBase &entity, const std::string &name, std::vector< double > &dfdp, std::vector< double > &dqdp, std::vector< double > &dbdp, std::vector< int > &Findices, std::vector< int > &Qindices, std::vector< int > &Bindices) const
virtual bool loadDAEQVector()
int getNumStoreVars() const
InstanceVector::const_iterator getInstanceBegin() const
Returns an iterator to the beginning of the vector of all instances created for this device...
std::vector< Param > params
Parameters from the line.
void JogelkarWindowFunction(const ScalarT &w, const ScalarT &D, const ScalarT &p, ScalarT &fval)
void setParams(const std::vector< Param > ¶ms)
const std::string & getName() const
double * daeFVectorRawPtr
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
static void initializeJacobianStamp()
double resNoiseNextUpdateTime
double resNoiseLastUpdateTime
virtual void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
void xVarFterm(const ScalarT &Vpos, const ScalarT &Vneg, const ScalarT &x, const ScalarT &G, const ScalarT &iOff, const ScalarT &iOn, const ScalarT &kOff, const ScalarT &kOn, const ScalarT &alphaOff, const ScalarT &alphaOn, ScalarT &fval)
InstanceVector instanceContainer
int numBranchDataVarsIfAllocated
Instance(const Configuration &configuration, const InstanceBlock &instance_block, Model &model, const FactoryBlock &factory_block)
virtual bool loadDAEdFdx()
double * f_PosEquPosNodePtr
void ProdromakisWindowFunction(const ScalarT &w, const ScalarT &D, const ScalarT &p, const ScalarT &j, ScalarT &fval)
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
Linear::Matrix * dFdxMatrixPtr
virtual bool updateIntermediateVars()
void ReffLin(const ScalarT &X, const ScalarT &Ron, const ScalarT &Roff, const ScalarT &Xon, const ScalarT &Xoff, ScalarT &fval)
virtual bool processInstanceParams()
processInstanceParams
The Device class is an interface for device implementations.
double * f_XEquPosNodePtr
void addStoreNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
virtual bool updateTemperature(const double &temp_tmp)
virtual bool updatePrimaryState()
int timeStepNumber_
Memristor, LTRA, TRA, testing if debug or jacobian for testing.
double * f_PosEquXNodePtr
const SolverState & solverState_
Class Configuration contains device configuration data.
virtual bool loadDAEVectors(double *solVec, double *fVec, double *qVec, double *bVec, double *storeLeadF, double *storeLeadQ, double *leadF, double *leadQ, double *junctionV)
Populates the device's ExternData object with these pointers.
double * f_NegEquNegNodePtr
virtual void registerBranchDataLIDs(const std::vector< int > &branchLIDVecRef)
virtual bool updateState(double *solVec, double *staVec, double *stoVec)
Updates the devices state information.
double randomResDeltaGrad_
virtual void forEachInstance(DeviceInstanceOp &op) const
virtual bool processParams()
double randomResNoiseMean_
const SolverState & getSolverState() const
double * nextLeadCurrFCompRawPtr
virtual void registerStateLIDs(const std::vector< int > &staLIDVecRef)
void setNumBranchDataVars(int num_branch_data_vars)
void ReffNonLin(const ScalarT &X, const ScalarT &Ron, const ScalarT &Roff, const ScalarT &Xon, const ScalarT &Xoff, ScalarT &fval)
static void loadModelParameters(ParametricData< Model > &p)
#define Xyce_NONPOINTER_MATRIX_LOAD
double * f_NegEquPosNodePtr
static std::vector< std::vector< int > > jacStamp
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
const ExternData & extData
ModelBlock represents a .MODEL line from the netlist.
Manages parameter binding for class C.
InstanceBlock represent a device instance line from the netlist.
double currTime_
DeviceEntity for expression time, breakpoints DeviceMgr for dependent parameters, breakpoints...
std::vector< Param > params
Xyce::Util::RandomNumbers * randomNumberGen_
Linear::Matrix * dQdxMatrixPtr
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
virtual void setupPointers()
void BiolekWindowFunction(const ScalarT &w, const ScalarT &D, const ScalarT &p, const ScalarT &i, ScalarT &fval)
double randomResNoiseLambda_
void TEAMWindowFunctionF(const ScalarT &x, const ScalarT &i, const ScalarT &aOff, ScalarT &aOn, const ScalarT &wc, ScalarT &fval)
virtual bool loadDAEdQdx()
int getNumBranchDataVars() const
virtual bool processParams()
processParams
const SolverState & getSolverState() const
Returns the solver state given during device construction.
void setModParams(const std::vector< Param > ¶ms)
double * nextSolVectorRawPtr
int numLeadCurrentStoreVars