Xyce  6.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
N_DEV_ISRC.C
Go to the documentation of this file.
1 //-----------------------------------------------------------------------------
2 // Copyright Notice
3 //
4 // Copyright 2002 Sandia Corporation. Under the terms
5 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S.
6 // Government retains certain rights in this software.
7 //
8 // Xyce(TM) Parallel Electrical Simulator
9 // Copyright (C) 2002-2014 Sandia Corporation
10 //
11 // This program is free software: you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation, either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program. If not, see <http://www.gnu.org/licenses/>.
23 //-----------------------------------------------------------------------------
24 
25 //-------------------------------------------------------------------------
26 // Filename : $RCSfile: N_DEV_ISRC.C,v $
27 //
28 // Purpose : Independent current source
29 //
30 // Special Notes :
31 //
32 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
33 //
34 // Creation Date : 02/28/00
35 //
36 // Revision Information:
37 // ---------------------
38 //
39 // Revision Number: $Revision: 1.169.2.2 $
40 //
41 // Revision Date : $Date: 2014/03/06 23:33:43 $
42 //
43 // Current Owner : $Author: tvrusso $
44 //-------------------------------------------------------------------------
45 
46 #include <Xyce_config.h>
47 
48 
49 // ---------- Standard Includes ----------
50 #ifdef HAVE_CSTDIO
51 #include <cstdio>
52 #else
53 #include <stdio.h>
54 #endif
55 
56 // ---------- Xyce Includes ----------
57 #include <N_DEV_DeviceOptions.h>
58 #include <N_DEV_ExternData.h>
59 #include <N_DEV_ISRC.h>
60 #include <N_DEV_MatrixLoadData.h>
61 #include <N_DEV_SolverState.h>
62 #include <N_DEV_SourceData.h>
63 #include <N_DEV_Message.h>
64 #include <N_ERH_ErrorMgr.h>
65 
66 #include <N_LAS_Vector.h>
67 #include <N_LAS_Matrix.h>
68 
69 namespace Xyce {
70 namespace Device {
71 namespace ISRC {
72 
74 {
75  // DC parameters
76  p.addPar ("DCV0", 0.0, &ISRC::Instance::DCV0)
77  .setOriginalValueStored(true)
78  .setUnit(U_VOLT)
79  .setDescription("DC Current");
80 
81  // Pulse parameters
82  p.addPar ("V0", 0.0, &ISRC::Instance::par0)
83  .setUnit(U_AMP)
84  .setDescription("Offset Current");
85 
86  p.addPar ("V1", 0.0, &ISRC::Instance::par0)
87  .setUnit(U_AMP)
88  .setDescription("Initial Current");
89 
90  p.addPar ("V2", 0.0, &ISRC::Instance::par1)
91  .setUnit(U_AMP)
92  .setDescription("Pulsed Current");
93 
94  p.addPar ("TD", 0.0, &ISRC::Instance::par2)
95  .setUnit(U_SECOND)
96  .setDescription("Delay");
97 
98  p.addPar ("TR", 0.0, &ISRC::Instance::par3)
99  .setUnit(U_SECOND)
100  .setDescription("Rise Time");
101 
102  p.addPar ("TF", 0.0, &ISRC::Instance::par4)
103  .setUnit(U_SECOND)
104  .setDescription("Fall Time");
105 
106  p.addPar ("PW", 0.0, &ISRC::Instance::par5)
107  .setUnit(U_SECOND)
108  .setDescription("Pulse Width");
109 
110  p.addPar ("PER", 0.0, &ISRC::Instance::par6)
111  .setUnit(U_SECOND)
112  .setDescription("Period");
113 
114  p.addPar ("SF", 0.0, &ISRC::Instance::par7)
115  .setDescription("Scale Factor -- smooth pulse only");
116 
117  // Sin parameters
118  p.addPar ("VA", 0.0, &ISRC::Instance::par1)
119  .setUnit(U_AMP)
120  .setDescription("Amplitude");
121 
122  p.addPar ("FREQ", 0.0, &ISRC::Instance::par3)
123  .setUnit(U_SECM1)
124  .setDescription("Frequency");
125 
126  p.addPar ("THETA", 0.0, &ISRC::Instance::par4)
127  .setDescription("Theta");
128 
129  p.addPar ("PHASE", 0.0, &ISRC::Instance::par5)
130  .setDescription("Phase");
131 
132  // Exp parameters
133  p.addPar ("TD1", 0.0, &ISRC::Instance::par2)
134  .setUnit(U_SECOND)
135  .setDescription("Rise Delay Time");
136 
137  p.addPar ("TAU1", 0.0, &ISRC::Instance::par3)
138  .setUnit(U_SECOND)
139  .setDescription("Rise Time Constant");
140 
141  p.addPar ("TD2", 0.0, &ISRC::Instance::par4)
142  .setUnit(U_SECOND)
143  .setDescription("Fall Delay Time");
144 
145  p.addPar ("TAU2", 0.0, &ISRC::Instance::par5)
146  .setUnit(U_SECOND)
147  .setDescription("Fall Time Constant");
148 
149  // AC parameters
150  p.addPar ("ACMAG", 0.0, &ISRC::Instance::ACMAG)
151  .setUnit(U_VOLT)
152  .setDescription("Amplitude");
153 
154  p.addPar ("ACPHASE", 0.0, &ISRC::Instance::ACPHASE)
155  .setDescription("Phase");
156 
157  // SFFM parameters
158  p.addPar ("FC", 0.0, &ISRC::Instance::par2)
159  .setUnit(U_SECM1)
160  .setDescription("Carrier Frequency");
161 
162  p.addPar ("FS", 0.0, &ISRC::Instance::par4)
163  .setUnit(U_SECM1)
164  .setDescription("Signal Frequency");
165 
166  p.addPar ("MDI", 0.0, &ISRC::Instance::par3)
167  .setDescription("Modulation Index");
168 
169  // PWL params
170  p.addPar ("R", 0.0, &ISRC::Instance::REPEATTIME)
171  .setUnit(U_SECOND)
172  .setDescription("Repeat Time");
173 
174  p.addPar ("REPEATTIME", 0.0, &ISRC::Instance::REPEATTIME)
175  .setUnit(U_SECOND)
176  .setDescription("Repeat Time");
177 
178  p.addPar ("T", 0.0, &ISRC::Instance::T)
179  .setUnit(U_SECOND)
180  .setDescription("Time"); // time-voltage pairs
181 
182  p.addPar ("V", 0.0, &ISRC::Instance::V)
183  .setUnit(U_AMP)
184  .setDescription("Current"); // time-voltage pairs
185 
186  // Set up non-double precision variables:
187  p.addPar ("TRANSIENTSOURCETYPE", (int)_DC_DATA, &ISRC::Instance::TRANSIENTSOURCETYPE)
189 
190  p.addPar ("ACSOURCETYPE", (int) _AC_DATA, &ISRC::Instance::ACSOURCETYPE)
191  .setGivenMember(&ISRC::Instance::ACSOURCETYPEgiven);
192 
193  p.addPar ("DCSOURCETYPE", (int) _DC_DATA, &ISRC::Instance::DCSOURCETYPE)
194  .setGivenMember(&ISRC::Instance::DCSOURCETYPEgiven);
195 
196  p.addPar ("NUM", 0, &ISRC::Instance::NUM);
197 
198  p.addPar ("REPEAT", false, &ISRC::Instance::REPEAT);
199 }
200 
202 {
203 }
204 
205 
206 std::vector< std::vector<int> > Instance::jacStamp;
207 
208 //-----------------------------------------------------------------------------
209 // Function : Instance::Instance
210 // Purpose : instance block constructor
211 // Special Notes :
212 // Scope : public
213 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
214 // Creation Date : 04/06/00
215 //-----------------------------------------------------------------------------
217  const Configuration & configuration,
218  const InstanceBlock & instance_block,
219  Model & model,
220  const FactoryBlock & factory_block)
221  : SourceInstance(instance_block, configuration.getInstanceParameters(), factory_block),
222  model_(model),
223  li_Pos(-1),
224  li_Neg(-1),
225  li_store_dev_i(-1),
226  DCV0(0.0),
227  par0(0.0),
228  par1(0.0),
229  par2(0.0),
230  par3(0.0),
231  par4(0.0),
232  par5(0.0),
233  par6(0.0),
234  par7(0.0),
235  REPEATTIME(),
236  T(0.0),
237  V(0.0),
238  ACMAG(1.0),
239  ACPHASE(0.0),
240  NUM(0),
241  REPEAT(false),
242  TRANSIENTSOURCETYPE(_DC_DATA),
243  TRANSIENTSOURCETYPEgiven(false),
244  ACSOURCETYPE(_AC_DATA),
245  ACSOURCETYPEgiven(false),
246  DCSOURCETYPE(_AC_DATA),
247  DCSOURCETYPEgiven(false),
248  gotParams(false)
249 {
250  numIntVars = 0;
251  numExtVars = 2;
252  numStateVars = 0;
253  numLeadCurrentStoreVars = 1; // lead current DEV_I
254 
255  if( jacStamp.empty() )
256  jacStamp.resize(2);
257 
258  // Set params to constant default values:
259  setDefaultParams ();
260 
261  // Set params according to instance line and constant defaults from metadata:
262  setParams (instance_block.params);
263 
264  // Set any non-constant parameter defaults:
265 
266  if (getSolverState().ACspecified && ACSOURCETYPEgiven)
267  {
268  acData_ptr = new ACData (instance_block.params,getSolverState(),getDeviceOptions());
269  }
270 
271  if (DCSOURCETYPEgiven) // this will always be given, if the source spec was valid.
272  {
273  dcData_ptr = new ConstData (instance_block.params,getSolverState(),getDeviceOptions());
274  }
275 
276  if (getSolverState().HBspecified || TRANSIENTSOURCETYPEgiven)
277  {
278  switch (TRANSIENTSOURCETYPE)
279  {
280  case _SIN_DATA:
281  Data_ptr = new SinData (instance_block.params,getSolverState(),getDeviceOptions());
282  break;
283 
284  case _EXP_DATA:
285  Data_ptr = new ExpData (instance_block.params,getSolverState(),getDeviceOptions());
286  break;
287 
288  case _PULSE_DATA:
289  Data_ptr = new PulseData (instance_block.params,getSolverState(),getDeviceOptions());
290  break;
291 
292  case _PWL_DATA:
293  Data_ptr = new PWLinData (instance_block.params,getSolverState(),getDeviceOptions());
294  break;
295 
296  case _SFFM_DATA:
297  Data_ptr = new SFFMData (instance_block.params,getSolverState(),getDeviceOptions());
298  break;
299 
300  case _DC_DATA:
301  Data_ptr = new ConstData (instance_block.params,getSolverState(),getDeviceOptions());
302  break;
303 
304  case _SMOOTH_PULSE_DATA:
306  break;
307 
308 // case _AC_DATA:
309 // Data_ptr = new ACData (instance_block.params,getSolverState(),getDeviceOptions());
310 // break;
311 
312  default:
313  UserError0(*this) << "Cannot identify source data type for " << getName();
314  break;
315  }
316  }
317 
318  processParams();
319 
320  // Calculate any parameters specified as expressions:
321 
323  processParams();
324 
325  // calculate dependent (ie computed) params and check for errors:
326 
327 
328 }
329 
330 //-----------------------------------------------------------------------------
331 // Function : Instance::processParams
332 // Purpose :
333 // Special Notes :
334 // Scope : public
335 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
336 // Creation Date : 04/06/00
337 //-----------------------------------------------------------------------------
339 {
340  if (gotParams)
341  {
342  if (dcData_ptr != 0)
343  {
345  }
346  if (acData_ptr != 0)
347  {
349  }
350  if (Data_ptr != 0)
351  {
353  }
354  }
355  else
356  {
357  if (dcData_ptr != 0)
358  {
360  }
361  if (acData_ptr != 0)
362  {
364  }
365  if (Data_ptr != 0)
366  {
368  }
369  gotParams = true;
370  }
371 
372  return true;
373 }
374 
375 //-----------------------------------------------------------------------------
376 // Function : Instance::~Instance
377 // Purpose : destructor
378 // Special Notes :
379 // Scope : public
380 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
381 // Creation Date : 04/06/00
382 //-----------------------------------------------------------------------------
384 {
385  if (Data_ptr != 0)
386  {
387  delete Data_ptr;
388  }
389  if (acData_ptr != 0)
390  {
391  delete acData_ptr;
392  }
393  if (dcData_ptr != 0)
394  {
395  delete dcData_ptr;
396  }
397 }
398 
399 // additional Declarations
400 //-----------------------------------------------------------------------------
401 // Function : Instance::registerLIDs
402 // Purpose :
403 // Special Notes :
404 // Scope : public
405 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
406 // Creation Date : 6/20/02
407 //-----------------------------------------------------------------------------
408 void Instance::registerLIDs( const std::vector<int> & intLIDVecRef,
409  const std::vector<int> & extLIDVecRef)
410 {
411  AssertLIDs(intLIDVecRef.size() == numIntVars);
412  AssertLIDs(extLIDVecRef.size() == numExtVars);
413 
414 #ifdef Xyce_DEBUG_DEVICE
415  if (getDeviceOptions().debugLevel > 0 )
416  {
417  Xyce::dout() << std::endl << section_divider << std::endl;
418  Xyce::dout() << " ISRCInstance::registerLIDs" << std::endl;
419  Xyce::dout() << " name = " << getName() << std::endl;
420  }
421 #endif
422 
423  intLIDVec = intLIDVecRef;
424  extLIDVec = extLIDVecRef;
425 
426  // Now use these lists to obtain the indices into the
427  // linear algebra entities. This assumes an order. Note that
428  // for a current source, there will be no Jacobian entries.
429 
430  li_Pos = extLIDVec[0];
431  li_Neg = extLIDVec[1];
432 
433 #ifdef Xyce_DEBUG_DEVICE
434  if (getDeviceOptions().debugLevel > 0 )
435  {
436  Xyce::dout() << " li_Pos = " << li_Pos << std::endl;
437  Xyce::dout() << " li_Neg = " << li_Neg << std::endl;
438  Xyce::dout() << section_divider << std::endl;
439  }
440 #endif
441 
442 }
443 
444 //-----------------------------------------------------------------------------
445 // Function : Instance::registerStateLIDs
446 // Purpose :
447 // Special Notes :
448 // Scope : public
449 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
450 // Creation Date : 6/20/02
451 //-----------------------------------------------------------------------------
452 void Instance::registerStateLIDs(const std::vector<int> & staLIDVecRef )
453 {
454  AssertLIDs(staLIDVecRef.size() == numStateVars);
455 }
456 
457 //-----------------------------------------------------------------------------
458 // Function : Instance::registerStoreLIDs
459 // Purpose : One store var for device current.
460 // Special Notes :
461 // Scope : public
462 // Creator : Richard Schiek, Electrical Systems Modeling
463 // Creation Date : 03/27/2013
464 //-----------------------------------------------------------------------------
465 void Instance::registerStoreLIDs(const std::vector<int> & stoLIDVecRef )
466 {
467  AssertLIDs(stoLIDVecRef.size() == getNumStoreVars());
468 
469  if( loadLeadCurrent )
470  {
471  li_store_dev_i = stoLIDVecRef[0];
472  }
473 }
474 
475 
476 //-----------------------------------------------------------------------------
477 // Function : Instance::getStoreNameMap
478 // Purpose :
479 // Special Notes :
480 // Scope : public
481 // Creator : Richard Schiek, Electrical Systems Modeling
482 // Creation Date : 03/27/2013
483 //-----------------------------------------------------------------------------
484 std::map<int,std::string> & Instance::getStoreNameMap ()
485 {
486  // set up the internal name map, if it hasn't been already.
487  if( loadLeadCurrent && storeNameMap.empty ())
488  {
489  // change subcircuitname:devicetype_deviceName to
490  // devicetype:subcircuitName:deviceName
491  std::string modName(getName());
492  spiceInternalName(modName);
493  std::string tmpstr;
494  tmpstr = modName+":DEV_I";
495  storeNameMap[ li_store_dev_i ] = tmpstr;
496  }
497 
498  return storeNameMap;
499 }
500 
501 
502 //-----------------------------------------------------------------------------
503 // Function : Instance::jacobianStamp
504 // Purpose :
505 // Special Notes :
506 // Scope : public
507 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
508 // Creation Date : 9/5/2
509 //-----------------------------------------------------------------------------
510 const std::vector< std::vector<int> > & Instance::jacobianStamp() const
511 {
512  return jacStamp;
513 }
514 
515 //-----------------------------------------------------------------------------
516 // Function : Instance::loadBVectorsforAC
517 //
518 // Purpose : Loads the B-vector contributions for a single
519 // isrc instance.
520 //
521 // Special Notes :
522 //
523 // Scope : public
524 // Creator : Ting Mei, SNL
525 // Creation Date : 5/11
526 //-----------------------------------------------------------------------------
527 bool Instance::loadBVectorsforAC(double * bVecReal, double * bVecImag )
528 {
529  if (acData_ptr != 0)
530  {
531  bool flag = true;
532  acData_ptr->setRealFlag(flag);
533 
535  double source = acData_ptr->returnSource();
536 
537  bVecReal[li_Pos] -= source;
538  bVecReal[li_Neg] += source;
539 
540  flag = false;
541  acData_ptr->setRealFlag(flag);
542 
544  source = acData_ptr->returnSource();
545 
546  bVecImag[li_Pos] -= source;
547  bVecImag[li_Neg] += source;
548  }
549 
550  return true;
551 }
552 
553 //-----------------------------------------------------------------------------
554 // Function : Instance::updatePrimaryState
555 // Purpose :
556 // Special Notes :
557 // Scope : public
558 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
559 // Creation Date : 01/29/01
560 //-----------------------------------------------------------------------------
562 {
563  return true;
564 }
565 
566 //-----------------------------------------------------------------------------
567 // Function : Instance::loadDAEFVector
568 // Purpose : Loads the F-vector contributions for a single
569 // ISRC instance.
570 // Special Notes : Does nothing.
571 // Scope : public
572 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
573 // Creation Date : 03/05/04
574 //-----------------------------------------------------------------------------
576 {
577  bool bsuccess = true;
578 
579  double * fVec = extData.daeFVectorRawPtr;
580 
581  // get the source value:
582  SourceData *dataPtr = dcData_ptr; // by default assume the DC value.
583  if ( (getSolverState().HBspecified || getSolverState().tranopFlag || getSolverState().transientFlag) && Data_ptr != 0 )
584  {
585  dataPtr = Data_ptr;
586  }
587 
588  double source = 0.0;
589  if (dataPtr != 0)
590  {
591  source = dataPtr->returnSource();
592  }
593  fVec[li_Pos] += source;
594  fVec[li_Neg] -= source;
595 
596  if( loadLeadCurrent )
597  {
598  double * stoVec = extData.nextStoVectorRawPtr;
599  stoVec[li_store_dev_i] = source;
600  }
601 
602  return bsuccess;
603 }
604 
605 
606 //-----------------------------------------------------------------------------
607 // Function : Model::Model
608 // Purpose : copy constructor
609 // Special Notes :
610 // Scope : public
611 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
612 // Creation Date : 04/06/00
613 //-----------------------------------------------------------------------------
615  const Configuration & configuration,
616  const ModelBlock & MB,
617  const FactoryBlock & factory_block)
618  : DeviceModel(MB, configuration.getModelParameters(), factory_block)
619 {
620 
621 }
622 
623 //-----------------------------------------------------------------------------
624 // Function : Model::~Model
625 // Purpose : destructor
626 // Special Notes :
627 // Scope : public
628 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
629 // Creation Date : 04/06/00
630 //-----------------------------------------------------------------------------
632 {
633  std::vector<Instance*>::iterator iter;
634  std::vector<Instance*>::iterator first = instanceContainer.begin();
635  std::vector<Instance*>::iterator last = instanceContainer.end();
636 
637  for (iter=first; iter!=last; ++iter)
638  {
639  delete (*iter);
640  }
641 }
642 
643 // additional Declarations
644 
645 //----------------------------------------------------------------------------
646 // Function : Model::processParams
647 // Purpose :
648 // Special Notes :
649 // Scope : public
650 // Creator : Lon Waters
651 // Creation Date : 07/29/2002
652 //----------------------------------------------------------------------------
654 {
655  return true;
656 }
657 
658 //----------------------------------------------------------------------------
659 // Function : Model::processInstanceParams
660 // Purpose :
661 // Special Notes :
662 // Scope : public
663 // Creator : Dave Shirely, PSSI
664 // Creation Date : 03/23/06
665 //----------------------------------------------------------------------------
667 {
668 
669  std::vector<Instance*>::iterator iter;
670  std::vector<Instance*>::iterator first = instanceContainer.begin();
671  std::vector<Instance*>::iterator last = instanceContainer.end();
672 
673  for (iter=first; iter!=last; ++iter)
674  {
675  (*iter)->processParams();
676  }
677 
678  return true;
679 }
680 
681 //-----------------------------------------------------------------------------
682 // Function : Model::printOutInstances
683 // Purpose : debugging tool.
684 // Special Notes :
685 // Scope : public
686 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
687 // Creation Date : 4/03/00
688 //-----------------------------------------------------------------------------
689 std::ostream &Model::printOutInstances(std::ostream &os) const
690 {
691 #ifdef Xyce_DEBUG_DEVICE
692 
693  std::vector<Instance*>::const_iterator iter;
694  std::vector<Instance*>::const_iterator first = instanceContainer.begin();
695  std::vector<Instance*>::const_iterator last = instanceContainer.end();
696 
697  int i;
698  os << std::endl;
699  os << " name modelName Parameters" << std::endl;
700  for (i=0, iter=first; iter!=last; ++iter, ++i)
701  {
702  os << " " << i << ": " << (*iter)->getName() << " ";
703  os << getName();
704  os << std::endl;
705  if ( (*iter)->Data_ptr != 0 )
706  {
707  (*iter)->Data_ptr->printOutParams ();
708  }
709 
710  if ( (*iter)->dcData_ptr != 0 )
711  {
712  (*iter)->dcData_ptr->printOutParams ();
713  }
714 
715  if ( (*iter)->acData_ptr != 0 )
716  {
717  (*iter)->acData_ptr->printOutParams ();
718  }
719  }
720 
721  os << std::endl;
722 #endif
723  return os;
724 }
725 
726 //-----------------------------------------------------------------------------
727 // Function : Model::forEachInstance
728 // Purpose :
729 // Special Notes :
730 // Scope : public
731 // Creator : David Baur
732 // Creation Date : 2/4/2014
733 //-----------------------------------------------------------------------------
734 /// Apply a device instance "op" to all instances associated with this
735 /// model
736 ///
737 /// @param[in] op Operator to apply to all instances.
738 ///
739 ///
740 void Model::forEachInstance(DeviceInstanceOp &op) const /* override */
741 {
742  for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
743  op(*it);
744 }
745 
746 
747 
748 
749 //-----------------------------------------------------------------------------
750 // ISRC Master functions:
751 //-----------------------------------------------------------------------------
752 
753 //-----------------------------------------------------------------------------
754 // Function : Master::updateState
755 // Purpose :
756 // Special Notes :
757 // Scope : public
758 // Creator : Eric Keiter, SNL
759 // Creation Date : 11/26/08
760 //-----------------------------------------------------------------------------
761 bool Master::updateState (double * solVec, double * staVec, double * stoVec)
762 {
763  return true;
764 }
765 
766 //-----------------------------------------------------------------------------
767 // Function : Master::loadDAEVectors
768 // Purpose :
769 // Special Notes :
770 // Scope : public
771 // Creator : Eric Keiter, SNL
772 // Creation Date : 11/26/08
773 //-----------------------------------------------------------------------------
774 bool Master::loadDAEVectors (double * solVec, double * fVec, double *qVec, double * storeLeadF, double * storeLeadQ)
775 {
776  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
777  {
778  Instance & inst = *(*it);
779 
780  SourceData *dataPtr = inst.dcData_ptr; // by default assume the DC value.
781  if ( (getSolverState().HBspecified || getSolverState().tranopFlag || getSolverState().transientFlag) && inst.Data_ptr != 0 )
782  {
783  dataPtr = inst.Data_ptr;
784  }
785 
786  double source = 0.0;
787  if (dataPtr != 0)
788  {
789  source = dataPtr->returnSource();
790  }
791  fVec[inst.li_Pos] += source;
792  fVec[inst.li_Neg] -= source;
793  if( inst.loadLeadCurrent )
794  {
795  storeLeadF[inst.li_store_dev_i] = source;
796  }
797 
798  }
799  return true;
800 }
801 
802 //-----------------------------------------------------------------------------
803 // Function : Master::loadDAEMatrices
804 // Purpose :
805 // Special Notes :
806 // Scope : public
807 // Creator : Eric Keiter, SNL
808 // Creation Date : 11/26/08
809 //-----------------------------------------------------------------------------
810 bool Master::loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx)
811 {
812  return true;
813 }
814 
815 Device *Traits::factory(const Configuration &configuration, const FactoryBlock &factory_block)
816 {
817 
818  return new Master(configuration, factory_block, factory_block.solverState_, factory_block.deviceOptions_);
819 }
820 
822 {
824  .registerDevice("i", 1);
825 }
826 
827 } // namespace Resistor
828 } // namespace Device
829 } // namespace Xyce