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)17InvDeriv(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