Mesh refinement

Mesh refinement#

Hide code cell source

from collections import OrderedDict

import matplotlib.pyplot as plt
import numpy as np
import shapely
import shapely.affinity
from skfem import Basis, ElementTriP0, adaptive_theta
from skfem.io.meshio import from_meshio

from femwell.maxwell.waveguide import compute_modes
from femwell.mesh import mesh_from_OrderedDict
polygons_paper = OrderedDict(
    left=shapely.LineString(((0, 0), (0, 1))),
    right=shapely.LineString(((1, 0), (1, 1))),
    top=shapely.LineString(((0, 1), (1, 1))),
    core=shapely.box(0, 0, 0.5, 0.5),
    clad=shapely.box(0, 0, 1, 1),
)

boundaries = [
    [lambda x: x[0] == np.min(x[0]), lambda x: x[0] == np.max(x[0])],
    [lambda x: x[0] == np.min(x[0]), lambda x: x[0] == np.max(x[0])],
    [lambda x: x[0] == np.min(x[0]), lambda x: x[1] == np.max(x[1])],
    [lambda x: x[0] == np.min(x[0]), lambda x: x[1] == np.max(x[1])],
]

epsilons_paper = [
    {"core": 2.25, "clad": 1},
    {"core": 8, "clad": 1},
    {"core": 1, "clad": 2.25},
    {"core": 1, "clad": 8},
]

neff_values_paper = [1.27627404, 2.65679692, 1.387926425, 2.761465320]
num = 1

mesh = from_meshio(
    mesh_from_OrderedDict(polygons_paper, {}, default_resolution_max=0.08, filename="mesh.msh")
)
mesh.draw().show()
../../_images/e1ba967134c2fdc632a0653546bf8ea93521f9be2e9fb008a7cca82b5c7cd4b7.png
errors = []
nelements = []

for i in range(20):
    basis0 = Basis(mesh, ElementTriP0())
    epsilon = basis0.zeros()
    for subdomain, e in epsilons_paper[num].items():
        epsilon[basis0.get_dofs(elements=subdomain)] = e

    modes = compute_modes(
        basis0, epsilon, wavelength=1.5, order=1, metallic_boundaries=boundaries[num]
    )
    modes[0].plot(modes[0].E.real, direction="x")
    plt.show()
    error = modes[0].n_eff.real - neff_values_paper[num]
    errors.append(error)
    nelements.append(mesh.nelements)
    elements_to_refine = adaptive_theta(modes[0].eval_error_estimator(), theta=0.5)
    print(
        f"Error {i:2d}: {error: .7f},\tElements: {mesh.nelements:10d}\tSelected: {len(elements_to_refine)}"
    )

    fig, ax = plt.subplots(1, 2)
    for a in ax:
        a.set_aspect("equal")
    mesh.draw(ax=ax[0])
    mesh_restricted = mesh.restrict(elements=elements_to_refine)
    mesh_restricted.draw(color="red", linewidth=2, ax=ax[0])
    mesh = mesh.refined(elements_to_refine)
    mesh.draw(ax=ax[1])
    mesh_restricted.draw(color="red", linewidth=2, ax=ax[1]).show()

