Skip to content
Snippets Groups Projects
Commit 5c7473e8 authored by Jan Schäfer's avatar Jan Schäfer
Browse files

oprava analyt reseni advekce

pridani vlastnich neumannovych op
parent afc7f13d
No related branches found
No related tags found
No related merge requests found
......@@ -173,7 +173,7 @@ setInitialCondition( const tnlParameterContainer& parameters,
for (IndexType i = 0; i < inverseSquareCount-1; i++)
for (IndexType j = 0; j < inverseSquareCount-1; j++)
{
dofs[i * inverseSquareCount + j] = exp(-pow(10/(size*inverseSquareCount)*(size*i-0.2*size*inverseSquareCount),2)-pow(10/(size*inverseSquareCount)*(size*j-0.2*size*inverseSquareCount)*size,2));
dofs[i * inverseSquareCount + j] = exp(-pow(10/(size*inverseSquareCount)*(size*i-0.2*size*inverseSquareCount),2)-pow(10/(size*inverseSquareCount)*(size*j-0.2*size*inverseSquareCount),2));
};
};
}
......@@ -284,13 +284,14 @@ makeSnapshot( const RealType& time,
cout << endl << "Writing output at time " << time << " step " << step << "." << endl;
this->bindDofs( mesh, dofs );
tnlString fileName;
MeshFunctionType dofsh;
dofsh.bind(mesh,dofs);
FileNameBaseNumberEnding( "u-", step, 5, ".tnl", fileName );
if( ! dofs.save( fileName ) )
if( ! dofsh.save( fileName ) )
return false;
FileNameBaseNumberEnding( "a-", step, 5, ".tnl", fileName );
if( ! this->analyt.save( fileName ) )
return false;
cin.ignore();
return true;
}
......@@ -317,7 +318,7 @@ getExplicitRHS( const RealType& time,
{
if (dimension == 1)
{
this->analyt[0];
this->analyt[0] = 0;
for (IndexType i = 1; i < count-2; i++)
{
if ((i - step * tau * (count/this->schemeSize) * this -> speedX>0.4*count) && (i - step * tau * (count/this->schemeSize) * this -> speedX<0.5*count)) analyt[i]=1; else analyt[i]=0;
......@@ -331,7 +332,7 @@ getExplicitRHS( const RealType& time,
{
if ((i - step * tau * (inverseSquareCount/this->schemeSize) * this -> speedX>0.4*inverseSquareCount) && (i - step * tau * (inverseSquareCount/this->schemeSize) * this -> speedX<0.5*inverseSquareCount)
&& (j - step * tau * (inverseSquareCount/this->schemeSize) * this -> speedY>0.4*inverseSquareCount) && (j - step * tau * (inverseSquareCount/this->schemeSize) * this -> speedY<0.5*inverseSquareCount))
analyt[i]=1; else analyt[i]=0;
analyt[i * inverseSquareCount + j]=1; else analyt[i * inverseSquareCount + j]=0;
};
};
}
......@@ -379,8 +380,8 @@ getExplicitRHS( const RealType& time,
else if (dimension == 2)
{
count = sqrt(count);
for (IndexType i = 1; i < inverseSquareCount-1; i++)
for (IndexType j = 1; j < inverseSquareCount-1; j++)
for (IndexType i = 0; i < inverseSquareCount-1; i++)
for (IndexType j = 0; j < inverseSquareCount-1; j++)
{
this->analyt[i * inverseSquareCount + j] = exp(-pow(10/(size*inverseSquareCount)*(size*i-0.2*size*inverseSquareCount)-step * 10 * tau * this->speedX,2)-pow(10/(size*inverseSquareCount)*(size*j-0.2*size*inverseSquareCount)-step * 10 * tau * this->speedY,2));
};
......@@ -401,8 +402,8 @@ getExplicitRHS( const RealType& time,
else if (dimension == 2)
{
count = sqrt(count);
for (IndexType i = 1; i < inverseSquareCount-1; i++)
for (IndexType j = 1; j < inverseSquareCount-1; j++)
for (IndexType i = 0; i < inverseSquareCount-1; i++)
for (IndexType j = 0; j < inverseSquareCount-1; j++)
{
if (i - step * tau * (inverseSquareCount/this->schemeSize) * this -> speedX < 0.5*inverseSquareCount &&
j - step * tau * (inverseSquareCount/this->schemeSize) * this -> speedY < 0.5*inverseSquareCount)
......
......@@ -39,7 +39,9 @@ class EulerPressureGetter
__cuda_callable__
Real operator[]( const IndexType& idx ) const
{
if (this->rho[ idx ]==0) return 0; else return ( this->gamma - 1.0 ) * ( this->energy[ idx ] - 0.5 * this->rhoVel[ idx ] * this->rhoVel[ idx ] / this->rho[ idx ]);
//if (this->rho[ idx ]==0) return 0; else return ( this->gamma - 1.0 ) * ( this->energy[ idx ] - 0.5 * this->rhoVel[ idx ] * this->rhoVel[ idx ] / this->rho[ idx ]);
return ( this->gamma - 1.0 ) * this->energy[ idx ] * this->rho[ idx ];
}
......
......@@ -7,6 +7,7 @@
#include "eulerProblem.h"
#include "LaxFridrichs.h"
#include "tnlMyMixedBoundaryConditions.h"
#include "tnlMyNeumannBoundaryConditions.h"
#include "eulerRhs.h"
#include "eulerBuildConfigTag.h"
......@@ -33,6 +34,7 @@ template< typename ConfigTag >class eulerConfig
config.addEntryEnum< tnlString >( "dirichlet" );
config.addEntryEnum< tnlString >( "neumann" );
config.addEntryEnum< tnlString >( "mymixed" );
config.addEntryEnum< tnlString >( "myneumann" );
config.addEntry< double >( "boundary-conditions-constant", "This sets a value in case of the constant boundary conditions." );
config.addEntry< double >( "left-density", "This sets a value of left density." );
config.addEntry< double >( "left-velocity", "This sets a value of left velocity." );
......@@ -107,6 +109,13 @@ class eulerSetter
SolverStarter solverStarter;
return solverStarter.template run< Problem >( parameters );
}
if( boundaryConditionsType == "myneumann" )
{
typedef tnlMyNeumannBoundaryConditions< MeshType, MeshFunction, MeshType::getMeshDimensions(), Real, Index > BoundaryConditions;
typedef eulerProblem< MeshType, BoundaryConditions, RightHandSide, ApproximateOperator > Problem;
SolverStarter solverStarter;
return solverStarter.template run< Problem >( parameters );
}
if( boundaryConditionsType == "neumann" )
{
typedef tnlNeumannBoundaryConditions< MeshType, MeshFunction, Real, Index > BoundaryConditions;
......
......@@ -99,29 +99,27 @@ setInitialCondition( const tnlParameterContainer& parameters,
DofVectorType& dofs,
MeshDependentDataType& meshDependentData )
{
cout << endl << "get conditions from CML";
typedef typename MeshType::Cell Cell;
this->gamma = parameters.getParameter< RealType >( "gamma" );
RealType rhoL = parameters.getParameter< RealType >( "left-density" );
RealType velL = parameters.getParameter< RealType >( "left-velocity" );
RealType preL = parameters.getParameter< RealType >( "left-pressure" );
RealType eL = ( preL / (gamma - 1) ) + 0.5 * rhoL * velL * velL;
RealType eL = ( preL / ( rhoL * (gamma - 1) ) );
//RealType eL = ( preL / (gamma - 1) ) + 0.5 * rhoL * velL * velL;
RealType rhoR = parameters.getParameter< RealType >( "right-density" );
RealType velR = parameters.getParameter< RealType >( "right-velocity" );
RealType preR = parameters.getParameter< RealType >( "right-pressure" );
RealType eR = ( preR / (gamma - 1) ) + 0.5 * rhoR * velR * velR;
RealType eR = ( preR / ( rhoR * (gamma - 1) ) );
//RealType eR = ( preR / (gamma - 1) ) + 0.5 * rhoR * velR * velR;
RealType x0 = parameters.getParameter< RealType >( "riemann-border" );
cout <<endl << gamma << " " << rhoL << " " << velL << " " << preL << " " << eL << " " << rhoR << " " << velR << " " << preR << " " << eR << " " << x0 << " " << gamma << endl;
int count = mesh.template getEntitiesCount< Cell >();
cout << count << endl;
uRho.bind(mesh, dofs, 0);
uRhoVelocity.bind(mesh, dofs, count);
uEnergy.bind(mesh, dofs, 2 * count);
tnlVector < RealType, DeviceType, IndexType > data;
data.setSize(2*count);
velocity.bind( mesh, data, 0);
pressure.bind( mesh, data, count );
cout << endl << "set conditions from CML"<< endl;
pressure.bind( mesh, data, count );
for(IndexType i = 0; i < count; i++)
if (i < x0 * count )
{
......@@ -139,13 +137,6 @@ cout << count << endl;
velocity[i] = velR;
pressure[i] = preR;
};
cout << "dofs = " << dofs << endl;
cout << "velocity = " << velocity.getData() << endl;
cout << "pressure = " << pressure.getData() << endl;
getchar();
/*
const tnlString& initialConditionFile = parameters.getParameter< tnlString >( "initial-condition" );
if( ! dofs.load( initialConditionFile ) )
......
/*** coppied and changed
/***************************************************************************
tnlMyNeumannBoundaryConditions.h - description
-------------------
begin : Nov 17, 2014
copyright : (C) 2014 by 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 TNLMyNeumannBoundaryConditions_H_
#define TNLMyNeumannBoundaryConditions_H_
#include <operators/tnlOperator.h>
#include <functions/tnlConstantFunction.h>
#include <functions/tnlFunctionAdapter.h>
template< typename Mesh,
typename Function = tnlConstantFunction< Mesh::getMeshDimensions(), typename Mesh::RealType >,
int MeshEntitiesDimensions = Mesh::getMeshDimensions(),
typename Real = typename Mesh::RealType,
typename Index = typename Mesh::IndexType >
class tnlMyNeumannBoundaryConditions
: public tnlOperator< Mesh,
MeshBoundaryDomain,
MeshEntitiesDimensions,
MeshEntitiesDimensions,
Real,
Index >
{
public:
typedef Mesh MeshType;
typedef Function FunctionType;
typedef Real RealType;
typedef typename MeshType::DeviceType DeviceType;
typedef Index IndexType;
typedef tnlVector< RealType, DeviceType, IndexType> DofVectorType;
typedef typename MeshType::VertexType VertexType;
static constexpr int getMeshDimensions() { return MeshType::meshDimensions; }
static void configSetup( tnlConfigDescription& config,
const tnlString& prefix = "" )
{
Function::configSetup( config, prefix );
}
bool setup( const tnlParameterContainer& parameters,
const tnlString& prefix = "" )
{
return this->function.setup( parameters, prefix );
}
void setFunction( const Function& function )
{
this->function = function;
}
Function& getFunction()
{
return this->function;
}
const Function& getFunction() const
{
return this->function;
}
template< typename EntityType,
typename MeshFunction >
__cuda_callable__
const RealType operator()( const MeshFunction& u,
const EntityType& entity,
const RealType& time = 0 ) const
{
const MeshType& mesh = entity.getMesh();
const auto& neighbourEntities = entity.getNeighbourEntities();
const IndexType& index = entity.getIndex();
if( entity.getCoordinates().x() == 0 )
return u[ neighbourEntities.template getEntityIndex< 1 >() ];
else
return u[ neighbourEntities.template getEntityIndex< -1 >() ];
//tady se asi delaji okrajove podminky
//static_assert( EntityType::getDimensions() == MeshEntitiesDimensions, "Wrong mesh entity dimensions." );
}
template< typename EntityType >
__cuda_callable__
IndexType getLinearSystemRowLength( const MeshType& mesh,
const IndexType& index,
const EntityType& entity ) const
{
return 1;
}
template< typename PreimageFunction,
typename MeshEntity,
typename Matrix,
typename Vector >
__cuda_callable__
void setMatrixElements( const PreimageFunction& u,
const MeshEntity& entity,
const RealType& time,
const RealType& tau,
Matrix& matrix,
Vector& b ) const
{
typename Matrix::MatrixRow matrixRow = matrix.getRow( entity.getIndex() );
const IndexType& index = entity.getIndex();
matrixRow.setElement( 0, index, 1.0 );
b[ index ] = tnlFunctionAdapter< MeshType, Function >::getValue( this->function, entity, time );
}
protected:
Function function;
//static_assert( Device::DeviceType == Function::Device::DeviceType );
};
template< typename Mesh,
typename Function >
ostream& operator << ( ostream& str, const tnlMyNeumannBoundaryConditions< Mesh, Function >& bc )
{
str << "MyMixed boundary conditions: vector = " << bc.getVector();
return str;
}
#endif /* TNLMyNeumannBoundaryConditions_H_ */
......@@ -40,9 +40,10 @@ class EulerPressureGetter
__cuda_callable__
Real operator[]( const IndexType& idx ) const
{
if (this->rho[ idx ]==0) return 0;
/* if (this->rho[ idx ]==0) return 0;
else return ( this->gamma - 1.0 ) * ( this->energy[ idx ] - 0.5 * this->rho[ idx ] *
( this->rhoVelX[ idx ] / this->rho[ idx ] + this->rhoVelY[ idx ] / this->rho[ idx ]) );
*/ return ( this->gamma - 1.0 ) * ( this->energy[ idx ] * this->rho[ idx ] );
}
......
......@@ -153,9 +153,9 @@ operator()( const MeshFunction& u,
const IndexType& north = neighbourEntities.template getEntityIndex< 0, 1 >();
const IndexType& south = neighbourEntities.template getEntityIndex< 0, -1 >();
return (0.25 / this->tau) * ( u[ west ] + u[ east ] + u[ south ] + u[ north ] - 4.0 * u[ center ] )
- 0.5 * hyInverse * (( u[ east ] * this->velocityX[ east ] )
- 0.5 * hxInverse * (( u[ east ] * this->velocityX[ east ] )
-( u[ west ] * this->velocityX[ west ] ))
- 0.5 * hxInverse * (( u[ north ] * this->velocityY[ north ] + this->pressure[ north ] )
- 0.5 * hyInverse * (( u[ north ] * this->velocityY[ north ] + this->pressure[ north ] )
-( u[ south ] * this->velocityY[ south ] + this->pressure[ south ]));
}
......
......@@ -9,6 +9,7 @@
#include "eulerRhs.h"
#include "eulerBuildConfigTag.h"
#include "tnlMyMixedBoundaryConditions.h"
#include "tnlMyNeumannBoundaryConditions.h"
typedef eulerBuildConfigTag BuildConfig;
......@@ -32,6 +33,7 @@ template< typename ConfigTag >class eulerConfig
config.addEntryEnum< tnlString >( "dirichlet" );
config.addEntryEnum< tnlString >( "neumann" );
config.addEntryEnum< tnlString >( "mymixed" );
config.addEntryEnum< tnlString >( "myneumann" );
config.addEntry< double >( "boundary-conditions-constant", "This sets a value in case of the constant boundary conditions." );
config.addEntry< double >( "left-up-density", "This sets a value of left up density." );
config.addEntry< double >( "left-up-velocityX", "This sets a value of left up x velocity." );
......@@ -116,6 +118,13 @@ class eulerSetter
SolverStarter solverStarter;
return solverStarter.template run< Problem >( parameters );
}
if( boundaryConditionsType == "myneumann" )
{
typedef tnlMyNeumannBoundaryConditions< MeshType, MeshFunction, MeshType::getMeshDimensions(), Real, Index > BoundaryConditions;
typedef eulerProblem< MeshType, BoundaryConditions, RightHandSide, ApproximateOperator > Problem;
SolverStarter solverStarter;
return solverStarter.template run< Problem >( parameters );
}
if( boundaryConditionsType == "neumann" )
{
typedef tnlNeumannBoundaryConditions< MeshType, MeshFunction, Real, Index > BoundaryConditions;
......
......@@ -108,22 +108,26 @@ setInitialCondition( const tnlParameterContainer& parameters,
RealType velLuX = parameters.getParameter< RealType >( "left-up-velocityX" );
RealType velLuY = parameters.getParameter< RealType >( "left-up-velocityY" );
RealType preLu = parameters.getParameter< RealType >( "left-up-pressure" );
RealType eLu = ( preLu / (gamma - 1) ) + 0.5 * rhoLu * pow(velLuX,2)+pow(velLuY,2);
RealType eLu = ( preLu / ( rhoLu * (gamma - 1) ) );
//RealType eLu = ( preLu / (gamma - 1) ) + 0.5 * rhoLu * pow(velLuX,2)+pow(velLuY,2);
RealType rhoLd = parameters.getParameter< RealType >( "left-down-density" );
RealType velLdX = parameters.getParameter< RealType >( "left-down-velocityX" );
RealType velLdY = parameters.getParameter< RealType >( "left-down-velocityY" );
RealType preLd = parameters.getParameter< RealType >( "left-down-pressure" );
RealType eLd = ( preLd / (gamma - 1) ) + 0.5 * rhoLd * pow(velLdX,2)+pow(velLdY,2);
RealType eLd = ( preLd / ( rhoLd * (gamma - 1) ) );
//RealType eLd = ( preLd / (gamma - 1) ) + 0.5 * rhoLd * pow(velLdX,2)+pow(velLdY,2);
RealType rhoRu = parameters.getParameter< RealType >( "right-up-density" );
RealType velRuX = parameters.getParameter< RealType >( "right-up-velocityX" );
RealType velRuY = parameters.getParameter< RealType >( "right-up-velocityY" );
RealType preRu = parameters.getParameter< RealType >( "right-up-pressure" );
RealType eRu = ( preRu / (gamma - 1) ) + 0.5 * rhoRu * pow(velRuX,2)+pow(velRuY,2);
RealType eRu = ( preRu / ( rhoRu * (gamma - 1) ) );
//RealType eRu = ( preRu / (gamma - 1) ) + 0.5 * rhoRu * pow(velRuX,2)+pow(velRuY,2);
RealType rhoRd = parameters.getParameter< RealType >( "right-down-density" );
RealType velRdX = parameters.getParameter< RealType >( "right-down-velocityX" );
RealType velRdY = parameters.getParameter< RealType >( "right-down-velocityY" );
RealType preRd = parameters.getParameter< RealType >( "right-down-pressure" );
RealType eRd = ( preRd / (gamma - 1) ) + 0.5 * rhoRd * pow(velRdX,2)+pow(velRdY,2);
RealType eRd = ( preRd / ( rhoRd * (gamma - 1) ) );
//RealType eRd = ( preRd / (gamma - 1) ) + 0.5 * rhoRd * pow(velRdX,2)+pow(velRdY,2);
RealType x0 = parameters.getParameter< RealType >( "riemann-border" );
int size = mesh.template getEntitiesCount< Cell >();
uRho.bind(mesh, dofs, 0);
......@@ -138,7 +142,7 @@ setInitialCondition( const tnlParameterContainer& parameters,
velocityY.bind(mesh, data, 3*size);
for(IndexType j = 0; j < sqrt(size); j++)
for(IndexType i = 0; i < sqrt(size); i++)
if ((i < x0 * sqrt(size))&&(j < x0 * sqrt(size)) )
if ((i <= x0 * sqrt(size))&&(j <= x0 * sqrt(size)) )
{
uRho[j*sqrt(size)+i] = rhoLd;
uRhoVelocityX[j*sqrt(size)+i] = rhoLd * velLdX;
......@@ -150,7 +154,7 @@ setInitialCondition( const tnlParameterContainer& parameters,
pressure[j*sqrt(size)+i] = preLd;
}
else
if ((i >= x0 * sqrt(size))&&(j < x0 * sqrt(size)) )
if ((i <= x0 * sqrt(size))&&(j > x0 * sqrt(size)) )
{
uRho[j*sqrt(size)+i] = rhoLu;
uRhoVelocityX[j*sqrt(size)+i] = rhoLu * velLuX;
......@@ -162,7 +166,7 @@ setInitialCondition( const tnlParameterContainer& parameters,
pressure[j*sqrt(size)+i] = preLu;
}
else
if ((i >= x0 * sqrt(size))&&(j >= x0 * sqrt(size)) )
if ((i > x0 * sqrt(size))&&(j > x0 * sqrt(size)) )
{
uRho[j*sqrt(size)+i] = rhoRu;
uRhoVelocityX[j*sqrt(size)+i] = rhoRu * velRuX;
......
/*** coppied and changed
/***************************************************************************
tnlMyNeumannBoundaryConditions.h - description
-------------------
begin : Nov 17, 2014
copyright : (C) 2014 by 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 TNLMyNeumannBOUNDARYCONDITIONS_H_
#define TNLMyNeumannBOUNDARYCONDITIONS_H_
#include <operators/tnlOperator.h>
#include <functions/tnlConstantFunction.h>
#include <functions/tnlFunctionAdapter.h>
template< typename Mesh,
typename Function = tnlConstantFunction< Mesh::getMeshDimensions(), typename Mesh::RealType >,
int MeshEntitiesDimensions = Mesh::getMeshDimensions(),
typename Real = typename Mesh::RealType,
typename Index = typename Mesh::IndexType >
class tnlMyNeumannBoundaryConditions
: public tnlOperator< Mesh,
MeshBoundaryDomain,
MeshEntitiesDimensions,
MeshEntitiesDimensions,
Real,
Index >
{
public:
typedef Mesh MeshType;
typedef Function FunctionType;
typedef Real RealType;
typedef typename MeshType::DeviceType DeviceType;
typedef Index IndexType;
typedef tnlVector< RealType, DeviceType, IndexType> DofVectorType;
typedef typename MeshType::VertexType VertexType;
static constexpr int getMeshDimensions() { return MeshType::meshDimensions; }
static void configSetup( tnlConfigDescription& config,
const tnlString& prefix = "" )
{
Function::configSetup( config, prefix );
}
bool setup( const tnlParameterContainer& parameters,
const tnlString& prefix = "" )
{
return this->function.setup( parameters, prefix );
}
void setFunction( const Function& function )
{
this->function = function;
}
void setX0( const RealType& x0 )
{
this->x0 = x0;
}
Function& getFunction()
{
return this->function;
}
const Function& getFunction() const
{
return this->function;
}
template< typename EntityType,
typename MeshFunction >
__cuda_callable__
const RealType operator()( const MeshFunction& u,
const EntityType& entity,
const RealType& time = 0 ) const
{
const MeshType& mesh = entity.getMesh();
const auto& neighbourEntities = entity.getNeighbourEntities();
typedef typename MeshType::Cell Cell;
int count = mesh.template getEntitiesCount< Cell >();
count = sqrt(count);
if( entity.getCoordinates().x() == 0 )
return u[ neighbourEntities.template getEntityIndex< 1, 0 >() ];
else if( entity.getCoordinates().x() == count-1 )
return u[ neighbourEntities.template getEntityIndex< -1, 0 >() ];
else if( entity.getCoordinates().y() == 0 )
return u[ neighbourEntities.template getEntityIndex< 0, 1 >() ];
else return u[ neighbourEntities.template getEntityIndex< 0, -1 >() ];
//tady se asi delaji okrajove podminky
//static_assert( EntityType::getDimensions() == MeshEntitiesDimensions, "Wrong mesh entity dimensions." );
}
template< typename EntityType >
__cuda_callable__
IndexType getLinearSystemRowLength( const MeshType& mesh,
const IndexType& index,
const EntityType& entity ) const
{
return 1;
}
template< typename PreimageFunction,
typename MeshEntity,
typename Matrix,
typename Vector >
__cuda_callable__
void setMatrixElements( const PreimageFunction& u,
const MeshEntity& entity,
const RealType& time,
const RealType& tau,
Matrix& matrix,
Vector& b ) const
{
typename Matrix::MatrixRow matrixRow = matrix.getRow( entity.getIndex() );
const IndexType& index = entity.getIndex();
matrixRow.setElement( 0, index, 1.0 );
b[ index ] = tnlFunctionAdapter< MeshType, Function >::getValue( this->function, entity, time );
}
protected:
Function function;
RealType x0 = 0.3;
//static_assert( Device::DeviceType == Function::Device::DeviceType );
};
template< typename Mesh,
typename Function >
ostream& operator << ( ostream& str, const tnlMyNeumannBoundaryConditions< Mesh, Function >& bc )
{
str << "MyNeumann boundary conditions: vector = " << bc.getVector();
return str;
}
#endif /* TNLMyNeumannBOUNDARYCONDITIONS_H_ */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment