Chaste Commit::1fd4e48e3990e67db148bc1bc4cf6991a0049d0c
ImmersedBoundarySimulationModifier.hpp
1/*
2
3Copyright (c) 2005-2024, University of Oxford.
4All rights reserved.
5
6University of Oxford means the Chancellor, Masters and Scholars of the
7University of Oxford, having an administrative office at Wellington
8Square, Oxford OX1 2JD, UK.
9
10This file is part of Chaste.
11
12Redistribution and use in source and binary forms, with or without
13modification, are permitted provided that the following conditions are met:
14 * Redistributions of source code must retain the above copyright notice,
15 this list of conditions and the following disclaimer.
16 * Redistributions in binary form must reproduce the above copyright notice,
17 this list of conditions and the following disclaimer in the documentation
18 and/or other materials provided with the distribution.
19 * Neither the name of the University of Oxford nor the names of its
20 contributors may be used to endorse or promote products derived from this
21 software without specific prior written permission.
22
23THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
27LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
29GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
34*/
35
36#ifndef IMMERSEDBOUNDARYSIMULATIONMODIFIER_HPP_
37#define IMMERSEDBOUNDARYSIMULATIONMODIFIER_HPP_
38
39// Chaste includes
40#include "AbstractCellBasedSimulationModifier.hpp"
41#include "ObsoleteBoxCollection.hpp"
43
44// Immersed boundary includes
45#include "AbstractImmersedBoundaryForce.hpp"
46#include "ImmersedBoundaryCellPopulation.hpp"
47#include "ImmersedBoundaryMesh.hpp"
48#include "ImmersedBoundaryArray.hpp"
49#include "ImmersedBoundary2dArrays.hpp"
50#include "ImmersedBoundaryFftInterface.hpp"
51#include "UniformGridRandomFieldGenerator.hpp"
52
53// Other includes
54#include <complex>
55#include <boost/serialization/base_object.hpp>
56
63template<unsigned DIM>
65{
66private:
67
70
80 template<class Archive>
81 void serialize(Archive & archive, const unsigned int version)
82 {
83 archive & boost::serialization::base_object<AbstractCellBasedSimulationModifier<DIM,DIM> >(*this);
84 }
85
88
91
94
97
100
102 double mFftNorm;
103
106
109
114 unsigned mNoiseSkip;
115
118
121
123 std::unique_ptr<ObsoleteBoxCollection<DIM>> mpBoxCollection;
124
126 std::vector<std::pair<Node<DIM>*, Node<DIM>*> > mNodePairs;
127
129 std::map<unsigned, std::set<unsigned> > mNodeNeighbours;
130
137
139 std::complex<double> mI;
140
142 std::vector<boost::shared_ptr<AbstractImmersedBoundaryForce<DIM> > > mForceCollection;
143
145 std::unique_ptr<ImmersedBoundary2dArrays<DIM>> mpArrays;
146
148 std::unique_ptr<ImmersedBoundaryFftInterface<DIM>> mpFftInterface;
149
151 std::unique_ptr<UniformGridRandomFieldGenerator<DIM>> mpRandomField;
152
160
168
175
182
187
193
199
205
214 double Delta1D(double dist, double spacing);
215
222 void Upwind2d(const multi_array<double, 3>& rInput, multi_array<double, 3>& rOutput);
223
230 void CalculateSourceGradients(const multi_array<double, 3>& rRhs, multi_array<double, 3>& rGradients);
231
237 void ZeroFieldSums(multi_array<double, 3>& rField);
238
239public:
240
245
250
258 virtual void UpdateAtEndOfTimeStep(AbstractCellPopulation<DIM,DIM>& rCellPopulation);
259
268 virtual void SetupSolve(AbstractCellPopulation<DIM,DIM>& rCellPopulation, std::string outputDirectory);
269
276 void OutputSimulationModifierParameters(out_stream& rParamsFile);
277
281 void SetNodeNeighbourUpdateFrequency(unsigned newFrequency);
282
287
293 void AddImmersedBoundaryForce(boost::shared_ptr<AbstractImmersedBoundaryForce<DIM> > pForce);
294
298 void AddNormalNoise() const;
299
301 bool GetZeroFieldSums() const;
302
304 void SetZeroFieldSums(bool zeroFieldSums);
305
307 void SetReynoldsNumber(double reynoldsNumber);
308
310 double GetReynoldsNumber();
311
313 bool GetAdditiveNormalNoise() const;
314
316 void SetAdditiveNormalNoise(bool additiveNormalNoise);
317
319 double GetNoiseStrength() const;
320
322 void SetNoiseStrength(double noiseStrength);
323
325 unsigned GetNoiseSkip() const;
326
328 void SetNoiseSkip(unsigned noiseSkip);
329
331 double GetNoiseLengthScale() const;
332
334 void SetNoiseLengthScale(double noiseLengthScale);
335
336};
337
340
341#endif /*IMMERSEDBOUNDARYSIMULATIONMODIFIER_HPP_*/
gcov doesn't like this file...
#define EXPORT_TEMPLATE_CLASS_SAME_DIMS(CLASS)
std::unique_ptr< ImmersedBoundaryFftInterface< DIM > > mpFftInterface
void CalculateSourceGradients(const multi_array< double, 3 > &rRhs, multi_array< double, 3 > &rGradients)
void Upwind2d(const multi_array< double, 3 > &rInput, multi_array< double, 3 > &rOutput)
void SetupConstantMemberVariables(AbstractCellPopulation< DIM, DIM > &rCellPopulation)
void serialize(Archive &archive, const unsigned int version)
void AddImmersedBoundaryForce(boost::shared_ptr< AbstractImmersedBoundaryForce< DIM > > pForce)
std::vector< std::pair< Node< DIM > *, Node< DIM > * > > mNodePairs
virtual void UpdateAtEndOfTimeStep(AbstractCellPopulation< DIM, DIM > &rCellPopulation)
void OutputSimulationModifierParameters(out_stream &rParamsFile)
std::map< unsigned, std::set< unsigned > > mNodeNeighbours
std::vector< boost::shared_ptr< AbstractImmersedBoundaryForce< DIM > > > mForceCollection
std::unique_ptr< ObsoleteBoxCollection< DIM > > mpBoxCollection
std::unique_ptr< ImmersedBoundary2dArrays< DIM > > mpArrays
std::unique_ptr< UniformGridRandomFieldGenerator< DIM > > mpRandomField
ImmersedBoundaryCellPopulation< DIM > * mpCellPopulation
virtual ~ImmersedBoundarySimulationModifier()=default
virtual void SetupSolve(AbstractCellPopulation< DIM, DIM > &rCellPopulation, std::string outputDirectory)
void UpdateFluidVelocityGrids(AbstractCellPopulation< DIM, DIM > &rCellPopulation)
void ZeroFieldSums(multi_array< double, 3 > &rField)
Definition Node.hpp:59