/***************************************************************************
                          simpleProblemSetter.h  -  description
                             -------------------
    begin                : Feb 23, 2013
    copyright            : (C) 2013 by Tomas Oberhuber
    email                : tomas.oberhuber@fjfi.cvut.cz
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef SIMPLEPROBLEMTYPESSETTER_H_
#define SIMPLEPROBLEMTYPESSETTER_H_

#include <config/tnlParameterContainer.h>
#include <mesh/tnlGrid.h>
#include "heatEquationSolver.h"
#include <functions/tnlSinWaveFunction.h>
#include <functions/tnlExpBumpFunction.h>
#include <functions/tnlSinBumpsFunction.h>
#include "tnlTimeFunction.h"
#include "tnlDirichletBoundaryConditions.h"
#include <operators/diffusion/tnlLinearDiffusion.h>
#include "tnlNeumannBoundaryConditions.h"
#include "tnlZeroRightHandSide.h"
#include "tnlRightHandSide.h"

   
template< typename Real,
          typename Device,
          typename Index,
          typename MeshType,
          typename ConfigTag,
          typename SolverStarter >
class heatEquationSetter
{
   public:
 
   typedef TimeFunction< MeshType, TimeFunctionBase::TimeIndependent, Real, Index > TimeIndependent;
   typedef TimeFunction< MeshType, TimeFunctionBase::Linear, Real, Index > Linear;
   typedef TimeFunction< MeshType, TimeFunctionBase::Quadratic, Real, Index > Quadratic;
   typedef TimeFunction< MeshType, TimeFunctionBase::Cosinus, Real, Index > Cosinus;
   //typedef typename MeshType::RealType RealType;

   typedef Real RealType;
   typedef Device DeviceType;
   typedef Index IndexType;

   typedef tnlStaticVector< MeshType::Dimensions, Real > Vertex;
      
   template< typename TimeFunction >
   static bool setAnalyticSpaceFunction (const tnlParameterContainer& parameters);  
    
   static bool setTimeFunction (const tnlParameterContainer& parameters);
      
   static bool run( const tnlParameterContainer& parameters );
};

#include "heatEquationSetter_impl.h"

#endif /* HEATEQUATIONSETTER_H_ */