Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
D
dune-vtk
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
iwr
dune-vtk
Commits
fcaec46c
Commit
fcaec46c
authored
6 years ago
by
Praetorius, Simon
Browse files
Options
Downloads
Patches
Plain Diff
cleanup of datacollectors
parent
f781632f
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
dune/vtk/datacollector.hh
+151
-119
151 additions, 119 deletions
dune/vtk/datacollector.hh
src/vtkreader.cc
+10
-10
10 additions, 10 deletions
src/vtkreader.cc
with
161 additions
and
129 deletions
dune/vtk/datacollector.hh
+
151
−
119
View file @
fcaec46c
...
...
@@ -15,20 +15,32 @@ struct Cells
std
::
vector
<
std
::
int64_t
>
connectivity
;
};
template
<
class
GridView
,
class
Derived
>
class
DataCollectorInterface
{
private:
DataCollectorInterface
()
=
default
;
public:
DataCollectorInterface
(
GridView
const
&
gridView
)
:
gridView_
(
gridView
)
{}
/// \brief Return the number of points in the grid
std
::
uint64_t
numPoints
()
const
;
std
::
uint64_t
numPoints
()
const
{
return
asDerived
().
numPointsImpl
();
}
/// \brief Return the number of cells in the grid
std
::
uint64_t
numCells
()
const
;
std
::
uint64_t
numCells
()
const
{
return
asDerived
().
numCellsImpl
();
}
/// Update the DataCollector on the current GridView
void
update
();
void
update
()
{
asDerived
().
updateImpl
();
}
/// \brief Return a flat vector of point coordinates
/**
...
...
@@ -38,10 +50,16 @@ public:
* set to 0
**/
template
<
class
T
>
std
::
vector
<
T
>
points
()
const
;
std
::
vector
<
T
>
points
()
const
{
return
asDerived
().
template
pointsImpl
<
T
>();
}
/// \brief Return cell types, offsets, and connectivity. \see Cells
Cells
cells
()
const
;
Cells
cells
()
const
{
return
asDerived
().
cellsImpl
();
}
/// \brief Return a flat vector of function values evaluated at the grid points.
/**
...
...
@@ -53,41 +71,93 @@ public:
* where the tensor dimension must be 3x3 (possible extended by 0s)
**/
template
<
class
T
,
class
GlobalFunction
>
std
::
vector
<
T
>
pointData
(
GlobalFunction
const
&
fct
)
const
;
std
::
vector
<
T
>
pointData
(
GlobalFunction
const
&
fct
)
const
{
return
asDerived
().
template
pointDataImpl
<
T
>(
fct
);
}
/// \brief Return a flat vector of function values evaluated at the grid cells. \see pointData.
template
<
class
T
,
class
GlobalFunction
>
std
::
vector
<
T
>
cellData
(
GlobalFunction
const
&
fct
)
const
;
std
::
vector
<
T
>
cellData
(
GlobalFunction
const
&
fct
)
const
{
return
asDerived
().
template
cellDataImpl
<
T
>(
fct
);
}
protected
:
// cast to derived type
Derived
&
asDerived
()
{
return
static_cast
<
Derived
&>
(
*
this
);
}
const
Derived
&
asDerived
()
const
{
return
static_cast
<
const
Derived
&>
(
*
this
);
}
protected
:
// default implementations
std
::
uint64_t
numCellsImpl
()
const
{
return
gridView_
.
size
(
0
);
}
void
updateImpl
()
{
/* do nothing */
}
// Evaluate `fct` in center of cell
template
<
class
T
,
class
GlobalFunction
>
std
::
vector
<
T
>
cellDataImpl
(
GlobalFunction
const
&
fct
)
const
{
std
::
vector
<
T
>
data
(
numCells
()
*
fct
.
ncomps
());
auto
const
&
indexSet
=
gridView_
.
indexSet
();
auto
localFct
=
localFunction
(
fct
);
for
(
auto
const
&
e
:
elements
(
gridView_
))
{
localFct
.
bind
(
e
);
auto
geometry
=
e
.
geometry
();
std
::
size_t
idx
=
fct
.
ncomps
()
*
indexSet
.
index
(
e
);
for
(
int
comp
=
0
;
comp
<
fct
.
ncomps
();
++
comp
)
data
[
idx
+
comp
]
=
T
(
localFct
.
evaluate
(
comp
,
geometry
.
center
()));
localFct
.
unbind
();
}
return
data
;
}
protected
:
GridView
gridView_
;
};
/// Implementation of \ref DataCollector for linear cells, with continuous data.
template
<
class
GridView
>
class
DefaultDataCollector
:
public
DataCollectorInterface
<
GridView
,
DefaultDataCollector
<
GridView
>>
{
enum
{
dim
=
GridView
::
dimension
};
using
Self
=
DefaultDataCollector
;
using
Super
=
DataCollectorInterface
<
GridView
,
Self
>
;
using
Super
::
gridView_
;
public
:
DefaultDataCollector
(
GridView
const
&
gridView
)
:
gridView_
(
gridView
)
:
Super
(
gridView
)
{}
void
update
()
{}
std
::
uint64_t
numPoints
()
const
/// Return number of grid vertices
std
::
uint64_t
numPointsImpl
()
const
{
return
gridView_
.
size
(
dim
);
}
std
::
uint64_t
numCells
()
const
{
return
gridView_
.
size
(
0
);
}
/// Return the coordinates of all grid vertices in the order given by the indexSet
template
<
class
T
>
std
::
vector
<
T
>
points
()
const
std
::
vector
<
T
>
points
Impl
()
const
{
std
::
vector
<
T
>
data
(
numPoints
()
*
3
);
std
::
vector
<
T
>
data
(
this
->
numPoints
()
*
3
);
auto
const
&
indexSet
=
gridView_
.
indexSet
();
for
(
auto
const
&
vertex
:
vertices
(
gridView_
))
{
std
::
size_t
idx
=
3
*
indexSet
.
index
(
vertex
);
...
...
@@ -100,7 +170,9 @@ public:
return
data
;
}
Cells
cells
()
const
/// Return the types, offsets and connectivity of the cells, using the same connectivity as
/// given by the grid.
Cells
cellsImpl
()
const
{
auto
const
&
indexSet
=
gridView_
.
indexSet
();
auto
types
=
indexSet
.
types
(
0
);
...
...
@@ -110,9 +182,9 @@ public:
});
Cells
cells
;
cells
.
connectivity
.
reserve
(
numCells
()
*
maxVertices
);
cells
.
offsets
.
reserve
(
numCells
());
cells
.
types
.
reserve
(
numCells
());
cells
.
connectivity
.
reserve
(
this
->
numCells
()
*
maxVertices
);
cells
.
offsets
.
reserve
(
this
->
numCells
());
cells
.
types
.
reserve
(
this
->
numCells
());
std
::
int64_t
old_o
=
0
;
for
(
auto
const
&
c
:
elements
(
gridView_
))
{
...
...
@@ -126,10 +198,11 @@ public:
return
cells
;
}
/// Evaluate the `fct` at the corners of the elements
template
<
class
T
,
class
GlobalFunction
>
std
::
vector
<
T
>
pointData
(
GlobalFunction
const
&
fct
)
const
std
::
vector
<
T
>
pointData
Impl
(
GlobalFunction
const
&
fct
)
const
{
std
::
vector
<
T
>
data
(
numPoints
()
*
fct
.
ncomps
());
std
::
vector
<
T
>
data
(
this
->
numPoints
()
*
fct
.
ncomps
());
auto
const
&
indexSet
=
gridView_
.
indexSet
();
auto
localFct
=
localFunction
(
fct
);
for
(
auto
const
&
e
:
elements
(
gridView_
))
{
...
...
@@ -145,41 +218,29 @@ public:
}
return
data
;
}
template
<
class
T
,
class
GlobalFunction
>
std
::
vector
<
T
>
cellData
(
GlobalFunction
const
&
fct
)
const
{
std
::
vector
<
T
>
data
(
numCells
()
*
fct
.
ncomps
());
auto
const
&
indexSet
=
gridView_
.
indexSet
();
auto
localFct
=
localFunction
(
fct
);
for
(
auto
const
&
e
:
elements
(
gridView_
))
{
localFct
.
bind
(
e
);
auto
refElem
=
referenceElement
(
e
.
geometry
());
std
::
size_t
idx
=
fct
.
ncomps
()
*
indexSet
.
index
(
e
);
for
(
int
comp
=
0
;
comp
<
fct
.
ncomps
();
++
comp
)
data
[
idx
+
comp
]
=
T
(
localFct
.
evaluate
(
comp
,
refElem
.
position
(
0
,
0
)));
localFct
.
unbind
();
}
return
data
;
}
private
:
GridView
gridView_
;
};
/// Implementation of \ref DataCollector for linear cells, with discontinuous data.
template
<
class
GridView
>
class
DiscontinuousDataCollector
:
public
DataCollectorInterface
<
GridView
,
DiscontinuousDataCollector
<
GridView
>>
{
enum
{
dim
=
GridView
::
dimension
};
using
Self
=
DiscontinuousDataCollector
;
using
Super
=
DataCollectorInterface
<
GridView
,
Self
>
;
using
Super
::
gridView_
;
public
:
DiscontinuousDataCollector
(
GridView
const
&
gridView
)
:
gridView_
(
gridView
)
{}
:
Super
(
gridView
)
{
this
->
update
();
}
void
update
()
/// Create an index map the uniquely assignes an index to each pair (element,corner)
void
updateImpl
()
{
numPoints_
=
0
;
indexMap_
.
resize
(
gridView_
.
size
(
dim
));
...
...
@@ -192,20 +253,17 @@ public:
}
}
std
::
uint64_t
numPoints
()
const
/// The number of pointsi approx. #cell * #corners-per-cell
std
::
uint64_t
numPointsImpl
()
const
{
return
numPoints_
;
}
std
::
uint64_t
numCells
()
const
{
return
gridView_
.
size
(
0
);
}
/// Return the coordinates of the corners of all cells
template
<
class
T
>
std
::
vector
<
T
>
points
()
const
std
::
vector
<
T
>
points
Impl
()
const
{
std
::
vector
<
T
>
data
(
numPoints
()
*
3
);
std
::
vector
<
T
>
data
(
this
->
numPoints
()
*
3
);
auto
const
&
indexSet
=
gridView_
.
indexSet
();
for
(
auto
const
&
element
:
elements
(
gridView_
))
{
for
(
int
i
=
0
;
i
<
element
.
subEntities
(
dim
);
++
i
)
{
...
...
@@ -220,12 +278,13 @@ public:
return
data
;
}
Cells
cells
()
const
/// Connect the corners of each cell. The leads to a global discontinuous grid
Cells
cellsImpl
()
const
{
Cells
cells
;
cells
.
connectivity
.
reserve
(
numPoints
());
cells
.
offsets
.
reserve
(
numCells
());
cells
.
types
.
reserve
(
numCells
());
cells
.
connectivity
.
reserve
(
this
->
numPoints
());
cells
.
offsets
.
reserve
(
this
->
numCells
());
cells
.
types
.
reserve
(
this
->
numCells
());
std
::
int64_t
old_o
=
0
;
auto
const
&
indexSet
=
gridView_
.
indexSet
();
...
...
@@ -242,10 +301,11 @@ public:
return
cells
;
}
/// Evaluate the `fct` in the corners of each cell
template
<
class
T
,
class
GlobalFunction
>
std
::
vector
<
T
>
pointData
(
GlobalFunction
const
&
fct
)
const
std
::
vector
<
T
>
pointData
Impl
(
GlobalFunction
const
&
fct
)
const
{
std
::
vector
<
T
>
data
(
numPoints
()
*
fct
.
ncomps
());
std
::
vector
<
T
>
data
(
this
->
numPoints
()
*
fct
.
ncomps
());
auto
const
&
indexSet
=
gridView_
.
indexSet
();
auto
localFct
=
localFunction
(
fct
);
for
(
auto
const
&
e
:
elements
(
gridView_
))
{
...
...
@@ -262,25 +322,7 @@ public:
return
data
;
}
template
<
class
T
,
class
GlobalFunction
>
std
::
vector
<
T
>
cellData
(
GlobalFunction
const
&
fct
)
const
{
std
::
vector
<
T
>
data
(
numCells
()
*
fct
.
ncomps
());
auto
const
&
indexSet
=
gridView_
.
indexSet
();
auto
localFct
=
localFunction
(
fct
);
for
(
auto
const
&
e
:
elements
(
gridView_
))
{
localFct
.
bind
(
e
);
auto
refElem
=
referenceElement
(
e
.
geometry
());
std
::
size_t
idx
=
fct
.
ncomps
()
*
indexSet
.
index
(
e
);
for
(
int
comp
=
0
;
comp
<
fct
.
ncomps
();
++
comp
)
data
[
idx
+
comp
]
=
T
(
localFct
.
evaluate
(
comp
,
refElem
.
position
(
0
,
0
)));
localFct
.
unbind
();
}
return
data
;
}
private
:
GridView
gridView_
;
std
::
uint64_t
numPoints_
=
0
;
std
::
vector
<
std
::
int64_t
>
indexMap_
;
};
...
...
@@ -289,30 +331,34 @@ private:
/// Implementation of \ref DataCollector for quadratic cells, with continuous data.
template
<
class
GridView
>
class
QuadraticDataCollector
:
public
DataCollectorInterface
<
GridView
,
QuadraticDataCollector
<
GridView
>>
{
enum
{
dim
=
GridView
::
dimension
};
using
Self
=
QuadraticDataCollector
;
using
Super
=
DataCollectorInterface
<
GridView
,
Self
>
;
using
Super
::
gridView_
;
public
:
QuadraticDataCollector
(
GridView
const
&
gridView
)
:
gridView_
(
gridView
)
:
Super
(
gridView
)
{}
void
update
()
{}
std
::
uint64_t
numPoints
()
const
/// Return number of vertices + number of edge
std
::
uint64_t
numPointsImpl
()
const
{
return
gridView_
.
size
(
dim
)
+
gridView_
.
size
(
dim
-
1
);
}
std
::
uint64_t
numCells
()
const
{
return
gridView_
.
size
(
0
);
}
/// Return a vector of point coordinates.
/**
* The vector of point coordinates is composed of vertex coordinates first and second
* edge center coordinates.
**/
template
<
class
T
>
std
::
vector
<
T
>
points
()
const
std
::
vector
<
T
>
points
Impl
()
const
{
std
::
vector
<
T
>
data
(
numPoints
()
*
3
);
std
::
vector
<
T
>
data
(
this
->
numPoints
()
*
3
);
auto
const
&
indexSet
=
gridView_
.
indexSet
();
for
(
auto
const
&
element
:
elements
(
gridView_
))
{
auto
geometry
=
element
.
geometry
();
...
...
@@ -340,12 +386,17 @@ public:
return
data
;
}
Cells
cells
()
const
/// \brief Return cell types, offsets, and connectivity. \see Cells
/**
* The cell connectivity is composed of cell vertices first and second cell edges,
* where the indices are grouped [vertex-indices..., (#vertices)+edge-indices...]
**/
Cells
cellsImpl
()
const
{
Cells
cells
;
cells
.
connectivity
.
reserve
(
numPoints
());
cells
.
offsets
.
reserve
(
numCells
());
cells
.
types
.
reserve
(
numCells
());
cells
.
connectivity
.
reserve
(
this
->
numPoints
());
cells
.
offsets
.
reserve
(
this
->
numCells
());
cells
.
types
.
reserve
(
this
->
numCells
());
std
::
int64_t
old_o
=
0
;
auto
const
&
indexSet
=
gridView_
.
indexSet
();
...
...
@@ -368,10 +419,11 @@ public:
return
cells
;
}
/// Evaluate the `fct` at element vertices and edge centers in the same order as the point coords.
template
<
class
T
,
class
GlobalFunction
>
std
::
vector
<
T
>
pointData
(
GlobalFunction
const
&
fct
)
const
std
::
vector
<
T
>
pointData
Impl
(
GlobalFunction
const
&
fct
)
const
{
std
::
vector
<
T
>
data
(
numPoints
()
*
fct
.
ncomps
());
std
::
vector
<
T
>
data
(
this
->
numPoints
()
*
fct
.
ncomps
());
auto
const
&
indexSet
=
gridView_
.
indexSet
();
auto
localFct
=
localFunction
(
fct
);
for
(
auto
const
&
e
:
elements
(
gridView_
))
{
...
...
@@ -394,26 +446,6 @@ public:
}
return
data
;
}
template
<
class
T
,
class
GlobalFunction
>
std
::
vector
<
T
>
cellData
(
GlobalFunction
const
&
fct
)
const
{
std
::
vector
<
T
>
data
(
numCells
()
*
fct
.
ncomps
());
auto
const
&
indexSet
=
gridView_
.
indexSet
();
auto
localFct
=
localFunction
(
fct
);
for
(
auto
const
&
e
:
elements
(
gridView_
))
{
localFct
.
bind
(
e
);
auto
refElem
=
referenceElement
(
e
.
geometry
());
std
::
size_t
idx
=
fct
.
ncomps
()
*
indexSet
.
index
(
e
);
for
(
int
comp
=
0
;
comp
<
fct
.
ncomps
();
++
comp
)
data
[
idx
+
comp
]
=
T
(
localFct
.
evaluate
(
comp
,
refElem
.
position
(
0
,
0
)));
localFct
.
unbind
();
}
return
data
;
}
private
:
GridView
gridView_
;
};
}}
// end namespace Dune::experimental
This diff is collapsed.
Click to expand it.
src/vtkreader.cc
+
10
−
10
View file @
fcaec46c
...
...
@@ -76,7 +76,7 @@ int main(int argc, char** argv)
vtkWriter
.
write
(
"test_ascii_float32_4.vtu"
,
Vtk
::
ASCII
);
}
{
if
(
filesystem
::
exists
(
"paraview_3d.vtu"
))
{
using
GridType3d
=
UGGrid
<
3
>
;
using
GridView3d
=
typename
GridType3d
::
LeafGridView
;
auto
gridPtr
=
VtkReader
<
GridType3d
>::
read
(
"paraview_3d.vtu"
);
...
...
@@ -86,14 +86,14 @@ int main(int argc, char** argv)
vtkWriter
.
write
(
"paraview_3d_ascii.vtu"
,
Vtk
::
ASCII
,
Vtk
::
FLOAT64
);
}
//
{
//
std::cout << "paraview_2d_ascii...\n";
//
using GridType2d = UGGrid<2>;
//
using GridView2d = typename GridType2d::LeafGridView;
//
auto gridPtr = VtkReader<GridType2d>::read("paraview_2d.vtu");
//
auto& grid = *gridPtr;
if
(
filesystem
::
exists
(
"paraview_2d.vtu"
))
{
std
::
cout
<<
"paraview_2d_ascii...
\n
"
;
using
GridType2d
=
UGGrid
<
2
>
;
using
GridView2d
=
typename
GridType2d
::
LeafGridView
;
auto
gridPtr
=
VtkReader
<
GridType2d
>::
read
(
"paraview_2d.vtu"
);
auto
&
grid
=
*
gridPtr
;
//
VtkWriter<GridView2d> vtkWriter(grid.leafGridView());
//
vtkWriter.write("paraview_2d_ascii.vtu", Vtk::ASCII, Vtk::FLOAT64);
//
}
VtkWriter
<
GridView2d
>
vtkWriter
(
grid
.
leafGridView
());
vtkWriter
.
write
(
"paraview_2d_ascii.vtu"
,
Vtk
::
ASCII
,
Vtk
::
FLOAT64
);
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment