diff --git a/docs/DynamicsDiagonal.rst b/docs/DynamicsDiagonal.rst new file mode 100644 index 0000000..7684d89 --- /dev/null +++ b/docs/DynamicsDiagonal.rst @@ -0,0 +1,284 @@ + +**************************** +GooseFEM::Dynamics::Diagonal +**************************** + +.. note:: + + Source: + + .. code-block:: cpp + + #include <GooseFEM/DynamicsDiagonalPeriodic.h> + #include <GooseFEM/DynamicsDiagonalSemiPeriodic.h> + #include <GooseFEM/DynamicsDiagonalLinearStrainQuad4.h> + +Overview +======== + +Principle +--------- + +The philosophy is to provide some structure to efficiently run a finite element simulation which remains customizable. Even more customization can be obtained by copy/pasting the source and modifying it to your need. The idea that is followed involves a hierarchy of three classes, whereby a class that is higher in hierarchy writes to some field of the class that is lower in hierarchy, runs a function, and reads from some field. In general: + +* **Discretized system** (``GooseFEM::Dynamics::Diagonal::Periodic``, ``GooseFEM::Dynamics::Diagonal::SemiPeriodic``). + + Defines the discretized system, and assembles the (inverse) mass matrix, the displacement dependent forces, and the velocity dependent forces from element arrays that are provided by the element definition. + +* **Element definition** (``GooseFEM::Dynamics::Diagonal::LinearStrain::Qaud4``) + + Provides the element arrays by performing numerical quadrature. At the integration point the constitutive response is probed from the quadrature point definition. + +* **Quadrature point definition** + + This class is not provided, and should be provided by the user. + +Example +------- + +A simple example is: + +[:download:`source: examples/DynamicsDiagonalPeriodic/laminate/no_damping/Verlet/main.cpp <examples/DynamicsDiagonalPeriodic/laminate/no_damping/Verlet/main.cpp>`] + +.. code-block:: cpp + + #include <Eigen/Eigen> + #include <cppmat/cppmat.h> + #include <GooseFEM/GooseFEM.h> + #include <GooseMaterial/AmorphousSolid/LinearStrain/Elastic/Cartesian2d.h> + + // ------------------------------------------------------------------- + + using MatS = GooseFEM::MatS; + using MatD = GooseFEM::MatD; + using ColD = GooseFEM::ColD; + + using T2 = cppmat::cartesian2d::tensor2 <double>; + using T2s = cppmat::cartesian2d::tensor2s<double>; + + namespace GM = GooseMaterial::AmorphousSolid::LinearStrain::Elastic::Cartesian2d; + + // =================================================================== + + class Quadrature + { + public: + T2s eps, epsdot, sig; + + size_t nhard; + GM::Material hard, soft; + + double Ebar, Vbar; + + Quadrature(size_t nhard); + + double density (size_t elem, size_t k, double V); + void stressStrain (size_t elem, size_t k, double V); + void stressStrainRate (size_t elem, size_t k, double V); + void stressStrainPost (size_t elem, size_t k, double V); + void stressStrainRatePost(size_t elem, size_t k, double V); + }; + + // ------------------------------------------------------------------- + + Quadrature::Quadrature(size_t _nhard) + { + nhard = _nhard; + hard = GM::Material(100.,10.); + soft = GM::Material(100., 1.); + } + + // ------------------------------------------------------------------- + + double Quadrature::density(size_t elem, size_t k, double V) + { + return 1.0; + } + // ------------------------------------------------------------------- + + void Quadrature::stressStrain(size_t elem, size_t k, double V) + { + if ( elem < nhard ) sig = hard.stress(eps); + else sig = soft.stress(eps); + } + // ------------------------------------------------------------------- + + void Quadrature::stressStrainRate(size_t elem, size_t k, double V) + { + } + // ------------------------------------------------------------------- + + void Quadrature::stressStrainPost(size_t elem, size_t k, double V) + { + Vbar += V; + + if ( elem < nhard ) Ebar += hard.energy(eps) * V; + else Ebar += soft.energy(eps) * V; + } + + // ------------------------------------------------------------------- + + void Quadrature::stressStrainRatePost(size_t elem, size_t k, double V) + { + } + + // =================================================================== + + int main() + { + // class which provides the mesh + GooseFEM::Mesh::Quad4::Regular mesh(40,40,1.); + + // class which provides the constitutive response at each quadrature point + auto quadrature = std::make_shared<Quadrature>(40*40/4); + + // class which provides the response of each element + using Elem = GooseFEM::Dynamics::Diagonal::LinearStrain::Quad4<Quadrature>; + auto elem = std::make_shared<Elem>(quadrature); + + // class which provides the system and an increment + GooseFEM::Dynamics::Diagonal::Periodic<Elem> sim( + elem, + mesh.coor(), + mesh.conn(), + mesh.dofsPeriodic(), + 1.e-2, + 0.0 + ); + + // loop over increments + for ( ... ) + { + // - set displacement of fixed DOFs + ... + + // - compute time increment + sim.Verlet(); + + // - post-process + quadrature->Ebar = 0.0; + quadrature->Vbar = 0.0; + + sim.post(); + + ... + } + + return 0; + } + +Pseudo-code +----------- + +What is happening inside ``Verlet`` is evaluating the forces (and the mass matrix), and updating the displacements by solving the system. In pseudo-code: + +* Mass matrix: + + .. code-block:: python + + sim.computeMinv(): + { + for e in elements: + + sim->elem->xe(i,j) = ... + sim->elem->ue(i,j) = ... + + sim->elem->computeM(e): + { + for k in integration-points: + + sim->elem->M(...,...) += ... * sim->elem->quad->density(e,k,V) + } + + M(...) += sim->elem->M(i,i) + } + +* Displacement dependent force: + + .. code-block:: python + + sim.computeFu(): + { + for e in elements: + + sim->elem->xe(i,j) = ... + sim->elem->ue(i,j) = ... + + sim->elem->computeFu(e): + { + for k in integration-points: + + sim->elem->quad->eps(i,j) = ... + + sim->elem->quad->stressStrain(e,k,V) + + sim->elem->fu(...) += ... * sim->elem->quad->sig(i,j) + } + + Fu(...) += sim->elem->fu(i) + } + +* Velocity dependent force: + + .. code-block:: python + + sim.computeFv(): + { + for e in elements: + + sim->elem->xe(i,j) = ... + sim->elem->ue(i,j) = ... + sim->elem->ve(i,j) = ... + + sim->elem->computeFv(e): + { + for k in integration-points: + + sim->elem->quad->epsdot(i,j) = ... + + sim->elem->quad->stressStrainRate(e,k,V) + + sim->elem->fv(...) += ... * sim->elem->quad->sig(i,j) + } + + Fv(...) += sim->elem->fu(i) + } + +Signature +--------- + +From this it is clear that: + +* ``GooseFEM::Dynamics::Diagonal::Periodic`` requires the following minimal signature from ``GooseFEM::Dynamics::Diagonal::LinearStrain::Qaud4``: + + .. code-block:: cpp + + class Element + { + public: + matrix M; // should have operator(i,j) + column fu, fv; // should have operator(i) + matrix xe, ue, ve; // should have operator(i,j) + + void computeM (size_t elem); // mass matrix <- quad->density + void computeFu(size_t elem); // displacement dependent forces <- quad->stressStrain + void computeFv(size_t elem); // displacement dependent forces <- quad->stressStrainRate + void post (size_t elem); // post-process <- quad->stressStrain(Rate) + } + +* ``GooseFEM::Dynamics::Diagonal::LinearStrain::Qaud4`` requires the minimal signature from ``Quadrature`` + + .. code-block:: cpp + + class Quadrature + { + public: + tensor eps, epsdot, sig; // should have operator(i,j) + + double density (size_t elem, size_t k, double V); + void stressStrain (size_t elem, size_t k, double V); + void stressStrainRate (size_t elem, size_t k, double V); + void stressStrainPost (size_t elem, size_t k, double V); + void stressStrainRatePost(size_t elem, size_t k, double V); + } + diff --git a/docs/Mesh.rst b/docs/Mesh.rst index 2ceb87f..85c3782 100644 --- a/docs/Mesh.rst +++ b/docs/Mesh.rst @@ -1,96 +1,106 @@ -****************** -<GooseFEM/Mesh.h> -****************** +************** +GooseFEM::Mesh +************** + +.. note:: + + Source: + + .. code-block:: cpp + + #include <GooseFEM/Mesh.h> ``GooseFEM::Mesh::dofs`` ======================== Get a sequential list of DOF-numbers for each vector-component of each node. .. code-block:: cpp MatS GooseFEM::Mesh::dofs ( size_t nnode , size_t ndim ) For example for 3 nodes in 2 dimensions the output is .. math:: \begin{bmatrix} 0 & 1 \\ 2 & 3 \\ 4 & 5 \end{bmatrix} ``GooseFEM::Mesh::renumber`` ============================ * Renumber indices to lowest possible indices (returns a copy, input not modified). .. code-block:: cpp MatS GooseFEM::Mesh::renumber ( const MatS &in ) For example: .. math:: \begin{bmatrix} 0 & 1 \\ 0 & 1 \\ 5 & 4 \end{bmatrix} is renumbered to .. math:: \begin{bmatrix} 0 & 1 \\ 0 & 1 \\ 3 & 2 \end{bmatrix} * Reorder indices such that some items are at the beginning or the end (returns a copy, input not modified). .. code-block:: cpp - MatS GooseFEM::Mesh::renumber ( const MatS &in , const VecS &idx, std::string location="end" ); + MatS GooseFEM::Mesh::renumber ( const MatS &in , const ColS &idx, std::string location="end" ); For example: .. math:: \mathrm{in} = \begin{bmatrix} 0 & 1 \\ 0 & 1 \\ 3 & 2 \\ 4 & 5 \end{bmatrix} with .. math:: \mathrm{idx} = \begin{bmatrix} 6 & 4 \end{bmatrix} Implies that ``in`` is renumbered such that the 6th item becomes the one-before-last item (:math:`5 \rightarrow 4`), and the 4th item become the last (:math:`3 \rightarrow 5`). The remaining items are renumbered to the lowest index while keeping the same order. The result: .. math:: \begin{bmatrix} 0 & 1 \\ 0 & 1 \\ 5 & 2 \\ 4 & 3 \end{bmatrix} + Consider also [:download:`source: figures/Mesh/renumber.cpp <figures/Mesh/renumber.cpp>`] + diff --git a/docs/MeshQuad4.rst b/docs/MeshQuad4.rst index 4eea39a..c941490 100644 --- a/docs/MeshQuad4.rst +++ b/docs/MeshQuad4.rst @@ -1,53 +1,118 @@ -********************** -<GooseFEM/MeshQuad4.h> -********************** +********************* +GooseFEM::Mesh::Quad4 +********************* + +.. note:: + + Source: + + .. code-block:: cpp + + #include <GooseFEM/MeshQuad4.h> ``GooseFEM::Mesh::Quad4::Regular`` ================================== -Regular mesh of linear quadrilaterals in two-dimensions. +.. code-block:: cpp + + GooseFEM::Mesh::Quad4::Regular(size_t nx, size_t ny, double h=1.); + +Regular mesh of linear quadrilaterals in two-dimensions. The element edges are all of the same size :math:`h` (by default equal to one), optional scaling can be applied afterwards. For example the mesh shown below that consists of 21 x 11 elements. In that image the element numbers are indicated with a color, and likewise for the boundary nodes. + +.. image:: figures/MeshQuad4/Regular/example.svg + :width: 500px + :align: center Methods: -* ``MatS = GooseFEM::Mesh::Quad4::Regular.nodesPeriodic()`` +.. code-block:: cpp - Returns a list of periodic node-pairs in which the first column contains the independent nodes, and the second column the dependent nodes. + // A matrix with on each row a nodal coordinate: + // [ x , y ] + MatD = GooseFEM::Mesh::Quad4::Regular.coor(); + // A matrix with the connectivity, with on each row to the nodes of each element + MatS = GooseFEM::Mesh::Quad4::Regular.conn(); + + // A list of boundary nodes + ColS = GooseFEM::Mesh::Quad4::Regular.nodesBottom(); + ColS = GooseFEM::Mesh::Quad4::Regular.nodesTop(); + ColS = GooseFEM::Mesh::Quad4::Regular.nodesLeft(); + ColS = GooseFEM::Mesh::Quad4::Regular.nodesRight(); + + // A matrix with periodic node pairs on each row: + // [ independent nodes, dependent nodes ] + MatS = GooseFEM::Mesh::Quad4::Regular.nodesPeriodic(); + + // The node at the origin + size_t = GooseFEM::Mesh::Quad4::Regular.nodeOrigin(); + + // A matrix with DOF-numbers: two per node in sequential order + MatS = GooseFEM::Mesh::Quad4::Regular.dofs(); + + // A matrix with DOF-numbers: two per node in sequential order + // All the periodic repetitions are eliminated from the system + MatS = GooseFEM::Mesh::Quad4::Regular.dofsPeriodic(); ``GooseFEM::Mesh::Quad4::FineLayer`` ==================================== Regular mesh with a fine layer of quadrilateral elements, and coarser elements above and below. .. image:: figures/MeshQuad4/FineLayer/example.svg :width: 500px :align: center .. note:: The coarsening depends strongly on the desired number of elements in horizontal elements. The becomes clear from the following example: - .. code-block:: python + .. code-block:: cpp - mesh = gf.Mesh.Quad4.FineLayer(6*9 ,51) # left image : 546 elements - mesh = gf.Mesh.Quad4.FineLayer(6*9+3,51) # middle image : 703 elements - mesh = gf.Mesh.Quad4.FineLayer(6*9+1,51) # right image : 2915 elements + mesh = GooseFEM::Mesh::Quad4::FineLayer(6*9 ,51); // left image : 546 elements + mesh = GooseFEM::Mesh::Quad4::FineLayer(6*9+3,51); // middle image : 703 elements + mesh = GooseFEM::Mesh::Quad4::FineLayer(6*9+1,51); // right image : 2915 elements .. image:: figures/MeshQuad4/FineLayer/behavior.svg :width: 1000px :align: center Methods: -* ``MatS = GooseFEM::Mesh::Quad4::Regular.nodesPeriodic()`` +.. code-block:: cpp + + // A matrix with on each row a nodal coordinate: + // [ x , y ] + MatD = GooseFEM::Mesh::Quad4::Regular.coor(); + + // A matrix with the connectivity, with on each row to the nodes of each element + MatS = GooseFEM::Mesh::Quad4::Regular.conn(); + + // A list of boundary nodes + ColS = GooseFEM::Mesh::Quad4::Regular.nodesBottom(); + ColS = GooseFEM::Mesh::Quad4::Regular.nodesTop(); + ColS = GooseFEM::Mesh::Quad4::Regular.nodesLeft(); + ColS = GooseFEM::Mesh::Quad4::Regular.nodesRight(); + + // A matrix with periodic node pairs on each row: + // [ independent nodes, dependent nodes ] + MatS = GooseFEM::Mesh::Quad4::Regular.nodesPeriodic(); + + // The node at the origin + size_t = GooseFEM::Mesh::Quad4::Regular.nodeOrigin(); - Returns a list of periodic node-pairs in which the first column contains the independent nodes, and the second column the dependent nodes. + // A matrix with DOF-numbers: two per node in sequential order + MatS = GooseFEM::Mesh::Quad4::Regular.dofs(); -* ``ColS = GooseFEM::Mesh::Quad4::Regular.elementsFine()`` + // A matrix with DOF-numbers: two per node in sequential order + // All the periodic repetitions are eliminated from the system + MatS = GooseFEM::Mesh::Quad4::Regular.dofsPeriodic(); - Returns a list with the element numbers of the fine elements in the center of the mesh (highlighted in the plot below). + // A list with the element numbers of the fine elements in the center of the mesh + // (highlighted in the plot below) + ColS = GooseFEM::Mesh::Quad4::FineLayer.elementsFine(); .. image:: figures/MeshQuad4/FineLayer/example_elementsFine.svg :width: 500px :align: center diff --git a/docs/MeshTri3.rst b/docs/MeshTri3.rst index cd189f9..3e4cc99 100644 --- a/docs/MeshTri3.rst +++ b/docs/MeshTri3.rst @@ -1,13 +1,13 @@ -********************** -<GooseFEM/MeshTri3.h> -********************** +******************** +GooseFEM::Mesh::Tri3 +******************** -``GooseFEM::Mesh::Tri3::Regular`` -================================= +.. note:: -Regular mesh of linear triangles in two-dimensions. Methods: + Source: -* ``MatS = GooseFEM::Mesh::Tri3::Regular.nodesPeriodic()`` + .. code-block:: cpp + + #include <GooseFEM/MeshTri3.h> - Returns a list of periodic node-pairs in which the first column contains the independent nodes, and the second column the dependent nodes. diff --git a/docs/compile.rst b/docs/compile.rst index 042ec0c..e4e75c6 100644 --- a/docs/compile.rst +++ b/docs/compile.rst @@ -1,131 +1,131 @@ .. _compile: ********* Compiling ********* Introduction ============ This module is header only. So one just has to ``#include <GooseFEM/GooseFEM.h>``. somewhere in the source code, and to tell the compiler where the header-files are. For the latter, several ways are described below. -Before proceeding, a words about optimization. Of course one should use optimization when compiling the release of the code (``-O2`` or ``-O3``). But it is also a good idea to switch of the assertions in the code (mostly checks on size) that facilitate easy debugging, but do cost time. Therefore, include the flag ``-DNDEBUG``. Note that this is all C++ standard. I.e. it should be no surprise, and it always a good idea to do. +Before proceeding, a words about optimization. Of course one should use optimization when compiling the release of the code (``-O2`` or ``-O3``). But it is also a good idea to switch off the assertions in the code (mostly checks on size) that facilitate easy debugging, but do cost time. Therefore, include the flag ``-DNDEBUG``. Note that this is all C++ standard. I.e. it should be no surprise, and it always a good idea to do. .. note:: This code depends on `eigen3 <https://github.com/RLovelett/eigen>`_ and `cppmat <https://github.com/tdegeus/cppmat>`_. Both are also header-only libraries. Both can be 'installed' using identical steps as described below. Manual compiler flags ===================== GNU / Clang ----------- Add the following compiler's arguments: .. code-block:: bash -I${PATH_TO_GOOSEFEM}/src -std=c++14 .. note:: **(Not recommended)** If you want to avoid separately including the header files using a compiler flag, ``git submodule`` is a nice way to go: 1. Include this module as a submodule using ``git submodule add https://github.com/tdegeus/GooseFEM.git``. 2. Replace the first line of this example by ``#include "GooseFEM/src/GooseFEM/GooseFEM.h"``. *If you decide to manually copy the header file, you might need to modify this relative path to your liking.* Or see :ref:`compile_automatic`. You can also combine the ``git submodule`` with any of the below compiling strategies. .. _compile_automatic: (Semi-)Automatic compiler flags =============================== Install ------- To enable (semi-)automatic build, one should 'install' ``GooseFEM`` somewhere. Install system-wide (root) ^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Proceed to a (temporary) build directory. For example .. code-block:: bash $ cd /path/to/GooseFEM/src/build 2. 'Build' ``GooseFEM`` .. code-block:: bash $ cmake .. $ make install (If you've used another build directory, change the first command to ``$ cmake /path/to/GooseFEM/src``) Install in custom location (user) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Proceed to a (temporary) build directory. For example .. code-block:: bash $ cd /path/to/GooseFEM/src/build -2. 'Build' ``GooseFEM``, to install it in a custom location +2. 'Build' ``GooseFEM`` to install it in a custom location .. code-block:: bash $ mkdir /custom/install/path $ cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/custom/install/path $ make install (If you've used another build directory, change the first command to ``$ cmake /path/to/GooseFEM/src``) 3. Add the following path to your ``~/.bashrc`` (or ``~/.zshrc``): .. code-block:: bash export PKG_CONFIG_PATH=/custom/install/path/share/pkgconfig:$PKG_CONFIG_PATH .. note:: **(Not recommended)** If you do not wish to use ``CMake`` for the installation, or you want to do something custom. You can of course. Follow these steps: 1. Copy the file ``src/GooseFEM.pc.in`` to ``GooseFEM.pc`` to some location that can be found by ``pkg_config`` (for example by adding ``export PKG_CONFIG_PATH=/path/to/GooseFEM.pc:$PKG_CONFIG_PATH`` to the ``.bashrc``). 2. Modify the line ``prefix=@CMAKE_INSTALL_PREFIX@`` to ``prefix=/path/to/GooseFEM``. 3. Modify the line ``Cflags: -I${prefix}/@INCLUDE_INSTALL_DIR@`` to ``Cflags: -I${prefix}/src``. 4. Modify the line ``Version: @GOOSEFEM_VERSION_NUMBER@`` to reflect the correct release version. Compiler arguments from 'pkg-config' ------------------------------------ Instead of ``-I...`` one can now use .. code-block:: bash `pkg-config --cflags GooseFEM` -std=c++14 as compiler argument. Compiler arguments from 'cmake' ------------------------------- Add the following to your ``CMakeLists.txt``: .. code-block:: cmake set(CMAKE_CXX_STANDARD 14) find_package(PkgConfig) pkg_check_modules(GOOSEFEM REQUIRED GooseFEM) include_directories(${GOOSEFEM_INCLUDE_DIRS}) diff --git a/docs/examples/DynamicsDiagonalPeriodic/laminate/no_damping/Verlet/main.cpp b/docs/examples/DynamicsDiagonalPeriodic/laminate/no_damping/Verlet/main.cpp index 133f187..55c6252 100644 --- a/docs/examples/DynamicsDiagonalPeriodic/laminate/no_damping/Verlet/main.cpp +++ b/docs/examples/DynamicsDiagonalPeriodic/laminate/no_damping/Verlet/main.cpp @@ -1,161 +1,159 @@ #include <HDF5pp.h> #include <Eigen/Eigen> #include <cppmat/cppmat.h> #include <GooseFEM/GooseFEM.h> #include <GooseMaterial/AmorphousSolid/LinearStrain/Elastic/Cartesian2d.h> // ------------------------------------------------------------------------------------------------- using MatS = GooseFEM::MatS; using MatD = GooseFEM::MatD; using ColD = GooseFEM::ColD; -using vec = cppmat::cartesian2d::vector <double>; using T2 = cppmat::cartesian2d::tensor2 <double>; using T2s = cppmat::cartesian2d::tensor2s<double>; -using T2d = cppmat::cartesian2d::tensor2d<double>; namespace GM = GooseMaterial::AmorphousSolid::LinearStrain::Elastic::Cartesian2d; // ================================================================================================= class Quadrature { public: T2s eps, epsdot, sig; size_t nhard; GM::Material hard, soft; double Ebar, Vbar; Quadrature(size_t nhard); double density (size_t elem, size_t k, double V); void stressStrain (size_t elem, size_t k, double V); void stressStrainRate (size_t elem, size_t k, double V); void stressStrainPost (size_t elem, size_t k, double V); void stressStrainRatePost(size_t elem, size_t k, double V); }; // ------------------------------------------------------------------------------------------------- Quadrature::Quadrature(size_t _nhard) { nhard = _nhard; hard = GM::Material(100.,10.); soft = GM::Material(100., 1.); } // ------------------------------------------------------------------------------------------------- double Quadrature::density(size_t elem, size_t k, double V) { return 1.0; } // ------------------------------------------------------------------------------------------------- void Quadrature::stressStrain(size_t elem, size_t k, double V) { if ( elem < nhard ) sig = hard.stress(eps); else sig = soft.stress(eps); } // ------------------------------------------------------------------------------------------------- void Quadrature::stressStrainRate(size_t elem, size_t k, double V) { } // ------------------------------------------------------------------------------------------------- void Quadrature::stressStrainPost(size_t elem, size_t k, double V) { Vbar += V; if ( elem < nhard ) Ebar += hard.energy(eps) * V; else Ebar += soft.energy(eps) * V; } // ------------------------------------------------------------------------------------------------- void Quadrature::stressStrainRatePost(size_t elem, size_t k, double V) { } // ================================================================================================= int main() { // set simulation parameters double T = 20. ; // total time double dt = 1.e-2; // time increment size_t nx = 40 ; // number of elements in both directions double gamma = .05 ; // displacement step // class which provides the mesh GooseFEM::Mesh::Quad4::Regular mesh(nx,nx,1.); // reference node size_t nodeOrigin = mesh.nodeOrigin(); // class which provides the constitutive response at each quadrature point auto quadrature = std::make_shared<Quadrature>(nx*nx/4); // class which provides the response of each element using Elem = GooseFEM::Dynamics::Diagonal::LinearStrain::Quad4<Quadrature>; auto elem = std::make_shared<Elem>(quadrature); // class which provides the system and an increment GooseFEM::Dynamics::Diagonal::Periodic<Elem> sim( elem, mesh.coor(), mesh.conn(), mesh.dofsPeriodic(), dt, 0.0 ); // define update in macroscopic deformation gradient T2 dFbar(0.); dFbar(0,1) = gamma; // update the displacement according to the macroscopic deformation gradient update for ( size_t i = 0 ; i < sim.nnode ; ++i ) for ( size_t j = 0 ; j < sim.ndim ; ++j ) for ( size_t k = 0 ; k < sim.ndim ; ++k ) sim.u(i,j) += dFbar(j,k) * ( sim.x0(i,k) - sim.x0(nodeOrigin,k) ); // output variables ColD Epot(static_cast<int>(T/dt)); Epot.setZero(); // potential energy ColD Ekin(static_cast<int>(T/dt)); Ekin.setZero(); ColD t (static_cast<int>(T/dt)); t .setZero(); // loop over increments for ( size_t inc = 0 ; inc < static_cast<size_t>(Epot.size()) ; ++inc ) { // - compute increment sim.Verlet(); // - post: energy based on nodes // -- store time t(inc) = sim.t; // -- kinetic energy for ( size_t i = 0 ; i < sim.ndof ; ++i ) Ekin(inc) += .5 / sim.Minv(i) * std::pow( sim.V(i) , 2. ); // -- potential energy quadrature->Ebar = 0.0; quadrature->Vbar = 0.0; sim.post(); Epot(inc) = quadrature->Ebar; } // write to output file H5p::File f = H5p::File("example.hdf5"); f.write("/global/Epot",Epot ); f.write("/global/Ekin",Ekin ); f.write("/global/t" ,t ); f.write("/mesh/coor" ,mesh.coor()); f.write("/mesh/conn" ,mesh.conn()); f.write("/mesh/disp" ,sim.u ); return 0; } diff --git a/docs/figures/Mesh/renumber.cpp b/docs/figures/Mesh/renumber.cpp new file mode 100644 index 0000000..dfb8a7b --- /dev/null +++ b/docs/figures/Mesh/renumber.cpp @@ -0,0 +1,56 @@ +#include <GooseFEM/GooseFEM.h> + +using ColS = GooseFEM::ColS; +using MatS = GooseFEM::MatS; + +int main() +{ + // mesh definition + GooseFEM::Mesh::Quad4::Regular mesh = GooseFEM::Mesh::Quad4::Regular(2,2); + + // extract information + size_t ndim = mesh.ndim (); + ColS top = mesh.nodesTop (); + ColS bottom = mesh.nodesBottom(); + ColS left = mesh.nodesLeft (); + ColS right = mesh.nodesRight (); + size_t nleft = static_cast<size_t>(left.size()); + size_t ntop = static_cast<size_t>(top .size()); + + // default DOF-numbers: sequential numbering per element + MatS dofs = mesh.dofs(); + + std::cout << "dofs = " << std::endl; + std::cout << dofs << std::endl << std::endl; + + // periodicity in horizontal direction : eliminate 'dependent' DOFs + // N.B. the corner nodes are part of the fixed boundaries + for ( size_t i = 1 ; i < nleft-1 ; ++i ) + for ( size_t j = 0 ; j < ndim ; ++j ) + dofs(right(i),j) = dofs(left(i),j); + + // renumber "dofs" to be sequential + dofs = GooseFEM::Mesh::renumber(dofs); + + std::cout << "periodicity :" << std::endl << "dofs = " << std::endl; + std::cout << dofs << std::endl << std::endl; + + // construct list with prescribed DOFs + // - allocate + ColS fixedDofs(2*ntop*ndim); + // - read: bottom + for ( size_t i = 0 ; i < ntop ; ++i ) + for ( size_t j = 0 ; j < ndim ; ++j ) + fixedDofs(i*ndim+j) = dofs(bottom(i),j); + // - read: top + for ( size_t i = 0 ; i < ntop ; ++i ) + for ( size_t j = 0 ; j < ndim ; ++j ) + fixedDofs(i*ndim+j+ntop*ndim) = dofs(top(i),j); + + // renumber "dofs" to have the "fixedDofs" at the end + dofs = GooseFEM::Mesh::renumber(dofs,fixedDofs); + + std::cout << "fixedDofs to end :" << std::endl << "dofs = " << std::endl; + std::cout << dofs << std::endl << std::endl; + +} diff --git a/docs/figures/MeshQuad4/Regular/example.py b/docs/figures/MeshQuad4/Regular/example.py new file mode 100644 index 0000000..1f36bfd --- /dev/null +++ b/docs/figures/MeshQuad4/Regular/example.py @@ -0,0 +1,33 @@ + +import GooseFEM as gf +import matplotlib.pyplot as plt +import goosempl as gplt +import numpy as np + +plt.style.use(['goose']) + +# -------------------------------------------------------------------------------------------------- + +mesh = gf.Mesh.Quad4.Regular(21,11) +coor = mesh.coor() +conn = mesh.conn() +cindex = np.arange(conn.shape[0]) + +# -------------------------------------------------------------------------------------------------- + +fig,ax = plt.subplots(figsize=(10,10)) + +im = gplt.patch(coor=coor,conn=conn,cindex=cindex,cmap='jet') + +ax.plot(coor[: ,0],coor[: ,1],marker='o',linestyle='none') +ax.plot(coor[mesh.nodesLeft (),0],coor[mesh.nodesLeft (),1],marker='o',linestyle='none',color='g') +ax.plot(coor[mesh.nodesRight (),0],coor[mesh.nodesRight (),1],marker='o',linestyle='none',color='b') +ax.plot(coor[mesh.nodesBottom(),0],coor[mesh.nodesBottom(),1],marker='o',linestyle='none',color='r') +ax.plot(coor[mesh.nodesTop (),0],coor[mesh.nodesTop (),1],marker='o',linestyle='none',color='y') + +ax.set_aspect('equal') +ax.get_xaxis().set_visible(False) +ax.get_yaxis().set_visible(False) + +plt.savefig('example.svg') +plt.show() diff --git a/docs/figures/MeshQuad4/Regular/example.svg b/docs/figures/MeshQuad4/Regular/example.svg new file mode 100644 index 0000000..2c51834 --- /dev/null +++ b/docs/figures/MeshQuad4/Regular/example.svg @@ -0,0 +1,1861 @@ +<?xml version="1.0" encoding="utf-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with matplotlib (http://matplotlib.org/) --> +<svg height="720pt" version="1.1" viewBox="0 0 720 720" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <style type="text/css"> +*{stroke-linecap:butt;stroke-linejoin:round;} + </style> + </defs> + <g id="figure_1"> + <g id="patch_1"> + <path d="M 0 720 +L 720 720 +L 720 0 +L 0 0 +z +" style="fill:none;"/> + </g> + <g id="axes_1"> + <g id="patch_2"> + <path d="M 20.78 537.686667 +L 699.22 537.686667 +L 699.22 182.313333 +L 20.78 182.313333 +z +" style="fill:none;"/> + </g> + <g id="PatchCollection_1"> + <path clip-path="url(#pcd77f0de20)" d="M 77.316667 508.072222 +L 104.238889 508.072222 +L 104.238889 481.15 +L 77.316667 481.15 +z +" style="fill:#000080;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 104.238889 508.072222 +L 131.161111 508.072222 +L 131.161111 481.15 +L 104.238889 481.15 +z +" style="fill:#000084;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 131.161111 508.072222 +L 158.083333 508.072222 +L 158.083333 481.15 +L 131.161111 481.15 +z +" style="fill:#000089;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 158.083333 508.072222 +L 185.005556 508.072222 +L 185.005556 481.15 +L 158.083333 481.15 +z +" style="fill:#00008d;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 185.005556 508.072222 +L 211.927778 508.072222 +L 211.927778 481.15 +L 185.005556 481.15 +z +" style="fill:#000092;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 211.927778 508.072222 +L 238.85 508.072222 +L 238.85 481.15 +L 211.927778 481.15 +z +" style="fill:#000096;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 238.85 508.072222 +L 265.772222 508.072222 +L 265.772222 481.15 +L 238.85 481.15 +z +" style="fill:#00009b;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 265.772222 508.072222 +L 292.694444 508.072222 +L 292.694444 481.15 +L 265.772222 481.15 +z +" style="fill:#00009f;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 292.694444 508.072222 +L 319.616667 508.072222 +L 319.616667 481.15 +L 292.694444 481.15 +z +" style="fill:#0000a4;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 319.616667 508.072222 +L 346.538889 508.072222 +L 346.538889 481.15 +L 319.616667 481.15 +z +" style="fill:#0000ad;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 346.538889 508.072222 +L 373.461111 508.072222 +L 373.461111 481.15 +L 346.538889 481.15 +z +" style="fill:#0000b2;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 373.461111 508.072222 +L 400.383333 508.072222 +L 400.383333 481.15 +L 373.461111 481.15 +z +" style="fill:#0000b6;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 400.383333 508.072222 +L 427.305556 508.072222 +L 427.305556 481.15 +L 400.383333 481.15 +z +" style="fill:#0000bb;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 427.305556 508.072222 +L 454.227778 508.072222 +L 454.227778 481.15 +L 427.305556 481.15 +z +" style="fill:#0000bf;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 454.227778 508.072222 +L 481.15 508.072222 +L 481.15 481.15 +L 454.227778 481.15 +z +" style="fill:#0000c4;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 481.15 508.072222 +L 508.072222 508.072222 +L 508.072222 481.15 +L 481.15 481.15 +z +" style="fill:#0000c8;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 508.072222 508.072222 +L 534.994444 508.072222 +L 534.994444 481.15 +L 508.072222 481.15 +z +" style="fill:#0000cd;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 534.994444 508.072222 +L 561.916667 508.072222 +L 561.916667 481.15 +L 534.994444 481.15 +z +" style="fill:#0000d1;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 561.916667 508.072222 +L 588.838889 508.072222 +L 588.838889 481.15 +L 561.916667 481.15 +z +" style="fill:#0000da;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 588.838889 508.072222 +L 615.761111 508.072222 +L 615.761111 481.15 +L 588.838889 481.15 +z +" style="fill:#0000df;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 615.761111 508.072222 +L 642.683333 508.072222 +L 642.683333 481.15 +L 615.761111 481.15 +z +" style="fill:#0000e3;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 77.316667 481.15 +L 104.238889 481.15 +L 104.238889 454.227778 +L 77.316667 454.227778 +z +" style="fill:#0000e8;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 104.238889 481.15 +L 131.161111 481.15 +L 131.161111 454.227778 +L 104.238889 454.227778 +z +" style="fill:#0000ed;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 131.161111 481.15 +L 158.083333 481.15 +L 158.083333 454.227778 +L 131.161111 454.227778 +z +" style="fill:#0000f1;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 158.083333 481.15 +L 185.005556 481.15 +L 185.005556 454.227778 +L 158.083333 454.227778 +z +" style="fill:#0000f6;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 185.005556 481.15 +L 211.927778 481.15 +L 211.927778 454.227778 +L 185.005556 454.227778 +z +" style="fill:#0000fa;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 211.927778 481.15 +L 238.85 481.15 +L 238.85 454.227778 +L 211.927778 454.227778 +z +" style="fill:#0000ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 238.85 481.15 +L 265.772222 481.15 +L 265.772222 454.227778 +L 238.85 454.227778 +z +" style="fill:#0000ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 265.772222 481.15 +L 292.694444 481.15 +L 292.694444 454.227778 +L 265.772222 454.227778 +z +" style="fill:#0000ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 292.694444 481.15 +L 319.616667 481.15 +L 319.616667 454.227778 +L 292.694444 454.227778 +z +" style="fill:#0000ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 319.616667 481.15 +L 346.538889 481.15 +L 346.538889 454.227778 +L 319.616667 454.227778 +z +" style="fill:#0004ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 346.538889 481.15 +L 373.461111 481.15 +L 373.461111 454.227778 +L 346.538889 454.227778 +z +" style="fill:#0008ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 373.461111 481.15 +L 400.383333 481.15 +L 400.383333 454.227778 +L 373.461111 454.227778 +z +" style="fill:#000cff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 400.383333 481.15 +L 427.305556 481.15 +L 427.305556 454.227778 +L 400.383333 454.227778 +z +" style="fill:#0010ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 427.305556 481.15 +L 454.227778 481.15 +L 454.227778 454.227778 +L 427.305556 454.227778 +z +" style="fill:#0014ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 454.227778 481.15 +L 481.15 481.15 +L 481.15 454.227778 +L 454.227778 454.227778 +z +" style="fill:#0018ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 481.15 481.15 +L 508.072222 481.15 +L 508.072222 454.227778 +L 481.15 454.227778 +z +" style="fill:#0020ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 508.072222 481.15 +L 534.994444 481.15 +L 534.994444 454.227778 +L 508.072222 454.227778 +z +" style="fill:#0024ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 534.994444 481.15 +L 561.916667 481.15 +L 561.916667 454.227778 +L 534.994444 454.227778 +z +" style="fill:#0028ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 561.916667 481.15 +L 588.838889 481.15 +L 588.838889 454.227778 +L 561.916667 454.227778 +z +" style="fill:#002cff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 588.838889 481.15 +L 615.761111 481.15 +L 615.761111 454.227778 +L 588.838889 454.227778 +z +" style="fill:#0030ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 615.761111 481.15 +L 642.683333 481.15 +L 642.683333 454.227778 +L 615.761111 454.227778 +z +" style="fill:#0034ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 77.316667 454.227778 +L 104.238889 454.227778 +L 104.238889 427.305556 +L 77.316667 427.305556 +z +" style="fill:#0038ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 104.238889 454.227778 +L 131.161111 454.227778 +L 131.161111 427.305556 +L 104.238889 427.305556 +z +" style="fill:#003cff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 131.161111 454.227778 +L 158.083333 454.227778 +L 158.083333 427.305556 +L 131.161111 427.305556 +z +" style="fill:#0040ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 158.083333 454.227778 +L 185.005556 454.227778 +L 185.005556 427.305556 +L 158.083333 427.305556 +z +" style="fill:#0048ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 185.005556 454.227778 +L 211.927778 454.227778 +L 211.927778 427.305556 +L 185.005556 427.305556 +z +" style="fill:#004cff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 211.927778 454.227778 +L 238.85 454.227778 +L 238.85 427.305556 +L 211.927778 427.305556 +z +" style="fill:#0050ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 238.85 454.227778 +L 265.772222 454.227778 +L 265.772222 427.305556 +L 238.85 427.305556 +z +" style="fill:#0054ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 265.772222 454.227778 +L 292.694444 454.227778 +L 292.694444 427.305556 +L 265.772222 427.305556 +z +" style="fill:#0058ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 292.694444 454.227778 +L 319.616667 454.227778 +L 319.616667 427.305556 +L 292.694444 427.305556 +z +" style="fill:#005cff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 319.616667 454.227778 +L 346.538889 454.227778 +L 346.538889 427.305556 +L 319.616667 427.305556 +z +" style="fill:#0060ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 346.538889 454.227778 +L 373.461111 454.227778 +L 373.461111 427.305556 +L 346.538889 427.305556 +z +" style="fill:#0064ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 373.461111 454.227778 +L 400.383333 454.227778 +L 400.383333 427.305556 +L 373.461111 427.305556 +z +" style="fill:#0068ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 400.383333 454.227778 +L 427.305556 454.227778 +L 427.305556 427.305556 +L 400.383333 427.305556 +z +" style="fill:#0070ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 427.305556 454.227778 +L 454.227778 454.227778 +L 454.227778 427.305556 +L 427.305556 427.305556 +z +" style="fill:#0074ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 454.227778 454.227778 +L 481.15 454.227778 +L 481.15 427.305556 +L 454.227778 427.305556 +z +" style="fill:#0078ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 481.15 454.227778 +L 508.072222 454.227778 +L 508.072222 427.305556 +L 481.15 427.305556 +z +" style="fill:#007cff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 508.072222 454.227778 +L 534.994444 454.227778 +L 534.994444 427.305556 +L 508.072222 427.305556 +z +" style="fill:#0080ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 534.994444 454.227778 +L 561.916667 454.227778 +L 561.916667 427.305556 +L 534.994444 427.305556 +z +" style="fill:#0084ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 561.916667 454.227778 +L 588.838889 454.227778 +L 588.838889 427.305556 +L 561.916667 427.305556 +z +" style="fill:#0088ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 588.838889 454.227778 +L 615.761111 454.227778 +L 615.761111 427.305556 +L 588.838889 427.305556 +z +" style="fill:#008cff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 615.761111 454.227778 +L 642.683333 454.227778 +L 642.683333 427.305556 +L 615.761111 427.305556 +z +" style="fill:#0094ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 77.316667 427.305556 +L 104.238889 427.305556 +L 104.238889 400.383333 +L 77.316667 400.383333 +z +" style="fill:#0098ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 104.238889 427.305556 +L 131.161111 427.305556 +L 131.161111 400.383333 +L 104.238889 400.383333 +z +" style="fill:#009cff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 131.161111 427.305556 +L 158.083333 427.305556 +L 158.083333 400.383333 +L 131.161111 400.383333 +z +" style="fill:#00a0ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 158.083333 427.305556 +L 185.005556 427.305556 +L 185.005556 400.383333 +L 158.083333 400.383333 +z +" style="fill:#00a4ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 185.005556 427.305556 +L 211.927778 427.305556 +L 211.927778 400.383333 +L 185.005556 400.383333 +z +" style="fill:#00a8ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 211.927778 427.305556 +L 238.85 427.305556 +L 238.85 400.383333 +L 211.927778 400.383333 +z +" style="fill:#00acff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 238.85 427.305556 +L 265.772222 427.305556 +L 265.772222 400.383333 +L 238.85 400.383333 +z +" style="fill:#00b0ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 265.772222 427.305556 +L 292.694444 427.305556 +L 292.694444 400.383333 +L 265.772222 400.383333 +z +" style="fill:#00b4ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 292.694444 427.305556 +L 319.616667 427.305556 +L 319.616667 400.383333 +L 292.694444 400.383333 +z +" style="fill:#00bcff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 319.616667 427.305556 +L 346.538889 427.305556 +L 346.538889 400.383333 +L 319.616667 400.383333 +z +" style="fill:#00c0ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 346.538889 427.305556 +L 373.461111 427.305556 +L 373.461111 400.383333 +L 346.538889 400.383333 +z +" style="fill:#00c4ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 373.461111 427.305556 +L 400.383333 427.305556 +L 400.383333 400.383333 +L 373.461111 400.383333 +z +" style="fill:#00c8ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 400.383333 427.305556 +L 427.305556 427.305556 +L 427.305556 400.383333 +L 400.383333 400.383333 +z +" style="fill:#00ccff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 427.305556 427.305556 +L 454.227778 427.305556 +L 454.227778 400.383333 +L 427.305556 400.383333 +z +" style="fill:#00d0ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 454.227778 427.305556 +L 481.15 427.305556 +L 481.15 400.383333 +L 454.227778 400.383333 +z +" style="fill:#00d4ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 481.15 427.305556 +L 508.072222 427.305556 +L 508.072222 400.383333 +L 481.15 400.383333 +z +" style="fill:#00d8ff;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 508.072222 427.305556 +L 534.994444 427.305556 +L 534.994444 400.383333 +L 508.072222 400.383333 +z +" style="fill:#00dcfe;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 534.994444 427.305556 +L 561.916667 427.305556 +L 561.916667 400.383333 +L 534.994444 400.383333 +z +" style="fill:#00e4f8;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 561.916667 427.305556 +L 588.838889 427.305556 +L 588.838889 400.383333 +L 561.916667 400.383333 +z +" style="fill:#02e8f4;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 588.838889 427.305556 +L 615.761111 427.305556 +L 615.761111 400.383333 +L 588.838889 400.383333 +z +" style="fill:#06ecf1;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 615.761111 427.305556 +L 642.683333 427.305556 +L 642.683333 400.383333 +L 615.761111 400.383333 +z +" style="fill:#09f0ee;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 77.316667 400.383333 +L 104.238889 400.383333 +L 104.238889 373.461111 +L 77.316667 373.461111 +z +" style="fill:#0cf4eb;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 104.238889 400.383333 +L 131.161111 400.383333 +L 131.161111 373.461111 +L 104.238889 373.461111 +z +" style="fill:#0ff8e7;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 131.161111 400.383333 +L 158.083333 400.383333 +L 158.083333 373.461111 +L 131.161111 373.461111 +z +" style="fill:#13fce4;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 158.083333 400.383333 +L 185.005556 400.383333 +L 185.005556 373.461111 +L 158.083333 373.461111 +z +" style="fill:#16ffe1;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 185.005556 400.383333 +L 211.927778 400.383333 +L 211.927778 373.461111 +L 185.005556 373.461111 +z +" style="fill:#19ffde;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 211.927778 400.383333 +L 238.85 400.383333 +L 238.85 373.461111 +L 211.927778 373.461111 +z +" style="fill:#1fffd7;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 238.85 400.383333 +L 265.772222 400.383333 +L 265.772222 373.461111 +L 238.85 373.461111 +z +" style="fill:#23ffd4;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 265.772222 400.383333 +L 292.694444 400.383333 +L 292.694444 373.461111 +L 265.772222 373.461111 +z +" style="fill:#26ffd1;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 292.694444 400.383333 +L 319.616667 400.383333 +L 319.616667 373.461111 +L 292.694444 373.461111 +z +" style="fill:#29ffce;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 319.616667 400.383333 +L 346.538889 400.383333 +L 346.538889 373.461111 +L 319.616667 373.461111 +z +" style="fill:#2cffca;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 346.538889 400.383333 +L 373.461111 400.383333 +L 373.461111 373.461111 +L 346.538889 373.461111 +z +" style="fill:#30ffc7;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 373.461111 400.383333 +L 400.383333 400.383333 +L 400.383333 373.461111 +L 373.461111 373.461111 +z +" style="fill:#33ffc4;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 400.383333 400.383333 +L 427.305556 400.383333 +L 427.305556 373.461111 +L 400.383333 373.461111 +z +" style="fill:#36ffc1;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 427.305556 400.383333 +L 454.227778 400.383333 +L 454.227778 373.461111 +L 427.305556 373.461111 +z +" style="fill:#39ffbe;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 454.227778 400.383333 +L 481.15 400.383333 +L 481.15 373.461111 +L 454.227778 373.461111 +z +" style="fill:#40ffb7;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 481.15 400.383333 +L 508.072222 400.383333 +L 508.072222 373.461111 +L 481.15 373.461111 +z +" style="fill:#43ffb4;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 508.072222 400.383333 +L 534.994444 400.383333 +L 534.994444 373.461111 +L 508.072222 373.461111 +z +" style="fill:#46ffb1;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 534.994444 400.383333 +L 561.916667 400.383333 +L 561.916667 373.461111 +L 534.994444 373.461111 +z +" style="fill:#49ffad;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 561.916667 400.383333 +L 588.838889 400.383333 +L 588.838889 373.461111 +L 561.916667 373.461111 +z +" style="fill:#4dffaa;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 588.838889 400.383333 +L 615.761111 400.383333 +L 615.761111 373.461111 +L 588.838889 373.461111 +z +" style="fill:#50ffa7;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 615.761111 400.383333 +L 642.683333 400.383333 +L 642.683333 373.461111 +L 615.761111 373.461111 +z +" style="fill:#53ffa4;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 77.316667 373.461111 +L 104.238889 373.461111 +L 104.238889 346.538889 +L 77.316667 346.538889 +z +" style="fill:#56ffa0;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 104.238889 373.461111 +L 131.161111 373.461111 +L 131.161111 346.538889 +L 104.238889 346.538889 +z +" style="fill:#5aff9d;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 131.161111 373.461111 +L 158.083333 373.461111 +L 158.083333 346.538889 +L 131.161111 346.538889 +z +" style="fill:#60ff97;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 158.083333 373.461111 +L 185.005556 373.461111 +L 185.005556 346.538889 +L 158.083333 346.538889 +z +" style="fill:#63ff94;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 185.005556 373.461111 +L 211.927778 373.461111 +L 211.927778 346.538889 +L 185.005556 346.538889 +z +" style="fill:#66ff90;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 211.927778 373.461111 +L 238.85 373.461111 +L 238.85 346.538889 +L 211.927778 346.538889 +z +" style="fill:#6aff8d;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 238.85 373.461111 +L 265.772222 373.461111 +L 265.772222 346.538889 +L 238.85 346.538889 +z +" style="fill:#6dff8a;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 265.772222 373.461111 +L 292.694444 373.461111 +L 292.694444 346.538889 +L 265.772222 346.538889 +z +" style="fill:#70ff87;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 292.694444 373.461111 +L 319.616667 373.461111 +L 319.616667 346.538889 +L 292.694444 346.538889 +z +" style="fill:#73ff83;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 319.616667 373.461111 +L 346.538889 373.461111 +L 346.538889 346.538889 +L 319.616667 346.538889 +z +" style="fill:#77ff80;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 346.538889 373.461111 +L 373.461111 373.461111 +L 373.461111 346.538889 +L 346.538889 346.538889 +z +" style="fill:#7dff7a;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 373.461111 373.461111 +L 400.383333 373.461111 +L 400.383333 346.538889 +L 373.461111 346.538889 +z +" style="fill:#80ff77;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 400.383333 373.461111 +L 427.305556 373.461111 +L 427.305556 346.538889 +L 400.383333 346.538889 +z +" style="fill:#83ff73;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 427.305556 373.461111 +L 454.227778 373.461111 +L 454.227778 346.538889 +L 427.305556 346.538889 +z +" style="fill:#87ff70;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 454.227778 373.461111 +L 481.15 373.461111 +L 481.15 346.538889 +L 454.227778 346.538889 +z +" style="fill:#8aff6d;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 481.15 373.461111 +L 508.072222 373.461111 +L 508.072222 346.538889 +L 481.15 346.538889 +z +" style="fill:#8dff6a;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 508.072222 373.461111 +L 534.994444 373.461111 +L 534.994444 346.538889 +L 508.072222 346.538889 +z +" style="fill:#90ff66;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 534.994444 373.461111 +L 561.916667 373.461111 +L 561.916667 346.538889 +L 534.994444 346.538889 +z +" style="fill:#94ff63;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 561.916667 373.461111 +L 588.838889 373.461111 +L 588.838889 346.538889 +L 561.916667 346.538889 +z +" style="fill:#97ff60;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 588.838889 373.461111 +L 615.761111 373.461111 +L 615.761111 346.538889 +L 588.838889 346.538889 +z +" style="fill:#9dff5a;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 615.761111 373.461111 +L 642.683333 373.461111 +L 642.683333 346.538889 +L 615.761111 346.538889 +z +" style="fill:#a0ff56;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 77.316667 346.538889 +L 104.238889 346.538889 +L 104.238889 319.616667 +L 77.316667 319.616667 +z +" style="fill:#a4ff53;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 104.238889 346.538889 +L 131.161111 346.538889 +L 131.161111 319.616667 +L 104.238889 319.616667 +z +" style="fill:#a7ff50;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 131.161111 346.538889 +L 158.083333 346.538889 +L 158.083333 319.616667 +L 131.161111 319.616667 +z +" style="fill:#aaff4d;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 158.083333 346.538889 +L 185.005556 346.538889 +L 185.005556 319.616667 +L 158.083333 319.616667 +z +" style="fill:#adff49;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 185.005556 346.538889 +L 211.927778 346.538889 +L 211.927778 319.616667 +L 185.005556 319.616667 +z +" style="fill:#b1ff46;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 211.927778 346.538889 +L 238.85 346.538889 +L 238.85 319.616667 +L 211.927778 319.616667 +z +" style="fill:#b4ff43;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 238.85 346.538889 +L 265.772222 346.538889 +L 265.772222 319.616667 +L 238.85 319.616667 +z +" style="fill:#b7ff40;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 265.772222 346.538889 +L 292.694444 346.538889 +L 292.694444 319.616667 +L 265.772222 319.616667 +z +" style="fill:#beff39;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 292.694444 346.538889 +L 319.616667 346.538889 +L 319.616667 319.616667 +L 292.694444 319.616667 +z +" style="fill:#c1ff36;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 319.616667 346.538889 +L 346.538889 346.538889 +L 346.538889 319.616667 +L 319.616667 319.616667 +z +" style="fill:#c4ff33;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 346.538889 346.538889 +L 373.461111 346.538889 +L 373.461111 319.616667 +L 346.538889 319.616667 +z +" style="fill:#c7ff30;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 373.461111 346.538889 +L 400.383333 346.538889 +L 400.383333 319.616667 +L 373.461111 319.616667 +z +" style="fill:#caff2c;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 400.383333 346.538889 +L 427.305556 346.538889 +L 427.305556 319.616667 +L 400.383333 319.616667 +z +" style="fill:#ceff29;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 427.305556 346.538889 +L 454.227778 346.538889 +L 454.227778 319.616667 +L 427.305556 319.616667 +z +" style="fill:#d1ff26;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 454.227778 346.538889 +L 481.15 346.538889 +L 481.15 319.616667 +L 454.227778 319.616667 +z +" style="fill:#d4ff23;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 481.15 346.538889 +L 508.072222 346.538889 +L 508.072222 319.616667 +L 481.15 319.616667 +z +" style="fill:#d7ff1f;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 508.072222 346.538889 +L 534.994444 346.538889 +L 534.994444 319.616667 +L 508.072222 319.616667 +z +" style="fill:#deff19;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 534.994444 346.538889 +L 561.916667 346.538889 +L 561.916667 319.616667 +L 534.994444 319.616667 +z +" style="fill:#e1ff16;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 561.916667 346.538889 +L 588.838889 346.538889 +L 588.838889 319.616667 +L 561.916667 319.616667 +z +" style="fill:#e4ff13;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 588.838889 346.538889 +L 615.761111 346.538889 +L 615.761111 319.616667 +L 588.838889 319.616667 +z +" style="fill:#e7ff0f;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 615.761111 346.538889 +L 642.683333 346.538889 +L 642.683333 319.616667 +L 615.761111 319.616667 +z +" style="fill:#ebff0c;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 77.316667 319.616667 +L 104.238889 319.616667 +L 104.238889 292.694444 +L 77.316667 292.694444 +z +" style="fill:#eeff09;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 104.238889 319.616667 +L 131.161111 319.616667 +L 131.161111 292.694444 +L 104.238889 292.694444 +z +" style="fill:#f1fc06;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 131.161111 319.616667 +L 158.083333 319.616667 +L 158.083333 292.694444 +L 131.161111 292.694444 +z +" style="fill:#f4f802;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 158.083333 319.616667 +L 185.005556 319.616667 +L 185.005556 292.694444 +L 158.083333 292.694444 +z +" style="fill:#f8f500;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 185.005556 319.616667 +L 211.927778 319.616667 +L 211.927778 292.694444 +L 185.005556 292.694444 +z +" style="fill:#feed00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 211.927778 319.616667 +L 238.85 319.616667 +L 238.85 292.694444 +L 211.927778 292.694444 +z +" style="fill:#ffea00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 238.85 319.616667 +L 265.772222 319.616667 +L 265.772222 292.694444 +L 238.85 292.694444 +z +" style="fill:#ffe600;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 265.772222 319.616667 +L 292.694444 319.616667 +L 292.694444 292.694444 +L 265.772222 292.694444 +z +" style="fill:#ffe200;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 292.694444 319.616667 +L 319.616667 319.616667 +L 319.616667 292.694444 +L 292.694444 292.694444 +z +" style="fill:#ffde00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 319.616667 319.616667 +L 346.538889 319.616667 +L 346.538889 292.694444 +L 319.616667 292.694444 +z +" style="fill:#ffdb00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 346.538889 319.616667 +L 373.461111 319.616667 +L 373.461111 292.694444 +L 346.538889 292.694444 +z +" style="fill:#ffd700;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 373.461111 319.616667 +L 400.383333 319.616667 +L 400.383333 292.694444 +L 373.461111 292.694444 +z +" style="fill:#ffd300;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 400.383333 319.616667 +L 427.305556 319.616667 +L 427.305556 292.694444 +L 400.383333 292.694444 +z +" style="fill:#ffd000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 427.305556 319.616667 +L 454.227778 319.616667 +L 454.227778 292.694444 +L 427.305556 292.694444 +z +" style="fill:#ffc800;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 454.227778 319.616667 +L 481.15 319.616667 +L 481.15 292.694444 +L 454.227778 292.694444 +z +" style="fill:#ffc400;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 481.15 319.616667 +L 508.072222 319.616667 +L 508.072222 292.694444 +L 481.15 292.694444 +z +" style="fill:#ffc100;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 508.072222 319.616667 +L 534.994444 319.616667 +L 534.994444 292.694444 +L 508.072222 292.694444 +z +" style="fill:#ffbd00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 534.994444 319.616667 +L 561.916667 319.616667 +L 561.916667 292.694444 +L 534.994444 292.694444 +z +" style="fill:#ffb900;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 561.916667 319.616667 +L 588.838889 319.616667 +L 588.838889 292.694444 +L 561.916667 292.694444 +z +" style="fill:#ffb600;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 588.838889 319.616667 +L 615.761111 319.616667 +L 615.761111 292.694444 +L 588.838889 292.694444 +z +" style="fill:#ffb200;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 615.761111 319.616667 +L 642.683333 319.616667 +L 642.683333 292.694444 +L 615.761111 292.694444 +z +" style="fill:#ffae00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 77.316667 292.694444 +L 104.238889 292.694444 +L 104.238889 265.772222 +L 77.316667 265.772222 +z +" style="fill:#ffab00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 104.238889 292.694444 +L 131.161111 292.694444 +L 131.161111 265.772222 +L 104.238889 265.772222 +z +" style="fill:#ffa300;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 131.161111 292.694444 +L 158.083333 292.694444 +L 158.083333 265.772222 +L 131.161111 265.772222 +z +" style="fill:#ff9f00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 158.083333 292.694444 +L 185.005556 292.694444 +L 185.005556 265.772222 +L 158.083333 265.772222 +z +" style="fill:#ff9c00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 185.005556 292.694444 +L 211.927778 292.694444 +L 211.927778 265.772222 +L 185.005556 265.772222 +z +" style="fill:#ff9800;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 211.927778 292.694444 +L 238.85 292.694444 +L 238.85 265.772222 +L 211.927778 265.772222 +z +" style="fill:#ff9400;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 238.85 292.694444 +L 265.772222 292.694444 +L 265.772222 265.772222 +L 238.85 265.772222 +z +" style="fill:#ff9100;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 265.772222 292.694444 +L 292.694444 292.694444 +L 292.694444 265.772222 +L 265.772222 265.772222 +z +" style="fill:#ff8d00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 292.694444 292.694444 +L 319.616667 292.694444 +L 319.616667 265.772222 +L 292.694444 265.772222 +z +" style="fill:#ff8900;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 319.616667 292.694444 +L 346.538889 292.694444 +L 346.538889 265.772222 +L 319.616667 265.772222 +z +" style="fill:#ff8200;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 346.538889 292.694444 +L 373.461111 292.694444 +L 373.461111 265.772222 +L 346.538889 265.772222 +z +" style="fill:#ff7e00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 373.461111 292.694444 +L 400.383333 292.694444 +L 400.383333 265.772222 +L 373.461111 265.772222 +z +" style="fill:#ff7a00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 400.383333 292.694444 +L 427.305556 292.694444 +L 427.305556 265.772222 +L 400.383333 265.772222 +z +" style="fill:#ff7700;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 427.305556 292.694444 +L 454.227778 292.694444 +L 454.227778 265.772222 +L 427.305556 265.772222 +z +" style="fill:#ff7300;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 454.227778 292.694444 +L 481.15 292.694444 +L 481.15 265.772222 +L 454.227778 265.772222 +z +" style="fill:#ff6f00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 481.15 292.694444 +L 508.072222 292.694444 +L 508.072222 265.772222 +L 481.15 265.772222 +z +" style="fill:#ff6c00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 508.072222 292.694444 +L 534.994444 292.694444 +L 534.994444 265.772222 +L 508.072222 265.772222 +z +" style="fill:#ff6800;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 534.994444 292.694444 +L 561.916667 292.694444 +L 561.916667 265.772222 +L 534.994444 265.772222 +z +" style="fill:#ff6400;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 561.916667 292.694444 +L 588.838889 292.694444 +L 588.838889 265.772222 +L 561.916667 265.772222 +z +" style="fill:#ff5d00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 588.838889 292.694444 +L 615.761111 292.694444 +L 615.761111 265.772222 +L 588.838889 265.772222 +z +" style="fill:#ff5900;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 615.761111 292.694444 +L 642.683333 292.694444 +L 642.683333 265.772222 +L 615.761111 265.772222 +z +" style="fill:#ff5500;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 77.316667 265.772222 +L 104.238889 265.772222 +L 104.238889 238.85 +L 77.316667 238.85 +z +" style="fill:#ff5200;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 104.238889 265.772222 +L 131.161111 265.772222 +L 131.161111 238.85 +L 104.238889 238.85 +z +" style="fill:#ff4e00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 131.161111 265.772222 +L 158.083333 265.772222 +L 158.083333 238.85 +L 131.161111 238.85 +z +" style="fill:#ff4a00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 158.083333 265.772222 +L 185.005556 265.772222 +L 185.005556 238.85 +L 158.083333 238.85 +z +" style="fill:#ff4700;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 185.005556 265.772222 +L 211.927778 265.772222 +L 211.927778 238.85 +L 185.005556 238.85 +z +" style="fill:#ff4300;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 211.927778 265.772222 +L 238.85 265.772222 +L 238.85 238.85 +L 211.927778 238.85 +z +" style="fill:#ff3f00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 238.85 265.772222 +L 265.772222 265.772222 +L 265.772222 238.85 +L 238.85 238.85 +z +" style="fill:#ff3800;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 265.772222 265.772222 +L 292.694444 265.772222 +L 292.694444 238.85 +L 265.772222 238.85 +z +" style="fill:#ff3400;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 292.694444 265.772222 +L 319.616667 265.772222 +L 319.616667 238.85 +L 292.694444 238.85 +z +" style="fill:#ff3000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 319.616667 265.772222 +L 346.538889 265.772222 +L 346.538889 238.85 +L 319.616667 238.85 +z +" style="fill:#ff2d00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 346.538889 265.772222 +L 373.461111 265.772222 +L 373.461111 238.85 +L 346.538889 238.85 +z +" style="fill:#ff2900;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 373.461111 265.772222 +L 400.383333 265.772222 +L 400.383333 238.85 +L 373.461111 238.85 +z +" style="fill:#ff2500;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 400.383333 265.772222 +L 427.305556 265.772222 +L 427.305556 238.85 +L 400.383333 238.85 +z +" style="fill:#ff2200;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 427.305556 265.772222 +L 454.227778 265.772222 +L 454.227778 238.85 +L 427.305556 238.85 +z +" style="fill:#ff1e00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 454.227778 265.772222 +L 481.15 265.772222 +L 481.15 238.85 +L 454.227778 238.85 +z +" style="fill:#ff1a00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 481.15 265.772222 +L 508.072222 265.772222 +L 508.072222 238.85 +L 481.15 238.85 +z +" style="fill:#ff1300;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 508.072222 265.772222 +L 534.994444 265.772222 +L 534.994444 238.85 +L 508.072222 238.85 +z +" style="fill:#fa0f00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 534.994444 265.772222 +L 561.916667 265.772222 +L 561.916667 238.85 +L 534.994444 238.85 +z +" style="fill:#f60b00;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 561.916667 265.772222 +L 588.838889 265.772222 +L 588.838889 238.85 +L 561.916667 238.85 +z +" style="fill:#f10800;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 588.838889 265.772222 +L 615.761111 265.772222 +L 615.761111 238.85 +L 588.838889 238.85 +z +" style="fill:#ed0400;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 615.761111 265.772222 +L 642.683333 265.772222 +L 642.683333 238.85 +L 615.761111 238.85 +z +" style="fill:#e80000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 77.316667 238.85 +L 104.238889 238.85 +L 104.238889 211.927778 +L 77.316667 211.927778 +z +" style="fill:#e40000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 104.238889 238.85 +L 131.161111 238.85 +L 131.161111 211.927778 +L 104.238889 211.927778 +z +" style="fill:#df0000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 131.161111 238.85 +L 158.083333 238.85 +L 158.083333 211.927778 +L 131.161111 211.927778 +z +" style="fill:#da0000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 158.083333 238.85 +L 185.005556 238.85 +L 185.005556 211.927778 +L 158.083333 211.927778 +z +" style="fill:#d10000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 185.005556 238.85 +L 211.927778 238.85 +L 211.927778 211.927778 +L 185.005556 211.927778 +z +" style="fill:#cd0000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 211.927778 238.85 +L 238.85 238.85 +L 238.85 211.927778 +L 211.927778 211.927778 +z +" style="fill:#c80000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 238.85 238.85 +L 265.772222 238.85 +L 265.772222 211.927778 +L 238.85 211.927778 +z +" style="fill:#c40000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 265.772222 238.85 +L 292.694444 238.85 +L 292.694444 211.927778 +L 265.772222 211.927778 +z +" style="fill:#bf0000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 292.694444 238.85 +L 319.616667 238.85 +L 319.616667 211.927778 +L 292.694444 211.927778 +z +" style="fill:#bb0000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 319.616667 238.85 +L 346.538889 238.85 +L 346.538889 211.927778 +L 319.616667 211.927778 +z +" style="fill:#b60000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 346.538889 238.85 +L 373.461111 238.85 +L 373.461111 211.927778 +L 346.538889 211.927778 +z +" style="fill:#b20000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 373.461111 238.85 +L 400.383333 238.85 +L 400.383333 211.927778 +L 373.461111 211.927778 +z +" style="fill:#ad0000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 400.383333 238.85 +L 427.305556 238.85 +L 427.305556 211.927778 +L 400.383333 211.927778 +z +" style="fill:#a40000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 427.305556 238.85 +L 454.227778 238.85 +L 454.227778 211.927778 +L 427.305556 211.927778 +z +" style="fill:#9f0000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 454.227778 238.85 +L 481.15 238.85 +L 481.15 211.927778 +L 454.227778 211.927778 +z +" style="fill:#9b0000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 481.15 238.85 +L 508.072222 238.85 +L 508.072222 211.927778 +L 481.15 211.927778 +z +" style="fill:#960000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 508.072222 238.85 +L 534.994444 238.85 +L 534.994444 211.927778 +L 508.072222 211.927778 +z +" style="fill:#920000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 534.994444 238.85 +L 561.916667 238.85 +L 561.916667 211.927778 +L 534.994444 211.927778 +z +" style="fill:#8d0000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 561.916667 238.85 +L 588.838889 238.85 +L 588.838889 211.927778 +L 561.916667 211.927778 +z +" style="fill:#890000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 588.838889 238.85 +L 615.761111 238.85 +L 615.761111 211.927778 +L 588.838889 211.927778 +z +" style="fill:#840000;stroke:#000000;"/> + <path clip-path="url(#pcd77f0de20)" d="M 615.761111 238.85 +L 642.683333 238.85 +L 642.683333 211.927778 +L 615.761111 211.927778 +z +" style="fill:#800000;stroke:#000000;"/> + </g> + <g id="line2d_1"> + <defs> + <path d="M 0 3 +C 0.795609 3 1.55874 2.683901 2.12132 2.12132 +C 2.683901 1.55874 3 0.795609 3 0 +C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 +C 1.55874 -2.683901 0.795609 -3 0 -3 +C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 +C -2.683901 -1.55874 -3 -0.795609 -3 0 +C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 +C -1.55874 2.683901 -0.795609 3 0 3 +z +" id="m635e10850f" style="stroke:#000000;"/> + </defs> + <g clip-path="url(#pcd77f0de20)"> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="508.072222"/> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="481.15"/> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="454.227778"/> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="427.305556"/> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="400.383333"/> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="373.461111"/> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="346.538889"/> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="319.616667"/> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="292.694444"/> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="265.772222"/> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="238.85"/> + <use style="stroke:#000000;" x="77.316667" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="104.238889" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="131.161111" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="158.083333" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="185.005556" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="211.927778" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="238.85" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="265.772222" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="292.694444" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="319.616667" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="346.538889" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="373.461111" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="400.383333" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="427.305556" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="454.227778" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="481.15" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="508.072222" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="534.994444" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="561.916667" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="588.838889" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="615.761111" xlink:href="#m635e10850f" y="211.927778"/> + <use style="stroke:#000000;" x="642.683333" xlink:href="#m635e10850f" y="211.927778"/> + </g> + </g> + <g id="line2d_2"> + <defs> + <path d="M 0 3 +C 0.795609 3 1.55874 2.683901 2.12132 2.12132 +C 2.683901 1.55874 3 0.795609 3 0 +C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 +C 1.55874 -2.683901 0.795609 -3 0 -3 +C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 +C -2.683901 -1.55874 -3 -0.795609 -3 0 +C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 +C -1.55874 2.683901 -0.795609 3 0 3 +z +" id="m8a209b9e3f" style="stroke:#008000;"/> + </defs> + <g clip-path="url(#pcd77f0de20)"> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="508.072222"/> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="481.15"/> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="454.227778"/> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="427.305556"/> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="400.383333"/> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="373.461111"/> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="346.538889"/> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="319.616667"/> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="292.694444"/> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="265.772222"/> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="238.85"/> + <use style="fill:#008000;stroke:#008000;" x="77.316667" xlink:href="#m8a209b9e3f" y="211.927778"/> + </g> + </g> + <g id="line2d_3"> + <defs> + <path d="M 0 3 +C 0.795609 3 1.55874 2.683901 2.12132 2.12132 +C 2.683901 1.55874 3 0.795609 3 0 +C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 +C 1.55874 -2.683901 0.795609 -3 0 -3 +C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 +C -2.683901 -1.55874 -3 -0.795609 -3 0 +C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 +C -1.55874 2.683901 -0.795609 3 0 3 +z +" id="m04d8794764" style="stroke:#0000ff;"/> + </defs> + <g clip-path="url(#pcd77f0de20)"> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="508.072222"/> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="481.15"/> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="454.227778"/> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="427.305556"/> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="400.383333"/> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="373.461111"/> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="346.538889"/> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="319.616667"/> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="292.694444"/> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="265.772222"/> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="238.85"/> + <use style="fill:#0000ff;stroke:#0000ff;" x="642.683333" xlink:href="#m04d8794764" y="211.927778"/> + </g> + </g> + <g id="line2d_4"> + <defs> + <path d="M 0 3 +C 0.795609 3 1.55874 2.683901 2.12132 2.12132 +C 2.683901 1.55874 3 0.795609 3 0 +C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 +C 1.55874 -2.683901 0.795609 -3 0 -3 +C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 +C -2.683901 -1.55874 -3 -0.795609 -3 0 +C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 +C -1.55874 2.683901 -0.795609 3 0 3 +z +" id="m650da9de81" style="stroke:#ff0000;"/> + </defs> + <g clip-path="url(#pcd77f0de20)"> + <use style="fill:#ff0000;stroke:#ff0000;" x="77.316667" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="104.238889" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="131.161111" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="158.083333" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="185.005556" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="211.927778" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="238.85" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="265.772222" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="292.694444" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="319.616667" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="346.538889" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="373.461111" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="400.383333" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="427.305556" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="454.227778" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="481.15" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="508.072222" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="534.994444" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="561.916667" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="588.838889" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="615.761111" xlink:href="#m650da9de81" y="508.072222"/> + <use style="fill:#ff0000;stroke:#ff0000;" x="642.683333" xlink:href="#m650da9de81" y="508.072222"/> + </g> + </g> + <g id="line2d_5"> + <defs> + <path d="M 0 3 +C 0.795609 3 1.55874 2.683901 2.12132 2.12132 +C 2.683901 1.55874 3 0.795609 3 0 +C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 +C 1.55874 -2.683901 0.795609 -3 0 -3 +C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 +C -2.683901 -1.55874 -3 -0.795609 -3 0 +C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 +C -1.55874 2.683901 -0.795609 3 0 3 +z +" id="m8a276ca432" style="stroke:#bfbf00;"/> + </defs> + <g clip-path="url(#pcd77f0de20)"> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="77.316667" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="104.238889" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="131.161111" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="158.083333" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="185.005556" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="211.927778" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="238.85" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="265.772222" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="292.694444" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="319.616667" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="346.538889" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="373.461111" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="400.383333" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="427.305556" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="454.227778" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="481.15" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="508.072222" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="534.994444" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="561.916667" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="588.838889" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="615.761111" xlink:href="#m8a276ca432" y="211.927778"/> + <use style="fill:#bfbf00;stroke:#bfbf00;" x="642.683333" xlink:href="#m8a276ca432" y="211.927778"/> + </g> + </g> + <g id="patch_3"> + <path d="M 20.78 537.686667 +L 20.78 182.313333 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + <g id="patch_4"> + <path d="M 699.22 537.686667 +L 699.22 182.313333 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + <g id="patch_5"> + <path d="M 20.78 537.686667 +L 699.22 537.686667 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + <g id="patch_6"> + <path d="M 20.78 182.313333 +L 699.22 182.313333 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + </g> + </g> + <defs> + <clipPath id="pcd77f0de20"> + <rect height="355.373333" width="678.44" x="20.78" y="182.313333"/> + </clipPath> + </defs> +</svg> diff --git a/docs/index.rst b/docs/index.rst index 8007449..22a518d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,59 +1,60 @@ ********* GooseFEM ********* Introduction ============ -GooseFEM provides several standard finite element simulations, some common element definitions, and some simple finite element meshes. A basic documentation is provided here, whereby one is highly urged to also look into the code itself, or at minimum the function decelerators and their comments. +GooseFEM provides several standard finite element simulations, some common element definitions, and some simple finite element meshes. A basic documentation is provided here, whereby one is highly urged to look into the code itself, at minimum the function decelerators and their comments. .. note:: This library is free to use under the `GPLv3 license <https://github.com/tdegeus/GooseFEM/blob/master/LICENSE>`_. Any additions are very much appreciated, in terms of suggested functionality, code, documentation, testimonials, word of mouth advertisement, .... Bug reports or feature requests can be filed on `GitHub <http://github.com/tdegeus/GooseFEM>`_. As always, the code comes with no guarantee. None of the developers can be held responsible for possible mistakes. Download: `.zip file <https://github.com/tdegeus/GooseFEM/zipball/master>`_ | `.tar.gz file <https://github.com/tdegeus/GooseFEM/tarball/master>`_. (c - `GPLv3 <https://github.com/tdegeus/GooseFEM/blob/master/LICENSE>`_) T.W.J. de Geus (Tom) | tom@geus.me | `www.geus.me <http://www.geus.me>`_ | `github.com/tdegeus/GooseFEM <http://github.com/tdegeus/GooseFEM>`_ Contents ======== GooseFEM documentation ----------------------- .. toctree:: :maxdepth: 1 compile.rst Mesh.rst MeshTri3.rst MeshQuad4.rst + DynamicsDiagonal.rst develop.rst Theory ------ .. toctree:: :maxdepth: 1 theory/readme.rst Examples -------- .. toctree:: :maxdepth: 1 examples/theory/statics_small-strain_linear_dense/readme.rst examples/theory/statics_small-strain_nonlinear_dense/readme.rst examples/theory/diagonal_mass/readme.rst Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search`