UC Berkeley Math 228B, Spring 2024, Problem Set 3
Per-Olof Persson
persson@berkeley.edu
Due March 1
This content is protected and may not be shared, uploaded, or distributed.
Show that linear Transfinite Interpolation for a 2D domain with straight sides (that is, a quadrilateral) is equivalent to bilinear interpolation between its four corner points.
Consider the domain \(\Omega\) bounded by the four curves: \[\begin{aligned} x_\mathrm{left} &= 0 \\ x_\mathrm{right} &= 1 \\ y_\mathrm{bottom}(x) &= 64Ax^3(1 - x)^3 \\ y_\mathrm{top}(x) &= 1 + Ax^3(6x^2 - 15x + 10) \end{aligned}\] where \(A=0.4\). The goal is to find mappings of the form \((x,y)=\boldsymbol{R}(\xi,\eta)\) from the unit square to \(\Omega\) using Transfinite Interpolation (TFI).
Create the mapping using TFI with linear Lagrange interpolation. Implement your function as a Julia function with the syntax
xy = tfi_linear(ξη)
Note that the input \(\xi\eta\) and the output
xy
are both vectors of length 2. Illustrate the mapping by plotting a structured grid of size \(40\times 40\) with theplot_mapped_grid
function from the mesh utilities notebook on the course webpage.Create the mapping using TFI with cubic Hermite interpolation. Use the extra degrees of freedom to produce a mapping with boundary orthogonality. That is, find \((x,y) = \boldsymbol{R}(\xi,\eta)\) such that in addition to mapping the unit square to \(\Omega\), it also has the properties that $$
\[\begin{aligned} \frac{\partial \boldsymbol{R}}{\partial \xi} &= T\boldsymbol{n}_\mathrm{leftright}\text{ at }\xi=0\text{ and }\xi=1 \\ \frac{\partial \boldsymbol{R}}{\partial \eta} &= T \boldsymbol{n}_\mathrm{bottom}(\xi)\text{ at }\eta=0\text{ and } \frac{\partial \boldsymbol{R}}{\partial \eta} = T \boldsymbol{n}_\mathrm{top}(\xi)\text{ at }\eta=1 \end{aligned}\]$$ where \(T\) is a parameter, \(\boldsymbol{n}_\mathrm{leftright}=[1,0]\) is the normal vector on the left and the right boundaries, and \(\boldsymbol{n}_\mathrm{bottom}(\xi),\boldsymbol{n}_\mathrm{top}(\xi)\) are the unit normal vectors on the bottom and the top boundaries, respectively (directed in the positive \(\eta\) direction). Implement the mapping in Julia as
xy = tfi_orthogonal(ξη)
and illustrate it by plotting a structured grid of size \(40\times 40\) with \(T=1/2\). Hint: While you could derive the full Hermite TFI form, for this particular problem it is sufficient to determine \(\boldsymbol{R}\) and its derivative \(\boldsymbol{R}_\eta\) on the bottom/top boundaries and only use Hermite interpolants in \(\eta\): \[\begin{aligned} \hat{\boldsymbol{R}}(\xi,\eta) = \Pi_\eta\boldsymbol{R} = \Big[ \boldsymbol{R}(\xi,0), \boldsymbol{R}(\xi,1), \boldsymbol{R}_\eta(\xi,0), \boldsymbol{R}_\eta(\xi,1) \Big] \cdot \Big[ H_0(\eta), H_1(\eta), \tilde{H}_0(\eta), \tilde{H}_1(\eta) \Big] \end{aligned}\]
Find the image of the rectangle \(0\le \mathrm{Re}(z)\le 1\), \(0\le \mathrm{Im}(z)\le 2\pi\) under the mapping \[\begin{aligned} w = \frac{2e^{z} - 3}{3e^{z} - 2} \end{aligned}\] and describe it in words or in mathematical notation (with full derivation, not just a plot). Use this to generate a structured grid of size \(20\times 80\) for this region with grid lines that are orthogonal everywhere.
Write a Julia function with the syntax
p, t, e = pmesh(pv, hmax, nref)
which generates an unstructured triangular mesh of the polygon with vertices
pv
, with edge lengths approximately equal to \(h_\mathrm{max}/2^{n_\mathrm{ref}}\), using a simplified Delaunay refinement algorithm. The outputs are the node pointsp
(\(N\)-by-2), the triangle indicest
(\(T\)-by-3), and the indices of the boundary pointse
.The 2-column matrix
pv
contains the vertices \(x_i,y_i\) of the original polygon, with the last point equal to the first (a closed polygon).First, create node points along each polygon segment, such that all new segments have lengths \(\le h_\mathrm{max}\) (but as close to \(h_\mathrm{max}\) as possible). Make sure not to duplicate any nodes.
Triangulate the domain using the
delaunay
function in the mesh utilities.Remove the triangles outside the domain (see the
inpolygon
command in the mesh utilities) as well as the almost degenerate triangles having an area less than \(\varepsilon=10^{-12}\).Find the triangle with largest area \(A\). If \(A>h_\mathrm{max}^2/2\), add the circumcenter of the triangle to the list of node points.
Retriangulate and remove outside triangles (steps (c)-(d)).
Repeat steps (e)-(f) until no triangle area \(A>h_\mathrm{max}^2/2\).
Refine the mesh uniformly \(n_\mathrm{ref}\) times. In each refinement, add the center of each mesh edge (see
all_edges
) to the list of node points, and retriangulate.
Finally, find the nodes
e
on the boundary using theboundary_nodes
function. The following commands create the example in the figures. Also make sure that the function works with other inputs, that is, other polygons, \(h_\mathrm{max}\), and \(n_\mathrm{ref}\).pv = [0 0; 1 0; .5 .5; 1 1; 0 1; 0 0] p, t, e = pmesh(pv, 0.2, 1) tplot(p, t)
Code Submission: Your Julia file needs to define the
functions tfi_linear
, tfi_orthogonal
, and
pmesh
, with exactly the requested names and input/output
arguments, as well as any other supporting functions and variables that
are required for your functions to run correctly.