39 #include <Xyce_config.h>
51 #include <N_IO_CmdParse.h>
52 #include <N_LAS_BlockMatrix.h>
53 #include <N_LAS_BlockSystemHelpers.h>
54 #include <N_LAS_BlockVector.h>
55 #include <N_LAS_MOROperators.h>
56 #include <N_LAS_Matrix.h>
57 #include <N_LAS_MultiVector.h>
58 #include <N_LAS_System.h>
59 #include <N_LOA_Loader.h>
61 #include <N_PDS_Comm.h>
62 #include <N_PDS_ParMap.h>
66 #include <N_TOP_Topology.h>
67 #include <N_UTL_Misc.h>
68 #include <N_UTL_Timer.h>
70 #ifdef Xyce_PARALLEL_MPI
71 #include <N_PDS_ParComm.h>
74 #include <N_PDS_SerialComm.h>
79 #include <Epetra_CrsMatrix.h>
80 #include <Epetra_Operator.h>
81 #include <Epetra_CrsGraph.h>
82 #include <Epetra_MultiVector.h>
83 #include <Epetra_LinearProblem.h>
87 #include <BelosLinearProblem.hpp>
88 #include <BelosBlockGmresIter.hpp>
89 #include <BelosDGKSOrthoManager.hpp>
90 #include <BelosStatusTestMaxIters.hpp>
91 #include <BelosOutputManager.hpp>
92 #include <BelosEpetraAdapter.hpp>
95 #include <Teuchos_SerialDenseMatrix.hpp>
96 #include <Teuchos_ScalarTraits.hpp>
97 #include <Teuchos_LAPACK.hpp>
98 #include <Teuchos_BLAS.hpp>
144 Util::ParameterList::const_iterator it_tp;
145 Util::ParameterList::const_iterator first = paramsBlock.getParams().begin();
146 Util::ParameterList::const_iterator last = paramsBlock.getParams().end();
147 for (it_tp = first; it_tp != last; ++it_tp)
149 if (it_tp->uTag() ==
"SIZE")
153 else if (it_tp->uTag() ==
"PORTLIST")
155 portList_ = it_tp->getValue<std::vector<std::string> >();
160 #ifdef Xyce_DEBUG_ANALYSIS
164 << section_divider << std::endl
165 <<
" MOR simulation parameters" << std::endl
183 bool bsuccess =
true;
185 bsuccess = bsuccess &
init();
208 bsuccess = bsuccess &
finish();
224 bool bsuccess =
true;
274 Report::UserError() <<
"Solving for DC operating point failed, cannot continue MOR analysis";
279 std::vector<int> tempVec;
283 int hsize = tempVec.size();
284 N_PDS_Comm * pdsComm = (
linearSystem_.getPDSManager())->getPDSComm();
285 pdsComm->sumAll( &hsize, &
numPorts_, 1 );
290 Report::UserError() <<
"Number of specified ports in .MOR line is inconsistent with number of voltage sources";
296 std::vector<int> gidPosEntries( hsize );
297 for (
int i=0; i<hsize; ++i)
299 std::list<int> svGIDList1, dummyList;
304 gidPosEntries[i] = svGIDList1.front();
310 RCP<N_PDS_ParMap> BaseMap_ = rcp(pdsMgrPtr_.getParallelMap(
"SOLUTION" ),
false);
314 for (
int i=0; i<hsize; ++i)
316 int gid = gidPosEntries[i];
318 for (
int j=0; j<hsize; ++j)
329 Report::UserError() <<
"Did not find voltage source corresponding to port";
407 int length=1, numEntries=0;
408 std::vector<int> colIndices(length);
409 std::vector<double> coeffs(length);
415 if ( numEntries != 1 )
417 Report::UserError0() <<
"Supposed voltage source row has too many entries, cannot continue MOR analysis";
422 GPtr_->getLocalRowCopy(
bMatEntriesVec_[i], length, numEntries, &coeffs[0], &colIndices[0]);
425 if ( coeffs[0] > 0.0 )
428 GPtr_->putLocalRow(
bMatEntriesVec_[i], length, &coeffs[0], &colIndices[0]);
453 bool bsuccess =
true;
458 N_PDS_ParMap &BaseMap_ = *pdsMgrPtr_.getParallelMap(
"SOLUTION" );
474 RPtr_->putScalar( 0.0 );
491 Amesos amesosFactory;
496 int linearStatus =
origSolver_->SymbolicFactorization();
497 if (linearStatus != 0)
499 Xyce::dout() <<
"Amesos symbolic factorization exited with error: " << linearStatus << std::endl;
504 linearStatus =
origSolver_->NumericFactorization();
505 if (linearStatus != 0)
507 Xyce::dout() <<
"Amesos numeric factorization exited with error: " << linearStatus << std::endl;
513 if (linearStatus != 0)
515 Xyce::dout() <<
"Amesos solve exited with error: " << linearStatus << std::endl;
523 RCP<Epetra_Operator> COpPtr_ = rcp( &
CPtr_->epetraObj(), false );
524 RCP<N_LAS_AmesosGenOp> AOp = rcp(
new N_LAS_AmesosGenOp(
origSolver_, COpPtr_ ) );
532 UserWarning(*
this) <<
"Requested reduced-order model dimension is larger than original system dimension, resizing to original system dimension";
543 redB_.shape(k, numPorts_);
544 redL_.shape(k, numPorts_);
553 typedef Epetra_MultiVector MV;
554 typedef Epetra_Operator OP;
555 typedef Belos::MultiVecTraits<ST,MV> MVT;
558 Belos::OutputManager<ST> printer;
561 Belos::StatusTestMaxIters<ST, MV, OP> maxIterTest( kblock );
564 Belos::DGKSOrthoManager<ST, MV, OP> orthoMgr;
568 N_LAS_MultiVector temp( BaseMap_, numPorts_ );
569 Belos::LinearProblem<ST, MV, OP > problem( AOp,
570 rcp( &temp.epetraObj(), false ),
571 rcp( &
RPtr_->epetraObj(), false ));
572 problem.setProblem();
575 Teuchos::ParameterList params;
576 params.set(
"Num Blocks", kblock);
577 params.set(
"Block Size", numPorts_ );
580 Belos::BlockGmresIter<ST, MV, OP> krylovIter( rcp( &problem,
false ),
581 rcp( &printer,
false ),
582 rcp( &maxIterTest,
false ),
583 rcp( &orthoMgr,
false ),
587 RCP<Teuchos::SerialDenseMatrix<int,ST> > z
588 = rcp(
new Teuchos::SerialDenseMatrix<int,ST>( numPorts_, numPorts_ ) );
591 RCP<MV> V = rcp(
new Epetra_MultiVector(
RPtr_->epetraObj() ) );
592 orthoMgr.normalize( *V, z );
595 Belos::GmresIterationState<ST,MV> initState;
598 initState.curDim = 0;
599 krylovIter.initializeGmres(initState);
603 krylovIter.iterate();
605 catch (
const Belos::GmresIterationOrthoFailure &e) {
608 catch (
const std::exception &e) {
613 Belos::GmresIterationState<ST,MV> newState = krylovIter.getState();
616 std::vector<int> indices( k );
617 for (
int i=0; i<k; ++i) { indices[i] = i; }
618 V = rcp(
new Epetra_MultiVector( View, *newState.V, &indices[0], k ) );
620 RCP<MV>
W = rcp(
new Epetra_MultiVector( V->Map(), k ) );
633 N_LAS_MultiVector xyceV( &*V,
false );
634 N_LAS_MultiVector temp2( BaseMap_, k );
637 GPtr_->matvec(
false, xyceV, temp2 );
639 MVT::MvTransMv( 1.0, xyceV.epetraObj(), temp2.epetraObj(),
redG_ );
643 CPtr_->matvec(
false, xyceV, temp2 );
645 MVT::MvTransMv( 1.0, xyceV.epetraObj(), temp2.epetraObj(),
redC_ );
649 MVT::MvTransMv( 1.0, xyceV.epetraObj(),
BPtr_->epetraObj(),
redB_ );
660 Teuchos::SerialDenseMatrix<int,ST> Xhatscale( k, 1 );
664 if ( scaleType == 1 )
666 for (
int i=0; i<k; ++i)
677 if ( scaleType == 2 || scaleType == 3 || scaleType ==4)
679 Epetra_MultiVector Xmag( V->Map(), 1 );
681 if ( scaleType == 2 )
687 MVT::MvTransMv( 1.0, *V, Xmag, Xhatscale );
690 for (
int i=0; i<k; ++i)
693 if ( scaleType == 2 )
705 if ( scaleType == 3 )
708 if ( scaleType == 4 )
710 if ( fabs(Xhatscale( i, 0 )) > 1.0 )
727 Teuchos::SerialDenseMatrix<int,ST> D(k,k);
728 if ( scaleType != 0 )
730 RCP<MV> Vtemp = rcp(
new Epetra_MultiVector( V->Map(), k ) );
732 for (
int i=0; i<k; ++i)
734 if (Xhatscale( i, 0 ) != 0.0)
735 D(i,i) = 1.0/Xhatscale( i, 0 );
739 Xyce::dout() <<
" the scaling matrix " << std::endl;
743 MVT::MvTimesMatAddMv( 1.0, *V, D, 0.0, *Vtemp );
756 N_LAS_MultiVector xyceV( &*V,
false );
757 N_LAS_MultiVector xyceW( &*W,
false );
758 N_LAS_MultiVector temp2( BaseMap_, k );
763 GPtr_->matvec(
false, xyceV, temp2 );
765 MVT::MvTransMv( 1.0, xyceW.epetraObj(), temp2.epetraObj(),
redG_ );
769 CPtr_->matvec(
false, xyceV, temp2 );
771 MVT::MvTransMv( 1.0, xyceW.epetraObj(), temp2.epetraObj(),
redC_ );
774 MVT::MvTransMv( 1.0, xyceW.epetraObj(),
BPtr_->epetraObj(),
redB_ );
776 MVT::MvTransMv( 1.0, xyceV.epetraObj(),
BPtr_->epetraObj(),
redL_ );
780 if ( scaleType <= 1 )
789 Report::UserError0() <<
"MOR options sparsificationType=1 can only be used with scaletype=1, other scale types have not been supported for sparsification";
808 Report::UserError0() <<
"Belos is necessary to compute a reduced-order model, please recompile Xyce with Belos enabled";
826 bool bsuccess =
true;
833 bool stepAttemptStatus;
835 while (currentStep < finalStep)
845 if (stepAttemptStatus)
869 bool bsuccess =
true;
876 bool stepAttemptStatus;
878 while (currentStep < finalStep)
888 if (stepAttemptStatus)
911 bool bsuccess =
true;
915 N_PDS_ParMap &BaseMap_ = *pdsMgrPtr_.getParallelMap(
"SOLUTION");
916 N_PDS_ParMap &oBaseMap_ = *pdsMgrPtr_.getParallelMap(
"SOLUTION_OVERLAP_GND");
917 Epetra_CrsGraph &BaseFullGraph_ = *pdsMgrPtr_.getMatrixGraph(
"JACOBIAN");
921 std::vector<RCP<N_PDS_ParMap> > blockMaps = createBlockParMaps(numBlocks, BaseMap_, oBaseMap_);
924 REFBPtr_ = rcp (
new N_LAS_BlockVector ( numBlocks, blockMaps[0], rcp(&BaseMap_,
false) ) );
926 std::vector<std::vector<int> > blockPattern(2);
927 blockPattern[0].resize(2);
928 blockPattern[0][0] = 0; blockPattern[0][1] = 1;
929 blockPattern[1].resize(2);
930 blockPattern[1][0] = 0; blockPattern[1][1] = 1;
932 int MaxGID = BaseMap_.maxGlobalEntity();
934 while ( offset <= MaxGID ) offset *= 10;
936 RCP<Epetra_CrsGraph> blockGraph = createBlockGraph( offset, blockPattern, *blockMaps[0], BaseFullGraph_);
938 sCpG_REFMatrixPtr_ = rcp (
new N_LAS_BlockMatrix( numBlocks, offset, blockPattern, *blockGraph, BaseFullGraph_) );
956 Amesos amesosFactory;
958 REFXPtr_ = rcp (
new N_LAS_BlockVector ( numBlocks, blockMaps[0], rcp(&BaseMap_,
false) ) );
965 int linearStatus =
blockSolver_->SymbolicFactorization();
967 if (linearStatus != 0)
969 Xyce::dout() <<
"Amesos symbolic factorization exited with error: " << linearStatus;
988 int k =
redG_.numRows();
997 Teuchos::SerialDenseMatrix<int, double> subMtx( Teuchos::View,
sCpG_tmpMatrix_, k, k, 0, 0 );
998 subMtx.assign(
redC_ );
999 subMtx.scale( -
s0_ );
1003 Teuchos::SerialDenseMatrix<int, double> subMtx2( Teuchos::View,
sCpG_tmpMatrix_, k, k, k, k );
1004 subMtx2.assign(
redC_ );
1005 subMtx2.scale( -
s0_ );
1046 int k =
redG_.numRows();
1054 Teuchos::SerialDenseMatrix<int, double> subMtx( Teuchos::View,
sCpG_redMatrix_, k, k, 0, k );
1055 subMtx.assign(
redC_ );
1056 subMtx.scale( -omega );
1058 Teuchos::SerialDenseMatrix<int, double> subMtx2( Teuchos::View,
sCpG_redMatrix_, k, k, k, 0 );
1059 subMtx2.assign(
redC_ );
1060 subMtx2.scale( omega );
1077 bool bsuccess =
true;
1080 int linearStatus =
blockSolver_->NumericFactorization();
1082 if (linearStatus != 0)
1084 Xyce::dout() <<
"Amesos numeric factorization exited with error: " << linearStatus;
1095 if (linearStatus != 0)
1097 Xyce::dout() <<
"Amesos solve exited with error: " << linearStatus;
1125 bool bsuccess =
true;
1127 int k =
redG_.numRows();
1129 Teuchos::LAPACK<int, double> lapack;
1132 Teuchos::SerialDenseMatrix<int, double> tmpRedB( Teuchos::View,
ref_redB_,
redB_.numRows(),
redB_.numCols(), 0, 0 );
1133 tmpRedB.assign(
redB_ );
1142 Xyce::dout() <<
"LAPACK::GETRF: LU factorization failed with error: " << info << std::endl;
1147 const char trans =
'N';
1152 Xyce::dout() <<
"LAPACK::GETRS: LU solve failed with error: " << info << std::endl;
1156 Teuchos::SerialDenseMatrix<int, double> tmpRedImag( numPorts, numPorts ), tmpRedReal( numPorts, numPorts );
1159 tmpRedReal.multiply( Teuchos::TRANS, Teuchos::NO_TRANS, 1.0,
redB_, tmpRedB, 0.0 );
1162 Teuchos::SerialDenseMatrix<int, double> tmpRedB2( Teuchos::View,
ref_redB_,
redB_.numRows(),
redB_.numCols(), k, 0 );
1163 tmpRedImag.multiply( Teuchos::TRANS, Teuchos::NO_TRANS, 1.0,
redB_, tmpRedB2, 0.0 );
1170 redH_(i,j) = std::complex<double>(tmpRedReal(i,j), tmpRedImag(i,j));
1187 bool bsuccess =
true;
1189 int k =
redB_.numRows();
1192 Teuchos::SerialDenseMatrix<int, double> R(
redB_);
1193 Teuchos::SerialDenseMatrix<int, double> A(
redC_);
1196 Teuchos::LAPACK<int, double> lapack;
1197 Teuchos::SerialDenseMatrix<int, double> tmp_Ghat(
redG_ );
1200 std::vector<int> ipiv( tmp_Ghat.numRows() );
1201 lapack.GETRF( tmp_Ghat.numRows(), tmp_Ghat.numCols(), tmp_Ghat.values(),
1202 tmp_Ghat.stride(), &ipiv[0], &
info );
1205 Xyce::dout() <<
"LAPACK::GETRF: LU factorization of Ghat failed with error: " << info << std::endl;
1210 const char norm =
'1';
1211 double condGhat = 0.0;
1212 std::vector<double> condWork( 4*k );
1213 std::vector<int> condIWork( k );
1214 lapack.GECON( norm, tmp_Ghat.numRows(), tmp_Ghat.values(), tmp_Ghat.stride(), tmp_Ghat.normOne(), &condGhat, &condWork[0], &condIWork[0], &
info );
1218 Xyce::dout() <<
"LAPACK::GECON: Computing condition estimate of Ghat failed with error: " << info << std::endl;
1223 const char trans =
'N';
1224 lapack.GETRS( trans, tmp_Ghat.numRows(), A.numCols(), tmp_Ghat.values(),
1225 tmp_Ghat.stride(), &ipiv[0], A.values(), A.stride(), &
info );
1228 Xyce::dout() <<
"LAPACK::GETRS: LU solve failed with error: " << info << std::endl;
1235 lapack.GETRS( trans, tmp_Ghat.numRows(), R.numCols(), tmp_Ghat.values(),
1236 tmp_Ghat.stride(), &ipiv[0], R.values(), R.stride(), &
info );
1239 Xyce::dout() <<
"LAPACK::GETRS: LU solve failed with error: " << info << std::endl;
1252 std::vector<double> work( lwork );
1253 std::vector<double> revals( k );
1254 std::vector<double> ievals( k );
1255 Teuchos::SerialDenseMatrix<int, double> Q(k, k);
1260 std::vector<double> beta( k );
1261 Teuchos::SerialDenseMatrix<int, double> tmpB( k, k );
1262 for (
int i=0; i<k; i++)
1264 lapack.GGEV(
'N',
'V', k, A.values(), A.stride(), tmpB.values(), tmpB.stride(),
1265 &revals[0], &ievals[0], &beta[0], &vl[0], ldvl, Q.values(), Q.stride(),
1266 &work[0], lwork, &
info );
1269 Xyce::dout() <<
"LAPACK::GGEV: Computing eigenvectors and values of A = inv(Ghat)*Chat failed with error: " << info << std::endl;
1275 Teuchos::BLAS<int, double> blas;
1276 std::vector<int> rowIndex( k );
1280 if ( ievals[i] != 0.0 )
1286 double norm_r = blas.NRM2( k, Q[i], 1 );
1287 double norm_i = blas.NRM2( k, Q[i+1], 1 );
1288 double norm = lapack.LAPY2( norm_r, norm_i );
1291 for (
int j=0; j<k; j++)
1303 double norm = blas.NRM2( k, Q[i], 1 );
1306 for (
int j=0; j<k; j++)
1322 Teuchos::SerialDenseMatrix<int, std::complex<double> > V(k, k);
1323 for (
int i=0; i<k; i++)
1325 if (rowIndex[i] == 1)
1327 for (
int j=0; j<k; j++)
1330 V(j,i) = std::complex<double>( Q(j,i), Q(j,i+1) );
1331 V(j,i+1) = std::complex<double>( Q(j,i), -Q(j,i+1) );
1337 for (
int j=0; j<k; j++)
1339 V(j,i) = std::complex<double>( Q(j,i), 0.0 );
1345 Teuchos::LAPACK<int, std::complex<double> > lapack_complex;
1346 lapack_complex.GETRF( V.numRows(), V.numCols(), V.values(), V.stride(), &ipiv[0], &
info );
1349 Xyce::dout() <<
"LAPACK::GETRF: LU factorization of eigenvectors failed with error: " << info << std::endl;
1355 std::vector<std::complex<double> > condCWork( 2*k );
1356 lapack_complex.GECON( norm, V.numRows(), V.values(), V.stride(), V.normOne(), &condV, &condCWork[0], &condWork[0], &
info );
1360 Xyce::dout() <<
"LAPACK::GECON: Computing condition estimate of V failed with error: " << info << std::endl;
1365 std::vector<std::complex<double> > cwork( lwork );
1366 lapack_complex.GETRI( V.numRows(), V.values(), V.stride(), &ipiv[0], &cwork[0], lwork, &
info );
1369 Xyce::dout() <<
"LAPACK::GETRI: Computing inverse of V failed with error: " << info << std::endl;
1374 Teuchos::SerialDenseMatrix<int, std::complex<double> > tmpR( k,
numPorts_ );
1376 for (
int i=0; i<k; i++)
1377 tmpR(i,j) = std::complex<double>( R(i,j), 0.0 );
1380 Teuchos::SerialDenseMatrix<int, std::complex<double> > tmp_redB(k ,numPorts_);
1381 tmp_redB.multiply(Teuchos::NO_TRANS, Teuchos::NO_TRANS, 1.0, V, tmpR, 0.0);
1385 Teuchos::SerialDenseMatrix<int, double> invV(k, k);
1386 for (
int i=0; i<k; i++)
1388 if (rowIndex[i] == 1)
1390 for (
int j=0; j<k; j++)
1392 invV(i, j) = V(i,j).real();
1393 invV(i+1, j) = V(i,j).imag();
1397 redB_(i, j) = tmp_redB(i, j).real();
1398 redB_(i+1, j) = tmp_redB(i, j).imag();
1404 for (
int j=0; j<k; j++)
1405 invV(i, j) = V(i,j).real();
1407 redB_(i, j) = tmp_redB(i, j).real();
1412 lapack.GETRF( invV.numRows(), invV.numCols(), invV.values(), invV.stride(), &ipiv[0], &
info );
1415 Xyce::dout() <<
"LAPACK::GETRF: LU factorization of inv(V) failed with error: " << info << std::endl;
1420 const char trans2 =
'T';
1421 lapack.GETRS( trans2, invV.numRows(),
redL_.numCols(), invV.values(),
1422 invV.stride(), &ipiv[0],
redL_.values(),
redL_.stride(), &
info );
1425 Xyce::dout() <<
"LAPACK::GETRS: LU solve for Lhat failed with error: " << info << std::endl;
1437 N_PDS_ParMap &BaseMap_ = *pdsMgrPtr_.getParallelMap(
"SOLUTION");
1438 RCP<Epetra_Map> serialRedMap;
1439 if (BaseMap_.petraMap()->Comm().MyPID() == 0)
1440 serialRedMap = Teuchos::rcp(
new Epetra_Map( k, k, 0, BaseMap_.petraMap()->Comm() ) );
1442 serialRedMap = Teuchos::rcp(
new Epetra_Map( k, 0, 0, BaseMap_.petraMap()->Comm() ) );
1444 Epetra_CrsMatrix* tmpRedG =
new Epetra_CrsMatrix( Copy, *serialRedMap, 1 );
1445 Epetra_CrsMatrix* tmpRedC =
new Epetra_CrsMatrix( Copy, *serialRedMap, 2 );
1448 if (BaseMap_.petraMap()->Comm().MyPID() == 0)
1450 std::vector<int> index(2);
1451 std::vector<double> val(2);
1452 for (
int i=0; i<k; i++)
1455 index[0] = i; val[0] = 1.0;
1456 tmpRedG->InsertGlobalValues( i, 1, &val[0], &index[0] );
1459 if (rowIndex[i] == 1)
1461 index[0] = i; index[1] = i+1;
1462 val[0] = revals[i]; val[1] = -ievals[i];
1463 tmpRedC->InsertGlobalValues( i, 2, &val[0], &index[0] );
1465 else if (rowIndex[i] == -1)
1467 index[0] = i-1; index[1] = i;
1468 val[0] = ievals[i-1]; val[1] = revals[i-1];
1469 tmpRedC->InsertGlobalValues( i, 2, &val[0], &index[0] );
1473 index[0] = i; val[0] = revals[i];
1474 tmpRedC->InsertGlobalValues( i, 1, &val[0], &index[0] );
1479 tmpRedC->FillComplete();
1480 tmpRedG->FillComplete();
1483 redGPtr_ = rcp(
new N_LAS_Matrix( tmpRedG ) );
1484 redCPtr_ = rcp(
new N_LAS_Matrix( tmpRedC ) );
1499 bool bsuccess =
true;
1532 bool bsuccess =
true;
1552 bool bsuccess =
true;
1554 #ifdef Xyce_DEBUG_ANALYSIS
1555 Xyce::dout() <<
"Calling MOR::finish() outputs!" << std::endl;
1610 Report::DevelFatal().in(
"MOR::updateCurrentFreq_") <<
"Unsupported STEP type";
1630 #ifdef Xyce_DEBUG_ANALYSIS
1633 Xyce::dout() << std::endl << std::endl;
1634 Xyce::dout() << section_divider << std::endl;
1635 Xyce::dout() <<
"MOR::setupSweepParam_" << std::endl;
1647 #ifdef Xyce_DEBUG_ANALYSIS
1650 Xyce::dout() <<
"fStep = " <<
fStep_ << std::endl;
1658 #ifdef Xyce_DEBUG_ANALYSIS
1661 Xyce::dout() <<
"stepMult_ = " <<
stepMult_ << std::endl;
1672 double ln2=log(2.0);
1674 #ifdef Xyce_DEBUG_ANALYSIS
1677 Xyce::dout() <<
"stepMult_ = " <<
stepMult_ << std::endl;
1683 Report::DevelFatal().in(
"MOR::setupSweepParam_") <<
"Unsupported type";