stokes2cnisubproblem.hh 18.5 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
// vi: set et ts=4 sw=4 sts=4:
/*****************************************************************************
 *   See the file COPYING for full copying permissions.                      *
 *                                                                           *
 *   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.                                     *
 *                                                                           *
 *   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.   *
 *****************************************************************************/
/**
20
21
22
 * \file
 * \brief Non-isothermal two-component stokes subproblem with air flowing
 *        from the left to the right and coupling at the bottom.
23
24
25
26
27
 */
#ifndef DUMUX_STOKES2CNI_SUBPROBLEM_HH
#define DUMUX_STOKES2CNI_SUBPROBLEM_HH

#include <dumux/freeflow/stokesncni/stokesncnimodel.hh>
28
#include <dumux/multidomain/2cnistokes2p2cni/stokesncnicouplinglocalresidual.hh>
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <dumux/multidomain/common/subdomainpropertydefaults.hh>

namespace Dumux
{

template <class TypeTag>
class Stokes2cniSubProblem;

//////////
// Specify the properties for the Stokes problem
//////////
namespace Properties
{
42
NEW_TYPE_TAG(Stokes2cniSubProblem,
43
    INHERITS_FROM(BoxStokesncni, SubDomain));
44
45
46
47

// Set the problem property
SET_TYPE_PROP(Stokes2cniSubProblem, Problem, Dumux::Stokes2cniSubProblem<TypeTag>);

Thomas Fetzer's avatar
Thomas Fetzer committed
48
// Use the Stokes2cniCouplingLocalResidual for the computation of the local residual in the Stokes domain
49
50
SET_TYPE_PROP(Stokes2cniSubProblem, LocalResidual, StokesncniCouplingLocalResidual<TypeTag>);

Thomas Fetzer's avatar
Thomas Fetzer committed
51
52
53
54
// Set the property for the material parameters by extracting it from the material law.
SET_TYPE_PROP(Stokes2cniSubProblem,
              MaterialLawParams,
              typename GET_PROP_TYPE(TypeTag, MaterialLaw)::Params);
55

Thomas Fetzer's avatar
Thomas Fetzer committed
56
57
58
59
// Used the fluid system from the coupled problem
SET_TYPE_PROP(Stokes2cniSubProblem,
              FluidSystem,
              typename GET_PROP_TYPE(typename GET_PROP_TYPE(TypeTag, MultiDomainTypeTag), FluidSystem));
60
61
62
63
64
65
66
67
68
69
70
71

// use formulation based on mass fractions
SET_BOOL_PROP(Stokes2cniSubProblem, UseMoles, false);

// Disable gravity in the Stokes domain
SET_BOOL_PROP(Stokes2cniSubProblem, ProblemEnableGravity, false);

// switch inertia term on or off
SET_BOOL_PROP(Stokes2cniSubProblem, EnableNavierStokes, false);
}

/*!
72
 * \ingroup ImplicitTestProblems
Hao Wu's avatar
Hao Wu committed
73
 * \ingroup TwoPTwoCNIStokesTwoCNIModel
74
75
 * \brief Non-isothermal two-component stokes subproblem with air flowing
 *        from the left to the right and coupling at the bottom.
76
 *
77
78
79
80
 * The Stokes subdomain is sized 0.25m times 0.25m. The boundary conditions
 * for the momentum balances are all set to Dirichlet, except on the right
 * boundary, where outflow conditions are set. The mass balance receives
 * outflow BCs, which are replaced in the localresidual by the sum
81
 * of the two momentum balances. In the middle of the right boundary,
82
 * one vertex receives Dirichlet BCs, to set the pressure level.
83
 *
84
85
86
 * This sub problem uses the \ref StokesncniModel. It is part of the
 * 2cnistokes2p2cni model and is combined with the 2p2cnisubproblem for
 * the Darcy domain.
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
 */
template <class TypeTag>
class Stokes2cniSubProblem : public StokesProblem<TypeTag>
{
    typedef Stokes2cniSubProblem<TypeTag> ThisType;
    typedef StokesProblem<TypeTag> ParentType;

    typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView;
    typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager;

