Main Page   Modules   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages  

PrimalDualSystem.hh

00001 #ifndef PRIMALDUALSYSTEM
00002 #define PRIMALDUALSYSTEM
00003 
00004 #include "IotrRefCount.hh"
00005 #include "IotrHandle.hh"
00006 #include "LinearOperator.hh"
00007 #include "IotrUtilities.hh"
00008 
00009 class GenMatrix;
00010 class SymMatrix;
00011 typedef Handle<SymMatrix> SymMatrixHandle;
00012 
00013 class IotrVector;
00014 typedef Handle<IotrVector> IotrVectorHandle;
00015 
00016 class GenMatrix;
00017 typedef Handle<GenMatrix> GenMatrixHandle;
00018 
00019 class LinearSymSolver;
00020 typedef Handle<LinearSymSolver> LinearSymSolverHandle;
00021 
00022 #include "ElementGather.hh"
00023 
00029 class PrimalDualSystem : public IotrRefCount {
00030   friend class PrimalDualSystemTester;
00031 protected:
00032   IotrVectorHandle   mDx;
00033   IotrVectorHandle   mOmega;
00034   IotrVectorHandle   mDgamma;
00035   IotrVectorHandle   mDphi;
00036   IotrVectorHandle   mDlambda;
00037   IotrVectorHandle   mDpi;
00038   IotrVectorHandle   mRc;
00039 
00040   ElementGatherHandle mIclow;
00041   ElementGatherHandle mIcupp;
00042   ElementGatherHandle mIeq;
00043   ElementGatherHandle mIxlow;
00044   ElementGatherHandle mIxupp;
00045 
00046   LinearOperatorHandle     mJmult;
00047 
00048   int mState;
00049 public:
00050   PrimalDualSystem( ElementGather * iclow, ElementGather * icupp,
00051                     ElementGather * ieq,
00052                     ElementGather * ixlow, ElementGather * ixupp );
00053 
00054 
00055   virtual void setDiagonals( IotrVector & Dx, IotrVector & Dy,
00056                              IotrVector & Dgamma, IotrVector & Dphi,
00057                              IotrVector & Dlambda, IotrVector & Dpi );
00058 
00059   virtual void assemble( GenMatrix & J, SymMatrix & H,
00060                          IotrVector & Dx, IotrVector & omega ) = 0;
00061 
00062   virtual void factor(  IotrVector & Dx, IotrVector & Dy,
00063                         IotrVector & Dgamma, IotrVector & Dphi,
00064                         IotrVector & Dlambda, IotrVector & Dpi,
00065                         LinearOperator * Jmult,
00066                         GenMatrix & J, SymMatrix & H );
00067 
00068   virtual void matrixChanged() = 0;
00069 
00070   virtual void newtonStep( IotrVector & xsol,
00071                            IotrVector & gammaSol, IotrVector & phiSol,
00072                            IotrVector & ysol,
00073                            IotrVector & lambdaSol, IotrVector & piSol );
00074 
00075   virtual void basicSolve( IotrVector & xsol,
00076                            IotrVector & rc ) = 0;
00077 
00078   virtual int isConvex() = 0;
00079   virtual void inspect();
00080   virtual int isValid();
00081 
00082   int isSingular()
00083   {
00084     IotrAssert( mState == factored || mState == singular );
00085 
00086     return mState == singular;
00087   }
00088 
00089   ElementGather & ixlow() { return *mIxlow; }
00090   ElementGather & ixupp() { return *mIxupp; }
00091   ElementGather & ieq()   { return *mIeq; }
00092   ElementGather & iclow() { return *mIclow; }
00093   ElementGather & icupp() { return *mIcupp; }
00094 
00095   int mc() { return mIeq->nx(); }
00096   int nx() { return mIxlow->nx(); }
00097   int my() { return mIeq->my(); }
00098   int mclow() { return mIclow->my(); }
00099   int mcupp() { return mIcupp->my(); }
00100   int nxlow() { return mIxlow->my(); }
00101   int nxupp() { return mIxupp->my(); }
00102 
00103   IotrVector & omega() { return *mOmega; }
00104   IotrVector & Dx() { return *mDx; }
00105 
00106   enum {initialState = 0, diagonalsSet, assembled, factored, singular};
00107 
00108   int state() { return mState; }
00109 };
00110 
00111 typedef Handle<PrimalDualSystem> PrimalDualSystemHandle;
00112 
00113 #endif

Generated on Wed Aug 27 10:03:41 2003 for iotr by doxygen1.2.18