ddfem 1.0.4__py3-none-any.whl → 1.0.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ddfem/__init__.py +72 -0
- ddfem/__main__.py +24 -0
- ddfem/data/adapt_010e1455a389aa01992af42c0a3f4b14.cc +27 -0
- ddfem/data/femscheme_f2a3cb32a864b08c0236366e732fb908.cc +43 -0
- ddfem/data/femspace_4ff9049b6f297245e5d33296d14cd684_d5b136dbe3c5077b69c99b8c322eb563.cc +45 -0
- ddfem/data/generate.py +30 -0
- ddfem/data/hierarchicalgrid_d827e80243feae36e8b9006bb24207e7.cc +26 -0
- ddfem/data/indexset_e9c0cdc96a4fc702a0969c29910954e6.cc +32 -0
- ddfem/data/integrands_008eefa148b772fa3192dd3c1728c140v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +587 -0
- ddfem/data/integrands_00ee9b3b89e4e44212e5b7ad7948a24ev1_3_a524c1196983e65de1c06d7d6afdeb44.cc +587 -0
- ddfem/data/integrands_1da925f6548e47811d4ee37ac8afd85ev1_3_a524c1196983e65de1c06d7d6afdeb44.cc +453 -0
- ddfem/data/integrands_2339be3c67df1d67b18125c34ced69c2v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +244 -0
- ddfem/data/integrands_3a7c822d5ac1692781ee4bcf2964fce7v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +409 -0
- ddfem/data/integrands_3bde0abfafcf45a3cff4d1029568ab5cv1_3_a524c1196983e65de1c06d7d6afdeb44.cc +409 -0
- ddfem/data/integrands_472696f050a50e3f5017ab5ecdab564bv1_3_a524c1196983e65de1c06d7d6afdeb44.cc +533 -0
- ddfem/data/integrands_5d65834d43b1dbae0ceafbcc9ec60542v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +453 -0
- ddfem/data/integrands_9fbeb56ff6a7df9b8535d767ca7725d6v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +588 -0
- ddfem/data/integrands_cf38a832d97016edac4179e31ea45a48v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +533 -0
- ddfem/data/localfunction_00f2e5593eeb23f01906255d67244f6e_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
- ddfem/data/localfunction_0cb4ca9e24e2891510640b0737aaab21_a524c1196983e65de1c06d7d6afdeb44.cc +170 -0
- ddfem/data/localfunction_0f7b2106478c5d2af781b1f377a180d2_a524c1196983e65de1c06d7d6afdeb44.cc +393 -0
- ddfem/data/localfunction_10ad0a2d88c74db5f4bf5f81e138974f_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
- ddfem/data/localfunction_191355e6250b2d2e260d96f519ad9976_a524c1196983e65de1c06d7d6afdeb44.cc +192 -0
- ddfem/data/localfunction_1d13146d4bff10e178aba773fe2a9f1d_a524c1196983e65de1c06d7d6afdeb44.cc +263 -0
- ddfem/data/localfunction_1d27a90a52b9053192c9cc902283f79b_a524c1196983e65de1c06d7d6afdeb44.cc +189 -0
- ddfem/data/localfunction_2021505441469e99dd3c9b164e083239_a524c1196983e65de1c06d7d6afdeb44.cc +620 -0
- ddfem/data/localfunction_228c55d163ca194a905826bcc20fcbc0_a524c1196983e65de1c06d7d6afdeb44.cc +903 -0
- ddfem/data/localfunction_22e797a8f3e8c322f33c41e07bd15165_a524c1196983e65de1c06d7d6afdeb44.cc +1445 -0
- ddfem/data/localfunction_2a97db5a6a479d02138a836cb0890cf2_a524c1196983e65de1c06d7d6afdeb44.cc +173 -0
- ddfem/data/localfunction_32613626342183eafa360dc1f0f18924_a524c1196983e65de1c06d7d6afdeb44.cc +1425 -0
- ddfem/data/localfunction_33933b99fbea8227fedf6cfb180ea878_a524c1196983e65de1c06d7d6afdeb44.cc +386 -0
- ddfem/data/localfunction_3e323e81c52891c0ecb656eac273e52f_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
- ddfem/data/localfunction_42ff56710f3bd510798ecabb32a6cbf0_a524c1196983e65de1c06d7d6afdeb44.cc +490 -0
- ddfem/data/localfunction_42ff56710f3bd510798ecabb32a6cbf0_af122c1df944c95cd395ec0f91d0f970.cc +488 -0
- ddfem/data/localfunction_4484607e3f9bd9999dbd7bb9d595a7b2_a524c1196983e65de1c06d7d6afdeb44.cc +173 -0
- ddfem/data/localfunction_6363af791dde11d699a9a3d876cc5d9a_a524c1196983e65de1c06d7d6afdeb44.cc +549 -0
- ddfem/data/localfunction_65bda5736a84d4aa0ef2d48ebcc90ed5_a524c1196983e65de1c06d7d6afdeb44.cc +173 -0
- ddfem/data/localfunction_762aa49bc5a47ad3d8d8bbde36b42ee5_a524c1196983e65de1c06d7d6afdeb44.cc +723 -0
- ddfem/data/localfunction_7d81d496538f240d504e5597484ee746_a524c1196983e65de1c06d7d6afdeb44.cc +462 -0
- ddfem/data/localfunction_83d9e6dd70d1c31c973224e210cc36b4_a524c1196983e65de1c06d7d6afdeb44.cc +647 -0
- ddfem/data/localfunction_86a0670f34bf2ac8155423a1c1bc2e75_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
- ddfem/data/localfunction_a46a988b5d8571e80fd401a36d7341b7_a524c1196983e65de1c06d7d6afdeb44.cc +170 -0
- ddfem/data/localfunction_a854465b265a1a51dacb4f71f7eeb06b_a524c1196983e65de1c06d7d6afdeb44.cc +266 -0
- ddfem/data/localfunction_a8c726f728cd35d137188b33301aeef1_a524c1196983e65de1c06d7d6afdeb44.cc +176 -0
- ddfem/data/localfunction_a9bb07439605d560b583608f20441342_a524c1196983e65de1c06d7d6afdeb44.cc +173 -0
- ddfem/data/localfunction_ae8173bdb67b8ea50ce75c3912841100_a524c1196983e65de1c06d7d6afdeb44.cc +1290 -0
- ddfem/data/localfunction_aeb3d963412cdc65630e0a4c3c0dde0f_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
- ddfem/data/localfunction_b20910b6c8d57cb5e6a7ff4b89b91618_a524c1196983e65de1c06d7d6afdeb44.cc +437 -0
- ddfem/data/localfunction_b8239bf849ec7c1903f627833e6dac5a_a524c1196983e65de1c06d7d6afdeb44.cc +1270 -0
- ddfem/data/localfunction_bcafb581216501f273e23c0e26cd57af_af122c1df944c95cd395ec0f91d0f970.cc +698 -0
- ddfem/data/localfunction_bdfb7ddf42a423f7d0791458634d4b8f_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
- ddfem/data/localfunction_d0f33c2dc1ae0e619d85a7621c8e83a6_a524c1196983e65de1c06d7d6afdeb44.cc +325 -0
- ddfem/data/localfunction_d75993d7ae5919d23117b153e900840d_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
- ddfem/data/localfunction_dd1fb4bd60f2d8b3a062dbbdaedb9fee_a524c1196983e65de1c06d7d6afdeb44.cc +869 -0
- ddfem/data/localfunction_e6b6d8d3826590442cc40f3834124254_a524c1196983e65de1c06d7d6afdeb44.cc +553 -0
- ddfem/data/localfunction_e85b93fe9b8fcd40ee82782fc600b65b_a524c1196983e65de1c06d7d6afdeb44.cc +247 -0
- ddfem/data/localfunction_f4b1d42cbb447375f39ed834570cd3f0_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
- ddfem/data/localfunction_f626cd43dc8558135fe0b32cde016644_a524c1196983e65de1c06d7d6afdeb44.cc +294 -0
- ddfem/data/referenceelements_0fff57b283123cc055345ec95574c857.cc +24 -0
- ddfem/data/referenceelements_de274310a0055100b832a0e8892b0258.cc +24 -0
- ddfem/data/referenceelements_f4457f35395151d83a965d4cf5fce70d.cc +24 -0
- ddfem/data/view_a524c1196983e65de1c06d7d6afdeb44.cc +39 -0
- ddfem/data/view_af122c1df944c95cd395ec0f91d0f970.cc +62 -0
- ddfem/examples/beam.py +2 -2
- ddfem/examples/five_circle_flat.py +18 -37
- ddfem/examples/single_circle.py +1 -1
- ddfem/examples/triple_circle.py +2 -2
- ddfem/examples/triple_circle_beam.py +2 -2
- ddfem/geometry/domain.py +1 -1
- ddfem/geometry/domain_dune.py +46 -28
- ddfem/geometry/primitive_base.py +11 -6
- ddfem/plot.py +67 -7
- {ddfem-1.0.4.dist-info → ddfem-1.0.6.dist-info}/METADATA +9 -2
- ddfem-1.0.6.dist-info/RECORD +103 -0
- ddfem-1.0.4.dist-info/RECORD +0 -41
- {ddfem-1.0.4.dist-info → ddfem-1.0.6.dist-info}/WHEEL +0 -0
- {ddfem-1.0.4.dist-info → ddfem-1.0.6.dist-info}/licenses/LICENSE +0 -0
- {ddfem-1.0.4.dist-info → ddfem-1.0.6.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
#ifndef Guard_referenceelements_0fff57b283123cc055345ec95574c857
|
2
|
+
#define Guard_referenceelements_0fff57b283123cc055345ec95574c857
|
3
|
+
|
4
|
+
#include <config.h>
|
5
|
+
|
6
|
+
#define USING_DUNE_PYTHON 1
|
7
|
+
|
8
|
+
#include <dune/python/geometry/referenceelements.hh>
|
9
|
+
|
10
|
+
#include <dune/python/common/typeregistry.hh>
|
11
|
+
#include <dune/python/pybind11/pybind11.h>
|
12
|
+
#include <dune/python/pybind11/stl.h>
|
13
|
+
|
14
|
+
PYBIND11_MODULE( referenceelements_0fff57b283123cc055345ec95574c857, module )
|
15
|
+
{
|
16
|
+
using pybind11::operator""_a;
|
17
|
+
pybind11::module cls0 = module;
|
18
|
+
{
|
19
|
+
using DuneType = Dune::Geo::ReferenceElement<Dune::Geo::ReferenceElementImplementation<double,1> >;
|
20
|
+
auto cls = Dune::Python::insertClass< DuneType >( cls0, "ReferenceElements", Dune::Python::GenerateTypeName("Dune::Geo::ReferenceElement<Dune::Geo::ReferenceElementImplementation<double,1> >"), Dune::Python::IncludeFiles{"dune/python/geometry/referenceelements.hh"}).first;
|
21
|
+
Dune::Python::registerReferenceElements( cls0, cls );
|
22
|
+
}
|
23
|
+
}
|
24
|
+
#endif
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#ifndef Guard_referenceelements_de274310a0055100b832a0e8892b0258
|
2
|
+
#define Guard_referenceelements_de274310a0055100b832a0e8892b0258
|
3
|
+
|
4
|
+
#include <config.h>
|
5
|
+
|
6
|
+
#define USING_DUNE_PYTHON 1
|
7
|
+
|
8
|
+
#include <dune/python/geometry/referenceelements.hh>
|
9
|
+
|
10
|
+
#include <dune/python/common/typeregistry.hh>
|
11
|
+
#include <dune/python/pybind11/pybind11.h>
|
12
|
+
#include <dune/python/pybind11/stl.h>
|
13
|
+
|
14
|
+
PYBIND11_MODULE( referenceelements_de274310a0055100b832a0e8892b0258, module )
|
15
|
+
{
|
16
|
+
using pybind11::operator""_a;
|
17
|
+
pybind11::module cls0 = module;
|
18
|
+
{
|
19
|
+
using DuneType = Dune::Geo::ReferenceElement<Dune::Geo::ReferenceElementImplementation<double,0> >;
|
20
|
+
auto cls = Dune::Python::insertClass< DuneType >( cls0, "ReferenceElements", Dune::Python::GenerateTypeName("Dune::Geo::ReferenceElement<Dune::Geo::ReferenceElementImplementation<double,0> >"), Dune::Python::IncludeFiles{"dune/python/geometry/referenceelements.hh"}).first;
|
21
|
+
Dune::Python::registerReferenceElements( cls0, cls );
|
22
|
+
}
|
23
|
+
}
|
24
|
+
#endif
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#ifndef Guard_referenceelements_f4457f35395151d83a965d4cf5fce70d
|
2
|
+
#define Guard_referenceelements_f4457f35395151d83a965d4cf5fce70d
|
3
|
+
|
4
|
+
#include <config.h>
|
5
|
+
|
6
|
+
#define USING_DUNE_PYTHON 1
|
7
|
+
|
8
|
+
#include <dune/python/geometry/referenceelements.hh>
|
9
|
+
|
10
|
+
#include <dune/python/common/typeregistry.hh>
|
11
|
+
#include <dune/python/pybind11/pybind11.h>
|
12
|
+
#include <dune/python/pybind11/stl.h>
|
13
|
+
|
14
|
+
PYBIND11_MODULE( referenceelements_f4457f35395151d83a965d4cf5fce70d, module )
|
15
|
+
{
|
16
|
+
using pybind11::operator""_a;
|
17
|
+
pybind11::module cls0 = module;
|
18
|
+
{
|
19
|
+
using DuneType = Dune::Geo::ReferenceElement<Dune::Geo::ReferenceElementImplementation<double,2> >;
|
20
|
+
auto cls = Dune::Python::insertClass< DuneType >( cls0, "ReferenceElements", Dune::Python::GenerateTypeName("Dune::Geo::ReferenceElement<Dune::Geo::ReferenceElementImplementation<double,2> >"), Dune::Python::IncludeFiles{"dune/python/geometry/referenceelements.hh"}).first;
|
21
|
+
Dune::Python::registerReferenceElements( cls0, cls );
|
22
|
+
}
|
23
|
+
}
|
24
|
+
#endif
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#ifndef Guard_view_a524c1196983e65de1c06d7d6afdeb44
|
2
|
+
#define Guard_view_a524c1196983e65de1c06d7d6afdeb44
|
3
|
+
|
4
|
+
#include <config.h>
|
5
|
+
|
6
|
+
#define USING_DUNE_PYTHON 1
|
7
|
+
|
8
|
+
#include <dune/alugrid/dgf.hh>
|
9
|
+
#include <dune/alugrid/grid.hh>
|
10
|
+
#include <dune/fem/gridpart/adaptiveleafgridpart.hh>
|
11
|
+
#include <dune/fem/gridpart/filter/simple.hh>
|
12
|
+
#include <dune/fem/gridpart/filteredgridpart.hh>
|
13
|
+
#include <dune/fempy/py/gridview.hh>
|
14
|
+
#include <dune/python/grid/gridview.hh>
|
15
|
+
#include <dune/python/grid/hierarchical.hh>
|
16
|
+
|
17
|
+
#include <dune/python/common/typeregistry.hh>
|
18
|
+
#include <dune/python/pybind11/pybind11.h>
|
19
|
+
#include <dune/python/pybind11/stl.h>
|
20
|
+
|
21
|
+
PYBIND11_MODULE( view_a524c1196983e65de1c06d7d6afdeb44, module )
|
22
|
+
{
|
23
|
+
using pybind11::operator""_a;
|
24
|
+
pybind11::module cls0 = module;
|
25
|
+
{
|
26
|
+
using DuneType = Dune::Fem::FilteredGridPart< Dune::FemPy::GridPart< Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > > >, Dune::Fem::SimpleFilter< Dune::FemPy::GridPart< Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > > > >, true >;
|
27
|
+
auto cls = Dune::Python::insertClass< DuneType >( cls0, "GridView",pybind11::dynamic_attr(), Dune::Python::GenerateTypeName("Dune::Fem::FilteredGridPart< Dune::FemPy::GridPart< Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > > >, Dune::Fem::SimpleFilter< Dune::FemPy::GridPart< Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > > > >, true >"), Dune::Python::IncludeFiles{"dune/alugrid/dgf.hh","dune/alugrid/grid.hh","dune/fem/gridpart/adaptiveleafgridpart.hh","dune/fem/gridpart/filter/simple.hh","dune/fem/gridpart/filteredgridpart.hh","dune/fempy/py/gridview.hh","dune/python/grid/gridview.hh","dune/python/grid/hierarchical.hh"}).first;
|
28
|
+
Dune::Python::registerGridView( cls0, cls );
|
29
|
+
|
30
|
+
Dune::FemPy::registerGridView ( cls );
|
31
|
+
cls.def( pybind11::init( [] ( pybind11::handle hostGridView, pybind11::function contains, int domainId ) {auto containsCpp = [ contains ] ( const Dune::FemPy::GridPart< Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > > >::Codim< 0 >::EntityType &e ) {
|
32
|
+
return contains( e ).template cast< int >();
|
33
|
+
};
|
34
|
+
Dune::FemPy::GridPart< Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > > > &hostGridPart = Dune::FemPy::gridPart< Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > > >( hostGridView );
|
35
|
+
return Dune::Fem::FilteredGridPart< Dune::FemPy::GridPart< Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > > >, Dune::Fem::SimpleFilter< Dune::FemPy::GridPart< Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > > > >, true > ( hostGridPart, Dune::Fem::SimpleFilter< Dune::FemPy::GridPart< Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > > > >( hostGridPart, containsCpp, domainId ) );
|
36
|
+
} ), pybind11::keep_alive< 1, 2 >() );
|
37
|
+
}
|
38
|
+
}
|
39
|
+
#endif
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#ifndef Guard_view_af122c1df944c95cd395ec0f91d0f970
|
2
|
+
#define Guard_view_af122c1df944c95cd395ec0f91d0f970
|
3
|
+
|
4
|
+
#include <config.h>
|
5
|
+
|
6
|
+
#define USING_DUNE_PYTHON 1
|
7
|
+
|
8
|
+
#include <dune/alugrid/dgf.hh>
|
9
|
+
#include <dune/alugrid/grid.hh>
|
10
|
+
#include <dune/fem/gridpart/adaptiveleafgridpart.hh>
|
11
|
+
#include <dune/fempy/py/gridview.hh>
|
12
|
+
#include <dune/python/grid/gridview.hh>
|
13
|
+
#include <dune/python/grid/hierarchical.hh>
|
14
|
+
|
15
|
+
#include <dune/python/common/typeregistry.hh>
|
16
|
+
#include <dune/python/pybind11/pybind11.h>
|
17
|
+
#include <dune/python/pybind11/stl.h>
|
18
|
+
|
19
|
+
PYBIND11_MODULE( view_af122c1df944c95cd395ec0f91d0f970, module )
|
20
|
+
{
|
21
|
+
using pybind11::operator""_a;
|
22
|
+
pybind11::module cls0 = module;
|
23
|
+
{
|
24
|
+
using DuneType = Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > >;
|
25
|
+
auto cls = Dune::Python::insertClass< DuneType >( cls0, "GridView",pybind11::dynamic_attr(), Dune::Python::GenerateTypeName("Dune::Fem::AdaptiveLeafGridPart< Dune::ALUGrid< 2, 2, Dune::simplex > >"), Dune::Python::IncludeFiles{"dune/alugrid/dgf.hh","dune/alugrid/grid.hh","dune/fem/gridpart/adaptiveleafgridpart.hh","dune/fempy/py/gridview.hh","dune/python/grid/gridview.hh","dune/python/grid/hierarchical.hh"}).first;
|
26
|
+
Dune::Python::registerGridView( cls0, cls );
|
27
|
+
|
28
|
+
Dune::FemPy::registerGridView ( cls );
|
29
|
+
cls.def( pybind11::pickle(
|
30
|
+
[](const pybind11::object &self) {
|
31
|
+
|
32
|
+
auto& gv = self.cast<DuneType&>();
|
33
|
+
std::ostringstream stream;
|
34
|
+
Dune::Fem::StandardOutStream outStream(stream);
|
35
|
+
gv.indexSet().write( outStream );
|
36
|
+
pybind11::bytes s(stream.str());
|
37
|
+
/* Return a tuple that fully encodes the state of the object */
|
38
|
+
pybind11::dict d;
|
39
|
+
if (pybind11::hasattr(self, "__dict__")) {
|
40
|
+
d = self.attr("__dict__");
|
41
|
+
}
|
42
|
+
return pybind11::make_tuple(gv.grid(),s,d);
|
43
|
+
}
|
44
|
+
, [](pybind11::tuple t) {
|
45
|
+
|
46
|
+
if (t.size() != 3)
|
47
|
+
throw std::runtime_error("Invalid state in AdaptGV with "+std::to_string(t.size())+"arguments!");
|
48
|
+
pybind11::handle pyHg = t[0];
|
49
|
+
auto& hg = pyHg.cast<typename DuneType::GridType&>();
|
50
|
+
/* Create a new C++ instance */
|
51
|
+
DuneType* gv = new DuneType(hg);
|
52
|
+
pybind11::bytes state(t[1]);
|
53
|
+
std::istringstream stream( state );
|
54
|
+
Dune::Fem::StandardInStream inStream(stream);
|
55
|
+
gv->indexSet().read( inStream );
|
56
|
+
auto py_state = t[2].cast<pybind11::dict>();
|
57
|
+
return std::make_pair(gv, py_state);
|
58
|
+
}
|
59
|
+
), pybind11::keep_alive<1,2>(), pybind11::prepend() );
|
60
|
+
}
|
61
|
+
}
|
62
|
+
#endif
|
ddfem/examples/beam.py
CHANGED
@@ -136,10 +136,10 @@ def getDomain(initialRefine, version, adaptLevels=0, epsFactor=4.5, *args, **kwa
|
|
136
136
|
h_min = h_max * 0.5 ** (j / 2)
|
137
137
|
epsilon = get_eps(h_min)
|
138
138
|
|
139
|
-
omega.
|
139
|
+
omega.epsilon = epsilon
|
140
140
|
domain = omega
|
141
141
|
|
142
|
-
domain = DomainDune(omega,
|
142
|
+
domain = DomainDune(omega, gridView)
|
143
143
|
# domain.adapt(level=adaptLevels)
|
144
144
|
|
145
145
|
print(f"h={h * 0.5 ** (adaptLevels / 2)}, epsilon={epsilon.value}")
|
@@ -15,16 +15,14 @@ pip install dune-fem
|
|
15
15
|
"""
|
16
16
|
)
|
17
17
|
|
18
|
-
from dune.alugrid import aluConformGrid as leafGridView
|
19
|
-
from dune.fem import adapt, mark, markNeighbors
|
20
18
|
from dune.fem.function import gridFunction
|
21
19
|
from dune.fem.space import lagrange
|
22
|
-
from dune.fem.view import adaptiveLeafGridView
|
23
20
|
from dune.grid import cartesianDomain
|
24
21
|
from dune.ufl import Constant, Space
|
25
22
|
from ufl import SpatialCoordinate, sqrt
|
26
23
|
|
27
24
|
from ddfem import geometry as gm
|
25
|
+
from ddfem import GridView
|
28
26
|
from ddfem.geometry.domain_dune import DomainDune
|
29
27
|
|
30
28
|
|
@@ -97,9 +95,10 @@ def getDomain(
|
|
97
95
|
)
|
98
96
|
return m * (dist - r_min) + geom.characteristic_length_min
|
99
97
|
|
98
|
+
omega.epsilon = get_eps(h)
|
99
|
+
|
100
100
|
if version == "cartesian":
|
101
101
|
domain = cartesianDomain(*domain_range, initial_gridsize)
|
102
|
-
epsilon = get_eps(h)
|
103
102
|
|
104
103
|
elif version == "fitted":
|
105
104
|
if pygmsh is None:
|
@@ -107,7 +106,6 @@ def getDomain(
|
|
107
106
|
with pygmsh.occ.Geometry() as geom:
|
108
107
|
geom.characteristic_length_max = h_max
|
109
108
|
geom.characteristic_length_min = h_min
|
110
|
-
epsilon = get_eps(h_min)
|
111
109
|
|
112
110
|
disks = [geom.add_disk([c[1][0], c[1][1], 0.0], c[0]) for c in balls]
|
113
111
|
|
@@ -118,7 +116,7 @@ def getDomain(
|
|
118
116
|
shape = geom.boolean_intersection([disk_add, disks[5]])
|
119
117
|
|
120
118
|
geom.set_mesh_size_callback(
|
121
|
-
lambda dim, tag, x, y, z, lc: spacing(x, y, epsilon),
|
119
|
+
lambda dim, tag, x, y, z, lc: spacing(x, y, omega.epsilon),
|
122
120
|
ignore_other_mesh_sizes=True,
|
123
121
|
)
|
124
122
|
mesh = geom.generate_mesh()
|
@@ -133,12 +131,13 @@ def getDomain(
|
|
133
131
|
domain = cartesianDomain(*domain_range, gridsize)
|
134
132
|
|
135
133
|
elif version == "gmsh_adaptive":
|
134
|
+
# in this version we need to adapt the epsilon since using the
|
135
|
+
# coarse grid h is not really useful
|
136
136
|
if pygmsh is None:
|
137
137
|
raise AttributeError("'gmsh_adaptive' requires install pygmsh")
|
138
138
|
with pygmsh.occ.Geometry() as geom:
|
139
139
|
geom.characteristic_length_max = h_max
|
140
140
|
geom.characteristic_length_min = h_min
|
141
|
-
epsilon = get_eps(h_min)
|
142
141
|
|
143
142
|
geom.add_rectangle(
|
144
143
|
[domain_range[0][0], domain_range[0][1], 0.0],
|
@@ -147,7 +146,7 @@ def getDomain(
|
|
147
146
|
)
|
148
147
|
|
149
148
|
geom.set_mesh_size_callback(
|
150
|
-
lambda dim, tag, x, y, z, lc: spacing(x, y, epsilon),
|
149
|
+
lambda dim, tag, x, y, z, lc: spacing(x, y, omega.epsilon),
|
151
150
|
ignore_other_mesh_sizes=True,
|
152
151
|
)
|
153
152
|
mesh = geom.generate_mesh()
|
@@ -159,39 +158,21 @@ def getDomain(
|
|
159
158
|
else:
|
160
159
|
raise ValueError("invalid mesh type")
|
161
160
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
omega.epsilon = get_eps(h_min)
|
166
|
-
omega.epsilon.value *= radius
|
167
|
-
epsilon_value = omega.epsilon.value
|
168
|
-
|
169
|
-
marker = mark
|
170
|
-
|
161
|
+
if not version == "dune_adaptive":
|
162
|
+
gridView = GridView(domain)
|
163
|
+
else:
|
171
164
|
refinements = int(2 * np.log2(h_max / h_min))
|
165
|
+
gridView = GridView(domain,omega,
|
166
|
+
factor=radius,
|
167
|
+
refinements=refinements,
|
168
|
+
adaptLevels=adaptLevels)
|
169
|
+
h_min = h_max * 0.5 ** (refinements / 2)
|
170
|
+
omega.epsilon.value = get_eps(h_min)
|
172
171
|
|
173
|
-
|
174
|
-
omega.phi(x) * (1 - omega.phi(x)), gridView=gridView
|
175
|
-
) # interface
|
176
|
-
|
177
|
-
for j in range(1, refinements + 1):
|
178
|
-
|
179
|
-
omega.epsilon.value = epsilon_value * j / refinements
|
180
|
-
marker(region, 0.00247262315663, maxLevel=refinements) # 1 epsilon
|
181
|
-
|
182
|
-
adapt(gridView.hierarchicalGrid)
|
183
|
-
|
184
|
-
h_min = h_max * 0.5 ** (j / 2)
|
185
|
-
epsilon = get_eps(h_min)
|
186
|
-
|
187
|
-
omega.propagate_epsilon(epsilon)
|
188
|
-
domain = omega
|
189
|
-
|
190
|
-
domain = DomainDune(omega, x, gridView)
|
191
|
-
domain.adapt(level=adaptLevels)
|
172
|
+
domain = DomainDune(omega, gridView)
|
192
173
|
|
193
174
|
print(
|
194
|
-
f"h_max={h_max}, h_min={h_min * 0.5 ** (adaptLevels / 2)}, epsilon={epsilon.value}"
|
175
|
+
f"h_max={h_max}, h_min={h_min * 0.5 ** (adaptLevels / 2)}, epsilon={omega.epsilon.value}"
|
195
176
|
)
|
196
177
|
|
197
178
|
return gridView, domain
|
ddfem/examples/single_circle.py
CHANGED
@@ -128,7 +128,7 @@ def getDomain(initialRefine, version, inverted, adaptLevels=0, epsFactor=4.5):
|
|
128
128
|
|
129
129
|
gridView = adaptiveLeafGridView(leafGridView(domain))
|
130
130
|
|
131
|
-
domain = DomainDune(omega,
|
131
|
+
domain = DomainDune(omega, gridView)
|
132
132
|
domain.adapt(level=adaptLevels)
|
133
133
|
gridView.plot()
|
134
134
|
|
ddfem/examples/triple_circle.py
CHANGED
@@ -204,10 +204,10 @@ def getDomain(
|
|
204
204
|
h_min = h_max * 0.5 ** (j / 2)
|
205
205
|
epsilon = get_eps(h_min)
|
206
206
|
|
207
|
-
omega.
|
207
|
+
omega.epsilon = epsilon
|
208
208
|
domain = omega
|
209
209
|
|
210
|
-
domain = DomainDune(omega,
|
210
|
+
domain = DomainDune(omega, gridView)
|
211
211
|
domain.adapt(level=adaptLevels)
|
212
212
|
|
213
213
|
print(
|
@@ -195,10 +195,10 @@ def getDomain(initialRefine, version, adaptLevels=0, epsFactor=4.5, dirichlet=Tr
|
|
195
195
|
h_min = h_max * 0.5 ** (j / 3)
|
196
196
|
epsilon = get_eps(h_min)
|
197
197
|
|
198
|
-
omega.
|
198
|
+
omega.epsilon = epsilon
|
199
199
|
domain = omega
|
200
200
|
|
201
|
-
domain = DomainDune(omega,
|
201
|
+
domain = DomainDune(omega, gridView)
|
202
202
|
# domain.adapt(level=adaptLevels)
|
203
203
|
|
204
204
|
print(
|
ddfem/geometry/domain.py
CHANGED
ddfem/geometry/domain_dune.py
CHANGED
@@ -1,30 +1,53 @@
|
|
1
1
|
import time
|
2
2
|
|
3
|
-
import dune.
|
4
|
-
|
3
|
+
import dune.ufl
|
4
|
+
from dune.fem.function import gridFunction
|
5
|
+
from dune.fem import adapt, mark, markNeighbors
|
6
|
+
from dune.fem.view import adaptiveLeafGridView, filteredGridView
|
7
|
+
from dune.grid import cartesianDomain, Marker
|
8
|
+
from dune.alugrid import aluConformGrid as GridView
|
9
|
+
from dune.fem.utility import FemThreadPoolExecutor
|
10
|
+
import ufl
|
5
11
|
|
6
12
|
from .domain import Domain
|
7
|
-
|
13
|
+
from .. import GridView
|
8
14
|
|
9
15
|
class DomainDune(Domain):
|
10
|
-
def __init__(self, omega,
|
16
|
+
def __init__(self, omega, domain, *,
|
17
|
+
filterTolerance=0,
|
18
|
+
factor=0, refinements=0,
|
19
|
+
adaptLevels=0):
|
11
20
|
super().__init__(omega)
|
12
|
-
|
13
|
-
|
21
|
+
if not hasattr(omega.epsilon,"value"):
|
22
|
+
omega.epsilon = dune.ufl.Constant(omega.epsilon,name="epsilon")
|
23
|
+
self.gridView = GridView(domain, omega,
|
24
|
+
filterTolerance=filterTolerance,
|
25
|
+
factor=factor,refinements=refinements,
|
26
|
+
adaptLevels=adaptLevels)
|
27
|
+
dims = (self.gridView.dimGrid, self.gridView.dimWorld)
|
28
|
+
self.x = ufl.SpatialCoordinate(dune.ufl.domain(dims))
|
14
29
|
self.fullSDF = self.gridFunction(self.omega(self.x), name="full-sdf")
|
15
|
-
if filterTolerance>0:
|
16
|
-
self.gridView = self._filter(tolerance=filterTolerance)
|
17
|
-
self.fullSDF = self.gridFunction(self.omega(self.x), name="full-sdf")
|
18
|
-
|
19
30
|
self._phi = None
|
20
31
|
self._bndProj = None
|
21
32
|
self._extProj = None
|
22
33
|
self._bndProjSDFs = {}
|
23
|
-
|
34
|
+
self._chi = None
|
35
|
+
|
36
|
+
"""
|
37
|
+
print("Setting up projections",flush=True)
|
38
|
+
with FemThreadPoolExecutor(max_workers=8) as executor:
|
39
|
+
executor.submit( self.boundary_projection, self.x )
|
40
|
+
executor.submit( self.external_projection, self.x )
|
41
|
+
executor.submit( self.phi, self.x )
|
42
|
+
executor.submit( self.chi, self.x )
|
43
|
+
for child in self.omega:
|
44
|
+
executor.submit( self.generate_projSDF, child )
|
45
|
+
print("done",flush=True)
|
46
|
+
"""
|
24
47
|
|
25
48
|
def gridFunction(self, expr, name):
|
26
49
|
start_ = time.time()
|
27
|
-
gf =
|
50
|
+
gf = gridFunction(expr, name=name, gridView=self.gridView)
|
28
51
|
# print(f"{name} setup: {time.time() - start_}")
|
29
52
|
return gf
|
30
53
|
|
@@ -35,6 +58,14 @@ class DomainDune(Domain):
|
|
35
58
|
|
36
59
|
return self._phi
|
37
60
|
|
61
|
+
def chi(self, x):
|
62
|
+
return super().chi(self.x)
|
63
|
+
if self._chi is None:
|
64
|
+
p = super().chi(self.x)
|
65
|
+
self._chi = self.gridFunction(p, "chidomain")
|
66
|
+
|
67
|
+
return self._chi
|
68
|
+
|
38
69
|
def boundary_projection(self, x):
|
39
70
|
if self._bndProj is None:
|
40
71
|
p = super().boundary_projection(self.x)
|
@@ -58,28 +89,15 @@ class DomainDune(Domain):
|
|
58
89
|
projSDF = self._bndProjSDFs[sdf.name]
|
59
90
|
return projSDF
|
60
91
|
|
61
|
-
def
|
92
|
+
def _adapt(self, level, lowerTol=-0.1, upperTol=0.1):
|
62
93
|
for _ in range(level):
|
63
|
-
|
64
94
|
def mark(e):
|
65
95
|
v = self.fullSDF(e, self.gridView.dimension * [1.0 / 3.0])
|
66
96
|
return (
|
67
|
-
|
97
|
+
Marker.refine
|
68
98
|
if v > lowerTol and v < upperTol
|
69
|
-
else
|
99
|
+
else Marker.keep
|
70
100
|
)
|
71
|
-
|
72
101
|
self.gridView.hierarchicalGrid.adapt(mark)
|
73
|
-
# print(self.gridView.size(0))
|
74
102
|
lowerTol /= 2
|
75
103
|
upperTol /= 2
|
76
|
-
|
77
|
-
def _filter(self, tolerance):
|
78
|
-
sd = self.fullSDF
|
79
|
-
tol = tolerance # * self.epsilon.value: issue here with epsilon being a UFL expression due to CSG approach
|
80
|
-
phiFilter = (
|
81
|
-
lambda e: sd(e, self.gridView.dimension * [1.0 / 3.0]) < tol
|
82
|
-
) # bary needs fixing for squares
|
83
|
-
return dune.fem.view.filteredGridView(
|
84
|
-
self.gridView, phiFilter, domainId=1, useFilteredIndexSet=True
|
85
|
-
)
|
ddfem/geometry/primitive_base.py
CHANGED
@@ -18,13 +18,23 @@ ORIGIN = as_vector([0, 0])
|
|
18
18
|
|
19
19
|
class SDF:
|
20
20
|
def __init__(self, epsilon=None, name=None, children=None):
|
21
|
-
self.
|
21
|
+
self._epsilon = epsilon
|
22
22
|
self.child_sdf = children if children else []
|
23
23
|
|
24
24
|
self.name = name
|
25
25
|
if self.name is None:
|
26
26
|
self.name = repr(self)
|
27
27
|
|
28
|
+
@property
|
29
|
+
def epsilon(self):
|
30
|
+
return self._epsilon
|
31
|
+
|
32
|
+
@epsilon.setter
|
33
|
+
def epsilon(self, eps):
|
34
|
+
self._epsilon = eps
|
35
|
+
for child in self.child_sdf:
|
36
|
+
child.epsilon = eps
|
37
|
+
|
28
38
|
def _repr_core(self):
|
29
39
|
return f"epsilon={self.epsilon}, name={self.name}, children={self.child_sdf}"
|
30
40
|
|
@@ -54,11 +64,6 @@ class SDF:
|
|
54
64
|
|
55
65
|
return None
|
56
66
|
|
57
|
-
def propagate_epsilon(self, epsilon):
|
58
|
-
self.epsilon = epsilon
|
59
|
-
for child in self.child_sdf:
|
60
|
-
child.propagate_epsilon(epsilon)
|
61
|
-
|
62
67
|
def phi(self, x, epsilon=None):
|
63
68
|
if not epsilon:
|
64
69
|
epsilon = self.epsilon
|
ddfem/plot.py
CHANGED
@@ -1,13 +1,73 @@
|
|
1
|
-
from matplotlib import pyplot as plt
|
2
1
|
from dune.fem.function import gridFunction
|
2
|
+
from matplotlib import pyplot as plt
|
3
3
|
from ufl import SpatialCoordinate, triangle
|
4
4
|
|
5
|
-
|
5
|
+
|
6
|
+
def plotSolution(domain, uh, figsize, **kwargs):
|
6
7
|
x = SpatialCoordinate(triangle)
|
7
|
-
fig, axs = plt.subplots(1,2, figsize=[2*figsize[0],figsize[1]])
|
8
|
-
uh.plot(figure=(fig,axs[0])
|
9
|
-
gridFunction(uh*domain.chi(x)).plot(figure=(fig,axs[1])
|
8
|
+
fig, axs = plt.subplots(1, 2, figsize=[2 * figsize[0], figsize[1]])
|
9
|
+
uh.plot(figure=(fig, axs[0]), **kwargs)
|
10
|
+
gridFunction(uh * domain.chi(x)).plot(figure=(fig, axs[1]), **kwargs)
|
10
11
|
for a in axs:
|
11
12
|
gridFunction(domain.phi(x), gridView=uh.space.gridView).plot(
|
12
|
-
|
13
|
-
|
13
|
+
onlyContours=True,
|
14
|
+
contours=[0.5],
|
15
|
+
gridLines=None,
|
16
|
+
contourWidth=2,
|
17
|
+
contourColor="black",
|
18
|
+
figure=(fig, a),
|
19
|
+
)
|
20
|
+
|
21
|
+
|
22
|
+
def plotSdfTree(SDF, gridView, figsize, maxDepth=None, **kwargs):
|
23
|
+
x = SpatialCoordinate(triangle)
|
24
|
+
fig, axs = plt.subplots(1, 2, figsize=[2 * figsize[0], figsize[1]])
|
25
|
+
|
26
|
+
gridFunction(SDF(x), gridView=gridView).plot(figure=(fig, axs[0]), **kwargs)
|
27
|
+
|
28
|
+
def plot_recursive(childSDF, depth):
|
29
|
+
if maxDepth is not None and depth > maxDepth:
|
30
|
+
return
|
31
|
+
|
32
|
+
gridFunction(childSDF(x), gridView=gridView).plot(
|
33
|
+
onlyContours=True,
|
34
|
+
contours=[0],
|
35
|
+
gridLines=None,
|
36
|
+
contourWidth=2,
|
37
|
+
contourColor="black",
|
38
|
+
figure=(fig, axs[0]),
|
39
|
+
)
|
40
|
+
|
41
|
+
for child in childSDF.child_sdf:
|
42
|
+
plot_recursive(child, depth + 1)
|
43
|
+
|
44
|
+
plot_recursive(SDF, 0)
|
45
|
+
gridFunction(SDF(x), gridView=gridView).plot(
|
46
|
+
onlyContours=True,
|
47
|
+
contours=[0],
|
48
|
+
gridLines=None,
|
49
|
+
contourWidth=2,
|
50
|
+
contourColor="white",
|
51
|
+
figure=(fig, axs[0]),
|
52
|
+
)
|
53
|
+
gridFunction(SDF.phi(x), gridView=gridView).plot(figure=(fig, axs[1]), **kwargs)
|
54
|
+
|
55
|
+
def plotBndExt(domain, Model, uh, figsize, t=0, **kwargs):
|
56
|
+
from .boundary import BoundaryTerms
|
57
|
+
|
58
|
+
x = SpatialCoordinate(triangle)
|
59
|
+
|
60
|
+
bt = BoundaryTerms(Model, domain)
|
61
|
+
bndExt = bt.BndValueExt(t, x, uh)
|
62
|
+
|
63
|
+
fig, axs = plt.subplots(1, figsize=figsize)
|
64
|
+
gridFunction(bndExt, gridView=uh.space.gridView).plot(figure=(fig, axs), **kwargs)
|
65
|
+
|
66
|
+
gridFunction(domain(x), gridView=uh.space.gridView).plot(
|
67
|
+
onlyContours=True,
|
68
|
+
contours=[0],
|
69
|
+
gridLines=None,
|
70
|
+
contourWidth=2,
|
71
|
+
contourColor="black",
|
72
|
+
figure=(fig, axs),
|
73
|
+
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ddfem
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.6
|
4
4
|
Summary: Diffuse domain finite element solver
|
5
5
|
Author-email: Luke Benfield <luke.benfield@warwick.ac.uk>, Andreas Dedner <a.s.dedner@warwick.ac.uk>
|
6
6
|
License-Expression: MIT
|
@@ -15,10 +15,17 @@ Description-Content-Type: text/markdown
|
|
15
15
|
License-File: LICENSE
|
16
16
|
Requires-Dist: fenics-ufl==2022.2.0
|
17
17
|
Requires-Dist: numpy
|
18
|
-
Requires-Dist: setuptools
|
18
|
+
Requires-Dist: setuptools==79
|
19
19
|
Provides-Extra: dune
|
20
20
|
Requires-Dist: dune-fem; extra == "dune"
|
21
21
|
Requires-Dist: pygmsh; extra == "dune"
|
22
|
+
Provides-Extra: doc
|
23
|
+
Requires-Dist: dune-fem; extra == "doc"
|
24
|
+
Requires-Dist: pygmsh; extra == "doc"
|
25
|
+
Requires-Dist: jupyter; extra == "doc"
|
26
|
+
Requires-Dist: jupytext; extra == "doc"
|
27
|
+
Requires-Dist: nbsphinx; extra == "doc"
|
28
|
+
Requires-Dist: sphinx_rtd_theme; extra == "doc"
|
22
29
|
Dynamic: license-file
|
23
30
|
|
24
31
|
# Diffuse Domain Finite Element Methods
|