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/cc94bf4bbeff9c7b68282efbdac2f8534e803abfc3a12f14a8b06e37daa27461.png
Error  1: -0.0009728,	Elements:        534	Selected: 26
../../_images/9a100a7b5f72e030fedb8ef1cb86779029104d13c11d13d1d20362a6d0d29858.png ../../_images/db28c515e35121976078f35ac033fa1771c385192222daa1cb2732d2533bed5d.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/1173c78023a8721b66b41850469edd4b879adb942dc1a3fc61ebe88eb2f6a30d.png
Error  4: -0.0005305,	Elements:       1174	Selected: 44
../../_images/007f37f0e9e8cb05815061bd919b8b5db48a7a606e08ad38d45b3eaf4a617de3.png ../../_images/f625a6805fdb194659da7f689d1c6260423fc353760a6e2426b1fc437bef18f4.png
Error  5: -0.0004795,	Elements:       1442	Selected: 120
../../_images/06952f217015a25699612f7d3662d8465e64776f517fc458dc4380e9ec3d0847.png ../../_images/fde15e1aa94dc5cb36d33af8c6c1f1084aa076c5839749e3443a056f3aa26cba.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/606bdb11d44e6df729c757ea83a473eb34bc6e1c691ffa9a9108cd3b0d0e7917.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/26f8c7bb9d4a1bef05e12a58d51811c71d1dd34d4df41df084a307036d8538fb.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/1e6d14ab8ebc4885148130459a52632bacdeaad972d137436460ef608155aaaa.png
Error 15: -0.0000200,	Elements:      40060	Selected: 2756
../../_images/b016dee824941b9c6857bd31d87684f693f987377d60efea27c71ebbb9a983a0.png ../../_images/2871f8a018a5b4c5c9102c30d0d5255049fd8b4b391a0149450fabee5aaa44ab.png
Error 16: -0.0000140,	Elements:      54708	Selected: 4203
../../_images/8116af45408d59ce496fb15509b7e5351fe39c51739c2606f9d0a96af0429ff9.png ../../_images/066db2d7ea8b06ea271e229446c73170acd80a2b243acafd791d1b8f0d72daa1.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/265035eac8f2cda35a711d78dd55ebfa286b21d0aca67acb4bb6de95430e37ae.png
Error 19: -0.0000062,	Elements:     133490	Selected: 7457
../../_images/ff20b1a069d6e77b9140f260e3a25dca3a56c8590cf2166c03bd4ff856947c7f.png ../../_images/7f6a062e838252c47339244c8ab8887b6b192d6611115c74632cae0fba8169b8.png