10#ifndef THYRA_DEFAUL_LUMPED_PARAMETER_LUMPED_MODEL_EVALUATOR_HPP
11#define THYRA_DEFAUL_LUMPED_PARAMETER_LUMPED_MODEL_EVALUATOR_HPP
14#include "Thyra_ModelEvaluatorDelegatorBase.hpp"
15#include "Thyra_ModelEvaluatorHelpers.hpp"
16#include "Thyra_DetachedVectorView.hpp"
17#include "Teuchos_ParameterListAcceptor.hpp"
18#include "Teuchos_VerboseObjectParameterListHelpers.hpp"
20#include "Teuchos_Assert.hpp"
23#include "sillyModifiedGramSchmidt.hpp"
207template<
class Scalar>
300 mutable bool isInitialized_;
301 mutable bool nominalValuesAndBoundsUpdated_;
308 bool autogenerateBasisMatrix_;
309 int numberOfBasisColumns_;
310 bool nominalValueIsParameterBase_;
311 bool ignoreParameterBounds_;
313 bool dumpBasisMatrix_;
326 static const std::string ParameterSubvectorIndex_name_;
327 static const int ParameterSubvectorIndex_default_;
329 static const std::string AutogenerateBasisMatrix_name_;
330 static const bool AutogenerateBasisMatrix_default_;
332 static const std::string NumberOfBasisColumns_name_;
333 static const int NumberOfBasisColumns_default_;
335 static const std::string NominalValueIsParameterBase_name_;
336 static const bool NominalValueIsParameterBase_default_;
338 static const std::string ParameterBaseVector_name_;
340 static const std::string IgnoreParameterBounds_name_;
341 static const bool IgnoreParameterBounds_default_;
343 static const std::string DumpBasisMatrix_name_;
344 static const bool DumpBasisMatrix_default_;
353 void finishInitialization()
const;
356 void generateParameterBasisMatrix()
const;
360 void updateNominalValuesAndBounds()
const;
367 void setupWrappedParamDerivOutArgs(
374 create_deriv_wrt_p_orig(
381 void assembleParamDerivOutArgs(
387 void assembleParamDeriv(
399template<
class Scalar>
407 paramLumpedModel->initialize(thyraModel);
408 return paramLumpedModel;
419template<
class Scalar>
421DefaultLumpedParameterModelEvaluator<Scalar>::ParameterSubvectorIndex_name_
422=
"Parameter Subvector Index";
424template<
class Scalar>
426DefaultLumpedParameterModelEvaluator<Scalar>::ParameterSubvectorIndex_default_
430template<
class Scalar>
432DefaultLumpedParameterModelEvaluator<Scalar>::AutogenerateBasisMatrix_name_
433=
"Auto-generate Basis Matrix";
435template<
class Scalar>
437DefaultLumpedParameterModelEvaluator<Scalar>::AutogenerateBasisMatrix_default_
441template<
class Scalar>
443DefaultLumpedParameterModelEvaluator<Scalar>::NumberOfBasisColumns_name_
444=
"Number of Basis Columns";
446template<
class Scalar>
448DefaultLumpedParameterModelEvaluator<Scalar>::NumberOfBasisColumns_default_
452template<
class Scalar>
454DefaultLumpedParameterModelEvaluator<Scalar>::NominalValueIsParameterBase_name_
455=
"Nominal Value is Parameter Base";
457template<
class Scalar>
459DefaultLumpedParameterModelEvaluator<Scalar>::NominalValueIsParameterBase_default_
463template<
class Scalar>
465DefaultLumpedParameterModelEvaluator<Scalar>::ParameterBaseVector_name_
466=
"Parameter Base Vector";
469template<
class Scalar>
471DefaultLumpedParameterModelEvaluator<Scalar>::IgnoreParameterBounds_name_
472=
"Ignore Parameter Bounds";
474template<
class Scalar>
476DefaultLumpedParameterModelEvaluator<Scalar>::IgnoreParameterBounds_default_
480template<
class Scalar>
482DefaultLumpedParameterModelEvaluator<Scalar>::DumpBasisMatrix_name_
483=
"Dump Basis Matrix";
485template<
class Scalar>
487DefaultLumpedParameterModelEvaluator<Scalar>::DumpBasisMatrix_default_
494template<
class Scalar>
496 :isInitialized_(false),
497 nominalValuesAndBoundsUpdated_(false),
498 p_idx_(ParameterSubvectorIndex_default_),
499 autogenerateBasisMatrix_(AutogenerateBasisMatrix_default_),
500 numberOfBasisColumns_(NumberOfBasisColumns_default_),
501 nominalValueIsParameterBase_(NominalValueIsParameterBase_default_),
502 ignoreParameterBounds_(IgnoreParameterBounds_default_),
503 localVerbLevel_(
Teuchos::VERB_DEFAULT),
504 dumpBasisMatrix_(DumpBasisMatrix_default_)
508template<
class Scalar>
513 isInitialized_ =
false;
514 nominalValuesAndBoundsUpdated_ =
false;
519template<
class Scalar>
524 isInitialized_ =
false;
533template<
class Scalar>
539 std::ostringstream oss;
540 oss <<
"Thyra::DefaultLumpedParameterModelEvaluator{";
541 oss <<
"thyraModel=";
543 oss <<
"\'"<<thyraModel->description()<<
"\'";
554template<
class Scalar>
560 using Teuchos::getParameterPtr;
562 using Teuchos::sublist;
564 isInitialized_ =
false;
565 nominalValuesAndBoundsUpdated_ =
false;
570 paramList_ = paramList;
573 p_idx_ = paramList_->
get(
574 ParameterSubvectorIndex_name_, ParameterSubvectorIndex_default_ );
575 autogenerateBasisMatrix_ = paramList_->get(
576 AutogenerateBasisMatrix_name_, AutogenerateBasisMatrix_default_ );
577 if (autogenerateBasisMatrix_) {
578 numberOfBasisColumns_ = paramList_->get(
579 NumberOfBasisColumns_name_, NumberOfBasisColumns_default_ );
581 nominalValueIsParameterBase_ = paramList_->get(
582 NominalValueIsParameterBase_name_, NominalValueIsParameterBase_default_ );
583 if (!nominalValueIsParameterBase_) {
586 ignoreParameterBounds_ = paramList_->get(
587 IgnoreParameterBounds_name_, IgnoreParameterBounds_default_ );
588 dumpBasisMatrix_ = paramList_->get(
589 DumpBasisMatrix_name_, DumpBasisMatrix_default_ );
593 Teuchos::readVerboseObjectSublist(&*paramList_,
this);
602template<
class Scalar>
610template<
class Scalar>
615 paramList_ = Teuchos::null;
620template<
class Scalar>
628template<
class Scalar>
632 if(validParamList_.get()==NULL) {
635 pl->set( ParameterSubvectorIndex_name_, ParameterSubvectorIndex_default_,
636 "Determines the index of the parameter subvector in the underlying model\n"
637 "for which the reduced basis representation will be determined." );
638 pl->set( AutogenerateBasisMatrix_name_, AutogenerateBasisMatrix_default_,
639 "If true, then a basis matrix will be auto-generated for a given number\n"
640 " of basis vectors." );
641 pl->set( NumberOfBasisColumns_name_, NumberOfBasisColumns_default_,
642 "If a basis is auto-generated, then this parameter gives the number\n"
643 "of columns in the basis matrix that will be created. Warning! This\n"
644 "number must be less than or equal to the number of original parameters\n"
645 "or an exception will be thrown!" );
646 pl->set( NominalValueIsParameterBase_name_, NominalValueIsParameterBase_default_,
647 "If true, then the nominal values for the full parameter subvector from the\n"
648 "underlying model will be used for p_orig_base. This allows p==0 to give\n"
649 "the nominal values for the parameters." );
657 pl->set( IgnoreParameterBounds_name_, IgnoreParameterBounds_default_,
658 "If true, then any bounds on the parameter subvector will be ignored." );
659 pl->set( DumpBasisMatrix_name_, DumpBasisMatrix_default_,
660 "If true, then the basis matrix will be printed the first time it is created\n"
661 "as part of the verbose output and as part of the Describable::describe(...)\n"
662 "output for any verbositiy level >= \"low\"." );
664 Teuchos::setupVerboseObjectSublist(&*pl);
665 validParamList_ = pl;
667 return validParamList_;
674template<
class Scalar>
678 finishInitialization();
685template<
class Scalar>
689 finishInitialization();
691 return Teuchos::null;
696template<
class Scalar>
700 updateNominalValuesAndBounds();
701 return nominalValues_;
705template<
class Scalar>
709 updateNominalValuesAndBounds();
714template<
class Scalar>
718 updateNominalValuesAndBounds();
723template<
class Scalar>
733 updateNominalValuesAndBounds();
741 MEB::InArgs<Scalar> wrappedFinalPoint = thyraModel->createInArgs();
742 wrappedFinalPoint.setArgs(finalPoint);
746 if (!is_null(p=finalPoint.
get_p(p_idx_))) {
747 wrappedFinalPoint.set_p(p_idx_, map_from_p_to_p_orig(*p));
750 thyraModel->reportFinalPoint(wrappedFinalPoint,wasSolved);
758template<
class Scalar>
760DefaultLumpedParameterModelEvaluator<Scalar>::createOutArgsImpl()
const
763 outArgs = this->getUnderlyingModel()->createOutArgs();
772template<
class Scalar>
773void DefaultLumpedParameterModelEvaluator<Scalar>::evalModelImpl(
774 const ModelEvaluatorBase::InArgs<Scalar> &inArgs,
775 const ModelEvaluatorBase::OutArgs<Scalar> &outArgs
785 using Teuchos::rcp_const_cast;
786 using Teuchos::rcp_dynamic_cast;
789 typedef typename ST::magnitudeType ScalarMag;
790 typedef ModelEvaluatorBase MEB;
793 updateNominalValuesAndBounds();
795 THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_LOCALVERBLEVEL_BEGIN(
796 "Thyra::DefaultLumpedParameterModelEvaluator",inArgs,outArgs,localVerbLevel_
806 MEB::InArgs<Scalar> wrappedInArgs = thyraModel->createInArgs();
807 wrappedInArgs.setArgs(inArgs);
810 RCP<const VectorBase<Scalar> > p;
811 if (!is_null(p=wrappedInArgs.get_p(p_idx_))) {
819 wrappedInArgs.set_p(p_idx_,map_from_p_to_p_orig(*p));
830 MEB::OutArgs<Scalar> wrappedOutArgs = thyraModel->createOutArgs();
831 wrappedOutArgs.setArgs(outArgs);
835 setupWrappedParamDerivOutArgs(outArgs,&wrappedOutArgs);
842 *out <<
"\nEvaluating the fully parameterized underlying model ...\n";
845 thyraModel->evalModel(wrappedInArgs,wrappedOutArgs);
853 assembleParamDerivOutArgs(wrappedOutArgs,outArgs);
855 THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_END();
863template<
class Scalar>
864void DefaultLumpedParameterModelEvaluator<Scalar>::finishInitialization()
const
878 thyraModel = this->getUnderlyingModel();
881 is_null(thyraModel), std::logic_error,
882 "Error, the underlying model evaluator must be set!" );
888 if (autogenerateBasisMatrix_) {
889 generateParameterBasisMatrix();
893 true, std::logic_error,
894 "Error, we don't handle a client-set parameter basis matrix yet!" );
897 isInitialized_ =
true;
902template<
class Scalar>
903void DefaultLumpedParameterModelEvaluator<Scalar>::generateParameterBasisMatrix()
const
910 thyraModel = this->getUnderlyingModel();
913 p_orig_space = thyraModel->get_p_space(p_idx_);
915 const Ordinal p_orig_dim = p_orig_space->dim();
918 !( 1 <= numberOfBasisColumns_ && numberOfBasisColumns_ <= p_orig_dim ),
920 "Error, the number of basis columns = " << numberOfBasisColumns_ <<
" does not\n"
921 "fall in the range [1,"<<p_orig_dim<<
"]!" );
934 assign( B->col(0).ptr(), ST::one() );
935 if (numberOfBasisColumns_ > 1) {
946 sillyModifiedGramSchmidt( B.ptr(), Teuchos::outArg(R) );
957template<
class Scalar>
958void DefaultLumpedParameterModelEvaluator<Scalar>::updateNominalValuesAndBounds()
const
964 if (nominalValuesAndBoundsUpdated_)
967 finishInitialization();
970 thyraModel = this->getUnderlyingModel();
972 const MEB::InArgs<Scalar> origNominalValues = thyraModel->getNominalValues();
973 const MEB::InArgs<Scalar> origLowerBounds = thyraModel->getLowerBounds();
974 const MEB::InArgs<Scalar> origUpperBounds = thyraModel->getUpperBounds();
978 if (nominalValueIsParameterBase_) {
980 p_orig_init = origNominalValues.get_p(p_idx_);
982 is_null(p_orig_init), std::logic_error,
983 "Error, if the user requested that the nominal values be used\n"
984 "as the base vector p_orig_base then that vector has to exist!" );
985 p_orig_base_ = p_orig_init->clone_v();
989 true, std::logic_error,
990 "Error, we don't handle reading in the parameter base vector yet!" );
995 nominalValues_ = origNominalValues;
997 if (nominalValueIsParameterBase_) {
1001 assign( p_init.ptr(), ST::zero() );
1002 nominalValues_.set_p(p_idx_, p_init);
1006 true, std::logic_error,
1007 "Error, we don't handle creating p_init when p_orig_base != p_orig_init yet!" );
1012 lowerBounds_ = origLowerBounds;
1013 upperBounds_ = origUpperBounds;
1015 lowerBounds_.set_p(p_idx_,Teuchos::null);
1016 upperBounds_.set_p(p_idx_,Teuchos::null);
1018 if (!ignoreParameterBounds_) {
1020 p_orig_l = origLowerBounds.get_p(p_idx_),
1021 p_orig_u = origUpperBounds.get_p(p_idx_);
1024 true, std::logic_error,
1025 "Error, we don't handle bounds on p_orig yet!" );
1029 nominalValuesAndBoundsUpdated_ =
true;
1034template<
class Scalar>
1036DefaultLumpedParameterModelEvaluator<Scalar>::map_from_p_to_p_orig(
1043 Vp_V( p_orig.ptr(), *p_orig_base_ );
1048template<
class Scalar>
1049void DefaultLumpedParameterModelEvaluator<Scalar>::setupWrappedParamDerivOutArgs(
1056 typedef MEB::Derivative<Scalar> Deriv;
1059 MEB::OutArgs<Scalar> &wrappedOutArgs = *wrappedOutArgs_inout;
1062 if ( !(DfDp=outArgs.get_DfDp(p_idx_)).isEmpty() ) {
1063 wrappedOutArgs.set_DfDp(p_idx_,create_deriv_wrt_p_orig(DfDp,MEB::DERIV_MV_BY_COL));
1066 const int Ng = outArgs.Ng();
1067 for (
int j = 0; j < Ng; ++j ) {
1069 if ( !(DgDp=outArgs.get_DgDp(j,p_idx_)).isEmpty() ) {
1070 wrappedOutArgs.set_DgDp(
1072 create_deriv_wrt_p_orig(DgDp,DgDp.getMultiVectorOrientation())
1080template<
class Scalar>
1082DefaultLumpedParameterModelEvaluator<Scalar>::create_deriv_wrt_p_orig(
1091 DhDp_mv = DhDp.getMultiVector();
1093 is_null(DhDp_mv) || (DhDp.getMultiVectorOrientation() != requiredOrientation),
1095 "Error, we currently can't handle non-multi-vector derivatives!" );
1098 switch (requiredOrientation) {
1099 case MEB::DERIV_MV_BY_COL:
1101 DhDp_orig_mv =
createMembers(DhDp_mv->range(),B_->range()->dim());
1105 case MEB::DERIV_TRANS_MV_BY_ROW:
1107 DhDp_orig_mv =
createMembers(B_->range(),DhDp_mv->domain()->dim());
1115 return MEB::Derivative<Scalar>(DhDp_orig_mv,requiredOrientation);
1120template<
class Scalar>
1121void DefaultLumpedParameterModelEvaluator<Scalar>::assembleParamDerivOutArgs(
1128 typedef MEB::Derivative<Scalar> Deriv;
1131 if ( !(DfDp=outArgs.get_DfDp(p_idx_)).isEmpty() ) {
1132 assembleParamDeriv( wrappedOutArgs.get_DfDp(p_idx_), DfDp );
1135 const int Ng = outArgs.Ng();
1136 for (
int j = 0; j < Ng; ++j ) {
1138 if ( !(DgDp=outArgs.get_DgDp(j,p_idx_)).isEmpty() ) {
1139 assembleParamDeriv( wrappedOutArgs.get_DgDp(j,p_idx_), DgDp );
1146template<
class Scalar>
1147void DefaultLumpedParameterModelEvaluator<Scalar>::assembleParamDeriv(
1156 DhDp_orig_mv = DhDp_orig.getMultiVector();
1158 is_null(DhDp_orig_mv), std::logic_error,
1159 "Error, we currently can't handle non-multi-vector derivatives!" );
1162 DhDp_mv = DhDp.getMultiVector();
1164 is_null(DhDp_mv), std::logic_error,
1165 "Error, we currently can't handle non-multi-vector derivatives!" );
1167 switch( DhDp_orig.getMultiVectorOrientation() ) {
1168 case MEB::DERIV_MV_BY_COL:
1172 DhDp.getMultiVectorOrientation() == MEB::DERIV_MV_BY_COL );
1178 case MEB::DERIV_TRANS_MV_BY_ROW:
1182 DhDp.getMultiVectorOrientation() == MEB::DERIV_TRANS_MV_BY_ROW );
1184 apply( *B_, CONJTRANS, *DhDp_orig_mv, DhDp_mv.ptr() );
RCP< const Array< std::string > > get_p_names(int l) const
RCP< Teuchos::ParameterList > getNonconstParameterList()
void setParameterList(RCP< Teuchos::ParameterList > const ¶mList)
RCP< DefaultLumpedParameterModelEvaluator< Scalar > > defaultLumpedParameterModelEvaluator(const RCP< ModelEvaluator< Scalar > > &thyraModel)
Non-member constructor.
RCP< const Teuchos::ParameterList > getParameterList() const
RCP< const VectorSpaceBase< Scalar > > get_p_space(int l) const
ModelEvaluatorBase::InArgs< Scalar > getLowerBounds() const
ModelEvaluatorBase::InArgs< Scalar > getUpperBounds() const
RCP< Teuchos::ParameterList > unsetParameterList()
DefaultLumpedParameterModelEvaluator()
RCP< const Teuchos::ParameterList > getValidParameters() const
ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
std::string description() const
void initialize(const RCP< ModelEvaluator< Scalar > > &thyraModel)
void reportFinalPoint(const ModelEvaluatorBase::InArgs< Scalar > &finalPoint, const bool wasSolved)
void apply(const LinearOpBase< Scalar > &M, const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha=static_cast< Scalar >(1.0), const Scalar beta=static_cast< Scalar >(0.0))
Non-member function call for M.apply(...).
Simple aggregate class that stores a derivative object as a general linear operator or as a multi-vec...
Concrete aggregate class for all input arguments computable by a ModelEvaluator subclass object.
RCP< const VectorBase< Scalar > > get_p(int l) const
Get p(l) where 0 <= l && l < this->Np().
Protected subclass of OutArgs that only ModelEvaluator subclasses can access to set up the selection ...
void setModelEvalDescription(const std::string &modelEvalDescription)
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object.
Base subclass for ModelEvaluator that defines some basic types.
EDerivativeMultiVectorOrientation
void setLocalVerbosityLevelValidatedParameter(ParameterList *paramList) const
Set a valid parameter for reading the local verbosity level.
Teuchos::EVerbosityLevel readLocalVerbosityLevelValidatedParameter(ParameterList ¶mList) const
Read the local verbosity level parameter.
ModelEvaluatorDelegatorBase()
Constructs to uninitialized.
virtual RCP< const ModelEvaluator< Scalar > > getUnderlyingModel() const
void uninitialize()
Uninitialize.
void initialize(const RCP< ModelEvaluator< Scalar > > &model)
Initialize given a non-const model evaluator.
virtual RCP< ModelEvaluator< Scalar > > getNonconstUnderlyingModel()
Pure abstract base interface for evaluating a stateless "model" that can be mapped into a number of d...
void assign(const Ptr< MultiVectorBase< Scalar > > &V, Scalar alpha)
V = alpha.
void randomize(Scalar l, Scalar u, const Ptr< MultiVectorBase< Scalar > > &V)
Generate a random multi-vector with elements uniformly distributed elements.
void Vp_V(const Ptr< MultiVectorBase< Scalar > > &Z, const MultiVectorBase< Scalar > &X)
Z(i,j) += X(i,j), i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
Abstract interface for finite-dimensional dense vectors.
void seed_randomize(unsigned int s)
Seed the random number generator used in randomize().
RCP< VectorBase< Scalar > > createMember(const RCP< const VectorSpaceBase< Scalar > > &vs, const std::string &label="")
Create a vector member from the vector space.
RCP< MultiVectorBase< Scalar > > createMembers(const RCP< const VectorSpaceBase< Scalar > > &vs, int numMembers, const std::string &label="")
Create a set of vector members (a MultiVectorBase) from the vector space.
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
bool is_null(const std::shared_ptr< T > &p)
NOTRANS
Type for the dimension of a vector space. `**/ typedef Teuchos::Ordinal Ordinal;.
TypeTo as(const TypeFrom &t)
basic_OSTab< char > OSTab
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
TEUCHOSCORE_LIB_DLL_EXPORT bool includesVerbLevel(const EVerbosityLevel verbLevel, const EVerbosityLevel requestedVerbLevel, const bool isDefaultLevel=false)