www.cemf.ir
insertionRegion.cpp
Go to the documentation of this file.
1 /*------------------------------- phasicFlow ---------------------------------
2  O C enter of
3  O O E ngineering and
4  O O M ultiscale modeling of
5  OOOOOOO F luid flow
6 ------------------------------------------------------------------------------
7  Copyright (C): www.cemf.ir
8  email: hamid.r.norouzi AT gmail.com
9 ------------------------------------------------------------------------------
10 Licence:
11  This file is part of phasicFlow code. It is a free software for simulating
12  granular and multiphase flows. You can redistribute it and/or modify it under
13  the terms of GNU General Public License v3 or any other later versions.
14 
15  phasicFlow is distributed to help others in their research in the field of
16  granular and multiphase flows, but WITHOUT ANY WARRANTY; without even the
17  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 
19 -----------------------------------------------------------------------------*/
20 
21 #include "insertionRegion.hpp"
22 #include "dictionary.hpp"
23 #include "insertion.hpp"
24 #include "particles.hpp"
25 #include "twoPartEntry.hpp"
26 #include "types.hpp"
27 
28 namespace pFlow
29 {
30 template<typename T>
31 bool
32 setOneEntry(const twoPartEntry& tpEntry, anyList& varList)
33 {
34  if (getTypeName<T>() != tpEntry.firstPart())
35  return false;
36 
37  T val = tpEntry.secondPartVal<T>();
38  varList.emplaceBack(tpEntry.keyword(), val);
39 
40  return true;
41 }
42 
43 bool
44 readOneEtrty(const dataEntry& entry, anyList& varList)
45 {
46  twoPartEntry stField(entry);
47 
48  if (!(setOneEntry<real>(stField, varList) ||
49  setOneEntry<realx3>(stField, varList) ||
50  setOneEntry<realx4>(stField, varList) ||
51  setOneEntry<int8>(stField, varList) ||
52  setOneEntry<uint8>(stField, varList) ||
53  setOneEntry<uint32>(stField, varList) ||
54  setOneEntry<uint64>(stField, varList) ||
55  setOneEntry<int32>(stField, varList) ||
56  setOneEntry<int64>(stField, varList)))
57  {
58  fatalErrorInFunction << "un-supported data type " << stField.firstPart()
59  << endl;
60  return false;
61  }
62  return true;
63 }
64 }
65 
66 bool
68 {
69  type_ = dict.getVal<word>("regionType");
70 
71  rate_ = dict.getVal<real>("rate");
72 
73  pRegion_ = peakableRegion::create(type_, dict.subDict(type_ + "Info"));
74 
75  mixture_ = makeUnique<shapeMixture>(
76  dict.subDict("mixture"),
78  );
79 
80  numInserted_ = mixture_().totalInserted();
81 
82  if (dict.containsDictionay("setFields"))
83  {
85  makeUnique<dictionary>("setFields", dict, dict.subDict("setFields"));
86  }
87 
88  if (setFieldDict_)
89  {
90  if (!readSetFieldDict())
91  {
92  fatalErrorInFunction << "Error in reading dictionary "
93  << setFieldDict_().globalName() << endl;
94  return false;
95  }
96  }
97 
98  return true;
99 }
100 
101 bool
103 {
104 
105  if(!dict.add("rate", rate_))
106  return false;
107 
108  if(!tControl_.write(dict))
109  return false;
110 
111  if (!dict.add("regionType", type_))
112  return false;
113  if (pRegion_)
114  {
115  auto& prDict = dict.subDictOrCreate(type_ + "Info");
116  if (!pRegion_().write(prDict))
117  return false;
118  }
119 
120  if (mixture_)
121  {
122  auto& mixDict = dict.subDictOrCreate("mixture");
123  if (!mixture_().write(mixDict))
124  return false;
125  }
126 
127  if(setFieldDict_)
128  {
129  if(!dict.addDict("setFields", setFieldDict_()))
130  return false;
131  }
132 
133  return true;
134 }
135 
136 bool
138 {
139  wordList Keys = setFieldDict_().dataEntryKeywords();
140 
141  for (const auto& key : Keys)
142  {
143  if (!readOneEtrty(setFieldDict_().dataEntryRef(key), setFieldList_))
144  {
145  return false;
146  }
147  }
148 
149  return true;
150 }
151 
153  const word& name,
154  const insertion& instn
155 )
156  : name_(name),
157  dict_(instn.subDict(name)),
158  insertion_(instn),
159  tControl_(dict_, "insertion")
160 {
162  {
163  fatalExit;
164  }
165 }
166 
169 {
170  return Insertion().pStruct();
171 }
172 
175 {
176  if (!tControl_.isInRange(iter, t, dt))
177  return 0u;
178 
179  if (tControl_.isTimeStep())
180  {
181  return static_cast<uint32>(
182  (iter - tControl_.startIter() + tControl_.iInterval()) * dt * rate_ -
183  numInserted_
184  );
185  }
186  else
187  {
188  return static_cast<uint32>(
189  (t - tControl_.startTime() + tControl_.rInterval()) * rate_ -
190  numInserted_
191  );
192  }
193 }
twoPartEntry.hpp
pFlow::insertionRegion::numInserted_
uint32 numInserted_
number of inserted particles
Definition: insertionRegion.hpp:106
pFlow::List< word >
pFlow::insertion::pStruct
const pointStructure & pStruct() const
Definition: insertion.cpp:72
pFlow::insertionRegion::type_
word type_
type of insertion region
Definition: insertionRegion.hpp:109
pFlow::real
float real
Definition: builtinTypes.hpp:45
fatalExit
#define fatalExit
Fatal exit.
Definition: error.hpp:98
pFlow::insertionRegion::numberToBeInserted
uint32 numberToBeInserted(uint32 iter, real t, real dt)
Definition: insertionRegion.cpp:174
types.hpp
insertion.hpp
pFlow::insertionRegion::insertionRegion
insertionRegion(const word &name, const insertion &instn)
Construct from a dictionary.
Definition: insertionRegion.cpp:152
pFlow::insertionRegion::pStruct
const pointStructure & pStruct() const
Definition: insertionRegion.cpp:168
pFlow::uint32
unsigned int uint32
Definition: builtinTypes.hpp:56
pFlow::twoPartEntry
Definition: twoPartEntry.hpp:36
pFlow::word
std::string word
Definition: builtinTypes.hpp:64
pFlow::baseShapeNames::shapeNameList
wordList shapeNameList() const
Definition: baseShapeNames.hpp:79
particles.hpp
pFlow::dictionary::subDictOrCreate
dictionary & subDictOrCreate(const word &keyword)
search for a sub-dict with keyword create a new sub-dict if not found and return a ref to it fatalExi...
Definition: dictionary.cpp:647
pFlow::dictionary::add
bool add(const word &keyword, const float &v)
add a float dataEntry
Definition: dictionary.cpp:435
pFlow::insertion::Particles
particles & Particles()
Definition: insertion.hpp:90
pFlow::endl
iOstream & endl(iOstream &os)
Add newline and flush stream.
Definition: iOstream.hpp:341
pFlow::insertionRegion::mixture_
uniquePtr< shapeMixture > mixture_
mixture of shapes
Definition: insertionRegion.hpp:115
pFlow
Definition: demGeometry.hpp:27
pFlow::insertionRegion::setFieldDict_
uniquePtr< dictionary > setFieldDict_
dictionary for set field
Definition: insertionRegion.hpp:118
pFlow::pointStructure
Definition: pointStructure.hpp:34
pFlow::anyList
Definition: anyList.hpp:35
pFlow::dataEntry
Data entry to be used in dictionries.
Definition: dataEntry.hpp:48
fatalErrorInFunction
#define fatalErrorInFunction
Report a fatal error and function name and exit the application.
Definition: error.hpp:77
pFlow::insertionRegion::insertion_
const insertion & insertion_
ref to insertion
Definition: insertionRegion.hpp:97
dictionary.hpp
pFlow::particles::getShapes
virtual const shape & getShapes() const =0
insertionRegion.hpp
pFlow::insertionRegion::dict_
const dictionary & dict_
insertion region dictionary
Definition: insertionRegion.hpp:94
pFlow::peakableRegion::create
static uniquePtr< peakableRegion > create(const word &type, const dictionary &dict)
Definition: peakableRegion.cpp:36
pFlow::twoPartEntry::keyword
const word & keyword() const
Definition: twoPartEntry.hpp:46
pFlow::insertionRegion::writeInsertionRegion
bool writeInsertionRegion(dictionary &dict) const
write to dictionary
Definition: insertionRegion.cpp:102
pFlow::insertionRegion::dict
const auto & dict() const
Definition: insertionRegion.hpp:162
pFlow::readOneEtrty
bool readOneEtrty(const dataEntry &entry, anyList &varList)
Definition: insertionRegion.cpp:44
pFlow::insertionRegion::pRegion_
uniquePtr< peakableRegion > pRegion_
peakable region of points
Definition: insertionRegion.hpp:112
pFlow::twoPartEntry::firstPart
const word & firstPart() const
Definition: twoPartEntry.hpp:51
pFlow::dictionary::addDict
bool addDict(const word &keyword, const dictionary &dict)
add a dictionary with the specifiedd keyword, if it exists, replace it.
Definition: dictionary.cpp:526
pFlow::insertionRegion::readSetFieldDict
bool readSetFieldDict()
Definition: insertionRegion.cpp:137
pFlow::Insertion
This class manages all the insertion regions for particles insertion in the simulation.
Definition: Insertion.hpp:56
pFlow::insertionRegion::rate_
real rate_
rate of insertion
Definition: insertionRegion.hpp:103
pFlow::insertionRegion::readInsertionRegion
bool readInsertionRegion(const dictionary &dict)
read from dictionary
Definition: insertionRegion.cpp:67
pFlow::anyList::emplaceBack
reference emplaceBack(const word &name, Args &&... args)
Create variable using constructor in-place.
Definition: anyList.hpp:84
pFlow::dictionary
Dictionary holds a set of data entries or sub-dictionaries that are enclosed in a curely braces or ar...
Definition: dictionary.hpp:67
pFlow::setOneEntry
bool setOneEntry(const twoPartEntry &tpEntry, anyList &varList)
Definition: insertionRegion.cpp:32
pFlow::twoPartEntry::secondPartVal
T secondPartVal() const
Definition: twoPartEntry.hpp:62
pFlow::insertion
Base class for particle insertion.
Definition: insertion.hpp:35