00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <ItpackLinSolver.h>
00035 #include <ItpackLinSOE.h>
00036 #include <ID.h>
00037
00038 ItpackLinSolver::ItpackLinSolver(int meth, int iter, double om)
00039 :LinearSOESolver(SOLVER_TAGS_Itpack),
00040 theSOE(0), IA(0), JA(0), n(0),
00041 iwksp(0), wksp(0), nwksp(0), maxIter(iter),
00042 method(meth), omega(om)
00043 {
00044
00045 }
00046
00047 ItpackLinSolver::ItpackLinSolver()
00048 :LinearSOESolver(SOLVER_TAGS_Itpack),
00049 theSOE(0), IA(0), JA(0), n(0),
00050 iwksp(0), wksp(0), nwksp(0), maxIter(0),
00051 method(0), omega(0.0)
00052 {
00053
00054 }
00055
00056 ItpackLinSolver::~ItpackLinSolver()
00057 {
00058 if (IA != 0)
00059 delete [] IA;
00060
00061 if (JA != 0)
00062 delete [] JA;
00063
00064 if (iwksp != 0)
00065 delete [] iwksp;
00066
00067 if (wksp != 0)
00068 delete [] wksp;
00069 }
00070
00071 int
00072 ItpackLinSolver::setLinearSOE(ItpackLinSOE &theItpackSOE)
00073 {
00074 theSOE = &theItpackSOE;
00075
00076 return 0;
00077 }
00078
00079 int
00080 ItpackLinSolver::setSize(void)
00081 {
00082
00083 n = theSOE->size;
00084
00085 if (n > 0) {
00086 if (iwksp != 0)
00087 delete [] iwksp;
00088 iwksp = new int[3*n];
00089 }
00090
00091
00092 int ncg = 4*maxIter;
00093
00094
00095 int nb = theSOE->nnz;
00096
00097 switch(method) {
00098 case ItpackJCG:
00099 nwksp = 4*n + ncg;
00100 break;
00101 case ItpackJSI: case ItpackJ:
00102 nwksp = 2*n;
00103 break;
00104 case ItpackSOR: case ItpackGS: case ItpackSORFixed:
00105 nwksp = n;
00106 break;
00107 case ItpackSSORCG:
00108 nwksp = 6*n + ncg;
00109 break;
00110 case ItpackSSORSI: case ItpackSSORFixed:
00111 nwksp = 5*n;
00112 break;
00113 case ItpackRSCG:
00114 nwksp = n + 3*nb + ncg;
00115 break;
00116 case ItpackRSSI: case ItpackRS:
00117 nwksp = n + nb;
00118 break;
00119 default:
00120 nwksp = 6*n + ncg;
00121 break;
00122 }
00123
00124 if (nwksp > 0) {
00125 if (wksp != 0)
00126 delete [] wksp;
00127 wksp = new double[nwksp];
00128 }
00129
00130
00131 int nnz = theSOE->nnz;
00132
00133 if (nnz > 0) {
00134 if (JA != 0)
00135 delete [] JA;
00136 JA = new int [nnz];
00137 }
00138
00139 int *jaPtr = theSOE->colA;
00140 int i;
00141
00142 for (i = 0; i < nnz; i++)
00143 JA[i] = jaPtr[i] + 1;
00144
00145 if (n > 0) {
00146 if (IA != 0)
00147 delete [] IA;
00148 IA = new int [n+1];
00149 }
00150
00151 int *iaPtr = theSOE->rowStartA;
00152
00153 for (i = 0; i <= n; i++)
00154 IA[i] = iaPtr[i] + 1;
00155
00156 return 0;
00157 }
00158
00159 int
00160 ItpackLinSolver::sendSelf(int commitTag, Channel &theChannel)
00161 {
00162 return -1;
00163 }
00164
00165 int
00166 ItpackLinSolver::recvSelf(int commitTag, Channel &theChannel,
00167 FEM_ObjectBroker &theBroker)
00168 {
00169 return -1;
00170 }
00171
00172 #ifdef _WIN32
00173
00174 extern "C" int _stdcall DFAULT(int *IPARM, double *RPARM);
00175
00176 extern "C" int _stdcall VFILL(int *N, double *U, double *VAL);
00177
00178 extern "C" int _stdcall JCG(int *N, int *IA, int *JA, double *A, double *RHS,
00179 double *U, int *IWKSP, int *NW, double *WKSP,
00180 int *IPARM, double *RPARM, int *IER);
00181
00182 extern "C" int _stdcall JSI(int *N, int *IA, int *JA, double *A, double *RHS,
00183 double *U, int *IWKSP, int *NW, double *WKSP,
00184 int *IPARM, double *RPARM, int *IER);
00185
00186 extern "C" int _stdcall SOR(int *N, int *IA, int *JA, double *A, double *RHS,
00187 double *U, int *IWKSP, int *NW, double *WKSP,
00188 int *IPARM, double *RPARM, int *IER);
00189
00190 extern "C" int _stdcall SSORCG(int *N, int *IA, int *JA, double *A, double *RHS,
00191 double *U, int *IWKSP, int *NW, double *WKSP,
00192 int *IPARM, double *RPARM, int *IER);
00193
00194 extern "C" int _stdcall SSORSI(int *N, int *IA, int *JA, double *A, double *RHS,
00195 double *U, int *IWKSP, int *NW, double *WKSP,
00196 int *IPARM, double *RPARM, int *IER);
00197
00198 extern "C" int _stdcall RSCG(int *N, int *IA, int *JA, double *A, double *RHS,
00199 double *U, int *IWKSP, int *NW, double *WKSP,
00200 int *IPARM, double *RPARM, int *IER);
00201
00202 extern "C" int _stdcall RSSI(int *N, int *IA, int *JA, double *A, double *RHS,
00203 double *U, int *IWKSP, int *NW, double *WKSP,
00204 int *IPARM, double *RPARM, int *IER);
00205
00206 #define DFAULT dfault_
00207 #define VFILL vfill_
00208 #define JCG jcg_
00209 #define JSI jsi_
00210 #define SOR sor_
00211 #define SSORCG ssorcg_
00212 #define SSORSI ssorsi_
00213 #define RSCG rscg_
00214 #define RSSI rssi_
00215
00216 #else
00217
00218 extern "C" int dfault_(int *iparm, double *rparm);
00219
00220 extern "C" int vfill_(int *n, double *u, double *val);
00221
00222 extern "C" int jcg_(int *n, int *ia, int *ja, double *a, double *rhs,
00223 double *u, int *iwksp, int *nw, double *wksp,
00224 int *iparm, double *rparm, int *ier);
00225
00226 extern "C" int jsi_(int *n, int *ia, int *ja, double *a, double *rhs,
00227 double *u, int *iwksp, int *nw, double *wksp,
00228 int *iparm, double *rparm, int *ier);
00229
00230 extern "C" int sor_(int *n, int *ia, int *ja, double *a, double *rhs,
00231 double *u, int *iwksp, int *nw, double *wksp,
00232 int *iparm, double *rparm, int *ier);
00233
00234 extern "C" int ssorcg_(int *n, int *ia, int *ja, double *a, double *rhs,
00235 double *u, int *iwksp, int *nw, double *wksp,
00236 int *iparm, double *rparm, int *ier);
00237
00238 extern "C" int ssorsi_(int *n, int *ia, int *ja, double *a, double *rhs,
00239 double *u, int *iwksp, int *nw, double *wksp,
00240 int *iparm, double *rparm, int *ier);
00241
00242 extern "C" int rscg_(int *n, int *ia, int *ja, double *a, double *rhs,
00243 double *u, int *iwksp, int *nw, double *wksp,
00244 int *iparm, double *rparm, int *ier);
00245
00246 extern "C" int rssi_(int *n, int *ia, int *ja, double *a, double *rhs,
00247 double *u, int *iwksp, int *nw, double *wksp,
00248 int *iparm, double *rparm, int *ier);
00249
00250 #endif
00251
00252 int
00253 ItpackLinSolver::solve(void)
00254 {
00255
00256 dfault_(iparm, rparm);
00257
00258
00259 switch (method) {
00260 case ItpackJ:
00261 iparm[5] = 0; iparm[6] = 2; break;
00262 case ItpackGS:
00263 iparm[5] = 0; break;
00264 case ItpackSORFixed:
00265 iparm[5] = 0; rparm[4] = omega; break;
00266 case ItpackSSORFixed:
00267 iparm[5] = 0; rparm[4] = omega; break;
00268 case ItpackRS:
00269 iparm[5] = 0; break;
00270 default:
00271 break;
00272 }
00273
00274
00275 iparm[0] = maxIter;
00276
00277
00278 iparm[4] = 1;
00279
00280 double *aPtr = theSOE->A;
00281 double *xPtr = theSOE->X;
00282 double *bPtr = theSOE->B;
00283
00284 int *iaPtr = IA;
00285 int *jaPtr = JA;
00286
00287
00288 int nnz = iaPtr[n]-1;
00289
00290
00291
00292 if (theSOE->Aformed == false) {
00293 int *soeColA = theSOE->colA;
00294 for (int i = 0; i < nnz; i++) {
00295 jaPtr[i] = soeColA[i] + 1;
00296 }
00297 }
00298
00299 int ier = 0;
00300
00301
00302
00303
00304
00305 switch (method) {
00306 case ItpackJCG:
00307 jcg_(&n, iaPtr, jaPtr, aPtr, bPtr, xPtr,
00308 iwksp, &nwksp, wksp, iparm, rparm, &ier);
00309 break;
00310 case ItpackJSI: case ItpackJ:
00311 jsi_(&n, iaPtr, jaPtr, aPtr, bPtr, xPtr,
00312 iwksp, &nwksp, wksp, iparm, rparm, &ier);
00313 break;
00314 case ItpackSOR: case ItpackGS: case ItpackSORFixed:
00315 sor_(&n, iaPtr, jaPtr, aPtr, bPtr, xPtr,
00316 iwksp, &nwksp, wksp, iparm, rparm, &ier);
00317 break;
00318 case ItpackSSORCG:
00319 ssorcg_(&n, iaPtr, jaPtr, aPtr, bPtr, xPtr,
00320 iwksp, &nwksp, wksp, iparm, rparm, &ier);
00321 break;
00322 case ItpackSSORSI: case ItpackSSORFixed:
00323 ssorsi_(&n, iaPtr, jaPtr, aPtr, bPtr, xPtr,
00324 iwksp, &nwksp, wksp, iparm, rparm, &ier);
00325 break;
00326 case ItpackRSCG:
00327 rscg_(&n, iaPtr, jaPtr, aPtr, bPtr, xPtr,
00328 iwksp, &nwksp, wksp, iparm, rparm, &ier);
00329 break;
00330 case ItpackRSSI: case ItpackRS:
00331 rssi_(&n, iaPtr, jaPtr, aPtr, bPtr, xPtr,
00332 iwksp, &nwksp, wksp, iparm, rparm, &ier);
00333 break;
00334 default:
00335 g3ErrorHandler->fatal("%s -- unknown method type %d",
00336 "ItpackLinSolver::solve()", method);
00337 break;
00338 }
00339
00340
00341 theSOE->Aformed = true;
00342
00343 if (ier > 0) {
00344 opserr << "ItpackLinSolver::solve() -- returned ier = " << ier << endln;
00345 return -ier;
00346 }
00347 else
00348 return 0;
00349 }