Main Page | Modules | Alphabetical List | Data Structures | Directories | File List | Globals | Related Pages

dsdpschurmatadd.c

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

Generated on Sat Oct 15 11:05:39 2005 for DSDP by  doxygen 1.4.2