Commit 1fbd2501 authored by oliver.sander_at_tu-dresden.de's avatar oliver.sander_at_tu-dresden.de
Browse files

Merge branch 'import-examples' into 'master'

Merge the dune-tnnmg-examples module into dune-tnnmg

See merge request !18
parents d642d297 f0a83f32
Pipeline #33312 passed with stage
in 15 minutes and 16 seconds
......@@ -17,3 +17,15 @@ dune:git clang C++17:
dune:git gcc-8 C++17:
image: registry.dune-project.org/docker/ci/dune:git-debian-10-gcc-8-17
script: duneci-standard-test
dune:git clang C++17 with examples:
image: registry.dune-project.org/docker/ci/dune:git-debian-10-clang-7-libcpp-17
script:
- duneci-install-module https://gitlab.dune-project.org/pdelab/dune-pdelab.git
- duneci-standard-test
dune:git gcc-8 C++17 with examples:
image: registry.dune-project.org/docker/ci/dune:git-debian-10-gcc-8-17
script:
- duneci-install-module https://gitlab.dune-project.org/pdelab/dune-pdelab.git
- duneci-standard-test
......@@ -13,5 +13,6 @@ dune_project()
add_subdirectory("doc")
add_subdirectory("dune")
add_subdirectory("examples")
finalize_dune_project(GENERATE_CONFIG_H_CMAKE)
add_subdirectory(doxygen)
add_subdirectory(manual)
*.atfi
*.aux
*.bbl
*.blg
*.log
*.out
dune-tnnmg-manual.pdf
dune_add_latex_document(
SOURCE dune-tnnmg-manual.tex
FATHER_TARGET doc
INSTALL ${CMAKE_INSTALL_DOCDIR})
@article{bastian_et_al:dune1:2008,
author = {Bastian, P. and Blatt, M. and Dedner, A. and Engwer, C. and Kl\"ofkorn, R. and Ohlberger, M. and Sander, O.},
title = {A Generic Interface for Adaptive and Parallel Scientific Computing. {P}art {I}: Abstract Framework},
journal = {Computing},
year = {2008},
volume = {82},
number = {2--3},
pages = {103--119}
}
@article{bastian_et_al:dune2:2008,
author = {Bastian, P. and Blatt, M. and Dedner, A. and Engwer, C. and Kl\"ofkorn, R. and Kornhuber, R. and Ohlberger, M. and Sander, O.},
title = {A Generic Interface for Adaptive and Parallel Scientific Computing. {P}art {II}: Implementation and Tests in {DUNE}},
journal = {Computing},
year = {2008},
volume = {82},
number = {2--3},
pages = {121--138}
}
@InProceedings{blatt_bastian:06,
author = {Markus Blatt and Peter Bastian},
title = {The Iterative Solver Template Library},
booktitle = {Applied Parallel Computing. State of the Art in Scientific Computing},
series = {Lecture Notes in Scientific Computing},
volume = {4699},
publisher = {Springer Verlag},
pages = {666--675},
year = {2007}
}
@www{dune-web,
key = {{\sc DUNE}},
title = {{Distributed and Unified Numerics Environment}},
url = {http://dune-project.org/}
}
@www{dune-extensions,
key = {External {\sc DUNE} Modules},
howpublished = {\url{www.dune-project.org/downloadext.html}}
}
@www{dune_solvers,
title = {The dune-solvers module},
howpublished = {\url{https://git.imp.fu-berlin.de/agnumpde/dune-solvers}}
}
@www{dune_pdelab,
title = {The dune-pdelab module},
howpublished = {\url{https://www.dune-project.org/modules/dune-pdelab}}
}
@inproceedings{graeser_sack_sander:tnnmg:2009,
author = {Gr\"aser, C. and Sack, U. and Sander, O.},
title = {Truncated Nonsmooth {N}ewton Multigrid Methods for Convex Minimization Problems},
booktitle = {Domain Decomposition Methods in Science and Engineering XVIII},
editor = {Bercovier, M. and Gander, M. and Kornhuber, R. and Widlund, O.},
series = {LNCSE},
publisher = {Springer},
year = {2009},
pages = {129--136}
}
@article{graeser_kornhuber:multigrid_obstacle:2009,
author = {Gr\"aser, C. and Kornhuber, R.},
title = {Multigrid Methods for Obstacle Problems},
year = {2009},
journal = {J. Comp. Math.},
volume = {27},
number = {1},
pages = {1-44}
}
@Article{graeser_kornhuber_sack:ac_anisotropic:2009,
author = {C. Gr\"aser and R. Kornhuber and U. Sack},
title = {Adaptive Multigrid Methods for Anisotropic {A}llen--{C}ahn Equations with Logarithmic Potential},
journal = {},
pages = {},
volume = {},
number = {},
year = {2009},
note = {in preparation}
}
@book{kornhuber:adapt_mmg_for_nonlin_var_prob:1997,
author = {Kornhuber, R.},
title = {Adaptive Monotone Multigrid Methods for Nonlinear Variational Problems},
year = {1997},
publisher = {Teubner},
address = {Stuttgart},
edition = {1.}
}
@Book{glowinski:1984,
author = "R. Glowinski",
title = "Numerical Methods for Nonlinear Variational Problems",
publisher = {Springer Verlag},
year = {1984},
series = {Series in Computational Physics}
}
@book{ekeland_temam:1976,
author = {Ekeland, I. and Temam, R.},
title = {Convex Analysis},
year = {1976},
publisher = {North-Holland}
}
@Book{kikuchi_oden:1988,
author = {N. Kikuchi and J. Oden},
title = {Contact Problems in Elasticity},
publisher = {SIAM},
year = {1988}
}
@Book{Braess:1997,
author = {Dietrich Braess},
title = {Finite Elemente},
publisher = {Springer},
year = {1997},
edition = {2nd},
}
@article{bastian_et_al:1997,
AUTHOR = "P. Bastian and K. Birken and K. Johannsen and S. Lang and
N. N{eu\ss } and H. Rent{z--Reicher}t and C. Wieners",
TITLE = "{UG} -- a flexible Software toolbox for solving
partial differential equations",
JOURNAL = CVS,
YEAR = "1997",
VOLUME = "1",
PAGES = "27--40"
}
@mastersthesis{Hardering2010_diplom,
author = {Hardering, H.},
title = {Analysis and Numerical Approximation of Capillary Surfaces},
type = {Diplomarbeit},
school = {Freie Universit\"at Berlin},
year = {2010}
}
@phdthesis{Sander2008_phd,
author = {Sander, O.},
title = {Multidimensional Coupling in a Human Knee Model},
year = {2008},
school = {Freie Universit\"at Berlin}
}
@inproceedings{GraeserSackSander2009,
author = {Gr{\"a}ser, C. and Sack, U. and Sander, O.},
title = {Truncated Nonsmooth {N}ewton Multigrid Methods for Convex Minimization Problems},
booktitle = {Domain Decomposition Methods in Science and Engineering XVIII},
editor = {Bercovier, M. and Gander, M. and Kornhuber, R. and Widlund, O.},
series = {LNCSE},
volume = {70},
publisher = {Springer},
year = {2009},
pages = {129--136}
}
@article{GraeserKornhuberSack2011,
author = {Gr{\"a}ser, C. and Kornhuber, R. and Sack, U.},
title = {Time discretizations of anisotropic {A}llen--{C}ahn equations},
year = {2013},
journal = {IMA J. Numer. Anal.},
volume = {33},
number = {4},
pages = {1226--1244},
doi = {10.1093/imanum/drs043}
}
This diff is collapsed.
#include <config.h>
#define DIMENSION 2
#define ALUGRID 1
//#define UGGRID 1
#define EMBEDDED_PYTHON 1
#undef EMBEDDED_PYTHON
#define FE_VERBOSE
// disable embedded python if python was not found
#ifndef HAVE_PYTHON
#undef EMBEDDED_PYTHON
#endif
#if EMBEDDED_PYTHON
#include <Python.h>
#endif
#include <fstream>
#include <iostream>
#include <iostream>
#include <vector>
#include <tr1/memory>
// dune includes ******************************************************
#ifdef UGGRID
#include <dune/grid/uggrid.hh>
#include <dune/grid/io/file/dgfparser/dgfug.hh>
#endif
#ifdef ALUGRID
#include <dune/grid/alugrid.hh>
#include <dune/grid/io/file/dgfparser/dgfalu.hh>
#endif
#include <dune/common/configparser.hh>
#include <dune/common/shared_ptr.hh>
#include <dune/istl/bcrsmatrix.hh>
#include <dune/grid/common/genericreferenceelements.hh>
// dune-fufem includes ******************************************************
#include <dune/fufem/boundarypatch.hh>
#include <dune/fufem/prolongboundarypatch.hh>
#if EMBEDDED_PYTHON
#include <dune/fufem/functions/pythonfunction.hh>
#endif
#include <dune/fufem/functions/functions.hh>
#include <dune/fufem/functions/basisgridfunction.hh>
#include <dune/fufem/functionspacebases/p1nodalbasis.hh>
#include <dune/fufem/functiontools/namedfunctionmap.hh>
#include <dune/fufem/functiontools/boundarydofs.hh>
#include <dune/fufem/assemblers/operatorassembler.hh>
#include <dune/fufem/assemblers/functionalassembler.hh>
#include <dune/fufem/assemblers/transferoperatorassembler.hh>
#include <dune/fufem/assemblers/localassemblers/laplaceassembler.hh>
#include <dune/fufem/assemblers/localassemblers/massassembler.hh>
#include <dune/fufem/assemblers/localassemblers/lumpedmassassembler.hh>
#include <dune/fufem/assemblers/localassemblers/l2functionalassembler.hh>
#if HAVE_AMIRAMESH
#include <dune/fufem/functiontools/amirameshbasiswriter.hh>
#endif
#include <dune/fufem/functiontools/vtkbasiswriter.hh>
// dune-solvers includes ***************************************************
#include <dune/solvers/norms/norm.hh>
#include <dune/solvers/norms/sumnorm.hh>
#include <dune/solvers/norms/energynorm.hh>
#include <dune/solvers/norms/diagnorm.hh>
#include <dune/solvers/norms/fullnorm.hh>
#include <dune/solvers/norms/blocknorm.hh>
// dune-tnnmg includes *******************************************************
#include <dune/tnnmg/problem-classes/blocknonlineargsproblem.hh>
#include <dune/tnnmg/problem-classes/nonlinearity.hh>
#include <dune/tnnmg/nonlinearities/zerononlinearity.hh>
#include <dune/tnnmg/nonlinearities/shiftednonlinearity.hh>
#include <dune/tnnmg/iterationsteps/genericnonlinearjacobi.hh>
#include <dune/tnnmg/solvers/scalartnnmg.hh>
#include "laplace.hh"
template <int dim, int N>
class ConstantFunction :
public Dune::FunctionBase<double,double,dim,N>
{
public:
ConstantFunction(double c):
c_(c)
{}
double eval(int comp, const Dune::FieldVector<double,dim>& x) const
{
return c_;
}
void evalall(const Dune::FieldVector<double,dim>& x, Dune::FieldVector<double,N>& y) const
{
y = eval(0,x);
}
double c_;
};
template <int dim, int N>
class AbsFunction :
public Dune::FunctionBase<double,double,dim,N>
{
public:
AbsFunction()
{}
double eval(int comp, const Dune::FieldVector<double,dim>& x) const
{
return fabs(x[0]);
}
void evalall(const Dune::FieldVector<double,dim>& x, Dune::FieldVector<double,N>& y) const
{
y = eval(0,x);
}
};
int main (int argc, char *argv[]) try
{
#ifdef EMBEDDED_PYTHON
EmbeddedPython::start();
#endif
Dune::ConfigParser parset;
// parse command line once to obtain a possible parset argument
// parse parameter file
// parse command line a second time in order to allow overwriting parameters
parset.parseCmd(argc, argv);
parset.parseFile(parset.get("file", "adaptive_laplace.parset"));
parset.parseCmd(argc, argv);
// The grid dimension
const int dim = DIMENSION;
// define grid type
#ifdef UGGRID
typedef Dune::UGGrid<dim> GridType;
#endif
#ifdef ALUGRID
typedef Dune::ALUSimplexGrid<dim,dim> GridType;
#endif
typedef NamedFunctionMap<GridType::Codim<0>::Geometry::GlobalCoordinate,Dune::FieldVector<double,1> > Functions;
typedef Functions::Function Function;
Functions functions;
functions["one"] = new ConstantFunction<dim,1>(1.0);
functions["zero"] = new ConstantFunction<dim,1>(0.0);
functions["abs"] = new AbsFunction<dim,1>;
// Generate the grid
Dune::GridPtr<GridType> gridptr;
if (dim==2)
gridptr=Dune::GridPtr<GridType>(parset.get("grid.dgffile2d", "coarse.dgf").c_str());
else if (dim==3)
gridptr=Dune::GridPtr<GridType>(parset.get("grid.dgffile3d", "coarse.dgf").c_str());
GridType& grid = *gridptr;
// grid specific settings
#ifdef UGGRID
grid.setRefinementType(GridType::LOCAL);
grid.setClosureType(GridType::NONE);
#endif
#ifdef ALUGRID
if (parset.hasKey("grid.restore"))
{
double time;
grid.readGrid<Dune::xdr>(parset.get<std::string>("grid.backupfile"), time);
std::cout << "Grid restored. Time was " << time << std::endl;
}
else
#endif
{
//initial refinement of grid
for (int i=0; i<parset.get("grid.refine", 0) or i<parset.get("laplace.refinement.minlevel",0); ++i)
grid.globalRefine(1);
std::cout << "Grid refined." << std::endl;
}
#ifdef EMBEDDED_PYTHON
std::string importDictName = formatString(std::string("importAsDuneFunction%1dD"), dim);
if (parset.hasKey("python.inline"))
{
EmbeddedPython::run(parset.get("python.inline", ""));
EmbeddedPython::importFunctionsFromModule(functions, "__main__", importDictName);
}
if (parset.hasKey("python.module"))
EmbeddedPython::importFunctionsFromModule(functions, parset.get("python.module", "laplace"), importDictName);
#endif
LaplaceProblem<GridType> laplaceProblem(grid, parset.sub("laplace"), functions);
bool refined;
do
{
laplaceProblem.assemble();
laplaceProblem.solve();
refined = laplaceProblem.adapt();
}
while(refined);
#ifdef EMBEDDED_PYTHON
EmbeddedPython::stop();
#endif
// delete created functions
Functions::iterator it = functions.begin();
Functions::iterator end = functions.end();
for(; it!=end; ++it)
delete it->second;
return 0;
}
catch (Dune::Exception e)
{
std::cout << e << std::endl;
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="191.46471mm"
height="58.247536mm"
viewBox="0 0 678.41825 206.38891"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="blocking-tree-elasticity.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="270.28397"
inkscape:cy="28.07803"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1874"
inkscape:window-height="1052"
inkscape:window-x="44"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-45.075784,-245.93458)">
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="path4136"
sodipodi:type="arc"
sodipodi:cx="120.20815"
sodipodi:cy="340.70984"
sodipodi:rx="17.172594"
sodipodi:ry="17.172594"
sodipodi:start="4.3844242"
sodipodi:end="4.3334256"
sodipodi:open="true"
d="m 114.67657,324.45255 a 17.172594,17.172594 0 0 1 21.71703,10.51889 17.172594,17.172594 0 0 1 -10.24116,21.84937 17.172594,17.172594 0 0 1 -21.97816,-9.96176 17.172594,17.172594 0 0 1 9.68074,-22.10339" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="path4136-3"
sodipodi:type="arc"
sodipodi:cx="235.42845"
sodipodi:cy="340.70981"
sodipodi:rx="17.172594"
sodipodi:ry="17.172594"
sodipodi:start="4.3844242"
sodipodi:end="4.3334256"
sodipodi:open="true"
d="m 229.89687,324.45252 a 17.172594,17.172594 0 0 1 21.71703,10.51889 17.172594,17.172594 0 0 1 -10.24116,21.84937 17.172594,17.172594 0 0 1 -21.97816,-9.96176 17.172594,17.172594 0 0 1 9.68074,-22.10339" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="path4136-6"
sodipodi:type="arc"
sodipodi:cx="63.250069"
sodipodi:cy="264.10938"
sodipodi:rx="17.172594"
sodipodi:ry="17.172594"
sodipodi:start="4.3844242"
sodipodi:end="4.3334256"
sodipodi:open="true"
d="m 57.718485,247.85208 a 17.172594,17.172594 0 0 1 21.717031,10.51889 17.172594,17.172594 0 0 1 -10.241157,21.84938 17.172594,17.172594 0 0 1 -21.978167,-9.96176 17.172594,17.172594 0 0 1 9.680745,-22.10339" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="path4136-5"
sodipodi:type="arc"
sodipodi:cx="661.64972"
sodipodi:cy="340.70984"
sodipodi:rx="17.172594"
sodipodi:ry="17.172594"
sodipodi:start="4.3844242"
sodipodi:end="4.3334256"
sodipodi:open="true"
d="m 656.11814,324.45255 a 17.172594,17.172594 0 0 1 21.71703,10.51889 17.172594,17.172594 0 0 1 -10.24116,21.84937 17.172594,17.172594 0 0 1 -21.97817,-9.96176 17.172594,17.172594 0 0 1 9.68075,-22.10339" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="path4136-5-3"
sodipodi:type="arc"
sodipodi:cx="366.68518"
sodipodi:cy="434.14902"
sodipodi:rx="17.172594"
sodipodi:ry="17.172594"
sodipodi:start="4.3844242"
sodipodi:end="4.3334256"
sodipodi:open="true"
d="m 361.1536,417.89172 a 17.172594,17.172594 0 0 1 21.71703,10.51889 17.172594,17.172594 0 0 1 -10.24116,21.84938 17.172594,17.172594 0 0 1 -21.97817,-9.96176 17.172594,17.172594 0 0 1 9.68075,-22.10339" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 337.39095,420.00671 147.48227,361.41786"
id="path4186"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 349.51278,414.95595 253.24371,362.42802"
id="path4188"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 392.94934,426.06763 638.41641,352.32649"
id="path4194"
inkscape:connector-curvature="0" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="path4136-6-3"
sodipodi:type="arc"
sodipodi:cx="109.74798"
sodipodi:cy="264.10938"
sodipodi:rx="17.172594"
sodipodi:ry="17.172594"
sodipodi:start="4.3844242"
sodipodi:end="4.3334256"
sodipodi:open="true"
d="m 104.21639,247.85208 a 17.172594,17.172594 0 0 1 21.71704,10.51889 17.172594,17.172594 0 0 1 -10.24116,21.84938 17.172594,17.172594 0 0 1 -21.978168,-9.96176 17.172594,17.172594 0 0 1 9.680748,-22.10339" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="path4136-6-6"
sodipodi:type="arc"
sodipodi:cx="155.3194"