Xyce  6.1
N_DEV_DopeInfo.h
Go to the documentation of this file.
1 //-----------------------------------------------------------------------------
2 // Copyright Notice
3 //
4 // Copyright 2002 Sandia Corporation. Under the terms
5 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S.
6 // Government retains certain rights in this software.
7 //
8 // Xyce(TM) Parallel Electrical Simulator
9 // Copyright (C) 2002-2015 Sandia Corporation
10 //
11 // This program is free software: you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation, either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program. If not, see <http://www.gnu.org/licenses/>.
23 //-----------------------------------------------------------------------------
24 
25 //-----------------------------------------------------------------------------
26 // Filename : $RCSfile: N_DEV_DopeInfo.h,v $
27 //
28 // Purpose : This file contains classes related to the doping specificaiton.
29 //
30 // Special Notes :
31 //
32 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
33 //
34 // Creation Date : 05/15/01
35 //
36 // Revision Information:
37 // ---------------------
38 //
39 // Revision Number: $Revision: 1.21 $
40 //
41 // Revision Date : $Date: 2015/04/08 19:18:25 $
42 //
43 // Current Owner : $Author: tvrusso $
44 //-----------------------------------------------------------------------------
45 
46 #ifndef Xyce_N_DEV_DopeInfo_h
47 #define Xyce_N_DEV_DopeInfo_h
48 
49 // ---------- Standard Includes ----------
50 
51 // ---------- Xyce Includes ----------
52 #include <N_DEV_fwd.h>
53 #include <N_DEV_Const.h>
54 #include <N_DEV_CompositeParam.h>
55 
56 namespace Xyce {
57 namespace Device {
58 
59 //-----------------------------------------------------------------------------
60 // Class : N_DEV_DopeInfo
61 // Purpose : Doping region information.
62 // Special Notes :
63 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
64 // Creation Date : 03/28/03
65 //-----------------------------------------------------------------------------
66 class DopeInfo : public CompositeParam
67 {
68  friend class ParametricData<DopeInfo>;
69 
70 public:
72 
73  DopeInfo();
74  bool processParam(Param & ndParam, std::string & param, DevicePDEInstance & di);
75  void processParams();
76 
77  void setupInfo(
78  std::vector<double> & CVec,
79  std::vector<double> & CdonorVec,
80  std::vector<double> & CacceptorVec,
81  std::vector<double> & xVec,
82  DeviceSupport & devSup);
83 
84  void setupInfo(
85  std::vector<double> & CVec,
86  std::vector<double> & CdonorVec,
87  std::vector<double> & CacceptorVec,
88  std::vector<double> & xVec,
89  std::vector<bool> & el2Vec,
90  DeviceSupport & devSup);
91 
92  void setupInfo2d(
93  std::vector<double> & CVec,
94  std::vector<double> & CdonorVec,
95  std::vector<double> & CacceptorVec,
96  std::vector<double> & xVec, std::vector<double> &yVec, DeviceSupport & devSup);
97 
98  static double nsdep(double x, double W, double Dt);
99  static double ngdep(double x, double y, double W, double ax, double ay);
100  static double ngdep2(double x, double y, double ax, double ay);
101  static double erf(double x);
102 
103  static void readDopingFile(std::string & filename, std::vector<double> & xloc,
104  std::vector<double> & nvec, std::vector<double> & y2, DeviceSupport & devSup);
105 
106  static void readDopingFile(std::string & filename, std::vector<double> & xloc,
107  std::vector<double> & nvec, std::vector<double> & y2_n,
108  std::vector<double> & pvec, std::vector<double> & y2_p, DeviceSupport & devSup);
109 
110 public:
111  std::string name; // this is also the index into the map.
112  std::string type; // p-type or n-type
113  std::string funcType; // uniform, step, gaussian.
114  std::string speciesName; // boron, phosphorus, etc.
115  std::string fileName; // doping file.
116  std::string exprString; // if expression based, store here.
117 
118  // location params:
119  double xmin;
120  double xmax;
121  bool xminGiven;
122  bool xmaxGiven;
123 
124  double xloc;
125  double xwidth;
126 
127  double ymin;
128  double ymax;
129  bool yminGiven;
130  bool ymaxGiven;
131 
132  double yloc;
133  double ywidth;
134 
135  double Nmax; // maximum magnitude
136  double Nmin; // minimum magnitude
137 
139 
140  // sometimes having a really high doping hurts convergence.
141  // This lets the user set truncate it.
142  double Nmax_chop;
144 
145  int flatX;
146  int flatY;
147 
148  // arrays for spline fitting, if specified from file:
149  std::vector<double> xlocVec;
150  std::vector<double> dopeVec;
151  std::vector<double> y2Vec;
152  std::vector<double> splintDopeVec;
153 };
154 
155 // inline functions
156 //-----------------------------------------------------------------------------
157 // Function : DopeInfo::operator<<
158 // Purpose : "<<" operator
159 // Special Notes :
160 // Scope : public
161 // Creator : Eric R. Keiter, 9233, SNL, Parallel Computational Sciences
162 // Creation Date : 03/31/03
163 //-----------------------------------------------------------------------------
164 inline std::ostream & operator<<(std::ostream & os, const DopeInfo & di)
165 {
166  os << di.name << ":\n";
167  os << " type = " << di.type << "\n";
168  os << " funcType = " << di.funcType << "\n";
169 
170  if (di.funcType == "expression")
171  {
172  os << " exp. string = " << di.exprString << "\n";
173  }
174 
175  os << " xloc = " << di.xloc << "\n";
176  os << " xwidth = " << di.xwidth << "\n";
177  os << " yloc = " << di.yloc << "\n";
178  os << " ywidth = " << di.ywidth << "\n";
179 
180  os << " Nmax = " << di.Nmax << "\n";
181  os << " Nmin = " << di.Nmin << "\n";
182 
183  os << " flatX = " << di.flatX << "\n";
184  os << " flatY = " << di.flatY << "\n";
185 
186  os << std::endl;
187 
188  return os;
189 }
190 
191 } // namespace Device
192 } // namespace Xyce
193 
194 #endif
195 
std::vector< double > dopeVec
static double ngdep(double x, double y, double W, double ax, double ay)
static ParametricData< DopeInfo > & getParametricData()
static double ngdep2(double x, double y, double ax, double ay)
static double nsdep(double x, double W, double Dt)
Pure virtual class to augment a linear system.
static void readDopingFile(std::string &filename, std::vector< double > &xloc, std::vector< double > &nvec, std::vector< double > &y2, DeviceSupport &devSup)
std::vector< double > xlocVec
void setupInfo(std::vector< double > &CVec, std::vector< double > &CdonorVec, std::vector< double > &CacceptorVec, std::vector< double > &xVec, DeviceSupport &devSup)
std::vector< double > y2Vec
void setupInfo2d(std::vector< double > &CVec, std::vector< double > &CdonorVec, std::vector< double > &CacceptorVec, std::vector< double > &xVec, std::vector< double > &yVec, DeviceSupport &devSup)
static double erf(double x)
bool processParam(Param &ndParam, std::string &param, DevicePDEInstance &di)
std::vector< double > splintDopeVec
#define W
Manages parameter binding for class C.
Definition: N_DEV_Pars.h:214
void processParams()
processParams post processes the parameters that have been set in the object of the derived class...
CompositeParam is the base class for classes that wish to only manage the processing of parameter dat...
std::ostream & operator<<(std::ostream &os, const Configuration &configuration)
Definition: N_DEV_Dump.C:134