44 #include "Epetra_Comm.h" 45 #include "Epetra_Map.h" 46 #include "Epetra_CrsGraph.h" 47 #include "Epetra_CrsMatrix.h" 48 #include "Epetra_LocalMap.h" 49 #include "Teuchos_ParameterList.hpp" 50 #include "Teuchos_StandardParameterEntryValidators.hpp" 51 #include "Teuchos_Assert.hpp" 52 #include "Teuchos_as.hpp" 61 const std::string Implicit_name =
"Implicit";
62 const bool Implicit_default =
true;
64 const std::string Gamma_min_name =
"Gamma_min";
65 const double Gamma_min_default = -0.9;
67 const std::string Gamma_max_name =
"Gamma_max";
68 const double Gamma_max_default = -0.01;
70 const std::string Coeff_s_name =
"Coeff_s";
71 const std::string Coeff_s_default =
"{ 0.0 }";
73 const std::string Gamma_fit_name =
"Gamma_fit";
74 const std::string Gamma_fit_default =
"Linear";
76 const std::string NumElements_name =
"NumElements";
77 const int NumElements_default = 1;
79 const std::string x0_name =
"x0";
80 const double x0_default = 10.0;
82 const std::string ExactSolutionAsResponse_name =
"Exact Solution as Response";
83 const bool ExactSolutionAsResponse_default =
false;
87 double evalR(
const double& t,
const double& gamma,
const double& s )
89 return (exp(gamma*t)*sin(s*t));
94 double d_evalR_d_s(
const double& t,
const double& gamma,
const double& s )
96 return (exp(gamma*t)*cos(s*t)*t);
102 const double& x,
const double& t,
const double& gamma,
const double& s
105 return ( gamma*x + evalR(t,gamma,s) );
111 const double& x0,
const double& t,
const double& gamma,
const double& s
115 return ( x0 * exp(gamma*t) );
116 return ( exp(gamma*t) * (x0 + (1.0/s) * ( 1.0 - cos(s*t) ) ) );
126 const double& t,
const double& gamma,
const double& s
131 return ( -exp(gamma*t)/(s*s) * ( 1.0 - sin(s*t)*(s*t) - cos(s*t) ) );
135 class UnsetParameterVector {
137 ~UnsetParameterVector()
140 *vec_ = Teuchos::null;
142 UnsetParameterVector(
143 const RCP<RCP<const Epetra_Vector> > &vec
148 void setVector(
const RCP<RCP<const Epetra_Vector> > &vec )
153 RCP<RCP<const Epetra_Vector> > vec_;
167 Teuchos::RCP<Epetra_Comm>
const& epetra_comm
169 : epetra_comm_(epetra_comm.assert_not_null()),
170 implicit_(Implicit_default),
171 numElements_(NumElements_default),
172 gamma_min_(Gamma_min_default),
173 gamma_max_(Gamma_max_default),
174 coeff_s_(
Teuchos::fromStringToArray<double>(Coeff_s_default)),
175 gamma_fit_(GAMMA_FIT_LINEAR),
177 exactSolutionAsResponse_(ExactSolutionAsResponse_default),
184 Teuchos::RCP<const Epetra_Vector>
191 Teuchos::RCP<const Epetra_Vector>
193 const double t,
const Epetra_Vector *coeff_s_p
197 UnsetParameterVector unsetParameterVector(Teuchos::rcp(&
coeff_s_p_,
false));
198 Teuchos::RCP<Epetra_Vector>
199 x_star_ptr = Teuchos::rcp(
new Epetra_Vector(*
epetra_map_,
false));
200 Epetra_Vector& x_star = *x_star_ptr;
201 Epetra_Vector& gamma = *
gamma_;
202 int myN = x_star.MyLength();
203 for (
int i=0 ; i<myN ; ++i ) {
204 x_star[i] = x_exact(
x0_, t, gamma[i],
coeff_s(i) );
210 Teuchos::RCP<const Epetra_MultiVector>
212 const double t,
const Epetra_Vector *coeff_s_p
216 UnsetParameterVector unsetParameterVector(Teuchos::rcp(&
coeff_s_p_,
false));
217 Teuchos::RCP<Epetra_MultiVector>
218 dxds_star_ptr = Teuchos::rcp(
new Epetra_MultiVector(*
epetra_map_,
np_,
false));
219 Epetra_MultiVector& dxds_star = *dxds_star_ptr;
220 dxds_star.PutScalar(0.0);
221 Epetra_Vector& gamma = *
gamma_;
222 int myN = dxds_star.MyLength();
223 for (
int i=0 ; i<myN ; ++i ) {
225 (*dxds_star(coeff_s_idx_i))[i] = dxds_exact( t, gamma[i],
coeff_s(i) );
230 return (dxds_star_ptr);
238 Teuchos::RCP<Teuchos::ParameterList>
const& paramList
241 using Teuchos::get;
using Teuchos::getIntegralValue;
242 using Teuchos::getArrayFromStringParameter;
243 TEUCHOS_TEST_FOR_EXCEPT( is_null(paramList) );
259 Teuchos::RCP<Teuchos::ParameterList>
266 Teuchos::RCP<Teuchos::ParameterList>
269 Teuchos::RCP<Teuchos::ParameterList> _paramList =
paramList_;
275 Teuchos::RCP<const Teuchos::ParameterList>
282 Teuchos::RCP<const Teuchos::ParameterList>
285 using Teuchos::RCP;
using Teuchos::ParameterList;
286 using Teuchos::tuple;
287 using Teuchos::setIntParameter;
using Teuchos::setDoubleParameter;
288 using Teuchos::setStringToIntegralParameter;
289 static RCP<const ParameterList> validPL;
290 if (is_null(validPL)) {
291 RCP<ParameterList> pl = Teuchos::parameterList();
292 pl->set(Implicit_name,
true);
294 Gamma_min_name, Gamma_min_default,
"",
298 Gamma_max_name, Gamma_max_default,
"",
301 setStringToIntegralParameter<EGammaFit>(
302 Gamma_fit_name, Gamma_fit_default,
"",
303 tuple<std::string>(
"Linear",
"Random"),
308 NumElements_name, NumElements_default,
"",
312 x0_name, x0_default,
"",
315 pl->set( Coeff_s_name, Coeff_s_default );
316 pl->set( ExactSolutionAsResponse_name, ExactSolutionAsResponse_default );
326 Teuchos::RCP<const Epetra_Map>
333 Teuchos::RCP<const Epetra_Map>
340 Teuchos::RCP<const Epetra_Map>
344 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE( l, 0,
Np_ );
350 Teuchos::RCP<const Teuchos::Array<std::string> >
354 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE( l, 0,
Np_ );
360 Teuchos::RCP<const Epetra_Map>
364 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE( j, 0,
Ng_ );
370 Teuchos::RCP<const Epetra_Vector>
377 Teuchos::RCP<const Epetra_Vector>
384 Teuchos::RCP<const Epetra_Vector>
388 TEUCHOS_ASSERT( l == 0 );
394 Teuchos::RCP<Epetra_Operator>
398 return Teuchos::rcp(
new Epetra_CrsMatrix(::Copy,*
W_graph_));
399 return Teuchos::null;
465 using Teuchos::dyn_cast;
467 const Epetra_Vector &x = *(inArgs.
get_x());
468 const double t = inArgs.
get_t();
470 UnsetParameterVector unsetParameterVector(rcp(&
coeff_s_p_,
false));
475 Epetra_Operator *W_out = (
implicit_ ? outArgs.
get_W().get() : 0 );
476 Epetra_Vector *f_out = outArgs.
get_f().get();
477 Epetra_MultiVector *DfDp_out = 0;
479 Epetra_Vector *g_out = 0;
480 Epetra_MultiVector *DgDp_out = 0;
482 g_out = outArgs.
get_g(0).get();
486 const Epetra_Vector &gamma = *
gamma_;
488 int localNumElements = x.MyLength();
491 Epetra_Vector &f = *f_out;
493 const Epetra_Vector *x_dot_in = inArgs.
get_x_dot().get();
495 const Epetra_Vector &x_dot = *x_dot_in;
496 for (
int i=0 ; i<localNumElements ; ++i )
497 f[i] = x_dot[i] - f_func(x[i],t,gamma[i],
coeff_s(i));
500 for (
int i=0 ; i<localNumElements ; ++i )
501 f[i] = - f_func(x[i],t,gamma[i],
coeff_s(i));
505 for (
int i=0 ; i<localNumElements ; ++i )
506 f[i] = f_func(x[i],t,gamma[i],
coeff_s(i));
513 const double beta = inArgs.
get_beta();
514 Epetra_CrsMatrix &crsW = dyn_cast<Epetra_CrsMatrix>(*W_out);
519 for(
int i = 0; i < localNumElements; ++i ) {
520 values[0] = alpha - beta*gamma[i];
521 indices[0] = i + offset;
522 crsW.ReplaceGlobalValues(
532 Epetra_MultiVector &DfDp = *DfDp_out;
535 for(
int i = 0; i < localNumElements; ++i ) {
537 = - d_evalR_d_s(t,gamma[i],
coeff_s(i));
541 for(
int i = 0; i < localNumElements; ++i ) {
543 = + d_evalR_d_s(t,gamma[i],
coeff_s(i));
585 Epetra_Vector &gamma = *
gamma_;
588 const int N = gamma.GlobalLength();
590 const int MyLength = gamma.MyLength();
595 for (
int i=0 ; i<MyLength ; ++i )
597 gamma[i] = slope*(procRank*MyLength+i)+
gamma_min_;
603 unsigned int seed = Teuchos::ScalarTraits<int>::random()+10*procRank;
610 int MyLength = gamma.MyLength();
611 for (
int i=0 ; i<MyLength ; ++i)
613 gamma[i] = slope*gamma[i] + tmp;
618 TEUCHOS_TEST_FOR_EXCEPT(
"Should never get here!");
633 Teuchos::RCP<Teuchos::Array<std::string> >
634 names_p_0 = Teuchos::rcp(
new Teuchos::Array<std::string>());
635 for (
int i = 0; i <
np_; ++i )
643 for (
int coeff_s_idx_i = 0; coeff_s_idx_i <
np_; ++coeff_s_idx_i ) {
644 const int num_func_per_coeff_s_idx_i
645 = num_func_per_coeff_s
646 + ( coeff_s_idx_i < num_func_per_coeff_s_rem ? 1 : 0 );
648 int coeff_s_idx_i_j = 0;
649 coeff_s_idx_i_j < num_func_per_coeff_s_idx_i;
657 TEUCHOS_TEST_FOR_EXCEPT(
693 indices[0] = i + offset;
736 const Teuchos::RCP<const Epetra_Vector> &coeff_s_p
739 if (!is_null(coeff_s_p))
772 Teuchos::RCP<EpetraExt::DiagonalTransientModel>
773 EpetraExt::diagonalTransientModel(
774 Teuchos::RCP<Epetra_Comm>
const& epetra_comm,
775 Teuchos::RCP<Teuchos::ParameterList>
const& paramList
779 Teuchos::rcp(
new DiagonalTransientModel(epetra_comm));
780 if (!is_null(paramList))
RCP_Eptra_Vector_Array_t p_init_
Teuchos::RCP< Epetra_CrsGraph > W_graph_
void set_W_properties(const DerivativeProperties &properties)
Teuchos::RCP< Epetra_Comm > epetra_comm_
Teuchos::RCP< Epetra_Operator > create_W() const
Teuchos::RCP< const Epetra_MultiVector > getExactSensSolution(const double t, const Epetra_Vector *coeff_s_p=0) const
Return the exact sensitivity of x as a function of time.
void setSupports(EOutArgsMembers arg, bool supports=true)
int coeff_s_idx(int i) const
Teuchos::RCP< const Epetra_Map > get_g_map(int j) const
.
void set_x(const Teuchos::RCP< const Epetra_Vector > &x)
Teuchos::RCP< const Epetra_Map > get_x_map() const
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int l) const
.
Teuchos::RCP< Epetra_MultiVector > get_DgDp_mv(const int j, const int l, const ModelEvaluator::OutArgs &outArgs, const ModelEvaluator::EDerivativeMultiVectorOrientation mvOrientation)
Teuchos::RCP< const Epetra_Vector > get_p_init(int l) const
Teuchos::RCP< const Teuchos::ParameterList > getParameterList() const
void set_f(const Evaluation< Epetra_Vector > &f)
void setSupports(EInArgsMembers arg, bool supports=true)
Teuchos::RCP< const Epetra_Vector > get_x_dot_init() const
Teuchos::RCP< const Epetra_Vector > get_x_dot() const
DiagonalTransientModel(Teuchos::RCP< Epetra_Comm > const &epetra_comm)
Teuchos::RCP< Epetra_Vector > gamma_
EpetraExt::BlockCrsMatrix: A class for constructing a distributed block matrix.
Teuchos::RCP< const Epetra_Vector > get_x() const
Set solution vector Taylor polynomial.
void set_DgDp_properties(int j, int l, const DerivativeProperties &properties)
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
RCP_Eptra_Map_Array_t map_g_
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
void set_DfDp_properties(int l, const DerivativeProperties &properties)
Teuchos::RCP< const Epetra_Vector > getExactSolution(const double t, const Epetra_Vector *coeff_s_p=0) const
Return the exact solution as a function of time.
Teuchos::RCP< Epetra_MultiVector > get_DfDp_mv(const int l, const ModelEvaluator::OutArgs &outArgs)
Teuchos::RCP< Epetra_Operator > get_W() const
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
OutArgs createOutArgs() const
Teuchos::RCP< DiagonalTransientModel > diagonalTransientModel(Teuchos::RCP< Epetra_Comm > const &epetra_comm, Teuchos::RCP< Teuchos::ParameterList > const ¶mList=Teuchos::null)
Nonmember constructor.
Teuchos::RCP< const Epetra_Map > get_p_map(int l) const
.
Teuchos::RCP< const Epetra_Vector > get_x_init() const
bool exactSolutionAsResponse_
coeff_s_idx_t coeff_s_idx_
InArgs createInArgs() const
Teuchos::RCP< const Epetra_Vector > coeff_s_p_
Teuchos::RCP< const Epetra_Vector > get_p(int l) const
void setParameterList(Teuchos::RCP< Teuchos::ParameterList > const ¶mList)
Teuchos::RCP< const Epetra_Map > get_f_map() const
void set_coeff_s_p(const Teuchos::RCP< const Epetra_Vector > &coeff_s_p) const
Teuchos::RCP< const Epetra_Vector > get_gamma() const
Return the model vector gamma,.
Evaluation< Epetra_Vector > get_g(int j) const
Get g(j) where 0 <= j && j < this->Ng().
RCP_Eptra_Map_Array_t map_p_
Evaluation< Epetra_Vector > get_f() const
RCP_Array_String_Array_t names_p_
Teuchos::RCP< Teuchos::ParameterList > paramList_
void evalModel(const InArgs &inArgs, const OutArgs &outArgs) const
Teuchos::RCP< Epetra_Map > epetra_map_
double coeff_s(int i) const
Teuchos::RCP< Epetra_Vector > x_init_
void set_Np_Ng(int Np, int Ng)
Teuchos::RCP< Epetra_Vector > x_dot_init_
std::string toString(const int &x)
void unset_coeff_s_p() const