X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fsecs1d-0.0.8%2FUtilities%2FUscharfettergummel.m;fp=octave_packages%2Fsecs1d-0.0.8%2FUtilities%2FUscharfettergummel.m;h=c6f3c3e1cfad4eeb00cea64a803ac8b08613d0f1;hp=0000000000000000000000000000000000000000;hb=f5f7a74bd8a4900f0b797da6783be80e11a68d86;hpb=1705066eceaaea976f010f669ce8e972f3734b05 diff --git a/octave_packages/secs1d-0.0.8/Utilities/Uscharfettergummel.m b/octave_packages/secs1d-0.0.8/Utilities/Uscharfettergummel.m new file mode 100644 index 0000000..c6f3c3e --- /dev/null +++ b/octave_packages/secs1d-0.0.8/Utilities/Uscharfettergummel.m @@ -0,0 +1,54 @@ +function A=Uscharfettergummel(nodes,Nnodes,elements,Nelements,acoeff,bcoeff,v) + +%A=Uscharfettergummel(nodes,Nnodes,elements,Nelements,acoeff,bcoeff,v) +% +% Builds the Scharfetter-Gummel matrix for the +% the discretization of the LHS +% of the Drift-Diffusion equation: +% +% $ -(a(x) (u' - b v'(x) u))'= f $ +% +% where a(x) is piecewise constant +% and v(x) is piecewise linear, so that +% v'(x) is still piecewise constant +% b is a constant independent of x +% and u is the unknown +% + + ## This file is part of + ## + ## SECS1D - A 1-D Drift--Diffusion Semiconductor Device Simulator + ## ------------------------------------------------------------------- + ## Copyright (C) 2004-2007 Carlo de Falco + ## + ## + ## + ## SECS2D is free software; you can redistribute it and/or modify + ## it under the terms of the GNU General Public License as published by + ## the Free Software Foundation; either version 2 of the License, or + ## (at your option) any later version. + ## + ## SECS2D is distributed in the hope that it will be useful, + ## but WITHOUT ANY WARRANTY; without even the implied warranty of + ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ## GNU General Public License for more details. + ## + ## You should have received a copy of the GNU General Public License + ## along with SECS2D; If not, see . + + h=nodes(elements(:,2))-nodes(elements(:,1)); + + c=acoeff./h; + Bneg=Ubernoulli(-(v(2:Nnodes)-v(1:Nnodes-1))*bcoeff,1); + Bpos=Ubernoulli( (v(2:Nnodes)-v(1:Nnodes-1))*bcoeff,1); + + + d0 = [c(1).*Bneg(1); c(1:end-1).*Bpos(1:end-1)+c(2:end).*Bneg(2:end); c(end)*Bpos(end)]; + d1 = [1000;-c.* Bpos]; + dm1 = [-c.* Bneg;1000]; + + A = spdiags([dm1 d0 d1],-1:1,Nnodes,Nnodes); + + % Last Revision: + % $Author: adb014 $ + % $Date: 2008-02-04 16:26:27 +0100 (man, 04 feb 2008) $