Определение металлургической границы p-n перехода в кремниевой структуре с диффузионным слоем, страница 2

  ofstream outfile(FileName);

// расчет шага

  dx=(x2-x1)/points;

// вывод данных

  FuncValue=F(x1);

  outfile<<x1<<" "<<FuncValue<<endl;

  for(i=1;i<=points;i++){

    x1=x1+dx;

    FuncValue=F(x1);

    outfile<<x1<<" "<<FuncValue<<endl;

  }

// завершение функции

  outfile.close();

  return 0;

}

Проверка программы:

Подставляемые значения:

void Constructor()

{

// статические константы

_k  = 8.61738E-5;

_D0 = 3.85;

_dE = 3.66;

// глобальные переменные

_N0 = 5E20;

_Nb = 1E15;

_T  = 1075;

_t  = 75;

}

Значения Xj и ros получились правильные, график Xj правдоподобен.

#include <conio.h>

//----------------------------------------------------------------

#include <math.h>

#include <conio.h>

#include <iostream.h>

#include <fstream.h>

#include "root.h"

#include "integral.h"

double F1(double t);

int FxGraph(double(*F)(double),double x1,double x2,int points, char* FileName);

// статические переменные

  double _k,_D0,_dE;

// передаваемые переменные

  double _N0, _Nb, _T, _t ;

  void Constructor();

// вспомогательные функции 1

  double erfc(double z);

  double D(double T);

  double Left1(double x);

// вспомогательные функции 2

  double N(double N);

  double mu(double N);

  double Neff2(double x);

// рабочие функции

  double out_Xj (double N0, double Nb, double T, double t, int& err);

  double out_ros(double N0, double Nb, double T, double t, double Xj);

//----------------------------------------------------------------

//===========================================================================

void main()

{

// очистка экрана

  clrscr();

// внутренние переменные функции

  double xj,ros;

  int err;

// приводим модель в готовность

  Constructor();

// задаем параметры расчета

// выводим Xj

  xj=out_Xj(_N0,_Nb,_T,_t,err);

  cout<<"err="<<err<<endl;

  cout<<"Xj="<<xj<<endl;

  // ros

  Constructor();

  ros=out_ros(_N0,_Nb,_T,_t,xj);

  cout<<"ros="<<ros<<endl;

  getch();

  FxGraph(F1,900,1250,100,"Out1.dat");

}

//===========================================================================

void Constructor()

{

// статические константы

  _k  = 8.61738E-5;

  _D0 = 3.85;

  _dE = 3.66;

// глобальные переменные

  _N0 = 5E20;

  _Nb = 1E15;

  _T  = 1075;

  _t  = 75;

}

// ----------------------------------------------------------------------------

double erfc(double z)

{

  double t,a;

  if (fabs(z)<9.0)

    {

    t=1/(1+0.3275911*z);

    a=t*( 0.254829592+t*(-0.284496736+t*(1.421413741+

      t*(-1.453152027+t*1.061405429))));

    return a*exp(-z*z);

     }

  else

    return 0.0;

}

// ----------------------------------------------------------------------------

double out_Xj(double N0, double Nb, double T, double t, int& err)

{

  err=1;

// внутренние переменные функции

  int Nckl;

  double F;

  double epsX,epsF;

  double Xj;

// перенос данных

  _N0=N0;

  _Nb=Nb;  // к-ция доноров

  _T=T+273;

  _t=t*60.0;

  //getch();

// определяем Xj

  Xj   = 1E-6;    // нулевое приближение

  epsX = 1E-10;   // абс погр выч корня

  epsF = 1E4;     // абс погр невязки корня с 0

  err=RootNewton(Left1,

                 epsX,epsF,

                 Xj,F,Nckl,0);

// возвращаем значения в нормальный формат

  _t=_t/60.0;

  _T=_T-273;

return Xj;

}

// ----------------------------------------------------------------------------

double D(double T)

{ return _D0*exp(-_dE/(_k*T)); }

// ----------------------------------------------------------------------------

double Left1(double x)

{

  return (_N0*erfc(x/(2.0*pow(D(_T)*_t,0.5)))-_Nb);

}

// ----------------------------------------------------------------------------

double out_ros(double N0, double Nb, double T, double t, double Xj)

{

// переменные функции

  double znam,ros;

// перенос данных

  _N0=N0;

  _Nb=Nb;  // к-ция доноров

  _T=T+273;

  _t=t*60;

// определяем ROs

  znam=SdxSimps(Neff2,0,Xj,100);

  ros=1/znam;

 // cout<<"ros="<<ros<<endl;

// возвращаем значения в нормальный формат

  _t=_t/60.0;

  _T=_T-273;

// возвращаем значение

  return ros;

}

//============================================================================

double N(double x)

{ return fabs(_N0*erfc(x/(2.0*sqrt(D(_T)*_t)))-_Nb); }

// ----------------------------------------------------------------------------

double mu(double N)

{ return 80+1350/(1+pow((N+2*_Nb)/1.12E17,0.72)); }

// ----------------------------------------------------------------------------

double Neff2(double x)

{

  const double q=1.602E-19;

  return q*N(x)*mu(N(x));

}

// ----------------------------------------------------------------------------

//============================================================================

double F1(double T)

{

static err;

  return out_Xj(_N0,_Nb,T,_t,err);

}

//============================================================================

int FxGraph(double(*F)(double),double x1,double x2,int points, char* FileName)

{

// переменные функции

  double dx,FuncValue;

  int i;

// открываем файл

  ofstream outfile(FileName);

// расчет шага

  dx=(x2-x1)/points;

// вывод данных

  FuncValue=F(x1);

  outfile<<x1<<" "<<FuncValue<<endl;

  for(i=1;i<=points;i++){

    x1=x1+dx;

    FuncValue=F(x1);

    outfile<<x1<<" "<<FuncValue<<endl;

  }

// завершение функции

  outfile.close();

  return 0;

}