Skip to content
Snippets Groups Projects
Commit 23a38ca9 authored by oliver.sander_at_tu-dresden.de's avatar oliver.sander_at_tu-dresden.de
Browse files

Import the content of the dune-tnnmg-examples modules

It is preferable to not have this in a separate module:  The code
gets forgotten and slowly rots...
parent d642d297
No related branches found
No related tags found
1 merge request!18Merge the dune-tnnmg-examples module into dune-tnnmg
Showing
with 4465 additions and 0 deletions
...@@ -13,5 +13,6 @@ dune_project() ...@@ -13,5 +13,6 @@ dune_project()
add_subdirectory("doc") add_subdirectory("doc")
add_subdirectory("dune") add_subdirectory("dune")
add_subdirectory("examples")
finalize_dune_project(GENERATE_CONFIG_H_CMAKE) finalize_dune_project(GENERATE_CONFIG_H_CMAKE)
add_subdirectory(doxygen) 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.
File added
<?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"
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 149.78781,247.85208 a 17.172594,17.172594 0 0 1 21.71703,10.51889 17.172594,17.172594 0 0 1 -10.24115,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="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-7"
sodipodi:type="arc"
sodipodi:cx="205.60512"
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 200.07353,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.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-6-5"
sodipodi:type="arc"
sodipodi:cx="248.46227"
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 242.93068,247.85208 a 17.172594,17.172594 0 0 1 21.71703,10.51889 17.172594,17.172594 0 0 1 -10.24115,21.84938 17.172594,17.172594 0 0 1 -21.97817,-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-35"
sodipodi:type="arc"
sodipodi:cx="291.3194"
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 285.78781,247.85208 a 17.172594,17.172594 0 0 1 21.71703,10.51889 17.172594,17.172594 0 0 1 -10.24115,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="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-62"
sodipodi:type="arc"
sodipodi:cx="607.17657"
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 601.64499,247.85208 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.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-9"
sodipodi:type="arc"
sodipodi:cx="655.6051"
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 650.07352,247.85208 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.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-1"
sodipodi:type="arc"
sodipodi:cx="705.3194"
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 699.78781,247.85208 a 17.172594,17.172594 0 0 1 21.71703,10.51889 17.172594,17.172594 0 0 1 -10.24115,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 101.31958,320.18064 73.462441,285.89492"
id="path3401"
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 117.74816,316.60921 -5.71429,-27.85714"
id="path3403"
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 127.74816,320.18064 21.42857,-34.28572"
id="path3405"
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 224.89101,317.3235 -15,-32.14286"
id="path3407"
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 239.89101,318.03778 5.71429,-30"
id="path3409"
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 247.03387,318.75207 32.14286,-32.85715"
id="path3411"
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 648.46244,321.60921 -28.57143,-35"
id="path3413"
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 661.31958,319.46635 -2.14285,-31.42857"
id="path3415"
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 669.89101,320.18064 22.85715,-36.42857"
id="path3417"
inkscape:connector-curvature="0" />
</g>
</svg>
File added
<?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="163.06532mm"
height="36.629192mm"
viewBox="0 0 577.79051 129.78848"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="blocking-scalar.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="274.04017"
inkscape:cy="29.506605"
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(-102.03387,-322.53502)">
<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="198.99988"
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 193.46829,324.45252 a 17.172594,17.172594 0 0 1 21.71704,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-6"
sodipodi:type="arc"
sodipodi:cx="278.96436"
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 273.43277,324.45255 a 17.172594,17.172594 0 0 1 21.71703,10.51889 17.172594,17.172594 0 0 1 -10.24115,21.84937 17.172594,17.172594 0 0 1 -21.97817,-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-7"
sodipodi:type="arc"
sodipodi:cx="583.86798"
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 578.3364,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"
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 223.24371,362.42802"
id="path4188"
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 359.61431,410.91534 293.95439,365.45847"
id="path4190"
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 384.86812,417.98641 558.61436,349.29603"
id="path4192"
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 392.94934,426.06763 638.41641,352.32649"
id="path4194"
inkscape:connector-curvature="0" />
</g>
</svg>
File added
This diff is collapsed.
File added
<?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="210.60612mm"
height="72.962318mm"
viewBox="0 0 210.60612 72.962318"
version="1.1"
id="svg8"
inkscape:version="0.92.0 r15299"
sodipodi:docname="dune-solvers-class-hierarchy.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="435.50949"
inkscape:cy="116.03367"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1874"
inkscape:window-height="1052"
inkscape:window-x="44"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata5">
<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(7.8833149,-106.57159)">
<rect
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;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26499999;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="rect3680"
width="35.279575"
height="6.4144688"
x="51.31575"
y="172.98694" />
<rect
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;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26499999;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="rect3680-3"
width="35.279575"
height="6.4144688"
x="18.708868"
y="154.54535" />
<rect
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;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26499999;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="rect3680-6"
width="35.279575"
height="6.4144688"
x="62.006531"
y="154.81261" />
<rect
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;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26499999;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="rect3680-7"
width="35.279575"
height="6.4144688"
x="-7.7508149"
y="134.50012" />
<rect
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;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26499999;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="rect3680-5"
width="35.279575"
height="6.4144688"
x="34.332333"
y="139.2137" />
<rect
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;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26499999;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="rect3680-35"
width="35.279575"
height="6.4144688"
x="75.637276"
y="132.89651" />
<rect
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;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26499999;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="rect3680-62"
width="35.279575"
height="6.4144688"
x="132.29842"
y="141.44914" />
<rect
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;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26499999;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="rect3680-9"
width="35.279575"
height="6.4144688"
x="129.62572"
y="123.80935" />
<rect
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;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26499999;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="rect3680-1"
width="35.279575"
height="6.4144688"
x="94.880684"
y="106.70409" />
<rect
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;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26499999;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="rect3680-2"
width="35.279575"
height="6.4144688"
x="129.62572"
y="107.50591" />
<rect
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;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26499999;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="rect3680-70"
width="35.279575"
height="6.4144688"
x="167.31073"
y="107.50591" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="56.696426"
y="175.10268"
id="text3753"><tspan
sodipodi:role="line"
id="tspan3751"
x="56.696426"
y="175.10268"
style="stroke-width:0.26458332px">Solver</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="24.757439"
y="159.0387"
id="text3757"><tspan
sodipodi:role="line"
id="tspan3755"
x="24.757439"
y="159.0387"
style="stroke-width:0.26458332px">LinearSolver</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="-2.8348215"
y="137.87202"
id="text3761"><tspan
sodipodi:role="line"
id="tspan3759"
x="-2.8348215"
y="137.87202"
style="stroke-width:0.26458332px">UMFPackSolver</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="37.230656"
y="142.78571"
id="text3765"><tspan
sodipodi:role="line"
id="tspan3763"
x="37.230656"
y="142.78571"
style="stroke-width:0.26458332px">QuadraticIPOptSolver</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="62.006531"
y="161.22708"
id="text3769"><tspan
sodipodi:role="line"
id="tspan3767"
x="62.006531"
y="165.39349"
style="stroke-width:0.26458332px"></tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="66.901787"
y="158.47173"
id="text3773"><tspan
sodipodi:role="line"
id="tspan3771"
x="66.901787"
y="158.47173"
style="stroke-width:0.26458332px">IterativeSolver</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="79.375"
y="138.24998"
id="text3777"><tspan
sodipodi:role="line"
id="tspan3775"
x="79.375"
y="138.24998"
style="stroke-width:0.26458332px">LoopSolver</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="137.39435"
y="145.62053"
id="text3781"><tspan
sodipodi:role="line"
id="tspan3779"
x="137.39435"
y="145.62053"
style="stroke-width:0.26458332px">IterationStep</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="135.1265"
y="128.23363"
id="text3785"><tspan
sodipodi:role="line"
id="tspan3783"
x="135.1265"
y="128.23363"
style="stroke-width:0.26458332px">LinearIterationStep</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="99.596718"
y="111.60268"
id="text3789"><tspan
sodipodi:role="line"
id="tspan3787"
x="99.596718"
y="111.60268"
style="stroke-width:0.26458332px">MultigridStep</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="136.82739"
y="112.7366"
id="text3793"><tspan
sodipodi:role="line"
id="tspan3791"
x="136.82739"
y="112.7366"
style="stroke-width:0.26458332px">GSStep</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.30729151px;line-height:6.61458302px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="174.05803"
y="112.7366"
id="text3797"><tspan
sodipodi:role="line"
id="tspan3795"
x="174.05803"
y="112.7366"
style="stroke-width:0.26458332px">CGStep</tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 18.708868,154.54535 -6.61363,-11.19267"
id="path3818"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 40.63244,153.36905 2.645834,-5.66965"
id="path3820"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 59.720238,170.75595 45.924107,163.19643"
id="path3822"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 71.059523,170.75595 3.401785,-7.37054"
id="path3824"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 83.343749,152.80208 88.25744,142.21875"
id="path3826"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 106.4003,135.98214 h 15.875 v 8.88244 h 9.26041"
id="path3828"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 147.5997,141.4628 v -9.26042"
id="path3830"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 140.22916,122.375 -19.46577,-7.37054"
id="path3832"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 148.73363,122.375 -0.37798,-6.04762"
id="path3834"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 157.04911,122.56399 16.25297,-6.61459"
id="path3836"
inkscape:connector-curvature="0" />
</g>
</svg>
File added
<?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="484.22858"
height="458.57144"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="Neues Dokument 1">
<defs
id="defs4">
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Mend"
style="overflow:visible">
<path
id="path3790"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6,-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Mend-0"
style="overflow:visible">
<path
inkscape:connector-curvature="0"
id="path3790-8"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6,-0.6)" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Mend-3"
style="overflow:visible">
<path
inkscape:connector-curvature="0"
id="path3790-2"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6,-0.6)" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="218.92541"
inkscape:cy="220"
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="1138"
inkscape:window-height="722"
inkscape:window-x="225"
inkscape:window-y="0"
inkscape:window-maximized="0" />
<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(-40,-293.79074)">
<rect
style="color:#000000;fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect2985"
width="247.14285"
height="247.14285"
x="172.85715"
y="402.36218" />
<rect
style="color:#000000;fill:#b1b1b1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect2987"
width="130"
height="458.57144"
x="40"
y="293.79074" />
<path
style="fill:none;stroke:#000000;stroke-width:5.5999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend)"
d="m 521.42857,448.07647 -70,0"
id="path3757"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:5.5999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend)"
d="m 521.42857,520.1924 -70,0"
id="path3757-8"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:5.5999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend)"
d="m 521.42857,592.30838 -70,0"
id="path3757-9"
inkscape:connector-curvature="0" />
</g>
</svg>
doc/manual/gfx/poisson_result.png