    enum {
        // Number of equations and grid dimension
        numEq = GET_PROP_VALUE(TypeTag, NumEq),
        dim = GridView::dimension
    };
    typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices;
    enum {
        // equation indices
        massBalanceIdx = Indices::massBalanceIdx,
        momentumXIdx = Indices::momentumXIdx, //!< Index of the x-component of the momentum balance
        momentumYIdx = Indices::momentumYIdx, //!< Index of the y-component of the momentum balance
        momentumZIdx = Indices::momentumZIdx, //!< Index of the z-component of the momentum balance
        transportEqIdx = Indices::transportEqIdx, //!< Index of the transport equation (massfraction)
        energyEqIdx =    Indices::energyEqIdx     //!< Index of the energy equation (temperature)
    };
    enum { // primary variable indices
        pressureIdx = Indices::pressureIdx,
        velocityXIdx = Indices::velocityXIdx,
        velocityYIdx = Indices::velocityYIdx,
        velocityZIdx = Indices::velocityZIdx,
        massOrMoleFracIdx = Indices::massOrMoleFracIdx,
        temperatureIdx = Indices::temperatureIdx
    };
    enum { phaseIdx = Indices::phaseIdx };
    enum { numComponents = Indices::numComponents };
    enum {
        transportCompIdx = Indices::transportCompIdx, //!< water component index
        phaseCompIdx = Indices::phaseCompIdx          //!< air component index
    };

    typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables;
    typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes;

    typedef typename GridView::template Codim<0>::Entity Element;
    typedef typename GridView::template Codim<dim>::Entity Vertex;
    typedef typename GridView::ctype CoordScalar;
    typedef typename GridView::Intersection Intersection;

    typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry;
    typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem;
    typedef typename GET_PROP_TYPE(TypeTag, FluidState) FluidState;

    typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar;
    typedef Dune::FieldVector<CoordScalar, dim> GlobalPosition;

Thomas Fetzer's avatar
Thomas Fetzer committed
142
public:
143
    /*!
144
145
146
147
     * \brief The sub-problem for the Stokes subdomain
     *
     * \param timeManager The TimeManager which is used by the simulation
     * \param gridView The simulation's idea about physical space
148
149
     */
    Stokes2cniSubProblem(TimeManager &timeManager, const GridView &gridView)
150
        : ParentType(timeManager, gridView)
151
    {
Thomas Fetzer's avatar
[io]    
Thomas Fetzer committed
152
153
        bBoxMin_[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, LowerLeftX);
        bBoxMax_[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, UpperRightX);
Thomas Fetzer's avatar
Thomas Fetzer committed
154
        bBoxMin_[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, InterfacePosY);
Thomas Fetzer's avatar
[io]    
Thomas Fetzer committed
155
        bBoxMax_[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, UpperRightY);
Thomas Fetzer's avatar
Thomas Fetzer committed
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
        runUpDistanceX_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, RunUpDistanceX); // first part of the interface without coupling

        refVelocity_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefVelocity);
        refPressure_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefPressure);
        refMassfrac_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefMassfrac);
        refTemperature_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefTemperature);

        sinusVAmplitude_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusVelAmplitude);
        sinusVPeriod_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusVelPeriod);
        sinusPAmplitude_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusPressureAmplitude);
        sinusPPeriod_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusPressurePeriod);
        sinusXAmplitude_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusConcentrationAmplitude);
        sinusXPeriod_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusConcentrationPeriod);
        sinusTAmplitude_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusTemperatureAmplitude);
        sinusTPeriod_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusTemperaturePeriod);
        useDirichletBC_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, bool, FreeFlow, UseDirichletBC);

        initializationTime_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, InitTime);
174
175
    }

176
177
178
179
180
181
182
183
184
    // functions have to be overwritten, otherwise they remain uninitialized
    //! \copydoc Dumux::ImplicitProblem::bBoxMin()
    const GlobalPosition &bBoxMin() const
    { return bBoxMin_; }

    //! \copydoc Dumux::ImplicitProblem::bBoxMax()
    const GlobalPosition &bBoxMax() const
    { return bBoxMax_; }

185
186
187
188
189
    /*!
     * \name Problem parameters
     */
    // \{

190
191
192
193
194
    /*!
     * \brief Returns the problem name
     *
     * This is used as a prefix for files generated by the simulation.
     */
195
    const std::string &name() const
Thomas Fetzer's avatar
Thomas Fetzer committed
196
    { return GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, std::string, Output, NameFF); }
197
198
199
200
201
202
203
204

    // \}

    /*!
     * \name Boundary conditions
     */
    // \{

