LatticeModel.tmpl.h 18.6 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//======================================================================================================================
//
//  This file is part of waLBerla. waLBerla 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 3 of
//  the License, or (at your option) any later version.
//
//  waLBerla is distributed in the hope that it will be useful, but WITHOUT
//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
//  for more details.
//
//  You should have received a copy of the GNU General Public License along
//  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
//
//! \\author Martin Bauer <martin.bauer@fau.de>
//
//======================================================================================================================


#include "core/DataTypes.h"
#include "core/logging/Logging.h"

#include "field/GhostLayerField.h"
#include "field/SwapableCompare.h"
#include "domain_decomposition/BlockDataID.h"
#include "domain_decomposition/IBlock.h"
Martin Bauer's avatar
Martin Bauer committed
28
#include "stencil/{{stencil_name}}.h"
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

#include "lbm/lattice_model/EquilibriumDistribution.h"
#include "lbm/field/Density.h"
#include "lbm/field/DensityAndMomentumDensity.h"
#include "lbm/field/DensityAndVelocity.h"
#include "lbm/field/PressureTensor.h"
#include "lbm/field/ShearRate.h"

#include <set>

#ifdef __GNUC__
#define RESTRICT __restrict__
#elif _MSC_VER
#define RESTRICT __restrict
#else
#define RESTRICT
#endif

#ifdef WALBERLA_CXX_COMPILER_IS_GNU
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wunused-parameter"
#endif

53
54
55
56
57
#ifdef WALBERLA_CXX_COMPILER_IS_CLANG
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
#pragma clang diagnostic ignored "-Wunused-parameter"
#endif
58

59
{% set lmIgnores = ('pdfs', 'pdfs_tmp') %}
60
{% set lmOffsets = ('block_offset_0', 'block_offset_1', 'block_offset_2') %}
61
62
63
64
65


// Forward declarations
namespace walberla{
namespace {{namespace}} {
Martin Bauer's avatar
Martin Bauer committed
66
   class {{class_name}};
67
68
69
}}
namespace walberla {
namespace mpi {
Martin Bauer's avatar
Martin Bauer committed
70
71
    mpi::SendBuffer & operator<< (mpi::SendBuffer & buf, const ::walberla::{{namespace}}::{{class_name}} & lm);
    mpi::RecvBuffer & operator>> (mpi::RecvBuffer & buf,       ::walberla::{{namespace}}::{{class_name}} & lm);
72
73
74
75
76
77
78
79
80
81
}}