61.7 KiB

...@@ -13,5 +13,6 @@ install(FILES ...@@ -13,5 +13,6 @@ install(FILES
stronglyconvexfunctional.hh stronglyconvexfunctional.hh
sumfunctional.hh sumfunctional.hh
sumfunctionalconstrainedlinearization.hh sumfunctionalconstrainedlinearization.hh
trescafrictionfunctional.hh
zerofunctional.hh zerofunctional.hh
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/tnnmg/functionals) DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/tnnmg/functionals)
// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set ts=8 sw=2 et sts=2:
#ifndef DUNE_TNNMG_EXAMPLES_TRESCAFRICTIONFUNCTIONAL_HH
#define DUNE_TNNMG_EXAMPLES_TRESCAFRICTIONFUNCTIONAL_HH
#include <dune/common/bitsetvector.hh>
#include <dune/common/typeutilities.hh>
#include <dune/common/typetraits.hh>
#include <dune/matrix-vector/algorithm.hh>
#include <dune/solvers/common/interval.hh>
#include <dune/solvers/common/resize.hh>
#include <dune/tnnmg/functionals/nonsmoothconvexfunctional.hh>
#ifndef NEW_TRESCA_FRICTION_FUNCTIONAL
#include <dune/tnnmg/problem-classes/nonlinearity.hh>
#endif
#ifdef NEW_TRESCA_FRICTION_FUNCTIONAL
template <class V, class R=double>
class ShiftedTrescaFrictionFunctional;
/** \brief Coordinate restriction of a Tresca friction functional
*
* \tparam V global vector type
* \tparam R Range type
* \tparam I Index type used to access individual vector entries
*/
template <class V, class R, class I = std::size_t>
class TrescaFrictionCoordinateRestriction
{
public:
using GlobalVector = V;
using GlobalIndex = I;
using Vector = std::decay_t<decltype(std::declval<GlobalVector>()[std::declval<GlobalIndex>()])>;
using Range = R;
TrescaFrictionCoordinateRestriction(const GlobalVector& coefficients,
const GlobalVector& origin,
GlobalIndex index)
: coefficients_(&coefficients),
origin_(origin),
index_(index)
{}
Range operator()(const Vector& v) const
{
DUNE_THROW(Dune::NotImplemented, "Evaluation of TrescaFrictionCoordinateRestriction not implemented");
}
GlobalIndex index() const
{
return index_;
}
const auto& coefficients() const
{
return (*coefficients_)[index_];
}
template<class Origin,
std::enable_if_t<! Dune::IsNumber<Origin>::value, int> = 0>
friend ShiftedTrescaFrictionFunctional<Vector, Range>
shift(const TrescaFrictionCoordinateRestriction& f, const Origin& origin)
{
return ShiftedTrescaFrictionFunctional<Vector, Range>(f.coefficients(),
f.origin_[f.index_], // origin of the functional before this shift
origin); // new additional shift, with reference semantics
}
protected:
const GlobalVector* coefficients_;
const GlobalVector origin_;
const GlobalIndex index_;
};
/** \brief Coordinate restriction of a Tresca friction functional
*
* \tparam blocksize The number of scalar entries of one vector block
* \tparam R Range type
* \tparam I Index type used to access individual vector entries
*/
template <int blocksize, class R, class I>
class TrescaFrictionCoordinateRestriction<Dune::FieldVector<double,blocksize>, R, I>
{
/** \todo Use the implementation in TrescaFrictionFunctional instead */
template <int dim>
static Dune::FieldVector<double,dim-1> tangentialPart(const Dune::FieldVector<double,dim>& v)
{
Dune::FieldVector<double,dim-1> result;
std::copy(v.begin()+1,v.end(),result.begin());
return result;
}
public:
using GlobalVector = Dune::FieldVector<double,blocksize> ;
using GlobalIndex = I;
using Vector = std::decay_t<decltype(std::declval<GlobalVector>()[std::declval<GlobalIndex>()])>;
using Range = R;
TrescaFrictionCoordinateRestriction(const GlobalVector& coefficients,
const GlobalVector& origin,
GlobalIndex index)
: coefficients_(&coefficients),
origin_(origin),
index_(index)
{}
Range operator()(const Vector& v) const
{
// BUG: This code here omits all contributions from other than the local blocks
// AFAICT that's okay, because this method is not used by the actual solver.
auto tmp = origin_;
tmp[index_] += v;
assert(coefficients_->size()==1);
return (*coefficients_)[0] * tangentialPart(tmp).two_norm();
}
GlobalIndex index() const
{
return index_;
}
const auto& coefficients() const
{
return (*coefficients_)[index_];
}
Dune::Solvers::Interval<double> domain() const
{
// Our domain is the entire space
return Dune::Solvers::Interval<double>{-std::numeric_limits<double>::infinity(),
std::numeric_limits<double>::infinity()};
}
Dune::Solvers::Interval<double> subDifferential(double z) const
{
constexpr double tolerance = 1e-15;
Dune::Solvers::Interval<double> dJ = 0.0;
if (index_!=0)
{
// Compute current tangential displacement
auto displacement = origin_;
displacement[index_] += z;
double tangentialNorm = tangentialPart(displacement).two_norm();
if (tangentialNorm < tolerance)
{
dJ[0] -= (*coefficients_)[0];
dJ[1] += (*coefficients_)[0];
}
else
dJ += (*coefficients_)[0] * displacement[index_] / tangentialNorm;
}
return dJ;
}
protected:
const GlobalVector* coefficients_;
const GlobalVector origin_;
const GlobalIndex index_;
};
/** \brief Shifted Tresca friction functional
*
* \tparam V global vector type
* \tparam R Range type
*/
template <class V, class R>
class ShiftedTrescaFrictionFunctional
{
public:
using Vector = V;
using Range = R;
ShiftedTrescaFrictionFunctional(const Vector& coefficients,
const Vector& origin,
const Vector& offset)
: coefficients_(&coefficients),
origin_(origin),
offset_(&offset)
{}
Range operator()(const Vector& v) const
{
DUNE_THROW(Dune::NotImplemented, "Evaluation of ShiftedTrescaFrictionFunctional not implemented");
}
void updateOrigin()
{
// Does not do anything, because no information is precomputed
}
void updateOrigin(std::size_t i)
{
// Does not do anything, because no information is precomputed
}
template<class Index>
friend TrescaFrictionCoordinateRestriction<Vector, Range, Index>
coordinateRestriction(const ShiftedTrescaFrictionFunctional& f, const Index& i)
{
auto tmp = f.origin_;
tmp += *f.offset_;
return TrescaFrictionCoordinateRestriction<Vector, Range, Index>(*f.coefficients_, tmp, i);
}
protected:
const Vector* coefficients_;
const Vector origin_;
const Vector* offset_;
};
/** \brief Directional restriction of the Tresca friction functional
*
* \tparam V Global vector type
* \tparam R Range type
*/
template <class V, class R=double>
class TrescaFrictionDirectionalRestriction
{
/** \todo Use the implementation in TrescaFrictionFunctional instead */
template <int dim>
static Dune::FieldVector<double,dim-1> tangentialPart(const Dune::FieldVector<double,dim>& v)
{
Dune::FieldVector<double,dim-1> result;
std::copy(v.begin()+1,v.end(),result.begin());
return result;
}
public:
using GlobalVector = V;
using Vector = typename GlobalVector::field_type;
using Range = R;
TrescaFrictionDirectionalRestriction(const GlobalVector& coefficients,
const GlobalVector& origin,
const GlobalVector& direction)
: coefficients_(&coefficients),
origin_(&origin),
direction_(&direction)
{}
Range operator()(const Vector& v) const
{
Range result = 0.0;
auto globalPos = *origin_;
globalPos.axpy(v, *direction_);
// Norm part (i.e., the actual friction)
for (size_t row=0; row<origin_->size(); ++row)
{
auto p = (*origin_)[row];
p.axpy(v, (*direction_)[row]);
result += (*coefficients_)[row] * tangentialPart(p).two_norm();
}
return result;
}
Dune::Solvers::Interval<double> domain() const
{
// Our domain is the entire space
return Dune::Solvers::Interval<double>{-std::numeric_limits<double>::infinity(),
std::numeric_limits<double>::infinity()};
}
Dune::Solvers::Interval<double> subDifferential(double z) const
{
// \todo It should be possible to set this globally
double tolerance = 1e-15;
Dune::Solvers::Interval<double> dJ = 0.0;
for(size_t row=0; row<origin_->size(); ++row)
{
auto p = (*origin_)[row];
p.axpy(z,(*direction_)[row]);
double tangentialNorm = tangentialPart(p).two_norm();
if (tangentialNorm >= tolerance){
for (std::size_t j=1; j<(*origin_)[row].size(); j++) {
dJ[0] += (*coefficients_)[row][0] * (p[j]*(*direction_)[row][j]) / tangentialNorm;
dJ[1] += (*coefficients_)[row][0] * (p[j]*(*direction_)[row][j]) / tangentialNorm;
}
} else {
for (std::size_t j=1; j<(*origin_)[row].size(); j++) {
dJ[0] += (*coefficients_)[row][0] * (*direction_)[row][j];
dJ[1] -= (*coefficients_)[row][0] * (*direction_)[row][j];
}
}
}
return dJ;
}
protected:
const GlobalVector* coefficients_;
const GlobalVector* origin_;
const GlobalVector* direction_;
};
/** \brief Functional of linear elasticity with one-sided contact and Tresca friction
*
* \tparam V Vector type
* \tparam R Range type
*/
template <class V, class R=double>
class TrescaFrictionFunctional
{
template <int dim>
static Dune::FieldVector<double,dim-1> tangentialPart(const Dune::FieldVector<double,dim>& v)
{
Dune::FieldVector<double,dim-1> result;
std::copy(v.begin()+1,v.end(),result.begin());
return result;
}
public:
using Vector = V;
using Range = R;
TrescaFrictionFunctional(const Vector& coefficients)
: coefficients_(coefficients)
{}
Range operator()(const Vector& v) const
{
Range result = 0.0;
// Norm part (i.e., the actual friction)
for (size_t row=0; row<v.size(); ++row)
result += coefficients_[row][0] * tangentialPart(v[row]).two_norm();
return result;
}
const Vector& coefficients() const
{
return coefficients_;
}
friend auto directionalRestriction(const TrescaFrictionFunctional& f, const Vector& origin, const Vector& direction)
{
return TrescaFrictionDirectionalRestriction<Vector, Range>(f.coefficients_,
origin, direction);
}
friend ShiftedTrescaFrictionFunctional<Vector, Range>
shift(const TrescaFrictionFunctional& f, const Vector& origin)
{
Vector zero;
Dune::Solvers::resizeInitialize(zero, origin, 0.0);
return ShiftedTrescaFrictionFunctional<Vector, Range>(f.coefficients_, std::move(zero), origin);
}
protected:
const Vector coefficients_;
};
#else
// { trescafunctional_header_begin }
template <int dim>
class TrescaFrictionFunctional
: public Dune::TNNMG::NonsmoothConvexFunctional<Dune::FieldVector<double,dim>, Dune::FieldMatrix<double,dim,dim> >
// { trescafunctional_header_end }
{
public:
typedef Dune::FieldVector<double,dim> LocalVectorType;
typedef Dune::FieldMatrix<double,dim,dim> LocalMatrixType;
private:
// { trescafunctional_tangentialpart_begin }
static Dune::FieldVector<double,dim-1> tangentialPart(const LocalVectorType& v)
{
Dune::FieldVector<double,dim-1> result;
std::copy(v.begin()+1,v.end(),result.begin());
return result;
}
// { trescafunctional_tangentialpart_end }
public:
typedef Nonlinearity<LocalVectorType, LocalMatrixType> NonlinearityType;
typedef typename NonlinearityType::VectorType VectorType;
typedef typename NonlinearityType::MatrixType MatrixType;
typedef typename NonlinearityType::IndexSet IndexSet;
TrescaFrictionFunctional(const std::vector<double> coefficients,
const Dune::BitSetVector<1>& frictionNodes,
double tolerance = 1e-15) :
coefficients_(coefficients),
tolerance_(tolerance),
frictionNodes_(frictionNodes)
{}
// { trescafunctional_energy_begin }
double operator()(const VectorType& v) const
{
double result = 0.0;
for(size_t row=0; row<v.size(); ++row)
if (frictionNodes_[row][0])
result += coefficients_[row] * tangentialPart(v[row]).two_norm();
return result;
}
// { trescafunctional_energy_end }
/** \brief Add the gradient of the Tresca friction potential to a given vector
*
* Note: the gradient of |v| is v/|v|
*/
// { trescafunctional_addgradient_begin }
void addGradient(const VectorType& v, VectorType& gradient) const
{
for(size_t row=0; row<v.size(); ++row)
{
if (not frictionNodes_[row][0])
continue;
double tangentialNorm = tangentialPart(v[row]).two_norm();
// Do nothing if we are at a nondifferentiable point
if (tangentialNorm < tolerance_)
continue;
for (int j=1; j<dim; j++)
gradient[row][j] += coefficients_[row] * v[row][j] / tangentialNorm;
}
}
// { trescafunctional_addgradient_end }
/** \brief Add the Hessian of the Tresca friction potential to a given matrix
*
* Note: Entry ij of the Hessian of |v| is - \frac{v_i v_j}{\norm{v}^3} + \frac{\delta_{ij}}{\norm{v}}
*/
// { trescafunctional_addhessian_begin }
void addHessian(const VectorType& v, MatrixType& hessian) const
{
for(size_t row=0; row<v.size(); ++row)
{
if (not frictionNodes_[row][0])
continue;
double tangentialNorm = tangentialPart(v[row]).two_norm();
// Do nothing if we are at the nondifferentiable point
if (tangentialNorm < tolerance_)
continue;
for (int i=1; i<dim; i++)
for (int j=1; j<dim; j++)
hessian[row][row][i][j] += coefficients_[row] * (- v[row][i] * v[row][j] / (tangentialNorm*tangentialNorm*tangentialNorm) + (i==j) / tangentialNorm);
}
}
// { trescafunctional_addhessian_end }
void addHessianIndices(IndexSet& indices) const {}
/** \brief Compute the subdifferential of the nonlinearity restricted to the line u + t v.
*
* \param[out] subdifferential the resulting subdifferential
* \param u base point
* \param v direction
*/
// { trescafunctional_directional_subdiff_begin }
virtual void directionalSubDiff(const VectorType& u, const VectorType& v, Dune::Solvers::Interval<double>& subdifferential)
{
subdifferential[0] = 0.0;
subdifferential[1] = 0.0;
for(size_t row=0; row<u.size(); ++row)
{
if (not frictionNodes_[row][0])
continue;
double tangentialNorm = tangentialPart(u[row]).two_norm();
if (tangentialNorm >= tolerance_){
for (int j=1; j<dim; j++) {
subdifferential[0] += coefficients_[row] * (u[row][j]*v[row][j]) / tangentialNorm;
subdifferential[1] += coefficients_[row] * (u[row][j]*v[row][j]) / tangentialNorm;
}
} else {
for (int j=1; j<dim; j++) {
subdifferential[0] -= coefficients_[row] * v[row][j];
subdifferential[1] += coefficients_[row] * v[row][j];
}
}
}
}
// { trescafunctional_directional_subdiff_end }
/** \brief Compute the subdifferential of the nonlinearity restricted to the
* line u_pos' +t e_(i,j) at t=0.
*
* Here e_(i,j) is the (i,j)-th Euclidean unit vector,
* and u_pos' is the internal position vector u_pos with the (i,j)-the entry replaced by x.
* If the nonlinearity decouples in the Euclidean directions this is simply the (i,j)-th
* component of the subdifferential.
*
* \param i global index
* \param j local index
* \param x value of the (i,j)-th entry of position to evaluate the nonlinearity at
* \param[out] D the subdifferential
*/
// { trescafunctional_subdiff_begin }
virtual void subDiff(int i, double x, Dune::Solvers::Interval<double>& D, int j) const
{
D[0] = 0.0;
D[1] = 0.0;
if (not frictionNodes_[i][0])
return;
if (j!=0)
{
// Compute current tangential displacement
LocalVectorType displacement = u_[i];
displacement[j] = x;
double tangentialNorm = tangentialPart(displacement).two_norm();
if (tangentialNorm < tolerance_)
{
D[0] = - coefficients_[i];
D[1] = coefficients_[i];
} else
D[0] = D[1] = coefficients_[i] * displacement[j] / tangentialNorm;
}
}
// { trescafunctional_subdiff_end }
/** \brief Return the regularity of the nonlinearity restricted to the
* line u_pos' +t e_(i,j) at t=0.
*
* Here e_(i,j) is the (i,j)-th Euclidean unit vector,
* and u_pos' is the internal position vector u_pos with the (i,j)-the entry replaced by x.
* Usually this will be the third derivative or a local Lipschitz constant of the second
* derivative. Note that if the subdifferential is set-valued at this position, this
* value will normally be infinity.
*
* \param i global index
* \param j local index
* \param x value of the (i,j)-th entry of position to evaluate the nonlinearity at
* \returns a value measuring the regularity
*/
// { trescafunctional_regularity_begin }
virtual double regularity(int i, double x, int j) const
{
if (not frictionNodes_[i][0])
return 0.0;
// Compute current tangential displacement
LocalVectorType displacement = u_[i];
displacement[j] = x;
double tangentialNorm = tangentialPart(displacement).two_norm();
if (tangentialNorm < tolerance_)
return std::numeric_limits<double>::max();
return 0.0;
}
// { trescafunctional_regularity_end }
// { trescafunctional_domain_begin }
void domain(int i, Dune::Solvers::Interval<double>& dom, int j) const
{
// Our domain is the entire space
dom[0] = -std::numeric_limits<double>::max();
dom[1] = std::numeric_limits<double>::max();
}
// { trescafunctional_domain_end }
/** \brief Set the internal position vector u_pos to v.
*
* This method is empty, because it is only needed if the nonlinearity
* does not decouple in the Euclidean directions.
*/
// { trescafunctional_state_begin }
virtual void setVector(const VectorType& v)
{
u_ = v;
};
/** \brief Update the (i,j)-th entry of the internal position vector u_pos to x.
*
*
* \param i global index
* \param j local index
* \param x new value of the entry (u_pos)_(i,j)
*/
virtual void updateEntry(int i, double x, int j)
{
u_[i][j] = x;
};
// { trescafunctional_state_end }
private:
/** \brief For each block, the norm is weighted with the corresponding coefficient from this array */
const std::vector<double> coefficients_;
/** \brief We consider the norm function to be nondifferentiable a circle of this radius around 0 */
const double tolerance_;
/** \brief Is 'true' for all degrees of freedom with friction */
Dune::BitSetVector<1> frictionNodes_;
/** \brief The current state */
VectorType u_;
};
#endif
#endif
...@@ -8,4 +8,5 @@ install(FILES ...@@ -8,4 +8,5 @@ install(FILES
preconfiguredtnnmgstep.hh preconfiguredtnnmgstep.hh
tnnmgacceleration.hh tnnmgacceleration.hh
tnnmgstep.hh tnnmgstep.hh
trescafrictiontnnmgstepimp.hh
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/tnnmg/iterationsteps) DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/tnnmg/iterationsteps)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment