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