qiskit-community / qiskit-metal

Quantum Hardware Design. Open-source project for engineers and scientists to design superconducting quantum devices with ease.
https://qiskit-community.github.io/qiskit-metal/
Apache License 2.0
272 stars 201 forks source link

Gmsh Renderer creates `ground_plane` physical group even when it does not exist #872

Closed diemilio closed 1 year ago

diemilio commented 1 year ago

Information

What is the current behavior?

By default, Qiskit Metal generates a ground plane from the edge of the die to the edge of a "substract" geometry. There are situations in which a user might want to completely remove the ground plane as shown below: gnd_plane_issue

Right now, Gmsh Renderer generates a label for a ground plane in each layer irrespective of wether a ground plane exists or not. This causes issues later on when trying to simulate the structure in ElmerFEA.

Steps to reproduce the problem

The code below generates a geometry without a ground plane and prints the physical groups generated by Gmsh Renderer showing the item ground_plane_(layer 1), which should not have been generated:

from qiskit_metal import designs
from qiskit_metal.qlibrary.sample_shapes.rectangle import Rectangle
from qiskit_metal.renderers.renderer_elmer.elmer_renderer import QElmerRenderer

design = designs.MultiPlanar({}, overwrite_enabled=True, layer_stack_filename="parallel_cap_layer_stack.txt")

design.chips.main.size.size_x = '1mm'
design.chips.main.size.size_y = '1mm'
design.variables.sample_holder_top = '150um'
design.variables.sample_holder_bottom = '100um'

plate_1 = { 'height': '50um',
            'width': '50um',
            'pos_x': '-27.5um',
            'pos_y': '0',
            'orientation': '0',
            'subtract': 'False',
            'helper': 'False',
            'chip': 'main',
            'layer': '1' }

plate_2 = { 'height': '50um',
            'width': '50um',
            'pos_x': '27.5um',
            'pos_y': '0',
            'orientation': '0',
            'subtract': 'False',
            'helper': 'False',
            'chip': 'main',
            'layer': '1' }

gap = { 'height': '1mm',
        'width': '1mm',
        'pos_x': '0',
        'pos_y': '0',
        'orientation': '0',
       'subtract': 'True',
        'helper': 'False',
        'chip': 'main',
        'layer': '1' }

Rectangle(design, 'plate_1', plate_1)
Rectangle(design, 'plate_2', plate_2)
Rectangle(design, 'gap', gap)

elmer_renderer = QElmerRenderer(design, layer_types=dict(metal=[1],dielectric=[2]))
elmer_renderer.gmsh.options.mesh.min_size = "5um"
elmer_renderer.gmsh.options.mesh.max_size = "50um"

elmer_renderer.render_design(skip_junctions=True)

print(dict(elmer_renderer.gmsh.physical_groups))

What is the expected behavior?

No label should be assigned to ground planes that do not exist.

Suggested solutions