From 00c2c9efebeb8f04205c62bd767060f9f42c87e9 Mon Sep 17 00:00:00 2001
From: Markus Blatt <mblatt@dune-project.org>
Date: Wed, 27 Apr 2005 09:50:04 +0000
Subject: [PATCH] Started documentation of the istl communication classes .

[[Imported from SVN: r1964]]
---
 configure.ac                    |   2 +
 doc/Makefile.am                 |   2 +-
 doc/istl/.gitignore             |   3 +
 doc/istl/Makefile.am            |   3 +
 doc/istl/comm/.gitignore        |  17 +++
 doc/istl/comm/Makefile.am       |  39 +++++++
 doc/istl/comm/communication.tex | 193 ++++++++++++++++++++++++++++++++
 doc/istl/comm/indexset.cc       |  72 ++++++++++++
 8 files changed, 330 insertions(+), 1 deletion(-)
 create mode 100644 doc/istl/.gitignore
 create mode 100644 doc/istl/Makefile.am
 create mode 100644 doc/istl/comm/.gitignore
 create mode 100644 doc/istl/comm/Makefile.am
 create mode 100644 doc/istl/comm/communication.tex
 create mode 100644 doc/istl/comm/indexset.cc

diff --git a/configure.ac b/configure.ac
index 4ede72020..64b05e89f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -167,6 +167,8 @@ AC_CONFIG_FILES([Makefile
 	 doc/devel/Makefile
 	 doc/appl/Makefile
 	 doc/appl/refelements/Makefile
+	 doc/istl/Makefile
+	 doc/istl/comm/Makefile
 	 doc/layout/Makefile
 	 doc/doxygen/Makefile
          m4/Makefile
diff --git a/doc/Makefile.am b/doc/Makefile.am
index ff3fb1b8c..065391812 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -3,7 +3,7 @@
 # distribute these files:
 EXTRA_DIST = Buildsystem
 
-SUBDIRS = devel appl doxygen layout
+SUBDIRS = devel appl doxygen layout istl
 
 PAGES = index.html
 
diff --git a/doc/istl/.gitignore b/doc/istl/.gitignore
new file mode 100644
index 000000000..55880268f
--- /dev/null
+++ b/doc/istl/.gitignore
@@ -0,0 +1,3 @@
+Makefile
+Makefile.in
+semantic.cache
\ No newline at end of file
diff --git a/doc/istl/Makefile.am b/doc/istl/Makefile.am
new file mode 100644
index 000000000..3c9fdda6a
--- /dev/null
+++ b/doc/istl/Makefile.am
@@ -0,0 +1,3 @@
+# $id: $
+
+SUBDIRS = comm
diff --git a/doc/istl/comm/.gitignore b/doc/istl/comm/.gitignore
new file mode 100644
index 000000000..a8c2a6b25
--- /dev/null
+++ b/doc/istl/comm/.gitignore
@@ -0,0 +1,17 @@
+Makefile
+Makefile.in
+semantic.cache
+output
+indexset
+.deps
+.libs
+*.aux
+*.bbl
+*.blg
+*.log
+*.out
+*.toc
+*.dvi
+*.pdf
+*.ps
+*.rel
\ No newline at end of file
diff --git a/doc/istl/comm/Makefile.am b/doc/istl/comm/Makefile.am
new file mode 100644
index 000000000..30ea425e2
--- /dev/null
+++ b/doc/istl/comm/Makefile.am
@@ -0,0 +1,39 @@
+# $Id$
+
+# only build these programs if an MPI-implementation was found
+if MPI
+  MPIPROGRAMS = indexset
+endif
+
+SUFFIXES = .dvi .tex .pdf
+
+dist_pkgdata_DATA = communication.pdf communication.ps
+
+noinst_PROGRAMS = $(MPIPROGRAMS)
+
+indexset_SOURCES = indexset.cc
+indexset_CXXFLAGS = $(MPI_CPPFLAGS)
+indexset_LDADD = $(MPI_LDFLAGS)
+
+# rerun TEX if log-file suggests that
+.tex.dvi:
+	$(TEX) $*
+	while grep Rerun $*.log > /dev/null ; do \
+	  $(TEX) $* ; \
+	done
+# check if Bibtex needs to be called
+	if grep '^\\citation{' *.aux > /dev/null ; then \
+	  $(BIBTEX) $* ; \
+	  $(TEX) $* ; \
+	  while grep Rerun $*.log > /dev/null ; do \
+	    $(TEX) $* ; \
+	  done ; \
+	fi
+
+.dvi.pdf:
+	$(DVIPDF) $*
+
+.dvi.ps:
+	$(DVIPS) $*
+
+CLEANFILES = *.aux *.bbl *.blg *.log *.out *.toc *.dvi *.pdf *.ps
diff --git a/doc/istl/comm/communication.tex b/doc/istl/comm/communication.tex
new file mode 100644
index 000000000..2a4e59312
--- /dev/null
+++ b/doc/istl/comm/communication.tex
@@ -0,0 +1,193 @@
+\documentclass[11pt]{article}
+\usepackage{multicol}
+\usepackage{ifthen}
+%\usepackage{multitoc}
+%\usepackage{german}
+%\usepackage{bibgerm}
+\usepackage{amsthm}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage{color}
+\usepackage{hyperref}
+\usepackage[dvips]{epsfig}
+\usepackage[dvips]{graphicx}
+\usepackage[a4paper,body={148mm,240mm,nohead}]{geometry}
+\usepackage[ansinew]{inputenc}
+\usepackage{listings}
+\lstset{language=C++, basicstyle=\ttfamily,
+  stringstyle=\ttfamily, commentstyle=\it, extendedchars=true}
+
+\newif\ifpdf
+\ifx\pdfoutput\undefined
+\pdffalse % we are not running PDFLaTeX
+\else
+\pdfoutput=1 % we are running PDFLaTeX
+\pdftrue
+\fi
+
+\ifpdf
+\usepackage[pdftex]{graphicx}
+\else
+\usepackage{graphicx}
+\fi
+
+\ifpdf
+\DeclareGraphicsExtensions{.pdf, .jpg, .tif}
+\else
+\DeclareGraphicsExtensions{.eps, .jpg}
+\fi
+
+%\theoremstyle{plain}
+\newtheorem{theorem}{Theorem}[section]
+\newtheorem{lemma}[theorem]{Lemma}
+
+\theoremstyle{definition}
+\newtheorem{definition}[theorem]{Definition}
+\newtheorem{class}[theorem]{Class}
+\newtheorem{algorithm}[theorem]{Algorithm}
+\theoremstyle{remark}
+\newtheorem{remark}[theorem]{Remark}
+
+\newcommand{\C}{\mathbb{C}}
+\newcommand{\R}{\mathbb{R}}
+\newcommand{\N}{\mathbb{N}}
+\newcommand{\Z}{\mathbb{Z}}
+\newcommand{\Q}{\mathbb{Q}}
+\newcommand{\K}{\mathbb{K}}
+\newcommand{\loc}{\mbox{loc}}
+
+\title{Communication within the Iterative Solver Template Library (ISTL)\thanks{Part of the
+    Distributed and Unified Numerics Environment (DUNE) which is
+    available from the site
+    \texttt{http://www.dune.uni-hd.de/}}}
+
+\author{%
+Markus Blatt\\
+Interdisziplinäres Zentrum für Wissenschaftliches Rechnen,\\
+Universität Heidelberg, Im Neuenheimer Feld 368, D-69120 Heidelberg, \\
+email: \texttt{Markus.Blarr@iwr.uni-heidelberg.de}}
+
+\date{\today}
+
+\begin{document}
+
+\maketitle
+
+\begin{abstract}
+  This document describes usage and interface of the classes meant for
+  setting up the communication within a parallel programm using
+  ISTL. As most of the communication in distributed programm occur in
+  the same pattern it is often more efficient (and of course more easy
+  for the programmer) to build the communication pattern once in the
+  programm and then use multiple times (e.~g. at each iteration step
+  of an iterative solver).
+\end{abstract}
+
+\begin{multicols}{2}
+{\small\tableofcontents}
+\end{multicols}
+
+
+\section{Introduction}
+\label{sec:introduction}
+
+
+\section{Index Sets}
+\label{sec:index-sets}
+
+During distributed computations every discretization point needs to be
+indentified uniquely by every process regardless of where it is
+actually stored. In most scenarios it not advisable to store all the
+data needed for the computation on every process as memory is often a
+limiting factor in scientific computing. Therefore the data will
+distributed between the processes and each process will store only the
+data corresponding to its own part of the distribution. Due to the
+efficiency of the local commnunication is it normally best practice to
+hold the locally stored data in consecutive memory chunks.
+
+This means that for the local computation the data must be adressable
+by a consecutive index starting from 0. When using adaptive
+discretization methods there might be need to reorder the indices
+after adding and/or deleting some of the discretization
+points. Therefore this index does not have to be persistent. Further
+on  we will call this index {\em\index{local index}local index}.
+
+For the communication phases of our algorithms these locally stored
+indices must also be adressable by a global identifier to be able to
+store the received values tagged with the global identifiers at the
+correct local index in the consecutive local memory chunk. To ease the
+addition and removal of discretization points this global identifier has
+to be persistent. Further on we will call this global identifier
+{\em\index{global index}global index}.
+
+\paragraph{IndexSet}
+  Let $I \subset \N_0$ be an arbitrary, not necessarily consecutive,
+  index set identifying all discretization points of the computation.
+  
+  Further more let $(I_p)_{p\in[0,P)}$, 
+  $\bigcup\limits_{p=0}^{P-1} I_p = I$ be an overlapping decompostion of the global index set
+  $I$ into the sets of indices $I_p$ corresponding to the
+  discretization points stored locally on process $p$.
+
+  Then the 
+  \begin{lstlisting}{}
+    template<typename TG, typename TL, int N> 
+    class IndexSet;
+  \end{lstlisting} 
+  realizes the one to one mapping 
+  $$
+  \gamma_p\::\: I_p \longrightarrow I^{\loc}_p := [0, n_p)
+  $$
+  of the globally unique index onto the local index. 
+
+  The template parameter \lstinline!TG! is the type of the global
+  index and
+  \lstinline!TL! is the type of the local index, that has to be
+  convertible to \lstinline!std::size_t!, and the parameter
+  \lstinline!N! is used internally to specify the chunk size of the
+  array list.
+
+To be able to attach further information to the index the only
+prerequesite for the type of the local index is that it is convertible
+to \lstinline!std::size_t! as it it meant for adressing array
+elements.
+
+\paragraph{ParallelLocalIndex}
+When dealing with overlapping index sets in distributed computing
+there often is the need to distinguish different part of the index
+set, e.~g. mark some of the indices as owned by the process and others
+as owned by another process.
+
+This can easily be done by using the class
+\begin{lstlisting}{}
+  template<typename TA>
+  class ParlallelLocalIndex;
+\end{lstlisting}
+where the template parameter \lstinline!TA! is the type of the
+attributes used, e.~g. \lstinline!enum{owner, overlap}!.
+
+As the programmer often knows in advance which indices might also be
+present on other processes there is the possiblity to mark the index
+as public.
+
+Let us look at a short example on how to use the classes:
+
+\lstinputlisting[caption=build an index set, label=lst:build_indexset]{indexset.cc}
+\section{Remote Indices}
+\label{sec:remote-indices}
+
+
+\section{Communication Interface}
+\label{sec:comm-interf}
+
+
+\section{Communicator}
+\label{sec:communicator}
+
+
+
+\end{document}
+%%% Local Variables: 
+%%% mode: latex
+%%% TeX-master: t
+%%% End: 
diff --git a/doc/istl/comm/indexset.cc b/doc/istl/comm/indexset.cc
new file mode 100644
index 000000000..44bf5da69
--- /dev/null
+++ b/doc/istl/comm/indexset.cc
@@ -0,0 +1,72 @@
+// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+// vi: set et ts=4 sw=2 sts=2:
+// $Id$
+#include <dune/istl/indexset.hh>
+#include <dune/istl/plocalindex.hh>
+#include <iostream>
+#include "mpi.h"
+
+/**
+ * @brief Flag for marking the indices.
+ */
+enum Flag {owner, overlap};
+
+
+int main(int argc, char **argv)
+{
+  // This is a parallel programm so we need to
+  // initialize mpi first.
+  MPI_Init(&argc, &argv);
+
+  // The number of processes
+  int size;
+
+  // The rank of our process
+  int rank;
+
+  MPI_Comm_size(MPI_COMM_WORLD, &size);
+  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+  // The type used as the local index
+  typedef Dune::ParallelLocalIndex<Flag> LocalIndex;
+
+  // The type used as the global index
+  typedef int GlobalIndex;
+
+  // The index set we use to identify the local indices with the globally
+  // unique ones
+  typedef Dune::IndexSet<GlobalIndex,LocalIndex,100> IndexSet;
+
+  // The index set
+  IndexSet indexSet;
+
+  // Indicate that we add or remove indices.
+  indexSet.beginResize();
+
+  if(rank==0) {
+    indexSet.add(0, LocalIndex(0,overlap,true));
+    indexSet.add(2, LocalIndex(1,owner,true));
+    indexSet.add(6, LocalIndex(2,owner,true));
+    indexSet.add(3, LocalIndex(3,owner,true));
+    indexSet.add(5, LocalIndex(4,owner,true));
+  }
+  if(rank==1) {
+
+    indexSet.add(0, LocalIndex(0,owner,true));
+    indexSet.add(1, LocalIndex(1,owner,true));
+    indexSet.add(7, LocalIndex(2,owner,true));
+    indexSet.add(5, LocalIndex(3,overlap,true));
+    indexSet.add(4, LocalIndex(4,owner,true));
+  }
+
+  // Modification is over
+  indexSet.endResize();
+
+  // Print the index set
+  std::cout<<indexSet<<std::endl;
+
+  // Let MPI do a cleanup
+  MPI_Finalize();
+
+  return 0;
+}
-- 
GitLab