fig, axs = plt.subplots(2, 1)
axs[0].plot(errors, label="Error")
axs[0].axhline(y=0, color="r", linestyle="-")
axs[0].set_ylabel("Error")
axs[1].plot(nelements)
axs[1].semilogy()
axs[1].set_xlabel("Iteration")
axs[1].set_ylabel("Number of elements")
plt.show()
../../_images/d0c9b984697ed0deb2c793dfa4b8833dd2b73cd5cd525702994c090e96d15be2.png
Named boundaries invalidated by a call to Mesh.refined()
Error  0: -0.0009402,	Elements:        484	Selected: 8
../../_images/a62ba709ec8650b96922b1a8db7cd5f7a19b8fa9c29d3d40ba9cb7a684ef342d.png ../../_images/7f1a3c68249e47b331d1efc5a0b02a51f2ee829a2ebcad78ccecf0b139e45352.png
Error  1: -0.0009728,	Elements:        534	Selected: 26
../../_images/2219e5ccabbc232b77ab117d9e1014a591037264fa3a108606783020b559c178.png ../../_images/f75b12fa0a44dafa2b835f7fbab8fb5ff2bc82ed52cce658a71a2c59fe4612b3.png
Error  2: -0.0009282,	Elements:        697	Selected: 11
../../_images/4b71df31f6262cfc3c9e08c3d22646667f7652e2f3e102060e4438d5f1026249.png ../../_images/8fd11168bf507ee674b47f794d939368dcd7c94453d1b7dffb009c3da805c8fe.png
Error  3: -0.0008647,	Elements:        778	Selected: 72
../../_images/1e028f42866745b3c2074bd3019b72a5f2fa82b6fce4de30bb6092be0fe0d5d8.png ../../_images/e2496feb61b03cd4633d88efc08ae46ccf64df2afb039525fb403b001e398e92.png
Error  4: -0.0005305,	Elements:       1174	Selected: 44
../../_images/8628ec3f1f1c1a45850bdd1e6a4b2d92e4285fd07ecbb52a858db2b27537a926.png ../../_images/4b6763bdd5e113ed9b1b78056fa41ca26a31cf166d01deb39a9823f66a3bb0fa.png
Error  5: -0.0004795,	Elements:       1442	Selected: 120
../../_images/7cfe9dd1c82d1c4d2f7c025149310a1777c4110ef245009bba69513f25baa877.png ../../_images/257e8523d834c9af0eebd7ecd1b1efb002336fa39c490ca4e93d009c2b91f9b0.png
Error  6: -0.0003474,	Elements:       2147	Selected: 100
../../_images/567e38c10b2306fa6717c7f9fedf6af74bca70f65bab475f3b1dd78298a74ef0.png ../../_images/8f9f5a41c7a919f080f1f1f131a821dcb58946616be827184aace0192a850c55.png
Error  7: -0.0002198,	Elements:       2732	Selected: 248
../../_images/7a2d091dd243ea7639419ffcbb3483e793e08b51bc6e1500578e014d182e1ddc.png ../../_images/1aea9164c0369ae04f4c63f01856d1b5329ba60a53338406d95ff70c3d86e681.png
Error  8: -0.0001822,	Elements:       4046	Selected: 247
../../_images/776cc55b03c1a28ea039957a1503995bc8480b32e550ce09b3f15936cb5a50b3.png ../../_images/600027fdbc51f5629d0c208ba7fb6945ea0ee04ec43d824e6c20ebbe1cd08604.png
Error  9: -0.0001337,	Elements:       5551	Selected: 482
../../_images/d5e0566701359f1c7dda65239e3807fc64b277273273b215e19ef18b88ad585b.png ../../_images/b4943f68b1fc1be4f8b4aec4bf8cd0447817a4cdd41d5444447710172245ef17.png
Error 10: -0.0000891,	Elements:       8213	Selected: 488
../../_images/23ea37cb4c8921bd607d87fac73bc8c1782421698d2cc8f9345c778c6cd2fe94.png ../../_images/2ce6622bed7ae21e9903e091e85048c1ceb05760d9799eefb749aa8ba6542606.png
Error 11: -0.0000643,	Elements:      11156	Selected: 994
../../_images/3091fb8650254273ca0311c854a1797f4801dc17a0fd531cd597039bee426e32.png ../../_images/86ccc804feb58578686a086bfd04ea41726ba5d4ee211b03140754c7024599b6.png
Error 12: -0.0000486,	Elements:      16390	Selected: 853
../../_images/b5a8019bf15a8e7f1f7f6d8e7ca514d185a824fdf22073b17d8a17fdb34b4896.png ../../_images/3211bb2a94a2ad9d99a81d4558339042648bfe3629d9f8e2511678a2a92e3b45.png
Error 13: -0.0000372,	Elements:      21480	Selected: 1874
../../_images/6b30196d5a8f235d95e919d305f2e900e761ad1de65e5e98b5a44003ce4a5d3f.png ../../_images/5ea0cd039709ad82c2c9100a72b4e0bb35fcad989e4623757ed3b75a56543330.png
Error 14: -0.0000250,	Elements:      31266	Selected: 1417
../../_images/a7d79599f6fbd922f215d48eb085d5677197c860f2965c7bcf27fb043a614fba.png ../../_images/02c96600eb1c85d5c47e0d7fdcbffc31fbbdcdba862c534e7f6e3f4d497cf01e.png
Error 15: -0.0000200,	Elements:      40060	Selected: 2756
../../_images/df572533c665c2e740f6ad49ca9bba35a6cf2667317997c6273af337378f78f2.png ../../_images/e17eabb4d2770f130e1fd7b3ca782e289d77ac5cfddb1b3c06cab63928d3d647.png
Error 16: -0.0000140,	Elements:      54708	Selected: 4203
../../_images/7e6a49eeacc6c42e1f4e2de34d6047fadb534adcaf66266301d59255d0ff81ff.png ../../_images/cb1d5eff6d996447706bab79672a9940e4031b2a9d7898311816dccf0a321bc4.png
Error 17: -0.0000108,	Elements:      78269	Selected: 3754
../../_images/b8cad253c891314fc8f177e002f1d1ac69cb6d5d9643862c894067a58d912e2a.png ../../_images/e8f80d457f806f87a21328027d946723af5e27a9277cfca2258fc45e4cd4bc96.png
Error 18: -0.0000079,	Elements:      99379	Selected: 6361
../../_images/23b85fd450f47c3b648ff9b73d6f2af5fff1e9a2b09dedbf98d9d921ad5424a1.png ../../_images/0186585aec40e0396e0ccfaa600144b3b3feb92a9c9250a2685159549f634b7a.png
Error 19: -0.0000062,	Elements:     133490	Selected: 7457
../../_images/13e782a09eb021ada5282f8bb35d3d763a799d40baa8816b4f79506f0ff24795.png ../../_images/d211e16fdc2bc7071877de73946bd2377fcf76ba60f5b9b37ae6c40cac159568.png