Commit 4cbee95c authored by Tomáš Oberhuber's avatar Tomáš Oberhuber
Browse files

Fixing bug in mesh function evaluator.

parent 572f13b7
Loading
Loading
Loading
Loading
+28 −2
Original line number Diff line number Diff line
@@ -191,7 +191,7 @@ class tnlMeshFunctionEvaluatorTraverserUserData

template< typename MeshType,
          typename UserData > 
class tnlMeshFunctionEvaluatorEntitiesProcessor
class tnlMeshFunctionEvaluatorAssignmentEntitiesProcessor
{
   public:

@@ -203,12 +203,38 @@ class tnlMeshFunctionEvaluatorEntitiesProcessor
      {
         typedef tnlFunctionAdapter< MeshType, typename UserData::InFunctionType > FunctionAdapter;
         ( *userData.meshFunction )( entity ) = 
            *userData.outFunctionMultiplicator * ( *userData.meshFunction )( entity ) +
            *userData.inFunctionMultiplicator *
            FunctionAdapter::getValue( *userData.function, entity, *userData.time );
         /*cerr << "Idx = " << entity.getIndex() 
            << " Value = " << FunctionAdapter::getValue( *userData.function, entity, *userData.time ) 
            << " stored value = " << ( *userData.meshFunction )( entity )
            << " multiplicators = " << endl;*/
      }
};

template< typename MeshType,
          typename UserData > 
class tnlMeshFunctionEvaluatorAdditionEntitiesProcessor
{
   public:

      template< typename EntityType >
      __cuda_callable__
      static inline void processEntity( const MeshType& mesh,
                                        UserData& userData,
                                        const EntityType& entity )
      {
         typedef tnlFunctionAdapter< MeshType, typename UserData::InFunctionType > FunctionAdapter;
         ( *userData.meshFunction )( entity ) = 
            *userData.outFunctionMultiplicator * ( *userData.meshFunction )( entity ) +
            *userData.inFunctionMultiplicator *
            FunctionAdapter::getValue( *userData.function, entity, *userData.time );
         /*cerr << "Idx = " << entity.getIndex() 
            << " Value = " << FunctionAdapter::getValue( *userData.function, entity, *userData.time ) 
            << " stored value = " << ( *userData.meshFunction )( entity )
            << " multiplicators = " << endl;*/
      }
};


