/* Test program to read in matrix and pass to subroutine HICHOL for Cholesky decomposition */ #include #include #include #define FITS 34 /* Total number of nights */ #define STARS 12 /* Total number of stars */ #define NSTARS 12 /* Number of stars/night */ #define FITPARMS 4 /* Number of non-global parameters per night */ #define STARPARMS 2 /* Number of parameters per star */ #define NV FITS*(FITPARMS*(FITPARMS+1)/2+FITPARMS*NSTARS*STARPARMS) #define NT STARS*STARPARMS*(STARS*STARPARMS+1)/2 #define NP FITS*FITPARMS+STARS*STARPARMS #define NVD FITS*(FITPARMS*(FITPARMS+1)/2+FITPARMS*NSTARS*STARPARMS) \ + STARS*STARPARMS*(STARPARMS+1)/2 int hichol(float v[],unsigned long iv[],unsigned short jv[], unsigned short ni[],unsigned short ns,unsigned short nm, float t[]); int hi_chol(float v[],unsigned long iv[],unsigned short jv[], unsigned short ir,unsigned short nr,unsigned short mb, float t[],unsigned short nm,unsigned short nb); int cholesky(float t[],unsigned short n); int hi_solve(float v[],unsigned long iv[],unsigned short jv[], unsigned short nm,float t[],unsigned short nb,float r[]); main() { char filename[80]; FILE *fp; unsigned long i,j,ii,jj; unsigned short nm,ns,nb,np; unsigned long nv,nt; double sum; /* Input data */ double vd[NVD+1]; double rs[NP+1],rn[NP+1]; unsigned short jv[NVD+1]; unsigned short ni[FITS+1]; unsigned long iv[NP+2]; float v[NV+1],t[NT+1],r1[NP+1],r2[NP+1]; puts("\nThis program reads a matrix and "); puts("calculates the Cholesky decomposition."); printf("%s","\nPlease enter filename of sparse matrix: "); scanf("%s",filename); if((fp=fopen(filename,"r"))==NULL){ fprintf(stderr,"Error opening file."); exit(1); } i=1; while(i<=NVD){ if(fscanf(fp,"%lf %hu",&vd[i],&jv[i])==EOF)break; i+=1; } fclose(fp); printf("%s","Please enter filename for array iv: "); scanf("%s",filename); if((fp=fopen(filename,"r"))==NULL){ fprintf(stderr, "Error opening file."); exit(1); } i=1; while(i<=NP+2){ if(fscanf(fp,"%lu",&iv[i])==EOF)break; i+=1; } nm=i-2; fclose(fp); printf("%s","Please enter filename for right hand side: "); scanf("%s",filename); if((fp=fopen(filename,"r"))==NULL){ fprintf(stderr, "Error opening file."); exit(1); } i=1; while(i<=NP+1){ if(fscanf(fp,"%lf",&rs[i])==EOF)break; i+=1; } fclose(fp); /* Copy right hand side to r1 */ for(i=1;i<=nm;i++){r1[i]=rs[i];} printf("Dimension of matrix is: %d",nm); printf("%s","\nEnter number of fits: "); scanf("%hu",&ns); /* Set array of sub-matrix dimensions */ for(i=1;i<=ns;i++){ni[i]=4;} /* Prepare matrices v and t */ nb=0; for(i=1;i<=ns;i++){nb+=ni[i];} nb=nm-nb; /* Number of border columns */ np=nm-nb; /* Number of columns in block diagonal part */ nv=iv[np+1]; for(i=1;i0;i--){ t1=t[ii]=sqrt(t[ii]); for(j=ii+1;jnm-nb;i--){ sum=r[i]; k=i-(nm-nb); for(j=i+1;j<=nm;j++){ l=j-(nm-nb); sum-=t[(k-1)*nb-(k-1)*(k-2)/2+1+l-k]*r[j]; } r[i]=sum/t[(k-1)*nb-(k-1)*(k-2)/2+1]; } /* ...and in triangle */ for(i=nm-nb;i>0;i--){ sum=r[i]; for(j=iv[i]+1;j<=iv[i+1]-1;j++){ sum-=v[j]*r[jv[j]]; } r[i]=sum/v[iv[i]]; } return 0; }