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