From 64a1a8af7f7097371722bdc0c40369875eba31b3 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 4 Oct 2017 06:23:17 +0100 Subject: [PATCH] Docs: Add a preliminary Developer Docs page to the website --- .gitignore | 1 - docs/developer.rst | 18 ++++++++ docs/figures/data_structures.pdf | Bin 0 -> 12839 bytes docs/figures/data_structures.png | Bin 0 -> 33145 bytes docs/figures/data_structures.tex | 71 +++++++++++++++++++++++++++++++ docs/index.rst | 1 + 6 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 docs/developer.rst create mode 100644 docs/figures/data_structures.pdf create mode 100644 docs/figures/data_structures.png create mode 100644 docs/figures/data_structures.tex diff --git a/.gitignore b/.gitignore index 55e8173a..c3f8797e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ *.pyc *.json -*.pdf .cache diff --git a/docs/developer.rst b/docs/developer.rst new file mode 100644 index 00000000..a0ac167c --- /dev/null +++ b/docs/developer.rst @@ -0,0 +1,18 @@ +Developer documentation +======================= + +This page provides an introduction into the internal workings of +Devito and is aimed at new developers and people who want to +contribute to the project. We will give a brief glimpse under the hood +to provide some context for the various design and implementation +choices. + +If you are only interested in learning how to use Devito, please start +with the :doc:`tutorials and examples `. + +*Please note that this page is currently still under ongoing development.* + +Core data structures +-------------------- + +.. image:: figures/data_structures.png diff --git a/docs/figures/data_structures.pdf b/docs/figures/data_structures.pdf new file mode 100644 index 0000000000000000000000000000000000000000..44ea6ea99ef2e5e589f7a93d0fa0421e9d9bd5c2 GIT binary patch literal 12839 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 Pd^XL?I)7s>nm_(OtuceX literal 0 HcmV?d00001 diff --git a/docs/figures/data_structures.tex b/docs/figures/data_structures.tex new file mode 100644 index 00000000..cb716e09 --- /dev/null +++ b/docs/figures/data_structures.tex @@ -0,0 +1,71 @@ +\documentclass{standalone} + +\usepackage{tikz} +\usepackage{pgfplots} +\usetikzlibrary{arrows,chains,positioning,fit,backgrounds,calc,shapes, + shadows,scopes,decorations.markings,plotmarks} + +\begin{document} + + +\tikzset{ + line/.style={ + draw, very thick, dashed + }, + box/.style={ + draw, thick, rectangle, rounded corners, + font=\sffamily\large, + minimum height=2em, minimum width=8em, + }, + internal/.style={ + box, fill=black!5, + }, + external/.style={ + box, fill=black!25, + } +} + +\begin{tikzpicture}[font=\sf\small, node distance=4em] + + \node (abstract) [internal] {AbstractSymbol}; + \node (sym_data) [internal, below left=of abstract] {SymbolicData}; + \node (sym_func) [internal, below right=of abstract] {SymbolicFunction}; + + \node (scalar) [internal, below left=of sym_data.south] {Scalar}; + \node (array) [internal, below right=of sym_data.south] {Array}; + + \node (constant) [external, below left=of sym_func.south] {Constant}; + \node (tensor_f) [internal, below right=of sym_func.south] {TensorFunction}; + + \node (function) [external, below left=of tensor_f] {Function}; + \node (time_func) [external, below=2.8em of tensor_f] {TimeFunction}; + \node (composite) [internal, below right=of tensor_f] {CompositeFunction}; + \node (sparse_f) [external, below=2.8em of composite] {SparseFunction}; + + %% Connector lines + \draw[line] (abstract.south) -- ([shift={(0.,-.5)}] abstract.south) -- + ([shift={(0.,.5)}] sym_data.north) -- (sym_data.north); + \draw[line] ([shift={(0.,-.5)}] abstract.south) -- + ([shift={(0.,.5)}] sym_func.north) -- (sym_func.north); + + \draw[line] (sym_data.south) -- ([shift={(0.,-.5)}] sym_data.south) -- + ([shift={(0.,.5)}] scalar.north) -- (scalar.north); + \draw[line] ([shift={(0.,-.5)}] sym_data.south) -- + ([shift={(0.,.5)}] array.north) -- (array.north); + + \draw[line] (sym_func.south) -- ([shift={(0.,-.5)}] sym_func.south) -- + ([shift={(0.,.5)}] constant.north) -- (constant.north); + \draw[line] ([shift={(0.,-.5)}] sym_func.south) -- + ([shift={(0.,.5)}] tensor_f.north) -- (tensor_f.north); + + \draw[line] (tensor_f.south) -- ([shift={(0.,-.5)}] tensor_f.south) -- + ([shift={(0.,.5)}] function.north) -- (function.north); + \draw[line] ([shift={(0.,-.5)}] tensor_f.south) -- (time_func.north); + \draw[line] ([shift={(0.,-.5)}] tensor_f.south) -- + ([shift={(0.,.5)}] composite.north) -- (composite.north); + \draw[line] (composite.south) -- (sparse_f.north); + +\end{tikzpicture} + +\end{document} + diff --git a/docs/index.rst b/docs/index.rst index e6ff19a4..c66550e6 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -33,6 +33,7 @@ You can find the API Documentation :doc:`here `. Download Tutorials + Developer Documentation Example Documentation API Documentation