escript  Revision_
AbstractTransportProblem.h
Go to the documentation of this file.
00001 
00002 /*****************************************************************************
00003 *
00004 * Copyright (c) 2003-2014 by University of Queensland
00005 * http://www.uq.edu.au
00006 *
00007 * Primary Business: Queensland, Australia
00008 * Licensed under the Open Software License version 3.0
00009 * http://www.opensource.org/licenses/osl-3.0.php
00010 *
00011 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
00012 * Development 2012-2013 by School of Earth Sciences
00013 * Development from 2014 by Centre for Geoscience Computing (GeoComp)
00014 *
00015 *****************************************************************************/
00016 
00017 
00018 #if !defined  escript_AbstractTransportProblem_H
00019 #define escript_AbstractTransportProblem_H
00020 #include "system_dep.h"
00021 
00022 #include "FunctionSpace.h"
00023 #include "TransportProblemException.h"
00024 #include <boost/python/object.hpp>
00025 
00026 
00027 
00028 namespace escript {
00029 
00030 //
00031 // Forward declaration
00032 class Data;
00033 
00045 class AbstractTransportProblem {
00046 
00047  public:
00048 
00062   ESCRIPT_DLL_API
00063   AbstractTransportProblem();
00064 
00065   ESCRIPT_DLL_API
00066   AbstractTransportProblem(const int blocksize,
00067                            const FunctionSpace& functionspace);
00068 
00073   ESCRIPT_DLL_API
00074   virtual ~AbstractTransportProblem();
00075 
00076   ESCRIPT_DLL_API
00077   int isEmpty() const;
00078 
00083   ESCRIPT_DLL_API
00084   inline FunctionSpace getFunctionSpace() const
00085   {
00086        if (isEmpty())
00087             throw TransportProblemException("Error - Transport Problem is empty.");
00088        return m_functionspace;
00089   }
00090 
00095   ESCRIPT_DLL_API
00096   inline int getBlockSize() const
00097   {
00098        if (isEmpty())
00099             throw TransportProblemException("Error - Transport Problem is empty.");
00100        return m_blocksize;
00101   }
00102 
00107   ESCRIPT_DLL_API
00108   Data solve(Data& u0, Data& source, const double dt, boost::python::object& options) const;
00109 
00110 
00114   ESCRIPT_DLL_API
00115   virtual void resetTransport() const;
00116 
00121   ESCRIPT_DLL_API
00122   void insertConstraint(Data& source, Data& q, Data& r) const;
00123   /*
00124    *      \brief returns a safe time step size.
00125    */
00126   ESCRIPT_DLL_API
00127   virtual double getSafeTimeStepSize() const;
00128   /*
00129    *      \brief returns the value for unlimited time step size.
00130    */
00131   ESCRIPT_DLL_API
00132   virtual double getUnlimitedTimeStepSize() const;
00133 
00134 
00135  protected:
00136 
00137  private:
00138 
00143   ESCRIPT_DLL_API
00144   virtual void setToSolution(Data& out, Data& u0, Data& source, const double dt, boost::python::object& options) const;
00145 
00152   ESCRIPT_DLL_API
00153   virtual void copyConstraint(Data& source, Data& q, Data& r) const;
00154 
00155   int m_empty;
00156   int m_blocksize;
00157   FunctionSpace m_functionspace;
00158 
00159 };
00160 
00161 
00162 typedef boost::shared_ptr<AbstractTransportProblem> ATP_ptr;
00163 
00164 } // end of namespace
00165 #endif