ngsolve 6.2.2503__cp310-cp310-macosx_10_15_universal2.whl → 6.2.2504.post12.dev0__cp310-cp310-macosx_10_15_universal2.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.
Potentially problematic release.
This version of ngsolve might be problematic. Click here for more details.
- netgen/include/h1amg.hpp +62 -2
- netgen/include/integrator.hpp +4 -16
- netgen/include/mp_coefficient.hpp +140 -0
- netgen/include/mptools.hpp +42 -161
- netgen/include/potentialtools.hpp +2 -0
- netgen/include/preconditioner.hpp +21 -21
- netgen/include/sparsematrix_dyn.hpp +6 -7
- netgen/include/special_matrix.hpp +2 -0
- netgen/include/symbolicintegrator.hpp +2 -1
- netgen/libngbla.dylib +0 -0
- netgen/libngcomp.dylib +0 -0
- netgen/libngfem.dylib +0 -0
- netgen/libngla.dylib +0 -0
- netgen/libngsbem.dylib +0 -0
- netgen/libngstd.dylib +0 -0
- ngsolve/__init__.py +1 -0
- ngsolve/cmake/NGSolveConfig.cmake +5 -5
- ngsolve/config/config.py +6 -6
- ngsolve/preconditioners.py +1 -0
- ngsolve/solve_implementation.py +146 -0
- {ngsolve-6.2.2503.dist-info → ngsolve-6.2.2504.post12.dev0.dist-info}/METADATA +2 -2
- {ngsolve-6.2.2503.dist-info → ngsolve-6.2.2504.post12.dev0.dist-info}/RECORD +58 -56
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/Netgen.icns +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/bin/ngscxx +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/bin/ngsld +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/bin/ngsolve.tcl +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/bin/ngspy +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/beam.geo +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/beam.vol +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/chip.in2d +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/chip.vol +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/coil.geo +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/coil.vol +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/coilshield.geo +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/coilshield.vol +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/cube.geo +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/cube.vol +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/d10_DGdoubleglazing.pde +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/d11_chip_nitsche.pde +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/d1_square.pde +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/d2_chip.pde +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/d3_helmholtz.pde +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/d4_cube.pde +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/d5_beam.pde +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/d6_shaft.pde +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/d7_coil.pde +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/d8_coilshield.pde +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/d9_hybridDG.pde +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/doubleglazing.in2d +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/doubleglazing.vol +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/shaft.geo +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/shaft.vol +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/square.in2d +0 -0
- {ngsolve-6.2.2503.data → ngsolve-6.2.2504.post12.dev0.data}/data/share/ngsolve/square.vol +0 -0
- {ngsolve-6.2.2503.dist-info → ngsolve-6.2.2504.post12.dev0.dist-info}/LICENSE +0 -0
- {ngsolve-6.2.2503.dist-info → ngsolve-6.2.2504.post12.dev0.dist-info}/WHEEL +0 -0
- {ngsolve-6.2.2503.dist-info → ngsolve-6.2.2504.post12.dev0.dist-info}/top_level.txt +0 -0
netgen/include/h1amg.hpp
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
#ifndef
|
|
2
|
-
#define
|
|
1
|
+
#ifndef H1AMGxx_HPP_
|
|
2
|
+
#define H1AMGxx_HPP_
|
|
3
3
|
|
|
4
4
|
// #include <la.hpp>
|
|
5
5
|
#include <basematrix.hpp>
|
|
6
6
|
#include <sparsematrix.hpp>
|
|
7
|
+
#include <preconditioner.hpp>
|
|
7
8
|
|
|
8
9
|
namespace ngcomp
|
|
9
10
|
{
|
|
@@ -36,6 +37,65 @@ namespace ngcomp
|
|
|
36
37
|
|
|
37
38
|
virtual void Mult (const ngla::BaseVector & b, ngla::BaseVector & x) const override;
|
|
38
39
|
};
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
template <class SCAL>
|
|
46
|
+
class H1AMG_Preconditioner : public Preconditioner
|
|
47
|
+
{
|
|
48
|
+
shared_ptr<BitArray> freedofs;
|
|
49
|
+
shared_ptr<H1AMG_Matrix<SCAL>> mat;
|
|
50
|
+
|
|
51
|
+
ParallelHashTable<IVec<2>,double> edge_weights_ht;
|
|
52
|
+
ParallelHashTable<IVec<1>,double> vertex_weights_ht;
|
|
53
|
+
|
|
54
|
+
public:
|
|
55
|
+
|
|
56
|
+
static shared_ptr<Preconditioner> CreateBF (shared_ptr<BilinearForm> bfa, const Flags & flags, const string & name)
|
|
57
|
+
{
|
|
58
|
+
if (bfa->GetFESpace()->IsComplex())
|
|
59
|
+
return make_shared<H1AMG_Preconditioner<Complex>> (bfa, flags, name);
|
|
60
|
+
else
|
|
61
|
+
return make_shared<H1AMG_Preconditioner<double>> (bfa, flags, name);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static DocInfo GetDocu ();
|
|
65
|
+
|
|
66
|
+
H1AMG_Preconditioner (shared_ptr<BilinearForm> abfa, const Flags & aflags,
|
|
67
|
+
const string aname = "H1AMG_cprecond")
|
|
68
|
+
: Preconditioner (abfa, aflags, aname)
|
|
69
|
+
{
|
|
70
|
+
if (is_same<SCAL,double>::value)
|
|
71
|
+
cout << IM(3) << "Create H1AMG" << endl;
|
|
72
|
+
else
|
|
73
|
+
cout << IM(3) << "Create H1AMG, complex" << endl;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
virtual void InitLevel (shared_ptr<BitArray> _freedofs) override
|
|
77
|
+
{
|
|
78
|
+
freedofs = _freedofs;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
virtual void FinalizeLevel (const BaseMatrix * matrix) override;
|
|
82
|
+
|
|
83
|
+
virtual void AddElementMatrix (FlatArray<int> dnums,
|
|
84
|
+
FlatMatrix<SCAL> elmat,
|
|
85
|
+
ElementId id,
|
|
86
|
+
LocalHeap & lh) override;
|
|
87
|
+
|
|
88
|
+
virtual void Update () override { ; }
|
|
89
|
+
|
|
90
|
+
virtual const BaseMatrix & GetMatrix() const override
|
|
91
|
+
{
|
|
92
|
+
return *mat;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
39
99
|
}
|
|
40
100
|
|
|
41
101
|
#endif // H1AMG_HPP_
|
netgen/include/integrator.hpp
CHANGED
|
@@ -781,20 +781,14 @@ namespace ngfem
|
|
|
781
781
|
const FiniteElement & volumefel2, int LocalFacetNr2,
|
|
782
782
|
const ElementTransformation & eltrans2, FlatArray<int> & ElVertices2,
|
|
783
783
|
FlatVector<double> elx, FlatVector<double> ely,
|
|
784
|
-
LocalHeap & lh) const
|
|
785
|
-
{
|
|
786
|
-
throw Exception ("FacetBilinearFormIntegrator::ApplyFacetMatrix for inner facets not implemented!");
|
|
787
|
-
}
|
|
784
|
+
LocalHeap & lh) const;
|
|
788
785
|
virtual void
|
|
789
786
|
ApplyFacetMatrix (const FiniteElement & volumefel1, int LocalFacetNr1,
|
|
790
787
|
const ElementTransformation & eltrans1, FlatArray<int> & ElVertices1,
|
|
791
788
|
const FiniteElement & volumefel2, int LocalFacetNr2,
|
|
792
789
|
const ElementTransformation & eltrans2, FlatArray<int> & ElVertices2,
|
|
793
790
|
FlatVector<Complex> elx, FlatVector<Complex> ely,
|
|
794
|
-
LocalHeap & lh) const
|
|
795
|
-
{
|
|
796
|
-
throw Exception ("FacetBilinearFormIntegrator::ApplyFacetMatrix for inner facets not implemented!");
|
|
797
|
-
}
|
|
791
|
+
LocalHeap & lh) const;
|
|
798
792
|
|
|
799
793
|
|
|
800
794
|
virtual void
|
|
@@ -841,19 +835,13 @@ namespace ngfem
|
|
|
841
835
|
const ElementTransformation & eltrans, FlatArray<int> & ElVertices,
|
|
842
836
|
const ElementTransformation & seltrans, FlatArray<int> & SElVertices,
|
|
843
837
|
FlatVector<double> elx, FlatVector<double> ely,
|
|
844
|
-
LocalHeap & lh) const
|
|
845
|
-
{
|
|
846
|
-
throw Exception ("FacetBilinearFormIntegrator::ApplyFacetMatrix for boundary facets not implemented!");
|
|
847
|
-
}
|
|
838
|
+
LocalHeap & lh) const;
|
|
848
839
|
virtual void
|
|
849
840
|
ApplyFacetMatrix (const FiniteElement & volumefel, int LocalFacetNr,
|
|
850
841
|
const ElementTransformation & eltrans, FlatArray<int> & ElVertices,
|
|
851
842
|
const ElementTransformation & seltrans, FlatArray<int> & SElVertices,
|
|
852
843
|
FlatVector<Complex> elx, FlatVector<Complex> ely,
|
|
853
|
-
LocalHeap & lh) const
|
|
854
|
-
{
|
|
855
|
-
throw Exception ("FacetBilinearFormIntegrator::ApplyFacetMatrix for boundary facets not implemented!");
|
|
856
|
-
}
|
|
844
|
+
LocalHeap & lh) const;
|
|
857
845
|
|
|
858
846
|
|
|
859
847
|
// calculate traces in integration points
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#ifndef MP_COEFFICIENT
|
|
2
|
+
#define MP_COEFFICIENT
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
#include "mptools.hpp"
|
|
6
|
+
|
|
7
|
+
namespace ngsbem
|
|
8
|
+
{
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
// ******************** Coefficient Functions *********************
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class SphericalHarmonicsCF : public CoefficientFunction
|
|
15
|
+
{
|
|
16
|
+
SphericalHarmonics<Complex> sh;
|
|
17
|
+
public:
|
|
18
|
+
SphericalHarmonicsCF (int order)
|
|
19
|
+
: CoefficientFunction(1, true), sh(order) { }
|
|
20
|
+
Complex & Coef(int n, int m) { return sh.Coef(n,m); }
|
|
21
|
+
|
|
22
|
+
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
23
|
+
{ throw Exception("real eval not available"); }
|
|
24
|
+
|
|
25
|
+
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
26
|
+
{
|
|
27
|
+
values(0) = sh.Eval(mip.GetPoint());
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
virtual void Evaluate (const BaseMappedIntegrationRule & ir, BareSliceMatrix<Complex> values) const override
|
|
31
|
+
{
|
|
32
|
+
for (int i = 0; i < ir.Size(); i++)
|
|
33
|
+
{
|
|
34
|
+
auto & mip = ir[i];
|
|
35
|
+
values(i,0) = sh.Eval(mip.GetPoint());
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
auto & SH() { return sh; }
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
template <typename entry_type> class RegularMLMultiPoleCF;
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
template <typename RADIAL, typename entry_type=Complex>
|
|
48
|
+
class MultiPoleCF : public CoefficientFunction
|
|
49
|
+
{
|
|
50
|
+
MultiPole<RADIAL, entry_type> mp;
|
|
51
|
+
Vec<3> center;
|
|
52
|
+
public:
|
|
53
|
+
MultiPoleCF (int order, double kappa, Vec<3> acenter, double rtyp = 1)
|
|
54
|
+
: CoefficientFunction(sizeof(entry_type)/sizeof(Complex), true), mp(order, kappa, rtyp), center(acenter) { }
|
|
55
|
+
|
|
56
|
+
entry_type & Coef(int n, int m) { return mp.Coef(n,m); }
|
|
57
|
+
auto & SH() { return mp.SH(); }
|
|
58
|
+
auto & MP() { return mp; }
|
|
59
|
+
Vec<3> Center() const { return center; }
|
|
60
|
+
|
|
61
|
+
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
62
|
+
{ throw Exception("real eval not available"); }
|
|
63
|
+
|
|
64
|
+
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
65
|
+
{
|
|
66
|
+
if constexpr (std::is_same<entry_type, Complex>())
|
|
67
|
+
values(0) = mp.Eval(mip.GetPoint()-center);
|
|
68
|
+
else
|
|
69
|
+
values = mp.Eval(mip.GetPoint()-center);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
template <typename TARGET>
|
|
73
|
+
void ShiftZ (double z, MultiPole<TARGET, entry_type> & target) { mp.ShiftZ(z, target); }
|
|
74
|
+
|
|
75
|
+
using CoefficientFunction::Transform;
|
|
76
|
+
template <typename TARGET>
|
|
77
|
+
void Transform (MultiPoleCF<TARGET, entry_type> & target)
|
|
78
|
+
{
|
|
79
|
+
mp.Transform (target.MP(), target.Center()-center);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
template <typename entry_type>
|
|
84
|
+
class SingularMLMultiPoleCF : public CoefficientFunction
|
|
85
|
+
{
|
|
86
|
+
shared_ptr<SingularMLMultiPole<entry_type>> mlmp;
|
|
87
|
+
public:
|
|
88
|
+
SingularMLMultiPoleCF (Vec<3> center, double r, double kappa)
|
|
89
|
+
: CoefficientFunction(sizeof(entry_type)/sizeof(Complex), true), mlmp{make_shared<SingularMLMultiPole<entry_type>>(center, r, kappa)} { }
|
|
90
|
+
|
|
91
|
+
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
92
|
+
{ throw Exception("real eval not available"); }
|
|
93
|
+
|
|
94
|
+
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
95
|
+
{
|
|
96
|
+
// values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
97
|
+
|
|
98
|
+
if constexpr (std::is_same<entry_type, Complex>())
|
|
99
|
+
values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
100
|
+
else
|
|
101
|
+
values = mlmp->Evaluate(mip.GetPoint());
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
shared_ptr<SingularMLMultiPole<entry_type>> MLMP() const { return mlmp; }
|
|
107
|
+
shared_ptr<RegularMLMultiPoleCF<entry_type>> CreateRegularExpansion(Vec<3> center, double r) const;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
template <typename entry_type>
|
|
112
|
+
class RegularMLMultiPoleCF : public CoefficientFunction
|
|
113
|
+
{
|
|
114
|
+
shared_ptr<RegularMLMultiPole<entry_type>> mlmp;
|
|
115
|
+
public:
|
|
116
|
+
RegularMLMultiPoleCF (shared_ptr<SingularMLMultiPoleCF<entry_type>> asingmp, Vec<3> center, double r)
|
|
117
|
+
: CoefficientFunction(sizeof(entry_type)/sizeof(Complex), true), mlmp{make_shared<RegularMLMultiPole<entry_type>>(asingmp->MLMP(), center, r)} { }
|
|
118
|
+
RegularMLMultiPoleCF (shared_ptr<SingularMLMultiPole<entry_type>> asingmp, Vec<3> center, double r)
|
|
119
|
+
: CoefficientFunction(sizeof(entry_type)/sizeof(Complex), true), mlmp{make_shared<RegularMLMultiPole<entry_type>>(asingmp, center, r)} { }
|
|
120
|
+
|
|
121
|
+
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
122
|
+
{ throw Exception("real eval not available"); }
|
|
123
|
+
|
|
124
|
+
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
125
|
+
{
|
|
126
|
+
// values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
127
|
+
|
|
128
|
+
if constexpr (std::is_same<entry_type, Complex>())
|
|
129
|
+
values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
130
|
+
else
|
|
131
|
+
values = mlmp->Evaluate(mip.GetPoint());
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
shared_ptr<RegularMLMultiPole<entry_type>> MLMP() { return mlmp; }
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
#endif
|
netgen/include/mptools.hpp
CHANGED
|
@@ -218,13 +218,11 @@ namespace ngsbem
|
|
|
218
218
|
class MPSingular
|
|
219
219
|
{
|
|
220
220
|
public:
|
|
221
|
-
/*
|
|
222
221
|
template <typename T>
|
|
223
222
|
static void Eval (int order, double r, double scale, T && values)
|
|
224
223
|
{
|
|
225
224
|
SphericalHankel1(order, r, scale, values);
|
|
226
225
|
}
|
|
227
|
-
*/
|
|
228
226
|
|
|
229
227
|
template <typename T>
|
|
230
228
|
static void Eval (int order, double kappa, double r, double rtyp, T && values)
|
|
@@ -235,7 +233,8 @@ namespace ngsbem
|
|
|
235
233
|
|
|
236
234
|
static double Scale (double kappa, double rtyp)
|
|
237
235
|
{
|
|
238
|
-
return min(1.0, rtyp*kappa);
|
|
236
|
+
// return min(1.0, rtyp*kappa);
|
|
237
|
+
return min(1.0, 0.5*rtyp*kappa);
|
|
239
238
|
}
|
|
240
239
|
};
|
|
241
240
|
|
|
@@ -245,13 +244,11 @@ namespace ngsbem
|
|
|
245
244
|
class MPRegular
|
|
246
245
|
{
|
|
247
246
|
public:
|
|
248
|
-
/*
|
|
249
247
|
template <typename T>
|
|
250
248
|
static void Eval (int order, double r, double scale, T && values)
|
|
251
249
|
{
|
|
252
250
|
SphericalBessel (order, r, 1.0/scale, values);
|
|
253
251
|
}
|
|
254
|
-
*/
|
|
255
252
|
|
|
256
253
|
template <typename T>
|
|
257
254
|
static void Eval (int order, double kappa, double r, double rtyp, T && values)
|
|
@@ -262,7 +259,8 @@ namespace ngsbem
|
|
|
262
259
|
|
|
263
260
|
static double Scale (double kappa, double rtyp)
|
|
264
261
|
{
|
|
265
|
-
return 1.0/ min(1.0, 0.25*rtyp*kappa);
|
|
262
|
+
// return 1.0/ min(1.0, 0.25*rtyp*kappa);
|
|
263
|
+
return 1.0/ min(1.0, 0.5*rtyp*kappa);
|
|
266
264
|
}
|
|
267
265
|
|
|
268
266
|
};
|
|
@@ -276,12 +274,7 @@ namespace ngsbem
|
|
|
276
274
|
SphericalHarmonics<entry_type> sh;
|
|
277
275
|
double kappa;
|
|
278
276
|
double rtyp;
|
|
279
|
-
// double scale;
|
|
280
277
|
public:
|
|
281
|
-
/*
|
|
282
|
-
MultiPole (int aorder, double akappa, double ascale = 1)
|
|
283
|
-
: sh(aorder), kappa(akappa), scale(ascale) { }
|
|
284
|
-
*/
|
|
285
278
|
|
|
286
279
|
MultiPole (int aorder, double akappa, double artyp)
|
|
287
280
|
: sh(aorder), kappa(akappa), rtyp(artyp) { }
|
|
@@ -362,8 +355,8 @@ namespace ngsbem
|
|
|
362
355
|
return;
|
|
363
356
|
}
|
|
364
357
|
|
|
365
|
-
static Timer t("mptool Transform "+ToString(typeid(RADIAL).name())+ToString(typeid(TARGET).name()));
|
|
366
|
-
RegionTimer reg(t);
|
|
358
|
+
// static Timer t("mptool Transform "+ToString(typeid(RADIAL).name())+ToString(typeid(TARGET).name()));
|
|
359
|
+
// RegionTimer reg(t);
|
|
367
360
|
|
|
368
361
|
double len = L2Norm(dist);
|
|
369
362
|
double theta, phi;
|
|
@@ -379,7 +372,10 @@ namespace ngsbem
|
|
|
379
372
|
phi = atan2(dist(1), dist(0));
|
|
380
373
|
|
|
381
374
|
|
|
382
|
-
MultiPole<RADIAL,entry_type> tmp
|
|
375
|
+
// MultiPole<RADIAL,entry_type> tmp{*this};
|
|
376
|
+
MultiPole<RADIAL,entry_type> tmp(Order(), kappa, rtyp);
|
|
377
|
+
tmp.SH().Coefs() = SH().Coefs();
|
|
378
|
+
|
|
383
379
|
tmp.SH().RotateZ(phi);
|
|
384
380
|
tmp.SH().RotateY(theta);
|
|
385
381
|
|
|
@@ -434,11 +430,9 @@ namespace ngsbem
|
|
|
434
430
|
Array<tuple<Vec<3>, Vec<3>, Complex,int>> currents;
|
|
435
431
|
int total_sources;
|
|
436
432
|
|
|
437
|
-
Node (Vec<3> acenter, double ar, int alevel,
|
|
438
|
-
: center(acenter), r(ar), level(alevel), mp(MPOrder(ar*
|
|
439
|
-
// : center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, 1.0)
|
|
433
|
+
Node (Vec<3> acenter, double ar, int alevel, double akappa)
|
|
434
|
+
: center(acenter), r(ar), level(alevel), mp(MPOrder(ar*akappa), akappa, ar) // min(1.0, ar*akappa))
|
|
440
435
|
{
|
|
441
|
-
// cout << "singml, add node, level = " << level << endl;
|
|
442
436
|
if (level < nodes_on_level.Size())
|
|
443
437
|
nodes_on_level[level]++;
|
|
444
438
|
}
|
|
@@ -453,7 +447,7 @@ namespace ngsbem
|
|
|
453
447
|
cc(0) += (i&1) ? r/2 : -r/2;
|
|
454
448
|
cc(1) += (i&2) ? r/2 : -r/2;
|
|
455
449
|
cc(2) += (i&4) ? r/2 : -r/2;
|
|
456
|
-
childs[i] = make_unique<Node> (cc, r/2, level+1,
|
|
450
|
+
childs[i] = make_unique<Node> (cc, r/2, level+1, mp.Kappa());
|
|
457
451
|
}
|
|
458
452
|
}
|
|
459
453
|
|
|
@@ -473,7 +467,8 @@ namespace ngsbem
|
|
|
473
467
|
|
|
474
468
|
charges.Append( tuple{x,c} );
|
|
475
469
|
|
|
476
|
-
if (r*mp.Kappa() < 1e-8) return;
|
|
470
|
+
// if (r*mp.Kappa() < 1e-8) return;
|
|
471
|
+
if (level > 20) return;
|
|
477
472
|
if (charges.Size() < maxdirect && r*mp.Kappa() < 1)
|
|
478
473
|
return;
|
|
479
474
|
|
|
@@ -588,9 +583,17 @@ namespace ngsbem
|
|
|
588
583
|
return sum;
|
|
589
584
|
}
|
|
590
585
|
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
586
|
+
// static Timer t("fmm direct eval"); RegionTimer reg(t);
|
|
587
|
+
if (mp.Kappa() < 1e-8)
|
|
588
|
+
{
|
|
589
|
+
for (auto [x,c] : charges)
|
|
590
|
+
if (double rho = L2Norm(p-x); rho > 0)
|
|
591
|
+
sum += (1/(4*M_PI))*Complex(1,rho*mp.Kappa()) / rho * c;
|
|
592
|
+
}
|
|
593
|
+
else
|
|
594
|
+
for (auto [x,c] : charges)
|
|
595
|
+
if (double rho = L2Norm(p-x); rho > 0)
|
|
596
|
+
sum += (1/(4*M_PI))*exp(Complex(0,rho*mp.Kappa())) / rho * c;
|
|
594
597
|
|
|
595
598
|
for (auto [x,d,c] : dipoles)
|
|
596
599
|
if (double rho = L2Norm(p-x); rho > 0)
|
|
@@ -771,8 +774,8 @@ namespace ngsbem
|
|
|
771
774
|
bool havemp = false;
|
|
772
775
|
|
|
773
776
|
public:
|
|
774
|
-
SingularMLMultiPole (Vec<3> center, double r,
|
|
775
|
-
: root(center, r, 0,
|
|
777
|
+
SingularMLMultiPole (Vec<3> center, double r, double kappa)
|
|
778
|
+
: root(center, r, 0, kappa)
|
|
776
779
|
{
|
|
777
780
|
nodes_on_level = 0;
|
|
778
781
|
nodes_on_level[0] = 1;
|
|
@@ -842,6 +845,7 @@ namespace ngsbem
|
|
|
842
845
|
for (int i = 0; i <= maxlevel; i++)
|
|
843
846
|
cout << "sing " << i << ": " << nodes_on_level[i] << endl;
|
|
844
847
|
*/
|
|
848
|
+
|
|
845
849
|
root.CalcTotalSources();
|
|
846
850
|
root.CalcMP();
|
|
847
851
|
|
|
@@ -886,8 +890,8 @@ namespace ngsbem
|
|
|
886
890
|
|
|
887
891
|
Array<const typename SingularMLMultiPole<elem_type>::Node*> singnodes;
|
|
888
892
|
|
|
889
|
-
Node (Vec<3> acenter, double ar, int alevel,
|
|
890
|
-
: center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, 1.0/min(1.0, 0.25*r*kappa))
|
|
893
|
+
Node (Vec<3> acenter, double ar, int alevel, double kappa)
|
|
894
|
+
: center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, ar) // 1.0/min(1.0, 0.25*r*kappa))
|
|
891
895
|
// : center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, 1.0)
|
|
892
896
|
{
|
|
893
897
|
if (level < nodes_on_level.Size())
|
|
@@ -905,7 +909,7 @@ namespace ngsbem
|
|
|
905
909
|
cc(0) += (i&1) ? r/2 : -r/2;
|
|
906
910
|
cc(1) += (i&2) ? r/2 : -r/2;
|
|
907
911
|
cc(2) += (i&4) ? r/2 : -r/2;
|
|
908
|
-
childs[i] = make_unique<Node> (cc, r/2, level+1,
|
|
912
|
+
childs[i] = make_unique<Node> (cc, r/2, level+1, mp.Kappa());
|
|
909
913
|
}
|
|
910
914
|
}
|
|
911
915
|
|
|
@@ -1027,7 +1031,7 @@ namespace ngsbem
|
|
|
1027
1031
|
sum = mp.Eval(p-center);
|
|
1028
1032
|
|
|
1029
1033
|
|
|
1030
|
-
static Timer t("mptool direct evaluate"); RegionTimer r(t);
|
|
1034
|
+
// static Timer t("mptool direct evaluate"); RegionTimer r(t);
|
|
1031
1035
|
for (auto sn : singnodes)
|
|
1032
1036
|
sum += sn->EvaluateMP(p);
|
|
1033
1037
|
|
|
@@ -1089,7 +1093,8 @@ namespace ngsbem
|
|
|
1089
1093
|
|
|
1090
1094
|
targets.Append( x );
|
|
1091
1095
|
|
|
1092
|
-
if (r*mp.Kappa() < 1e-8) return;
|
|
1096
|
+
// if (r*mp.Kappa() < 1e-8) return;
|
|
1097
|
+
if (level > 20) return;
|
|
1093
1098
|
if (targets.Size() < maxdirect && r*mp.Kappa() < 1)
|
|
1094
1099
|
return;
|
|
1095
1100
|
|
|
@@ -1145,8 +1150,8 @@ namespace ngsbem
|
|
|
1145
1150
|
shared_ptr<SingularMLMultiPole<elem_type>> singmp;
|
|
1146
1151
|
|
|
1147
1152
|
public:
|
|
1148
|
-
RegularMLMultiPole (shared_ptr<SingularMLMultiPole<elem_type>> asingmp, Vec<3> center, double r
|
|
1149
|
-
: root(center, r, 0,
|
|
1153
|
+
RegularMLMultiPole (shared_ptr<SingularMLMultiPole<elem_type>> asingmp, Vec<3> center, double r)
|
|
1154
|
+
: root(center, r, 0, asingmp->Kappa()), singmp(asingmp)
|
|
1150
1155
|
{
|
|
1151
1156
|
if (!singmp->havemp) throw Exception("first call Calc for singular MP");
|
|
1152
1157
|
|
|
@@ -1175,8 +1180,8 @@ namespace ngsbem
|
|
|
1175
1180
|
}
|
|
1176
1181
|
}
|
|
1177
1182
|
|
|
1178
|
-
RegularMLMultiPole (Vec<3> center, double r,
|
|
1179
|
-
: root(center, r, 0,
|
|
1183
|
+
RegularMLMultiPole (Vec<3> center, double r, double kappa)
|
|
1184
|
+
: root(center, r, 0, kappa)
|
|
1180
1185
|
{
|
|
1181
1186
|
nodes_on_level = 0;
|
|
1182
1187
|
nodes_on_level[0] = 1;
|
|
@@ -1189,6 +1194,8 @@ namespace ngsbem
|
|
|
1189
1194
|
|
|
1190
1195
|
void CalcMP(shared_ptr<SingularMLMultiPole<elem_type>> asingmp)
|
|
1191
1196
|
{
|
|
1197
|
+
static Timer t("mptool regular MLMP"); RegionTimer rg(t);
|
|
1198
|
+
|
|
1192
1199
|
singmp = asingmp;
|
|
1193
1200
|
|
|
1194
1201
|
root.CalcTotalTargets();
|
|
@@ -1205,6 +1212,7 @@ namespace ngsbem
|
|
|
1205
1212
|
cout << "reg " << i << ": " << RegularMLMultiPole::nodes_on_level[i] << endl;
|
|
1206
1213
|
*/
|
|
1207
1214
|
|
|
1215
|
+
static Timer tloc("mptool regular localize expansion"); RegionTimer rloc(tloc);
|
|
1208
1216
|
root.LocalizeExpansion(false);
|
|
1209
1217
|
}
|
|
1210
1218
|
|
|
@@ -1251,132 +1259,5 @@ namespace ngsbem
|
|
|
1251
1259
|
|
|
1252
1260
|
|
|
1253
1261
|
|
|
1254
|
-
// ******************** Coefficient Functions *********************
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
class SphericalHarmonicsCF : public CoefficientFunction
|
|
1258
|
-
{
|
|
1259
|
-
SphericalHarmonics<Complex> sh;
|
|
1260
|
-
public:
|
|
1261
|
-
SphericalHarmonicsCF (int order)
|
|
1262
|
-
: CoefficientFunction(1, true), sh(order) { }
|
|
1263
|
-
Complex & Coef(int n, int m) { return sh.Coef(n,m); }
|
|
1264
|
-
|
|
1265
|
-
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
1266
|
-
{ throw Exception("real eval not available"); }
|
|
1267
|
-
|
|
1268
|
-
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
1269
|
-
{
|
|
1270
|
-
values(0) = sh.Eval(mip.GetPoint());
|
|
1271
|
-
}
|
|
1272
|
-
|
|
1273
|
-
virtual void Evaluate (const BaseMappedIntegrationRule & ir, BareSliceMatrix<Complex> values) const override
|
|
1274
|
-
{
|
|
1275
|
-
for (int i = 0; i < ir.Size(); i++)
|
|
1276
|
-
{
|
|
1277
|
-
auto & mip = ir[i];
|
|
1278
|
-
values(i,0) = sh.Eval(mip.GetPoint());
|
|
1279
|
-
}
|
|
1280
|
-
}
|
|
1281
|
-
|
|
1282
|
-
auto & SH() { return sh; }
|
|
1283
|
-
};
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
template <typename entry_type> class RegularMLMultiPoleCF;
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
template <typename RADIAL, typename entry_type=Complex>
|
|
1291
|
-
class MultiPoleCF : public CoefficientFunction
|
|
1292
|
-
{
|
|
1293
|
-
MultiPole<RADIAL, entry_type> mp;
|
|
1294
|
-
Vec<3> center;
|
|
1295
|
-
public:
|
|
1296
|
-
MultiPoleCF (int order, double kappa, Vec<3> acenter, double scale = 1)
|
|
1297
|
-
: CoefficientFunction(sizeof(entry_type)/sizeof(Complex), true), mp(order, kappa, scale), center(acenter) { }
|
|
1298
|
-
|
|
1299
|
-
entry_type & Coef(int n, int m) { return mp.Coef(n,m); }
|
|
1300
|
-
auto & SH() { return mp.SH(); }
|
|
1301
|
-
auto & MP() { return mp; }
|
|
1302
|
-
Vec<3> Center() const { return center; }
|
|
1303
|
-
|
|
1304
|
-
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
1305
|
-
{ throw Exception("real eval not available"); }
|
|
1306
|
-
|
|
1307
|
-
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
1308
|
-
{
|
|
1309
|
-
if constexpr (std::is_same<entry_type, Complex>())
|
|
1310
|
-
values(0) = mp.Eval(mip.GetPoint()-center);
|
|
1311
|
-
else
|
|
1312
|
-
values = mp.Eval(mip.GetPoint()-center);
|
|
1313
|
-
}
|
|
1314
|
-
|
|
1315
|
-
template <typename TARGET>
|
|
1316
|
-
void ShiftZ (double z, MultiPole<TARGET, entry_type> & target) { mp.ShiftZ(z, target); }
|
|
1317
|
-
|
|
1318
|
-
using CoefficientFunction::Transform;
|
|
1319
|
-
template <typename TARGET>
|
|
1320
|
-
void Transform (MultiPoleCF<TARGET, entry_type> & target)
|
|
1321
|
-
{
|
|
1322
|
-
mp.Transform (target.MP(), target.Center()-center);
|
|
1323
|
-
}
|
|
1324
|
-
};
|
|
1325
|
-
|
|
1326
|
-
template <typename entry_type>
|
|
1327
|
-
class SingularMLMultiPoleCF : public CoefficientFunction
|
|
1328
|
-
{
|
|
1329
|
-
shared_ptr<SingularMLMultiPole<entry_type>> mlmp;
|
|
1330
|
-
public:
|
|
1331
|
-
SingularMLMultiPoleCF (Vec<3> center, double r, int order, double kappa)
|
|
1332
|
-
: CoefficientFunction(sizeof(entry_type)/sizeof(Complex), true), mlmp{make_shared<SingularMLMultiPole<entry_type>>(center, r, order, kappa)} { }
|
|
1333
|
-
|
|
1334
|
-
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
1335
|
-
{ throw Exception("real eval not available"); }
|
|
1336
|
-
|
|
1337
|
-
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
1338
|
-
{
|
|
1339
|
-
// values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
1340
|
-
|
|
1341
|
-
if constexpr (std::is_same<entry_type, Complex>())
|
|
1342
|
-
values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
1343
|
-
else
|
|
1344
|
-
values = mlmp->Evaluate(mip.GetPoint());
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
}
|
|
1348
|
-
|
|
1349
|
-
shared_ptr<SingularMLMultiPole<entry_type>> MLMP() const { return mlmp; }
|
|
1350
|
-
shared_ptr<RegularMLMultiPoleCF<entry_type>> CreateRegularExpansion(Vec<3> center, double r) const;
|
|
1351
|
-
};
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
template <typename entry_type>
|
|
1355
|
-
class RegularMLMultiPoleCF : public CoefficientFunction
|
|
1356
|
-
{
|
|
1357
|
-
shared_ptr<RegularMLMultiPole<entry_type>> mlmp;
|
|
1358
|
-
public:
|
|
1359
|
-
RegularMLMultiPoleCF (shared_ptr<SingularMLMultiPoleCF<entry_type>> asingmp, Vec<3> center, double r, int order)
|
|
1360
|
-
: CoefficientFunction(sizeof(entry_type)/sizeof(Complex), true), mlmp{make_shared<RegularMLMultiPole<entry_type>>(asingmp->MLMP(), center, r, order)} { }
|
|
1361
|
-
RegularMLMultiPoleCF (shared_ptr<SingularMLMultiPole<entry_type>> asingmp, Vec<3> center, double r, int order)
|
|
1362
|
-
: CoefficientFunction(sizeof(entry_type)/sizeof(Complex), true), mlmp{make_shared<RegularMLMultiPole<entry_type>>(asingmp, center, r, order)} { }
|
|
1363
|
-
|
|
1364
|
-
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
1365
|
-
{ throw Exception("real eval not available"); }
|
|
1366
|
-
|
|
1367
|
-
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
1368
|
-
{
|
|
1369
|
-
// values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
1370
|
-
|
|
1371
|
-
if constexpr (std::is_same<entry_type, Complex>())
|
|
1372
|
-
values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
1373
|
-
else
|
|
1374
|
-
values = mlmp->Evaluate(mip.GetPoint());
|
|
1375
|
-
}
|
|
1376
|
-
|
|
1377
|
-
shared_ptr<RegularMLMultiPole<entry_type>> MLMP() { return mlmp; }
|
|
1378
|
-
};
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
1262
|
}
|
|
1382
1263
|
#endif
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
|
|
13
13
|
namespace ngsbem
|
|
14
14
|
{
|
|
15
|
+
|
|
16
|
+
extern void AddChargeDensity (SingularMLMultiPole<Complex> & mp, shared_ptr<CoefficientFunction> current, ngcomp::Region reg);
|
|
15
17
|
|
|
16
18
|
extern void AddCurrentDensity (SingularMLMultiPole<Vec<3,Complex>> & mp, shared_ptr<CoefficientFunction> current, ngcomp::Region reg);
|
|
17
19
|
|