45 #include <Xyce_config.h>
50 #include <N_UTL_Misc.h>
60 #ifdef Xyce_DEBUG_DEVICE
81 #include <N_LAS_Matrix.h>
82 #include <N_LAS_MultiVector.h>
83 #include <N_LAS_Vector.h>
88 #include <N_UTL_Expression.h>
118 .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.");
125 "Parameter measurement temperature");
175 reactionFileCopyFlag(false),
176 haveAnyReactions(false),
177 useScaledVariablesFlag(true),
178 useDopingArrayData(false),
181 lastOutputTime(-10.0),
193 excludeNoSourceRegionsFlag(true),
194 excludeNoSourceRegionsFlagGiven(false),
195 transportFlagGiven(false),
196 transportFlag(false),
197 diffusionFlagGiven(false),
198 diffusionFlag(false),
199 dirichletBCFlag(false),
200 columnReorderingFlag(false),
230 Report::UserWarning() <<
"Both transportFlag and diffusionFlag set in " <<
getName() <<
". Using transportFlag";
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)
355 std::ostringstream oss;
356 oss <<
getName() <<
"_" << std::setw(3) << std::setfill(
'0') << iReg;
357 regDataPtr->
name = oss.str();
361 std::ostringstream oss;
362 oss <<
outputName <<
"_" << std::setw(3) << std::setfill(
'0') << iReg;
363 regDataPtr->
outName = oss.str();
369 (*rdVecPtr).push_back(regDataPtr);
387 for (iReg=0;iReg!=numReg;++iReg)
397 ( *((*rdVecPtr)[iReg]),
409 ( *((*rdVecPtr)[iReg]),
416 ((*rdVecPtr)[iReg])->doNothing=
true;
419 ( *((*rdVecPtr)[iReg]),
431 for (iReg=0;iReg!=numReg;++iReg)
441 ((*rdVecPtr)[iReg])->doNothing=
true;
446 ( *((*rdVecPtr)[iReg]),
525 #ifdef Xyce_DEBUG_DEVICE
532 Xyce::dout() << Xyce::section_divider << std::endl;
533 Xyce::dout() <<
"Instance::initializeChemistry ():" << std::endl;
534 for (; itSource!=itSourceEnd; ++itSource)
536 std::string speciesName (itSource->first);
537 Xyce::dout() <<
"speciesName = " << speciesName << std::endl;
539 Xyce::dout() << Xyce::section_divider << std::endl;
543 std::vector<RegionData*> * rdVecPtr(0);
546 int numRegions=
regVec.size();
547 for (
int ireg=0;ireg<numRegions;++ireg)
554 if (!(diMap.empty()))
558 std::map<std::string, DopeInfo *>::iterator iter;
559 std::map<std::string, DopeInfo *>::iterator start = diMap.begin();
560 std::map<std::string, DopeInfo *>::iterator end = diMap.end();
562 for ( iter = start; iter != end; ++iter )
566 bool reactantExist =
false;
583 if (
regVec[ireg]->reactantExist(
"BM"))
585 regVec[ireg]->setInitialCondition(
"BM", (*rdVecPtr)[ireg]->Boron_Concentration);
588 if (
regVec[ireg]->reactantExist(
"PP"))
590 regVec[ireg]->setInitialCondition(
"PP", (*rdVecPtr)[ireg]->Phosphorus_Concentration);
601 sourceOn = (
xVec[ireg] >= xlos) && (
xVec[ireg] <= xhis);
608 for (; itSource!=itSourceEnd; ++itSource)
610 std::string speciesName (itSource->first);
611 regVec[ireg]->addMasterSource(speciesName);
618 regVec[ireg]->scaleVariables ();
638 int localPosIndex = 0;
639 int localNegIndex = 1;
640 int indexCounter=localNegIndex+1;
645 jacStamp[localPosIndex][localPosIndex] = localPosIndex;
646 jacStamp[localPosIndex][localNegIndex] = localNegIndex;
649 jacStamp[localNegIndex][localPosIndex] = localPosIndex;
650 jacStamp[localNegIndex][localNegIndex] = localNegIndex;
660 int numRegions=
regVec.size();
661 for (ireg=0;ireg<numRegions;++ireg)
663 int concentrationSize =
regVec[ireg]->getNumSpecies();
664 if (concentrationSize != 0)
667 std::vector<int> voltageNodeColDep(2,-1);
668 voltageNodeColDep[0]=localPosIndex;
669 voltageNodeColDep[1]=localNegIndex;
671 int firstReactant=-1;
673 regVec[ireg]->setupJacStamp(
jacStamp,voltageNodeColDep, firstReactant, lastIndex);
683 int numSpecies =
thVec.size();
686 for (ireg=0;ireg<numRegions;++ireg)
688 if (!(
regVec[ireg]->getDoNothingFlag()) )
696 #ifdef Xyce_DEBUG_DEVICE
698 Xyce::dout() <<
regVec[ireg]->getName ()
705 for (isp=0;isp<numSpecies;++isp)
712 for (ireg=0;ireg<numRegions;++ireg)
715 if (row < 0)
continue;
724 else if (ireg==numRegions-1)
750 int posSize =
jacStamp[posRow].size();
752 int negSize =
jacStamp[negRow].size();
753 for (ireg=0;ireg<numRegions;++ireg)
760 int posRowSize =
jacStamp[posRow].size();
761 jacStamp[posRow].resize(posRowSize+numSpecie);
763 int negRowSize =
jacStamp[negRow].size();
764 jacStamp[negRow].resize(negRowSize+numSpecie);
766 for (isp=0;isp<numSpecie;++isp)
768 int icol = posRowSize+isp;
769 jacStamp[posRow][icol] = posIndex+isp ;
771 icol = negRowSize+isp;
772 jacStamp[negRow][icol] = posIndex+isp ;
791 int mapSize =
jacMap.size();
792 for (
int i=0;i<mapSize;++i)
796 for (
int j=0;j<
jacStamp[i].size();++j)
813 std::vector< std::vector<int> > tempStamp_eric;
814 std::vector< std::vector<int> > tempMap2_eric;
822 #ifdef Xyce_DEBUG_DEVICE
825 Xyce::dout() <<
"jacStamp Before removing terminal nodes:"<<std::endl;
827 Xyce::dout() <<
"jacMap2 Before removing terminal nodes:"<<std::endl;
845 std::vector<RegionData*> * rdVecPtr(0);
848 int size = (*rdVecPtr).size();
857 for (i=0;i<size-1;++i)
867 #ifdef Xyce_DEBUG_DEVICE
872 Xyce::dout() <<
"Scaled Mesh: xVec["<<i<<
"] = " <<
xVec[i] << std::endl;
874 Xyce::dout() << std::endl;
875 for (i=0;i<size-1;++i)
877 Xyce::dout() <<
"Scaled Mesh: dxVec["<<i<<
"] = " <<
dxVec[i] << std::endl;
879 Xyce::dout() << std::endl;
895 std::vector<RegionData*> * rdVecPtr(0);
897 if ( !((*rdVecPtr).empty()) )
900 int numSpecies =
thVec.size();
902 int size = (*rdVecPtr).size();
903 for (isp=0;isp<numSpecies;++isp)
905 thVec[isp].fluxVec.resize(size-1,0.0);
920 bool bsuccess =
true;
922 bool skipOutput =
false;
928 double outMult =
static_cast<double> (
outputIndex);
943 if (skipOutput)
return bsuccess;
950 int numRegions =
regVec.size();
953 for (
int ireg=0;ireg<numRegions;++ireg)
957 bs1 =
regVec[ireg]->outputTecplot ();
958 bsuccess = bsuccess && bs1;
968 bsuccess = bsuccess && bs1;
973 bsuccess = bsuccess && bs1;
978 int numRegions =
regVec.size();
979 if (outputRegion < numRegions && outputRegion >= 0)
984 bsuccess = bsuccess && bs1;
1002 bool bsuccess =
true;
1008 for(i=0;i<256;++i) filename[i] = static_cast<char>(0);
1010 sprintf(filename,
"%s.dat",
outputName.c_str());
1014 #ifdef Xyce_DEBUG_DEVICE
1017 Xyce::dout() <<
" Instance::outputTecplot. filename = " << std::string(filename) <<std::endl;
1023 fp1 = fopen(filename,
"w");
1025 " TITLE = \"Spatially Dependent defect data for compact rxn device: %s time = %20.12e seconds.\",\n",
1030 fp1 = fopen(filename,
"a");
1033 int rSize=(
regVec[0])->getNumSpecies();
1034 int cSize=(
regVec[0])->getNumConstants();
1038 fprintf(fp1,
"%s",
"\tVARIABLES = \"X \",\n");
1041 for (
int iconst=0;iconst<cSize;++iconst)
1046 for (
int ispec=0;ispec<rSize;++ispec)
1048 fprintf(fp1,
"\t \"%s \",\n", ( reg.
getSpeciesName(ispec)).c_str());
1053 fprintf(fp1,
"\tZONE F=POINT,I=%d", NX);
1057 fprintf(fp1,
" T = \"DCOP step = %d\" \n",
callsOTEC);
1061 fprintf(fp1,
" T = \"time step = %d, time=%20.12e\" AUXDATA time = \"%20.12e seconds\" \n",
callsOTEC , time, time);
1064 std::vector<RegionData*> * rdVecPtr(0);
1069 fprintf(fp1,
" %20.12e", time);
1077 fprintf(fp1,
" %20.12e", val);
1081 for (
int iconst=0;iconst<cSize;++iconst)
1084 fprintf(fp1,
" %20.12e", val);
1088 fprintf(fp1,
"%s",
"\n"); numprint = 0;
1096 for (
int ispec=0;ispec<rSize;++ispec)
1103 fprintf(fp1,
" %20.12e", val);
1107 fprintf(fp1,
"%s",
"\n"); numprint = 0;
1116 fprintf(fp1,
"%s",
"\n");
1134 bool bsuccess =
true;
1140 for(i=0;i<256;++i) filename[i] = static_cast<char>(0);
1142 sprintf(filename,
"%s.dat",
outputName.c_str());
1148 fp1 = fopen(filename,
"w");
1150 " TITLE = \"Spatially Dependent defect data for compact rxn device: %s time = %20.12e seconds.\",\n",
1155 fp1 = fopen(filename,
"a");
1158 int rSize=(
regVec[0])->getNumSpecies();
1159 int cSize=(
regVec[0])->getNumConstants();
1163 fprintf(fp1,
"%s",
"\tVARIABLES = \"X \",\n");
1164 fprintf(fp1,
"%s",
"\t \"Time(sec) \",\n");
1167 for (
int iconst=0;iconst<cSize;++iconst)
1172 for (
int ispec=0;ispec<rSize;++ispec)
1174 fprintf(fp1,
"\t \"%s \",\n", ( reg.
getSpeciesName(ispec)).c_str());
1177 fprintf(fp1,
"\tZONE F=POINT,I=%d", NX);
1180 fprintf(fp1,
"%s",
" \n");
1182 std::vector<RegionData*> * rdVecPtr(0);
1187 fprintf(fp1,
" %20.12e", time);
1194 val = ((*rdVecPtr)[i])->xloc;
1195 fprintf(fp1,
" %20.12e", val);
1197 fprintf(fp1,
" %20.12e", time);
1201 for (
int iconst=0;iconst<cSize;++iconst)
1204 fprintf(fp1,
" %20.12e", val);
1208 fprintf(fp1,
"%s",
"\n"); numprint = 0;
1216 for (
int ispec=0;ispec<rSize;++ispec)
1219 fprintf(fp1,
" %20.12e", val);
1223 fprintf(fp1,
"%s",
"\n"); numprint = 0;
1232 fprintf(fp1,
"%s",
"\n");
1250 bool bsuccess =
true;
1254 char filename[256];
for(i=0;i<256;++i) filename[i] = static_cast<char>(0);
1255 sprintf(filename,
"%scarrier.dat",
outputName.c_str());
1258 fp1 = fopen(filename,
"w");
1259 int cSize=(
regVec[0])->getNumConstants();
1261 std::vector<RegionData*> * rdVecPtr(0);
1267 val = ((*rdVecPtr)[i])->xloc;
1268 fprintf(fp1,
" %20.12e", val);
1272 for (
int iconst=0;iconst<cSize;++iconst)
1275 fprintf(fp1,
" %20.12e", val);
1277 fprintf(fp1,
"%s",
"\n");
1298 int size =
regVec.size();
1300 for (i=0;i<size;++i)
1313 std::map<std::string,DopeInfo *>::iterator iter;
1314 std::map<std::string,DopeInfo *>::iterator begin =
dopeInfoMap.begin();
1315 std::map<std::string,DopeInfo *>::iterator end =
dopeInfoMap.end ();
1317 for(iter=begin;iter!=end;++iter)
1319 if (iter->second != 0)
delete iter->second;
1336 const std::vector<int> & extLIDVecRef )
1341 #ifdef Xyce_DEBUG_DEVICE
1344 Xyce::dout() << section_divider << std::endl;
1345 Xyce::dout() <<
" Instance::registerLIDs" <<std::endl;
1346 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1347 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
1348 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
1349 Xyce::dout() <<
" numIntVars = " <<
numIntVars << std::endl;
1350 Xyce::dout() <<
" numExtVars = " <<
numExtVars << std::endl;
1358 #ifdef Xyce_DEBUG_DEVICE
1361 Xyce::dout() <<
" Internal LID List" << std::endl;
1362 for(
int i = 0; i <
intLIDVec.size(); ++i )
1363 Xyce::dout() <<
" " <<
intLIDVec[i] << std::endl;
1364 Xyce::dout() <<
" External LID List" << std::endl;
1365 for(
int i = 0; i <
extLIDVec.size(); ++i )
1366 Xyce::dout() <<
" " <<
extLIDVec[i] << std::endl;
1378 #ifdef Xyce_DEBUG_DEVICE
1381 Xyce::dout() <<
" li_Pos = " <<
li_Pos << std::endl;
1382 Xyce::dout() <<
" li_Neg = " <<
li_Neg << std::endl;
1387 int numRegions =
regVec.size();
1388 for (
int ireg=0;ireg<numRegions;++ireg)
1396 int numSpecies =
thVec.size();
1397 int size =
regVec.size();
1401 for (ispec=0;ispec<numSpecies;++ispec)
1403 std::string speciesName =
regVec[0]->getSpeciesName(ispec);
1404 thVec[ispec].specie_id.resize(size,-1);
1405 for (i=0;i<size;++i)
1407 thVec[ispec].specie_id[i] = (
regVec[i])->getSpeciesLID (speciesName);
1412 #ifdef Xyce_DEBUG_DEVICE
1415 Xyce::dout() << section_divider << std::endl;
1436 int numRegions =
regVec.size();
1437 for (
int ireg=0;ireg<numRegions;++ireg)
1463 int numRegions =
regVec.size();
1464 for (
int ireg=0;ireg<numRegions;++ireg)
1466 regVec[ireg]->registerStateLIDs(staLIDVec,i);
1508 std::vector<int> &map=
jacMap;
1509 std::vector< std::vector<int> > &map2=
jacMap2;
1520 int numRegions =
regVec.size();
1521 for (
int ireg=0;ireg<numRegions;++ireg)
1534 for (
int ireg=0;ireg<numRegions;++ireg)
1536 int row = regPosIndexVec[ireg] + regV0subIndexVec[ireg];
1537 if (row < 0)
continue;
1539 int rowSize =
jacStamp[row].size();
1542 int col = regPosIndexVec[1] + regV0subIndexVec[1];
1546 else if (ireg==numRegions-1)
1548 int col = regPosIndexVec[numRegions-2] + regV0subIndexVec[numRegions-2];
1554 int col1 = regPosIndexVec[ireg+1] + regV0subIndexVec[ireg+1];
1555 int col2 = regPosIndexVec[ireg-1] + regV0subIndexVec[ireg-1];
1563 for (
int iReg=0;iReg<numRegions;++iReg)
1591 int numRegions =
regVec.size();
1601 for (
int ireg=0;ireg<numRegions;++ireg)
1605 regVec[ireg]->setupPointers (dFdx,dQdx);
1621 #ifdef Xyce_DEBUG_DEVICE
1624 Xyce::dout() <<
"Start Instance::updateTemperature" << std::endl;
1625 Xyce::dout() <<
"temp = "<<temp << std::endl;
1628 if( temp != -999.0 )
TEMP = temp;
1640 int numRegions =
regVec.size();
1641 for (
int i=0;i<numRegions;++i)
1649 int numSpecies =
regVec[0]->getNumSpecies();
1650 thVec.reserve(numSpecies);
1651 for (
int ispec=0;ispec<numSpecies;++ispec)
1653 std::string speciesName =
regVec[0]->getSpeciesName(ispec);
1655 double Dtmp = (
regVec[0])->getDiffusionCoefficient (ispec,
TEMP);
1659 #ifdef Xyce_DEBUG_DEVICE
1664 Xyce::dout() <<
"Vacancy Diffusion: scaling=TRUE ";
1665 Xyce::dout() <<
"D_"<<speciesName<<
" = " << Dtmp << std::endl;
1669 Xyce::dout() <<
"Vacancy Diffusion: scaling=FALSE ";
1670 Xyce::dout() <<
"D_"<<speciesName<<
" = " << Dtmp << std::endl;
1676 #ifdef Xyce_DEBUG_DEVICE
1679 for (
int ispec=0;ispec<numSpecies;++ispec)
1681 Xyce::dout() <<
"Vacancy Diffusion: D_" <<
thVec[ispec].name <<
" transportFlag = ";
1683 else Xyce::dout() <<
"FALSE";
1684 Xyce::dout() << std::endl;
1709 bool returnVal=
false;
1712 int numRegions =
regVec.size();
1715 for (
int ireg=0;ireg<numRegions;++ireg)
1717 bool tmpval =
regVec[ireg]->loadDeviceMask (maskVector);
1720 if (tmpval) returnVal =
true;
1749 int numRegions =
regVec.size();
1750 for (
int ireg=0;ireg<numRegions;++ireg)
1752 regVec[ireg]->loadDAEQVector (daeQVec);
1776 double vbe_diff = 0.0;
1780 int numRegions =
regVec.size();
1781 for (
int ireg=0;ireg<numRegions;++ireg)
1784 regVec[ireg]->loadDAEFVector (daeFVec);
1785 regVec[ireg]->loadDAEdFdxdV(dFdxdVp, vbe_diff);
1792 int numSpecies =
thVec.size();
1794 for (isp=0;isp<numSpecies;++isp)
1799 int size =
regVec.size();
1801 std::vector<int> & specie_id =
thVec[isp].specie_id;
1803 double dx1 =
dxVec[0];
1804 double xloVal = (
thVec[isp].fluxVec[0]-
thVec[isp].flux_bc1)/dx1;
1805 daeFVec[specie_id[0]] += xloVal;
1807 for (i=1;i<size-1;++i)
1809 double fluxDif = (
thVec[isp].fluxVec[i]-
thVec[isp].fluxVec[i-1]);
1811 daeFVec[specie_id[i]] += (fluxDif)/aveDx;
1814 double dx2 =
dxVec[size-2];
1815 double xhiVal = (
thVec[isp].flux_bc2-
thVec[isp].fluxVec[size-2])/dx2;
1816 daeFVec[specie_id[size-1]] += xhiVal;
1841 bool bsuccess =
true;
1842 bool tmpBool =
true;
1845 #ifdef Xyce_DEBUG_DEVICE
1850 Xyce::dout() << subsection_divider << std::endl;
1851 Xyce::dout() <<
"Rxn dQdx load:" << std::endl;
1852 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1857 bsuccess = bsuccess && tmpBool;
1859 #ifdef Xyce_DEBUG_DEVICE
1861 Xyce::dout() << subsection_divider << std::endl;
1881 bool bsuccess =
true;
1885 int numRegions =
regVec.size();
1886 for (
int ireg=0;ireg<numRegions;++ireg)
1888 regVec[ireg]->loadDAEdQdx (dQdxMat);
1907 bool bsuccess =
true;
1908 bool tmpBool =
true;
1912 #ifdef Xyce_DEBUG_DEVICE
1917 Xyce::dout() << subsection_divider << std::endl;
1918 Xyce::dout() <<
"Rxn dFdx load:" << std::endl;
1919 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1924 bsuccess = bsuccess && tmpBool;
1926 #ifdef Xyce_DEBUG_DEVICE
1929 Xyce::dout() << subsection_divider << std::endl;
1954 int numRegions =
regVec.size();
1959 cSize = (
regVec[0])->getNumConstants();
1960 rSize = (
regVec[0])->getNumSpecies();
1961 for (
int ireg=0;ireg<numRegions;++ireg)
1963 regVec[ireg]->loadDAEdFdx(dFdxMat);
1965 if (
cols.size() < rSize)
cols.resize(rSize,0);
1974 int numSpecies =
thVec.size();
1976 for (isp=0;isp<numSpecies;++isp)
1981 int size =
regVec.size();
1983 double DiffC =
thVec[isp].D_specie;
1984 std::vector<int> & specie_id =
thVec[isp].specie_id;
1986 for (i=0;i<size;++i)
1988 int row = specie_id[i];
1991 double aveDx = (
dxVec[i]);
1992 double coef = DiffC/(aveDx*
dxVec[i]);
1995 cols[0] = specie_id[i ];
vals[0] =
thVec[isp].bcScale1 * coef;
1996 cols[1] = specie_id[i+1];
vals[1] =-coef;
1998 bool bs1 = dFdxMat.sumIntoLocalRow (row, count, &
vals[0], &
cols[0]);
2000 else if (i==(size-1))
2002 double aveDx = (
dxVec[i-1]);
2003 double coef = DiffC/(aveDx*
dxVec[i-1]);
2005 cols[0] = specie_id[i-1];
vals[0] =-coef;
2006 cols[1] = specie_id[i ];
vals[1] =
thVec[isp].bcScale2 * coef;
2008 bool bs1 = dFdxMat.sumIntoLocalRow (row, count, &
vals[0], &
cols[0]);
2013 double coef1 = DiffC/(aveDx*
dxVec[i-1]);
2014 double coef2 = DiffC/(aveDx*
dxVec[i ]);
2015 double coefSum = coef1+coef2;
2018 cols[0] = specie_id[i-1];
vals[0] =-coef1;
2019 cols[1] = specie_id[i ];
vals[1] = coefSum;
2020 cols[2] = specie_id[i+1];
vals[2] =-coef2;
2022 bool bs1 = dFdxMat.sumIntoLocalRow (row, count, &
vals[0], &
cols[0]);
2042 bool bsuccess =
true;
2044 #ifdef Xyce_DEBUG_DEVICE
2048 Xyce::dout() << subsection_divider << std::endl;
2049 Xyce::dout() <<
" Start Instance::updatePrimaryState\n";
2050 Xyce::dout() <<
" name = " <<
getName() << std::endl;
2063 int numRegions =
regVec.size();
2064 for (
int ireg=0;ireg<numRegions;++ireg)
2068 int rSize =
regVec[ireg]->getNumSpecies();
2069 for (
int i=0;i<rSize;++i)
2071 staVector[
regVec[ireg]->getStateConcentrationLID(i)] = regVec[ireg]->getStateConcentration(i);
2084 numRegions =
regVec.size();
2085 for (
int ireg=0;ireg<numRegions;++ireg)
2089 int rSize =
regVec[ireg]->getNumSpecies();
2090 for (
int i=0;i<rSize;++i)
2092 currStaVector[
regVec[ireg]->getStateConcentrationLID(i)] = regVec[ireg]->getStateConcentration(i);
2113 #ifdef Xyce_DEBUG_DEVICE
2117 Xyce::dout() << subsection_divider << std::endl;
2118 Xyce::dout() <<
" Start Instance::updateSecondaryState\n";
2119 Xyce::dout() <<
" name = " <<
getName() << std::endl;
2124 int numRegions =
regVec.size();
2125 for (
int ireg=0;ireg<numRegions;++ireg)
2127 regVec[ireg]->updateSecondaryState (staDeriv);
2149 #ifdef Xyce_DEBUG_DEVICE
2152 Xyce::dout() << subsection_divider << std::endl;
2153 Xyce::dout() <<
" In Instance::updateIntermediateVars" << std::endl;
2154 Xyce::dout() <<
" name = " <<
getName() << std::endl;
2171 int numRegions =
regVec.size();
2172 for (
int ireg=0;ireg<numRegions;++ireg)
2175 regVec[ireg]->updateIntermediateVars (solVec, oldSolVec, time);
2179 int numSpecies =
thVec.size();
2183 for (isp=0;isp<numSpecies;++isp)
2188 int size =
thVec[isp].fluxVec.size();
2189 double DiffC =
thVec[isp].D_specie;
2190 for (i=0;i<size;++i)
2192 double n2 = solVec[
thVec[isp].specie_id[i ]];
2193 double n1 = solVec[
thVec[isp].specie_id[i+1]];
2195 thVec[isp].fluxVec[i] = DiffC*(n2-n1)/
dxVec[i];
2204 n1 = solVec[
thVec[isp].specie_id[0]];
2206 thVec[isp].flux_bc1 = DiffC*(n2-n1)/
dxVec[0];
2209 n2 = solVec[
thVec[isp].specie_id[size]];
2210 thVec[isp].flux_bc2 = DiffC*(n2-n1)/
dxVec[size];
2212 thVec[isp].bcScale1=2.0;
2213 thVec[isp].bcScale2=2.0;
2217 thVec[isp].flux_bc1 = 0.0;
2218 thVec[isp].flux_bc2 = 0.0;
2242 std::vector<N_UTL_BreakPoint> &breakPointTimes)
2244 int numRegions =
regVec.size();
2246 for (
int ireg=0;ireg<numRegions;++ireg)
2249 junk=
regVec[ireg]->getBreakTime();
2250 breakPointTimes.push_back(junk);
2265 #ifdef Xyce_DEBUG_DEVICE
2269 if (cName ==
"DOPINGPROFILES" || cName ==
"REGION")
2273 return (static_cast<CompositeParam *> (doping));
2275 else if (cName ==
"SOURCELIST")
2279 return (static_cast<CompositeParam *> (sources));
2284 "Model::constructComposite: unrecognized composite name: ";
2286 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
2316 std::vector<Instance*>::iterator iter;
2320 for (iter=first; iter!=last; ++iter)
2322 (*iter)->processParams();
2340 :
DevicePDEModel(MB,configuration.getModelParameters(), factory_block),
2344 rxnFileName(
"NOFILE"),
2350 xlo_sourceGiven(false),
2351 xhi_sourceGiven(false),
2371 UserWarning(*
this) <<
"XLO_SOURCE >= XHI_SOURCE. Ignoring, and using a spatially uniform source";
2405 std::vector<Instance*>::iterator iter;
2409 for (iter=first; iter!=last; ++iter)
2418 for (i=0;i<size;++i)
2431 std::map<std::string,DopeInfo *>::iterator iter;
2432 std::map<std::string,DopeInfo *>::iterator begin =
dopeInfoMap.begin();
2433 std::map<std::string,DopeInfo *>::iterator end =
dopeInfoMap.end ();
2435 for(iter=begin;iter!=end;++iter)
2437 if (iter->second != 0)
delete iter->second;
2444 std::map<std::string,SpecieSource *>::iterator iter;
2445 std::map<std::string,SpecieSource *>::iterator begin =
defectSourceMap.begin();
2446 std::map<std::string,SpecieSource *>::iterator end =
defectSourceMap.end ();
2448 for(iter=begin;iter!=end;++iter)
2450 if (iter->second != 0)
2452 delete iter->second;
2471 std::vector<Instance*>::const_iterator iter;
2476 os <<
" name model name Parameters" << std::endl;
2477 for (i = 0, iter = first; iter != last; ++iter, ++i)
2479 os <<
" " << i <<
": " << (*iter)->getName() <<
" ";
2483 os <<
" TEMP = " << (*iter)->TEMP << std::endl;
2494 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
2508 .registerDevice(
"rxn", 1)
2509 .registerModelType(
"rxn", 1);