X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=octave_packages%2Fsecs1d-0.0.8%2FUtilities%2FUdriftdiffusion.m;fp=octave_packages%2Fsecs1d-0.0.8%2FUtilities%2FUdriftdiffusion.m;h=afa659415e5bc3b3ab57afde7ad2ee21ef3fa582;hb=f5f7a74bd8a4900f0b797da6783be80e11a68d86;hp=0000000000000000000000000000000000000000;hpb=1705066eceaaea976f010f669ce8e972f3734b05;p=CreaPhase.git diff --git a/octave_packages/secs1d-0.0.8/Utilities/Udriftdiffusion.m b/octave_packages/secs1d-0.0.8/Utilities/Udriftdiffusion.m new file mode 100644 index 0000000..afa6594 --- /dev/null +++ b/octave_packages/secs1d-0.0.8/Utilities/Udriftdiffusion.m @@ -0,0 +1,54 @@ +function A=Udriftdiffusion(x,psi,coeff) + +%A=Udriftdiffusion(x,psi,coeff) +% +% Builds the Scharfetter-Gummel approximation +% of the differential operator - (coeff (n' - n psi'))' +% + + ## This file is part of + ## + ## SECS1D - A 1-D Drift--Diffusion Semiconductor Device Simulator + ## ------------------------------------------------------------------- + ## Copyright (C) 2004-2007 Carlo de Falco + ## + ## + ## + ## SECS1D 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. + ## + ## SECS1D 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 SECS1D; If not, see . + + nodes = x; + Nnodes =length(nodes); + + elements = [[1:Nnodes-1]' [2:Nnodes]']; + Nelements=size(elements,1); + + Bcnodes = [1;Nnodes]; + + h=nodes(elements(:,2))-nodes(elements(:,1)); + + c=coeff./h; + Bneg=Ubernoulli(-(psi(2:Nnodes)-psi(1:Nnodes-1)),1); + Bpos=Ubernoulli( (psi(2:Nnodes)-psi(1:Nnodes-1)),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) $ +