diff --git a/_toc.yml b/_toc.yml index d916c80..8159f13 100644 --- a/_toc.yml +++ b/_toc.yml @@ -34,6 +34,10 @@ parts: - file: chapter1/rules - file: chapter1/poisson - file: chapter1/boundary-conditions + - file: chapter1/geometry + sections: + - file: chapter1/analytical-mapping + - file: chapter1/discrete-mapping - caption: Linear Problems chapters: - file: chapter2/poisson diff --git a/chapter1/analytical-mapping.md b/chapter1/analytical-mapping.md new file mode 100644 index 0000000..8edc9ec --- /dev/null +++ b/chapter1/analytical-mapping.md @@ -0,0 +1,75 @@ +# Analytical Mapping +*Author: Ahmed Ratnani* + +Analytical Mappings are provided as symbolic expressions, which allow us to compute automatically their jacobian matrices and all related geometrical information. + +## Available mappings + +| SymPDE objects | Physical Dimension | Logical Dimension | Description | +| -------------- | ----------------- | ---------------- | ----------- | +| `IdentityMapping` | 1D, 2D, 3D | 1D, 2D, 3D | Identity Mapping object
$\begin{cases} x&=x_1, \\ y&=x_2, \\ z &= x_3 \end{cases} $ | +| `AffineMapping` | 1D, 2D, 3D | 1D, 2D, 3D | Affine Mapping object
$\begin{cases} x &= c_1 + a_{11} x_1 + a_{12} x_2 + a_{13} x_3, \\ y &= c_2 + a_{21} x_1 + a_{22} x_2 + a_{23} x_3, \\ z &= c_3 + a_{31} x_1 + a_{32} x_2 + a_{33} x_3 \end{cases}$| +| `PolarMapping` | 2D | 2D | Polar Mapping object (Annulus)
$ \begin{cases} x &= c_1 + (r_{min} (1-x_1)+r_{max} x_1) \cos(x_2), \\ y &= c_2 + (r_{min} (1-x_1)+r_{max} x_1) \sin(x_2) \end{cases} $ | +| `TargetMapping` | 2D | 2D | Target Mapping object
$\begin{cases} x &= c_1 + (1-k) x_1 \cos(x_2) - D x_1^2, \\ y &= c_2 + (1+k) x_1 \sin(x_2) \end{cases}$| +| `CzarnyMapping` | 2D | 2D | Czarny Mapping object
$\begin{cases} x &= \frac{1}{\epsilon}(1 - \sqrt{ 1 + \epsilon (\epsilon + 2 x_1 \cos(x_2)) }), \\ y &= c_2 + \frac{b}{\sqrt{1-\epsilon^2/4}} \frac{ x_1 \sin(x_2)}{2 - \sqrt{ 1 + \epsilon (\epsilon + 2 x_1 \cos(x_2)) }} \end{cases}$| +| `CollelaMapping2D` | 2D | 2D | Collela Mapping object
$\begin{cases} x &= 2 (x_1 + \epsilon \sin(2 \pi k_1 x_1) \sin(2 \pi k_2 x_2)) - 1, \\ y &= 2 (x_2 + \epsilon \sin(2 \pi k_1 x_1) \sin(2 \pi k_2 x_2)) - 1 \end{cases}$| +| `TorusMapping` | 3D | 3D | Parametrization of a torus (or a portion of it)
$\begin{cases} x &= (R_0 + x_1 \cos(x_2)) \cos(x_3), \\ y &= (R_0 + x_1 \cos(x_2)) \sin(x_3), \\ z &= x_1 \sin(x_2) \end{cases}$| +| `TorusSurfaceMapping` | 3D | 2D | surface obtained by "slicing" the torus above at r = a
$\begin{cases} x &= (R_0 + a \cos(x_1)) \cos(x_2), \\ y &= (R_0 + a \cos(x_1)) \sin(x_2), \\ z &= a \sin(x_1) \end{cases}$| +| `TwistedTargetSurfaceMapping` | 3D | 2D | surface obtained by "twisting" the `TargetMapping` out of the (x, y) plane
$\begin{cases} x &= c_1 + (1-k) x_1 \cos(x_2) - D x_1^2 \\ y &= c_2 + (1+k) x_1 \sin(x_2) \\ z &= c_3 + x_1^2 \sin(2 x_2) \end{cases}$| +| `TwistedTargetMapping` | 3D | 3D | volume obtained by "extruding" the `TwistedTargetSurfaceMapping` along z
$\begin{cases} x &= c_1 + (1-k) x_1 \cos(x_2) - D x_1^2, \\ y &= c_2 + (1+k) x_1 \sin(x_2), \\ z &= c_3 + x_3 x_1^2 \sin(2 x_2) \end{cases}$| +| `SphericalMapping` | 3D | 3D | Parametrization of a sphere (or a portion of it)
$\begin{cases} x &= x_1 \sin(x_2) \cos(x_3), \\ y &= x_1 \sin(x_2) \sin(x_3), \\ z &= x_1 \cos(x_2) \end{cases}$| + +## Examples + + +```python +from sympde.topology import Square +from sympde.topology import PolarMapping + +ldomain = Square('A',bounds1=(0., 1.), bounds2=(0, np.pi)) +mapping = PolarMapping('M1',2, c1= 0., c2= 0., rmin = 0., rmax=1.) + +domain = mapping(ldomain) + +x,y = domain.coordinates +``` + + +```python +mapping_1 = IdentityMapping('M1', 2) +mapping_2 = PolarMapping ('M2', 2, c1 = 0., c2 = 0.5, rmin = 0., rmax=1.) +mapping_3 = AffineMapping ('M3', 2, c1 = 0., c2 = np.pi, a11 = -1, a22 = -1, a21 = 0, a12 = 0) + +A = Square('A',bounds1=(0.5, 1.), bounds2=(-1., 0.5)) +B = Square('B',bounds1=(0.5, 1.), bounds2=(0, np.pi)) +C = Square('C',bounds1=(0.5, 1.), bounds2=(np.pi-0.5, np.pi + 1)) + +D1 = mapping_1(A) +D2 = mapping_2(B) +D3 = mapping_3(C) + +connectivity = [((0,1,1),(1,1,-1)), ((1,1,1),(2,1,-1))] +patches = [D1, D2, D3] +domain = Domain.join(patches, connectivity, 'domain') +``` + +```python +A = Square('A',bounds1=(0.2, 0.6), bounds2=(0, np.pi)) +B = Square('B',bounds1=(0.2, 0.6), bounds2=(np.pi, 2*np.pi)) +C = Square('C',bounds1=(0.6, 1.), bounds2=(0, np.pi)) +D = Square('D',bounds1=(0.6, 1.), bounds2=(np.pi, 2*np.pi)) + +mapping_1 = PolarMapping('M1',2, c1= 0., c2= 0., rmin = 0., rmax=1.) +mapping_2 = PolarMapping('M2',2, c1= 0., c2= 0., rmin = 0., rmax=1.) +mapping_3 = PolarMapping('M3',2, c1= 0., c2= 0., rmin = 0., rmax=1.) +mapping_4 = PolarMapping('M4',2, c1= 0., c2= 0., rmin = 0., rmax=1.) + +D1 = mapping_1(A) +D2 = mapping_2(B) +D3 = mapping_3(C) +D4 = mapping_4(D) + +connectivity = [((0,1,1),(1,1,-1)), ((2,1,1),(3,1,-1)), ((0,0,1),(2,0,-1)),((1,0,1),(3,0,-1))] +patches = [D1, D2, D3, D4] +domain = Domain.join(patches, connectivity, 'domain') +``` diff --git a/chapter1/discrete-mapping.md b/chapter1/discrete-mapping.md new file mode 100644 index 0000000..824fb1a --- /dev/null +++ b/chapter1/discrete-mapping.md @@ -0,0 +1,4 @@ +# Discrete Mapping +*Author: Ahmed Ratnani* + + diff --git a/chapter1/geometry.md b/chapter1/geometry.md new file mode 100644 index 0000000..a0dc6e0 --- /dev/null +++ b/chapter1/geometry.md @@ -0,0 +1,18 @@ +# Geometry +*Author: Ahmed Ratnani* + +The IGA concept relies on the fact that the geometry (domain) is divided into subdomains, and each of these subdomains is the image of a **Line**, **Square** or a **Cube** by a geometric transformation (also called a **mapping**), that we shall call a **patch** or **logical domain**. + +The following example shows a domain (half of annulus) that is the image of a logical domain using the mapping **F**. Each element (or cell) $Q$ of the logical domain is then mapped into an element $K$ of our domain, *i.e.* $K = \mathbf{F}(Q)$. + +![png](images/geometry/element.png) + +Coordinates in the logical domain are defined by the variables $\left( x_1, x_2, x_3 \right)$ while the physical coordinates are denoted by $\left( x,y,z \right)$. + +## How to define a geometry? + +Depending on your problem, you can be in one of the following situations; +- your geometry is trivial, *i.e.* it is a **Line**, **Square** or a **Cube**. In this case, just use the **SymPDE** adhoc constructors, for which you'll define the bounds. +- your geometry can be defined using an **Analytical Mapping**. See the next section. +- your geometry can be defined using a **Discrete Mapping**. See the next sections. + diff --git a/chapter1/images/geometry/element.png b/chapter1/images/geometry/element.png new file mode 100644 index 0000000..872a168 Binary files /dev/null and b/chapter1/images/geometry/element.png differ diff --git a/references.bib b/references.bib index 5c94278..e383e38 100644 --- a/references.bib +++ b/references.bib @@ -272,10 +272,6 @@ @article{simeon_2011 doi = "10.1016/j.cma.2011.09.004", url = "http://www.sciencedirect.com/science/article/pii/S0045782511002933", author = "A.-V. Vuong and C. Giannelli and B. Juttler and B. Simeon", -keywords = "Adaptivity", -keywords = "Isogeometric analysis", -keywords = "Hierarchical B-splines", -keywords = "Local refinement" } @article{Costantini_Manni_Pelosi_Sampoli_2010,