205
206
    /*!
     * \brief Specifies which kind of boundary condition should be
Thomas Fetzer's avatar
Thomas Fetzer committed
207
     *        used for which equation on a given boundary segment
208
209
     *
     * \param values Stores the value of the boundary type
Thomas Fetzer's avatar
Thomas Fetzer committed
210
     * \param globalPos The global position
211
     */
Thomas Fetzer's avatar
Thomas Fetzer committed
212
213
    void boundaryTypesAtPos(BoundaryTypes &values,
                            const GlobalPosition &globalPos) const
214
215
216
217
218
219
220
    {
        const Scalar time = this->timeManager().time();

        values.setAllDirichlet();

        if (onUpperBoundary_(globalPos))
        {
Thomas Fetzer's avatar
Thomas Fetzer committed
221
            if (useDirichletBC_)
Thomas Fetzer's avatar
Thomas Fetzer committed
222
223
            {
                values.setNeumann(transportEqIdx);
224
                values.setDirichlet(temperatureIdx);
Thomas Fetzer's avatar
Thomas Fetzer committed
225
226
227
228
229
230
            }
            else
            {
                values.setNeumann(transportEqIdx);
                values.setNeumann(energyEqIdx);
            }
231
232
        }

Thomas Fetzer's avatar
Thomas Fetzer committed
233
234
        // Left inflow boundaries should be Neumann, otherwise the
        // evaporative fluxes are much more grid dependent
235
236
        if (onLeftBoundary_(globalPos))
        {
Thomas Fetzer's avatar
Thomas Fetzer committed
237
            if (useDirichletBC_)
Thomas Fetzer's avatar
Thomas Fetzer committed
238
            {
239
240
                values.setDirichlet(massOrMoleFracIdx);
                values.setDirichlet(temperatureIdx);
Thomas Fetzer's avatar
Thomas Fetzer committed
241
242
243
244
245
246
247
248
            }
            else
            {
                values.setNeumann(transportEqIdx);
                values.setNeumann(energyEqIdx);
                if (onUpperBoundary_(globalPos)) // corner point
                    values.setAllDirichlet();
            }
249
250
251
252
253
254
255
256
257
258
259
260
261
        }

        if (onRightBoundary_(globalPos))
        {
            values.setAllOutflow();

            if (onUpperBoundary_(globalPos)) // corner point
                values.setAllDirichlet();
        }

        if (onLowerBoundary_(globalPos))
        {
            values.setAllDirichlet();
Thomas Fetzer's avatar
Thomas Fetzer committed
262
            if (useDirichletBC_)
Thomas Fetzer's avatar
Thomas Fetzer committed
263
264
            {
                values.setNeumann(transportEqIdx);
265
                values.setDirichlet(temperatureIdx);
Thomas Fetzer's avatar
Thomas Fetzer committed
266
267
            }
            else
268
269
270
            {
                values.setNeumann(transportEqIdx);
                values.setNeumann(energyEqIdx);
Thomas Fetzer's avatar
Thomas Fetzer committed
271
272
                if (onLeftBoundary_(globalPos)) // corner point
                    values.setAllDirichlet();
273
274
275
276
            }

            if (globalPos[0] > runUpDistanceX_-eps_ && time > initializationTime_)
            {
277
                values.setAllCouplingDirichlet();
278
279
                values.setCouplingNeumann(momentumXIdx);
                values.setCouplingNeumann(momentumYIdx);
280
281
282
283
284
285
286
287
288
289
290
291
            }
        }

        // the mass balance has to be of type outflow
        // it does not get a coupling condition, since pn is a condition for stokes
        values.setOutflow(massBalanceIdx);

        // set pressure at one point, do NOT specify this
        // if the Darcy domain has a Dirichlet condition for pressure
        if (onRightBoundary_(globalPos))
        {
            if (time > initializationTime_)
292
                values.setDirichlet(pressureIdx);
293
294
            else
                if (!onLowerBoundary_(globalPos) && !onUpperBoundary_(globalPos))
295
                    values.setDirichlet(pressureIdx);
296
297
298
        }
    }

299
    /*!
Thomas Fetzer's avatar
Thomas Fetzer committed
300
301
     * \brief Evaluates the boundary conditions for a Dirichlet
     *        boundary segment
302
303
304
     *
     * \param values Stores the Dirichlet values for the conservation equations in
     *               \f$ [ \textnormal{unit of primary variable} ] \f$
Thomas Fetzer's avatar
Thomas Fetzer committed
305
     * \param globalPos The global position
306
     */
