ngsolve 6.2.2506.post33.dev0__cp39-cp39-macosx_10_15_universal2.whl → 6.2.2506.post38.dev0__cp39-cp39-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.

Files changed (48) hide show
  1. netgen/include/kernels.hpp +3 -4
  2. netgen/include/mptools.hpp +393 -173
  3. netgen/include/recursive_pol.hpp +2 -2
  4. netgen/include/sparsematrix.hpp +1 -1
  5. netgen/libngbla.dylib +0 -0
  6. netgen/libngla.dylib +0 -0
  7. netgen/libngsbem.dylib +0 -0
  8. netgen/libngstd.dylib +0 -0
  9. ngsolve/cmake/NGSolveConfig.cmake +1 -1
  10. ngsolve/config/config.py +5 -5
  11. {ngsolve-6.2.2506.post33.dev0.dist-info → ngsolve-6.2.2506.post38.dev0.dist-info}/METADATA +1 -1
  12. {ngsolve-6.2.2506.post33.dev0.dist-info → ngsolve-6.2.2506.post38.dev0.dist-info}/RECORD +48 -48
  13. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/Netgen.icns +0 -0
  14. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/bin/ngscxx +0 -0
  15. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/bin/ngsld +0 -0
  16. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/bin/ngsolve.tcl +0 -0
  17. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/bin/ngspy +0 -0
  18. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/beam.geo +0 -0
  19. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/beam.vol +0 -0
  20. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/chip.in2d +0 -0
  21. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/chip.vol +0 -0
  22. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/coil.geo +0 -0
  23. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/coil.vol +0 -0
  24. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/coilshield.geo +0 -0
  25. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/coilshield.vol +0 -0
  26. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/cube.geo +0 -0
  27. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/cube.vol +0 -0
  28. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/d10_DGdoubleglazing.pde +0 -0
  29. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/d11_chip_nitsche.pde +0 -0
  30. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/d1_square.pde +0 -0
  31. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/d2_chip.pde +0 -0
  32. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/d3_helmholtz.pde +0 -0
  33. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/d4_cube.pde +0 -0
  34. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/d5_beam.pde +0 -0
  35. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/d6_shaft.pde +0 -0
  36. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/d7_coil.pde +0 -0
  37. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/d8_coilshield.pde +0 -0
  38. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/d9_hybridDG.pde +0 -0
  39. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/doubleglazing.in2d +0 -0
  40. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/doubleglazing.vol +0 -0
  41. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
  42. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/shaft.geo +0 -0
  43. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/shaft.vol +0 -0
  44. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/square.in2d +0 -0
  45. {ngsolve-6.2.2506.post33.dev0.data → ngsolve-6.2.2506.post38.dev0.data}/data/share/ngsolve/square.vol +0 -0
  46. {ngsolve-6.2.2506.post33.dev0.dist-info → ngsolve-6.2.2506.post38.dev0.dist-info}/LICENSE +0 -0
  47. {ngsolve-6.2.2506.post33.dev0.dist-info → ngsolve-6.2.2506.post38.dev0.dist-info}/WHEEL +0 -0
  48. {ngsolve-6.2.2506.post33.dev0.dist-info → ngsolve-6.2.2506.post38.dev0.dist-info}/top_level.txt +0 -0
@@ -485,10 +485,9 @@ namespace ngsbem
485
485
 
486
486
  void AddSource (SingularMLExpansion<Complex> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
487
487
  {
488
- /*
489
- mp.AddCharge(pnt, Complex(0, -kappa)*val(0));
490
- mp.AddDipole(pnt, -nv, val(0));
491
- */
488
+ // mp.AddCharge(pnt, Complex(0, -kappa)*val(0));
489
+ // mp.AddDipole(pnt, -nv, val(0));
490
+
492
491
  mp.AddChargeDipole (pnt, Complex(0, -kappa)*val(0), -nv, val(0));
493
492
  }
494
493
 
@@ -25,6 +25,7 @@ namespace ngsbem
25
25
 
26
26
  constexpr int FMM_SW = 4;
27
27
 
28
+
28
29
 
29
30
  // ************************ SIMD - creation (should end up in simd.hpp) *************
30
31
 
@@ -42,7 +43,19 @@ namespace ngsbem
42
43
  }
43
44
 
44
45
 
45
-
46
+ class NGS_DLL_HEADER PrecomputedSqrts
47
+ {
48
+ public:
49
+ Array<double> sqrt_int;
50
+ // Array<double> inv_sqrt_int;
51
+ Array<double> sqrt_n_np1; // sqrt(n*(n+1))
52
+ Array<double> inv_sqrt_2np1_2np3; // 1/sqrt( (2n+1)*(2n+3) )
53
+
54
+ PrecomputedSqrts();
55
+ };
56
+
57
+ extern NGS_DLL_HEADER PrecomputedSqrts presqrt;
58
+
46
59
 
47
60
 
48
61
 
@@ -189,18 +202,26 @@ namespace ngsbem
189
202
  void RotateY (double alpha, bool parallel = false);
190
203
 
191
204
 
205
+
192
206
  static double CalcAmn (int m, int n)
193
207
  {
194
208
  if (m < 0) m=-m;
195
209
  if (n < m) return 0;
196
- return sqrt( (n+1.0+m)*(n+1.0-m) / ( (2*n+1)*(2*n+3) ));
210
+
211
+ if (2*n+1 < presqrt.sqrt_int.Size())
212
+ return presqrt.sqrt_int[n+1+m]*presqrt.sqrt_int[n+1-m] * presqrt.inv_sqrt_2np1_2np3[n];
213
+ else
214
+ return sqrt( (n+1.0+m)*(n+1.0-m) / ( (2*n+1)*(2*n+3) ));
197
215
  }
198
216
 
199
217
  static double CalcBmn (int m, int n)
200
218
  {
201
219
  double sgn = (m >= 0) ? 1 : -1;
202
- if ( (m > n) || (-m > n) ) return 0;
203
- return sgn * sqrt( (n-m-1.0)*(n-m) / ( (2*n-1.0)*(2*n+1)));
220
+ if ( (m >= n) || (-m > n) ) return 0;
221
+ if (n <= presqrt.inv_sqrt_2np1_2np3.Size())
222
+ return sgn * presqrt.sqrt_n_np1[n-m-1] * presqrt.inv_sqrt_2np1_2np3[n-1];
223
+ else
224
+ return sgn * sqrt( (n-m-1.0)*(n-m) / ( (2*n-1.0)*(2*n+1)));
204
225
  }
205
226
 
206
227
  static double CalcDmn (int m, int n)
@@ -543,7 +564,7 @@ namespace ngsbem
543
564
  };
544
565
 
545
566
 
546
- static void ProcessBatch(FlatArray<RecordingSS*> batch, double len, double theta) {
567
+ static void ProcessBatchSS(FlatArray<RecordingSS*> batch, double len, double theta) {
547
568
  constexpr int vec_length = VecLength<entry_type>;
548
569
  int batch_size = batch.Size();
549
570
  int N = batch_size * vec_length;
@@ -555,42 +576,45 @@ namespace ngsbem
555
576
  }
556
577
  }
557
578
  else if (N <= 3) {
558
- ProcessVectorizedBatch<3, vec_length>(batch, len, theta);
579
+ ProcessVectorizedBatchSS<3, vec_length>(batch, len, theta);
559
580
  }
560
581
  else if (N <= 4) {
561
- ProcessVectorizedBatch<4, vec_length>(batch, len, theta);
582
+ ProcessVectorizedBatchSS<4, vec_length>(batch, len, theta);
562
583
  }
563
584
  else if (N <= 6) {
564
- ProcessVectorizedBatch<6, vec_length>(batch, len, theta);
585
+ ProcessVectorizedBatchSS<6, vec_length>(batch, len, theta);
565
586
  }
566
587
  else if (N <= 12) {
567
- ProcessVectorizedBatch<12, vec_length>(batch, len, theta);
588
+ ProcessVectorizedBatchSS<12, vec_length>(batch, len, theta);
568
589
  }
569
590
  else if (N <= 24) {
570
- ProcessVectorizedBatch<24, vec_length>(batch, len, theta);
591
+ ProcessVectorizedBatchSS<24, vec_length>(batch, len, theta);
571
592
  }
572
593
  else if (N <= 48) {
573
- ProcessVectorizedBatch<48, vec_length>(batch, len, theta);
594
+ ProcessVectorizedBatchSS<48, vec_length>(batch, len, theta);
574
595
  }
575
596
  else if (N <= 96) {
576
- ProcessVectorizedBatch<96, vec_length>(batch, len, theta);
597
+ ProcessVectorizedBatchSS<96, vec_length>(batch, len, theta);
577
598
  }
578
599
  else if (N <= 192) {
579
- ProcessVectorizedBatch<192, vec_length>(batch, len, theta);
600
+ ProcessVectorizedBatchSS<192, vec_length>(batch, len, theta);
580
601
  }
581
602
  else {
582
603
  // Split large batches
583
- ProcessBatch(batch.Range(0, 192 / vec_length), len, theta);
584
- ProcessBatch(batch.Range(192 / vec_length, batch_size), len, theta);
604
+ ProcessBatchSS(batch.Range(0, 192 / vec_length), len, theta);
605
+ ProcessBatchSS(batch.Range(192 / vec_length, batch_size), len, theta);
585
606
  }
