Very new FEniCS user here, in way over my head with a tricky problem. I’ve been tasked with modifying some previously written FEniCS code (which solves for an electric field) to implement an absorbing boundary layer, and if I understand the theory correctly, I can do this by defining the absorbing layers as having a complex permittivity tensor that is spatially dependent. The code I’m modifying is using the 2019.1.0 version.
Currently the code includes a region of free space and a region with a dielectric scalar value, and the dielectric values are set using this class:
def __init__(self, markers, **kwargs): super(Permittivity, self).__init__(**kwargs) self.markers = markers def eval_cell(self, values, x, cell): if self.markers[cell.index] == 0: # this (subdomain 0) is free space values = 1.0 # vacuum elif self.markers[cell.index] == 1: # this (subdomain 1) is dielectric material values = diel else: values = 1.0 # there shouldn't be any other domains, included just in case def value_shape(self): return ()
This code is then called in the main function like this (mesh is generated using mshr):
mesh = generate_mesh(domain, 150)
subdomains = MeshFunction(‘size_t’, mesh, 2, mesh.domains())
eps_r = Permittivity(subdomains, degree=1)
I think I get how to define the needed subdomains for my absorbing boundary layers, but what I’m not sure about is how to modify the above code to implement a spatially dependent dielectric tensor instead of just a scalar value (of course, the other issue is working around the fact that this version doesn’t support complex numbers, as this code is complicated enough I don’t want to try converting it into FEniCSx, but I’m guessing that’s a separate question). I’ve tried reading the documentation on the Expression class, checking potentially related forum posts, and reaching out to the writer of the original code, but I haven’t gotten anywhere. Could anybody point me in the right direction?
Apologies if this is a dumb question, or if it’s in the wrong category, etc.