57 #include <Xyce_config.h>
61 #ifdef Xyce_DEBUG_DEVICE
102 #ifdef Xyce_DEBUG_DEVICE
105 Xyce::dout() <<
"In Instance::doSensMeshResize." << std::endl;
133 #ifdef Xyce_DEBUG_DEVICE
140 Xyce::dout() <<
" deviceWidth = " <<
deviceWidth << std::endl;
141 Xyce::dout() <<
" old_width = " << old_width << std::endl;
142 Xyce::dout() <<
" widthRatio = " << widthRatio << std::endl;
143 Xyce::dout() <<
" deviceLength = " <<
deviceLength << std::endl;
144 Xyce::dout() <<
" old_length = " << old_length << std::endl;
145 Xyce::dout() <<
" lengthRatio = " << lengthRatio << std::endl;
156 #ifdef Xyce_DEBUG_DEVICE
161 Xyce::dout() <<
" x["<<i<<
"] = " <<
xVec[i];
162 Xyce::dout() <<
" y["<<i<<
"] = " <<
yVec[i];
163 Xyce::dout() << std::endl;
172 #ifdef Xyce_DEBUG_DEVICE
175 Xyce::dout() <<
"Done with Instance::doSensMeshResize." << std::endl;
195 bool bsuccess =
true;
233 bool bsuccess =
true;
239 std::vector<DeviceInterfaceNode>::iterator first =
dIVec.begin ();
240 std::vector<DeviceInterfaceNode>::iterator last =
dIVec.end ();
241 std::vector<DeviceInterfaceNode>::iterator iterV;
246 for (iterV=first;iterV!=last; ++iterV)
248 if (!(iterV->given))
continue;
256 std::string msg =
"Instance::doMeshBasedInitializations."
257 "can't find " + iterV->nName +
" in the electrode Map\n";
258 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL_0,msg);
262 #ifdef Xyce_DEBUG_DEVICE
265 Xyce::dout() <<
"list of user-specified electrodes:" << std::endl;
266 std::map<std::string, PDE_2DElectrode*>::iterator mapIter;
267 std::map<std::string, PDE_2DElectrode*>::iterator mapStart =
electrodeMap.begin();
268 std::map<std::string, PDE_2DElectrode*>::iterator mapEnd =
electrodeMap.end();
282 if (!
given(
"MESHFILE"))
284 lout() <<
"No mesh file specified. Setting meshfile=internal.msh\n" << std::endl;
291 #ifdef Xyce_DEBUG_DEVICE
294 Xyce::dout() << std::endl;
295 Xyce::dout() <<
"Reading mesh file..." << std::endl;
304 #ifdef Xyce_DEBUG_DEVICE
307 Xyce::dout() << std::endl;
308 Xyce::dout() <<
"Generating internal mesh..." << std::endl;
313 std::string outputMeshFileName =
outputName +
".msh";
331 #ifdef Xyce_DEBUG_DEVICE
334 Xyce::dout() <<
"\n";
335 Xyce::dout() <<
"Done setting up the mesh." << std::endl;
336 Xyce::dout() <<
" numMeshPoints = " <<
numMeshPoints <<
"\n";
337 Xyce::dout() <<
" numMeshEdges = " <<
numMeshEdges <<
"\n";
338 Xyce::dout() <<
" numMeshCells = " <<
numMeshCells <<
"\n";
368 bool bsuccess =
true;
370 std::vector<DeviceInterfaceNode>::iterator first =
dIVec.begin ();
371 std::vector<DeviceInterfaceNode>::iterator last =
dIVec.end ();
372 std::vector<DeviceInterfaceNode>::iterator iterV;
377 for (iterV=first;iterV!=last; ++iterV)
379 ExtendedString tmpName = iterV->eName;
390 if ( !(edgeLabelExist) )
393 std::string msg =
"Instance::setupDINodes: "
394 "The boundary condition label "+tmpName+
395 " doesn't exist in the mesh file.\n";
396 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL_0,msg);
404 if ( !(edgeLabelExist) )
406 #ifdef Xyce_DEBUG_DEVICE
408 Xyce::dout() <<
"Erasing DI: " << iterV->eName << std::endl;
420 for (iterV=first;iterV!=last; ++iterV)
422 if (!(iterV->given))
continue;
428 iterV->materialGiven =
electrodeMap[iterV->nName]->materialGiven;
429 iterV->oxideBndryFlag =
electrodeMap[iterV->nName]->oxideBndryFlag;
435 std::string msg =
"Instance::doMeshBasedInitializations."
436 "can't find " + iterV->nName +
" in the electrode Map\n";
437 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL_0,msg);
439 #ifdef Xyce_DEBUG_DEVICE
442 Xyce::dout() << std::endl;
443 Xyce::dout() <<
"name = " << iterV->eName << std::endl;
444 Xyce::dout() <<
" material = " << iterV->material << std::endl;
445 Xyce::dout() <<
" mat. given = " << iterV->materialGiven << std::endl;
446 Xyce::dout() <<
" oxide boundary flag = " << iterV->oxideBndryFlag << std::endl;
447 Xyce::dout() <<
" oxide thickness = " << iterV->oxthick << std::endl;
448 Xyce::dout() <<
" oxide charge = " << iterV->oxcharge << std::endl;
456 first =
dIVec.begin ();
458 for (iterV=first;iterV!=last; ++iterV)
460 ExtendedString tmpName = iterV->nName;
463 #ifdef Xyce_DEBUG_DEVICE
465 Xyce::dout() <<
"Testing the neumann stuff. Name = " << tmpName << std::endl;
472 iterV->neumannBCFlagV =
true;
473 iterV->neumannBCFlagN =
true;
474 iterV->neumannBCFlagP =
true;
479 iterV->neumannBCFlagV =
false;
480 iterV->neumannBCFlagN =
true;
481 iterV->neumannBCFlagP =
true;
484 #ifdef Xyce_DEBUG_DEVICE
487 Xyce::dout() <<
"Setting the neumann flags of " << tmpName <<
":\n";
488 Xyce::dout() <<
" Vflag = " << iterV->neumannBCFlagV << std::endl;
489 Xyce::dout() <<
" Nflag = " << iterV->neumannBCFlagN << std::endl;
490 Xyce::dout() <<
" Pflag = " << iterV->neumannBCFlagP << std::endl;
496 #ifdef Xyce_DEBUG_DEVICE
499 first =
dIVec.begin ();
501 Xyce::dout() <<
"Final DI list: " << std::endl;
502 for (iterV=first;iterV!=last; ++iterV)
504 Xyce::dout() <<
"DI name:" << iterV->eName;
505 Xyce::dout() <<
" The neumann flags are:" << std::endl;
506 Xyce::dout() <<
" Vflag =";
507 if (iterV->neumannBCFlagV) Xyce::dout() <<
" true." << std::endl;
508 else Xyce::dout() <<
" false." << std::endl;
509 Xyce::dout() <<
" Nflag =";
510 if (iterV->neumannBCFlagN) Xyce::dout() <<
" true." << std::endl;
511 else Xyce::dout() <<
" false." << std::endl;
512 Xyce::dout() <<
" Pflag =";
513 if (iterV->neumannBCFlagP) Xyce::dout() <<
" true." << std::endl;
514 else Xyce::dout() <<
" false." << std::endl;
533 bool bsuccess =
true;
540 condVec[iE].resize(numElectrodes,0.0);
541 capVec[iE].resize(numElectrodes,0.0);
548 #ifdef Xyce_DEBUG_DEVICE
553 Xyce::dout() <<
" x["<<i<<
"] = " <<
xVec[i];
554 Xyce::dout() <<
" y["<<i<<
"] = " <<
yVec[i];
555 Xyce::dout() << std::endl;
634 std::vector<DeviceInterfaceNode>::iterator first =
dIVec.begin ();
635 std::vector<DeviceInterfaceNode>::iterator last =
dIVec.end ();
636 std::vector<DeviceInterfaceNode>::iterator iterV;
638 for (iterV=first;iterV!=last; ++iterV)
642 iterV->numBoundaryPoints = numPoints;
643 iterV->VequVec.resize (numPoints,0.0);
644 iterV->VbcVec.resize (numPoints,0.0);
645 iterV->nnbcVec.resize (numPoints,0.0);
646 iterV->npbcVec.resize (numPoints,0.0);
648 for (
int i=0;i<iterV->numBoundaryPoints;++i)
652 iterV->meshGlobalToLocal[nodeIndex] = i;
664 for (
int i1=0;i1<numLabels;++i1)
667 if (lPtr->
name ==
"NOFLUX")
680 UINT uLabel = edgePtr->
uLabel;
686 if(uLabel != nofluxIndex)
740 std::vector<int>::iterator firstL;
741 std::vector<int>::iterator lastL;
742 std::vector<int>::iterator iterL;
752 for (iterL=firstL; iterL!=lastL; ++iterL)
770 for (iterL=firstL; iterL!=lastL; ++iterL)
782 int size =
dIVec.size();
783 for (i = 0;i < size; ++i)
788 #ifdef Xyce_DEBUG_DEVICE
792 Xyce::dout() << section_divider << std::endl;
793 Xyce::dout() <<
"In the Intance::setupLabelIndex ";
794 Xyce::dout() <<
" name = "<<
getName() << std::endl;
799 std::vector<std::string>::iterator iterM;
801 for (i=0, iterM=firstM;iterM!=lastM;++i,++iterM)
803 Xyce::dout() <<
" i = "<<i<<
" name = " << *iterM << std::endl;
806 std::map<std::string,int>::iterator firstDIM =
labelDIMap.begin ();
807 std::map<std::string,int>::iterator lastDIM =
labelDIMap.end ();
808 std::map<std::string,int>::iterator iterDIM;
809 for(iterDIM=firstDIM;iterDIM!=lastDIM;++iterDIM)
811 Xyce::dout() <<
" DI index = "<< iterDIM->second;
812 Xyce::dout() <<
" name = " << iterDIM->first << std::endl;
821 Xyce::dout() <<
" labelIndex["<<i<<
"] = " <<
labelIndex[i];
822 Xyce::dout() <<
" name = " << labelPtr->
name << std::endl;
828 Xyce::dout() << section_divider << std::endl;
864 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
865 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
866 std::vector<DeviceInterfaceNode>::iterator iterDI;
868 #ifdef Xyce_DEBUG_DEVICE
871 Xyce::dout() <<
"In Instance::setupBoundaryStencil." << std::endl;
876 for (iterDI = firstDI; iterDI!=lastDI; ++iterDI)
886 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
887 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
888 std::vector<int>::iterator iterI;
890 for(iterI=firstI;iterI!=lastI;++iterI)
892 int nodeIndex = *iterI;
900 if (!(iterDI->neumannBCFlagV) &&
901 !(iterDI->neumannBCFlagN) && !(iterDI->neumannBCFlagP))
928 #ifdef Xyce_DEBUG_DEVICE
931 Xyce::dout() <<
"In Instance::checkForElectrodeOverlap." << std::endl;
935 for (
int iDI=0;iDI<
dIVec.size();++iDI)
945 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
946 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
947 std::vector<int>::iterator iterI;
949 for(iterI=firstI;iterI!=lastI;++iterI)
951 int nodeIndex = *iterI;
955 std::string msg =
"Electrodes " +
dIVec[iDI].eName +
" and " +
957 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL_0,msg);
980 bool bsuccess =
true;
993 int totalDirchlet = 0;
1001 std::vector<DeviceInterfaceNode>::iterator first =
dIVec.begin ();
1002 std::vector<DeviceInterfaceNode>::iterator last =
dIVec.end ();
1003 std::vector<DeviceInterfaceNode>::iterator iterV;
1004 for (iterV=first;iterV!=last; ++iterV)
1008 #ifdef Xyce_DEBUG_DEVICE
1011 Xyce::dout() << iterV->eName;
1012 Xyce::dout() <<
": numInterfaceMeshPoints = ";
1014 Xyce::dout() << std::endl;
1020 for (iterV=first;iterV!=last; ++iterV)
1027 if (!(iterV->neumannBCFlagV)) mult += 1;
1028 if (!(iterV->neumannBCFlagN)) mult += 1;
1029 if (!(iterV->neumannBCFlagP)) mult += 1;
1031 totalDirchlet += (mult * numPoints);
1036 #endif // Xyce_NEW_BC
1038 #ifdef Xyce_DEBUG_DEVICE
1041 Xyce::dout() <<
"\n";
1043 Xyce::dout() <<
" numMeshPoints = " << numMeshPoints<< std::endl;
1044 Xyce::dout() <<
" numElectrodes = " <<
numElectrodes<< std::endl;
1045 Xyce::dout() <<
" numIntVars = " <<
numIntVars<< std::endl;
1046 Xyce::dout() <<
" 3*numMeshPoints = " << 3*numMeshPoints<< std::endl;
1048 Xyce::dout() <<
" totalDirchlet = " << totalDirchlet<< std::endl;
1049 Xyce::dout() << std::endl;
1074 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
1075 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
1076 std::vector<DeviceInterfaceNode>::iterator iterDI;
1078 for(iterDI=firstDI;iterDI!=lastDI;++iterDI)
1085 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
1086 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
1087 std::vector<int>::iterator iterI;
1089 std::vector<EDGEINFO>::iterator firstEI;
1090 std::vector<EDGEINFO>::iterator lastEI;
1091 std::vector<EDGEINFO>::iterator iterEI;
1098 for(nodeIndex=0,iterI=firstI;iterI!=lastI;++iterI,++nodeIndex)
1106 col1 = iterDI->Vcol[iVcol];
1111 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1113 if (iterDI->dIdXcols[cnt2] == col1)
1114 { bmatch =
true;
break; }
1118 iterDI->dIdXcols.push_back(col1);
1119 iterDI->dIdX.push_back(0.0);
1120 iterDI->dQdX.push_back(0.0);
1126 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI,++iVcol)
1128 col1 = iterDI->Vcol[iVcol];
1133 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1135 if (iterDI->dIdXcols[cnt2] == col1)
1136 { bmatch =
true;
break; }
1140 iterDI->dIdXcols.push_back(col1);
1141 iterDI->dIdX.push_back(0.0);
1142 iterDI->dQdX.push_back(0.0);
1149 for(nodeIndex=0,iterI=firstI;iterI!=lastI;++iterI,++nodeIndex)
1157 col1 = iterDI->Ncol[iNcol];
1162 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1164 if (iterDI->dIdXcols[cnt2] == col1)
1165 { bmatch =
true;
break; }
1169 iterDI->dIdXcols.push_back(col1);
1170 iterDI->dIdX.push_back(0.0);
1171 iterDI->dQdX.push_back(0.0);
1177 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI,++iNcol)
1179 col1 = iterDI->Ncol[iNcol];
1184 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1186 if (iterDI->dIdXcols[cnt2] == col1)
1187 { bmatch =
true;
break; }
1191 iterDI->dIdXcols.push_back(col1);
1192 iterDI->dIdX.push_back(0.0);
1193 iterDI->dQdX.push_back(0.0);
1200 for(nodeIndex=0,iterI=firstI;iterI!=lastI;++iterI,++nodeIndex)
1208 col1 = iterDI->Pcol[iPcol];
1213 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1215 if (iterDI->dIdXcols[cnt2] == col1)
1216 { bmatch =
true;
break; }
1220 iterDI->dIdXcols.push_back(col1);
1221 iterDI->dIdX.push_back(0.0);
1222 iterDI->dQdX.push_back(0.0);
1228 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI,++iPcol)
1230 col1 = iterDI->Pcol[iPcol];
1235 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1237 if (iterDI->dIdXcols[cnt2] == col1)
1238 { bmatch =
true;
break; }
1242 iterDI->dIdXcols.push_back(col1);
1243 iterDI->dIdX.push_back(0.0);
1244 iterDI->dQdX.push_back(0.0);
1254 for(nodeIndex=0,iterI=firstI;iterI!=lastI;++iterI,++nodeIndex)
1261 col1 = iterDI->Pcol[iPcol];
1262 int meshNode = *iterI;
1268 for (cnt2=0;cnt2<iterDI->neighborNodes.size();++cnt2)
1270 if (iterDI->neighborNodes[cnt2] == meshNode)
1271 { bmatch =
true;
break; }
1275 iterDI->neighborNodes.push_back(meshNode);
1283 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI,++iPcol)
1285 col1 = iterDI->Pcol[iPcol];
1286 int meshNode = iterEI->inode;
1292 for (cnt2=0;cnt2<iterDI->neighborNodes.size();++cnt2)
1294 if (iterDI->neighborNodes[cnt2] == meshNode)
1295 { bmatch =
true;
break; }
1299 iterDI->neighborNodes.push_back(meshNode);
1305 int size1 = iterDI->neighborNodes.size();
1306 int size3 = iterDI->dIdX.size();
1307 #ifdef Xyce_DEBUG_DEVICE
1310 Xyce::dout() << std::endl;
1311 Xyce::dout() <<
"number of neighbor nodes for " << iterDI->eName;
1312 Xyce::dout() <<
" is " << size1 << std::endl;
1314 for (i=0;i<size1;++i)
1316 Xyce::dout() <<
"neighborNodes["<<i<<
"] = " << iterDI->neighborNodes[i] << std::endl;
1318 Xyce::dout() << std::endl;
1319 Xyce::dout() <<
"dIdX size for " << iterDI->eName <<
" is " << size3 << std::endl;
1320 for (i=0;i<size3;++i)
1322 Xyce::dout() <<
"dIdX["<<i<<
"] = " << iterDI->dIdXcols[i] << std::endl;
1330 int numNeighbor = iterDI->neighborNodes.size();
1333 for (iNeighbor=0;iNeighbor<numNeighbor;++iNeighbor)
1335 int inode = iterDI->neighborNodes[iNeighbor];
1338 for (
int iNN=0;iNN<nodePtr->
cnode;++iNN)
1349 iterDI->dFdVckt.push_back(0.0); ++dFdVindex;
1350 iterDI->dFdVckt.push_back(0.0); ++dFdVindex;
1351 iterDI->dFdVckt.push_back(0.0); ++dFdVindex;
1355 #ifdef Xyce_DEBUG_DEVICE
1358 Xyce::dout() << iterDI->eName <<
": size of dFdVckt = " << dFdVindex << std::endl;
1363 UserWarning0(*
this) <<
"NEW_BC must be turned on to use TWO_LEVEL_NEWTON";
1364 #endif // Xyce_NEW_BC
1396 #ifdef Xyce_DEBUG_DEVICE
1399 Xyce::dout() << section_divider <<
"\n";
1400 Xyce::dout() <<
"setupBCEdgeAreas. name = " <<
getName() << std::endl;
1401 Xyce::dout().setf(std::ios::scientific);
1408 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
1409 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
1410 std::vector<DeviceInterfaceNode>::iterator iterDI;
1412 for (iterDI = firstDI; iterDI!=lastDI; ++iterDI)
1420 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
1421 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
1422 std::vector<int>::iterator iterI;
1426 for(iterI=firstI;iterI!=lastI;++iterI)
1431 std::vector<EDGEINFO>::iterator firstEI = nodePtr->
edgeInfoVector.begin();
1432 std::vector<EDGEINFO>::iterator lastEI = nodePtr->
edgeInfoVector.end ();
1433 std::vector<EDGEINFO>::iterator iterEI;
1435 double areaLocal = 0.0;
1436 double areaTmp = 0.0;
1438 #ifdef Xyce_DEBUG_DEVICE
1441 Xyce::dout() <<
" --------------- " << std::endl;
1442 Xyce::dout() <<
"name = " << iterDI->eName;
1443 Xyce::dout() <<
" node = " << *iterI << std::endl;
1447 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1449 int neighbor = iterEI->inode;
1460 if (labelPtr->
name == iterDI->eName)
1466 double x1 =
xVec[*iterI];
1467 double y1 =
yVec[*iterI];
1469 double x2 =
xVec[neighbor];
1470 double y2 =
yVec[neighbor];
1472 double dx = x2-x1; dx *= 0.5;
1473 double dy = y2-y1; dy *= 0.5;
1479 areaLocal += areaTmp;
1483 areaTmp = 0.5 * iterEI->elen;
1484 areaLocal += 0.5 * iterEI->elen;
1487 #ifdef Xyce_DEBUG_DEVICE
1490 Xyce::dout() <<
" neighbor node = " << neighbor << std::endl;
1491 Xyce::dout() <<
" areaTmp = " << areaTmp << std::endl;
1492 Xyce::dout() <<
" areaLocal = " << areaLocal << std::endl;
1493 Xyce::dout() <<
" elen = " << iterEI->elen << std::endl;
1494 Xyce::dout() <<
" label name = " << labelPtr->
name << std::endl;
1495 Xyce::dout() <<
" DI eName = " << iterDI->eName << std::endl;
1496 Xyce::dout() <<
"---" << std::endl;
1501 #ifdef Xyce_DEBUG_DEVICE
1504 Xyce::dout() <<
" --------------- " << std::endl;
1507 iterDI->area += areaLocal;
1508 iterDI->areaVector.push_back(areaLocal);
1513 #ifdef Xyce_DEBUG_DEVICE
1516 Xyce::dout().setf(std::ios::scientific);
1517 Xyce::dout() <<
" Total area for edge: " << iterDI->area << std::endl;
1522 #ifdef Xyce_DEBUG_DEVICE
1525 Xyce::dout() << section_divider <<
"\n";
1549 std::vector<EDGEINFO>::iterator firstEI = nodePtr->
edgeInfoVector.begin();
1550 std::vector<EDGEINFO>::iterator lastEI = nodePtr->
edgeInfoVector.end ();
1551 std::vector<EDGEINFO>::iterator iterEI;
1553 double tmpDX = +1.0e99;
1554 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1556 if (tmpDX > iterEI->elen) tmpDX = iterEI->elen;
1558 #ifdef Xyce_DEBUG_DEVICE
1561 Xyce::dout() <<
"i = " << i <<
" minDX = " << tmpDX; Xyce::dout() << std::endl;
1591 bool bsuccess =
true;
1594 #ifdef Xyce_DEBUG_DEVICE
1597 Xyce::dout() <<
"In Instance::setupJacStamp" << std::endl;
1598 Xyce::dout() <<
"numIntVars = " <<
numIntVars << std::endl;
1599 Xyce::dout() <<
"numMeshPoints = " <<
numMeshPoints << std::endl;
1620 #ifdef Xyce_DEBUG_DEVICE
1623 Xyce::dout() <<
"size of jacStamp = " <<
jacStamp.size() << std::endl;
1628 int LIDcounter = numPossibleElectrodes;
1634 #endif // Xyce_NEW_BC
1655 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
1656 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
1657 std::vector<DeviceInterfaceNode>::iterator iterDI;
1658 int DIsize =
dIVec.size ();
1659 firstDI =
dIVec.begin();
1660 lastDI =
dIVec.end ();
1665 for(index=0,iterDI=firstDI;iterDI!=lastDI;++iterDI,++index)
1677 dIVec[index].numCrossTerms = 0;
1681 for (
int ind2=0;ind2<DIsize;++ind2)
1683 if (ind2==index)
continue;
1686 ++(
dIVec[index].numCrossTerms);
1695 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
1696 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
1697 std::vector<int>::iterator iterI;
1699 std::vector<EDGEINFO>::iterator firstEI;
1700 std::vector<EDGEINFO>::iterator lastEI;
1701 std::vector<EDGEINFO>::iterator iterEI;
1705 for(iterI=firstI;iterI!=lastI;++iterI)
1717 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
1719 imesh = iterEI->inode;
1725 for(iterI=firstI;iterI!=lastI;++iterI)
1737 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
1739 imesh = iterEI->inode;
1745 for(iterI=firstI;iterI!=lastI;++iterI)
1756 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
1758 imesh = iterEI->inode;
1771 #endif // Xyce_NEW_BC
1773 #ifdef Xyce_DEBUG_DEVICE
1776 Xyce::dout() <<
" mesh point i = " << i << std::endl;
1781 std::vector<EDGEINFO>::iterator firstEI = nodePtr->
edgeInfoVector.begin ();
1782 std::vector<EDGEINFO>::iterator lastEI = nodePtr->
edgeInfoVector.end ();
1783 std::vector<EDGEINFO>::iterator iterEI;
1790 #ifdef Xyce_DEBUG_DEVICE
1793 Xyce::dout() <<
" Vrow = " << Vrow << std::endl;
1794 Xyce::dout() <<
" Nrow = " << Nrow << std::endl;
1795 Xyce::dout() <<
" Prow = " << Prow << std::endl;
1806 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1816 jacStamp[Vrow].push_back (DIindex);
1820 int imesh = iterEI->inode;
1824 #else // Xyce_NEW_BC
1825 int imesh = iterEI->inode;
1828 #endif // Xyce_NEW_BC
1840 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1842 int imesh = iterEI->inode;
1852 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1862 jacStamp[Nrow].push_back (DIindex);
1866 int imesh = iterEI->inode;
1870 #else // Xyce_NEW_BC
1871 int imesh = iterEI->inode;
1874 #endif // Xyce_NEW_BC
1884 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1886 int imesh = iterEI->inode;
1895 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1905 jacStamp[Prow].push_back (DIindex);
1909 int imesh = iterEI->inode;
1913 #else // Xyce_NEW_BC
1914 int imesh = iterEI->inode;
1917 #endif // Xyce_NEW_BC
1930 firstDI =
dIVec.begin();
1931 lastDI =
dIVec.end ();
1933 for(index=0,iterDI=firstDI;iterDI!=lastDI;++iterDI,++index)
1947 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
1948 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
1949 std::vector<int>::iterator iterI;
1955 for(iterI=firstI;iterI!=lastI;++iterI)
1962 #endif // Xyce_NEW_BC
1964 #ifdef Xyce_DEBUG_DEVICE
1968 for(irow=0;irow<
jacStamp.size();++irow)
1970 Xyce::dout() <<
"irow = " << irow;
1971 if (irow <
dIVec.size())
1972 Xyce::dout() <<
" " <<
dIVec[irow].eName <<
" KCL";
1973 Xyce::dout() << std::endl;
1974 for (icol=0;icol<
jacStamp[irow].size();++icol)
1977 Xyce::dout() <<
" jacStamp["<<irow<<
"]["<<icol<<
"] = "<<jsTmp;
1978 Xyce::dout() << std::endl;
1996 const std::list<index_pair> & intGIDListRef,
1997 const std::list<index_pair> & extGIDListRef)
2002 #ifdef Xyce_DEBUG_DEVICE
2005 Xyce::dout() << section_divider << std::endl;
2006 Xyce::dout() <<
"In the Instance::registerGIDs function. ";
2007 Xyce::dout() <<
" name = "<<
getName() << std::endl;
2008 Xyce::dout() <<
"numInt = " <<
numIntVars <<
"\n";
2009 Xyce::dout() <<
"numExt = " <<
numExtVars <<
"\n";
2010 Xyce::dout() <<
"numMeshPoints = " <<
numMeshPoints <<
"\n";
2015 intGIDList.assign(intGIDListRef.begin(), intGIDListRef.end());
2016 extGIDList.assign(extGIDListRef.begin(), extGIDListRef.end());
2022 std::list<index_pair>::iterator it1 =
extGIDList.begin();
2024 std::list<index_pair>::iterator first =
extGIDList.begin();
2025 std::list<index_pair>::iterator last =
extGIDList.end ();
2026 std::list<index_pair>::iterator iter;
2029 #ifdef Xyce_DEBUG_DEVICE
2032 Xyce::dout() <<
"Setting up the indices for the external circuit nodes:" << std::endl;
2033 Xyce::dout() <<
"External node list:" << std::endl;
2037 int numExtNodes = 0;
2038 for(iter=first;iter!=last;++iter)
2040 if ( (iter->col) && (iter->row != -1) )
2045 #ifdef Xyce_DEBUG_DEVICE
2048 Xyce::dout() <<
"node = " << iter->row <<
" col = ";
2049 Xyce::dout() << iter->col <<
" numExtNodes = " << numExtNodes << std::endl;
2054 #ifdef Xyce_DEBUG_DEVICE
2056 Xyce::dout() <<
" number of owned external nodes = " << numExtNodes << std::endl;
2059 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
2060 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
2061 std::vector<DeviceInterfaceNode>::iterator iterDI;
2063 for(iterDI=firstDI;iterDI!=lastDI;++iterDI)
2065 if (iterDI->given) ++numRealDIs;
2068 #ifdef Xyce_DEBUG_DEVICE
2071 Xyce::dout() <<
" number of user specified boundary conditions = ";
2072 Xyce::dout() << numRealDIs << std::endl;
2076 if (numRealDIs < numExtNodes)
2078 DevelFatal(*this).in(
"Instance::registerGIDs")
2079 <<
"Number of boundary conditions < number of external nodes";
2082 int isizeDI =
dIVec.size();
2084 for(index=0, iter=first; (iter!=last && index < isizeDI); ++iter, ++index)
2086 dIVec[index].gid = iter->row;
2087 if ( !(iter->col) )
dIVec[index].gid = -1;
2089 #ifdef Xyce_DEBUG_DEVICE
2092 Xyce::dout() <<
" name = "<<
dIVec[index].eName<<
" gid = ";
2093 Xyce::dout() <<
dIVec[index].gid;
2094 Xyce::dout() << std::endl;
2101 std::vector<int>::iterator iterTmp = labelPtr->
mNodeVector.begin();
2103 dIVec[index].firstMeshNodeIndex = *iterTmp;
2107 #ifdef Xyce_DEBUG_DEVICE
2110 Xyce::dout() <<
"doing internal vars, row arrays:"<< std::endl;
2115 std::list<index_pair>::iterator intEnd =
intGIDList.end();
2116 std::list<index_pair>::iterator it2 =
intGIDList.begin();
2133 if ( !(it2->col) ) Vrow = -1;
2141 if ( !(it2->col) ) Nrow = -1;
2149 if ( !(it2->col) ) Prow = -1;
2154 #ifdef Xyce_DEBUG_DEVICE
2157 Xyce::dout() <<
"doing row arrays for mesh point " << i << std::endl;
2159 Xyce::dout() <<
" Vrow = " << Vrow << std::endl;
2162 Xyce::dout() <<
" Nrow = " << Nrow << std::endl;
2165 Xyce::dout() <<
" Prow = " << Prow << std::endl;
2172 if ( !(it2->col) ) Vrow = -1;
2177 if ( !(it2->col) ) Nrow = -1;
2182 if ( !(it2->col) ) Prow = -1;
2186 #ifdef Xyce_DEBUG_DEVICE
2189 Xyce::dout() <<
"doing row arrays for mesh point " << i << std::endl;
2190 Xyce::dout() <<
" Vrow = " << Vrow << std::endl;
2191 Xyce::dout() <<
" Nrow = " << Nrow << std::endl;
2192 Xyce::dout() <<
" Prow = " << Prow << std::endl;
2195 #endif // Xyce_NEW_BC
2207 #ifdef Xyce_DEBUG_DEVICE
2210 Xyce::dout() <<
"maxColsPerRow = " <<
maxColsPerRow << std::endl;
2214 #ifdef Xyce_DEBUG_DEVICE
2215 Xyce::dout() << section_divider << std::endl;
2237 char tmpchar[128];
for (i=0;i<128;++i) tmpchar[i] = 0;
2244 #endif // Xyce_NEW_BC
2246 int Vrow, Nrow, Prow;
2251 sprintf(tmpchar,
"%s_V_%d_%s",
2258 sprintf(tmpchar,
"%s_N_%d_%s",
2264 { sprintf(tmpchar,
"%s_P_%d_%s",
2311 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
2312 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
2313 std::vector<DeviceInterfaceNode>::iterator iterDI;
2315 #ifdef Xyce_DEBUG_DEVICE
2318 Xyce::dout() <<
"Instance::setupRowColPairs ()" << std::endl;
2319 Xyce::dout() <<
" doing internal vars, col arrays:"<< std::endl;
2330 #endif // Xyce_NEW_BC
2332 #ifdef Xyce_DEBUG_DEVICE
2335 Xyce::dout() <<
"doing col arrays for mesh point " << i<< std::endl;
2340 std::vector<EDGEINFO>::iterator firstEI = nodePtr->
edgeInfoVector.begin ();
2341 std::vector<EDGEINFO>::iterator lastEI = nodePtr->
edgeInfoVector.end ();
2342 std::vector<EDGEINFO>::iterator iterEI;
2348 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
2366 #endif // Xyce_NEW_BC
2372 #ifdef Xyce_DEBUG_DEVICE
2375 Xyce::dout() <<
"size of vcolarray["<<i<<
"] = " <<
Vcolarray[i].size() << std::endl;
2376 for(
int eric=0;eric<
Vcolarray[i].size();++eric)
2377 Xyce::dout() <<
" col["<<eric<<
"] = " <<
Vcolarray[i][eric] << std::endl;
2384 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
2390 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
2408 #endif // Xyce_NEW_BC
2415 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
2420 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
2438 #endif // Xyce_NEW_BC
2444 #ifdef Xyce_DEBUG_DEVICE
2447 Xyce::dout() <<
"doing some boundary condition vars:"<< std::endl;
2457 firstDI =
dIVec.begin();
2458 lastDI =
dIVec.end ();
2462 for(index=0,iterDI=firstDI;iterDI!=lastDI;++iterDI,++index)
2470 #ifdef Xyce_DEBUG_DEVICE
2473 Xyce::dout() <<
"Device Interface: " <<
dIVec[index].eName << std::endl;
2483 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
2484 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
2485 std::vector<int>::iterator iterI;
2492 for(iterI=firstI;iterI!=lastI;++iterI)
2496 #endif // Xyce_NEW_BC
2515 std::vector<EDGEINFO>::iterator firstEI;
2516 std::vector<EDGEINFO>::iterator lastEI;
2517 std::vector<EDGEINFO>::iterator iterEI;
2519 #ifdef Xyce_DEBUG_DEVICE
2522 Xyce::dout() <<
"V edge and edge neighbor gids:" << std::endl;
2527 for(iterI=firstI;iterI!=lastI;++iterI)
2530 dIVec[index].Vcol.push_back(itmp);
2532 #ifdef Xyce_DEBUG_DEVICE
2535 int ind1 =
dIVec[index].Vcol.size()-1;
2536 Xyce::dout() <<
" 1Vcol["<<ind1<<
"] = " << itmp << std::endl;
2545 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
2548 dIVec[index].Vcol.push_back(itmp);
2550 #ifdef Xyce_DEBUG_DEVICE
2553 int ind1 =
dIVec[index].Vcol.size()-1;
2554 Xyce::dout() <<
" 2Vcol["<<ind1<<
"] = " << itmp << std::endl;
2560 #ifdef Xyce_DEBUG_DEVICE
2563 Xyce::dout() <<
"N edge and edge neighbor gids:" << std::endl;
2568 for(iterI=firstI;iterI!=lastI;++iterI)
2571 dIVec[index].Ncol.push_back(itmp);
2573 #ifdef Xyce_DEBUG_DEVICE
2576 int ind1 =
dIVec[index].Ncol.size()-1;
2577 Xyce::dout() <<
" 1Ncol["<<ind1<<
"] = " << itmp << std::endl;
2586 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
2589 dIVec[index].Ncol.push_back(itmp);
2591 #ifdef Xyce_DEBUG_DEVICE
2594 int ind1 =
dIVec[index].Ncol.size()-1;
2595 Xyce::dout() <<
" 2Ncol["<<ind1<<
"] = " << itmp << std::endl;
2601 #ifdef Xyce_DEBUG_DEVICE
2604 Xyce::dout() <<
"P edge and edge neighbor gids:" << std::endl;
2608 for(iterI=firstI;iterI!=lastI;++iterI)
2611 dIVec[index].Pcol.push_back(itmp);
2613 #ifdef Xyce_DEBUG_DEVICE
2616 int ind1 =
dIVec[index].Pcol.size()-1;
2617 Xyce::dout() <<
" 1Pcol["<<ind1<<
"] = " << itmp << std::endl;
2626 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
2629 dIVec[index].Pcol.push_back(itmp);
2631 #ifdef Xyce_DEBUG_DEVICE
2634 int ind1 =
dIVec[index].Pcol.size()-1;
2635 Xyce::dout() <<
" 2Pcol["<<ind1<<
"] = " << itmp << std::endl;
2642 (
dIVec[index].Vcol.size() +
2643 dIVec[index].Ncol.size() +
2644 dIVec[index].Pcol.size() + 10)
2648 (
dIVec[index].Vcol.size() +
2649 dIVec[index].Ncol.size() +
2650 dIVec[index].Pcol.size() + 10);
2654 #ifdef Xyce_DEBUG_DEVICE
2657 Xyce::dout() <<
"Setting up the index pairs."<< std::endl;
2668 firstDI =
dIVec.begin();
2669 lastDI =
dIVec.end ();
2670 for(index=0,iterDI=firstDI;iterDI!=lastDI;++iterDI,++index)
2672 #ifdef Xyce_DEBUG_DEVICE
2674 Xyce::dout() <<
"device interface name: " << iterDI->eName << std::endl;
2681 if (
dIVec[index].gid == -1)
continue;
2685 #ifdef Xyce_DEBUG_DEVICE
2687 Xyce::dout() <<
"index = " << index<<
" gid = " <<
dIVec[index].gid << std::endl;
2691 IP.row =
dIVec[index].gid;
2692 IP.col =
dIVec[index].gid;
2697 int size2 =
dIVec.size();
2698 for (
int ind2=0;ind2<size2;++ind2)
2700 if (index == ind2)
continue;
2701 IP.row =
dIVec[index].gid;
2702 IP.col =
dIVec[ind2].gid;
2708 nn =
dIVec[index].Vcol.size();
2712 if (
dIVec[index].Vcol[j] != -1)
2714 IP.row =
dIVec[index].gid;
2715 IP.col =
dIVec[index].Vcol[j];
2717 #ifdef Xyce_DEBUG_DEVICE
2720 Xyce::dout() <<
"Vcol["<<j<<
"] = " <<
dIVec[index].Vcol[j] << std::endl;
2729 if (
dIVec[index].Ncol[j] != -1)
2731 IP.row =
dIVec[index].gid;
2732 IP.col =
dIVec[index].Ncol[j];
2734 #ifdef Xyce_DEBUG_DEVICE
2737 Xyce::dout() <<
"Ncol["<<j<<
"] = " <<
dIVec[index].Ncol[j] << std::endl;
2746 if (
dIVec[index].Pcol[j] != -1)
2748 IP.row =
dIVec[index].gid;
2749 IP.col =
dIVec[index].Pcol[j];
2751 #ifdef Xyce_DEBUG_DEVICE
2754 Xyce::dout() <<
"Pcol["<<j<<
"] = " <<
dIVec[index].Pcol[j] << std::endl;
2764 #ifdef Xyce_DEBUG_DEVICE
2767 Xyce::dout() <<
"Mesh Index: i = " << i <<
" label = ";
2780 #ifdef Xyce_DEBUG_DEVICE
2783 Xyce::dout() <<
" V row,col = " <<
Vrowarray[i] <<
", ";
2784 Xyce::dout() <<
Vcolarray[i][j] <<
"\n";
2798 #ifdef Xyce_DEBUG_DEVICE
2801 Xyce::dout() <<
" N row,col = " <<
Nrowarray[i] <<
", ";
2802 Xyce::dout() <<
Ncolarray[i][j] <<
"\n";
2816 #ifdef Xyce_DEBUG_DEVICE
2819 Xyce::dout() <<
" P row,col = " <<
Prowarray[i] <<
", ";
2820 Xyce::dout() <<
Pcolarray[i][j] <<
"\n";
2827 #ifdef Xyce_DEBUG_DEVICE
2830 Xyce::dout() << std::endl;
2836 #ifdef Xyce_DEBUG_DEVICE
2839 std::list<index_pair>::iterator ip_iter;
2845 Xyce::dout() <<
"i="<<i<<
": (";
2846 Xyce::dout().width(6);
2847 Xyce::dout() << ip_iter->row;
2848 Xyce::dout() <<
", ";
2849 Xyce::dout().width(6);
2850 Xyce::dout() << ip_iter->col;
2851 Xyce::dout() <<
")\n";
2868 const std::list<index_pair> & staGIDListRef)
2872 #ifdef Xyce_DEBUG_DEVICE
2875 Xyce::dout() <<
"\n";
2876 Xyce::dout() << section_divider <<
"\n";
2877 Xyce::dout() <<
" In Instance::registerStateGIDs\n\n";
2878 Xyce::dout() <<
" name = " <<
getName() <<
"\n";
2879 Xyce::dout() <<
" Number of State GIDs: " <<
numStateVars <<
"\n";
2884 staGIDList.assign(staGIDListRef.begin(), staGIDListRef.end());
2886 std::list<index_pair>::iterator it1 =
staGIDList.begin();
2887 std::list<index_pair>::iterator last1 =
staGIDList.end ();
2889 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
2890 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
2891 std::vector<DeviceInterfaceNode>::iterator iterDI = firstDI;
2894 for (; (iterDI!=lastDI && it1!=last1);++iterDI,++it1,++i)
2896 iterDI->stateC = (*it1).row;
2897 iterDI->stateC_owned = (it1->col == 1);
2907 #ifdef Xyce_DEBUG_DEVICE
2910 Xyce::dout() <<
" State indices:" <<
"\n";
2911 Xyce::dout() <<
"\n";
2912 for (iterDI=firstDI; iterDI!=lastDI;++iterDI)
2914 Xyce::dout() <<
" ";
2915 Xyce::dout().width(12);
2916 Xyce::dout().setf(std::ios::right);
2917 Xyce::dout() << iterDI->eName;
2918 Xyce::dout().setf(std::ios::left);
2919 Xyce::dout() <<
" stateC = " << iterDI->stateC;
2920 Xyce::dout() <<
" stateC_owned = " << iterDI->stateC_owned <<
"\n";
2923 Xyce::dout() << section_divider << std::endl;
2938 const std::vector<int> & extLIDVecRef)
2943 #ifdef Xyce_DEBUG_DEVICE
2946 Xyce::dout() << section_divider << std::endl;
2947 Xyce::dout() <<
"In the Intance::registerLIDs function. ";
2948 Xyce::dout() <<
" name = "<<
getName() << std::endl;
2949 Xyce::dout() <<
"numInt = " <<
numIntVars << std::endl;
2950 Xyce::dout() <<
"numExt = " <<
numExtVars << std::endl;
2951 Xyce::dout() <<
"numMeshPoints = " <<
numMeshPoints << std::endl;
2963 #ifdef Xyce_DEBUG_DEVICE
2966 Xyce::dout() <<
"Setting up the indices for the external circuit nodes:" << std::endl;
2967 Xyce::dout() <<
"External node list:" << std::endl;
2971 int isizeDI =
dIVec.size();
2974 for(index=0; index < isizeDI; ++index)
2978 #ifdef Xyce_DEBUG_DEVICE
2981 Xyce::dout() <<
" name = "<<
dIVec[index].eName<<
" lid = ";
2982 Xyce::dout() <<
dIVec[index].lid;
2983 Xyce::dout() << std::endl;
2989 #ifdef Xyce_DEBUG_DEVICE
2992 Xyce::dout() <<
"Doing internal vars, row arrays:"<< std::endl;
3024 #ifdef Xyce_DEBUG_DEVICE
3027 Xyce::dout() <<
"doing lid row arrays for mesh point " << i << std::endl;
3029 Xyce::dout() <<
" li_Vrow = " <<
li_Vrowarray[i] << std::endl;
3032 Xyce::dout() <<
" li_Nrow = " <<
li_Nrowarray[i] << std::endl;
3035 Xyce::dout() <<
" li_Prow = " <<
li_Prowarray[i] << std::endl;
3049 #ifdef Xyce_DEBUG_DEVICE
3052 Xyce::dout() <<
"doing lid row arrays for mesh point " << i << std::endl;
3053 Xyce::dout() <<
" li_Vrow = " <<
li_Vrowarray[i] << std::endl;
3054 Xyce::dout() <<
" li_Nrow = " <<
li_Nrowarray[i] << std::endl;
3055 Xyce::dout() <<
" li_Prow = " <<
li_Prowarray[i] << std::endl;
3058 #endif // Xyce_NEW_BC
3062 #ifdef Xyce_DEBUG_DEVICE
3063 Xyce::dout() << section_divider << std::endl;
3081 #ifdef Xyce_DEBUG_DEVICE
3084 Xyce::dout() <<
"\n";
3085 Xyce::dout() << section_divider <<
"\n";
3086 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
3087 Xyce::dout() <<
" name = " <<
getName() <<
"\n";
3088 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars <<
"\n";
3095 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
3096 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
3097 std::vector<DeviceInterfaceNode>::iterator iterDI = firstDI;
3100 for (; iterDI!=lastDI;++iterDI,++i)
3111 #ifdef Xyce_DEBUG_DEVICE
3114 Xyce::dout() <<
" State indices:" <<
"\n";
3115 Xyce::dout() <<
"\n";
3116 for (iterDI=firstDI; iterDI!=lastDI;++iterDI)
3118 Xyce::dout() <<
" ";
3119 Xyce::dout().width(12);
3120 Xyce::dout().setf(std::ios::right);
3121 Xyce::dout() << iterDI->eName;
3122 Xyce::dout().setf(std::ios::left);
3123 Xyce::dout() <<
" li_stateC = " << iterDI->li_stateC;
3124 Xyce::dout() << std::endl;
3127 Xyce::dout() <<
" Displacement state indices:\n";
3130 Xyce::dout() <<
" edge: " << j <<
" li_stateDispl = " <<
li_stateDispl[j];
3131 Xyce::dout() << std::endl;
3134 Xyce::dout() << section_divider << std::endl;
3170 (
const std::vector< std::vector<int> > & jacLIDVec )
3176 #ifdef Xyce_DEBUG_DEVICE
3177 if (getDeviceOptions().debugLevel > 0)
3179 Xyce::dout() <<
"In Instance::registerJacLIDs" << std::endl;
3186 std::vector<DeviceInterfaceNode>::iterator firstDI = dIVec.begin();
3187 std::vector<DeviceInterfaceNode>::iterator lastDI = dIVec.end ();
3188 std::vector<DeviceInterfaceNode>::iterator iterDI;
3189 int DIsize = dIVec.size ();
3190 firstDI = dIVec.begin();
3191 lastDI = dIVec.end ();
3194 for(index=0,iterDI=firstDI;iterDI!=lastDI;++iterDI,++index)
3196 int jacRowSize = jacLIDVec[index].size();
3197 dIVec[index].dIdXoffset.resize(jacRowSize-dIVec[index].numCrossTerms-1);
3198 dIVec[index].lidOffset = jacLIDVec[index][0];
3200 #ifdef Xyce_DEBUG_DEVICE
3201 if (getDeviceOptions().debugLevel > 0)
3203 Xyce::dout() <<
"index = " << index;
3204 Xyce::dout() <<
" jacRowSize = " << jacRowSize;
3205 Xyce::dout() <<
" name = " << dIVec[index].eName << std::endl;
3206 Xyce::dout() <<
" lidOffset = ";
3207 Xyce::dout() << dIVec[index].lidOffset << std::endl;
3211 int nCT = dIVec[index].numCrossTerms;
3213 dIVec[index].crossOffsets.resize(nCT);
3215 for(
int itmp=0;itmp<nCT;++itmp)
3217 dIVec[index].crossOffsets[itmp] = jacLIDVec[index][itmp+1];
3218 #ifdef Xyce_DEBUG_DEVICE
3219 if (getDeviceOptions().debugLevel > 0)
3221 Xyce::dout() <<
" crossOffsets["<<itmp<<
"] = ";
3222 Xyce::dout() << dIVec[index].crossOffsets[itmp] << std::endl;
3227 for (
int ioff=nCT+1;ioff<jacRowSize;++ioff)
3229 int tmpIndex = ioff - (nCT+1);
3230 dIVec[index].dIdXoffset[tmpIndex] = jacLIDVec[index][ioff];
3232 #ifdef Xyce_DEBUG_DEVICE
3233 if (getDeviceOptions().debugLevel > 0)
3235 Xyce::dout() <<
" dIdXoffset["<<tmpIndex<<
"] = ";
3236 Xyce::dout() << dIVec[index].dIdXoffset[tmpIndex] << std::endl;
3244 li_VoffsetArray.resize(numMeshPoints);
3245 li_NoffsetArray.resize(numMeshPoints);
3246 li_PoffsetArray.resize(numMeshPoints);
3247 for(i=0;i<numMeshPoints;++i)
3250 if (boundarySten[i])
continue;
3251 #endif // Xyce_NEW_BC
3253 #ifdef Xyce_DEBUG_DEVICE
3254 if (getDeviceOptions().debugLevel > 0)
3256 Xyce::dout() <<
" mesh point i = " << i << std::endl;
3260 mNode * nodePtr = meshContainerPtr->getNode(i);
3261 std::vector<EDGEINFO>::iterator firstEI = nodePtr->
edgeInfoVector.begin ();
3262 std::vector<EDGEINFO>::iterator lastEI = nodePtr->
edgeInfoVector.end ();
3265 int Vrow = MESHtoLID_V[i];
3266 int Nrow = MESHtoLID_N[i];
3267 int Prow = MESHtoLID_P[i];
3269 #ifdef Xyce_DEBUG_DEVICE
3270 if (getDeviceOptions().debugLevel > 0)
3272 Xyce::dout() <<
" Vrow = " << Vrow << std::endl;
3273 Xyce::dout() <<
" Nrow = " << Nrow << std::endl;
3274 Xyce::dout() <<
" Prow = " << Prow << std::endl;
3282 int VrowSize = jacLIDVec[Vrow].size();
3283 li_VoffsetArray[i].resize(VrowSize);
3284 for (ioff=0;ioff<VrowSize;++ioff)
3286 li_VoffsetArray[i][ioff] = jacLIDVec[Vrow][ioff];
3287 #ifdef Xyce_DEBUG_DEVICE
3288 if (getDeviceOptions().debugLevel > 1)
3290 Xyce::dout() <<
" li_Voffset["<<i<<
"]["<<ioff<<
"] = ";
3291 Xyce::dout() << li_VoffsetArray[i][ioff] << std::endl;
3300 int NrowSize = jacLIDVec[Nrow].size();
3301 li_NoffsetArray[i].resize(NrowSize);
3302 for (ioff=0;ioff<NrowSize;++ioff)
3304 li_NoffsetArray[i][ioff] = jacLIDVec[Nrow][ioff];
3305 #ifdef Xyce_DEBUG_DEVICE
3306 if (getDeviceOptions().debugLevel > 1)
3308 Xyce::dout() <<
" li_Noffset["<<i<<
"]["<<ioff<<
"] = ";
3309 Xyce::dout() << li_NoffsetArray[i][ioff] << std::endl;
3318 int ProwSize = jacLIDVec[Prow].size();
3319 li_PoffsetArray[i].resize(ProwSize);
3320 for (ioff=0;ioff<ProwSize;++ioff)
3322 li_PoffsetArray[i][ioff] = jacLIDVec[Prow][ioff];
3323 #ifdef Xyce_DEBUG_DEVICE
3324 if (getDeviceOptions().debugLevel > 1)
3326 Xyce::dout() <<
" li_Poffset["<<i<<
"]["<<ioff<<
"] = ";
3327 Xyce::dout() << li_PoffsetArray[i][ioff] << std::endl;