Diana
0.8.3
|
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