1 /**********
2 Copyright 1990 Regents of the University of California.  All rights reserved.
3 Author: 1989 Jaijeet S. Roychowdhury
4 **********/
5 
6 #include "ngspice/ngspice.h"
7 #include "ngspice/distodef.h"
8 #include "ngspice/suffix.h"
9 
10 /*
11  * TanDeriv computes the partial derivatives of the tangent
12  * function where the argument to the function is itself a
13  * function of three variables p, q, and r.
14  */
15 
TanDeriv(Dderivs * new,Dderivs * old)16 void TanDeriv(
17 Dderivs *new, Dderivs *old)
18 {
19 
20 Dderivs temp;
21 
22 EqualDeriv(&temp, old);
23 new->value = tan(temp.value);
24 
25 new->d1_p = (1 + new->value*new->value)*temp.d1_p;
26 new->d1_q = (1 + new->value*new->value)*temp.d1_q;
27 new->d1_r = (1 + new->value*new->value)*temp.d1_r;
28 new->d2_p2 = (1 + new->value*new->value)*temp.d2_p2 + 2*new->value*temp.d1_p*new->d1_p;
29 new->d2_q2 = (1 + new->value*new->value)*temp.d2_q2 + 2*new->value*temp.d1_q*new->d1_q;
30 new->d2_r2 = (1 + new->value*new->value)*temp.d2_r2 + 2*new->value*temp.d1_r*new->d1_r;
31 new->d2_pq = (1 + new->value*new->value)*temp.d2_pq + 2*new->value*temp.d1_p*new->d1_q;
32 new->d2_qr = (1 + new->value*new->value)*temp.d2_qr + 2*new->value*temp.d1_q*new->d1_r;
33 new->d2_pr = (1 + new->value*new->value)*temp.d2_pr + 2*new->value*temp.d1_p*new->d1_r;
34 new->d3_p3 = (1 + new->value*new->value)*temp.d3_p3 +2*( new->value*(
35 	temp.d2_p2*new->d1_p + temp.d2_p2*new->d1_p + new->d2_p2*
36 	temp.d1_p) + temp.d1_p*new->d1_p*new->d1_p);
37 new->d3_q3 = (1 + new->value*new->value)*temp.d3_q3 +2*( new->value*(
38 	temp.d2_q2*new->d1_q + temp.d2_q2*new->d1_q + new->d2_q2*
39 	temp.d1_q) + temp.d1_q*new->d1_q*new->d1_q);
40 new->d3_r3 = (1 + new->value*new->value)*temp.d3_r3 +2*( new->value*(
41 	temp.d2_r2*new->d1_r + temp.d2_r2*new->d1_r + new->d2_r2*
42 	temp.d1_r) + temp.d1_r*new->d1_r*new->d1_r);
43 new->d3_p2r = (1 + new->value*new->value)*temp.d3_p2r +2*( new->value*(
44 	temp.d2_p2*new->d1_r + temp.d2_pr*new->d1_p + new->d2_pr*
45 	temp.d1_p) + temp.d1_p*new->d1_p*new->d1_r);
46 new->d3_p2q = (1 + new->value*new->value)*temp.d3_p2q +2*( new->value*(
47 	temp.d2_p2*new->d1_q + temp.d2_pq*new->d1_p + new->d2_pq*
48 	temp.d1_p) + temp.d1_p*new->d1_p*new->d1_q);
49 new->d3_q2r = (1 + new->value*new->value)*temp.d3_q2r +2*( new->value*(
50 	temp.d2_q2*new->d1_r + temp.d2_qr*new->d1_q + new->d2_qr*
51 	temp.d1_q) + temp.d1_q*new->d1_q*new->d1_r);
52 new->d3_pq2 = (1 + new->value*new->value)*temp.d3_pq2 +2*( new->value*(
53 	temp.d2_q2*new->d1_p + temp.d2_pq*new->d1_q + new->d2_pq*
54 	temp.d1_q) + temp.d1_q*new->d1_q*new->d1_p);
55 new->d3_pr2 = (1 + new->value*new->value)*temp.d3_pr2 +2*( new->value*(
56 	temp.d2_r2*new->d1_p + temp.d2_pr*new->d1_r + new->d2_pr*
57 	temp.d1_r) + temp.d1_r*new->d1_r*new->d1_p);
58 new->d3_qr2 = (1 + new->value*new->value)*temp.d3_qr2 +2*( new->value*(
59 	temp.d2_r2*new->d1_q + temp.d2_qr*new->d1_r + new->d2_qr*
60 	temp.d1_r) + temp.d1_r*new->d1_r*new->d1_q);
61 new->d3_pqr = (1 + new->value*new->value)*temp.d3_pqr +2*( new->value*(
62 	temp.d2_pq*new->d1_r + temp.d2_pr*new->d1_q + new->d2_qr*
63 	temp.d1_p) + temp.d1_p*new->d1_q*new->d1_r);
64 	}
65