[Fsem-commits] SF.net SVN: fsem: [131] fsem
Status: Beta
Brought to you by:
fabiandortu
|
From: <fab...@us...> - 2007-04-24 14:50:48
|
Revision: 131
http://fsem.svn.sourceforge.net/fsem/?rev=131&view=rev
Author: fabiandortu
Date: 2007-04-24 07:49:47 -0700 (Tue, 24 Apr 2007)
Log Message:
-----------
Added flags to select which equation to solve for DDSG:
bool ModUsrDDSGPOT = true;
bool ModUsrDDSGRHON = true;
bool ModUsrDDSGRHOP = true;
Modified Paths:
--------------
fsem/models/fsem_Mod_FlagsSemi.edp
fsem/solve/fsem_SolveMainDDSG.edp
fsem/solve/fsem_Solve_Vars.edp
Modified: fsem/models/fsem_Mod_FlagsSemi.edp
===================================================================
--- fsem/models/fsem_Mod_FlagsSemi.edp 2007-04-24 14:19:12 UTC (rev 130)
+++ fsem/models/fsem_Mod_FlagsSemi.edp 2007-04-24 14:49:47 UTC (rev 131)
@@ -38,26 +38,6 @@
*/
-/*********************************************
- * Select DDSG equations to solve
- *********************************************
-bool ModUsrDDSGPOT = true;
-/*TeXDoc
- Solve potential quation (DDSG)
- & true
-*/
-bool ModUsrDDSGRHON = true;
-/*TeXDoc
- Solve electron quation (DDSG)
- & true
-*/
-bool ModUsrDDSGRHOP = true;
-/*TeXDoc
- Solve hole quation (DDSG)
- & true
-*/
-
-
/***********************************************************
* Valence and Conduction band Effective density of state
* In short NV and NC. Generic: NX
Modified: fsem/solve/fsem_SolveMainDDSG.edp
===================================================================
--- fsem/solve/fsem_SolveMainDDSG.edp 2007-04-24 14:19:12 UTC (rev 130)
+++ fsem/solve/fsem_SolveMainDDSG.edp 2007-04-24 14:49:47 UTC (rev 131)
@@ -580,7 +580,6 @@
real RhoPMax=1;
bool isConverge=false;
-
GloVhP1 RealEXCH1;
GloVhP1 ImagEXCH1;
@@ -598,39 +597,36 @@
real PsiFoM = 0; // ...and to display them again at the end of the gummel loop. So these variables are NOT essential. It's just for display.
for(int i=0; i<UsrGummelNbrMaxIter; i++) {
-
-
-
-
cout << endl;
cout << "******************************************************************" << endl;
cout << "*** Gummel iteration # " << i << endl;
cout << "******************************************************************" << endl;
-
-
// Gummel loop:
-
- // POTENTIAL EQUATION
- SolveDDSGPotNonlinearSteady();
-
- Psil2 = GloVarSemiPOT[].l2;
- PsiMax = GloVarSemiPOT[].max;
- PsiFoM = abs(Psil2 - Psil2Prev) / abs(Psil2);
- cout << "$$$$ abs(Psil2 - Psil2Prev)/ abs(Psil2): " << abs(Psil2 - Psil2Prev) / abs(Psil2) << endl;
- cout << "$$$$ abs(PsiMax - PsiMaxPrev)/ abs(PsiMax): " << abs(PsiMax - PsiMaxPrev) / abs(PsiMax) << endl;
- if(abs(Psil2 - Psil2Prev) / abs(Psil2) < UsrGummelEpsPot) {
- isConverge = true;
- cout << "$$$$ Psi CONVERGED" << endl;
- } else {
- isConverge = false;
- }
- Psil2Prev = Psil2;
- PsiMaxPrev = PsiMax;
-
- if (ModUsrFixedPotential)
- {
- // FIX POTENTIAL AT NODE "node" (xval, yval) to "PotVal" [V]
+
+ // **********************
+ // *** POTENTIAL EQUATION
+ // **********************
+
+ if(ModUsrDDSGPOT) { // DO WE SOLVE THE POTENTIAL EQUATION?
+ SolveDDSGPotNonlinearSteady();
+
+ Psil2 = GloVarSemiPOT[].l2;
+ PsiMax = GloVarSemiPOT[].max;
+ PsiFoM = abs(Psil2 - Psil2Prev) / abs(Psil2);
+ cout << "$$$$ abs(Psil2 - Psil2Prev)/ abs(Psil2): " << abs(Psil2 - Psil2Prev) / abs(Psil2) << endl;
+ cout << "$$$$ abs(PsiMax - PsiMaxPrev)/ abs(PsiMax): " << abs(PsiMax - PsiMaxPrev) / abs(PsiMax) << endl;
+ if(abs(Psil2 - Psil2Prev) / abs(Psil2) < UsrGummelEpsPot) {
+ isConverge = true;
+ cout << "$$$$ Psi CONVERGED" << endl;
+ } else {
+ isConverge = false;
+ }
+ Psil2Prev = Psil2;
+ PsiMaxPrev = PsiMax;
+
+ if (ModUsrFixedPotential) {
+ // FIX POTENTIAL AT NODE "node" (xval, yval) to "PotVal" [V]
GloMeshCOORDX = x;
GloMeshCOORDY = y;
node = CppModGetNode(GloMeshCOORDX[], GloMeshCOORDY[],xval , yval);
@@ -640,49 +636,62 @@
GloVarSemiDDSGRhoN = GloVarSemiDDSGRhoN * exp(-PotShift/(1.3807e-23/1.60218e-19 *GloVarTempT));
GloVarSemiDDSGRhoP = GloVarSemiDDSGRhoP * exp(PotShift/(1.3807e-23/1.60218e-19 *GloVarTempT));
}
+ // ELECTRON AND HOLE EQUATIONS
+ } else {
+ isConverge = true; // since we do not solve this equation, we consider it is converged
+ PsiFoM = 0.0;
+ }// END ModUsrDDSGPOT
- // ELECTRON AND HOLE EQUATIONS
-
-
- if (HOLbefELE) { // HOL equation solved BEFORE ELE equation.
- SolveDDSGHolSteady();
+
+ // **********************
+ // *** CARRIER EQUATIONS
+ // **********************
+ if (HOLbefELE) { // HOL equation solved BEFORE ELE equation.
+ if(ModUsrDDSGRHOP) { // DO WE SOLVE THE HOLE EQUATION?
+ SolveDDSGHolSteady();
+
+ RhoPl2 = GloVarSemiDDSGRhoP[].l2;
+ RhoPMax = GloVarSemiDDSGRhoP[].max;
+ RhoPFoM = abs(RhoPl2 - RhoPl2Prev)/ abs(RhoPl2);
+ cout << "abs(RhoPl2 - RhoPl2Prev)/ abs(RhoPl2): " << abs(RhoPl2 - RhoPl2Prev)/ abs(RhoPl2) << endl;
+ cout << "$$$$ abs(RhoPMax - RhoPMaxPrev)/ abs(RhoPMax): " << abs(RhoPMax - RhoPMaxPrev) / abs(RhoPMax) << endl;
+ if(abs(RhoPl2 - RhoPl2Prev) / abs(RhoPl2) < UsrGummelEpsCarr) {
+ isConverge = isConverge * true;
+ cout << "$$$$ RhoP CONVERGED" << endl;
+ } else {
+ isConverge = false;
+ }
+ RhoPl2Prev = RhoPl2;
+ RhoPMaxPrev = RhoPMax;
- RhoPl2 = GloVarSemiDDSGRhoP[].l2;
- RhoPMax = GloVarSemiDDSGRhoP[].max;
- RhoPFoM = abs(RhoPl2 - RhoPl2Prev)/ abs(RhoPl2);
- cout << "abs(RhoPl2 - RhoPl2Prev)/ abs(RhoPl2): " << abs(RhoPl2 - RhoPl2Prev)/ abs(RhoPl2) << endl;
- cout << "$$$$ abs(RhoPMax - RhoPMaxPrev)/ abs(RhoPMax): " << abs(RhoPMax - RhoPMaxPrev) / abs(RhoPMax) << endl;
- if(abs(RhoPl2 - RhoPl2Prev) / abs(RhoPl2) < UsrGummelEpsCarr) {
- isConverge = isConverge * true;
- cout << "$$$$ RhoP CONVERGED" << endl;
} else {
- isConverge = false;
+ isConverge = isConverge * true; // since we do not solve this equation, we consider it is converged
+ RhoPFoM = 0.0;
}
- RhoPl2Prev = RhoPl2;
- RhoPMaxPrev = RhoPMax;
-
-
-
- SolveDDSGEleSteady();
-
- RhoNl2 = GloVarSemiDDSGRhoN[].l2;
- RhoNMax = GloVarSemiDDSGRhoN[].max;
- RhoNFoM = abs(RhoNl2 - RhoNl2Prev) / abs(RhoNl2);
- cout << "$$$$ abs(RhoNl2 - RhoNl2Prev)/ abs(RhoNl2): "<< abs(RhoNl2 - RhoNl2Prev) / abs(RhoNl2) << endl;
- cout << "$$$$ abs(RhoNMax - RhoNMaxPrev)/ abs(RhoNMax): " << abs(RhoNMax - RhoNMaxPrev) / abs(RhoNMax) << endl;
- if(abs(RhoNl2 - RhoNl2Prev) / abs(RhoNl2) < UsrGummelEpsCarr ) {
- isConverge = isConverge * true;
- cout << "$$$$ RhoN CONVERGED" << endl;
+
+ if(ModUsrDDSGRHON) {
+ SolveDDSGEleSteady();
+
+ RhoNl2 = GloVarSemiDDSGRhoN[].l2;
+ RhoNMax = GloVarSemiDDSGRhoN[].max;
+ RhoNFoM = abs(RhoNl2 - RhoNl2Prev) / abs(RhoNl2);
+ cout << "$$$$ abs(RhoNl2 - RhoNl2Prev)/ abs(RhoNl2): "<< abs(RhoNl2 - RhoNl2Prev) / abs(RhoNl2) << endl;
+ cout << "$$$$ abs(RhoNMax - RhoNMaxPrev)/ abs(RhoNMax): " << abs(RhoNMax - RhoNMaxPrev) / abs(RhoNMax) << endl;
+ if(abs(RhoNl2 - RhoNl2Prev) / abs(RhoNl2) < UsrGummelEpsCarr ) {
+ isConverge = isConverge * true;
+ cout << "$$$$ RhoN CONVERGED" << endl;
+ } else {
+ isConverge = false;
+ }
+ RhoNl2Prev =RhoNl2;
+ RhoNMaxPrev =RhoNMax;
} else {
- isConverge = false;
+ isConverge = isConverge * true; // since we do not solve this equation, we consider it is converged
+ RhoNFoM = 0.0;
}
- RhoNl2Prev =RhoNl2;
- RhoNMaxPrev =RhoNMax;
-
- }
- else
- { // ELE equation solved BEFORE HOL equation.
+ } else { // ELE equation solved BEFORE HOL equation.
+ if(ModUsrDDSGRHON) { // DO WE SOLVE THE ELECTRON EQUATION?
SolveDDSGEleSteady();
RhoNl2 = GloVarSemiDDSGRhoN[].l2;
@@ -698,7 +707,12 @@
}
RhoNl2Prev =RhoNl2;
RhoNMaxPrev =RhoNMax;
-
+ } else {
+ isConverge = isConverge * true; // since we do not solve this equation, we consider it is converged
+ RhoNFoM = 0.0;
+ }
+
+ if(ModUsrDDSGRHOP) { // DO WE SOLVE THE ELECTRON EQUATION?
SolveDDSGHolSteady();
RhoPl2 = GloVarSemiDDSGRhoP[].l2;
@@ -714,65 +728,57 @@
}
RhoPl2Prev = RhoPl2;
RhoPMaxPrev = RhoPMax;
-
-
+ } else {
+ isConverge = isConverge * true; // since we do not solve this equation, we consider it is converged
+ RhoPFoM = 0.0;
}
+ }
- if (ModUsrDDSGH1inGummel && ModUsrDDSGSteadyPeriodic)
-
- {
- SolveDDSGHarm(1,i);
- RealEXCH1 = real (GloVarSemiEXCH1);
- ImagEXCH1 = imag (GloVarSemiEXCH1);
- I1MaxGummel = RealEXCH1[].max;
- Q1MaxGummel = ImagEXCH1[].max;
- I1l2Gummel = RealEXCH1[].l2;
- Q1l2Gummel = ImagEXCH1[].l2;
-
- // plot(GloVarSemiEXC,wait=true);
-
- if (ParUsrLaserModFreq == 0)
- {
- cout << "$$$$ abs(I1MaxGummel-I1MaxPrevGummel)/ abs(I1MaxGummel): " << abs(I1MaxGummel-I1MaxPrevGummel)/ abs(I1MaxGummel) << endl;
- cout << "$$$$ abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel): " << abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel) << endl;
-
- if( (abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel) < UsrGummelEpsCarr) ) {
- isConverge = isConverge * true;
- cout << "$$$$ EXCH1 CONVERGED" << endl;
- } else {
- isConverge = false;
- }
-
- }
- else
- {
- cout << "$$$$ abs(I1MaxGummel-I1MaxPrevGummel)/ abs(I1MaxGummel): " << abs(I1MaxGummel-I1MaxPrevGummel)/ abs(I1MaxGummel) << endl;
- cout << "$$$$ abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel): " << abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel) << endl;
- cout << "$$$$ abs(Q1MaxGummel-Q1MaxPrevGummel)/ abs(Q1MaxGummel): " << abs(Q1MaxGummel-Q1MaxPrevGummel)/ abs(Q1MaxGummel) << endl;
- cout << "$$$$ abs(Q1l2Gummel-Q1l2PrevGummel)/ abs(Q1l2Gummel): " << abs(Q1l2Gummel-Q1l2PrevGummel)/ abs(Q1l2Gummel) << endl;
-
- if( (abs(Q1l2Gummel-Q1l2PrevGummel)/ abs(Q1l2Gummel) < UsrGummelEpsCarr) &&
- (abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel) < UsrGummelEpsCarr) ) {
- isConverge = isConverge * true;
- cout << "$$$$ EXCH1 CONVERGED" << endl;
- } else {
- isConverge = false;
- }
-
-
-
- }
-
- I1l2PrevGummel = I1l2Gummel;
- I1MaxPrevGummel = I1MaxGummel;
- Q1l2PrevGummel= Q1l2Gummel;
- Q1MaxPrevGummel = Q1MaxGummel;
-
-
+ // ***********************************************
+ // *** FIRST HARMONIC CARRIER EQUATION (obsolete)
+ // ***********************************************
+ if (ModUsrDDSGH1inGummel && ModUsrDDSGSteadyPeriodic) {
+ // In case of steady periodic resolution, the first harmonic component can be solved with the dc component
+ // Practically this part of the code is obsolete since it assumes that the potential is not modulated
+ SolveDDSGHarm(1,i);
+ RealEXCH1 = real (GloVarSemiEXCH1);
+ ImagEXCH1 = imag (GloVarSemiEXCH1);
+ I1MaxGummel = RealEXCH1[].max;
+ Q1MaxGummel = ImagEXCH1[].max;
+ I1l2Gummel = RealEXCH1[].l2;
+ Q1l2Gummel = ImagEXCH1[].l2;
+ // plot(GloVarSemiEXC,wait=true);
+ if (ParUsrLaserModFreq == 0) {
+ cout << "$$$$ abs(I1MaxGummel-I1MaxPrevGummel)/ abs(I1MaxGummel): " << abs(I1MaxGummel-I1MaxPrevGummel)/ abs(I1MaxGummel) << endl;
+ cout << "$$$$ abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel): " << abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel) << endl;
+ if( (abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel) < UsrGummelEpsCarr) ) {
+ isConverge = isConverge * true;
+ cout << "$$$$ EXCH1 CONVERGED" << endl;
+ } else {
+ isConverge = false;
+ }
+ } else {
+ cout << "$$$$ abs(I1MaxGummel-I1MaxPrevGummel)/ abs(I1MaxGummel): " << abs(I1MaxGummel-I1MaxPrevGummel)/ abs(I1MaxGummel) << endl;
+ cout << "$$$$ abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel): " << abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel) << endl;
+ cout << "$$$$ abs(Q1MaxGummel-Q1MaxPrevGummel)/ abs(Q1MaxGummel): " << abs(Q1MaxGummel-Q1MaxPrevGummel)/ abs(Q1MaxGummel) << endl;
+ cout << "$$$$ abs(Q1l2Gummel-Q1l2PrevGummel)/ abs(Q1l2Gummel): " << abs(Q1l2Gummel-Q1l2PrevGummel)/ abs(Q1l2Gummel) << endl;
+ if( (abs(Q1l2Gummel-Q1l2PrevGummel)/ abs(Q1l2Gummel) < UsrGummelEpsCarr) &&
+ (abs(I1l2Gummel-I1l2PrevGummel)/ abs(I1l2Gummel) < UsrGummelEpsCarr) ) {
+ isConverge = isConverge * true;
+ cout << "$$$$ EXCH1 CONVERGED" << endl;
+ } else {
+ isConverge = false;
+ }
}
+ I1l2PrevGummel = I1l2Gummel;
+ I1MaxPrevGummel = I1MaxGummel;
+ Q1l2PrevGummel= Q1l2Gummel;
+ Q1MaxPrevGummel = Q1MaxGummel;
+ }
- // Check for convergence
-
+ // **********************************
+ // *** Check for Gummel convergence
+ // *********************************
if(isConverge) {
cout << endl;
cout << "**************************************************************** **" << endl;
@@ -784,10 +790,8 @@
cout << "**************************************************************** **" << endl;
break;
}
-
} // End Gummel loop.
-
if(!isConverge) {
cout << endl;
cout << "*****************************************************************************" << endl;
@@ -798,9 +802,6 @@
cout << "*** abs(Psil2 - Psil2Prev) / abs(Psil2): " << PsiFoM << endl;
cout << "*****************************************************************************" << endl;
}
-
-
-
}
Modified: fsem/solve/fsem_Solve_Vars.edp
===================================================================
--- fsem/solve/fsem_Solve_Vars.edp 2007-04-24 14:19:12 UTC (rev 130)
+++ fsem/solve/fsem_Solve_Vars.edp 2007-04-24 14:49:47 UTC (rev 131)
@@ -47,6 +47,28 @@
& [NA]
*/
+
+/*********************************************
+ * Select DDSG equations to solve
+ *********************************************/
+bool ModUsrDDSGPOT = true;
+/*TeXDoc
+ Solve potential quation (DDSG)
+ & true
+*/
+bool ModUsrDDSGRHON = true;
+/*TeXDoc
+ Solve electron quation (DDSG)
+ & true
+*/
+bool ModUsrDDSGRHOP = true;
+/*TeXDoc
+ Solve hole quation (DDSG)
+ & true
+*/
+
+
+
/*********************************
* Specific to Potential Equation
**********************************/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|