/tags/cvs_final/octave-forge/extra/secs1d/src/Ubern.cc
# · C++ · 133 lines · 61 code · 25 blank · 47 comment · 7 complexity · d61a89612e52221427861b9657f3ed58 MD5 · raw file
- /*
- % This file is part of
- %
- % SECS2D - A 2-D Drift--Diffusion Semiconductor Device Simulator
- % -------------------------------------------------------------------
- % Copyright (C) 2004-2006 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, write to the Free Software
- % Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- % USA
- */
- #include <iostream>
- #include <octave/oct.h>
- ////////////////////////////////////////////
- // Ubern function
- // this function, though it does make use
- // of liboctave, is not an octve command
- // the wrapper to make the command is defined
- // below
- ////////////////////////////////////////////
- int Ubern(const double x, double &bp, double &bn )
- {
- double xlim=1e-2;
- int ii;
- double fp,fn,df,segno;
- double ax;
- ax=fabs(x);
- if (ax == 0.0) {
- bp=1.;
- bn=1.;
- goto theend ;
- }
- if (ax > 80.0){
- if (x >0.0){
- bp=0.0;
- bn=x;
- goto theend ;
- }else{
- bp=-x;
- bn=0.0;
- goto theend ;
- }
- }
- if (ax > xlim){
- bp=x/(exp(x)-1.0);
- bn=x+bp;
- goto theend ;
- }
- ii=1;
- fp=1.0;fn=1.0;df=1.0;segno=1.0;
- while (fabs(df) > 2.2204e-16){
- ii++;
- segno= -segno;
- df=df*x/ii;
- fp=fp+df;
- fn=fn+segno*df;
- bp=1/fp;
- bn=1/fn;
- }
- theend:
- return 0;
- }
- ////////////////////////////////////
- // WRAPPER
- ////////////////////////////////////
- // DEFUN_DLD and the macros that it
- // depends on are defined in the
- // files defun-dld.h, defun.h,
- // and defun-int.h.
- //
- // Note that the third parameter
- // (nargout) is not used, so it is
- // omitted from the list of arguments
- // to DEFUN_DLD in order to avoid
- // the warning from gcc about an
- // unused function parameter.
- ////////////////////////////////////
- DEFUN_DLD (Ubern, args, ,
- " [bp,bn]=Ubern(x)\n \
- computes Bernoulli function\n \
- B(x)=x/(exp(x)-1) corresponding to \n \
- to input values Z and -Z, recalling that\n \
- B(-Z)=Z+B(Z)\n")
- {
- // The list of values to return. See the declaration in oct-obj.h
- octave_value_list retval;
- NDArray X ( args(0).array_value() );
- octave_idx_type lx = X.length();
- NDArray BP(X),BN(X);
-
- for (octave_idx_type jj=0; jj<lx; jj++)
- Ubern(X(jj),BP(jj),BN(jj));
- retval (0) = BP;
- retval (1) = BN;
-
- return retval ;
-
- }