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  * InvDeriv computes the partial derivatives of the 1/x
12  * function where the argument to the function is itself a
13  * function of three variables p, q, and r.
14  */
15 
16 void
InvDeriv(Dderivs * new,Dderivs * old)17 InvDeriv(Dderivs *new, Dderivs *old)
18 {
19     Dderivs temp;
20 
21     EqualDeriv(&temp, old);
22 
23     new->value = 1/temp.value;
24     new->d1_p = -new->value*new->value*temp.d1_p;
25     new->d1_q = -new->value*new->value*temp.d1_q;
26     new->d1_r = -new->value*new->value*temp.d1_r;
27     new->d2_p2 = -new->value*(2*new->d1_p*temp.d1_p + new->value*temp.d2_p2);
28     new->d2_q2 = -new->value*(2*new->d1_q*temp.d1_q + new->value*temp.d2_q2);
29     new->d2_r2 = -new->value*(2*new->d1_r*temp.d1_r + new->value*temp.d2_r2);
30     new->d2_pq = -new->value*(2*new->d1_q*temp.d1_p + new->value*temp.d2_pq);
31     new->d2_qr = -new->value*(2*new->d1_r*temp.d1_q + new->value*temp.d2_qr);
32     new->d2_pr = -new->value*(2*new->d1_r*temp.d1_p + new->value*temp.d2_pr);
33     new->d3_p3 = -(2*(temp.d1_p*new->d1_p*new->d1_p + new->value*(
34 	new->d2_p2*temp.d1_p + new->d1_p*temp.d2_p2 +
35 	new->d1_p*temp.d2_p2)) + new->value*new->value*temp.d3_p3);
36     new->d3_q3 = -(2*(temp.d1_q*new->d1_q*new->d1_q + new->value*(
37 	new->d2_q2*temp.d1_q + new->d1_q*temp.d2_q2 +
38 	new->d1_q*temp.d2_q2)) + new->value*new->value*temp.d3_q3);
39     new->d3_r3 = -(2*(temp.d1_r*new->d1_r*new->d1_r + new->value*(
40 	new->d2_r2*temp.d1_r + new->d1_r*temp.d2_r2 +
41 	new->d1_r*temp.d2_r2)) + new->value*new->value*temp.d3_r3);
42     new->d3_p2r = -(2*(temp.d1_p*new->d1_p*new->d1_r + new->value*(
43 	new->d2_pr*temp.d1_p + new->d1_p*temp.d2_pr +
44 	new->d1_r*temp.d2_p2)) + new->value*new->value*temp.d3_p2r);
45     new->d3_p2q = -(2*(temp.d1_p*new->d1_p*new->d1_q + new->value*(
46 	new->d2_pq*temp.d1_p + new->d1_p*temp.d2_pq +
47 	new->d1_q*temp.d2_p2)) + new->value*new->value*temp.d3_p2q);
48     new->d3_q2r = -(2*(temp.d1_q*new->d1_q*new->d1_r + new->value*(
49 	new->d2_qr*temp.d1_q + new->d1_q*temp.d2_qr +
50 	new->d1_r*temp.d2_q2)) + new->value*new->value*temp.d3_q2r);
51     new->d3_pq2 = -(2*(temp.d1_q*new->d1_q*new->d1_p + new->value*(
52 	new->d2_pq*temp.d1_q + new->d1_q*temp.d2_pq +
53 	new->d1_p*temp.d2_q2)) + new->value*new->value*temp.d3_pq2);
54     new->d3_pr2 = -(2*(temp.d1_r*new->d1_r*new->d1_p + new->value*(
55 	new->d2_pr*temp.d1_r + new->d1_r*temp.d2_pr +
56 	new->d1_p*temp.d2_r2)) + new->value*new->value*temp.d3_pr2);
57     new->d3_qr2 = -(2*(temp.d1_r*new->d1_r*new->d1_q + new->value*(
58 	new->d2_qr*temp.d1_r + new->d1_r*temp.d2_qr +
59 	new->d1_q*temp.d2_r2)) + new->value*new->value*temp.d3_qr2);
60     new->d3_pqr = -(2*(temp.d1_p*new->d1_q*new->d1_r + new->value*(
61 	new->d2_qr*temp.d1_p + new->d1_q*temp.d2_pr +
62 	new->d1_r*temp.d2_pq)) + new->value*new->value*temp.d3_pqr);
63 
64 }
65