DSDP
|
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