Diana  0.8.3
DianaSensDAESO.hpp
00001 #ifndef DIANA_SENS_DAESO_H
00002 #define DIANA_SENS_DAESO_H
00003 
00004 #include <Basic/DianaBasic.hpp>
00005 #include <Basic/CapeTypes.hpp>
00006 #include <Diana/IDianaSensDAESO.hpp>
00007 #include <Diana/DianaDAESO.hpp>
00008 #include <Diana/DianaUtil.hpp>
00009 
00010 namespace Diana{
00011     using Common::Types::CapeLong;
00012     using Common::Types::CapeDouble;
00013     using Common::Types::CapeBoolean;
00014     using Common::Types::CapeString;
00015     using Common::Types::CapeArrayDouble;
00016     using Common::Types::CapeArrayLong;
00017     using Common::Error::ECapeUnknown;
00018     using Common::Error::ECapeFailedInitialisation;
00019     using Common::Error::ECapeBadInvOrder;
00020 
00025     class DianaSensDAESO : virtual public IDianaSensDAESO, virtual public DianaDAESO {
00026         protected:
00027             DianaDAESO * model;
00028                 DianaSparseArray::crc_type modelParJacobianCRC;
00029         public:
00030 
00031 
00036         DianaSensDAESO(DianaDAESO * _model,
00037                        const CapeArrayLong& parIndices,
00038                            const CapeArrayLong& stateIndices);
00039         DianaSensDAESO(const DianaSensDAESO& org);
00040 
00042             virtual ~DianaSensDAESO();
00043 
00049         DianaDAESO& GetModel();
00050 
00054             virtual CapeLong GetNumSensParameters() 
00055                 throw (ECapeUnknown, ECapeFailedInitialisation);
00056 
00060             virtual CapeLong GetNumSensInitStates() 
00061                 throw (ECapeUnknown, ECapeFailedInitialisation);
00062         
00066         virtual const CapeArrayLong& GetSensParametersIndices() const
00067                 throw (ECapeUnknown, ECapeFailedInitialisation);
00068 
00072             virtual const CapeArrayLong& GetSensInitStatesIndices() const
00073                 throw (ECapeUnknown, ECapeFailedInitialisation);
00074 
00078             virtual const CapeArrayDouble& GetSensParameters() const
00079                 throw (ECapeUnknown, ECapeFailedInitialisation);
00080 
00084             virtual void SetSensParameters(const Common::Types::CapeArrayDouble& pars)
00085                 throw (ECapeUnknown, ECapeFailedInitialisation);
00086 
00090             virtual const DianaSparseArray& GetSensParJacobianValues()
00091                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl);
00092 
00096             virtual const CapeArrayDouble& GetSensInitStates()
00097                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation);
00098 
00102             virtual void SetSensInitStates(const Common::Types::CapeArrayDouble& states)
00103                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation);
00104 
00108             virtual Common::Types::CapeArrayDouble GetAllModelVariables();
00109 
00114         virtual void SetAllModelVariables(const Common::Types::CapeArrayDouble& vars);
00115 
00119         virtual Common::Types::CapeArrayDouble GetAllModelDerivatives();
00120 
00121     
00126             virtual void SetAllModelDerivatives(const Common::Types::CapeArrayDouble& vars);
00127 
00131         virtual const CapeArrayDouble& GetAllModelResiduals() 
00132             throw (ECapeUnknown, ECapeBadInvOrder, ECapeFailedInitialisation) ;
00133 
00134         virtual const DianaSparseArray& GetAllModelJacobianValues() const 
00135                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl);
00136         
00137         virtual const Diana::DianaSparseArray& GetAllModelDiffJacobianValues() const
00138                  throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl);
00139                         
00146             virtual Common::Types::CapeArrayDouble GetAllSensitivities();
00147 
00148     
00153             virtual void SetAllSensitivities(const Common::Types::CapeArrayDouble& vars);
00154 
00155     
00156 
00169         virtual void Initialize()
00170                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation,
00171                  Common::Error::ECapeOutOfResources, Common::Error::ECapeLicenceError,
00172                  Common::Error::ECapeBadInvOrder);
00173 
00182         virtual void Terminate()
00183                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeOutOfResources,
00184                  Common::Error::ECapeBadInvOrder);
00185     
00190         virtual void SetFixedVariables(const Common::Types::CapeArrayLong& varIndices,
00191                            const Common::Types::CapeArrayDouble& varValues)
00192                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument,
00193                  Common::Error::ECapeBadInvOrder, Common::Error::ECapeOutOfBounds,
00194                  Common::Error::ECapeNoImpl);
00195 
00198         virtual void SetAllVariables(const Common::Types::CapeArrayDouble& varValues)
00199                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument,
00200                  Common::Error::ECapeBadInvOrder, Common::Error::ECapeOutOfBounds);
00201 
00205         virtual void SetVariables(const Common::Types::CapeArrayLong& varIndices,
00206                       const Common::Types::CapeArrayDouble& varValues)
00207                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument,
00208                  Common::Error::ECapeBadInvOrder, Common::Error::ECapeOutOfBounds);
00209 
00211         virtual const Common::Types::CapeArrayDouble& GetAllVariables()
00212                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadInvOrder);
00213 
00216         virtual Common::Types::CapeArrayDouble GetVariables(const Common::Types::CapeArrayLong& varIndices)
00217             throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument,
00218                  Common::Error::ECapeBadInvOrder, Common::Error::ECapeOutOfBounds);
00219 
00221         virtual const Common::Types::CapeArrayDouble& GetAllResiduals()
00222                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadInvOrder,
00223                  Common::Error::ECapeFailedInitialisation);
00224 
00231         virtual const Diana::DianaSparseArray& GetJacobianStruct()
00232                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl);
00233 
00240         virtual const Diana::DianaSparseArray& GetAllJacobianValues()
00241                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl);
00242 
00244         virtual void SetVariablesIndex(const Common::Types::CapeArrayLong& varIndexes)
00245                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument,
00246                  Common::Error::ECapeOutOfBounds, Common::Error::ECapeNoImpl);
00247 
00249         virtual const Common::Types::CapeArrayDouble& GetLowerBounds()
00250             throw (Common::Error::ECapeUnknown);
00251 
00253         virtual const Common::Types::CapeArrayDouble& GetUpperBounds()
00254                 throw (Common::Error::ECapeUnknown);
00255 
00261         virtual void SetAllDerivatives(const Common::Types::CapeArrayDouble& varValues)
00262                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument,
00263              Common::Error::ECapeBadInvOrder, Common::Error::ECapeOutOfBounds);
00264 
00270         virtual const Common::Types::CapeArrayDouble& GetAllDerivatives()
00271                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadInvOrder);
00272 
00276         virtual Common::Types::CapeArrayDouble GetDerivatives(const Common::Types::CapeArrayLong& varIndices)
00277                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument,
00278              Common::Error::ECapeBadInvOrder, Common::Error::ECapeOutOfBounds);
00279 
00284         virtual void SetDerivatives(const Common::Types::CapeArrayLong& varIndices,
00285                             const Common::Types::CapeArrayDouble& varValues)
00286                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument,
00287                  Common::Error::ECapeBadInvOrder, Common::Error::ECapeOutOfBounds);
00288 
00297         virtual const Diana::DianaSparseArray& GetDiffJacobianStruct() 
00298                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl);
00299 
00307         virtual const Diana::DianaSparseArray& GetAllDiffJacobianValues()
00308                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl);
00309 
00310 
00313         virtual void SetIndependentVar(Common::Types::CapeDouble indVar)
00314                 throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00315 
00317         virtual Common::Types::CapeDouble GetIndependentVar()
00318                 throw (Common::Error::ECapeUnknown);
00319 
00320         virtual void setChangedFlags(DianaVariableType bChanged);
00321 
00322     protected:
00323         CapeArrayLong       modelJacIndices;
00324         const CapeArrayLong sensParameterIndices;    
00325         CapeArrayLong       sensParameterMap;        
00326         DianaSparseArray    mtrValuesSensParJacobi;  
00327         CapeBoolean         bValuesSensParJacobiChanged;
00328         const CapeArrayLong sensInitStateIndices;    
00329         CapeLong            nSensInitStates;         
00330         CapeLong            nSensParameters;         
00331 
00335             CapeLong            nSensitivities;            
00336             CapeLong            nModelStates;
00337             CapeLong            nModelEqns;
00338             CapeArrayDouble     arrSensInitStates; 
00339             CapeArrayDouble     arrSensParameters; 
00340             CapeDouble *        pSensitivities;  
00341 
00347         virtual void calculateResiduals() ;
00348 
00349         virtual void calculateModelResiduals();
00350         virtual void calculateSensResiduals();
00351 
00352         virtual void initializeJacobis();
00353             virtual void initializeCollections();
00354         
00355         virtual DianaDAESO* createClone();
00356             /*
00357         CapeBoolean calculateFDJacobiMatrixPartition(enumJacobianType type);
00358         CapeBoolean calculateFDJacobiMatrixSimple(enumJacobianType type);
00359         */
00360             void setupModelJacIndices();
00361 
00362   };
00363 
00364 };
00365 
00366 #endif // DIANA_SENS_DAESO_H