FiberVISH 0.2
Fish - The Fiber Bundle API for the Vish Visualization Shell
RegularlyFragmentedField.hpp
1#ifndef __FIBER_REGULARLY_FRAGMENTED_FIELD_HPP
2#define __FIBER_REGULARLY_FRAGMENTED_FIELD_HPP
3
4#include <sstream>
5#include "Field.hpp"
6#include "DynamicSize.hpp"
7
8namespace Fiber
9{
10
25template <Dims_t DIMS=3>
27{
28
29 const MultiIndex<DIMS> myNumberOfFragments;
30
31#if 0
36 {
37 for(MultiIndex<DIMS> FragNumber : myNumberOfFragments)
38 {
40
41 Verbose(50) << " Creating fragment " << fragmentname
42 << " with linear index "
43 << int(FragNumber.linear( myNumberOfFragments ));
44
45 RefPtr<FragmentID>&NewFragmentID = this->makeFragmentID( fragmentname );
47
48 if ( int(FragNumber.linear( myNumberOfFragments ) ) !=
49 NewFragmentID->getNumericalID() )
50 {
51 Verbose(0) << " Multidimensional fragment index "
52 << FragNumber.linear( myNumberOfFragments )
53 << " does not match numerical fragment ID"
54 << NewFragmentID->getNumericalID();
55// MemCore::breakpoint();
56 }
57 }
58 }
59#endif
60
61public:
62
63 using Field::operator();
64 using Field::operator[];
65
72 , myNumberOfFragments( FragmentNumbers )
73 {
74 Assert( this->getFragmentIDCollection() );
75// Assert( this->getFragmentIDCollection()->getFragmentLayout().isValid() );
76 if (! this->getFragmentIDCollection()->getFragmentLayout().isValid() )
77 {
78 AppVerbose("FiberLib", 0) << "Newly constructed RegularlyFragmentedField("<<FragmentNumbers<<", " << FragmentNamePrefix << ") got no fragment layout!?";
79 }
80 }
81
82protected:
84 {}
85
86private:
87
91 RegularlyFragmentedField(const MultiIndex<DIMS>&FragmentNumbers,
92 const WeakPtr<Field>&SimilarField,
93 const string&FragmentNamePrefix)
94 : Field( SimilarField )
95 , myNumberOfFragments( FragmentNumbers )
96 {
97 if (!SimilarField)
98 {
99 if (!setFragmentLayout( FragmentNumbers, FragmentNamePrefix))
100 {
101 Assert(false && "cannot set fragment layout of virginal field!?");
102 }
103 }
104 }
105
107 RegularlyFragmentedField(const MultiIndex<DIMS>&FragmentNumbers,
108 const RefPtr<FragmentIDCollection>&theFragmentIDCollection,
109 const string&FragmentNamePrefix)
110 : Field(theFragmentIDCollection)
111 , myNumberOfFragments( FragmentNumbers )
112 {
113 if (!theFragmentIDCollection)
114 if (!setFragmentLayout( FragmentNumbers, FragmentNamePrefix))
115 {
116 Assert(false && "cannot set fragment layout of virginal field!?");
117 }
118 }
119
120public:
121
123 const MultiIndex<DIMS>&getNumberOfFragments() const
124 {
125 return myNumberOfFragments;
126 }
127
128
144static RefPtr<RegularlyFragmentedField>
147 const string&FragmentNamePrefix = "RegularFragment")
148 {
149 if (SimilarField)
150 {
151 if (SimilarField->nFragments()
152 != FragmentNumbers.size() )
153 {
154 return NullPtr();
155 }
156
157 const RefPtr<FragmentIDCollection>&FC = SimilarField->getFragmentIDCollection();
158 if (!FC)
159 return nullptr;
160
161 if (FragmentNumbers.size()
162 != FC->NumberOfFragmentIDs() )
163 return nullptr;
164 }
165
167 }
168
180 const string&FragmentNamePrefix = "RegularFragment")
181 {
183 return nullptr;
184
185 if (theFragmentIDCollection->NumberOfFragmentIDs()
186 != FragmentNumbers.size() )
187 {
188 return nullptr;
189 }
190
192 }
193
194
195
203 : Field(RFF.getFragmentIDCollection() )
204 , myNumberOfFragments( RFF.myNumberOfFragments )
205 {}
206
207
209 bool validate(const MultiIndex<DIMS>&I) const
210 {
211 index_t FragNumber = I.linear( myNumberOfFragments );
212 return Field::validate( int( FragNumber ) );
213 }
214
217 {
218 const RefPtr<FragmentIDCollection>&FC = getFragmentIDCollection();
219 if (!FC)
220 return NullPtr();
221
222 for (Dims_t i = 0; i < DIMS; i++)
223 if (I[i] >= myNumberOfFragments[i])
224 return NullPtr();
225
226
227 index_t FragNumber = I.linear( myNumberOfFragments );
228
229 return FC->findFragmentID( int(FragNumber) );
230 }
231
239 {
240 index_t FragNumber = I.linear( myNumberOfFragments );
241 return getCreatorReferenceViaFragmentIndex( FragNumber );
242
243/*
244 std::lock_guard lock(fragment_mutex);
245 return this->fragments[ FragNumber ];
246*/
247 }
248
254 {
255 index_t FragNumber = I.linear( myNumberOfFragments );
256 return getCreatorByNumericalID( FragNumber );
257
258// std::lock_guard lock(fragment_mutex);
259// return this->fragments ( int( FragNumber ) );
260 }
261
262#if 0
271 {
273 FragmentIDs = new MemArray<DIMS, RefPtr<FragmentID> >(myNumberOfFragments);
275 Fids = *FragmentIDs;
276
277 for(MultiIndex<DIMS> FragmentIndex : myNumberOfFragments)
278 {
279 Fids[ FragmentIndex ] = this->getFragmentID( FragmentIndex );
280 }
281
282 return FragmentIDs;
283 }
284
285
286 RefPtr<MemBase> newFragmentationArray() const override
287 {
288 return newRegularFragmentationArray();
289 }
290#endif
291
292 string xml() const
293 {
294 return "<REGULARLYFRAGMENTIONDIMENSIONS>" + std::to_string(int(DIMS)) +
295 "</REGULARLYFRAGMENTIONDIMENSIONS>\n"
296 +
297 Field::xml();
298 }
299};
300
301
302
303//extern template class RegularlyFragmentedField<3>;
304
305
306extern FIELD_API RefPtr<Field> newRegularlyFragmentedField(const DynamicSize&Sz);
307
308} // namespace Fiber
309
310#endif // _REGULARLY_FRAGMENTED_FIELD_HPP
An iterator with an optional DataCreator, which is just a class to intercept creation of data along a...
Definition CreativeIterator.hpp:34
A Field is a collection of CreativeArrayBase reference pointers which are accessed via FragmentID obj...
Definition Field.hpp:245
bool validate(FragmentIndex_t FragmentNumber) const
Check if a given fragment number is valid within this field.
Definition Field.cpp:419
Field()
Default constructor, no data or fragments.
Definition Field.cpp:122
RefPtr< FragmentID > & makeFragmentID(const string &fragmentname)
Create a new fragment ID if not existent yet.
Definition Field.cpp:386
RefPtr< MemBase > newFragmentationArray() const
For fields with a fragment layout provide such in a MultiArray.
Definition Field.cpp:1467
bool setFragmentLayout(const MultiIndex< DIMS > &NumberOfFragments, const string &FragmentNamePrefix)
Add a multi-dimensional regular layout for the fragments if it had no layout yet.
Definition Field.hpp:394
A convenience class for optimized handling of fields that are fragmented in a regular manner (n-dimen...
Definition RegularlyFragmentedField.hpp:27
RefPtr< FragmentID > getFragmentID(const MultiIndex< DIMS > &I) const
Get the associated FragmentID.
Definition RegularlyFragmentedField.hpp:216
static RefPtr< RegularlyFragmentedField > newField(const MultiIndex< DIMS > &FragmentNumbers, const WeakPtr< Field > &SimilarField, const string &FragmentNamePrefix="RegularFragment")
Create a new regularly fragmented Field from an existing Field that is sufficiently fragmented.
Definition RegularlyFragmentedField.hpp:145
RegularlyFragmentedField(const MultiIndex< DIMS > &FragmentNumbers, const string &FragmentNamePrefix="RegularFragment")
Create a field that consists out of a regular distribution of fragments.
Definition RegularlyFragmentedField.hpp:70
static RefPtr< RegularlyFragmentedField > newField(const MultiIndex< DIMS > &FragmentNumbers, const RefPtr< FragmentIDCollection > &theFragmentIDCollection, const string &FragmentNamePrefix="RegularFragment")
Create a regularly fragmented Field from a multidimensional size and an existing fragment ID collecti...
Definition RegularlyFragmentedField.hpp:178
RefPtr< CreativeArrayBase > & operator[](const MultiIndex< DIMS > &I)
Return a writable pointer with the data container for this multiindex.
Definition RegularlyFragmentedField.hpp:238
bool validate(const MultiIndex< DIMS > &I) const
Check if the given multidimensional index is valid.
Definition RegularlyFragmentedField.hpp:209
RefPtr< CreativeArrayBase > operator()(const MultiIndex< DIMS > &I) const
Search for a fragment, return NullPtr if no such fragment is contained in this field.
Definition RegularlyFragmentedField.hpp:253
RegularlyFragmentedField(const RegularlyFragmentedField &RFF)
Create a new regularly fragmented field from the same fragmentation as the given field.
Definition RegularlyFragmentedField.hpp:202
Given a fragmented field of curvilinear coordinates, (3D array of coordinates), build a uniform Grid ...
Definition FAQ.dox:2
std::nullptr_t NullPtr
string to_string(const Eagle::FixedArray< ElementType, N > &A, const char *OpenBrace="{", const char *CloseBrace="}", const char *Separator=",")