586
607
  }
587
608
 
588
609
  template<int N, int vec_length>
589
- static void ProcessVectorizedBatch(FlatArray<RecordingSS*> batch, double len, double theta) {
610
+ static void ProcessVectorizedBatchSS(FlatArray<RecordingSS*> batch, double len, double theta) {
590
611
 
591
612
  // *testout << "Processing vectorized S->S batch of size " << batch.Size() << ", with N = " << N << ", vec_length = " << vec_length << ", len = " << len << ", theta = " << theta << endl;
592
- SphericalExpansion<Singular, Vec<N,Complex>> vec_source(batch[0]->mp_source->Order(), batch[0]->mp_source->Kappa(), batch[0]->mp_source->RTyp());
593
- SphericalExpansion<Singular, Vec<N,Complex>> vec_target(batch[0]->mp_target->Order(), batch[0]->mp_target->Kappa(), batch[0]->mp_target->RTyp());
613
+ double kappa = batch[0]->mp_source->Kappa();
614
+ int so = batch[0]->mp_source->Order();
615
+ int to = batch[0]->mp_target->Order();
616
+ SphericalExpansion<Singular, Vec<N,Complex>> vec_source(so, kappa, batch[0]->mp_source->RTyp());
617
+ SphericalExpansion<Singular, Vec<N,Complex>> vec_target(to, kappa, batch[0]->mp_target->RTyp());
594
618
 
595
619
  // Copy multipoles into vectorized multipole
596
620
  for (int i = 0; i < batch.Size(); i++)
@@ -688,10 +712,10 @@ namespace ngsbem
688
712
  for (auto [sp,ep,j,num] : currents)
689
713
  AddCurrent (sp,ep,j,num);
690
714
 
691
- charges.SetSize0();
692
- dipoles.SetSize0();
693
- chargedipoles.SetSize0();
694
- currents.SetSize0();
715
+ charges.DeleteAll();
716
+ dipoles.DeleteAll();
717
+ chargedipoles.DeleteAll();
718
+ currents.DeleteAll();
695
719
  }
696
720
 
697
721
 
@@ -718,7 +742,7 @@ namespace ngsbem
718
742
 
719
743
  // if (r*mp.Kappa() < 1e-8) return;
720
744
  if (level > 20) return;
721
- if (charges.Size() < maxdirect && r*mp.Kappa() < 1)
745
+ if (charges.Size() < maxdirect && r*mp.Kappa() < 5)
722
746
  return;
723
747
 
724
748
  SendSourcesToChilds();
@@ -746,8 +770,9 @@ namespace ngsbem
746
770
  }
747
771
 
748
772
  dipoles.Append (tuple{x,d,c});
749
-
750
- if (dipoles.Size() < maxdirect || r < 1e-8)
773
+
774
+ if (level > 20) return;
775
+ if (dipoles.Size() < maxdirect)
751
776
  return;
752
777
 
753
778
  SendSourcesToChilds();
@@ -797,7 +822,7 @@ namespace ngsbem
797
822
  Array<double> split;
798
823
  split.Append(0);
799
824
  for (int i = 0; i < 3; i++)
800
- if (sp(i) < center(i) != ep(i) < center(i))
825
+ if ((sp(i) < center(i)) != (ep(i) < center(i)))
801
826
  split += (center(i)-sp(i)) / (ep(i)-sp(i)); // segment cuts i-th coordinate plane
802
827
  split.Append(1);
803
828
  BubbleSort(split);
@@ -948,6 +973,7 @@ namespace ngsbem
948
973
  if (simd_chargedipoles.Size())
949
974
  {
950
975
  // static Timer t("mptool singmp, evaluate, simd chargedipoles"); RegionTimer r(t);
976
+ // t.AddFlops (simd_chargedipoles.Size()*FMM_SW);
951
977
 
952
978
  simd_entry_type vsum{0.0};
953
979
  for (auto [x,c,d,c2] : simd_chargedipoles)
@@ -971,6 +997,7 @@ namespace ngsbem
971
997
  else
972
998
  {
973
999
  // static Timer t("mptool singmp, evaluate, chargedipoles"); RegionTimer r(t);
1000
+ // t.AddFlops (chargedipoles.Size());
974
1001
 
975
1002
  for (auto [x,c,d,c2] : chargedipoles)
976
1003
  if (double rho = L2Norm(p-x); rho > 0)
@@ -1134,8 +1161,6 @@ namespace ngsbem
1134
1161
  simd_chargedipoles[ii] = MakeSimd(di);
1135
1162
  }
1136
1163
 
1137
-
1138
-
1139
1164
 
1140
1165
  if (nodes_to_process)
1141
1166
  *nodes_to_process += this;
@@ -1224,6 +1249,14 @@ namespace ngsbem
1224
1249
  num += ch->NumCoefficients();
1225
1250
  return num;
1226
1251
  }
1252
+
1253
+ void TraverseTree (const std::function<void(Node&)> & func)
1254
+ {
1255
+ func(*this);
1256
+ for (auto & child : childs)
1257
+ if (child)
1258
+ child->TraverseTree(func);
1259
+ }
1227
1260
  };
1228
1261
 
1229
1262
  Node root;
@@ -1313,89 +1346,93 @@ namespace ngsbem
1313
1346
 
1314
1347
  root.CalcTotalSources();
1315
1348
 
1316
- if (false)
1349
+ if constexpr (false)
1317
1350
  // direct evaluation of S->S
1318
1351
  root.CalcMP(nullptr, nullptr);
1319
1352
  else
