1#ifndef __FIBER_GRID_TYPES_REGULARLYFRAGMENTEDREGULARGRID_HPP
2#define __FIBER_GRID_TYPES_REGULARLYFRAGMENTEDREGULARGRID_HPP
5#include "GridWithCartesianVertices.hpp"
6#include "fish/fiber/field/UniformCartesianArray.hpp"
7#include "fish/fiber/field/RegularlyFragmentedField.hpp"
13extern gridtypes_API SkeletonID computeFragmentSkeletonID(
const DynamicSize&Fragmentation,
const SkeletonID&SID);
14extern gridtypes_API SkeletonID computeFragmentSkeletonID(
const Field&F,
const SkeletonID&SID);
16extern gridtypes_API
bool createRegularlyFragmentedSkeleton( Grid&,
const RefPtr<Skeleton>&,
const FragmentIDCollection&FIC);
17extern gridtypes_API
bool createRegularlyFragmentedSkeleton( Grid&,
const RefPtr<Skeleton>&,
const Field&FragmentedField);
18extern gridtypes_API
bool createRegularlyFragmentedSkeleton( Grid&,
const RefPtr<Skeleton>&);
19extern gridtypes_API
bool createRegularlyFragmentedSkeleton( Grid&,
const Skeleton&,
const FragmentIDCollection&FIC);
20extern gridtypes_API
bool createRegularlyFragmentedSkeleton( Grid&,
const Skeleton&);
43 if (!TypedGrid::assign(theGrid) )
return false;
46 FragmentVerticesSkeleton = G( FragmentVerticesSkeletonID() );
48 if (!FragmentVerticesSkeleton)
return false;
53static void create(
Grid&myGrid )
55 myGrid[ FragmentVerticesSkeletonID() ];
59 createFragmentSkeleton( Grid&myGrid,
const RefPtr<Skeleton>&Vertices,
60 const Field&VertexPositions,
61 Skeleton&FragmentSkeleton);
69template <
int VertexDims>
86 return FragmentSkeletonID();
112 return FragmentArray->Size();
125 return (*FragmentArray)[FragmentIndex];
137 bool assign(
const RefPtr<Grid>&theGrid)
139 FragmentSkeleton =
nullptr;
141 FragmentArray =
nullptr;
143 if (!RegularlyFragmentedGridBase::assign(theGrid) )
return false;
146 FragmentSkeleton = G( FragmentSkeletonID() );
147 if (!FragmentSkeleton)
return false;
149 RefPtr<Skeleton> Vertices = G.findVertices();
150 if (!Vertices)
return false;
157 FragmentArray = FragmentField->getData();
168static RegularlyFragmentedGrid
171 RegularlyFragmentedGridBase::create( myGrid );
180 return createFragmentSkeleton( myGrid, Vertices, VertexPositions,
FragmentSkeleton);
189 RegularlyFragmentedGridBase::create( myGrid );
193 return createFragmentSkeleton( myGrid, Vertices, VertexPositions,
FragmentSkeleton);
196static RegularlyFragmentedGrid
197 create( Grid&myGrid,
const RefPtr<RegularlyFragmentedField<VertexDims> >&VertexPositions)
199 RegularlyFragmentedGridBase::create( myGrid );
201 int IndexDepth=0;
int RefLevel=0;
202 Assert( IndexDepth == 0 );
203 RefPtr<Skeleton> Vertices = myGrid.findVertices();
205 return RegularlyFragmentedGrid(
nullptr );
208 Skeleton&FragmentSkeleton = myGrid[ FragmentSkeletonID(IndexDepth,RefLevel) ];
210 return createFragmentSkeleton( myGrid, Vertices, VertexPositions, FragmentSkeleton);
213static RegularlyFragmentedGrid
214 createFragmentSkeleton( Grid&myGrid,
const RefPtr<Skeleton>&Vertices,
215 const RefPtr<RegularlyFragmentedField<VertexDims> >&VertexPositions,
216 Skeleton&FragmentSkeleton)
218 Assert( VertexPositions );
219 Assert( VertexPositions->getFragmentIDCollection() );
220 Assert( VertexPositions->getFragmentIDCollection()->getFragmentLayout().isValid() );
221 if (!VertexPositions->getFragmentIDCollection()->getFragmentLayout().isValid() )
223 Verbose(0) <<
" NOTE: RegularlyFragmentedGrid::createFragmentSkeleton() got a regularly fragmented field without fragment layout.";
236 AppVerbose(
"FiberLib",10) <<
"Info: RegularlyFragmentedGrid creating found fragments as Vertices";
243 FragmentTopologyField = VertexPositions->newFragmentationArray();
246 Verbose(0) <<
"VertexPositions fragments are " << VertexPositions->getNumberOfFragments();
247 Verbose(0) <<
"FragmentTopologyField is of size " << FragmentTopologyField->Size();
249 if (!pFragmentSkeleton)
251 Verbose(0) <<
"FragmentSkeleton has no size yet, freshly created.";
257 AppVerbose(
"FiberLib",0) <<
"CANNOT set positions for RegularlyFragmentedGrid Fragments as Vertices - wrong size!? "
258 <<
" VertexPositions fragments are " << VertexPositions->getNumberOfFragments()
259 <<
" FragmentTopologyField is of size " << FragmentTopologyField->getSize();
260 return RegularlyFragmentedGrid(
nullptr);
271 return RegularlyFragmentedGrid( myGrid.self() );
275static RegularlyFragmentedGrid
276 createWithCartesianVertices( Grid&myGrid,
const MultiIndex<VertexDims>&
NumberOfFragments)
278 RefPtr<RegularlyFragmentedField<VertexDims> >
281 GridWithCartesianVertices::create( myGrid, VertexDims, Positions);
283 return create(myGrid, Positions);
291template <
int VertexDims>
324 return CAB->create();
329 RefPtr<CoordsArray_t> getCoords(
const MultiIndex<VertexDims>&I)
const
331 return getCoordData(I);
345 (*CartesianVertices)[ Fieldname ] =
Values;
359 Values = (*CartesianVertices)( Fieldname );
364 (*CartesianVertices)[ Fieldname ] =
Values;
377 return Positions->getNumberOfFragments();
388 RegularlyFragmentedGridWithCartesianVertices()
391 RegularlyFragmentedGridWithCartesianVertices(
const RefPtr<Grid>&theGrid)
396 bool assign(
const RefPtr<Grid>&theGrid)
402 if (!GridWithCartesianVertices::assign(theGrid) )
return false;
403 if (!RegularlyFragmentedGrid<VertexDims>::assign(theGrid) )
return false;
409 if (this->FragmentSkeleton)
427static RegularlyFragmentedGridWithCartesianVertices
442 <<
" fragments are already on the provided grid but incompatible as they are not regularly fragmented, cannot create regularly fragmented Grid.";
446 Verbose(50) <<
"HAVE Regular Positions with " <<
Positions->getNumberOfFragments() <<
" and want " <<
NumberOfFragments <<
" fragments.";
459 Verbose(10) <<
"Could not create Positions!?";
465 Verbose(0) <<
"Have cartesian vertices in " <<
Positions->nFragments()
466 <<
" fragments, add fragment topology for "
467 <<
Positions->getNumberOfFragments() <<
" to Grid";
476 Assert(RG.FragmentSkeleton.valid());
486 Assert(RG.FragmentVerticesSkeleton.valid());
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
A Grid is a set of Skeleton objects, each of them accessed via some unique SkeletonID object.
Definition Grid.hpp:60
RefPtr< Chart > findCartesianChart(const string &name={}) const
Find a cartesian chart here.
Definition Grid.cpp:119
RefPtr< Field > getCartesianPositions() const
Shortcut function: get the coordinates of the vertices in the default cartesian chart.
Definition Grid.hpp:246
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
Identifier for Skeletons within a Grid.
Definition SkeletonID.hpp:24
int IndexDepth() const
Index depth of this skeleton.
Definition SkeletonID.hpp:89
RefPtr< Skeleton > findVertices(int TotalRefinement=-1) const
Find the Skeleton describing the Vertices on this Grid.
Definition SkeletonMap.cpp:285
A Skeleton is a set of Representation object, each of them accessed by an Representer object.
Definition Skeleton.hpp:102
Given a fragmented field of curvilinear coordinates, (3D array of coordinates), build a uniform Grid ...
Definition FAQ.dox:2
StrongPtr< Object, ObjectBase > RefPtr
Fragment Skeleton: Each fragment of a field is assigned some value in the form of a field defined on ...
Definition FragmentSkeleton.hpp:20
Definition GridWithCartesianVertices.hpp:11
RefPtr< Representation > CartesianVertices
Collection of all fields given on vertices relative to cartesian coordinates.
Definition GridWithCartesianVertices.hpp:17
Definition grid/types/RegularlyFragmentedGrid.hpp:26
RefPtr< Skeleton > FragmentVerticesSkeleton
The Skeleton containing the vertices of fragments, i.e.
Definition grid/types/RegularlyFragmentedGrid.hpp:39
Definition grid/types/RegularlyFragmentedGrid.hpp:294
RefPtr< Representation > PerFragmentDataInCartesianCoordinates
Collection of fields that are defined per fragment in cartesian coordinates.
Definition grid/types/RegularlyFragmentedGrid.hpp:307
RefPtr< RegularlyFragmentedField< VertexDims > > newVertexField(const char *Fieldname)
Create a new regularly fragmented field on the vertices under the given name, overwriting an existing...
Definition grid/types/RegularlyFragmentedGrid.hpp:338
RefPtr< RegularlyFragmentedField< VertexDims > > Positions
Field for the vertex coordinates.
Definition grid/types/RegularlyFragmentedGrid.hpp:310
RefPtr< RegularlyFragmentedField< VertexDims > > getVertexField(const char *Fieldname)
Find a new regularly fragmented field on the vertices under the given name, creating a new one if not...
Definition grid/types/RegularlyFragmentedGrid.hpp:353
static RegularlyFragmentedGridWithCartesianVertices create(Grid &myGrid, const MultiIndex< VertexDims > &NumberOfFragments, bool NeedPerFragmentData=false)
Create a regularly fragmented grid with cartesian vertices.
Definition grid/types/RegularlyFragmentedGrid.hpp:428
RefPtr< Representation > FragmentVerticesInCartesianCoordinates
Collection of fields that are defined per fragment vertex in cartesian coordinates.
Definition grid/types/RegularlyFragmentedGrid.hpp:301
MultiIndex< VertexDims > NumberOfFragments() const
Get the number of fragments here as multi-dimensional index.
Definition grid/types/RegularlyFragmentedGrid.hpp:374
Definition grid/types/RegularlyFragmentedGrid.hpp:71
RefPtr< Representation > FragmentsAsVertices
Fields per fragment providing coordinate-independent information.
Definition grid/types/RegularlyFragmentedGrid.hpp:99
RefPtr< FragmentID > getFragmentID(const MultiIndex< VertexDims > &FragmentIndex) const
Get the fragment ID for the given fragment index.
Definition grid/types/RegularlyFragmentedGrid.hpp:122
static RegularlyFragmentedGrid create(Grid &myGrid, const RefPtr< RegularlyFragmentedField< VertexDims > > &VertexPositions, const SkeletonID &FragmentedSkeletonID)
Create a fragment skeleton on the given Grid.
Definition grid/types/RegularlyFragmentedGrid.hpp:169
MultiIndex< VertexDims > NumberOfFragments() const
Get the number of fragments here as multi-dimensional index.
Definition grid/types/RegularlyFragmentedGrid.hpp:109
Base class for grid types.
Definition TypedGrid.hpp:47