29 #include "component.h"
37 #define StateVars 1 // state variables
43 #define UdPrev deviceVar (_UdPrev)
45 using namespace device;
71 if (Id < -Is) Id = -Is;
86 matrix diode::calcMatrixCy (nr_double_t frequency) {
92 if (Id < -Is) Id = -Is;
100 nr_double_t
i = 2 * (Id + 2 * Is) *
QoverkB /
T0 +
101 Kf *
pow (fabs (Id), Af) /
pow (frequency, Ffe) /
kB /
T0;
108 void diode::initModel (
void) {
134 "diode `%s'\n", Nr,
getName ());
138 "diode `%s'\n", N,
getName ());
156 "Diode `%s'\n", M,
getName ());
162 nr_double_t DT = T2 - T1;
170 Tt = Tt * (1 + Ttt1 * DT + Ttt2 * DT * DT);
176 M = M * (1 + Tm1 * DT + Tm2 * DT * DT);
182 Rs = Rs * (1 + Trs * DT);
187 void diode::prepareDC (
void) {
222 nr_double_t Ibv, Is, tol, Ut, Xbv, Xibv;
227 if (Ibv < Is * Bv / Ut) {
231 "match the saturation current %g\n", Ibv, Is);
237 Xbv = Bv - Ut *
log (1 + Ibv / Is);
238 for (
int i = 0; i < 25 ; i++) {
239 Xbv = Bv - Ut *
log (Ibv / Is + 1 - Xbv / Ut);
240 Xibv = Is * (
exp ((Bv - Xbv) / Ut) - 1 + Xbv / Ut);
241 if (fabs (Xibv - Ibv) < tol) {
249 "diode regions using Bv=%g and Ibv=%g\n", Bv, Ibv);
278 nr_double_t Ut, Ieq, Ucrit, gtiny;
286 if (Bv != 0 && Ud <
MIN (0, -Bv + 10 * N * Ut)) {
287 nr_double_t
V = -(Ud + Bv);
297 gtiny = (Ud < - 10 * Ut * N && Bv != 0) ? (Is + Isr) : 0;
299 if (Ud >= -3 * N * Ut) {
303 else if (Bv == 0 || Ud >= -Bv) {
304 nr_double_t a = 3 * N * Ut / (Ud *
M_E);
307 gd = +Is * 3 * a / Ud;
310 nr_double_t a =
exp (-(Bv + Ud) / N / Ut);
312 gd = +Is * a / Ut /
N;
317 nr_double_t a = Ikf / (Ikf + Id);
318 gd *= 0.5 * (2 - Id * a / Ikf) *
sqrt (a);
373 Qd =
pnCharge (Ud, Cj0, Vj, M, Fc) + Tt * Id + Cp * Ud;
400 #define qState 0 // charge state
401 #define cState 1 // current state