00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <time.h>
00004 #include <string.h>
00005 #include <math.h>
00006 #include <mkl.h>
00007
00008 int sign(double v)
00009 {
00010 return v > 0 ? 1 : (v < 0 ? -1 : 0);
00011 }
00012
00013 void dcholesky_down_0(
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 char *uplo,
00024 int *n_in,
00025 double *a,
00026 int *lda_in,
00027 int *idel_in,
00028 int *info
00029 )
00030 {
00031 int n,lda,idel;
00032 int i,j,nrot;
00033 double ax,b,c,s,t,u;
00034
00035 n=*n_in;
00036 lda=*lda_in;
00037 idel=*idel_in;
00038
00039 if (*uplo != 'U') {
00040 *info=-1;
00041 return;
00042 }
00043
00044 if (n < 0) {
00045 *info=-2;
00046 return;
00047 }
00048
00049 if ((idel < 0) || (idel > (n-1))) {
00050 *info=-5;
00051 return;
00052 }
00053
00054
00055
00056
00057 for (i=idel; i<(n-1) ; i++) {
00058
00059 for (j=0 ; j<=(i+1) ; j++) a[i*lda+j]=a[(i+1)*lda+j];
00060 }
00061
00062 for (i=idel; i<(n-1); i++) {
00063
00064 ax=a[i*lda+i];
00065 b=a[i*lda+i+1];
00066 if (b == 0) {
00067 c=sign(ax);
00068 s=0;
00069 }
00070 else if (ax == 0) {
00071 c=0;
00072 s=sign(b);
00073 }
00074
00075
00076 else if (fabs(b) > fabs(ax)) {
00077 t=ax/b;
00078 u=sign(b)*sqrt(1+t*t);
00079 s=1/u;
00080 c=s*t;
00081 }
00082 else {
00083 t=b/ax;
00084 u=sign(ax)*sqrt(1+t*t);
00085 c=1/u;
00086 s=c*t;
00087 }
00088
00089
00090 nrot=n-i-1;
00091
00092 drot(&nrot,a+i*lda+i,&lda,a+i*lda+i+1,&lda,&c,&s);
00093
00094 }
00095
00096 *info=0;
00097
00098 }
00099
00100 extern void dcholesky_down_multi_0(
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 char *uplo,
00111 int *n_in,
00112 double *a,
00113 int *lda,
00114 int *ndel_in,
00115 int *wdel,
00116 int *info
00117 )
00118 {
00119 int i,wi;
00120 int *mask;
00121 int n,ndel;
00122
00123 n=*n_in;
00124 ndel=*ndel_in;
00125 if ((ndel < 0) || (ndel >= n)) {
00126 *info=-5;
00127 return;
00128 }
00129
00130 mask=(int *)MKL_malloc(n*sizeof(int),32);
00131
00132 for (i=0;i<n;i++) mask[i]=0;
00133 for (i=0;i<ndel;i++) {
00134 wi=wdel[i];
00135 mask[wi]=mask[wi]+1;
00136 }
00137
00138 for (i=n-1;i>=0;i--) {
00139 if (mask[i] != 0) {
00140 if (mask[i] == 1) {
00141 dcholesky_down_0(uplo, &n, a, lda, &i, info);
00142 if (*info !=0) {
00143 MKL_free(mask);
00144 return;
00145 }
00146 n=n-1;
00147 }
00148 else {
00149 *info=-6;
00150 MKL_free(mask);
00151 return;
00152 }
00153 }
00154 }
00155
00156 MKL_free(mask);
00157 *info=0;
00158
00159 }
00160
00161 extern void dcholesky_down_mask(
00162 char *uplo,
00163 int *n_in,
00164 double *a,
00165 int *lda,
00166 int *mask,
00167 int *info
00168 )
00169 {
00170 int i;
00171 int n;
00172
00173 n=*n_in;
00174
00175 for (i=n-1;i>=0;i--) {
00176 if (mask[i] != 0) {
00177 dcholesky_down_0(uplo, &n, a, lda, &i, info);
00178 if (*info !=0) return;
00179 n=n-1;
00180 }
00181 }
00182
00183 *info=0;
00184
00185 }
00186