Biomechanical Joint Model
 Author: Anderson Maciel

matvec.H

Go to the documentation of this file.
00001 /*************************************************************************\
00002 
00003   Copyright 1995 The University of North Carolina at Chapel Hill.
00004   All Rights Reserved.
00005 
00006   Permission to use, copy, modify and distribute this software and its
00007   documentation for educational, research and non-profit purposes, without
00008   fee, and without a written agreement is hereby granted, provided that the
00009   above copyright notice and the following three paragraphs appear in all
00010   copies.
00011 
00012   IN NO EVENT SHALL THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL BE
00013   LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
00014   CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE
00015   USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY
00016   OF NORTH CAROLINA HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
00017   DAMAGES.
00018 
00019 
00020   Permission to use, copy, modify and distribute this software and its
00021   documentation for educational, research and non-profit purposes, without
00022   fee, and without a written agreement is hereby granted, provided that the
00023   above copyright notice and the following three paragraphs appear in all
00024   copies.
00025 
00026   THE UNIVERSITY OF NORTH CAROLINA SPECIFICALLY DISCLAIM ANY
00027   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00028   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE
00029   PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
00030   NORTH CAROLINA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
00031   UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
00032 
00033   The authors may be contacted via:
00034 
00035   US Mail:             S. Gottschalk
00036                        Department of Computer Science
00037                        Sitterson Hall, CB #3175
00038                        University of N. Carolina
00039                        Chapel Hill, NC 27599-3175
00040 
00041   Phone:               (919)962-1749
00042 
00043   EMail:              {gottscha}@cs.unc.edu
00044 
00045 
00046 \**************************************************************************/
00047 
00048 
00049 
00050 #ifndef MATVEC_H
00051 #define MATVEC_H
00052 
00053 #include <math.h>
00054 #include <stdio.h>
00055 
00056 #ifdef gnu
00057 #include "zzzz.h"
00058 
00059 #ifdef hppa
00060 #define myfabs(x) \
00061  ({double __value, __arg = (x); \
00062    asm("fabs,dbl %1, %0": "=f" (__value): "f" (__arg)); \
00063    __value; \
00064 });
00065 #endif
00066 
00067 #ifdef mips
00068 #define myfabs(x) \
00069  ({double __value, __arg = (x); \
00070    asm("abs.d %0, %1": "=f" (__value): "f" (__arg)); \
00071    __value; \
00072 });
00073 #endif
00074 
00075 #else  
00076 
00077 #define myfabs(x) ((x < 0) ? -x : x)
00078 
00079 #endif
00080 
00081 
00082 inline
00083 void
00084 Mprintg(double M[3][3])
00085 {
00086   printf("%g %g %g\n%g %g %g\n%g %g %g\n",
00087          M[0][0], M[0][1], M[0][2],
00088          M[1][0], M[1][1], M[1][2],
00089          M[2][0], M[2][1], M[2][2]);
00090 }
00091 
00092 
00093 inline
00094 void
00095 Mfprint(FILE *f, double M[3][3])
00096 {
00097   fprintf(f, "%g %g %g\n%g %g %g\n%g %g %g\n",
00098          M[0][0], M[0][1], M[0][2],
00099          M[1][0], M[1][1], M[1][2],
00100          M[2][0], M[2][1], M[2][2]);
00101 }
00102 
00103 inline
00104 void
00105 Mprint(double M[3][3])
00106 {
00107   printf("%g %g %g\n%g %g %g\n%g %g %g\n",
00108          M[0][0], M[0][1], M[0][2],
00109          M[1][0], M[1][1], M[1][2],
00110          M[2][0], M[2][1], M[2][2]);
00111 }
00112 
00113 inline
00114 void
00115 Vprintg(double V[3])
00116 {
00117   printf("%g %g %g\n", V[0], V[1], V[2]);
00118 }
00119 
00120 inline
00121 void
00122 Vfprint(FILE *f, double V[3])
00123 {
00124   fprintf(f, "%g %g %g\n", V[0], V[1], V[2]);
00125 }
00126 
00127 inline
00128 void
00129 Vprint(double V[3])
00130 {
00131   printf("%g %g %g\n", V[0], V[1], V[2]);
00132 }
00133 
00134 inline
00135 void
00136 Midentity(double M[3][3])
00137 {
00138   M[0][0] = M[1][1] = M[2][2] = 1.0;
00139   M[0][1] = M[1][2] = M[2][0] = 0.0;
00140   M[0][2] = M[1][0] = M[2][1] = 0.0;
00141 }
00142 
00143 inline
00144 void
00145 McM(double Mr[3][3], double M[3][3])
00146 {
00147   Mr[0][0] = M[0][0];  Mr[0][1] = M[0][1];  Mr[0][2] = M[0][2];
00148   Mr[1][0] = M[1][0];  Mr[1][1] = M[1][1];  Mr[1][2] = M[1][2];
00149   Mr[2][0] = M[2][0];  Mr[2][1] = M[2][1];  Mr[2][2] = M[2][2];
00150 }
00151 
00152 inline
00153 void
00154 VcV(double Vr[3], double V[3])
00155 {
00156   Vr[0] = V[0];  Vr[1] = V[1];  Vr[2] = V[2];
00157 }
00158 
00159 inline
00160 void
00161 McolcV(double Vr[3], double M[3][3], int c)
00162 {
00163   Vr[0] = M[0][c];
00164   Vr[1] = M[1][c];
00165   Vr[2] = M[2][c];
00166 }
00167 
00168 inline
00169 void
00170 McolcMcol(double Mr[3][3], int cr, double M[3][3], int c)
00171 {
00172   Mr[0][cr] = M[0][c];
00173   Mr[1][cr] = M[1][c];
00174   Mr[2][cr] = M[2][c];
00175 }
00176 
00177 inline
00178 void
00179 MxMpV(double Mr[3][3], double M1[3][3], double M2[3][3], double T[3])
00180 {
00181   Mr[0][0] = (M1[0][0] * M2[0][0] +
00182               M1[0][1] * M2[1][0] +
00183               M1[0][2] * M2[2][0] +
00184               T[0]);
00185   Mr[1][0] = (M1[1][0] * M2[0][0] +
00186               M1[1][1] * M2[1][0] +
00187               M1[1][2] * M2[2][0] +
00188               T[1]);
00189   Mr[2][0] = (M1[2][0] * M2[0][0] +
00190               M1[2][1] * M2[1][0] +
00191               M1[2][2] * M2[2][0] +
00192               T[2]);
00193   Mr[0][1] = (M1[0][0] * M2[0][1] +
00194               M1[0][1] * M2[1][1] +
00195               M1[0][2] * M2[2][1] +
00196               T[0]);
00197   Mr[1][1] = (M1[1][0] * M2[0][1] +
00198               M1[1][1] * M2[1][1] +
00199               M1[1][2] * M2[2][1] +
00200               T[1]);
00201   Mr[2][1] = (M1[2][0] * M2[0][1] +
00202               M1[2][1] * M2[1][1] +
00203               M1[2][2] * M2[2][1] +
00204               T[2]);
00205   Mr[0][2] = (M1[0][0] * M2[0][2] +
00206               M1[0][1] * M2[1][2] +
00207               M1[0][2] * M2[2][2] +
00208               T[0]);
00209   Mr[1][2] = (M1[1][0] * M2[0][2] +
00210               M1[1][1] * M2[1][2] +
00211               M1[1][2] * M2[2][2] +
00212               T[1]);
00213   Mr[2][2] = (M1[2][0] * M2[0][2] +
00214               M1[2][1] * M2[1][2] +
00215               M1[2][2] * M2[2][2] +
00216               T[2]);
00217 }
00218 
00219 inline
00220 void
00221 MxM(double Mr[3][3], double M1[3][3], double M2[3][3])
00222 {
00223   Mr[0][0] = (M1[0][0] * M2[0][0] +
00224               M1[0][1] * M2[1][0] +
00225               M1[0][2] * M2[2][0]);
00226   Mr[1][0] = (M1[1][0] * M2[0][0] +
00227               M1[1][1] * M2[1][0] +
00228               M1[1][2] * M2[2][0]);
00229   Mr[2][0] = (M1[2][0] * M2[0][0] +
00230               M1[2][1] * M2[1][0] +
00231               M1[2][2] * M2[2][0]);
00232   Mr[0][1] = (M1[0][0] * M2[0][1] +
00233               M1[0][1] * M2[1][1] +
00234               M1[0][2] * M2[2][1]);
00235   Mr[1][1] = (M1[1][0] * M2[0][1] +
00236               M1[1][1] * M2[1][1] +
00237               M1[1][2] * M2[2][1]);
00238   Mr[2][1] = (M1[2][0] * M2[0][1] +
00239               M1[2][1] * M2[1][1] +
00240               M1[2][2] * M2[2][1]);
00241   Mr[0][2] = (M1[0][0] * M2[0][2] +
00242               M1[0][1] * M2[1][2] +
00243               M1[0][2] * M2[2][2]);
00244   Mr[1][2] = (M1[1][0] * M2[0][2] +
00245               M1[1][1] * M2[1][2] +
00246               M1[1][2] * M2[2][2]);
00247   Mr[2][2] = (M1[2][0] * M2[0][2] +
00248               M1[2][1] * M2[1][2] +
00249               M1[2][2] * M2[2][2]);
00250 }
00251 
00252 
00253 inline
00254 void
00255 MxMT(double Mr[3][3], double M1[3][3], double M2[3][3])
00256 {
00257   Mr[0][0] = (M1[0][0] * M2[0][0] +
00258               M1[0][1] * M2[0][1] +
00259               M1[0][2] * M2[0][2]);
00260   Mr[1][0] = (M1[1][0] * M2[0][0] +
00261               M1[1][1] * M2[0][1] +
00262               M1[1][2] * M2[0][2]);
00263   Mr[2][0] = (M1[2][0] * M2[0][0] +
00264               M1[2][1] * M2[0][1] +
00265               M1[2][2] * M2[0][2]);
00266   Mr[0][1] = (M1[0][0] * M2[1][0] +
00267               M1[0][1] * M2[1][1] +
00268               M1[0][2] * M2[1][2]);
00269   Mr[1][1] = (M1[1][0] * M2[1][0] +
00270               M1[1][1] * M2[1][1] +
00271               M1[1][2] * M2[1][2]);
00272   Mr[2][1] = (M1[2][0] * M2[1][0] +
00273               M1[2][1] * M2[1][1] +
00274               M1[2][2] * M2[1][2]);
00275   Mr[0][2] = (M1[0][0] * M2[2][0] +
00276               M1[0][1] * M2[2][1] +
00277               M1[0][2] * M2[2][2]);
00278   Mr[1][2] = (M1[1][0] * M2[2][0] +
00279               M1[1][1] * M2[2][1] +
00280               M1[1][2] * M2[2][2]);
00281   Mr[2][2] = (M1[2][0] * M2[2][0] +
00282               M1[2][1] * M2[2][1] +
00283               M1[2][2] * M2[2][2]);
00284 }
00285 
00286 inline
00287 void
00288 MTxM(double Mr[3][3], double M1[3][3], double M2[3][3])
00289 {
00290   Mr[0][0] = (M1[0][0] * M2[0][0] +
00291               M1[1][0] * M2[1][0] +
00292               M1[2][0] * M2[2][0]);
00293   Mr[1][0] = (M1[0][1] * M2[0][0] +
00294               M1[1][1] * M2[1][0] +
00295               M1[2][1] * M2[2][0]);
00296   Mr[2][0] = (M1[0][2] * M2[0][0] +
00297               M1[1][2] * M2[1][0] +
00298               M1[2][2] * M2[2][0]);
00299   Mr[0][1] = (M1[0][0] * M2[0][1] +
00300               M1[1][0] * M2[1][1] +
00301               M1[2][0] * M2[2][1]);
00302   Mr[1][1] = (M1[0][1] * M2[0][1] +
00303               M1[1][1] * M2[1][1] +
00304               M1[2][1] * M2[2][1]);
00305   Mr[2][1] = (M1[0][2] * M2[0][1] +
00306               M1[1][2] * M2[1][1] +
00307               M1[2][2] * M2[2][1]);
00308   Mr[0][2] = (M1[0][0] * M2[0][2] +
00309               M1[1][0] * M2[1][2] +
00310               M1[2][0] * M2[2][2]);
00311   Mr[1][2] = (M1[0][1] * M2[0][2] +
00312               M1[1][1] * M2[1][2] +
00313               M1[2][1] * M2[2][2]);
00314   Mr[2][2] = (M1[0][2] * M2[0][2] +
00315               M1[1][2] * M2[1][2] +
00316               M1[2][2] * M2[2][2]);
00317 }
00318 
00319 inline
00320 void
00321 MxV(double Vr[3], double M1[3][3], double V1[3])
00322 {
00323   Vr[0] = (M1[0][0] * V1[0] +
00324            M1[0][1] * V1[1] + 
00325            M1[0][2] * V1[2]);
00326   Vr[1] = (M1[1][0] * V1[0] +
00327            M1[1][1] * V1[1] + 
00328            M1[1][2] * V1[2]);
00329   Vr[2] = (M1[2][0] * V1[0] +
00330            M1[2][1] * V1[1] + 
00331            M1[2][2] * V1[2]);
00332 }
00333 
00334 
00335 inline
00336 void
00337 MxVpV(double Vr[3], double M1[3][3], double V1[3], double V2[3])
00338 {
00339   Vr[0] = (M1[0][0] * V1[0] +
00340            M1[0][1] * V1[1] + 
00341            M1[0][2] * V1[2] + 
00342            V2[0]);
00343   Vr[1] = (M1[1][0] * V1[0] +
00344            M1[1][1] * V1[1] + 
00345            M1[1][2] * V1[2] + 
00346            V2[1]);
00347   Vr[2] = (M1[2][0] * V1[0] +
00348            M1[2][1] * V1[1] + 
00349            M1[2][2] * V1[2] + 
00350            V2[2]);
00351 }
00352 
00353 inline
00354 void
00355 sMxVpV(double Vr[3], double s1, double M1[3][3], double V1[3], double V2[3])
00356 {
00357   Vr[0] = s1 * (M1[0][0] * V1[0] +
00358                 M1[0][1] * V1[1] + 
00359                 M1[0][2] * V1[2]) +
00360                 V2[0];
00361   Vr[1] = s1 * (M1[1][0] * V1[0] +
00362                 M1[1][1] * V1[1] + 
00363                 M1[1][2] * V1[2]) + 
00364                 V2[1];
00365   Vr[2] = s1 * (M1[2][0] * V1[0] +
00366                 M1[2][1] * V1[1] + 
00367                 M1[2][2] * V1[2]) + 
00368                 V2[2];
00369 }
00370 
00371 inline
00372 void
00373 MTxV(double Vr[3], double M1[3][3], double V1[3])
00374 {
00375   Vr[0] = (M1[0][0] * V1[0] +
00376            M1[1][0] * V1[1] + 
00377            M1[2][0] * V1[2]); 
00378   Vr[1] = (M1[0][1] * V1[0] +
00379            M1[1][1] * V1[1] + 
00380            M1[2][1] * V1[2]);
00381   Vr[2] = (M1[0][2] * V1[0] +
00382            M1[1][2] * V1[1] + 
00383            M1[2][2] * V1[2]); 
00384 }
00385 
00386 inline
00387 void
00388 sMTxV(double Vr[3], double s1, double M1[3][3], double V1[3])
00389 {
00390   Vr[0] = s1*(M1[0][0] * V1[0] +
00391               M1[1][0] * V1[1] + 
00392               M1[2][0] * V1[2]); 
00393   Vr[1] = s1*(M1[0][1] * V1[0] +
00394               M1[1][1] * V1[1] + 
00395               M1[2][1] * V1[2]);
00396   Vr[2] = s1*(M1[0][2] * V1[0] +
00397               M1[1][2] * V1[1] + 
00398               M1[2][2] * V1[2]); 
00399 }
00400 
00401 
00402 inline
00403 void
00404 VmV(double Vr[3], const double V1[3], const double V2[3])
00405 {
00406   Vr[0] = V1[0] - V2[0];
00407   Vr[1] = V1[1] - V2[1];
00408   Vr[2] = V1[2] - V2[2];
00409 }
00410 
00411 inline
00412 void
00413 VpV(double Vr[3], double V1[3], double V2[3])
00414 {
00415   Vr[0] = V1[0] + V2[0];
00416   Vr[1] = V1[1] + V2[1];
00417   Vr[2] = V1[2] + V2[2];
00418 }
00419 
00420 inline
00421 void
00422 VpVxS(double Vr[3], double V1[3], double V2[3], double s)
00423 {
00424   Vr[0] = V1[0] + V2[0] * s;
00425   Vr[1] = V1[1] + V2[1] * s;
00426   Vr[2] = V1[2] + V2[2] * s;
00427 }
00428 
00429 inline 
00430 void
00431 MskewV(double M[3][3], const double v[3])
00432 {
00433   M[0][0] = M[1][1] = M[2][2] = 0.0;
00434   M[1][0] = v[2];
00435   M[0][1] = -v[2];
00436   M[0][2] = v[1];
00437   M[2][0] = -v[1];
00438   M[1][2] = -v[0];
00439   M[2][1] = v[0];
00440 }
00441 
00442 
00443 inline
00444 void
00445 VcrossV(double Vr[3], const double V1[3], const double V2[3])
00446 {
00447   Vr[0] = V1[1]*V2[2] - V1[2]*V2[1];
00448   Vr[1] = V1[2]*V2[0] - V1[0]*V2[2];
00449   Vr[2] = V1[0]*V2[1] - V1[1]*V2[0];
00450 }
00451 
00452 
00453 inline
00454 double
00455 Vlength(double V[3])
00456 {
00457   return sqrt(V[0]*V[0] + V[1]*V[1] + V[2]*V[2]);
00458 }
00459 
00460 inline
00461 void
00462 Vnormalize(double V[3])
00463 {
00464   double d = 1.0 / sqrt(V[0]*V[0] + V[1]*V[1] + V[2]*V[2]);
00465   V[0] *= d;
00466   V[1] *= d;
00467   V[2] *= d;
00468 }
00469 
00470 
00471 inline
00472 double
00473 VdotV(double V1[3], double V2[3])
00474 {
00475   return (V1[0]*V2[0] + V1[1]*V2[1] + V1[2]*V2[2]);
00476 }
00477 
00478 inline
00479 void
00480 VxS(double Vr[3], double V[3], double s)
00481 {
00482   Vr[0] = V[0] * s;
00483   Vr[1] = V[1] * s;
00484   Vr[2] = V[2] * s;
00485 }
00486 
00487 inline
00488 void
00489 Mqinverse(double Mr[3][3], double m[3][3])
00490 {
00491   int i,j;
00492 
00493   for(i=0; i<3; i++)
00494     for(j=0; j<3; j++)
00495       {
00496         int i1 = (i+1)%3;
00497         int i2 = (i+2)%3;
00498         int j1 = (j+1)%3;
00499         int j2 = (j+2)%3;
00500         Mr[i][j] = (m[j1][i1]*m[j2][i2] - m[j1][i2]*m[j2][i1]);
00501       }
00502 }
00503 
00504 
00505 #define rfabs(x) ((x < 0) ? -x : x)
00506 
00507 #define ROT(a,i,j,k,l) g=a[i][j]; h=a[k][l]; a[i][j]=g-s*(h+g*tau); a[k][l]=h+s*(g-h*tau);
00508 
00509 int
00510 inline
00511 Meigen(double vout[3][3], double dout[3], double a[3][3])
00512 {
00513   int i;
00514   double tresh,theta,tau,t,sm,s,h,g,c;
00515   int nrot;
00516   double b[3];
00517   double z[3];
00518   double v[3][3];
00519   double d[3];
00520   
00521   v[0][0] = v[1][1] = v[2][2] = 1.0;
00522   v[0][1] = v[1][2] = v[2][0] = 0.0;
00523   v[0][2] = v[1][0] = v[2][1] = 0.0;
00524   
00525   b[0] = a[0][0]; d[0] = a[0][0]; z[0] = 0.0;
00526   b[1] = a[1][1]; d[1] = a[1][1]; z[1] = 0.0;
00527   b[2] = a[2][2]; d[2] = a[2][2]; z[2] = 0.0;
00528 
00529   nrot = 0;
00530   
00531   for(i=0; i<50; i++)
00532     {
00533 
00534       sm=0.0; sm+=fabs(a[0][1]); sm+=fabs(a[0][2]); sm+=fabs(a[1][2]);
00535       if (sm == 0.0) { McM(vout,v); VcV(dout,d); return i; }
00536       
00537       if (i < 3) tresh=0.2*sm/(3*3); else tresh=0.0;
00538       
00539       {
00540         g = 100.0*rfabs(a[0][1]);  
00541         if (i>3 && rfabs(d[0])+g==rfabs(d[0]) && rfabs(d[1])+g==rfabs(d[1]))
00542           a[0][1]=0.0;
00543         else if (rfabs(a[0][1])>tresh)
00544           {
00545             h = d[1]-d[0];
00546             if (rfabs(h)+g == rfabs(h)) t=(a[0][1])/h;
00547             else
00548               {
00549                 theta=0.5*h/(a[0][1]);
00550                 t=1.0/(rfabs(theta)+sqrt(1.0+theta*theta));
00551                 if (theta < 0.0) t = -t;
00552               }
00553             c=1.0/sqrt(1+t*t); s=t*c; tau=s/(1.0+c); h=t*a[0][1];
00554             z[0] -= h; z[1] += h; d[0] -= h; d[1] += h;
00555             a[0][1]=0.0;
00556             ROT(a,0,2,1,2); ROT(v,0,0,0,1); ROT(v,1,0,1,1); ROT(v,2,0,2,1); 
00557             nrot++;
00558           }
00559       }
00560 
00561       {
00562         g = 100.0*rfabs(a[0][2]);
00563         if (i>3 && rfabs(d[0])+g==rfabs(d[0]) && rfabs(d[2])+g==rfabs(d[2]))
00564           a[0][2]=0.0;
00565         else if (rfabs(a[0][2])>tresh)
00566           {
00567             h = d[2]-d[0];
00568             if (rfabs(h)+g == rfabs(h)) t=(a[0][2])/h;
00569             else
00570               {
00571                 theta=0.5*h/(a[0][2]);
00572                 t=1.0/(rfabs(theta)+sqrt(1.0+theta*theta));
00573                 if (theta < 0.0) t = -t;
00574               }
00575             c=1.0/sqrt(1+t*t); s=t*c; tau=s/(1.0+c); h=t*a[0][2];
00576             z[0] -= h; z[2] += h; d[0] -= h; d[2] += h;
00577             a[0][2]=0.0;
00578             ROT(a,0,1,1,2); ROT(v,0,0,0,2); ROT(v,1,0,1,2); ROT(v,2,0,2,2); 
00579             nrot++;
00580           }
00581       }
00582 
00583 
00584       {
00585         g = 100.0*rfabs(a[1][2]);
00586         if (i>3 && rfabs(d[1])+g==rfabs(d[1]) && rfabs(d[2])+g==rfabs(d[2]))
00587           a[1][2]=0.0;
00588         else if (rfabs(a[1][2])>tresh)
00589           {
00590             h = d[2]-d[1];
00591             if (rfabs(h)+g == rfabs(h)) t=(a[1][2])/h;
00592             else
00593               {
00594                 theta=0.5*h/(a[1][2]);
00595                 t=1.0/(rfabs(theta)+sqrt(1.0+theta*theta));
00596                 if (theta < 0.0) t = -t;
00597               }
00598             c=1.0/sqrt(1+t*t); s=t*c; tau=s/(1.0+c); h=t*a[1][2];
00599             z[1] -= h; z[2] += h; d[1] -= h; d[2] += h;
00600             a[1][2]=0.0;
00601             ROT(a,0,1,0,2); ROT(v,0,1,0,2); ROT(v,1,1,1,2); ROT(v,2,1,2,2); 
00602             nrot++;
00603           }
00604       }
00605 
00606       b[0] += z[0]; d[0] = b[0]; z[0] = 0.0;
00607       b[1] += z[1]; d[1] = b[1]; z[1] = 0.0;
00608       b[2] += z[2]; d[2] = b[2]; z[2] = 0.0;
00609       
00610     }
00611 
00612   fprintf(stderr, "eigen: too many iterations in Jacobi transform (%d).\n", i);
00613 
00614   return i;
00615 }
00616 
00617 
00618 #endif

Generated on Thu Dec 1 10:13:38 2005 for COME - Biomechanical Joint Model by  doxygen 1.4.5