ngsolve 6.2.2502__cp310-cp310-win_amd64.whl → 6.2.2504__cp310-cp310-win_amd64.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/fespace.hpp +3 -2
- netgen/include/integrator.hpp +4 -16
- netgen/include/intrules_SauterSchwab.hpp +25 -0
- netgen/include/mp_coefficient.hpp +140 -0
- netgen/include/mptools.hpp +106 -161
- netgen/include/potentialtools.hpp +20 -0
- netgen/include/prolongation.hpp +126 -3
- netgen/include/sparsematrix_impl.hpp +71 -5
- netgen/include/symbolicintegrator.hpp +1 -0
- netgen/include/tangentialfacetfespace.hpp +7 -22
- netgen/lib/libngsolve.lib +0 -0
- netgen/libngsolve.dll +0 -0
- ngsolve/__init__.py +1 -0
- ngsolve/cmake/NGSolveConfig.cmake +5 -5
- ngsolve/cmake/ngsolve-targets.cmake +9 -2
- ngsolve/config/config.py +5 -5
- ngsolve/ngslib.pyd +0 -0
- ngsolve/solve_implementation.py +146 -0
- {ngsolve-6.2.2502.dist-info → ngsolve-6.2.2504.dist-info}/METADATA +2 -2
- {ngsolve-6.2.2502.dist-info → ngsolve-6.2.2504.dist-info}/RECORD +52 -48
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/Scripts/ngsolve.tcl +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/beam.geo +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/beam.vol +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/chip.in2d +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/chip.vol +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/coil.geo +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/coil.vol +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/coilshield.geo +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/coilshield.vol +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/cube.geo +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/cube.vol +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d10_DGdoubleglazing.pde +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d11_chip_nitsche.pde +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d1_square.pde +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d2_chip.pde +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d3_helmholtz.pde +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d4_cube.pde +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d5_beam.pde +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d6_shaft.pde +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d7_coil.pde +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d8_coilshield.pde +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d9_hybridDG.pde +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/doubleglazing.in2d +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/doubleglazing.vol +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/shaft.geo +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/shaft.vol +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/square.in2d +0 -0
- {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/square.vol +0 -0
- {ngsolve-6.2.2502.dist-info → ngsolve-6.2.2504.dist-info}/LICENSE +0 -0
- {ngsolve-6.2.2502.dist-info → ngsolve-6.2.2504.dist-info}/WHEEL +0 -0
- {ngsolve-6.2.2502.dist-info → ngsolve-6.2.2504.dist-info}/top_level.txt +0 -0
netgen/include/mptools.hpp
CHANGED
|
@@ -10,9 +10,16 @@
|
|
|
10
10
|
#include <coefficient.hpp>
|
|
11
11
|
#include <recursive_pol.hpp>
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
|
|
14
|
+
namespace ngcomp
|
|
14
15
|
{
|
|
16
|
+
class Region;
|
|
17
|
+
}
|
|
15
18
|
|
|
19
|
+
namespace ngsbem
|
|
20
|
+
{
|
|
21
|
+
using namespace ngfem;
|
|
22
|
+
|
|
16
23
|
|
|
17
24
|
template <typename entry_type = Complex>
|
|
18
25
|
class NGS_DLL_HEADER SphericalHarmonics
|
|
@@ -216,17 +223,46 @@ namespace ngfem
|
|
|
216
223
|
{
|
|
217
224
|
SphericalHankel1(order, r, scale, values);
|
|
218
225
|
}
|
|
226
|
+
|
|
227
|
+
template <typename T>
|
|
228
|
+
static void Eval (int order, double kappa, double r, double rtyp, T && values)
|
|
229
|
+
{
|
|
230
|
+
double scale = Scale(kappa, rtyp);
|
|
231
|
+
SphericalHankel1(order, r*kappa, scale, values);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
static double Scale (double kappa, double rtyp)
|
|
235
|
+
{
|
|
236
|
+
// return min(1.0, rtyp*kappa);
|
|
237
|
+
return min(1.0, 0.5*rtyp*kappa);
|
|
238
|
+
}
|
|
219
239
|
};
|
|
240
|
+
|
|
241
|
+
|
|
220
242
|
|
|
221
243
|
// jn
|
|
222
244
|
class MPRegular
|
|
223
245
|
{
|
|
224
|
-
public:
|
|
246
|
+
public:
|
|
225
247
|
template <typename T>
|
|
226
248
|
static void Eval (int order, double r, double scale, T && values)
|
|
227
249
|
{
|
|
228
250
|
SphericalBessel (order, r, 1.0/scale, values);
|
|
229
251
|
}
|
|
252
|
+
|
|
253
|
+
template <typename T>
|
|
254
|
+
static void Eval (int order, double kappa, double r, double rtyp, T && values)
|
|
255
|
+
{
|
|
256
|
+
double scale = Scale(kappa, rtyp);
|
|
257
|
+
SphericalBessel (order, r*kappa, 1.0/scale, values);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
static double Scale (double kappa, double rtyp)
|
|
261
|
+
{
|
|
262
|
+
// return 1.0/ min(1.0, 0.25*rtyp*kappa);
|
|
263
|
+
return 1.0/ min(1.0, 0.5*rtyp*kappa);
|
|
264
|
+
}
|
|
265
|
+
|
|
230
266
|
};
|
|
231
267
|
|
|
232
268
|
|
|
@@ -237,22 +273,25 @@ namespace ngfem
|
|
|
237
273
|
{
|
|
238
274
|
SphericalHarmonics<entry_type> sh;
|
|
239
275
|
double kappa;
|
|
240
|
-
double
|
|
276
|
+
double rtyp;
|
|
241
277
|
public:
|
|
242
|
-
MultiPole (int aorder, double akappa, double ascale = 1)
|
|
243
|
-
: sh(aorder), kappa(akappa), scale(ascale) { }
|
|
244
278
|
|
|
279
|
+
MultiPole (int aorder, double akappa, double artyp)
|
|
280
|
+
: sh(aorder), kappa(akappa), rtyp(artyp) { }
|
|
281
|
+
|
|
282
|
+
|
|
245
283
|
entry_type & Coef(int n, int m) { return sh.Coef(n,m); }
|
|
246
284
|
auto & SH() { return sh; }
|
|
247
285
|
const auto & SH() const { return sh; }
|
|
248
286
|
double Kappa() const { return kappa; }
|
|
249
|
-
double Scale() const { return
|
|
287
|
+
double Scale() const { return RADIAL::Scale(kappa, rtyp); }
|
|
288
|
+
double RTyp() const { return rtyp; }
|
|
250
289
|
int Order() const { return sh.Order(); }
|
|
251
290
|
|
|
252
291
|
MultiPole Truncate(int neworder) const
|
|
253
292
|
{
|
|
254
293
|
if (neworder > sh.Order()) neworder=sh.Order();
|
|
255
|
-
MultiPole nmp(neworder, kappa);
|
|
294
|
+
MultiPole nmp(neworder, kappa, rtyp);
|
|
256
295
|
nmp.sh.Coefs() = sh.Coefs().Range(sqr(neworder+1));
|
|
257
296
|
return nmp;
|
|
258
297
|
}
|
|
@@ -271,15 +310,27 @@ namespace ngfem
|
|
|
271
310
|
void AddDipole (Vec<3> x, Vec<3> d, entry_type c);
|
|
272
311
|
void AddCurrent (Vec<3> ap, Vec<3> ep, Complex j, int num=100);
|
|
273
312
|
|
|
274
|
-
|
|
313
|
+
/*
|
|
275
314
|
void ChangeScaleTo (double newscale)
|
|
276
315
|
{
|
|
277
|
-
double fac =
|
|
316
|
+
double fac = Scale()/newscale;
|
|
278
317
|
double prod = 1;
|
|
279
318
|
for (int n = 0; n <= sh.Order(); n++, prod*= fac)
|
|
280
319
|
sh.CoefsN(n) *= prod;
|
|
281
320
|
scale = newscale;
|
|
282
321
|
}
|
|
322
|
+
*/
|
|
323
|
+
void ChangeRTypTo (double new_rtyp)
|
|
324
|
+
{
|
|
325
|
+
// double fac = Scale()/newscale;
|
|
326
|
+
double fac = RADIAL::Scale(kappa, rtyp) / RADIAL::Scale(kappa, new_rtyp);
|
|
327
|
+
double prod = 1;
|
|
328
|
+
for (int n = 0; n <= sh.Order(); n++, prod*= fac)
|
|
329
|
+
sh.CoefsN(n) *= prod;
|
|
330
|
+
// scale = newscale;
|
|
331
|
+
rtyp = new_rtyp;
|
|
332
|
+
}
|
|
333
|
+
|
|
283
334
|
|
|
284
335
|
Vector<double> Spectrum (bool scaled) const
|
|
285
336
|
{
|
|
@@ -288,7 +339,7 @@ namespace ngfem
|
|
|
288
339
|
for (int n = 0; n <= Order(); n++)
|
|
289
340
|
{
|
|
290
341
|
spec(n) = fac * L2Norm2(sh.CoefsN(n));
|
|
291
|
-
if (!scaled) fac *= sqr(
|
|
342
|
+
if (!scaled) fac *= sqr(Scale());
|
|
292
343
|
}
|
|
293
344
|
return spec;
|
|
294
345
|
}
|
|
@@ -304,8 +355,8 @@ namespace ngfem
|
|
|
304
355
|
return;
|
|
305
356
|
}
|
|
306
357
|
|
|
307
|
-
static Timer t("mptool Transform "+ToString(typeid(RADIAL).name())+ToString(typeid(TARGET).name()));
|
|
308
|
-
RegionTimer reg(t);
|
|
358
|
+
// static Timer t("mptool Transform "+ToString(typeid(RADIAL).name())+ToString(typeid(TARGET).name()));
|
|
359
|
+
// RegionTimer reg(t);
|
|
309
360
|
|
|
310
361
|
double len = L2Norm(dist);
|
|
311
362
|
double theta, phi;
|
|
@@ -321,7 +372,10 @@ namespace ngfem
|
|
|
321
372
|
phi = atan2(dist(1), dist(0));
|
|
322
373
|
|
|
323
374
|
|
|
324
|
-
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
|
+
|
|
325
379
|
tmp.SH().RotateZ(phi);
|
|
326
380
|
tmp.SH().RotateY(theta);
|
|
327
381
|
|
|
@@ -376,11 +430,9 @@ namespace ngfem
|
|
|
376
430
|
Array<tuple<Vec<3>, Vec<3>, Complex,int>> currents;
|
|
377
431
|
int total_sources;
|
|
378
432
|
|
|
379
|
-
Node (Vec<3> acenter, double ar, int alevel,
|
|
380
|
-
: center(acenter), r(ar), level(alevel), mp(MPOrder(ar*
|
|
381
|
-
// : 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))
|
|
382
435
|
{
|
|
383
|
-
// cout << "singml, add node, level = " << level << endl;
|
|
384
436
|
if (level < nodes_on_level.Size())
|
|
385
437
|
nodes_on_level[level]++;
|
|
386
438
|
}
|
|
@@ -395,7 +447,7 @@ namespace ngfem
|
|
|
395
447
|
cc(0) += (i&1) ? r/2 : -r/2;
|
|
396
448
|
cc(1) += (i&2) ? r/2 : -r/2;
|
|
397
449
|
cc(2) += (i&4) ? r/2 : -r/2;
|
|
398
|
-
childs[i] = make_unique<Node> (cc, r/2, level+1,
|
|
450
|
+
childs[i] = make_unique<Node> (cc, r/2, level+1, mp.Kappa());
|
|
399
451
|
}
|
|
400
452
|
}
|
|
401
453
|
|
|
@@ -415,7 +467,8 @@ namespace ngfem
|
|
|
415
467
|
|
|
416
468
|
charges.Append( tuple{x,c} );
|
|
417
469
|
|
|
418
|
-
if (r*mp.Kappa() < 1e-8) return;
|
|
470
|
+
// if (r*mp.Kappa() < 1e-8) return;
|
|
471
|
+
if (level > 20) return;
|
|
419
472
|
if (charges.Size() < maxdirect && r*mp.Kappa() < 1)
|
|
420
473
|
return;
|
|
421
474
|
|
|
@@ -530,9 +583,17 @@ namespace ngfem
|
|
|
530
583
|
return sum;
|
|
531
584
|
}
|
|
532
585
|
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
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;
|
|
536
597
|
|
|
537
598
|
for (auto [x,d,c] : dipoles)
|
|
538
599
|
if (double rho = L2Norm(p-x); rho > 0)
|
|
@@ -570,7 +631,7 @@ namespace ngfem
|
|
|
570
631
|
|
|
571
632
|
entry_type EvaluateDeriv(Vec<3> p, Vec<3> d) const
|
|
572
633
|
{
|
|
573
|
-
entry_type sum
|
|
634
|
+
entry_type sum{0.0};
|
|
574
635
|
if (childs[0])
|
|
575
636
|
{
|
|
576
637
|
for (auto & child : childs)
|
|
@@ -625,7 +686,7 @@ namespace ngfem
|
|
|
625
686
|
{
|
|
626
687
|
if (charges.Size()+dipoles.Size()+currents.Size() == 0)
|
|
627
688
|
{
|
|
628
|
-
mp = MultiPole<MPSingular,entry_type> (-1, mp.Kappa());
|
|
689
|
+
mp = MultiPole<MPSingular,entry_type> (-1, mp.Kappa(), 1.);
|
|
629
690
|
return;
|
|
630
691
|
}
|
|
631
692
|
|
|
@@ -713,8 +774,8 @@ namespace ngfem
|
|
|
713
774
|
bool havemp = false;
|
|
714
775
|
|
|
715
776
|
public:
|
|
716
|
-
SingularMLMultiPole (Vec<3> center, double r,
|
|
717
|
-
: root(center, r, 0,
|
|
777
|
+
SingularMLMultiPole (Vec<3> center, double r, double kappa)
|
|
778
|
+
: root(center, r, 0, kappa)
|
|
718
779
|
{
|
|
719
780
|
nodes_on_level = 0;
|
|
720
781
|
nodes_on_level[0] = 1;
|
|
@@ -722,12 +783,12 @@ namespace ngfem
|
|
|
722
783
|
|
|
723
784
|
double Kappa() const { return root.mp.Kappa(); }
|
|
724
785
|
|
|
725
|
-
void AddCharge(Vec<3> x,
|
|
786
|
+
void AddCharge(Vec<3> x, entry_type c)
|
|
726
787
|
{
|
|
727
788
|
root.AddCharge(x, c);
|
|
728
789
|
}
|
|
729
790
|
|
|
730
|
-
void AddDipole(Vec<3> x, Vec<3> d,
|
|
791
|
+
void AddDipole(Vec<3> x, Vec<3> d, entry_type c)
|
|
731
792
|
{
|
|
732
793
|
root.AddDipole(x, d, c);
|
|
733
794
|
}
|
|
@@ -756,7 +817,7 @@ namespace ngfem
|
|
|
756
817
|
}
|
|
757
818
|
*/
|
|
758
819
|
}
|
|
759
|
-
|
|
820
|
+
|
|
760
821
|
void Print (ostream & ost) const
|
|
761
822
|
{
|
|
762
823
|
root.Print(ost);
|
|
@@ -784,6 +845,7 @@ namespace ngfem
|
|
|
784
845
|
for (int i = 0; i <= maxlevel; i++)
|
|
785
846
|
cout << "sing " << i << ": " << nodes_on_level[i] << endl;
|
|
786
847
|
*/
|
|
848
|
+
|
|
787
849
|
root.CalcTotalSources();
|
|
788
850
|
root.CalcMP();
|
|
789
851
|
|
|
@@ -828,8 +890,8 @@ namespace ngfem
|
|
|
828
890
|
|
|
829
891
|
Array<const typename SingularMLMultiPole<elem_type>::Node*> singnodes;
|
|
830
892
|
|
|
831
|
-
Node (Vec<3> acenter, double ar, int alevel,
|
|
832
|
-
: 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))
|
|
833
895
|
// : center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, 1.0)
|
|
834
896
|
{
|
|
835
897
|
if (level < nodes_on_level.Size())
|
|
@@ -847,7 +909,7 @@ namespace ngfem
|
|
|
847
909
|
cc(0) += (i&1) ? r/2 : -r/2;
|
|
848
910
|
cc(1) += (i&2) ? r/2 : -r/2;
|
|
849
911
|
cc(2) += (i&4) ? r/2 : -r/2;
|
|
850
|
-
childs[i] = make_unique<Node> (cc, r/2, level+1,
|
|
912
|
+
childs[i] = make_unique<Node> (cc, r/2, level+1, mp.Kappa());
|
|
851
913
|
}
|
|
852
914
|
}
|
|
853
915
|
|
|
@@ -940,7 +1002,7 @@ namespace ngfem
|
|
|
940
1002
|
mp.TransformAdd (ch->mp, ch->center-center);
|
|
941
1003
|
ch->LocalizeExpansion(allow_refine);
|
|
942
1004
|
}
|
|
943
|
-
mp = MultiPole<MPRegular,elem_type>(-1, mp.Kappa());
|
|
1005
|
+
mp = MultiPole<MPRegular,elem_type>(-1, mp.Kappa(), 1.);
|
|
944
1006
|
//mp.SH().Coefs()=0.0;
|
|
945
1007
|
}
|
|
946
1008
|
}
|
|
@@ -969,7 +1031,7 @@ namespace ngfem
|
|
|
969
1031
|
sum = mp.Eval(p-center);
|
|
970
1032
|
|
|
971
1033
|
|
|
972
|
-
static Timer t("mptool direct evaluate"); RegionTimer r(t);
|
|
1034
|
+
// static Timer t("mptool direct evaluate"); RegionTimer r(t);
|
|
973
1035
|
for (auto sn : singnodes)
|
|
974
1036
|
sum += sn->EvaluateMP(p);
|
|
975
1037
|
|
|
@@ -1031,7 +1093,8 @@ namespace ngfem
|
|
|
1031
1093
|
|
|
1032
1094
|
targets.Append( x );
|
|
1033
1095
|
|
|
1034
|
-
if (r*mp.Kappa() < 1e-8) return;
|
|
1096
|
+
// if (r*mp.Kappa() < 1e-8) return;
|
|
1097
|
+
if (level > 20) return;
|
|
1035
1098
|
if (targets.Size() < maxdirect && r*mp.Kappa() < 1)
|
|
1036
1099
|
return;
|
|
1037
1100
|
|
|
@@ -1064,7 +1127,7 @@ namespace ngfem
|
|
|
1064
1127
|
}
|
|
1065
1128
|
|
|
1066
1129
|
if (total_targets == 0)
|
|
1067
|
-
mp = MultiPole<MPRegular>(-1, mp.Kappa());
|
|
1130
|
+
mp = MultiPole<MPRegular,elem_type>(-1, mp.Kappa(),1.);
|
|
1068
1131
|
}
|
|
1069
1132
|
|
|
1070
1133
|
|
|
@@ -1087,8 +1150,8 @@ namespace ngfem
|
|
|
1087
1150
|
shared_ptr<SingularMLMultiPole<elem_type>> singmp;
|
|
1088
1151
|
|
|
1089
1152
|
public:
|
|
1090
|
-
RegularMLMultiPole (shared_ptr<SingularMLMultiPole<elem_type>> asingmp, Vec<3> center, double r
|
|
1091
|
-
: 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)
|
|
1092
1155
|
{
|
|
1093
1156
|
if (!singmp->havemp) throw Exception("first call Calc for singular MP");
|
|
1094
1157
|
|
|
@@ -1117,8 +1180,8 @@ namespace ngfem
|
|
|
1117
1180
|
}
|
|
1118
1181
|
}
|
|
1119
1182
|
|
|
1120
|
-
RegularMLMultiPole (Vec<3> center, double r,
|
|
1121
|
-
: root(center, r, 0,
|
|
1183
|
+
RegularMLMultiPole (Vec<3> center, double r, double kappa)
|
|
1184
|
+
: root(center, r, 0, kappa)
|
|
1122
1185
|
{
|
|
1123
1186
|
nodes_on_level = 0;
|
|
1124
1187
|
nodes_on_level[0] = 1;
|
|
@@ -1131,6 +1194,8 @@ namespace ngfem
|
|
|
1131
1194
|
|
|
1132
1195
|
void CalcMP(shared_ptr<SingularMLMultiPole<elem_type>> asingmp)
|
|
1133
1196
|
{
|
|
1197
|
+
static Timer t("mptool regular MLMP"); RegionTimer rg(t);
|
|
1198
|
+
|
|
1134
1199
|
singmp = asingmp;
|
|
1135
1200
|
|
|
1136
1201
|
root.CalcTotalTargets();
|
|
@@ -1147,6 +1212,7 @@ namespace ngfem
|
|
|
1147
1212
|
cout << "reg " << i << ": " << RegularMLMultiPole::nodes_on_level[i] << endl;
|
|
1148
1213
|
*/
|
|
1149
1214
|
|
|
1215
|
+
static Timer tloc("mptool regular localize expansion"); RegionTimer rloc(tloc);
|
|
1150
1216
|
root.LocalizeExpansion(false);
|
|
1151
1217
|
}
|
|
1152
1218
|
|
|
@@ -1193,126 +1259,5 @@ namespace ngfem
|
|
|
1193
1259
|
|
|
1194
1260
|
|
|
1195
1261
|
|
|
1196
|
-
// ******************** Coefficient Functions *********************
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
class SphericalHarmonicsCF : public CoefficientFunction
|
|
1200
|
-
{
|
|
1201
|
-
SphericalHarmonics<Complex> sh;
|
|
1202
|
-
public:
|
|
1203
|
-
SphericalHarmonicsCF (int order)
|
|
1204
|
-
: CoefficientFunction(1, true), sh(order) { }
|
|
1205
|
-
Complex & Coef(int n, int m) { return sh.Coef(n,m); }
|
|
1206
|
-
|
|
1207
|
-
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
1208
|
-
{ throw Exception("real eval not available"); }
|
|
1209
|
-
|
|
1210
|
-
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
1211
|
-
{
|
|
1212
|
-
values(0) = sh.Eval(mip.GetPoint());
|
|
1213
|
-
}
|
|
1214
|
-
|
|
1215
|
-
virtual void Evaluate (const BaseMappedIntegrationRule & ir, BareSliceMatrix<Complex> values) const override
|
|
1216
|
-
{
|
|
1217
|
-
for (int i = 0; i < ir.Size(); i++)
|
|
1218
|
-
{
|
|
1219
|
-
auto & mip = ir[i];
|
|
1220
|
-
values(i,0) = sh.Eval(mip.GetPoint());
|
|
1221
|
-
}
|
|
1222
|
-
}
|
|
1223
|
-
|
|
1224
|
-
auto & SH() { return sh; }
|
|
1225
|
-
};
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
template <typename RADIAL, typename entry_type=Complex>
|
|
1230
|
-
class MultiPoleCF : public CoefficientFunction
|
|
1231
|
-
{
|
|
1232
|
-
MultiPole<RADIAL, entry_type> mp;
|
|
1233
|
-
Vec<3> center;
|
|
1234
|
-
public:
|
|
1235
|
-
MultiPoleCF (int order, double kappa, Vec<3> acenter, double scale = 1)
|
|
1236
|
-
: CoefficientFunction(sizeof(entry_type)/sizeof(Complex), true), mp(order, kappa, scale), center(acenter) { }
|
|
1237
|
-
|
|
1238
|
-
entry_type & Coef(int n, int m) { return mp.Coef(n,m); }
|
|
1239
|
-
auto & SH() { return mp.SH(); }
|
|
1240
|
-
auto & MP() { return mp; }
|
|
1241
|
-
Vec<3> Center() const { return center; }
|
|
1242
|
-
|
|
1243
|
-
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
1244
|
-
{ throw Exception("real eval not available"); }
|
|
1245
|
-
|
|
1246
|
-
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
1247
|
-
{
|
|
1248
|
-
if constexpr (std::is_same<entry_type, Complex>())
|
|
1249
|
-
values(0) = mp.Eval(mip.GetPoint()-center);
|
|
1250
|
-
else
|
|
1251
|
-
values = mp.Eval(mip.GetPoint()-center);
|
|
1252
|
-
}
|
|
1253
|
-
|
|
1254
|
-
template <typename TARGET>
|
|
1255
|
-
void ShiftZ (double z, MultiPole<TARGET, entry_type> & target) { mp.ShiftZ(z, target); }
|
|
1256
|
-
|
|
1257
|
-
using CoefficientFunction::Transform;
|
|
1258
|
-
template <typename TARGET>
|
|
1259
|
-
void Transform (MultiPoleCF<TARGET, entry_type> & target)
|
|
1260
|
-
{
|
|
1261
|
-
mp.Transform (target.MP(), target.Center()-center);
|
|
1262
|
-
}
|
|
1263
|
-
};
|
|
1264
|
-
|
|
1265
|
-
template <typename entry_type>
|
|
1266
|
-
class SingularMLMultiPoleCF : public CoefficientFunction
|
|
1267
|
-
{
|
|
1268
|
-
shared_ptr<SingularMLMultiPole<entry_type>> mlmp;
|
|
1269
|
-
public:
|
|
1270
|
-
SingularMLMultiPoleCF (Vec<3> center, double r, int order, double kappa)
|
|
1271
|
-
: CoefficientFunction(sizeof(entry_type)/sizeof(Complex), true), mlmp{make_shared<SingularMLMultiPole<entry_type>>(center, r, order, kappa)} { }
|
|
1272
|
-
|
|
1273
|
-
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
1274
|
-
{ throw Exception("real eval not available"); }
|
|
1275
|
-
|
|
1276
|
-
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
1277
|
-
{
|
|
1278
|
-
// values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
1279
|
-
|
|
1280
|
-
if constexpr (std::is_same<entry_type, Complex>())
|
|
1281
|
-
values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
1282
|
-
else
|
|
1283
|
-
values = mlmp->Evaluate(mip.GetPoint());
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
}
|
|
1287
|
-
|
|
1288
|
-
shared_ptr<SingularMLMultiPole<entry_type>> MLMP() { return mlmp; }
|
|
1289
|
-
};
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
template <typename entry_type>
|
|
1293
|
-
class RegularMLMultiPoleCF : public CoefficientFunction
|
|
1294
|
-
{
|
|
1295
|
-
shared_ptr<RegularMLMultiPole<entry_type>> mlmp;
|
|
1296
|
-
public:
|
|
1297
|
-
RegularMLMultiPoleCF (shared_ptr<SingularMLMultiPoleCF<entry_type>> asingmp, Vec<3> center, double r, int order)
|
|
1298
|
-
: CoefficientFunction(sizeof(entry_type)/sizeof(Complex), true), mlmp{make_shared<RegularMLMultiPole<entry_type>>(asingmp->MLMP(), center, r, order)} { }
|
|
1299
|
-
|
|
1300
|
-
virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
|
|
1301
|
-
{ throw Exception("real eval not available"); }
|
|
1302
|
-
|
|
1303
|
-
virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
|
|
1304
|
-
{
|
|
1305
|
-
// values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
1306
|
-
|
|
1307
|
-
if constexpr (std::is_same<entry_type, Complex>())
|
|
1308
|
-
values(0) = mlmp->Evaluate(mip.GetPoint());
|
|
1309
|
-
else
|
|
1310
|
-
values = mlmp->Evaluate(mip.GetPoint());
|
|
1311
|
-
}
|
|
1312
|
-
|
|
1313
|
-
shared_ptr<RegularMLMultiPole<entry_type>> MLMP() { return mlmp; }
|
|
1314
|
-
};
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
1262
|
}
|
|
1318
1263
|
#endif
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#ifndef FILE_POTENTIALS
|
|
2
|
+
#define FILE_POTENTIALS
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
tools for computing with potentials using multipoles
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
#include <mptools.hpp>
|
|
10
|
+
#include <meshaccess.hpp>
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
namespace ngsbem
|
|
14
|
+
{
|
|
15
|
+
|
|
16
|
+
extern void AddCurrentDensity (SingularMLMultiPole<Vec<3,Complex>> & mp, shared_ptr<CoefficientFunction> current, ngcomp::Region reg);
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
#endif
|
netgen/include/prolongation.hpp
CHANGED
|
@@ -233,12 +233,14 @@ namespace ngmg
|
|
|
233
233
|
class NGS_DLL_HEADER HarmonicProlongation : public Prolongation
|
|
234
234
|
{
|
|
235
235
|
shared_ptr<Prolongation> baseprol;
|
|
236
|
-
|
|
236
|
+
weak_ptr<BilinearForm> wbfa;
|
|
237
237
|
Array<shared_ptr<BaseMatrix>> innerinverses;
|
|
238
|
-
Array<size_t>
|
|
238
|
+
Array<size_t> facets_on_level;
|
|
239
|
+
Array<shared_ptr<BitArray>> freedofs;
|
|
240
|
+
string inverse;
|
|
239
241
|
public:
|
|
240
242
|
HarmonicProlongation (shared_ptr<Prolongation> abaseprol,
|
|
241
|
-
shared_ptr<BilinearForm> abfa);
|
|
243
|
+
shared_ptr<BilinearForm> abfa, string ainverse);
|
|
242
244
|
|
|
243
245
|
virtual void Update (const FESpace & fes) override;
|
|
244
246
|
|
|
@@ -248,6 +250,127 @@ namespace ngmg
|
|
|
248
250
|
virtual void ProlongateInline (int finelevel, BaseVector & v) const override;
|
|
249
251
|
virtual void RestrictInline (int finelevel, BaseVector & v) const override;
|
|
250
252
|
};
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
template <int DIM>
|
|
259
|
+
class FacetProlongation : public Prolongation
|
|
260
|
+
{
|
|
261
|
+
protected:
|
|
262
|
+
shared_ptr<MeshAccess> ma;
|
|
263
|
+
|
|
264
|
+
int dofs_per_facet = -1;
|
|
265
|
+
Array<Array<int>> first_dofs;
|
|
266
|
+
Array<int> prol_class; // which prol to use ?
|
|
267
|
+
Array<size_t> facets_on_level;
|
|
268
|
+
|
|
269
|
+
static constexpr int NUMPROL = (DIM==2) ? 2 : 32;
|
|
270
|
+
array<Matrix<double>,NUMPROL> facetprol;
|
|
271
|
+
|
|
272
|
+
bool haveprols = false;
|
|
273
|
+
|
|
274
|
+
public:
|
|
275
|
+
FacetProlongation (shared_ptr<MeshAccess> ama)
|
|
276
|
+
: ma(ama) { }
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
virtual shared_ptr<SparseMatrix< double >> CreateProlongationMatrix( int finelevel ) const override
|
|
280
|
+
{
|
|
281
|
+
return nullptr; // or NULL ?
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
virtual void ProlongateInline (int finelevel, BaseVector & v) const override
|
|
286
|
+
{
|
|
287
|
+
auto fv = v.FV<double>();
|
|
288
|
+
Matrix<double> tmp(facets_on_level[finelevel], dofs_per_facet);
|
|
289
|
+
tmp = 0.0;
|
|
290
|
+
|
|
291
|
+
for (size_t i = 0; i < first_dofs[finelevel-1].Size()-1; i++)
|
|
292
|
+
{
|
|
293
|
+
IntRange r(first_dofs[finelevel-1][i], first_dofs[finelevel-1][i+1]);
|
|
294
|
+
if (r.Size() > 0)
|
|
295
|
+
tmp.Row(i) = fv.Range(r);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if constexpr (DIM==2)
|
|
299
|
+
{
|
|
300
|
+
for (int i = facets_on_level[finelevel-1]; i < facets_on_level[finelevel]; i++)
|
|
301
|
+
if (auto parents = get<1>(ma->GetParentEdges(i)); parents[1] == -1)
|
|
302
|
+
{
|
|
303
|
+
int pe = parents[0];
|
|
304
|
+
tmp.Row(i) = facetprol[prol_class[i]] * tmp.Row(pe);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
else
|
|
308
|
+
{
|
|
309
|
+
for (int i = facets_on_level[finelevel-1]; i < facets_on_level[finelevel]; i++)
|
|
310
|
+
if (auto parents = get<1>(ma->GetParentFaces(i)); parents[1] == -1)
|
|
311
|
+
{
|
|
312
|
+
int pe = parents[0];
|
|
313
|
+
tmp.Row(i) = facetprol[prol_class[i]] * tmp.Row(pe);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
for (size_t i = 0; i < first_dofs[finelevel].Size()-1; i++)
|
|
318
|
+
{
|
|
319
|
+
IntRange r(first_dofs[finelevel][i], first_dofs[finelevel][i+1]);
|
|
320
|
+
if (r.Size() > 0)
|
|
321
|
+
fv.Range(r) = tmp.Row(i);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
virtual void RestrictInline (int finelevel, BaseVector & v) const override
|
|
326
|
+
{
|
|
327
|
+
auto fv = v.FV<double>();
|
|
328
|
+
Matrix<double> tmp(facets_on_level[finelevel], dofs_per_facet);
|
|
329
|
+
tmp = 0.0;
|
|
330
|
+
|
|
331
|
+
for (size_t i = 0; i < first_dofs[finelevel].Size()-1; i++)
|
|
332
|
+
{
|
|
333
|
+
IntRange r(first_dofs[finelevel][i], first_dofs[finelevel][i+1]);
|
|
334
|
+
if (r.Size() > 0)
|
|
335
|
+
tmp.Row(i) = fv.Range(r);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
if constexpr (DIM==2)
|
|
340
|
+
{
|
|
341
|
+
for (int i = facets_on_level[finelevel-1]; i < facets_on_level[finelevel]; i++)
|
|
342
|
+
if (auto parents = get<1>(ma->GetParentEdges(i)); parents[1] == -1)
|
|
343
|
+
{
|
|
344
|
+
int pe = parents[0];
|
|
345
|
+
tmp.Row(pe) += Trans(facetprol[prol_class[i]]) * tmp.Row(i);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
else
|
|
349
|
+
{
|
|
350
|
+
// for (int i = facets_on_level[finelevel-1]; i < facets_on_level[finelevel]; i++)
|
|
351
|
+
for (int i = facets_on_level[finelevel]-1; i >= facets_on_level[finelevel-1]; i--)
|
|
352
|
+
if (auto parents = get<1>(ma->GetParentFaces(i)); parents[1] == -1)
|
|
353
|
+
{
|
|
354
|
+
int pe = parents[0];
|
|
355
|
+
tmp.Row(pe) += Trans(facetprol[prol_class[i]]) * tmp.Row(i);
|
|
356
|
+
tmp.Row(i) = 0.0; // optional, for testing
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
fv = 0.0;
|
|
361
|
+
for (size_t i = 0; i < first_dofs[finelevel-1].Size()-1; i++)
|
|
362
|
+
{
|
|
363
|
+
IntRange r(first_dofs[finelevel-1][i], first_dofs[finelevel-1][i+1]);
|
|
364
|
+
if (r.Size() > 0)
|
|
365
|
+
fv.Range(r) = tmp.Row(i);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
|
|
251
374
|
}
|
|
252
375
|
|
|
253
376
|
|