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/3709253c49b87436b9b3a93c4f0883831e264b518e8a1f72f3d1929eb5150722.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/0bc90df163988c22fef0246c261aaca1d1197a8af4ce3fadfd0eb6a041c0dc7f.png
Named boundaries invalidated by a call to Mesh.refined()
Error  0: -0.0009402,	Elements:        484	Selected: 8
../../_images/04b087232fab78ea928785ac99415576507cb5fd24323c35793d5096395e01f6.png ../../_images/724ca7691d52e60c764f0691638cd2be4a7d431d81bf12d93936e9ef603db660.png
Error  1: -0.0009728,	Elements:        534	Selected: 26
../../_images/9a100a7b5f72e030fedb8ef1cb86779029104d13c11d13d1d20362a6d0d29858.png ../../_images/9e7c172056726bf740492b1bb2bc7deaedb793a3b2e849dddc78244266e09db2.png
Error  2: -0.0009282,	Elements:        697	Selected: 11
../../_images/ebd7fdc73b516ffee3988976a0e6fb2341ad6e3fce425bf95b99d0c0829bd8ae.png ../../_images/544744f41b91fa385b84fccf7f0f75e659828205c821ccae13b4ebb128576b6b.png
Error  3: -0.0008647,	Elements:        778	Selected: 72
../../_images/41f965d4f8aaa96d1ab7d25d6abcc099e957cdc7c2eeb07a0518f33e67dd8ee8.png ../../_images/0bffb177502af29c4069febe5434f1217a4854cb82c5fbf06d613bb8354ae578.png
Error  4: -0.0005305,	Elements:       1174	Selected: 44
../../_images/007f37f0e9e8cb05815061bd919b8b5db48a7a606e08ad38d45b3eaf4a617de3.png ../../_images/5b6129df2b3a684499cac924d76044387079c13a8efb067005c68ab0cf060ae8.png
Error  5: -0.0004795,	Elements:       1442	Selected: 120
../../_images/06952f217015a25699612f7d3662d8465e64776f517fc458dc4380e9ec3d0847.png ../../_images/43ab8fd40cdb8f6d957a40b700e30337f30af330b4f6d4909e24f60a01737a72.png
Error  6: -0.0003474,	Elements:       2147	Selected: 100
../../_images/aa6a0a554694ef6ae3d9eb17d616872173a172d45c1c0a1469cd6e342b52b6b5.png ../../_images/a57968b8fc9a6930bb52265d694be4b3166b401347addc3bcac11feb49728494.png
Error  7: -0.0002198,	Elements:       2732	Selected: 248
../../_images/b515ad2de348241947c29346d7937ca6fed03df66163e36812976c9442bd14e4.png ../../_images/a67270550de840b311f5a1cea34b233847b86a4e24589f62fa5bf6af6a1c091f.png
Error  8: -0.0001822,	Elements:       4046	Selected: 247
../../_images/3bcdca42a6d251dbf7edd3533877e71a3f791c6d0ec9e3ed19b44499c62f139c.png ../../_images/00eaa214836edb2f69aca0f2dd077c532b4def47452bc916a37b6fddce0a3f54.png
Error  9: -0.0001337,	Elements:       5551	Selected: 482
../../_images/9eca9b7d0fd19dbd9fcfbe96c8066284837344a43db1a584b68c99318a128bcc.png ../../_images/ddd73e07e1fcd7a4f33f30f7bd782a8e962f85b68977127c3005f8103521c01c.png
Error 10: -0.0000891,	Elements:       8213	Selected: 488
../../_images/6ccfc61c575916931c431378690f87b7525323b9d94fe41ed49160359ff3f14f.png ../../_images/bc12c52c7cd1eb3e4d5f73b7fa3d10ace775b6e8b30e84d24fa7713a75809472.png
Error 11: -0.0000643,	Elements:      11156	Selected: 994
../../_images/0a48e97fd2cce5f875029038ff8a609a60f19f288e38a5b7f6bcc3a80622889e.png ../../_images/bea042b925711fc136e15e8c7c2c246011775e884d956eaec443d7c9490250fd.png
Error 12: -0.0000486,	Elements:      16390	Selected: 853
../../_images/7fddb2ac4b61d334a222dc046fde17d6958c152815bf72ffc3538f081e537cf9.png ../../_images/6a3c9476ae89ad596ab83ff7419ea44a7244f25cd107c2f36e56d7e9bc97424b.png
Error 13: -0.0000372,	Elements:      21480	Selected: 1874
../../_images/6b4ceeb9e9b5432f2126a5edb6cef6b9efafa777f1a3c101b7831c5550cc34da.png ../../_images/a83822e909bb2cb4b919692d086f0884a9cec0da8bb6f4770d887fb390b2538c.png
Error 14: -0.0000250,	Elements:      31266	Selected: 1417
../../_images/d595ae065631a6e29693ed4d14d22149441011f41cb4bf152c13f3d760b12f53.png ../../_images/18d54ded00f560af2aca15328af4312a0d122b5f22a7c580fe4611615079b71c.png
Error 15: -0.0000200,	Elements:      40060	Selected: 2756
../../_images/b016dee824941b9c6857bd31d87684f693f987377d60efea27c71ebbb9a983a0.png ../../_images/ca605e9d9cd06edc5c2e4d4f1f6a04e675f9635970674723456c6241096912e8.png
Error 16: -0.0000140,	Elements:      54708	Selected: 4203
../../_images/8116af45408d59ce496fb15509b7e5351fe39c51739c2606f9d0a96af0429ff9.png ../../_images/2577544a85648427ba4e583a9ea8cbcdafe7ac050d20c2801e995104046a568b.png
Error 17: -0.0000108,	Elements:      78269	Selected: 3754
../../_images/e963765730948cdcbc490107a2df7dd3459cd9af7d4947c434d86b7d59acd90c.png ../../_images/5d6d40619779e3a93e4ee159f1c1ddb9c9d78ab4f7ac84a7fa2294f362a043e0.png
Error 18: -0.0000079,	Elements:      99379	Selected: 6361
../../_images/8bf8078cb1468ec373a1e2dddf90c488da48daa84681e766a66e9ce245d46664.png ../../_images/0bf543287fc80652570b1996ce505ec3110f42889ee2c6b320a470d01ec886c6.png
Error 19: -0.0000062,	Elements:     133490	Selected: 7457
../../_images/ff20b1a069d6e77b9140f260e3a25dca3a56c8590cf2166c03bd4ff856947c7f.png ../../_images/7f6a062e838252c47339244c8ab8887b6b192d6611115c74632cae0fba8169b8.png