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