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.
Files changed (78) hide show
  1. ddfem/__init__.py +72 -0
  2. ddfem/__main__.py +24 -0
  3. ddfem/data/adapt_010e1455a389aa01992af42c0a3f4b14.cc +27 -0
  4. ddfem/data/femscheme_f2a3cb32a864b08c0236366e732fb908.cc +43 -0
  5. ddfem/data/femspace_4ff9049b6f297245e5d33296d14cd684_d5b136dbe3c5077b69c99b8c322eb563.cc +45 -0
  6. ddfem/data/generate.py +30 -0
  7. ddfem/data/hierarchicalgrid_d827e80243feae36e8b9006bb24207e7.cc +26 -0
  8. ddfem/data/indexset_e9c0cdc96a4fc702a0969c29910954e6.cc +32 -0
  9. ddfem/data/integrands_008eefa148b772fa3192dd3c1728c140v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +587 -0
  10. ddfem/data/integrands_00ee9b3b89e4e44212e5b7ad7948a24ev1_3_a524c1196983e65de1c06d7d6afdeb44.cc +587 -0
  11. ddfem/data/integrands_1da925f6548e47811d4ee37ac8afd85ev1_3_a524c1196983e65de1c06d7d6afdeb44.cc +453 -0
  12. ddfem/data/integrands_2339be3c67df1d67b18125c34ced69c2v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +244 -0
  13. ddfem/data/integrands_3a7c822d5ac1692781ee4bcf2964fce7v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +409 -0
  14. ddfem/data/integrands_3bde0abfafcf45a3cff4d1029568ab5cv1_3_a524c1196983e65de1c06d7d6afdeb44.cc +409 -0
  15. ddfem/data/integrands_472696f050a50e3f5017ab5ecdab564bv1_3_a524c1196983e65de1c06d7d6afdeb44.cc +533 -0
  16. ddfem/data/integrands_5d65834d43b1dbae0ceafbcc9ec60542v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +453 -0
  17. ddfem/data/integrands_9fbeb56ff6a7df9b8535d767ca7725d6v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +588 -0
  18. ddfem/data/integrands_cf38a832d97016edac4179e31ea45a48v1_3_a524c1196983e65de1c06d7d6afdeb44.cc +533 -0
  19. ddfem/data/localfunction_00f2e5593eeb23f01906255d67244f6e_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
  20. ddfem/data/localfunction_0cb4ca9e24e2891510640b0737aaab21_a524c1196983e65de1c06d7d6afdeb44.cc +170 -0
  21. ddfem/data/localfunction_0f7b2106478c5d2af781b1f377a180d2_a524c1196983e65de1c06d7d6afdeb44.cc +393 -0
  22. ddfem/data/localfunction_10ad0a2d88c74db5f4bf5f81e138974f_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
  23. ddfem/data/localfunction_191355e6250b2d2e260d96f519ad9976_a524c1196983e65de1c06d7d6afdeb44.cc +192 -0
  24. ddfem/data/localfunction_1d13146d4bff10e178aba773fe2a9f1d_a524c1196983e65de1c06d7d6afdeb44.cc +263 -0
  25. ddfem/data/localfunction_1d27a90a52b9053192c9cc902283f79b_a524c1196983e65de1c06d7d6afdeb44.cc +189 -0
  26. ddfem/data/localfunction_2021505441469e99dd3c9b164e083239_a524c1196983e65de1c06d7d6afdeb44.cc +620 -0
  27. ddfem/data/localfunction_228c55d163ca194a905826bcc20fcbc0_a524c1196983e65de1c06d7d6afdeb44.cc +903 -0
  28. ddfem/data/localfunction_22e797a8f3e8c322f33c41e07bd15165_a524c1196983e65de1c06d7d6afdeb44.cc +1445 -0
  29. ddfem/data/localfunction_2a97db5a6a479d02138a836cb0890cf2_a524c1196983e65de1c06d7d6afdeb44.cc +173 -0
  30. ddfem/data/localfunction_32613626342183eafa360dc1f0f18924_a524c1196983e65de1c06d7d6afdeb44.cc +1425 -0
  31. ddfem/data/localfunction_33933b99fbea8227fedf6cfb180ea878_a524c1196983e65de1c06d7d6afdeb44.cc +386 -0
  32. ddfem/data/localfunction_3e323e81c52891c0ecb656eac273e52f_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
  33. ddfem/data/localfunction_42ff56710f3bd510798ecabb32a6cbf0_a524c1196983e65de1c06d7d6afdeb44.cc +490 -0
  34. ddfem/data/localfunction_42ff56710f3bd510798ecabb32a6cbf0_af122c1df944c95cd395ec0f91d0f970.cc +488 -0
  35. ddfem/data/localfunction_4484607e3f9bd9999dbd7bb9d595a7b2_a524c1196983e65de1c06d7d6afdeb44.cc +173 -0
  36. ddfem/data/localfunction_6363af791dde11d699a9a3d876cc5d9a_a524c1196983e65de1c06d7d6afdeb44.cc +549 -0
  37. ddfem/data/localfunction_65bda5736a84d4aa0ef2d48ebcc90ed5_a524c1196983e65de1c06d7d6afdeb44.cc +173 -0
  38. ddfem/data/localfunction_762aa49bc5a47ad3d8d8bbde36b42ee5_a524c1196983e65de1c06d7d6afdeb44.cc +723 -0
  39. ddfem/data/localfunction_7d81d496538f240d504e5597484ee746_a524c1196983e65de1c06d7d6afdeb44.cc +462 -0
  40. ddfem/data/localfunction_83d9e6dd70d1c31c973224e210cc36b4_a524c1196983e65de1c06d7d6afdeb44.cc +647 -0
  41. ddfem/data/localfunction_86a0670f34bf2ac8155423a1c1bc2e75_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
  42. ddfem/data/localfunction_a46a988b5d8571e80fd401a36d7341b7_a524c1196983e65de1c06d7d6afdeb44.cc +170 -0
  43. ddfem/data/localfunction_a854465b265a1a51dacb4f71f7eeb06b_a524c1196983e65de1c06d7d6afdeb44.cc +266 -0
  44. ddfem/data/localfunction_a8c726f728cd35d137188b33301aeef1_a524c1196983e65de1c06d7d6afdeb44.cc +176 -0
  45. ddfem/data/localfunction_a9bb07439605d560b583608f20441342_a524c1196983e65de1c06d7d6afdeb44.cc +173 -0
  46. ddfem/data/localfunction_ae8173bdb67b8ea50ce75c3912841100_a524c1196983e65de1c06d7d6afdeb44.cc +1290 -0
  47. ddfem/data/localfunction_aeb3d963412cdc65630e0a4c3c0dde0f_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
  48. ddfem/data/localfunction_b20910b6c8d57cb5e6a7ff4b89b91618_a524c1196983e65de1c06d7d6afdeb44.cc +437 -0
  49. ddfem/data/localfunction_b8239bf849ec7c1903f627833e6dac5a_a524c1196983e65de1c06d7d6afdeb44.cc +1270 -0
  50. ddfem/data/localfunction_bcafb581216501f273e23c0e26cd57af_af122c1df944c95cd395ec0f91d0f970.cc +698 -0
  51. ddfem/data/localfunction_bdfb7ddf42a423f7d0791458634d4b8f_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
  52. ddfem/data/localfunction_d0f33c2dc1ae0e619d85a7621c8e83a6_a524c1196983e65de1c06d7d6afdeb44.cc +325 -0
  53. ddfem/data/localfunction_d75993d7ae5919d23117b153e900840d_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
  54. ddfem/data/localfunction_dd1fb4bd60f2d8b3a062dbbdaedb9fee_a524c1196983e65de1c06d7d6afdeb44.cc +869 -0
  55. ddfem/data/localfunction_e6b6d8d3826590442cc40f3834124254_a524c1196983e65de1c06d7d6afdeb44.cc +553 -0
  56. ddfem/data/localfunction_e85b93fe9b8fcd40ee82782fc600b65b_a524c1196983e65de1c06d7d6afdeb44.cc +247 -0
  57. ddfem/data/localfunction_f4b1d42cbb447375f39ed834570cd3f0_a524c1196983e65de1c06d7d6afdeb44.cc +135 -0
  58. ddfem/data/localfunction_f626cd43dc8558135fe0b32cde016644_a524c1196983e65de1c06d7d6afdeb44.cc +294 -0
  59. ddfem/data/referenceelements_0fff57b283123cc055345ec95574c857.cc +24 -0
  60. ddfem/data/referenceelements_de274310a0055100b832a0e8892b0258.cc +24 -0
  61. ddfem/data/referenceelements_f4457f35395151d83a965d4cf5fce70d.cc +24 -0
  62. ddfem/data/view_a524c1196983e65de1c06d7d6afdeb44.cc +39 -0
  63. ddfem/data/view_af122c1df944c95cd395ec0f91d0f970.cc +62 -0
  64. ddfem/examples/beam.py +2 -2
  65. ddfem/examples/five_circle_flat.py +18 -37
  66. ddfem/examples/single_circle.py +1 -1
  67. ddfem/examples/triple_circle.py +2 -2
  68. ddfem/examples/triple_circle_beam.py +2 -2
  69. ddfem/geometry/domain.py +1 -1
  70. ddfem/geometry/domain_dune.py +46 -28
  71. ddfem/geometry/primitive_base.py +11 -6
  72. ddfem/plot.py +67 -7
  73. {ddfem-1.0.4.dist-info → ddfem-1.0.6.dist-info}/METADATA +9 -2
  74. ddfem-1.0.6.dist-info/RECORD +103 -0
  75. ddfem-1.0.4.dist-info/RECORD +0 -41
  76. {ddfem-1.0.4.dist-info → ddfem-1.0.6.dist-info}/WHEEL +0 -0
  77. {ddfem-1.0.4.dist-info → ddfem-1.0.6.dist-info}/licenses/LICENSE +0 -0
  78. {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.propagate_epsilon(epsilon)
139
+ omega.epsilon = epsilon
140
140
  domain = omega
141
141
 
142
- domain = DomainDune(omega, x, gridView)
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
- gridView = adaptiveLeafGridView(leafGridView(domain))
163
-
164
- if version == "dune_adaptive":
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
- region = gridFunction(
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
@@ -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, x, gridView)
131
+ domain = DomainDune(omega, gridView)
132
132
  domain.adapt(level=adaptLevels)
133
133
  gridView.plot()
134
134
 
@@ -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.propagate_epsilon(epsilon)
207
+ omega.epsilon = epsilon
208
208
  domain = omega
209
209
 
210
- domain = DomainDune(omega, x, gridView)
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.propagate_epsilon(epsilon)
198
+ omega.epsilon = epsilon
199
199
  domain = omega
200
200
 
201
- domain = DomainDune(omega, x, gridView)
201
+ domain = DomainDune(omega, gridView)
202
202
  # domain.adapt(level=adaptLevels)
203
203
 
204
204
  print(
ddfem/geometry/domain.py CHANGED
@@ -7,7 +7,7 @@ class Domain:
7
7
  def __init__(self, omega):
8
8
  self.omega = omega
9
9
 
10
- def __call__(self,x):
10
+ def __call__(self, x):
11
11
  return self.omega(x)
12
12
 
13
13
  def phi(self, x):
@@ -1,30 +1,53 @@
1
1
  import time
2
2
 
3
- import dune.fem
4
- import dune.grid
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, x, gridView, filterTolerance=0):
16
+ def __init__(self, omega, domain, *,
17
+ filterTolerance=0,
18
+ factor=0, refinements=0,
19
+ adaptLevels=0):
11
20
  super().__init__(omega)
12
- self.x = x
13
- self.gridView = gridView
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 = dune.fem.function.gridFunction(expr, name=name, gridView=self.gridView)
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 adapt(self, level, lowerTol=-0.1, upperTol=0.1):
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
- dune.grid.Marker.refine
97
+ Marker.refine
68
98
  if v > lowerTol and v < upperTol
69
- else dune.grid.Marker.keep
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
- )
@@ -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.epsilon = epsilon
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
- def plotSolution(domain,uh,figsize, **kwargs):
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]),**kwargs)
9
- gridFunction(uh*domain.chi(x)).plot(figure=(fig,axs[1]),**kwargs)
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
- onlyContours=True,contours=[0.5],gridLines=None,
13
- contourWidth=2, contourColor="black", figure=(fig,a))
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.4
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<81
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