ngsolve 6.2.2506.post74.dev0__cp314-cp314-macosx_10_15_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ngsolve might be problematic. Click here for more details.
- netgen/include/analytic_integrals.hpp +10 -0
- netgen/include/arnoldi.hpp +55 -0
- netgen/include/bandmatrix.hpp +334 -0
- netgen/include/basematrix.hpp +957 -0
- netgen/include/basevector.hpp +1268 -0
- netgen/include/bdbequations.hpp +2805 -0
- netgen/include/bdbintegrator.hpp +1660 -0
- netgen/include/bem_diffops.hpp +475 -0
- netgen/include/bessel.hpp +1064 -0
- netgen/include/bilinearform.hpp +963 -0
- netgen/include/bla.hpp +29 -0
- netgen/include/blockalloc.hpp +95 -0
- netgen/include/blockjacobi.hpp +328 -0
- netgen/include/bspline.hpp +116 -0
- netgen/include/calcinverse.hpp +141 -0
- netgen/include/cg.hpp +368 -0
- netgen/include/chebyshev.hpp +44 -0
- netgen/include/cholesky.hpp +720 -0
- netgen/include/clapack.h +7254 -0
- netgen/include/code_generation.hpp +296 -0
- netgen/include/coefficient.hpp +2033 -0
- netgen/include/coefficient_impl.hpp +19 -0
- netgen/include/coefficient_stdmath.hpp +167 -0
- netgen/include/commutingAMG.hpp +106 -0
- netgen/include/comp.hpp +79 -0
- netgen/include/compatibility.hpp +41 -0
- netgen/include/complex_wrapper.hpp +73 -0
- netgen/include/compressedfespace.hpp +110 -0
- netgen/include/contact.hpp +235 -0
- netgen/include/diagonalmatrix.hpp +154 -0
- netgen/include/differentialoperator.hpp +276 -0
- netgen/include/diffop.hpp +1286 -0
- netgen/include/diffop_impl.hpp +328 -0
- netgen/include/diffopwithfactor.hpp +123 -0
- netgen/include/discontinuous.hpp +84 -0
- netgen/include/dump.hpp +949 -0
- netgen/include/ectypes.hpp +121 -0
- netgen/include/eigen.hpp +60 -0
- netgen/include/eigensystem.hpp +18 -0
- netgen/include/elasticity_equations.hpp +595 -0
- netgen/include/elementbyelement.hpp +195 -0
- netgen/include/elementtopology.hpp +1760 -0
- netgen/include/elementtransformation.hpp +339 -0
- netgen/include/evalfunc.hpp +405 -0
- netgen/include/expr.hpp +1686 -0
- netgen/include/facetfe.hpp +175 -0
- netgen/include/facetfespace.hpp +180 -0
- netgen/include/facethofe.hpp +111 -0
- netgen/include/facetsurffespace.hpp +112 -0
- netgen/include/fe_interfaces.hpp +32 -0
- netgen/include/fem.hpp +87 -0
- netgen/include/fesconvert.hpp +14 -0
- netgen/include/fespace.hpp +1449 -0
- netgen/include/finiteelement.hpp +286 -0
- netgen/include/globalinterfacespace.hpp +77 -0
- netgen/include/globalspace.hpp +115 -0
- netgen/include/gridfunction.hpp +525 -0
- netgen/include/h1amg.hpp +124 -0
- netgen/include/h1hofe.hpp +188 -0
- netgen/include/h1hofe_impl.hpp +1262 -0
- netgen/include/h1hofefo.hpp +148 -0
- netgen/include/h1hofefo_impl.hpp +185 -0
- netgen/include/h1hofespace.hpp +167 -0
- netgen/include/h1lofe.hpp +1240 -0
- netgen/include/h1lumping.hpp +41 -0
- netgen/include/hcurl_equations.hpp +1381 -0
- netgen/include/hcurlcurlfe.hpp +2241 -0
- netgen/include/hcurlcurlfespace.hpp +78 -0
- netgen/include/hcurlfe.hpp +259 -0
- netgen/include/hcurlfe_utils.hpp +107 -0
- netgen/include/hcurlhdiv_dshape.hpp +857 -0
- netgen/include/hcurlhdivfes.hpp +308 -0
- netgen/include/hcurlhofe.hpp +175 -0
- netgen/include/hcurlhofe_impl.hpp +1871 -0
- netgen/include/hcurlhofespace.hpp +193 -0
- netgen/include/hcurllofe.hpp +1146 -0
- netgen/include/hdiv_equations.hpp +880 -0
- netgen/include/hdivdivfe.hpp +2923 -0
- netgen/include/hdivdivsurfacespace.hpp +76 -0
- netgen/include/hdivfe.hpp +206 -0
- netgen/include/hdivfe_utils.hpp +717 -0
- netgen/include/hdivfes.hpp +75 -0
- netgen/include/hdivhofe.hpp +447 -0
- netgen/include/hdivhofe_impl.hpp +1107 -0
- netgen/include/hdivhofefo.hpp +229 -0
- netgen/include/hdivhofespace.hpp +177 -0
- netgen/include/hdivhosurfacefespace.hpp +106 -0
- netgen/include/hdivlofe.hpp +773 -0
- netgen/include/hidden.hpp +74 -0
- netgen/include/householder.hpp +181 -0
- netgen/include/hypre_ams_precond.hpp +123 -0
- netgen/include/hypre_precond.hpp +73 -0
- netgen/include/integrator.hpp +2012 -0
- netgen/include/integratorcf.hpp +253 -0
- netgen/include/interpolate.hpp +49 -0
- netgen/include/intrule.hpp +2542 -0
- netgen/include/intrules_SauterSchwab.hpp +25 -0
- netgen/include/irspace.hpp +49 -0
- netgen/include/jacobi.hpp +153 -0
- netgen/include/kernels.hpp +762 -0
- netgen/include/l2hofe.hpp +194 -0
- netgen/include/l2hofe_impl.hpp +564 -0
- netgen/include/l2hofefo.hpp +542 -0
- netgen/include/l2hofespace.hpp +344 -0
- netgen/include/la.hpp +38 -0
- netgen/include/linearform.hpp +266 -0
- netgen/include/matrix.hpp +2140 -0
- netgen/include/memusage.hpp +41 -0
- netgen/include/meshaccess.hpp +1359 -0
- netgen/include/mgpre.hpp +204 -0
- netgen/include/mp_coefficient.hpp +145 -0
- netgen/include/mptools.hpp +2281 -0
- netgen/include/multigrid.hpp +42 -0
- netgen/include/multivector.hpp +447 -0
- netgen/include/mumpsinverse.hpp +187 -0
- netgen/include/mycomplex.hpp +361 -0
- netgen/include/ng_lapack.hpp +1661 -0
- netgen/include/ngblas.hpp +1232 -0
- netgen/include/ngs_defines.hpp +30 -0
- netgen/include/ngs_stdcpp_include.hpp +106 -0
- netgen/include/ngs_utils.hpp +121 -0
- netgen/include/ngsobject.hpp +1019 -0
- netgen/include/ngsstream.hpp +113 -0
- netgen/include/ngstd.hpp +72 -0
- netgen/include/nodalhofe.hpp +96 -0
- netgen/include/nodalhofe_impl.hpp +141 -0
- netgen/include/normalfacetfe.hpp +223 -0
- netgen/include/normalfacetfespace.hpp +98 -0
- netgen/include/normalfacetsurfacefespace.hpp +84 -0
- netgen/include/order.hpp +251 -0
- netgen/include/parallel_matrices.hpp +222 -0
- netgen/include/paralleldofs.hpp +340 -0
- netgen/include/parallelngs.hpp +23 -0
- netgen/include/parallelvector.hpp +269 -0
- netgen/include/pardisoinverse.hpp +200 -0
- netgen/include/periodic.hpp +129 -0
- netgen/include/plateaufespace.hpp +25 -0
- netgen/include/pml.hpp +275 -0
- netgen/include/pmltrafo.hpp +631 -0
- netgen/include/postproc.hpp +142 -0
- netgen/include/potentialtools.hpp +22 -0
- netgen/include/precomp.hpp +60 -0
- netgen/include/preconditioner.hpp +602 -0
- netgen/include/prolongation.hpp +377 -0
- netgen/include/python_comp.hpp +107 -0
- netgen/include/python_fem.hpp +89 -0
- netgen/include/python_linalg.hpp +58 -0
- netgen/include/python_ngstd.hpp +386 -0
- netgen/include/recursive_pol.hpp +4896 -0
- netgen/include/recursive_pol_tet.hpp +395 -0
- netgen/include/recursive_pol_trig.hpp +492 -0
- netgen/include/reorderedfespace.hpp +81 -0
- netgen/include/sample_sort.hpp +105 -0
- netgen/include/scalarfe.hpp +335 -0
- netgen/include/shapefunction_utils.hpp +113 -0
- netgen/include/simd_complex.hpp +329 -0
- netgen/include/smoother.hpp +253 -0
- netgen/include/solve.hpp +89 -0
- netgen/include/sparsecholesky.hpp +313 -0
- netgen/include/sparsematrix.hpp +1038 -0
- netgen/include/sparsematrix_dyn.hpp +90 -0
- netgen/include/sparsematrix_impl.hpp +1013 -0
- netgen/include/special_matrix.hpp +463 -0
- netgen/include/specialelement.hpp +125 -0
- netgen/include/statushandler.hpp +33 -0
- netgen/include/stringops.hpp +12 -0
- netgen/include/superluinverse.hpp +136 -0
- netgen/include/symbolicintegrator.hpp +850 -0
- netgen/include/symmetricmatrix.hpp +144 -0
- netgen/include/tangentialfacetfe.hpp +224 -0
- netgen/include/tangentialfacetfespace.hpp +91 -0
- netgen/include/tensor.hpp +522 -0
- netgen/include/tensorcoefficient.hpp +446 -0
- netgen/include/tensorproductintegrator.hpp +113 -0
- netgen/include/thcurlfe.hpp +128 -0
- netgen/include/thcurlfe_impl.hpp +380 -0
- netgen/include/thdivfe.hpp +80 -0
- netgen/include/thdivfe_impl.hpp +492 -0
- netgen/include/tpdiffop.hpp +461 -0
- netgen/include/tpfes.hpp +133 -0
- netgen/include/tpintrule.hpp +224 -0
- netgen/include/triangular.hpp +465 -0
- netgen/include/tscalarfe.hpp +245 -0
- netgen/include/tscalarfe_impl.hpp +1029 -0
- netgen/include/umfpackinverse.hpp +148 -0
- netgen/include/vector.hpp +1273 -0
- netgen/include/voxelcoefficientfunction.hpp +41 -0
- netgen/include/vtkoutput.hpp +198 -0
- netgen/include/vvector.hpp +208 -0
- netgen/include/webgui.hpp +92 -0
- netgen/libngbla.dylib +0 -0
- netgen/libngcomp.dylib +0 -0
- netgen/libngfem.dylib +0 -0
- netgen/libngla.dylib +0 -0
- netgen/libngsbem.dylib +0 -0
- netgen/libngsolve.dylib +0 -0
- netgen/libngstd.dylib +0 -0
- ngsolve/TensorProductTools.py +210 -0
- ngsolve/__console.py +94 -0
- ngsolve/__expr.py +181 -0
- ngsolve/__init__.py +148 -0
- ngsolve/__init__.pyi +233 -0
- ngsolve/_scikit_build_core_dependencies.py +30 -0
- ngsolve/bla.pyi +1153 -0
- ngsolve/bvp.py +78 -0
- ngsolve/bvp.pyi +32 -0
- ngsolve/cmake/NGSolveConfig.cmake +102 -0
- ngsolve/cmake/ngsolve-targets-release.cmake +79 -0
- ngsolve/cmake/ngsolve-targets.cmake +163 -0
- ngsolve/comp/__init__.pyi +5449 -0
- ngsolve/comp/pml.pyi +89 -0
- ngsolve/config/__init__.py +1 -0
- ngsolve/config/__init__.pyi +43 -0
- ngsolve/config/__main__.py +4 -0
- ngsolve/config/config.py +60 -0
- ngsolve/config/config.pyi +45 -0
- ngsolve/demos/TensorProduct/__init__.py +0 -0
- ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +80 -0
- ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +73 -0
- ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +72 -0
- ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +66 -0
- ngsolve/demos/__init__.py +0 -0
- ngsolve/demos/howto/__init__.py +0 -0
- ngsolve/demos/howto/hhj.py +44 -0
- ngsolve/demos/howto/hybrid_dg.py +53 -0
- ngsolve/demos/howto/mixed.py +30 -0
- ngsolve/demos/howto/nonlin.py +29 -0
- ngsolve/demos/howto/pickling.py +26 -0
- ngsolve/demos/howto/pml.py +31 -0
- ngsolve/demos/howto/taskmanager.py +20 -0
- ngsolve/demos/howto/tdnns.py +47 -0
- ngsolve/demos/howto/timeDG-skeleton.py +45 -0
- ngsolve/demos/howto/timeDG.py +38 -0
- ngsolve/demos/howto/timeDGlap.py +42 -0
- ngsolve/demos/howto/timeDGwave.py +61 -0
- ngsolve/demos/intro/__init__.py +0 -0
- ngsolve/demos/intro/adaptive.py +123 -0
- ngsolve/demos/intro/cmagnet.py +59 -0
- ngsolve/demos/intro/elasticity.py +76 -0
- ngsolve/demos/intro/navierstokes.py +74 -0
- ngsolve/demos/intro/poisson.ipynb +170 -0
- ngsolve/demos/intro/poisson.py +41 -0
- ngsolve/demos/mpi/__init__.py +0 -0
- ngsolve/demos/mpi/mpi_cmagnet.py +87 -0
- ngsolve/demos/mpi/mpi_navierstokes.py +117 -0
- ngsolve/demos/mpi/mpi_poisson.py +89 -0
- ngsolve/demos/mpi/mpi_timeDG.py +82 -0
- ngsolve/directsolvers.py +26 -0
- ngsolve/directsolvers.pyi +15 -0
- ngsolve/eigenvalues.py +364 -0
- ngsolve/eigenvalues.pyi +30 -0
- ngsolve/fem.pyi +1647 -0
- ngsolve/internal.py +89 -0
- ngsolve/krylovspace.py +1013 -0
- ngsolve/krylovspace.pyi +298 -0
- ngsolve/la.pyi +1230 -0
- ngsolve/meshes.py +748 -0
- ngsolve/ngs2petsc.py +310 -0
- ngsolve/ngscxx.py +42 -0
- ngsolve/ngslib.so +0 -0
- ngsolve/ngstd.pyi +59 -0
- ngsolve/nonlinearsolvers.py +203 -0
- ngsolve/nonlinearsolvers.pyi +95 -0
- ngsolve/preconditioners.py +11 -0
- ngsolve/preconditioners.pyi +7 -0
- ngsolve/solve.pyi +109 -0
- ngsolve/solve_implementation.py +168 -0
- ngsolve/solve_implementation.pyi +42 -0
- ngsolve/solvers.py +7 -0
- ngsolve/solvers.pyi +14 -0
- ngsolve/timestepping.py +185 -0
- ngsolve/timestepping.pyi +28 -0
- ngsolve/timing.py +108 -0
- ngsolve/timing.pyi +54 -0
- ngsolve/utils.py +167 -0
- ngsolve/utils.pyi +273 -0
- ngsolve/webgui.py +670 -0
- ngsolve-6.2.2506.post74.dev0.data/data/Netgen.icns +0 -0
- ngsolve-6.2.2506.post74.dev0.data/data/bin/ngscxx +17 -0
- ngsolve-6.2.2506.post74.dev0.data/data/bin/ngsld +13 -0
- ngsolve-6.2.2506.post74.dev0.data/data/bin/ngsolve.tcl +648 -0
- ngsolve-6.2.2506.post74.dev0.data/data/bin/ngspy +2 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/beam.geo +17 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/beam.vol +240 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/chip.in2d +41 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/chip.vol +614 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coil.geo +12 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coil.vol +2560 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coilshield.geo +24 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coilshield.vol +3179 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/cube.geo +19 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/cube.vol +1832 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde +50 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde +40 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d1_square.pde +43 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d2_chip.pde +35 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d3_helmholtz.pde +22 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d4_cube.pde +46 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d5_beam.pde +74 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d6_shaft.pde +73 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d7_coil.pde +50 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d8_coilshield.pde +49 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d9_hybridDG.pde +72 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/doubleglazing.in2d +27 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/doubleglazing.vol +737 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/shaft.geo +73 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/shaft.vol +4291 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/square.in2d +17 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/square.vol +149 -0
- ngsolve-6.2.2506.post74.dev0.dist-info/METADATA +13 -0
- ngsolve-6.2.2506.post74.dev0.dist-info/RECORD +315 -0
- ngsolve-6.2.2506.post74.dev0.dist-info/WHEEL +5 -0
- ngsolve-6.2.2506.post74.dev0.dist-info/licenses/LICENSE +504 -0
- ngsolve-6.2.2506.post74.dev0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,631 @@
|
|
|
1
|
+
#ifndef FILE_PMLTRAFO
|
|
2
|
+
#define FILE_PMLTRAFO
|
|
3
|
+
|
|
4
|
+
/*********************************************************************/
|
|
5
|
+
/* File: pmltrafo.hpp */
|
|
6
|
+
/* Author: M. Wess, J. Schoeberl */
|
|
7
|
+
/* Date: 2016 */
|
|
8
|
+
/*********************************************************************/
|
|
9
|
+
|
|
10
|
+
#include <coefficient.hpp>
|
|
11
|
+
|
|
12
|
+
namespace ngcomp
|
|
13
|
+
{
|
|
14
|
+
//PML base object for mapping points to Vec<DIM> cast to PML_TransformationDim
|
|
15
|
+
class PML_Transformation
|
|
16
|
+
{
|
|
17
|
+
int dim;
|
|
18
|
+
public:
|
|
19
|
+
|
|
20
|
+
PML_Transformation(int _dim) : dim(_dim) { ; }
|
|
21
|
+
|
|
22
|
+
virtual ~PML_Transformation() { ; }
|
|
23
|
+
|
|
24
|
+
INLINE int GetDimension() const { return dim; }
|
|
25
|
+
|
|
26
|
+
virtual string ParameterString() const = 0;
|
|
27
|
+
|
|
28
|
+
virtual void MapPointV(const BaseMappedIntegrationPoint & hpoint, FlatVector<Complex> point, FlatMatrix<Complex> jac) const = 0;
|
|
29
|
+
|
|
30
|
+
virtual void MapPointV(FlatVector<double> hpoint, FlatVector<Complex> point, FlatMatrix<Complex> jac) const = 0;
|
|
31
|
+
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
/// print PML
|
|
36
|
+
inline ostream & operator<< (ostream & ost, const PML_Transformation & pml)
|
|
37
|
+
{
|
|
38
|
+
ost << typeid(pml).name() << endl << pml.ParameterString();
|
|
39
|
+
return ost;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
template <int DIM>
|
|
43
|
+
class PML_TransformationDim;
|
|
44
|
+
|
|
45
|
+
class PML_CF : public CoefficientFunction
|
|
46
|
+
{
|
|
47
|
+
shared_ptr<PML_Transformation> pmltrafo;
|
|
48
|
+
int dim;
|
|
49
|
+
public:
|
|
50
|
+
|
|
51
|
+
PML_CF(shared_ptr<PML_Transformation> _pmltrafo) :
|
|
52
|
+
CoefficientFunction(_pmltrafo->GetDimension(),true),
|
|
53
|
+
pmltrafo(_pmltrafo), dim(_pmltrafo->GetDimension())
|
|
54
|
+
{ ; }
|
|
55
|
+
using CoefficientFunction::Evaluate;
|
|
56
|
+
double Evaluate(const BaseMappedIntegrationPoint & ip) const
|
|
57
|
+
{
|
|
58
|
+
throw Exception("PML_CF::Evaluate: PML_CF is complex");
|
|
59
|
+
}
|
|
60
|
+
void Evaluate(const BaseMappedIntegrationPoint & ip, FlatVector<Complex> values) const
|
|
61
|
+
{
|
|
62
|
+
STACK_ARRAY(double,jacmem,2*dim*dim);
|
|
63
|
+
FlatMatrix<Complex> jac(dim,dim,reinterpret_cast<Complex*>(&jacmem[0]));
|
|
64
|
+
if (ip.IsComplex())
|
|
65
|
+
{
|
|
66
|
+
STACK_ARRAY(double,pmem,dim);
|
|
67
|
+
FlatVector<> rpoint(dim,pmem);
|
|
68
|
+
for (int i : Range(dim))
|
|
69
|
+
rpoint(i)=ip.GetPointComplex()(i).real();
|
|
70
|
+
pmltrafo->MapPointV(rpoint,values,jac);
|
|
71
|
+
}
|
|
72
|
+
else
|
|
73
|
+
pmltrafo->MapPointV(ip,values,jac);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
class PML_Jac : public CoefficientFunction
|
|
78
|
+
{
|
|
79
|
+
shared_ptr<PML_Transformation> pmltrafo;
|
|
80
|
+
int dim;
|
|
81
|
+
public:
|
|
82
|
+
|
|
83
|
+
PML_Jac(shared_ptr<PML_Transformation> _pmltrafo) :
|
|
84
|
+
CoefficientFunction(sqr(_pmltrafo->GetDimension()),true),
|
|
85
|
+
pmltrafo(_pmltrafo), dim(_pmltrafo->GetDimension())
|
|
86
|
+
{
|
|
87
|
+
SetDimensions (ngstd::IVec<2>(dim,dim));
|
|
88
|
+
}
|
|
89
|
+
using CoefficientFunction::Evaluate;
|
|
90
|
+
double Evaluate(const BaseMappedIntegrationPoint & ip) const
|
|
91
|
+
{
|
|
92
|
+
throw Exception("PML_Jac::Evaluate: PML_Jac is complex");
|
|
93
|
+
}
|
|
94
|
+
void Evaluate(const BaseMappedIntegrationPoint & ip, FlatVector<Complex> values) const
|
|
95
|
+
{
|
|
96
|
+
STACK_ARRAY(double,jacmem,2*dim*dim);
|
|
97
|
+
STACK_ARRAY(double,vmem,dim);
|
|
98
|
+
FlatMatrix<Complex> jac(dim,dim,reinterpret_cast<Complex*>(&jacmem[0]));
|
|
99
|
+
FlatVector<Complex> vec(dim,reinterpret_cast<Complex*>(&vmem[0]));
|
|
100
|
+
if (ip.IsComplex())
|
|
101
|
+
{
|
|
102
|
+
STACK_ARRAY(double,pmem,dim);
|
|
103
|
+
FlatVector<> rpoint(dim,pmem);
|
|
104
|
+
for (int i : Range(dim))
|
|
105
|
+
rpoint(i)=ip.GetPointComplex()(i).real();
|
|
106
|
+
pmltrafo->MapPointV(rpoint,vec,jac);
|
|
107
|
+
}
|
|
108
|
+
else
|
|
109
|
+
pmltrafo->MapPointV(ip,vec,jac);
|
|
110
|
+
values = jac.AsVector();
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
class PML_JacInv : public CoefficientFunction
|
|
114
|
+
{
|
|
115
|
+
shared_ptr<PML_Transformation> pmltrafo;
|
|
116
|
+
int dim;
|
|
117
|
+
public:
|
|
118
|
+
|
|
119
|
+
PML_JacInv(shared_ptr<PML_Transformation> _pmltrafo) :
|
|
120
|
+
CoefficientFunction(_pmltrafo->GetDimension()*_pmltrafo->GetDimension(),true),
|
|
121
|
+
pmltrafo(_pmltrafo),
|
|
122
|
+
dim(_pmltrafo->GetDimension())
|
|
123
|
+
{
|
|
124
|
+
SetDimensions(ngstd::IVec<2>(dim,dim));
|
|
125
|
+
}
|
|
126
|
+
using CoefficientFunction::Evaluate;
|
|
127
|
+
double Evaluate(const BaseMappedIntegrationPoint & ip) const
|
|
128
|
+
{
|
|
129
|
+
throw Exception("PML_JacInv::Evaluate: PML_JacInv is complex");
|
|
130
|
+
}
|
|
131
|
+
void Evaluate(const BaseMappedIntegrationPoint & ip, FlatVector<Complex> values) const
|
|
132
|
+
{
|
|
133
|
+
STACK_ARRAY(double,jacmem,2*dim*dim);
|
|
134
|
+
STACK_ARRAY(double,vmem,2*dim);
|
|
135
|
+
FlatMatrix<Complex> jac(dim,dim,reinterpret_cast<Complex*>(&jacmem[0]));
|
|
136
|
+
FlatVector<Complex> vec(dim,reinterpret_cast<Complex*>(&vmem[0]));
|
|
137
|
+
if (ip.IsComplex())
|
|
138
|
+
{
|
|
139
|
+
STACK_ARRAY(double,pmem,dim);
|
|
140
|
+
FlatVector<> rpoint(dim,pmem);
|
|
141
|
+
for (int i : Range(dim))
|
|
142
|
+
rpoint(i)=ip.GetPointComplex()(i).real();
|
|
143
|
+
pmltrafo->MapPointV(rpoint,vec,jac);
|
|
144
|
+
}
|
|
145
|
+
else
|
|
146
|
+
pmltrafo->MapPointV(ip,vec,jac);
|
|
147
|
+
CalcInverse(jac);
|
|
148
|
+
values=jac.AsVector();
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
class PML_Det : public CoefficientFunction
|
|
152
|
+
{
|
|
153
|
+
shared_ptr<PML_Transformation> pmltrafo;
|
|
154
|
+
int dim;
|
|
155
|
+
public:
|
|
156
|
+
|
|
157
|
+
PML_Det(shared_ptr<PML_Transformation> _pmltrafo) :
|
|
158
|
+
CoefficientFunction(1,true), pmltrafo(_pmltrafo),dim(_pmltrafo->GetDimension())
|
|
159
|
+
{ ; }
|
|
160
|
+
using CoefficientFunction::Evaluate;
|
|
161
|
+
double Evaluate(const BaseMappedIntegrationPoint & ip) const
|
|
162
|
+
{
|
|
163
|
+
throw Exception("PML_Det::Evaluate: PML_Det is complex");
|
|
164
|
+
}
|
|
165
|
+
Complex EvaluateComplex(const BaseMappedIntegrationPoint & ip) const
|
|
166
|
+
{
|
|
167
|
+
STACK_ARRAY(double,jacmem,2*dim*dim);
|
|
168
|
+
STACK_ARRAY(double,vmem,2*dim);
|
|
169
|
+
FlatMatrix<Complex> jac(dim,dim,reinterpret_cast<Complex*>(&jacmem[0]));
|
|
170
|
+
FlatVector<Complex> vec(dim,reinterpret_cast<Complex*>(&vmem[0]));
|
|
171
|
+
if (ip.IsComplex())
|
|
172
|
+
{
|
|
173
|
+
STACK_ARRAY(double,pmem,dim);
|
|
174
|
+
FlatVector<> rpoint(dim,pmem);
|
|
175
|
+
for (int i : Range(dim))
|
|
176
|
+
rpoint(i)=ip.GetPointComplex()(i).real();
|
|
177
|
+
pmltrafo->MapPointV(rpoint,vec,jac);
|
|
178
|
+
}
|
|
179
|
+
else
|
|
180
|
+
pmltrafo->MapPointV(ip,vec,jac);
|
|
181
|
+
return Det(jac);
|
|
182
|
+
}
|
|
183
|
+
void Evaluate(const BaseMappedIntegrationPoint & ip, FlatVector<Complex> value) const
|
|
184
|
+
{
|
|
185
|
+
STACK_ARRAY(double,jacmem,2*dim*dim);
|
|
186
|
+
STACK_ARRAY(double,vmem,dim);
|
|
187
|
+
FlatMatrix<Complex> jac(dim,dim,reinterpret_cast<Complex*>(&jacmem[0]));
|
|
188
|
+
FlatVector<Complex> vec(dim,reinterpret_cast<Complex*>(&vmem[0]));
|
|
189
|
+
if (ip.IsComplex())
|
|
190
|
+
{
|
|
191
|
+
STACK_ARRAY(double,pmem,dim);
|
|
192
|
+
FlatVector<> rpoint(dim,pmem);
|
|
193
|
+
for (int i : Range(dim))
|
|
194
|
+
rpoint(i)=ip.GetPointComplex()(i).real();
|
|
195
|
+
pmltrafo->MapPointV(rpoint,vec,jac);
|
|
196
|
+
}
|
|
197
|
+
else
|
|
198
|
+
pmltrafo->MapPointV(ip,vec,jac);
|
|
199
|
+
value = Det(jac);
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
template <int DIM>
|
|
204
|
+
class PML_TransformationDim : public PML_Transformation
|
|
205
|
+
{
|
|
206
|
+
public:
|
|
207
|
+
|
|
208
|
+
PML_TransformationDim() : PML_Transformation(DIM) { ; }
|
|
209
|
+
|
|
210
|
+
virtual void MapIntegrationPoint(const BaseMappedIntegrationPoint & ip, Vec<DIM,Complex> & point,
|
|
211
|
+
Mat<DIM,DIM,Complex> & jac) const
|
|
212
|
+
{
|
|
213
|
+
Vec<DIM> hpoint = ip.GetPoint();
|
|
214
|
+
MapPoint(hpoint, point, jac);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
virtual void MapPoint(Vec<DIM> & hpoint, Vec<DIM,Complex> & point,
|
|
218
|
+
Mat<DIM,DIM,Complex> & jac) const
|
|
219
|
+
{
|
|
220
|
+
throw Exception("PML_TransformationDim::MapPoint: no transformation specified");
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
virtual void MapPointV(const BaseMappedIntegrationPoint & hpoint, FlatVector<Complex> point, FlatMatrix<Complex> jac) const
|
|
224
|
+
{
|
|
225
|
+
Vec<DIM,Complex> vpoint;
|
|
226
|
+
Mat<DIM,DIM,Complex> mjac;
|
|
227
|
+
MapIntegrationPoint(hpoint,vpoint,mjac);
|
|
228
|
+
point = FlatVector<Complex>(vpoint);
|
|
229
|
+
jac = FlatMatrix<Complex>(mjac);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
virtual void MapPointV(FlatVector<double> hpoint, FlatVector<Complex> point, FlatMatrix<Complex> jac) const
|
|
233
|
+
{
|
|
234
|
+
Vec<DIM,Complex> vpoint;
|
|
235
|
+
Mat<DIM,DIM,Complex> mjac;
|
|
236
|
+
Vec<DIM> vhpoint = hpoint;
|
|
237
|
+
MapPoint(vhpoint,vpoint,mjac);
|
|
238
|
+
point = FlatVector<Complex>(vpoint);
|
|
239
|
+
jac = FlatMatrix<Complex>(mjac);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
template <int DIM>
|
|
245
|
+
class RadialPML_Transformation : public PML_TransformationDim<DIM>
|
|
246
|
+
{
|
|
247
|
+
Complex alpha;
|
|
248
|
+
double rad;
|
|
249
|
+
Vec<DIM> origin;
|
|
250
|
+
public:
|
|
251
|
+
|
|
252
|
+
RadialPML_Transformation(double _rad, Complex _alpha, FlatVector<double> _origin)
|
|
253
|
+
: PML_TransformationDim<DIM>(), alpha(_alpha), rad(_rad)
|
|
254
|
+
{
|
|
255
|
+
origin = 0.;
|
|
256
|
+
for (int i : Range(min(int(_origin.Size()),DIM)))
|
|
257
|
+
origin(i)=_origin(i);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
~RadialPML_Transformation() {;}
|
|
261
|
+
|
|
262
|
+
virtual string ParameterString() const
|
|
263
|
+
{
|
|
264
|
+
stringstream str;
|
|
265
|
+
str << "alpha: " << alpha << endl;
|
|
266
|
+
str << "radius: " << rad << endl;
|
|
267
|
+
str << "origin: " << origin;
|
|
268
|
+
return str.str();
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
virtual void MapPoint (Vec<DIM> & hpoint, Vec<DIM,Complex> & point,
|
|
272
|
+
Mat<DIM,DIM,Complex> & jac) const
|
|
273
|
+
{
|
|
274
|
+
Vec<DIM,double> rel_point = hpoint-origin;
|
|
275
|
+
double abs_x = L2Norm (rel_point);
|
|
276
|
+
if (abs_x <= rad)
|
|
277
|
+
{
|
|
278
|
+
point = hpoint;
|
|
279
|
+
jac = Id<DIM>();
|
|
280
|
+
}
|
|
281
|
+
else
|
|
282
|
+
{
|
|
283
|
+
Complex g = 1.+alpha*(1.0-rad/abs_x);
|
|
284
|
+
point = origin + g * rel_point;
|
|
285
|
+
// SZ: sollte da nicht abs_x * abs_x anstelle abs_x*abs_x * abs_x stehen?
|
|
286
|
+
// JS: das hat schon so gestimmt
|
|
287
|
+
jac =
|
|
288
|
+
g * Id<DIM>() + (rad*alpha/(abs_x*abs_x*abs_x)) *
|
|
289
|
+
(rel_point * Trans(rel_point));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
template <int DIM>
|
|
295
|
+
class CartesianPML_Transformation : public PML_TransformationDim<DIM>
|
|
296
|
+
{
|
|
297
|
+
Mat<DIM,2> bounds;
|
|
298
|
+
Complex alpha;
|
|
299
|
+
public:
|
|
300
|
+
|
|
301
|
+
CartesianPML_Transformation(Mat<DIM,2> _bounds, Complex _alpha)
|
|
302
|
+
: PML_TransformationDim<DIM>(), bounds(_bounds), alpha(_alpha)
|
|
303
|
+
{
|
|
304
|
+
/*
|
|
305
|
+
bounds = 0.;
|
|
306
|
+
for (int i : Range(min(int(_bounds.Height()),DIM)))
|
|
307
|
+
for (int j : Range(min(int(_bounds.Width()),2)))
|
|
308
|
+
bounds(i,j)=_bounds(i,j);
|
|
309
|
+
*/
|
|
310
|
+
;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
~CartesianPML_Transformation() {;}
|
|
314
|
+
|
|
315
|
+
virtual string ParameterString() const
|
|
316
|
+
{
|
|
317
|
+
stringstream str;
|
|
318
|
+
str << "alpha: " << alpha << endl;
|
|
319
|
+
str << "bounds: " << bounds;
|
|
320
|
+
return str.str();
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
virtual void MapPoint (Vec<DIM> & hpoint, Vec<DIM,Complex> & point,
|
|
324
|
+
Mat<DIM,DIM,Complex> & jac) const
|
|
325
|
+
{
|
|
326
|
+
point = hpoint;
|
|
327
|
+
jac = Id<DIM>();
|
|
328
|
+
for (int j : Range(DIM))
|
|
329
|
+
{
|
|
330
|
+
if (hpoint(j)<bounds(j,0))
|
|
331
|
+
{
|
|
332
|
+
point(j)+=alpha*(hpoint(j)-bounds(j,0));
|
|
333
|
+
jac(j,j)+=alpha;
|
|
334
|
+
}
|
|
335
|
+
else if (hpoint(j)>bounds(j,1))
|
|
336
|
+
{
|
|
337
|
+
point(j)+=alpha*(hpoint(j)-bounds(j,1));
|
|
338
|
+
jac(j,j)+=alpha;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
template <int DIM>
|
|
346
|
+
class HalfSpacePML_Transformation : public PML_TransformationDim<DIM>
|
|
347
|
+
{
|
|
348
|
+
Vec<DIM> point, normal;
|
|
349
|
+
Complex alpha;
|
|
350
|
+
public:
|
|
351
|
+
HalfSpacePML_Transformation(FlatVector<double> _point, FlatVector<double> _normal, Complex _alpha)
|
|
352
|
+
: PML_TransformationDim<DIM>(), alpha(_alpha)
|
|
353
|
+
{
|
|
354
|
+
point = 0.;
|
|
355
|
+
normal = 0.;
|
|
356
|
+
for (int i : Range(min(int(_point.Size()),DIM)))
|
|
357
|
+
point(i)=_point(i);
|
|
358
|
+
for (int i : Range(min(int(_normal.Size()),DIM)))
|
|
359
|
+
normal(i)=_normal(i);
|
|
360
|
+
normal/=L2Norm(normal);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
~HalfSpacePML_Transformation() {;}
|
|
364
|
+
|
|
365
|
+
virtual string ParameterString() const
|
|
366
|
+
{
|
|
367
|
+
stringstream str;
|
|
368
|
+
str << "point: " << point << endl;
|
|
369
|
+
str << "normal: " << normal;
|
|
370
|
+
return str.str();
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
virtual void MapPoint (Vec<DIM> & hpoint, Vec<DIM,Complex> & out,
|
|
374
|
+
Mat<DIM,DIM,Complex> & jac) const
|
|
375
|
+
{
|
|
376
|
+
out = hpoint;
|
|
377
|
+
jac = Id<DIM>();
|
|
378
|
+
double dot = InnerProduct(hpoint-point,normal); //normal has already norm 1
|
|
379
|
+
if (dot>0.)
|
|
380
|
+
{
|
|
381
|
+
out += alpha*dot*normal;
|
|
382
|
+
jac += alpha*normal*Trans(normal);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
template <int DIM>
|
|
387
|
+
class BrickRadialPML_Transformation : public PML_TransformationDim<DIM>
|
|
388
|
+
{
|
|
389
|
+
Mat<DIM,2> bounds;
|
|
390
|
+
Complex alpha;
|
|
391
|
+
Vec<DIM> origin;
|
|
392
|
+
public:
|
|
393
|
+
BrickRadialPML_Transformation(FlatMatrix<double> _bounds, Complex _alpha, FlatVector<double> _origin)
|
|
394
|
+
: PML_TransformationDim<DIM>(), bounds(_bounds), alpha(_alpha)
|
|
395
|
+
{
|
|
396
|
+
origin = 0.;
|
|
397
|
+
for (int i : Range(min(int(_origin.Size()),DIM)))
|
|
398
|
+
origin(i)=_origin(i);
|
|
399
|
+
bounds = 0.;
|
|
400
|
+
for (int i : Range(min(int(_bounds.Height()),DIM)))
|
|
401
|
+
for (int j : Range(min(int(_bounds.Width()),2)))
|
|
402
|
+
bounds(i,j)=_bounds(i,j);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
~BrickRadialPML_Transformation() {;}
|
|
406
|
+
|
|
407
|
+
virtual string ParameterString() const
|
|
408
|
+
{
|
|
409
|
+
stringstream str;
|
|
410
|
+
str << "alpha: " << alpha << endl;
|
|
411
|
+
str << "bounds: " << bounds << endl;
|
|
412
|
+
str << "origin: " << origin;
|
|
413
|
+
return str.str();
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
virtual void MapPoint (Vec<DIM> & hpoint, Vec<DIM,Complex> & point,
|
|
417
|
+
Mat<DIM,DIM,Complex> & jac) const
|
|
418
|
+
{
|
|
419
|
+
point = hpoint;
|
|
420
|
+
jac = Id<DIM>();
|
|
421
|
+
double tmp = 0;
|
|
422
|
+
double scal = 0;
|
|
423
|
+
int maxind = -1;
|
|
424
|
+
Vec<DIM> rel_point = hpoint - origin;
|
|
425
|
+
for (int j : Range(DIM))
|
|
426
|
+
{
|
|
427
|
+
if (hpoint(j)<bounds(j,0))
|
|
428
|
+
tmp=(hpoint(j)-bounds(j,0))/rel_point(j);
|
|
429
|
+
else if (hpoint(j)>bounds(j,1))
|
|
430
|
+
tmp=(hpoint(j)-bounds(j,1))/rel_point(j);
|
|
431
|
+
if (tmp>scal)
|
|
432
|
+
{
|
|
433
|
+
scal=tmp;
|
|
434
|
+
maxind=j;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
Vec<DIM> tmpvec = 0.;
|
|
438
|
+
if (maxind>=0)
|
|
439
|
+
{
|
|
440
|
+
tmpvec(maxind)=1/rel_point(maxind)-scal/rel_point(maxind);
|
|
441
|
+
point += alpha*scal*rel_point;
|
|
442
|
+
jac += alpha * (scal*Id<DIM>() + rel_point * Trans(tmpvec));
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
template <int DIM>
|
|
449
|
+
class CustomPML_Transformation : public PML_TransformationDim<DIM>
|
|
450
|
+
{
|
|
451
|
+
shared_ptr<CoefficientFunction> trafo, jac;
|
|
452
|
+
public:
|
|
453
|
+
|
|
454
|
+
CustomPML_Transformation(shared_ptr<CoefficientFunction> _trafo,shared_ptr<CoefficientFunction> _jac)
|
|
455
|
+
: PML_TransformationDim<DIM>(), trafo(_trafo), jac(_jac) {
|
|
456
|
+
if (jac->Dimension()!=trafo->Dimension()*trafo->Dimension())
|
|
457
|
+
throw Exception( string("CustomPML_Transformation::CustomPML_Transformation: dimensions of jacobian and transformation do not match!"));
|
|
458
|
+
jac->SetDimensions(ngstd::IVec<2>(trafo->Dimension(),trafo->Dimension()));
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
~CustomPML_Transformation() {;}
|
|
462
|
+
|
|
463
|
+
virtual string ParameterString() const
|
|
464
|
+
{
|
|
465
|
+
stringstream str;
|
|
466
|
+
str << "trafo: " << trafo << endl;
|
|
467
|
+
str << "jac: " << jac;
|
|
468
|
+
return str.str();
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
virtual void MapIntegrationPoint (const BaseMappedIntegrationPoint & hpoint, Vec<DIM,Complex> & point,
|
|
472
|
+
Mat<DIM,DIM,Complex> & jacmat) const
|
|
473
|
+
{
|
|
474
|
+
STACK_ARRAY(double,jacmem,2*jac->Dimension());
|
|
475
|
+
STACK_ARRAY(double,vmem,2*trafo->Dimension());
|
|
476
|
+
FlatVector<Complex> fvjac(jac->Dimension(),reinterpret_cast<Complex*>(&jacmem[0]));
|
|
477
|
+
FlatVector<Complex> fvpoint(trafo->Dimension(),reinterpret_cast<Complex*>(&vmem[0]));
|
|
478
|
+
trafo->Evaluate(hpoint,fvpoint);
|
|
479
|
+
point = fvpoint;
|
|
480
|
+
jac->Evaluate(hpoint,fvjac);
|
|
481
|
+
jacmat = fvjac.AsMatrix(DIM,DIM);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
virtual void MapPoint (Vec<DIM> & hpoint, Vec<DIM,Complex> & point,
|
|
485
|
+
Mat<DIM,DIM,Complex> & jac) const
|
|
486
|
+
{
|
|
487
|
+
throw Exception("CustomPML_Transformation::MapPoint: can only map integration Points");
|
|
488
|
+
}
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
template <int DIM>
|
|
492
|
+
class SumPML : public PML_TransformationDim<DIM>
|
|
493
|
+
{
|
|
494
|
+
shared_ptr<PML_Transformation> pml1,pml2;
|
|
495
|
+
public:
|
|
496
|
+
|
|
497
|
+
SumPML(shared_ptr<PML_Transformation> _pml1,shared_ptr<PML_Transformation> _pml2)
|
|
498
|
+
: PML_TransformationDim<DIM>(), pml1(_pml1), pml2(_pml2) {
|
|
499
|
+
if (pml1->GetDimension() != pml2->GetDimension())
|
|
500
|
+
throw Exception("SumPML::SumPML: dimensions do not match");
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
~SumPML() {;}
|
|
504
|
+
|
|
505
|
+
virtual string ParameterString() const
|
|
506
|
+
{
|
|
507
|
+
stringstream str;
|
|
508
|
+
str << "pml1: " << GetName(*pml1) << endl;
|
|
509
|
+
str << "pml2: " << GetName(*pml2);
|
|
510
|
+
return str.str();
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
virtual void MapIntegrationPoint (const BaseMappedIntegrationPoint & hpoint, Vec<DIM,Complex> & point,
|
|
514
|
+
Mat<DIM,DIM,Complex> & jacmat) const
|
|
515
|
+
{
|
|
516
|
+
static_cast<PML_TransformationDim<DIM> &>(*pml1).MapIntegrationPoint(hpoint,point,jacmat);
|
|
517
|
+
Vec<DIM,Complex> point2;
|
|
518
|
+
Mat<DIM,DIM,Complex> jac2;
|
|
519
|
+
static_cast<PML_TransformationDim<DIM> &>(*pml2).MapIntegrationPoint(hpoint,point2,jac2);
|
|
520
|
+
point+=point2-hpoint.GetPoint();
|
|
521
|
+
jacmat+=jac2-Id<DIM>();
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
virtual void MapPoint (Vec<DIM> & hpoint, Vec<DIM,Complex> & point,
|
|
525
|
+
Mat<DIM,DIM,Complex> & jac) const
|
|
526
|
+
{
|
|
527
|
+
static_cast<PML_TransformationDim<DIM> &>(*pml1).MapPoint(hpoint,point,jac);
|
|
528
|
+
Vec<DIM,Complex> point2;
|
|
529
|
+
Mat<DIM,DIM,Complex> jac2;
|
|
530
|
+
static_cast<PML_TransformationDim<DIM> &>(*pml2).MapPoint(hpoint,point2,jac2);
|
|
531
|
+
point+=point2-hpoint;
|
|
532
|
+
jac+=jac2-Id<DIM>();
|
|
533
|
+
}
|
|
534
|
+
};
|
|
535
|
+
|
|
536
|
+
template <int DIM, int DIMA, int DIMB>
|
|
537
|
+
class CompoundPML : public PML_TransformationDim<DIM>
|
|
538
|
+
{
|
|
539
|
+
shared_ptr<PML_Transformation> pml1,pml2;
|
|
540
|
+
Vec<DIMA,int> dims1;
|
|
541
|
+
Vec<DIMB,int> dims2;
|
|
542
|
+
public:
|
|
543
|
+
|
|
544
|
+
CompoundPML(
|
|
545
|
+
shared_ptr<PML_Transformation> _pml1,
|
|
546
|
+
shared_ptr<PML_Transformation> _pml2,
|
|
547
|
+
FlatVector<int> _dims1,
|
|
548
|
+
FlatVector<int> _dims2)
|
|
549
|
+
: PML_TransformationDim<DIM>(),
|
|
550
|
+
pml1(_pml1), pml2(_pml2)
|
|
551
|
+
{
|
|
552
|
+
if (DIMA+DIMB!=DIM)
|
|
553
|
+
throw Exception("CompoundPML::CompoundPML: dimensions do not match");
|
|
554
|
+
if (dims1.Size()<DIMA || dims2.Size()<DIMB)
|
|
555
|
+
throw Exception("CompoundPML::CompoundPML: one of the dims vectors too short");
|
|
556
|
+
BitArray count(DIM);
|
|
557
|
+
count.Clear();
|
|
558
|
+
for (int i : Range(DIMA))
|
|
559
|
+
{
|
|
560
|
+
dims1(i)=_dims1(i);
|
|
561
|
+
if (dims1(i)<1 || dims1(i)>DIM)
|
|
562
|
+
throw Exception("CompoundPML::CompoundPML: dims1 vector is weird");
|
|
563
|
+
count.SetBit(dims1(i)-1);
|
|
564
|
+
}
|
|
565
|
+
if (count.NumSet()<DIMA)
|
|
566
|
+
throw Exception("CompoundPML::CompoundPML: dims1 vector is weird");
|
|
567
|
+
|
|
568
|
+
for (int i : Range(DIMB))
|
|
569
|
+
{
|
|
570
|
+
dims2(i)=_dims2(i);
|
|
571
|
+
if (dims2(i)<1 || dims2(i)>DIM)
|
|
572
|
+
throw Exception("CompoundPML::CompoundPML: dims2 vector is weird");
|
|
573
|
+
count.SetBit(dims2(i)-1);
|
|
574
|
+
}
|
|
575
|
+
if (count.NumSet()<DIM)
|
|
576
|
+
throw Exception("CompoundPML::CompoundPML: dims2 vector is weird");
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
~CompoundPML() {;}
|
|
580
|
+
|
|
581
|
+
virtual string ParameterString() const
|
|
582
|
+
{
|
|
583
|
+
stringstream str;
|
|
584
|
+
str << "pml1: " << GetName(*pml1) << endl;
|
|
585
|
+
str << "pml2: " << GetName(*pml2) << endl;
|
|
586
|
+
str << "dims1: " << dims1 << endl;
|
|
587
|
+
str << "dims2: " << dims2;
|
|
588
|
+
return str.str();
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
virtual void MapPoint (Vec<DIM> & hpoint, Vec<DIM,Complex> & point,
|
|
592
|
+
Mat<DIM,DIM,Complex> & jac) const
|
|
593
|
+
{
|
|
594
|
+
if (DIMA)
|
|
595
|
+
{
|
|
596
|
+
Vec<DIMA> hpoint1;
|
|
597
|
+
for (int i : Range(DIMA))
|
|
598
|
+
hpoint1(i)=hpoint(dims1[i]-1);
|
|
599
|
+
|
|
600
|
+
Vec<DIMA,Complex> point1;
|
|
601
|
+
Mat<DIMA,DIMA,Complex> jac1;
|
|
602
|
+
static_cast<const PML_TransformationDim<DIMA>& > (*pml1).MapPoint(hpoint1,point1,jac1);
|
|
603
|
+
|
|
604
|
+
for (int i : Range(DIMA))
|
|
605
|
+
{
|
|
606
|
+
point(dims1[i]-1)=point1(i);
|
|
607
|
+
for (int j : Range(DIMA))
|
|
608
|
+
jac(dims1[i]-1,dims1[j]-1)=jac1(i,j);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
if (DIMB)
|
|
612
|
+
{
|
|
613
|
+
Vec<DIMB> hpoint2;
|
|
614
|
+
for (int i : Range(DIMB))
|
|
615
|
+
hpoint2(i)=hpoint(dims2[i]-1);
|
|
616
|
+
Vec<DIMB,Complex> point2;
|
|
617
|
+
Mat<DIMB,DIMB,Complex> jac2;
|
|
618
|
+
static_cast<PML_TransformationDim<DIMB>& > (*pml2).MapPoint(hpoint2,point2,jac2);
|
|
619
|
+
|
|
620
|
+
for (int i : Range(DIMB))
|
|
621
|
+
{
|
|
622
|
+
point(dims2[i]-1)=point2[i];
|
|
623
|
+
for (int j : Range(DIMB))
|
|
624
|
+
jac(dims2[i]-1,dims2[j]-1)=jac2(i,j);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
#endif
|