00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "SymSparseLinSOE.h"
00016 #include "SymSparseLinSolver.h"
00017 #include <f2c.h>
00018 #include <math.h>
00019 #include <Channel.h>
00020 #include <FEM_ObjectBroker.h>
00021
00022 extern "C" {
00023 #include "FeStructs.h"
00024 #include "globalVars.h"
00025 #include "tim.h"
00026 }
00027
00028
00029 SymSparseLinSolver::SymSparseLinSolver()
00030 :LinearSOESolver(SOLVER_TAGS_SymSparseLinSolver),
00031 theSOE(0), factored(false)
00032 {
00033
00034 }
00035
00036
00037 SymSparseLinSolver::~SymSparseLinSolver()
00038 {
00039
00040 }
00041
00042
00043 extern "C" int pfsfct(int neqns, double *diag, double **penv, int nblks, int *xblk,
00044 OFFDBLK **begblk, OFFDBLK *first, int *rowblks);
00045
00046 extern "C" void pfsslv(int neqns, double *diag, double **penv, int nblks,
00047 int *xblk, double *rhs, OFFDBLK **begblk);
00048
00049
00050 int
00051 SymSparseLinSolver::solve(void)
00052 {
00053 if (theSOE == 0) {
00054 cerr << "WARNING SymSparseLinSolver::solve(void)- ";
00055 cerr << " No LinearSOE object has been set\n";
00056 return -1;
00057 }
00058
00059 int nblks = theSOE->nblks;
00060 int *xblk = theSOE->xblk;
00061 int *invp = theSOE->invp;
00062 double *diag = theSOE->diag;
00063 double **penv = theSOE->penv;
00064 int *rowblks = theSOE->rowblks;
00065 OFFDBLK **begblk = theSOE->begblk;
00066 OFFDBLK *first = theSOE->first;
00067
00068
00069 int neq = theSOE->size;
00070
00071
00072 if (neq == 0)
00073 return 0;
00074
00075
00076
00077 for (int i=0; i<neq; i++) {
00078 theSOE->X[i] = theSOE->B[i];
00079 }
00080 double *Xptr = theSOE->X;
00081
00082 timer (FACTOR);
00083 if (factored == false) {
00084
00085
00086
00087 int factor;
00088 factor = pfsfct(neq, diag, penv, nblks, xblk, begblk, first, rowblks);
00089 if (factor>0) {
00090 cerr << "In SymSparseLinSolver: error in factorization.\n";
00091 return -1;
00092 }
00093 factored = true;
00094 }
00095
00096
00097
00098 timer (SOLVE);
00099 pfsslv(neq, diag, penv, nblks, xblk, Xptr, begblk);
00100
00101
00102
00103
00104
00105 double *tempX = new double[neq];
00106 if (tempX == 0) {
00107 cerr << "WARNING LawSparseLinSover::SymSparseLinSolver :";
00108 cerr << " ran out of memory for vectors (tempX) ";
00109 return -1;
00110 }
00111
00112 for (int m=0; m<neq; m++) {
00113 tempX[m] = Xptr[invp[m]];
00114 }
00115
00116 for (int k=0; k<neq; k++) {
00117 Xptr[k] = tempX[k];
00118 }
00119
00120 delete [] tempX;
00121
00122 timer (END);
00123
00124 return 0;
00125 }
00126
00127
00128 int
00129 SymSparseLinSolver::setSize()
00130 {
00131
00132 return 0;
00133 }
00134
00135
00136 int
00137 SymSparseLinSolver::setLinearSOE(SymSparseLinSOE &theLinearSOE)
00138 {
00139 theSOE = &theLinearSOE;
00140 return 0;
00141 }
00142
00143
00144 int
00145 SymSparseLinSolver::sendSelf(int cTAg, Channel &theChannel)
00146 {
00147
00148 return 0;
00149 }
00150
00151
00152 int
00153 SymSparseLinSolver::recvSelf(int cTag,
00154 Channel &theChannel, FEM_ObjectBroker &theBroker)
00155 {
00156
00157 return 0;
00158 }
00159
00160
00161
00162