Thomas Fetzer's avatar
Thomas Fetzer committed
307
    void dirichletAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const
308
309
310
311
312
313
314
315
316
317
318
319
    {
        values = 0.0;

        FluidState fluidState;
        updateFluidStateForBC_(fluidState);

        const Scalar density =
                FluidSystem::density(fluidState, phaseIdx);

        values[velocityXIdx] = xVelocity_(globalPos);
        values[velocityYIdx] = 0.0;
        values[pressureIdx] = refPressure()  +
Thomas Fetzer's avatar
Thomas Fetzer committed
320
                density*this->gravity()[1]*(globalPos[1] - bBoxMin_[1]);
321
322
323
324
        values[massOrMoleFracIdx] = refMassfrac();
        values[temperatureIdx] = refTemperature();
    }

325
    /*!
Thomas Fetzer's avatar
Thomas Fetzer committed
326
327
     * \brief Evaluate the boundary conditions for a Neumann
     *        boundary segment.
328
     *
Thomas Fetzer's avatar
Thomas Fetzer committed
329
330
331
     * \param values The Neumann values for the conservation equations in units of
     *                 \f$ [ \textnormal{unit of conserved quantity} / (m^{\textrm{dim}-1} \cdot s )] \f$
     * \param globalPos The global position
332
     */
Thomas Fetzer's avatar
Thomas Fetzer committed
333
    void neumannAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const
334
335
336
337
338
339
340
341
342
343
344
345
346
    {
        values = 0.;

        FluidState fluidState;
        updateFluidStateForBC_(fluidState);

        const Scalar density =
                FluidSystem::density(fluidState, phaseIdx);
        const Scalar enthalpy =
                FluidSystem::enthalpy(fluidState, phaseIdx);
        const Scalar xVelocity = xVelocity_(globalPos);

        if (onLeftBoundary_(globalPos)
Thomas Fetzer's avatar
Thomas Fetzer committed
347
                && globalPos[1] > bBoxMin_[1] && globalPos[1] < bBoxMax_[1])
348
349
350
351
352
353
354
355
        {
            values[transportEqIdx] = -xVelocity*density*refMassfrac();
            values[energyEqIdx] = -xVelocity*density*enthalpy;
        }
    }

    // \}

356
    /*!
Thomas Fetzer's avatar
Thomas Fetzer committed
357
     * \brief Returns the source term
358
     *
Thomas Fetzer's avatar
Thomas Fetzer committed
359
360
361
     * \param values Stores the source values for the conservation equations in
     *               \f$ [ \textnormal{unit of primary variable} / (m^\textrm{dim} \cdot s )] \f$
     * \param globalPos The global position
362
     */
Thomas Fetzer's avatar
Thomas Fetzer committed
363
364
    void sourceAtPos(PrimaryVariables &values,
                     const GlobalPosition &globalPos) const
365
    {
366
        // The source term of the mass balance has to be chosen as
367
368
369
370
        // div (q_momentum) in the problem file
        values = Scalar(0);
    }

371
372
373
    /*!
     * \brief Evaluate the initial value for a control volume.
     *
Thomas Fetzer's avatar
Thomas Fetzer committed
374
375
376
     * \param values Stores the initial values for the conservation equations in
     *               \f$ [ \textnormal{unit of primary variables} ] \f$
     * \param globalPos The global position
377
     */
Thomas Fetzer's avatar
Thomas Fetzer committed
378
    void initialAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const
379
380
381
382
383
    {
        initial_(values, globalPos);
    }
    // \}

384
385
386
387
    //! \brief Returns the reference velocity.
    const Scalar refVelocity() const
    { return refVelocity_ + variation_(sinusVAmplitude_, sinusVPeriod_); }

388
389
    //! \brief Returns the reference pressure.
    const Scalar refPressure() const
390
    { return refPressure_ + variation_(sinusPAmplitude_, sinusPPeriod_); }
391

392
    //! \brief Returns the reference mass fraction.
393
    const Scalar refMassfrac() const
394
395
396
397
398
    { return refMassfrac_ + variation_(sinusXAmplitude_, sinusXPeriod_); }

    //! \brief Returns the reference temperature.
    const Scalar refTemperature() const
    { return refTemperature_+ variation_(sinusTAmplitude_, sinusTPeriod_); }
