Dear DEVSIM Developer,
I want to add the electric field dependence on mobility in 1D diode example. I add a function to replace the definition of mu_n and mu_p in the initial example:
def CreateMobility(device, region):
NetDoping = 5.2e13
T = 300
n_alpha = 0.34
n_ulp = 124.0 * math.pow(T / 300.0, -2.0)
n_uminp = 15.9
n_Crefp = 1.76e19
n_betap = 1.213 * math.pow(T / 300.0, 0.17)
n_vsatp = 2e7 * math.pow(T / 300.0, 0.52)
n_lfm = n_uminp + n_ulp/(1.0 + math.pow(NetDoping / n_Crefp, n_alpha))
#n_hfm = n_lfm / (math.pow(1.0 + math.pow(n_lfm * E / n_vsatp, n_betap), 1.0 / n_betap))
p_alpha = 0.61
p_ulp = 947.0 * math.pow(T / 300.0, -2)
p_Crefp = 1.94e19
p_betap = 1.0 * math.pow(T / 300.0, 0.66)
p_vsatp = 2e7 * math.pow(T / 300.0, 0.87)
p_lfm = p_ulp/ (1.0 + math.pow(NetDoping / p_Crefp, p_alpha))
#p_hfm = p_lfm / (math.pow(1.0 + math.pow(p_lfm * E / p_vsatp, p_betap), 1.0/p_betap))
if not InEdgeModelList(device, region, "ElectricField"):
CreateEdgeModel(device, region, "ElectricField", "(Potential@n0-Potential@n1)*EdgeInverseLength")
CreateEdgeModelDerivatives(device, region, "ElectricField", "(Potential@n0-Potential@n1)*EdgeInverseLength", "Potential")
#default Mobility parameters
devsim.set_parameter(device=device, region=region, name="n_lfm", value=n_lfm)
devsim.set_parameter(device=device, region=region, name="n_vsatp", value=n_vsatp)
devsim.set_parameter(device=device, region=region, name="n_betap", value=n_betap)
devsim.set_parameter(device=device, region=region, name="p_lfm", value=p_lfm)
devsim.set_parameter(device=device, region=region, name="p_vsatp", value=p_vsatp)
devsim.set_parameter(device=device, region=region, name="p_betap", value=p_betap)
# debugE = devsim.get_edge_model_values(device, region, "ElectricField")
# print("\n\n*********************************\n")
# print(debugE)
# print("\n*********************************\n\n")
mu_n = "n_lfm / (pow(1.0 + pow(n_lfm * ElectricField / n_vsatp, n_betap), 1.0 / n_betap))"
mu_p = "p_lfm / (pow(1.0 + pow(p_lfm * ElectricField / p_vsatp, p_betap), 1.0/p_betap))"
CreateEdgeModel(device, region, "ElectronMobility", mu_n)
CreateEdgeModel(device, region, "HoleMobility", mu_p)
CreateEdgeModelDerivatives(device, region,"ElectronMobility", mu_n, "Potential")
CreateEdgeModelDerivatives(device, region, "HoleMobility", mu_p, "Potential")
Then mobility definition in the continues equations:
Jn = "ElectronCharge*ElectronMobility*EdgeInverseLength*V_t*kahan3(Electrons@n1*Bern01, Electrons@n1*vdiff, -Electrons@n0*Bern01)"
Jp ="-ElectronCharge*HoleMobility*EdgeInverseLength*V_t*kahan3(Holes@n1*Bern01, -Holes@n0*Bern01, -Holes@n0*vdiff)"
When I run the script, the error is listed below:
There was a Invalid floating point exception while evaluating pow(((n_lfm * ElectricField) * pow(n_vsatp,(-1))),n_betap)
Invalid argument while evaluating function pow
Invalid argument while evaluating function pow
while evaluating model ElectronMobility: expression (n_lfm * pow(pow((1 + pow(((n_lfm * ElectricField) * pow(n_vsatp,(-1))),n_betap)),(1 * pow(n_betap,(-1)))),(-1))) evaluates to invalid
Traceback (most recent call last):
File "/home/tao/git_repository/sicar/devsim/1d_nju_pin/solve_iv.py", line 45, in <module>
devsim.solve(type="dc", absolute_error=1e10, relative_error=1e-10, maximum_iterations=30)
devsim_py3.error: DEVSIM FATAL
The values of ElectricField seem not effective, but if I replace the “ElectricField ” with a specific value, like
# When ElectricField = 50 V/cm
mu_n = "n_lfm / (pow(1.0 + pow(n_lfm * 50.0 / n_vsatp, n_betap), 1.0 / n_betap))"
mu_p = "p_lfm / (pow(1.0 + pow(p_lfm * 50.0 / p_vsatp, p_betap), 1.0/p_betap))"
The script can work. So how could I use the EdgeNode value “ElectricField” correctly?