1320
1353
  {
1321
1354
 
1322
- Array<RecordingSS> recording;
1323
- Array<Node*> nodes_to_process;
1355
+ Array<RecordingSS> recording;
1356
+ Array<Node*> nodes_to_process;
1324
1357
 
1325
- {
1326
- RegionTimer reg(trec);
1327
- root.CalcMP(&recording, &nodes_to_process);
1328
- }
1358
+ {
1359
+ RegionTimer reg(trec);
1360
+ root.CalcMP(&recording, &nodes_to_process);
1361
+ }
1329
1362
 
1330
- {
1331
- RegionTimer rs2mp(ts2mp);
1332
- ParallelFor(nodes_to_process.Size(), [&](int i){
1333
- auto node = nodes_to_process[i];
1334
- for (auto [x,c]: node->charges)
1335
- node->mp.AddCharge(x-node->center, c);
1336
- for (auto [x,d,c]: node->dipoles)
1337
- node->mp.AddDipole(x-node->center, d, c);
1338
- for (auto [x,c,d,c2]: node->chargedipoles)
1339
- node->mp.AddChargeDipole(x-node->center, c, d, c2);
1340
- for (auto [sp,ep,j,num]: node->currents)
1341
- node->mp.AddCurrent(sp-node->center, ep-node->center, j, num);
1342
- }, TasksPerThread(4));
1343
- }
1344
-
1345
- {
1346
- RegionTimer reg(tsort);
1347
- QuickSort (recording, [] (auto & a, auto & b)
1348
- {
1349
- if (a.len < (1-1e-8) * b.len) return true;
1350
- if (a.len > (1+1e-8) * b.len) return false;
1351
- return a.theta < b.theta;
1352
- });
1353
- }
1363
+ {
1364
+ RegionTimer rs2mp(ts2mp);
1365
+ ParallelFor(nodes_to_process.Size(), [&](int i)
1366
+ {
1367
+ auto node = nodes_to_process[i];
1368
+ for (auto [x,c]: node->charges)
1369
+ node->mp.AddCharge(x-node->center, c);
1370
+ for (auto [x,d,c]: node->dipoles)
1371
+ node->mp.AddDipole(x-node->center, d, c);
1372
+ for (auto [x,c,d,c2]: node->chargedipoles)
1373
+ node->mp.AddChargeDipole(x-node->center, c, d, c2);
1374
+ for (auto [sp,ep,j,num]: node->currents)
1375
+ node->mp.AddCurrent(sp-node->center, ep-node->center, j, num);
1376
+ }, TasksPerThread(4));
1377
+ }
1378
+
1379
+ {
1380
+ RegionTimer reg(tsort);
1381
+ QuickSort (recording, [] (auto & a, auto & b)
1382
+ {
1383
+ if (a.len < (1-1e-8) * b.len) return true;
1384
+ if (a.len > (1+1e-8) * b.len) return false;
1385
+ return a.theta < b.theta;
1386
+ });
1387
+ }
1354
1388
 
1355
- double current_len = -1e100;
1356
- double current_theta = -1e100;
1357
- Array<RecordingSS*> current_batch;
1358
- Array<Array<RecordingSS*>> batch_group;
1359
- Array<double> group_lengths;
1360
- Array<double> group_thetas;
1361
- for (auto & record : recording)
1362
- {
1363
- bool len_changed = fabs(record.len - current_len) > 1e-8;
1364
- bool theta_changed = fabs(record.theta - current_theta) > 1e-8;
1365
- if ((len_changed || theta_changed) && current_batch.Size() > 0) {
1389
+ double current_len = -1e100;
1390
+ double current_theta = -1e100;
1391
+ Array<RecordingSS*> current_batch;
1392
+ Array<Array<RecordingSS*>> batch_group;
1393
+ Array<double> group_lengths;
1394
+ Array<double> group_thetas;
1395
+ for (auto & record : recording)
1396
+ {
1397
+ bool len_changed = fabs(record.len - current_len) > 1e-8;
1398
+ bool theta_changed = fabs(record.theta - current_theta) > 1e-8;
1399
+ if ((len_changed || theta_changed) && current_batch.Size() > 0) {
1400
+ batch_group.Append(current_batch);
1401
+ group_lengths.Append(current_len);
1402
+ group_thetas.Append(current_theta);
1403
+ current_batch.SetSize(0);
1404
+ }
1405
+
1406
+ current_len = record.len;
1407
+ current_theta = record.theta;
1408
+ current_batch.Append(&record);
1409
+ }
1410
+
1411
+ if (current_batch.Size() > 0) {
1366
1412
  batch_group.Append(current_batch);
1367
1413
  group_lengths.Append(current_len);
1368
1414
  group_thetas.Append(current_theta);
1369
- current_batch.SetSize(0);
1370
- }
1415
+ }
1371
1416
 
1372
- current_len = record.len;
1373
- current_theta = record.theta;
1374
- current_batch.Append(&record);
1417
+ {
1418
+ RegionTimer rS2S(tS2S);
1419
+ // ParallelFor(batch_group.Size(), [&](int i) {
1420
+ for (int i = 0; i < batch_group.Size(); i++){
1421
+ // *testout << "Processing batch " << i << " of size " << batch_group[i].Size() << ", with len = " << group_lengths[i] << ", theta = " << group_thetas[i] << endl;
1422
+ int chunk_size = 24;
1423
+ if (batch_group[i].Size() < chunk_size)
1424
+ ProcessBatchSS(batch_group[i], group_lengths[i], group_thetas[i]);
1425
+ else
1426
+ ParallelForRange(IntRange(batch_group[i].Size()), [&](IntRange range) {
1427
+ auto sub_batch = batch_group[i].Range(range.First(), range.Next());
1428
+ ProcessBatchSS(sub_batch, group_lengths[i], group_thetas[i]);
1429
+ }, TasksPerThread(4));
1430
+ }
1431
+ }
1375
1432
  }
1376
- if (current_batch.Size() > 0) {
1377
- batch_group.Append(current_batch);
1378
- group_lengths.Append(current_len);
1379
- group_thetas.Append(current_theta);
1380
- }
1381
1433
 
1382
- {
1383
- RegionTimer rS2S(tS2S);
1384
- // ParallelFor(batch_group.Size(), [&](int i) {
1385
- for (int i = 0; i < batch_group.Size(); i++){
1386
- // *testout << "Processing batch " << i << " of size " << batch_group[i].Size() << ", with len = " << group_lengths[i] << ", theta = " << group_thetas[i] << endl;
1387
- int chunk_size = 24;
1388
- if (batch_group[i].Size() < chunk_size)
1389
- ProcessBatch(batch_group[i], group_lengths[i], group_thetas[i]);
1390
- else
1391
- ParallelForRange(IntRange(batch_group[i].Size()), [&](IntRange range) {
1392
- auto sub_batch = batch_group[i].Range(range.First(), range.Next());
1393
- ProcessBatch(sub_batch, group_lengths[i], group_thetas[i]);
1394
- }, TasksPerThread(4));
1395
- }
1396
- }
1397
- }
1398
-
1434
+ // cout << "have singular:" << endl;
1435
+ // PrintStatistics (cout);
1399
1436
  havemp = true;
1400
1437
  }
1401
1438
 
@@ -1407,6 +1444,41 @@ namespace ngsbem
1407
1444
  return root.Evaluate(p);
1408
1445
  }
1409
1446
 
1447
+
1448
+ void PrintStatistics (ostream & ost)
1449
+ {
1450
+ int levels = 0;
1451
+ int cnt = 0;
1452
+ root.TraverseTree( [&](Node & node) {
1453
+ levels = max(levels, node.level);
1454
+ cnt++;
1455
+ });
1456
+ ost << "levels: " << levels << endl;
1457
+ ost << "nodes: " << cnt << endl;
1458
+
1459
+ Array<int> num_on_level(levels+1);
1460
+ Array<int> order_on_level(levels+1);
1461
+ Array<size_t> coefs_on_level(levels+1);
1462
+ num_on_level = 0;
1463
+ order_on_level = 0;
1464
+ root.TraverseTree( [&](Node & node) {
1465
+ num_on_level[node.level]++;
1466
+ order_on_level[node.level] = max(order_on_level[node.level],node.mp.Order());
1467
+ coefs_on_level[node.level] += node.mp.SH().Coefs().Size();
1468
+ });
1469
+
1470
+ cout << "num on level" << endl;
1471
+ for (int i = 0; i < num_on_level.Size(); i++)
1472
+ cout << i << ": " << num_on_level[i] << ", order = " << order_on_level[i] << ", coefs " << coefs_on_level[i] << endl;
1473
+
1474
+ size_t totcoefs = 0;
1475
+ for (auto n : coefs_on_level)
1476
+ totcoefs += n;
1477
+ cout << "total mem in coefs: " << sizeof(entry_type)*totcoefs / sqr(1024) << " MB" << endl;
1478
+ }
1479
+
1480
+
1481
+
1410
1482
  template <typename entry_type2>
1411
1483
  friend class RegularMLExpansion;
1412
1484
  };
@@ -1420,6 +1492,9 @@ namespace ngsbem
1420
1492
  }
1421
1493
 
1422
1494
 
1495
+ // *********************************** Regular multilevel Expansion
1496
+
1497
+
1423
1498
  template <typename elem_type=Complex>
1424
1499
  class NGS_DLL_HEADER RegularMLExpansion
1425
1500
  {
@@ -1456,28 +1531,28 @@ namespace ngsbem
1456
1531
  }
1457
1532
  }
1458
1533
  else if (N <= 3) {
1459
- ProcessVectorizedBatch<3, vec_length>(batch, len, theta);
1534
+ ProcessVectorizedBatchRS<3, vec_length>(batch, len, theta);
1460
1535
  }
1461
1536
  else if (N <= 4) {
1462
- ProcessVectorizedBatch<4, vec_length>(batch, len, theta);
1537
+ ProcessVectorizedBatchRS<4, vec_length>(batch, len, theta);
1463
1538
  }
1464
1539
  else if (N <= 6) {
1465
- ProcessVectorizedBatch<6, vec_length>(batch, len, theta);
1540
+ ProcessVectorizedBatchRS<6, vec_length>(batch, len, theta);
1466
1541
  }
1467
1542
  else if (N <= 12) {
1468
- ProcessVectorizedBatch<12, vec_length>(batch, len, theta);
1543
+ ProcessVectorizedBatchRS<12, vec_length>(batch, len, theta);
1469
1544
  }
1470
1545
  else if (N <= 24) {
1471
- ProcessVectorizedBatch<24, vec_length>(batch, len, theta);
1546
+ ProcessVectorizedBatchRS<24, vec_length>(batch, len, theta);
1472
1547
  }
1473
1548
  else if (N <= 48) {
1474
- ProcessVectorizedBatch<48, vec_length>(batch, len, theta);
1549
+ ProcessVectorizedBatchRS<48, vec_length>(batch, len, theta);
1475
1550
  }
1476
1551
  else if (N <= 96) {
1477
- ProcessVectorizedBatch<96, vec_length>(batch, len, theta);
1552
+ ProcessVectorizedBatchRS<96, vec_length>(batch, len, theta);
1478
1553
  }
1479
1554
  else if (N <= 192) {
1480
- ProcessVectorizedBatch<192, vec_length>(batch, len, theta);
1555
+ ProcessVectorizedBatchRS<192, vec_length>(batch, len, theta);
1481
1556
  }