#include <functions/tnlMeshFunctionEvaluator_impl.h>
+110 −50
Original line number Diff line number Diff line
@@ -74,7 +74,8 @@ evaluateEntities( OutMeshFunction& meshFunction,
                  EntitiesType entitiesType )
{
   typedef typename MeshType::template MeshEntity< OutMeshFunction::getMeshEntityDimensions() > MeshEntityType;
   typedef tnlMeshFunctionEvaluatorEntitiesProcessor< MeshType, TraverserUserData > EntitiesProcessor;
   typedef tnlMeshFunctionEvaluatorAssignmentEntitiesProcessor< MeshType, TraverserUserData > AssignmentEntitiesProcessor;
   typedef tnlMeshFunctionEvaluatorAdditionEntitiesProcessor< MeshType, TraverserUserData > AdditionEntitiesProcessor;
  
   if( std::is_same< MeshDeviceType, tnlHost >::value )
   {
@@ -83,20 +84,38 @@ evaluateEntities( OutMeshFunction& meshFunction,
      switch( entitiesType )
      {
         case all:            
            if( outFunctionMultiplicator )
               meshTraverser.template processAllEntities< TraverserUserData,
                                                       EntitiesProcessor >
                                                          AdditionEntitiesProcessor >
                                                        ( meshFunction.getMesh(),
                                                          userData );
            else
               meshTraverser.template processAllEntities< TraverserUserData,
                                                         AssignmentEntitiesProcessor >
                                                       ( meshFunction.getMesh(),
                                                         userData );
            break;
         case interior:
            if( outFunctionMultiplicator )
               meshTraverser.template processInteriorEntities< TraverserUserData,
                                                               AdditionEntitiesProcessor >
                                                             ( meshFunction.getMesh(),
                                                               userData );
            else
               meshTraverser.template processInteriorEntities< TraverserUserData,
                                                            EntitiesProcessor >
                                                               AssignmentEntitiesProcessor >
                                                             ( meshFunction.getMesh(),
                                                               userData );            
            break;
         case boundary:
            if( outFunctionMultiplicator )
               meshTraverser.template processBoundaryEntities< TraverserUserData,
                                                            EntitiesProcessor >
                                                               AdditionEntitiesProcessor >
                                                             ( meshFunction.getMesh(),
                                                               userData );
            else
               meshTraverser.template processBoundaryEntities< TraverserUserData,
                                                               AssignmentEntitiesProcessor >
                                                             ( meshFunction.getMesh(),
                                                               userData );
            break;
@@ -116,20 +135,38 @@ evaluateEntities( OutMeshFunction& meshFunction,
      switch( entitiesType )
      {
         case all:            
            if( outFunctionMultiplicator )
               meshTraverser.template processAllEntities< TraverserUserData,
                                                          AdditionEntitiesProcessor >
                                                        ( meshFunction.getMesh(),
                                                          userData );
            else
               meshTraverser.template processAllEntities< TraverserUserData,
                                                       EntitiesProcessor >
                                                         AssignmentEntitiesProcessor >
                                                       ( meshFunction.getMesh(),
                                                         userData );
            break;
         case interior:
            if( outFunctionMultiplicator )
               meshTraverser.template processInteriorEntities< TraverserUserData,
                                                               AdditionEntitiesProcessor >
                                                             ( meshFunction.getMesh(),
                                                               userData );
            else
               meshTraverser.template processInteriorEntities< TraverserUserData,
                                                            EntitiesProcessor >
                                                               AssignmentEntitiesProcessor >
                                                             ( meshFunction.getMesh(),
                                                               userData );            
            break;
         case boundary:
            if( outFunctionMultiplicator )
               meshTraverser.template processBoundaryEntities< TraverserUserData,
                                                            EntitiesProcessor >
                                                               AdditionEntitiesProcessor >
                                                             ( meshFunction.getMesh(),
                                                               userData );
            else
               meshTraverser.template processBoundaryEntities< TraverserUserData,
                                                               AssignmentEntitiesProcessor >
                                                             ( meshFunction.getMesh(),
                                                               userData );
            break;         
@@ -141,7 +178,6 @@ evaluateEntities( OutMeshFunction& meshFunction,
      tnlCuda::freeFromDevice( kernelTime );
      tnlCuda::freeFromDevice( kernelOutFunctionMultiplicator );
      tnlCuda::freeFromDevice( kernelInFunctionMultiplicator );            
            
      checkCudaDevice;
   }
}
@@ -159,16 +195,23 @@ evaluate( OutMeshFunction& meshFunction,
          const RealType& inFunctionMultiplicator )
{
   typedef typename MeshType::template MeshEntity< OutMeshFunction::getMeshEntityDimensions() > MeshEntityType;
   typedef tnlMeshFunctionEvaluatorEntitiesProcessor< MeshType, TraverserUserData > EntitiesProcessor;
   typedef tnlMeshFunctionEvaluatorAssignmentEntitiesProcessor< MeshType, TraverserUserData > AssignmentEntitiesProcessor;
   typedef tnlMeshFunctionEvaluatorAdditionEntitiesProcessor< MeshType, TraverserUserData > AdditionEntitiesProcessor;
   
   if( std::is_same< MeshDeviceType, tnlHost >::value )
   {
      TraverserUserData userData( &operatorFunction, &time, &meshFunction, &outFunctionMultiplicator, &inFunctionMultiplicator );
      tnlTraverser< MeshType, MeshEntityType > meshTraverser;
      meshTraverser.template processInteriorEntities< TraverserUserData, EntitiesProcessor >
      if( outFunctionMultiplicator )
         meshTraverser.template processInteriorEntities< TraverserUserData,
                                                         AdditionEntitiesProcessor >
                                                       ( meshFunction.getMesh(),
                                                         userData );
      else
         meshTraverser.template processInteriorEntities< TraverserUserData,
                                                         AssignmentEntitiesProcessor >
                                                       ( meshFunction.getMesh(),
                                                         userData );
      
   }
   if( std::is_same< MeshDeviceType, tnlCuda >::value )
   {      
@@ -184,10 +227,16 @@ evaluate( OutMeshFunction& meshFunction,
      TraverserUserData userData( kernelOperatorFunction, kernelTime, kernelMeshFunction, kernelOutFunctionMultiplicator, kernelInFunctionMultiplicator );
      checkCudaDevice;
      tnlTraverser< MeshType, MeshEntityType > meshTraverser;
      meshTraverser.template processInteriorEntities< TraverserUserData, EntitiesProcessor >
      if( outFunctionMultiplicator )
         meshTraverser.template processInteriorEntities< TraverserUserData,
                                                         AdditionEntitiesProcessor >
                                                       ( meshFunction.getMesh(),
                                                         userData );
      else
         meshTraverser.template processInteriorEntities< TraverserUserData,
                                                         AssignmentEntitiesProcessor >
                                                       ( meshFunction.getMesh(),
                                                         userData );


      checkCudaDevice;      
      tnlCuda::freeFromDevice( kernelMeshFunction );
@@ -214,16 +263,23 @@ evaluate( OutMeshFunction& meshFunction,
          const RealType& inFunctionMultiplicator )
{
   typedef typename MeshType::template MeshEntity< OutMeshFunction::getMeshEntityDimensions() > MeshEntityType;
   typedef tnlMeshFunctionEvaluatorEntitiesProcessor< MeshType, TraverserUserData > EntitiesProcessor;
   typedef tnlMeshFunctionEvaluatorAssignmentEntitiesProcessor< MeshType, TraverserUserData > AssignmentEntitiesProcessor;
   typedef tnlMeshFunctionEvaluatorAdditionEntitiesProcessor< MeshType, TraverserUserData > AdditionEntitiesProcessor;
   
   if( std::is_same< MeshDeviceType, tnlHost >::value )
   {
      TraverserUserData userData( &operatorFunction, &time, &meshFunction, &outFunctionMultiplicator, &inFunctionMultiplicator );
      tnlTraverser< MeshType, MeshEntityType > meshTraverser;
      meshTraverser.template processBoundaryEntities< TraverserUserData, EntitiesProcessor >
      if( outFunctionMultiplicator )
         meshTraverser.template processBoundaryEntities< TraverserUserData,
                                                         AdditionEntitiesProcessor >
                                                       ( meshFunction.getMesh(),
                                                         userData );
      else
         meshTraverser.template processBoundaryEntities< TraverserUserData,
                                                         AssignmentEntitiesProcessor >
                                                       ( meshFunction.getMesh(),
                                                         userData );
      
   }
   if( std::is_same< MeshDeviceType, tnlCuda >::value )
   {      
@@ -239,10 +295,17 @@ evaluate( OutMeshFunction& meshFunction,
      TraverserUserData userData( kernelOperatorFunction, kernelTime, kernelMeshFunction, kernelOutFunctionMultiplicator, kernelInFunctionMultiplicator );
      checkCudaDevice;
      tnlTraverser< MeshType, MeshEntityType > meshTraverser;
      meshTraverser.template processInteriorEntities< TraverserUserData, EntitiesProcessor >

      if( outFunctionMultiplicator )
         meshTraverser.template processBoundaryEntities< TraverserUserData,
                                                         AdditionEntitiesProcessor >
                                                       ( meshFunction.getMesh(),
                                                         userData );
      else
         meshTraverser.template processBoundaryEntities< TraverserUserData,
                                                         AssignmentEntitiesProcessor >
                                                       ( meshFunction.getMesh(),
                                                         userData );

      
      checkCudaDevice;      
      tnlCuda::freeFromDevice( kernelMeshFunction );
@@ -252,12 +315,9 @@ evaluate( OutMeshFunction& meshFunction,
      tnlCuda::freeFromDevice( kernelTime );
      tnlCuda::freeFromDevice( kernelOutFunctionMultiplicator );
      tnlCuda::freeFromDevice( kernelInFunctionMultiplicator );            
            
      checkCudaDevice;
   }
}



#endif	/* TNLMESHFUNCTIONEVALUATOR_IMPL_H */
+1 −1
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ class tnlBoundaryConditionsSetter
                                              TraverserUserData& userData,
                                              const GridEntity& entity )
            {
               userData.boundaryConditions->getValue
               ( *userData.u )( entity ) = userData.boundaryConditions->getValue
               ( entity,
                 *userData.u,
                 *userData.time );
+2 −3
Original line number Diff line number Diff line
@@ -49,13 +49,12 @@ class tnlPDEOperatorEocTestResult< tnlLinearDiffusion< tnlGrid< Dimensions, Real

int main( int argc, char* argv[] )
{
   const bool verbose( false );
   const int MeshSize( 32 );
   const bool verbose( true );
   const int MeshSize( 128 );
#ifdef HAVE_CPPUNIT
   /****
    * Explicit approximation
    */
   cerr << "*****" << endl;
   if( ! tnlUnitTestStarter :: run< tnlPDEOperatorEocTester< tnlLinearDiffusion< tnlGrid< 1, double, tnlHost, int >, double, int >,
                                                             tnlExactLinearDiffusion< 1 >,
                                                             tnlExpBumpFunction< 1, double >,
+3 −3
Original line number Diff line number Diff line
@@ -54,8 +54,8 @@ class tnlPDEOperatorEocTestSetter< ApproximateOperator,
                        const IndexType& size )
   {
      VertexType origin, proportions;
      origin.x() = -1.0;
      proportions.x() = 2.0;
      origin.x() = -2.0;
      proportions.x() = 4.0;
      mesh.setDomain( origin, proportions );

      CoordinatesType dimensions;
@@ -65,7 +65,7 @@ class tnlPDEOperatorEocTestSetter< ApproximateOperator,

   static void setFunction( FunctionType& function )
   {
      function.setAmplitude( 1.0 );
      function.setAmplitude( 1.5 );
      function.setSigma( 0.5 );
   };
};
Loading