45 #include <Xyce_config.h>
50 #include <N_UTL_Misc.h>
59 #ifdef Xyce_DEBUG_DEVICE
80 #include <N_LAS_Matrix.h>
81 #include <N_LAS_MultiVector.h>
82 #include <N_LAS_Vector.h>
87 #include <N_UTL_Expression.h>
117 .setDescription(
"Integer number to determine type of tecplot output. 0=no output. 1=single time-dependent file, with each time step in a different zone.");
124 "Parameter measurement temperature");
174 reactionFileCopyFlag(false),
175 haveAnyReactions(false),
176 useScaledVariablesFlag(true),
177 useDopingArrayData(false),
180 lastOutputTime(-10.0),
192 excludeNoSourceRegionsFlag(true),
193 excludeNoSourceRegionsFlagGiven(false),
194 transportFlagGiven(false),
195 transportFlag(false),
196 diffusionFlagGiven(false),
197 diffusionFlag(false),
198 dirichletBCFlag(false),
199 columnReorderingFlag(false),
229 std::string msg =
"Both transportFlag and diffusionFlag set in " +
getName() +
". Using transportFlag";
230 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, msg);
247 int numRegions=
regVec.size();
249 #ifdef Xyce_DEBUG_DEVICE
253 if (!(rdVec1.empty()))
255 Xyce::dout() <<
"Model Region Data vector:" << std::endl;
256 for (
int ireg=0;ireg<numRegions;++ireg)
259 Xyce::dout() << ireg <<
": "<< rd;
287 double dn =
static_cast<double>(size-1);
288 double dx = (xmax-xmin)/dn;
291 xVec.resize(size,0.0);
292 dxVec.resize(size,0.0);
304 for (i=0;i<size-1;++i)
345 std::vector<RegionData*> * rdVecPtr(0);
351 for (iReg=0;iReg!=numReg;++iReg)
354 double xtmp =
xVec[iReg];
356 std::vector<char> tmpname;
357 tmpname.resize(
getName().size()+10 );
358 sprintf( &(tmpname[0]),
"%s_%03d",
getName().c_str(),iReg);
359 std::string regName(&(tmpname[0]));
361 std::vector<char> tmpname2;
363 sprintf( &(tmpname2[0]),
"%s_%03d",
outputName.c_str(),iReg);
364 std::string outRegName(&(tmpname2[0]));
366 regDataPtr->
xloc = xtmp;
367 regDataPtr->
name = regName;
368 regDataPtr->
outName = outRegName;
371 (*rdVecPtr).push_back(regDataPtr);
389 for (iReg=0;iReg!=numReg;++iReg)
399 ( *((*rdVecPtr)[iReg]),
411 ( *((*rdVecPtr)[iReg]),
418 ((*rdVecPtr)[iReg])->doNothing=
true;
421 ( *((*rdVecPtr)[iReg]),
433 for (iReg=0;iReg!=numReg;++iReg)
443 ((*rdVecPtr)[iReg])->doNothing=
true;
448 ( *((*rdVecPtr)[iReg]),
527 #ifdef Xyce_DEBUG_DEVICE
534 Xyce::dout() << Xyce::section_divider << std::endl;
535 Xyce::dout() <<
"Instance::initializeChemistry ():" << std::endl;
536 for (; itSource!=itSourceEnd; ++itSource)
538 std::string speciesName (itSource->first);
539 Xyce::dout() <<
"speciesName = " << speciesName << std::endl;
541 Xyce::dout() << Xyce::section_divider << std::endl;
545 std::vector<RegionData*> * rdVecPtr(0);
548 int numRegions=
regVec.size();
549 for (
int ireg=0;ireg<numRegions;++ireg)
556 if (!(diMap.empty()))
560 std::map<std::string, DopeInfo *>::iterator iter;
561 std::map<std::string, DopeInfo *>::iterator start = diMap.begin();
562 std::map<std::string, DopeInfo *>::iterator end = diMap.end();
564 for ( iter = start; iter != end; ++iter )
568 bool reactantExist =
false;
585 if (
regVec[ireg]->reactantExist(
"BM"))
587 regVec[ireg]->setInitialCondition(
"BM", (*rdVecPtr)[ireg]->Boron_Concentration);
590 if (
regVec[ireg]->reactantExist(
"PP"))
592 regVec[ireg]->setInitialCondition(
"PP", (*rdVecPtr)[ireg]->Phosphorus_Concentration);
603 sourceOn = (
xVec[ireg] >= xlos) && (
xVec[ireg] <= xhis);
610 for (; itSource!=itSourceEnd; ++itSource)
612 std::string speciesName (itSource->first);
613 regVec[ireg]->addMasterSource(speciesName);
620 regVec[ireg]->scaleVariables ();
640 int localPosIndex = 0;
641 int localNegIndex = 1;
642 int indexCounter=localNegIndex+1;
647 jacStamp[localPosIndex][localPosIndex] = localPosIndex;
648 jacStamp[localPosIndex][localNegIndex] = localNegIndex;
651 jacStamp[localNegIndex][localPosIndex] = localPosIndex;
652 jacStamp[localNegIndex][localNegIndex] = localNegIndex;
662 int numRegions=
regVec.size();
663 for (ireg=0;ireg<numRegions;++ireg)
665 int concentrationSize =
regVec[ireg]->getNumSpecies();
666 if (concentrationSize != 0)
669 std::vector<int> voltageNodeColDep(2,-1);
670 voltageNodeColDep[0]=localPosIndex;
671 voltageNodeColDep[1]=localNegIndex;
673 int firstReactant=-1;
675 regVec[ireg]->setupJacStamp(
jacStamp,voltageNodeColDep, firstReactant, lastIndex);
685 int numSpecies =
thVec.size();
688 for (ireg=0;ireg<numRegions;++ireg)
690 if (!(
regVec[ireg]->getDoNothingFlag()) )
698 #ifdef Xyce_DEBUG_DEVICE
700 Xyce::dout() <<
regVec[ireg]->getName ()
707 for (isp=0;isp<numSpecies;++isp)
714 for (ireg=0;ireg<numRegions;++ireg)
717 if (row < 0)
continue;
726 else if (ireg==numRegions-1)
752 int posSize =
jacStamp[posRow].size();
754 int negSize =
jacStamp[negRow].size();
755 for (ireg=0;ireg<numRegions;++ireg)
762 int posRowSize =
jacStamp[posRow].size();
763 jacStamp[posRow].resize(posRowSize+numSpecie);
765 int negRowSize =
jacStamp[negRow].size();
766 jacStamp[negRow].resize(negRowSize+numSpecie);
768 for (isp=0;isp<numSpecie;++isp)
770 int icol = posRowSize+isp;
771 jacStamp[posRow][icol] = posIndex+isp ;
773 icol = negRowSize+isp;
774 jacStamp[negRow][icol] = posIndex+isp ;
793 int mapSize =
jacMap.size();
794 for (
int i=0;i<mapSize;++i)
798 for (
int j=0;j<
jacStamp[i].size();++j)
815 std::vector< std::vector<int> > tempStamp_eric;
816 std::vector< std::vector<int> > tempMap2_eric;
824 #ifdef Xyce_DEBUG_DEVICE
827 Xyce::dout() <<
"jacStamp Before removing terminal nodes:"<<std::endl;
829 Xyce::dout() <<
"jacMap2 Before removing terminal nodes:"<<std::endl;
847 std::vector<RegionData*> * rdVecPtr(0);
850 int size = (*rdVecPtr).size();
859 for (i=0;i<size-1;++i)
869 #ifdef Xyce_DEBUG_DEVICE
874 Xyce::dout() <<
"Scaled Mesh: xVec["<<i<<
"] = " <<
xVec[i] << std::endl;
876 Xyce::dout() << std::endl;
877 for (i=0;i<size-1;++i)
879 Xyce::dout() <<
"Scaled Mesh: dxVec["<<i<<
"] = " <<
dxVec[i] << std::endl;
881 Xyce::dout() << std::endl;
897 std::vector<RegionData*> * rdVecPtr(0);
899 if ( !((*rdVecPtr).empty()) )
902 int numSpecies =
thVec.size();
904 int size = (*rdVecPtr).size();
905 for (isp=0;isp<numSpecies;++isp)
907 thVec[isp].fluxVec.resize(size-1,0.0);
922 bool bsuccess =
true;
924 bool skipOutput =
false;
930 double outMult =
static_cast<double> (
outputIndex);
945 if (skipOutput)
return bsuccess;
952 int numRegions =
regVec.size();
955 for (
int ireg=0;ireg<numRegions;++ireg)
959 bs1 =
regVec[ireg]->outputTecplot ();
960 bsuccess = bsuccess && bs1;
970 bsuccess = bsuccess && bs1;
975 bsuccess = bsuccess && bs1;
980 int numRegions =
regVec.size();
981 if (outputRegion < numRegions && outputRegion >= 0)
986 bsuccess = bsuccess && bs1;
1004 bool bsuccess =
true;
1010 for(i=0;i<256;++i) filename[i] = static_cast<char>(0);
1012 sprintf(filename,
"%s.dat",
outputName.c_str());
1016 #ifdef Xyce_DEBUG_DEVICE
1019 Xyce::dout() <<
" Instance::outputTecplot. filename = " << std::string(filename) <<std::endl;
1025 fp1 = fopen(filename,
"w");
1027 " TITLE = \"Spatially Dependent defect data for compact rxn device: %s time = %20.12e seconds.\",\n",
1032 fp1 = fopen(filename,
"a");
1035 int rSize=(
regVec[0])->getNumSpecies();
1036 int cSize=(
regVec[0])->getNumConstants();
1040 fprintf(fp1,
"%s",
"\tVARIABLES = \"X \",\n");
1043 for (
int iconst=0;iconst<cSize;++iconst)
1048 for (
int ispec=0;ispec<rSize;++ispec)
1050 fprintf(fp1,
"\t \"%s \",\n", ( reg.
getSpeciesName(ispec)).c_str());
1055 fprintf(fp1,
"\tZONE F=POINT,I=%d", NX);
1059 fprintf(fp1,
" T = \"DCOP step = %d\" \n",
callsOTEC);
1063 fprintf(fp1,
" T = \"time step = %d, time=%20.12e\" AUXDATA time = \"%20.12e seconds\" \n",
callsOTEC , time, time);
1066 std::vector<RegionData*> * rdVecPtr(0);
1071 fprintf(fp1,
" %20.12e", time);
1079 fprintf(fp1,
" %20.12e", val);
1083 for (
int iconst=0;iconst<cSize;++iconst)
1086 fprintf(fp1,
" %20.12e", val);
1090 fprintf(fp1,
"%s",
"\n"); numprint = 0;
1098 for (
int ispec=0;ispec<rSize;++ispec)
1105 fprintf(fp1,
" %20.12e", val);
1109 fprintf(fp1,
"%s",
"\n"); numprint = 0;
1118 fprintf(fp1,
"%s",
"\n");
1136 bool bsuccess =
true;
1142 for(i=0;i<256;++i) filename[i] = static_cast<char>(0);
1144 sprintf(filename,
"%s.dat",
outputName.c_str());
1150 fp1 = fopen(filename,
"w");
1152 " TITLE = \"Spatially Dependent defect data for compact rxn device: %s time = %20.12e seconds.\",\n",
1157 fp1 = fopen(filename,
"a");
1160 int rSize=(
regVec[0])->getNumSpecies();
1161 int cSize=(
regVec[0])->getNumConstants();
1165 fprintf(fp1,
"%s",
"\tVARIABLES = \"X \",\n");
1166 fprintf(fp1,
"%s",
"\t \"Time(sec) \",\n");
1169 for (
int iconst=0;iconst<cSize;++iconst)
1174 for (
int ispec=0;ispec<rSize;++ispec)
1176 fprintf(fp1,
"\t \"%s \",\n", ( reg.
getSpeciesName(ispec)).c_str());
1179 fprintf(fp1,
"\tZONE F=POINT,I=%d", NX);
1182 fprintf(fp1,
"%s",
" \n");
1184 std::vector<RegionData*> * rdVecPtr(0);
1189 fprintf(fp1,
" %20.12e", time);
1196 val = ((*rdVecPtr)[i])->xloc;
1197 fprintf(fp1,
" %20.12e", val);
1199 fprintf(fp1,
" %20.12e", time);
1203 for (
int iconst=0;iconst<cSize;++iconst)
1206 fprintf(fp1,
" %20.12e", val);
1210 fprintf(fp1,
"%s",
"\n"); numprint = 0;
1218 for (
int ispec=0;ispec<rSize;++ispec)
1221 fprintf(fp1,
" %20.12e", val);
1225 fprintf(fp1,
"%s",
"\n"); numprint = 0;
1234 fprintf(fp1,
"%s",
"\n");
1252 bool bsuccess =
true;
1256 char filename[256];
for(i=0;i<256;++i) filename[i] = static_cast<char>(0);
1257 sprintf(filename,
"%scarrier.dat",
outputName.c_str());
1260 fp1 = fopen(filename,
"w");
1261 int cSize=(
regVec[0])->getNumConstants();
1263 std::vector<RegionData*> * rdVecPtr(0);
1269 val = ((*rdVecPtr)[i])->xloc;
1270 fprintf(fp1,
" %20.12e", val);
1274 for (
int iconst=0;iconst<cSize;++iconst)
1277 fprintf(fp1,
" %20.12e", val);
1279 fprintf(fp1,
"%s",
"\n");
1300 int size =
regVec.size();
1302 for (i=0;i<size;++i)
1315 std::map<std::string,DopeInfo *>::iterator iter;
1316 std::map<std::string,DopeInfo *>::iterator begin =
dopeInfoMap.begin();
1317 std::map<std::string,DopeInfo *>::iterator end =
dopeInfoMap.end ();
1319 for(iter=begin;iter!=end;++iter)
1321 if (iter->second != 0)
delete iter->second;
1338 const std::vector<int> & extLIDVecRef )
1343 #ifdef Xyce_DEBUG_DEVICE
1346 Xyce::dout() << section_divider << std::endl;
1347 Xyce::dout() <<
" Instance::registerLIDs" <<std::endl;
1348 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1349 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
1350 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
1351 Xyce::dout() <<
" numIntVars = " <<
numIntVars << std::endl;
1352 Xyce::dout() <<
" numExtVars = " <<
numExtVars << std::endl;
1360 #ifdef Xyce_DEBUG_DEVICE
1363 Xyce::dout() <<
" Internal LID List" << std::endl;
1364 for(
int i = 0; i <
intLIDVec.size(); ++i )
1365 Xyce::dout() <<
" " <<
intLIDVec[i] << std::endl;
1366 Xyce::dout() <<
" External LID List" << std::endl;
1367 for(
int i = 0; i <
extLIDVec.size(); ++i )
1368 Xyce::dout() <<
" " <<
extLIDVec[i] << std::endl;
1380 #ifdef Xyce_DEBUG_DEVICE
1383 Xyce::dout() <<
" li_Pos = " <<
li_Pos << std::endl;
1384 Xyce::dout() <<
" li_Neg = " <<
li_Neg << std::endl;
1389 int numRegions =
regVec.size();
1390 for (
int ireg=0;ireg<numRegions;++ireg)
1398 int numSpecies =
thVec.size();
1399 int size =
regVec.size();
1403 for (ispec=0;ispec<numSpecies;++ispec)
1405 std::string speciesName =
regVec[0]->getSpeciesName(ispec);
1406 thVec[ispec].specie_id.resize(size,-1);
1407 for (i=0;i<size;++i)
1409 thVec[ispec].specie_id[i] = (
regVec[i])->getSpeciesLID (speciesName);
1414 #ifdef Xyce_DEBUG_DEVICE
1417 Xyce::dout() << section_divider << std::endl;
1438 int numRegions =
regVec.size();
1439 for (
int ireg=0;ireg<numRegions;++ireg)
1465 int numRegions =
regVec.size();
1466 for (
int ireg=0;ireg<numRegions;++ireg)
1468 regVec[ireg]->registerStateLIDs(staLIDVec,i);
1510 std::vector<int> &map=
jacMap;
1511 std::vector< std::vector<int> > &map2=
jacMap2;
1522 int numRegions =
regVec.size();
1523 for (
int ireg=0;ireg<numRegions;++ireg)
1536 for (
int ireg=0;ireg<numRegions;++ireg)
1538 int row = regPosIndexVec[ireg] + regV0subIndexVec[ireg];
1539 if (row < 0)
continue;
1541 int rowSize =
jacStamp[row].size();
1544 int col = regPosIndexVec[1] + regV0subIndexVec[1];
1548 else if (ireg==numRegions-1)
1550 int col = regPosIndexVec[numRegions-2] + regV0subIndexVec[numRegions-2];
1556 int col1 = regPosIndexVec[ireg+1] + regV0subIndexVec[ireg+1];
1557 int col2 = regPosIndexVec[ireg-1] + regV0subIndexVec[ireg-1];
1565 for (
int iReg=0;iReg<numRegions;++iReg)
1593 int numRegions =
regVec.size();
1603 for (
int ireg=0;ireg<numRegions;++ireg)
1607 regVec[ireg]->setupPointers (dFdx,dQdx);
1623 #ifdef Xyce_DEBUG_DEVICE
1626 Xyce::dout() <<
"Start Instance::updateTemperature" << std::endl;
1627 Xyce::dout() <<
"temp = "<<temp << std::endl;
1630 if( temp != -999.0 )
TEMP = temp;
1642 int numRegions =
regVec.size();
1643 for (
int i=0;i<numRegions;++i)
1651 int numSpecies =
regVec[0]->getNumSpecies();
1652 thVec.reserve(numSpecies);
1653 for (
int ispec=0;ispec<numSpecies;++ispec)
1655 std::string speciesName =
regVec[0]->getSpeciesName(ispec);
1657 double Dtmp = (
regVec[0])->getDiffusionCoefficient (ispec,
TEMP);
1661 #ifdef Xyce_DEBUG_DEVICE
1666 Xyce::dout() <<
"Vacancy Diffusion: scaling=TRUE ";
1667 Xyce::dout() <<
"D_"<<speciesName<<
" = " << Dtmp << std::endl;
1671 Xyce::dout() <<
"Vacancy Diffusion: scaling=FALSE ";
1672 Xyce::dout() <<
"D_"<<speciesName<<
" = " << Dtmp << std::endl;
1678 #ifdef Xyce_DEBUG_DEVICE
1681 for (
int ispec=0;ispec<numSpecies;++ispec)
1683 Xyce::dout() <<
"Vacancy Diffusion: D_" <<
thVec[ispec].name <<
" transportFlag = ";
1685 else Xyce::dout() <<
"FALSE";
1686 Xyce::dout() << std::endl;
1711 bool returnVal=
false;
1714 int numRegions =
regVec.size();
1717 for (
int ireg=0;ireg<numRegions;++ireg)
1719 bool tmpval =
regVec[ireg]->loadDeviceMask (maskVector);
1722 if (tmpval) returnVal =
true;
1751 int numRegions =
regVec.size();
1752 for (
int ireg=0;ireg<numRegions;++ireg)
1754 regVec[ireg]->loadDAEQVector (daeQVec);
1778 double vbe_diff = 0.0;
1782 int numRegions =
regVec.size();
1783 for (
int ireg=0;ireg<numRegions;++ireg)
1786 regVec[ireg]->loadDAEFVector (daeFVec);
1787 regVec[ireg]->loadDAEdFdxdV(dFdxdVp, vbe_diff);
1794 int numSpecies =
thVec.size();
1796 for (isp=0;isp<numSpecies;++isp)
1801 int size =
regVec.size();
1803 std::vector<int> & specie_id =
thVec[isp].specie_id;
1805 double dx1 =
dxVec[0];
1806 double xloVal = (
thVec[isp].fluxVec[0]-
thVec[isp].flux_bc1)/dx1;
1807 daeFVec[specie_id[0]] += xloVal;
1809 for (i=1;i<size-1;++i)
1811 double fluxDif = (
thVec[isp].fluxVec[i]-
thVec[isp].fluxVec[i-1]);
1813 daeFVec[specie_id[i]] += (fluxDif)/aveDx;
1816 double dx2 =
dxVec[size-2];
1817 double xhiVal = (
thVec[isp].flux_bc2-
thVec[isp].fluxVec[size-2])/dx2;
1818 daeFVec[specie_id[size-1]] += xhiVal;
1843 bool bsuccess =
true;
1844 bool tmpBool =
true;
1847 #ifdef Xyce_DEBUG_DEVICE
1852 Xyce::dout() << subsection_divider << std::endl;
1853 Xyce::dout() <<
"Rxn dQdx load:" << std::endl;
1854 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1859 bsuccess = bsuccess && tmpBool;
1861 #ifdef Xyce_DEBUG_DEVICE
1863 Xyce::dout() << subsection_divider << std::endl;
1883 bool bsuccess =
true;
1887 int numRegions =
regVec.size();
1888 for (
int ireg=0;ireg<numRegions;++ireg)
1890 regVec[ireg]->loadDAEdQdx (dQdxMat);
1909 bool bsuccess =
true;
1910 bool tmpBool =
true;
1914 #ifdef Xyce_DEBUG_DEVICE
1919 Xyce::dout() << subsection_divider << std::endl;
1920 Xyce::dout() <<
"Rxn dFdx load:" << std::endl;
1921 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1926 bsuccess = bsuccess && tmpBool;
1928 #ifdef Xyce_DEBUG_DEVICE
1931 Xyce::dout() << subsection_divider << std::endl;
1956 int numRegions =
regVec.size();
1961 cSize = (
regVec[0])->getNumConstants();
1962 rSize = (
regVec[0])->getNumSpecies();
1963 for (
int ireg=0;ireg<numRegions;++ireg)
1965 regVec[ireg]->loadDAEdFdx(dFdxMat);
1967 if (
cols.size() < rSize)
cols.resize(rSize,0);
1976 int numSpecies =
thVec.size();
1978 for (isp=0;isp<numSpecies;++isp)
1983 int size =
regVec.size();
1985 double DiffC =
thVec[isp].D_specie;
1986 std::vector<int> & specie_id =
thVec[isp].specie_id;
1988 for (i=0;i<size;++i)
1990 int row = specie_id[i];
1993 double aveDx = (
dxVec[i]);
1994 double coef = DiffC/(aveDx*
dxVec[i]);
1997 cols[0] = specie_id[i ];
vals[0] =
thVec[isp].bcScale1 * coef;
1998 cols[1] = specie_id[i+1];
vals[1] =-coef;
2000 bool bs1 = dFdxMat.sumIntoLocalRow (row, count, &
vals[0], &
cols[0]);
2002 else if (i==(size-1))
2004 double aveDx = (
dxVec[i-1]);
2005 double coef = DiffC/(aveDx*
dxVec[i-1]);
2007 cols[0] = specie_id[i-1];
vals[0] =-coef;
2008 cols[1] = specie_id[i ];
vals[1] =
thVec[isp].bcScale2 * coef;
2010 bool bs1 = dFdxMat.sumIntoLocalRow (row, count, &
vals[0], &
cols[0]);
2015 double coef1 = DiffC/(aveDx*
dxVec[i-1]);
2016 double coef2 = DiffC/(aveDx*
dxVec[i ]);
2017 double coefSum = coef1+coef2;
2020 cols[0] = specie_id[i-1];
vals[0] =-coef1;
2021 cols[1] = specie_id[i ];
vals[1] = coefSum;
2022 cols[2] = specie_id[i+1];
vals[2] =-coef2;
2024 bool bs1 = dFdxMat.sumIntoLocalRow (row, count, &
vals[0], &
cols[0]);
2044 bool bsuccess =
true;
2046 #ifdef Xyce_DEBUG_DEVICE
2050 Xyce::dout() << subsection_divider << std::endl;
2051 Xyce::dout() <<
" Start Instance::updatePrimaryState\n";
2052 Xyce::dout() <<
" name = " <<
getName() << std::endl;
2065 int numRegions =
regVec.size();
2066 for (
int ireg=0;ireg<numRegions;++ireg)
2070 int rSize =
regVec[ireg]->getNumSpecies();
2071 for (
int i=0;i<rSize;++i)
2073 staVector[
regVec[ireg]->getStateConcentrationLID(i)] = regVec[ireg]->getStateConcentration(i);
2086 numRegions =
regVec.size();
2087 for (
int ireg=0;ireg<numRegions;++ireg)
2091 int rSize =
regVec[ireg]->getNumSpecies();
2092 for (
int i=0;i<rSize;++i)
2094 currStaVector[
regVec[ireg]->getStateConcentrationLID(i)] = regVec[ireg]->getStateConcentration(i);
2115 #ifdef Xyce_DEBUG_DEVICE
2119 Xyce::dout() << subsection_divider << std::endl;
2120 Xyce::dout() <<
" Start Instance::updateSecondaryState\n";
2121 Xyce::dout() <<
" name = " <<
getName() << std::endl;
2126 int numRegions =
regVec.size();
2127 for (
int ireg=0;ireg<numRegions;++ireg)
2129 regVec[ireg]->updateSecondaryState (staDeriv);
2151 #ifdef Xyce_DEBUG_DEVICE
2154 Xyce::dout() << subsection_divider << std::endl;
2155 Xyce::dout() <<
" In Instance::updateIntermediateVars" << std::endl;
2156 Xyce::dout() <<
" name = " <<
getName() << std::endl;
2173 int numRegions =
regVec.size();
2174 for (
int ireg=0;ireg<numRegions;++ireg)
2177 regVec[ireg]->updateIntermediateVars (solVec, oldSolVec, time);
2181 int numSpecies =
thVec.size();
2185 for (isp=0;isp<numSpecies;++isp)
2190 int size =
thVec[isp].fluxVec.size();
2191 double DiffC =
thVec[isp].D_specie;
2192 for (i=0;i<size;++i)
2194 double n2 = solVec[
thVec[isp].specie_id[i ]];
2195 double n1 = solVec[
thVec[isp].specie_id[i+1]];
2197 thVec[isp].fluxVec[i] = DiffC*(n2-n1)/
dxVec[i];
2206 n1 = solVec[
thVec[isp].specie_id[0]];
2208 thVec[isp].flux_bc1 = DiffC*(n2-n1)/
dxVec[0];
2211 n2 = solVec[
thVec[isp].specie_id[size]];
2212 thVec[isp].flux_bc2 = DiffC*(n2-n1)/
dxVec[size];
2214 thVec[isp].bcScale1=2.0;
2215 thVec[isp].bcScale2=2.0;
2219 thVec[isp].flux_bc1 = 0.0;
2220 thVec[isp].flux_bc2 = 0.0;
2244 std::vector<N_UTL_BreakPoint> &breakPointTimes)
2246 int numRegions =
regVec.size();
2248 for (
int ireg=0;ireg<numRegions;++ireg)
2251 junk=
regVec[ireg]->getBreakTime();
2252 breakPointTimes.push_back(junk);
2267 #ifdef Xyce_DEBUG_DEVICE
2271 if (cName ==
"DOPINGPROFILES" || cName ==
"REGION")
2275 return (static_cast<CompositeParam *> (doping));
2277 else if (cName ==
"SOURCELIST")
2281 return (static_cast<CompositeParam *> (sources));
2286 "Model::constructComposite: unrecognized composite name: ";
2288 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
2318 std::vector<Instance*>::iterator iter;
2322 for (iter=first; iter!=last; ++iter)
2324 (*iter)->processParams();
2342 :
DevicePDEModel(MB,configuration.getModelParameters(), factory_block),
2346 rxnFileName(
"NOFILE"),
2352 xlo_sourceGiven(false),
2353 xhi_sourceGiven(false),
2373 UserWarning(*
this) <<
"XLO_SOURCE >= XHI_SOURCE. Ignoring, and using a spatially uniform source";
2407 std::vector<Instance*>::iterator iter;
2411 for (iter=first; iter!=last; ++iter)
2420 for (i=0;i<size;++i)
2433 std::map<std::string,DopeInfo *>::iterator iter;
2434 std::map<std::string,DopeInfo *>::iterator begin =
dopeInfoMap.begin();
2435 std::map<std::string,DopeInfo *>::iterator end =
dopeInfoMap.end ();
2437 for(iter=begin;iter!=end;++iter)
2439 if (iter->second != 0)
delete iter->second;
2446 std::map<std::string,SpecieSource *>::iterator iter;
2447 std::map<std::string,SpecieSource *>::iterator begin =
defectSourceMap.begin();
2448 std::map<std::string,SpecieSource *>::iterator end =
defectSourceMap.end ();
2450 for(iter=begin;iter!=end;++iter)
2452 if (iter->second != 0)
2454 delete iter->second;
2473 std::vector<Instance*>::const_iterator iter;
2478 os <<
" name model name Parameters" << std::endl;
2479 for (i = 0, iter = first; iter != last; ++iter, ++i)
2481 os <<
" " << i <<
": " << (*iter)->getName() <<
" ";
2485 os <<
" TEMP = " << (*iter)->TEMP << std::endl;
2496 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
2510 .registerDevice(
"rxn", 1)
2511 .registerModelType(
"rxn", 1);