Liebe Gitlab-Nutzer, lieber Gitlab-Nutzer, es ist nun möglich sich mittels des ZIH-Logins/LDAP an unserem Dienst anzumelden. Ein Anmelden über dieses erzeugt ein neues Konto. Das alte Konto ist über den Reiter "Standard" erreichbar. Die Administratoren

Dear Gitlab user, it is now possible to log in to our service using the ZIH login/LDAP. Logging in via this will create a new account. The old account can be accessed via the "Standard" tab. The administrators

Commit 8554254d authored by Praetorius, Simon's avatar Praetorius, Simon
Browse files

added gitlabci tests

parent fa055d7e
Pipeline #1463 canceled with stage
in 0 seconds
---
before_script:
- . /duneci/bin/duneci-init-job
- duneci-install-module https://gitlab.dune-project.org/core/dune-common.git
- duneci-install-module https://gitlab.dune-project.org/core/dune-geometry.git
- duneci-install-module https://gitlab.dune-project.org/core/dune-grid.git
debian:10 gcc-8-noassert-17:
image: registry.dune-project.org/docker/ci/debian:10
script: duneci-standard-test
variables:
DUNECI_TOOLCHAIN: gcc-8-noassert-17
tags: [duneci]
debian:10 clang-6-libcpp-17:
image: registry.dune-project.org/docker/ci/debian:10
script: duneci-standard-test
variables:
DUNECI_TOOLCHAIN: clang-6-libcpp-17
tags: [duneci]
debian:9 gcc-6-14:
image: registry.dune-project.org/docker/ci/debian:9
script: duneci-standard-test
variables:
DUNECI_TOOLCHAIN: gcc-6-14
tags: [duneci]
debian:9 clang-3.8-14:
image: registry.dune-project.org/docker/ci/debian:9
script: duneci-standard-test
variables:
DUNECI_TOOLCHAIN: clang-3.8-14
tags: [duneci]
ubuntu:16.04 gcc-5-14:
image: registry.dune-project.org/docker/ci/ubuntu:16.04
script: duneci-standard-test
variables:
DUNECI_TOOLCHAIN: gcc-5-14
tags: [duneci]
ubuntu:18.04 clang-6-17:
image: registry.dune-project.org/docker/ci/ubuntu:18.04
script: duneci-standard-test
variables:
DUNECI_TOOLCHAIN: clang-6-17
tags: [duneci]
......@@ -7,5 +7,5 @@ Module: dune-multimesh
Version: 0.1
Maintainer: simon.praetorius@tu-dresden.de
#depending on
Depends: dune-common dune-grid
Suggests: dune-uggrid dune-alugrid dune-foamgrid dune-functions dune-geometry dune-istl
Depends: dune-grid
Suggests: dune-alugrid dune-foamgrid dune-functions dune-istl dune-spgrid dune-uggrid
......@@ -19,20 +19,21 @@ namespace Dune
private:
using ctype = typename HostGrid::ctype;
/// Entity in the host grid
using HostGridEntity = typename HostGrid::Traits::template Codim<0>::Entity;
public:
enum { dimension = HostGrid::dimension };
enum { codimension = 0 };
enum { dimension = HostGridEntity::dimension };
enum { mydimension = HostGridEntity::mydimension };
/// The type of a local geometry
using LocalGeometry = MultiMeshLocalGeometry<dimension, dimension, HostGrid>;
using EntitySeed = MultiMeshEntitySeed<0, HostGrid>;
/// Entity in the host grid
using HostGridEntity = typename HostGrid::Traits::template Codim<0>::Entity;
/// Containertype
using Super = std::vector<HostGridEntity>;
/// Seed representing the vector of entities in the MultiMesh
using EntitySeed = MultiEntitySeed<0, HostGrid>;
public:
/// Constructor from std::vector
using std::vector<HostGridEntity>::vector;
......@@ -62,6 +63,13 @@ namespace Dune
return localGeometry(source, target).global(sourceLocal);
}
/// Return the partitionType of any entity in the multiEntity
// [[ expects: all partitionType are the same ]]
PartitionType partitionType () const
{
return max().partitionType();
}
/// Return the geometry of the entity with maximal level
typename HostGridEntity::Geometry geometry () const
{
......@@ -95,9 +103,15 @@ namespace Dune
* The MultiMeshEntitySeed contains the HostGridEntitySeed and the index of
* the grid it is extracted from.
**/
EntitySeed seed (std::size_t entity_i) const
MultiMeshEntitySeed<0,HostGrid> seed (std::size_t idx) const
{
return {(*this)[idx], idx};
}
/// Return an entity seed to restore the multi-entity.
EntitySeed seed () const
{
return {(*this)[entity_i], entity_i};
return {*this};
}
/// Return the entity with maximal level
......
......@@ -10,16 +10,16 @@ namespace Dune
* \ingroup MultiMesh
*
*/
template <int codim, class GridImp>
template <int codim, class HostGrid>
class MultiMeshEntitySeed
{
protected:
/// Entity type of the hostgrid
typedef typename GridImp::HostGrid::Traits::template Codim<codim>::Entity HostEntity;
using HostEntity = typename HostGrid::Traits::template Codim<codim>::Entity;
/// EntitySeed type of the hostgrid
typedef typename GridImp::HostGrid::Traits::template Codim<codim>::EntitySeed HostEntitySeed;
using HostEntitySeed = typename HostGrid::Traits::template Codim<codim>::EntitySeed;
public:
enum { codimension = codim };
......@@ -66,13 +66,11 @@ namespace Dune
class MultiEntity;
// An entity seed for a vector of entities
template <int codim, class GridImp>
template <int codim, class HostGrid>
class MultiEntitySeed
{
protected:
using HostGrid = typename GridImp::HostGrid;
/// Entity type of the hostgrid
using HostEntity = typename HostGrid::Traits::template Codim<codim>::Entity;
......@@ -87,14 +85,11 @@ namespace Dune
{}
/// \brief Create EntitySeed from hostgrid Entity
/**
* We call hostEntity.seed() directly in the constructor
* of MultiMeshEntitySeed to allow for return value optimization.
*/
MultiEntitySeed (const MultiEntity<HostGrid>& multiEntity)
template <class MultiEntity>
MultiEntitySeed (const MultiEntity& multiEntity)
{
// for (auto const& e : multiEntity)
// hostEntitySeeds_.emplace_back(e.seed());
for (auto const& e : multiEntity)
hostEntitySeeds_.emplace_back(e.seed());
}
/// Get stored HostEntitySeed
......@@ -106,8 +101,9 @@ namespace Dune
/// Check whether it is safe to create an Entity from this Seed
bool isValid () const
{
return std::all_of(hostEntitySeeds_.begin(), hostEntitySeeds_.end(),
[](auto const& seed) { return seed.isValid(); });
return hostEntitySeeds_.empty() ? false :
std::all_of(hostEntitySeeds_.begin(), hostEntitySeeds_.end(),
[](auto const& seed) { return seed.isValid(); });
}
private:
......
......@@ -56,7 +56,7 @@ namespace Dune
using Grid = typename Traits::Grid;
/// Type of the corresponding GridType hosted by the MultiMesh
using HostGrid = typename GridImp::HostGridType;
using HostGrid = typename GridImp::HostGrid;
using IndexSet = typename Traits::IndexSet;
using Intersection = typename Traits::Intersection;
......
......@@ -117,11 +117,17 @@ namespace Dune
// 3. go down in tree until leaf entity
auto child = dereference();
for (; !(contains_(child) || child.isLeaf()); child = dereference()) {
assert(child.isRegular() && "No irregular elements allowed in multi-mesh traversal");
entityStack_.emplace(child);
assert( entityStack_.size() <= maxLevel_ );
}
// 4. go up in tree again to the first regular entity, since
// irregular element can not be traversed in a multi-mesh sense
while (!child.isRegular() && !entityStack_.empty()) {
entityStack_.pop();
child = dereference();
}
assert(contains_(child) && "No valid child element found in gridView");
}
......@@ -150,11 +156,17 @@ namespace Dune
// 1. go down in tree until leaf entity
auto child = dereference();
for (; !(contains_(child) || child.isLeaf()); child = dereference()) {
assert(child.isRegular() && "No irregular elements allowed in multi-mesh traversal");
entityStack_.emplace(child);
assert( entityStack_.size() <= maxLevel_ );
}
// 2. go up in tree again to the first regular entity, since
// irregular element can not be traversed in a multi-mesh sense
while (!child.isRegular() && !entityStack_.empty()) {
entityStack_.pop();
child = dereference();
}
assert(contains_(child) && "No valid child element found in gridView");
}
......@@ -167,7 +179,7 @@ namespace Dune
};
template <class Entity, class GridView>
inline auto childs(const Entity& entity, const GridView& gridView)
inline auto childs (const Entity& entity, const GridView& gridView)
{
using Iterator = MultiMeshHierarchicIterator<typename GridView::Grid>;
return IteratorRange<Iterator>{ Iterator{entity, gridView}, Iterator{true} };
......
......@@ -111,6 +111,8 @@ namespace Dune
/// The type used to store coordinates, inherited from the HostGrid
using ctype = typename HostGrid::ctype;
enum { dimension = HostGrid::dimension };
enum { dimensionworld = HostGrid::dimensionworld };
/// \brief Constructor, stores n copies of the hostgrid
/**
......@@ -475,7 +477,7 @@ namespace Dune
template <class HostGrid, int codim>
struct hasEntityIterator<MultiMesh<HostGrid>, codim>
{
static const bool v = hasEntityIterator<HostGrid, codim>::v;
static const bool v = (codim == 0);
};
/** \brief has conforming level grids when host grid has
......
......@@ -25,6 +25,16 @@ if (HAVE_ALBERTA)
add_dune_alberta_flags("taylorhood")
endif ()
add_executable("benchmark" benchmark.cc)
target_link_dune_default_libraries("benchmark")
if (HAVE_ALBERTA)
add_dune_alberta_flags(GRIDDIM 2 WORLDDIM 2 "benchmark")
endif ()
add_executable("profiling" profiling.cc)
target_link_dune_default_libraries("profiling")
find_package(MTL PATHS /opt/development/mtl4)
if (MTL_FOUND)
set(CXX_ELEVEN_FEATURE_LIST "MOVE" "AUTO" "RANGEDFOR" "INITLIST" "STATICASSERT" "DEFAULTIMPL")
......
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <iostream>
#include <dune/common/parallel/mpihelper.hh> // An initializer of MPI
#include <dune/common/exceptions.hh> // We use exceptions
#include <dune/common/filledarray.hh>
#include <dune/common/timer.hh>
#include <dune/grid/onedgrid.hh>
#include <dune/grid/yaspgrid.hh>
#if HAVE_ALBERTA
#include <dune/grid/albertagrid.hh>
#endif
#if HAVE_UG
#include <dune/grid/uggrid.hh>
#endif
#if HAVE_DUNE_ALUGRID
#include <dune/alugrid/grid.hh>
#endif
#if HAVE_DUNE_FOAMGRID
#include <dune/foamgrid/foamgrid.hh>
#endif
#if HAVE_DUNE_SPGRID
#include <dune/grid/spgrid.hh>
#endif
#include <dune/multimesh/multimesh.hh>
#include <dune/multimesh/mmgridfactory.hh>
#include <dune/multimesh/utility/structuredgridbuilder.hh>
using namespace Dune;
template <class Grid>
std::size_t traverse(Grid const& grid)
{
std::size_t num = 0;
for (auto const& entities : elements(grid.leafGridView())) {
++num;
}
return num;
}
template <class HostGrid>
void simplex_grid(std::string name, int refCount)
{
const int dow = HostGrid::dimensionworld;
using Factory = StructuredGridBuilder<MultiMesh<HostGrid> >;
GridFactory<MultiMesh<HostGrid> > gridFactory(2);
FieldVector<double,dow> lower; lower = -1.5;
FieldVector<double,dow> upper; upper = 1.5;
auto num_elements = filledArray<dow,unsigned int>(2);
Factory::createSimplexGrid(gridFactory, lower, upper, num_elements);
auto gridPtr = gridFactory.createGrid();
auto& grids = *gridPtr;
grids.globalRefine(refCount);
std::cout << name << "\n";
Timer t;
std::size_t num_multimesh = traverse(grids);
double time_multimesh = t.elapsed();
t.reset();
std::size_t num_singlemesh = traverse(grids[0]);
double time_singlemesh = t.elapsed();
std::cout << " [size(multimesh), size(singlemesh)]: [" << num_multimesh << ", " << num_singlemesh << "]\n";
std::cout << " multimesh: " << time_multimesh << "sec\n";
std::cout << " singlemesh: " << time_singlemesh << "sec\n";
std::cout << " ratio: " << (time_multimesh / time_singlemesh) << "\n";
}
template <class HostGrid>
void cubes_grid(std::string name, int refCount)
{
const int dow = HostGrid::dimensionworld;
using Factory = StructuredGridBuilder<MultiMesh<HostGrid> >;
GridFactory<MultiMesh<HostGrid> > gridFactory(2);
FieldVector<double,dow> lower; lower = -1.5;
FieldVector<double,dow> upper; upper = 1.5;
auto num_elements = filledArray<dow,unsigned int>(2);
Factory::createCubeGrid(gridFactory, lower, upper, num_elements);
auto gridPtr = gridFactory.createGrid();
auto& grids = *gridPtr;
grids.globalRefine(refCount);
std::cout << name << "\n";
Timer t;
std::size_t num_multimesh = traverse(grids);
double time_multimesh = t.elapsed();
t.reset();
std::size_t num_singlemesh = traverse(grids[0]);
double time_singlemesh = t.elapsed();
std::cout << " [size(multimesh), size(singlemesh)]: [" << num_multimesh << ", " << num_singlemesh << "]\n";
std::cout << " multimesh: " << time_multimesh << "sec\n";
std::cout << " singlemesh: " << time_singlemesh << "sec\n";
std::cout << " ratio: " << (time_multimesh / time_singlemesh) << "\n";
}
template <class HostGrid, class... Args>
void structured_grid(std::string name, int refCount, Args&&... args)
{
MultiMesh<HostGrid> grids(2, std::forward<Args>(args)...);
grids.globalRefine(refCount);
std::cout << name << "\n";
Timer t;
std::size_t num_multimesh = traverse(grids);
double time_multimesh = t.elapsed();
t.reset();
std::size_t num_singlemesh = traverse(grids[0]);
double time_singlemesh = t.elapsed();
std::cout << " [size(multimesh), size(singlemesh)]: [" << num_multimesh << ", " << num_singlemesh << "]\n";
std::cout << " multimesh: " << time_multimesh << "sec\n";
std::cout << " singlemesh: " << time_singlemesh << "sec\n";
std::cout << " ratio: " << (time_multimesh / time_singlemesh) << "\n";
}
int main(int argc, char** argv)
{
MPIHelper::instance(argc, argv);
FieldVector<double,1> lower1{-1.5};
FieldVector<double,2> lower2{-1.5,-1.5};
FieldVector<double,3> lower3{-1.5,-1.5,-1.5};
FieldVector<double,1> upper1{1.5};
FieldVector<double,2> upper2{1.5,1.5};
FieldVector<double,3> upper3{1.5,1.5,1.5};
structured_grid<OneDGrid>("OneDGrid", 16, 2, lower1[0], upper1[0]);
structured_grid<YaspGrid<1,EquidistantOffsetCoordinates<double,1>>>("YaspGrid<1>", 16, lower1, upper1, std::array<int,1>{2});
structured_grid<YaspGrid<2,EquidistantOffsetCoordinates<double,2>>>("YaspGrid<2>", 8, lower2, upper2, std::array<int,2>{2,2});
structured_grid<YaspGrid<3,EquidistantOffsetCoordinates<double,3>>>("YaspGrid<3>", 6, lower3, upper3, std::array<int,3>{2,2,2});
#if HAVE_ALBERTA
// simplex_grid<AlbertaGrid<1,1>>("AlbertaGrid<1>", 8);
// simplex_grid<AlbertaGrid<2,2>>("AlbertaGrid<2>", 6);
simplex_grid<AlbertaGrid<ALBERTA_DIM,ALBERTA_DIM>>("AlbertaGrid<" + std::to_string(ALBERTA_DIM) + ">", 4);
#endif
#if HAVE_UG
// simplex_grid<UGGrid<1>>("UGGrid<1>", 8);
simplex_grid<UGGrid<2>>("UGGrid<2>", 8);
simplex_grid<UGGrid<3>>("UGGrid<3>", 4);
cubes_grid<UGGrid<2>>("UGGrid<2,cube>", 8);
cubes_grid<UGGrid<3>>("UGGrid<3,cube>", 4);
#endif
#if HAVE_DUNE_ALUGRID
simplex_grid<Dune::ALUGrid<2, 2, simplex, conforming> >("ALUGrid<2,conforming>", 8);
// simplex_grid<Dune::ALUGrid<3, 3, simplex, conforming> >("ALUGrid<3,conforming>", 4);
simplex_grid<Dune::ALUGrid<2, 2, simplex, nonconforming> >("ALUGrid<2,nonconforming>", 6);
simplex_grid<Dune::ALUGrid<3, 3, simplex, nonconforming> >("ALUGrid<3,nonconforming>", 4);
cubes_grid<Dune::ALUGrid<2, 2, cube, nonconforming> >("ALUGrid<2,cube,nonconforming>", 6);
cubes_grid<Dune::ALUGrid<3, 3, cube, nonconforming> >("ALUGrid<3,cube,nonconforming>", 4);
#endif
#if HAVE_DUNE_SPGRID
structured_grid<SPGrid<double,1>>("SPGrid<1>", 16, lower1, upper1, std::array<int,1>{2});
structured_grid<SPGrid<double,2>>("SPGrid<2>", 8, lower2, upper2, std::array<int,2>{2,2});
structured_grid<SPGrid<double,3>>("SPGrid<3>", 6, lower3, upper3, std::array<int,3>{2,2,2});
#endif
}
......@@ -126,7 +126,7 @@ int main(int argc, char** argv)
double timeInterpolate = 0;
double timeWriteFile = 0;
Interpolation<Grid, VectorType> interpolation(grids);
Interpolation<Grid> interpolation(grids);
// assemble a sequence of systems for finer and finer grids
for (int i = 1; i < 20; ++i) {
......
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <iostream>
#include <dune/common/parallel/mpihelper.hh> // An initializer of MPI
#include <dune/common/timer.hh>
#include <dune/grid/onedgrid.hh>
#include <dune/grid/yaspgrid.hh>
#include <dune/multimesh/multimesh.hh>
using namespace Dune;
template <class Grid>
void traverse(Grid const& grid)
{
double area = 0;
int num_boundary_elements = 0;
for (auto const& entities : elements(grid.leafGridView())) {
area += entities.geometry().volume();
num_boundary_elements += entities.hasBoundaryIntersections() ? 1 : 0;
}
std::cout << " boundaryIntersections: " << num_boundary_elements << "\n";
std::cout << " area: " << area << "\n";
}
int main(int argc, char** argv)
{
MPIHelper::instance(argc, argv);
using HostGrid = YaspGrid<2,EquidistantOffsetCoordinates<double,2>>;
FieldVector<double,2> lower2{-1.5,-1.5};
FieldVector<double,2> upper2{1.5,1.5};
MultiMesh<HostGrid> grids(2, lower2, upper2, std::array<int,2>{32,32});
std::cout << "YaspGrid<2>\n";
Timer t;
traverse(grids);
std::cout << " time:" << t.elapsed() << "sec\n";
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment