00001 #include "dsdpdatamat_impl.h" 00002 #include "dsdpsys.h" 00008 typedef struct { 00009 int n; 00010 double dm; 00011 } identitymat; 00012 00013 00014 static int IdentityMatDestroy(void*); 00015 static int IdentityMatView(void*); 00016 static int IdentityMatVecVec(void*, double[], int, double *); 00017 static int IdentityMatDotP(void*, double[], int, int, double*); 00018 static int IdentityMatDotF(void*, double[], int, int, double*); 00019 static int IdentityMatGetRank(void*, int*,int); 00020 static int IdentityMatFactor(void*); 00021 static int IdentityMatGetEig(void*, int, double*, double[], int,int[],int*); 00022 static int IdentityMatAddRowMultiple(void*, int, double, double[], int); 00023 static int IdentityMatAddMultipleP(void*, double, double[], int, int); 00024 static int IdentityMatAddMultipleF(void*, double, double[], int, int); 00025 static int IdentityMatGetRowNnz(void*, int, int[], int*, int); 00026 00027 static struct DSDPDataMat_Ops identitymatopsp; 00028 static struct DSDPDataMat_Ops identitymatopsf; 00029 static int IdentitymatOperationsInitializeP(struct DSDPDataMat_Ops*); 00030 static int IdentitymatOperationsInitializeF(struct DSDPDataMat_Ops*); 00031 00032 00042 #undef __FUNCT__ 00043 #define __FUNCT__ "DSDPSetIdentityP" 00044 int DSDPGetIdentityDataMatP(int n, double val, struct DSDPDataMat_Ops** dops, void** imat){ 00045 int info; 00046 identitymat *AA; 00047 00048 DSDPFunctionBegin; 00049 AA=(identitymat*) malloc(1*sizeof(identitymat)); 00050 AA->dm=val; 00051 AA->n=n; 00052 info=IdentitymatOperationsInitializeP(&identitymatopsp); DSDPCHKERR(info); 00053 if (dops){*dops=&identitymatopsp;} 00054 if (imat){*imat=(void*)AA;} 00055 DSDPFunctionReturn(0); 00056 } 00057 00067 #undef __FUNCT__ 00068 #define __FUNCT__ "DSDPSetIdentityF" 00069 int DSDPGetIdentityDataMatF(int n, double val, struct DSDPDataMat_Ops** dops, void** imat){ 00070 int info; 00071 identitymat *AA; 00072 00073 DSDPFunctionBegin; 00074 AA=(identitymat*) malloc(1*sizeof(identitymat)); 00075 AA->dm=val; 00076 AA->n=n; 00077 info=IdentitymatOperationsInitializeF(&identitymatopsf); DSDPCHKERR(info); 00078 if (dops){*dops=&identitymatopsf;} 00079 if (imat){*imat=(void*)AA;} 00080 DSDPFunctionReturn(0); 00081 } 00082 00083 static int IdentityMatDestroy(void* AA){ 00084 free(AA); 00085 return 0; 00086 } 00087 00088 00089 static int IdentityMatVecVec(void* AA, double x[], int n, double *v){ 00090 identitymat* A=(identitymat*)AA; 00091 int i; 00092 *v=0; 00093 for (i=0;i<n;i++){ 00094 *v+=x[i]*x[i]; 00095 } 00096 *v *= A->dm; 00097 return 0; 00098 } 00099 00100 static int IdentityMatDotP(void* AA, double x[], int nn, int n, double *v){ 00101 identitymat* A=(identitymat*)AA; 00102 int i; 00103 double *xx=x; 00104 *v=0; 00105 for (i=0;i<n;i++){ 00106 *v+=*xx; 00107 xx+=i+2; 00108 } 00109 *v *= 2*A->dm; 00110 return 0; 00111 } 00112 00113 static int IdentityMatDotF(void* AA, double x[], int nn, int n, double *v){ 00114 identitymat* A=(identitymat*)AA; 00115 int i; 00116 double *xx=x; 00117 *v=0; 00118 for (i=0;i<n;i++){ 00119 *v+=*xx; 00120 xx+=n+1; 00121 } 00122 *v *= 2*A->dm; 00123 return 0; 00124 } 00125 00126 static int IdentityMatFNorm2(void* AA, int n, double *v){ 00127 identitymat* A=(identitymat*)AA; 00128 *v=A->n*A->dm*A->dm; 00129 return 0; 00130 } 00131 00132 static int IdentityMatView(void* AA){ 00133 identitymat* A=(identitymat*)AA; 00134 printf("Multiple of Identity matrix: All Diagonal elements equal %8.8e \n",A->dm); 00135 return 0; 00136 } 00137 00138 static int IdentityMatGetRank(void *AA, int*rank, int n){ 00139 identitymat* A=(identitymat*)AA; 00140 *rank=A->n;; 00141 return 0; 00142 } 00143 00144 static int IdentityMatFactor(void*A){ 00145 return 0; 00146 } 00147 00148 static int IdentityMatGetEig(void*AA, int neig, double *eig, double v[], int n, int* indx, int *nind){ 00149 identitymat* A = (identitymat*)AA; 00150 00151 if (neig<0 || neig>= A->n){ *eig=0; return 0;} 00152 memset((void*)v,0,(A->n)*sizeof(double)); 00153 v[neig]=1.0; 00154 indx[0]=neig; 00155 *nind=1; 00156 *eig=A->dm; 00157 return 0; 00158 } 00159 00160 static int IdentityMatGetRowNnz(void*A, int nrow, int nz[], int *nnzz, int n){ 00161 identitymat* AA = (identitymat*)A; 00162 if (nrow>=0 && nrow < AA->n){ 00163 *nnzz=1; 00164 nz[nrow]++; 00165 } else { 00166 *nnzz=0; 00167 } 00168 return 0; 00169 } 00170 00171 static int IdentityMatCountNonzeros(void*A, int *nnz, int n){ 00172 identitymat* AA = (identitymat*)A; 00173 *nnz=AA->n; 00174 return 0; 00175 } 00176 00177 static int IdentityMatAddRowMultiple(void*A, int nrow, double dd, double rrow[], int n){ 00178 identitymat* AA = (identitymat*)A; 00179 rrow[nrow] += dd*AA->dm; 00180 return 0; 00181 } 00182 00183 static int IdentityMatAddMultipleP(void*A, double dd, double vv[], int nn, int n){ 00184 identitymat* AA = (identitymat*)A; 00185 double *v=vv,dm=dd*AA->dm; 00186 int i; 00187 for (i=0;i<n;i++){ 00188 *v += dm; 00189 v+= i+2; 00190 } 00191 return 0; 00192 } 00193 00194 static int IdentityMatAddMultipleF(void*A, double dd, double vv[], int nn, int n){ 00195 identitymat* AA = (identitymat*)A; 00196 double *v=vv,dm=dd*AA->dm; 00197 int i; 00198 for (i=0;i<n;i++){ 00199 *v += dm; 00200 v+= n+1; 00201 } 00202 return 0; 00203 } 00204 00205 static const char *datamatname="MULTIPLE OF IDENTITY"; 00206 00207 static int IdentitymatOperationsInitializeP(struct DSDPDataMat_Ops* spdiagops){ 00208 int info; 00209 if (spdiagops==NULL) return 0; 00210 info=DSDPDataMatOpsInitialize(spdiagops); if (info){return info;} 00211 spdiagops->matfactor1=IdentityMatFactor; 00212 spdiagops->matgetrank=IdentityMatGetRank; 00213 spdiagops->matgeteig=IdentityMatGetEig; 00214 spdiagops->matvecvec=IdentityMatVecVec; 00215 spdiagops->matrownz=IdentityMatGetRowNnz; 00216 spdiagops->matdot=IdentityMatDotP; 00217 spdiagops->matfnorm2=IdentityMatFNorm2; 00218 spdiagops->matnnz=IdentityMatCountNonzeros; 00219 spdiagops->mataddrowmultiple=IdentityMatAddRowMultiple; 00220 spdiagops->mataddallmultiple=IdentityMatAddMultipleP; 00221 spdiagops->matdestroy=IdentityMatDestroy; 00222 spdiagops->matview=IdentityMatView; 00223 spdiagops->id=12; 00224 spdiagops->matname=datamatname; 00225 return 0; 00226 } 00227 00228 static int IdentitymatOperationsInitializeF(struct DSDPDataMat_Ops* spdiagops){ 00229 int info; 00230 if (spdiagops==NULL) return 0; 00231 info=DSDPDataMatOpsInitialize(spdiagops); if (info){return info;} 00232 spdiagops->matfactor1=IdentityMatFactor; 00233 spdiagops->matgetrank=IdentityMatGetRank; 00234 spdiagops->matgeteig=IdentityMatGetEig; 00235 spdiagops->matvecvec=IdentityMatVecVec; 00236 spdiagops->matrownz=IdentityMatGetRowNnz; 00237 spdiagops->matdot=IdentityMatDotF; 00238 spdiagops->matfnorm2=IdentityMatFNorm2; 00239 spdiagops->matnnz=IdentityMatCountNonzeros; 00240 spdiagops->mataddrowmultiple=IdentityMatAddRowMultiple; 00241 spdiagops->mataddallmultiple=IdentityMatAddMultipleF; 00242 spdiagops->matdestroy=IdentityMatDestroy; 00243 spdiagops->matview=IdentityMatView; 00244 spdiagops->id=12; 00245 spdiagops->matname=datamatname; 00246 return 0; 00247 }