namespace walberla {
namespace {{namespace}} {


/**
Martin Bauer's avatar
Martin Bauer committed
82
{{class_name}} was generated with lbmpy. Do not edit this file directly. Instead modify {{class_name}}.py.
83
84
85
86
87
88
89
90
For details see documentation of lbmpy.

Usage:
    - Create an instance of this lattice model class: the constructor parameters vary depending on the configure
      lattice model. A model with constant force needs a single force vector, while a model with variable forces needs
      a force field. All constructor parameters are ordered alphabetically.
    - Create a PDFField with the lattice model as template argument to store the particle distribution functions.
      Use the PDFField to get and modify macroscopic values.
Martin Bauer's avatar
Martin Bauer committed
91
    - The internal class {{class_name}}::Sweep is a functor to execute one LB time step.
92
93
94
      Stream, collide steps can be executed separately, or together in an optimized stream-pull-collide scheme

*/
Martin Bauer's avatar
Martin Bauer committed
95
class {{class_name}}
96
97
98
{

public:
Martin Bauer's avatar
Martin Bauer committed
99
100
    typedef stencil::{{stencil_name}} Stencil;
    typedef stencil::{{stencil_name}} CommunicationStencil;
101
102
103
    static const real_t w[{{Q}}];
    static const real_t wInv[{{Q}}];

104
    static const bool compressible = {% if compressible %}true{% else %}false{% endif %};
105
106
107
108
109
110
111
112
113

    class Sweep
    {
    public:
        Sweep( BlockDataID _pdfsID ) : pdfsID(_pdfsID) {};

        //void stream       ( IBlock * const block, const uint_t numberOfGhostLayersToInclude = uint_t(0) );
        void collide      ( IBlock * const block, const uint_t numberOfGhostLayersToInclude = uint_t(0) );
        void streamCollide( IBlock * const block, const uint_t numberOfGhostLayersToInclude = uint_t(0) );
114
        void stream       ( IBlock * const block, const uint_t numberOfGhostLayersToInclude = uint_t(0) );
115
116
117
118
119
120
121

        void operator() ( IBlock * const block, const uint_t numberOfGhostLayersToInclude = uint_t(0) )
        {
            streamCollide( block, numberOfGhostLayersToInclude );
        }

    private:
122
        {{stream_collide_kernel|generate_members(only_fields=True)|indent(8)}}
123
124
    };

125
    {{class_name}}( {{stream_collide_kernel|generate_constructor_parameters(lmIgnores+lmOffsets) }} )
126
        : {{ stream_collide_kernel|generate_constructor_initializer_list(lmIgnores+lmOffsets) }}, currentLevel(0)
127
128
    {};

129
    void configure( IBlock & block, StructuredBlockStorage & storage )  { configureBlock( &block, &storage ); }
130

131
132
133
    // Parameters:
    {{stream_collide_kernel|generate_members(lmIgnores)|indent(4)}}

134
private:
135
    void configureBlock(IBlock * block, StructuredBlockStorage * storage)
136
    {
137
        {{stream_collide_kernel|generate_block_data_to_field_extraction(lmIgnores+lmOffsets, no_declarations=True)|indent(8)}}
138
        {% if need_block_offsets[0] -%}
139
        block_offset_0 = uint32_c(storage->getBlockCellBB(*block).xMin());
140
141
        {% endif -%}
        {%- if need_block_offsets[1] -%}
142
        block_offset_1 = uint32_c(storage->getBlockCellBB(*block).yMin());
143
144
        {% endif -%}
        {%- if need_block_offsets[2] -%}
145
        block_offset_2 = uint32_c(storage->getBlockCellBB(*block).zMin());
146
        {% endif %}
147
        blockId = &block->getId();
148

Martin Bauer's avatar
Martin Bauer committed
149
        {% if refinement_scaling -%}
150
151
152
153
        const uint_t targetLevel = block->getBlockStorage().getLevel(*block);

        if( targetLevel != currentLevel )
        {
Jan Hönig's avatar
Jan Hönig committed
154
            real_t level_scale_factor(1);
155
            if( currentLevel < targetLevel )
Jan Hönig's avatar
Jan Hönig committed
156
               level_scale_factor = real_c( uint_t(1) << ( targetLevel - currentLevel ) );
157
            else // currentLevel > targetLevel
Jan Hönig's avatar
Jan Hönig committed
158
               level_scale_factor = real_t(1) / real_c( uint_t(1) << ( currentLevel - targetLevel ) );
159

Martin Bauer's avatar
Martin Bauer committed
160
            {% for scalingType, name, expression in refinement_scaling.scaling_info -%}
161
162
            {% if scalingType == 'normal' %}
            {{name}} = {{expression}};
Martin Bauer's avatar
Martin Bauer committed
163
164
            {% elif scalingType in ('field_with_f', 'field_xyz') %}
            auto it = {{name}}->{% if scalingType == 'field_with_f'%} beginWithGhostLayer(){% else %}beginWithGhostLayerXYZ(){% endif %};
165
166
167
168
169
            for( ; it != {{name}}->end(); ++it )
            {
                 auto x = it.x();
                 auto y = it.y();
                 auto z = it.z();
Martin Bauer's avatar
Martin Bauer committed
170
                 {% if scalingType == 'field_with_f' -%}
171
172
173
174
175
176
177
178
179
                 auto f = it.f();
                 {% endif -%}
                 *it = {{expression}};
            }
            {% endif -%}
            {% endfor -%}

            currentLevel = targetLevel;
        }
180
        {% endif %}
181
182
183
    }

    // Updated by configureBlock:
Martin Bauer's avatar
Martin Bauer committed
184
    {{stream_collide_kernel|generate_block_data_to_field_extraction(lmIgnores, declarations_only=True)|indent(4)}}
185
    const IBlockID * blockId;
186
187
188
    uint_t currentLevel;

    // Backend classes can access private members:
Martin Bauer's avatar
Martin Bauer committed
189
    friend class {{class_name}}::Sweep;
190
191
192
193
194
195
196
197
    template<class LM, class Enable> friend class  EquilibriumDistribution;
    template<class LM, class Enable> friend struct Equilibrium;
    template<class LM, class Enable> friend struct internal::AdaptVelocityToForce;
    template<class LM, class Enable> friend struct Density;
    template<class LM>               friend struct DensityAndVelocity;
    template<class LM, class Enable> friend struct DensityAndMomentumDensity;
    template<class LM, class Enable> friend struct MomentumDensity;
    template<class LM, class It, class Enable> friend struct DensityAndVelocityRange;
198

Martin Bauer's avatar
Martin Bauer committed
199
200
    friend mpi::SendBuffer & ::walberla::mpi::operator<< (mpi::SendBuffer & , const {{class_name}} & );
    friend mpi::RecvBuffer & ::walberla::mpi::operator>> (mpi::RecvBuffer & ,       {{class_name}} & );
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215

};




//======================================================================================================================
//
//  Implementation of macroscopic value backend
//
//======================================================================================================================



template<>
Martin Bauer's avatar
Martin Bauer committed
216
class EquilibriumDistribution< {{class_name}}, void>
217
{
218
public:
Martin Bauer's avatar
Martin Bauer committed
219
   typedef typename {{class_name}}::Stencil Stencil;
220
221
222
223
224

   static real_t get( const stencil::Direction direction,
                      const Vector3< real_t > & u = Vector3< real_t >( real_t(0.0) ),
                      real_t rho = real_t(1.0) )
   {
225
        {% if not compressible %}
226
227
        rho -= real_t(1.0);
        {% endif %}
Martin Bauer's avatar
Martin Bauer committed
228
        {{equilibrium_from_direction}}
229
230
231
232
233
234
   }

   static real_t getSymmetricPart( const stencil::Direction direction,
                                   const Vector3<real_t> & u = Vector3< real_t >(real_t(0.0)),
                                   real_t rho = real_t(1.0) )
   {
235
        {% if not compressible %}
236
237
        rho -= real_t(1.0);
        {% endif %}
238
        {{symmetric_equilibrium_from_direction}}
239
240
241
242
243
244
   }

   static real_t getAsymmetricPart( const stencil::Direction direction,
                                    const Vector3< real_t > & u = Vector3<real_t>( real_t(0.0) ),
                                    real_t rho = real_t(1.0) )
   {
245
        {% if not compressible %}
246
247
        rho -= real_t(1.0);
        {% endif %}
Martin Bauer's avatar
Martin Bauer committed
248
        {{asymmetric_equilibrium_from_direction}}
249
250
251
252
253
   }

   static std::vector< real_t > get( const Vector3< real_t > & u = Vector3<real_t>( real_t(0.0) ),
                                     real_t rho = real_t(1.0) )
   {
254
      {% if not compressible %}
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
      rho -= real_t(1.0);
      {% endif %}

      std::vector< real_t > equilibrium( Stencil::Size );
      for( auto d = Stencil::begin(); d != Stencil::end(); ++d )
      {
         equilibrium[d.toIdx()] = get(*d, u, rho);
      }
      return equilibrium;
   }
};


namespace internal {

template<>
Martin Bauer's avatar
Martin Bauer committed
271
struct AdaptVelocityToForce<{{class_name}}, void>
272
273
{
   template< typename FieldPtrOrIterator >
Martin Bauer's avatar
Martin Bauer committed
274
   static Vector3<real_t> get( FieldPtrOrIterator & it, const {{class_name}} & lm,
275
276
277
278
279
                               const Vector3< real_t > & velocity, const real_t rho )
   {
      auto x = it.x();
      auto y = it.y();
      auto z = it.z();
Martin Bauer's avatar
Martin Bauer committed
280
281
      {% if macroscopic_velocity_shift %}
      return velocity - Vector3<real_t>({{macroscopic_velocity_shift | join(",") }} {% if D == 2 %}, 0.0 {%endif %} );
282
283
284
285
286
      {% else %}
      return velocity;
      {% endif %}
   }

Martin Bauer's avatar
Martin Bauer committed
287
   static Vector3<real_t> get( const cell_idx_t x, const cell_idx_t y, const cell_idx_t z, const {{class_name}} & lm,
288
289
                               const Vector3< real_t > & velocity, const real_t rho )
   {
Martin Bauer's avatar
Martin Bauer committed
290
      {% if macroscopic_velocity_shift %}
291

Martin Bauer's avatar
Martin Bauer committed
292
      return velocity - Vector3<real_t>({{macroscopic_velocity_shift | join(",") }} {% if D == 2 %}, 0.0 {%endif %} );
293
294
295
296
297
298
299
300
301
302
      {% else %}
      return velocity;
      {% endif %}
   }
};
} // namespace internal



template<>
Martin Bauer's avatar
Martin Bauer committed
303
struct Equilibrium< {{class_name}}, void >
304
305
306
307
{

   template< typename FieldPtrOrIterator >
   static void set( FieldPtrOrIterator & it,
308
                    const Vector3< real_t > & u = Vector3< real_t >( real_t(0.0) ), real_t rho = real_t(1.0) )
309
   {
310
        {%if not compressible %}
311
312
313
        rho -= real_t(1.0);
        {%endif %}

314
       {% for eqTerm in equilibrium -%}
315
       it[{{loop.index0 }}] = {{eqTerm}};
316
317
318
319
320
       {% endfor -%}
   }

   template< typename PdfField_T >
   static void set( PdfField_T & pdf, const cell_idx_t x, const cell_idx_t y, const cell_idx_t z,
321
                    const Vector3< real_t > & u = Vector3< real_t >( real_t(0.0) ), real_t rho = real_t(1.0) )
322
   {
323
      {%if not compressible %}
324
325
326
      rho -= real_t(1.0);
      {%endif %}

327
328
      real_t & xyz0 = pdf(x,y,z,0);
      {% for eqTerm in equilibrium -%}
329
      pdf.getF( &xyz0, {{loop.index0 }})= {{eqTerm}};
330
331
332
333
334
335
      {% endfor -%}
   }
};


template<>
Martin Bauer's avatar
Martin Bauer committed
336
struct Density<{{class_name}}, void>
337
338
{
   template< typename FieldPtrOrIterator >
Martin Bauer's avatar
Martin Bauer committed
339
   static inline real_t get( const {{class_name}} & , const FieldPtrOrIterator & it )
340
341
342
343
   {
        {% for i in range(Q) -%}
            const real_t f_{{i}} = it[{{i}}];
        {% endfor -%}
Martin Bauer's avatar
Martin Bauer committed
344
        {{density_getters | indent(8)}}
345
346
347
348
        return rho;
   }

   template< typename PdfField_T >
Martin Bauer's avatar
Martin Bauer committed
349
   static inline real_t get( const {{class_name}} & ,
350
351
352
353
354
355
                             const PdfField_T & pdf, const cell_idx_t x, const cell_idx_t y, const cell_idx_t z )
   {
        const real_t & xyz0 = pdf(x,y,z,0);
        {% for i in range(Q) -%}
            const real_t f_{{i}} = pdf.getF( &xyz0, {{i}});
        {% endfor -%}
Martin Bauer's avatar
Martin Bauer committed
356
        {{density_getters | indent(8)}}
357
358
359
360
361
362
        return rho;
   }
};


template<>
Martin Bauer's avatar
Martin Bauer committed
363
struct DensityAndVelocity<{{class_name}}>
364
365
{
    template< typename FieldPtrOrIterator >
Martin Bauer's avatar
Martin Bauer committed
366
    static void set( FieldPtrOrIterator & it, const {{class_name}} & lm,
Jan Hönig's avatar
Jan Hönig committed
367
                     const Vector3< real_t > & u = Vector3< real_t >( real_t(0.0) ), const real_t rho_in = real_t(1.0) )
368
369
370
371
372
    {
        auto x = it.x();
        auto y = it.y();
        auto z = it.z();

Martin Bauer's avatar
Martin Bauer committed
373
        {{density_velocity_setter_macroscopic_values | indent(8)}}
374
375
376
377
        {% if D == 2 -%}
        const real_t u_2(0.0);
        {% endif %}

378
        Equilibrium<{{class_name}}>::set(it, Vector3<real_t>(u_0, u_1, u_2), rho{%if not compressible %} + real_t(1) {%endif%});
379
380
381
    }

    template< typename PdfField_T >
Martin Bauer's avatar
Martin Bauer committed
382
    static void set( PdfField_T & pdf, const cell_idx_t x, const cell_idx_t y, const cell_idx_t z, const {{class_name}} & lm,
Jan Hönig's avatar
Jan Hönig committed
383
                     const Vector3< real_t > & u = Vector3< real_t >( real_t(0.0) ), const real_t rho_in = real_t(1.0) )
384
    {
Martin Bauer's avatar
Martin Bauer committed
385
        {{density_velocity_setter_macroscopic_values | indent(8)}}
386
387
388
389
        {% if D == 2 -%}
        const real_t u_2(0.0);
        {% endif %}

390
        Equilibrium<{{class_name}}>::set(pdf, x, y, z, Vector3<real_t>(u_0, u_1, u_2), rho {%if not compressible %} + real_t(1) {%endif%});
391
392
393
394
395
    }
};


template<typename FieldIteratorXYZ >
Martin Bauer's avatar
Martin Bauer committed
396
struct DensityAndVelocityRange<{{class_name}}, FieldIteratorXYZ>
397
398
{

Martin Bauer's avatar
Martin Bauer committed
399
   static void set( FieldIteratorXYZ & begin, const FieldIteratorXYZ & end, const {{class_name}} & lm,
Jan Hönig's avatar
Jan Hönig committed
400
                    const Vector3< real_t > & u = Vector3< real_t >( real_t(0.0) ), const real_t rho_in = real_t(1.0) )
401
402
403
404
405
406
   {
        for( auto cellIt = begin; cellIt != end; ++cellIt )
        {
            const auto x = cellIt.x();
            const auto y = cellIt.y();
            const auto z = cellIt.z();
Martin Bauer's avatar
Martin Bauer committed
407
            {{density_velocity_setter_macroscopic_values | indent(12)}}
408
409
410
411
            {% if D == 2 -%}
            const real_t u_2(0.0);
            {% endif %}

412
            Equilibrium<{{class_name}}>::set(cellIt, Vector3<real_t>(u_0, u_1, u_2), rho{%if not compressible %} + real_t(1) {%endif%});
413
414
415
416
417
418
419
        }
   }
};



template<>
Martin Bauer's avatar
Martin Bauer committed
420
struct DensityAndMomentumDensity<{{class_name}}>
421
422
{
   template< typename FieldPtrOrIterator >
Martin Bauer's avatar
Martin Bauer committed
423
   static real_t get( Vector3< real_t > & momentumDensity, const {{class_name}} & lm,
424
425
426
427
428
429
430
431
432
433
                      const FieldPtrOrIterator & it )
   {
        const auto x = it.x();
        const auto y = it.y();
        const auto z = it.z();

        {% for i in range(Q) -%}
            const real_t f_{{i}} = it[{{i}}];
        {% endfor -%}

Martin Bauer's avatar
Martin Bauer committed
434
        {{momentum_density_getter | indent(8) }}
435
436
437
438
439
440
441
        {% for i in range(D) -%}
            momentumDensity[{{i}}] = md_{{i}};
        {% endfor %}
        return rho;
   }

   template< typename PdfField_T >
Martin Bauer's avatar
Martin Bauer committed
442
   static real_t get( Vector3< real_t > & momentumDensity, const {{class_name}} & lm, const PdfField_T & pdf,
443
444
445
446
447
448
449
                      const cell_idx_t x, const cell_idx_t y, const cell_idx_t z )
   {
        const real_t & xyz0 = pdf(x,y,z,0);
        {% for i in range(Q) -%}
            const real_t f_{{i}} = pdf.getF( &xyz0, {{i}});
        {% endfor -%}

Martin Bauer's avatar
Martin Bauer committed
450
        {{momentum_density_getter | indent(8) }}
451
452
453
454
455
456
457
458
459
        {% for i in range(D) -%}
            momentumDensity[{{i}}] = md_{{i}};
        {% endfor %}
       return rho;
   }
};


template<>
Martin Bauer's avatar
Martin Bauer committed
460
struct MomentumDensity< {{class_name}}>
461
462
{
   template< typename FieldPtrOrIterator >
Martin Bauer's avatar
Martin Bauer committed
463
   static void get( Vector3< real_t > & momentumDensity, const {{class_name}} & lm, const FieldPtrOrIterator & it )
464
465
466
467
468
469
470
471
472
   {
        const auto x = it.x();
        const auto y = it.y();
        const auto z = it.z();

        {% for i in range(Q) -%}
            const real_t f_{{i}} = it[{{i}}];
        {% endfor -%}

Martin Bauer's avatar
Martin Bauer committed
473
        {{momentum_density_getter | indent(8) }}
474
475
476
477
478
479
        {% for i in range(D) -%}
            momentumDensity[{{i}}] = md_{{i}};
        {% endfor %}
   }

   template< typename PdfField_T >
Martin Bauer's avatar
Martin Bauer committed
480
   static void get( Vector3< real_t > & momentumDensity, const {{class_name}} & lm, const PdfField_T & pdf,
481
482
483
484
485
486
487
                    const cell_idx_t x, const cell_idx_t y, const cell_idx_t z )
   {
        const real_t & xyz0 = pdf(x,y,z,0);
        {% for i in range(Q) -%}
            const real_t f_{{i}} = pdf.getF( &xyz0, {{i}});
        {% endfor -%}

Martin Bauer's avatar
Martin Bauer committed
488
        {{momentum_density_getter | indent(8) }}
489
490
491
492
493
494
495
496
        {% for i in range(D) -%}
            momentumDensity[{{i}}] = md_{{i}};
        {% endfor %}
   }
};


template<>
Martin Bauer's avatar
Martin Bauer committed
497
struct PressureTensor<{{class_name}}>
498
499
{
   template< typename FieldPtrOrIterator >
Martin Bauer's avatar
Martin Bauer committed
500
   static void get( Matrix3< real_t > & /* pressureTensor */, const {{class_name}} & /* latticeModel */, const FieldPtrOrIterator & /* it */ )
501
502
503
504
505
   {
       WALBERLA_ABORT("Not implemented");
   }

   template< typename PdfField_T >
Martin Bauer's avatar
Martin Bauer committed
506
   static void get( Matrix3< real_t > & /* pressureTensor */, const {{class_name}} & /* latticeModel */, const PdfField_T & /* pdf */,
507
                    const cell_idx_t /* x */, const cell_idx_t /* y */, const cell_idx_t /* z */ )
508
509
510
511
512
513
514
   {
       WALBERLA_ABORT("Not implemented");
   }
};


template<>
Martin Bauer's avatar
Martin Bauer committed
515
struct ShearRate<{{class_name}}>
516
517
{
   template< typename FieldPtrOrIterator >
Martin Bauer's avatar
Martin Bauer committed
518
   static inline real_t get( const {{class_name}} & /* latticeModel */, const FieldPtrOrIterator & /* it */,
519
                             const Vector3< real_t > & /* velocity */, const real_t /* rho */)
520
521
522
523
524
525
   {
       WALBERLA_ABORT("Not implemented");
       return real_t(0.0);
   }

   template< typename PdfField_T >
Martin Bauer's avatar
Martin Bauer committed
526
   static inline real_t get( const {{class_name}} & latticeModel,
527
528
                             const PdfField_T & /* pdf */, const cell_idx_t /* x */, const cell_idx_t /* y */, const cell_idx_t /* z */,
                             const Vector3< real_t > & /* velocity */, const real_t /* rho */ )
529
530
531
532
533
   {
       WALBERLA_ABORT("Not implemented");
       return real_t(0.0);
   }

534
535
   static inline real_t get( const std::vector< real_t > & /* nonEquilibrium */, const real_t /* relaxationParam */,
                             const real_t /* rho */ = real_t(1) )
536
537
538
539
540
541
542
543
544
545
546
547
548
549
   {
       WALBERLA_ABORT("Not implemented");
       return real_t(0.0);
   }
};


} // namespace {{namespace}}
} // namespace walberla



#ifdef WALBERLA_CXX_COMPILER_IS_GNU
#pragma GCC diagnostic pop
550
551
552
553
554
#endif

#ifdef WALBERLA_CXX_COMPILER_IS_CLANG
#pragma clang diagnostic pop
#endif