|
ViennaLS
|
Functions | |
| int | to_index (float x) |
| None | write_surface (level_set, str file_name) |
Variables | |
| int | USE_GPU = "gpu" |
| float | GRID_DELTA = 0.01 |
| float | X_EXTENT = 1.0 |
| float | Y_MIN = -1.0 |
| float | Y_MAX = 2.0 |
| float | PAD_OXIDE_THICKNESS = 0.03 |
| float | MASK_THICKNESS = 0.05 |
| float | MASK_EDGE = 0.0 |
| float | ADVECTION_TIME = 0.1 |
| float | TIME_STEP = 0.01 |
| int | MASK_CONTACT_EPS = 1.e-6 |
| list | bounds = [-X_EXTENT, X_EXTENT, Y_MIN, Y_MAX] |
| list | bcs |
| si_interface = vls.Domain(bounds, bcs, GRID_DELTA) | |
| ambient_interface = vls.Domain(si_interface) | |
| si_initial = vls.Domain(si_interface) | |
| ambient_initial = vls.Domain(ambient_interface) | |
| mask_interface = vls.Domain(bounds, bcs, GRID_DELTA) | |
| mask_geom | |
| ox_params = vls.OxidationPresets.wet1000CDealGrove100() | |
| velocitySign | |
| maskTransferCoefficient | |
| maskConcentration | |
| maxIterations | |
| tolerance | |
| def_params = vls.OxidationPresets.oxideMechanics1000C(TIME_STEP) | |
| coupling_params = vls.OxidationCouplingParameters() | |
| relaxation | |
| mask_params = vls.OxidationPresets.siliconNitrideMask1000C() | |
| list | diff_min = [to_index(-X_EXTENT), to_index(Y_MIN)] |
| list | diff_max = [to_index(X_EXTENT), to_index(Y_MAX)] |
| list | mask_min = [to_index(-X_EXTENT), to_index(PAD_OXIDE_THICKNESS) - 1] |
| list | mask_max = [to_index(MASK_EDGE), to_index(PAD_OXIDE_THICKNESS + MASK_THICKNESS) + 1] |
| locos = vls.Oxidation(si_interface, ambient_interface, mask_interface) | |
| float | elapsed = 0.0 |
| float | time_eps = ADVECTION_TIME * 1.e-8 |
| dt = min(TIME_STEP, ADVECTION_TIME - elapsed) | |
| diffusion = locos.getDiffusionField() | |
| deformation = locos.getDeformationField() | |
| mask_bending = locos.getMaskBendingField() | |
| list | open_pt = [0.5, GRID_DELTA, 0.] |
| list | masked_pt = [-0.5, GRID_DELTA, 0.] |
| list | normal_up = [0., 1., 0.] |
| open_conc = diffusion.getConcentration(open_pt) | |
| masked_conc = diffusion.getConcentration(masked_pt) | |
| open_si_speed = abs(diffusion.getScalarVelocity(open_pt, 0, normal_up, 0)) | |
| masked_si_speed = abs(diffusion.getScalarVelocity(masked_pt, 0, normal_up, 0)) | |
| tuple | suppression_ratio = (masked_si_speed / open_si_speed) if open_si_speed > 0. else 0. |
| file | |
| newline | |
| writer = csv.writer(f) | |
| list | coord = [i * GRID_DELTA, j * GRID_DELTA, 0.] |
| vel = deformation.getVelocity(coord) | |
| list | normal_dn = [0., -1., 0.] |
| dict | mask_pts |
| dict | vels |
| mask_bottom_pressure = deformation.getPressure(mask_pts["bottom"][0]) | |
| dict | v = vels["bottom"] |
| dict | vc = vels["contact_node"] |
| va | |
| vm | |
| ve | |
| conservation | |
LOCOS (Local Oxidation of Silicon) example — ViennaLS low-level API.
Geometry (2-D cross-section):
· Si substrate at y = 0
· Pad SiO2 of thickness padOxideThickness grown by geometric advect
· Si3N4 mask box covering x ∈ [−xExtent, maskEdge], sitting on pad oxide
This script uses the ViennaLS Oxidation solver directly (lsOxidation),
bypassing ViennaPS. It mirrors LOCOSOxidation.cpp exactly.
Usage:
python LOCOSOxidation.py
All lengths are in micrometers, time in hours, pressure in Pa.
| int LOCOSOxidation.to_index | ( | float | x | ) |
| None LOCOSOxidation.write_surface | ( | level_set, | |
| str | file_name ) |
| float LOCOSOxidation.ADVECTION_TIME = 0.1 |
| LOCOSOxidation.ambient_initial = vls.Domain(ambient_interface) |
| LOCOSOxidation.ambient_interface = vls.Domain(si_interface) |
| list LOCOSOxidation.bcs |
| LOCOSOxidation.conservation |
| list LOCOSOxidation.coord = [i * GRID_DELTA, j * GRID_DELTA, 0.] |
| LOCOSOxidation.coupling_params = vls.OxidationCouplingParameters() |
| LOCOSOxidation.def_params = vls.OxidationPresets.oxideMechanics1000C(TIME_STEP) |
| LOCOSOxidation.deformation = locos.getDeformationField() |
| LOCOSOxidation.diffusion = locos.getDiffusionField() |
| LOCOSOxidation.dt = min(TIME_STEP, ADVECTION_TIME - elapsed) |
| float LOCOSOxidation.elapsed = 0.0 |
| LOCOSOxidation.file |
| float LOCOSOxidation.GRID_DELTA = 0.01 |
| LOCOSOxidation.locos = vls.Oxidation(si_interface, ambient_interface, mask_interface) |
| LOCOSOxidation.mask_bending = locos.getMaskBendingField() |
| LOCOSOxidation.mask_bottom_pressure = deformation.getPressure(mask_pts["bottom"][0]) |
| int LOCOSOxidation.MASK_CONTACT_EPS = 1.e-6 |
| float LOCOSOxidation.MASK_EDGE = 0.0 |
| LOCOSOxidation.mask_geom |
| LOCOSOxidation.mask_interface = vls.Domain(bounds, bcs, GRID_DELTA) |
| list LOCOSOxidation.mask_max = [to_index(MASK_EDGE), to_index(PAD_OXIDE_THICKNESS + MASK_THICKNESS) + 1] |
| list LOCOSOxidation.mask_min = [to_index(-X_EXTENT), to_index(PAD_OXIDE_THICKNESS) - 1] |
| LOCOSOxidation.mask_params = vls.OxidationPresets.siliconNitrideMask1000C() |
| dict LOCOSOxidation.mask_pts |
| float LOCOSOxidation.MASK_THICKNESS = 0.05 |
| LOCOSOxidation.maskConcentration |
| LOCOSOxidation.masked_conc = diffusion.getConcentration(masked_pt) |
| list LOCOSOxidation.masked_pt = [-0.5, GRID_DELTA, 0.] |
| LOCOSOxidation.maskTransferCoefficient |
| LOCOSOxidation.maxIterations |
| LOCOSOxidation.newline |
| list LOCOSOxidation.normal_dn = [0., -1., 0.] |
| list LOCOSOxidation.normal_up = [0., 1., 0.] |
| LOCOSOxidation.open_conc = diffusion.getConcentration(open_pt) |
| list LOCOSOxidation.open_pt = [0.5, GRID_DELTA, 0.] |
| LOCOSOxidation.ox_params = vls.OxidationPresets.wet1000CDealGrove100() |
| float LOCOSOxidation.PAD_OXIDE_THICKNESS = 0.03 |
| LOCOSOxidation.relaxation |
| LOCOSOxidation.si_initial = vls.Domain(si_interface) |
| LOCOSOxidation.si_interface = vls.Domain(bounds, bcs, GRID_DELTA) |
| tuple LOCOSOxidation.suppression_ratio = (masked_si_speed / open_si_speed) if open_si_speed > 0. else 0. |
| float LOCOSOxidation.time_eps = ADVECTION_TIME * 1.e-8 |
| float LOCOSOxidation.TIME_STEP = 0.01 |
| LOCOSOxidation.tolerance |
| int LOCOSOxidation.USE_GPU = "gpu" |
| dict LOCOSOxidation.v = vels["bottom"] |
| LOCOSOxidation.va |
| dict LOCOSOxidation.vc = vels["contact_node"] |
| LOCOSOxidation.ve |
| LOCOSOxidation.vel = deformation.getVelocity(coord) |
| LOCOSOxidation.velocitySign |
| dict LOCOSOxidation.vels |
| LOCOSOxidation.vm |
| LOCOSOxidation.writer = csv.writer(f) |
| float LOCOSOxidation.X_EXTENT = 1.0 |
| float LOCOSOxidation.Y_MAX = 2.0 |
| float LOCOSOxidation.Y_MIN = -1.0 |