1482
1557
  else {
1483
1558
  // Split large batches
@@ -1509,7 +1584,7 @@ namespace ngsbem
1509
1584
 
1510
1585
 
1511
1586
  template<int N, int vec_length>
1512
- static void ProcessVectorizedBatch(FlatArray<RecordingRS*> batch, double len, double theta) {
1587
+ static void ProcessVectorizedBatchRS(FlatArray<RecordingRS*> batch, double len, double theta) {
1513
1588
 
1514
1589
  // static Timer t("ProcessVectorizedBatch, N = "+ToString(N) + ", vec_len = " + ToString(vec_length));
1515
1590
  // RegionTimer reg(t, batch[0]->mpS->SH().Order());
@@ -1570,6 +1645,7 @@ namespace ngsbem
1570
1645
  std::array<unique_ptr<Node>,8> childs;
1571
1646
  SphericalExpansion<Regular,elem_type> mp;
1572
1647
  Array<Vec<3>> targets;
1648
+ Array<tuple<Vec<3>,double>> vol_targets;
1573
1649
  int total_targets;
1574
1650
  std::mutex node_mutex;
1575
1651
  atomic<bool> have_childs{false};
@@ -1577,15 +1653,22 @@ namespace ngsbem
1577
1653
  Array<const typename SingularMLExpansion<elem_type>::Node*> singnodes;
1578
1654
 
1579
1655
  Node (Vec<3> acenter, double ar, int alevel, double kappa)
1580
- : center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, ar) // 1.0/min(1.0, 0.25*r*kappa))
1656
+ : center(acenter), r(ar), level(alevel),
1657
+ // mp(MPOrder(ar*kappa), kappa, ar) // 1.0/min(1.0, 0.25*r*kappa))
1658
+ mp(-1, kappa, ar)
1581
1659
  // : center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, 1.0)
1582
1660
  {
1583
1661
  if (level < nodes_on_level.Size())
1584
1662
  nodes_on_level[level]++;
1585
1663
  }
1586
1664
 
1587
-
1588
- void CreateChilds()
1665
+ void Allocate()
1666
+ {
1667
+ mp = SphericalExpansion<Regular,elem_type>(MPOrder(r*mp.Kappa()), mp.Kappa(), r);
1668
+ }
1669
+
1670
+
1671
+ void CreateChilds(bool allocate = false)
1589
1672
  {
1590
1673
  if (childs[0]) throw Exception("have already childs");
1591
1674
  // create children nodes:
@@ -1596,6 +1679,8 @@ namespace ngsbem
1596
1679
  cc(1) += (i&2) ? r/2 : -r/2;
1597
1680
  cc(2) += (i&4) ? r/2 : -r/2;
1598
1681
  childs[i] = make_unique<Node> (cc, r/2, level+1, mp.Kappa());
1682
+ if (allocate)
1683
+ childs[i] -> Allocate();
1599
1684
  }
1600
1685
  have_childs = true;
1601
1686
  }
@@ -1648,7 +1733,7 @@ namespace ngsbem
1648
1733
  if (allow_refine)
1649
1734
  {
1650
1735
  if (!childs[0])
1651
- CreateChilds();
1736
+ CreateChilds(true);
1652
1737
 
1653
1738
  for (auto & ch : childs)
1654
1739
  ch -> AddSingularNode (singnode, allow_refine, recording);
@@ -1668,7 +1753,7 @@ namespace ngsbem
1668
1753
  childs[nr] -> AddSingularNode (singnode, allow_refine, recording);
1669
1754
  });
1670
1755
 
1671
- if (targets.Size())
1756
+ if (targets.Size()+vol_targets.Size())
1672
1757
  singnodes.Append(&singnode);
1673
1758
  }
1674
1759
  }
