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;
726 std::string tmpstr1, tmpstr2, tmpstr3;
733 tmpstr1 =
getName()+
"_v1_lump"+Teuchos::Utils::toString(i);
734 tmpstr2 =
getName()+
"_v2_lump"+Teuchos::Utils::toString(i);
735 tmpstr3 =
getName()+
"_I__lump"+Teuchos::Utils::toString(i);
746 tmpstr1 =
getName()+
"_v1_lump"+Teuchos::Utils::toString(i);
747 tmpstr3 =
getName()+
"_I__lump"+Teuchos::Utils::toString(i);
792 int n1 =
lumpVec[lump].indexV1;
793 int n2 =
lumpVec[lump].indexV2;
795 int n3 =
lumpVec[lump].indexV3;
797 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][0];
799 lumpVec[lump].offset_v2_v2 = jacLIDVec[n2][0];
800 lumpVec[lump].offset_v2_ii = jacLIDVec[n2][1];
801 lumpVec[lump].offset_v2_v3 = jacLIDVec[n2][2];
803 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
804 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][1];
805 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][2];
809 lumpVec[lump].offset_v3_v2 = jacLIDVec[n3][0];
810 lumpVec[lump].offset_v3_v3 = jacLIDVec[n3][1];
817 int n1 =
lumpVec[lump].indexV1;
818 int n2 =
lumpVec[lump].indexV2;
820 int n3 =
lumpVec[lump].indexV3;
822 lumpVec[lump].offset_v1_v2m1 = jacLIDVec[n1][0];
823 lumpVec[lump].offset_v1_v1 = jacLIDVec[n1][1];
824 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][2];
826 lumpVec[lump].offset_v2_v2 = jacLIDVec[n2][0];
827 lumpVec[lump].offset_v2_ii = jacLIDVec[n2][1];
828 lumpVec[lump].offset_v2_v3 = jacLIDVec[n2][2];
830 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
831 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][1];
832 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][2];
834 lumpVec[lump].offset_v3_v2 = jacLIDVec[n3][0];
835 lumpVec[lump].offset_v3_v3 = jacLIDVec[n3][1];
839 for (
int lump=1;lump<
numLumps-1;++lump)
841 int n1 =
lumpVec[lump].indexV1;
842 int n2 =
lumpVec[lump].indexV2;
844 int n3 =
lumpVec[lump].indexV3;
846 lumpVec[lump].offset_v1_v2m1 = jacLIDVec[n1][0];
847 lumpVec[lump].offset_v1_v1 = jacLIDVec[n1][1];
848 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][2];
850 lumpVec[lump].offset_v2_v2 = jacLIDVec[n2][0];
851 lumpVec[lump].offset_v2_ii = jacLIDVec[n2][1];
852 lumpVec[lump].offset_v2_v3 = jacLIDVec[n2][2];
854 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
855 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][1];
856 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][2];
860 for (
int lump=0; lump<numLumps-1; ++lump)
871 int n1 =
lumpVec[lump].indexV1;
872 int n2 =
lumpVec[lump].indexV2;
875 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][0];
877 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
878 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][1];
879 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][2];
883 lumpVec[lump].offset_v2_ii = jacLIDVec[n2][0];
884 lumpVec[lump].offset_v2_v2 = jacLIDVec[n2][1];
891 int n1 =
lumpVec[lump].indexV1;
892 int n2 =
lumpVec[lump].indexV2;
895 lumpVec[lump].offset_v1_iim1 = jacLIDVec[n1][0];
896 lumpVec[lump].offset_v1_v1 = jacLIDVec[n1][1];
897 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][2];
899 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
900 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][1];
901 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][2];
903 lumpVec[lump].offset_v2_ii = jacLIDVec[n2][0];
904 lumpVec[lump].offset_v2_v2 = jacLIDVec[n2][1];
908 for (
int lump=1;lump<
numLumps-1;++lump)
910 int n1 =
lumpVec[lump].indexV1;
911 int n2 =
lumpVec[lump].indexV2;
914 lumpVec[lump].offset_v1_iim1 = jacLIDVec[n1][0];
915 lumpVec[lump].offset_v1_v1 = jacLIDVec[n1][1];
916 lumpVec[lump].offset_v1_ii = jacLIDVec[n1][2];
918 lumpVec[lump].offset_ii_v1 = jacLIDVec[ii][0];
919 lumpVec[lump].offset_ii_ii = jacLIDVec[ii][1];
920 lumpVec[lump].offset_ii_v2 = jacLIDVec[ii][2];
924 for (
int lump=0; lump<numLumps-1; ++lump)
940 std::cout <<
"lump = " << i <<std::endl;
942 std::cout <<
"offset_v1_v2m1 = " <<
lumpVec[i].offset_v1_v2m1 << std::endl;
943 std::cout <<
"offset_v1_v1 = " <<
lumpVec[i].offset_v1_v1 << std::endl;
944 std::cout <<
"offset_v1_ii = " <<
lumpVec[i].offset_v1_ii << std::endl;
947 std::cout <<
"offset_v2_v2 = " <<
lumpVec[i].offset_v2_v2 << std::endl;
948 std::cout <<
"offset_v2_ii = " <<
lumpVec[i].offset_v2_ii << std::endl;
949 std::cout <<
"offset_v2_v3 = " <<
lumpVec[i].offset_v2_v3 << std::endl;
952 std::cout <<
"offset_ii_v1 = " <<
lumpVec[i].offset_ii_v1 << std::endl;
953 std::cout <<
"offset_ii_v2 = " <<
lumpVec[i].offset_ii_v2 << std::endl;
954 std::cout <<
"offset_ii_ii = " <<
lumpVec[i].offset_ii_ii << std::endl;
956 std::cout <<
"offset_v3_v2 = " <<
lumpVec[i].offset_v3_v2 << std::endl;
957 std::cout <<
"offset_v3_v3 = " <<
lumpVec[i].offset_v3_v3 << std::endl;
964 std::cout <<
"lump = " << i <<std::endl;
966 std::cout <<
"offset_v1_iim1 = " <<
lumpVec[i].offset_v1_iim1 << std::endl;
967 std::cout <<
"offset_v1_v1 = " <<
lumpVec[i].offset_v1_v1 << std::endl;
968 std::cout <<
"offset_v1_ii = " <<
lumpVec[i].offset_v1_ii << std::endl;
970 std::cout <<
"offset_ii_v1 = " <<
lumpVec[i].offset_ii_v1 << std::endl;
971 std::cout <<
"offset_ii_ii = " <<
lumpVec[i].offset_ii_ii << std::endl;
972 std::cout <<
"offset_ii_v2 = " <<
lumpVec[i].offset_ii_v2 << std::endl;
974 std::cout <<
"offset_v2_ii = " <<
lumpVec[i].offset_v2_ii << std::endl;
975 std::cout <<
"offset_v2_v2 = " <<
lumpVec[i].offset_v2_v2 << std::endl;
993 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1013 double current = solVec[
lumpVec[i].li_I];
1014 double v_pos = solVec[lumpVec[i].li_V1];
1015 double v_neg = solVec[lumpVec[i].li_V2];
1016 double vind = v_pos-v_neg;
1017 lumpVec[i].i0_ind = current;
1018 lumpVec[i].f0_ind =
L*current;
1019 lumpVec[i].coef_ind = -vind;
1022 v_pos = solVec[lumpVec[i].li_V2];
1023 v_neg = solVec[lumpVec[i].li_V3];
1024 lumpVec[i].i0_res = (v_pos-v_neg)*
G;
1027 double vcap = solVec[lumpVec[i].li_V3];
1028 lumpVec[i].q0_cap =
C*vcap;
1036 double current = solVec[
lumpVec[i].li_I];
1037 double v_pos = solVec[lumpVec[i].li_V1];
1038 double v_neg = solVec[lumpVec[i].li_V2];
1039 double vind = v_pos-v_neg;
1040 lumpVec[i].i0_ind = current;
1041 lumpVec[i].f0_ind =
L*current;
1042 lumpVec[i].coef_ind = -vind;
1045 double vcap = solVec[lumpVec[i].li_V2];
1046 lumpVec[i].q0_cap =
C*vcap;
1108 qVec[
lumpVec[i].li_I] += lumpVec[i].f0_ind;
1109 qVec[lumpVec[i].li_V3] += lumpVec[i].q0_cap;
1116 qVec[
lumpVec[i].li_I] += lumpVec[i].f0_ind;
1117 qVec[lumpVec[i].li_V2] += lumpVec[i].q0_cap;
1144 fVec[
lumpVec[i].li_V1] += lumpVec[i].i0_ind;
1145 fVec[lumpVec[i].li_V2] += -lumpVec[i].i0_ind;
1146 fVec[lumpVec[i].li_I ] += lumpVec[i].coef_ind;
1149 fVec[lumpVec[i].li_V2] += lumpVec[i].i0_res;
1150 fVec[lumpVec[i].li_V3] -= lumpVec[i].i0_res;
1158 fVec[
lumpVec[i].li_V1] += lumpVec[i].i0_ind;
1159 fVec[lumpVec[i].li_V2] += -lumpVec[i].i0_ind;
1160 fVec[lumpVec[i].li_I ] += lumpVec[i].coef_ind;
1193 dQdx[lumpVec[i].li_V3][lumpVec[i].offset_v3_v3] +=
C;
1204 dQdx[lumpVec[i].li_V2][lumpVec[i].offset_v2_v2] +=
C;
1233 dFdx[lumpVec[i].li_V2][lumpVec[i].offset_v2_ii] -= 1.0;
1234 dFdx[lumpVec[i].li_I ][lumpVec[i].offset_ii_v1] -= 1.0;
1235 dFdx[lumpVec[i].li_I ][lumpVec[i].offset_ii_v2] += 1.0;
1238 dFdx[lumpVec[i].li_V2][lumpVec[i].offset_v2_v2] +=
G;
1239 dFdx[lumpVec[i].li_V2][lumpVec[i].offset_v2_v3] -=
G;
1240 dFdx[lumpVec[i].li_V3][lumpVec[i].offset_v3_v2] -=
G;
1241 dFdx[lumpVec[i].li_V3][lumpVec[i].offset_v3_v3] +=
G;
1250 dFdx[lumpVec[i].li_V2][lumpVec[i].offset_v2_ii] -= 1.0;
1251 dFdx[lumpVec[i].li_I ][lumpVec[i].offset_ii_v1] -= 1.0;
1252 dFdx[lumpVec[i].li_I ][lumpVec[i].offset_ii_v2] += 1.0;
1297 std::vector<Instance*>::iterator iter;
1301 for (iter=first; iter!=last; ++iter)
1303 (*iter)->processParams();
1322 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
1329 elevNumberGiven(false),
1332 conductGiven(false),
1361 std::vector<Instance*>::iterator iter;
1365 for (iter=first; iter!=last; ++iter)
1383 std::vector<Instance*>::const_iterator iter;
1391 os <<
"Number of TransLine instances: " << isize << std::endl;
1392 os <<
" name\t\tmodelName\tParameters" << std::endl;
1394 for (i = 0, iter = first; iter != last; ++iter, ++i)
1396 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1422 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1437 .registerDevice(
"transline", 1)
1438 .registerModelType(
"transline", 1);