1 /*  atovm.c    CCMATH mathematics library source code.
2  *
3  *  Copyright (C)  2000   Daniel A. Atkinson    All rights reserved.
4  *  This code may be redistributed under the terms of the GNU library
5  *  public license (LGPL). ( See the lgpl.license file for details.)
6  * ------------------------------------------------------------------------
7  */
atovm(double * v,int n)8 void atovm(double *v,int n)
9 { double *p0,*q0,*p,*q,*qq;
10   double h,s;
11   int i,j,k,mm;
12   q0=v+n*n-1; *q0=1.; q0-=n+1;
13   p0=v+n*n-n-n-1;
14   for(i=n-2,mm=1; i>=0 ;--i,p0-=n+1,q0-=n+1,++mm){
15     if(i && *(p0-1)!=0.){
16       for(j=0,p=p0,h=1.; j<mm ;++j,++p) h+= *p* *p;
17       h= *(p0-1); *q0=1.-h;
18       for(j=0,q=q0+n,p=p0; j<mm ;++j,q+=n) *q= -h* *p++;
19       for(k=i+1,q=q0+1; k<n ;++k){
20         for(j=0,qq=q+n,p=p0,s=0.; j<mm ;++j,qq+=n) s+= *qq* *p++;
21         s*=h;
22         for(j=0,qq=q+n,p=p0; j<mm ;++j,qq+=n) *qq-=s* *p++;
23         *q++ = -s;
24        }
25      }
26     else{
27       *q0=1.;
28       for(j=0,p=q0+1,q=q0+n; j<mm ;++j,q+=n) *q= *p++ =0.;
29      }
30    }
31 }
32