Source code for simudo.example.pn_benchmark.pn_benchmark_create_submitfiles


import lzma
import yaml
import os
import pandas as pd
import numpy as np
from collections import defaultdict
import itertools
from simudo.util.pint import make_unit_registry
from simudo.misc import sentaurus_import

[docs]def main(): U = make_unit_registry() def write(filename, tree): with open(filename, 'wt') as h: yaml.dump(tree, h) lst_mp = ( -1, # 60, # 200, # 1000, # 2000, ) lst_bchack = (0, 1) lst_ffill = (0, 1) lst_thresh = ( # fta, ftr, fwz # ('0', '1e-10', 0), # ('0', '1e-4', 0), # ('0', '0', 1), ('0', '0', 0), # ('1e-1', '0', 0), # ('inf', '0', 0), # ('1e-10', '0', 0), ('1e-5', '0', 0), # ('0', '1e-10', 0), ('0', '1e-5', 0), ) lst_quaddeg = ( # (30, 30, None), (20, 8, None), ) lst_transport_method = ( 'mixed_qfl_j', 'mixed_u_j', ) FROM_IVCURVES = True ALL_IVCURVE_POINTS = False if FROM_IVCURVES: sentaurus_runs = defaultdict(list) sentaurus_device_lengths = {} for sentaurus_filename, d in \ sentaurus_import.list_sentaurus_diode_1d_ivcurves(): V_str = d['V'] V = float(V_str) Vdir = 1 if V >= 0 else -1 df = pd.read_csv(sentaurus_filename, index_col=0) previous_V = np.inf for index, row in df.to_dict('index').items(): V = float(row['Vext']) if (not ALL_IVCURVE_POINTS) and (abs(previous_V - V) < 0.02): continue sentaurus_runs[(d['c'], d['min_srv'], Vdir)].append({ 'filename': None, 'ivcurve_filename': sentaurus_filename, 'ivcurve_row_index': index, 'Vext_str': '{:.5f}'.format(V), 'Vext': V, 'device_length': d['device_length']}) previous_V = V else: sentaurus_runs = defaultdict(list) sentaurus_device_lengths = {} for sentaurus_filename, d in \ sentaurus_import.list_sentaurus_diode_1d_data(): V_str = d['V'] V = float(V_str) Vdir = 1 if V >= 0 else -1 with lzma.open(sentaurus_filename, mode='rb') as handle: Sdf, Sdf_units = sentaurus_import.read_df_unitful( handle=handle, unit_registry=U) sentaurus_runs[(d['c'], d['minority_contact'], Vdir)].append({ 'filename': sentaurus_filename, 'Vext_str': V_str, 'Vext': V, 'device_length': float(Sdf['x'].values[-1])}) for l in sentaurus_runs.values(): l.sort(key=lambda d: abs(d['Vext'])) for sentaurus_run_key, sentaurus_run in sentaurus_runs.items(): doping, minority_srv, V_ext_direction = sentaurus_run_key device_length = next(iter(sentaurus_run))['device_length'] for mp, tmethod, bchack, ffill, (fta, ftr, fwz), ( qd1, qd2, qdr) in itertools.product( lst_mp, lst_transport_method, lst_bchack, lst_ffill, lst_thresh, lst_quaddeg): if not (not bchack and ffill): continue # if doping not in ('1e18', '1e20'): continue if doping not in ('1e18',): continue if tmethod == 'mixed_u_j' and (fta, ftr, fwz) != ('0', '0', 0): continue if not ffill and not bchack: # sanity continue title = "bc20191117 c={} min_srv={} Vd={} meshp={} M={} bchack={} ffill={} fta={} ftr={} fwz={} qd1={} qd2={} qdr={}".format( doping, minority_srv, V_ext_direction, mp, tmethod, bchack, ffill, fta, ftr, fwz, qd1, qd2, qdr) # if title != 'bc20191117 c=1e18 Vd=1 meshp=-1 bchack=0 ffill=1 fta=0 ftr=0 fwz=0 qd1=30 qd2=30 qdr=None': # continue # if title != 'bc20191117 c=1e18 Vd=1 meshp=200 bchack=0 ffill=1 fta=0 ftr=1e-10 fwz=0': # continue o = "out/" + title os.makedirs(o, exist_ok=True) write(o+'/submit.yaml', dict(parameters=dict( device_length=device_length, doping=doping, min_srv=minority_srv, bchack=bchack, fill_from_boundary=ffill, mesh_points=mp, transport_method=tmethod, title=title, fill_threshold_abs=fta, fill_threshold_rel=ftr, fill_with_zero_except_bc=fwz, quaddeg_super=qd1, quaddeg_g=qd2, quaddeg_rho=qdr, voltage_steps=sentaurus_run)))
if __name__ == '__main__': main()