47 #include <Xyce_config.h>
51 #include <N_UTL_Misc.h>
65 #include <N_ERH_ErrorMgr.h>
67 #include <N_LAS_Vector.h>
68 #include <N_LAS_Matrix.h>
70 #include <N_UTL_Expression.h>
71 #include <N_IO_mmio.h>
73 #include <Teuchos_BLAS.hpp>
74 #include <Teuchos_Utils.hpp>
75 #include <Teuchos_LAPACK.hpp>
80 #undef HAVE_INTTYPES_H
83 #include <Trilinos_Util.h>
109 "Resistance per unit length");
114 "Inductance per unit length");
119 "Conductance per unit length");
124 "Capacitance per unit length");
169 Model & TransLineiter,
171 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
172 model_(TransLineiter),
176 numLumpsGiven(false),
178 L(0.0),C(0.0),G(0.0),R(0.0)
229 std::cout <<
"model_.resist = " <<
model_.
resist <<std::endl;
230 std::cout <<
"model_.capac = " <<
model_.
capac <<std::endl;
231 std::cout <<
"model_.induct = " <<
model_.
induct <<std::endl;
233 std::cout <<
"R = " <<
R <<std::endl;
234 std::cout <<
"G = " <<
G <<std::endl;
235 std::cout <<
"C = " <<
C <<std::endl;
236 std::cout <<
"L = " <<
L <<std::endl;
240 std::cout <<
"RLC line" <<std::endl;
244 std::cout <<
"LC line" <<std::endl;
272 for (
int lump=0;lump<
numLumps;++lump)
275 lumpVec[lump].indexV1 = lump*varsPerLump;
276 lumpVec[lump].indexV2 = lump*varsPerLump+1;
277 lumpVec[lump].indexI = lump*varsPerLump+2;
278 lumpVec[lump].indexV3 = (lump+1)*varsPerLump;
285 std::cout <<
"lumps = " << numLumps <<std::endl;
286 for (
int lump=0;lump<
numLumps;++lump)
288 std::cout <<
"lumpVec["<<lump<<
"]: v1 = " <<
lumpVec[lump].indexV1;
289 std::cout <<
" v2 = " <<
lumpVec[lump].indexV2;
290 std::cout <<
" i = " <<
lumpVec[lump].indexI ;
291 std::cout <<
" v3 = " <<
lumpVec[lump].indexV3;
292 std::cout << std::endl;
303 for (
int lump=0;lump<
numLumps;++lump)
312 lumpVec[numLumps-1].indexV3 = 1;
319 std::cout <<
"lumps = " << numLumps <<std::endl;
320 for (
int lump=0;lump<
numLumps;++lump)
322 std::cout <<
"lumpVec["<<lump<<
"]: v1 = " <<
lumpVec[lump].indexV1;
323 std::cout <<
" v2 = " <<
lumpVec[lump].indexV2;
324 std::cout <<
" i = " <<
lumpVec[lump].indexI ;
325 std::cout <<
" v3 = " <<
lumpVec[lump].indexV3;
326 std::cout << std::endl;
337 int n1 =
lumpVec[lump].indexV1;
338 int n2 =
lumpVec[lump].indexV2;
340 int n3 =
lumpVec[lump].indexV3;
364 int n1 =
lumpVec[lump].indexV1;
365 int n2 =
lumpVec[lump].indexV2;
367 int n3 =
lumpVec[lump].indexV3;
391 for (
int lump=1;lump<numLumps-1;++lump)
393 int n1 =
lumpVec[lump].indexV1;
394 int n2 =
lumpVec[lump].indexV2;
396 int n3 =
lumpVec[lump].indexV3;
434 for (
int lump=0;lump<
numLumps;++lump)
437 lumpVec[lump].indexV1 = lump*varsPerLump;
438 lumpVec[lump].indexI = lump*varsPerLump+1;
439 lumpVec[lump].indexV2 = (lump+1)*varsPerLump;
446 std::cout <<
"lumps = " << numLumps <<std::endl;
447 for (
int lump=0;lump<
numLumps;++lump)
449 std::cout <<
"lumpVec["<<lump<<
"]: v1 = " <<
lumpVec[lump].indexV1;
450 std::cout <<
" i = " <<
lumpVec[lump].indexI ;
451 std::cout <<
" v2 = " <<
lumpVec[lump].indexV2;
452 std::cout << std::endl;
463 for (
int lump=0;lump<
numLumps;++lump)
471 lumpVec[numLumps-1].indexV2 = 1;
478 std::cout <<
"lumps = " << numLumps <<std::endl;
479 for (
int lump=0;lump<
numLumps;++lump)
481 std::cout <<
"lumpVec["<<lump<<
"]: v1 = " <<
lumpVec[lump].indexV1;
482 std::cout <<
" i = " <<
lumpVec[lump].indexI ;
483 std::cout <<
" v2 = " <<
lumpVec[lump].indexV2;
484 std::cout << std::endl;
495 int n1 =
lumpVec[lump].indexV1;
496 int n2 =
lumpVec[lump].indexV2;
518 int n1 =
lumpVec[lump].indexV1;
519 int n2 =
lumpVec[lump].indexV2;
538 for (
int lump=1;lump<numLumps-1;++lump)
540 int n1 =
lumpVec[lump].indexV1;
541 int n2 =
lumpVec[lump].indexV2;
561 for (
int i=0; i<size; ++i)
564 for (
int j=0;j<sizeJ;++j)
566 std::cout <<
"jacStamp["<<i<<
"]["<<j<<
"] = " <<
jacStamp[i][j];
567 std::cout << std::endl;
599 const std::vector<int> & extLIDVecRef)
616 lumpVec[0].li_V2 = intLIDVec[lid++];
617 lumpVec[0].li_I = intLIDVec[lid++];
623 lumpVec[i].li_V1 = intLIDVec[lid++];
624 lumpVec[i].li_V2 = intLIDVec[lid++];
625 lumpVec[i].li_I = intLIDVec[lid++];
628 lumpVec[numLumps-1].li_V1 = intLIDVec[lid++];
629 lumpVec[numLumps-1].li_V2 = intLIDVec[lid++];
630 lumpVec[numLumps-1].li_I = intLIDVec[lid++];
632 for (
int i=0;i<numLumps-1;++i)
644 lumpVec[0].li_I = intLIDVec[lid++];
650 lumpVec[i].li_V1 = intLIDVec[lid++];
651 lumpVec[i].li_I = intLIDVec[lid++];
654 lumpVec[numLumps-1].li_V1 = intLIDVec[lid++];
655 lumpVec[numLumps-1].li_I = intLIDVec[lid++];
657 for (
int i=0;i<numLumps-1;++i)
670 std::cout <<
"intLIDVec["<<i<<
"] = " << intLIDVec[i] << std::endl;
677 std::cout <<
"lumpVec["<<i<<
"].li_V1 = " <<
lumpVec[i].li_V1 <<std::endl;
678 std::cout <<
"lumpVec["<<i<<
"].li_V2 = " <<
lumpVec[i].li_V2 <<std::endl;
679 std::cout <<
"lumpVec["<<i<<
"].li_I = " <<
lumpVec[i].li_I <<std::endl;
680 std::cout <<
"lumpVec["<<i<<
"].li_V3 = " <<
lumpVec[i].li_V3 <<std::endl;
687 std::cout <<
"lumpVec["<<i<<
"].li_V1 = " <<
lumpVec[i].li_V1 <<std::endl;
688 std::cout <<
"lumpVec["<<i<<
"].li_I = " <<
lumpVec[i].li_I <<std::endl;
689 std::cout <<
"lumpVec["<<i<<
"].li_V2 = " <<
lumpVec[i].li_V2 <<std::endl;
779 int n1 =
lumpVec[lump].indexV1;
780 int n2 =
lumpVec[lump].indexV2;
782 int n3 =
lumpVec[lump].indexV3;
784 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][0];
786 lumpVec[lump].offset_v2_v2 = jacLIDVec[n2][0];
787 lumpVec[lump].offset_v2_ii = jacLIDVec[n2][1];
788 lumpVec[lump].offset_v2_v3 = jacLIDVec[n2][2];
790 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
791 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][1];
792 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][2];
796 lumpVec[lump].offset_v3_v2 = jacLIDVec[n3][0];
797 lumpVec[lump].offset_v3_v3 = jacLIDVec[n3][1];
804 int n1 =
lumpVec[lump].indexV1;
805 int n2 =
lumpVec[lump].indexV2;
807 int n3 =
lumpVec[lump].indexV3;
809 lumpVec[lump].offset_v1_v2m1 = jacLIDVec[n1][0];
810 lumpVec[lump].offset_v1_v1 = jacLIDVec[n1][1];
811 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][2];
813 lumpVec[lump].offset_v2_v2 = jacLIDVec[n2][0];
814 lumpVec[lump].offset_v2_ii = jacLIDVec[n2][1];
815 lumpVec[lump].offset_v2_v3 = jacLIDVec[n2][2];
817 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
818 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][1];
819 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][2];
821 lumpVec[lump].offset_v3_v2 = jacLIDVec[n3][0];
822 lumpVec[lump].offset_v3_v3 = jacLIDVec[n3][1];
826 for (
int lump=1;lump<
numLumps-1;++lump)
828 int n1 =
lumpVec[lump].indexV1;
829 int n2 =
lumpVec[lump].indexV2;
831 int n3 =
lumpVec[lump].indexV3;
833 lumpVec[lump].offset_v1_v2m1 = jacLIDVec[n1][0];
834 lumpVec[lump].offset_v1_v1 = jacLIDVec[n1][1];
835 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][2];
837 lumpVec[lump].offset_v2_v2 = jacLIDVec[n2][0];
838 lumpVec[lump].offset_v2_ii = jacLIDVec[n2][1];
839 lumpVec[lump].offset_v2_v3 = jacLIDVec[n2][2];
841 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
842 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][1];
843 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][2];
847 for (
int lump=0; lump<numLumps-1; ++lump)
858 int n1 =
lumpVec[lump].indexV1;
859 int n2 =
lumpVec[lump].indexV2;
862 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][0];
864 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
865 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][1];
866 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][2];
870 lumpVec[lump].offset_v2_ii = jacLIDVec[n2][0];
871 lumpVec[lump].offset_v2_v2 = jacLIDVec[n2][1];
878 int n1 =
lumpVec[lump].indexV1;
879 int n2 =
lumpVec[lump].indexV2;
882 lumpVec[lump].offset_v1_iim1 = jacLIDVec[n1][0];
883 lumpVec[lump].offset_v1_v1 = jacLIDVec[n1][1];
884 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][2];
886 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
887 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][1];
888 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][2];
890 lumpVec[lump].offset_v2_ii = jacLIDVec[n2][0];
891 lumpVec[lump].offset_v2_v2 = jacLIDVec[n2][1];
895 for (
int lump=1;lump<
numLumps-1;++lump)
897 int n1 =
lumpVec[lump].indexV1;
898 int n2 =
lumpVec[lump].indexV2;
901 lumpVec[lump].offset_v1_iim1 = jacLIDVec[n1][0];
902 lumpVec[lump].offset_v1_v1 = jacLIDVec[n1][1];
903 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][2];
905 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
906 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][1];
907 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][2];
911 for (
int lump=0; lump<numLumps-1; ++lump)
927 std::cout <<
"lump = " << i <<std::endl;
929 std::cout <<
"offset_v1_v2m1 = " <<
lumpVec[i].offset_v1_v2m1 << std::endl;
930 std::cout <<
"offset_v1_v1 = " <<
lumpVec[i].offset_v1_v1 << std::endl;
931 std::cout <<
"offset_v1_ii = " <<
lumpVec[i].offset_v1_ii << std::endl;
934 std::cout <<
"offset_v2_v2 = " <<
lumpVec[i].offset_v2_v2 << std::endl;
935 std::cout <<
"offset_v2_ii = " <<
lumpVec[i].offset_v2_ii << std::endl;
936 std::cout <<
"offset_v2_v3 = " <<
lumpVec[i].offset_v2_v3 << std::endl;
939 std::cout <<
"offset_ii_v1 = " <<
lumpVec[i].offset_ii_v1 << std::endl;
940 std::cout <<
"offset_ii_v2 = " <<
lumpVec[i].offset_ii_v2 << std::endl;
941 std::cout <<
"offset_ii_ii = " <<
lumpVec[i].offset_ii_ii << std::endl;
943 std::cout <<
"offset_v3_v2 = " <<
lumpVec[i].offset_v3_v2 << std::endl;
944 std::cout <<
"offset_v3_v3 = " <<
lumpVec[i].offset_v3_v3 << std::endl;
951 std::cout <<
"lump = " << i <<std::endl;
953 std::cout <<
"offset_v1_iim1 = " <<
lumpVec[i].offset_v1_iim1 << std::endl;
954 std::cout <<
"offset_v1_v1 = " <<
lumpVec[i].offset_v1_v1 << std::endl;
955 std::cout <<
"offset_v1_ii = " <<
lumpVec[i].offset_v1_ii << std::endl;
957 std::cout <<
"offset_ii_v1 = " <<
lumpVec[i].offset_ii_v1 << std::endl;
958 std::cout <<
"offset_ii_ii = " <<
lumpVec[i].offset_ii_ii << std::endl;
959 std::cout <<
"offset_ii_v2 = " <<
lumpVec[i].offset_ii_v2 << std::endl;
961 std::cout <<
"offset_v2_ii = " <<
lumpVec[i].offset_v2_ii << std::endl;
962 std::cout <<
"offset_v2_v2 = " <<
lumpVec[i].offset_v2_v2 << std::endl;
980 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1000 double current = solVec[
lumpVec[i].li_I];
1001 double v_pos = solVec[lumpVec[i].li_V1];
1002 double v_neg = solVec[lumpVec[i].li_V2];
1003 double vind = v_pos-v_neg;
1004 lumpVec[i].i0_ind = current;
1005 lumpVec[i].f0_ind =
L*current;
1006 lumpVec[i].coef_ind = -vind;
1009 v_pos = solVec[lumpVec[i].li_V2];
1010 v_neg = solVec[lumpVec[i].li_V3];
1011 lumpVec[i].i0_res = (v_pos-v_neg)*
G;
1014 double vcap = solVec[lumpVec[i].li_V3];
1015 lumpVec[i].q0_cap =
C*vcap;
1023 double current = solVec[
lumpVec[i].li_I];
1024 double v_pos = solVec[lumpVec[i].li_V1];
1025 double v_neg = solVec[lumpVec[i].li_V2];
1026 double vind = v_pos-v_neg;
1027 lumpVec[i].i0_ind = current;
1028 lumpVec[i].f0_ind =
L*current;
1029 lumpVec[i].coef_ind = -vind;
1032 double vcap = solVec[lumpVec[i].li_V2];
1033 lumpVec[i].q0_cap =
C*vcap;
1095 qVec[
lumpVec[i].li_I] += lumpVec[i].f0_ind;
1096 qVec[lumpVec[i].li_V3] += lumpVec[i].q0_cap;
1103 qVec[
lumpVec[i].li_I] += lumpVec[i].f0_ind;
1104 qVec[lumpVec[i].li_V2] += lumpVec[i].q0_cap;
1131 fVec[
lumpVec[i].li_V1] += lumpVec[i].i0_ind;
1132 fVec[lumpVec[i].li_V2] += -lumpVec[i].i0_ind;
1133 fVec[lumpVec[i].li_I ] += lumpVec[i].coef_ind;
1136 fVec[lumpVec[i].li_V2] += lumpVec[i].i0_res;
1137 fVec[lumpVec[i].li_V3] -= lumpVec[i].i0_res;
1145 fVec[
lumpVec[i].li_V1] += lumpVec[i].i0_ind;
1146 fVec[lumpVec[i].li_V2] += -lumpVec[i].i0_ind;
1147 fVec[lumpVec[i].li_I ] += lumpVec[i].coef_ind;
1180 dQdx[lumpVec[i].li_V3][lumpVec[i].offset_v3_v3] +=
C;
1191 dQdx[lumpVec[i].li_V2][lumpVec[i].offset_v2_v2] +=
C;
1220 dFdx[lumpVec[i].li_V2][lumpVec[i].offset_v2_ii] -= 1.0;
1221 dFdx[lumpVec[i].li_I ][lumpVec[i].offset_ii_v1] -= 1.0;
1222 dFdx[lumpVec[i].li_I ][lumpVec[i].offset_ii_v2] += 1.0;
1225 dFdx[lumpVec[i].li_V2][lumpVec[i].offset_v2_v2] +=
G;
1226 dFdx[lumpVec[i].li_V2][lumpVec[i].offset_v2_v3] -=
G;
1227 dFdx[lumpVec[i].li_V3][lumpVec[i].offset_v3_v2] -=
G;
1228 dFdx[lumpVec[i].li_V3][lumpVec[i].offset_v3_v3] +=
G;
1237 dFdx[lumpVec[i].li_V2][lumpVec[i].offset_v2_ii] -= 1.0;
1238 dFdx[lumpVec[i].li_I ][lumpVec[i].offset_ii_v1] -= 1.0;
1239 dFdx[lumpVec[i].li_I ][lumpVec[i].offset_ii_v2] += 1.0;
1284 std::vector<Instance*>::iterator iter;
1288 for (iter=first; iter!=last; ++iter)
1290 (*iter)->processParams();
1309 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
1316 elevNumberGiven(false),
1319 conductGiven(false),
1348 std::vector<Instance*>::iterator iter;
1352 for (iter=first; iter!=last; ++iter)
1370 std::vector<Instance*>::const_iterator iter;
1378 os <<
"Number of TransLine instances: " << isize << std::endl;
1379 os <<
" name\t\tmodelName\tParameters" << std::endl;
1381 for (i = 0, iter = first; iter != last; ++iter, ++i)
1383 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1409 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1424 .registerDevice(
"transline", 1)
1425 .registerModelType(
"transline", 1);