void search4Vd()
{
PointContactDZ *vi;
PointContactDZ *vu;
PointContactDZ *vt;
TFile *fi;
TFile *fu;
cout<<"\ncalculate or load potential due to space charge alone:"<<endl;
if (FILE *input = fopen("impurity.root","r")) {
fclose(input);
fi = new TFile("impurity.root");
vi = (PointContactDZ*) fi->Get("vi");
} else {
fi = new TFile("impurity.root", "recreate");
vi = new PointContactDZ(690,505); vi->SetName("vi");
vi->V0=0; vi->V1=0;
vi->Height=5.05*
cm; vi->Radius=3.45*
cm;
vi->PointContactH=0.21*
cm; vi->PointContactR=0.14*
cm;
TF3 *fid = new TF3("fImpDistr","-0.318e10+0.025e10*y");
vi->SetImpurity(fid);
vi->RelaxationFactor=1.994;
vi->SuccessiveOverRelax();
vi->Write();
}
vi->Dump();
cout<<"\ncalculate or load potential due to unit bias:"<<endl;
if (FILE *input = fopen("oneVolt.root","r")) {
fclose(input);
fu = new TFile("oneVolt.root");
vu = (PointContactDZ*) fu->Get("vu");
} else {
fu = new TFile("oneVolt.root", "recreate");
vu = new PointContactDZ(690,505); vu->SetName("vu");
vu->Height=5.05*
cm; vu->Radius=3.45*
cm;
vu->PointContactH=0.21*
cm; vu->PointContactR=0.14*
cm;
vu->SetAverageImpurity(0);
vu->RelaxationFactor=1.994;
vu->SuccessiveOverRelax();
vu->Write();
}
vu->Dump();
double bias, vLower=0*
volt, vUpper=2e4*
volt;
cout<<"\nStart binary search in ["<<vLower<<", "<<vUpper<<"] V"<<endl;
while (vUpper-vLower>0.1*volt) {
bias=(vUpper+vLower)/2;
vt = (PointContactDZ*) vu->Clone("vt");
(*vt)*=bias; (*vt)+=vi;
if (vt->IsDepleted()) vUpper=bias;
else vLower=bias;
delete vt;
cout<<"Current guess: "<<bias<<" V, ";
cout<<"new search range: ["<<vLower<<", "<<vUpper<<"]"<<endl;
}
cout<<"The depletion voltage is found to be: "<<bias<<" V"<<endl;
fu->Close();
fi->Close();
delete fi;
delete fu;
}