Newer
Older
/***************************************************************************
simpleProblemSolver_impl.h - description
-------------------
begin : Mar 10, 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 HEATEQUATIONSOLVER_IMPL_H_
#define HEATEQUATIONSOLVER_IMPL_H_
#include <core/mfilename.h>
#include "heatEquationSolver.h"
template< typename Mesh, typename Diffusion, typename BoundaryCondition, typename RightHandSide >
tnlString heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >
::getTypeStatic()
{
return tnlString( "heatEquationSolver< " ) + Mesh :: getTypeStatic() + " >";
}
template< typename Mesh, typename Diffusion, typename BoundaryCondition, typename RightHandSide >
tnlString heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >
:: getPrologHeader() const
{
return tnlString( "Heat equation" );
}
template< typename Mesh, typename Diffusion, typename BoundaryCondition, typename RightHandSide >
void heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >
:: writeProlog( tnlLogger& logger, const tnlParameterContainer& parameters ) const
{
//logger. WriteParameter< tnlString >( "Problem name:", "problem-name", parameters );
//logger. WriteParameter< int >( "Simple parameter:", 1 );
}
template< typename Mesh, typename Diffusion, typename BoundaryCondition, typename RightHandSide >
bool heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >
::setup( const tnlParameterContainer& parameters )
if( ! boundaryCondition.setup( parameters ) ||
! rightHandSide.setup( parameters ) )
return true;
}
template< typename Mesh,
typename Diffusion,
typename BoundaryCondition,
typename RightHandSide >
typename heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >::IndexType
heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >::getDofs( const Mesh& mesh ) const
{
/****
* Set-up DOFs and supporting grid functions
*/
template< typename Mesh,
typename Diffusion,
typename BoundaryCondition,
typename RightHandSide >
typename heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >::IndexType
heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >::getAuxiliaryDofs( const Mesh& mesh ) const
{
/****
* Set-up DOFs and supporting grid functions which will not appear in the discrete solver
*/
}
template< typename Mesh,
typename Diffusion,
typename BoundaryCondition,
heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >::
bindDofs( const MeshType& mesh,
DofVectorType& dofVector )
const IndexType dofs = mesh.getNumberOfCells();
this->solution.bind( dofVector.getData(), dofs );
template< typename Mesh,
typename Diffusion,
typename BoundaryCondition,
heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >::
bindAuxiliaryDofs( const MeshType& mesh,
DofVectorType& auxiliaryDofVector )
{
}
template< typename Mesh, typename Diffusion, typename BoundaryCondition, typename RightHandSide >
bool heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >
:: setInitialCondition( const tnlParameterContainer& parameters,
const MeshType& mesh )
{
/*const tnlString& initialConditionFile = parameters.GetParameter< tnlString >( "initial-condition" );
if( ! this->solution.load( initialConditionFile ) )
{
cerr << "I am not able to load the initial condition from the file " << initialConditionFile << "." << endl;
return false;
return true;
}
template< typename Mesh,
typename Diffusion,
typename BoundaryCondition,
bool heatEquationSolver< Mesh,
Diffusion,
BoundaryCondition,
makeSnapshot( const RealType& time,
const IndexType& step,
const MeshType& mesh )
{
cout << endl << "Writing output at time " << time << " step " << step << "." << endl;
tnlString fileName;
FileNameBaseNumberEnding( "u-", step, 5, ".tnl", fileName );
if( ! this->solution.save( fileName ) )
return false;
return true;
}
template< typename Mesh, typename Diffusion, typename BoundaryCondition, typename RightHandSide >
void heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >
:: GetExplicitRHS( const RealType& time,
const RealType& tau,
const Mesh& mesh,
DofVectorType& _u,
DofVectorType& _fu )
{
/****
* If you use an explicit solver like tnlEulerSolver or tnlMersonSolver, you
* need to implement this method. Compute the right-hand side of
*
* d/dt u(x) = fu( x, u )
*
* You may use supporting vectors again if you need.
*/
explicitUpdater.template update< Mesh::Dimensions >( time,
mesh,
this->boundaryCondition,
}
template< typename Mesh, typename Diffusion, typename BoundaryCondition, typename RightHandSide >
tnlSolverMonitor< typename heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >::RealType,
typename heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >::IndexType >*
heatEquationSolver< Mesh,Diffusion,BoundaryCondition,RightHandSide >
:: getSolverMonitor()
{
return 0;
}
#endif /* HEATEQUATION_IMPL_H_ */