From cbfce83654679d8d88a34a4ba651cc517c1de314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Wed, 27 Apr 2022 14:19:06 +0200 Subject: [PATCH] Improve example 1 and prepare next section --- doc/userdoc.org | 104 ++++++++++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 39 deletions(-) diff --git a/doc/userdoc.org b/doc/userdoc.org index 8764d39d9..6e957604c 100644 --- a/doc/userdoc.org +++ b/doc/userdoc.org @@ -28,7 +28,7 @@ * Introduction -~pugs~[fn:pugs-def] is a general purpose solver collection designed to +~pugs~[fn:pugs-def] is a general purpose solver collection built to approximate solutions of partial differential equations. It is mainly (but not only) designed to deal with hyperbolic problems using finite-volume methods. @@ -42,7 +42,7 @@ assembled together through a high-level language (a DSL[fn:DSL-def] close to the mathematics) to build more complex solvers. This approach is inspired by the success of [[http://freefem.org][FreeFEM]], which use a similar approach. -Before detailing the leading concepts and choices we have made to +Before detailing the leading concepts and choices that we have made to develop ~pugs~, we give a simple example that should illustrate the capabilities of the code. @@ -58,7 +58,7 @@ mesh nodes according to a user defined vector field $T: \mathbb{R}^2 import writer; let pi:R, pi = acos(-1); - let theta:R^2 -> R, x -> 0.5*pi*(x[0]+1)*(x[0]-1)*(x[1]+1)*(x[1]-1); + let theta:R^2 -> R, x -> 0.5*pi*(x[0]*x[0]-1)*(x[1]*x[1]-1); let M:R^2 -> R^2x2, x -> (cos(theta(x)), -sin(theta(x)), sin(theta(x)), cos(theta(x))); let T: R^2 -> R^2, x -> x + M(x)*x; @@ -68,25 +68,31 @@ mesh nodes according to a user defined vector field $T: \mathbb{R}^2 write_mesh(gnuplot_writer("transformed", 0), m); #+END_SRC -The example is quite easy to read: -- first, some *modules* are loaded: the ~mesh~ module, which contains - some mesh manipulation functions. The ~math~ module which provides a - set of classical mathematical functions ($\sin$, $\cos$, - ...). The ~writer~ module is used to save meshes or discrete functions - to files using various formats. +The example is quite easy to read. +- First, some *modules* are loaded: the ~mesh~ module, which contains some + mesh manipulation functions. The ~math~ module provides a set of + classical mathematical functions ($\sin$, $\cos$, ...). The ~writer~ + module is used to save meshes or discrete functions to files using + various formats. - The second block of data defines variables of different kind - ~pi~ is a real value that is initialized by an approximation of $\pi$. - ~theta~ is the real value function $\theta$ defined by - $$\theta: \mathbb{R}^2 \to \mathbb{R},\quad\mathbf{x} \mapsto \frac{\pi}{2} (x_0+1)(x_0-1)(x_1+1)(x_1-1) $$ + \begin{equation*} + \theta: \mathbb{R}^2 \to \mathbb{R},\quad\mathbf{x} \mapsto + \frac{\pi}{2} (x_0^2-1)(x_1^2-1) + \end{equation*} - ~M~ is the $\mathbb{R}^{2\times2}$ matrix field $M$ defined by - $$M: \mathbb{R}^2 \to \mathbb{R}^{2\times2},\quad\mathbf{x} \mapsto \begin{pmatrix} - \cos(\theta(\mathbf{x})) & -\sin(\theta(\mathbf{x})) \\ - \sin(\theta(\mathbf{x})) & \cos(\theta(\mathbf{x})) - \end{pmatrix}$$ + \begin{equation*} + M: \mathbb{R}^2 \to \mathbb{R}^{2\times2},\quad\mathbf{x} \mapsto + \begin{pmatrix} + \cos(\theta(\mathbf{x})) & -\sin(\theta(\mathbf{x})) \\ + \sin(\theta(\mathbf{x})) & \cos(\theta(\mathbf{x})) + \end{pmatrix} + \end{equation*} - ~T~ is the vector field $T$ defined by - $$ - T: \mathbb{R}^2 \to \mathbb{R}^2, \quad\mathbf{x} \mapsto (I+M(\mathbf{x}))\mathbf{x} - $$ + \begin{equation*} + T: \mathbb{R}^2 \to \mathbb{R}^2, \quad\mathbf{x} \mapsto (I+M(\mathbf{x}))\mathbf{x} + \end{equation*} - Finally ~m~ is defined as the uniform Cartesian mesh grid of $]-1,1[^2$. The last argument: ~(20,20)~ sets the number of cells in each direction: $20$. @@ -95,7 +101,7 @@ The example is quite easy to read: variable ~m~, the old one was not modified in the process. It is important to already have in mind that the ~pugs~ language *does not allow* the modifications of values of *non-basic* types. This is - discussed in the section [[basics]]. + discussed in the section [[variable-types]]. - Finally, the last block consists in saving the obtained mesh in a ~gnuplot~ file. The result is shown on Figure [[fig:intro-example]]. @@ -117,31 +123,51 @@ The example is quite easy to read: #+ATTR_HTML: :width 300px; #+RESULTS: intro-transform-mesh-img -* Basics<<basics>> +Even if this first example is very simple, some key aspects can +already be discussed. +- There is no predefined constant in ~pugs~. Here a value is provided + for ~pi~. +- There are two kinds of variable in ~pugs~: variables of basic types + and variable of high-level types. This two kinds of variable behave + almost the same but one must know their differences to understand + better the underlying mechanisms and choices that we made. See + [[variable-types]] for details. +- Also, there are two types of function: *user-defined* functions and + *builtin* functions. In this example, ~theta~, ~M~ and ~T~ are user-defined + functions. All other functions (~cos~, ~cartesian2dMesh~,...) are + builtin functions and are generally defined when importing a + module. These functions behave similarly, one should refer to + [[functions]] for details. +- The language does not allow low-level manipulations of high-level + type variables. This means that for instance, one cannot modify a + specific cell value of a piecewise constant function. This allows to + write algorithms (within the pugs language) that can be executed in + parallel naturally. Observe that the resulting mesh of the previous + does not depend on the number of ~MPI~ processes nor on the number of + threads used while running ~pugs~. -** Hello world! +* Language + +** Variables + +*** Types<<variable-types>> + +**** Basic types + +**** High-level types + +*** Life time + +** Statements + +** Functions<<functions>> + +*** User-defined functions + +*** Builtin functions -*** Python -#+BEGIN_SRC python :exports both :results output - print ("hellow orld!") -#+END_SRC -*** Pugs -In this simple example, one defines the function $f:\mathbb{R} \to \mathbb{R}, x \mapsto 2\sin(x)$ -#+NAME: hello-world -#+BEGIN_SRC pugs :exports both :results output - import math; - let f: R -> R, x -> 2*sin(x); - cout << "Hello world!\n"; - cout << "f(12) = " << f(12) << "\n"; -#+END_SRC -Then one prints ~Hello world!~ and the evaluation of $f$ at position $12$. -#+RESULTS: hello-world -* The end -#+BEGIN_SRC python :exports both :results output - print ("hello world!") -#+END_SRC [fn:pugs-def] ~pugs~: Parallel Unstructured Grid Solvers [fn:MPI-def] ~MPI~: Message Passing Interface -- GitLab