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.

Files changed (52) hide show
  1. netgen/include/fespace.hpp +3 -2
  2. netgen/include/integrator.hpp +4 -16
  3. netgen/include/intrules_SauterSchwab.hpp +25 -0
  4. netgen/include/mp_coefficient.hpp +140 -0
  5. netgen/include/mptools.hpp +106 -161
  6. netgen/include/potentialtools.hpp +20 -0
  7. netgen/include/prolongation.hpp +126 -3
  8. netgen/include/sparsematrix_impl.hpp +71 -5
  9. netgen/include/symbolicintegrator.hpp +1 -0
  10. netgen/include/tangentialfacetfespace.hpp +7 -22
  11. netgen/lib/libngsolve.lib +0 -0
  12. netgen/libngsolve.dll +0 -0
  13. ngsolve/__init__.py +1 -0
  14. ngsolve/cmake/NGSolveConfig.cmake +5 -5
  15. ngsolve/cmake/ngsolve-targets.cmake +9 -2
  16. ngsolve/config/config.py +5 -5
  17. ngsolve/ngslib.pyd +0 -0
  18. ngsolve/solve_implementation.py +146 -0
  19. {ngsolve-6.2.2502.dist-info → ngsolve-6.2.2504.dist-info}/METADATA +2 -2
  20. {ngsolve-6.2.2502.dist-info → ngsolve-6.2.2504.dist-info}/RECORD +52 -48
  21. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/Scripts/ngsolve.tcl +0 -0
  22. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/beam.geo +0 -0
  23. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/beam.vol +0 -0
  24. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/chip.in2d +0 -0
  25. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/chip.vol +0 -0
  26. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/coil.geo +0 -0
  27. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/coil.vol +0 -0
  28. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/coilshield.geo +0 -0
  29. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/coilshield.vol +0 -0
  30. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/cube.geo +0 -0
  31. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/cube.vol +0 -0
  32. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d10_DGdoubleglazing.pde +0 -0
  33. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d11_chip_nitsche.pde +0 -0
  34. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d1_square.pde +0 -0
  35. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d2_chip.pde +0 -0
  36. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d3_helmholtz.pde +0 -0
  37. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d4_cube.pde +0 -0
  38. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d5_beam.pde +0 -0
  39. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d6_shaft.pde +0 -0
  40. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d7_coil.pde +0 -0
  41. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d8_coilshield.pde +0 -0
  42. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/d9_hybridDG.pde +0 -0
  43. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/doubleglazing.in2d +0 -0
  44. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/doubleglazing.vol +0 -0
  45. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
  46. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/shaft.geo +0 -0
  47. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/shaft.vol +0 -0
  48. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/square.in2d +0 -0
  49. {ngsolve-6.2.2502.data → ngsolve-6.2.2504.data}/data/share/ngsolve/square.vol +0 -0
  50. {ngsolve-6.2.2502.dist-info → ngsolve-6.2.2504.dist-info}/LICENSE +0 -0
  51. {ngsolve-6.2.2502.dist-info → ngsolve-6.2.2504.dist-info}/WHEEL +0 -0
  52. {ngsolve-6.2.2502.dist-info → ngsolve-6.2.2504.dist-info}/top_level.txt +0 -0
@@ -10,9 +10,16 @@
10
10
  #include <coefficient.hpp>
11
11
  #include <recursive_pol.hpp>
12
12
 
13
- namespace ngfem
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 scale;
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 scale; }
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 = scale/newscale;
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(scale);
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(*this);
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, int order, double kappa)
380
- : center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, min(1.0, r*kappa))
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, max(mp.SH().Order()/2, 8), mp.Kappa());
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
- for (auto [x,c] : charges)
534
- if (double rho = L2Norm(p-x); rho > 0)
535
- sum += (1/(4*M_PI))*exp(Complex(0,rho*mp.Kappa())) / rho * c;
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 = 0;
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, int order, double kappa)
717
- : root(center, r, 0, order, kappa)
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, Complex c)
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, Complex c)
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, int order, double kappa)
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, max(mp.SH().Order()/2, 8), mp.Kappa());
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, int order)
1091
- : root(center, r, 0, order, asingmp->Kappa()), singmp(asingmp)
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, int order, double kappa)
1121
- : root(center, r, 0, order, kappa)
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
@@ -233,12 +233,14 @@ namespace ngmg
233
233
  class NGS_DLL_HEADER HarmonicProlongation : public Prolongation
234
234
  {
235
235
  shared_ptr<Prolongation> baseprol;
236
- shared_ptr<BilinearForm> bfa;
236
+ weak_ptr<BilinearForm> wbfa;
237
237
  Array<shared_ptr<BaseMatrix>> innerinverses;
238
- Array<size_t> edges_on_level;
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