void ImplicitRKStepper<Scalar>::setInitialCondition( const Thyra::ModelEvaluatorBase::InArgs<Scalar> &initialCondition ) { typedef ScalarTraits<Scalar> ST; typedef Thyra::ModelEvaluatorBase MEB; basePoint_ = initialCondition; // x RCP<const Thyra::VectorBase<Scalar> > x_init = initialCondition.get_x(); #ifdef HAVE_RYTHMOS_DEBUG TEUCHOS_TEST_FOR_EXCEPTION( is_null(x_init), std::logic_error, "Error, if the client passes in an intial condition to setInitialCondition(...),\n" "then x can not be null!" ); #endif x_ = x_init->clone_v(); // x_dot x_dot_ = createMember(x_->space()); RCP<const Thyra::VectorBase<Scalar> > x_dot_init = initialCondition.get_x_dot(); if (!is_null(x_dot_init)) assign(x_dot_.ptr(),*x_dot_init); else assign(x_dot_.ptr(),ST::zero()); // t const Scalar t = ( initialCondition.supports(MEB::IN_ARG_t) ? initialCondition.get_t() : ST::zero() ); timeRange_ = timeRange(t,t); // x_old x_old_ = x_->clone_v(); haveInitialCondition_ = true; }
void TimeDiscretizedBackwardEulerModelEvaluator<Scalar>::initialize( const RCP<const Thyra::ModelEvaluator<Scalar> > &daeModel, const Thyra::ModelEvaluatorBase::InArgs<Scalar> &initCond, const Scalar finalTime, const int numTimeSteps, const RCP<Thyra::LinearOpWithSolveFactoryBase<Scalar> > &W_bar_factory ) { TEST_FOR_EXCEPT(is_null(daeModel)); TEST_FOR_EXCEPT(is_null(initCond.get_x())); TEST_FOR_EXCEPT(is_null(initCond.get_x_dot())); TEST_FOR_EXCEPT(finalTime <= initCond.get_t()); TEST_FOR_EXCEPT(numTimeSteps <= 0); // ToDo: Validate that daeModel is of the right form! daeModel_ = daeModel; initCond_ = initCond; finalTime_ = finalTime; numTimeSteps_ = numTimeSteps; initTime_ = initCond.get_t(); delta_t_ = (finalTime_ - initTime_) / numTimeSteps_; x_bar_space_ = productVectorSpace(daeModel_->get_x_space(),numTimeSteps_); f_bar_space_ = productVectorSpace(daeModel_->get_f_space(),numTimeSteps_); if (!is_null(W_bar_factory)) { W_bar_factory_ = W_bar_factory; } else { W_bar_factory_ = Thyra::defaultBlockedTriangularLinearOpWithSolveFactory<Scalar>( daeModel_->get_W_factory() ); } }
void Albany::ModelEvaluatorT::evalModelImpl( const Thyra::ModelEvaluatorBase::InArgs<ST>& inArgsT, const Thyra::ModelEvaluatorBase::OutArgs<ST>& outArgsT) const { #ifdef OUTPUT_TO_SCREEN std::cout << "DEBUG: " << __PRETTY_FUNCTION__ << "\n"; #endif Teuchos::TimeMonitor Timer(*timer); //start timer // // Get the input arguments // const Teuchos::RCP<const Tpetra_Vector> xT = ConverterT::getConstTpetraVector(inArgsT.get_x()); const Teuchos::RCP<const Tpetra_Vector> x_dotT = (supports_xdot && Teuchos::nonnull(inArgsT.get_x_dot())) ? ConverterT::getConstTpetraVector(inArgsT.get_x_dot()) : Teuchos::null; const Teuchos::RCP<const Tpetra_Vector> x_dotdotT = (supports_xdotdot && Teuchos::nonnull(this->get_x_dotdot())) ? ConverterT::getConstTpetraVector(this->get_x_dotdot()) : Teuchos::null; const double alpha = (Teuchos::nonnull(x_dotT) || Teuchos::nonnull(x_dotdotT)) ? inArgsT.get_alpha() : 0.0; const double omega = Teuchos::nonnull(x_dotdotT) ? this->get_omega() : 0.0; const double beta = (Teuchos::nonnull(x_dotT) || Teuchos::nonnull(x_dotdotT)) ? inArgsT.get_beta() : 1.0; const double curr_time = (Teuchos::nonnull(x_dotT) || Teuchos::nonnull(x_dotdotT)) ? inArgsT.get_t() : 0.0; for (int l = 0; l < inArgsT.Np(); ++l) { const Teuchos::RCP<const Thyra::VectorBase<ST> > p = inArgsT.get_p(l); if (Teuchos::nonnull(p)) { const Teuchos::RCP<const Tpetra_Vector> pT = ConverterT::getConstTpetraVector(p); const Teuchos::ArrayRCP<const ST> pT_constView = pT->get1dView(); ParamVec &sacado_param_vector = sacado_param_vec[l]; for (unsigned int k = 0; k < sacado_param_vector.size(); ++k) { sacado_param_vector[k].baseValue = pT_constView[k]; } } } // // Get the output arguments // const Teuchos::RCP<Tpetra_Vector> fT_out = Teuchos::nonnull(outArgsT.get_f()) ? ConverterT::getTpetraVector(outArgsT.get_f()) : Teuchos::null; const Teuchos::RCP<Tpetra_Operator> W_op_outT = Teuchos::nonnull(outArgsT.get_W_op()) ? ConverterT::getTpetraOperator(outArgsT.get_W_op()) : Teuchos::null; #ifdef WRITE_MASS_MATRIX_TO_MM_FILE //IK, 4/24/15: adding object to hold mass matrix to be written to matrix market file const Teuchos::RCP<Tpetra_Operator> Mass = Teuchos::nonnull(outArgsT.get_W_op()) ? ConverterT::getTpetraOperator(outArgsT.get_W_op()) : Teuchos::null; //IK, 4/24/15: needed for writing mass matrix out to matrix market file const Teuchos::RCP<Tpetra_Vector> ftmp = Teuchos::nonnull(outArgsT.get_f()) ? ConverterT::getTpetraVector(outArgsT.get_f()) : Teuchos::null; #endif // Cast W to a CrsMatrix, throw an exception if this fails const Teuchos::RCP<Tpetra_CrsMatrix> W_op_out_crsT = Teuchos::nonnull(W_op_outT) ? Teuchos::rcp_dynamic_cast<Tpetra_CrsMatrix>(W_op_outT, true) : Teuchos::null; #ifdef WRITE_MASS_MATRIX_TO_MM_FILE //IK, 4/24/15: adding object to hold mass matrix to be written to matrix market file const Teuchos::RCP<Tpetra_CrsMatrix> Mass_crs = Teuchos::nonnull(Mass) ? Teuchos::rcp_dynamic_cast<Tpetra_CrsMatrix>(Mass, true) : Teuchos::null; #endif // // Compute the functions // bool f_already_computed = false; // W matrix if (Teuchos::nonnull(W_op_out_crsT)) { app->computeGlobalJacobianT( alpha, beta, omega, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, fT_out.get(), *W_op_out_crsT); f_already_computed = true; #ifdef WRITE_MASS_MATRIX_TO_MM_FILE //IK, 4/24/15: write mass matrix to matrix market file //Warning: to read this in to MATLAB correctly, code must be run in serial. //Otherwise Mass will have a distributed Map which would also need to be read in to MATLAB for proper //reading in of Mass. app->computeGlobalJacobianT(1.0, 0.0, 0.0, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, ftmp.get(), *Mass_crs); Tpetra_MatrixMarket_Writer::writeSparseFile("mass.mm", Mass_crs); Tpetra_MatrixMarket_Writer::writeMapFile("rowmap.mm", *Mass_crs->getRowMap()); Tpetra_MatrixMarket_Writer::writeMapFile("colmap.mm", *Mass_crs->getColMap()); #endif } // df/dp for (int l = 0; l < outArgsT.Np(); ++l) { const Teuchos::RCP<Thyra::MultiVectorBase<ST> > dfdp_out = outArgsT.get_DfDp(l).getMultiVector(); const Teuchos::RCP<Tpetra_MultiVector> dfdp_outT = Teuchos::nonnull(dfdp_out) ? ConverterT::getTpetraMultiVector(dfdp_out) : Teuchos::null; if (Teuchos::nonnull(dfdp_outT)) { const Teuchos::RCP<ParamVec> p_vec = Teuchos::rcpFromRef(sacado_param_vec[l]); app->computeGlobalTangentT( 0.0, 0.0, 0.0, curr_time, false, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, p_vec.get(), NULL, NULL, NULL, NULL, fT_out.get(), NULL, dfdp_outT.get()); f_already_computed = true; } } // f if (app->is_adjoint) { const Thyra::ModelEvaluatorBase::Derivative<ST> f_derivT( outArgsT.get_f(), Thyra::ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW); const Thyra::ModelEvaluatorBase::Derivative<ST> dummy_derivT; const int response_index = 0; // need to add capability for sending this in app->evaluateResponseDerivativeT( response_index, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, NULL, NULL, f_derivT, dummy_derivT, dummy_derivT, dummy_derivT); } else { if (Teuchos::nonnull(fT_out) && !f_already_computed) { app->computeGlobalResidualT( curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, *fT_out); } } // Response functions for (int j = 0; j < outArgsT.Ng(); ++j) { const Teuchos::RCP<Thyra::VectorBase<ST> > g_out = outArgsT.get_g(j); Teuchos::RCP<Tpetra_Vector> gT_out = Teuchos::nonnull(g_out) ? ConverterT::getTpetraVector(g_out) : Teuchos::null; const Thyra::ModelEvaluatorBase::Derivative<ST> dgdxT_out = outArgsT.get_DgDx(j); Thyra::ModelEvaluatorBase::Derivative<ST> dgdxdotT_out; if(supports_xdot) dgdxdotT_out = outArgsT.get_DgDx_dot(j); // const Thyra::ModelEvaluatorBase::Derivative<ST> dgdxdotdotT_out = this->get_DgDx_dotdot(j); const Thyra::ModelEvaluatorBase::Derivative<ST> dgdxdotdotT_out; sanitize_nans(dgdxT_out); sanitize_nans(dgdxdotT_out); sanitize_nans(dgdxdotdotT_out); // dg/dx, dg/dxdot if (!dgdxT_out.isEmpty() || !dgdxdotT_out.isEmpty()) { const Thyra::ModelEvaluatorBase::Derivative<ST> dummy_derivT; app->evaluateResponseDerivativeT( j, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, NULL, gT_out.get(), dgdxT_out, dgdxdotT_out, dgdxdotdotT_out, dummy_derivT); // Set gT_out to null to indicate that g_out was evaluated. gT_out = Teuchos::null; } // dg/dp for (int l = 0; l < outArgsT.Np(); ++l) { const Teuchos::RCP<Thyra::MultiVectorBase<ST> > dgdp_out = outArgsT.get_DgDp(j, l).getMultiVector(); const Teuchos::RCP<Tpetra_MultiVector> dgdpT_out = Teuchos::nonnull(dgdp_out) ? ConverterT::getTpetraMultiVector(dgdp_out) : Teuchos::null; if (Teuchos::nonnull(dgdpT_out)) { const Teuchos::RCP<ParamVec> p_vec = Teuchos::rcpFromRef(sacado_param_vec[l]); app->evaluateResponseTangentT( j, alpha, beta, omega, curr_time, false, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, p_vec.get(), NULL, NULL, NULL, NULL, gT_out.get(), NULL, dgdpT_out.get()); gT_out = Teuchos::null; } } if (Teuchos::nonnull(gT_out)) { app->evaluateResponseT( j, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, *gT_out); } } }
void Albany::ModelEvaluatorT::evalModelImpl( const Thyra::ModelEvaluatorBase::InArgs<ST>& inArgsT, const Thyra::ModelEvaluatorBase::OutArgs<ST>& outArgsT) const { Teuchos::TimeMonitor Timer(*timer); //start timer // // Get the input arguments // const Teuchos::RCP<const Tpetra_Vector> xT = ConverterT::getConstTpetraVector(inArgsT.get_x()); const Teuchos::RCP<const Tpetra_Vector> x_dotT = Teuchos::nonnull(inArgsT.get_x_dot()) ? ConverterT::getConstTpetraVector(inArgsT.get_x_dot()) : Teuchos::null; // AGS: x_dotdot time integrators not imlemented in Thyra ME yet //const Teuchos::RCP<const Tpetra_Vector> x_dotdotT = // Teuchos::nonnull(inArgsT.get_x_dotdot()) ? // ConverterT::getConstTpetraVector(inArgsT.get_x_dotdot()) : // Teuchos::null; const Teuchos::RCP<const Tpetra_Vector> x_dotdotT = Teuchos::null; const double alpha = (Teuchos::nonnull(x_dotT) || Teuchos::nonnull(x_dotdotT)) ? inArgsT.get_alpha() : 0.0; // AGS: x_dotdot time integrators not imlemented in Thyra ME yet // const double omega = (Teuchos::nonnull(x_dotT) || Teuchos::nonnull(x_dotdotT)) ? inArgsT.get_omega() : 0.0; const double omega = 0.0; const double beta = (Teuchos::nonnull(x_dotT) || Teuchos::nonnull(x_dotdotT)) ? inArgsT.get_beta() : 1.0; const double curr_time = (Teuchos::nonnull(x_dotT) || Teuchos::nonnull(x_dotdotT)) ? inArgsT.get_t() : 0.0; for (int l = 0; l < inArgsT.Np(); ++l) { const Teuchos::RCP<const Thyra::VectorBase<ST> > p = inArgsT.get_p(l); if (Teuchos::nonnull(p)) { const Teuchos::RCP<const Tpetra_Vector> pT = ConverterT::getConstTpetraVector(p); const Teuchos::ArrayRCP<const ST> pT_constView = pT->get1dView(); ParamVec &sacado_param_vector = sacado_param_vec[l]; for (unsigned int k = 0; k < sacado_param_vector.size(); ++k) { sacado_param_vector[k].baseValue = pT_constView[k]; } } } // // Get the output arguments // const Teuchos::RCP<Tpetra_Vector> fT_out = Teuchos::nonnull(outArgsT.get_f()) ? ConverterT::getTpetraVector(outArgsT.get_f()) : Teuchos::null; const Teuchos::RCP<Tpetra_Operator> W_op_outT = Teuchos::nonnull(outArgsT.get_W_op()) ? ConverterT::getTpetraOperator(outArgsT.get_W_op()) : Teuchos::null; // Cast W to a CrsMatrix, throw an exception if this fails const Teuchos::RCP<Tpetra_CrsMatrix> W_op_out_crsT = Teuchos::nonnull(W_op_outT) ? Teuchos::rcp_dynamic_cast<Tpetra_CrsMatrix>(W_op_outT, true) : Teuchos::null; // // Compute the functions // bool f_already_computed = false; // W matrix if (Teuchos::nonnull(W_op_out_crsT)) { app->computeGlobalJacobianT( alpha, beta, omega, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, fT_out.get(), *W_op_out_crsT); f_already_computed = true; } // df/dp for (int l = 0; l < outArgsT.Np(); ++l) { const Teuchos::RCP<Thyra::MultiVectorBase<ST> > dfdp_out = outArgsT.get_DfDp(l).getMultiVector(); const Teuchos::RCP<Tpetra_MultiVector> dfdp_outT = Teuchos::nonnull(dfdp_out) ? ConverterT::getTpetraMultiVector(dfdp_out) : Teuchos::null; if (Teuchos::nonnull(dfdp_outT)) { const Teuchos::RCP<ParamVec> p_vec = Teuchos::rcpFromRef(sacado_param_vec[l]); app->computeGlobalTangentT( 0.0, 0.0, 0.0, curr_time, false, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, p_vec.get(), NULL, NULL, NULL, NULL, fT_out.get(), NULL, dfdp_outT.get()); f_already_computed = true; } } // f if (app->is_adjoint) { const Thyra::ModelEvaluatorBase::Derivative<ST> f_derivT( outArgsT.get_f(), Thyra::ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW); const Thyra::ModelEvaluatorBase::Derivative<ST> dummy_derivT; const int response_index = 0; // need to add capability for sending this in app->evaluateResponseDerivativeT( response_index, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, NULL, NULL, f_derivT, dummy_derivT, dummy_derivT, dummy_derivT); } else { if (Teuchos::nonnull(fT_out) && !f_already_computed) { app->computeGlobalResidualT( curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, *fT_out); } } // Response functions for (int j = 0; j < outArgsT.Ng(); ++j) { const Teuchos::RCP<Thyra::VectorBase<ST> > g_out = outArgsT.get_g(j); Teuchos::RCP<Tpetra_Vector> gT_out = Teuchos::nonnull(g_out) ? ConverterT::getTpetraVector(g_out) : Teuchos::null; const Thyra::ModelEvaluatorBase::Derivative<ST> dgdxT_out = outArgsT.get_DgDx(j); const Thyra::ModelEvaluatorBase::Derivative<ST> dgdxdotT_out = outArgsT.get_DgDx_dot(j); // AGS: x_dotdot time integrators not imlemented in Thyra ME yet const Thyra::ModelEvaluatorBase::Derivative<ST> dgdxdotdotT_out; // dg/dx, dg/dxdot if (!dgdxT_out.isEmpty() || !dgdxdotT_out.isEmpty()) { const Thyra::ModelEvaluatorBase::Derivative<ST> dummy_derivT; app->evaluateResponseDerivativeT( j, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, NULL, gT_out.get(), dgdxT_out, dgdxdotT_out, dgdxdotdotT_out, dummy_derivT); // Set gT_out to null to indicate that g_out was evaluated. gT_out = Teuchos::null; } // dg/dp for (int l = 0; l < outArgsT.Np(); ++l) { const Teuchos::RCP<Thyra::MultiVectorBase<ST> > dgdp_out = outArgsT.get_DgDp(j, l).getMultiVector(); const Teuchos::RCP<Tpetra_MultiVector> dgdpT_out = Teuchos::nonnull(dgdp_out) ? ConverterT::getTpetraMultiVector(dgdp_out) : Teuchos::null; if (Teuchos::nonnull(dgdpT_out)) { const Teuchos::RCP<ParamVec> p_vec = Teuchos::rcpFromRef(sacado_param_vec[l]); app->evaluateResponseTangentT( j, alpha, beta, omega, curr_time, false, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, p_vec.get(), NULL, NULL, NULL, NULL, gT_out.get(), NULL, dgdpT_out.get()); gT_out = Teuchos::null; } } if (Teuchos::nonnull(gT_out)) { app->evaluateResponseT( j, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, *gT_out); } } }
// hide the original parental method AMET->evalModelImpl(): void Aeras::HVDecorator::evalModelImpl( const Thyra::ModelEvaluatorBase::InArgs<ST>& inArgsT, const Thyra::ModelEvaluatorBase::OutArgs<ST>& outArgsT) const { #ifdef OUTPUT_TO_SCREEN std::cout << "DEBUG WHICH HVDecorator: " << __PRETTY_FUNCTION__ << "\n"; #endif Teuchos::TimeMonitor Timer(*timer); //start timer // // Get the input arguments // // Thyra vectors const Teuchos::RCP<const Thyra_Vector> x = inArgsT.get_x(); const Teuchos::RCP<const Thyra_Vector> x_dot = (supports_xdot ? inArgsT.get_x_dot() : Teuchos::null); const Teuchos::RCP<const Thyra_Vector> x_dotdot = (supports_xdotdot ? inArgsT.get_x_dot_dot() : Teuchos::null); const double alpha = (Teuchos::nonnull(x_dot) || Teuchos::nonnull(x_dotdot)) ? inArgsT.get_alpha() : 0.0; // AGS: x_dotdot time integrators not imlemented in Thyra ME yet // const double omega = (Teuchos::nonnull(x_dot) || Teuchos::nonnull(x_dotdot)) ? inArgsT.get_omega() : 0.0; const double omega = 0.0; const double beta = (Teuchos::nonnull(x_dot) || Teuchos::nonnull(x_dotdot)) ? inArgsT.get_beta() : 1.0; const double curr_time = (Teuchos::nonnull(x_dot) || Teuchos::nonnull(x_dotdot)) ? inArgsT.get_t() : 0.0; for (int l = 0; l < inArgsT.Np(); ++l) { const Teuchos::RCP<const Thyra_Vector> p = inArgsT.get_p(l); if (Teuchos::nonnull(p)) { const Teuchos::RCP<const Tpetra_Vector> pT = Albany::getConstTpetraVector(p); const Teuchos::ArrayRCP<const ST> pT_constView = pT->get1dView(); ParamVec &sacado_param_vector = sacado_param_vec[l]; for (unsigned int k = 0; k < sacado_param_vector.size(); ++k) { sacado_param_vector[k].baseValue = pT_constView[k]; } } } // // Get the output arguments // auto f = outArgsT.get_f(); auto W_op = outArgsT.get_W_op(); // // Compute the functions // bool f_already_computed = false; // W matrix if (Teuchos::nonnull(W_op)) { app->computeGlobalJacobian( alpha, beta, omega, curr_time, x, x_dot, x_dotdot, sacado_param_vec, f, W_op); f_already_computed = true; } // df/dp for (int l = 0; l < outArgsT.Np(); ++l) { const Teuchos::RCP<Thyra_MultiVector> df_dp = outArgsT.get_DfDp(l).getMultiVector(); if (Teuchos::nonnull(df_dp)) { const Teuchos::RCP<ParamVec> p_vec = Teuchos::rcpFromRef(sacado_param_vec[l]); app->computeGlobalTangent( 0.0, 0.0, 0.0, curr_time, false, x, x_dot, x_dotdot, sacado_param_vec, p_vec.get(), Teuchos::null, Teuchos::null, Teuchos::null, Teuchos::null, f, Teuchos::null, df_dp); f_already_computed = true; } } // f if (app->is_adjoint) { const Thyra_Derivative f_deriv(f, Thyra::ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW); const Thyra_Derivative dummy_deriv; const int response_index = 0; // need to add capability for sending this in app->evaluateResponseDerivative( response_index, curr_time, x, x_dot, x_dotdot, sacado_param_vec, NULL, Teuchos::null, f_deriv, dummy_deriv, dummy_deriv, dummy_deriv); } else { if (Teuchos::nonnull(f) && !f_already_computed) { app->computeGlobalResidual( curr_time, x, x_dot, x_dotdot, sacado_param_vec, f); } } //compute xtilde applyLinvML(x, xtilde); #ifdef WRITE_TO_MATRIX_MARKET_TO_MM_FILE //writing to MatrixMarket for debug char name[100]; //create string for file name sprintf(name, "xT_%i.mm", mm_counter); const Teuchos::RCP<const Tpetra_Vector> xT = Albany::getConstTpetraVector(x); Tpetra::MatrixMarket::Writer<Tpetra_CrsMatrix>::writeDenseFile(name, xT); sprintf(name, "xtildeT_%i.mm", mm_counter); const Teuchos::RCP<const Tpetra_Vector> xtildeT = Albany::getConstTpetraVector(xtilde); Tpetra::MatrixMarket::Writer<Tpetra_CrsMatrix>::writeDenseFile(name, xtildeT); mm_counter++; #endif if (supports_xdot && Teuchos::nonnull(inArgsT.get_x_dot()) && Teuchos::nonnull(f)){ #ifdef OUTPUT_TO_SCREEN std::cout <<"in the if-statement for the update" <<std::endl; #endif f->update(1.0,*xtilde); } // Response functions for (int j = 0; j < outArgsT.Ng(); ++j) { Teuchos::RCP<Thyra_Vector> g = outArgsT.get_g(j); const Thyra_Derivative dg_dx = outArgsT.get_DgDx(j); const Thyra_Derivative dg_dxdot = outArgsT.get_DgDx_dot(j); // AGS: x_dotdot time integrators not imlemented in Thyra ME yet const Thyra_Derivative dg_dxdotdot; sanitize_nans(dg_dx); sanitize_nans(dg_dxdot); sanitize_nans(dg_dxdotdot); // dg/dx, dg/dxdot if (!dg_dx.isEmpty() || !dg_dxdot.isEmpty()) { const Thyra_Derivative dummy_deriv; app->evaluateResponseDerivative( j, curr_time, x, x_dot, x_dotdot, sacado_param_vec, NULL, g, dg_dx, dg_dxdot, dg_dxdotdot, dummy_deriv); // Set g to null to indicate the response was evaluated. g= Teuchos::null; } // dg/dp for (int l = 0; l < outArgsT.Np(); ++l) { const Teuchos::RCP<Thyra_MultiVector> dg_dp = outArgsT.get_DgDp(j, l).getMultiVector(); if (Teuchos::nonnull(dg_dp)) { const Teuchos::RCP<ParamVec> p_vec = Teuchos::rcpFromRef(sacado_param_vec[l]); app->evaluateResponseTangent( j, alpha, beta, omega, curr_time, false, x, x_dot, x_dotdot, sacado_param_vec, p_vec.get(), Teuchos::null, Teuchos::null, Teuchos::null, Teuchos::null, g, Teuchos::null, dg_dp); g = Teuchos::null; } } // If response was not yet evaluated, do it now. if (Teuchos::nonnull(g)) { app->evaluateResponse( j, curr_time, x, x_dot, x_dotdot, sacado_param_vec, g); } } }
// hide the original parental method AMET->evalModelImpl(): void Aeras::HVDecorator::evalModelImpl( const Thyra::ModelEvaluatorBase::InArgs<ST>& inArgsT, const Thyra::ModelEvaluatorBase::OutArgs<ST>& outArgsT) const { std::cout << "DEBUG WHICH HVDecorator: " << __PRETTY_FUNCTION__ << "\n"; Teuchos::TimeMonitor Timer(*timer); //start timer // // Get the input arguments // const Teuchos::RCP<const Tpetra_Vector> xT = ConverterT::getConstTpetraVector(inArgsT.get_x()); const Teuchos::RCP<const Tpetra_Vector> x_dotT = Teuchos::nonnull(inArgsT.get_x_dot()) ? ConverterT::getConstTpetraVector(inArgsT.get_x_dot()) : Teuchos::null; // AGS: x_dotdot time integrators not imlemented in Thyra ME yet //const Teuchos::RCP<const Tpetra_Vector> x_dotdotT = // Teuchos::nonnull(inArgsT.get_x_dotdot()) ? // ConverterT::getConstTpetraVector(inArgsT.get_x_dotdot()) : // Teuchos::null; const Teuchos::RCP<const Tpetra_Vector> x_dotdotT = Teuchos::null; const double alpha = (Teuchos::nonnull(x_dotT) || Teuchos::nonnull(x_dotdotT)) ? inArgsT.get_alpha() : 0.0; // AGS: x_dotdot time integrators not imlemented in Thyra ME yet // const double omega = (Teuchos::nonnull(x_dotT) || Teuchos::nonnull(x_dotdotT)) ? inArgsT.get_omega() : 0.0; const double omega = 0.0; const double beta = (Teuchos::nonnull(x_dotT) || Teuchos::nonnull(x_dotdotT)) ? inArgsT.get_beta() : 1.0; const double curr_time = (Teuchos::nonnull(x_dotT) || Teuchos::nonnull(x_dotdotT)) ? inArgsT.get_t() : 0.0; for (int l = 0; l < inArgsT.Np(); ++l) { const Teuchos::RCP<const Thyra::VectorBase<ST> > p = inArgsT.get_p(l); if (Teuchos::nonnull(p)) { const Teuchos::RCP<const Tpetra_Vector> pT = ConverterT::getConstTpetraVector(p); const Teuchos::ArrayRCP<const ST> pT_constView = pT->get1dView(); ParamVec &sacado_param_vector = sacado_param_vec[l]; for (unsigned int k = 0; k < sacado_param_vector.size(); ++k) { sacado_param_vector[k].baseValue = pT_constView[k]; } } } // // Get the output arguments // const Teuchos::RCP<Tpetra_Vector> fT_out = Teuchos::nonnull(outArgsT.get_f()) ? ConverterT::getTpetraVector(outArgsT.get_f()) : Teuchos::null; const Teuchos::RCP<Tpetra_Operator> W_op_outT = Teuchos::nonnull(outArgsT.get_W_op()) ? ConverterT::getTpetraOperator(outArgsT.get_W_op()) : Teuchos::null; #ifdef WRITE_MASS_MATRIX_TO_MM_FILE //IK, 4/24/15: adding object to hold mass matrix to be written to matrix market file const Teuchos::RCP<Tpetra_Operator> Mass = Teuchos::nonnull(outArgsT.get_W_op()) ? ConverterT::getTpetraOperator(outArgsT.get_W_op()) : Teuchos::null; //IK, 4/24/15: needed for writing mass matrix out to matrix market file const Teuchos::RCP<Tpetra_Vector> ftmp = Teuchos::nonnull(outArgsT.get_f()) ? ConverterT::getTpetraVector(outArgsT.get_f()) : Teuchos::null; #endif // Cast W to a CrsMatrix, throw an exception if this fails const Teuchos::RCP<Tpetra_CrsMatrix> W_op_out_crsT = Teuchos::nonnull(W_op_outT) ? Teuchos::rcp_dynamic_cast<Tpetra_CrsMatrix>(W_op_outT, true) : Teuchos::null; #ifdef WRITE_MASS_MATRIX_TO_MM_FILE //IK, 4/24/15: adding object to hold mass matrix to be written to matrix market file const Teuchos::RCP<Tpetra_CrsMatrix> Mass_crs = Teuchos::nonnull(Mass) ? Teuchos::rcp_dynamic_cast<Tpetra_CrsMatrix>(Mass, true) : Teuchos::null; #endif // // Compute the functions // bool f_already_computed = false; // W matrix if (Teuchos::nonnull(W_op_out_crsT)) { app->computeGlobalJacobianT( alpha, beta, omega, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, fT_out.get(), *W_op_out_crsT); f_already_computed = true; } // df/dp for (int l = 0; l < outArgsT.Np(); ++l) { const Teuchos::RCP<Thyra::MultiVectorBase<ST> > dfdp_out = outArgsT.get_DfDp(l).getMultiVector(); const Teuchos::RCP<Tpetra_MultiVector> dfdp_outT = Teuchos::nonnull(dfdp_out) ? ConverterT::getTpetraMultiVector(dfdp_out) : Teuchos::null; if (Teuchos::nonnull(dfdp_outT)) { const Teuchos::RCP<ParamVec> p_vec = Teuchos::rcpFromRef(sacado_param_vec[l]); app->computeGlobalTangentT( 0.0, 0.0, 0.0, curr_time, false, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, p_vec.get(), NULL, NULL, NULL, NULL, fT_out.get(), NULL, dfdp_outT.get()); f_already_computed = true; } } // f if (app->is_adjoint) { const Thyra::ModelEvaluatorBase::Derivative<ST> f_derivT( outArgsT.get_f(), Thyra::ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW); const Thyra::ModelEvaluatorBase::Derivative<ST> dummy_derivT; const int response_index = 0; // need to add capability for sending this in app->evaluateResponseDerivativeT( response_index, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, NULL, NULL, f_derivT, dummy_derivT, dummy_derivT, dummy_derivT); } else { if (Teuchos::nonnull(fT_out) && !f_already_computed) { app->computeGlobalResidualT( curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, *fT_out); } } Teuchos::RCP<Tpetra_Vector> xtildeT = Teuchos::rcp(new Tpetra_Vector(xT->getMap())); //compute xtildeT applyLinvML(xT, xtildeT); #ifdef WRITE_TO_MATRIX_MARKET //writing to MatrixMarket for debug char name[100]; //create string for file name sprintf(name, "xT_%i.mm", mm_counter); Tpetra_MatrixMarket_Writer::writeDenseFile(name, xT); sprintf(name, "xtildeT_%i.mm", mm_counter); Tpetra_MatrixMarket_Writer::writeDenseFile(name, xtildeT); mm_counter++; #endif //std::cout <<"in HVDec evalModelImpl a, b= " << alpha << " "<< beta <<std::endl; if(Teuchos::nonnull(inArgsT.get_x_dot())){ std::cout <<"in the if-statement for the update" <<std::endl; fT_out->update(1.0, *xtildeT, 1.0); } // Response functions for (int j = 0; j < outArgsT.Ng(); ++j) { const Teuchos::RCP<Thyra::VectorBase<ST> > g_out = outArgsT.get_g(j); Teuchos::RCP<Tpetra_Vector> gT_out = Teuchos::nonnull(g_out) ? ConverterT::getTpetraVector(g_out) : Teuchos::null; const Thyra::ModelEvaluatorBase::Derivative<ST> dgdxT_out = outArgsT.get_DgDx(j); const Thyra::ModelEvaluatorBase::Derivative<ST> dgdxdotT_out = outArgsT.get_DgDx_dot(j); // AGS: x_dotdot time integrators not imlemented in Thyra ME yet const Thyra::ModelEvaluatorBase::Derivative<ST> dgdxdotdotT_out; sanitize_nans(dgdxT_out); sanitize_nans(dgdxdotT_out); sanitize_nans(dgdxdotdotT_out); // dg/dx, dg/dxdot if (!dgdxT_out.isEmpty() || !dgdxdotT_out.isEmpty()) { const Thyra::ModelEvaluatorBase::Derivative<ST> dummy_derivT; app->evaluateResponseDerivativeT( j, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, NULL, gT_out.get(), dgdxT_out, dgdxdotT_out, dgdxdotdotT_out, dummy_derivT); // Set gT_out to null to indicate that g_out was evaluated. gT_out = Teuchos::null; } // dg/dp for (int l = 0; l < outArgsT.Np(); ++l) { const Teuchos::RCP<Thyra::MultiVectorBase<ST> > dgdp_out = outArgsT.get_DgDp(j, l).getMultiVector(); const Teuchos::RCP<Tpetra_MultiVector> dgdpT_out = Teuchos::nonnull(dgdp_out) ? ConverterT::getTpetraMultiVector(dgdp_out) : Teuchos::null; if (Teuchos::nonnull(dgdpT_out)) { const Teuchos::RCP<ParamVec> p_vec = Teuchos::rcpFromRef(sacado_param_vec[l]); app->evaluateResponseTangentT( j, alpha, beta, omega, curr_time, false, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, p_vec.get(), NULL, NULL, NULL, NULL, gT_out.get(), NULL, dgdpT_out.get()); gT_out = Teuchos::null; } } if (Teuchos::nonnull(gT_out)) { app->evaluateResponseT( j, curr_time, x_dotT.get(), x_dotdotT.get(), *xT, sacado_param_vec, *gT_out); } } }