identity.c

Go to the documentation of this file.
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 }

Generated on Wed Nov 11 20:41:02 2009 for DSDP by  doxygen 1.6.1