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)16void 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