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