399
400

private:
401
402
403
404
    /*!
     * \brief Internal method for the initial condition
     *        (reused for the dirichlet conditions!)
     */
405
406
407
408
409
410
411
412
413
414
415
416
417
    void initial_(PrimaryVariables &values,
                  const GlobalPosition &globalPos) const
    {
        FluidState fluidState;
        updateFluidStateForBC_(fluidState);

        const Scalar density =
                FluidSystem::density(fluidState, phaseIdx);

        values[velocityXIdx] = xVelocity_(globalPos);
        values[velocityYIdx] = 0.;

        values[pressureIdx] = refPressure()
Thomas Fetzer's avatar
Thomas Fetzer committed
418
                + density*this->gravity()[1]*(globalPos[1] - bBoxMin_[1]);
419
420
421
422
        values[massOrMoleFracIdx] = refMassfrac();
        values[temperatureIdx] = refTemperature();
    }

423
    //! \brief set the profile of the inflow velocity (horizontal direction)
424
425
    const Scalar xVelocity_(const GlobalPosition &globalPos) const
    {
426
        const Scalar vmax = refVelocity();
Thomas Fetzer's avatar
Thomas Fetzer committed
427
        return  4*vmax*(globalPos[1] - bBoxMin_[1])*(bBoxMax_[1] - globalPos[1])
Thomas Fetzer's avatar
Thomas Fetzer committed
428
                / (height_()*height_()) + 0.00134;
429
430
    }

431
    //! \brief updates the fluid state to obtain required quantities for IC/BC
432
433
434
435
    void updateFluidStateForBC_(FluidState& fluidState) const
    {
        fluidState.setTemperature(refTemperature());
        fluidState.setPressure(phaseIdx, refPressure());
Thomas Fetzer's avatar
Thomas Fetzer committed
436
437
        // setMassFraction() has only to be called 1-numComponents times
        fluidState.setMassFraction(phaseIdx, transportCompIdx, refMassfrac());
438
439
    }

440
441
442
    // can be used for the variation of a boundary condition
    const Scalar variation_(const Scalar amplitude, const Scalar period) const
    { return sin(2*M_PI*this->timeManager().time()/period) * amplitude; }
443
444

    bool onLeftBoundary_(const GlobalPosition &globalPos) const
Thomas Fetzer's avatar
Thomas Fetzer committed
445
    { return globalPos[0] < bBoxMin_[0] + eps_; }
446
447

    bool onRightBoundary_(const GlobalPosition &globalPos) const
Thomas Fetzer's avatar
Thomas Fetzer committed
448
    { return globalPos[0] > bBoxMax_[0] - eps_; }
449
450

    bool onLowerBoundary_(const GlobalPosition &globalPos) const
Thomas Fetzer's avatar
Thomas Fetzer committed
451
    { return globalPos[1] < bBoxMin_[1] + eps_; }
452
453

    bool onUpperBoundary_(const GlobalPosition &globalPos) const
Thomas Fetzer's avatar
Thomas Fetzer committed
454
    { return globalPos[1] > bBoxMax_[1] - eps_; }
455
456

    const Scalar height_() const
Thomas Fetzer's avatar
Thomas Fetzer committed
457
    { return bBoxMax_[1] - bBoxMin_[1]; }
458
459
460

    static constexpr Scalar eps_ = 1e-8;

Thomas Fetzer's avatar
Thomas Fetzer committed
461
462
    GlobalPosition bBoxMin_;
    GlobalPosition bBoxMax_;
463

464
    Scalar refVelocity_;
465
466
    Scalar refPressure_;
    Scalar refMassfrac_;
467
468
469
470
471
472
473
474
475
476
    Scalar refTemperature_;

    Scalar sinusVAmplitude_;
    Scalar sinusVPeriod_;
    Scalar sinusPAmplitude_;
    Scalar sinusPPeriod_;
    Scalar sinusXAmplitude_;
    Scalar sinusXPeriod_;
    Scalar sinusTAmplitude_;
    Scalar sinusTPeriod_;
477

Thomas Fetzer's avatar
Thomas Fetzer committed
478
    bool useDirichletBC_;
479
480
481
482
483
484

    Scalar runUpDistanceX_;
    Scalar initializationTime_;
};
} //end namespace

485
#endif // DUMUX_STOKES2CNI_SUBPROBLEM_HH