00001 00002 /******************************************************* 00003 * 00004 * Copyright (c) 2003-2009 by University of Queensland 00005 * Earth Systems Science Computational Center (ESSCC) 00006 * http://www.uq.edu.au/esscc 00007 * 00008 * Primary Business: Queensland, Australia 00009 * Licensed under the Open Software License version 3.0 00010 * http://www.opensource.org/licenses/osl-3.0.php 00011 * 00012 *******************************************************/ 00013 00014 00015 #if !defined finley_TransportProblemAdapter_H 00016 #define finley_TransportProblemAdapter_H 00017 #include "system_dep.h" 00018 00019 extern "C" { 00020 #include "paso/SolverFCT.h" 00021 #include "paso/Options.h" 00022 } 00023 00024 #include "FinleyAdapterException.h" 00025 #include "FinleyError.h" 00026 00027 #include "escript/AbstractTransportProblem.h" 00028 #include "escript/Data.h" 00029 #include "escript/UtilC.h" 00030 00031 #include <boost/python/object.hpp> 00032 #include <boost/shared_ptr.hpp> 00033 #include <boost/python/extract.hpp> 00034 00035 namespace finley { 00036 00037 class TransportProblemAdapter:public escript::AbstractTransportProblem { 00038 00047 public: 00048 00054 FINLEY_DLL_API 00055 TransportProblemAdapter(); 00056 00061 FINLEY_DLL_API 00062 TransportProblemAdapter(Paso_FCTransportProblem* transport_problem, 00063 const double theta, 00064 const int block_size, 00065 const escript::FunctionSpace& functionspace); 00066 00072 FINLEY_DLL_API 00073 ~TransportProblemAdapter(); 00074 00079 FINLEY_DLL_API 00080 Paso_FCTransportProblem* getPaso_FCTransportProblem() const; 00081 00086 inline const escript::AbstractTransportProblem& asAbstractTransportProblem() const 00087 { 00088 return dynamic_cast<const escript::AbstractTransportProblem&>(*this); 00089 } 00090 00095 inline static const TransportProblemAdapter& asTransportProblemAdapter(const AbstractTransportProblem& transportproblem) 00096 { 00097 return dynamic_cast<const TransportProblemAdapter&>(transportproblem); 00098 } 00099 00103 FINLEY_DLL_API 00104 virtual void resetTransport() const; 00105 00109 FINLEY_DLL_API 00110 virtual double getSafeTimeStepSize() const; 00111 00115 FINLEY_DLL_API 00116 virtual double getUnlimitedTimeStepSize() const; 00117 00118 protected: 00119 00120 private: 00121 00126 FINLEY_DLL_API 00127 virtual void setToSolution(escript::Data& out,escript::Data& source,const double dt, boost::python::object& options) const; 00128 00133 FINLEY_DLL_API 00134 virtual void copyInitialValue(escript::Data& u) const; 00135 00141 FINLEY_DLL_API 00142 virtual void copyConstraint(escript::Data& source, escript::Data& q, escript::Data& r, const double factor) const; 00143 00144 00145 // 00146 // pointer to the externally created finley mesh - transport_problem. 00147 // 00148 boost::shared_ptr<Paso_FCTransportProblem> m_transport_problem; 00149 00150 }; 00151 00152 } // end of namespace 00153 #endif