@@ -1683,7 +1768,7 @@ namespace ngsbem
1683
1768
  {
1684
1769
  if (allow_refine)
1685
1770
  if (mp.Order() > 30 && !childs[0])
1686
- CreateChilds();
1771
+ CreateChilds(allow_refine);
1687
1772
 
1688
1773
  if (childs[0])
1689
1774
  {
@@ -1754,6 +1839,14 @@ namespace ngsbem
1754
1839
  return sum;
1755
1840
  }
1756
1841
 
1842
+ void TraverseTree (const std::function<void(Node&)> & func)
1843
+ {
1844
+ func(*this);
1845
+ for (auto & child : childs)
1846
+ if (child)
1847
+ child->TraverseTree(func);
1848
+ }
1849
+
1757
1850
  double Norm() const
1758
1851
  {
1759
1852
  double norm = L2Norm(mp.SH().Coefs());
@@ -1771,17 +1864,23 @@ namespace ngsbem
1771
1864
  num += ch->NumCoefficients();
1772
1865
  return num;
1773
1866
  }
1774
-
1867
+
1868
+ int GetChildNum (Vec<3> x) const
1869
+ {
1870
+ int childnum = 0;
1871
+ if (x(0) > center(0)) childnum += 1;
1872
+ if (x(1) > center(1)) childnum += 2;
1873
+ if (x(2) > center(2)) childnum += 4;
1874
+ return childnum;
1875
+ }
1876
+
1775
1877
  void AddTarget (Vec<3> x)
1776
1878
  {
1777
1879
  // if (childs[0])
1778
1880
  if (have_childs) // quick check without locking
1779
1881
  {
1780
1882
  // directly send to childs:
1781
- int childnum = 0;
1782
- if (x(0) > center(0)) childnum += 1;
1783
- if (x(1) > center(1)) childnum += 2;
1784
- if (x(2) > center(2)) childnum += 4;
1883
+ int childnum = GetChildNum(x);
1785
1884
  childs[childnum] -> AddTarget( x );
1786
1885
  return;
1787
1886
  }
@@ -1791,32 +1890,74 @@ namespace ngsbem
1791
1890
  if (have_childs) // test again after locking
1792
1891
  {
1793
1892
  // directly send to childs:
1794
- int childnum = 0;
1795
- if (x(0) > center(0)) childnum += 1;
1796
- if (x(1) > center(1)) childnum += 2;
1797
- if (x(2) > center(2)) childnum += 4;
1893
+ int childnum = GetChildNum(x);
1798
1894
  childs[childnum] -> AddTarget(x);
1799
1895
  return;
1800
1896
  }
1801
1897
 
1802
-
1803
1898
  targets.Append( x );
1804
1899
 
1805
1900
  // if (r*mp.Kappa() < 1e-8) return;
1806
1901
  if (level > 20) return;
1807
- if (targets.Size() < maxdirect && r*mp.Kappa() < 1)
1902
+ if (targets.Size() < maxdirect && r*mp.Kappa() < 5)
1903
+ return;
1904
+
1905
+ CreateChilds();
1906
+
1907
+ for (auto t : targets)
1908
+ AddTarget (t);
1909
+ for (auto [x,r] : vol_targets)
1910
+ AddVolumeTarget (x,r);
1911
+
1912
+ targets.SetSize0();
1913
+ vol_targets.SetSize0();
1914
+ }
1915
+
1916
+
1917
+ void AddVolumeTarget (Vec<3> x, double tr)
1918
+ {
1919
+ if (MaxNorm(x-center) > r+tr) return;
1920
+
1921
+ if (have_childs)
1922
+ {
1923
+ for (auto & child : childs)
1924
+ child->AddVolumeTarget(x, tr);
1925
+ return;
1926
+ }
1927
+
1928
+
1929
+ lock_guard<mutex> guard(node_mutex);
1930
+
1931
+ if (have_childs)
1932
+ {
1933
+ for (auto & child : childs)
1934
+ child->AddVolumeTarget(x, tr);
1935
+ return;
1936
+ }
1937
+
1938
+
1939
+ vol_targets.Append (tuple(x,tr));
1940
+
1941
+ if (level > 20) return;
1942
+ if (vol_targets.Size() < maxdirect && (r*mp.Kappa() < 5))
1808
1943
  return;
1809
1944
 
1810
1945
  CreateChilds();
1811
1946
 
1812
1947
  for (auto t : targets)
1813
1948
  AddTarget (t);
1949
+ for (auto [x,r] : vol_targets)
1950
+ AddVolumeTarget (x,r);
1951
+
1814
1952
  targets.SetSize0();
1953
+ vol_targets.SetSize0();
1815
1954
  }
1816
1955
 
1956
+
1957
+
1817
1958
  void CalcTotalTargets()
1818
1959
  {
1819
- total_targets = targets.Size();
1960
+ total_targets = targets.Size() + vol_targets.Size();
1820
1961
  for (auto & child : childs)
1821
1962
  if (child)
1822
1963
  {
@@ -1838,6 +1979,19 @@ namespace ngsbem
1838
1979
  if (total_targets == 0)
1839
1980
  mp = SphericalExpansion<Regular,elem_type>(-1, mp.Kappa(),1.);
1840
1981
  }
1982
+
1983
+ void AllocateMemory()
1984
+ {
1985
+ for (auto & child : childs)
1986
+ if (child)
1987
+ child->AllocateMemory();
1988
+
1989
+ if (total_targets > 0)
1990
+ Allocate();
1991
+ // mp = SphericalExpansion<Regular,elem_type>(MPOrder(r*mp.Kappa()), mp.Kappa(), r); // -1, mp.Kappa(),1.);
1992
+ }
1993
+
1994
+
1841
1995
 
1842
1996
 
1843
1997
  void Print (ostream & ost, size_t childnr = -1) const
@@ -1863,7 +2017,8 @@ namespace ngsbem
1863
2017
  : root(center, r, 0, asingmp->Kappa()), singmp(asingmp)
1864
2018
  {
1865
2019
  if (!singmp->havemp) throw Exception("first call Calc for singular MP");
1866
-
2020
+ root.Allocate();
2021
+
1867
2022
  nodes_on_level = 0;
1868
2023
  nodes_on_level[0] = 1;
1869
2024
  {
@@ -1901,73 +2056,98 @@ namespace ngsbem
1901
2056
  root.AddTarget (t);
1902
2057
  }
1903
2058
 
2059
+ void AddVolumeTarget (Vec<3> t, double r)
2060
+ {
2061
+ root.AddVolumeTarget (t, r);
2062
+ }
2063
+
1904
2064
  void CalcMP(shared_ptr<SingularMLExpansion<elem_type>> asingmp, bool onlytargets = true)
1905
2065
  {
1906
2066
  static Timer t("mptool regular MLMP"); RegionTimer rg(t);
2067
+ static Timer tremove("removeempty");
1907
2068
  static Timer trec("mptool regular MLMP - recording");
1908
2069
  static Timer tsort("mptool regular MLMP - sort");
1909
2070
 
1910
2071
  singmp = asingmp;
1911
2072
 
2073
+
1912
2074
  root.CalcTotalTargets();
2075
+ // cout << "before remove empty trees:" << endl;
2076
+ // PrintStatistics(cout);
2077
+
2078
+ /*
2079
+ tremove.Start();
1913
2080
  if (onlytargets)
1914
2081
  root.RemoveEmptyTrees();
1915
-
2082
+ tremove.Stop();
2083
+ */
1916
2084
 
1917
- // root.AddSingularNode(singmp->root, !onlytargets, nullptr);
2085
+ root.AllocateMemory();
1918
2086
 
1919
- // /*
1920
- Array<RecordingRS> recording;
1921
- {
1922
- RegionTimer rrec(trec);
1923
- root.AddSingularNode(singmp->root, !onlytargets, &recording);
1924
- }
1925
-
1926
- // cout << "recorded: " << recording.Size() << endl;
1927
- {
1928
- RegionTimer reg(tsort);
1929
- QuickSort (recording, [] (auto & a, auto & b)
1930
- {
1931
- if (a.len < (1-1e-8) * b.len) return true;
1932
- if (a.len > (1+1e-8) * b.len) return false;
1933
- return a.theta < b.theta;
1934
- });
1935
- }
1936
-
1937
- double current_len = -1e100;
1938
- double current_theta = -1e100;
1939
- Array<RecordingRS*> current_batch;
1940
- Array<Array<RecordingRS*>> batch_group;
1941
- Array<double> group_lengths;
1942
- Array<double> group_thetas;
1943
- for (auto & record : recording)
2087
+ // cout << "after allocating regular:" << endl;
2088
+ // PrintStatistics(cout);
2089
+
2090
+ // cout << "starting S-R converion" << endl;
2091
+ // PrintStatistics(cout);
2092
+
2093
+
2094
+ if constexpr (false)
1944
2095
  {
1945
- bool len_changed = fabs(record.len - current_len) > 1e-8;
1946
- bool theta_changed = fabs(record.theta - current_theta) > 1e-8;
1947
- if ((len_changed || theta_changed) && current_batch.Size() > 0) {
2096
+ root.AddSingularNode(singmp->root, !onlytargets, nullptr);
2097
+ }
2098
+ else
2099
+ { // use recording
2100
+ Array<RecordingRS> recording;
2101
+ {
2102
+ RegionTimer rrec(trec);
2103
+ root.AddSingularNode(singmp->root, !onlytargets, &recording);
2104
+ }
2105
+
2106
+ // cout << "recorded: " << recording.Size() << endl;
2107
+ {
2108
+ RegionTimer reg(tsort);
2109
+ QuickSort (recording, [] (auto & a, auto & b)
2110
+ {
2111
+ if (a.len < (1-1e-8) * b.len) return true;
2112
+ if (a.len > (1+1e-8) * b.len) return false;
2113
+ return a.theta < b.theta;
2114
+ });
2115
+ }
2116
+
2117
+ double current_len = -1e100;
2118
+ double current_theta = -1e100;
2119
+ Array<RecordingRS*> current_batch;
2120
+ Array<Array<RecordingRS*>> batch_group;
2121
+ Array<double> group_lengths;
2122
+ Array<double> group_thetas;
2123
+ for (auto & record : recording)
2124
+ {
2125
+ bool len_changed = fabs(record.len - current_len) > 1e-8;
2126
+ bool theta_changed = fabs(record.theta - current_theta) > 1e-8;
2127
+ if ((len_changed || theta_changed) && current_batch.Size() > 0) {
2128
+ // ProcessBatch(current_batch, current_len, current_theta);
2129
+ batch_group.Append(current_batch);
2130
+ group_lengths.Append(current_len);
2131
+ group_thetas.Append(current_theta);
2132
+ current_batch.SetSize(0);
2133
+ }
2134
+
2135
+ current_len = record.len;
2136
+ current_theta = record.theta;
2137
+ current_batch.Append(&record);
2138
+ }
2139
+ if (current_batch.Size() > 0) {
1948
2140
  // ProcessBatch(current_batch, current_len, current_theta);
1949
2141
  batch_group.Append(current_batch);
1950
2142
  group_lengths.Append(current_len);
1951
2143
  group_thetas.Append(current_theta);
1952
- current_batch.SetSize(0);
1953
- }
1954
-
1955
- current_len = record.len;
1956
- current_theta = record.theta;
1957
- current_batch.Append(&record);
2144
+ }
2145
+
2146
+ ParallelFor(batch_group.Size(), [&](int i) {
2147
+ ProcessBatchRS(batch_group[i], group_lengths[i], group_thetas[i]);
2148
+ }, TasksPerThread(4));
1958
2149
  }
1959
- if (current_batch.Size() > 0) {
1960
- // ProcessBatch(current_batch, current_len, current_theta);
1961
- batch_group.Append(current_batch);
1962
- group_lengths.Append(current_len);
1963
- group_thetas.Append(current_theta);
1964
- }
1965
-
1966
- ParallelFor(batch_group.Size(), [&](int i) {
1967
- ProcessBatchRS(batch_group[i], group_lengths[i], group_thetas[i]);
1968
- }, TasksPerThread(4));
1969
- // */
1970
-
2150
+
1971
2151
 
1972
2152
  /*
1973
2153
  int maxlevel = 0;
@@ -1978,10 +2158,49 @@ namespace ngsbem
1978
2158
  cout << "reg " << i << ": " << RegularMLExpansion::nodes_on_level[i] << endl;
1979
2159
  */
1980
2160
 
2161
+ // cout << "starting R-R converion" << endl;
2162
+ // PrintStatistics(cout);
2163
+
1981
2164
  static Timer tloc("mptool regular localize expansion"); RegionTimer rloc(tloc);
1982
2165
  root.LocalizeExpansion(!onlytargets);
2166
+
2167
+
2168
+ // cout << "R-R conversion done" << endl;
2169
+ // PrintStatistics(cout);
1983
2170
  }
1984
2171
 
2172
+ void PrintStatistics (ostream & ost)
2173
+ {
2174
+ int levels = 0;
2175
+ int cnt = 0;
2176
+ root.TraverseTree( [&](Node & node) {
2177
+ levels = max(levels, node.level);
2178
+ cnt++;
2179
+ });
2180
+ ost << "levels: " << levels << endl;
2181
+ ost << "nodes: " << cnt << endl;
2182
+
2183
+ Array<int> num_on_level(levels+1);
2184
+ Array<int> order_on_level(levels+1);
2185
+ Array<size_t> coefs_on_level(levels+1);
2186
+ num_on_level = 0;
2187
+ order_on_level = 0;
2188
+ root.TraverseTree( [&](Node & node) {
2189
+ num_on_level[node.level]++;
2190
+ order_on_level[node.level] = max(order_on_level[node.level],node.mp.Order());
2191
+ coefs_on_level[node.level] += node.mp.SH().Coefs().Size();
2192
+ });
2193
+
2194
+ cout << "num on level" << endl;
2195
+ for (int i = 0; i < num_on_level.Size(); i++)
2196
+ cout << i << ": " << num_on_level[i] << ", order = " << order_on_level[i] << ", coefs " << coefs_on_level[i] << endl;
2197
+
2198
+ size_t totcoefs = 0;
2199
+ for (auto n : coefs_on_level)
2200
+ totcoefs += n;
2201
+ cout << "total mem in coefs: " << sizeof(elem_type)*totcoefs / sqr(1024) << " MB" << endl;
2202
+ }
2203
+
1985
2204
  void Print (ostream & ost) const
1986
2205
  {
1987
2206
  root.Print(ost);
@@ -2001,6 +2220,7 @@ namespace ngsbem
2001
2220
  {
2002
2221
  // static Timer t("mptool Eval MLMP regular"); RegionTimer r(t);
2003
2222
  // if (L2Norm(p-root.center) > root.r) return elem_type{0.0};
2223
+
2004
2224
  if (MaxNorm(p-root.center) > root.r)
2005
2225
  return singmp->Evaluate(p);
2006
2226
  return root.Evaluate(p);
@@ -1544,7 +1544,7 @@ namespace ngfem
1544
1544
 
1545
1545
  if (mmax+1 > matA.Height() || nmax > matA.Width())
1546
1546
  {
1547
- for (double m = 0; m <= mmax; m++)
1547
+ for (int m = 0; m <= mmax; m++)
1548
1548
  {
1549
1549
  if (m > 0)
1550
1550
  y(m,m)=y(m-1,m-1)*u*sqrt((2*m-1.0)/(2*m));
@@ -1558,7 +1558,7 @@ namespace ngfem
1558
1558
  }
1559
1559
  else
1560
1560
  {
1561
- for (double m = 0; m <= mmax; m++)
1561
+ for (int m = 0; m <= mmax; m++)
1562
1562
  {
1563
1563
  if (m > 0)
1564
1564
  y(m,m)=y(m-1,m-1)*u*sqrt((2*m-1.0)/(2*m));
@@ -619,7 +619,7 @@ namespace ngla
619
619
 
620
620
 
621
621
  BaseMatrix::OperatorInfo GetOperatorInfo () const override
622
- { return { string("SparseMatrix")+typeid(TM).name(), this->Height(), this->Width() }; }
622
+ { return { string("SparseMatrix")+typeid(TM).name()+" (nze="+ToString(this->NZE())+")", this->Height(), this->Width() }; }
623
623
 
624
624
  virtual shared_ptr<BaseJacobiPrecond>
625
625
  CreateJacobiPrecond (shared_ptr<BitArray> inner) const override;
netgen/libngbla.dylib CHANGED
Binary file
netgen/libngla.dylib CHANGED
Binary file
netgen/libngsbem.dylib CHANGED
Binary file
netgen/libngstd.dylib CHANGED
Binary file
@@ -1,4 +1,4 @@
1
- set(PACKAGE_VERSION "6.2.2506-33-g6156da6de")
1
+ set(PACKAGE_VERSION "6.2.2506-38-gc3cacfb0d")
2
2
  find_package(Netgen CONFIG REQUIRED HINTS
3
3
  ${CMAKE_CURRENT_LIST_DIR}
4
4
  ${CMAKE_CURRENT_LIST_DIR}/..
ngsolve/config/config.py CHANGED
@@ -29,15 +29,15 @@ NGSOLVE_INSTALL_DIR_INCLUDE = "netgen/include"
29
29
  NGSOLVE_INSTALL_DIR_CMAKE = "ngsolve/cmake"
30
30
  NGSOLVE_INSTALL_DIR_RES = "share"
31
31
 
32
- NGSOLVE_VERSION = "6.2.2506-33-g6156da6de"
33
- NGSOLVE_VERSION_GIT = "v6.2.2506-33-g6156da6de"
34
- NGSOLVE_VERSION_PYTHON = "6.2.2506.post33.dev0"
32
+ NGSOLVE_VERSION = "6.2.2506-38-gc3cacfb0d"
33
+ NGSOLVE_VERSION_GIT = "v6.2.2506-38-gc3cacfb0d"
34
+ NGSOLVE_VERSION_PYTHON = "6.2.2506.post38.dev0"
35
35
 
36
36
  NGSOLVE_VERSION_MAJOR = "6"
37
37
  NGSOLVE_VERSION_MINOR = "2"
38
- NGSOLVE_VERSION_TWEAK = "33"
38
+ NGSOLVE_VERSION_TWEAK = "38"
39
39
  NGSOLVE_VERSION_PATCH = "2506"
40
- NGSOLVE_VERSION_HASH = "g6156da6de"
40
+ NGSOLVE_VERSION_HASH = "gc3cacfb0d"
41
41
 
42
42
  CMAKE_CXX_COMPILER = "/Library/Developer/CommandLineTools/usr/bin/c++"
43
43
  CMAKE_CUDA_COMPILER = ""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ngsolve
3
- Version: 6.2.2506.post33.dev0
3
+ Version: 6.2.2506.post38.dev0
4
4
  Summary: NGSolve
5
5
  Home-page: UNKNOWN
6
6
  Author: The NGSolve team
@@ -1,10 +1,10 @@
1
- netgen/libngbla.dylib,sha256=XDwtDShFY_Fi9zqZjikucEjMOlhDB0K0POHMqCYA9EE,5843696
1
+ netgen/libngbla.dylib,sha256=ZOlzqse7U8QcNan8r9GtP-IW6VJwYRlRhcgIvzl-nNM,5843696
2
2
  netgen/libngcomp.dylib,sha256=74YTw75xzhamLyyLU-19KFz0VQXzv2a80tD4k1MeZqI,43080880
3
3
  netgen/libngfem.dylib,sha256=dEs9afYyCk3qq1hBFIB2szk7A1YUl4z_otznJKLHeMI,51660448
4
- netgen/libngla.dylib,sha256=CopgJkFcih0muXQxeqSTuHeGmRBjxL9xHfFz3lsb9sw,25535056
5
- netgen/libngsbem.dylib,sha256=U4HF6vX1d8sA5XTJjnMh5qEHtG68oiJarqWZ5FBRA2A,8670848
4
+ netgen/libngla.dylib,sha256=thBr2gtGR-N9UqS8cb0PUHcQqXBhKQHdpSNDhB6kz1U,25551600
5
+ netgen/libngsbem.dylib,sha256=zI7OepC4X3UpfSlUZgdFc5rGdY4VLJnDpKDUs5YAb_E,8739232
6
6
  netgen/libngsolve.dylib,sha256=CofNl7Q0kJY44t5enNNoczxpNct_Zh7yWZAIFDrFOe8,944192
7
- netgen/libngstd.dylib,sha256=AX7BILJuUxt3RXvYmlok3T9WkzKKk8wsoNmU61yRu-M,923728
7
+ netgen/libngstd.dylib,sha256=ZbMuvLBDA-Sh4NWK5RY5W1XkYW1GcVxz9pTqIQwD9Ac,923728
8
8
  netgen/include/analytic_integrals.hpp,sha256=xLVJ8n0-t6UlU_yKE8i0vYkXilsNuqVixkzJlmxptKw,238
9
9
  netgen/include/arnoldi.hpp,sha256=b8mRu9wGyaLa7z6mXCFIhxfW_xcQvsOMD6TqbfYZ05g,1437
10
10
  netgen/include/bandmatrix.hpp,sha256=zwKz89QY53MPsWgNsl0cXEAFKka_W4sXPIO54M3eT80,7778
@@ -103,7 +103,7 @@ netgen/include/intrule.hpp,sha256=VSDdG7fpraQHY1eZFaKo7bLyfpwBjMM0Z2qJgcmYW3w,80
103
103
  netgen/include/intrules_SauterSchwab.hpp,sha256=1HiSgmdJHNoCp1ZYY7gNFPHdanepbGtay2YJrTaYHBg,650
104
104
  netgen/include/irspace.hpp,sha256=DcpkPMFKx5nDvfLfTWKmpYuLX-X5rBuWF8Ta9e__m-A,1508
105
105
  netgen/include/jacobi.hpp,sha256=hFhMn5Q46_DxHGofXV_or5VCTREslMvpccV7FZCAefE,4738
106
- netgen/include/kernels.hpp,sha256=y_1yU-qxjPnABR_ULj8NxHR249kGVNsVtNJcKWBQvy4,20490
106
+ netgen/include/kernels.hpp,sha256=tqjNDYZqsjlJm3XbXXqK5Fmq40_ECGPNg6yPJmrcOHc,20479
107
107
  netgen/include/l2hofe.hpp,sha256=Qjg5jtkhx8cE1gUdoKslhKTqlUg9qbAbL8g4NTMCW2s,6650
108
108
  netgen/include/l2hofe_impl.hpp,sha256=-rWVybAL7QTkfNNXAz1tP4RYQcBuOVYLTZE3E502tuA,15848
109
109
  netgen/include/l2hofefo.hpp,sha256=sQhmfliTW2Ac_XLucufzbRdtSRr471i3qPFAMSByvU0,16592
@@ -115,7 +115,7 @@ netgen/include/memusage.hpp,sha256=H-8rWQ8UQDCnOiYQnbwvILPuPoJD8bqwiNGB2QAUa0o,1
115
115
  netgen/include/meshaccess.hpp,sha256=j5dinD-8bVm18MkVqG9j-IhhZUHHXw3erdZy-LHxl-8,47133
116
116
  netgen/include/mgpre.hpp,sha256=zdNozWRSyluOF8E4GLeOR290Yw2wqGYGc1sTTSB5n3U,4825
117
117
  netgen/include/mp_coefficient.hpp,sha256=AvH0tzkfqeOGZiydF2f0-M7vtW-29szci-9Krpl_Dow,4980
118
- netgen/include/mptools.hpp,sha256=WlC1nA9v7uBzJxzLe7hDqTEdeFE_WCZjIakw7bE2B7g,63496
118
+ netgen/include/mptools.hpp,sha256=PIBiO1_z-DKPskD9LVSK_UptikVzIj057lPEyPOZ92g,70190
119
119
  netgen/include/multigrid.hpp,sha256=ovl1GXcTfXuYLVVMcFfCKP5sg6diSGlqdjCMMPCgFUo,856
120
120
  netgen/include/multivector.hpp,sha256=nuLxMiq2y6HoH5w9j6ka2BhJjRyREPeEnNFx_x0SMU0,12635
121
121
  netgen/include/mumpsinverse.hpp,sha256=Jaa5NPQzwPo2kSbHijI_LX3tr0qUmVhqVlRM14KeD18,4062
@@ -152,7 +152,7 @@ netgen/include/python_comp.hpp,sha256=IVR8USVPy6hf1ZksUCUjvXcK7lcnyTpqzteR8a6Sbl
152
152
  netgen/include/python_fem.hpp,sha256=9-GoQrCprOReAgK9-v_X3NwGWJ229vmGjtwGI9td5GA,3072
153
153
  netgen/include/python_linalg.hpp,sha256=JBDn31Fq7yaOsMgtXQFJfrOd46A12XXpTWF8lPV3btQ,1703
154
154
  netgen/include/python_ngstd.hpp,sha256=Xh4Laie5rhhiDOqhWJAvita06hIx3gETbZCppVdWMF4,10417
155
- netgen/include/recursive_pol.hpp,sha256=IuvhQDWGHRjkY2PRnvPmUYhL5NGazTvMkrkoX6AMHfc,120333
155
+ netgen/include/recursive_pol.hpp,sha256=Tj3STxfSMttxtoqT7H6Hghi39rDgRFi9RldR126kNn4,120327
156
156
  netgen/include/recursive_pol_tet.hpp,sha256=axXeTNYOr6hQsYmdmcD_Ogh4XPQeOIVaD0ofKGkLuA8,9468
157
157
  netgen/include/recursive_pol_trig.hpp,sha256=_nH74Ls5-T_RzwzqH71tYRUhjCYJ47Yy5UmBEXUrLcg,10841
158
158
  netgen/include/reorderedfespace.hpp,sha256=yyGqCDgUMYTLnzr2s9eZBG61WCS5NAdRbHoFh-BjekQ,3004
@@ -163,7 +163,7 @@ netgen/include/simd_complex.hpp,sha256=1L_WGuaYlR_xQdMMC4o0_aBX484GqrLuShG7pHG4i
163
163
  netgen/include/smoother.hpp,sha256=hZAe15R6BU88hMfhcTM3-eclRgzmHJnPKgYYWol9Sx8,6643
164
164
  netgen/include/solve.hpp,sha256=OZQfkg6HN20eudQ4kkRSecr-miwV35NPEjAtoMcunG4,2034
165
165
  netgen/include/sparsecholesky.hpp,sha256=2HKM6aKO02YX32jxGna6CAjBBfeXvCsmPk4hoWZWIQk,8888
166
- netgen/include/sparsematrix.hpp,sha256=7YN50okcY5Lxipc43njHPKzzKZ_gLtMhwQB_Jsj99rE,32706
166
+ netgen/include/sparsematrix.hpp,sha256=3FCqp4zDtgi0CnrLdmmxzHiiub4jpIqg4yR1-eWQc8Q,32741
167
167
  netgen/include/sparsematrix_dyn.hpp,sha256=u9aWEYl6PhrevL9SPSXVE22_EIwIduDDvzY8xgIsw4Q,2656
168
168
  netgen/include/sparsematrix_impl.hpp,sha256=neN0xhP5nkT90B3U-u2uX2dgqU3l6m_zhsAihI8XtF0,30219
169
169
  netgen/include/special_matrix.hpp,sha256=1moUjxQ_uaS-GWrSbrbN4c8N3pDma9UpSaFqrNUXV80,16526
@@ -216,12 +216,12 @@ ngsolve/timestepping.py,sha256=SLbsgE5pY5tXYTLGlVypk4kS2Ui8GxOwWmKVxqneZRU,8350
216
216
  ngsolve/timing.py,sha256=Xqkq2byJjNNK9vJjHG2O3cMf6xuKIyySjk8yv6Le2T8,3985
217
217
  ngsolve/utils.py,sha256=V2yVF4K3uv1007-DEs_GrzJ3BOOh09c4lDGGR1Xw-PU,4557
218
218
  ngsolve/webgui.py,sha256=EUhaOtWHZy80aLXhXbHwbCQVNjRSw-BAAE50cz7Ydaw,24313
219
- ngsolve/cmake/NGSolveConfig.cmake,sha256=Vf_CwbC3nJFlV8sMJEUP5WGHKrJ5seLZNtriaWmCwCM,5054
219
+ ngsolve/cmake/NGSolveConfig.cmake,sha256=wV4NlmWrCQKa7-1qpkXgUN8kSp2iLLg0l3nqJ2IizvM,5054
220
220
  ngsolve/cmake/ngsolve-targets-release.cmake,sha256=2dUHzaaMQX08eT7Tjti0crzp_Ah3oqW86gp5UgSufmw,3426
221
221
  ngsolve/cmake/ngsolve-targets.cmake,sha256=1cQTFW-4aJfY356XRcuslSbFClmwPOSS03bj3WL15iM,5637
222
222
  ngsolve/config/__init__.py,sha256=A00lpnUKg-q3y_b-cN3jKF9urkGTGjb2Yz_gGc9WCLs,22
223
223
  ngsolve/config/__main__.py,sha256=m8k2RrXnXR5oYaUna1dwkKNhOZBiM7EyFSE9kIcZKvo,89
224
- ngsolve/config/config.py,sha256=7oBCfwbVVJ21WSNp7hrTv-2w1tTkiHhZ_VKoEoalXpw,2465
224
+ ngsolve/config/config.py,sha256=9OJGZqfIHOWhK83AGIG839PWAFq0PL1g1FeMYwxSrz8,2465
225
225
  ngsolve/demos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
226
226
  ngsolve/demos/TensorProduct/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
227
227
  ngsolve/demos/TensorProduct/tp_dg_1d_1d.py,sha256=CrJCkbJNinVYUL3DO-4DnCAMGSAhegNc0QVWiJTk3Js,2109
@@ -253,41 +253,41 @@ ngsolve/demos/mpi/mpi_cmagnet.py,sha256=HuN4lttA2q2kNWss6LZNUKraHqskRQNVEBRjkrU2
253
253
  ngsolve/demos/mpi/mpi_navierstokes.py,sha256=Sct0G6EziYVfeIeSa7_b6r3WiYXcxZekoOGsZQALx-c,2911
254
254
  ngsolve/demos/mpi/mpi_poisson.py,sha256=UvXODjpWtqIgqq7lvMJf3ZEoJZLY1Dck-82R7auiW6I,2468
255
255
  ngsolve/demos/mpi/mpi_timeDG.py,sha256=TPJZ-DwmzOpuAol-fFKeU-R2rJ74MbjOm3DDkQI9BcY,1881
256
- ngsolve-6.2.2506.post33.dev0.data/data/Netgen.icns,sha256=Ebqct4LKxLzxdJLwGg0tTUQb1VjLwkKhtmdYhpRhKjg,291475
257
- ngsolve-6.2.2506.post33.dev0.data/data/bin/ngscxx,sha256=ELkWfd_zU4SS4gatogC7PjTVMj4mk-PuJ3Pq2zCUJa8,1751
258
- ngsolve-6.2.2506.post33.dev0.data/data/bin/ngsld,sha256=50UErkFWLTocn8GtZDTkUWmPTIqsoK5lcfBGwyP0Vnc,557
259
- ngsolve-6.2.2506.post33.dev0.data/data/bin/ngsolve.tcl,sha256=SSBYLyp4zgl6eM17LXIiLoj1Doy-h2s4EZg6oKi6ucA,20995
260
- ngsolve-6.2.2506.post33.dev0.data/data/bin/ngspy,sha256=KEtzflkZPs86Jnf7knSPWZqLlX70W7P1iyoyxbzMsec,104
261
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/beam.geo,sha256=EtxklGAIo6SxZlHHC_FZHoQGZqZUDGJQSheEMFO-bJ8,387
262
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/beam.vol,sha256=aotG4VA7sIgAsPQsYkzbMP1Jta_TddG2gMCblkSPkqc,13594
263
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/chip.in2d,sha256=g6C-mcoD8-q9JtZpuh4mf4iFEZUIGvvivp4C5YYMlAw,551
264
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/chip.vol,sha256=if0yLn8E3P4mZ_X5sBcrEIp2C4ZhMysGROtB1YCkJHI,27897
265
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/coil.geo,sha256=PVD4I9ztZowKwNOUrjnoOP7Tj2KG9J0UCJFRS9EhlxU,364
266
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/coil.vol,sha256=IOZe4oPxMUa9vBGJWN4LG9M79XAruY23S2rtAh_2_98,144724
267
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/coilshield.geo,sha256=lCUDCAhfowBttSGEY_giyY0xEFInAbgVfIPwSWBb504,605
268
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/coilshield.vol,sha256=2Dq5VCX7dqGxo_ExtUhI716I-SnxhLGPawW29IR9nYY,162397
269
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/cube.geo,sha256=kbBNVUYVSf1ogV7-Xf31KXju3LCUIPaDLfvwZHMgddI,386
270
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/cube.vol,sha256=54108a3RvrTUOJSFltxUY8iiNzyWoBTtNrWM0kufj7c,90295
271
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde,sha256=bPQAvbYlyvCfLzk9cOzjXDn94UFC_vBCONl7fEIaMVs,1304
272
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde,sha256=Mq3Ap63mWqjQyXsASFAlkRQ0AWxBlY3BYYejTYd-lwg,1101
273
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/d1_square.pde,sha256=ysOroxhoAOePmB_Aswps9iGjA2qV5435iu3hOnSvN8M,1029
274
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/d2_chip.pde,sha256=AowiGbuAWEdyFUB3d1LlZeQ7rarbkqIYsj1QcWc89-A,950
275
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/d3_helmholtz.pde,sha256=nG0HxrxboI2qGoR5_LNZt7RYB7ji2o5jtkyIqTFR4y8,568
276
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/d4_cube.pde,sha256=-C4RgoVtBXZu7XHCwZy7F7pr_PGNGcRwWCFzBppq1mQ,1033
277
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/d5_beam.pde,sha256=QOYC7YN7LdcjSFeLdJu1Tlfi-lmsVsa7b9G6qoCsGo8,1985
278
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/d6_shaft.pde,sha256=Iua3INfuIUeaBk21qNg4u5KZt__H1B8BZUsy5frjhdY,1901
279
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/d7_coil.pde,sha256=-ELH2obynMJcvSOqoYT1OThXcllIcdss0ZrklLSimZw,1200
280
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/d8_coilshield.pde,sha256=WUUulvd3dsedB25sFVQgU7FgZ3B7BkbxgkXTEBglk1w,1141
281
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/d9_hybridDG.pde,sha256=drLxnz1GvCEeme-FV772cGbS-YTgeUB4G5DrbkLdapw,1479
282
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/doubleglazing.in2d,sha256=bKn7m7eCcoLimGgoO3nxhiu7Mm0lIRnbx0TJh5dC1I0,506
283
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/doubleglazing.vol,sha256=Eg-H6nl2Hd5Nr593SFCCLVTDl25kIXuddrWpd7xlrP8,34987
284
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz,sha256=RuxM0vtYljoAImOH6U6avt0LmWaUbGNao37n8p_Yd1w,496477
285
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/shaft.geo,sha256=aPbk4EItJSLN_PjpOejnijk74y53QBW-IPCXHvLNlVs,2434
286
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/shaft.vol,sha256=fT8qu1L-p0MkI-l3WVisKG52W5FCzO_NzXaCvMJT1V4,270450
287
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/square.in2d,sha256=evpVgNNzReABv6bIs4J_r1OFeedMppoS-TEzE-tfKgY,192
288
- ngsolve-6.2.2506.post33.dev0.data/data/share/ngsolve/square.vol,sha256=IXIHYmq85hkFsMVZ_vEVthUnd0YTQWE4jRegjW8_ImI,9162
289
- ngsolve-6.2.2506.post33.dev0.dist-info/LICENSE,sha256=oZDcnIBDdV2Q-LCnX6ZrnkLUr0yYC_XdxjPwEk2zzuc,26430
290
- ngsolve-6.2.2506.post33.dev0.dist-info/METADATA,sha256=i887IOFTDJPM5e5MPTbcFskWcSdIKmE6vIukt0hnTnY,247
291
- ngsolve-6.2.2506.post33.dev0.dist-info/WHEEL,sha256=GUjFiIxJsa64p6UL_1XdSua8mJHV9PIo6rgmnfjsOyw,108
292
- ngsolve-6.2.2506.post33.dev0.dist-info/top_level.txt,sha256=1llU44DxNIP85uPT4RChsIuV3h2d0_5j0Ui_Df5vV8E,15
293
- ngsolve-6.2.2506.post33.dev0.dist-info/RECORD,,
256
+ ngsolve-6.2.2506.post38.dev0.data/data/Netgen.icns,sha256=Ebqct4LKxLzxdJLwGg0tTUQb1VjLwkKhtmdYhpRhKjg,291475
257
+ ngsolve-6.2.2506.post38.dev0.data/data/bin/ngscxx,sha256=ELkWfd_zU4SS4gatogC7PjTVMj4mk-PuJ3Pq2zCUJa8,1751
258
+ ngsolve-6.2.2506.post38.dev0.data/data/bin/ngsld,sha256=50UErkFWLTocn8GtZDTkUWmPTIqsoK5lcfBGwyP0Vnc,557
259
+ ngsolve-6.2.2506.post38.dev0.data/data/bin/ngsolve.tcl,sha256=SSBYLyp4zgl6eM17LXIiLoj1Doy-h2s4EZg6oKi6ucA,20995
260
+ ngsolve-6.2.2506.post38.dev0.data/data/bin/ngspy,sha256=KEtzflkZPs86Jnf7knSPWZqLlX70W7P1iyoyxbzMsec,104
261
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/beam.geo,sha256=EtxklGAIo6SxZlHHC_FZHoQGZqZUDGJQSheEMFO-bJ8,387
262
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/beam.vol,sha256=aotG4VA7sIgAsPQsYkzbMP1Jta_TddG2gMCblkSPkqc,13594
263
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/chip.in2d,sha256=g6C-mcoD8-q9JtZpuh4mf4iFEZUIGvvivp4C5YYMlAw,551
264
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/chip.vol,sha256=if0yLn8E3P4mZ_X5sBcrEIp2C4ZhMysGROtB1YCkJHI,27897
265
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/coil.geo,sha256=PVD4I9ztZowKwNOUrjnoOP7Tj2KG9J0UCJFRS9EhlxU,364
266
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/coil.vol,sha256=IOZe4oPxMUa9vBGJWN4LG9M79XAruY23S2rtAh_2_98,144724
267
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/coilshield.geo,sha256=lCUDCAhfowBttSGEY_giyY0xEFInAbgVfIPwSWBb504,605
268
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/coilshield.vol,sha256=2Dq5VCX7dqGxo_ExtUhI716I-SnxhLGPawW29IR9nYY,162397
269
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/cube.geo,sha256=kbBNVUYVSf1ogV7-Xf31KXju3LCUIPaDLfvwZHMgddI,386
270
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/cube.vol,sha256=54108a3RvrTUOJSFltxUY8iiNzyWoBTtNrWM0kufj7c,90295
271
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde,sha256=bPQAvbYlyvCfLzk9cOzjXDn94UFC_vBCONl7fEIaMVs,1304
272
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde,sha256=Mq3Ap63mWqjQyXsASFAlkRQ0AWxBlY3BYYejTYd-lwg,1101
273
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/d1_square.pde,sha256=ysOroxhoAOePmB_Aswps9iGjA2qV5435iu3hOnSvN8M,1029
274
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/d2_chip.pde,sha256=AowiGbuAWEdyFUB3d1LlZeQ7rarbkqIYsj1QcWc89-A,950
275
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/d3_helmholtz.pde,sha256=nG0HxrxboI2qGoR5_LNZt7RYB7ji2o5jtkyIqTFR4y8,568
276
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/d4_cube.pde,sha256=-C4RgoVtBXZu7XHCwZy7F7pr_PGNGcRwWCFzBppq1mQ,1033
277
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/d5_beam.pde,sha256=QOYC7YN7LdcjSFeLdJu1Tlfi-lmsVsa7b9G6qoCsGo8,1985
278
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/d6_shaft.pde,sha256=Iua3INfuIUeaBk21qNg4u5KZt__H1B8BZUsy5frjhdY,1901
279
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/d7_coil.pde,sha256=-ELH2obynMJcvSOqoYT1OThXcllIcdss0ZrklLSimZw,1200
280
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/d8_coilshield.pde,sha256=WUUulvd3dsedB25sFVQgU7FgZ3B7BkbxgkXTEBglk1w,1141
281
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/d9_hybridDG.pde,sha256=drLxnz1GvCEeme-FV772cGbS-YTgeUB4G5DrbkLdapw,1479
282
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/doubleglazing.in2d,sha256=bKn7m7eCcoLimGgoO3nxhiu7Mm0lIRnbx0TJh5dC1I0,506
283
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/doubleglazing.vol,sha256=Eg-H6nl2Hd5Nr593SFCCLVTDl25kIXuddrWpd7xlrP8,34987
284
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz,sha256=RuxM0vtYljoAImOH6U6avt0LmWaUbGNao37n8p_Yd1w,496477
285
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/shaft.geo,sha256=aPbk4EItJSLN_PjpOejnijk74y53QBW-IPCXHvLNlVs,2434
286
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/shaft.vol,sha256=fT8qu1L-p0MkI-l3WVisKG52W5FCzO_NzXaCvMJT1V4,270450
287
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/square.in2d,sha256=evpVgNNzReABv6bIs4J_r1OFeedMppoS-TEzE-tfKgY,192
288
+ ngsolve-6.2.2506.post38.dev0.data/data/share/ngsolve/square.vol,sha256=IXIHYmq85hkFsMVZ_vEVthUnd0YTQWE4jRegjW8_ImI,9162
289
+ ngsolve-6.2.2506.post38.dev0.dist-info/LICENSE,sha256=oZDcnIBDdV2Q-LCnX6ZrnkLUr0yYC_XdxjPwEk2zzuc,26430
290
+ ngsolve-6.2.2506.post38.dev0.dist-info/METADATA,sha256=y_1WdI_ec6rNwqmlK31-5Bheu-U5iKjzPZfmeQPowLg,247
291
+ ngsolve-6.2.2506.post38.dev0.dist-info/WHEEL,sha256=GUjFiIxJsa64p6UL_1XdSua8mJHV9PIo6rgmnfjsOyw,108
292
+ ngsolve-6.2.2506.post38.dev0.dist-info/top_level.txt,sha256=1llU44DxNIP85uPT4RChsIuV3h2d0_5j0Ui_Df5vV8E,15
293
+ ngsolve-6.2.2506.post38.dev0.dist-info/RECORD,,