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";
359 bool bsuccess =
true;
361 std::vector<DeviceInterfaceNode>::iterator first =
dIVec.begin ();
362 std::vector<DeviceInterfaceNode>::iterator last =
dIVec.end ();
363 std::vector<DeviceInterfaceNode>::iterator iterV;
368 for (iterV=first;iterV!=last; ++iterV)
370 ExtendedString tmpName = iterV->eName;
381 if ( !(edgeLabelExist) )
384 std::string msg =
"Instance::setupDINodes: "
385 "The boundary condition label "+tmpName+
386 " doesn't exist in the mesh file.\n";
387 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL_0,msg);
395 if ( !(edgeLabelExist) )
397 #ifdef Xyce_DEBUG_DEVICE
399 Xyce::dout() <<
"Erasing DI: " << iterV->eName << std::endl;
411 for (iterV=first;iterV!=last; ++iterV)
413 if (!(iterV->given))
continue;
419 iterV->materialGiven =
electrodeMap[iterV->nName]->materialGiven;
420 iterV->oxideBndryFlag =
electrodeMap[iterV->nName]->oxideBndryFlag;
426 std::string msg =
"Instance::doMeshBasedInitializations."
427 "can't find " + iterV->nName +
" in the electrode Map\n";
428 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL_0,msg);
430 #ifdef Xyce_DEBUG_DEVICE
433 Xyce::dout() << std::endl;
434 Xyce::dout() <<
"name = " << iterV->eName << std::endl;
435 Xyce::dout() <<
" material = " << iterV->material << std::endl;
436 Xyce::dout() <<
" mat. given = " << iterV->materialGiven << std::endl;
437 Xyce::dout() <<
" oxide boundary flag = " << iterV->oxideBndryFlag << std::endl;
438 Xyce::dout() <<
" oxide thickness = " << iterV->oxthick << std::endl;
439 Xyce::dout() <<
" oxide charge = " << iterV->oxcharge << std::endl;
447 first =
dIVec.begin ();
449 for (iterV=first;iterV!=last; ++iterV)
451 ExtendedString tmpName = iterV->nName;
454 #ifdef Xyce_DEBUG_DEVICE
456 Xyce::dout() <<
"Testing the neumann stuff. Name = " << tmpName << std::endl;
463 iterV->neumannBCFlagV =
true;
464 iterV->neumannBCFlagN =
true;
465 iterV->neumannBCFlagP =
true;
470 iterV->neumannBCFlagV =
false;
471 iterV->neumannBCFlagN =
true;
472 iterV->neumannBCFlagP =
true;
475 #ifdef Xyce_DEBUG_DEVICE
478 Xyce::dout() <<
"Setting the neumann flags of " << tmpName <<
":\n";
479 Xyce::dout() <<
" Vflag = " << iterV->neumannBCFlagV << std::endl;
480 Xyce::dout() <<
" Nflag = " << iterV->neumannBCFlagN << std::endl;
481 Xyce::dout() <<
" Pflag = " << iterV->neumannBCFlagP << std::endl;
487 #ifdef Xyce_DEBUG_DEVICE
490 first =
dIVec.begin ();
492 Xyce::dout() <<
"Final DI list: " << std::endl;
493 for (iterV=first;iterV!=last; ++iterV)
495 Xyce::dout() <<
"DI name:" << iterV->eName;
496 Xyce::dout() <<
" The neumann flags are:" << std::endl;
497 Xyce::dout() <<
" Vflag =";
498 if (iterV->neumannBCFlagV) Xyce::dout() <<
" true." << std::endl;
499 else Xyce::dout() <<
" false." << std::endl;
500 Xyce::dout() <<
" Nflag =";
501 if (iterV->neumannBCFlagN) Xyce::dout() <<
" true." << std::endl;
502 else Xyce::dout() <<
" false." << std::endl;
503 Xyce::dout() <<
" Pflag =";
504 if (iterV->neumannBCFlagP) Xyce::dout() <<
" true." << std::endl;
505 else Xyce::dout() <<
" false." << std::endl;
524 bool bsuccess =
true;
531 condVec[iE].resize(numElectrodes,0.0);
532 capVec[iE].resize(numElectrodes,0.0);
539 #ifdef Xyce_DEBUG_DEVICE
544 Xyce::dout() <<
" x["<<i<<
"] = " <<
xVec[i];
545 Xyce::dout() <<
" y["<<i<<
"] = " <<
yVec[i];
546 Xyce::dout() << std::endl;
625 std::vector<DeviceInterfaceNode>::iterator first =
dIVec.begin ();
626 std::vector<DeviceInterfaceNode>::iterator last =
dIVec.end ();
627 std::vector<DeviceInterfaceNode>::iterator iterV;
629 for (iterV=first;iterV!=last; ++iterV)
633 iterV->numBoundaryPoints = numPoints;
634 iterV->VequVec.resize (numPoints,0.0);
635 iterV->VbcVec.resize (numPoints,0.0);
636 iterV->nnbcVec.resize (numPoints,0.0);
637 iterV->npbcVec.resize (numPoints,0.0);
639 for (
int i=0;i<iterV->numBoundaryPoints;++i)
643 iterV->meshGlobalToLocal[nodeIndex] = i;
655 for (
int i1=0;i1<numLabels;++i1)
658 if (lPtr->
name ==
"NOFLUX")
671 UINT uLabel = edgePtr->
uLabel;
677 if(uLabel != nofluxIndex)
731 std::vector<int>::iterator firstL;
732 std::vector<int>::iterator lastL;
733 std::vector<int>::iterator iterL;
743 for (iterL=firstL; iterL!=lastL; ++iterL)
761 for (iterL=firstL; iterL!=lastL; ++iterL)
773 int size =
dIVec.size();
774 for (i = 0;i < size; ++i)
779 #ifdef Xyce_DEBUG_DEVICE
783 Xyce::dout() << section_divider << std::endl;
784 Xyce::dout() <<
"In the Intance::setupLabelIndex ";
785 Xyce::dout() <<
" name = "<<
getName() << std::endl;
790 std::vector<std::string>::iterator iterM;
792 for (i=0, iterM=firstM;iterM!=lastM;++i,++iterM)
794 Xyce::dout() <<
" i = "<<i<<
" name = " << *iterM << std::endl;
797 std::map<std::string,int>::iterator firstDIM =
labelDIMap.begin ();
798 std::map<std::string,int>::iterator lastDIM =
labelDIMap.end ();
799 std::map<std::string,int>::iterator iterDIM;
800 for(iterDIM=firstDIM;iterDIM!=lastDIM;++iterDIM)
802 Xyce::dout() <<
" DI index = "<< iterDIM->second;
803 Xyce::dout() <<
" name = " << iterDIM->first << std::endl;
812 Xyce::dout() <<
" labelIndex["<<i<<
"] = " <<
labelIndex[i];
813 Xyce::dout() <<
" name = " << labelPtr->
name << std::endl;
819 Xyce::dout() << section_divider << std::endl;
855 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
856 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
857 std::vector<DeviceInterfaceNode>::iterator iterDI;
859 #ifdef Xyce_DEBUG_DEVICE
862 Xyce::dout() <<
"In Instance::setupBoundaryStencil." << std::endl;
867 for (iterDI = firstDI; iterDI!=lastDI; ++iterDI)
877 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
878 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
879 std::vector<int>::iterator iterI;
881 for(iterI=firstI;iterI!=lastI;++iterI)
883 int nodeIndex = *iterI;
891 if (!(iterDI->neumannBCFlagV) &&
892 !(iterDI->neumannBCFlagN) && !(iterDI->neumannBCFlagP))
919 #ifdef Xyce_DEBUG_DEVICE
922 Xyce::dout() <<
"In Instance::checkForElectrodeOverlap." << std::endl;
926 for (
int iDI=0;iDI<
dIVec.size();++iDI)
936 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
937 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
938 std::vector<int>::iterator iterI;
940 for(iterI=firstI;iterI!=lastI;++iterI)
942 int nodeIndex = *iterI;
946 std::string msg =
"Electrodes " +
dIVec[iDI].eName +
" and " +
948 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL_0,msg);
971 bool bsuccess =
true;
984 int totalDirchlet = 0;
992 std::vector<DeviceInterfaceNode>::iterator first =
dIVec.begin ();
993 std::vector<DeviceInterfaceNode>::iterator last =
dIVec.end ();
994 std::vector<DeviceInterfaceNode>::iterator iterV;
995 for (iterV=first;iterV!=last; ++iterV)
999 #ifdef Xyce_DEBUG_DEVICE
1002 Xyce::dout() << iterV->eName;
1003 Xyce::dout() <<
": numInterfaceMeshPoints = ";
1005 Xyce::dout() << std::endl;
1011 for (iterV=first;iterV!=last; ++iterV)
1018 if (!(iterV->neumannBCFlagV)) mult += 1;
1019 if (!(iterV->neumannBCFlagN)) mult += 1;
1020 if (!(iterV->neumannBCFlagP)) mult += 1;
1022 totalDirchlet += (mult * numPoints);
1027 #endif // Xyce_NEW_BC
1029 #ifdef Xyce_DEBUG_DEVICE
1032 Xyce::dout() <<
"\n";
1034 Xyce::dout() <<
" numMeshPoints = " << numMeshPoints<< std::endl;
1035 Xyce::dout() <<
" numElectrodes = " <<
numElectrodes<< std::endl;
1036 Xyce::dout() <<
" numIntVars = " <<
numIntVars<< std::endl;
1037 Xyce::dout() <<
" 3*numMeshPoints = " << 3*numMeshPoints<< std::endl;
1039 Xyce::dout() <<
" totalDirchlet = " << totalDirchlet<< std::endl;
1040 Xyce::dout() << std::endl;
1065 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
1066 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
1067 std::vector<DeviceInterfaceNode>::iterator iterDI;
1069 for(iterDI=firstDI;iterDI!=lastDI;++iterDI)
1076 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
1077 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
1078 std::vector<int>::iterator iterI;
1080 std::vector<EDGEINFO>::iterator firstEI;
1081 std::vector<EDGEINFO>::iterator lastEI;
1082 std::vector<EDGEINFO>::iterator iterEI;
1089 for(nodeIndex=0,iterI=firstI;iterI!=lastI;++iterI,++nodeIndex)
1097 col1 = iterDI->Vcol[iVcol];
1102 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1104 if (iterDI->dIdXcols[cnt2] == col1)
1105 { bmatch =
true;
break; }
1109 iterDI->dIdXcols.push_back(col1);
1110 iterDI->dIdX.push_back(0.0);
1111 iterDI->dQdX.push_back(0.0);
1117 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI,++iVcol)
1119 col1 = iterDI->Vcol[iVcol];
1124 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1126 if (iterDI->dIdXcols[cnt2] == col1)
1127 { bmatch =
true;
break; }
1131 iterDI->dIdXcols.push_back(col1);
1132 iterDI->dIdX.push_back(0.0);
1133 iterDI->dQdX.push_back(0.0);
1140 for(nodeIndex=0,iterI=firstI;iterI!=lastI;++iterI,++nodeIndex)
1148 col1 = iterDI->Ncol[iNcol];
1153 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1155 if (iterDI->dIdXcols[cnt2] == col1)
1156 { bmatch =
true;
break; }
1160 iterDI->dIdXcols.push_back(col1);
1161 iterDI->dIdX.push_back(0.0);
1162 iterDI->dQdX.push_back(0.0);
1168 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI,++iNcol)
1170 col1 = iterDI->Ncol[iNcol];
1175 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1177 if (iterDI->dIdXcols[cnt2] == col1)
1178 { bmatch =
true;
break; }
1182 iterDI->dIdXcols.push_back(col1);
1183 iterDI->dIdX.push_back(0.0);
1184 iterDI->dQdX.push_back(0.0);
1191 for(nodeIndex=0,iterI=firstI;iterI!=lastI;++iterI,++nodeIndex)
1199 col1 = iterDI->Pcol[iPcol];
1204 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1206 if (iterDI->dIdXcols[cnt2] == col1)
1207 { bmatch =
true;
break; }
1211 iterDI->dIdXcols.push_back(col1);
1212 iterDI->dIdX.push_back(0.0);
1213 iterDI->dQdX.push_back(0.0);
1219 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI,++iPcol)
1221 col1 = iterDI->Pcol[iPcol];
1226 for (cnt2=0;cnt2<iterDI->dIdXcols.size();++cnt2)
1228 if (iterDI->dIdXcols[cnt2] == col1)
1229 { bmatch =
true;
break; }
1233 iterDI->dIdXcols.push_back(col1);
1234 iterDI->dIdX.push_back(0.0);
1235 iterDI->dQdX.push_back(0.0);
1245 for(nodeIndex=0,iterI=firstI;iterI!=lastI;++iterI,++nodeIndex)
1252 col1 = iterDI->Pcol[iPcol];
1253 int meshNode = *iterI;
1259 for (cnt2=0;cnt2<iterDI->neighborNodes.size();++cnt2)
1261 if (iterDI->neighborNodes[cnt2] == meshNode)
1262 { bmatch =
true;
break; }
1266 iterDI->neighborNodes.push_back(meshNode);
1274 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI,++iPcol)
1276 col1 = iterDI->Pcol[iPcol];
1277 int meshNode = iterEI->inode;
1283 for (cnt2=0;cnt2<iterDI->neighborNodes.size();++cnt2)
1285 if (iterDI->neighborNodes[cnt2] == meshNode)
1286 { bmatch =
true;
break; }
1290 iterDI->neighborNodes.push_back(meshNode);
1296 int size1 = iterDI->neighborNodes.size();
1297 int size3 = iterDI->dIdX.size();
1298 #ifdef Xyce_DEBUG_DEVICE
1301 Xyce::dout() << std::endl;
1302 Xyce::dout() <<
"number of neighbor nodes for " << iterDI->eName;
1303 Xyce::dout() <<
" is " << size1 << std::endl;
1305 for (i=0;i<size1;++i)
1307 Xyce::dout() <<
"neighborNodes["<<i<<
"] = " << iterDI->neighborNodes[i] << std::endl;
1309 Xyce::dout() << std::endl;
1310 Xyce::dout() <<
"dIdX size for " << iterDI->eName <<
" is " << size3 << std::endl;
1311 for (i=0;i<size3;++i)
1313 Xyce::dout() <<
"dIdX["<<i<<
"] = " << iterDI->dIdXcols[i] << std::endl;
1321 int numNeighbor = iterDI->neighborNodes.size();
1324 for (iNeighbor=0;iNeighbor<numNeighbor;++iNeighbor)
1326 int inode = iterDI->neighborNodes[iNeighbor];
1329 for (
int iNN=0;iNN<nodePtr->
cnode;++iNN)
1340 iterDI->dFdVckt.push_back(0.0); ++dFdVindex;
1341 iterDI->dFdVckt.push_back(0.0); ++dFdVindex;
1342 iterDI->dFdVckt.push_back(0.0); ++dFdVindex;
1346 #ifdef Xyce_DEBUG_DEVICE
1349 Xyce::dout() << iterDI->eName <<
": size of dFdVckt = " << dFdVindex << std::endl;
1354 UserWarning0(*
this) <<
"NEW_BC must be turned on to use TWO_LEVEL_NEWTON";
1355 #endif // Xyce_NEW_BC
1387 #ifdef Xyce_DEBUG_DEVICE
1390 Xyce::dout() << section_divider <<
"\n";
1391 Xyce::dout() <<
"setupBCEdgeAreas. name = " <<
getName() << std::endl;
1392 Xyce::dout().setf(std::ios::scientific);
1399 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
1400 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
1401 std::vector<DeviceInterfaceNode>::iterator iterDI;
1403 for (iterDI = firstDI; iterDI!=lastDI; ++iterDI)
1411 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
1412 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
1413 std::vector<int>::iterator iterI;
1417 for(iterI=firstI;iterI!=lastI;++iterI)
1422 std::vector<EDGEINFO>::iterator firstEI = nodePtr->
edgeInfoVector.begin();
1423 std::vector<EDGEINFO>::iterator lastEI = nodePtr->
edgeInfoVector.end ();
1424 std::vector<EDGEINFO>::iterator iterEI;
1426 double areaLocal = 0.0;
1427 double areaTmp = 0.0;
1429 #ifdef Xyce_DEBUG_DEVICE
1432 Xyce::dout() <<
" --------------- " << std::endl;
1433 Xyce::dout() <<
"name = " << iterDI->eName;
1434 Xyce::dout() <<
" node = " << *iterI << std::endl;
1438 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1440 int neighbor = iterEI->inode;
1451 if (labelPtr->
name == iterDI->eName)
1457 double x1 =
xVec[*iterI];
1458 double y1 =
yVec[*iterI];
1460 double x2 =
xVec[neighbor];
1461 double y2 =
yVec[neighbor];
1463 double dx = x2-x1; dx *= 0.5;
1464 double dy = y2-y1; dy *= 0.5;
1470 areaLocal += areaTmp;
1474 areaTmp = 0.5 * iterEI->elen;
1475 areaLocal += 0.5 * iterEI->elen;
1478 #ifdef Xyce_DEBUG_DEVICE
1481 Xyce::dout() <<
" neighbor node = " << neighbor << std::endl;
1482 Xyce::dout() <<
" areaTmp = " << areaTmp << std::endl;
1483 Xyce::dout() <<
" areaLocal = " << areaLocal << std::endl;
1484 Xyce::dout() <<
" elen = " << iterEI->elen << std::endl;
1485 Xyce::dout() <<
" label name = " << labelPtr->
name << std::endl;
1486 Xyce::dout() <<
" DI eName = " << iterDI->eName << std::endl;
1487 Xyce::dout() <<
"---" << std::endl;
1492 #ifdef Xyce_DEBUG_DEVICE
1495 Xyce::dout() <<
" --------------- " << std::endl;
1498 iterDI->area += areaLocal;
1499 iterDI->areaVector.push_back(areaLocal);
1504 #ifdef Xyce_DEBUG_DEVICE
1507 Xyce::dout().setf(std::ios::scientific);
1508 Xyce::dout() <<
" Total area for edge: " << iterDI->area << std::endl;
1513 #ifdef Xyce_DEBUG_DEVICE
1516 Xyce::dout() << section_divider <<
"\n";
1540 std::vector<EDGEINFO>::iterator firstEI = nodePtr->
edgeInfoVector.begin();
1541 std::vector<EDGEINFO>::iterator lastEI = nodePtr->
edgeInfoVector.end ();
1542 std::vector<EDGEINFO>::iterator iterEI;
1544 double tmpDX = +1.0e99;
1545 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1547 if (tmpDX > iterEI->elen) tmpDX = iterEI->elen;
1549 #ifdef Xyce_DEBUG_DEVICE
1552 Xyce::dout() <<
"i = " << i <<
" minDX = " << tmpDX; Xyce::dout() << std::endl;
1582 bool bsuccess =
true;
1585 #ifdef Xyce_DEBUG_DEVICE
1588 Xyce::dout() <<
"In Instance::setupJacStamp" << std::endl;
1589 Xyce::dout() <<
"numIntVars = " <<
numIntVars << std::endl;
1590 Xyce::dout() <<
"numMeshPoints = " <<
numMeshPoints << std::endl;
1611 #ifdef Xyce_DEBUG_DEVICE
1614 Xyce::dout() <<
"size of jacStamp = " <<
jacStamp.size() << std::endl;
1619 int LIDcounter = numPossibleElectrodes;
1625 #endif // Xyce_NEW_BC
1646 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
1647 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
1648 std::vector<DeviceInterfaceNode>::iterator iterDI;
1649 int DIsize =
dIVec.size ();
1650 firstDI =
dIVec.begin();
1651 lastDI =
dIVec.end ();
1656 for(index=0,iterDI=firstDI;iterDI!=lastDI;++iterDI,++index)
1668 dIVec[index].numCrossTerms = 0;
1672 for (
int ind2=0;ind2<DIsize;++ind2)
1674 if (ind2==index)
continue;
1677 ++(
dIVec[index].numCrossTerms);
1686 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
1687 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
1688 std::vector<int>::iterator iterI;
1690 std::vector<EDGEINFO>::iterator firstEI;
1691 std::vector<EDGEINFO>::iterator lastEI;
1692 std::vector<EDGEINFO>::iterator iterEI;
1696 for(iterI=firstI;iterI!=lastI;++iterI)
1708 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
1710 imesh = iterEI->inode;
1716 for(iterI=firstI;iterI!=lastI;++iterI)
1728 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
1730 imesh = iterEI->inode;
1736 for(iterI=firstI;iterI!=lastI;++iterI)
1747 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
1749 imesh = iterEI->inode;
1762 #endif // Xyce_NEW_BC
1764 #ifdef Xyce_DEBUG_DEVICE
1767 Xyce::dout() <<
" mesh point i = " << i << std::endl;
1772 std::vector<EDGEINFO>::iterator firstEI = nodePtr->
edgeInfoVector.begin ();
1773 std::vector<EDGEINFO>::iterator lastEI = nodePtr->
edgeInfoVector.end ();
1774 std::vector<EDGEINFO>::iterator iterEI;
1781 #ifdef Xyce_DEBUG_DEVICE
1784 Xyce::dout() <<
" Vrow = " << Vrow << std::endl;
1785 Xyce::dout() <<
" Nrow = " << Nrow << std::endl;
1786 Xyce::dout() <<
" Prow = " << Prow << std::endl;
1797 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1807 jacStamp[Vrow].push_back (DIindex);
1811 int imesh = iterEI->inode;
1815 #else // Xyce_NEW_BC
1816 int imesh = iterEI->inode;
1819 #endif // Xyce_NEW_BC
1831 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1833 int imesh = iterEI->inode;
1843 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1853 jacStamp[Nrow].push_back (DIindex);
1857 int imesh = iterEI->inode;
1861 #else // Xyce_NEW_BC
1862 int imesh = iterEI->inode;
1865 #endif // Xyce_NEW_BC
1875 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1877 int imesh = iterEI->inode;
1886 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
1896 jacStamp[Prow].push_back (DIindex);
1900 int imesh = iterEI->inode;
1904 #else // Xyce_NEW_BC
1905 int imesh = iterEI->inode;
1908 #endif // Xyce_NEW_BC
1921 firstDI =
dIVec.begin();
1922 lastDI =
dIVec.end ();
1924 for(index=0,iterDI=firstDI;iterDI!=lastDI;++iterDI,++index)
1938 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
1939 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
1940 std::vector<int>::iterator iterI;
1946 for(iterI=firstI;iterI!=lastI;++iterI)
1953 #endif // Xyce_NEW_BC
1955 #ifdef Xyce_DEBUG_DEVICE
1959 for(irow=0;irow<
jacStamp.size();++irow)
1961 Xyce::dout() <<
"irow = " << irow;
1962 if (irow <
dIVec.size())
1963 Xyce::dout() <<
" " <<
dIVec[irow].eName <<
" KCL";
1964 Xyce::dout() << std::endl;
1965 for (icol=0;icol<
jacStamp[irow].size();++icol)
1968 Xyce::dout() <<
" jacStamp["<<irow<<
"]["<<icol<<
"] = "<<jsTmp;
1969 Xyce::dout() << std::endl;
1987 const std::list<index_pair> & intGIDListRef,
1988 const std::list<index_pair> & extGIDListRef)
1993 #ifdef Xyce_DEBUG_DEVICE
1996 Xyce::dout() << section_divider << std::endl;
1997 Xyce::dout() <<
"In the Instance::registerGIDs function. ";
1998 Xyce::dout() <<
" name = "<<
getName() << std::endl;
1999 Xyce::dout() <<
"numInt = " <<
numIntVars <<
"\n";
2000 Xyce::dout() <<
"numExt = " <<
numExtVars <<
"\n";
2001 Xyce::dout() <<
"numMeshPoints = " <<
numMeshPoints <<
"\n";
2006 intGIDList.assign(intGIDListRef.begin(), intGIDListRef.end());
2007 extGIDList.assign(extGIDListRef.begin(), extGIDListRef.end());
2013 std::list<index_pair>::iterator it1 =
extGIDList.begin();
2015 std::list<index_pair>::iterator first =
extGIDList.begin();
2016 std::list<index_pair>::iterator last =
extGIDList.end ();
2017 std::list<index_pair>::iterator iter;
2020 #ifdef Xyce_DEBUG_DEVICE
2023 Xyce::dout() <<
"Setting up the indices for the external circuit nodes:" << std::endl;
2024 Xyce::dout() <<
"External node list:" << std::endl;
2028 int numExtNodes = 0;
2029 for(iter=first;iter!=last;++iter)
2031 if ( (iter->col) && (iter->row != -1) )
2036 #ifdef Xyce_DEBUG_DEVICE
2039 Xyce::dout() <<
"node = " << iter->row <<
" col = ";
2040 Xyce::dout() << iter->col <<
" numExtNodes = " << numExtNodes << std::endl;
2045 #ifdef Xyce_DEBUG_DEVICE
2047 Xyce::dout() <<
" number of owned external nodes = " << numExtNodes << std::endl;
2050 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
2051 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
2052 std::vector<DeviceInterfaceNode>::iterator iterDI;
2054 for(iterDI=firstDI;iterDI!=lastDI;++iterDI)
2056 if (iterDI->given) ++numRealDIs;
2059 #ifdef Xyce_DEBUG_DEVICE
2062 Xyce::dout() <<
" number of user specified boundary conditions = ";
2063 Xyce::dout() << numRealDIs << std::endl;
2067 if (numRealDIs < numExtNodes)
2069 DevelFatal(*this).in(
"Instance::registerGIDs")
2070 <<
"Number of boundary conditions < number of external nodes";
2073 int isizeDI =
dIVec.size();
2075 for(index=0, iter=first; (iter!=last && index < isizeDI); ++iter, ++index)
2077 dIVec[index].gid = iter->row;
2078 if ( !(iter->col) )
dIVec[index].gid = -1;
2080 #ifdef Xyce_DEBUG_DEVICE
2083 Xyce::dout() <<
" name = "<<
dIVec[index].eName<<
" gid = ";
2084 Xyce::dout() <<
dIVec[index].gid;
2085 Xyce::dout() << std::endl;
2092 std::vector<int>::iterator iterTmp = labelPtr->
mNodeVector.begin();
2094 dIVec[index].firstMeshNodeIndex = *iterTmp;
2098 #ifdef Xyce_DEBUG_DEVICE
2101 Xyce::dout() <<
"doing internal vars, row arrays:"<< std::endl;
2106 std::list<index_pair>::iterator intEnd =
intGIDList.end();
2107 std::list<index_pair>::iterator it2 =
intGIDList.begin();
2124 if ( !(it2->col) ) Vrow = -1;
2132 if ( !(it2->col) ) Nrow = -1;
2140 if ( !(it2->col) ) Prow = -1;
2145 #ifdef Xyce_DEBUG_DEVICE
2148 Xyce::dout() <<
"doing row arrays for mesh point " << i << std::endl;
2150 Xyce::dout() <<
" Vrow = " << Vrow << std::endl;
2153 Xyce::dout() <<
" Nrow = " << Nrow << std::endl;
2156 Xyce::dout() <<
" Prow = " << Prow << std::endl;
2163 if ( !(it2->col) ) Vrow = -1;
2168 if ( !(it2->col) ) Nrow = -1;
2173 if ( !(it2->col) ) Prow = -1;
2177 #ifdef Xyce_DEBUG_DEVICE
2180 Xyce::dout() <<
"doing row arrays for mesh point " << i << std::endl;
2181 Xyce::dout() <<
" Vrow = " << Vrow << std::endl;
2182 Xyce::dout() <<
" Nrow = " << Nrow << std::endl;
2183 Xyce::dout() <<
" Prow = " << Prow << std::endl;
2186 #endif // Xyce_NEW_BC
2198 #ifdef Xyce_DEBUG_DEVICE
2201 Xyce::dout() <<
"maxColsPerRow = " <<
maxColsPerRow << std::endl;
2205 #ifdef Xyce_DEBUG_DEVICE
2206 Xyce::dout() << section_divider << std::endl;
2228 char tmpchar[128];
for (i=0;i<128;++i) tmpchar[i] = 0;
2235 #endif // Xyce_NEW_BC
2237 int Vrow, Nrow, Prow;
2244 std::ostringstream oss;
2251 std::ostringstream oss;
2258 std::ostringstream oss;
2303 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
2304 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
2305 std::vector<DeviceInterfaceNode>::iterator iterDI;
2307 #ifdef Xyce_DEBUG_DEVICE
2310 Xyce::dout() <<
"Instance::setupRowColPairs ()" << std::endl;
2311 Xyce::dout() <<
" doing internal vars, col arrays:"<< std::endl;
2322 #endif // Xyce_NEW_BC
2324 #ifdef Xyce_DEBUG_DEVICE
2327 Xyce::dout() <<
"doing col arrays for mesh point " << i<< std::endl;
2332 std::vector<EDGEINFO>::iterator firstEI = nodePtr->
edgeInfoVector.begin ();
2333 std::vector<EDGEINFO>::iterator lastEI = nodePtr->
edgeInfoVector.end ();
2334 std::vector<EDGEINFO>::iterator iterEI;
2340 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
2358 #endif // Xyce_NEW_BC
2364 #ifdef Xyce_DEBUG_DEVICE
2367 Xyce::dout() <<
"size of vcolarray["<<i<<
"] = " <<
Vcolarray[i].size() << std::endl;
2368 for(
int eric=0;eric<
Vcolarray[i].size();++eric)
2369 Xyce::dout() <<
" col["<<eric<<
"] = " <<
Vcolarray[i][eric] << std::endl;
2376 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
2382 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
2400 #endif // Xyce_NEW_BC
2407 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
2412 for (iterEI=firstEI;iterEI!=lastEI;++iterEI)
2430 #endif // Xyce_NEW_BC
2436 #ifdef Xyce_DEBUG_DEVICE
2439 Xyce::dout() <<
"doing some boundary condition vars:"<< std::endl;
2449 firstDI =
dIVec.begin();
2450 lastDI =
dIVec.end ();
2454 for(index=0,iterDI=firstDI;iterDI!=lastDI;++iterDI,++index)
2462 #ifdef Xyce_DEBUG_DEVICE
2465 Xyce::dout() <<
"Device Interface: " <<
dIVec[index].eName << std::endl;
2475 std::vector<int>::iterator firstI = labelPtr->
mNodeVector.begin();
2476 std::vector<int>::iterator lastI = labelPtr->
mNodeVector.end ();
2477 std::vector<int>::iterator iterI;
2484 for(iterI=firstI;iterI!=lastI;++iterI)
2488 #endif // Xyce_NEW_BC
2507 std::vector<EDGEINFO>::iterator firstEI;
2508 std::vector<EDGEINFO>::iterator lastEI;
2509 std::vector<EDGEINFO>::iterator iterEI;
2511 #ifdef Xyce_DEBUG_DEVICE
2514 Xyce::dout() <<
"V edge and edge neighbor gids:" << std::endl;
2519 for(iterI=firstI;iterI!=lastI;++iterI)
2522 dIVec[index].Vcol.push_back(itmp);
2524 #ifdef Xyce_DEBUG_DEVICE
2527 int ind1 =
dIVec[index].Vcol.size()-1;
2528 Xyce::dout() <<
" 1Vcol["<<ind1<<
"] = " << itmp << std::endl;
2537 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
2540 dIVec[index].Vcol.push_back(itmp);
2542 #ifdef Xyce_DEBUG_DEVICE
2545 int ind1 =
dIVec[index].Vcol.size()-1;
2546 Xyce::dout() <<
" 2Vcol["<<ind1<<
"] = " << itmp << std::endl;
2552 #ifdef Xyce_DEBUG_DEVICE
2555 Xyce::dout() <<
"N edge and edge neighbor gids:" << std::endl;
2560 for(iterI=firstI;iterI!=lastI;++iterI)
2563 dIVec[index].Ncol.push_back(itmp);
2565 #ifdef Xyce_DEBUG_DEVICE
2568 int ind1 =
dIVec[index].Ncol.size()-1;
2569 Xyce::dout() <<
" 1Ncol["<<ind1<<
"] = " << itmp << std::endl;
2578 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
2581 dIVec[index].Ncol.push_back(itmp);
2583 #ifdef Xyce_DEBUG_DEVICE
2586 int ind1 =
dIVec[index].Ncol.size()-1;
2587 Xyce::dout() <<
" 2Ncol["<<ind1<<
"] = " << itmp << std::endl;
2593 #ifdef Xyce_DEBUG_DEVICE
2596 Xyce::dout() <<
"P edge and edge neighbor gids:" << std::endl;
2600 for(iterI=firstI;iterI!=lastI;++iterI)
2603 dIVec[index].Pcol.push_back(itmp);
2605 #ifdef Xyce_DEBUG_DEVICE
2608 int ind1 =
dIVec[index].Pcol.size()-1;
2609 Xyce::dout() <<
" 1Pcol["<<ind1<<
"] = " << itmp << std::endl;
2618 for (iterEI=firstEI; iterEI!=lastEI; ++iterEI)
2621 dIVec[index].Pcol.push_back(itmp);
2623 #ifdef Xyce_DEBUG_DEVICE
2626 int ind1 =
dIVec[index].Pcol.size()-1;
2627 Xyce::dout() <<
" 2Pcol["<<ind1<<
"] = " << itmp << std::endl;
2634 (
dIVec[index].Vcol.size() +
2635 dIVec[index].Ncol.size() +
2636 dIVec[index].Pcol.size() + 10)
2640 (
dIVec[index].Vcol.size() +
2641 dIVec[index].Ncol.size() +
2642 dIVec[index].Pcol.size() + 10);
2646 #ifdef Xyce_DEBUG_DEVICE
2649 Xyce::dout() <<
"Setting up the index pairs."<< std::endl;
2660 firstDI =
dIVec.begin();
2661 lastDI =
dIVec.end ();
2662 for(index=0,iterDI=firstDI;iterDI!=lastDI;++iterDI,++index)
2664 #ifdef Xyce_DEBUG_DEVICE
2666 Xyce::dout() <<
"device interface name: " << iterDI->eName << std::endl;
2673 if (
dIVec[index].gid == -1)
continue;
2677 #ifdef Xyce_DEBUG_DEVICE
2679 Xyce::dout() <<
"index = " << index<<
" gid = " <<
dIVec[index].gid << std::endl;
2683 IP.row =
dIVec[index].gid;
2684 IP.col =
dIVec[index].gid;
2689 int size2 =
dIVec.size();
2690 for (
int ind2=0;ind2<size2;++ind2)
2692 if (index == ind2)
continue;
2693 IP.row =
dIVec[index].gid;
2694 IP.col =
dIVec[ind2].gid;
2700 nn =
dIVec[index].Vcol.size();
2704 if (
dIVec[index].Vcol[j] != -1)
2706 IP.row =
dIVec[index].gid;
2707 IP.col =
dIVec[index].Vcol[j];
2709 #ifdef Xyce_DEBUG_DEVICE
2712 Xyce::dout() <<
"Vcol["<<j<<
"] = " <<
dIVec[index].Vcol[j] << std::endl;
2721 if (
dIVec[index].Ncol[j] != -1)
2723 IP.row =
dIVec[index].gid;
2724 IP.col =
dIVec[index].Ncol[j];
2726 #ifdef Xyce_DEBUG_DEVICE
2729 Xyce::dout() <<
"Ncol["<<j<<
"] = " <<
dIVec[index].Ncol[j] << std::endl;
2738 if (
dIVec[index].Pcol[j] != -1)
2740 IP.row =
dIVec[index].gid;
2741 IP.col =
dIVec[index].Pcol[j];
2743 #ifdef Xyce_DEBUG_DEVICE
2746 Xyce::dout() <<
"Pcol["<<j<<
"] = " <<
dIVec[index].Pcol[j] << std::endl;
2756 #ifdef Xyce_DEBUG_DEVICE
2759 Xyce::dout() <<
"Mesh Index: i = " << i <<
" label = ";
2772 #ifdef Xyce_DEBUG_DEVICE
2775 Xyce::dout() <<
" V row,col = " <<
Vrowarray[i] <<
", ";
2776 Xyce::dout() <<
Vcolarray[i][j] <<
"\n";
2790 #ifdef Xyce_DEBUG_DEVICE
2793 Xyce::dout() <<
" N row,col = " <<
Nrowarray[i] <<
", ";
2794 Xyce::dout() <<
Ncolarray[i][j] <<
"\n";
2808 #ifdef Xyce_DEBUG_DEVICE
2811 Xyce::dout() <<
" P row,col = " <<
Prowarray[i] <<
", ";
2812 Xyce::dout() <<
Pcolarray[i][j] <<
"\n";
2819 #ifdef Xyce_DEBUG_DEVICE
2822 Xyce::dout() << std::endl;
2828 #ifdef Xyce_DEBUG_DEVICE
2831 std::list<index_pair>::iterator ip_iter;
2837 Xyce::dout() <<
"i="<<i<<
": (";
2838 Xyce::dout().width(6);
2839 Xyce::dout() << ip_iter->row;
2840 Xyce::dout() <<
", ";
2841 Xyce::dout().width(6);
2842 Xyce::dout() << ip_iter->col;
2843 Xyce::dout() <<
")\n";
2860 const std::list<index_pair> & staGIDListRef)
2864 #ifdef Xyce_DEBUG_DEVICE
2867 Xyce::dout() <<
"\n";
2868 Xyce::dout() << section_divider <<
"\n";
2869 Xyce::dout() <<
" In Instance::registerStateGIDs\n\n";
2870 Xyce::dout() <<
" name = " <<
getName() <<
"\n";
2871 Xyce::dout() <<
" Number of State GIDs: " <<
numStateVars <<
"\n";
2876 staGIDList.assign(staGIDListRef.begin(), staGIDListRef.end());
2878 std::list<index_pair>::iterator it1 =
staGIDList.begin();
2879 std::list<index_pair>::iterator last1 =
staGIDList.end ();
2881 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
2882 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
2883 std::vector<DeviceInterfaceNode>::iterator iterDI = firstDI;
2886 for (; (iterDI!=lastDI && it1!=last1);++iterDI,++it1,++i)
2888 iterDI->stateC = (*it1).row;
2889 iterDI->stateC_owned = (it1->col == 1);
2899 #ifdef Xyce_DEBUG_DEVICE
2902 Xyce::dout() <<
" State indices:" <<
"\n";
2903 Xyce::dout() <<
"\n";
2904 for (iterDI=firstDI; iterDI!=lastDI;++iterDI)
2906 Xyce::dout() <<
" ";
2907 Xyce::dout().width(12);
2908 Xyce::dout().setf(std::ios::right);
2909 Xyce::dout() << iterDI->eName;
2910 Xyce::dout().setf(std::ios::left);
2911 Xyce::dout() <<
" stateC = " << iterDI->stateC;
2912 Xyce::dout() <<
" stateC_owned = " << iterDI->stateC_owned <<
"\n";
2915 Xyce::dout() << section_divider << std::endl;
2930 const std::vector<int> & extLIDVecRef)
2935 #ifdef Xyce_DEBUG_DEVICE
2938 Xyce::dout() << section_divider << std::endl;
2939 Xyce::dout() <<
"In the Intance::registerLIDs function. ";
2940 Xyce::dout() <<
" name = "<<
getName() << std::endl;
2941 Xyce::dout() <<
"numInt = " <<
numIntVars << std::endl;
2942 Xyce::dout() <<
"numExt = " <<
numExtVars << std::endl;
2943 Xyce::dout() <<
"numMeshPoints = " <<
numMeshPoints << std::endl;
2955 #ifdef Xyce_DEBUG_DEVICE
2958 Xyce::dout() <<
"Setting up the indices for the external circuit nodes:" << std::endl;
2959 Xyce::dout() <<
"External node list:" << std::endl;
2963 int isizeDI =
dIVec.size();
2966 for(index=0; index < isizeDI; ++index)
2970 #ifdef Xyce_DEBUG_DEVICE
2973 Xyce::dout() <<
" name = "<<
dIVec[index].eName<<
" lid = ";
2974 Xyce::dout() <<
dIVec[index].lid;
2975 Xyce::dout() << std::endl;
2981 #ifdef Xyce_DEBUG_DEVICE
2984 Xyce::dout() <<
"Doing internal vars, row arrays:"<< std::endl;
3016 #ifdef Xyce_DEBUG_DEVICE
3019 Xyce::dout() <<
"doing lid row arrays for mesh point " << i << std::endl;
3021 Xyce::dout() <<
" li_Vrow = " <<
li_Vrowarray[i] << std::endl;
3024 Xyce::dout() <<
" li_Nrow = " <<
li_Nrowarray[i] << std::endl;
3027 Xyce::dout() <<
" li_Prow = " <<
li_Prowarray[i] << std::endl;
3041 #ifdef Xyce_DEBUG_DEVICE
3044 Xyce::dout() <<
"doing lid row arrays for mesh point " << i << std::endl;
3045 Xyce::dout() <<
" li_Vrow = " <<
li_Vrowarray[i] << std::endl;
3046 Xyce::dout() <<
" li_Nrow = " <<
li_Nrowarray[i] << std::endl;
3047 Xyce::dout() <<
" li_Prow = " <<
li_Prowarray[i] << std::endl;
3050 #endif // Xyce_NEW_BC
3054 #ifdef Xyce_DEBUG_DEVICE
3055 Xyce::dout() << section_divider << std::endl;
3073 #ifdef Xyce_DEBUG_DEVICE
3076 Xyce::dout() <<
"\n";
3077 Xyce::dout() << section_divider <<
"\n";
3078 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
3079 Xyce::dout() <<
" name = " <<
getName() <<
"\n";
3080 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars <<
"\n";
3087 std::vector<DeviceInterfaceNode>::iterator firstDI =
dIVec.begin();
3088 std::vector<DeviceInterfaceNode>::iterator lastDI =
dIVec.end ();
3089 std::vector<DeviceInterfaceNode>::iterator iterDI = firstDI;
3092 for (; iterDI!=lastDI;++iterDI,++i)
3103 #ifdef Xyce_DEBUG_DEVICE
3106 Xyce::dout() <<
" State indices:" <<
"\n";
3107 Xyce::dout() <<
"\n";
3108 for (iterDI=firstDI; iterDI!=lastDI;++iterDI)
3110 Xyce::dout() <<
" ";
3111 Xyce::dout().width(12);
3112 Xyce::dout().setf(std::ios::right);
3113 Xyce::dout() << iterDI->eName;
3114 Xyce::dout().setf(std::ios::left);
3115 Xyce::dout() <<
" li_stateC = " << iterDI->li_stateC;
3116 Xyce::dout() << std::endl;
3119 Xyce::dout() <<
" Displacement state indices:\n";
3122 Xyce::dout() <<
" edge: " << j <<
" li_stateDispl = " <<
li_stateDispl[j];
3123 Xyce::dout() << std::endl;
3126 Xyce::dout() << section_divider << std::endl;
3162 (
const std::vector< std::vector<int> > & jacLIDVec )
3168 #ifdef Xyce_DEBUG_DEVICE
3169 if (getDeviceOptions().debugLevel > 0)
3171 Xyce::dout() <<
"In Instance::registerJacLIDs" << std::endl;
3178 std::vector<DeviceInterfaceNode>::iterator firstDI = dIVec.begin();
3179 std::vector<DeviceInterfaceNode>::iterator lastDI = dIVec.end ();
3180 std::vector<DeviceInterfaceNode>::iterator iterDI;
3181 int DIsize = dIVec.size ();
3182 firstDI = dIVec.begin();
3183 lastDI = dIVec.end ();
3186 for(index=0,iterDI=firstDI;iterDI!=lastDI;++iterDI,++index)
3188 int jacRowSize = jacLIDVec[index].size();
3189 dIVec[index].dIdXoffset.resize(jacRowSize-dIVec[index].numCrossTerms-1);
3190 dIVec[index].lidOffset = jacLIDVec[index][0];
3192 #ifdef Xyce_DEBUG_DEVICE
3193 if (getDeviceOptions().debugLevel > 0)
3195 Xyce::dout() <<
"index = " << index;
3196 Xyce::dout() <<
" jacRowSize = " << jacRowSize;
3197 Xyce::dout() <<
" name = " << dIVec[index].eName << std::endl;
3198 Xyce::dout() <<
" lidOffset = ";
3199 Xyce::dout() << dIVec[index].lidOffset << std::endl;
3203 int nCT = dIVec[index].numCrossTerms;
3205 dIVec[index].crossOffsets.resize(nCT);
3207 for(
int itmp=0;itmp<nCT;++itmp)
3209 dIVec[index].crossOffsets[itmp] = jacLIDVec[index][itmp+1];
3210 #ifdef Xyce_DEBUG_DEVICE
3211 if (getDeviceOptions().debugLevel > 0)
3213 Xyce::dout() <<
" crossOffsets["<<itmp<<
"] = ";
3214 Xyce::dout() << dIVec[index].crossOffsets[itmp] << std::endl;
3219 for (
int ioff=nCT+1;ioff<jacRowSize;++ioff)
3221 int tmpIndex = ioff - (nCT+1);
3222 dIVec[index].dIdXoffset[tmpIndex] = jacLIDVec[index][ioff];
3224 #ifdef Xyce_DEBUG_DEVICE
3225 if (getDeviceOptions().debugLevel > 0)
3227 Xyce::dout() <<
" dIdXoffset["<<tmpIndex<<
"] = ";
3228 Xyce::dout() << dIVec[index].dIdXoffset[tmpIndex] << std::endl;
3236 li_VoffsetArray.resize(numMeshPoints);
3237 li_NoffsetArray.resize(numMeshPoints);
3238 li_PoffsetArray.resize(numMeshPoints);
3239 for(i=0;i<numMeshPoints;++i)
3242 if (boundarySten[i])
continue;
3243 #endif // Xyce_NEW_BC
3245 #ifdef Xyce_DEBUG_DEVICE
3246 if (getDeviceOptions().debugLevel > 0)
3248 Xyce::dout() <<
" mesh point i = " << i << std::endl;
3252 mNode * nodePtr = meshContainerPtr->getNode(i);
3253 std::vector<EDGEINFO>::iterator firstEI = nodePtr->
edgeInfoVector.begin ();
3254 std::vector<EDGEINFO>::iterator lastEI = nodePtr->
edgeInfoVector.end ();
3257 int Vrow = MESHtoLID_V[i];
3258 int Nrow = MESHtoLID_N[i];
3259 int Prow = MESHtoLID_P[i];
3261 #ifdef Xyce_DEBUG_DEVICE
3262 if (getDeviceOptions().debugLevel > 0)
3264 Xyce::dout() <<
" Vrow = " << Vrow << std::endl;
3265 Xyce::dout() <<
" Nrow = " << Nrow << std::endl;
3266 Xyce::dout() <<
" Prow = " << Prow << std::endl;
3274 int VrowSize = jacLIDVec[Vrow].size();
3275 li_VoffsetArray[i].resize(VrowSize);
3276 for (ioff=0;ioff<VrowSize;++ioff)
3278 li_VoffsetArray[i][ioff] = jacLIDVec[Vrow][ioff];
3279 #ifdef Xyce_DEBUG_DEVICE
3280 if (getDeviceOptions().debugLevel > 1)
3282 Xyce::dout() <<
" li_Voffset["<<i<<
"]["<<ioff<<
"] = ";
3283 Xyce::dout() << li_VoffsetArray[i][ioff] << std::endl;
3292 int NrowSize = jacLIDVec[Nrow].size();
3293 li_NoffsetArray[i].resize(NrowSize);
3294 for (ioff=0;ioff<NrowSize;++ioff)
3296 li_NoffsetArray[i][ioff] = jacLIDVec[Nrow][ioff];
3297 #ifdef Xyce_DEBUG_DEVICE
3298 if (getDeviceOptions().debugLevel > 1)
3300 Xyce::dout() <<
" li_Noffset["<<i<<
"]["<<ioff<<
"] = ";
3301 Xyce::dout() << li_NoffsetArray[i][ioff] << std::endl;
3310 int ProwSize = jacLIDVec[Prow].size();
3311 li_PoffsetArray[i].resize(ProwSize);
3312 for (ioff=0;ioff<ProwSize;++ioff)
3314 li_PoffsetArray[i][ioff] = jacLIDVec[Prow][ioff];
3315 #ifdef Xyce_DEBUG_DEVICE
3316 if (getDeviceOptions().debugLevel > 1)
3318 Xyce::dout() <<
" li_Poffset["<<i<<
"]["<<ioff<<
"] = ";
3319 Xyce::dout() << li_PoffsetArray[i][ioff] << std::endl;