dsdpschurmatadd.c

Go to the documentation of this file.
00001 #include "dsdpschurmat_impl.h"
00002 #include "dsdpschurmat.h"
00003 #include "dsdpbasictypes.h"
00004 #include "dsdpsys.h"
00005 
00011 #define DSDPNoOperationError(a);  { DSDPSETERR1(10,"Schur matrix type: %s, Operation not defined\n",(a).dsdpops->matname); }
00012 #define DSDPChkMatError(a,b);  { if (b){ DSDPSETERR1(b,"Schur matrix type: %s,\n",(a).dsdpops->matname);} }
00013 
00014 
00015 #undef __FUNCT__
00016 #define __FUNCT__ "DSDPSchurMatRowColumnScaling"
00017 
00033 int DSDPSchurMatRowColumnScaling(DSDPSchurMat M,int row, DSDPVec V, int *nzcols){
00034   int info,m;
00035   double *cols,r=M.schur->r;
00036   DSDPTruth flag;
00037   DSDPFunctionBegin;
00038   info=DSDPVecSet(0.0,V);DSDPCHKERR(info);
00039   info=DSDPVecGetSize(V,&m);DSDPCHKERR(info);
00040   if (row==0){info=DSDPVecZero(V);DSDPCHKERR(info);*nzcols=0;}
00041   else if (row==m-1){
00042     info=DSDPVecZero(V);DSDPCHKERR(info);*nzcols=0;
00043     if (r){info=DSDPVecSetR(V,1.0);DSDPCHKERR(info);*nzcols=1;}
00044   } else if (M.dsdpops->matrownonzeros){
00045     info=DSDPVecGetSize(V,&m);DSDPCHKERR(info);
00046     info=DSDPVecGetArray(V,&cols);DSDPCHKERR(info);
00047     info=(M.dsdpops->matrownonzeros)(M.data,row-1,cols+1,nzcols,m-2); DSDPChkMatError(M,info);
00048     info=DSDPVecRestoreArray(V,&cols);DSDPCHKERR(info);
00049     info=DSDPZeroFixedVariables(M,V);DSDPCHKERR(info);
00050     info=DSDPVecSetC(V,0.0);DSDPCHKERR(info);
00051     if (r){info=DSDPVecSetR(V,1.0);DSDPCHKERR(info);}
00052     info=DSDPIsFixed(M,row,&flag);DSDPCHKERR(info); 
00053     if (flag==DSDP_TRUE&&*nzcols>0){info=DSDPVecZero(V);*nzcols=0;DSDPFunctionReturn(0);}
00054   } else {
00055     DSDPNoOperationError(M);
00056   }
00057 
00058   DSDPFunctionReturn(0);
00059 }
00060 
00061 #undef __FUNCT__
00062 #define __FUNCT__ "DSDPSchurMatAddRow"
00063 
00076 int DSDPSchurMatAddRow(DSDPSchurMat M, int row, double alpha, DSDPVec R){
00077   int info,j,m;
00078   double *v,rr,dd=1e-1*M.schur->dd;
00079   DSDPVec rhs3=M.schur->rhs3;
00080   DSDPTruth flag;
00081   DSDPFunctionBegin;
00082   info=DSDPVecGetSize(R,&m); DSDPCHKERR(info);
00083   if (row==0){
00084   } else if (row==m-1){
00085     info=DSDPVecGetR(R,&rr);DSDPCHKERR(info);
00086     info=DSDPVecAddR(rhs3,alpha*rr);DSDPCHKERR(info);
00087   } else if (M.dsdpops->mataddrow){
00088     info=DSDPVecGetArray(R,&v); DSDPCHKERR(info);
00089     /*    v[row]=DSDPMax(0,v[row]); v[row]+=1.0e-15; */
00090     for (j=0;j<m;j++){ if (fabs(v[j]) < 1e-25 && row!=j){ v[j]=0.0;} }
00091     v[row]*=(1.0+dd);
00092     info=DSDPZeroFixedVariables(M,R);DSDPCHKERR(info);
00093     info=DSDPIsFixed(M,row,&flag);DSDPCHKERR(info); 
00094     if (flag==DSDP_TRUE){info=DSDPVecSetBasis(R,row);DSDPCHKERR(info);}
00095     info=(M.dsdpops->mataddrow)(M.data,row-1,alpha,v+1,m-2); DSDPChkMatError(M,info);
00096     info=DSDPVecRestoreArray(R,&v); DSDPCHKERR(info);  
00097     info=DSDPVecGetR(R,&rr); DSDPCHKERR(info);
00098     info=DSDPVecAddElement(rhs3,row,alpha*rr); DSDPCHKERR(info);
00099   } else {
00100     DSDPNoOperationError(M);
00101   }
00102   DSDPFunctionReturn(0);
00103 }
00104 
00105 #undef __FUNCT__
00106 #define __FUNCT__ "DSDPSchurMatVariableCompute"
00107 
00120 int DSDPSchurMatVariableCompute(DSDPSchurMat M, int row, double *rcv){
00121   int info,m,dd=1;
00122   double r=M.schur->r;
00123   DSDPTruth flag;
00124   DSDPFunctionBegin;
00125   info=DSDPVecGetSize(M.schur->rhs3,&m);
00126   if (row==0){ *rcv=0.0;
00127   } else if (row==m-1){ 
00128     if (r){*rcv=1.0;}
00129     else {*rcv=0.0;}
00130   } else if (M.dsdpops->pmatonprocessor){
00131     info=(M.dsdpops->pmatonprocessor)(M.data,row-1,&dd); DSDPChkMatError(M,info);
00132     if (dd){*rcv=1.0;} else {*rcv=0;}
00133   } else {
00134     info=DSDPSchurMatInParallel(M,&flag);DSDPChkMatError(M,info);
00135     if (flag==DSDP_FALSE){ *rcv=1.0;
00136     } else {
00137       DSDPNoOperationError(M);
00138     }
00139   }
00140   DSDPFunctionReturn(0);
00141 }
00142 
00143 #undef __FUNCT__
00144 #define __FUNCT__ "DSDPSchurMatAddDiagonalElement"
00145 
00157 int DSDPSchurMatAddDiagonalElement(DSDPSchurMat M, int row, double dd){
00158   int info,m;
00159   DSDPVec rhs3=M.schur->rhs3;
00160   DSDPFunctionBegin;
00161   info=DSDPVecGetSize(rhs3,&m);DSDPCHKERR(info);
00162   if (dd==0){
00163   } else if (row==0){  
00164   } else if (row==m-1){info=DSDPVecAddR(rhs3,dd);
00165   } else if (M.dsdpops->mataddelement){
00166     info=(M.dsdpops->mataddelement)(M.data,row-1,dd); DSDPChkMatError(M,info);
00167   } else {
00168     DSDPNoOperationError(M);
00169   }
00170   DSDPFunctionReturn(0);
00171 }
00172 
00173 #undef __FUNCT__
00174 #define __FUNCT__ "DSDPSchurMatVariableComputeR"
00175 
00181 int DSDPSchurMatVariableComputeR(DSDPSchurMat M, double *rcv){
00182   DSDPFunctionBegin;
00183   *rcv=0.0;
00184   if (M.schur->r) *rcv=1.0;
00185   DSDPFunctionReturn(0);
00186 }
00187 
00188 
00189 #undef __FUNCT__
00190 #define __FUNCT__ "DSDPSchurMatAddR"
00191 
00198 int DSDPSchurMatAddR(DSDPSchurMat M, int row, double dd){
00199   int info;
00200   DSDPFunctionBegin;
00201   if (dd==0){DSDPFunctionReturn(0);}
00202   info=DSDPVecAddElement(M.schur->rhs3,row,dd);DSDPCHKERR(info);
00203   DSDPFunctionReturn(0);
00204 }
00205 
00206 #undef __FUNCT__
00207 #define __FUNCT__ "DSDPSchurMatVariableComputeC"
00208 int DSDPSchurMatVariableComputeC(DSDPSchurMat M, double *rcv){
00209   DSDPFunctionBegin;
00210   *rcv=0.0;
00211   DSDPFunctionReturn(0);
00212 }
00213 
00214 #undef __FUNCT__
00215 #define __FUNCT__ "DSDPSchurMatAddC"
00216 int DSDPSchurMatAddC(DSDPSchurMat M, int row, double dd){
00217   DSDPFunctionBegin;
00218   DSDPFunctionReturn(0);
00219 }
00220 
00221 #undef __FUNCT__
00222 #define __FUNCT__ "DSDPSchurMatDiagonalScaling"
00223 
00235 int DSDPSchurMatDiagonalScaling(DSDPSchurMat M, DSDPVec D){
00236   int m,info;
00237   double *vars;
00238   DSDPTruth flag;
00239   DSDPFunctionBegin;
00240   info=DSDPVecSet(1.0,D);DSDPCHKERR(info);
00241   info=DSDPVecGetSize(D,&m);DSDPCHKERR(info);
00242   if (M.dsdpops->pmatlocalvariables){
00243     info=DSDPVecGetArray(D,&vars);DSDPCHKERR(info);
00244     info=(M.dsdpops->pmatlocalvariables)(M.data,vars+1,m-2); DSDPChkMatError(M,info);
00245     info=DSDPVecRestoreArray(D,&vars);DSDPCHKERR(info);
00246   } else {
00247     info=DSDPSchurMatInParallel(M,&flag);DSDPChkMatError(M,info);
00248     if (flag==DSDP_TRUE){
00249       DSDPNoOperationError(M);
00250     }
00251   }
00252   info=DSDPVecSetC(D,0.0);DSDPCHKERR(info);
00253   if (M.schur->r==0){info=DSDPVecSetR(D,0.0);DSDPCHKERR(info);}
00254   info=DSDPZeroFixedVariables(M,D);DSDPCHKERR(info);
00255   DSDPFunctionReturn(0);
00256 }
00257 
00258 #undef __FUNCT__
00259 #define __FUNCT__ "DSDPSchurMatAddDiagonal"
00260 
00272 int DSDPSchurMatAddDiagonal(DSDPSchurMat M, DSDPVec D){
00273   int m,info;
00274   double *dd;
00275   DSDPFunctionBegin;
00276   if (M.dsdpops->matadddiagonal){
00277     info=DSDPZeroFixedVariables(M,D);DSDPCHKERR(info);
00278     info=DSDPVecGetSize(D,&m); DSDPCHKERR(info);
00279     info=DSDPVecGetArray(D,&dd); DSDPCHKERR(info);
00280     info=(M.dsdpops->matadddiagonal)(M.data,dd+1,m-2); DSDPChkMatError(M,info);
00281     info=DSDPVecAddR(M.schur->rhs3,dd[m-1]);DSDPCHKERR(info);
00282     info=DSDPVecRestoreArray(D,&dd); DSDPCHKERR(info);
00283   } else {
00284     DSDPNoOperationError(M);
00285   }
00286   DSDPFunctionReturn(0);
00287 }
00288 
00289 

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