1 /**********
2 Copyright 1990 Regents of the University of California. All rights reserved.
3 Author: 1985 Thomas L. Quarles
4 Modified: 2000 AlansFixes
5 **********/
6
7 #include "ngspice/ngspice.h"
8 #include "ngspice/tskdefs.h"
9 #include "ngspice/ifsim.h"
10 #include "ngspice/cktdefs.h"
11 #include "ngspice/iferrmsg.h"
12
13
14 /* CDHW See notes in spiceif.c for an explanation of these fixes CDHW */
15
16 int
CKTnewTask(CKTcircuit * ckt,TSKtask ** taskPtr,IFuid taskName,TSKtask ** defPtr)17 CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr)
18 {
19 TSKtask *tsk, *def = NULL;
20
21 NG_IGNORE(ckt);
22
23 FREE(*taskPtr); /* clear old task upon repeated calls to tran etc.*/
24 *taskPtr = TMALLOC(TSKtask, 1);
25 if (*taskPtr == NULL)
26 return(E_NOMEM);
27
28 tsk = *taskPtr;
29 tsk->TSKname = taskName;
30
31 #if (1) /*CDHW*/
32
33 if(defPtr)
34 def = *defPtr;
35
36 if ((strcmp(taskName,"special") == 0) && def) {
37 /* create options by copying the circuit's defaults */
38 tsk->TSKtemp = def->TSKtemp;
39 tsk->TSKnomTemp = def->TSKnomTemp;
40 tsk->TSKmaxOrder = def->TSKmaxOrder;
41 tsk->TSKintegrateMethod = def->TSKintegrateMethod;
42 tsk->TSKindverbosity = def->TSKindverbosity;
43 tsk->TSKxmu = def->TSKxmu;
44 tsk->TSKbypass = def->TSKbypass;
45 tsk->TSKdcMaxIter = def->TSKdcMaxIter;
46 tsk->TSKdcTrcvMaxIter = def->TSKdcTrcvMaxIter;
47 tsk->TSKtranMaxIter = def->TSKtranMaxIter;
48 tsk->TSKnumSrcSteps = def->TSKnumSrcSteps;
49 tsk->TSKnumGminSteps = def->TSKnumGminSteps;
50 tsk->TSKgminFactor = def->TSKgminFactor;
51 /* minBreak */
52 tsk->TSKabstol = def->TSKabstol;
53 tsk->TSKpivotAbsTol = def->TSKpivotAbsTol;
54 tsk->TSKpivotRelTol = def->TSKpivotRelTol;
55 tsk->TSKreltol = def->TSKreltol;
56 tsk->TSKchgtol = def->TSKchgtol;
57 tsk->TSKvoltTol = def->TSKvoltTol;
58 tsk->TSKgmin = def->TSKgmin;
59 tsk->TSKgshunt = def->TSKgshunt;
60 tsk->TSKcshunt = def->TSKcshunt;
61 /* delmin */
62 tsk->TSKtrtol = def->TSKtrtol;
63 tsk->TSKdefaultMosM = def->TSKdefaultMosM;
64 tsk->TSKdefaultMosL = def->TSKdefaultMosL;
65 tsk->TSKdefaultMosW = def->TSKdefaultMosW;
66 tsk->TSKdefaultMosAD = def->TSKdefaultMosAD;
67 tsk->TSKdefaultMosAS = def->TSKdefaultMosAS;
68 /* fixLimit */
69 tsk->TSKnoOpIter = def->TSKnoOpIter;
70 tsk->TSKtryToCompact = def->TSKtryToCompact;
71 tsk->TSKbadMos3 = def->TSKbadMos3;
72 tsk->TSKkeepOpInfo = def->TSKkeepOpInfo;
73 tsk->TSKcopyNodesets = def->TSKcopyNodesets;
74 tsk->TSKnodeDamping = def->TSKnodeDamping;
75 tsk->TSKabsDv = def->TSKabsDv;
76 tsk->TSKrelDv = def->TSKrelDv;
77 tsk->TSKnoopac = def->TSKnoopac;
78 tsk->TSKepsmin = def->TSKepsmin;
79 #ifdef NEWTRUNC
80 tsk->TSKlteReltol = def->TSKlteReltol;
81 tsk->TSKlteAbstol = def->TSKlteAbstol;
82 #endif
83
84 } else {
85 #endif /*CDHW*/
86
87 /* use the application defaults */
88 tsk->TSKgmin = 1e-12;
89 tsk->TSKgshunt = 0;
90 tsk->TSKcshunt = -1;
91 tsk->TSKabstol = 1e-12;
92 tsk->TSKreltol = 1e-3;
93 tsk->TSKchgtol = 1e-14;
94 tsk->TSKvoltTol = 1e-6;
95 #ifdef NEWTRUNC
96 tsk->TSKlteReltol = 1e-3;
97 tsk->TSKlteAbstol = 1e-6;
98 #endif
99 tsk->TSKtrtol = 7;
100 tsk->TSKbypass = 0;
101 tsk->TSKtranMaxIter = 10;
102 tsk->TSKdcMaxIter = 100;
103 tsk->TSKdcTrcvMaxIter = 50;
104 tsk->TSKintegrateMethod = TRAPEZOIDAL;
105 tsk->TSKmaxOrder = 2;
106 /* full check, and full verbosity */
107 tsk->TSKindverbosity = 2;
108 /*
109 * when using trapezoidal method
110 * xmu=0: Backward Euler
111 * xmu=0.5: trapezoidal (standard)
112 * xmu=0.49: good damping of current ringing, e.g. in R.O.s.
113 */
114 tsk->TSKxmu = 0.5;
115 tsk->TSKnumSrcSteps = 1;
116 tsk->TSKnumGminSteps = 1;
117 tsk->TSKgminFactor = 10;
118 tsk->TSKpivotAbsTol = 1e-13;
119 tsk->TSKpivotRelTol = 1e-3;
120 tsk->TSKtemp = 300.15;
121 tsk->TSKnomTemp = 300.15;
122 tsk->TSKdefaultMosM = 1;
123 tsk->TSKdefaultMosL = 1e-4;
124 tsk->TSKdefaultMosW = 1e-4;
125 tsk->TSKdefaultMosAD = 0;
126 tsk->TSKdefaultMosAS = 0;
127 tsk->TSKnoOpIter = 0;
128 tsk->TSKtryToCompact = 0;
129 tsk->TSKbadMos3 = 0;
130 tsk->TSKkeepOpInfo = 0;
131 tsk->TSKcopyNodesets = 0;
132 tsk->TSKnodeDamping = 0;
133 tsk->TSKabsDv = 0.5;
134 tsk->TSKrelDv = 2.0;
135 tsk->TSKepsmin = 1e-28;
136
137 #if (1) /*CDHW*/
138 }
139 #endif
140
141 return(OK);
142 }
143