Diana  0.8.3
SteadyStateContinuation.hpp
00001 /* -----------------------------------------------------------------------------
00002  *  Diana process modelling, simulation and analysis software
00003  *  Copyright (c) 2005, Michael Krasnyk
00004  *  All rights reserved.
00005 
00006  *  This file is a part of Diana process modelling, simulation and analysis software
00007  *
00008  *  Diana is free software; you can redistribute it and/or modify it
00009  *  under the terms of the GNU General Public License as published
00010  *  by the Free Software Foundation (see accompanying file LICENSE)
00011  * -----------------------------------------------------------------------------
00012  *  $Id: SteadyStateContinuation.hpp 8160 2009-03-16 18:36:30Z miha $
00013  * -----------------------------------------------------------------------------
00014  *  Description:
00015  */
00016 
00017 #ifndef STEADY_STATE_CONTINUATION__HPP
00018 #define STEADY_STATE_CONTINUATION__HPP
00019 
00020 
00021 #ifdef HAVE_CONFIG_H
00022 #include <config.h>
00023 #endif
00024 
00025 #include <Diana.hpp>
00026 #include <Fortran.hpp>
00027 #include <DianaContinuation.hpp>
00028 #include <vector>
00029 #include <DianaSparseSolver.hpp>
00030 
00031 namespace Diana {
00032 
00037   class SteadyStateContinuation : public DianaContinuation {
00038   public:
00045     SteadyStateContinuation(Numeric::Solvers::Model::ICapeNumericModel* _pModel);
00046     virtual ~SteadyStateContinuation();
00047 
00048     Common::Types::CapeString GetVariableName(Common::Types::CapeLong index)
00049       throw (Common::Error::ECapeUnknown);
00050 
00051   protected:
00053     int getModelEquations();
00054 
00056     int getModelVariables();
00057 
00060     void packModelBoundaries(Common::Types::CapeArrayDouble& arrMinY,
00061                              Common::Types::CapeArrayDouble& arrMaxY);
00062 
00064     void packModelVector(Common::Types::CapeArrayDouble& modelVector);
00065 
00067     void unpackModelVector(const Common::Types::CapeArrayDouble& modelVector);
00068 
00070     void packModelResidual(Common::Types::CapeArrayDouble& modelResidual);
00071 
00073     void packModelJacobian(Diana::DianaSparseArray& Jaco);
00074 
00075     CapeBoolean calcTestCondition(CapeBoolean bFirstCall=false);
00076 
00077     CapeBoolean calcEigenvalues();
00078     CapeBoolean calcEigenvaluesLapack();
00079     CapeBoolean calcEigenvaluesArpack();
00080 
00081     std::vector<std::complex<Common::Types::CapeDouble> > GetEigenvalues()
00082       throw (Common::Error::ECapeUnknown);
00083 
00084   protected:
00085     Common::Types::CapeBoolean      bStabilityCheck;
00086     Common::Types::CapeBoolean      bStability;
00087     Common::Types::CapeLong         nConditionTest;
00088     Common::Types::CapeLong         nConditionCurrent;
00089     const Common::Types::CapeLong   nEigMonitorMax;
00090     Common::Types::CapeLong         nEigMonitor;
00091     Common::Types::CapeLong         nEigConverged;
00092 
00093     Common::Parameter::ICapeParameter* prmEigSolver;
00094 
00095   private:
00096     Common::Types::CapeArrayDouble  arrReEigenValues;
00097     Common::Types::CapeArrayDouble  arrImEigenValues;
00098     Common::Types::CapeLong         nPrevReal;
00099     Common::Types::CapeLong         nPrevImag;
00100 
00101   private:
00102     std::vector<fortrand>           lapA;
00103     std::vector<fortrand>           lapB;
00104     std::vector<fortrand>           lapAlphaR;
00105     std::vector<fortrand>           lapAlphaI;
00106     std::vector<fortrand>           lapBeta;
00107     std::vector<fortrand>           lapVl;
00108     std::vector<fortrand>           lapVr;
00109     std::vector<fortrand>           lapWork;
00110 
00111   private:
00112     std::vector<fortrand>           arpResid;
00113     std::vector<fortrand>           arpV;
00114     std::vector<fortrand>           arpWorkd;
00115     std::vector<fortrand>           arpWorkl;
00116     std::vector<fortrand>           arpTmpX;
00117     std::vector<fortranl>           arpSelect;
00118     std::vector<fortrand>           arpWorkev;
00119 
00120     Diana::DianaSparseArray         dsaArpAsM;
00121     Diana::DianaSparseSolver        dssArpM;
00122     Diana::DianaSparseSolver        dssArpAsM;
00123   };
00124 
00125 };
00126 
00127 #endif // STEADY_STATE_CONTINUATION__H
00128