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");
383 :
DeviceInstance(instance_block, configuration.getInstanceParameters(), factory_block),
393 APosEquPosNodeOffset(-1),
394 APosEquNegNodeOffset(-1),
395 APosEquXNodeOffset(-1),
396 ANegEquPosNodeOffset(-1),
397 ANegEquNegNodeOffset(-1),
398 ANegEquXNodeOffset(-1),
404 f_PosEquPosNodePtr(0),
405 f_PosEquNegNodePtr(0),
407 f_NegEquPosNodePtr(0),
408 f_NegEquNegNodePtr(0),
485 const std::vector<int> & intLIDVecRef,
486 const std::vector<int> & extLIDVecRef)
706 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
753 double v_pos = solVec[
li_Pos];
754 double v_neg = solVec[
li_Neg];
755 double x = solVec[
li_x];
763 Sacado::Fad::SFad<double,1> varX( 1, 0, x );
764 Sacado::Fad::SFad<double,1> paramRon(
model_.
ROn_ );
765 Sacado::Fad::SFad<double,1> paramRoff(
model_.
ROff_ );
766 Sacado::Fad::SFad<double,1> paramXon(
model_.
xOn_ );
767 Sacado::Fad::SFad<double,1> paramXoff(
model_.
xOff_ );
768 Sacado::Fad::SFad<double,1> resultFad;
772 ReffLin( varX, paramRon, paramRoff, paramXon, paramXoff, resultFad );
777 ReffNonLin( varX, paramRon, paramRoff, paramXon, paramXoff, resultFad );
779 Reff = resultFad.val();
792 Sacado::Fad::SFad<double,3> varVpos( 3, 0, v_pos);
793 Sacado::Fad::SFad<double,3> varVneg( 3, 1, v_neg);
794 Sacado::Fad::SFad<double,3> varX( 3, 2, x );
795 Sacado::Fad::SFad<double,3> parami(
i0 );
796 Sacado::Fad::SFad<double,3> paramG(
G );
797 Sacado::Fad::SFad<double,3> paramiOff(
model_.
iOff_ );
798 Sacado::Fad::SFad<double,3> paramiOn(
model_.
iOn_ );
799 Sacado::Fad::SFad<double,3> paramkOff(
model_.
kOff_ );
800 Sacado::Fad::SFad<double,3> paramkOn(
model_.
kOn_ );
803 Sacado::Fad::SFad<double,3> resultFad;
805 xVarFterm(varVpos, varVneg, varX, paramG, paramiOff, paramiOn, paramkOff, paramkOn,
806 paramAlphaOff, paramAlphaOn, resultFad);
809 Sacado::Fad::SFad<double,3> windowFunctionFad;
814 windowFunctionFad = 1.0;
818 Sacado::Fad::SFad<double,3> paramD(
model_.
D_ );
819 Sacado::Fad::SFad<double,3> paramP(
model_.
p_ );
824 Sacado::Fad::SFad<double,3> paramD(
model_.
D_ );
825 Sacado::Fad::SFad<double,3> paramP(
model_.
p_ );
830 Sacado::Fad::SFad<double,3> paramD(
model_.
D_ );
831 Sacado::Fad::SFad<double,3> paramP(
model_.
p_ );
832 Sacado::Fad::SFad<double,3> paramJ(
model_.
j_ );
837 Sacado::Fad::SFad<double,3> paramAOn(
model_.
aOn_ );
838 Sacado::Fad::SFad<double,3> paramAOff(
model_.
aOff_ );
839 Sacado::Fad::SFad<double,3> paramWc(
model_.
wc_ );
921 double x = solVec[
li_x];
1078 bool bsuccess =
true;
1138 (*it)->processParams();
1165 :
DeviceModel(model_block, configuration.getModelParameters(), factory_block),
1240 os <<
"Number of MemristorTEAM Instances: " <<
instanceContainer.size() << std::endl;
1241 os <<
" name model name Parameters" << std::endl;
1246 os <<
" " << i <<
": " << (*it)->getName() <<
"\t";
1249 os <<
"\tG(T) = " << (*it)->G;
1275 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1312 double v_pos = solVec[ri.
li_Pos];
1313 double v_neg = solVec[ri.
li_Neg];
1314 double x = solVec[ri.
li_x];
1322 Sacado::Fad::SFad<double,1> varX( 1, 0, x );
1323 Sacado::Fad::SFad<double,1> paramRon( ri.
model_.
ROn_ );
1324 Sacado::Fad::SFad<double,1> paramRoff( ri.
model_.
ROff_ );
1327 Sacado::Fad::SFad<double,1> resultFad;
1333 ReffLin( varX, paramRon, paramRoff, paramXon, paramXoff, resultFad );
1342 ReffNonLin( varX, paramRon, paramRoff, paramXon, paramXoff, resultFad );
1344 ri.
Reff = resultFad.val();
1353 ri.
G = 1.0/(ri.
Reff);
1354 ri.
i0 = (v_pos-v_neg)*ri.
G;
1359 Sacado::Fad::SFad<double,3> varVpos( 3, 0, v_pos);
1360 Sacado::Fad::SFad<double,3> varVneg( 3, 1, v_neg);
1361 Sacado::Fad::SFad<double,3> varX( 3, 2, x );
1362 Sacado::Fad::SFad<double,3> parami( ri.
i0 );
1363 Sacado::Fad::SFad<double,3> paramG( ri.
G );
1364 Sacado::Fad::SFad<double,3> paramiOff( ri.
model_.
iOff_ );
1365 Sacado::Fad::SFad<double,3> paramiOn( ri.
model_.
iOn_ );
1373 Sacado::Fad::SFad<double,3> resultFad;
1375 xVarFterm(varVpos, varVneg, varX, paramG, paramiOff, paramiOn, paramkOff, paramkOn,
1376 paramAlphaOff, paramAlphaOn, resultFad);
1379 Sacado::Fad::SFad<double,3> windowFunctionFad;
1384 windowFunctionFad = 1.0;
1388 Sacado::Fad::SFad<double,3> paramD( ri.
model_.
D_ );
1389 Sacado::Fad::SFad<double,3> paramP( ri.
model_.
p_ );
1394 Sacado::Fad::SFad<double,3> paramD( ri.
model_.
D_ );
1395 Sacado::Fad::SFad<double,3> paramP( ri.
model_.
p_ );
1400 Sacado::Fad::SFad<double,3> paramD( ri.
model_.
D_ );
1401 Sacado::Fad::SFad<double,3> paramP( ri.
model_.
p_ );
1402 Sacado::Fad::SFad<double,3> paramJ( ri.
model_.
j_ );
1417 ri.
dxFEqdVpos = windowFunctionFad.val()*resultFad.dx(0);
1418 ri.
dxFEqdVneg = windowFunctionFad.val()*resultFad.dx(1);
1419 ri.
dxFEqdx = windowFunctionFad.val()*resultFad.dx(2) + resultFad.val()*windowFunctionFad.dx(2) / (ri.
model_.
xScaling_);
1460 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ,
double * leadF,
double * leadQ,
double * junctionV)
1462 for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
1507 bool Master::loadDAEMatrices(Linear::Matrix & dFdx, Linear::Matrix & dQdx)
1509 for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
1513 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1582 .registerDevice(
"memristor", 2)
1583 .registerModelType(
"memristor", 2);
1594 void memristorTEAMSensitivity::operator()(
1596 const std::string & name,
1597 std::vector<double> & dfdp,
1598 std::vector<double> & dqdp,
1599 std::vector<double> & dbdp,
1600 std::vector<int> & Findices,
1601 std::vector<int> & Qindices,
1602 std::vector<int> & Bindices
1609 double v_pos = solVec[in->
li_Pos];
1610 double v_neg = solVec[in->
li_Neg];
1612 double dfdpLoc = -(v_pos-v_neg)*in->
G*in->
G;
1619 Findices[0] = in->
li_Pos;
1620 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
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
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
double * nextJunctionVCompRawPtr
static void loadInstanceParameters(ParametricData< Instance > &p)
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()
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()
double * f_PosEquXNodePtr
const SolverState & solverState_
Class Configuration contains device configuration data.
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.
virtual void forEachInstance(DeviceInstanceOp &op) const
virtual bool processParams()
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.
std::vector< Param > params
Linear::Matrix * dQdxMatrixPtr
virtual void setupPointers()
void BiolekWindowFunction(const ScalarT &w, const ScalarT &D, const ScalarT &p, const ScalarT &i, ScalarT &fval)
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
void setModParams(const std::vector< Param > ¶ms)
double * nextSolVectorRawPtr
int numLeadCurrentStoreVars