netgen-mesher 6.2.2506.post35.dev0__cp314-cp314-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- netgen/NgOCC.py +7 -0
- netgen/__init__.py +114 -0
- netgen/__init__.pyi +22 -0
- netgen/__main__.py +53 -0
- netgen/cmake/NetgenConfig.cmake +79 -0
- netgen/cmake/netgen-targets-release.cmake +69 -0
- netgen/cmake/netgen-targets.cmake +146 -0
- netgen/config/__init__.py +1 -0
- netgen/config/__init__.pyi +52 -0
- netgen/config/__main__.py +4 -0
- netgen/config/config.py +68 -0
- netgen/config/config.pyi +54 -0
- netgen/csg.py +25 -0
- netgen/geom2d.py +178 -0
- netgen/gui.py +82 -0
- netgen/include/core/archive.hpp +1256 -0
- netgen/include/core/array.hpp +1760 -0
- netgen/include/core/autodiff.hpp +1131 -0
- netgen/include/core/autodiffdiff.hpp +733 -0
- netgen/include/core/bitarray.hpp +240 -0
- netgen/include/core/concurrentqueue.h +3619 -0
- netgen/include/core/exception.hpp +145 -0
- netgen/include/core/flags.hpp +199 -0
- netgen/include/core/hashtable.hpp +1281 -0
- netgen/include/core/localheap.hpp +318 -0
- netgen/include/core/logging.hpp +117 -0
- netgen/include/core/memtracer.hpp +221 -0
- netgen/include/core/mpi4py_pycapi.h +245 -0
- netgen/include/core/mpi_wrapper.hpp +643 -0
- netgen/include/core/ng_mpi.hpp +94 -0
- netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
- netgen/include/core/ng_mpi_native.hpp +25 -0
- netgen/include/core/ngcore.hpp +32 -0
- netgen/include/core/ngcore_api.hpp +152 -0
- netgen/include/core/ngstream.hpp +115 -0
- netgen/include/core/paje_trace.hpp +279 -0
- netgen/include/core/profiler.hpp +382 -0
- netgen/include/core/python_ngcore.hpp +457 -0
- netgen/include/core/ranges.hpp +109 -0
- netgen/include/core/register_archive.hpp +100 -0
- netgen/include/core/signal.hpp +82 -0
- netgen/include/core/simd.hpp +160 -0
- netgen/include/core/simd_arm64.hpp +407 -0
- netgen/include/core/simd_avx.hpp +394 -0
- netgen/include/core/simd_avx512.hpp +285 -0
- netgen/include/core/simd_generic.hpp +1053 -0
- netgen/include/core/simd_math.hpp +178 -0
- netgen/include/core/simd_sse.hpp +289 -0
- netgen/include/core/statushandler.hpp +37 -0
- netgen/include/core/symboltable.hpp +153 -0
- netgen/include/core/table.hpp +810 -0
- netgen/include/core/taskmanager.hpp +1161 -0
- netgen/include/core/type_traits.hpp +65 -0
- netgen/include/core/utils.hpp +385 -0
- netgen/include/core/version.hpp +102 -0
- netgen/include/core/xbool.hpp +47 -0
- netgen/include/csg/algprim.hpp +563 -0
- netgen/include/csg/brick.hpp +150 -0
- netgen/include/csg/csg.hpp +43 -0
- netgen/include/csg/csgeom.hpp +389 -0
- netgen/include/csg/csgparser.hpp +101 -0
- netgen/include/csg/curve2d.hpp +67 -0
- netgen/include/csg/edgeflw.hpp +112 -0
- netgen/include/csg/explicitcurve2d.hpp +113 -0
- netgen/include/csg/extrusion.hpp +185 -0
- netgen/include/csg/gencyl.hpp +70 -0
- netgen/include/csg/geoml.hpp +16 -0
- netgen/include/csg/identify.hpp +213 -0
- netgen/include/csg/manifold.hpp +29 -0
- netgen/include/csg/meshsurf.hpp +46 -0
- netgen/include/csg/polyhedra.hpp +121 -0
- netgen/include/csg/revolution.hpp +180 -0
- netgen/include/csg/singularref.hpp +84 -0
- netgen/include/csg/solid.hpp +295 -0
- netgen/include/csg/specpoin.hpp +194 -0
- netgen/include/csg/spline3d.hpp +99 -0
- netgen/include/csg/splinesurface.hpp +85 -0
- netgen/include/csg/surface.hpp +394 -0
- netgen/include/csg/triapprox.hpp +63 -0
- netgen/include/csg/vscsg.hpp +34 -0
- netgen/include/general/autodiff.hpp +356 -0
- netgen/include/general/autoptr.hpp +39 -0
- netgen/include/general/gzstream.h +121 -0
- netgen/include/general/hashtabl.hpp +1692 -0
- netgen/include/general/myadt.hpp +48 -0
- netgen/include/general/mystring.hpp +226 -0
- netgen/include/general/netgenout.hpp +205 -0
- netgen/include/general/ngarray.hpp +797 -0
- netgen/include/general/ngbitarray.hpp +149 -0
- netgen/include/general/ngpython.hpp +74 -0
- netgen/include/general/optmem.hpp +44 -0
- netgen/include/general/parthreads.hpp +138 -0
- netgen/include/general/seti.hpp +50 -0
- netgen/include/general/sort.hpp +47 -0
- netgen/include/general/spbita2d.hpp +59 -0
- netgen/include/general/stack.hpp +114 -0
- netgen/include/general/table.hpp +280 -0
- netgen/include/general/template.hpp +509 -0
- netgen/include/geom2d/csg2d.hpp +750 -0
- netgen/include/geom2d/geometry2d.hpp +280 -0
- netgen/include/geom2d/spline2d.hpp +234 -0
- netgen/include/geom2d/vsgeom2d.hpp +28 -0
- netgen/include/gprim/adtree.hpp +1392 -0
- netgen/include/gprim/geom2d.hpp +858 -0
- netgen/include/gprim/geom3d.hpp +749 -0
- netgen/include/gprim/geomfuncs.hpp +212 -0
- netgen/include/gprim/geomobjects.hpp +544 -0
- netgen/include/gprim/geomops.hpp +404 -0
- netgen/include/gprim/geomtest3d.hpp +101 -0
- netgen/include/gprim/gprim.hpp +33 -0
- netgen/include/gprim/spline.hpp +778 -0
- netgen/include/gprim/splinegeometry.hpp +73 -0
- netgen/include/gprim/transform3d.hpp +216 -0
- netgen/include/include/acisgeom.hpp +3 -0
- netgen/include/include/csg.hpp +1 -0
- netgen/include/include/geometry2d.hpp +1 -0
- netgen/include/include/gprim.hpp +1 -0
- netgen/include/include/incopengl.hpp +62 -0
- netgen/include/include/inctcl.hpp +13 -0
- netgen/include/include/incvis.hpp +6 -0
- netgen/include/include/linalg.hpp +1 -0
- netgen/include/include/meshing.hpp +1 -0
- netgen/include/include/myadt.hpp +1 -0
- netgen/include/include/mydefs.hpp +70 -0
- netgen/include/include/mystdlib.h +59 -0
- netgen/include/include/netgen_config.hpp +27 -0
- netgen/include/include/netgen_version.hpp +9 -0
- netgen/include/include/nginterface_v2_impl.hpp +395 -0
- netgen/include/include/ngsimd.hpp +1 -0
- netgen/include/include/occgeom.hpp +1 -0
- netgen/include/include/opti.hpp +1 -0
- netgen/include/include/parallel.hpp +1 -0
- netgen/include/include/stlgeom.hpp +1 -0
- netgen/include/include/visual.hpp +1 -0
- netgen/include/interface/rw_medit.hpp +11 -0
- netgen/include/interface/writeuser.hpp +80 -0
- netgen/include/linalg/densemat.hpp +414 -0
- netgen/include/linalg/linalg.hpp +29 -0
- netgen/include/linalg/opti.hpp +142 -0
- netgen/include/linalg/polynomial.hpp +47 -0
- netgen/include/linalg/vector.hpp +217 -0
- netgen/include/meshing/adfront2.hpp +274 -0
- netgen/include/meshing/adfront3.hpp +332 -0
- netgen/include/meshing/basegeom.hpp +370 -0
- netgen/include/meshing/bcfunctions.hpp +53 -0
- netgen/include/meshing/bisect.hpp +72 -0
- netgen/include/meshing/boundarylayer.hpp +113 -0
- netgen/include/meshing/classifyhpel.hpp +1984 -0
- netgen/include/meshing/clusters.hpp +46 -0
- netgen/include/meshing/curvedelems.hpp +274 -0
- netgen/include/meshing/delaunay2d.hpp +73 -0
- netgen/include/meshing/fieldlines.hpp +103 -0
- netgen/include/meshing/findip.hpp +198 -0
- netgen/include/meshing/findip2.hpp +103 -0
- netgen/include/meshing/geomsearch.hpp +69 -0
- netgen/include/meshing/global.hpp +54 -0
- netgen/include/meshing/hpref_hex.hpp +330 -0
- netgen/include/meshing/hpref_prism.hpp +3405 -0
- netgen/include/meshing/hpref_pyramid.hpp +154 -0
- netgen/include/meshing/hpref_quad.hpp +2082 -0
- netgen/include/meshing/hpref_segm.hpp +122 -0
- netgen/include/meshing/hpref_tet.hpp +4230 -0
- netgen/include/meshing/hpref_trig.hpp +848 -0
- netgen/include/meshing/hprefinement.hpp +366 -0
- netgen/include/meshing/improve2.hpp +178 -0
- netgen/include/meshing/improve3.hpp +151 -0
- netgen/include/meshing/localh.hpp +223 -0
- netgen/include/meshing/meshclass.hpp +1076 -0
- netgen/include/meshing/meshfunc.hpp +47 -0
- netgen/include/meshing/meshing.hpp +63 -0
- netgen/include/meshing/meshing2.hpp +163 -0
- netgen/include/meshing/meshing3.hpp +123 -0
- netgen/include/meshing/meshtool.hpp +90 -0
- netgen/include/meshing/meshtype.hpp +1930 -0
- netgen/include/meshing/msghandler.hpp +62 -0
- netgen/include/meshing/paralleltop.hpp +172 -0
- netgen/include/meshing/python_mesh.hpp +206 -0
- netgen/include/meshing/ruler2.hpp +172 -0
- netgen/include/meshing/ruler3.hpp +211 -0
- netgen/include/meshing/soldata.hpp +141 -0
- netgen/include/meshing/specials.hpp +17 -0
- netgen/include/meshing/surfacegeom.hpp +73 -0
- netgen/include/meshing/topology.hpp +1003 -0
- netgen/include/meshing/validate.hpp +21 -0
- netgen/include/meshing/visual_interface.hpp +71 -0
- netgen/include/mydefs.hpp +70 -0
- netgen/include/nginterface.h +474 -0
- netgen/include/nginterface_v2.hpp +406 -0
- netgen/include/nglib.h +697 -0
- netgen/include/nglib_occ.h +50 -0
- netgen/include/occ/occ_edge.hpp +47 -0
- netgen/include/occ/occ_face.hpp +52 -0
- netgen/include/occ/occ_solid.hpp +23 -0
- netgen/include/occ/occ_utils.hpp +376 -0
- netgen/include/occ/occ_vertex.hpp +30 -0
- netgen/include/occ/occgeom.hpp +659 -0
- netgen/include/occ/occmeshsurf.hpp +168 -0
- netgen/include/occ/vsocc.hpp +33 -0
- netgen/include/pybind11/LICENSE +29 -0
- netgen/include/pybind11/attr.h +722 -0
- netgen/include/pybind11/buffer_info.h +208 -0
- netgen/include/pybind11/cast.h +2361 -0
- netgen/include/pybind11/chrono.h +228 -0
- netgen/include/pybind11/common.h +2 -0
- netgen/include/pybind11/complex.h +74 -0
- netgen/include/pybind11/conduit/README.txt +15 -0
- netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
- netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
- netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
- netgen/include/pybind11/critical_section.h +56 -0
- netgen/include/pybind11/detail/class.h +823 -0
- netgen/include/pybind11/detail/common.h +1348 -0
- netgen/include/pybind11/detail/cpp_conduit.h +75 -0
- netgen/include/pybind11/detail/descr.h +226 -0
- netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
- netgen/include/pybind11/detail/exception_translation.h +71 -0
- netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
- netgen/include/pybind11/detail/init.h +538 -0
- netgen/include/pybind11/detail/internals.h +799 -0
- netgen/include/pybind11/detail/native_enum_data.h +209 -0
- netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
- netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
- netgen/include/pybind11/detail/type_caster_base.h +1591 -0
- netgen/include/pybind11/detail/typeid.h +65 -0
- netgen/include/pybind11/detail/using_smart_holder.h +22 -0
- netgen/include/pybind11/detail/value_and_holder.h +90 -0
- netgen/include/pybind11/eigen/common.h +9 -0
- netgen/include/pybind11/eigen/matrix.h +723 -0
- netgen/include/pybind11/eigen/tensor.h +521 -0
- netgen/include/pybind11/eigen.h +12 -0
- netgen/include/pybind11/embed.h +320 -0
- netgen/include/pybind11/eval.h +161 -0
- netgen/include/pybind11/functional.h +147 -0
- netgen/include/pybind11/gil.h +199 -0
- netgen/include/pybind11/gil_safe_call_once.h +102 -0
- netgen/include/pybind11/gil_simple.h +37 -0
- netgen/include/pybind11/iostream.h +265 -0
- netgen/include/pybind11/native_enum.h +67 -0
- netgen/include/pybind11/numpy.h +2312 -0
- netgen/include/pybind11/operators.h +202 -0
- netgen/include/pybind11/options.h +92 -0
- netgen/include/pybind11/pybind11.h +3645 -0
- netgen/include/pybind11/pytypes.h +2680 -0
- netgen/include/pybind11/stl/filesystem.h +114 -0
- netgen/include/pybind11/stl.h +666 -0
- netgen/include/pybind11/stl_bind.h +858 -0
- netgen/include/pybind11/subinterpreter.h +299 -0
- netgen/include/pybind11/trampoline_self_life_support.h +65 -0
- netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
- netgen/include/pybind11/typing.h +298 -0
- netgen/include/pybind11/warnings.h +75 -0
- netgen/include/stlgeom/meshstlsurface.hpp +67 -0
- netgen/include/stlgeom/stlgeom.hpp +491 -0
- netgen/include/stlgeom/stlline.hpp +193 -0
- netgen/include/stlgeom/stltool.hpp +331 -0
- netgen/include/stlgeom/stltopology.hpp +419 -0
- netgen/include/stlgeom/vsstl.hpp +58 -0
- netgen/include/visualization/meshdoc.hpp +42 -0
- netgen/include/visualization/mvdraw.hpp +325 -0
- netgen/include/visualization/vispar.hpp +128 -0
- netgen/include/visualization/visual.hpp +28 -0
- netgen/include/visualization/visual_api.hpp +10 -0
- netgen/include/visualization/vssolution.hpp +399 -0
- netgen/lib/libnggui.lib +0 -0
- netgen/lib/ngcore.lib +0 -0
- netgen/lib/nglib.lib +0 -0
- netgen/lib/togl.lib +0 -0
- netgen/libnggui.dll +0 -0
- netgen/libngguipy.lib +0 -0
- netgen/libngguipy.pyd +0 -0
- netgen/libngpy/_NgOCC.pyi +1545 -0
- netgen/libngpy/__init__.pyi +7 -0
- netgen/libngpy/_csg.pyi +259 -0
- netgen/libngpy/_geom2d.pyi +323 -0
- netgen/libngpy/_meshing.pyi +1111 -0
- netgen/libngpy/_stl.pyi +131 -0
- netgen/libngpy.lib +0 -0
- netgen/libngpy.pyd +0 -0
- netgen/meshing.py +65 -0
- netgen/ngcore.dll +0 -0
- netgen/nglib.dll +0 -0
- netgen/occ.py +52 -0
- netgen/read_gmsh.py +259 -0
- netgen/read_meshio.py +22 -0
- netgen/stl.py +2 -0
- netgen/togl.dll +0 -0
- netgen/version.py +2 -0
- netgen/webgui.py +529 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
- pyngcore/__init__.py +1 -0
- pyngcore/pyngcore.cp314-win_amd64.pyd +0 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
#ifndef FILE_AUTODIFF
|
|
2
|
+
#define FILE_AUTODIFF
|
|
3
|
+
|
|
4
|
+
/**************************************************************************/
|
|
5
|
+
/* File: autodiff.hpp */
|
|
6
|
+
/* Author: Joachim Schoeberl */
|
|
7
|
+
/* Date: 24. Oct. 02 */
|
|
8
|
+
/**************************************************************************/
|
|
9
|
+
|
|
10
|
+
// Automatic differentiation datatype
|
|
11
|
+
|
|
12
|
+
namespace netgen
|
|
13
|
+
{
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
Datatype for automatic differentiation.
|
|
17
|
+
Contains function value and D derivatives. Algebraic
|
|
18
|
+
operations are overloaded by using product-rule etc. etc.
|
|
19
|
+
**/
|
|
20
|
+
template <int D, typename SCAL = double>
|
|
21
|
+
class AutoDiff
|
|
22
|
+
{
|
|
23
|
+
SCAL val;
|
|
24
|
+
SCAL dval[D];
|
|
25
|
+
public:
|
|
26
|
+
|
|
27
|
+
typedef AutoDiff<D,SCAL> TELEM;
|
|
28
|
+
typedef SCAL TSCAL;
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
/// elements are undefined
|
|
32
|
+
AutoDiff () throw() { };
|
|
33
|
+
// { val = 0; for (int i = 0; i < D; i++) dval[i] = 0; } // !
|
|
34
|
+
|
|
35
|
+
/// copy constructor
|
|
36
|
+
AutoDiff (const AutoDiff & ad2) throw()
|
|
37
|
+
{
|
|
38
|
+
val = ad2.val;
|
|
39
|
+
for (int i = 0; i < D; i++)
|
|
40
|
+
dval[i] = ad2.dval[i];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// initial object with constant value
|
|
44
|
+
AutoDiff (SCAL aval) throw()
|
|
45
|
+
{
|
|
46
|
+
val = aval;
|
|
47
|
+
for (int i = 0; i < D; i++)
|
|
48
|
+
dval[i] = 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/// init object with (val, e_diffindex)
|
|
52
|
+
AutoDiff (SCAL aval, int diffindex) throw()
|
|
53
|
+
{
|
|
54
|
+
val = aval;
|
|
55
|
+
for (int i = 0; i < D; i++)
|
|
56
|
+
dval[i] = 0;
|
|
57
|
+
dval[diffindex] = 1;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/// assign constant value
|
|
61
|
+
AutoDiff & operator= (SCAL aval) throw()
|
|
62
|
+
{
|
|
63
|
+
val = aval;
|
|
64
|
+
for (int i = 0; i < D; i++)
|
|
65
|
+
dval[i] = 0;
|
|
66
|
+
return *this;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/// returns value
|
|
70
|
+
SCAL Value() const throw() { return val; }
|
|
71
|
+
|
|
72
|
+
/// returns partial derivative
|
|
73
|
+
SCAL DValue (int i) const throw() { return dval[i]; }
|
|
74
|
+
|
|
75
|
+
/// access value
|
|
76
|
+
SCAL & Value() throw() { return val; }
|
|
77
|
+
|
|
78
|
+
/// accesses partial derivative
|
|
79
|
+
SCAL & DValue (int i) throw() { return dval[i]; }
|
|
80
|
+
|
|
81
|
+
///
|
|
82
|
+
AutoDiff<D,SCAL> & operator+= (const AutoDiff<D,SCAL> & y) throw()
|
|
83
|
+
{
|
|
84
|
+
val += y.val;
|
|
85
|
+
for (int i = 0; i < D; i++)
|
|
86
|
+
dval[i] += y.dval[i];
|
|
87
|
+
return *this;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
///
|
|
91
|
+
AutoDiff<D,SCAL> & operator-= (const AutoDiff<D,SCAL> & y) throw()
|
|
92
|
+
{
|
|
93
|
+
val -= y.val;
|
|
94
|
+
for (int i = 0; i < D; i++)
|
|
95
|
+
dval[i] -= y.dval[i];
|
|
96
|
+
return *this;
|
|
97
|
+
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
///
|
|
101
|
+
AutoDiff<D,SCAL> & operator*= (const AutoDiff<D,SCAL> & y) throw()
|
|
102
|
+
{
|
|
103
|
+
for (int i = 0; i < D; i++)
|
|
104
|
+
{
|
|
105
|
+
// dval[i] *= y.val;
|
|
106
|
+
// dval[i] += val * y.dval[i];
|
|
107
|
+
dval[i] = dval[i] * y.val + val * y.dval[i];
|
|
108
|
+
}
|
|
109
|
+
val *= y.val;
|
|
110
|
+
return *this;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
///
|
|
114
|
+
AutoDiff<D,SCAL> & operator*= (const SCAL & y) throw()
|
|
115
|
+
{
|
|
116
|
+
val *= y;
|
|
117
|
+
for (int i = 0; i < D; i++)
|
|
118
|
+
dval[i] *= y;
|
|
119
|
+
return *this;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
///
|
|
123
|
+
AutoDiff<D,SCAL> & operator/= (const SCAL & y) throw()
|
|
124
|
+
{
|
|
125
|
+
SCAL iy = 1.0 / y;
|
|
126
|
+
val *= iy;
|
|
127
|
+
for (int i = 0; i < D; i++)
|
|
128
|
+
dval[i] *= iy;
|
|
129
|
+
return *this;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
///
|
|
133
|
+
bool operator== (SCAL val2) throw()
|
|
134
|
+
{
|
|
135
|
+
return val == val2;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
///
|
|
139
|
+
bool operator!= (SCAL val2) throw()
|
|
140
|
+
{
|
|
141
|
+
return val != val2;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
///
|
|
145
|
+
bool operator< (SCAL val2) throw()
|
|
146
|
+
{
|
|
147
|
+
return val < val2;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
///
|
|
151
|
+
bool operator> (SCAL val2) throw()
|
|
152
|
+
{
|
|
153
|
+
return val > val2;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
//@{ AutoDiff helper functions.
|
|
159
|
+
|
|
160
|
+
/// prints AutoDiff
|
|
161
|
+
template<int D, typename SCAL>
|
|
162
|
+
inline ostream & operator<< (ostream & ost, const AutoDiff<D,SCAL> & x)
|
|
163
|
+
{
|
|
164
|
+
ost << x.Value() << ", D = ";
|
|
165
|
+
for (int i = 0; i < D; i++)
|
|
166
|
+
ost << x.DValue(i) << " ";
|
|
167
|
+
return ost;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/// AutoDiff plus AutoDiff
|
|
171
|
+
template<int D, typename SCAL>
|
|
172
|
+
inline AutoDiff<D,SCAL> operator+ (const AutoDiff<D,SCAL> & x, const AutoDiff<D,SCAL> & y) throw()
|
|
173
|
+
{
|
|
174
|
+
AutoDiff<D,SCAL> res;
|
|
175
|
+
res.Value () = x.Value()+y.Value();
|
|
176
|
+
// AutoDiff<D,SCAL> res(x.Value()+y.Value());
|
|
177
|
+
for (int i = 0; i < D; i++)
|
|
178
|
+
res.DValue(i) = x.DValue(i) + y.DValue(i);
|
|
179
|
+
return res;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
/// AutoDiff minus AutoDiff
|
|
184
|
+
template<int D, typename SCAL>
|
|
185
|
+
inline AutoDiff<D,SCAL> operator- (const AutoDiff<D,SCAL> & x, const AutoDiff<D,SCAL> & y) throw()
|
|
186
|
+
{
|
|
187
|
+
AutoDiff<D,SCAL> res;
|
|
188
|
+
res.Value() = x.Value()-y.Value();
|
|
189
|
+
// AutoDiff<D,SCAL> res (x.Value()-y.Value());
|
|
190
|
+
for (int i = 0; i < D; i++)
|
|
191
|
+
res.DValue(i) = x.DValue(i) - y.DValue(i);
|
|
192
|
+
return res;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/// double plus AutoDiff
|
|
196
|
+
template<int D, typename SCAL>
|
|
197
|
+
inline AutoDiff<D,SCAL> operator+ (double x, const AutoDiff<D,SCAL> & y) throw()
|
|
198
|
+
{
|
|
199
|
+
AutoDiff<D,SCAL> res;
|
|
200
|
+
res.Value() = x+y.Value();
|
|
201
|
+
for (int i = 0; i < D; i++)
|
|
202
|
+
res.DValue(i) = y.DValue(i);
|
|
203
|
+
return res;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/// AutoDiff plus double
|
|
207
|
+
template<int D, typename SCAL>
|
|
208
|
+
inline AutoDiff<D,SCAL> operator+ (const AutoDiff<D,SCAL> & y, double x) throw()
|
|
209
|
+
{
|
|
210
|
+
AutoDiff<D,SCAL> res;
|
|
211
|
+
res.Value() = x+y.Value();
|
|
212
|
+
for (int i = 0; i < D; i++)
|
|
213
|
+
res.DValue(i) = y.DValue(i);
|
|
214
|
+
return res;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
/// minus AutoDiff
|
|
219
|
+
template<int D, typename SCAL>
|
|
220
|
+
inline AutoDiff<D,SCAL> operator- (const AutoDiff<D,SCAL> & x) throw()
|
|
221
|
+
{
|
|
222
|
+
AutoDiff<D,SCAL> res;
|
|
223
|
+
res.Value() = -x.Value();
|
|
224
|
+
for (int i = 0; i < D; i++)
|
|
225
|
+
res.DValue(i) = -x.DValue(i);
|
|
226
|
+
return res;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/// AutoDiff minus double
|
|
230
|
+
template<int D, typename SCAL>
|
|
231
|
+
inline AutoDiff<D,SCAL> operator- (const AutoDiff<D,SCAL> & x, double y) throw()
|
|
232
|
+
{
|
|
233
|
+
AutoDiff<D,SCAL> res;
|
|
234
|
+
res.Value() = x.Value()-y;
|
|
235
|
+
for (int i = 0; i < D; i++)
|
|
236
|
+
res.DValue(i) = x.DValue(i);
|
|
237
|
+
return res;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
///
|
|
241
|
+
template<int D, typename SCAL>
|
|
242
|
+
inline AutoDiff<D,SCAL> operator- (double x, const AutoDiff<D,SCAL> & y) throw()
|
|
243
|
+
{
|
|
244
|
+
AutoDiff<D,SCAL> res;
|
|
245
|
+
res.Value() = x-y.Value();
|
|
246
|
+
for (int i = 0; i < D; i++)
|
|
247
|
+
res.DValue(i) = -y.DValue(i);
|
|
248
|
+
return res;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
/// double times AutoDiff
|
|
253
|
+
template<int D, typename SCAL>
|
|
254
|
+
inline AutoDiff<D,SCAL> operator* (double x, const AutoDiff<D,SCAL> & y) throw()
|
|
255
|
+
{
|
|
256
|
+
AutoDiff<D,SCAL> res;
|
|
257
|
+
res.Value() = x*y.Value();
|
|
258
|
+
for (int i = 0; i < D; i++)
|
|
259
|
+
res.DValue(i) = x*y.DValue(i);
|
|
260
|
+
return res;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/// AutoDiff times double
|
|
264
|
+
template<int D, typename SCAL>
|
|
265
|
+
inline AutoDiff<D,SCAL> operator* (const AutoDiff<D,SCAL> & y, double x) throw()
|
|
266
|
+
{
|
|
267
|
+
AutoDiff<D,SCAL> res;
|
|
268
|
+
res.Value() = x*y.Value();
|
|
269
|
+
for (int i = 0; i < D; i++)
|
|
270
|
+
res.DValue(i) = x*y.DValue(i);
|
|
271
|
+
return res;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/// AutoDiff times AutoDiff
|
|
275
|
+
template<int D, typename SCAL>
|
|
276
|
+
inline AutoDiff<D,SCAL> operator* (const AutoDiff<D,SCAL> & x, const AutoDiff<D,SCAL> & y) throw()
|
|
277
|
+
{
|
|
278
|
+
AutoDiff<D,SCAL> res;
|
|
279
|
+
SCAL hx = x.Value();
|
|
280
|
+
SCAL hy = y.Value();
|
|
281
|
+
|
|
282
|
+
res.Value() = hx*hy;
|
|
283
|
+
for (int i = 0; i < D; i++)
|
|
284
|
+
res.DValue(i) = hx*y.DValue(i) + hy*x.DValue(i);
|
|
285
|
+
|
|
286
|
+
return res;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
/// Inverse of AutoDiff
|
|
291
|
+
template<int D, typename SCAL>
|
|
292
|
+
inline AutoDiff<D,SCAL> Inv (const AutoDiff<D,SCAL> & x)
|
|
293
|
+
{
|
|
294
|
+
AutoDiff<D,SCAL> res(1.0 / x.Value());
|
|
295
|
+
for (int i = 0; i < D; i++)
|
|
296
|
+
res.DValue(i) = -x.DValue(i) / (x.Value() * x.Value());
|
|
297
|
+
return res;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
/// AutoDiff div AutoDiff
|
|
302
|
+
template<int D, typename SCAL>
|
|
303
|
+
inline AutoDiff<D,SCAL> operator/ (const AutoDiff<D,SCAL> & x, const AutoDiff<D,SCAL> & y)
|
|
304
|
+
{
|
|
305
|
+
return x * Inv (y);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/// AutoDiff div double
|
|
309
|
+
template<int D, typename SCAL>
|
|
310
|
+
inline AutoDiff<D,SCAL> operator/ (const AutoDiff<D,SCAL> & x, double y)
|
|
311
|
+
{
|
|
312
|
+
return (1/y) * x;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/// double div AutoDiff
|
|
316
|
+
template<int D, typename SCAL>
|
|
317
|
+
inline AutoDiff<D,SCAL> operator/ (double x, const AutoDiff<D,SCAL> & y)
|
|
318
|
+
{
|
|
319
|
+
return x * Inv(y);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
} // namespace netgen
|
|
323
|
+
|
|
324
|
+
namespace ngcore
|
|
325
|
+
{
|
|
326
|
+
/// AutoDiff times AutoDiff
|
|
327
|
+
template<int D, typename SCAL>
|
|
328
|
+
inline netgen::AutoDiff<D,SCAL> sqr (const netgen::AutoDiff<D,SCAL> & x) throw()
|
|
329
|
+
{
|
|
330
|
+
netgen::AutoDiff<D,SCAL> res;
|
|
331
|
+
SCAL hx = x.Value();
|
|
332
|
+
res.Value() = hx*hx;
|
|
333
|
+
hx *= 2;
|
|
334
|
+
for (int i = 0; i < D; i++)
|
|
335
|
+
res.DValue(i) = hx*x.DValue(i);
|
|
336
|
+
return res;
|
|
337
|
+
}
|
|
338
|
+
} // namespace ngcore
|
|
339
|
+
|
|
340
|
+
namespace std
|
|
341
|
+
{
|
|
342
|
+
template<int D, typename SCAL>
|
|
343
|
+
inline netgen::AutoDiff<D,SCAL> fabs (const netgen::AutoDiff<D,SCAL> & x)
|
|
344
|
+
{
|
|
345
|
+
double abs = fabs (x.Value());
|
|
346
|
+
netgen::AutoDiff<D,SCAL> res( abs );
|
|
347
|
+
if (abs != 0.0)
|
|
348
|
+
for (int i = 0; i < D; i++)
|
|
349
|
+
res.DValue(i) = x.DValue(i) / abs;
|
|
350
|
+
else
|
|
351
|
+
for (int i = 0; i < D; i++)
|
|
352
|
+
res.DValue(i) = 0.0;
|
|
353
|
+
return res;
|
|
354
|
+
}
|
|
355
|
+
} // namespace std
|
|
356
|
+
#endif
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
braucht man nicht mehr
|
|
2
|
+
|
|
3
|
+
#ifndef FILE_AUTOPTR
|
|
4
|
+
#define FILE_AUTOPTR
|
|
5
|
+
|
|
6
|
+
/**************************************************************************/
|
|
7
|
+
/* File: autoptr.hpp */
|
|
8
|
+
/* Author: STL, Joachim Schoeberl */
|
|
9
|
+
/* Date: 29. Dec. 02 */
|
|
10
|
+
/**************************************************************************/
|
|
11
|
+
|
|
12
|
+
namespace netgen
|
|
13
|
+
{
|
|
14
|
+
|
|
15
|
+
/*
|
|
16
|
+
template <typename T>
|
|
17
|
+
class AutoPtr
|
|
18
|
+
{
|
|
19
|
+
private:
|
|
20
|
+
T * ptr;
|
|
21
|
+
public:
|
|
22
|
+
typedef T* pT;
|
|
23
|
+
explicit AutoPtr (T * p = 0) { ptr = p; }
|
|
24
|
+
~AutoPtr () { delete ptr; }
|
|
25
|
+
|
|
26
|
+
T & operator*() const { return *ptr; }
|
|
27
|
+
T* operator->() const { return ptr; }
|
|
28
|
+
T *& Ptr() { return ptr; }
|
|
29
|
+
T * Ptr() const { return ptr; }
|
|
30
|
+
void Reset(T * p = 0) { if (p != ptr) { delete ptr; ptr = p; } }
|
|
31
|
+
operator bool () { return ptr != 0; }
|
|
32
|
+
private:
|
|
33
|
+
AutoPtr (AutoPtr &) { ; }
|
|
34
|
+
AutoPtr & operator= (AutoPtr &) { ; }
|
|
35
|
+
};
|
|
36
|
+
*/
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
#endif
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// gzstream, C++ iostream classes wrapping the zlib compression library.
|
|
3
|
+
// Copyright (C) 2001 Deepak Bandyopadhyay, Lutz Kettner
|
|
4
|
+
//
|
|
5
|
+
// This library is free software; you can redistribute it and/or
|
|
6
|
+
// modify it under the terms of the GNU Lesser General Public
|
|
7
|
+
// License as published by the Free Software Foundation; either
|
|
8
|
+
// version 2.1 of the License, or (at your option) any later version.
|
|
9
|
+
//
|
|
10
|
+
// This library is distributed in the hope that it will be useful,
|
|
11
|
+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
13
|
+
// Lesser General Public License for more details.
|
|
14
|
+
//
|
|
15
|
+
// You should have received a copy of the GNU Lesser General Public
|
|
16
|
+
// License along with this library; if not, write to the Free Software
|
|
17
|
+
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
18
|
+
// ============================================================================
|
|
19
|
+
//
|
|
20
|
+
// File : gzstream.h
|
|
21
|
+
// Revision : $Revision: 1.5 $
|
|
22
|
+
// Revision_date : $Date: 2002/04/26 23:30:15 $
|
|
23
|
+
// Author(s) : Deepak Bandyopadhyay, Lutz Kettner
|
|
24
|
+
//
|
|
25
|
+
// Standard streambuf implementation following Nicolai Josuttis, "The
|
|
26
|
+
// Standard C++ Library".
|
|
27
|
+
// ============================================================================
|
|
28
|
+
|
|
29
|
+
#ifndef GZSTREAM_H
|
|
30
|
+
#define GZSTREAM_H 1
|
|
31
|
+
|
|
32
|
+
// standard C++ with new header file names and std:: namespace
|
|
33
|
+
#include <iostream>
|
|
34
|
+
#include <fstream>
|
|
35
|
+
#include <zlib.h>
|
|
36
|
+
|
|
37
|
+
#ifdef GZSTREAM_NAMESPACE
|
|
38
|
+
namespace GZSTREAM_NAMESPACE {
|
|
39
|
+
#endif
|
|
40
|
+
|
|
41
|
+
// ----------------------------------------------------------------------------
|
|
42
|
+
// Internal classes to implement gzstream. See below for user classes.
|
|
43
|
+
// ----------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
class gzstreambuf : public std::streambuf {
|
|
46
|
+
private:
|
|
47
|
+
static const int bufferSize = 47+256; // size of data buff
|
|
48
|
+
// totals 512 bytes under g++ for igzstream at the end.
|
|
49
|
+
|
|
50
|
+
gzFile file; // file handle for compressed file
|
|
51
|
+
char buffer[bufferSize]; // data buffer
|
|
52
|
+
char opened; // open/close state of stream
|
|
53
|
+
int mode; // I/O mode
|
|
54
|
+
|
|
55
|
+
int flush_buffer();
|
|
56
|
+
public:
|
|
57
|
+
gzstreambuf() : opened(0) {
|
|
58
|
+
setp( buffer, buffer + (bufferSize-1));
|
|
59
|
+
setg( buffer + 4, // beginning of putback area
|
|
60
|
+
buffer + 4, // read position
|
|
61
|
+
buffer + 4); // end position
|
|
62
|
+
// ASSERT: both input & output capabilities will not be used together
|
|
63
|
+
}
|
|
64
|
+
int is_open() { return opened; }
|
|
65
|
+
gzstreambuf* open( const std::filesystem::path & name, int open_mode);
|
|
66
|
+
gzstreambuf* close();
|
|
67
|
+
~gzstreambuf() { close(); }
|
|
68
|
+
|
|
69
|
+
virtual int overflow( int c = EOF);
|
|
70
|
+
virtual int underflow();
|
|
71
|
+
virtual int sync();
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
class DLL_HEADER gzstreambase : virtual public std::ios {
|
|
75
|
+
protected:
|
|
76
|
+
gzstreambuf buf;
|
|
77
|
+
public:
|
|
78
|
+
gzstreambase() { init(&buf); }
|
|
79
|
+
gzstreambase( const std::filesystem::path & name, int open_mode);
|
|
80
|
+
~gzstreambase();
|
|
81
|
+
void open( const std::filesystem::path & name, int open_mode);
|
|
82
|
+
void close();
|
|
83
|
+
gzstreambuf* rdbuf() { return &buf; }
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// ----------------------------------------------------------------------------
|
|
87
|
+
// User classes. Use igzstream and ogzstream analogously to ifstream and
|
|
88
|
+
// ofstream respectively. They read and write files based on the gz*
|
|
89
|
+
// function interface of the zlib. Files are compatible with gzip compression.
|
|
90
|
+
// ----------------------------------------------------------------------------
|
|
91
|
+
|
|
92
|
+
class DLL_HEADER igzstream : public gzstreambase, public std::istream {
|
|
93
|
+
public:
|
|
94
|
+
igzstream() : std::istream( &buf) {}
|
|
95
|
+
igzstream( const std::filesystem::path & name, int open_mode = std::ios::in)
|
|
96
|
+
: gzstreambase( name, open_mode), std::istream( &buf) {}
|
|
97
|
+
gzstreambuf* rdbuf() { return gzstreambase::rdbuf(); }
|
|
98
|
+
void open( const std::filesystem::path & name, int open_mode = std::ios::in) {
|
|
99
|
+
gzstreambase::open( name, open_mode);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
class DLL_HEADER ogzstream : public gzstreambase, public std::ostream {
|
|
104
|
+
public:
|
|
105
|
+
ogzstream() : std::ostream( &buf) {}
|
|
106
|
+
ogzstream( const std::filesystem::path & name, int mode = std::ios::out)
|
|
107
|
+
: gzstreambase( name, mode), std::ostream( &buf) {}
|
|
108
|
+
gzstreambuf* rdbuf() { return gzstreambase::rdbuf(); }
|
|
109
|
+
void open( const std::filesystem::path & name, int open_mode = std::ios::out) {
|
|
110
|
+
gzstreambase::open( name, open_mode);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
#ifdef GZSTREAM_NAMESPACE
|
|
115
|
+
} // namespace GZSTREAM_NAMESPACE
|
|
116
|
+
#endif
|
|
117
|
+
|
|
118
|
+
#endif // GZSTREAM_H
|
|
119
|
+
// ============================================================================
|
|
120
|
+
// EOF //
|
|
121
|
+
|